OSDN Git Service

[UPG] se desinstaló ip_tck y se intaló ip_tickets. Se agregó opentck3
authormzunino <marcelo@infoprimo.com>
Sun, 20 Oct 2019 02:53:31 +0000 (23:53 -0300)
committermzunino <marcelo@infoprimo.com>
Sun, 20 Oct 2019 02:53:31 +0000 (23:53 -0300)
322 files changed:
.gitignore
README
ip/.hg_archival.txt [deleted file]
ip/ip_product/product.py
ip/ip_purchase/purchase_discount_report.xml
ip/ip_tck/baul/ctas.sql [deleted file]
ip/ip_tck/baul/movimientos.sql [deleted file]
ip/ip_tck/baul/old/ctas.cobzas.sql [deleted file]
ip/ip_tck/baul/old/ctas.sql [deleted file]
ip/ip_tck/cta_ticket/wizard/.idea/encodings.xml [deleted file]
ip/ip_tck/cta_ticket/wizard/.idea/inspectionProfiles/Project_Default.xml [deleted file]
ip/ip_tck/cta_ticket/wizard/.idea/inspectionProfiles/profiles_settings.xml [deleted file]
ip/ip_tck/cta_ticket/wizard/.idea/misc.xml [deleted file]
ip/ip_tck/cta_ticket/wizard/.idea/modules.xml [deleted file]
ip/ip_tck/cta_ticket/wizard/.idea/wizard.iml [deleted file]
ip/ip_tck/cta_ticket/wizard/.idea/workspace.xml [deleted file]
ip/ip_tck/doc/dele.sql [deleted file]
ip/ip_tck/doc/drop_consolidate.sql [deleted file]
ip/ip_tck/doc/set_dic_17_salida.py [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2001-September.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2002-April.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2002-August.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2002-December.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2002-July.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2002-June.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2002-May.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2002-November.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2002-October.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2002-September.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2003-April.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2003-August.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2003-December.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2003-February.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2003-January.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2003-July.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2003-June.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2003-March.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2003-May.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2003-November.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2003-October.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2003-September.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2004-April.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2004-August.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2004-December.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2004-February.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2004-January.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2004-July.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2004-June.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2004-March.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2004-May.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2004-November.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2004-October.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2004-September.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2005-April.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2005-August.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2005-December.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2005-February.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2005-January.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2005-July.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2005-June.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2005-March.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2005-May.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2005-November.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2005-October.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2005-September.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2006-April.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2006-August.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2006-December.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2006-February.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2006-January.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2006-July.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2006-June.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2006-March.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2006-May.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2006-November.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2006-October.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2006-September.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2007-April.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2007-August.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2007-December.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2007-February.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2007-January.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2007-July.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2007-June.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2007-March.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2007-May.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2007-November.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2007-October.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2007-September.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2008-April.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2008-August.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2008-December.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2008-February.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2008-January.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2008-July.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2008-June.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2008-March.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2008-May.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2008-November.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2008-October.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2008-September.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2009-April.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2009-August.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2009-December.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2009-February.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2009-January.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2009-July.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2009-June.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2009-March.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2009-May.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2009-November.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2009-October.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2009-September.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2011-April.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2011-August.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2011-December.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2011-February.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2011-January.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2011-July.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2011-June.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2011-March.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2011-May.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2011-November.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2011-October.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2011-September.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2012-April.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2012-August.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2012-December.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2012-February.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2012-January.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2012-July.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2012-June.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2012-March.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2012-May.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2012-November.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2012-October.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2012-September.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2013-April.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2013-August.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2013-December.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2013-February.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2013-January.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2013-July.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2013-June.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2013-March.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2013-May.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2013-November.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2013-October.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2013-September.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2014-April.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2014-August.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2014-December.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2014-February.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2014-January.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2014-July.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2014-June.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2014-March.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2014-May.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2014-November.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2014-October.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2014-September.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2015-April.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2015-August.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2015-December.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2015-February.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2015-January.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2015-July.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2015-June.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2015-March.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2015-May.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2015-November.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2015-October.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2015-September.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2016-April.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2016-August.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2016-December.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2016-February.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2016-January.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2016-July.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2016-June.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2016-March.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2016-May.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2016-November.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2016-October.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2016-September.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2017-April.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2017-August.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2017-February.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2017-January.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2017-July.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2017-June.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2017-March.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2017-May.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2017-November.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2017-October.txt.gz [deleted file]
ip/ip_tck/estado_cuenta/report/olab_users/2017-September.txt.gz [deleted file]
ip/ip_tck/salida.py [deleted file]
ip/ip_tck/wizard/campos_open_plus.sql [deleted file]
ip/ip_tck/wizard/campos_open_plus2.sql [deleted file]
ip/ip_tck/wizard/create_p_tables.sql [deleted file]
ip/ip_ticket/__init__.py [moved from ip/ip_tck/__init__.py with 100% similarity]
ip/ip_ticket/__openerp__.py [moved from ip/ip_tck/__openerp__.py with 98% similarity]
ip/ip_ticket/baul/old/__init__.py [moved from ip/ip_tck/baul/old/__init__.py with 100% similarity]
ip/ip_ticket/baul/old/cob_ticket_view.xml [moved from ip/ip_tck/baul/old/cob_ticket_view.xml with 98% similarity]
ip/ip_ticket/baul/old/cta_workflows.xml [moved from ip/ip_tck/baul/old/cta_workflows.xml with 100% similarity]
ip/ip_ticket/baul/old/migrate.py [moved from ip/ip_tck/baul/old/migrate.py with 100% similarity]
ip/ip_ticket/baul/partner_cta_cob_balance.py [moved from ip/ip_tck/baul/partner_cta_cob_balance.py with 100% similarity]
ip/ip_ticket/baul/partner_cta_cob_balance.rml [moved from ip/ip_tck/baul/partner_cta_cob_balance.rml with 100% similarity]
ip/ip_ticket/baul/partner_cta_cob_balance.sxw [moved from ip/ip_tck/baul/partner_cta_cob_balance.sxw with 100% similarity]
ip/ip_ticket/baul/template_view.xml [moved from ip/ip_tck/baul/template_view.xml with 100% similarity]
ip/ip_ticket/conf/__init__.py [moved from ip/ip_tck/conf/__init__.py with 100% similarity]
ip/ip_ticket/conf/ip_sale_config.py [moved from ip/ip_tck/conf/ip_sale_config.py with 100% similarity]
ip/ip_ticket/cta_ticket/__init__.py [moved from ip/ip_tck/cta_ticket/__init__.py with 100% similarity]
ip/ip_ticket/cta_ticket/_report/__init__.py [moved from ip/ip_tck/cta_ticket/_report/__init__.py with 100% similarity]
ip/ip_ticket/cta_ticket/_report/movimientos_partner.odt [moved from ip/ip_tck/cta_ticket/_report/movimientos_partner.odt with 100% similarity]
ip/ip_ticket/cta_ticket/_report/movimientos_partner.rml [moved from ip/ip_tck/cta_ticket/_report/movimientos_partner.rml with 100% similarity]
ip/ip_ticket/cta_ticket/_report/movimientos_partner.sxw [moved from ip/ip_tck/cta_ticket/_report/movimientos_partner.sxw with 100% similarity]
ip/ip_ticket/cta_ticket/_report/movimientos_partner_report.py [moved from ip/ip_tck/cta_ticket/_report/movimientos_partner_report.py with 99% similarity]
ip/ip_ticket/cta_ticket/_report/truch_movimientos_partner.xml [moved from ip/ip_tck/cta_ticket/_report/truch_movimientos_partner.xml with 100% similarity]
ip/ip_ticket/cta_ticket/conf [moved from ip/ip_tck/cta_ticket/conf with 100% similarity]
ip/ip_ticket/cta_ticket/cta_ticket.py [moved from ip/ip_tck/cta_ticket/cta_ticket.py with 100% similarity]
ip/ip_ticket/cta_ticket/views/cob_ticket_view.xml [moved from ip/ip_tck/cta_ticket/views/cob_ticket_view.xml with 98% similarity]
ip/ip_ticket/cta_ticket/views/cta_ticket_view.xml [moved from ip/ip_tck/cta_ticket/views/cta_ticket_view.xml with 98% similarity]
ip/ip_ticket/cta_ticket/wizard/__init__.py [moved from ip/ip_tck/cta_ticket/wizard/__init__.py with 100% similarity]
ip/ip_ticket/cta_ticket/wizard/baul/_deudores_wiz.py [moved from ip/ip_tck/cta_ticket/wizard/baul/_deudores_wiz.py with 100% similarity]
ip/ip_ticket/cta_ticket/wizard/baul/_deudores_wiz_view.xml [moved from ip/ip_tck/cta_ticket/wizard/baul/_deudores_wiz_view.xml with 98% similarity]
ip/ip_ticket/cta_ticket/wizard/baul/movimientos_tck_reporte.py [moved from ip/ip_tck/cta_ticket/wizard/baul/movimientos_tck_reporte.py with 100% similarity]
ip/ip_ticket/cta_ticket/wizard/baul/movimientos_tck_reporte_view.xml [moved from ip/ip_tck/cta_ticket/wizard/baul/movimientos_tck_reporte_view.xml with 100% similarity]
ip/ip_ticket/cta_ticket/wizard/movimientos_tck_wizard.py [moved from ip/ip_tck/cta_ticket/wizard/movimientos_tck_wizard.py with 100% similarity]
ip/ip_ticket/cta_ticket/wizard/movimientos_tck_wizard_view.xml [moved from ip/ip_tck/cta_ticket/wizard/movimientos_tck_wizard_view.xml with 100% similarity]
ip/ip_ticket/doc/.calculo importes subtotllt etc .kate-swp [moved from ip/ip_tck/doc/.calculo importes subtotllt etc .kate-swp with 100% similarity]
ip/ip_ticket/doc/SUPERUSER_ID.py [moved from ip/ip_tck/doc/SUPERUSER_ID.py with 100% similarity]
ip/ip_ticket/doc/calculo importes subtotllt etc [moved from ip/ip_tck/doc/calculo importes subtotllt etc with 100% similarity]
ip/ip_ticket/doc/elim_fecha_leida.sh [moved from ip/ip_tck/doc/elim_fecha_leida.sh with 100% similarity]
ip/ip_ticket/doc/pck_Migrate.txt [moved from ip/ip_tck/doc/pck_Migrate.txt with 100% similarity]
ip/ip_ticket/doc/pos_nombres [moved from ip/ip_tck/doc/pos_nombres with 100% similarity]
ip/ip_ticket/estado_cuenta/__init__.py [moved from ip/ip_tck/estado_cuenta/__init__.py with 100% similarity]
ip/ip_ticket/estado_cuenta/__openerp__.py [moved from ip/ip_tck/estado_cuenta/__openerp__.py with 100% similarity]
ip/ip_ticket/estado_cuenta/estado_cuenta_report.xml [moved from ip/ip_tck/estado_cuenta/estado_cuenta_report.xml with 82% similarity]
ip/ip_ticket/estado_cuenta/python_logo.png [moved from ip/ip_tck/estado_cuenta/python_logo.png with 100% similarity]
ip/ip_ticket/estado_cuenta/report/__init__.py [moved from ip/ip_tck/estado_cuenta/report/__init__.py with 100% similarity]
ip/ip_ticket/estado_cuenta/report/ejemplo.py [moved from ip/ip_tck/estado_cuenta/report/ejemplo.py with 100% similarity]
ip/ip_ticket/estado_cuenta/report/ejemplo.rml [moved from ip/ip_tck/estado_cuenta/report/ejemplo.rml with 100% similarity]
ip/ip_ticket/estado_cuenta/report/estado_cuenta.pdf [moved from ip/ip_tck/estado_cuenta/report/estado_cuenta.pdf with 100% similarity]
ip/ip_ticket/estado_cuenta/report/estado_cuenta.rml [moved from ip/ip_tck/estado_cuenta/report/estado_cuenta.rml with 100% similarity]
ip/ip_ticket/estado_cuenta/report/estado_cuenta_report.py [moved from ip/ip_tck/estado_cuenta/report/estado_cuenta_report.py with 98% similarity]
ip/ip_ticket/estado_cuenta/report/head.rml [moved from ip/ip_tck/estado_cuenta/report/head.rml with 100% similarity]
ip/ip_ticket/estado_cuenta/report/images/replogo.jpeg [moved from ip/ip_tck/estado_cuenta/report/images/replogo.jpeg with 100% similarity]
ip/ip_ticket/estado_cuenta/report/listas.pdf [moved from ip/ip_tck/estado_cuenta/report/listas.pdf with 100% similarity]
ip/ip_ticket/estado_cuenta/report/logo_no_bar.png [moved from ip/ip_tck/estado_cuenta/report/logo_no_bar.png with 100% similarity]
ip/ip_ticket/estado_cuenta/report/pichis.mp4 [moved from ip/ip_tck/estado_cuenta/report/pichis.mp4 with 100% similarity]
ip/ip_ticket/estado_cuenta/report/python_logo.png [moved from ip/ip_tck/estado_cuenta/report/python_logo.png with 100% similarity]
ip/ip_ticket/estado_cuenta/report/repl_user_list.py [moved from ip/ip_tck/estado_cuenta/report/repl_user_list.py with 100% similarity]
ip/ip_ticket/estado_cuenta/report/rml.dtd [moved from ip/ip_tck/estado_cuenta/report/rml.dtd with 100% similarity]
ip/ip_ticket/estado_cuenta/report/strapline.png [moved from ip/ip_tck/estado_cuenta/report/strapline.png with 100% similarity]
ip/ip_ticket/estado_cuenta/report/test_045_separations.rml [moved from ip/ip_tck/estado_cuenta/report/test_045_separations.rml with 100% similarity]
ip/ip_ticket/estado_cuenta/report/test_046_lists.rml [moved from ip/ip_tck/estado_cuenta/report/test_046_lists.rml with 100% similarity]
ip/ip_ticket/estado_cuenta/wizard/__init__.py [moved from ip/ip_tck/estado_cuenta/wizard/__init__.py with 100% similarity]
ip/ip_ticket/estado_cuenta/wizard/estado_cuenta.py [moved from ip/ip_tck/estado_cuenta/wizard/estado_cuenta.py with 100% similarity]
ip/ip_ticket/estado_cuenta/wizard/estado_cuenta.xml [moved from ip/ip_tck/estado_cuenta/wizard/estado_cuenta.xml with 100% similarity]
ip/ip_ticket/estado_cuenta_report2.py [moved from ip/ip_tck/estado_cuenta_report2.py with 98% similarity]
ip/ip_ticket/estructuras [moved from ip/ip_tck/estructuras with 100% similarity]
ip/ip_ticket/ip_tck.py [moved from ip/ip_tck/ip_tck.py with 100% similarity]
ip/ip_ticket/ip_tck_reports.xml [moved from ip/ip_tck/ip_tck_reports.xml with 88% similarity]
ip/ip_ticket/report/__init__.py [moved from ip/ip_tck/report/__init__.py with 100% similarity]
ip/ip_ticket/report/_mov_partner_report.xml [moved from ip/ip_tck/report/_mov_partner_report.xml with 100% similarity]
ip/ip_ticket/report/_tickets_qty_report.py [moved from ip/ip_tck/report/_tickets_qty_report.py with 100% similarity]
ip/ip_ticket/report/_tickets_qty_report_view.xml [moved from ip/ip_tck/report/_tickets_qty_report_view.xml with 99% similarity]
ip/ip_ticket/report/sale_qty_report.py [moved from ip/ip_tck/report/sale_qty_report.py with 100% similarity]
ip/ip_ticket/report/sale_qty_report_view.xml [moved from ip/ip_tck/report/sale_qty_report_view.xml with 100% similarity]
ip/ip_ticket/tck_workflow.xml [moved from ip/ip_tck/tck_workflow.xml with 100% similarity]
ip/ip_ticket/views/_consolidate_views.xml [moved from ip/ip_tck/views/_consolidate_views.xml with 99% similarity]
ip/ip_ticket/views/cfe_view.xml [moved from ip/ip_tck/views/cfe_view.xml with 98% similarity]
ip/ip_ticket/views/informes_tck_view.xml [moved from ip/ip_tck/views/informes_tck_view.xml with 100% similarity]
ip/ip_ticket/views/ip_tck_view.xml [moved from ip/ip_tck/views/ip_tck_view.xml with 100% similarity]
ip/ip_ticket/views/ip_tck_view.xml.new [moved from ip/ip_tck/views/ip_tck_view.xml.new with 100% similarity]
ip/ip_ticket/views/mediosdepago_view.xml [moved from ip/ip_tck/views/mediosdepago_view.xml with 98% similarity]
ip/ip_ticket/views/redondeos_view.xml [moved from ip/ip_tck/views/redondeos_view.xml with 100% similarity]
ip/ip_ticket/views/vouchertar_view.xml [moved from ip/ip_tck/views/vouchertar_view.xml with 98% similarity]
ip/ip_ticket/wizard/__init__.py [moved from ip/ip_tck/wizard/__init__.py with 100% similarity]
ip/ip_ticket/wizard/campos_open.py [moved from ip/ip_tck/wizard/campos_open.py with 100% similarity]
ip/ip_ticket/wizard/campos_open_completos.py [moved from ip/ip_tck/wizard/campos_open_completos.py with 100% similarity]
ip/ip_ticket/wizard/campos_open_plus.py [moved from ip/ip_tck/wizard/campos_open_plus.py with 100% similarity]
ip/ip_ticket/wizard/campos_open_plus.sql.py [moved from ip/ip_tck/wizard/campos_open_plus.sql.py with 100% similarity]
ip/ip_ticket/wizard/conf [moved from ip/ip_tck/wizard/conf with 100% similarity]
ip/ip_ticket/wizard/create_tck_objects.py [moved from ip/ip_tck/wizard/create_tck_objects.py with 100% similarity]
ip/ip_ticket/wizard/import_tck.py [moved from ip/ip_tck/wizard/import_tck.py with 100% similarity]
ip/ip_ticket/wizard/importa_tickets.py [moved from ip/ip_tck/wizard/importa_tickets.py with 98% similarity]
ip/ip_ticket/wizard/importa_tickets_view.xml [moved from ip/ip_tck/wizard/importa_tickets_view.xml with 100% similarity]
ip/ip_ticket/wizard/info_ventas.py [moved from ip/ip_tck/wizard/info_ventas.py with 100% similarity]
ip/ip_ticket/wizard/info_ventas_view.xml [moved from ip/ip_tck/wizard/info_ventas_view.xml with 98% similarity]
ip/ip_ticket/wizard/lineas.py [moved from ip/ip_tck/wizard/lineas.py with 99% similarity]
ip/ip_ticket/wizard/mov_partner_report_wizard.py [moved from ip/ip_tck/wizard/mov_partner_report_wizard.py with 100% similarity]
ip/ip_ticket/wizard/relacionados_al_cabezal.py [moved from ip/ip_tck/wizard/relacionados_al_cabezal.py with 100% similarity]
ip/ip_ticket/wizard/report_tmp.py [moved from ip/ip_tck/wizard/report_tmp.py with 100% similarity]
ip/ip_ticket/wizard/reporte_info_ventas.py [moved from ip/ip_tck/wizard/reporte_info_ventas.py with 100% similarity]
ip/ip_ticket/wizard/simples_del_cabezal.py [moved from ip/ip_tck/wizard/simples_del_cabezal.py with 100% similarity]
ip/ip_ticket/wizard/snptmp.rml [moved from ip/ip_tck/wizard/snptmp.rml with 100% similarity]
ip/ip_ticket/wizard/tck_create.py [moved from ip/ip_tck/wizard/tck_create.py with 100% similarity]
opentck3/README.rst [new file with mode: 0644]
opentck3/__init__.py [new file with mode: 0644]
opentck3/chk_json.py [new file with mode: 0644]
opentck3/get_spn.py [new file with mode: 0644]
opentck3/ip_ticket/__init__.py [new file with mode: 0644]
opentck3/ip_ticket/ip_ticket_doc.py [new file with mode: 0644]
opentck3/ip_ticket/ticket.py [new file with mode: 0644]
opentck3/ip_ticket/ticket_doc.py [new file with mode: 0644]
opentck3/main.py [new file with mode: 0644]
opentck3/mils.sh [new file with mode: 0755]
opentck3/miscampos.py [new file with mode: 0644]
opentck3/opentck3.py [new file with mode: 0755]
opentck3/openxmlrpc.py [new file with mode: 0644]
opentck3/sp2py.py [new file with mode: 0755]
opentck3/spn2json_chk.py [new file with mode: 0644]
opentck3/spn2pyth.py [new file with mode: 0644]
opentck3/util/__init__.py [new file with mode: 0644]
opentck3/util/config.py [new file with mode: 0644]
opentck3/util/config1314.py [new file with mode: 0644]
server/openerp-server.py
server/server.conf
server/start
server/start.sh

index 8489be9..b240126 100644 (file)
@@ -121,10 +121,10 @@ ip_zuni_profile/
 .jpeg
 .jpg
 .idea
-.kdev4 
-.pydevproject 
-.ropeproject 
-.settings 
+.kdev4
+.pydevproject
+.ropeproject
+.settings
 .project
 *.sql
 *.lzma
@@ -139,3 +139,14 @@ ip_zuni_profile/
 *.txz
 *.xz
 
+
+/template
+/opentck3/pazos4/
+/opentck3/informes/
+/opentck3/retreive_id_from_cod_or_equiv_from_cod
+/opentck3/test.db
+/opentck3/test3.db
+*.swp
+/ip/ip_ticket/baul/
+/ip/ip_ticket/cta_ticket/_report/
+
diff --git a/README b/README
index ab398be..2ba0ba4 100644 (file)
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
 ip_zuni
-'''''''
+-------
 
 A set of openerp v6.1 modules for retail customization in ZuniMercado. Salto, Uruguay 2014 YTD
diff --git a/ip/.hg_archival.txt b/ip/.hg_archival.txt
deleted file mode 100644 (file)
index 859ccfe..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-repo: c5343f11333495aa6db306ccbb5174508c4d9dac
-node: 043bf5bd9fc6d3b5d90f2c0824aa828b19ac36e6
-branch: default
-latesttag: null
-latesttagdistance: 25
index e70d8c7..b759dd3 100644 (file)
@@ -20,6 +20,7 @@
 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 ##############################################################################
+
 import openerp.addons.product.product as product
 
 from osv import osv, fields
@@ -27,10 +28,9 @@ from tools.translate import _
 import decimal_precision as dp
 import time
 
-
+import pydevd
 
 class product_template(osv.osv):
-
     """
         Campos añadidos son campos utiles de la antigua estructura de
         archivos dbf. El codigo de articulo viene en “cod_sto”, donde era
@@ -71,12 +71,13 @@ class product_template(osv.osv):
         'cod_sub': fields.char(': Num. subfamilia', size=3),
         'nom_sto': fields.char(': Nombre', size=128),
         'pre_sto': fields.float('Precio de Venta', digits_compute=dp.get_precision('Purchase Price')),
-        'iva_sto': fields.char(': Iva', size=4, help="El ERP aún está en migración. En el sistema anterior «stock», este valor significaba 1: Exentos | 2: T.Min | 3: T.Max \nEn el ERP ese criterio ya no se usa.        Ahora el IVA del artículo se fija en la solapa 'Contabilidad'.\nSin embargo, este valor debe ser asignado a la antigua, es decir con el criterio del sistema anterior «stock», hasta tanto la migración de datos no esté terminada.",
-                               required=True),
+        'iva_sto': fields.char(': Iva', size=4, help="El ERP aún está en migración. En el sistema anterior «stock», este valor significaba 1: Exentos | 2: T.Min | 3: T.Max \n"""
+        "En el ERP ese criterio ya no se usa.    Ahora el IVA del artículo se fija en la solapa 'Contabilidad'.\nSin embargo, este valor debe ser asignado a la antigua, es decir con el criterio del sistema anterior «stock», hasta tanto la migración de datos no esté terminada.",
+                required=True),
         'margen' : fields.float('Margen bruto', help="[ Debe ser >= a 0 ]", digits_compute=dp.get_precision('Purchase Price'), required=True),
         'last_purchase_price': fields.float('Precio Ultima Compra iva incl.', digits_compute=dp.get_precision('Purchase Price')),
         'subfam_id': fields.many2one('product.category','Subfam Ref', change_default=True, domain="[('categoria','>',19)]" ),
-           # ver 'asoc_code_id' más abajo.
+        # ver 'asoc_code_id' más abajo.
         'cod_aso': fields.char('Codigo asociado', size=13),
         'opcion1': fields.char(': Opcion1', size=13),
         'description_sale': fields.char('Sale Description', size=32, required=True),
@@ -163,7 +164,7 @@ class product_product(osv.osv):
            'Actualizar'
            1. hacer la lista de campos que sean actualizables en el POS
     """
-    def guorkflou_para_el_campo_pos_action():
+    def guorkflou_para_el_campo_pos_action(self):
         pass
 
     def change_iva_sto(self):
@@ -194,7 +195,7 @@ class product_product(osv.osv):
 
         if 'cod_sto' in vals.keys():
             if not vals['cod_sto'].isdigit():
-                msg = "Code %s is invalid, please use only digits!" % (cod_sto,)
+                msg = "Code %s is invalid, please use only digits!" % (vals['cod_sto'],)
                 raise osv.except_osv('Error', _( msg) )
             else:
                 # compatibilidad frente a otros usos de 'default_code'
@@ -209,13 +210,13 @@ class product_product(osv.osv):
         :param cr, uid, ids, context:    parametros openerp por defecto
         :return: True of False
         """
-        #import ipdb;ipdb.set_trace()
+        # import ipdb;ipdb.set_trace()
         if not ids: return {}
         context = context or {}
         res = False
         prod = self.browse(cr, uid, ids[0], context)
-
-        la pija
+        pydevd.settrace("XPS-15-9550", port=5678)
+        print("la pija {}".format('boba', ))
 
         return True
 
index 099396d..50ee99b 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0"?>  acata
+<?xml version="1.0"?>
 <openerp>
        <data>
                <report auto="False"
diff --git a/ip/ip_tck/baul/ctas.sql b/ip/ip_tck/baul/ctas.sql
deleted file mode 100644 (file)
index 513c1b6..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
- select
-    rp.name      ,
-    rp.numcta    ,
-    monto_cta    ,
-    fecha_cta    ,
-    timestamp_cta,
-    caja_cta     ,
-    ticket_cta   ,
-    note_        ,
-    state
-from
-    cuentas_tck cc,
-    res_partner rp
-where
-    rp.id = cc.partner_id;
diff --git a/ip/ip_tck/baul/movimientos.sql b/ip/ip_tck/baul/movimientos.sql
deleted file mode 100644 (file)
index aa4b642..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-SELECT
-     cuentas_tck."date" AS "Compras",
-     cobranza_tck."date" AS "Pagos",
-     cuentas_tck."monto_cta" AS "MontoCompra",
-     cobranza_tck."monto_cobza" AS "MontoCobrado",
-     res_partner."name" AS "Nombre",
-     res_partner."numcta" AS "Numero"
-FROM
-     "public"."res_partner" res_partner INNER JOIN "public"."cobranza_tck" cobranza_tck ON res_partner."id" = cobranza_tck."partner_id"
-     INNER JOIN "public"."cuentas_tck" cuentas_tck ON res_partner."id" = cuentas_tck."partner_id"
\ No newline at end of file
diff --git a/ip/ip_tck/baul/old/ctas.cobzas.sql b/ip/ip_tck/baul/old/ctas.cobzas.sql
deleted file mode 100644 (file)
index 796dccc..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-SELECT
-       cobranza_tck.codigocliente,
-       cobranza_tck.importecobranza,
-       cobranza_tck.nombrecliente,
-       cuentas_tck.fecha_cta,
-       cuentas_tck.monto_cta,
-       cuentas_tck.montopagocc,
-       cuentas_tck.codigocc,
-       cuentas_tck.nombrecc,
-       ip_ticket.date
-FROM
-       ip_ticket,
-       cobranza_tck,
-       cuentas_tck
-WHERE
-       ip_ticket.id = cuentas_tck.order_id
-AND
-       cuentas_tck.codigocc = cobranza_tck.codigocliente;
-
-
diff --git a/ip/ip_tck/baul/old/ctas.sql b/ip/ip_tck/baul/old/ctas.sql
deleted file mode 100644 (file)
index 513c1b6..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
- select
-    rp.name      ,
-    rp.numcta    ,
-    monto_cta    ,
-    fecha_cta    ,
-    timestamp_cta,
-    caja_cta     ,
-    ticket_cta   ,
-    note_        ,
-    state
-from
-    cuentas_tck cc,
-    res_partner rp
-where
-    rp.id = cc.partner_id;
diff --git a/ip/ip_tck/cta_ticket/wizard/.idea/encodings.xml b/ip/ip_tck/cta_ticket/wizard/.idea/encodings.xml
deleted file mode 100644 (file)
index 97626ba..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="Encoding">
-    <file url="PROJECT" charset="UTF-8" />
-  </component>
-</project>
\ No newline at end of file
diff --git a/ip/ip_tck/cta_ticket/wizard/.idea/inspectionProfiles/Project_Default.xml b/ip/ip_tck/cta_ticket/wizard/.idea/inspectionProfiles/Project_Default.xml
deleted file mode 100644 (file)
index 0eb641c..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-<component name="InspectionProjectProfileManager">
-  <profile version="1.0">
-    <option name="myName" value="Project Default" />
-    <option name="myLocal" value="true" />
-    <inspection_tool class="SpellCheckingInspection" enabled="true" level="TYPO" enabled_by_default="false">
-      <scope name="Problems" level="TYPO" enabled="false">
-        <option name="processCode" value="true" />
-        <option name="processLiterals" value="true" />
-        <option name="processComments" value="true" />
-      </scope>
-      <option name="processCode" value="false" />
-      <option name="processLiterals" value="false" />
-      <option name="processComments" value="false" />
-    </inspection_tool>
-  </profile>
-</component>
\ No newline at end of file
diff --git a/ip/ip_tck/cta_ticket/wizard/.idea/inspectionProfiles/profiles_settings.xml b/ip/ip_tck/cta_ticket/wizard/.idea/inspectionProfiles/profiles_settings.xml
deleted file mode 100644 (file)
index 16f663f..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<component name="InspectionProjectProfileManager">
-  <settings>
-    <option name="USE_PROJECT_PROFILE" value="false" />
-  </settings>
-</component>
\ No newline at end of file
diff --git a/ip/ip_tck/cta_ticket/wizard/.idea/misc.xml b/ip/ip_tck/cta_ticket/wizard/.idea/misc.xml
deleted file mode 100644 (file)
index 7267c87..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ProjectDictionaryState">
-    <dictionary name="dosmilun" />
-  </component>
-  <component name="ProjectRootManager" version="2" project-jdk-name="Python 2.7.8 (/usr/bin/python2.7)" project-jdk-type="Python SDK" />
-</project>
\ No newline at end of file
diff --git a/ip/ip_tck/cta_ticket/wizard/.idea/modules.xml b/ip/ip_tck/cta_ticket/wizard/.idea/modules.xml
deleted file mode 100644 (file)
index c2a0c44..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ProjectModuleManager">
-    <modules>
-      <module fileurl="file://$PROJECT_DIR$/.idea/wizard.iml" filepath="$PROJECT_DIR$/.idea/wizard.iml" />
-    </modules>
-  </component>
-</project>
\ No newline at end of file
diff --git a/ip/ip_tck/cta_ticket/wizard/.idea/wizard.iml b/ip/ip_tck/cta_ticket/wizard/.idea/wizard.iml
deleted file mode 100644 (file)
index d0876a7..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="PYTHON_MODULE" version="4">
-  <component name="NewModuleRootManager">
-    <content url="file://$MODULE_DIR$" />
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/ip/ip_tck/cta_ticket/wizard/.idea/workspace.xml b/ip/ip_tck/cta_ticket/wizard/.idea/workspace.xml
deleted file mode 100644 (file)
index f575df9..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ChangeListManager">
-    <list default="true" id="4824c72c-01d1-49b5-895f-52639d4ed50e" name="Default" comment="" />
-    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
-    <option name="TRACKING_ENABLED" value="true" />
-    <option name="SHOW_DIALOG" value="false" />
-    <option name="HIGHLIGHT_CONFLICTS" value="true" />
-    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
-    <option name="LAST_RESOLUTION" value="IGNORE" />
-  </component>
-  <component name="ProjectFrameBounds" extendedState="6">
-    <option name="x" value="54" />
-    <option name="width" value="1828" />
-    <option name="height" value="1085" />
-  </component>
-  <component name="ProjectInspectionProfilesVisibleTreeState">
-    <entry key="Project Default">
-      <profile-state>
-        <expanded-state>
-          <State>
-            <id />
-          </State>
-          <State>
-            <id>Spelling</id>
-          </State>
-        </expanded-state>
-        <selected-state>
-          <State>
-            <id>SpellCheckingInspection</id>
-          </State>
-        </selected-state>
-      </profile-state>
-    </entry>
-  </component>
-  <component name="ProjectView">
-    <navigator proportions="" version="1">
-      <foldersAlwaysOnTop value="true" />
-    </navigator>
-    <panes>
-      <pane id="ProjectPane">
-        <subPane>
-          <expand>
-            <path>
-              <item name="wizard" type="b2602c69:ProjectViewProjectNode" />
-              <item name="wizard" type="462c0819:PsiDirectoryNode" />
-            </path>
-            <path>
-              <item name="wizard" type="b2602c69:ProjectViewProjectNode" />
-              <item name="External Libraries" type="cb654da1:ExternalLibrariesNode" />
-            </path>
-            <path>
-              <item name="wizard" type="b2602c69:ProjectViewProjectNode" />
-              <item name="Scratches and Consoles" type="1a2a3e82:ScratchProjectViewPane$MyProjectNode" />
-            </path>
-          </expand>
-          <select />
-        </subPane>
-      </pane>
-      <pane id="Scope" />
-    </panes>
-  </component>
-  <component name="PropertiesComponent">
-    <property name="last_opened_file_path" value="$PROJECT_DIR$" />
-    <property name="settings.editor.selected.configurable" value="configurable.group.other" />
-  </component>
-  <component name="PyConsoleOptionsProvider">
-    <option name="myPythonConsoleState">
-      <console-settings sdk-home="/usr/bin/python2.7">
-        <option name="mySdkHome" value="/usr/bin/python2.7" />
-      </console-settings>
-    </option>
-  </component>
-  <component name="PyDebuggerOptionsProvider">
-    <option name="mySaveCallSignatures" value="true" />
-  </component>
-  <component name="RunDashboard">
-    <option name="ruleStates">
-      <list>
-        <RuleState>
-          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
-        </RuleState>
-        <RuleState>
-          <option name="name" value="StatusDashboardGroupingRule" />
-        </RuleState>
-      </list>
-    </option>
-  </component>
-  <component name="TaskManager">
-    <task active="true" id="Default" summary="Default task">
-      <changelist id="4824c72c-01d1-49b5-895f-52639d4ed50e" name="Default" comment="" />
-      <created>1536976448806</created>
-      <option name="number" value="Default" />
-      <option name="presentableId" value="Default" />
-      <updated>1536976448806</updated>
-    </task>
-    <servers />
-  </component>
-  <component name="ToolWindowManager">
-    <frame x="0" y="30" width="1920" height="1049" extended-state="6" />
-    <layout>
-      <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.2583603" />
-      <window_info anchor="bottom" id="TODO" order="6" />
-      <window_info anchor="bottom" id="Event Log" order="7" side_tool="true" />
-      <window_info anchor="bottom" id="Version Control" order="7" show_stripe_button="false" />
-      <window_info anchor="bottom" id="Python Console" order="7" />
-      <window_info anchor="right" id="Copy/Paste" order="3" />
-      <window_info anchor="bottom" id="Run" order="2" />
-      <window_info id="Structure" order="1" side_tool="true" weight="0.25" />
-      <window_info anchor="bottom" id="Terminal" order="7" />
-      <window_info id="Favorites" order="2" side_tool="true" />
-      <window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
-      <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
-      <window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
-      <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
-      <window_info anchor="bottom" id="Message" order="0" />
-      <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
-      <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
-      <window_info anchor="bottom" id="Find" order="1" />
-    </layout>
-  </component>
-  <component name="VcsContentAnnotationSettings">
-    <option name="myLimit" value="2678400000" />
-  </component>
-  <component name="hg4idea.settings">
-    <option name="CHECK_INCOMING_OUTGOING" value="true" />
-    <option name="ROOT_SYNC" value="DONT_SYNC" />
-  </component>
-  <component name="masterDetails">
-    <states>
-      <state key="ScopeChooserConfigurable.UI">
-        <settings>
-          <splitter-proportions>
-            <option name="proportions">
-              <list>
-                <option value="0.2" />
-              </list>
-            </option>
-          </splitter-proportions>
-        </settings>
-      </state>
-    </states>
-  </component>
-</project>
\ No newline at end of file
diff --git a/ip/ip_tck/doc/dele.sql b/ip/ip_tck/doc/dele.sql
deleted file mode 100644 (file)
index 4710db9..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-psql zunicero -c "drop table informe_tck cascade";
-psql zunicero -c "drop table mediosdepago_tck cascade";
-psql zunicero -c "drop table cobranza_tck cascade";
-psql zunicero -c "drop table vouchertar_tck cascade";
-psql zunicero -c "drop table cfe_tck cascade";
-psql zunicero -c "drop table redondeos_tck cascade";
-psql zunicero -c "drop table ip_ticket cascade";
-psql zunicero -c "drop table ip_ticket_line cascade";
-psql zunicero -c "drop table cab_grouped cascade";
-psql zunicero -c "drop table agrupa_articulo cascade";
-psql zunicero -c "drop table agrupa_familia cascade";
-psql zunicero -c "drop table agrupa_categoria cascade";
-psql zunicero -c "drop table cabezal_consoldia cascade";
-psql zunicero -c "drop table lineas_consoldia cascade";
diff --git a/ip/ip_tck/doc/drop_consolidate.sql b/ip/ip_tck/doc/drop_consolidate.sql
deleted file mode 100644 (file)
index ef50713..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-drop table cab_grouped cascade, 
-drop table agrupa_articulo cascade, 
-drop table agrupa_categoria cascade, 
-drop table agrupa_familia cascade;
diff --git a/ip/ip_tck/doc/set_dic_17_salida.py b/ip/ip_tck/doc/set_dic_17_salida.py
deleted file mode 100644 (file)
index a0c8b0b..0000000
+++ /dev/null
@@ -1,241 +0,0 @@
-
-tck20171103.json
-
- openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-
-         {"hora": "20:31:00", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 51.64, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 63.0, "nota": "", "numerodelinea": "22", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 72136, "preciounitario": 63.0, "importe_civa": 63.0, "codigoarticulo": "7909156168790", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171103003000014859420310022", "importe_siva": 51.64, "codigooriginal": "7909156168806", "nombre_iva": "B\u00e1sico", "importe_iva": 11.36}
- openerp.addons.ip_tck.wizard.importa_tickets: informe: 935  procesados: 913
- openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-11-03 ok
-
-tck20171104.json
-
- openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "19:26:13", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 204.1, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 249.0, "nota": "", "numerodelinea": "27", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 73622, "preciounitario": 249.0, "importe_civa": 249.0, "codigoarticulo": "78917924214", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171104004000014594119261327", "importe_siva": 204.1, "codigooriginal": "078917924214", "nombre_iva": "B\u00e1sico", "importe_iva": 44.9}
-
- openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 7730219013005 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '19:26:01', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 73622L, 'price_unit': 63.0, 'product_uom_qty': 1.0, 'cantidad': 1.0, 'preciounitario': 63.0, 'importe_civa': 63.0, 'codigoarticulo': '7730219013005', 'product_id': 32917, 'punit_siniva': 51.64, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '20171104004000014594119260126', 'importe_siva': 51.64, 'codigooriginal': '7730219013005', 'codigoiva': '1', 'punit_coniva': 63.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '26', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 11.36},
-       a verificar {'tst_ticket': '2017-11-04 19:23:52', 'cantidad': '       1.0', 'codigooriginal': ' 7730219013005', 'punit_coniva': '      63.0', 'date': '2017-11-04', 'ticket': 145941, 'error_linea': KeyError('78917924214',), 'codigoarticulo': ' 7730219013005'}
-                         Al ticket 145941 2017-11-04 2017-11-04 19:23:52 le faltará la línea
- openerp.addons.ip_tck.wizard.importa_tickets: informe: 831  procesados: 812
- openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-11-04 ok
-Códigos por verificar:
- 7730219013005          SI EXISTE!!!!!!!!!!!!!!!!!!
-
-
-tck20171110.json
-
- openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "19:50:35", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 239.34, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 292.0,
-          "nota": "", "numerodelinea": "18", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 78277, "preciounitario": 292.0, "importe_civa": 292.0,
-          "codigoarticulo": "26169036513", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171110003000014991319503518", "importe_siva": 239.34,
-          "codigooriginal": "026169036513", "nombre_iva": "B\u00e1sico", "importe_iva": 52.66}
-
-
-
- openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 2601039 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '19:50:27', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 78277L, 'price_unit': 179.0, 'product_uom_qty': 0.51, 'cantidad': 0.51, 'preciounitario': 179.0, 'importe_civa': 90.93, 'codigoarticulo': '2601039', 'product_id': 18266, 'punit_siniva': 162.72, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '20171110003000014991319502717', 'importe_siva': 82.66, 'codigooriginal': '2601039090932', 'codigoiva': '2', 'punit_coniva': 179.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '17', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 8.27},
-       a verificar {'tst_ticket': '2017-11-10 19:49:37', 'cantidad': '      0.51', 'codigooriginal': ' 2601039090932', 'punit_coniva': '     179.0', 'date': '2017-11-10', 'ticket': 149913, 'error_linea': KeyError('26169036513',), 'codigoarticulo': '       2601039'}
-                         Al ticket 149913 2017-11-10 2017-11-10 19:49:37 le faltará la línea
- openerp.addons.ip_tck.wizard.importa_tickets: informe: 775  procesados: 736
- openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-11-10 ok
-Códigos por verificar:
-       2601039
-
-
-tck20171111.json
- openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171111.json ...
- openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 8697975019285 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '20:31:52', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 79555L, 'price_unit': 108.0, 'product_uom_qty': 1.0, 'cantidad': 1.0, 'preciounitario': 108.0, 'importe_civa': 108.0, 'codigoarticulo': '8697975019285', 'product_id': 33127, 'punit_siniva': 88.52, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '2017111100400001473982031527', 'importe_siva': 88.52, 'codigooriginal': '8697975019285', 'codigoiva': '1', 'punit_coniva': 108.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '7', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 19.48},
-       a verificar {'tst_ticket': '2017-11-11 20:31:49', 'cantidad': '       1.0', 'codigooriginal': ' 8697975019285', 'punit_coniva': '     108.0', 'date': '2017-11-11', 'ticket': 147398, 'error_linea': IndexError('list index out of range',), 'codigoarticulo': ' 8697975019285'}
-                         Al ticket 147398 2017-11-11 2017-11-11 20:31:49 le faltará la línea
- openerp.addons.ip_tck.wizard.importa_tickets: informe: 845  procesados: 819
- openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-11-11 ok
-Códigos por verificar:
- 8697975019285
-tck20171112.json
- openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171112.json ...
- openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 7791290013902 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '19:48:40', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 80082L, 'price_unit': 60.0, 'product_uom_qty': 1.0, 'cantidad': 1.0, 'preciounitario': 60.0, 'importe_civa': 60.0, 'codigoarticulo': '7791290013902', 'product_id': 32927, 'punit_siniva': 54.55, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '20171112002000013841119484036', 'importe_siva': 54.55, 'codigooriginal': '7791290013902', 'codigoiva': '2', 'punit_coniva': 60.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '36', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 5.45},
-       a verificar {'tst_ticket': '2017-11-12 19:46:52', 'cantidad': '       1.0', 'codigooriginal': ' 7791290013902', 'punit_coniva': '      60.0', 'date': '2017-11-12', 'ticket': 138411, 'error_linea': IndexError('list index out of range',), 'codigoarticulo': ' 7791290013902'}
-                         Al ticket 138411 2017-11-12 2017-11-12 19:46:52 le faltará la línea
- openerp.addons.ip_tck.wizard.importa_tickets: informe: 944  procesados: 931
- openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-11-12 ok
-Códigos por verificar:
- 7791290013902
-
-tck20171125.json
- openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171125.json ...
- openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 7909156216422 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '12:00:48', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 90042L, 'price_unit': 89.0, 'product_uom_qty': 1.0, 'cantidad': 1.0, 'preciounitario': 89.0, 'importe_civa': 89.0, 'codigoarticulo': '7909156216422', 'product_id': 33073, 'punit_siniva': 72.95, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '20171125004000014991912004814', 'importe_siva': 72.95, 'codigooriginal': '7909156216422', 'codigoiva': '1', 'punit_coniva': 89.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '14', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 16.05},
-       a verificar {'tst_ticket': '2017-11-25 12:00:15', 'cantidad': '       1.0', 'codigooriginal': ' 7909156216422', 'punit_coniva': '      89.0', 'date': '2017-11-25', 'ticket': 149919, 'error_linea': IndexError('list index out of range',), 'codigoarticulo': ' 7909156216422'}
-                         Al ticket 149919 2017-11-25 2017-11-25 12:00:15 le faltará la línea
- openerp.addons.ip_tck.wizard.importa_tickets: informe: 766  procesados: 754
- openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-11-25 ok
-Códigos por verificar:
- 7909156216422
-tck20171126.json
- openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171126.json ...
- openerp.addons.ip_tck.wizard.importa_tickets: informe: 888  procesados: 883
- openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-11-26 ok
-tck20171127.json
- openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171127.json ...
- openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 7891497772319 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '18:03:05', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 91928L, 'price_unit': 89.0, 'product_uom_qty': 2.0, 'cantidad': 2.0, 'preciounitario': 89.0, 'importe_civa': 178.0, 'codigoarticulo': '7891497772319', 'product_id': 31843, 'punit_siniva': 72.95, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '2017112700400001502871803056', 'importe_siva': 145.9, 'codigooriginal': '7891497772258', 'codigoiva': '1', 'punit_coniva': 89.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '6', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 32.1},
-       a verificar {'tst_ticket': '2017-11-27 18:03:05', 'cantidad': '       2.0', 'codigooriginal': ' 7891497772258', 'punit_coniva': '      89.0', 'date': '2017-11-27', 'ticket': 150287, 'error_linea': IndexError('list index out of range',), 'codigoarticulo': ' 7891497772319'}
-                         Al ticket 150287 2017-11-27 2017-11-27 18:03:05 le faltará la línea
- openerp.addons.ip_tck.wizard.importa_tickets: informe: 750  procesados: 733
- openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-11-27 ok
-Códigos por verificar:
- 7891497772319
-
-tck20171205.json
- openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171205.json ...
-
-                 INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "08:54:35", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 108.2, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 132.0, "nota": "", "numerodelinea": "6", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 98434, "preciounitario": 132.0, "importe_civa": 132.0, "codigoarticulo": "7909156139462", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "2017120500300001546610854356", "importe_siva": 108.2, "codigooriginal": "7909156329207", "nombre_iva": "B\u00e1sico", "importe_iva": 23.8}
- openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "08:54:35", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 108.2, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 132.0, "nota": "", "numerodelinea": "6", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 98434, "preciounitario": 132.0, "importe_civa": 132.0, "codigoarticulo": "7909156139462", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "2017120500300001546610854356", "importe_siva": 108.2, "codigooriginal": "7909156329207", "nombre_iva": "B\u00e1sico", "importe_iva": 23.8}
- openerp.addons.ip_tck.wizard.importa_tickets: informe: 826  procesados: 796
- openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-12-05 ok
-
-tck20171219.json
- openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171219.json ...
-
-                 INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "17:48:51", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 149.18, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 182.0, "nota": "", "numerodelinea": "6", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 109150, "preciounitario": 182.0, "importe_civa": 182.0, "codigoarticulo": "13000535007", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "2017121900200001449591748516", "importe_siva": 149.18, "codigooriginal": "013000535007", "nombre_iva": "B\u00e1sico", "importe_iva": 32.82}
- openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "17:48:51", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 149.18, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 182.0, "nota": "", "numerodelinea": "6", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 109150, "preciounitario": 182.0, "importe_civa": 182.0, "codigoarticulo": "13000535007", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "2017121900200001449591748516", "importe_siva": 149.18, "codigooriginal": "013000535007", "nombre_iva": "B\u00e1sico", "importe_iva": 32.82}
- openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 77306456 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '12:01:08', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 109149L, 'price_unit': 62.0, 'product_uom_qty': 1.0, 'cantidad': 1.0, 'preciounitario': 62.0, 'importe_civa': 62.0, 'codigoarticulo': '77306456', 'product_id': 1326, 'punit_siniva': 56.36, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '20171219002000014489312010812', 'importe_siva': 56.36, 'codigooriginal': '77306456', 'codigoiva': '2', 'punit_coniva': 62.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '12', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 5.64},
-       a verificar {'tst_ticket': '2017-12-19 17:48:51', 'cantidad': '       1.0', 'codigooriginal': '      77306456', 'punit_coniva': '      62.0', 'date': '2017-12-19', 'ticket': 144959, 'error_linea': KeyError('13000535007',), 'codigoarticulo': '      77306456'}
-                         Al ticket 144959 2017-12-19 2017-12-19 17:48:51 le faltará la línea
- openerp.addons.ip_tck.wizard.importa_tickets: informe: 793  procesados: 773
- openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-12-19 ok
-Códigos por verificar:
-      77306456
-
-tck20171222.json
- openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171222.json ...
-
-                 INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "16:51:03", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 51.64, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 63.0, "nota": "", "numerodelinea": "7", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 111741, "preciounitario": 63.0, "importe_civa": 63.0, "codigoarticulo": "7909156168790", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "2017122200300001581911651037", "importe_siva": 51.64, "codigooriginal": "7909156168806", "nombre_iva": "B\u00e1sico", "importe_iva": 11.36}
- openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "16:51:03", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 51.64, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 63.0, "nota": "", "numerodelinea": "7", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 111741, "preciounitario": 63.0, "importe_civa": 63.0, "codigoarticulo": "7909156168790", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "2017122200300001581911651037", "importe_siva": 51.64, "codigooriginal": "7909156168806", "nombre_iva": "B\u00e1sico", "importe_iva": 11.36}
- openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 7891497528640 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '11:40:10', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 111815L, 'price_unit': 67.0, 'product_uom_qty': 1.0, 'cantidad': 1.0, 'preciounitario': 67.0, 'importe_civa': 67.0, 'codigoarticulo': '7891497528640', 'product_id': 27018, 'punit_siniva': 54.92, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '20171222003000015811911401016', 'importe_siva': 54.92, 'codigooriginal': '7891497528640', 'codigoiva': '1', 'punit_coniva': 67.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '16', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 12.08},
-       a verificar {'tst_ticket': '2017-12-22 11:39:33', 'cantidad': '       1.0', 'codigooriginal': ' 7891497528640', 'punit_coniva': '      67.0', 'date': '2017-12-22', 'ticket': 158119, 'error_linea': IndexError('list index out of range',), 'codigoarticulo': ' 7891497528640'}
-                         Al ticket 158119 2017-12-22 2017-12-22 11:39:33 le faltará la línea
-
-                 INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "20:51:27", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 149.18, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 182.0, "nota": "", "numerodelinea": "8", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 111933, "preciounitario": 182.0, "importe_civa": 182.0, "codigoarticulo": "13000535007", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "2017122200500001518942051278", "importe_siva": 149.18, "codigooriginal": "013000535007", "nombre_iva": "B\u00e1sico", "importe_iva": 32.82}
- openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "20:51:27", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 149.18, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 182.0, "nota": "", "numerodelinea": "8", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 111933, "preciounitario": 182.0, "importe_civa": 182.0, "codigoarticulo": "13000535007", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "2017122200500001518942051278", "importe_siva": 149.18, "codigooriginal": "013000535007", "nombre_iva": "B\u00e1sico", "importe_iva": 32.82}
- openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 2603086 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '20:51:12', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 111933L, 'price_unit': 14.0, 'product_uom_qty': 2.19, 'cantidad': 2.19, 'preciounitario': 14.0, 'importe_civa': 30.63, 'codigoarticulo': '2603086', 'product_id': 18840, 'punit_siniva': 12.73, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '2017122200500001518942051127', 'importe_siva': 27.85, 'codigooriginal': '2603086030633', 'codigoiva': '2', 'punit_coniva': 14.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '7', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 2.78},
-       a verificar {'tst_ticket': '2017-12-22 20:50:53', 'cantidad': '      2.19', 'codigooriginal': ' 2603086030633', 'punit_coniva': '      14.0', 'date': '2017-12-22', 'ticket': 151894, 'error_linea': KeyError('13000535007',), 'codigoarticulo': '       2603086'}
-                         Al ticket 151894 2017-12-22 2017-12-22 20:50:53 le faltará la línea
- openerp.addons.ip_tck.wizard.importa_tickets: informe: 920  procesados: 903
- openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-12-22 ok
-Códigos por verificar:
- 7891497528640
-       2603086
-
-tck20171224.json
- openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171224.json ...
- openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 7841503001155 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '10:47:05', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 113660L, 'price_unit': 162.0, 'product_uom_qty': 1.0, 'cantidad': 1.0, 'preciounitario': 162.0, 'importe_civa': 162.0, 'codigoarticulo': '7841503001155', 'product_id': 31522, 'punit_siniva': 132.79, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '20171224003000015865410470534', 'importe_siva': 132.79, 'codigooriginal': '7841503001155', 'codigoiva': '1', 'punit_coniva': 162.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '34', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 29.21},
-       a verificar {'tst_ticket': '2017-12-24 10:45:04', 'cantidad': '       1.0', 'codigooriginal': ' 7841503001155', 'punit_coniva': '     162.0', 'date': '2017-12-24', 'ticket': 158654, 'error_linea': IndexError('list index out of range',), 'codigoarticulo': ' 7841503001155'}
-                         Al ticket 158654 2017-12-24 2017-12-24 10:45:04 le faltará la línea
-
-                 INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "11:26:12", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 149.18, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 182.0, "nota": "", "numerodelinea": "11", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 113817, "preciounitario": 182.0, "importe_civa": 182.0, "codigoarticulo": "13000535007", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171224001000008671711261211", "importe_siva": 149.18, "codigooriginal": "013000535007", "nombre_iva": "B\u00e1sico", "importe_iva": 32.82}
- openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "11:26:12", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 149.18, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 182.0, "nota": "", "numerodelinea": "11", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 113817, "preciounitario": 182.0, "importe_civa": 182.0, "codigoarticulo": "13000535007", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171224001000008671711261211", "importe_siva": 149.18, "codigooriginal": "013000535007", "nombre_iva": "B\u00e1sico", "importe_iva": 32.82}
- openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 2600011 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '11:26:00', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 113817L, 'price_unit': 410.0, 'product_uom_qty': 0.07, 'cantidad': 0.07, 'preciounitario': 410.0, 'importe_civa': 29.52, 'codigoarticulo': '2600011', 'product_id': 19003, 'punit_siniva': 336.11, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '20171224001000008671711260010', 'importe_siva': 24.2, 'codigooriginal': '2600011029526', 'codigoiva': '1', 'punit_coniva': 410.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '10', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 5.32},
-       a verificar {'tst_ticket': '2017-12-24 11:25:35', 'cantidad': '      0.07', 'codigooriginal': ' 2600011029526', 'punit_coniva': '     410.0', 'date': '2017-12-24', 'ticket': 86717, 'error_linea': KeyError('13000535007',), 'codigoarticulo': '       2600011'}
-                         Al ticket 86717 2017-12-24 2017-12-24 11:25:35 le faltará la línea
- openerp.addons.ip_tck.wizard.importa_tickets: informe: 1375  procesados: 1353
- openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-12-24 ok
-Códigos por verificar:
-       2600011
- 7841503001155
-
-tck20171227.json
- openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171227.json ...
- openerp.addons.ip_tck.wizard.importa_tickets: [Aviso] Ticket Suspendido Caja 2 Nro. 146531  Fecha 2017-12-27
-
-                 INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "11:10:11", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 113.11, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 138.0, "nota": "", "numerodelinea": "7", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 116344, "preciounitario": 138.0, "importe_civa": 138.0, "codigoarticulo": "25293002937", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "2017122700200001464481110117", "importe_siva": 113.11, "codigooriginal": "025293002937", "nombre_iva": "B\u00e1sico", "importe_iva": 24.89}
- openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "11:10:11", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 113.11, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 138.0, "nota": "", "numerodelinea": "7", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 116344, "preciounitario": 138.0, "importe_civa": 138.0, "codigoarticulo": "25293002937", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "2017122700200001464481110117", "importe_siva": 113.11, "codigooriginal": "025293002937", "nombre_iva": "B\u00e1sico", "importe_iva": 24.89}
- openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 2603025 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '11:10:07', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 116344L, 'price_unit': 63.0, 'product_uom_qty': 0.45, 'cantidad': 0.45, 'preciounitario': 63.0, 'importe_civa': 28.6, 'codigoarticulo': '2603025', 'product_id': 18779, 'punit_siniva': 57.27, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '2017122700200001464481110076', 'importe_siva': 26.0, 'codigooriginal': '2603025028608', 'codigoiva': '2', 'punit_coniva': 63.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '6', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 2.6},
-       a verificar {'tst_ticket': '2017-12-27 11:10:07', 'cantidad': '      0.45', 'codigooriginal': ' 2603025028608', 'punit_coniva': '      63.0', 'date': '2017-12-27', 'ticket': 146448, 'error_linea': KeyError('25293002937',), 'codigoarticulo': '       2603025'}
-                         Al ticket 146448 2017-12-27 2017-12-27 11:10:07 le faltará la línea
- openerp.addons.ip_tck.wizard.importa_tickets: informe: 742  procesados: 725
- openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-12-27 ok
-Códigos por verificar:
-       2603025
-
-
-tck20171230.json
- openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171230.json ...
- openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 7893333018902 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '08:51:49', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 118149L, 'price_unit': 39.0, 'product_uom_qty': 1.0, 'cantidad': 1.0, 'preciounitario': 39.0, 'importe_civa': 39.0, 'codigoarticulo': '7893333018902', 'product_id': 5820, 'punit_siniva': 31.97, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '20171230005000015329008514915', 'importe_siva': 31.97, 'codigooriginal': '7730917690119', 'codigoiva': '1', 'punit_coniva': 39.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '15', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 7.03},
-       a verificar {'tst_ticket': '2017-12-30 08:51:23', 'cantidad': '       1.0', 'codigooriginal': ' 7730917690119', 'punit_coniva': '      39.0', 'date': '2017-12-30', 'ticket': 153290, 'error_linea': IndexError('list index out of range',), 'codigoarticulo': ' 7893333018902'}
-                         Al ticket 153290 2017-12-30 2017-12-30 08:51:23 le faltará la línea
-
-                 INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "12:25:53", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 149.18, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 182.0, "nota": "", "numerodelinea": "10", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 118252, "preciounitario": 182.0, "importe_civa": 182.0, "codigoarticulo": "13000535007", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171230003000015958412255310", "importe_siva": 149.18, "codigooriginal": "013000535007", "nombre_iva": "B\u00e1sico", "importe_iva": 32.82}
- openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "12:25:53", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 149.18, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 182.0, "nota": "", "numerodelinea": "10", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 118252, "preciounitario": 182.0, "importe_civa": 182.0, "codigoarticulo": "13000535007", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171230003000015958412255310", "importe_siva": 149.18, "codigooriginal": "013000535007", "nombre_iva": "B\u00e1sico", "importe_iva": 32.82}
- openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 7730105001321 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '12:25:49', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 118252L, 'price_unit': 36.0, 'product_uom_qty': 1.0, 'cantidad': 1.0, 'preciounitario': 36.0, 'importe_civa': 36.0, 'codigoarticulo': '7730105001321', 'product_id': 2107, 'punit_siniva': 36.0, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '2017123000300001595841225499', 'importe_siva': 36.0, 'codigooriginal': '7730105001321', 'codigoiva': '3', 'punit_coniva': 36.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '9', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 0.0},
-       a verificar {'tst_ticket': '2017-12-30 12:25:34', 'cantidad': '       1.0', 'codigooriginal': ' 7730105001321', 'punit_coniva': '      36.0', 'date': '2017-12-30', 'ticket': 159584, 'error_linea': KeyError('13000535007',), 'codigoarticulo': ' 7730105001321'}
-                         Al ticket 159584 2017-12-30 2017-12-30 12:25:34 le faltará la línea
- openerp.addons.ip_tck.wizard.importa_tickets: informe: 1100  procesados: 1086
- openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-12-30 ok
-Códigos por verificar:
- 7730105001321
- 7893333018902
-tck20171231.json
- openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171231.json ...
-
-                 INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "11:30:02", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 113.11, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 138.0, "nota": "", "numerodelinea": "21", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 119216, "preciounitario": 138.0, "importe_civa": 138.0, "codigoarticulo": "25293002937", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171231005000015363211300221", "importe_siva": 113.11, "codigooriginal": "025293002937", "nombre_iva": "B\u00e1sico", "importe_iva": 24.89}
- openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "11:30:02", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 113.11, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 138.0, "nota": "", "numerodelinea": "21", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 119216, "preciounitario": 138.0, "importe_civa": 138.0, "codigoarticulo": "25293002937", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171231005000015363211300221", "importe_siva": 113.11, "codigooriginal": "025293002937", "nombre_iva": "B\u00e1sico", "importe_iva": 24.89}
- openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 15 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '11:29:52', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 119216L, 'price_unit': 33.0, 'product_uom_qty': 1.0, 'cantidad': 1.0, 'preciounitario': 33.0, 'importe_civa': 33.0, 'codigoarticulo': '15', 'product_id': 7834, 'punit_siniva': 33.0, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '20171231005000015363211295220', 'importe_siva': 33.0, 'codigooriginal': '7730950620036', 'codigoiva': '3', 'punit_coniva': 33.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '20', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 0.0},
-       a verificar {'tst_ticket': '2017-12-31 11:28:33', 'cantidad': '       1.0', 'codigooriginal': ' 7730950620036', 'punit_coniva': '      33.0', 'date': '2017-12-31', 'ticket': 153632, 'error_linea': KeyError('25293002937',), 'codigoarticulo': '            15'}
-                         Al ticket 153632 2017-12-31 2017-12-31 11:28:33 le faltará la línea
-
-                 INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "11:30:07", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 113.11, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 138.0, "nota": "", "numerodelinea": "22", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 119216, "preciounitario": 138.0, "importe_civa": 138.0, "codigoarticulo": "25293002937", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171231005000015363211300722", "importe_siva": 113.11, "codigooriginal": "025293002937", "nombre_iva": "B\u00e1sico", "importe_iva": 24.89}
- openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "11:30:07", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 113.11, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 138.0, "nota": "", "numerodelinea": "22", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 119216, "preciounitario": 138.0, "importe_civa": 138.0, "codigoarticulo": "25293002937", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171231005000015363211300722", "importe_siva": 113.11, "codigooriginal": "025293002937", "nombre_iva": "B\u00e1sico", "importe_iva": 24.89}
- openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 15 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '11:29:52', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 119216L, 'price_unit': 33.0, 'product_uom_qty': 1.0, 'cantidad': 1.0, 'preciounitario': 33.0, 'importe_civa': 33.0, 'codigoarticulo': '15', 'product_id': 7834, 'punit_siniva': 33.0, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '20171231005000015363211295220', 'importe_siva': 33.0, 'codigooriginal': '7730950620036', 'codigoiva': '3', 'punit_coniva': 33.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '20', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 0.0},
-       a verificar {'tst_ticket': '2017-12-31 11:28:33', 'cantidad': '       1.0', 'codigooriginal': ' 7730950620036', 'punit_coniva': '      33.0', 'date': '2017-12-31', 'ticket': 153632, 'error_linea': KeyError('25293002937',), 'codigoarticulo': '            15'}
-                         Al ticket 153632 2017-12-31 2017-12-31 11:28:33 le faltará la línea
- openerp.addons.ip_tck.wizard.importa_tickets: informe: 1310  procesados: 1294
- openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-12-31 ok
-Códigos por verificar:
-            15
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2001-September.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2001-September.txt.gz
deleted file mode 100644 (file)
index b92a3b2..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2001-September.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2002-April.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2002-April.txt.gz
deleted file mode 100644 (file)
index ae8f29d..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2002-April.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2002-August.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2002-August.txt.gz
deleted file mode 100644 (file)
index edd14a6..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2002-August.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2002-December.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2002-December.txt.gz
deleted file mode 100644 (file)
index 4cc58eb..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2002-December.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2002-July.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2002-July.txt.gz
deleted file mode 100644 (file)
index 805ebf6..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2002-July.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2002-June.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2002-June.txt.gz
deleted file mode 100644 (file)
index 025613f..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2002-June.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2002-May.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2002-May.txt.gz
deleted file mode 100644 (file)
index 392b183..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2002-May.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2002-November.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2002-November.txt.gz
deleted file mode 100644 (file)
index caf6496..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2002-November.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2002-October.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2002-October.txt.gz
deleted file mode 100644 (file)
index 75ad7d5..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2002-October.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2002-September.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2002-September.txt.gz
deleted file mode 100644 (file)
index 51008b5..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2002-September.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2003-April.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2003-April.txt.gz
deleted file mode 100644 (file)
index 6d70cf5..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2003-April.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2003-August.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2003-August.txt.gz
deleted file mode 100644 (file)
index 6bd7ac1..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2003-August.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2003-December.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2003-December.txt.gz
deleted file mode 100644 (file)
index d1f7479..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2003-December.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2003-February.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2003-February.txt.gz
deleted file mode 100644 (file)
index 4eaf6b0..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2003-February.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2003-January.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2003-January.txt.gz
deleted file mode 100644 (file)
index 5361f49..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2003-January.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2003-July.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2003-July.txt.gz
deleted file mode 100644 (file)
index 00d3981..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2003-July.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2003-June.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2003-June.txt.gz
deleted file mode 100644 (file)
index 2382977..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2003-June.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2003-March.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2003-March.txt.gz
deleted file mode 100644 (file)
index 7b7ab9a..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2003-March.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2003-May.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2003-May.txt.gz
deleted file mode 100644 (file)
index 2aa1098..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2003-May.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2003-November.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2003-November.txt.gz
deleted file mode 100644 (file)
index a2de7e1..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2003-November.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2003-October.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2003-October.txt.gz
deleted file mode 100644 (file)
index 36d000a..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2003-October.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2003-September.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2003-September.txt.gz
deleted file mode 100644 (file)
index c493539..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2003-September.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2004-April.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2004-April.txt.gz
deleted file mode 100644 (file)
index 9fcdb99..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2004-April.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2004-August.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2004-August.txt.gz
deleted file mode 100644 (file)
index d2abb02..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2004-August.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2004-December.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2004-December.txt.gz
deleted file mode 100644 (file)
index 869a565..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2004-December.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2004-February.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2004-February.txt.gz
deleted file mode 100644 (file)
index 5937846..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2004-February.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2004-January.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2004-January.txt.gz
deleted file mode 100644 (file)
index 358ce7e..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2004-January.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2004-July.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2004-July.txt.gz
deleted file mode 100644 (file)
index 23ff37f..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2004-July.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2004-June.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2004-June.txt.gz
deleted file mode 100644 (file)
index a280a9c..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2004-June.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2004-March.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2004-March.txt.gz
deleted file mode 100644 (file)
index cff1ef2..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2004-March.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2004-May.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2004-May.txt.gz
deleted file mode 100644 (file)
index f56a682..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2004-May.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2004-November.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2004-November.txt.gz
deleted file mode 100644 (file)
index 74c9809..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2004-November.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2004-October.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2004-October.txt.gz
deleted file mode 100644 (file)
index e022b45..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2004-October.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2004-September.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2004-September.txt.gz
deleted file mode 100644 (file)
index 1d6dc8d..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2004-September.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2005-April.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2005-April.txt.gz
deleted file mode 100644 (file)
index cddefff..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2005-April.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2005-August.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2005-August.txt.gz
deleted file mode 100644 (file)
index 54d0cdc..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2005-August.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2005-December.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2005-December.txt.gz
deleted file mode 100644 (file)
index 8937bf3..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2005-December.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2005-February.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2005-February.txt.gz
deleted file mode 100644 (file)
index a24b330..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2005-February.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2005-January.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2005-January.txt.gz
deleted file mode 100644 (file)
index d9f5861..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2005-January.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2005-July.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2005-July.txt.gz
deleted file mode 100644 (file)
index ee9406b..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2005-July.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2005-June.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2005-June.txt.gz
deleted file mode 100644 (file)
index 26c2b5b..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2005-June.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2005-March.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2005-March.txt.gz
deleted file mode 100644 (file)
index 5e452e6..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2005-March.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2005-May.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2005-May.txt.gz
deleted file mode 100644 (file)
index 466590f..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2005-May.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2005-November.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2005-November.txt.gz
deleted file mode 100644 (file)
index 1ad997d..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2005-November.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2005-October.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2005-October.txt.gz
deleted file mode 100644 (file)
index 3f6d872..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2005-October.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2005-September.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2005-September.txt.gz
deleted file mode 100644 (file)
index 855c04a..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2005-September.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2006-April.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2006-April.txt.gz
deleted file mode 100644 (file)
index 9709d6c..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2006-April.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2006-August.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2006-August.txt.gz
deleted file mode 100644 (file)
index cce3ecd..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2006-August.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2006-December.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2006-December.txt.gz
deleted file mode 100644 (file)
index fdda28f..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2006-December.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2006-February.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2006-February.txt.gz
deleted file mode 100644 (file)
index 957a864..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2006-February.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2006-January.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2006-January.txt.gz
deleted file mode 100644 (file)
index 50820f9..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2006-January.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2006-July.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2006-July.txt.gz
deleted file mode 100644 (file)
index dacd945..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2006-July.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2006-June.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2006-June.txt.gz
deleted file mode 100644 (file)
index 9b3e486..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2006-June.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2006-March.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2006-March.txt.gz
deleted file mode 100644 (file)
index ca40011..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2006-March.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2006-May.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2006-May.txt.gz
deleted file mode 100644 (file)
index 0e08847..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2006-May.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2006-November.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2006-November.txt.gz
deleted file mode 100644 (file)
index b3aa2f8..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2006-November.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2006-October.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2006-October.txt.gz
deleted file mode 100644 (file)
index b5bb349..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2006-October.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2006-September.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2006-September.txt.gz
deleted file mode 100644 (file)
index d751df1..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2006-September.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2007-April.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2007-April.txt.gz
deleted file mode 100644 (file)
index 51a1b9c..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2007-April.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2007-August.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2007-August.txt.gz
deleted file mode 100644 (file)
index ac502dd..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2007-August.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2007-December.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2007-December.txt.gz
deleted file mode 100644 (file)
index a98940a..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2007-December.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2007-February.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2007-February.txt.gz
deleted file mode 100644 (file)
index cce6b53..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2007-February.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2007-January.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2007-January.txt.gz
deleted file mode 100644 (file)
index e9f216c..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2007-January.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2007-July.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2007-July.txt.gz
deleted file mode 100644 (file)
index 01d0aa8..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2007-July.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2007-June.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2007-June.txt.gz
deleted file mode 100644 (file)
index 0cf6be3..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2007-June.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2007-March.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2007-March.txt.gz
deleted file mode 100644 (file)
index 46ffb81..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2007-March.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2007-May.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2007-May.txt.gz
deleted file mode 100644 (file)
index e9b1aba..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2007-May.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2007-November.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2007-November.txt.gz
deleted file mode 100644 (file)
index be65af9..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2007-November.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2007-October.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2007-October.txt.gz
deleted file mode 100644 (file)
index 97953d3..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2007-October.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2007-September.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2007-September.txt.gz
deleted file mode 100644 (file)
index 0e805b8..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2007-September.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2008-April.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2008-April.txt.gz
deleted file mode 100644 (file)
index 74e7dba..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2008-April.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2008-August.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2008-August.txt.gz
deleted file mode 100644 (file)
index 86cd605..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2008-August.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2008-December.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2008-December.txt.gz
deleted file mode 100644 (file)
index c884c85..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2008-December.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2008-February.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2008-February.txt.gz
deleted file mode 100644 (file)
index dbf1131..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2008-February.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2008-January.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2008-January.txt.gz
deleted file mode 100644 (file)
index 203c452..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2008-January.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2008-July.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2008-July.txt.gz
deleted file mode 100644 (file)
index dfb36d6..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2008-July.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2008-June.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2008-June.txt.gz
deleted file mode 100644 (file)
index 01af06f..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2008-June.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2008-March.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2008-March.txt.gz
deleted file mode 100644 (file)
index 3f1df4d..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2008-March.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2008-May.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2008-May.txt.gz
deleted file mode 100644 (file)
index 5c497aa..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2008-May.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2008-November.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2008-November.txt.gz
deleted file mode 100644 (file)
index f355864..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2008-November.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2008-October.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2008-October.txt.gz
deleted file mode 100644 (file)
index 980ad1a..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2008-October.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2008-September.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2008-September.txt.gz
deleted file mode 100644 (file)
index 696f3cc..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2008-September.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2009-April.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2009-April.txt.gz
deleted file mode 100644 (file)
index 6952bd1..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2009-April.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2009-August.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2009-August.txt.gz
deleted file mode 100644 (file)
index b28a972..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2009-August.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2009-December.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2009-December.txt.gz
deleted file mode 100644 (file)
index 8578215..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2009-December.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2009-February.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2009-February.txt.gz
deleted file mode 100644 (file)
index e6e673e..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2009-February.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2009-January.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2009-January.txt.gz
deleted file mode 100644 (file)
index ad51586..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2009-January.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2009-July.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2009-July.txt.gz
deleted file mode 100644 (file)
index 070dd40..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2009-July.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2009-June.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2009-June.txt.gz
deleted file mode 100644 (file)
index 9963e79..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2009-June.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2009-March.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2009-March.txt.gz
deleted file mode 100644 (file)
index d03026a..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2009-March.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2009-May.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2009-May.txt.gz
deleted file mode 100644 (file)
index b6c4266..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2009-May.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2009-November.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2009-November.txt.gz
deleted file mode 100644 (file)
index 8c42320..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2009-November.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2009-October.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2009-October.txt.gz
deleted file mode 100644 (file)
index 0a37de6..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2009-October.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2009-September.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2009-September.txt.gz
deleted file mode 100644 (file)
index aa0cb04..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2009-September.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2011-April.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2011-April.txt.gz
deleted file mode 100644 (file)
index e921f87..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2011-April.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2011-August.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2011-August.txt.gz
deleted file mode 100644 (file)
index 783da5a..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2011-August.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2011-December.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2011-December.txt.gz
deleted file mode 100644 (file)
index 088ebff..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2011-December.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2011-February.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2011-February.txt.gz
deleted file mode 100644 (file)
index a195563..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2011-February.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2011-January.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2011-January.txt.gz
deleted file mode 100644 (file)
index abc8bd9..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2011-January.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2011-July.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2011-July.txt.gz
deleted file mode 100644 (file)
index 1eca3a2..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2011-July.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2011-June.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2011-June.txt.gz
deleted file mode 100644 (file)
index df2d30b..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2011-June.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2011-March.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2011-March.txt.gz
deleted file mode 100644 (file)
index 4531a5e..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2011-March.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2011-May.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2011-May.txt.gz
deleted file mode 100644 (file)
index 89f873d..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2011-May.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2011-November.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2011-November.txt.gz
deleted file mode 100644 (file)
index 7f13870..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2011-November.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2011-October.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2011-October.txt.gz
deleted file mode 100644 (file)
index ffe84a8..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2011-October.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2011-September.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2011-September.txt.gz
deleted file mode 100644 (file)
index dd6f835..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2011-September.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2012-April.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2012-April.txt.gz
deleted file mode 100644 (file)
index 5cd69b9..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2012-April.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2012-August.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2012-August.txt.gz
deleted file mode 100644 (file)
index 4dc3eec..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2012-August.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2012-December.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2012-December.txt.gz
deleted file mode 100644 (file)
index 040fbf3..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2012-December.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2012-February.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2012-February.txt.gz
deleted file mode 100644 (file)
index aa38848..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2012-February.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2012-January.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2012-January.txt.gz
deleted file mode 100644 (file)
index 70f2371..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2012-January.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2012-July.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2012-July.txt.gz
deleted file mode 100644 (file)
index 51a729a..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2012-July.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2012-June.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2012-June.txt.gz
deleted file mode 100644 (file)
index 6b864af..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2012-June.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2012-March.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2012-March.txt.gz
deleted file mode 100644 (file)
index 4c87d83..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2012-March.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2012-May.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2012-May.txt.gz
deleted file mode 100644 (file)
index 692538e..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2012-May.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2012-November.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2012-November.txt.gz
deleted file mode 100644 (file)
index 370a3e1..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2012-November.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2012-October.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2012-October.txt.gz
deleted file mode 100644 (file)
index 7b5c7a8..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2012-October.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2012-September.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2012-September.txt.gz
deleted file mode 100644 (file)
index c4771c7..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2012-September.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2013-April.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2013-April.txt.gz
deleted file mode 100644 (file)
index 7a89ec4..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2013-April.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2013-August.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2013-August.txt.gz
deleted file mode 100644 (file)
index 4a23df4..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2013-August.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2013-December.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2013-December.txt.gz
deleted file mode 100644 (file)
index 60af069..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2013-December.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2013-February.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2013-February.txt.gz
deleted file mode 100644 (file)
index db7561e..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2013-February.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2013-January.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2013-January.txt.gz
deleted file mode 100644 (file)
index d0e3f5d..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2013-January.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2013-July.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2013-July.txt.gz
deleted file mode 100644 (file)
index 1453b37..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2013-July.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2013-June.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2013-June.txt.gz
deleted file mode 100644 (file)
index 7a7d35a..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2013-June.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2013-March.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2013-March.txt.gz
deleted file mode 100644 (file)
index f21a5c3..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2013-March.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2013-May.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2013-May.txt.gz
deleted file mode 100644 (file)
index 05be040..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2013-May.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2013-November.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2013-November.txt.gz
deleted file mode 100644 (file)
index 68e389a..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2013-November.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2013-October.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2013-October.txt.gz
deleted file mode 100644 (file)
index bf6cd0e..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2013-October.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2013-September.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2013-September.txt.gz
deleted file mode 100644 (file)
index 9a73ffb..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2013-September.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2014-April.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2014-April.txt.gz
deleted file mode 100644 (file)
index a4a49f2..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2014-April.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2014-August.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2014-August.txt.gz
deleted file mode 100644 (file)
index 2381dfd..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2014-August.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2014-December.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2014-December.txt.gz
deleted file mode 100644 (file)
index cd027c9..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2014-December.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2014-February.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2014-February.txt.gz
deleted file mode 100644 (file)
index f4c2676..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2014-February.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2014-January.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2014-January.txt.gz
deleted file mode 100644 (file)
index 7895d4c..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2014-January.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2014-July.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2014-July.txt.gz
deleted file mode 100644 (file)
index a4a118c..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2014-July.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2014-June.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2014-June.txt.gz
deleted file mode 100644 (file)
index bc865ae..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2014-June.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2014-March.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2014-March.txt.gz
deleted file mode 100644 (file)
index f6737e5..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2014-March.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2014-May.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2014-May.txt.gz
deleted file mode 100644 (file)
index 51ed6a0..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2014-May.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2014-November.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2014-November.txt.gz
deleted file mode 100644 (file)
index 61b0b92..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2014-November.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2014-October.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2014-October.txt.gz
deleted file mode 100644 (file)
index c7d67de..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2014-October.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2014-September.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2014-September.txt.gz
deleted file mode 100644 (file)
index 53a4c56..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2014-September.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2015-April.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2015-April.txt.gz
deleted file mode 100644 (file)
index 4484573..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2015-April.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2015-August.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2015-August.txt.gz
deleted file mode 100644 (file)
index 5ded352..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2015-August.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2015-December.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2015-December.txt.gz
deleted file mode 100644 (file)
index eb96841..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2015-December.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2015-February.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2015-February.txt.gz
deleted file mode 100644 (file)
index 0e8bda4..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2015-February.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2015-January.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2015-January.txt.gz
deleted file mode 100644 (file)
index 2e52512..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2015-January.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2015-July.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2015-July.txt.gz
deleted file mode 100644 (file)
index bf1317a..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2015-July.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2015-June.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2015-June.txt.gz
deleted file mode 100644 (file)
index 74b2acf..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2015-June.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2015-March.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2015-March.txt.gz
deleted file mode 100644 (file)
index 7b86993..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2015-March.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2015-May.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2015-May.txt.gz
deleted file mode 100644 (file)
index b2a9cfd..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2015-May.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2015-November.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2015-November.txt.gz
deleted file mode 100644 (file)
index 3952d4c..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2015-November.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2015-October.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2015-October.txt.gz
deleted file mode 100644 (file)
index 328a701..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2015-October.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2015-September.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2015-September.txt.gz
deleted file mode 100644 (file)
index 5303673..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2015-September.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2016-April.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2016-April.txt.gz
deleted file mode 100644 (file)
index 76dc5a5..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2016-April.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2016-August.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2016-August.txt.gz
deleted file mode 100644 (file)
index 19bc0c8..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2016-August.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2016-December.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2016-December.txt.gz
deleted file mode 100644 (file)
index 46f5099..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2016-December.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2016-February.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2016-February.txt.gz
deleted file mode 100644 (file)
index 84781e6..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2016-February.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2016-January.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2016-January.txt.gz
deleted file mode 100644 (file)
index 25c7b4d..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2016-January.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2016-July.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2016-July.txt.gz
deleted file mode 100644 (file)
index d985893..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2016-July.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2016-June.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2016-June.txt.gz
deleted file mode 100644 (file)
index 2bd3dbf..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2016-June.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2016-March.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2016-March.txt.gz
deleted file mode 100644 (file)
index d6ca934..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2016-March.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2016-May.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2016-May.txt.gz
deleted file mode 100644 (file)
index 88062b0..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2016-May.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2016-November.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2016-November.txt.gz
deleted file mode 100644 (file)
index 7563959..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2016-November.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2016-October.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2016-October.txt.gz
deleted file mode 100644 (file)
index 334377a..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2016-October.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2016-September.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2016-September.txt.gz
deleted file mode 100644 (file)
index d9585c6..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2016-September.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2017-April.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2017-April.txt.gz
deleted file mode 100644 (file)
index 8693571..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2017-April.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2017-August.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2017-August.txt.gz
deleted file mode 100644 (file)
index fc9f643..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2017-August.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2017-February.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2017-February.txt.gz
deleted file mode 100644 (file)
index 18d6e49..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2017-February.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2017-January.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2017-January.txt.gz
deleted file mode 100644 (file)
index abdbc26..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2017-January.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2017-July.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2017-July.txt.gz
deleted file mode 100644 (file)
index 66c7326..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2017-July.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2017-June.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2017-June.txt.gz
deleted file mode 100644 (file)
index cf483e3..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2017-June.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2017-March.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2017-March.txt.gz
deleted file mode 100644 (file)
index e193d78..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2017-March.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2017-May.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2017-May.txt.gz
deleted file mode 100644 (file)
index d89ae38..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2017-May.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2017-November.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2017-November.txt.gz
deleted file mode 100644 (file)
index f6c1b5b..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2017-November.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2017-October.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2017-October.txt.gz
deleted file mode 100644 (file)
index 1a0f305..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2017-October.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/estado_cuenta/report/olab_users/2017-September.txt.gz b/ip/ip_tck/estado_cuenta/report/olab_users/2017-September.txt.gz
deleted file mode 100644 (file)
index fc90eb6..0000000
Binary files a/ip/ip_tck/estado_cuenta/report/olab_users/2017-September.txt.gz and /dev/null differ
diff --git a/ip/ip_tck/salida.py b/ip/ip_tck/salida.py
deleted file mode 100644 (file)
index 2178680..0000000
+++ /dev/null
@@ -1,223 +0,0 @@
-
-tck20171103.json
-2018-11-02 21:28:06,773 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171103.json ...
-
-                 INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "20:31:00", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 51.64, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 63.0, "nota": "", "numerodelinea": "22", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 72136, "preciounitario": 63.0, "importe_civa": 63.0, "codigoarticulo": "7909156168790", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171103003000014859420310022", "importe_siva": 51.64, "codigooriginal": "7909156168806", "nombre_iva": "B\u00e1sico", "importe_iva": 11.36}
-2018-11-02 21:28:09,771 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "20:31:00", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 51.64, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 63.0, "nota": "", "numerodelinea": "22", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 72136, "preciounitario": 63.0, "importe_civa": 63.0, "codigoarticulo": "7909156168790", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171103003000014859420310022", "importe_siva": 51.64, "codigooriginal": "7909156168806", "nombre_iva": "B\u00e1sico", "importe_iva": 11.36}
-2018-11-02 21:29:23,071 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: 935  procesados: 913
-2018-11-02 21:29:23,084 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-11-03 ok
-tck20171104.json
-2018-11-02 21:29:23,086 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171104.json ...
-
-                 INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "19:26:13", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 204.1, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 249.0, "nota": "", "numerodelinea": "27", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 73622, "preciounitario": 249.0, "importe_civa": 249.0, "codigoarticulo": "78917924214", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171104004000014594119261327", "importe_siva": 204.1, "codigooriginal": "078917924214", "nombre_iva": "B\u00e1sico", "importe_iva": 44.9}
-2018-11-02 21:30:12,806 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "19:26:13", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 204.1, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 249.0, "nota": "", "numerodelinea": "27", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 73622, "preciounitario": 249.0, "importe_civa": 249.0, "codigoarticulo": "78917924214", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171104004000014594119261327", "importe_siva": 204.1, "codigooriginal": "078917924214", "nombre_iva": "B\u00e1sico", "importe_iva": 44.9}
-2018-11-02 21:30:12,806 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 7730219013005 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '19:26:01', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 73622L, 'price_unit': 63.0, 'product_uom_qty': 1.0, 'cantidad': 1.0, 'preciounitario': 63.0, 'importe_civa': 63.0, 'codigoarticulo': '7730219013005', 'product_id': 32917, 'punit_siniva': 51.64, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '20171104004000014594119260126', 'importe_siva': 51.64, 'codigooriginal': '7730219013005', 'codigoiva': '1', 'punit_coniva': 63.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '26', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 11.36}, a verificar {'tst_ticket': '2017-11-04 19:23:52', 'cantidad': '       1.0', 'codigooriginal': ' 7730219013005', 'punit_coniva': '      63.0', 'date': '2017-11-04', 'ticket': 145941, 'error_linea': KeyError('78917924214',), 'codigoarticulo': ' 7730219013005'}
-                         Al ticket 145941 2017-11-04 2017-11-04 19:23:52 le faltará la línea
-2018-11-02 21:30:34,012 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: 831  procesados: 812
-2018-11-02 21:30:34,025 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-11-04 ok
-Códigos por verificar:
- 7730219013005
-
-
-tck20171110.json
-2018-11-02 21:36:59,383 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171110.json ...
-
-                 INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "19:50:35", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 239.34, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 292.0, "nota": "", "numerodelinea": "18", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 78277, "preciounitario": 292.0, "importe_civa": 292.0, "codigoarticulo": "26169036513", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171110003000014991319503518", "importe_siva": 239.34, "codigooriginal": "026169036513", "nombre_iva": "B\u00e1sico", "importe_iva": 52.66}
-2018-11-02 21:37:32,806 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "19:50:35", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 239.34, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 292.0, "nota": "", "numerodelinea": "18", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 78277, "preciounitario": 292.0, "importe_civa": 292.0, "codigoarticulo": "26169036513", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171110003000014991319503518", "importe_siva": 239.34, "codigooriginal": "026169036513", "nombre_iva": "B\u00e1sico", "importe_iva": 52.66}
-2018-11-02 21:37:32,807 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 2601039 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '19:50:27', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 78277L, 'price_unit': 179.0, 'product_uom_qty': 0.51, 'cantidad': 0.51, 'preciounitario': 179.0, 'importe_civa': 90.93, 'codigoarticulo': '2601039', 'product_id': 18266, 'punit_siniva': 162.72, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '20171110003000014991319502717', 'importe_siva': 82.66, 'codigooriginal': '2601039090932', 'codigoiva': '2', 'punit_coniva': 179.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '17', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 8.27}, a verificar {'tst_ticket': '2017-11-10 19:49:37', 'cantidad': '      0.51', 'codigooriginal': ' 2601039090932', 'punit_coniva': '     179.0', 'date': '2017-11-10', 'ticket': 149913, 'error_linea': KeyError('26169036513',), 'codigoarticulo': '       2601039'}
-                         Al ticket 149913 2017-11-10 2017-11-10 19:49:37 le faltará la línea
-2018-11-02 21:38:26,917 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: 775  procesados: 736
-2018-11-02 21:38:26,937 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-11-10 ok
-Códigos por verificar:
-       2601039
-tck20171111.json
-2018-11-02 21:38:26,938 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171111.json ...
-2018-11-02 21:40:12,019 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 8697975019285 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '20:31:52', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 79555L, 'price_unit': 108.0, 'product_uom_qty': 1.0, 'cantidad': 1.0, 'preciounitario': 108.0, 'importe_civa': 108.0, 'codigoarticulo': '8697975019285', 'product_id': 33127, 'punit_siniva': 88.52, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '2017111100400001473982031527', 'importe_siva': 88.52, 'codigooriginal': '8697975019285', 'codigoiva': '1', 'punit_coniva': 108.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '7', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 19.48}, a verificar {'tst_ticket': '2017-11-11 20:31:49', 'cantidad': '       1.0', 'codigooriginal': ' 8697975019285', 'punit_coniva': '     108.0', 'date': '2017-11-11', 'ticket': 147398, 'error_linea': IndexError('list index out of range',), 'codigoarticulo': ' 8697975019285'}
-                         Al ticket 147398 2017-11-11 2017-11-11 20:31:49 le faltará la línea
-2018-11-02 21:40:14,214 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: 845  procesados: 819
-2018-11-02 21:40:14,238 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-11-11 ok
-Códigos por verificar:
- 8697975019285
-tck20171112.json
-2018-11-02 21:40:14,239 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171112.json ...
-2018-11-02 21:41:06,279 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 7791290013902 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '19:48:40', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 80082L, 'price_unit': 60.0, 'product_uom_qty': 1.0, 'cantidad': 1.0, 'preciounitario': 60.0, 'importe_civa': 60.0, 'codigoarticulo': '7791290013902', 'product_id': 32927, 'punit_siniva': 54.55, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '20171112002000013841119484036', 'importe_siva': 54.55, 'codigooriginal': '7791290013902', 'codigoiva': '2', 'punit_coniva': 60.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '36', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 5.45}, a verificar {'tst_ticket': '2017-11-12 19:46:52', 'cantidad': '       1.0', 'codigooriginal': ' 7791290013902', 'punit_coniva': '      60.0', 'date': '2017-11-12', 'ticket': 138411, 'error_linea': IndexError('list index out of range',), 'codigoarticulo': ' 7791290013902'}
-                         Al ticket 138411 2017-11-12 2017-11-12 19:46:52 le faltará la línea
-2018-11-02 21:41:53,583 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: 944  procesados: 931
-2018-11-02 21:41:53,607 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-11-12 ok
-Códigos por verificar:
- 7791290013902
-
-tck20171125.json
-2018-11-02 22:05:20,094 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171125.json ...
-2018-11-02 22:05:53,694 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 7909156216422 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '12:00:48', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 90042L, 'price_unit': 89.0, 'product_uom_qty': 1.0, 'cantidad': 1.0, 'preciounitario': 89.0, 'importe_civa': 89.0, 'codigoarticulo': '7909156216422', 'product_id': 33073, 'punit_siniva': 72.95, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '20171125004000014991912004814', 'importe_siva': 72.95, 'codigooriginal': '7909156216422', 'codigoiva': '1', 'punit_coniva': 89.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '14', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 16.05}, a verificar {'tst_ticket': '2017-11-25 12:00:15', 'cantidad': '       1.0', 'codigooriginal': ' 7909156216422', 'punit_coniva': '      89.0', 'date': '2017-11-25', 'ticket': 149919, 'error_linea': IndexError('list index out of range',), 'codigoarticulo': ' 7909156216422'}
-                         Al ticket 149919 2017-11-25 2017-11-25 12:00:15 le faltará la línea
-2018-11-02 22:07:52,813 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: 766  procesados: 754
-2018-11-02 22:07:52,850 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-11-25 ok
-Códigos por verificar:
- 7909156216422
-tck20171126.json
-2018-11-02 22:07:52,852 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171126.json ...
-2018-11-02 22:10:12,925 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: 888  procesados: 883
-2018-11-02 22:10:12,966 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-11-26 ok
-tck20171127.json
-2018-11-02 22:10:12,967 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171127.json ...
-2018-11-02 22:11:29,047 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 7891497772319 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '18:03:05', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 91928L, 'price_unit': 89.0, 'product_uom_qty': 2.0, 'cantidad': 2.0, 'preciounitario': 89.0, 'importe_civa': 178.0, 'codigoarticulo': '7891497772319', 'product_id': 31843, 'punit_siniva': 72.95, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '2017112700400001502871803056', 'importe_siva': 145.9, 'codigooriginal': '7891497772258', 'codigoiva': '1', 'punit_coniva': 89.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '6', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 32.1}, a verificar {'tst_ticket': '2017-11-27 18:03:05', 'cantidad': '       2.0', 'codigooriginal': ' 7891497772258', 'punit_coniva': '      89.0', 'date': '2017-11-27', 'ticket': 150287, 'error_linea': IndexError('list index out of range',), 'codigoarticulo': ' 7891497772319'}
-                         Al ticket 150287 2017-11-27 2017-11-27 18:03:05 le faltará la línea
-2018-11-02 22:12:33,564 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: 750  procesados: 733
-2018-11-02 22:12:33,603 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-11-27 ok
-Códigos por verificar:
- 7891497772319
-
-tck20171205.json
-2018-11-02 22:32:46,002 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171205.json ...
-
-                 INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "08:54:35", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 108.2, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 132.0, "nota": "", "numerodelinea": "6", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 98434, "preciounitario": 132.0, "importe_civa": 132.0, "codigoarticulo": "7909156139462", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "2017120500300001546610854356", "importe_siva": 108.2, "codigooriginal": "7909156329207", "nombre_iva": "B\u00e1sico", "importe_iva": 23.8}
-2018-11-02 22:34:06,599 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "08:54:35", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 108.2, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 132.0, "nota": "", "numerodelinea": "6", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 98434, "preciounitario": 132.0, "importe_civa": 132.0, "codigoarticulo": "7909156139462", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "2017120500300001546610854356", "importe_siva": 108.2, "codigooriginal": "7909156329207", "nombre_iva": "B\u00e1sico", "importe_iva": 23.8}
-2018-11-02 22:35:52,372 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: 826  procesados: 796
-2018-11-02 22:35:52,422 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-12-05 ok
-
-tck20171219.json
-2018-11-02 23:13:41,793 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171219.json ...
-
-                 INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "17:48:51", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 149.18, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 182.0, "nota": "", "numerodelinea": "6", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 109150, "preciounitario": 182.0, "importe_civa": 182.0, "codigoarticulo": "13000535007", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "2017121900200001449591748516", "importe_siva": 149.18, "codigooriginal": "013000535007", "nombre_iva": "B\u00e1sico", "importe_iva": 32.82}
-2018-11-02 23:13:57,132 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "17:48:51", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 149.18, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 182.0, "nota": "", "numerodelinea": "6", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 109150, "preciounitario": 182.0, "importe_civa": 182.0, "codigoarticulo": "13000535007", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "2017121900200001449591748516", "importe_siva": 149.18, "codigooriginal": "013000535007", "nombre_iva": "B\u00e1sico", "importe_iva": 32.82}
-2018-11-02 23:13:57,133 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 77306456 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '12:01:08', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 109149L, 'price_unit': 62.0, 'product_uom_qty': 1.0, 'cantidad': 1.0, 'preciounitario': 62.0, 'importe_civa': 62.0, 'codigoarticulo': '77306456', 'product_id': 1326, 'punit_siniva': 56.36, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '20171219002000014489312010812', 'importe_siva': 56.36, 'codigooriginal': '77306456', 'codigoiva': '2', 'punit_coniva': 62.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '12', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 5.64}, a verificar {'tst_ticket': '2017-12-19 17:48:51', 'cantidad': '       1.0', 'codigooriginal': '      77306456', 'punit_coniva': '      62.0', 'date': '2017-12-19', 'ticket': 144959, 'error_linea': KeyError('13000535007',), 'codigoarticulo': '      77306456'}
-                         Al ticket 144959 2017-12-19 2017-12-19 17:48:51 le faltará la línea
-2018-11-02 23:14:29,363 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: 793  procesados: 773
-2018-11-02 23:14:29,369 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-12-19 ok
-Códigos por verificar:
-      77306456
-
-tck20171222.json
-2018-11-02 23:16:07,830 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171222.json ...
-
-                 INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "16:51:03", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 51.64, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 63.0, "nota": "", "numerodelinea": "7", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 111741, "preciounitario": 63.0, "importe_civa": 63.0, "codigoarticulo": "7909156168790", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "2017122200300001581911651037", "importe_siva": 51.64, "codigooriginal": "7909156168806", "nombre_iva": "B\u00e1sico", "importe_iva": 11.36}
-2018-11-02 23:16:31,107 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "16:51:03", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 51.64, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 63.0, "nota": "", "numerodelinea": "7", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 111741, "preciounitario": 63.0, "importe_civa": 63.0, "codigoarticulo": "7909156168790", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "2017122200300001581911651037", "importe_siva": 51.64, "codigooriginal": "7909156168806", "nombre_iva": "B\u00e1sico", "importe_iva": 11.36}
-2018-11-02 23:16:35,662 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 7891497528640 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '11:40:10', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 111815L, 'price_unit': 67.0, 'product_uom_qty': 1.0, 'cantidad': 1.0, 'preciounitario': 67.0, 'importe_civa': 67.0, 'codigoarticulo': '7891497528640', 'product_id': 27018, 'punit_siniva': 54.92, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '20171222003000015811911401016', 'importe_siva': 54.92, 'codigooriginal': '7891497528640', 'codigoiva': '1', 'punit_coniva': 67.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '16', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 12.08}, a verificar {'tst_ticket': '2017-12-22 11:39:33', 'cantidad': '       1.0', 'codigooriginal': ' 7891497528640', 'punit_coniva': '      67.0', 'date': '2017-12-22', 'ticket': 158119, 'error_linea': IndexError('list index out of range',), 'codigoarticulo': ' 7891497528640'}
-                         Al ticket 158119 2017-12-22 2017-12-22 11:39:33 le faltará la línea
-
-                 INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "20:51:27", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 149.18, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 182.0, "nota": "", "numerodelinea": "8", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 111933, "preciounitario": 182.0, "importe_civa": 182.0, "codigoarticulo": "13000535007", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "2017122200500001518942051278", "importe_siva": 149.18, "codigooriginal": "013000535007", "nombre_iva": "B\u00e1sico", "importe_iva": 32.82}
-2018-11-02 23:16:42,857 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "20:51:27", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 149.18, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 182.0, "nota": "", "numerodelinea": "8", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 111933, "preciounitario": 182.0, "importe_civa": 182.0, "codigoarticulo": "13000535007", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "2017122200500001518942051278", "importe_siva": 149.18, "codigooriginal": "013000535007", "nombre_iva": "B\u00e1sico", "importe_iva": 32.82}
-2018-11-02 23:16:42,857 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 2603086 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '20:51:12', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 111933L, 'price_unit': 14.0, 'product_uom_qty': 2.19, 'cantidad': 2.19, 'preciounitario': 14.0, 'importe_civa': 30.63, 'codigoarticulo': '2603086', 'product_id': 18840, 'punit_siniva': 12.73, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '2017122200500001518942051127', 'importe_siva': 27.85, 'codigooriginal': '2603086030633', 'codigoiva': '2', 'punit_coniva': 14.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '7', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 2.78}, a verificar {'tst_ticket': '2017-12-22 20:50:53', 'cantidad': '      2.19', 'codigooriginal': ' 2603086030633', 'punit_coniva': '      14.0', 'date': '2017-12-22', 'ticket': 151894, 'error_linea': KeyError('13000535007',), 'codigoarticulo': '       2603086'}
-                         Al ticket 151894 2017-12-22 2017-12-22 20:50:53 le faltará la línea
-2018-11-02 23:17:07,134 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: 920  procesados: 903
-2018-11-02 23:17:07,141 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-12-22 ok
-Códigos por verificar:
- 7891497528640
-       2603086
-
-tck20171224.json
-2018-11-02 23:18:37,088 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171224.json ...
-2018-11-02 23:18:43,677 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 7841503001155 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '10:47:05', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 113660L, 'price_unit': 162.0, 'product_uom_qty': 1.0, 'cantidad': 1.0, 'preciounitario': 162.0, 'importe_civa': 162.0, 'codigoarticulo': '7841503001155', 'product_id': 31522, 'punit_siniva': 132.79, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '20171224003000015865410470534', 'importe_siva': 132.79, 'codigooriginal': '7841503001155', 'codigoiva': '1', 'punit_coniva': 162.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '34', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 29.21}, a verificar {'tst_ticket': '2017-12-24 10:45:04', 'cantidad': '       1.0', 'codigooriginal': ' 7841503001155', 'punit_coniva': '     162.0', 'date': '2017-12-24', 'ticket': 158654, 'error_linea': IndexError('list index out of range',), 'codigoarticulo': ' 7841503001155'}
-                         Al ticket 158654 2017-12-24 2017-12-24 10:45:04 le faltará la línea
-
-                 INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "11:26:12", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 149.18, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 182.0, "nota": "", "numerodelinea": "11", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 113817, "preciounitario": 182.0, "importe_civa": 182.0, "codigoarticulo": "13000535007", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171224001000008671711261211", "importe_siva": 149.18, "codigooriginal": "013000535007", "nombre_iva": "B\u00e1sico", "importe_iva": 32.82}
-2018-11-02 23:18:52,233 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "11:26:12", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 149.18, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 182.0, "nota": "", "numerodelinea": "11", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 113817, "preciounitario": 182.0, "importe_civa": 182.0, "codigoarticulo": "13000535007", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171224001000008671711261211", "importe_siva": 149.18, "codigooriginal": "013000535007", "nombre_iva": "B\u00e1sico", "importe_iva": 32.82}
-2018-11-02 23:18:52,234 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 2600011 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '11:26:00', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 113817L, 'price_unit': 410.0, 'product_uom_qty': 0.07, 'cantidad': 0.07, 'preciounitario': 410.0, 'importe_civa': 29.52, 'codigoarticulo': '2600011', 'product_id': 19003, 'punit_siniva': 336.11, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '20171224001000008671711260010', 'importe_siva': 24.2, 'codigooriginal': '2600011029526', 'codigoiva': '1', 'punit_coniva': 410.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '10', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 5.32}, a verificar {'tst_ticket': '2017-12-24 11:25:35', 'cantidad': '      0.07', 'codigooriginal': ' 2600011029526', 'punit_coniva': '     410.0', 'date': '2017-12-24', 'ticket': 86717, 'error_linea': KeyError('13000535007',), 'codigoarticulo': '       2600011'}
-                         Al ticket 86717 2017-12-24 2017-12-24 11:25:35 le faltará la línea
-2018-11-02 23:19:57,256 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: 1375  procesados: 1353
-2018-11-02 23:19:57,263 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-12-24 ok
-Códigos por verificar:
-       2600011
- 7841503001155
-
-tck20171227.json
-2018-11-02 23:20:38,849 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171227.json ...
-2018-11-02 23:20:39,552 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: [Aviso] Ticket Suspendido Caja 2 Nro. 146531  Fecha 2017-12-27
-
-                 INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "11:10:11", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 113.11, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 138.0, "nota": "", "numerodelinea": "7", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 116344, "preciounitario": 138.0, "importe_civa": 138.0, "codigoarticulo": "25293002937", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "2017122700200001464481110117", "importe_siva": 113.11, "codigooriginal": "025293002937", "nombre_iva": "B\u00e1sico", "importe_iva": 24.89}
-2018-11-02 23:21:13,830 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "11:10:11", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 113.11, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 138.0, "nota": "", "numerodelinea": "7", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 116344, "preciounitario": 138.0, "importe_civa": 138.0, "codigoarticulo": "25293002937", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "2017122700200001464481110117", "importe_siva": 113.11, "codigooriginal": "025293002937", "nombre_iva": "B\u00e1sico", "importe_iva": 24.89}
-2018-11-02 23:21:13,830 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 2603025 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '11:10:07', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 116344L, 'price_unit': 63.0, 'product_uom_qty': 0.45, 'cantidad': 0.45, 'preciounitario': 63.0, 'importe_civa': 28.6, 'codigoarticulo': '2603025', 'product_id': 18779, 'punit_siniva': 57.27, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '2017122700200001464481110076', 'importe_siva': 26.0, 'codigooriginal': '2603025028608', 'codigoiva': '2', 'punit_coniva': 63.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '6', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 2.6}, a verificar {'tst_ticket': '2017-12-27 11:10:07', 'cantidad': '      0.45', 'codigooriginal': ' 2603025028608', 'punit_coniva': '      63.0', 'date': '2017-12-27', 'ticket': 146448, 'error_linea': KeyError('25293002937',), 'codigoarticulo': '       2603025'}
-                         Al ticket 146448 2017-12-27 2017-12-27 11:10:07 le faltará la línea
-2018-11-02 23:21:20,301 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: 742  procesados: 725
-2018-11-02 23:21:20,308 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-12-27 ok
-Códigos por verificar:
-       2603025
-
-
-tck20171230.json
-2018-11-02 23:23:04,004 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171230.json ...
-2018-11-02 23:23:08,338 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 7893333018902 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '08:51:49', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 118149L, 'price_unit': 39.0, 'product_uom_qty': 1.0, 'cantidad': 1.0, 'preciounitario': 39.0, 'importe_civa': 39.0, 'codigoarticulo': '7893333018902', 'product_id': 5820, 'punit_siniva': 31.97, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '20171230005000015329008514915', 'importe_siva': 31.97, 'codigooriginal': '7730917690119', 'codigoiva': '1', 'punit_coniva': 39.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '15', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 7.03}, a verificar {'tst_ticket': '2017-12-30 08:51:23', 'cantidad': '       1.0', 'codigooriginal': ' 7730917690119', 'punit_coniva': '      39.0', 'date': '2017-12-30', 'ticket': 153290, 'error_linea': IndexError('list index out of range',), 'codigoarticulo': ' 7893333018902'}
-                         Al ticket 153290 2017-12-30 2017-12-30 08:51:23 le faltará la línea
-
-                 INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "12:25:53", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 149.18, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 182.0, "nota": "", "numerodelinea": "10", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 118252, "preciounitario": 182.0, "importe_civa": 182.0, "codigoarticulo": "13000535007", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171230003000015958412255310", "importe_siva": 149.18, "codigooriginal": "013000535007", "nombre_iva": "B\u00e1sico", "importe_iva": 32.82}
-2018-11-02 23:23:15,341 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "12:25:53", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 149.18, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 182.0, "nota": "", "numerodelinea": "10", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 118252, "preciounitario": 182.0, "importe_civa": 182.0, "codigoarticulo": "13000535007", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171230003000015958412255310", "importe_siva": 149.18, "codigooriginal": "013000535007", "nombre_iva": "B\u00e1sico", "importe_iva": 32.82}
-2018-11-02 23:23:15,341 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 7730105001321 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '12:25:49', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 118252L, 'price_unit': 36.0, 'product_uom_qty': 1.0, 'cantidad': 1.0, 'preciounitario': 36.0, 'importe_civa': 36.0, 'codigoarticulo': '7730105001321', 'product_id': 2107, 'punit_siniva': 36.0, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '2017123000300001595841225499', 'importe_siva': 36.0, 'codigooriginal': '7730105001321', 'codigoiva': '3', 'punit_coniva': 36.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '9', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 0.0}, a verificar {'tst_ticket': '2017-12-30 12:25:34', 'cantidad': '       1.0', 'codigooriginal': ' 7730105001321', 'punit_coniva': '      36.0', 'date': '2017-12-30', 'ticket': 159584, 'error_linea': KeyError('13000535007',), 'codigoarticulo': ' 7730105001321'}
-                         Al ticket 159584 2017-12-30 2017-12-30 12:25:34 le faltará la línea
-2018-11-02 23:24:22,943 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: 1100  procesados: 1086
-2018-11-02 23:24:22,950 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-12-30 ok
-Códigos por verificar:
- 7730105001321
- 7893333018902
-tck20171231.json
-2018-11-02 23:24:22,952 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: tck20171231.json ...
-
-                 INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "11:30:02", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 113.11, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 138.0, "nota": "", "numerodelinea": "21", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 119216, "preciounitario": 138.0, "importe_civa": 138.0, "codigoarticulo": "25293002937", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171231005000015363211300221", "importe_siva": 113.11, "codigooriginal": "025293002937", "nombre_iva": "B\u00e1sico", "importe_iva": 24.89}
-2018-11-02 23:24:24,826 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "11:30:02", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 113.11, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 138.0, "nota": "", "numerodelinea": "21", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 119216, "preciounitario": 138.0, "importe_civa": 138.0, "codigoarticulo": "25293002937", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171231005000015363211300221", "importe_siva": 113.11, "codigooriginal": "025293002937", "nombre_iva": "B\u00e1sico", "importe_iva": 24.89}
-2018-11-02 23:24:24,826 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 15 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '11:29:52', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 119216L, 'price_unit': 33.0, 'product_uom_qty': 1.0, 'cantidad': 1.0, 'preciounitario': 33.0, 'importe_civa': 33.0, 'codigoarticulo': '15', 'product_id': 7834, 'punit_siniva': 33.0, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '20171231005000015363211295220', 'importe_siva': 33.0, 'codigooriginal': '7730950620036', 'codigoiva': '3', 'punit_coniva': 33.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '20', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 0.0}, a verificar {'tst_ticket': '2017-12-31 11:28:33', 'cantidad': '       1.0', 'codigooriginal': ' 7730950620036', 'punit_coniva': '      33.0', 'date': '2017-12-31', 'ticket': 153632, 'error_linea': KeyError('25293002937',), 'codigoarticulo': '            15'}
-                         Al ticket 153632 2017-12-31 2017-12-31 11:28:33 le faltará la línea
-
-                 INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "11:30:07", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 113.11, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 138.0, "nota": "", "numerodelinea": "22", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 119216, "preciounitario": 138.0, "importe_civa": 138.0, "codigoarticulo": "25293002937", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171231005000015363211300722", "importe_siva": 113.11, "codigooriginal": "025293002937", "nombre_iva": "B\u00e1sico", "importe_iva": 24.89}
-2018-11-02 23:24:24,826 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: INFO: El código es [coodigooriginal] en una equivalencia!!
-         {"hora": "11:30:07", "estandem": 0, "lineacancelada": 0, "cantidad": 1.0, "punit_siniva": 113.11, "tipolinea": "1", "codigoiva": "1", "punit_coniva": 138.0, "nota": "", "numerodelinea": "22", "descripcion_lin": "Venta de \u00edtem", "modoingreso": "1", "order_id": 119216, "preciounitario": 138.0, "importe_civa": 138.0, "codigoarticulo": "25293002937", "nombre_modoingreso": "Scanner", "cantdescmanuales": "0", "name": "20171231005000015363211300722", "importe_siva": 113.11, "codigooriginal": "025293002937", "nombre_iva": "B\u00e1sico", "importe_iva": 24.89}
-2018-11-02 23:24:24,826 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: [ERROR]  : No existe el código 15 en la DB. La línea no se creará
-
-                                        El error, al crear {'hora': '11:29:52', 'estandem': 0, 'lineacancelada': 0, 'product_uom': 1, 'order_id': 119216L, 'price_unit': 33.0, 'product_uom_qty': 1.0, 'cantidad': 1.0, 'preciounitario': 33.0, 'importe_civa': 33.0, 'codigoarticulo': '15', 'product_id': 7834, 'punit_siniva': 33.0, 'cantdescmanuales': '0', 'tipolinea': '1', 'name': '20171231005000015363211295220', 'importe_siva': 33.0, 'codigooriginal': '7730950620036', 'codigoiva': '3', 'punit_coniva': 33.0, 'state': 'draft', 'nota': u'', 'numerodelinea': '20', 'descripcion_lin': u'Venta de \xedtem', 'modoingreso': '1', 'importe_iva': 0.0}, a verificar {'tst_ticket': '2017-12-31 11:28:33', 'cantidad': '       1.0', 'codigooriginal': ' 7730950620036', 'punit_coniva': '      33.0', 'date': '2017-12-31', 'ticket': 153632, 'error_linea': KeyError('25293002937',), 'codigoarticulo': '            15'}
-                         Al ticket 153632 2017-12-31 2017-12-31 11:28:33 le faltará la línea
-2018-11-02 23:27:02,640 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: informe: 1310  procesados: 1294
-2018-11-02 23:27:02,720 20632 INFO ? openerp.addons.ip_tck.wizard.importa_tickets: Operaciones 2017-12-31 ok
-Códigos por verificar:
-            15
diff --git a/ip/ip_tck/wizard/campos_open_plus.sql b/ip/ip_tck/wizard/campos_open_plus.sql
deleted file mode 100644 (file)
index 0db9d77..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-class mediosdepago_tck:
-        'autorizasupervisora'                   : char             autorizasupervisora                  32
-        'cambio'                                : float
-        'codigobarra'                           : char             codigobarra                          32
-        'codigocc'                              : char             codigocc                             10
-        'codigomediopago'                       : selection
-        'codigomoneda'                          : selection
-        'codigosupervisora'                     : char             codigosupervisora                    6
-        'cuotastarjetacredito'                  : char             cuotastarjetacredito                 3
-        'lineacancelada'                        : char             lineacancelada                       2
-        'lineaultimopago'                       : char             lineaultimopago                      2
-        'modoingresocupon'                      : char             modoingresocupon                     1
-        'montodescuentoleyiva'                  : float
-        'montopagocc'                           : float
-        'name'                                  : char             name                                 6
-        'nombrecc'                              : char             nombrecc                             40
-        'nrocomercio'                           : char             nrocomercio                          32
-        'numeroautorizaciontarjetacredito'      : char             numeroautorizaciontarjetacredito     32
-        'numerotarjetacredito'                  : char             numerotarjetacredito                 40
-        'plan'                                  : char             plan                                 32
-        'siaplicaleydesciva'                    : char             siaplicaleydesciva                   2
-        'siesdebitocredito'                     : char             siesdebitocredito                    2
-        'textoley'                              : char             textoley                             128
-        'tipooperacion'                         : char             tipooperacion                        32
-        'tipotarjetacredito'                    : selection
-        'totalmediopagomoneda'                  : float
-        'totalmediopagomonedamonedareferencia'  : float
-        'totalpagado'                           : float
-        'totalpagadomonedareferencia'           : float
-class  vouchertar_tck:
-        'autorizacion'                          : char          autorizacion                         40
-        'cantidadcuotas'                        : char          cantidadcuotas                       40
-        'cardtype'                              : char          cardtype                             40
-        'codigocaja'                            : char          codigocaja                           40
-        'codigocajera'                          : char          codigocajera                         40
-        'codigocomercio'                        : char          codigocomercio                       40
-        'codigomoneda'                          : selection
-        'codigoterminal'                        : char          codigoterminal                       40
-        'comprobante'                           : char          comprobante                          40
-        'descuentaivarestaurante'               : char          descuentaivarestaurante              40
-        'descuentoafam'                         : char          descuentoafam                        40
-        'fechatransaccion'                      : char          fechatransaccion                     40
-        'flagimprimefirma'                      : char          flagimprimefirma                     40
-        'importepago'                           : char          importepago                          40
-        'montodescuentoleyiva'                  : char          montodescuentoleyiva                 40
-        'montogravado'                          : char          montogravado                         40
-        'montoticket'                           : char          montoticket                          40
-        'nombreemisortarjeta'                   : char          nombreemisortarjeta                  40
-        'nombrepropietario'                     : char          nombrepropietario                    40
-        'nrolote'                               : char          nrolote                              40
-        'numerotarjeta'                         : char          numerotarjeta                        40
-        'plan'                                  : char          plan                                 40
-        'saldogift'                             : char          saldogift                            40
-        'siaplicaleydesciva'                    : char          siaplicaleydesciva                   40
-        'siesdebitocredito'                     : char          siesdebitocredito                    40
-        'tipoautorizacion'                      : char          tipoautorizacion                     40
-        'tipoingreso'                           : char          tipoingreso                          40
-        'tipotarjetacredito2'                   : char          tipotarjetacredito2                  40
-        'tipotransaccion'                       : char          tipotransaccion                      40
-        'tipovoucher'                           : char          tipovoucher                          40
-        'vencimiento'                           : char          vencimiento                          40
-
-class  cfe_tck:
-        'ciudadreceptor'                        : text
-        'cliente'                               : text
-        'codigocae'                             : text
-        'descripcioncfe'                        : text
-        'direccionreceptor'                     : text
-        'documentoreceptor'                     : text
-        'fechacfe'                              : text
-        'fechavencimientocae'                   : text
-        'hash_cfe'                              : text
-        'linkdgi'                               : text
-        'montoneto'                             : text
-        'nombrereceptor'                        : text
-        'nrofincae'                             : text
-        'nroiniciocae'                          : text
-        'numerocfe'                             : text
-        'rucemisor'                             : text
-        'seriecfe'                              : text
-        'tipocfe'                               : text
-        'tipodocumentoreceptor'                 : text
-
-class  redondeos_tck:
-        'codigomediopago'                       : selection
-        'codigomoneda'                          : selection
-        'importeredondeo'                       : float
-        'importeticket'                         : float
-        'importetotalticket'                    : float
-class ip_ticket:
-        'cantarticulos'                         : integer
-        'cantidadlineas'                        : integer
-        'cfe_tck'                               : text
-        'client_order_ref'                      : char                client_order_ref                     12
-        'codigocaja'                            : char                codigocaja                           6
-        'codigocajera'                          : char                codigocajera                         6
-        'codigosuper'                           : char                codigosuper                          10
-        'cuentas'                               : boolean
-        'date'                                  : date
-        'date_confirm'                          : date
-        'datetime_tck'                          : datetime
-        'descripcion_cab'                       : char                descripcion_cab                      24
-        'estadotck'                             : selection
-        'hay_cobza'                             : boolean
-        'ivatotalticket'                        : float
-        'ivatotalticketsinpagoservicios'        : float
-        'mediopago_id'                          : integer
-        'mides'                                 : char                mides                                64
-        'name'                                  : char                mides                                64
-        'nombrecajera'                          : char                name                                 64
-        'note'                                  : text
-        'numerotck'                             : integer
-        'observaciones'                         : char                observaciones                        256
-        'origin'                                : char                origin                               64
-        'state'                                 : selection
-        'timestamptck'                          : datetime
-        'tipo_de_ticket_descrip'                : char                tipo_de_ticket_descrip               32
-        'totalapagar'                           : float
-        'totalticket'                           : float
-        'totalticketsinpagoservicios'           : float
-class ip_ticket_line:
-        'cancela_tipo'                          : text
-        'cantdescmanuales'                      : float
-        'cantidad'                              : float
-        'codigoarticulo'                        : char                codigoarticulo                       13
-        'codigoiva'                             : selection
-        'codigooriginal'                        : char                codigooriginal                       13
-        'codigosuper'                           : text
-        'codigovendedor'                        : char                codigovendedor                       4
-        'codserviciopagado'                     : text
-        'descripcion_articulo'                  : char                descripcion_articulo                 40
-        'descripcion_lin'                       : char                descripcion_lin                      20
-        'discount'                              : float
-        'estandem'                              : boolean
-        'hora'                                  : char                hora                                 8
-        'importe_civa'                          : float
-        'importe_iva'                           : float
-        'importe_siva'                          : float
-        'importecobranza'                       : text
-        'ivadescuentototal'                     : float
-        'lineacancelada'                        : boolean
-        'modoingreso'                           : selection
-        'name'                                  : char                name                                 62
-        'nombresuper'                           : text
-        'nombresupervisora'                     : text
-        'nota'                                  : char                nota                                 25
-        'notes'                                 : char                notes                                25
-        'nrolineavta'                           : char                nrolineavta                          4
-        'numerodelinea'                         : integer
-        'preciodescuento'                       : float
-        'preciodescuentototal'                  : float
-        'preciounitario'                        : float
-        'price_unit'                            : float
-        'product_uom_qty'                       : float
-        'product_uos'                           : char                product_uos                          2
-        'product_uos_qty'                       : char                product_uos_qty                      2
-        'punit_coniva'                          : float
-        'punit_siniva'                          : float
-        'state'                                 : selection
-        'supervisora'                           : text
-        'tax_tck'                               : char                tax_tck                              1
-        'tipolinea'                             : char                tipolinea                            4
diff --git a/ip/ip_tck/wizard/campos_open_plus2.sql b/ip/ip_tck/wizard/campos_open_plus2.sql
deleted file mode 100644 (file)
index 0222763..0000000
+++ /dev/null
@@ -1,223 +0,0 @@
-CREATE TABLE p_mediosdepago (
-
-    autorizasupervisora character varying(32), -- Autoriza Supervisor/a
-    cambio numeric, -- Cambio
-    codigobarra character varying(32), -- Codigo
-    codigocc character varying(10), -- Nro.Cuenta
-    codigomediopago character varying NOT NULL, -- Medio de pago
-    codigomoneda character varying, -- Moneda
-    codigosupervisora character varying(6), -- Codigo Supervisor/a
-    cuotastarjetacredito character varying(3), -- Cuotas
-    lineacancelada character varying(2), -- Cancelada
-    lineaultimopago character varying(2), -- Ultimo pago
-    modoingresocupon character varying(1), -- Modo
-    montodescuentoleyiva numeric, -- Monto del desc. ley iva.
-    montopagocc numeric, -- Monto Tck.Cta.Cte
-    name character varying(6), -- Codigo Medio de Pago
-    nombrecc character varying(40), -- Nombre
-    nrocomercio character varying(32), -- N.Comercio
-    numeroautorizaciontarjetacredito character varying(32), -- N.Aut.
-    numerotarjetacredito character varying(40), -- N.Tarjeta
-    plan character varying(32), -- Plan
-    siaplicaleydesciva character varying(2), -- Aplica ley desc. iva.
-    siesdebitocredito character varying(2), -- Debito/Credito
-    textoley character varying(128), -- Texto Ley
-    tipooperacion character varying(32), -- Tipo de Operación
-    tipotarjetacredito character varying, -- Tipo de tarjeta
-    totalmediopagomoneda numeric, -- Total Pagable
-    totalmediopagomonedamonedareferencia numeric, -- Pesos Pagable
-    totalpagado numeric, -- Total Entregado
-    totalpagadomonedareferencia numeric -- Pesos Entregado
-);
-
-CREATE TABLE p_vouchertar (
-    autorizacion character varying(40), -- Autorizacion
-    cantidadcuotas character varying(40), -- Cant.Cuotas
-    cardtype character varying(40), -- Cardtype
-    codigocaja character varying(40), -- Caja
-    codigocajera character varying(40), -- Cajera/o
-    codigocomercio character varying(40), -- Cod.Comercio
-    codigomoneda character varying, -- Moneda
-    codigoterminal character varying(40), -- Cod.Terminal (caja)
-    comprobante character varying(40), -- Comprobante.
-    descuentaivarestaurante character varying(40), -- Dto. iva Restaurante
-    descuentoafam character varying(40), -- DtoFam
-    fechatransaccion character varying(40), -- Fecha Operación
-    flagimprimefirma character varying(40), -- Imprimió Voucher p/firma
-    importepago character varying(40), -- Importe
-    montodescuentoleyiva character varying(40), -- Monto dto Ley Iva
-    montogravado character varying(40), -- Imponible
-    montoticket character varying(40), -- Importe Ticket
-    nombreemisortarjeta character varying(40), -- Tarjeta
-    nombrepropietario character varying(40), -- Usuario
-    nrolote character varying(40), -- N.Lote
-    numerotarjeta character varying(40), -- Num.Tarjeta
-    plan character varying(40), -- Plan
-    saldogift character varying(40), -- Saldo p/promoción/regalo
-    siaplicaleydesciva character varying(40), -- Aplica Ley Iva
-    siesdebitocredito character varying(40), -- Crédito/Débito
-    tipoautorizacion character varying(40), -- Tipo autoriz.
-    tipoingreso character varying(40), -- Modo Ingreso
-    tipotarjetacredito2 character varying(40), -- Tipo tarjeta (2)
-    tipotransaccion character varying(40), -- Tipo de transacciónm
-    tipovoucher character varying(40), -- Tipo de Voucher
-    vencimiento character varying(40) -- Vto.
-);
-
-
-CREATE TABLE p_cfe_tck (
-    ciudadreceptor text, -- ciudad receptor
-    cliente text, -- cliente
-    codigocae text, -- codigo cae
-    descripcioncfe text, -- Descripción
-    direccionreceptor text, -- direccion receptor
-    documentoreceptor text, -- documento receptor
-    fechacfe text, -- fecha cfe
-    fechavencimientocae text, -- fecha vencimiento cae
-    hash_cfe text, -- hash cfe
-    link_dgi_fmt text, -- Enlace de verificación DGI
-    linkdgi text, -- link dgi
-    montoneto text, -- monto neto
-    nombrereceptor text, -- nombre receptor
-    nrofincae text, -- nro fin cae
-    nroiniciocae text, -- nro inicio cae
-    numerocfe text, -- numero cfe
-    rucemisor text, -- ruc emisor
-    seriecfe text, -- serie cfe
-    tipocfe text, -- tipo cfe
-    tipodocumentoreceptor text -- tipo documentoreceptor
-);
-
-
-
-
-CREATE TABLE p_redondeos_tck (
-     codigomediopago character varying, -- Medio de pago
-     codigomoneda character varying, -- Moneda
-     importeredondeo numeric, -- Redondeo
-     importeticket numeric, -- Importe ticket
-     importetotalticket numeric -- Total
-);
-
-
-CREATE TABLE p_ip_ticket (
-    cantidadlineas integer, -- Cantidad de artículos
-    cantarticulos integer,  -- Cantidad de lineas
-    cfe_tck text, -- CFE
-    client_order_ref character varying(12), -- Num Ticket
-    codigocaja character varying(6) NOT NULL, -- Caja
-    codigocajera character varying(6) NOT NULL, -- Código cajara/o
-    codigosuper character varying(10), -- Código Supervisor/a
-    cuentas boolean, -- CtaCte
-    date date, -- Fecha
-    date_confirm date, -- Confirmation Date
-    datetime_tck timestamp without time zone, -- Fecha Hora
-    descripcion_cab character varying(24), -- Tipo de Cabezal
-    estadotck character varying NOT NULL, -- Estado del Ticket
-    hay_cobza boolean, -- Cobranzas
-    hora_tck character varying(5), -- Hora
-    ivatotalticket numeric, -- Ivas
-    ivatotalticketsinpagoservicios numeric, -- Ivas s/servicios
-    mides character varying(64), -- Mides
-    name character varying(64) NOT NULL, -- Referencia
-    nombrecajera character varying(40), -- Cajero/a
-    note text, -- Notes
-    numerotck integer, -- Numero de Ticket
-    observaciones character varying(256), -- Notas
-    origin character varying(64), -- Source Document
-    state character varying, -- Ticket State
-    timestamptck timestamp without time zone, -- Fecha/Hora
-    tipo_de_ticket_descrip character varying(32), -- Tipo de Ticket
-    totalapagar numeric, -- A pagar
-    totalticket numeric, -- Total
-    totalticketsinpagoservicios numeric -- Total s/servicios
-);
-
-
-
-CREATE TABLE p_ip_ticket_line(
-    cancela_tipo text, -- Tipo de cancelación
-    cantdescmanuales double precision, -- Cant.Dto manual
-    cantidad numeric, -- Cantidad
-    codigoarticulo character varying(13) NOT NULL, -- Codigo Interno
-    codigoiva character varying, -- Codigo de Iva
-    codigooriginal character varying(13), -- Codigo Articulo en Caja
-    codigosuper text, -- Supervisor
-    codigovendedor character varying(4), -- Código de Vendedor
-    codserviciopagado text, -- Cod.Servicio Cobrado
-    descripcion_articulo character varying(40),
-    descripcion_lin character varying(20), -- Tipo de Linea
-    discount numeric, -- Discount (%)
-    estandem boolean, -- Tandem
-    hora character varying(8), -- Hora
-    importe_civa numeric, -- Importe c/iva
-    importe_iva numeric, -- Iva línea
-    importe_siva numeric, -- Importe /siva
-    importecobranza text, -- Importe Cbza.
-    ivadescuentototal numeric, -- ivadescuentototal
-    lineacancelada boolean, -- Cancelada
-    modoingreso character varying, -- Modo ingreso
-    name character varying(62) NOT NULL, -- StampId
-    nombresuper text, -- Cod. Supervidor
-    nombresupervisora text, -- Nombre supervisor/a
-    nota character varying(256), -- Notas
-    notes character varying(256), -- Notes
-    nrolineavta character varying(4), -- N.linea en la Vta,
-    numerodelinea integer, -- referencia al número de línea que se está cancelando
-    preciodescuento numeric, -- preciodescuento
-    preciodescuentototal numeric, -- preciodescuentotota
-    preciounitario numeric, -- Precio Lista
-    price_unit numeric NOT NULL, -- Unit Price
-    product_uom_qty numeric NOT NULL, -- Quantity (UoM)
-    product_uos character varying(2), -- quos
-    product_uos_qty character varying(2), -- quosqty
-    punit_coniva numeric, -- Precio unitario c/iva
-    punit_siniva numeric, -- Precio s/iva
-    state character varying NOT NULL, -- State
-    supervisora text, -- Supervisor/a
-    tax_tck character varying(1), -- Taxes
-    tipolinea character varying(4) -- Num.tipo linea
-);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ip/ip_tck/wizard/create_p_tables.sql b/ip/ip_tck/wizard/create_p_tables.sql
deleted file mode 100644 (file)
index 2de3c36..0000000
+++ /dev/null
@@ -1,223 +0,0 @@
-CREATE TABLE p_mediosdepago (
-    id_ticket
-    autorizasupervisora character varying(32), -- Autoriza Supervisor/a
-    cambio numeric, -- Cambio
-    codigobarra character varying(32), -- Codigo
-    codigocc character varying(10), -- Nro.Cuenta
-    codigomediopago character varying NOT NULL, -- Medio de pago
-    codigomoneda character varying, -- Moneda
-    codigosupervisora character varying(6), -- Codigo Supervisor/a
-    cuotastarjetacredito character varying(3), -- Cuotas
-    lineacancelada character varying(2), -- Cancelada
-    lineaultimopago character varying(2), -- Ultimo pago
-    modoingresocupon character varying(1), -- Modo
-    montodescuentoleyiva numeric, -- Monto del desc. ley iva.
-    montopagocc numeric, -- Monto Tck.Cta.Cte
-    name character varying(6), -- Codigo Medio de Pago
-    nombrecc character varying(40), -- Nombre
-    nrocomercio character varying(32), -- N.Comercio
-    numeroautorizaciontarjetacredito character varying(32), -- N.Aut.
-    numerotarjetacredito character varying(40), -- N.Tarjeta
-    plan character varying(32), -- Plan
-    siaplicaleydesciva character varying(2), -- Aplica ley desc. iva.
-    siesdebitocredito character varying(2), -- Debito/Credito
-    textoley character varying(128), -- Texto Ley
-    tipooperacion character varying(32), -- Tipo de Operación
-    tipotarjetacredito character varying, -- Tipo de tarjeta
-    totalmediopagomoneda numeric, -- Total Pagable
-    totalmediopagomonedamonedareferencia numeric, -- Pesos Pagable
-    totalpagado numeric, -- Total Entregado
-    totalpagadomonedareferencia numeric -- Pesos Entregado
-);
-
-CREATE TABLE p_vouchertar (
-    autorizacion character varying(40), -- Autorizacion
-    cantidadcuotas character varying(40), -- Cant.Cuotas
-    cardtype character varying(40), -- Cardtype
-    codigocaja character varying(40), -- Caja
-    codigocajera character varying(40), -- Cajera/o
-    codigocomercio character varying(40), -- Cod.Comercio
-    codigomoneda character varying, -- Moneda
-    codigoterminal character varying(40), -- Cod.Terminal (caja)
-    comprobante character varying(40), -- Comprobante.
-    descuentaivarestaurante character varying(40), -- Dto. iva Restaurante
-    descuentoafam character varying(40), -- DtoFam
-    fechatransaccion character varying(40), -- Fecha Operación
-    flagimprimefirma character varying(40), -- Imprimió Voucher p/firma
-    importepago character varying(40), -- Importe
-    montodescuentoleyiva character varying(40), -- Monto dto Ley Iva
-    montogravado character varying(40), -- Imponible
-    montoticket character varying(40), -- Importe Ticket
-    nombreemisortarjeta character varying(40), -- Tarjeta
-    nombrepropietario character varying(40), -- Usuario
-    nrolote character varying(40), -- N.Lote
-    numerotarjeta character varying(40), -- Num.Tarjeta
-    plan character varying(40), -- Plan
-    saldogift character varying(40), -- Saldo p/promoción/regalo
-    siaplicaleydesciva character varying(40), -- Aplica Ley Iva
-    siesdebitocredito character varying(40), -- Crédito/Débito
-    tipoautorizacion character varying(40), -- Tipo autoriz.
-    tipoingreso character varying(40), -- Modo Ingreso
-    tipotarjetacredito2 character varying(40), -- Tipo tarjeta (2)
-    tipotransaccion character varying(40), -- Tipo de transacciónm
-    tipovoucher character varying(40), -- Tipo de Voucher
-    vencimiento character varying(40) -- Vto.
-);
-
-
-CREATE TABLE p_cfe_tck (
-    ciudadreceptor text, -- ciudad receptor
-    cliente text, -- cliente
-    codigocae text, -- codigo cae
-    descripcioncfe text, -- Descripción
-    direccionreceptor text, -- direccion receptor
-    documentoreceptor text, -- documento receptor
-    fechacfe text, -- fecha cfe
-    fechavencimientocae text, -- fecha vencimiento cae
-    hash_cfe text, -- hash cfe
-    link_dgi_fmt text, -- Enlace de verificación DGI
-    linkdgi text, -- link dgi
-    montoneto text, -- monto neto
-    nombrereceptor text, -- nombre receptor
-    nrofincae text, -- nro fin cae
-    nroiniciocae text, -- nro inicio cae
-    numerocfe text, -- numero cfe
-    rucemisor text, -- ruc emisor
-    seriecfe text, -- serie cfe
-    tipocfe text, -- tipo cfe
-    tipodocumentoreceptor text -- tipo documentoreceptor
-);
-
-
-
-
-CREATE TABLE p_redondeos_tck (
-     codigomediopago character varying, -- Medio de pago
-     codigomoneda character varying, -- Moneda
-     importeredondeo numeric, -- Redondeo
-     importeticket numeric, -- Importe ticket
-     importetotalticket numeric -- Total
-);
-
-
-CREATE TABLE p_ip_ticket (
-    cantidadlineas integer, -- Cantidad de artículos
-    cantarticulos integer,  -- Cantidad de lineas
-    cfe_tck text, -- CFE
-    client_order_ref character varying(12), -- Num Ticket
-    codigocaja character varying(6) NOT NULL, -- Caja
-    codigocajera character varying(6) NOT NULL, -- Código cajara/o
-    codigosuper character varying(10), -- Código Supervisor/a
-    cuentas boolean, -- CtaCte
-    date date, -- Fecha
-    date_confirm date, -- Confirmation Date
-    datetime_tck timestamp without time zone, -- Fecha Hora
-    descripcion_cab character varying(24), -- Tipo de Cabezal
-    estadotck character varying NOT NULL, -- Estado del Ticket
-    hay_cobza boolean, -- Cobranzas
-    hora_tck character varying(5), -- Hora
-    ivatotalticket numeric, -- Ivas
-    ivatotalticketsinpagoservicios numeric, -- Ivas s/servicios
-    mides character varying(64), -- Mides
-    name character varying(64) NOT NULL, -- Referencia
-    nombrecajera character varying(40), -- Cajero/a
-    note text, -- Notes
-    numerotck integer, -- Numero de Ticket
-    observaciones character varying(256), -- Notas
-    origin character varying(64), -- Source Document
-    state character varying, -- Ticket State
-    timestamptck timestamp without time zone, -- Fecha/Hora
-    tipo_de_ticket_descrip character varying(32), -- Tipo de Ticket
-    totalapagar numeric, -- A pagar
-    totalticket numeric, -- Total
-    totalticketsinpagoservicios numeric -- Total s/servicios
-);
-
-
-
-CREATE TABLE p_ip_ticket_line(
-    cancela_tipo text, -- Tipo de cancelación
-    cantdescmanuales double precision, -- Cant.Dto manual
-    cantidad numeric, -- Cantidad
-    codigoarticulo character varying(13) NOT NULL, -- Codigo Interno
-    codigoiva character varying, -- Codigo de Iva
-    codigooriginal character varying(13), -- Codigo Articulo en Caja
-    codigosuper text, -- Supervisor
-    codigovendedor character varying(4), -- Código de Vendedor
-    codserviciopagado text, -- Cod.Servicio Cobrado
-    descripcion_articulo character varying(40),
-    descripcion_lin character varying(20), -- Tipo de Linea
-    discount numeric, -- Discount (%)
-    estandem boolean, -- Tandem
-    hora character varying(8), -- Hora
-    importe_civa numeric, -- Importe c/iva
-    importe_iva numeric, -- Iva línea
-    importe_siva numeric, -- Importe /siva
-    importecobranza text, -- Importe Cbza.
-    ivadescuentototal numeric, -- ivadescuentototal
-    lineacancelada boolean, -- Cancelada
-    modoingreso character varying, -- Modo ingreso
-    name character varying(62) NOT NULL, -- StampId
-    nombresuper text, -- Cod. Supervidor
-    nombresupervisora text, -- Nombre supervisor/a
-    nota character varying(256), -- Notas
-    notes character varying(256), -- Notes
-    nrolineavta character varying(4), -- N.linea en la Vta,
-    numerodelinea integer, -- referencia al número de línea que se está cancelando
-    preciodescuento numeric, -- preciodescuento
-    preciodescuentototal numeric, -- preciodescuentotota
-    preciounitario numeric, -- Precio Lista
-    price_unit numeric NOT NULL, -- Unit Price
-    product_uom_qty numeric NOT NULL, -- Quantity (UoM)
-    product_uos character varying(2), -- quos
-    product_uos_qty character varying(2), -- quosqty
-    punit_coniva numeric, -- Precio unitario c/iva
-    punit_siniva numeric, -- Precio s/iva
-    state character varying NOT NULL, -- State
-    supervisora text, -- Supervisor/a
-    tax_tck character varying(1), -- Taxes
-    tipolinea character varying(4) -- Num.tipo linea
-);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
similarity index 98%
rename from ip/ip_tck/__openerp__.py
rename to ip/ip_ticket/__openerp__.py
index e175b0a..50f5544 100644 (file)
@@ -20,7 +20,7 @@
 ##############################################################################
 
 {
-    "name"       : "IP Tickets",
+    "name"       : "IP Ticket",
     "version"    : "0.1",
     "author"     : "InfoPrimo SL",
     'category'   : 'Sale Management ZM',
similarity index 98%
rename from ip/ip_tck/baul/old/cob_ticket_view.xml
rename to ip/ip_ticket/baul/old/cob_ticket_view.xml
index 7307de3..0e81aad 100644 (file)
@@ -63,7 +63,7 @@
         </record>
 
         <menuitem action="action_cobranza_tck_form" id="menu_action_cobranza_tck_form"
-                  parent="ip_tck.menu_informes"
+                  parent="ip_ticket.menu_informes"
                   sequence="4"/>
 
 
@@ -276,7 +276,7 @@ class mov_partner_report(report_sxw.rml_parse):
 
 
 report_sxw.report_sxw('report.movimientos.tck.wiz', 'cuentas.tck',
-                      'ip/ip_tck/cta_ticket/report/movimientos_partner.rml', parser=mov_partner_report, header=True)
+                      'ip/ip_ticket/cta_ticket/report/movimientos_partner.rml', parser=mov_partner_report, header=True)
 
 
 """
@@ -65,7 +65,7 @@
         </record>
 
         <menuitem action="action_cobranza_tck_form" id="menu_action_cobranza_tck_form"
-                  parent="ip_tck.menu_informes"
+                  parent="ip_ticket.menu_informes"
                   sequence="4"/>
     </data>
 </openerp>
@@ -66,7 +66,7 @@
         </record>
 
         <menuitem id="menu_action_cuentas_tck_form"
-                  parent="ip_tck.menu_informes"
+                  parent="ip_ticket.menu_informes"
                   action="action_cuentas_tck_form"
                   sequence="2"/>
 
 
 
         <menuitem id="menu_action_movimientos_tck_form"
-                  parent="ip_tck.menu_informes"
+                  parent="ip_ticket.menu_informes"
                   action="action_actualiza_movimientos_tck_form"
                   sequence="2"/>
 
@@ -63,7 +63,7 @@
         </record>
 
         <menuitem id="menu_action_deudo_mov_form"
-                  parent="ip_tck.menu_informes"
+                  parent="ip_ticket.menu_informes"
                   action="action_deudo_mov_form"
                   sequence="2"/>
     </data>
@@ -9,7 +9,7 @@
                         string="Estado de Cuenta"
                         model="movimientos.tck"
                         name="EstadoCuenta"
-                        rml="ip_tck/estado_cuenta/report/estado_cuenta.rml"
+                        rml="ip_tickets/estado_cuenta/report/estado_cuenta.rml"
                         auto="False"
                         header="False"/>
 
@@ -147,6 +147,6 @@ class estado_cuenta_report(report_sxw.rml_parse):
         #import ipdb;ipdb.set_trace()
         return result
 
-report_sxw.report_sxw('report.EstadoCuenta', 'movimientos.tck', 'ip/ip_tck/estado_cuenta/report/estado_cuenta.rml',
+report_sxw.report_sxw('report.EstadoCuenta', 'movimientos.tck', 'ip/ip_ticket/estado_cuenta/report/estado_cuenta.rml',
                       parser=estado_cuenta_report, header='internal')
 
similarity index 98%
rename from ip/ip_tck/estado_cuenta_report2.py
rename to ip/ip_ticket/estado_cuenta_report2.py
index 677fb51..20ba6c7 100644 (file)
@@ -137,5 +137,5 @@ class estado_cuenta_report(report_sxw.rml_parse):
         #import ipdb;ipdb.set_trace()
         return result
 
-report_sxw.report_sxw('report.EstadoCuenta', 'movimientos.tck', 'ip/ip_tck/estado_cuenta/report/estado_cuenta.rml', parser=estado_cuenta_report, header=False)
+report_sxw.report_sxw('report.EstadoCuenta', 'movimientos.tck', 'ip/ip_ticket/estado_cuenta/report/estado_cuenta.rml', parser=estado_cuenta_report, header=False)
 
similarity index 100%
rename from ip/ip_tck/ip_tck.py
rename to ip/ip_ticket/ip_tck.py
similarity index 88%
rename from ip/ip_tck/ip_tck_reports.xml
rename to ip/ip_ticket/ip_tck_reports.xml
index 6d6765b..074d747 100644 (file)
@@ -8,7 +8,7 @@
             string="Estado de cuenta de clientesR"
             model="cuentas.tck"
             name="movimientos.tck.wiz"
-            rml="ip_tck/cta_ticket/report/movimientos_partner.rml"
+            rml="ip_ticket/cta_ticket/report/movimientos_partner.rml"
             auto="False"
             header="False"/>
  -->
@@ -94,7 +94,7 @@
 
     <menuitem id="menu_qty_report_product_all"
               action="action_grouped_report_all"
-              parent="ip_tck.menu_tickets_ticket"
+              parent="ip_ticket.menu_tickets_ticket"
               sequence="3"/>
 
 
similarity index 99%
rename from ip/ip_tck/views/_consolidate_views.xml
rename to ip/ip_ticket/views/_consolidate_views.xml
index bdeb81e..d87ab2c 100644 (file)
@@ -4,7 +4,7 @@
 
         <menuitem id="menu_informes_consolid"
                   name="Informes Consolidados"
-                  parent="ip_tck.menu_gestion_tickets"
+                  parent="ip_ticket.menu_gestion_tickets"
                   sequence="2"/>
 
         <!--
similarity index 98%
rename from ip/ip_tck/views/cfe_view.xml
rename to ip/ip_ticket/views/cfe_view.xml
index a36b494..eccea7a 100644 (file)
@@ -76,7 +76,7 @@
         </record>
 
         <menuitem action="action_cfe_tck_form" id="menu_action_cfe_tck_form"
-                  parent="ip_tck.menu_tickets_ticket"
+                  parent="ip_ticket.menu_tickets_ticket"
                   sequence="74"/>
     </data>
 </openerp>
similarity index 98%
rename from ip/ip_tck/views/mediosdepago_view.xml
rename to ip/ip_ticket/views/mediosdepago_view.xml
index 6987aa7..ada6372 100644 (file)
@@ -80,7 +80,7 @@
         </record>
 
         <menuitem action="action_mediosdepago_tck_form" id="menu_action_mediosdepago_tck_form"
-                  parent="ip_tck.menu_tickets_ticket" sequence="3"
+                  parent="ip_ticket.menu_tickets_ticket" sequence="3"
                   groups="base.group_sale_salesman,base.group_sale_manager"/>
 
     </data>
similarity index 98%
rename from ip/ip_tck/views/vouchertar_view.xml
rename to ip/ip_ticket/views/vouchertar_view.xml
index a5f3c2c..d72f26d 100644 (file)
         </record>
 
         <menuitem action="action_vouchertar_tck_form" id="menu_action_vouchertar_tck_form"
-                  parent="ip_tck.menu_informes" sequence="5"/>
+                  parent="ip_ticket.menu_informes" sequence="5"/>
+
 
     </data>
 </openerp>
similarity index 98%
rename from ip/ip_tck/wizard/importa_tickets.py
rename to ip/ip_ticket/wizard/importa_tickets.py
index 8645348..0b1bbef 100644 (file)
@@ -52,11 +52,15 @@ import simplejson as json
 import logging
 import os
 import subprocess
-devnull = open(os.devnull, 'w')
+
 
 
 from tck_create import create_cabezal, create_relations, validar_linea, auxlinea, find_partner
 import openerp
+
+import pydevd
+
+devnull = open(os.devnull, 'w')
 config = openerp.tools.config
 dbname = config['db_name']
 
@@ -210,6 +214,16 @@ class ip_tickets_import(osv.TransientModel):
 
     def _prepara_linea(self, cr, uid, line, baar, context=None):
 
+        """
+        no habrá que flitrar líneas de interés???
+        :param cr:
+        :param uid:
+        :param line:
+        :param baar:
+        :param context:
+        :return:
+        """
+
         required = { 'order_id', 'price_unit', 'state', 'product_uom_qty', 'product_uom', 'name', 'numerodelinea',
                      'codigoarticulo' }
         res = dict()
@@ -505,7 +519,7 @@ class ip_tickets_import(osv.TransientModel):
                         try:
                             linea_err = dict(
                                 date           = str(cabezal['date']).rjust(10),
-                                cantidad       = str(lin['cantidad']).rjust(10),
+                                cantidad       = str(lin['cantidad']).rjust(10), # lin es cabezal no tiene cantidad
                                 codigoarticulo = lin['codigoarticulo'],
                                 codigooriginal = lin['codigooriginal'],
                                 punit_coniva   = str(lin['punit_coniva']).rjust(10),
@@ -518,8 +532,9 @@ class ip_tickets_import(osv.TransientModel):
                             continue
                         except Exception as tron:
                             print("\n\t\t tan jodidio que no dió ni para el mensaje de error la línea está muy mal\n")
-                            import ipdb;ipdb.set_trace()
-                            print("tron %s\n donde %s" % (tron,donde))
+                            #import ipdb;ipdb.set_trace()
+                            pydevd.settrace("XPS-15-9550", port=5678)
+                            #print("tron %s\n donde %s" % (tron,donde))
 
 
                 # FIN for line in lineas
similarity index 98%
rename from ip/ip_tck/wizard/info_ventas_view.xml
rename to ip/ip_ticket/wizard/info_ventas_view.xml
index 5231f87..1e3e965 100644 (file)
@@ -71,6 +71,6 @@
               name="Listado de ventas proveedor/período"
               action="action_ip_info_ventas"
               sequence="78"
-              parent="ip_tck.menu_informes"/>
+              parent="ip_ticket.menu_informes"/>
     </data>
 </openerp>
similarity index 99%
rename from ip/ip_tck/wizard/lineas.py
rename to ip/ip_ticket/wizard/lineas.py
index 2894e9d..eb671b6 100644 (file)
@@ -1,3 +1,5 @@
+"""
+
                 for line in lineas:
                     if not line['codigoarticulo'].strip().isdigit():
                         line = auxlinea(line)
@@ -56,3 +58,4 @@
 
 
                 # FIN for line in lineas
+"""
\ No newline at end of file
diff --git a/opentck3/README.rst b/opentck3/README.rst
new file mode 100644 (file)
index 0000000..d5d0377
--- /dev/null
@@ -0,0 +1,304 @@
+leer_informe(salidapazos=None):
+    """
+        Recibe el 'informe de salida', recontruye los tickets
+        La salida será un diccionario tipo:
+
+        informe = { cabezal_Ticket0: [ lineaTicket0_0, lineaTicket0_1,
+                                       lineaTicket0_2, lineaTicket0_N ],
+                   cabezal_Ticket1: [ lineaTicket1_0, ... ],
+                   cabezal_TicketN: [ lineaTicketN_0, ....]
+        }
+        :param salidapazos: lista de strings
+    """
+
+
+parse_line(linea,llave,caja,ticket,tstname,tst_tck):
+
+    """
+        Recibe una linea de ticket. Con esos datos instancia un objeto de la clase `IPLinea`
+        La instancia cuenta con herramientas para simplificar, clasificar, reconstruir el ticket.
+        Devuelve un diccionario a ser usado en el `create` del modelo en openerp.
+    """
+
+    lin = IPLinea(linea)
+    data = lin.metodo()
+    _cabezal = None
+    nota = "%s %s | " % (llave,lin.descripcion)
+    codigo = ''
+    # datos comunes en todos los tipos de líneas
+    linea_de_ticket = { 'num_tipolinea' : llave,
+                        'name'          : tstname,
+                        'tst_ticket'    : tst_tck,
+                        'numerodelinea' : lin.res['numerodelinea'],
+                        'tipolinea'     : lin.res['tipolinea'],
+                        'timestamplinea': lin.hora,
+                        'nota'          : nota
+    }
+
+    if   llave == '126':
+        # Línea de ticket de cliente de cuenta corriente (126)-SM
+        _cabezal = "Cuenta:  %s %s Ttl. cuenta: %s \n" % (
+            data['codigocc'], data['nombrecc'], data['montopagocc'])
+
+    elif llave == '68':
+
+        cod_cliente = data['codigocliente']
+        if not cod_cliente:
+            cod_cliente = 'Falta el número de cliente'
+            logging.info(" % [ WARNING ] : %s " % (ns, cod_cliente))
+        else:
+             _cabezal = "%s %s \n" % (cod_cliente, data['nombrecliente'] or '')
+
+    elif llave == '55':
+        # Intervensión Supervisora (55)
+        _cabezal = "Sup. %s " % ( data['nombresuper'],)
+
+    elif llave == '53':
+
+        _53 = data['descripciontipoticket']
+        _53 += ", ticket excento de Iva" if data['tipoventa'] == '1' else " "
+        _cabezal = "%s \n" % (_53,)
+
+    elif llave == '47':
+        # Cobranza de servicio (47)
+        linea_de_ticket.update(
+            {'descripcion_servicio': 'Cta.Cte.' if data['codserviciopagado'] == '1' else 'Otros',
+             'importe'             : float(data['importecobranza']),
+             'modoingreso'         : data['modoingreso'],
+             'codigoarticulo'      : '999',              # la cobranzas están hardcodeadas
+             })
+
+    elif llave == '43':
+
+        sello = data['nombreemisortarjeta']
+        if not sello:
+            _cabezal = "Falta el sello TDCR \n"
+            logging.info(" %s [ WARNING ] : Falta el sello de la tarjata de tarjeta " % ns )
+        else:
+            if data['tipovoucher'] == '1':
+                _cabezal = "%s \n" % ( sello,)
+            else:
+                pass
+    elif llave == '37':
+
+        # tipotar        = data['tipotarjetacredito'][-2:]
+        total_medpag   = float(data['totalmediopagomonedamonedareferencia'])
+        tipo_operacion = 'Venta' if data['tipooperacion'] == '0' else 'Devol. tarjeta'
+        linea_de_ticket['nota'] +=  "TDCR : %s   $ %s" % (tipo_operacion, str(total_medpag))
+        _cabezal = "TDCR : %s   $ %s \n" % (tipo_operacion, str(total_medpag))
+
+    elif llave == '24':
+        # Línea pertenece a ticket cancelado SM (24)
+        if data['texto']:
+            _cabezal = "%s \n" % (data['texto'],)
+
+    elif llave == '20':
+        # Devolución de un ítem SM (20).
+        if data['indicadorartsubf'] == 'S':
+            linea_de_ticket['nota'] += 'Devol. a subfamilia'
+
+        if data['indicadorartsubf'] == 'A':
+            linea_de_ticket['nota'] += 'Devol. artículo'
+
+        linea_de_ticket.update({'codigoarticulo': data['codigoarticulosubf'],
+                                'cantidad'      : float(data['cantidad']),
+                                'importe'       : float(data['precio']),
+                                'importe_iva'   : float(data['iva']),
+                                'supervisora'   : data['codigosupervisora'],
+                                'codigovendedor': data['codigovendedor'],
+                                'codigooriginal': data['codigoarticulooriginal'],
+                                'lineacancelada': int(data['lineacancelada']),
+                                'modoingreso'   : data['modoingreso']})
+
+    elif llave == '12':
+        # Cancelación de Ítem (12).
+        #ipdb.set_trace()
+        linea_de_ticket['nota'] += ' Importe iva/incl. '
+        linea_de_ticket['nota'] += data['nombresupervisora']
+
+        ind = data['indicadorartsubf']
+        if   ind == 'A':
+            linea_de_ticket['nota'] += ' Cancela un articulo'
+            codigo = data['codigoarticulo'] if data.has_key('codigoarticulo') else data['codigoarticulosubf']
+        elif ind == 'S':
+            linea_de_ticket['nota'] += ' Cancela a subfamilia'
+            codigo = data['codigoarticulosubf']
+        elif ind == 'C':
+            linea_de_ticket['nota'] += ' Cancela Cobranza'
+            codigo = '9999999999919'
+        elif ind == 'T':
+            linea_de_ticket['nota'] += ' Art. cancelado es un tandem'
+            codigo = data['codigoarticulo'] if data.has_key('codigoarticulo') else data['codigoarticulosubf']
+
+        linea_de_ticket.update({'codigoarticulo': codigo,
+                                'cantidad': data['cantidad'] if data.has_key('cantidad') else 1.0,
+                                'nrolineavta'   : data['nrolineavta'],
+                                'importe'       : float(data['importe_cancelado']),
+                                'codigovendedor': data['codigovendedor']})
+
+    elif llave in ('1', '30'):
+        # datos comunes en los 2 tipos de línea restantes
+        linea_de_ticket.update(
+                {'cantidad'      : float(data['cantidad']),
+                 'importe'       : float(data['preciodescuentototal']),
+                 'importe_iva'   : float(data['ivadescuentototal']),
+                 'codigovendedor': data['codigovendedor'],
+                 'lineacancelada': int(data['lineacancelada']),
+                 'modoingreso'   : data['modoingreso']})
+        if llave == '1':
+            # Venta de ítem SM (1).
+            iva = {0.22: '1', 0.10: '2', 0: '3'}
+            linea_de_ticket.update({'codigoarticulo': data['codigoarticulo'],
+                                'estandem'          : int(data['esdetandem']),
+                                'talle'             : data['talle'],
+                                'color'             : data['color'],
+                                'marca'             : data['marca'],
+                                'modelo'            : data['modelo'],
+                                'codigooriginal'    : data['codigoarticulooriginal'],
+                                'codigoiva'         : iva[data['codigoiva']],
+                                'siaplicadescfidel' : data['siaplicadescfidel'],
+                                'montorealdescfidel': float(data['montorealdescfidel']),
+                                'price_unit'        : float(data['preciounitario'])})
+        elif llave == '30':
+            # Línea de venta a la subfamilia (30).
+            linea_de_ticket.update({ 'codigoarticulo': data['codigo'] })
+
+    return (_cabezal, linea_de_ticket)
+
+
+
+
+def passtck(tickets):
+    """
+        Recibe tickets como un diccionario de cabezales y líneas de tickets
+        que parsea, clasifica y genera on objeto json.
+        :param tickets:
+    """
+
+    cabezales = tickets.keys()
+    count_tck = len(cabezales)
+    tickets_procesados = 0
+
+    #print('%s tickets en el informe' % count_tck)
+    #raw_input("%s..." % (50*' '),)
+
+    tcks_del_dia = list()
+    pos_ticket_id = ticket_line_id = None
+
+    for cabezal in cabezales:
+        if cabezal[0] in config.cabezales_interes:
+            # instancia
+            C = IPCabezal(list(cabezal))
+
+            caja    = C.n_caja
+            ticket  = C.n_ticket
+            yymmdd  = C.yymmdd
+
+            # preparo datos del cabezal
+            tstname = C.timestamp + C.n_caja + C.n_ticket
+            tst_tck = datetime.strptime(C.timestamp, "%Y%m%d%H%M%S").strftime('%Y-%m-%d %H:%M:%S')
+            date = C.yyyy + '-' + C.mm + '-' + C.dd
+
+            pos_ticket = {'name'          : tstname,
+                          'sucursal_id'   : 1,
+                          'origin'        : "Caja: %s  ||  Numero de ticket: %s" % (C.n_caja, C.n_ticket),
+                          'num_tipocab'   : C.llave,
+                          'tipo_cabezal'  : "Tipo de ticket: %s" % (C.descripcion,),
+                          'timestamptck'  : tst_tck,
+                          'codigocaja'    : int(C.n_caja),
+                          'numerotck'     : int(C.n_ticket),
+                          'codigocajera'  : C.n_cajera,
+                          'date'          : date,
+                          'estadotck'     : C.estado,
+                          'cantarticulos' : int(C.cant_articulos),
+                          'total_pagar'   : float(C.total_a_pagar),
+                          'tipocliente'   : C.tipo_d_cliente,
+                          'cantidadlineas': int(C.cant_lineas),
+                          'observaciones' : '' }
+
+            # se leen todas las líneas antes de confirmar el cabezal, existen
+            # líneas pueden contener información relevnte para el cabezal.
+
+            if ticket == "numero_abracadabra" and caja == "X":
+                # debug de un ticket: reemplazar numero de ticket y nro. de caja
+                print "# ipdb.set_trace()"
+
+            lineas_validas_del_ticket = []
+
+            for linea in tickets[cabezal]:
+                llave = linea[1]
+                if llave in config.lineas_interes:
+                    lin_tck  = {}
+                    _cabezal = ''
+                    _cabezal, lin_tck = parse_line(linea,llave,caja,ticket,tstname,tst_tck)
+
+                    if _cabezal:
+                        pos_ticket['observaciones'] += _cabezal
+
+                    if llave not in ('126','68','55','53','43','37','24'):
+                        lineas_validas_del_ticket.append(lin_tck)
+                else:
+                    pass
+
+            try:
+
+                tcks_del_dia.append((pos_ticket, lineas_validas_del_ticket))
+                tickets_procesados += 1
+
+            except Exception as err_msg:
+                        logging.error(err_msg)
+                        msg = " %s No se pudo agregar tickets!" % ns
+                        logging.warn(msg)
+                        end("[ Error ] : %s " % (msg,))
+                        sys.exit(0)
+
+    return (tickets_procesados, tcks_del_dia)
+
+
+#def check_infofile():
+
+
+
+
+if __name__ == '__main__':
+
+    """
+        Procesa informes de salida de los POS, filtra movimientos
+        según criterios configurables, serializa la salida en
+        estructuras `json` que escribe en un archivo.
+
+        1. lee el directorio de salidapazos
+        2. prepara la lista de archivos a procesar
+        3. procesa y crea los archivos json
+        4. marca los informes procesaros en "/admi/pazos4/.sqlite3.db"
+
+        Los archivos json tiene la forma:
+
+        salida = [
+            ({lineas_cabezal},{lineas_detalle}),
+            ({lineas_cabezal},{lineas_detalle}),
+            ({lineas_cabezal},{lineas_detalle})
+        ]
+    """
+    #ipdb.set_trace()
+    infofile = to_json() # 1. 2.
+
+    #print 'infofile :', len(infofile)
+    #ipdb.set_trace()
+    if not infofile:
+        msg =  'No hay informes sin procesar!'
+        logging.warn( " %s [ Warninig ] : %s " % (ns, msg) )
+        sys.exit(0)
+
+    for i in infofile:  # 3.
+        #print i
+        fecha = get_date(i)
+        movs, tcks_del_dia = passtck(leer_informe(i))
+        json_file = "%stck%s.json" % (oPath,fecha,)
+        try:
+            with open(json_file, 'w') as fp:
+                json.dump(tcks_del_dia, fp)
+            json_done(i,fecha,json_file) # 4.
+            logging.info(" %s [ Info ] %s generado ok " % (ns,fecha))
+        except Exception as escritura:
+            logging.error( " %s [ Error ] : %s Imposible escribir el informe" % (ns, escritura) )
diff --git a/opentck3/__init__.py b/opentck3/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/opentck3/chk_json.py b/opentck3/chk_json.py
new file mode 100644 (file)
index 0000000..7b08191
--- /dev/null
@@ -0,0 +1,283 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+__licence__ = "GNU/GPLv3"
+__author__  = "Marcelo Zunino (InfoPrimo SL) 2015-2017"
+
+# from datetime import date, datetime
+import sys
+import os.path
+
+import sqlite3
+import re
+import logging
+from time import strftime
+from util import config
+from glob import glob
+
+import ipdb
+#logfile = './log/spn2json_chk.log'
+#os.path.isdir('./log') or os.mkdir('./log')
+#os.path.isfile(logfile) or os.system("touch %s" % logfile)
+#logging.basicConfig(format='%(asctime)s %(message)s', filename=logfile, level=logging.INFO)
+
+#  iPath = "/admi/informes/"
+#  oPath = "/admi/pazos4/"
+#  iPrefijo = "Salidapazosnuevo-1-201"
+
+iPrefijo = config.iPrefijo
+iPath  = config.iPath
+oPath  = config.oPath
+dbpath = oPath + '.spazos_tck.db'
+ns = __name__
+
+
+def end(msg=None):
+    msg = msg or "\n\tAlgo salió mal... FIN\n"
+    sys.stdout.write("\n\t%s\n\n" % (msg,))
+
+
+def pick_input(iPath=iPath, iPrefijo=iPrefijo):
+    """
+    Lee el contenido del directorio de salidapazos filtrado con el prfijo
+    del nombre de archivo del informe
+
+    :param iPath: path al archivo sqlite
+    :param iPrefijo:  "Salidapazosnuevo-1-20*"
+    :return: Lista de archivos candidatos a ser porcesados para generar el json.
+    """
+    # import ipdb; ipdb.set_trace()
+    iPath += iPrefijo
+    digitos = re.compile('[0-9]{3,4}$')
+    try:
+        file_list = glob(iPath)
+    except Exception as err_msg:
+        logging.error(err_msg)
+        msg = " [ Warninig ] : No se leyó nungún informe. "
+        logging.warn( " %s %s " % (ns, msg) )
+        end(msg)
+        sys.exit(0)
+
+    file_list.sort()
+
+    if len(file_list) > 0:
+        res = {}
+
+        for info_file in file_list:
+            if digitos.match(info_file[info_file.index('.')+1:]):
+                res.update({ int(info_file[info_file.index('.')+1:]): info_file})
+    else:
+        msg = " %s No se leyó nungún informe. info_list está vacía!!" % ns
+        logging.error(msg)
+        end(msg)
+        sys.exit(1)
+
+    return res
+
+
+def conn(dbpath=dbpath):
+    """
+    Conexión a la db
+    :param dbpath:
+    :return:        una concexión sqlite3
+    """
+    res = False
+    if not dbpath:
+        msg = " %s Falta el path para la db" % ns
+        logging.error(msg)
+        end(msg)
+        sys.exit(1)
+    if 1: #try:
+        if os.path.isfile(dbpath):
+            res = sqlite3.connect(dbpath, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES, isolation_level=None)
+            if not res:
+                print("No hay CONNECTION")
+                msg =  ' %s Imposible conectar a %s.' % (ns, dbpath,)
+                raise  Exception
+        else:
+            msg =  ' %s No existe %s.' % (ns, dbpath,)
+
+
+    #except Exception as err_msg:
+    # logging.error(err_msg)
+    msg =  ' %s Imposible conectar a %s.' % (ns, dbpath,)
+    # logging.warn(msg)
+    # end(msg)
+    # sys.exit(1)
+    return res
+
+
+def close(cr,db):
+    """
+    bueno, eso, cierra la conexión a la db
+        :param cr:
+        :param db:
+        :return:  True or exit con mensaje
+    """
+    try:
+        cr.close()
+        db.close()
+    except Exception as err_msg:
+        msg =  ' %s No se pudo cerrar la db.' % ns
+        logging.error(err_msg)
+        logging.warn(msg)
+        end(msg)
+        sys.exit(1)
+    return True
+
+
+def install(dbpath, force=None):
+    """
+    Crear db sqlite3 en `dbpath`
+    :param dbpath:
+    :param force:
+    :return:
+    """
+    init = '''CREATE TABLE if not exists spazosjson(id INTEGER PRIMARY KEY AUTOINCREMENT, origen TEXT NOT NULL UNIQUE, cod_inifin TEXT NOT NULL UNIQUE, fecha_opera DATE NOT NULL UNIQUE, fecha_lectura DATE NOT NULL, destino TEXT NOT NULL UNIQUE);'''
+
+    if not os.path.isfile(dbpath) or force:
+        if 1:
+            sqlite3.enable_callback_tracebacks(1)
+            conn = sqlite3.connect(dbpath, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES, isolation_level=None)
+
+            db = conn(dbpath)
+            cr = db.cursor()
+            cr.execute(init)
+            close(cr,db)
+        if not 1:
+            # except:
+            # Exception as err_msg:
+            print 'lin 147 install'
+            # logging.error(err_msg)
+            msg =  ' %s install: No se pudo crear la db.' % ns
+            #logging.warn(msg)
+            # end(msg)
+            print msg
+            # sys.exit(1)
+    return True
+
+force = None
+
+def test_db(dbpath=dbpath):
+    """
+    Verifica existencia db y tabla necesarias, de lo contrario creará una nueva db.
+    :param dbpath:
+    :return: True o exit con aviso
+    """
+    res = False
+    if not os.path.isfile(dbpath):
+        res = install(dbpath,force=1)
+
+    table_name = 'spazosjson'
+    sql = """SELECT 1 FROM sqlite_master WHERE type='table' AND name='%s';""" % (table_name,)
+    try:
+        db = conn(dbpath)
+        cr = db.cursor()
+        cr.execute(sql)
+        test = cr.fetchone()
+        if not (isinstance(test, tuple) and test[0] == table_name):
+            res = install(dbpath,1)
+    except:
+        # Exception as info_msg:
+        print res
+        # msg = '%s %s test_db: No existe %s. Fallo al intentar crear la tabla.' % (info_msg,ns,table_name)
+        # logging.error(msg)
+        # print msg, ' test_db'
+        # sys.exit(1)
+
+    return res
+
+
+def refresh_db(dbpath):
+    db = conn(dbpath)
+    cr = db.cursor()
+    # si se reinstala : "CREATE TABLE spazosbak AS SELECT * FROM spazosjson;"
+    cr.execute("insert into spazosbak select * from spazosjson;")
+    cr.execute("delete from spazosjson;")
+    #create table spazosbak AS select * from spazosjson;
+
+
+def to_json(dbpath=dbpath):
+    """
+    Filtra la lista de informes disponibles contra el historial de informes procesados.
+    retornando la lista de aquellos que no encuentra en el historial.
+
+    :param dbpath:  ubicación de la db del historial
+    :return:
+    """
+
+    test_db(dbpath)
+    try:
+        db = conn(dbpath)
+        cr = db.cursor()
+        cr.execute('''SELECT cod_inifin FROM spazosjson ORDER BY id;''')
+        proc = cr.fetchall()
+        close(cr,db)
+    except Exception as err_msg:
+        logging.error(err_msg)
+        msg = " %s : [ Error ] : No se leyó nungún informe. " % ( ns, )
+        print msg, ns, ' to_json'
+        logging.warn(msg)
+        sys.exit(1)
+
+    _inifin_done = [ int(i[0].encode('utf-8')) for i in proc if isinstance(proc,list)]
+    _inifin_done.sort()
+
+    # se lee la carpeta de informes disponibles.
+    candidatos = pick_input()
+    result = []# candidatos[i] for i in candidatos if i not in _inifin_done ]
+    for i in candidatos:
+        if i not in _inifin_done: # and os.path.getsize(i)>0:
+            result.append(candidatos[i])
+            print(i)
+    result.sort()
+
+    return result
+
+
+def json_done(info,fecha,jsonfile,dbpath=dbpath):
+    """
+    crea el registo para el historial/control
+    :param info:
+    :param fecha:
+    :param jsonfile:
+    :param dbpath:
+    :return:
+    """
+
+    db = conn(dbpath)
+    cr = db.cursor()
+
+    origen = info
+    cod_inifin = info[info.index('.')+1:]
+    fecha_opera = fecha[:4] + '-' + fecha[4:6] + '-' + fecha[6:8]
+    fecha_lectura = strftime("%0Y.%0m.%0d %0H:%M:%0S")
+    destino = jsonfile
+
+    sql0 = "INSERT INTO spazosjson(origen,cod_inifin,fecha_opera,fecha_lectura,destino) VALUES("
+    sql1 = "'%s','%s','%s','%s','%s');" % ( origen,cod_inifin,fecha_opera,fecha_lectura,destino)
+    #print sql0 + sql1
+
+    cr.execute(sql0 + sql1)
+
+
+#import ipdb;ipdb.set_trace()
+if __name__ == '__main__':
+    ipdb.set_trace()
+    test_db(dbpath)
+
+    db = conn(dbpath)
+    cr = db.cursor()
+    cr.execute('''SELECT * FROM spazosjson''')
+    rows = cr.fetchall()
+
+    close(cr,db)
+
+    if rows:
+        for row in rows:
+            print row
+    else:
+        print 'foi'
+
+    if len(rows) >= 1825:
+        refresh_db(dbpath)
+
diff --git a/opentck3/get_spn.py b/opentck3/get_spn.py
new file mode 100644 (file)
index 0000000..d6827c0
--- /dev/null
@@ -0,0 +1,216 @@
+#!/usr/bin/python
+# -*- encoding: utf-8 -*-
+#
+# Se usa para obtener la ruta absoluta a un informe tipo:
+#       Salidapazosnuevo-1-AAAAMMDD.NNN
+# a partir de parámetro <DDMM> en la línea de comandos.
+#
+# Sin parámetros pide DDMM o propone una lista de candidatos.
+# La salida final es una tupla
+#   tupla = ( "/camino/al/informe/Salidapazosnuevo-1-AAAAMMDD.NN",
+#             "AAAAMMDD",
+#             "/camino/al/dir/de/salida/" )
+#
+# lee configuraciones del módulo `config`
+
+__licence__ = "GNU/GPLv3"
+__author__  = "Marcelo Zunino (InfoPrimo SL) 2015"
+
+# import ipdb
+# from time import strftime
+
+import os
+import sys
+import subprocess
+import logging
+from util import config
+
+ns = __name__
+
+# logfile = './log/get_spn.log'
+# os.path.isdir('./log') or os.mkdir('./log')
+# os.path.isfile(logfile) or os.system("touch %s" % logfile)
+# logging.basicConfig(format='%(asctime)s %(message)s', filename=logfile, level=logging.INFO)
+
+
+iPath    = config.iPath
+oPath    = config.oPath
+iPrefijo = config.iPrefijo
+
+
+def end(msg=None):
+    msg = msg or "\n\tAlgo salió mal... FIN\n"
+    sys.stdout.write("\n\t%s\n\n" % (msg,))
+
+def run(command):
+    output = subprocess.check_output(command, shell=True)
+    return output
+
+def valid_date(mes=None, dia=None):
+    """
+    Verificación elemental de validez de una fecha MMDD (mes,dia) en 4 dígitos
+    ¡ no controla cantidad de días del mes !
+    :param mes: texto solo dígitos
+    :param dia: texto solo dígitos
+    :return: True o False
+    """
+
+    mes = mes or False
+    dia = dia or False
+    try:
+        mes = int(mes)
+        dia = int(dia)
+        if not (mes in range(1,13) and dia in range(1,32)):
+            raise Exception("Fecha no válida.")
+    except:
+        msg = "%s %s%s no parece corresponder a una fecha válida. Intentalo otra vez..." % (ns,mes,dia)
+        logging.warn(msg)
+        end(msg)
+        sys.exit(0)
+
+
+def cls():
+    x_ = os.system("clear")
+
+def user_input(iSufijo, user_in=None):
+    """
+    Parser para el ingreso de usuario, si lo hubiera.
+    (en modo script automático no se usa)
+
+    :param iSufijo:  es el path de origen
+    :param user_in:  entrada del usuario
+    :return: lista con nombre/s de archivo/a SalidaPazos-1- ...
+    """
+
+    res = None
+    file_in_mask = None
+    user_in = user_in or False
+    if user_in and user_in not in ('t', 'T'):
+
+        mm,dd = (user_in[-2:],user_in[:-2])
+        if mm.join(dd).isdigit:
+            valid_date(mm,dd)
+            file_in_mask = iPrefijo + mm + dd + iSufijo
+        else:
+            valid_date('00','00')
+    else:
+        file_in_mask = iPrefijo + iSufijo
+
+    cmd = "cd %s;ls -tr %s 2>/dev/null" % (iPath, file_in_mask)
+
+    try:
+        cmd_output = run(cmd)
+        file_list = cmd_output.split()
+        count = len(file_list)
+    except Exception as err_msg:
+        logging.error(err_msg)
+        msg = "%s [ Error ] : No se leyó nungún informe. "  % ns
+        logging.warn( msg )
+        end(" %s Verifica si existe informe para esa fecha e intentalo de nuevo" % (msg,))
+        sys.exit(0)
+
+    if file_list and count > 1:
+
+        while True:
+            cls()
+            print ("\n\t Informes disponibles: %s \n\n" % (count,))
+            for i in file_list:
+                print ("\t\t %s ........ %s" % (i, file_list.index(i) + 1))
+
+            print('\n\t\t\t    <enter> fin |   Informe a ')
+            cod_in = raw_input('\t\t\t\t>>>>>   |   procesar : ')
+            if cod_in == (''):
+                print ("\n\t\t\t...\n")
+                sys.exit(0)
+            try:
+                res = iPath + file_list[int(cod_in) - 1]
+                break
+            except Exception as grave:
+                msg = " %s [ Error ] : No se leyó nungún informe."  % ns
+                logging.error(grave,)
+                logging.warn( msg )
+                end(msg)
+                sys.exit(0)
+    else:
+        res = iPath + file_list[0]
+
+    return res
+
+
+def get_date(info_file):
+    """
+    Parsea la primera línea del informe creado.
+        si bien el nombre del archivo representa a un fecha, su contenido puede corresponder a una fecha diferente.
+
+    ejemplo de primera línea de informe (siempre será un cabezal de ticket)
+        C#8#1#87#8#20151231080308#F#0#0.00#20#8
+                   |________|
+                   2015/12/31
+
+    :param info_file: archivo tckAAAAMMDD.tck
+    :return:   texto: una fecha
+
+    """
+    count_sep  = 0
+    date = ''
+    centinel = 0
+    head = run("head -1 %s" % info_file)
+
+    head = head.strip('\n')
+
+    for i in range(len(head)):
+        if head[i] == '#':
+            count_sep += 1
+        if count_sep >= 5 and centinel < 9:
+            date += head[i]
+            centinel += 1
+
+    date = date.strip('#')
+    print date
+    return date
+
+
+def infofile(args=sys.argv):
+
+    if len(args) > 1 :
+        # ingreso de parámetros en la línea de comandos (scripting)
+
+        user_in = args[-1:][0]
+        iSufijo = '.*'
+        if len(str(user_in)) > 4:
+            end("No se entiende el ingreso. Intentalo otra vez...")
+            sys.exit(1)
+    else:
+        # el usuario inresará la fecha y el tipo de informe
+
+        cls()
+        print ("\n" * 8 )
+        print         ("\n\n\tFecha del informe en 2 dígitos \'DDMM\' ")
+        user_in  = raw_input('\n\t<T> todos   \n\t<enter> fin.       : ')
+
+
+        if len(str(user_in)) == 4:
+            iSufijo = '.*'
+        elif user_in in ('t', 'T'):
+            iSufijo = '*.*'
+        else:
+            if user_in and len(str(user_in)) > 0:
+                end("No se entiende el ingreso. Intentalo otra vez...")
+                sys.exit(1)
+            else:
+                end ("No se leyó ningún informe%s..." % ("\n\t\t\t\t\t\t"),)
+                sys.exit(1)
+
+    salida_pazos = user_input(iSufijo, user_in)
+
+    fecha = get_date(salida_pazos)
+    #print salida_pazos,fecha,oPath
+    return (salida_pazos,fecha,oPath)
+
+if __name__ == '__main__':
+    infofile()
+
+
+
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/opentck3/ip_ticket/__init__.py b/opentck3/ip_ticket/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/opentck3/ip_ticket/ip_ticket_doc.py b/opentck3/ip_ticket/ip_ticket_doc.py
new file mode 100644 (file)
index 0000000..47dbaa3
--- /dev/null
@@ -0,0 +1,2694 @@
+class IPLinea(IPTicket):
+    def __init__(self, linea=None, id_cabezal=None):
+        tipos_linea_tck = {
+
+            '9'    : ('M.Pago de ticket en efectivo'        , self.lt_9),
+            '37'   : ('M.Pago con tarjeta'                  , self.lt_37),
+            '38'   : ('M.Pago con cheque'                   , self.lt_38),
+            '40'   : ('M.Pago luncheon ticket'              , self.lt_40),
+
+                                                                '43'   : ('Voucher de la tarjeta'               , self.lt_43),
+                                                                '47'   : ('COBRANZA/Pago de servicio'           , self.lt_47),
+                                                                '49'   : ('Detalle beneficios med.pago-moneda'  , self.lt_49),
+
+            '52'   : ('M.Pago de caja'                      , self.lt_52),
+
+            '67'   : ('M.Pago de cupón corporativo'         , self.lt_67),
+
+                                                                '81'   : ('Devolución de pago de servicio'      , self.lt_81),
+
+            '85'   : ('M.Pago de tarjeta offline'           , self.lt_85),
+
+                                                                '87'   : ('Descuento a los med.pago-moneda.'    , self.lt_87),
+
+            '90'   : ('M.Pago ticket TAlimentos'            , self.lt_90),
+            '91'   : ('M.Pago ticket Total'                 , self.lt_91),
+            '94'   : ('Pago con cheque cobranza'            , self.lt_94),
+
+            '115'  : ('Pago descuento iva a familia'        , self.lt_115),
+
+                                                                '120'  : ('Venta Mides'                         , self.lt_120),
+                                                                '121'  : ('Voucher retiro leche tarjeta Mides'  , self.lt_121),
+
+            '123'  : ('M.Pago TCRE'                         , self.lt_123),
+
+                                                                '124'  : ('Voucher de la tarjeta TCRE'          , self.lt_124),
+
+            '127'  : ('M.Pago cuenta corriente'             , self.lt_127),
+
+        }
+
+        try:
+            self.rlinea        = 'L#' + '#'.join(linea)      # reconstruye linea original para debug
+            self.numerodelinea = linea[0]                    # Número de línea
+            self.llave         = llave = linea[1]            # Tipo de línea de ticket
+            self.descripcion   = tipos_linea_tck[llave][0]   # Descripción del  Tipo de línea de ticket
+            self.metodo        = tipos_linea_tck[llave][1]   # Método implementado para el tipo de línea de ticket
+
+            self.hora   = ipt.hora(linea[2])                 # hh:mm:ss
+            self.hhmmss = ipt.hhmmss(linea[2])               # hhmmss
+            self.horalinea = ipt.hhmmss(linea[2])
+
+            self.esta_linea = linea[3:] # línea sin los elementos compartidos. (se usa en los métodos)
+            self.id_tck     = id_cabezal
+            self.id_linea   = self.id_tck + self.hhmmss + self.numerodelinea
+        except Exception as ex:
+            import ipdb; ipdb.set_trace()
+            msg  = ' %s [ ERROR ] Imposible inizializar la clase IPLinea: la línea recibida ' % ns
+            msg += '\nno parece una línea de cabezal de ticket de SalidaPazos'
+            logging.info(msg)
+            logging.error("%s \n%s" % (ex, linea))
+            print ("%s  %s" % (msg, "Vea el log!"))
+            sys.exit(1)
+
+
+
+
+
+    def lt_1(self):
+        """
+            Línea de venta de ítem (1)-SM.
+            ------------------------------
+            (sin atributos comunes) `Tipo Líneas de Detalle`
+
+            IdentificadorLinea # NumeroDeLinea # TipoLinea  # TimestampLinea #
+
+
+            CodigoArticulo # Cantidad # Precio # Iva # PrecioDescuento # IvaDescuento #
+                   0            1         2       3          4                5
+
+            PrecioDescuentoCombo # IvaDescuentoCombo # PrecioDescuentoMarca #
+                     6                    7                   8
+
+            IvaDescuentoMarca  #   PrecioDescuentoTotal # IvaDescuentoTotal #
+                    9                    10                      11
+
+            CantDescManuales # LineaCancelada # ModoIngreso # CodigoVendedor #
+                12                  13             14            15
+
+            Talle # Color # Marca # Modelo # SiEsTandem # CodigoArticuloOriginal #
+              16      17      18      19       20                  21
+
+            CodigoIva # SiAplicaDescFidel # MontoRealDescFidel # PrecioUnitario
+                  22          23                      24               25
+
+
+            Descripción:
+
+            0. codigoarticulo         Código interno del artículo.
+
+            1. cantidad               Cantidad de artículos vendidos en esa línea. Es la cantidad que
+                                            sale impresa en el ticket.
+
+            2. precio                 Precio de la línea del articulo (cantidad x precio unitario)
+                                            expresado en la moneda de referencia. Es el precio “limpio”
+                                            al cual no se le efectuó ningún descuento (no incluye iva,
+                                            este va separado en el siguiente campo).
+
+            3. iva                    Iva de la línea del artículo expresado en la moneda de referencia.
+
+            4. preciodescuento        Precio de la línea del artículo a la cual se aplicó un descuento
+                                            directo. Si esta es igual a Precio la línea no fue afectada
+                                            por un descuento directo.
+
+            5. ivadescuento           Iva del descuento directo de la línea del articulo.
+
+            6. preciodescuentocombo   Precio de la línea del articulo la cual fue afectada por un
+                                            descuento de un Combo. Si el artículo pertenece a un combo y
+                                            este se efectuó, se le aplicará el descuento correspondiente
+                                            (excepto si el Combo otorga un descuento al total).
+                                            Si el importe es igual a PrecioDescuento la línea no fue
+                                            afectada por un descuento del Combo.
+            7. ivadescuentocombo      Iva del descuento del combo a la línea del artículo.
+
+            8. preciodescuentomarca   Precio de la línea del articulo la cual fue afectada por un
+                                            descuento por Marcas. Si el artículo pertenece a una Marca
+                                            y esta se efectuó, se le aplicará el descuento correspondiente
+                                            (excepto si la Marca otorga un descuento al total). Si el
+                                            importe es igual a PrecioDescuentoCombo la línea no fue
+                                            afectada por un descuento de Marca.
+
+            9. ivadescuentomarca      Iva del descuento a la Marca a la línea del artículo.
+
+           10. preciodescuentototal   Precio de la línea del artìculo la cual fue afectada por un
+                                            descuento al total. Si bien es un descuento al total, se
+                                            prorratea a las líneas. Si esta es igual a PrecioDescuentoMarca
+                                            la línea no fue afectada por un descuento al total. Nota: Este
+                                            es el precio final de artículo una vez aplicado todos los
+                                            descuentos si corresponde (sino conserva el precio original),
+                                            por lo tanto si se va a procesar los importes de los artículos,
+                                            se debe tomar este valor mas el iva.
+
+           11. ivadescuentototal      Iva del descuento al total a la línea del artículo.
+
+           12. cantdescmanuales       Cantidad de descuentos manuales que realizó la cajera.
+
+           13. lineacancelada         Estado
+                                        0-Línea no cancelada.
+                                        1-Línea cancelada.
+                                            Este tipo de línea no tiene valor contable. A pesar
+                                            que pudo haber sido afectada por descuentos, esta no
+                                            se debe tomar en cuenta.
+
+           14. modoingreso            Modo de ingreso del artículo. Son los siguientes:
+                                        0-De teclado.
+                                        1-De scanner.
+                                        2-Lectora de banda magnética.
+
+           15. codigovendedor         Código de vendedor si aplica, sino va vacío.
+
+           16. talle                  Datos del talle si aplica, sino va vacío.
+
+           17. color                  Color si aplica, sino va vacío.
+
+           18. marca                  Marca si aplica, sino va vacío.
+
+           19. modelo                 Modelo si aplica, sino va vacío.
+
+           20. siestandem             Es tandem.
+                                        0 - No es artículo de tandem.
+                                        1 - Es artículo de tandem.
+
+           21. codigoarticulooriginal Es el código original del artículo que ingresó la cajera, ya
+                                            sea el código de barras entero o el código digitado manualmente.
+                                            En el caso de repetir el ultimo articulo ingresado este campo
+                                            no se setea, ya que la cajera no lo ingresa en forma explicita.
+
+           22. codigoiva              Código de iva aplicado.Si no aplica IVA va 0.
+
+           23. siaplicadescfidel      Flag que indica si a la línea se le aplico control de descuento
+                                            al total por fidelización.
+                                        0-No se aplico control de descuento.
+                                        1-Se aplico control de descuento (ver MontoRealDescFidel).
+
+           24. montorealdescfidel     Monto real del descuento controlado por fidelizacion.
+
+           25. preciounitario         Precio unitario del item (precio de lista que incluye IVA).
+
+        """
+
+        lin = self.esta_linea or False
+
+        iva_map = { '1': 0.22, '2': 0.10, '3': 0 }
+        result = dict()
+
+        try:
+            result.update(dict( codigoarticulo         = lin[0],
+                                cantidad               = lin[1],
+                                precio                 = lin[2], # es el IMPORTE sin iva y sin descuentos de la línea
+                                iva                    = lin[3],
+                                preciodescuento        = lin[4],
+                                ivadescuento           = lin[5],
+                                preciodescuentocombo   = lin[6],
+                                ivadescuentocombo      = lin[7],
+                                preciodescuentomarca   = lin[8],
+                                ivadescuentomarca      = lin[9],
+                                preciodescuentototal   = lin[10],
+                                ivadescuentototal      = lin[11],
+                                cantdescmanuales       = lin[12],
+                                lineacancelada         = lin[13],
+                                modoingreso            = lin[14],
+                                codigovendedor         = lin[15],
+                                talle                  = lin[16],
+                                color                  = lin[17],
+                                marca                  = lin[18],
+                                modelo                 = lin[19],
+                                siestandem             = lin[20],
+                                codigoarticulooriginal = lin[21],
+                                codigoiva              = lin[22],
+                                siaplicadescfidel      = lin[23],
+                                montorealdescfidel     = lin[24],
+                                preciounitario         = lin[25], # precio unitario "de lista" con iva
+            ))
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_4(self):
+
+        """
+            Línea de total del ticket (4)
+            Contiene el total del ticket:
+
+            TotalTicket # IvaTotalTicket # TotalTicketSinPagoServicios # IvaTotalTicketSinPagoServicios
+                 0              1                     2                                3
+            TotalTicket     ->  Importe total del ticket (incluye el iva).
+
+            IvaTotalTicket  ->  Iva del total de ticket (que esta sumado en TotalTicket).
+
+            TotalTicketSinPagoServicios ->  Total del ticket excluyendo los pagos de
+                servicios (incluye el iva). Si no hubo pago de servicios es igual que
+                TotalTicket.
+
+            IvaTotalTicketSinPagoServicios  ->  Iva del importe anterior (que esta sumado a
+                TotalTicketSinPagoServicios).
+
+            Ejemplo de total de ticket sin pago de servicios con un total de 261.76:
+            L#13#4#181644#261.76#47.21#261.76#47.21
+
+            Ejemplo de un total de ticket con un total de 774.05 que incluye un pago de servicio de
+            774.05 -183.05=591.00 (UTE):
+            L#10#4#153713#774.05#21.97#183.05#21.97
+
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {'totalticket': lin[0],
+                      'ivatotalticket': lin[1],
+                      'totalticketsinpagoservicios': lin[2],
+                      'ivatotalticketsinpagoservicios': lin[3]
+                      }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_5(self):
+        """
+            Línea de cabezal CFE (5)
+
+            Si el sistema utiliza el modo de Comprobante Fiscal Electronico representa los datos del
+            cabezal del documento electronico:
+
+            TipoCFE #  DescripcionCFE # SerieCFE # NumeroCFE # TipoDocumentoReceptor
+               0             1             2           3                4
+            DocumentoReceptor # NombreReceptor # DireccionReceptor # CiudadReceptor
+                  5                   6                 7                 8
+
+            TipoCFE     -> Tipo de comprobante, estos pueden ser:
+                            101 e-Ticket
+                            102 Nota de Crédito de e-Ticket
+                            103 Nota de Débito de e-Ticket
+                            111 e-Factura
+                            112 Nota de Crédito de e-Factura
+                            113 Nota de Débito de e-Factura
+                            181 e-Remito
+                            182 e-Resguardo
+                            201 e-Ticket Contingencia
+                            202 Nota de Crédito de e-Ticket Contingencia
+                            203 Nota de Débito de e-Ticket Contingencia
+                            211 e-Factura Contingencia
+                            212 Nota de Crédito de e-Factura Contingencia
+                            213 Nota de Débito de e-Factura Contingencia
+                            281 e-Remito Contingencia
+                            282 e-Resguardo Contingencia
+
+            DescripcionCFE  -> Descripcion del tipo de CFE (ver arriba).
+
+            SerieCFE        -> Serie del CFE.
+
+            NumeroCFE       -> Número del CFE.
+
+            TipoDocumentoReceptor -> Tipo de documento del receptor del CFE.
+                este campo es opcional en eTicket y obligatorio en eFactura
+                (asímismo en sus recpectivos NdeCr. y NdeDeb.)
+
+                Los valores pueden ser:
+
+                    0: No usado.
+                    2: RUC (Uruguay)
+                    3: C.I. (Uruguay)
+                    4: Otros
+                    5: Pasaporte (todos los países)
+                    6: DNI (documento de identidad de Argentina, Brasil, Chile o Paraguay).
+
+            DocumentoReceptor->Documento del receptor del CFE si es factura.
+
+            NombreReceptor->Nombre del cliente receptor del CFE si es factura.
+
+            DireccionReceptor->Direccion del cliente receptor del CFE si es factura.
+
+            CiudadReceptor-> Ciudad del cliente receptor del CFE si es factura.
+
+            Ejemplo de un tipo Cfe 112 (Nota de credito de una e-Factura), con serie Cfe AA y
+            numero Cfe 5, tipo de documento 2 (Ruc) y numero de RUC 215303240017, a nombre
+            de Objetos T &S cuya direccion es Bacigalupi 2158 en la ciudad de Montevideo.
+            L#1#5#164324#112#Nota de Crédito de e-Factura# AA# 0000005# 2# 215303240017#
+            Objetos T &S # Bacigalupi 2158# Montevideo
+
+            Ejemplo de un tipo de Cfe 101 (e-Ticket) con serie AA y numero 10.
+            L#1#5#181708#101#e-Ticket#AA#0000010#0####
+
+            IdentificadorLinea # NumeroDeLinea # TipoLinea # TimestampLinea # (no se usan)
+
+            TipoCFE #  DescripcionCFE # SerieCFE # NumeroCFE # TipoDocumentoReceptor
+               0             1             2           3                4
+            DocumentoReceptor # NombreReceptor # DireccionReceptor # CiudadReceptor
+                   5                  6                7                   8
+
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'tipocfe'               : lin[0],
+                        'descripcioncfe'        : lin[1],
+                        'seriecfe'              : lin[2],
+                        'numerocfe'             : lin[3],
+                        'tipodocumentoreceptor' : lin[4],
+                        'documentoreceptor'     : lin[5],
+                        'nombrereceptor'        : lin[6],
+                        'direccionreceptor'     : lin[7],
+                        'ciudadreceptor'        : lin[8]
+            }
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_6(self):
+
+        """
+            Línea de pie CFE (6) pie del documento electronico:
+
+            Cliente # LinkDGI # TipoCFE # RucEmisor # NumeroCFE # FechaCFE # MontoNeto # Hash # CodigoCAE # SerieCFE
+               0         1         2         3           4           5           6         7        8           9
+            NroInicioCAE # NroFinCAE # FechaVencimientoCAE
+                10            11                12
+
+            NombreCliente       -> Nombre del cliente de fidelización (no de CFE, puede venir vacio si no aplica).
+            LinkDGI             -> Link al portal DGI.
+            TipoCFE             -> Tipo de CFE.
+            RucEmisor           -> Ruc de quien emite el CFE.
+            NumeroCFE           -> Numero de CFE.
+            FechaCFE            -> Fecha de emision del CFE (AAAAMMDD).
+            MontoNeto           -> Monto neto del CFE.
+            Hash                -> Hash del CFE (los 6 primeros caracteres se utiliza como codigo de seguridad).
+            CodigoCAE           -> Codigo de CAE.
+            NroInicioCAE        -> Rango de inicio de la CAE.
+            NroFinCAE           -> Rango fin de la CAE.
+            FechaVencimientoCAE -> Fecha de vencimiento de la CAE(AAAAMMDDHHmmSS).
+
+            Ejemplo de un Cfe tipo 101 cuyo Ruc Emisor es 210297450018, numero de CFE 284, con fecha de emision del CFE 2015/11/11 con un monto neto de 699.00, el hash del CFE es aeSfsWawQz4h9d1XuHnxW24eLNQ= , el codigo de CAE 90115003001,serie de Cfe AC, numero de inicio de rango de CAE 1 y fin 10000 con fecha de vencimiento 2015/12/31/ 00:00:00
+
+            L#12#6#170634# #https://www.efactura.dgi.gub.uy/consultaQR/cfe?#101#210297450018#0000284#2015 1111#699.00#aeSfsWawQz4h9d1XuHnxW24eLNQ=#90115003001#AC#1#10000#20 151231000000
+
+        """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                'cliente'             : lin[0],
+                'linkdgi'             : lin[1],
+                'tipocfe'             : lin[2],
+                'rucemisor'           : lin[3],
+                'numerocfe'           : lin[4],
+                'fechacfe'            : lin[5],
+                'montoneto'           : lin[6],
+                'hash'                : lin[7],
+                'codigocae'           : lin[8],
+                'seriecfe'            : lin[9],
+                'nroiniciocae'        : lin[10],
+                'nrofincae'           : lin[11],
+                'fechavencimientocae' : lin[12]
+            }
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_7(self):
+        """
+            Línea de identificación de la cajera (7).
+            ----------------------------------------
+
+            CodigoCajera # Nombre
+            0.Código
+            1.Nombre
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = { 'codigocajera': lin[0], 'nombrecajera': lin[1] }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_9(self):
+        """
+        Línea de pago de ticket en efectivo (9).
+        ---------------------------------------
+
+        CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+               0                1                 2
+
+        TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                    3                               4
+
+
+        TotalPagadoMonedaReferencia # Cambio # TipoOperacion # LineaUltimoPago #
+                    5                    6          7                8
+
+        AutorizaSupervisora # CodigoSupervisora # LineaCancelada
+                 9                    10                11
+
+        0. Código del medio de pago.
+        1. Código de la moneda.
+        2. Monto total de lo que se puede pagar con el medio de pago moneda.
+        3. Idem que el anterior pero expresado en la moneda de referencia.
+        4. Total entregado de ese medio de pago-moneda.
+        5. Total entregado expresado en la moneda de referencia.
+        6. Cambio de la línea de pago (valor >= 0.00)
+        7. Codigo de Operacion.
+                0 - Si corresponde a una venta (los importes van en positivo).
+                1 - Si corresponde a una devolución por parte del cliente (los
+                    importes van en negativo).
+        8. Ultimo pago.
+                0 - No es la línea del último pago. Esto sucede cuando el ticket
+                    se paga con múltiples pagos (inclusive de distintos medios
+                    de pago-monedas) cuando el importe abonado es menor al
+                    total a pagar.
+                1 - Es la línea del último pago.
+        9. Intervención supervisor.
+                0 - Línea de pago sin intervención de supervisor.
+                1 - Línea de pago autorizada por supervidor.
+       10. Código de la supervisora.
+       11. Estado de la línea de pago.
+            0-Línea de pago no cancelada.
+            1-Línea de pago cancelada.
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                'codigomediopago'                       : lin[0],
+                'codigomoneda'                          : lin[1],
+                'totalmediopagomoneda'                  : lin[2], # monto pagable en éste medio de pago expresado en la moneda usada.
+                'totalmediopagomonedamonedareferencia'  : lin[3], # lo mismo pero expresado en mon.referencia (PESOS)
+                'totalpagado'                           : lin[4], # Total recibido en la moneda usada.
+                'totalpagadomonedareferencia'           : lin[5], # lo mismo pero expresado en moneda de referencia (PESOS)
+                'cambio'                                : lin[6],
+                'tipooperacion'                         : lin[7],
+                'lineaultimopago'                       : lin[8],
+                'autorizasupervisora'                   : lin[9],
+                'codigosupervisora'                     : lin[10],
+                'lineacancelada'                        : lin[11],
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_10(self):
+        """ Cabezal de un combo """
+        pass
+
+
+    def lt_11(self):
+        """Detalle de combo"""
+        pass
+
+
+    def lt_12(self):
+        """
+            Línea de cancelación de ítem (12).
+            ----------------------------------
+
+            La línea de cancelación de un artículo se produce cuando se cancela
+            una línea registrada de venta de artículo.
+
+            CodigoArtSubf # NroLineaVta # Importe # IndicadorArtSubf # NombreSupervisora # CodigoVendedor
+                  0             1            2              3                 4                 5
+            CodigoArtSubf-> Código del artículo o subfamilia que se cancela.
+            NroLineaVta-> Número de línea de venta que se cancela.
+                          Esto sirve para indicar cuando hay mas de un artículo
+                          de mismo código en la venta y se cancelo uno en particular.
+                          Este numero de línea de venta no corresponde a NumeroDeLinea
+                          (segundo campo) que es el numero de línea de ticket,
+                          sino al numero de línea de venta de tipo 1 (es decir, el numero
+                          de línea de venta de tipo 1 del ticket), o sea hay que contar
+                          los tipos de línea de venta 1 para llegar a la línea de venta
+                          cancelada.
+            Importe-> Importe cancelado. Es a nivel informativo, ya que debe coincidir con
+                      el importe de la línea de venta.Incluye Iva.
+            IndicadorArtSubf-> A-Cancelación de artículo.
+                               S-Cancelación de Subfamilia.
+                               C-Cancelación de Cobranza.
+                               T-Cancelación de artículo de tandem.
+            NombreSupervisora-> Nombre de la supervisora que intervino en la cancelación
+                                (también a nivel informativo).
+            CodigoVendedor-> Código de vendedor si la caja está configurado para utilizar vendedor.
+                             Si no hay vendedor va vacío.
+
+            Ejemplo de una línea de venta del artículo 241800, de importe 11.20 que fue cancelada (1):
+            L#6#1#191524#241800#1.000#9.18#2.02#9.18#2.02#9.18#2.02#9.18#2.02#9.18#2.02#0#1#1######0
+            El artículo 241800 fue cancelado, corresponde a la primera línea de venta,
+            el importe cancelado es de 11,20 (que también coincide con el importe de
+            la línea de venta 9.18 + 2.02).
+            El código de vendedor es 12:
+            L#8#12#191524#241800#1#-11.20#A#Supervisora Uno#12
+            Ejemplo de cancelación de subfamilia 3 por 250 pesos, sin código de vendedor.
+            L#9#12#133552#3#1#-250.00#S#Supervisora Uno#
+            La línea de venta de subfamilia 3 (tipo 30) que fue cancelada es:
+            L#7#30#133552#3#1.000#204.92#45.08#204.92#45.08#204.92#45.08##1#0
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                    'codigoarticulosubf'     : lin[0],
+                    'nrolineavta'            : lin[1],
+                    'importe_cancelado'      : lin[2],
+                    'indicadorartsubf'       : lin[3],
+                    'nombresupervisora'      : lin[4],
+                    'codigovendedor'         : lin[5],
+            }
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_13(self):
+        """Descuento a un ítem"""
+        pass
+
+
+    def lt_15(self):
+        """Puntos generados de fidelización por el ítem"""
+        pass
+
+
+    def lt_16(self):
+        """Puntos totales de fidelización generados"""
+        pass
+
+
+    def lt_18(self):
+        """Regalo de artículos"""
+        pass
+
+
+    def lt_19(self):
+        """Cupón"""
+        pass
+
+
+    def lt_20(self):
+        """
+            Línea de devolución de un ítem (20) -SM.
+            Representa la línea de devolución de artículos.
+            IdentificadorLinea # NumeroDeLinea # TipoLinea # TimestampLinea #
+            CodigoArticuloSubf # Cantidad # Precio # Iva # IndicadorArtSubf # CodigoSupervisora # CodigoArticuloOriginal
+                    0                1         2       3          4                   5                     6
+            ModoIngreso # CodigoVendedor # LineaCancelada # PrecioDescuento # IvaDescuento # CodigoIva # PrecioInicial
+                 7              8               9                 10               11            12           13
+            IvaPrecioInicial
+                  14
+
+            CodigoArticuloSubf              ->  Código de artículo/subfamilia.
+            Cantidad                        ->  Cantidad de ítems devueltos.
+            Precio                          ->  Precio del ítem (en negativo).El precio no siempre puede coincidir con
+                                                el de venta (si es que se vendió, pues puedo devolver un artículo que
+                                                no es parte de la venta), pues se puede imputar un precio distinto al
+                                                de lista (generalmente sucede cuando el artículo tuvo descuentos o
+                                                estaba de oferta).
+            Iva                             ->  Iva del ítem (en negativo).
+            IndicadorArtSubf                ->  A - Devolución de artículo.
+                                                S - Devolución de subfamilia.
+            CodigoSupervisora               ->  Código de la supervisora.
+            CodigoArticuloOriginal          ->  Es el código original del artículo que ingresó la cajera, ya sea el
+                                                código de barras entero o el código digitado manualmente.
+            ModoIngreso                     ->  Modo de ingreso del artículo/subfamilia. Son los siguientes:
+                                                0 - De teclado.
+                                                1 - De scanner.
+                                                2 - Lectora de banda magnética.
+            CodigoVendedor                  ->  Código de vendedor si la caja está configurado para utilizar
+                                                vendedor. Si no hay vendedor va vacío.
+
+            LineaCancelada                  ->  0 - Línea no cancelada.
+                                                1 - Línea cancelada. La devolución del item fue cancelada y no debe ser
+                                                tomada en cuenta como valor contable.
+            PrecioDescuento                 ->  Precio del Articulo con sus cantidades ya con descuentos aplicados.
+            IvaDescuento                    ->  Contiene el IVA del articulo con sus cantidades ya con descuentos
+                                                aplicados.
+            CodigoIva                       ->  Codigo de iva.
+
+
+            Ejemplo de la línea de venta del artículo 972197 por 235.30 pesos y 51.76 de iva.
+            L#7#1#154232#972197#1.000#235.30#51.76#235.30#51.76 #235.30#51.76 #235.30#51.76#235.30#51.76 #0#0#0######0#1
+
+            Devolución del mismo artículo, con código de vendedor 12:
+            L#9#20#154232#972199#1.000#-235.30#-51.76#A#1#972199#1#12#0#-235.30#-51.76#1#-235.30#-51.76
+
+            Línea de devolución de un ítem (20) -SM. Representa la línea de devolución de artículos.
+
+
+
+        CodigoArticuloSubf # Cantidad # Precio # Iva # IndicadorArtSubf # CodigoSupervisora # CodigoArticuloOriginal #
+                0               1          2      3           4                 5                        6
+        ModoIngreso # CodigoVendedor # LineaCancelada # PrecioDescuento # IvaDescuento # CodigoIva
+              7           8                   9              10                11            12
+
+        """
+
+        #if self.id_linea ==  '20171204001841611545328':
+        #    import ipdb;ipdb.set_trace()
+
+        lin = self.esta_linea or False
+        result = {}
+        try:
+            result = dict(  codigoarticulosubf      = lin[ 0] or None,
+                            cantidad                = lin[ 1] or None,
+                            precio                  = lin[ 2] or None,
+                            iva                     = lin[ 3] or None,
+                            indicadorartsubf        = lin[ 4] or None,
+                            codigosupervisora       = lin[ 5] or None,
+                            codigoarticulooriginal  = lin[ 6] or None,
+                            modoingreso             = lin[ 7] or None,
+                            codigovendedor          = lin[ 8] or ' ',
+                            lineacancelada          = lin[ 9] or None,
+                            preciodescuento         = lin[10] or None,
+                            ivadescuento            = lin[11] or None,
+                            codigoiva               = lin[12] or None,
+                        )
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_21(self):
+        """Entrada de cajera"""
+        pass
+
+
+    def lt_22(self):
+        """Salida de cajera"""
+        pass
+
+
+    def lt_23(self):
+        """Pausa de cajera"""
+        pass
+
+
+    def lt_24(self):
+        """Cancelacion ticket"""
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {'texto': lin[0]}
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_26(self):
+        """Cabezal de beneficio al total"""
+        pass
+
+
+    def lt_27(self):
+        """Detalle de un beneficio al total"""
+        pass
+
+
+    def lt_28(self):
+        """Descuento al total"""
+        pass
+
+
+    def lt_29(self):
+        """ Línea de devolución de envases (29).
+            Representa las líneas de ticket de devolución de envases.
+            IdentificadorLinea # NumeroDeLinea # TipoLinea # TimestampLinea # Importe # Iva
+            Importe->Importe de la devolución de envases.
+            Iva->Iva del importe.
+            Ejemplo de devolución de envases por 8.20 + 1.80 = 10.00
+            L#6#29#160110#8.20#1.80
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                'importe': lin[0],
+                'iva'    : lin[1]
+            }
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+    def lt_30(self):
+
+        """
+            Línea de venta a la subfamilia (30).
+            -----------------------------------
+
+            Representa las líneas de tickets de venta por imputación a una subfamilia.
+
+            Código-> Código de la subfamilia.
+            Cantidad-> Cantidad imputada a la subfamilia.
+            Precio-> Precio imputado a la subfamilia.
+            Iva-> Iva del precio.
+            ImporteDescuento-> Importe de la línea a la cual se aplicó un descuento directo. Si esta es igual a Precio la línea no fue afectada por un descuento directo.
+            IvaDescuento-> Iva del descuento.
+            ImporteDescuentoTotal-> Importe de la línea la cual fue afectada por un descuento al total. Si bien es un descuento al total, se prorratea a las líneas. Si esta es igual a ImporteDescuento la línea no fue afectada por un descuento al total.
+            IvaImporteDescuentoTotal-> Iva del importe del descuento al total.
+            CodigoVendedor-> Código de vendedor si aplica, sino va vacío.
+            LineaCancelada-> 0-Línea no cancelada.
+                            1-Línea cancelada.
+                                Este tipo de línea no tiene valor contable.
+                                A pesar que pudo haber sido afectada por descuentos, esta no se debe tomar en cuenta.
+            ModoIngreso-> Modo de ingreso del artículo. Son los siguientes:
+                            0-De teclado.
+                            1-De scanner.
+                            2-Lectora de banda magnética.
+
+            Código # Cantidad # Precio # Iva # ImporteDescuento # IvaDescuento # ImporteDescuentoTotal # IvaImporteDescuentoTotal # CodigoVendedor # LineaCancelada # ModoIngreso
+               0         1        2       3           4                5                 6                          7                     8               9               10
+            Ejemplo de una venta a la subfamilia 3 con cantidad unitaria, por in importe de 18.85 + 4.15 = 23.00, el cual no tuvo ni descuentos directos ni al total, sin vendedor, la línea no está cancelada y se ingresó por teclado.
+            L#8#30#160219#3#1.000#18.85#4.15#18.85#4.15#18.85#4.15##0#0
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                 'codigo'                   : lin[0],
+                 'cantidad'                 : lin[1],
+                 'precio'                   : lin[2],
+                 'iva'                      : lin[3],
+                 'importedescuento'         : lin[4],
+                 'ivadescuento'             : lin[5],
+                 'importedescuentototal'    : lin[6],
+                 'ivaimportedescuentototal' : lin[7],
+                 'codigovendedor'           : lin[8],
+                 'lineacancelada'           : lin[9],
+                 'modoingreso'              : lin[10]
+                }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_32(self):
+        pass
+
+
+    def lt_33(self):
+        pass
+
+
+    def lt_34(self):
+        pass
+
+
+    def lt_35(self):
+        pass
+
+
+    def lt_36(self):
+        pass
+
+
+    def lt_37(self):
+        """
+        Pago con tarjeta
+        ----------------
+
+
+         0. Código del medio de pago.
+         1. Código de la moneda.
+         2. Monto total de lo que se puede pagar con el medio de pago moneda.
+         3. Idem que el anterior pero expresado en la moneda de referencia.
+         4. Total entregado de ese medio de pago-moneda.
+         5. Total entregado expresado en la moneda de referencia.
+         6. Cambio de la línea de pago (valor >= 0.00)
+         7. Codigo de Operacion.
+                 0 - Si corresponde a una venta (los importes van en positivo).
+                 1 - Si corresponde a una devolución por parte del cliente (los
+                     importes van en negativo).
+         8. Ultimo pago.
+                 0 - No es la línea del último pago. Esto sucede cuando el ticket
+                     se paga con múltiples pagos (inclusive de distintos medios
+                     de pago-monedas) cuando el importe abonado es menor al
+                     total a pagar.
+                 1 - Es la línea del último pago.
+         9. Numero de la tarjeta.
+        10. Cuotas.
+        11. Nro. de autorización del emisor.
+        12. Tipo de tarjeta - undocumented.
+        13. Intervención supervisor.
+                  0 - Línea de pago sin intervención de supervisor.
+                  1 - Línea de pago autorizada por supervidor.
+        15. Código de la supervisora.
+        15. Estado de la línea de pago.
+             0-Línea de pago no cancelada.
+             1-Línea de pago cancelada.
+        16. Plan utilizado por la tarjeta.
+        17. Numero de comercio al que pertenece el socio titular de la tarjeta.
+        18. Si aplica ley descuento iva
+        19. Monto Descuento Ley Iva
+        20. Texto Ley
+        21. Tarjeta de Debito/Credito.
+                 0 - No especificado.
+                 1 - La tarjeta es de credito.
+                 2 - La tarjeta es de debito.
+
+        CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+               0              1                   2
+
+        TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                        3                           4
+
+        TotalPagadoMonedaReferencia # Cambio # TipoOperacion # LineaUltimoPago #
+               5                         6           7             8
+
+        NumeroTarjetaCredito # CuotasTarjetaCredito #
+            9                   10
+
+        NumeroAutorizacionTarjetaCredito # TipoTarjetaCredito # AutorizaSupervisora  #
+                  11                              12                  13
+
+        CodigoSupervisora # LineaCancelada # Plan # NroComercio #
+                14                  15        16       17
+
+        SiAplicaLeyDescIva # MontoDescuentoLeyIva # # TextoLey # SiEsDebitoCredito
+              18                      19                  20            21
+
+
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                    'codigomediopago'                      : lin[0],
+                    'codigomoneda'                         : lin[1],
+                    'totalmediopagomoneda'                 : lin[2],
+                    'totalmediopagomonedamonedareferencia' : lin[3],
+                    'totalpagado'                          : lin[4],
+                    'totalpagadomonedareferencia'          : lin[5],
+                    'cambio'                               : lin[6],
+                    'tipooperacion'                        : lin[7],
+                    'lineaultimopago'                      : lin[8],
+                    'numerotarjetacredito'                 : lin[9],
+                    'cuotastarjetacredito'                 : lin[10],
+                    'numeroautorizaciontarjetacredito'     : lin[11],
+                    'tipotarjetacredito'                   : lin[12],
+                    'autorizasupervisora'                  : lin[13],
+                    'codigosupervisora'                    : lin[14],
+                    'lineacancelada'                       : lin[15],
+                    'plan'                                 : lin[16],
+                    'nrocomercio'                          : lin[17],
+                    'siaplicaleydesciva'                   : lin[18],
+                    'montodescuentoleyiva'                 : lin[19],
+                    'textoley'                             : lin[20],
+                    'siesdebitocredito'                    : lin[21]
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_38(self):
+        """
+            Línea de pago con cheque (38)-SM.
+            --------------------------------
+
+            Línea de ticket cuando se paga con cheque. Cuando un cliente paga
+            con cheques, el mismo debe estar autorizado con un identificador
+            (campo idCliente).
+
+            0. Código del medio de pago.
+            1. Código de la moneda.
+            2. Monto total de lo que se puede pagar con el medio de pago moneda.
+            3. Idem que el anterior pero expresado en la moneda de referencia.
+            4. Total entregado de ese medio de pago-moneda.
+
+            5. Total entregado de ese medio de pago-moneda.
+            6. Total entregado expresado en la moneda de referencia.
+
+            7. Cambio de la línea de pago
+                    0 - Venta (valor >= 0.00 )
+                    1 - Devolución por parte del cliente (valor < 0.00 )
+
+            8. Lin. Ultimo Pago
+                    0 - No es la línea del último pago. Esto sucede cuando el
+                        ticket se paga con múltiples pagos (inclusive de
+                        distintos medios de pago-monedas) cuando el importe
+                        abonado es menor al total a pagar.
+                    1 - Es la línea del último pago.
+
+            9. Tipo de Cliente.
+           10. Identificación cliente.
+           11. Supervisora
+                       0 - La línea de pago no tuvo autorización de la
+                           supervisora.
+                       1 - La línea de pago tuvo autorización de la supervisora.
+
+           12. Código de la supervisora (vacío si no aplica)
+           13. Linea cancelada
+                       0 - Línea de pago no cancelada.
+                       1 - Línea de pago cancelada.
+
+            Indices:
+            -------
+
+            CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+                  0                 1                2
+
+            TotalMedioPagoMonedaMonedaReferencia #  TotalPagado #
+                             3                               4
+
+            TotalPagadoMonedaReferencia # Cambio # TipoOperacion #
+                        5                   6           7
+
+            LineaUltimoPago # TipoCliente # IdCliente # AutorizaSupervisora #
+                    8               9           10          11
+
+            CodigoSupervisora # LineaCancelada
+                  12                  13
+
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'codigomediopago'                       : lin[0],
+                        'codigomoneda'                          : lin[1],
+                        'totalmediopagomoneda'                  : lin[2],
+                        'totalmediopagomonedamonedareferencia'  : lin[3],
+                        'totalpagado'                           : lin[4],
+                        'totalpagadomonedareferencia'           : lin[5],
+                        'cambio'                                : lin[6],
+                        'tipooperacion'                         : lin[7],
+                        'lineaultimopago'                       : lin[8],
+                        'tipocliente'                           : lin[9],
+                        'idcliente'                             : lin[10],
+                        'autorizasupervisora'                   : lin[11],
+                        'codigosupervisora'                     : lin[12],
+                        'lineacancelada'                        : lin[13]
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_40(self):
+        """
+
+         Línea de pago luncheon ticket (40) SM.
+         -------------------------------------
+
+         0 Código del medio de pago.
+         1 Código de la moneda.
+         2 Monto total de lo que se puede pagar con el medio de pago moneda.
+         3 Idem que el anterior pero expresado en la moneda de referencia.
+         4 Total entregado de ese medio de pago-moneda.
+         5 Total entregado expresado en la moneda de referencia.
+         6 Cambio de la línea de pago (valor >= 0.00 5).
+         7 TipoOperacion.
+             0 - Venta ( importes > 0.00).
+             1 - Devolución ( importes < 0.00).
+         8 LineaUltimoPago.
+             0 - No es la línea del último pago. Esto sucede cuando el ticket
+                 se paga con múltiples pagos (inclusive de distintos medios de
+                 pago-monedas) cuando el importe abonado es menor al total a pagar.
+             1 - Es la línea del último pago.
+         9 CodigoBarra.
+             1 - código de barras del cupón.
+             0 - monto total de los cupones o el codigo de barras ingresado
+                 manualmente de ese cupon.
+        10 ModoIngresoCupon.
+             0 - Teclado.Este modo de ingreso se efectua cuando la cajera
+                 ingresa el monto del total de los cupones o el codigo de
+                 barras de ese cupon.
+             1 - Scanner.Cuando se procesan los cupones por scanner, validando
+                 los mismos.
+        11 AutorizaSupervisora.
+             0 - La línea de pago no tuvo autorización de la supervisora.
+             1 - La línea de pago tuvo autorización de la supervisora.
+        12 CodigoSupervisora.
+        13 Código de la supervisora (vacío si no aplica)
+        14 LineaCancelada.
+             0 - activa.
+             1 - cancelada.
+
+
+        Indices:
+        -------
+
+        CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+             0                  1                 2
+
+        TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                        2                           4
+
+        TotalPagadoMonedaReferencia # Cambio # TipoOperacion #
+                    5                   6           7
+
+        LineaUltimoPago# CodigoBarra # ModoIngresoCupon # AutorizaSupervisora #
+                8           9               10                  11
+
+        CodigoSupervisora # LineaCancelada
+            12                  13
+        """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'codigomediopago'                       : lin[0],
+                        'codigomoneda'                          : lin[1],
+                        'totalmediopagomoneda'                  : lin[2],
+                        'totalmediopagomonedamonedareferencia'  : lin[3],
+                        'totalpagado'                           : lin[4],
+                        'totalpagadomonedareferencia'           : lin[5],
+                        'cambio'                                : lin[6],
+                        'tipooperacion'                         : lin[7],
+                        'lineaultimopago'                       : lin[8],
+                        'codigobarra'                           : lin[9],
+                        'modoingresocupon'                      : lin[10],
+                        'autorizasupervisora'                   : lin[11],
+                        'codigosupervisora'                     : lin[12],
+                        'lineacancelada'                        : lin[13]
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_43(self):
+
+        """
+            Línea de voucher de la tarjeta (43)-SM.
+            Muestran la información de un Voucher de Pago cuando se paga con Tarjeta de Crédito/Debito.
+            La mayoría de la información aquí presentada la retorna el autorizador y Jswitch
+            (Referirse al documento Especificaciones jSwitch.doc por posibles cambios).
+
+            IdentificadorLinea* # NumeroDeLinea* # TipoLinea* # TimestampLinea* # NombreEmisorTarjeta #
+            NumeroTarjeta # Vencimiento # Comprobante # Autorizacion # Plan # CantidadCuotas          #
+            CodigoTerminal # CodigoComercio # TipoAutorizacion # NroLote # CodigoMoneda               #
+            TipoTransaccion # TipoVoucher # ImportePago # FechaTransacccion # CodigoCaja*             #
+            CodigoCajera* # NombrePropietario # TipoIngreso # DescuentaIvaRestaurante                 #
+            SiEsDebitoCredito # CardType # SaldoGift # TipoTarjetaCredito2 # DescuentoAfam            #
+            SiAplicaLeyDescIva # MontoDescuentoLeyIva # MontoTicket # MontoGravado                    #
+            FlagImprimeFirma
+
+            *Datos que no provienen de la autorizadora.
+
+            NombreEmisorTarjeta         -> Nombre emisor de la tarjeta.
+            NumeroTarjeta               -> Número de la tarjeta de crédito.
+            Vencimiento                 -> Vencimiento de la tarjeta de crédito (aamm).
+            Comprobante                 -> Número de comprobante.
+            Autorizacion                -> Número de autorización.
+            Plan                        -> Código de plan asociado.
+            CantidadCuotas              -> Cantidad de cuotas.
+            CodigoTerminal              -> Código de la terminal asociado.
+            CodigoComercio              -> Código de comercio asociado.
+            TipoAutorizacion            -> Tipos : 00-Online;
+                                                   01-Offline;
+                                                   20-Online aplica ley descuento IVA;
+            NroLote                     -> Número de lote asociado.
+            CodigoMoneda                -> Código de la moneda asociado.
+                                                   00-Pesos
+                                                   01-Dólares.
+            TipoTransaccion             -> Tipo de transacción asociado (MTI).
+                                                   1200 - Compra
+                                                   1220 - Confirmación Compra
+                                                   1240 - Notificación de Compra
+                                                   1400 - Devolución (Total o parcial)
+                                                   1420 - Confirmación Devolución
+                                                   1440 - Notificación de Devolución
+                                                   9xxx - Entrenamiento
+            TipoVoucher                 -> Tipo de voucher asociado.
+                                                   0-Original Cliente.
+                                                   1-Vía Establecimiento.
+            ImportePago                 -> Importe pagado por la tarjeta de crédito.
+            FechaTransacccion           -> Fecha de transacción de la autorización.
+            CodigoCaja*                 -> Código de la caja.
+            CodigoCajera*               -> Código de la cajera.
+            NombrePropietario           -> Nombre del propietario de la tarjeta de crédito.
+            TipoIngreso                 -> Tipo de ingreso asociado.
+                                                   0-Lectura magnética.
+                                                   1-Entrada manual
+                                                   2-Internet.
+            DescuentaIvaRestaurante     -> Descuento restaurante
+                                                   0 - No tiene descuento iva por ley 17934.
+                                                   1 - Tiene descuento iva por ley 17934.
+            SiEsDebitoCredito           -> Tipo de la tarjeta de crédito:
+                                                   0-Nada.
+                                                   1-Crédito.
+                                                   2-Débito.
+            CardType                    -> Card Type retornado por el autorizador.
+            SaldoGift                   -> Saldo de la tarjeta Gift (vacio si no es tarjeta gift).
+            TipoTarjetaCredito2         -> Tipo de tarjeta de credito (redundante con TipoTarjetaCredito)
+                                                   1-Crédito
+                                                   2-Débito.
+                                                   3-Gift
+            4-Afam
+            DescuentoAfam               -> Importe del descuento aplicado si la tarjeta es Afam (0.00 si no aplica).
+            SiAplicaLeyDescIva          -> Flag que indica si se aplica la ley 19210 de inclusión financiera de descuento de iva.
+                                                   0 - No aplica ley de descuento de iva.
+                                                   1 - Aplica ley de descuento de iva.
+            MontoDescuentoLeyIva        -> Monto del descuento de Iva (en negativo).
+            MontoTicket                 -> Monto del ticket.
+            MontoGravado                -> Monto gravado sin Iva del ticket.
+            FlagImprimeFirma            ->         0 - No se solicita la firma.
+                                                   1 - Se solicita la firma.
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'nombreemisortarjeta'       : lin[0],
+                        'numerotarjeta'             : lin[1],
+                        'vencimiento'               : lin[2],
+                        'comprobante'               : lin[3],
+                        'autorizacion'              : lin[4],
+                        'plan'                      : lin[5],
+                        'cantidadcuotas'            : lin[6],
+                        'codigoterminal'            : lin[7],
+                        'codigocomercio'            : lin[8],
+                        'tipoautorizacion'          : lin[9],
+                        'nrolote'                   : lin[10],
+                        'codigomoneda'              : lin[11],
+                        'tipotransaccion'           : lin[12],
+                        'tipovoucher'               : lin[13],
+                        'importepago'               : lin[14],
+                        'fechatransaccion'          : lin[15],
+                        'codigocaja'                : lin[16],
+                        'codigocajera'              : lin[17],
+                        'nombrepropietario'         : lin[18],
+                        'tipoingreso'               : lin[19],
+                        'descuentaivarestaurante'   : lin[20],
+                        'siesdebitocredito'         : lin[21],
+                        'cardtype'                  : lin[22],
+                        'saldogift'                 : lin[23],
+                        'tipotarjetacredito2'       : lin[24],
+                        'descuentoafam'             : lin[25],
+                        'siaplicaleydesciva'        : lin[26],
+                        'montodescuentoleyiva'      : lin[27],
+
+                        'montoticket'               : lin[28],
+                        'montogravado'              : lin[29],
+                        'flagimprimefirma'          : lin[30]
+            }
+
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_44(self):
+        pass
+
+
+    def lt_47(self):
+        """
+        Línea de pago de servicio (47) -cuenta corriente-
+
+        Representa las líneas de los pagos de servicios .
+        Código         -> Código del pago de servicio
+        Monto          -> Importe del pago de servicio.
+        Moneda         -> Código de moneda.
+        ModoIngreso    -> 0-Teclado. 1-Scanner. 2-Banda magnética.
+        CodigoVendedor -> Código de vendedor si la caja está configurado para utilizar vendedor.Si no hay vendedor va vacío.
+        Referencia     -> Referencia del pago de servicio.Esta se compone de dos partes,los primeros 10 dígitos corresponde al número de factura, los siguientes 10 dígitos al número de cuenta.Puede venir vacio.
+        LineaCancelada -> 0 - Línea de pago no cancelada. 1 - Línea de pago cancelada. No tiene valor contable.
+
+        C#1#4#1294#131#20151218113128#F#0#15603.00#20#12
+        L#1#5#113128#
+        L#3#7#113128#131#SHIRLEY BRAVO
+        L#4#53#113128#TICKET DE VENTA#0
+        L#5#57#113128#20##0###
+        L#6#47#113128#1#15602.83#1#0###0
+        L#7#68#113143#4580#ROIG ELBIO##JUAN M.GUTIERREZ 1643 -21490###1#0
+        L#8#4#113229#15602.83#0.00#0.00#0.00
+        L#9#63#113229#15602.83#0.17#15603.00#1#1
+        L#10#9#113229#1#1#15603.00#15603.00#15603.00#15603.00#0.00#0#1#0##0
+
+        ticket = {
+            ('C', '1', '4', '1294', '131', '20151218113128', 'F', '0', '15603.00', '20', '12') :
+                ['L', '1', '5', '113128', ''],
+                ['L', '3', '7', '113128', '131', 'SHIRLEY BRAVO'],
+                ['L', '4', '53', '113128', 'TICKET DE VENTA', '0'],
+                ['L', '5', '57', '113128', '20', '', '0', '', '', ''],
+            --> ['L', '6', '47', '113128', '1', '15602.83', '1', '0', '', '', '0'], <--
+                ['L', '7', '68', '113143', '4580', 'ROIG ELBIO', '', 'JUAN M.GUTIERREZ 1643 -21490', '', '', '1', '0'],
+                ['L', '8', '4', '113229', '15602.83', '0.00', '0.00', '0.00'],
+                ['L', '9', '63', '113229', '15602.83', '0.17', '15603.00', '1', '1'],
+                ['L', '10', '9', '113229', '1', '1', '15603.00', '15603.00', '15603.00', '15603.00', '0.00', '0', '1', '0', '', '0']
+         }
+
+            Código # Monto # Moneda # ModoIngreso # CodigoVendedor # Referencia # LineaCancelada
+               0       1       2          3               4              5              6
+        """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                               'codserviciopagado'        : lin[0], # '1' = cta.cte
+                               'importecobranza'          : lin[1],
+                               'codigomoneda'             : lin[2],
+                               'modoingreso'              : lin[3],
+                               'codigovendedor'           : lin[4],
+                               'referencia'               : lin[5],
+                               'lineacancelada'           : lin[6]
+                }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_49(self):
+        pass
+
+
+    def lt_52(self):
+        """
+            Línea de pago de caja (52).
+            Representa la linea de pago de caja (similar a un retiro pero se
+            utiliza para pagos puntuales como pago a proveedores, taxis, etc.).
+
+
+            IdentificadorLinea # NumeroDeLinea # TipoLinea # TimestampLinea # Codigo # Importe
+            Codigo->Código del rubro de pago de caja.
+            Importe->Importe del pago de caja.
+            Ejemplo de un pago de caja con codigo 1 y monto de 150.00 pesos
+        """
+        lin = self.esta_linea or False
+
+        result = dict()
+        try:
+            result.update(dict( codigo  = lin[0], importe = lin[1] ))
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+
+    def lt_53(self):
+        """
+            Línea tipo de ticket (53)-SM.
+            '''''''''''''''''''''''''''''
+
+            Representa la línea del `tipo de ticket`
+            y si se trata de un ticket normal o excento de iva.
+
+            DescripcionTipoTicket Descripcion del tipo de ticket.
+            TipoVenta             1 - El ticket esta excento de iva.
+                                  0 - Ticket normal.
+            Indices:
+            ''''''''
+
+            DescripcionTipoTicket # TipoVenta
+                    0                   1
+
+            Por ahora, este último campo sirve para los tickets de venta y
+            devolución.
+        """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'descripciontipoticket': lin[0],
+                        'tipoventa'            : lin[1]
+                }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_55(self):
+
+        """Intervensión Supervidora"""
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {'codigosuper': lin[0],
+                      'nombresuper': lin[1]}
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_56(self):
+        pass
+
+
+    def lt_57(self):
+        """
+            Línea de tipo de cliente (57)-SM
+            --------------------------------
+
+            Representa el detalle del tipo de cliente en la venta.
+
+            0 Nombre del cliente (vacio si no aplica).
+            1 Número del cliente interno (vacio si no aplica).
+            2 Tipo de cliente interno.
+                0-Productor
+                1-Empleado
+                Vacio-General.
+
+            Indices:
+            --------
+
+            Tipo # NumeroTarjeta # ModoIngreso # Nombre # Numero #  TipoClienteInterno
+              0         1               2           3       4                5
+
+            L#4#57#221300#20##-1###
+
+            NumeroDeLinea # TipoLinea # TimestampLinea # Tipo # NumeroTarjeta # ModoIngreso
+                 4        #    57     #   221300       #   20 #    ''         #    -1
+              # Nombre # Numero # TipoClienteInterno
+              #   ''   #  ''    #    ''
+
+            raw = [4, 57, 221300, 20, '', -1, '', '', '']
+            self.esta_linea = raw[3:]
+            self.esta_linea = [20, '', -1, '', '', '']
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'tipo'                : lin[0],
+                        'numerotarjeta'       : lin[1],
+                        'modoingreso'         : lin[2] if int(lin[2]) >= 0 else '0',
+                        'nombre'              : lin[3],
+                        'numero'              : lin[4],
+                        'tipoclienteinterno'  : lin[5]
+                }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_58(self):
+        pass
+
+
+    def lt_60(self):
+        pass
+
+
+    def lt_61(self):
+        pass
+
+
+    def lt_62(self):
+        pass
+
+
+    def lt_63(self):
+        """
+
+            Línea de redondeo del ticket.
+            ----------------------------
+
+            # ImporteTicket # ImporteRedondeo # ImporteTotalTicket # CodigoMedioPago # CodigoMoneda
+                    0                1                  2                  3                 4
+            ImporteTicket->Importe del total del ticket sin redondeo.
+
+            ImporteRedondeo->Importe del redondeo aplicado.
+
+            ImporteTotalTicket->Importe total del ticket que es ImporteTicket + ImporteRedondeo.
+
+            CodigoMedioPago->Codigo del medio de pago.
+
+            CodigoMoneda->Codigo de la moneda.
+
+            Ejemplo de una línea de redondeo con un importe de ticket de 42.90, al cual se le aplicó
+            un redondeo de 0.10 para obtener un importe total a abonar de 43.00 efectivo-pesos
+            L#9#63#164146#42.90#0.10#43.00#1#1   """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'importeticket'      : lin[0],
+                        'importeredondeo'    : lin[1],
+                        'importetotalticket' : lin[2],
+                        'codigomediopago'    : lin[3],
+                        'codigomoneda'       : lin[4],
+            }
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_65(self):
+        pass
+
+
+    def lt_67(self):
+        pass
+
+
+    def lt_68(self):
+        """
+        Línea de entrega a domicilio (68).
+        Representa la línea de entrega a domicilio (delivery) con los datos del cliente.
+
+        (La usamos para obtener los datos [nombre y número de cuenta] de una cobranza de cta.cte.)
+
+        IdentificadorLinea # NumeroDeLinea # TipoLinea # TimestampLinea # Código # Nombre # Telefono # Direccion # Esquina1 # Esquina2 # Gratis # LineaCancelada
+        Código->Código del cliente.
+        Nombre->Nombre del cliente.
+        Telefono->Telefono del cliente.
+        Direccion->Direccion del cliente.
+        Esquina1->Primera esquina donde se encuentra el cliente.
+        Esquina2->Segunda esquina donde se encuentra el cliente.
+        Gratis-> Según el monto de venta, se cobra el delivery o no y se indica de la siguiente forma:
+        1-El delivery es gratis.
+        0-El delivery se cobra.
+        LineaCancelada->0-Línea no cancelada.
+        1-Línea cancelada. Este tipo de línea no tiene valor contable.
+
+        C#1#4#1294#131#20151218113128#F#0#15603.00#20#12
+        L#1#5#113128#
+        L#3#7#113128#131#SHIRLEY BRAVO
+        L#4#53#113128#TICKET DE VENTA#0
+        L#5#57#113128#20##0###
+        L#6#47#113128#1#15602.83#1#0###0
+        L#7#68#113143#4580#ROIG ELBIO##JUAN M.GUTIERREZ 1643 -21490###1#0
+        L#8#4#113229#15602.83#0.00#0.00#0.00
+        L#9#63#113229#15602.83#0.17#15603.00#1#1
+        L#10#9#113229#1#1#15603.00#15603.00#15603.00#15603.00#0.00#0#1#0##0
+
+        ticket = {
+            ('C', '1', '4', '1294', '131', '20151218113128', 'F', '0', '15603.00', '20', '12') :
+                ['L', '1', '5', '113128', ''],
+                ['L', '3', '7', '113128', '131', 'SHIRLEY BRAVO'],
+                ['L', '4', '53', '113128', 'TICKET DE VENTA', '0'],
+                ['L', '5', '57', '113128', '20', '', '0', '', '', ''],
+                ['L', '6', '47', '113128', '1', '15602.83', '1', '0', '', '', '0'],
+
+           --> ['L', '7', '68', '113143', '4580', 'ROIG ELBIO', '', 'JUAN M.GUTIERREZ 1643 -21490', '', '', '1', '0'], <--
+
+                ['L', '8', '4', '113229', '15602.83', '0.00', '0.00', '0.00'],
+                ['L', '9', '63', '113229', '15602.83', '0.17', '15603.00', '1', '1'],
+                ['L', '10', '9', '113229', '1', '1', '15603.00', '15603.00', '15603.00', '15603.00', '0.00', '0', '1', '0', '', '0']
+            }
+
+            Código # Nombre # Telefono # Direccion # Esquina1 # Esquina2 # Gratis # LineaCancelada
+               0       1          2          3           4          5         6           7
+        """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'codigocliente'                         : lin[0],
+                        'nombrecliente'                         : lin[1],
+                        'telefonocliente'                       : lin[2],
+                        'direccioncliente'                      : lin[3],
+                        'Esquina1'                              : lin[4],
+                        'Esquina2'                              : lin[5],
+                        'enviogratis'                           : lin[6],
+                        'lineacancelada'                        : lin[7]
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_71(self):
+        pass
+
+
+    def lt_72(self):
+        pass
+
+
+    def lt_73(self):
+        """
+            QUIEN DIJO QUE LAS FEAS NO BAILAN, ¿¿ eh ??
+            ===========================================
+
+            Línea de ticket Z (73)
+            Subtipos de líneas que son:
+            Contiene informacion de cabecera de la Z (por lo tanto solamente debe haber solo un sub tipo de línea 1 en el informe Z).
+
+            SubTipo # CodigoCaja # NumeroZ # TotalVenta # TotalPagoServicios # TotalVentaGeneral # GranTotal # CantidadPagoCajas # ImportePagoCajas # ImporteRedondeo
+
+            1) Sub tipo línea Z. (obligatoria, es el cabezal del tipo de línea de detalle Z
+
+                SubTipo -> Sub tipo de línea que es 1.
+                CodigoCaja -> Codigo de la caja.
+                NumeroZ  -> Número emitido de la Z en la caja.
+                TotalVenta -> Total de venta de la caja de mercaderia (incluye ivas pero no los pago de servicios).
+                TotalPagoServicios -> Total de pago de servicios.
+                TotalVentaGeneral -> Total de venta de la caja mas el total de venta de los pagos de servicios (TotalVenta + TotalPagoServicios).
+                GranTotal -> Gran total de la caja en el momento de la emision de la Z.
+                CantidadPagoCajas -> Cantidad de pagos de la caja.
+                ImportePagoCajas -> Importe de pagos de la caja.
+                ImporteRedondeo -> Importe (saldo) del redondeo acumulado en la sesion de la caja.
+
+                Ejemplo de sub tipo de línea 1 de la caja 1, con numero de Z 954, con un total de venta de 1696.80, un total de pago de servicios de 153.00 pesos, un total de venta general de 1849.80 , un gran total de 20125014.50 pesos, se hicieron 2 pagos de caja por un monto de 750.00 pesos y el acumulado de redondeo es 2.00 pesos.
+                    L#1#105#185528#1#1#954#1696.80#153.00#1849.80#20125014.50 # 2 # 750.00 # 2.00
+
+
+            2) Sub tipo línea Iva.
+
+                Representa el subtipo de línea de iva del informe Z.
+                Pueden existir varias líneas de este subtipo, una por cada codigo de iva aplicado en la sesion de venta de la caja.
+                    SubTipo # CodigoCaja # NumeroZ # CodigoIva # VentaBrutaIva # VentaNetaIva # VentaIva
+                SubTipo -> Sub tipo de línea que es 2.
+                CodigoCaja -> Codigo de la caja.
+                NumeroZ  -> Número emitido de la Z en la caja.
+                CodigoIva -> Codigo de Iva.
+                VentaBrutaIva -> Es el total de la venta afectado por ese codigo de iva incluyendo al propio iva (VentaNetaIva + VentaIva).
+                VentaNetaIva -> Es el total de la venta afectado por ese codigo de iva sin incluir al propio iva (VentaBrutaIva – VentaIva).
+                VentaIva -> Importe solo de iva.
+
+                Ejemplo de subtipo de línea 2 de la caja 1, con numero de Z 954 , para el codigo de iva 1, con un total de venta bruta de 1696.80 pesos, 1390.82 de venta neta de iva y 305.98 de venta de iva.
+                    L#2#105#185528#2#1#954#1#1696.80#1390.82#305.98
+                Idem para el codigo de iva 2.
+                    L#3#105#185528#2#1#954#2#2568.90#2335.36#233.54
+
+            3) Sub tipo línea medios de pago-monedas.
+
+                Representa el subtipo de línea de los totales de los medios de pago-monedas (para la venta, para el fondo de caja y retiro) del informe Z. Pueden existir varias líneas de este subtipo, una por cada medio de pago-moneda en la sesion de venta de la caja.
+                SubTipo # CodigoCaja # NumeroZ # CodigoMedioPago # CodigoMoneda # ImporteVenta # ImporteFondo # ImporteRetiro
+                SubTipo -> Sub tipo de línea que es 3.
+                CodigoCaja -> Codigo de la caja.
+                NumeroZ  -> Número emitido de la Z en la caja.
+                CodigoMedioPago -> Código del medio de pago.
+                CodigoMoneda -> Código de la moneda
+                ImporteVenta -> Importe de la venta del medio de pago-moneda.
+                ImporteFondo -> Importe de fondeo para ese medio de pago-moneda.
+                ImporteRetiro -> Importe de retiro para ese medio de pago-moneda.
+
+                Ejemplo del subtipo 3, de la caja 1 para el número de Z 954, del medio de pago 1 y moneda 1, con un total acumulado de 1249.80 en ventas, se hizo un fondeo de 98.00 y un retiro de 47.00.
+                    L#5#105#185528#3#1#954#1#1#1249.80#98.00#47.00
+                Igual que el anterior para el codigo medio de pago 1 moneda 2, que tiene un fondo solamente de 12750.00.
+                    L#4#105#185528#3#1#954#1#2#0.00#12750.00#0.00
+
+            4) Sub tipo línea de pago de servicios.
+
+                Representa el subtipo de línea de los pagos de servicio del informe Z.
+                Pueden existir varias líneas de este subtipo, una por cada pago de servicio en la sesion de la caja.
+                SubTipo # CodigoCaja # NumeroZ # CodigoPagoServicio # CantidadPagos # ImportePagoServicios
+                SubTipo -> Sub tipo de línea que es 4.
+                CodigoCaja -> Codigo de la caja.
+                NumeroZ  -> Número emitido de la Z en la caja.
+                CodigoPagoServicio -> Código del pago de servicio.
+                CantidadPagos -> Cantidad de pagos de servicios
+            """
+
+        # eehh, no bailan, no.
+        pass
+
+
+    def lt_76(self):
+        # Línea de descuento producido por marcas (76)
+        pass
+
+
+    def lt_77(self):
+        # Línea de cabezal de marca (77)
+        pass
+
+
+    def lt_78(self):
+        # Línea de detalle de la marca (78)
+        pass
+
+
+    def lt_81(self):
+        # Línea de devolución de pago de servicio (81)
+        """
+        Línea de devolución de pago de servicio (81).
+        Representa la línea de devolución de un pago de servicio.
+        IdentificadorLinea # NumeroDeLinea # TipoLinea # TimestampLinea #
+
+        Código # Importe # Moneda # ModoIngreso # CodigoSupervisora # CodigoVendedor #
+           0        1        2           3              4                   5
+        Referencia # LineaCancelada
+            6              7
+
+        Código      ->  Código del pago de servicio
+        Importe     ->  Importe de la devolución del pago de servicio (en negativo).
+        Moneda      ->  Código de moneda.
+        ModoIngreso ->  0-Teclado
+                        1-Scanner.
+                        2-Banda magnética.
+        CodigoSupervisora   ->  Código de la supervisora si intervino, sino va vacío.
+        CodigoVendedor      ->  Código de vendedor si la caja está configurado para utilizar
+                                vendedor. Si no hay vendedor va vacío.
+        Referencia          ->  Referencia del pago de servicio.
+        LineaCancelada      ->  0-Línea de devolucion de pago de servicio no cancelada.
+                                1-Línea de devolucion de pago de servicio cancelada.
+                                No se deberia tomar en cuenta como valor contable.
+
+        Ejemplo de la devolucion del servicio 513 por -250.00 de la moneda 1, ingresado por
+        teclado (0) e intervino la supervisora 1, sin vendedor ni referencia y la línea no esta
+        canclada (0).
+        L#7#81#122220#513#-250.00#1#0#1###0
+        """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                'codigo'                : lin[0],
+                'importe'               : lin[1],
+                'moneda'                : lin[2],
+                'modoingreso'           : lin[3],
+                'codigosupervisora'     : lin[4],
+                'codigovendedor'        : lin[5],
+                'referencia'            : lin[6],
+                'lineacancelada'        : lin[7],
+            }
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_82(self):
+        # Línea de consulta de estado de cuenta de la cobranza (82).
+        pass
+
+
+    def lt_83(self):
+        # Línea de voucher de la cobranza. 83
+        pass
+
+
+    def lt_84(self):
+        # Línea de apertura de gaveta.                           84
+        pass
+
+
+    def lt_85(self):
+        # Línea de pago de tarjeta offline (SM).                 85
+        """
+            Línea de pago de tarjeta offline (85) - SM.
+            ===========================================
+
+            Línea de ticket de cuando se paga con tarjeta de crédito pero de modo offline en SM.
+
+
+             0 CodigoMedioPago                         ->  Código del medio de pago.
+
+             1 CodigoMoneda                            ->  Código de la moneda.
+
+             2 TotalMedioPagoMoneda                    ->  Monto total de lo que se puede pagar con
+                                                                el medio de pago moneda.
+
+             3 TotalMedioPagoMonedaMonedaReferencia    ->  Idem que el anterior pero expresado en la
+                                                                moneda de referencia.
+
+             4 TotalEntregado                          ->  Total entregado de ese medio de pago-moneda.
+
+             5 TotalEntregadoMonedaReferencia          ->  Total entregado expresado en la moneda de referencia.
+
+             6 Cambio                                  ->  Cambio de la línea de pago.
+                                                                Su valor puede ser 0.00 (no hay cambio) o
+                                                                positvo que es parte del cambio que se le da
+                                                                al cliente.
+
+             7 TipoOperacion                           ->  0-Si corresponde a una venta
+                                                                los importes van en positivo.
+                                                           1-Si corresponde a una devolución por parte del cliente
+                                                                los importes van en negativo.
+
+             8 LineaUltimoPago                         ->  0-No es la línea del último pago.
+                                                                Esto sucede cuando el ticket se paga con
+                                                                múltiples pagos, inclusive distintos medios de
+                                                                pago-monedas, cuando el importe abonado es menor
+                                                                al total a pagar.
+                                                           1-Es la línea del último pago.
+
+             9 NumeroTarjetaCredito                    ->  Número de la tarjeta de crédito. Se graba solamente si
+                                                                es cliente de fidelización.
+
+            10 AutorizaSupervisora                     ->  0-La línea de pago no tuvo autorización de la supervisora.
+                                                           1-La línea de pago tuvo autorización de la supervisora.
+
+            11 LineaCancelada                          ->  0-Línea de pago no cancelada.
+                                                           1-Línea de pago cancelada.
+
+            CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda # TotalMedioPagoMonedaMonedaReferencia #
+                   0                1                 2                             3
+            TotalPagado # TotalPagadoMonedaReferencia # Cambio # TipoOperacion # LineaUltimoPago #
+                  4                   5                    6            7               8
+            NumeroTarjetaCredito # AutorizaSupervisora # CodigoSupervisora # LineaCancelada
+                      9                     10                  11                 12
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'codigomediopago'                       : lin[0],
+                        'codigomoneda'                          : lin[1],
+                        'totalmediopagomoneda'                  : lin[2],
+                        'totalmediopagomonedamonedareferencia'  : lin[3],
+                        'totalpagado'                           : lin[4],
+                        'totalpagadomonedareferencia'           : lin[5],
+                        'cambio'                                : lin[6],
+                        'tipooperacion'                         : lin[7],
+                        'lineaultimopago'                       : lin[8],
+                        'numerotarjetacredito'                  : lin[9],
+                        'autorizasupervisora'                   : lin[10],
+                        'codigosupervisora'                     : lin[11],
+                        'lineacancelada'                        : lin[12]
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+
+    def lt_86(self):
+        # Línea de recargo.                                      86
+        pass
+
+
+    def lt_87(self):
+        # Línea descuento a los medios de pago-moneda.           87
+        pass
+
+
+    def lt_88(self):
+        # Línea venta cómputos celular                           88
+        pass
+
+
+    def lt_89(self):
+        # Devolución línea venta cómputos celular.               89
+        pass
+
+
+    def lt_90(self):
+        """
+        Línea de pago ticket TAlimentos (90) SM.
+        ---------------------------------------
+
+         0 Código del medio de pago.
+         1 Código de la moneda.
+         2 Monto total de lo que se puede pagar con el medio de pago moneda.
+         3 Idem que el anterior pero expresado en la moneda de referencia.
+         4 Total entregado de ese medio de pago-moneda.
+         5 Total entregado expresado en la moneda de referencia.
+         6 Cambio de la línea de pago (valor >= 0.00 5).
+         7 TipoOperacion.
+             0 - Venta ( importes > 0.00).
+             1 - Devolución ( importes < 0.00).
+         8 LineaUltimoPago.
+             0 - No es la línea del último pago. Esto sucede cuando el ticket
+                 se paga con múltiples pagos (inclusive de distintos medios de
+                 pago-monedas) cuando el importe abonado es menor al total a pagar.
+             1 - Es la línea del último pago.
+         9 CodigoBarra.
+             1 - código de barras del cupón.
+             0 - monto total de los cupones o el codigo de barras ingresado
+                 manualmente de ese cupon.
+        10 ModoIngresoCupon.
+             0 - Teclado.Este modo de ingreso se efectua cuando la cajera
+                 ingresa el monto del total de los cupones o el codigo de
+                 barras de ese cupon.
+             1 - Scanner.Cuando se procesan los cupones por scanner, validando
+                 los mismos.
+        11 AutorizaSupervisora.
+             0 - La línea de pago no tuvo autorización de la supervisora.
+             1 - La línea de pago tuvo autorización de la supervisora.
+        12 CodigoSupervisora.
+        13 Código de la supervisora (vacío si no aplica)
+        14 LineaCancelada.
+             0 - activa.
+             1 - cancelada.
+
+
+        Indices:
+        -------
+
+        CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+             0                  1                 2
+
+        TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                        2                           4
+
+        TotalPagadoMonedaReferencia # Cambio # TipoOperacion #
+                    5                   6           7
+
+        LineaUltimoPago# CodigoBarra # ModoIngresoCupon # AutorizaSupervisora #
+                8           9               10                  11
+
+        CodigoSupervisora # LineaCancelada
+            12                  13
+        """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'codigomediopago'                       : lin[0],
+                        'codigomoneda'                          : lin[1],
+                        'totalmediopagomoneda'                  : lin[2],
+                        'totalmediopagomonedamonedareferencia'  : lin[3],
+                        'totalpagado'                           : lin[4],
+                        'totalpagadomonedareferencia'           : lin[5],
+                        'cambio'                                : lin[6],
+                        'tipooperacion'                         : lin[7],
+                        'lineaultimopago'                       : lin[8],
+                        'codigobarra'                           : lin[9],
+                        'modoingresocupon'                      : lin[10],
+                        'autorizasupervisora'                   : lin[11],
+                        'codigosupervisora'                     : lin[12],
+                        'lineacancelada'                        : lin[13]
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_91(self):
+        """
+        Línea de pago ticket Total (91) SM.
+        ----------------------------------
+
+         0 Código del medio de pago.
+         1 Código de la moneda.
+         2 Monto total de lo que se puede pagar con el medio de pago moneda.
+         3 Idem que el anterior pero expresado en la moneda de referencia.
+         4 Total entregado de ese medio de pago-moneda.
+         5 Total entregado expresado en la moneda de referencia.
+         6 Cambio de la línea de pago (valor >= 0.00 5).
+         7 TipoOperacion.
+             0 - Venta ( importes > 0.00).
+             1 - Devolución ( importes < 0.00).
+         8 LineaUltimoPago.
+             0 - No es la línea del último pago. Esto sucede cuando el ticket
+                 se paga con múltiples pagos (inclusive de distintos medios de
+                 pago-monedas) cuando el importe abonado es menor al total a pagar.
+             1 - Es la línea del último pago.
+         9 CodigoBarra.
+             1 - código de barras del cupón.
+             0 - monto total de los cupones o el codigo de barras ingresado
+                 manualmente de ese cupon.
+        10 ModoIngresoCupon.
+             0 - Teclado.Este modo de ingreso se efectua cuando la cajera
+                 ingresa el monto del total de los cupones o el codigo de
+                 barras de ese cupon.
+             1 - Scanner.Cuando se procesan los cupones por scanner, validando
+                 los mismos.
+        11 AutorizaSupervisora.
+             0 - La línea de pago no tuvo autorización de la supervisora.
+             1 - La línea de pago tuvo autorización de la supervisora.
+        12 CodigoSupervisora.
+        13 Código de la supervisora (vacío si no aplica)
+        14 LineaCancelada.
+             0 - activa.
+             1 - cancelada.
+
+
+        Indices:
+        -------
+
+        CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+             0                  1                 2
+
+        TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                        2                           4
+
+        TotalPagadoMonedaReferencia # Cambio # TipoOperacion #
+                    5                   6           7
+
+        LineaUltimoPago# CodigoBarra # ModoIngresoCupon # AutorizaSupervisora #
+                8           9               10                  11
+
+        CodigoSupervisora # LineaCancelada
+            12                  13
+        """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'codigomediopago'                       : lin[0],
+                        'codigomoneda'                          : lin[1],
+                        'totalmediopagomoneda'                  : lin[2],
+                        'totalmediopagomonedamonedareferencia'  : lin[3],
+                        'totalpagado'                           : lin[4],
+                        'totalpagadomonedareferencia'           : lin[5],
+                        'cambio'                                : lin[6],
+                        'tipooperacion'                         : lin[7],
+                        'lineaultimopago'                       : lin[8],
+                        'codigobarra'                           : lin[9],
+                        'modoingresocupon'                      : lin[10],
+                        'autorizasupervisora'                   : lin[11],
+                        'codigosupervisora'                     : lin[12],
+                        'lineacancelada'                        : lin[13]
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_92(self):
+        # Línea de Factura 2.                                    92
+        pass
+
+
+    def lt_94(self):
+        # Línea de pago con cheque cobranza.                     94
+        pass
+
+
+    def lt_95(self):
+        # Línea de ticket de fondeo.                             95
+        pass
+
+
+    def lt_97(self):
+        # Línea de ticket de retiro                              97
+
+        """
+            Línea de ticket de retiro (97).
+
+            Este tipo de línea se presenta cuando la cajera realiza un retiro de caja.
+
+                CodigoMedioPago # CodigoMoneda # MontoRetiro
+                    0               1             2
+
+                0. CodigoMedioPago ->  Código del medio de pago.
+                1. CodigoMoneda    ->  Código de la moneda.
+                2. MontoRetiro     ->  Monto del retiro realizado.
+
+            Ejemplo de un retiro del codigo de medio de pago 1 y codigo de moneda 1 por 300.00 ,
+            del codigo de medio de pago 1 y codigo de moneda 2 por 500.00 y del codigo de medio
+            de pago 1 y codigo de moneda 4 por 300.00
+
+                L#8#97#201128#1#1#300.00
+                L#9#97#201128#1#2#500.00
+                L#10#97#201128#1#4#300.00
+        """
+
+        lin = self.esta_linea or False
+
+        result = dict()
+        try:
+            result.update(dict( codigomediopago = lin[0], codigomoneda = lin[1], montoretiro = lin[2] ))
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+        return result
+
+
+
+    def lt_99(self):
+        # Línea de ticket Cupones Numeros (SM)                   99
+        pass
+
+
+    def lt_100(self):
+        # Línea de ticket de cobranza (SM).               100
+        pass
+
+
+
+    def lt_101(self):
+        #Línea de ticket de devolucion de cobranza (SM). 101
+        pass
+
+
+    def lt_102(self):
+        # Línea de ticket de cancelacion de cobranza(SM). 102
+        pass
+
+
+    def lt_103(self):
+        # Cancelación de salida de cajera (SM)            103
+        pass
+
+
+    def lt_104(self):
+        # Seteo de monto de prestamo en efectivo (SM).    104
+        pass
+
+
+    def lt_105(self):
+        # Prestamo en efectivo (SM).                      105
+        pass
+
+
+    def lt_106(self):
+        # Ticket cliente facturacion (SM)                 106
+        pass
+
+
+    def lt_107(self):
+        # Ticket de informacion del cliente (SM)          107
+        pass
+
+
+    def lt_108(self):
+        # Ticket gift card (108)-SM                       108
+        pass
+
+
+    def lt_109(self):
+        # Devolución gift card (109)                      109
+        pass
+
+
+    def lt_115(self):
+        # Pago descuento Iva Afam (SM)                    115
+        pass
+
+
+    def lt_117(self):
+        # Preventa (SM)                                   117
+        pass
+
+
+    def lt_118(self):
+        pass
+
+
+    def lt_119(self):
+        pass
+
+
+    def lt_120(self):
+        """
+            Línea de venta Mides (120)-SM
+            -----------------------------
+
+            Representa la línea de venta de un ticket de venta MIDES.
+
+            VentaMides  Texto que indica venta MIDES (Venta Mides).
+            CI          Cédula de identidad del cliente.Este campo es opcional,puede no venir.
+
+            VentaMides # CI
+        """
+        # import ipdb; ipdb.set_trace()n
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'ventamides': lin[0],
+                        'ci'        : lin[1]  if len(lin)>1 else ''
+                }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+        return result
+
+
+    def lt_121(self):
+        """
+            Línea de voucher retiro leche tarjeta Mides (121)-SM:
+            ====================================================
+            Representa la línea de retiro de productos (en este caso leche)
+            sin costo (hasta cierto tope) de la tarjeta Mides.
+
+            NumeroTarjeta # CedulaIdentidad # UnidadesRetiradas # SaldoUnidades # TipoVoucher # Modo
+
+            0. Numero de la tarjeta Mides.
+            1. Documento de identidad del cliente.
+            2. Cantidad de unidades retiradas.
+            3. Saldo de unidades que puede retirar sin costo.
+            4. Tipo de voucher asociado.
+                    0 - Original Cliente.
+                    1 - Vía Establecimiento.
+            5. Modo
+                    0 - Retiro de productos.
+                    1 - Devolución de productos.
+
+            NumeroTarjeta # CedulaIdentidad # UnidadesRetiradas # SaldoUnidades #
+
+            TipoVoucher # Modo
+
+        """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'numerotarjeta'      : lin[0],
+                        'cedulaidentidad'    : lin[1],
+                        'unidadesretiradas'  : lin[2],
+                        'saldounidades'      : lin[3],
+                        'tipovoucher'        : lin[4],
+                        'modo'               : lin[5],
+                }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_122(self):
+
+        """
+            Línea ticket info importe (122)-SM
+            Contiene la información de importes gravados de los pagos con Tarjeta de Credto/Debito, Lucheon, etc.
+
+            ImporteTotalTicket # ImporteGravadoTicket
+                    0                      1
+            ImporteTotalTicket   -> Importe total del ticket.
+            ImporteGravadoTicket -> Importe gravado del ticket.
+
+            Ejemplo de un importe con un total de ticket de 287.06 con un importe gravado de 235.30
+                L|10|122|191720|287.06|235.30
+
+        """
+
+        lin = self.esta_linea or False
+        result = {}
+        try:
+            result = {
+                        'importetotalticket'      : lin[0],
+                        'importegravadoticket'    : lin[1],
+                }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_123(self):
+        pass
+
+
+        """
+        Línea de pago TACRE (123)-SM / (126) P4 (no CFE).
+            Representa la línea de pago por Tarjeta Ticket Alimentacion/Canasta/Restaurante de forma electrónica.
+
+              CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+                    0                1               2
+              TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                             3                           4
+              TotalPagadoMonedaReferencia # Cambio # TipoOperacion # LineaUltimoPago #
+                           5                   6           7               8
+              NumeroTarjeta # NumeroAutorizacion # AutorizaSupervisora # CodigoSupervisora #
+                  9                 10                     11                   12
+              LineaCancelada # SiAplicaLeyDescIva # MontoDescuentoLeyIva # TextoLey
+                  13                 14                   15                  16
+
+
+
+             0. CodigoMedioPago                         ->  Código del medio de pago.
+
+             1. CodigoMoneda                            ->  Código de la moneda.
+
+             2. TotalMedioPagoMoneda                    ->  Monto total de lo que se puede pagar con el medio de pago
+                                                            moneda.
+
+             3. TotalMedioPagoMonedaMonedaReferencia    ->  Idem que el anterior pero expresado en
+                                                            la moneda de referencia.
+
+             4. TotalPagado                             ->  Total entregado de ese medio de pago-moneda.
+
+             5. TotalPagadoMonedaReferencia             ->  Total entregado expresado en la moneda de
+                                                            referencia.
+
+             6. Cambio                                  ->  Cambio de la línea de pago (su valor puede ser 0.00 (no hay cambio) o
+                                                            positvo que es parte del cambio que se le da al cliente).
+
+             7. TipoOperacion                           ->  0 - Si corresponde a una venta (los importes van en positivo).
+                                                            1 - Si corresponde a una devolución por parte del cliente (los importes
+                                                                van en negativo).
+
+             8. LineaUltimoPago                         ->  0 - No es la línea del último pago. Esto sucede cuando el ticket se
+                                                                paga con múltiples pagos (inclusive de distintos medios de pago-
+                                                                monedas) cuando el importe abonado es menor al total a pagar.
+                                                            1 - Es la línea del último pago.
+
+             9. NumeroTarjeta                           ->  Número de la tarjeta de crédito enmascarada (excepto grupo Disco).
+
+            10. NumeroAutorizacion                      ->  Número de autorización.
+
+            11. AutorizaSupervisora                     ->  0 - La línea de pago no tuvo autorización de la supervisora.
+                                                            1 - La línea de pago tuvo autorización de la supervisora.
+
+            12. CodigoSupervisora                       ->  Código de la supervisora si AutorizaSupervisora=1, sino va vacío.
+
+            13. LineaCancelada                          ->  0 - Línea no cancelada.
+                                                            1 - Línea cancelada. Este tipo de línea no tiene valor contable.
+
+            14. SiAplicaLeyDescIva                      ->  Flag que indica si se aplica la ley 19210 de inclusión financiera
+                                                            de descuento de iva.
+                                                            0 - No aplica ley de descuento de iva.
+                                                            1 - Aplica ley de descuento de iva.
+
+            15. MontoDescuentoLeyIva                    ->  Monto del descuento de Iva.
+
+            16. TextoLey                                ->  Texto de la ley (numero).
+
+
+            CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+                    0             1                    2
+            TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                            3                           4
+            TotalPagadoMonedaReferencia # Cambio # TipoOperacion # LineaUltimoPago #
+                        5                 6            7                8
+            NumeroTarjeta # NumeroAutorizacion # AutorizaSupervisora #
+                9                 10                   11
+            CodigoSupervisora # LineaCancelada # SiAplicaLeyDescIva #
+                12                13                   14
+            MontoDescuentoLeyIva # TextoLey
+                    15                  16
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'codigomediopago'                       : lin[0],
+                        'codigomoneda'                          : lin[1],
+                        'totalmediopagomoneda'                  : lin[2],
+                        'totalmediopagomonedamonedareferencia'  : lin[3],
+                        'totalpagado'                           : lin[4],
+                        'totalpagadomonedareferencia'           : lin[5],
+                        'cambio'                                : lin[6],
+                        'tipooperacion'                         : lin[7],
+                        'lineaultimopago'                       : lin[8],
+                        'numerotarjeta'                         : lin[9],
+                        'numeroautorizacion'                    : lin[10],
+                        'autorizasupervisora'                   : lin[11],
+                        'codigosupervisora'                     : lin[12],
+                        'lineacancelada'                        : lin[13],
+                        'siaplicaleydesciva'                    : lin[14],
+                        'montodescuentoleyiva'                  : lin[15],
+                        'textoley'                              : lin[16],
+                }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+        """
+
+    def lt_124(self):
+
+        """
+            Línea de voucher de la tarjeta TACRE (124)-SM
+            =============================================
+
+            Muestran la información de un Voucher de pago por Tarjeta Ticket
+            Alimentacion/Canasta/Restaurante de forma electronica.
+
+             0. NumeroTarjeta    -> Número de la tarjeta.
+             1. Vencimiento      -> Vencimiento de la tarjeta (aamm).
+             2. Comprobante      -> Número de comprobante.
+             3. Autorizacion     -> Número de autorización.
+             4. CodigoTerminal   -> Código de la terminal asociado.
+             5. CodigoComercio   -> Código de comercio asociado.
+             6. TipoAutorizacion ->
+                    00-Online.
+                    01-Offline
+                    20-Online y aplica ley descuento IVA (ley 19210).
+                    21-Online, aplica ley descuento IVA (ley 19210) y no requiere firma.
+
+             7. NroLote          -> Número de lote asociado.
+             8. CodigoMoneda     -> Código de la moneda asociado.
+                    00-Pesos
+                    01-Dólares.
+
+             9. TipoTransaccion  -> Tipo de transacción asociado (MTI).
+                    1200-Compra
+                    1220-Confirmación Compra
+                    1240-Notificación de Compra
+                    1400-Devolución (Total o parcial)
+                    1420-Confirmación Devolución
+                    1440-Notificación de Devolución
+                    1900-VentaTACRE
+                    1901-Devolución TACRE
+                    1902-Anulación TACRE
+                    4900-Reversa venta TACRE
+                    4901-Reversa devolución TACRE
+                    4902-Reversa anulación TACRE
+                    9xxx-Entrenamiento
+
+            10. TipoVoucher         -> Tipo de voucher asociado.
+                    0-Original Cliente.
+                    1-Vía Establecimiento.
+
+            11. ImportePago         -> Importe pagado por la tarjeta.
+            12. FechaTransacccion   -> Fecha de transacción de la autorización (dd/mm/aaaa hh:mm:ss).
+            13. CodigoCaja          -> Código de la caja.
+            14. CodigoCajera        -> Código de la cajera.
+            15. NombrePropietario   -> Nombre del propietario de la tarjeta.
+            16. TipoIngreso         -> Tipo de ingreso asociado.
+                    0-Lectura magnética.
+                    1-Entrada manual
+                    2-Internet.
+
+            17. DescuentaIva        ->
+                    0-No descuenta iva (ley 17934).
+                    1-Descuenta iva (ley 17934).
+
+            18. SiAplicaLeyDescIva  -> Flag que indica si se aplica la ley 19210 de inclusión financiera
+                de descuento de iva.
+                    0-No aplica ley de descuento de iva.
+                    1-Aplica ley de descuento de iva
+
+            19. MontoDescuentoLeyIva    -> Monto del descuento de Iva.
+            20. MontoFactura            -> Monto de la factura.
+            21. MontoGravado            -> Monto gravado.
+            22. NombreTarjeta           -> Nombre de la tarjeta.
+            23. FlagImprimeFirma        ->
+                    0-No imprime la firma.
+                    1-Imprime la firma.
+
+            Ejemplo de un voucher de la tarjeta TACRE numero 6007940999999318,con
+            vencimiento de tarjeta 0116 (01/16),número de comprobante 1004002818,número de
+            autorización 000001,código de terminal 00000004, código de comercio asociado
+            42140140042, tipo de autorización 20,número de lote 1, moneda 00 (pesos), tipo de
+            transacción 1900, tipo voucher 0 (via cliente), importe de tarjeta de 287.06, fecha de
+            autorización 05/06/2015 19:17:10, caja 4,cajera 1,propietario tarjeta es PRUEBAS
+            REDBANK, tipo de ingreso de la tarjeta 0,descuenta Iva (1), aplica ley de descuento de
+            Iva (1) , el importe de descuento es de -10.00,monto de factura 1024.40,monto gravado
+            839.68,nombre tarjeta EDENRED y no imprime la firma.
+
+            L|13|124|191720|6007940999999318|0107|1004002818|000001|00000004|42140140042|20|1|00|1900|0|287.06|05/06/2015 19:17:10|4|1|PRUEBAS REDBANK|0|1|1|-10.00|1024.40|839.68|EDENRED|0
+
+
+                0               1             2             3               4
+           NumeroTarjeta # Vencimiento # Comprobante # Autorizacion # CodigoTerminal #
+                5                   6             7          8                9
+           CodigoComercio # TipoAutorizacion # NroLote # CodigoMoneda # TipoTransaccion #
+               10            11                 12             13           14
+           TipoVoucher # ImportePago # FechaTransacccion # CodigoCaja # CodigoCajera #
+                15                  16             17            18
+           NombrePropietario # TipoIngreso # DescuentaIva # SiAplicaLeyDescIva #
+                    19                 20                21          22               23
+           MontoDescuentoLeyIva # MontoFactura # MontoGravado # NombreTarjeta # FlagImprimeFirma
+
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                    'numerotarjeta'       : lin[0],
+                    'vencimiento'         : lin[1],
+                    'comprobante'         : lin[2],
+                    'autorizacion'        : lin[3],
+                    'codigoterminal'      : lin[4],
+                    'codigocomercio'      : lin[5],
+                    'tipoautorizacion'    : lin[6],
+                    'nrolote'             : lin[7],
+                    'codigomoneda'        : lin[8],
+                    'tipotransaccion'     : lin[9],
+                    'tipovoucher'         : lin[10],
+                    'importepago'         : lin[11],
+                    'fechatransaccion'    : lin[12],
+                    'codigocaja'          : lin[13],
+                    'codigocajera'        : lin[14],
+                    'nombrepropietario'   : lin[15],
+                    'tipoingreso'         : lin[16],
+                    'descuentaiva'        : lin[17],
+                    'siaplicaleydesciva'  : lin[18],
+                    'montodescuentoleyiva': lin[19],
+                    'montofactura'        : lin[20],
+                    'montogravado'        : lin[21],
+                    'nombretarjeta'       : lin[22],
+                    'flagimprimefirma'    : lin[23]
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_125(self):
+        pass
+
+
+    def lt_126(self):
+        """
+
+          Línea de ticket de cliente de cuenta corriente (126)-SM.
+          -------------------------------------------------------
+
+            Especificacion de la línea de ticket de cliente de cuenta corriente (clientes especiales).
+
+            0. CodigoCC     Código de cliente de cuenta corriente.
+            1. NombreCC     Nombre del cliente de cuenta corriente.
+            2. MontoPagoCC  Es el monto de pago del cliente de cuenta corriente
+                            No necesariamente es igual al monto total del ticket,
+                            cuando se usa medio de pago.
+
+             CodigoCC # NombreCC # MontoPagoCC
+                 0         1           2
+        """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                'codigocc'   : lin[0],
+                'nombrecc'   : lin[1],
+                'montopagocc': lin[2],
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_127(self):
+        """
+          Línea de pago cuenta corriente (127)-SM   Medio de pago Venta o devolución
+          ---------------------------------------------------
+
+            Especificacion de la línea de ticket del pago de clientes de
+            cuenta corriente. Es igual a la línea de pago en efectivo (9),
+            solo que se refiere al codigo de medio de pago cuenta corriente
+            y moneda pesos.
+
+          Línea de pago de ticket en efectivo (9).
+          ---------------------------------------
+
+
+            0. Código del medio de pago.
+            1. Código de la moneda.
+            2. Monto total de lo que se puede pagar con el medio de pago moneda.
+            3. Idem que el anterior pero expresado en la moneda de referencia.
+            4. Total entregado de ese medio de pago-moneda.
+            5. Total entregado expresado en la moneda de referencia.
+            6. Cambio de la línea de pago (valor >= 0.00)
+            7. Codigo de Operacion.
+                    0 - Si corresponde a una venta (los importes van en positivo).
+                    1 - Si corresponde a una devolución por parte del cliente (los
+                        importes van en negativo).
+            8. Ultimo pago.
+                    0 - No es la línea del último pago. Esto sucede cuando el ticket
+                        se paga con múltiples pagos (inclusive de distintos medios
+                        de pago-monedas) cuando el importe abonado es menor al
+                        total a pagar.
+                    1 - Es la línea del último pago.
+            9. Intervención supervisor.
+                    0 - Línea de pago sin intervención de supervisor.
+                    1 - Línea de pago autorizada por supervidor.
+            10. Código de la supervisora. o vacio
+            11. Estado de la línea de pago.
+                    0-Línea de pago no cancelada.
+                    1-Línea de pago cancelada.
+
+            CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+                0                1                 2
+
+            TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                        3                               4
+
+
+            TotalPagadoMonedaReferencia # Cambio # TipoOperacion # LineaUltimoPago #
+                        5                    6          7                8
+
+            AutorizaSupervisora # CodigoSupervisora # LineaCancelada
+                    9                    10                11
+
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                'codigomediopago'                       : lin[0],
+                'codigomoneda'                          : lin[1],
+                'totalmediopagomoneda'                  : lin[2],
+                'totalmediopagomonedamonedareferencia'  : lin[3],
+                'totalpagado'                           : lin[4],
+                'totalpagadomonedareferencia'           : lin[5],
+                'cambio'                                : lin[6],
+                'tipooperacion'                         : lin[7],
+                'lineaultimopago'                       : lin[8],
+                'autorizasupervisora'                   : lin[9],
+                'codigosupervisora'                     : lin[10],
+                'lineacancelada'                        : lin[11],
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_900(self):
+        pass
+
+# --- fin clase `IPLinea`
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/opentck3/ip_ticket/ticket.py b/opentck3/ip_ticket/ticket.py
new file mode 100644 (file)
index 0000000..accc358
--- /dev/null
@@ -0,0 +1,3433 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+
+__licence__ = "GNU/GPLv3"
+__author__  = "Marcelo Zunino (InfoPrimo SL) 2015"
+
+import os
+import sys
+import logging
+
+# logfile = './log/ticket.log'
+# os.path.isdir('./log') or os.mkdir('./log')
+# os.path.isfile(logfile) or os.system("touch %s" % logfile)
+# logging.basicConfig(format='%(asctime)s %(message)s', filename=logfile, level=logging.INFO)
+
+logfile = './log/ticket.log'
+os.path.isdir('./log') or os.mkdir('./log')
+os.path.isfile(logfile) or os.system("touch %s" % logfile)
+logging.basicConfig(format='%(asctime)s %(message)s', filename=logfile, level=logging.INFO)
+ns = 'ticket.py'
+
+# solo para debugging
+from inspect import currentframe, getframeinfo
+
+
+class IPTicket(object):
+
+    """
+        Se defininen 3 clases para procesar el informe de salida pazos.
+        IPTicket, IPCabezal, IPLinea.
+
+        IPCabezales e IPLineas, siguen el orden, las denominaciones, etc del
+        documento: "Diseño de la salida estándar del CSTVIEW para el sistema
+        Pazos4 y Supermercado"¹. Versión: 1.6.55
+
+
+        Class IPTicket:
+
+            Superclase para "IPCabezal" e "IPLineas" en la que se definen
+            operaciones simples de uso en ambas clases.
+
+            Cada una de éstas clases hijas implementa un `diccionario python`
+            que clasifica y define las líneas de un `Ticket`.
+
+            Para el sistema Pazos4 el `Ticket` es la unidad básica de registro
+            de transaciones en los POS.
+
+            Cada ticket contiene líneas de `Tipo Cabezal` y líneas de `Tipo
+            Líneas de Detalle`.
+
+            Diccionarios de tipo:
+
+                        dict = { llave0: valor, llaveX: valor, ... }
+
+            :llave: string
+                Coincide con el numeral de las tablas "Tipos de líneas de
+                cabezal de ticket" y "Tipos de línea cabezal" respectivamente,
+                de la documentación de "Pazos" mencionada.
+
+            :valor: list
+                Es una lista la de dos miembros [Descripción, Método] cuyo primer
+                elemento coincide con el título de la descripción en las tablas
+                mencionadas. El segundo, en caso de existir, es la referenica a
+                un método de clase que extrae los datos correspondientes según el
+                tipo de `llave`.
+
+        ¹20??-2015 © Sisteco S.A
+        ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
+    """
+
+    stdout_err = 1  # `stdout_err = 1` mostrará errores en stdout
+    verbose    = 1  # `verbose = 1`    mostrará detalles del error
+    debug_log  = 0  # `debug = 1`      escribe detalles en el log
+    debug_vivo = 1  # `debug_vivo = 1` abre consola de debug en el error
+
+
+    @staticmethod
+    def fecha10(strg):
+        """
+            param:     string (14 dígitos)
+            retorna:   string 'dd/mm/aaaa' día/mes/año (10 dígitos)
+        """
+        if len(strg) == 14:
+            res = "%s/%s/%s" % ( strg[6:8], strg[4:6], strg[:4] )
+        else:
+            res = '00/00/0000'
+        return res
+
+    @staticmethod
+    def fecha8(strg):
+        """
+            param:     string (14 dígitos) 'aaaammddhhmmss'
+            retorna:   string 'dd/mm/aa' día/mes/año (8 dígitos)
+        """
+        if len(strg) == 14:
+            res = "%s/%s/%s" % ( strg[6:8], strg[4:6], strg[2:4])
+        else:
+            res = '00/00/00'
+        return res
+
+    #fecha = ddmmyyyy         yymmdd
+
+    @staticmethod
+    def yyyymmdd(strg):
+        """
+            param:     string (14 dígitos)
+            retorna:   string 'aaaammdd' añomesdía (8 dígitos)
+        """
+        if len(strg) == 14:
+            res = "%s%s%s" % ( strg[0:4], strg[4:6], strg[6:8] )
+        else:
+            res = '00000000'
+        return res
+
+
+    @staticmethod
+    def yymmdd(strg):
+        """
+            param:     string (14 dígitos)
+            retorna:   string 'aammdd' añomesdía (6 dígitos)
+        """
+        if len(strg) == 14:
+            res = "%s%s%s" % ( strg[2:4], strg[4:6], strg[6:8] )
+        else:
+            res = '000000'
+        return res
+
+    # fecha = ddmmyyyy
+
+    @staticmethod
+    def dd(strg):
+        """
+            param:     string (14 dígitos)
+            retorna:   string 'dd' día del mes (2 dígitos)
+        """
+        if len(strg) == 14:
+            res = "%s" % (strg[6:8])
+        else:
+            res = '00'
+        return res
+
+
+    @staticmethod
+    def mm(strg):
+        """
+            param:     string (14 dígitos)
+            retorna:   string 'mm' mes del año (2 dígitos)
+        """
+        if len(strg) == 14:
+            res = "%s" % (strg[4:6])
+        else:
+            res = '00'
+        return res
+
+    @staticmethod
+    def yy(strg):
+        """
+            param:     string (14 dígitos)
+            retorna:   string 'aa' año (2 dígitos)
+        """
+        if len(strg) == 14:
+            res = "%s" % ( strg[2:4] )
+        else:
+            res = '0000'
+        return res
+
+    @staticmethod
+    def yyyy(strg):
+        """
+            param:     string (14 dígitos)
+            retorna:   string 'aaaa' año (4 dígitos)
+        """
+        if len(strg) == 14:
+            res = "%s" % ( strg[:4] )
+        else:
+            res = '0000'
+        return res
+
+
+    @staticmethod
+    def hora(strg):
+        """
+            param:     string (6 dígitos)
+            retorna:   string 'hh:mm:ss' hora:minutos:segundos
+        """
+        if len(strg) == 6:
+            res = "%s:%s:%s" % (strg[0:2], strg[2:4], strg[4:6])
+        else:
+            res = '00:00:00'
+        return res
+
+    @staticmethod
+    def hhmmss(strg):
+        """
+            Evita errores de hora (estilo salomón)
+            param:     string (6 dígitos)
+            retorna:   string 'hhmmss'
+        """
+        if len(strg) == 6:
+            res = strg
+        else:
+            res = '000000'
+        return res
+
+    @staticmethod
+    def caja3dig(nrocaja=None):
+        if not nrocaja:
+            return '000'
+        else:
+            return (3 - len(str(nrocaja)))*'0' + str(nrocaja)
+
+
+    @staticmethod
+    def rfalla():
+        """ notificación a stdout """
+        msg = '\n\tAtención: falla registrada.'
+        print ("%s  %s" % (msg, "Vea el log!"))
+
+
+    def excepcion(self, mensaje, frame=None, id_ticket=None):
+        """ logging / notificación a stdout """
+        msg = mensaje or " algo salió mal... "
+        msgv = ''
+
+        if self.stdout_err and msg:
+            print("\t %s" % (msg,))
+        if self.verbose and frame and id_ticket:
+            msgv  = "aaaammdd cja tck: %s" % (id_ticket,)
+            msgv += " en: %s  lín: %s" % (frame.filename, frame.lineno)
+            print("\t %s" % (msgv,))
+        if self.debug_log:
+            msg += msgv
+        msg += " fin ejecución..."
+        if self.debug_vivo:
+            import ipdb; ipdb.set_trace()
+        return sys.exit(1)
+
+# instancia compartida
+ipt = IPTicket()
+
+
+class IPCabezal(IPTicket):
+
+    """
+        Hereda de IPTicket, representa a una línea de tipo cabezal de Salidapazosnuevo-*
+
+        **Ejemplo**
+
+        Una línea tipo cabezal del informe Salidapazosnuevo:
+           C#1#2#350#2#20151121105326#F#4#183.40#20#13
+
+        La misma línea tal cómo llega a una instancia de `IPCabezal`
+          linea = ['1', '2', '350', '2', '20151121105326', 'F', '4', '183.40', '20', '13'] *
+          indices   0    1     2     3          4           5    6       7       8     9  **
+
+           * objeto python `list` Se usa como array: `lst = [ '1','dos', 357, 'hola']`
+          ** índice implícito en el objeto `list`:
+                la expresión lst[3] devolverá el string `hola`; lst[0] devolverá el literal '1',
+                en tanto lst[2] retorna el entero 357.
+
+        La instanciación sería `un_cabezal = IPCabezal(una_linea_tipo_cabezal)`
+
+        Se utlizan estructuras análogas para el caso de líneas de tipo detalle
+        del ticket. En ambos casos se omite el identificador de línea.
+
+        ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
+
+
+
+        Diccionario de tipos de línea cabezal:
+
+        No justifica métodos de línea para los cabezales, por tanto el segundo miembro
+        de la lista/valor de las llaves está vacío. Podría haberse optado por un tipo
+        simple para los valores, como `string`. Se ha mantenido `list` a efectos de
+        homogenizar la notación de acceso en los clientes de las clases.
+
+        :dic_tipo_cabezal:        : Miembro de clase
+
+    """
+
+    dic_cabezal = {'1'  : ('Ticket Venta/Ingreso'  , ),
+                   '3'  : ('Devolución'            , ),
+                   '4'  : ('Estado de cuenta'      , ),
+                   '6'  : ('Canje'                 , ),
+                   '7'  : ('Inventario'            , ),
+                   '8'  : ('Lin. de Cajera'        , ),
+                   '10' : ('Pago de caja'          , ),
+                   '11' : ('Factura'               , ),
+                   '14' : ('Consulta'              , ),
+                   '15' : ('Apertura de Gaveta'    , ),
+                   '16' : ('N.Credito Devolucion'  , ),
+                   '17' : ('Fondeo'                , ),
+                   '18' : ('Retiro'                , ),
+                   '19' : ('Prestamo efectivo'     , ),
+                   '20' : ('Retiro de Productos'   , ),
+                   '21' : ('Cab. Z de Caja'        , ),
+                  '999' : ('-Cabezal NO definido-' , ),
+                  'ccc' : ('Ticket de Cobranza'    , )}
+
+    def __init__(self, linea=None):
+
+        if len(linea) == 10:
+            # los cabezales ¿son siempre de largo 10?
+
+            self.rlinea          = 'C#' + '#'.join(linea)  # reconstruye linea original para debug
+            self.llave           = llave = linea[0]
+            self.descripcion     = self.dic_cabezal[llave][0]  # ==  self.dic_cabezal[self.llave][0]
+            self.caja            = linea[1]
+            self.ticket          = linea[2]
+            self.nro_cajera      = linea[3]
+            self.timestamp       = linea[4]
+            self.fecha           = ipt.fecha10(linea[4])
+            self.estado          = linea[5]
+            self.cant_articulos  = linea[6]
+            self.total_a_pagar   = linea[7]
+            self.tipo_de_cliente = linea[8]
+            self.cant_lineas     = linea[9]
+            self.yyyymmdd        = ipt.yyyymmdd(linea[4])
+            self.yymmdd          = ipt.yymmdd(linea[4])
+            self.yyyy            = ipt.yyyy(linea[4])
+            self.yy              = ipt.yy(linea[4])
+            self.mm              = ipt.mm(linea[4])
+            self.dd              = ipt.dd(linea[4])
+            self.id_ticket       = self.yyyymmdd + self.caja3dig(self.caja) + self.ticket
+
+            self.tipolinea         = linea[0]
+            self.codigocaja        = linea[1]
+            self.numeroticket      = linea[2]
+            self.codigocajera      = linea[3]
+            self.timestampticket   = linea[4]
+            self.estadoticket      = linea[5]
+            self.cantidadarticulos = linea[6]
+            self.totalapagar       = linea[7]
+            self.tipocliente       = linea[8]
+            self.cantidadlineas    = linea[9]
+
+            self.cab = dict( tipolinea         = self.tipolinea,
+                             codigocaja        = self.codigocaja,
+                             numeroticket      = self.numeroticket,
+                             codigocajera      = self.codigocajera       or None,
+                             timestampticket   = self.timestampticket,
+                             estadoticket      = self.estadoticket,
+                             cantidadarticulos = self.cantidadarticulos  or None,
+                             totalapagar       = self.totalapagar        or None,
+                             tipocliente       = self.tipocliente        or None,
+                             cantidadlineas    = self.cantidadlineas
+            )
+
+        else: #except Exception as ex:
+
+            msg  = ' %s [ ERROR ] Imposible inizializar la clase IPCabezal: la línea recibida ' % ns
+            msg += '\nno parece una línea de cabezal de ticket de SalidaPazos'
+            logging.error(msg)
+            sys.exit(1)
+
+# --- fin clase `IPCabezal`
+
+
+class IPLinea(IPTicket):
+
+    """
+        Hereda de IPTicket, representa a una línea de detalle de ticket
+        de Salidapazosnuevo.
+
+        ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
+
+
+        Diccionario (llave: valor) de "tipos de lineas de ticket".
+
+            En el diccionario de tipos, cada `llave` será el número que
+            identifica el tipo de línea de ticket, en tanto su valor`
+            será una lista (array) de dos elementos,
+
+            El primer elemento de ésta lista es un `string` que contiene
+            la descripción del tipo de línea de ticket.
+            El segundo elemento, también `string`, es el nombre de un método
+            que devuelve un objeto de datos de la línea, según sea llave.
+            Este segundo elemento se puede usar como invocación a dicho método.
+
+        La idea es ofrecer una clase se uso simple y flexible.
+        Ejemplo:
+
+            Tipo de línea: Total de ticket (4)
+
+            La línea represnta un ticket por un total de $774.05 e incluye
+            pago de servicio por $591.00
+
+                Total  774.05
+                Serv. -591.00
+                     --------
+                       183.05
+
+            en Salidapazos -> L#10#4#153713#774.05#21.97#183.05#21.97
+
+            Atributos específicos de éste tipo de línea:
+                TotalTicket # IvaTotalTicket # TotalTicketSinPagoServicios # IvaTotalTicketSinPagoServicios
+                   774.05   #      21.97     #           183.05            #            21.97
+
+            [código]
+                        from ticket import IPLinea
+
+                        linea   = ['10','4','153713','774.05','21.97','183.05','21.97']
+                        lin_obj = IPLinea(linea)
+                        data    = lin_obj.metodo()
+
+                        print( data['totalticket'],
+                               data['ivatotalticket'],
+                               data['totalticketsinpagoservicios'],
+                               data['ivatotalticketsinpagoservicios'] )
+            [/código]
+
+    """
+
+
+    def __init__(self, linea=None, id_cabezal=None):
+        """
+            :param linea: línea de nticket
+
+            El nombre `tipos_linea_tckes` denomina el diccionario de tipos de líneas.
+        """
+        tipos_linea_tck = {
+            '1'    : ('Venta de ítem'                       , self.lt_1),
+            '4'    : ('Total del ticket'                    , self.lt_4),
+            '5'    : ('Cabezal de CFE'                      , self.lt_5),
+            '6'    : ('Pié de CFE'                          , self.lt_6),
+            '7'    : ('Identificación de la cajera'         , self.lt_7),
+            '9'    : ('M.Pago de ticket en efectivo'        , self.lt_9),
+            '10'   : ('Cabezal de un combo'                 , self.lt_10),
+            '11'   : ('Detalle de combo'                    , self.lt_11),
+            '12'   : ('Cancelación de ítem'                 , self.lt_12),
+            '13'   : ('Descuento a un ítem'                 , self.lt_13),
+            '15'   : ('Puntos generados de fidel. ítem'     , self.lt_15),
+            '16'   : ('Puntos totales de fidel. generados'  , self.lt_16),
+            '18'   : ('Regalo de artículos'                 , self.lt_18),
+            '19'   : ('Cupón'                               , self.lt_19),
+            '20'   : ('Devolución de un ítem'               , self.lt_20),
+            '21'   : ('Entrada de cajera'                   , self.lt_21),
+            '22'   : ('Salida de cajera'                    , self.lt_22),
+            '23'   : ('Pausa de cajera'                     , self.lt_23),
+            '24'   : ('Cancelacion ticket'                  , self.lt_24),
+            '26'   : ('Cabezal de beneficio al total'       , self.lt_26),
+            '27'   : ('Detalle de un beneficio al total'    , self.lt_27),
+            '28'   : ('Descuento al total'                  , self.lt_28),
+            '29'   : ('Devolución de envases'               , self.lt_29),
+            '30'   : ('Venta a la subfamilia'               , self.lt_30),
+            '32'   : ('Inventario'                          , self.lt_32),
+            '33'   : ('Canje de ítem'                       , self.lt_33),
+            '34'   : ('Información de cliente de fidel.'    , self.lt_34),
+            '35'   : ('Cancelación de un canje de ítem'     , self.lt_35),
+            '36'   : ('Total de canje'                      , self.lt_36),
+            '37'   : ('M.Pago con tarjeta'                  , self.lt_37),
+            '38'   : ('M.Pago con cheque'                   , self.lt_38),
+            '40'   : ('M.Pago luncheon ticket'              , self.lt_40),
+            '43'   : ('Voucher de la tarjeta'               , self.lt_43),
+            '44'   : ('Datos adicionales garantía articulo' , self.lt_44),
+            '47'   : ('Pago de servicio'                    , self.lt_47),
+            '49'   : ('Detalle beneficios med.pago-moneda'  , self.lt_49),
+            '52'   : ('M.Pago de caja'                      , self.lt_52),
+            '53'   : ('Tipo de ticket'                      , self.lt_53),
+            '55'   : ('Intervención de la supervisora'      , self.lt_55),
+            '56'   : ('Cancelacion de un pago de servicio'  , self.lt_56),
+            '57'   : ('Tipo de cliente'                     , self.lt_57),
+            '58'   : ('Ticket de cancelación de pago'       , self.lt_58),
+            '60'   : ('Cupón'                               , self.lt_60),
+            '61'   : ('Pedidos'                             , self.lt_61),
+            '62'   : ('Fin de pausa de cajera'              , self.lt_62),
+            '63'   : ('Redondeo importe total del ticket'   , self.lt_63),
+            '65'   : ('Puntos de fidelización'              , self.lt_65),
+            '67'   : ('M.Pago de cupón corporativo'         , self.lt_67),
+            '68'   : ('Id. Cliente '                        , self.lt_68),
+            '71'   : ('Puntos no generadas'                 , self.lt_71),
+            '72'   : ('Descuento para parking'              , self.lt_72),
+            '73'   : ('Ticket Z'                            , self.lt_73),
+            '76'   : ('Descuento producido por marcas'      , self.lt_76),
+            '77'   : ('Cabezal de marca'                    , self.lt_77),
+            '78'   : ('Detalle de la marca'                 , self.lt_78),
+            '81'   : ('Devolución de pago de servicio'      , self.lt_81),
+            '82'   : ('Consulta e.de cuenta de la cobranza.', self.lt_82),
+            '83'   : ('Voucher de la cobranza'              , self.lt_83),
+            '84'   : ('Apertura de gaveta'                  , self.lt_84),
+            '85'   : ('M.Pago de tarjeta offline'           , self.lt_85),
+            '86'   : ('Recargo'                             , self.lt_86),
+            '87'   : ('Descuento a los med.pago-moneda.'    , self.lt_87),
+            '88'   : ('Venta cómputos celular'              , self.lt_88),
+            '89'   : ('Devolución venta cómputos celular'   , self.lt_89),
+            '92'   : ('Linea de factura'                    , self.lt_92),
+            '90'   : ('M.Pago ticket TAlimentos'            , self.lt_90),
+            '91'   : ('M.Pago ticket Total'                 , self.lt_91),
+            '94'   : ('Pago con cheque cobranza'            , self.lt_94),
+            '95'   : ('Ticket de fondeo'                    , self.lt_95),
+            '97'   : ('Ticket de retiro'                    , self.lt_97),
+            '99'   : ('Cupones Numeros'                     , self.lt_99),
+            '100'  : ('Ticket de cobranza'                  , self.lt_100),
+            '101'  : ('Ticket de devolución de cobranza'    , self.lt_101),
+            '102'  : ('Ticket cancelacion de cobranza'      , self.lt_102),
+            '103'  : ('Cancelación de salida de cajera'     , self.lt_103),
+            '104'  : ('Seteo monto de prestamo en efectivo' , self.lt_104),
+            '105'  : ('Prestamo en efectivo'                , self.lt_105),
+            '106'  : ('Ticket del cliente de facturación '  , self.lt_106),
+            '107'  : ('Ticket de información del cliente'   , self.lt_107),
+            '108'  : ('Ticket gift card'                    , self.lt_108),
+            '109'  : ('Ticket devolución gift card'         , self.lt_109),
+            '115'  : ('Pago descuento iva a familia'        , self.lt_115),
+            '117'  : ('Preventa'                            , self.lt_117),
+            '118'  : ('Ticket vale almuerzo'                , self.lt_118),
+            '119'  : ('Ticket pago vale almuerzo'           , self.lt_119),
+            '120'  : ('Venta Mides'                         , self.lt_120),
+            '121'  : ('Voucher retiro leche tarjeta Mides'  , self.lt_121),
+            '122'  : ('Ticket info importe'                 , self.lt_122),
+            '123'  : ('M.Pago TCRE'                         , self.lt_123),
+            '124'  : ('Voucher de la tarjeta TCRE'          , self.lt_124),
+            '125'  : ('Total puntos PROMO'                  , self.lt_125),
+            '126'  : ('Ticket cliente de cuenta corriente'  , self.lt_126),
+            '127'  : ('M.Pago cuenta corriente'             , self.lt_127),
+            '900'  : ('Declaración de cajera'               , self.lt_900)
+        }
+
+        try:
+            """
+                Atributos compartidos por todas las `Líneas de Detalle`
+                ------------------------------------------------------
+
+                     numerodelinea  ->   número secuencial de la línea en el ticket
+                     tipolinea      ->   llave
+                     horalinea      ->   hhmss
+
+            """
+            self.rlinea        = 'L#' + '#'.join(linea)      # reconstruye linea original para debug
+            self.numerodelinea = linea[0]                    # Número de línea
+            self.llave         = llave = linea[1]            # Tipo de línea de ticket
+            self.descripcion   = tipos_linea_tck[llave][0]   # Descripción del  Tipo de línea de ticket
+            self.metodo        = tipos_linea_tck[llave][1]   # Método implementado para el tipo de línea de ticket
+
+            self.hora   = ipt.hora(linea[2])                 # hh:mm:ss
+            self.hhmmss = ipt.hhmmss(linea[2])               # hhmmss
+            self.horalinea = ipt.hhmmss(linea[2])
+
+            self.esta_linea = linea[3:] # línea sin los elementos compartidos. (se usa en los métodos)
+            self.id_tck     = id_cabezal
+            self.id_linea   = self.id_tck + self.hhmmss + self.numerodelinea
+        except Exception as ex:
+            import ipdb; ipdb.set_trace()
+            msg  = ' %s [ ERROR ] Imposible inizializar la clase IPLinea: la línea recibida ' % ns
+            msg += '\nno parece una línea de cabezal de ticket de SalidaPazos'
+            logging.info(msg)
+            logging.error("%s \n%s" % (ex, linea))
+            print ("%s  %s" % (msg, "Vea el log!"))
+            sys.exit(1)
+
+
+
+    """
+        Métodos "lt_nnn":
+        '''''''''''''''''
+                            Son métodos específicos para cada tipo de linea
+        cuya referencia cunsituye el segundo elemento de la lista de valores
+        en el diccionario de tipos.
+
+        Se han definido los métodos correspondiente a los tipos de líneas de
+        interés así como los encabezados para el resto de los métodos
+        'nombrados' en el diccionario de tipos.
+        A medida que sea necesario se irá desarrollando el resto. Por el
+        momento son `enduído` para namespaces.
+    """
+
+    def lt_1(self):
+        """
+            Línea de venta de ítem (1)-SM.
+            ------------------------------
+            (sin atributos comunes) `Tipo Líneas de Detalle`
+
+            IdentificadorLinea # NumeroDeLinea # TipoLinea  # TimestampLinea #
+
+
+            CodigoArticulo # Cantidad # Precio # Iva # PrecioDescuento # IvaDescuento #
+                   0            1         2       3          4                5
+
+            PrecioDescuentoCombo # IvaDescuentoCombo # PrecioDescuentoMarca #
+                     6                    7                   8
+
+            IvaDescuentoMarca  #   PrecioDescuentoTotal # IvaDescuentoTotal #
+                    9                    10                      11
+
+            CantDescManuales # LineaCancelada # ModoIngreso # CodigoVendedor #
+                12                  13             14            15
+
+            Talle # Color # Marca # Modelo # SiEsTandem # CodigoArticuloOriginal #
+              16      17      18      19       20                  21
+
+            CodigoIva # SiAplicaDescFidel # MontoRealDescFidel # PrecioUnitario
+                  22          23                      24               25
+
+
+            Descripción:
+
+            0. codigoarticulo         Código interno del artículo.
+
+            1. cantidad               Cantidad de artículos vendidos en esa línea. Es la cantidad que
+                                            sale impresa en el ticket.
+
+            2. precio                 Precio de la línea del articulo (cantidad x precio unitario)
+                                            expresado en la moneda de referencia. Es el precio “limpio”
+                                            al cual no se le efectuó ningún descuento (no incluye iva,
+                                            este va separado en el siguiente campo).
+
+            3. iva                    Iva de la línea del artículo expresado en la moneda de referencia.
+
+            4. preciodescuento        Precio de la línea del artículo a la cual se aplicó un descuento
+                                            directo. Si esta es igual a Precio la línea no fue afectada
+                                            por un descuento directo.
+
+            5. ivadescuento           Iva del descuento directo de la línea del articulo.
+
+            6. preciodescuentocombo   Precio de la línea del articulo la cual fue afectada por un
+                                            descuento de un Combo. Si el artículo pertenece a un combo y
+                                            este se efectuó, se le aplicará el descuento correspondiente
+                                            (excepto si el Combo otorga un descuento al total).
+                                            Si el importe es igual a PrecioDescuento la línea no fue
+                                            afectada por un descuento del Combo.
+            7. ivadescuentocombo      Iva del descuento del combo a la línea del artículo.
+
+            8. preciodescuentomarca   Precio de la línea del articulo la cual fue afectada por un
+                                            descuento por Marcas. Si el artículo pertenece a una Marca
+                                            y esta se efectuó, se le aplicará el descuento correspondiente
+                                            (excepto si la Marca otorga un descuento al total). Si el
+                                            importe es igual a PrecioDescuentoCombo la línea no fue
+                                            afectada por un descuento de Marca.
+
+            9. ivadescuentomarca      Iva del descuento a la Marca a la línea del artículo.
+
+           10. preciodescuentototal   Precio de la línea del artìculo la cual fue afectada por un
+                                            descuento al total. Si bien es un descuento al total, se
+                                            prorratea a las líneas. Si esta es igual a PrecioDescuentoMarca
+                                            la línea no fue afectada por un descuento al total. Nota: Este
+                                            es el precio final de artículo una vez aplicado todos los
+                                            descuentos si corresponde (sino conserva el precio original),
+                                            por lo tanto si se va a procesar los importes de los artículos,
+                                            se debe tomar este valor mas el iva.
+
+           11. ivadescuentototal      Iva del descuento al total a la línea del artículo.
+
+           12. cantdescmanuales       Cantidad de descuentos manuales que realizó la cajera.
+
+           13. lineacancelada         Estado
+                                        0-Línea no cancelada.
+                                        1-Línea cancelada.
+                                            Este tipo de línea no tiene valor contable. A pesar
+                                            que pudo haber sido afectada por descuentos, esta no
+                                            se debe tomar en cuenta.
+
+           14. modoingreso            Modo de ingreso del artículo. Son los siguientes:
+                                        0-De teclado.
+                                        1-De scanner.
+                                        2-Lectora de banda magnética.
+
+           15. codigovendedor         Código de vendedor si aplica, sino va vacío.
+
+           16. talle                  Datos del talle si aplica, sino va vacío.
+
+           17. color                  Color si aplica, sino va vacío.
+
+           18. marca                  Marca si aplica, sino va vacío.
+
+           19. modelo                 Modelo si aplica, sino va vacío.
+
+           20. siestandem             Es tandem.
+                                        0 - No es artículo de tandem.
+                                        1 - Es artículo de tandem.
+
+           21. codigoarticulooriginal Es el código original del artículo que ingresó la cajera, ya
+                                            sea el código de barras entero o el código digitado manualmente.
+                                            En el caso de repetir el ultimo articulo ingresado este campo
+                                            no se setea, ya que la cajera no lo ingresa en forma explicita.
+
+           22. codigoiva              Código de iva aplicado.Si no aplica IVA va 0.
+
+           23. siaplicadescfidel      Flag que indica si a la línea se le aplico control de descuento
+                                            al total por fidelización.
+                                        0-No se aplico control de descuento.
+                                        1-Se aplico control de descuento (ver MontoRealDescFidel).
+
+           24. montorealdescfidel     Monto real del descuento controlado por fidelizacion.
+
+           25. preciounitario         Precio unitario del item (precio de lista que incluye IVA).
+
+        """
+
+        lin = self.esta_linea or False
+
+        iva_map = { '1': 0.22, '2': 0.10, '3': 0 }
+        result = dict()
+
+        try:
+            result.update(dict( codigoarticulo         = lin[0],
+                                cantidad               = lin[1],
+                                precio                 = lin[2], # es el IMPORTE sin iva y sin descuentos de la línea
+                                iva                    = lin[3],
+                                preciodescuento        = lin[4],
+                                ivadescuento           = lin[5],
+                                preciodescuentocombo   = lin[6],
+                                ivadescuentocombo      = lin[7],
+                                preciodescuentomarca   = lin[8],
+                                ivadescuentomarca      = lin[9],
+                                preciodescuentototal   = lin[10],
+                                ivadescuentototal      = lin[11],
+                                cantdescmanuales       = lin[12],
+                                lineacancelada         = lin[13],
+                                modoingreso            = lin[14],
+                                codigovendedor         = lin[15],
+                                talle                  = lin[16],
+                                color                  = lin[17],
+                                marca                  = lin[18],
+                                modelo                 = lin[19],
+                                siestandem             = lin[20],
+                                codigoarticulooriginal = lin[21],
+                                codigoiva              = lin[22],
+                                siaplicadescfidel      = lin[23],
+                                montorealdescfidel     = lin[24],
+                                preciounitario         = lin[25], # precio unitario "de lista" con iva
+            ))
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_4(self):
+
+        """
+            Línea de total del ticket (4)
+            Contiene el total del ticket:
+
+            TotalTicket # IvaTotalTicket # TotalTicketSinPagoServicios # IvaTotalTicketSinPagoServicios
+                 0              1                     2                                3
+            TotalTicket     ->  Importe total del ticket (incluye el iva).
+
+            IvaTotalTicket  ->  Iva del total de ticket (que esta sumado en TotalTicket).
+
+            TotalTicketSinPagoServicios ->  Total del ticket excluyendo los pagos de
+                servicios (incluye el iva). Si no hubo pago de servicios es igual que
+                TotalTicket.
+
+            IvaTotalTicketSinPagoServicios  ->  Iva del importe anterior (que esta sumado a
+                TotalTicketSinPagoServicios).
+
+            Ejemplo de total de ticket sin pago de servicios con un total de 261.76:
+            L#13#4#181644#261.76#47.21#261.76#47.21
+
+            Ejemplo de un total de ticket con un total de 774.05 que incluye un pago de servicio de
+            774.05 -183.05=591.00 (UTE):
+            L#10#4#153713#774.05#21.97#183.05#21.97
+
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {'totalticket': lin[0],
+                      'ivatotalticket': lin[1],
+                      'totalticketsinpagoservicios': lin[2],
+                      'ivatotalticketsinpagoservicios': lin[3]
+                      }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_5(self):
+        """
+            Línea de cabezal CFE (5)
+
+            Si el sistema utiliza el modo de Comprobante Fiscal Electronico representa los datos del
+            cabezal del documento electronico:
+
+            TipoCFE #  DescripcionCFE # SerieCFE # NumeroCFE # TipoDocumentoReceptor
+               0             1             2           3                4
+            DocumentoReceptor # NombreReceptor # DireccionReceptor # CiudadReceptor
+                  5                   6                 7                 8
+
+            TipoCFE     -> Tipo de comprobante, estos pueden ser:
+                            101 e-Ticket
+                            102 Nota de Crédito de e-Ticket
+                            103 Nota de Débito de e-Ticket
+                            111 e-Factura
+                            112 Nota de Crédito de e-Factura
+                            113 Nota de Débito de e-Factura
+                            181 e-Remito
+                            182 e-Resguardo
+                            201 e-Ticket Contingencia
+                            202 Nota de Crédito de e-Ticket Contingencia
+                            203 Nota de Débito de e-Ticket Contingencia
+                            211 e-Factura Contingencia
+                            212 Nota de Crédito de e-Factura Contingencia
+                            213 Nota de Débito de e-Factura Contingencia
+                            281 e-Remito Contingencia
+                            282 e-Resguardo Contingencia
+
+            DescripcionCFE  -> Descripcion del tipo de CFE (ver arriba).
+
+            SerieCFE        -> Serie del CFE.
+
+            NumeroCFE       -> Número del CFE.
+
+            TipoDocumentoReceptor -> Tipo de documento del receptor del CFE.
+                este campo es opcional en eTicket y obligatorio en eFactura
+                (asímismo en sus recpectivos NdeCr. y NdeDeb.)
+
+                Los valores pueden ser:
+
+                    0: No usado.
+                    2: RUC (Uruguay)
+                    3: C.I. (Uruguay)
+                    4: Otros
+                    5: Pasaporte (todos los países)
+                    6: DNI (documento de identidad de Argentina, Brasil, Chile o Paraguay).
+
+            DocumentoReceptor->Documento del receptor del CFE si es factura.
+
+            NombreReceptor->Nombre del cliente receptor del CFE si es factura.
+
+            DireccionReceptor->Direccion del cliente receptor del CFE si es factura.
+
+            CiudadReceptor-> Ciudad del cliente receptor del CFE si es factura.
+
+            Ejemplo de un tipo Cfe 112 (Nota de credito de una e-Factura), con serie Cfe AA y
+            numero Cfe 5, tipo de documento 2 (Ruc) y numero de RUC 215303240017, a nombre
+            de Objetos T &S cuya direccion es Bacigalupi 2158 en la ciudad de Montevideo.
+            L#1#5#164324#112#Nota de Crédito de e-Factura# AA# 0000005# 2# 215303240017#
+            Objetos T &S # Bacigalupi 2158# Montevideo
+
+            Ejemplo de un tipo de Cfe 101 (e-Ticket) con serie AA y numero 10.
+            L#1#5#181708#101#e-Ticket#AA#0000010#0####
+
+            IdentificadorLinea # NumeroDeLinea # TipoLinea # TimestampLinea # (no se usan)
+
+            TipoCFE #  DescripcionCFE # SerieCFE # NumeroCFE # TipoDocumentoReceptor
+               0             1             2           3                4
+            DocumentoReceptor # NombreReceptor # DireccionReceptor # CiudadReceptor
+                   5                  6                7                   8
+
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'tipocfe'               : lin[0],
+                        'descripcioncfe'        : lin[1],
+                        'seriecfe'              : lin[2],
+                        'numerocfe'             : lin[3],
+                        'tipodocumentoreceptor' : lin[4],
+                        'documentoreceptor'     : lin[5],
+                        'nombrereceptor'        : lin[6],
+                        'direccionreceptor'     : lin[7],
+                        'ciudadreceptor'        : lin[8]
+            }
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_6(self):
+
+        """
+            Línea de pie CFE (6) pie del documento electronico:
+
+            Cliente # LinkDGI # TipoCFE # RucEmisor # NumeroCFE # FechaCFE # MontoNeto # Hash # CodigoCAE # SerieCFE
+               0         1         2         3           4           5           6         7        8           9
+            NroInicioCAE # NroFinCAE # FechaVencimientoCAE
+                10            11                12
+
+            NombreCliente       -> Nombre del cliente de fidelización (no de CFE, puede venir vacio si no aplica).
+            LinkDGI             -> Link al portal DGI.
+            TipoCFE             -> Tipo de CFE.
+            RucEmisor           -> Ruc de quien emite el CFE.
+            NumeroCFE           -> Numero de CFE.
+            FechaCFE            -> Fecha de emision del CFE (AAAAMMDD).
+            MontoNeto           -> Monto neto del CFE.
+            Hash                -> Hash del CFE (los 6 primeros caracteres se utiliza como codigo de seguridad).
+            CodigoCAE           -> Codigo de CAE.
+            NroInicioCAE        -> Rango de inicio de la CAE.
+            NroFinCAE           -> Rango fin de la CAE.
+            FechaVencimientoCAE -> Fecha de vencimiento de la CAE(AAAAMMDDHHmmSS).
+
+            Ejemplo de un Cfe tipo 101 cuyo Ruc Emisor es 210297450018, numero de CFE 284, con fecha de emision del CFE 2015/11/11 con un monto neto de 699.00, el hash del CFE es aeSfsWawQz4h9d1XuHnxW24eLNQ= , el codigo de CAE 90115003001,serie de Cfe AC, numero de inicio de rango de CAE 1 y fin 10000 con fecha de vencimiento 2015/12/31/ 00:00:00
+
+            L#12#6#170634# #https://www.efactura.dgi.gub.uy/consultaQR/cfe?#101#210297450018#0000284#2015 1111#699.00#aeSfsWawQz4h9d1XuHnxW24eLNQ=#90115003001#AC#1#10000#20 151231000000
+
+        """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                'cliente'             : lin[0],
+                'linkdgi'             : lin[1],
+                'tipocfe'             : lin[2],
+                'rucemisor'           : lin[3],
+                'numerocfe'           : lin[4],
+                'fechacfe'            : lin[5],
+                'montoneto'           : lin[6],
+                'hash'                : lin[7],
+                'codigocae'           : lin[8],
+                'seriecfe'            : lin[9],
+                'nroiniciocae'        : lin[10],
+                'nrofincae'           : lin[11],
+                'fechavencimientocae' : lin[12]
+            }
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_7(self):
+        """
+            Línea de identificación de la cajera (7).
+            ----------------------------------------
+
+            CodigoCajera # Nombre
+            0.Código
+            1.Nombre
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = { 'codigocajera': lin[0], 'nombrecajera': lin[1] }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_9(self):
+        """
+        Línea de pago de ticket en efectivo (9).
+        ---------------------------------------
+
+        CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+               0                1                 2
+
+        TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                    3                               4
+
+
+        TotalPagadoMonedaReferencia # Cambio # TipoOperacion # LineaUltimoPago #
+                    5                    6          7                8
+
+        AutorizaSupervisora # CodigoSupervisora # LineaCancelada
+                 9                    10                11
+
+        0. Código del medio de pago.
+        1. Código de la moneda.
+        2. Monto total de lo que se puede pagar con el medio de pago moneda.
+        3. Idem que el anterior pero expresado en la moneda de referencia.
+        4. Total entregado de ese medio de pago-moneda.
+        5. Total entregado expresado en la moneda de referencia.
+        6. Cambio de la línea de pago (valor >= 0.00)
+        7. Codigo de Operacion.
+                0 - Si corresponde a una venta (los importes van en positivo).
+                1 - Si corresponde a una devolución por parte del cliente (los
+                    importes van en negativo).
+        8. Ultimo pago.
+                0 - No es la línea del último pago. Esto sucede cuando el ticket
+                    se paga con múltiples pagos (inclusive de distintos medios
+                    de pago-monedas) cuando el importe abonado es menor al
+                    total a pagar.
+                1 - Es la línea del último pago.
+        9. Intervención supervisor.
+                0 - Línea de pago sin intervención de supervisor.
+                1 - Línea de pago autorizada por supervidor.
+       10. Código de la supervisora.
+       11. Estado de la línea de pago.
+            0-Línea de pago no cancelada.
+            1-Línea de pago cancelada.
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                'codigomediopago'                       : lin[0],
+                'codigomoneda'                          : lin[1],
+                'totalmediopagomoneda'                  : lin[2], # monto pagable en éste medio de pago expresado en la moneda usada.
+                'totalmediopagomonedamonedareferencia'  : lin[3], # lo mismo pero expresado en mon.referencia (PESOS)
+                'totalpagado'                           : lin[4], # Total recibido en la moneda usada.
+                'totalpagadomonedareferencia'           : lin[5], # lo mismo pero expresado en moneda de referencia (PESOS)
+                'cambio'                                : lin[6],
+                'tipooperacion'                         : lin[7],
+                'lineaultimopago'                       : lin[8],
+                'autorizasupervisora'                   : lin[9],
+                'codigosupervisora'                     : lin[10],
+                'lineacancelada'                        : lin[11],
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_10(self):
+        """ Cabezal de un combo """
+        pass
+
+
+    def lt_11(self):
+        """Detalle de combo"""
+        pass
+
+
+    def lt_12(self):
+        """
+            Línea de cancelación de ítem (12).
+            ----------------------------------
+
+            La línea de cancelación de un artículo se produce cuando se cancela
+            una línea registrada de venta de artículo.
+
+            CodigoArtSubf # NroLineaVta # Importe # IndicadorArtSubf # NombreSupervisora # CodigoVendedor
+                  0             1            2              3                 4                 5
+            CodigoArtSubf-> Código del artículo o subfamilia que se cancela.
+            NroLineaVta-> Número de línea de venta que se cancela.
+                          Esto sirve para indicar cuando hay mas de un artículo
+                          de mismo código en la venta y se cancelo uno en particular.
+                          Este numero de línea de venta no corresponde a NumeroDeLinea
+                          (segundo campo) que es el numero de línea de ticket,
+                          sino al numero de línea de venta de tipo 1 (es decir, el numero
+                          de línea de venta de tipo 1 del ticket), o sea hay que contar
+                          los tipos de línea de venta 1 para llegar a la línea de venta
+                          cancelada.
+            Importe-> Importe cancelado. Es a nivel informativo, ya que debe coincidir con
+                      el importe de la línea de venta.Incluye Iva.
+            IndicadorArtSubf-> A-Cancelación de artículo.
+                               S-Cancelación de Subfamilia.
+                               C-Cancelación de Cobranza.
+                               T-Cancelación de artículo de tandem.
+            NombreSupervisora-> Nombre de la supervisora que intervino en la cancelación
+                                (también a nivel informativo).
+            CodigoVendedor-> Código de vendedor si la caja está configurado para utilizar vendedor.
+                             Si no hay vendedor va vacío.
+
+            Ejemplo de una línea de venta del artículo 241800, de importe 11.20 que fue cancelada (1):
+            L#6#1#191524#241800#1.000#9.18#2.02#9.18#2.02#9.18#2.02#9.18#2.02#9.18#2.02#0#1#1######0
+            El artículo 241800 fue cancelado, corresponde a la primera línea de venta,
+            el importe cancelado es de 11,20 (que también coincide con el importe de
+            la línea de venta 9.18 + 2.02).
+            El código de vendedor es 12:
+            L#8#12#191524#241800#1#-11.20#A#Supervisora Uno#12
+            Ejemplo de cancelación de subfamilia 3 por 250 pesos, sin código de vendedor.
+            L#9#12#133552#3#1#-250.00#S#Supervisora Uno#
+            La línea de venta de subfamilia 3 (tipo 30) que fue cancelada es:
+            L#7#30#133552#3#1.000#204.92#45.08#204.92#45.08#204.92#45.08##1#0
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                    'codigoarticulosubf'     : lin[0],
+                    'nrolineavta'            : lin[1],
+                    'importe_cancelado'      : lin[2],
+                    'indicadorartsubf'       : lin[3],
+                    'nombresupervisora'      : lin[4],
+                    'codigovendedor'         : lin[5],
+            }
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_13(self):
+        """Descuento a un ítem"""
+        pass
+
+
+    def lt_15(self):
+        """Puntos generados de fidelización por el ítem"""
+        pass
+
+
+    def lt_16(self):
+        """Puntos totales de fidelización generados"""
+        pass
+
+
+    def lt_18(self):
+        """Regalo de artículos"""
+        pass
+
+
+    def lt_19(self):
+        """Cupón"""
+        pass
+
+
+    def lt_20(self):
+        """
+            Línea de devolución de un ítem (20) -SM.
+            Representa la línea de devolución de artículos.
+            IdentificadorLinea # NumeroDeLinea # TipoLinea # TimestampLinea #
+            CodigoArticuloSubf # Cantidad # Precio # Iva # IndicadorArtSubf # CodigoSupervisora # CodigoArticuloOriginal
+                    0                1         2       3          4                   5                     6
+            ModoIngreso # CodigoVendedor # LineaCancelada # PrecioDescuento # IvaDescuento # CodigoIva # PrecioInicial
+                 7              8               9                 10               11            12           13
+            IvaPrecioInicial
+                  14
+
+            CodigoArticuloSubf              ->  Código de artículo/subfamilia.
+            Cantidad                        ->  Cantidad de ítems devueltos.
+            Precio                          ->  Precio del ítem (en negativo).El precio no siempre puede coincidir con
+                                                el de venta (si es que se vendió, pues puedo devolver un artículo que
+                                                no es parte de la venta), pues se puede imputar un precio distinto al
+                                                de lista (generalmente sucede cuando el artículo tuvo descuentos o
+                                                estaba de oferta).
+            Iva                             ->  Iva del ítem (en negativo).
+            IndicadorArtSubf                ->  A - Devolución de artículo.
+                                                S - Devolución de subfamilia.
+            CodigoSupervisora               ->  Código de la supervisora.
+            CodigoArticuloOriginal          ->  Es el código original del artículo que ingresó la cajera, ya sea el
+                                                código de barras entero o el código digitado manualmente.
+            ModoIngreso                     ->  Modo de ingreso del artículo/subfamilia. Son los siguientes:
+                                                0 - De teclado.
+                                                1 - De scanner.
+                                                2 - Lectora de banda magnética.
+            CodigoVendedor                  ->  Código de vendedor si la caja está configurado para utilizar
+                                                vendedor. Si no hay vendedor va vacío.
+
+            LineaCancelada                  ->  0 - Línea no cancelada.
+                                                1 - Línea cancelada. La devolución del item fue cancelada y no debe ser
+                                                tomada en cuenta como valor contable.
+            PrecioDescuento                 ->  Precio del Articulo con sus cantidades ya con descuentos aplicados.
+            IvaDescuento                    ->  Contiene el IVA del articulo con sus cantidades ya con descuentos
+                                                aplicados.
+            CodigoIva                       ->  Codigo de iva.
+
+
+            Ejemplo de la línea de venta del artículo 972197 por 235.30 pesos y 51.76 de iva.
+            L#7#1#154232#972197#1.000#235.30#51.76#235.30#51.76 #235.30#51.76 #235.30#51.76#235.30#51.76 #0#0#0######0#1
+
+            Devolución del mismo artículo, con código de vendedor 12:
+            L#9#20#154232#972199#1.000#-235.30#-51.76#A#1#972199#1#12#0#-235.30#-51.76#1#-235.30#-51.76
+
+            Línea de devolución de un ítem (20) -SM. Representa la línea de devolución de artículos.
+
+
+
+        CodigoArticuloSubf # Cantidad # Precio # Iva # IndicadorArtSubf # CodigoSupervisora # CodigoArticuloOriginal #
+                0               1          2      3           4                 5                        6
+        ModoIngreso # CodigoVendedor # LineaCancelada # PrecioDescuento # IvaDescuento # CodigoIva
+              7           8                   9              10                11            12
+
+        """
+
+        #if self.id_linea ==  '20171204001841611545328':
+        #    import ipdb;ipdb.set_trace()
+
+        lin = self.esta_linea or False
+        result = {}
+        try:
+            result = dict(  codigoarticulosubf      = lin[ 0] or None,
+                            cantidad                = lin[ 1] or None,
+                            precio                  = lin[ 2] or None,
+                            iva                     = lin[ 3] or None,
+                            indicadorartsubf        = lin[ 4] or None,
+                            codigosupervisora       = lin[ 5] or None,
+                            codigoarticulooriginal  = lin[ 6] or None,
+                            modoingreso             = lin[ 7] or None,
+                            codigovendedor          = lin[ 8] or ' ',
+                            lineacancelada          = lin[ 9] or None,
+                            preciodescuento         = lin[10] or None,
+                            ivadescuento            = lin[11] or None,
+                            codigoiva               = lin[12] or None,
+                        )
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_21(self):
+        """Entrada de cajera"""
+        pass
+
+
+    def lt_22(self):
+        """Salida de cajera"""
+        pass
+
+
+    def lt_23(self):
+        """Pausa de cajera"""
+        pass
+
+
+    def lt_24(self):
+        """Cancelacion ticket"""
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {'texto': lin[0]}
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_26(self):
+        """Cabezal de beneficio al total"""
+        pass
+
+
+    def lt_27(self):
+        """Detalle de un beneficio al total"""
+        pass
+
+
+    def lt_28(self):
+        """Descuento al total"""
+        pass
+
+
+    def lt_29(self):
+        """ Línea de devolución de envases (29).
+            Representa las líneas de ticket de devolución de envases.
+            IdentificadorLinea # NumeroDeLinea # TipoLinea # TimestampLinea # Importe # Iva
+            Importe->Importe de la devolución de envases.
+            Iva->Iva del importe.
+            Ejemplo de devolución de envases por 8.20 + 1.80 = 10.00
+            L#6#29#160110#8.20#1.80
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                'importe': lin[0],
+                'iva'    : lin[1]
+            }
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+    def lt_30(self):
+
+        """
+            Línea de venta a la subfamilia (30).
+            -----------------------------------
+
+            Representa las líneas de tickets de venta por imputación a una subfamilia.
+
+            Código-> Código de la subfamilia.
+            Cantidad-> Cantidad imputada a la subfamilia.
+            Precio-> Precio imputado a la subfamilia.
+            Iva-> Iva del precio.
+            ImporteDescuento-> Importe de la línea a la cual se aplicó un descuento directo. Si esta es igual a Precio la línea no fue afectada por un descuento directo.
+            IvaDescuento-> Iva del descuento.
+            ImporteDescuentoTotal-> Importe de la línea la cual fue afectada por un descuento al total. Si bien es un descuento al total, se prorratea a las líneas. Si esta es igual a ImporteDescuento la línea no fue afectada por un descuento al total.
+            IvaImporteDescuentoTotal-> Iva del importe del descuento al total.
+            CodigoVendedor-> Código de vendedor si aplica, sino va vacío.
+            LineaCancelada-> 0-Línea no cancelada.
+                            1-Línea cancelada.
+                                Este tipo de línea no tiene valor contable.
+                                A pesar que pudo haber sido afectada por descuentos, esta no se debe tomar en cuenta.
+            ModoIngreso-> Modo de ingreso del artículo. Son los siguientes:
+                            0-De teclado.
+                            1-De scanner.
+                            2-Lectora de banda magnética.
+
+            Código # Cantidad # Precio # Iva # ImporteDescuento # IvaDescuento # ImporteDescuentoTotal # IvaImporteDescuentoTotal # CodigoVendedor # LineaCancelada # ModoIngreso
+               0         1        2       3           4                5                 6                          7                     8               9               10
+            Ejemplo de una venta a la subfamilia 3 con cantidad unitaria, por in importe de 18.85 + 4.15 = 23.00, el cual no tuvo ni descuentos directos ni al total, sin vendedor, la línea no está cancelada y se ingresó por teclado.
+            L#8#30#160219#3#1.000#18.85#4.15#18.85#4.15#18.85#4.15##0#0
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                 'codigo'                   : lin[0],
+                 'cantidad'                 : lin[1],
+                 'precio'                   : lin[2],
+                 'iva'                      : lin[3],
+                 'importedescuento'         : lin[4],
+                 'ivadescuento'             : lin[5],
+                 'importedescuentototal'    : lin[6],
+                 'ivaimportedescuentototal' : lin[7],
+                 'codigovendedor'           : lin[8],
+                 'lineacancelada'           : lin[9],
+                 'modoingreso'              : lin[10]
+                }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_32(self):
+        pass
+
+
+    def lt_33(self):
+        pass
+
+
+    def lt_34(self):
+        pass
+
+
+    def lt_35(self):
+        pass
+
+
+    def lt_36(self):
+        pass
+
+
+    def lt_37(self):
+        """
+        Pago con tarjeta
+        ----------------
+
+
+         0. Código del medio de pago.
+         1. Código de la moneda.
+         2. Monto total de lo que se puede pagar con el medio de pago moneda.
+         3. Idem que el anterior pero expresado en la moneda de referencia.
+         4. Total entregado de ese medio de pago-moneda.
+         5. Total entregado expresado en la moneda de referencia.
+         6. Cambio de la línea de pago (valor >= 0.00)
+         7. Codigo de Operacion.
+                 0 - Si corresponde a una venta (los importes van en positivo).
+                 1 - Si corresponde a una devolución por parte del cliente (los
+                     importes van en negativo).
+         8. Ultimo pago.
+                 0 - No es la línea del último pago. Esto sucede cuando el ticket
+                     se paga con múltiples pagos (inclusive de distintos medios
+                     de pago-monedas) cuando el importe abonado es menor al
+                     total a pagar.
+                 1 - Es la línea del último pago.
+         9. Numero de la tarjeta.
+        10. Cuotas.
+        11. Nro. de autorización del emisor.
+        12. Tipo de tarjeta - undocumented.
+        13. Intervención supervisor.
+                  0 - Línea de pago sin intervención de supervisor.
+                  1 - Línea de pago autorizada por supervidor.
+        15. Código de la supervisora.
+        15. Estado de la línea de pago.
+             0-Línea de pago no cancelada.
+             1-Línea de pago cancelada.
+        16. Plan utilizado por la tarjeta.
+        17. Numero de comercio al que pertenece el socio titular de la tarjeta.
+        18. Si aplica ley descuento iva
+        19. Monto Descuento Ley Iva
+        20. Texto Ley
+        21. Tarjeta de Debito/Credito.
+                 0 - No especificado.
+                 1 - La tarjeta es de credito.
+                 2 - La tarjeta es de debito.
+
+        CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+               0              1                   2
+
+        TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                        3                           4
+
+        TotalPagadoMonedaReferencia # Cambio # TipoOperacion # LineaUltimoPago #
+               5                         6           7             8
+
+        NumeroTarjetaCredito # CuotasTarjetaCredito #
+            9                   10
+
+        NumeroAutorizacionTarjetaCredito # TipoTarjetaCredito # AutorizaSupervisora  #
+                  11                              12                  13
+
+        CodigoSupervisora # LineaCancelada # Plan # NroComercio #
+                14                  15        16       17
+
+        SiAplicaLeyDescIva # MontoDescuentoLeyIva # # TextoLey # SiEsDebitoCredito
+              18                      19                  20            21
+
+
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                    'codigomediopago'                      : lin[0],
+                    'codigomoneda'                         : lin[1],
+                    'totalmediopagomoneda'                 : lin[2],
+                    'totalmediopagomonedamonedareferencia' : lin[3],
+                    'totalpagado'                          : lin[4],
+                    'totalpagadomonedareferencia'          : lin[5],
+                    'cambio'                               : lin[6],
+                    'tipooperacion'                        : lin[7],
+                    'lineaultimopago'                      : lin[8],
+                    'numerotarjetacredito'                 : lin[9],
+                    'cuotastarjetacredito'                 : lin[10],
+                    'numeroautorizaciontarjetacredito'     : lin[11],
+                    'tipotarjetacredito'                   : lin[12],
+                    'autorizasupervisora'                  : lin[13],
+                    'codigosupervisora'                    : lin[14],
+                    'lineacancelada'                       : lin[15],
+                    'plan'                                 : lin[16],
+                    'nrocomercio'                          : lin[17],
+                    'siaplicaleydesciva'                   : lin[18],
+                    'montodescuentoleyiva'                 : lin[19],
+                    'textoley'                             : lin[20],
+                    'siesdebitocredito'                    : lin[21]
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_38(self):
+        """
+            Línea de pago con cheque (38)-SM.
+            --------------------------------
+
+            Línea de ticket cuando se paga con cheque. Cuando un cliente paga
+            con cheques, el mismo debe estar autorizado con un identificador
+            (campo idCliente).
+
+            0. Código del medio de pago.
+            1. Código de la moneda.
+            2. Monto total de lo que se puede pagar con el medio de pago moneda.
+            3. Idem que el anterior pero expresado en la moneda de referencia.
+            4. Total entregado de ese medio de pago-moneda.
+
+            5. Total entregado de ese medio de pago-moneda.
+            6. Total entregado expresado en la moneda de referencia.
+
+            7. Cambio de la línea de pago
+                    0 - Venta (valor >= 0.00 )
+                    1 - Devolución por parte del cliente (valor < 0.00 )
+
+            8. Lin. Ultimo Pago
+                    0 - No es la línea del último pago. Esto sucede cuando el
+                        ticket se paga con múltiples pagos (inclusive de
+                        distintos medios de pago-monedas) cuando el importe
+                        abonado es menor al total a pagar.
+                    1 - Es la línea del último pago.
+
+            9. Tipo de Cliente.
+           10. Identificación cliente.
+           11. Supervisora
+                       0 - La línea de pago no tuvo autorización de la
+                           supervisora.
+                       1 - La línea de pago tuvo autorización de la supervisora.
+
+           12. Código de la supervisora (vacío si no aplica)
+           13. Linea cancelada
+                       0 - Línea de pago no cancelada.
+                       1 - Línea de pago cancelada.
+
+            Indices:
+            -------
+
+            CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+                  0                 1                2
+
+            TotalMedioPagoMonedaMonedaReferencia #  TotalPagado #
+                             3                               4
+
+            TotalPagadoMonedaReferencia # Cambio # TipoOperacion #
+                        5                   6           7
+
+            LineaUltimoPago # TipoCliente # IdCliente # AutorizaSupervisora #
+                    8               9           10          11
+
+            CodigoSupervisora # LineaCancelada
+                  12                  13
+
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'codigomediopago'                       : lin[0],
+                        'codigomoneda'                          : lin[1],
+                        'totalmediopagomoneda'                  : lin[2],
+                        'totalmediopagomonedamonedareferencia'  : lin[3],
+                        'totalpagado'                           : lin[4],
+                        'totalpagadomonedareferencia'           : lin[5],
+                        'cambio'                                : lin[6],
+                        'tipooperacion'                         : lin[7],
+                        'lineaultimopago'                       : lin[8],
+                        'tipocliente'                           : lin[9],
+                        'idcliente'                             : lin[10],
+                        'autorizasupervisora'                   : lin[11],
+                        'codigosupervisora'                     : lin[12],
+                        'lineacancelada'                        : lin[13]
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_40(self):
+        """
+
+         Línea de pago luncheon ticket (40) SM.
+         -------------------------------------
+
+         0 Código del medio de pago.
+         1 Código de la moneda.
+         2 Monto total de lo que se puede pagar con el medio de pago moneda.
+         3 Idem que el anterior pero expresado en la moneda de referencia.
+         4 Total entregado de ese medio de pago-moneda.
+         5 Total entregado expresado en la moneda de referencia.
+         6 Cambio de la línea de pago (valor >= 0.00 5).
+         7 TipoOperacion.
+             0 - Venta ( importes > 0.00).
+             1 - Devolución ( importes < 0.00).
+         8 LineaUltimoPago.
+             0 - No es la línea del último pago. Esto sucede cuando el ticket
+                 se paga con múltiples pagos (inclusive de distintos medios de
+                 pago-monedas) cuando el importe abonado es menor al total a pagar.
+             1 - Es la línea del último pago.
+         9 CodigoBarra.
+             1 - código de barras del cupón.
+             0 - monto total de los cupones o el codigo de barras ingresado
+                 manualmente de ese cupon.
+        10 ModoIngresoCupon.
+             0 - Teclado.Este modo de ingreso se efectua cuando la cajera
+                 ingresa el monto del total de los cupones o el codigo de
+                 barras de ese cupon.
+             1 - Scanner.Cuando se procesan los cupones por scanner, validando
+                 los mismos.
+        11 AutorizaSupervisora.
+             0 - La línea de pago no tuvo autorización de la supervisora.
+             1 - La línea de pago tuvo autorización de la supervisora.
+        12 CodigoSupervisora.
+        13 Código de la supervisora (vacío si no aplica)
+        14 LineaCancelada.
+             0 - activa.
+             1 - cancelada.
+
+
+        Indices:
+        -------
+
+        CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+             0                  1                 2
+
+        TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                        2                           4
+
+        TotalPagadoMonedaReferencia # Cambio # TipoOperacion #
+                    5                   6           7
+
+        LineaUltimoPago# CodigoBarra # ModoIngresoCupon # AutorizaSupervisora #
+                8           9               10                  11
+
+        CodigoSupervisora # LineaCancelada
+            12                  13
+        """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'codigomediopago'                       : lin[0],
+                        'codigomoneda'                          : lin[1],
+                        'totalmediopagomoneda'                  : lin[2],
+                        'totalmediopagomonedamonedareferencia'  : lin[3],
+                        'totalpagado'                           : lin[4],
+                        'totalpagadomonedareferencia'           : lin[5],
+                        'cambio'                                : lin[6],
+                        'tipooperacion'                         : lin[7],
+                        'lineaultimopago'                       : lin[8],
+                        'codigobarra'                           : lin[9],
+                        'modoingresocupon'                      : lin[10],
+                        'autorizasupervisora'                   : lin[11],
+                        'codigosupervisora'                     : lin[12],
+                        'lineacancelada'                        : lin[13]
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_43(self):
+
+        """
+            Línea de voucher de la tarjeta (43)-SM.
+            Muestran la información de un Voucher de Pago cuando se paga con Tarjeta de Crédito/Debito.
+            La mayoría de la información aquí presentada la retorna el autorizador y Jswitch
+            (Referirse al documento Especificaciones jSwitch.doc por posibles cambios).
+
+            IdentificadorLinea* # NumeroDeLinea* # TipoLinea* # TimestampLinea* # NombreEmisorTarjeta #
+            NumeroTarjeta # Vencimiento # Comprobante # Autorizacion # Plan # CantidadCuotas          #
+            CodigoTerminal # CodigoComercio # TipoAutorizacion # NroLote # CodigoMoneda               #
+            TipoTransaccion # TipoVoucher # ImportePago # FechaTransacccion # CodigoCaja*             #
+            CodigoCajera* # NombrePropietario # TipoIngreso # DescuentaIvaRestaurante                 #
+            SiEsDebitoCredito # CardType # SaldoGift # TipoTarjetaCredito2 # DescuentoAfam            #
+            SiAplicaLeyDescIva # MontoDescuentoLeyIva # MontoTicket # MontoGravado                    #
+            FlagImprimeFirma
+
+            *Datos que no provienen de la autorizadora.
+
+            NombreEmisorTarjeta         -> Nombre emisor de la tarjeta.
+            NumeroTarjeta               -> Número de la tarjeta de crédito.
+            Vencimiento                 -> Vencimiento de la tarjeta de crédito (aamm).
+            Comprobante                 -> Número de comprobante.
+            Autorizacion                -> Número de autorización.
+            Plan                        -> Código de plan asociado.
+            CantidadCuotas              -> Cantidad de cuotas.
+            CodigoTerminal              -> Código de la terminal asociado.
+            CodigoComercio              -> Código de comercio asociado.
+            TipoAutorizacion            -> Tipos : 00-Online;
+                                                   01-Offline;
+                                                   20-Online aplica ley descuento IVA;
+            NroLote                     -> Número de lote asociado.
+            CodigoMoneda                -> Código de la moneda asociado.
+                                                   00-Pesos
+                                                   01-Dólares.
+            TipoTransaccion             -> Tipo de transacción asociado (MTI).
+                                                   1200 - Compra
+                                                   1220 - Confirmación Compra
+                                                   1240 - Notificación de Compra
+                                                   1400 - Devolución (Total o parcial)
+                                                   1420 - Confirmación Devolución
+                                                   1440 - Notificación de Devolución
+                                                   9xxx - Entrenamiento
+            TipoVoucher                 -> Tipo de voucher asociado.
+                                                   0-Original Cliente.
+                                                   1-Vía Establecimiento.
+            ImportePago                 -> Importe pagado por la tarjeta de crédito.
+            FechaTransacccion           -> Fecha de transacción de la autorización.
+            CodigoCaja*                 -> Código de la caja.
+            CodigoCajera*               -> Código de la cajera.
+            NombrePropietario           -> Nombre del propietario de la tarjeta de crédito.
+            TipoIngreso                 -> Tipo de ingreso asociado.
+                                                   0-Lectura magnética.
+                                                   1-Entrada manual
+                                                   2-Internet.
+            DescuentaIvaRestaurante     -> Descuento restaurante
+                                                   0 - No tiene descuento iva por ley 17934.
+                                                   1 - Tiene descuento iva por ley 17934.
+            SiEsDebitoCredito           -> Tipo de la tarjeta de crédito:
+                                                   0-Nada.
+                                                   1-Crédito.
+                                                   2-Débito.
+            CardType                    -> Card Type retornado por el autorizador.
+            SaldoGift                   -> Saldo de la tarjeta Gift (vacio si no es tarjeta gift).
+            TipoTarjetaCredito2         -> Tipo de tarjeta de credito (redundante con TipoTarjetaCredito)
+                                                   1-Crédito
+                                                   2-Débito.
+                                                   3-Gift
+            4-Afam
+            DescuentoAfam               -> Importe del descuento aplicado si la tarjeta es Afam (0.00 si no aplica).
+            SiAplicaLeyDescIva          -> Flag que indica si se aplica la ley 19210 de inclusión financiera de descuento de iva.
+                                                   0 - No aplica ley de descuento de iva.
+                                                   1 - Aplica ley de descuento de iva.
+            MontoDescuentoLeyIva        -> Monto del descuento de Iva (en negativo).
+            MontoTicket                 -> Monto del ticket.
+            MontoGravado                -> Monto gravado sin Iva del ticket.
+            FlagImprimeFirma            ->         0 - No se solicita la firma.
+                                                   1 - Se solicita la firma.
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'nombreemisortarjeta'       : lin[0],
+                        'numerotarjeta'             : lin[1],
+                        'vencimiento'               : lin[2],
+                        'comprobante'               : lin[3],
+                        'autorizacion'              : lin[4],
+                        'plan'                      : lin[5],
+                        'cantidadcuotas'            : lin[6],
+                        'codigoterminal'            : lin[7],
+                        'codigocomercio'            : lin[8],
+                        'tipoautorizacion'          : lin[9],
+                        'nrolote'                   : lin[10],
+                        'codigomoneda'              : lin[11],
+                        'tipotransaccion'           : lin[12],
+                        'tipovoucher'               : lin[13],
+                        'importepago'               : lin[14],
+                        'fechatransaccion'          : lin[15],
+                        'codigocaja'                : lin[16],
+                        'codigocajera'              : lin[17],
+                        'nombrepropietario'         : lin[18],
+                        'tipoingreso'               : lin[19],
+                        'descuentaivarestaurante'   : lin[20],
+                        'siesdebitocredito'         : lin[21],
+                        'cardtype'                  : lin[22],
+                        'saldogift'                 : lin[23],
+                        'tipotarjetacredito2'       : lin[24],
+                        'descuentoafam'             : lin[25],
+                        'siaplicaleydesciva'        : lin[26],
+                        'montodescuentoleyiva'      : lin[27],
+
+                        'montoticket'               : lin[28],
+                        'montogravado'              : lin[29],
+                        'flagimprimefirma'          : lin[30]
+            }
+
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_44(self):
+        pass
+
+
+    def lt_47(self):
+        """
+        Línea de pago de servicio (47) -cuenta corriente-
+
+        Representa las líneas de los pagos de servicios .
+        Código         -> Código del pago de servicio
+        Monto          -> Importe del pago de servicio.
+        Moneda         -> Código de moneda.
+        ModoIngreso    -> 0-Teclado. 1-Scanner. 2-Banda magnética.
+        CodigoVendedor -> Código de vendedor si la caja está configurado para utilizar vendedor.Si no hay vendedor va vacío.
+        Referencia     -> Referencia del pago de servicio.Esta se compone de dos partes,los primeros 10 dígitos corresponde al número de factura, los siguientes 10 dígitos al número de cuenta.Puede venir vacio.
+        LineaCancelada -> 0 - Línea de pago no cancelada. 1 - Línea de pago cancelada. No tiene valor contable.
+
+        C#1#4#1294#131#20151218113128#F#0#15603.00#20#12
+        L#1#5#113128#
+        L#3#7#113128#131#SHIRLEY BRAVO
+        L#4#53#113128#TICKET DE VENTA#0
+        L#5#57#113128#20##0###
+        L#6#47#113128#1#15602.83#1#0###0
+        L#7#68#113143#4580#ROIG ELBIO##JUAN M.GUTIERREZ 1643 -21490###1#0
+        L#8#4#113229#15602.83#0.00#0.00#0.00
+        L#9#63#113229#15602.83#0.17#15603.00#1#1
+        L#10#9#113229#1#1#15603.00#15603.00#15603.00#15603.00#0.00#0#1#0##0
+
+        ticket = {
+            ('C', '1', '4', '1294', '131', '20151218113128', 'F', '0', '15603.00', '20', '12') :
+                ['L', '1', '5', '113128', ''],
+                ['L', '3', '7', '113128', '131', 'SHIRLEY BRAVO'],
+                ['L', '4', '53', '113128', 'TICKET DE VENTA', '0'],
+                ['L', '5', '57', '113128', '20', '', '0', '', '', ''],
+            --> ['L', '6', '47', '113128', '1', '15602.83', '1', '0', '', '', '0'], <--
+                ['L', '7', '68', '113143', '4580', 'ROIG ELBIO', '', 'JUAN M.GUTIERREZ 1643 -21490', '', '', '1', '0'],
+                ['L', '8', '4', '113229', '15602.83', '0.00', '0.00', '0.00'],
+                ['L', '9', '63', '113229', '15602.83', '0.17', '15603.00', '1', '1'],
+                ['L', '10', '9', '113229', '1', '1', '15603.00', '15603.00', '15603.00', '15603.00', '0.00', '0', '1', '0', '', '0']
+         }
+
+            Código # Monto # Moneda # ModoIngreso # CodigoVendedor # Referencia # LineaCancelada
+               0       1       2          3               4              5              6
+        """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                               'codserviciopagado'        : lin[0], # '1' = cta.cte
+                               'importecobranza'          : lin[1],
+                               'codigomoneda'             : lin[2],
+                               'modoingreso'              : lin[3],
+                               'codigovendedor'           : lin[4],
+                               'referencia'               : lin[5],
+                               'lineacancelada'           : lin[6]
+                }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_49(self):
+        pass
+
+
+    def lt_52(self):
+        """
+            Línea de pago de caja (52).
+            Representa la linea de pago de caja (similar a un retiro pero se
+            utiliza para pagos puntuales como pago a proveedores, taxis, etc.).
+
+
+            IdentificadorLinea # NumeroDeLinea # TipoLinea # TimestampLinea # Codigo # Importe
+            Codigo->Código del rubro de pago de caja.
+            Importe->Importe del pago de caja.
+            Ejemplo de un pago de caja con codigo 1 y monto de 150.00 pesos
+        """
+        lin = self.esta_linea or False
+
+        result = dict()
+        try:
+            result.update(dict( codigo  = lin[0], importe = lin[1] ))
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+
+    def lt_53(self):
+        """
+            Línea tipo de ticket (53)-SM.
+            '''''''''''''''''''''''''''''
+
+            Representa la línea del `tipo de ticket`
+            y si se trata de un ticket normal o excento de iva.
+
+            DescripcionTipoTicket Descripcion del tipo de ticket.
+            TipoVenta             1 - El ticket esta excento de iva.
+                                  0 - Ticket normal.
+            Indices:
+            ''''''''
+
+            DescripcionTipoTicket # TipoVenta
+                    0                   1
+
+            Por ahora, este último campo sirve para los tickets de venta y
+            devolución.
+        """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'descripciontipoticket': lin[0],
+                        'tipoventa'            : lin[1]
+                }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_55(self):
+
+        """Intervensión Supervidora"""
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {'codigosuper': lin[0],
+                      'nombresuper': lin[1]}
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_56(self):
+        pass
+
+
+    def lt_57(self):
+        """
+            Línea de tipo de cliente (57)-SM
+            --------------------------------
+
+            Representa el detalle del tipo de cliente en la venta.
+
+            0 Nombre del cliente (vacio si no aplica).
+            1 Número del cliente interno (vacio si no aplica).
+            2 Tipo de cliente interno.
+                0-Productor
+                1-Empleado
+                Vacio-General.
+
+            Indices:
+            --------
+
+            Tipo # NumeroTarjeta # ModoIngreso # Nombre # Numero #  TipoClienteInterno
+              0         1               2           3       4                5
+
+            L#4#57#221300#20##-1###
+
+            NumeroDeLinea # TipoLinea # TimestampLinea # Tipo # NumeroTarjeta # ModoIngreso
+                 4        #    57     #   221300       #   20 #    ''         #    -1
+              # Nombre # Numero # TipoClienteInterno
+              #   ''   #  ''    #    ''
+
+            raw = [4, 57, 221300, 20, '', -1, '', '', '']
+            self.esta_linea = raw[3:]
+            self.esta_linea = [20, '', -1, '', '', '']
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'tipo'                : lin[0],
+                        'numerotarjeta'       : lin[1],
+                        'modoingreso'         : lin[2] if int(lin[2]) >= 0 else '0',
+                        'nombre'              : lin[3],
+                        'numero'              : lin[4],
+                        'tipoclienteinterno'  : lin[5]
+                }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_58(self):
+        pass
+
+
+    def lt_60(self):
+        pass
+
+
+    def lt_61(self):
+        pass
+
+
+    def lt_62(self):
+        pass
+
+
+    def lt_63(self):
+        """
+
+            Línea de redondeo del ticket.
+            ----------------------------
+
+            # ImporteTicket # ImporteRedondeo # ImporteTotalTicket # CodigoMedioPago # CodigoMoneda
+                    0                1                  2                  3                 4
+            ImporteTicket->Importe del total del ticket sin redondeo.
+
+            ImporteRedondeo->Importe del redondeo aplicado.
+
+            ImporteTotalTicket->Importe total del ticket que es ImporteTicket + ImporteRedondeo.
+
+            CodigoMedioPago->Codigo del medio de pago.
+
+            CodigoMoneda->Codigo de la moneda.
+
+            Ejemplo de una línea de redondeo con un importe de ticket de 42.90, al cual se le aplicó
+            un redondeo de 0.10 para obtener un importe total a abonar de 43.00 efectivo-pesos
+            L#9#63#164146#42.90#0.10#43.00#1#1   """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'importeticket'      : lin[0],
+                        'importeredondeo'    : lin[1],
+                        'importetotalticket' : lin[2],
+                        'codigomediopago'    : lin[3],
+                        'codigomoneda'       : lin[4],
+            }
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_65(self):
+        pass
+
+
+    def lt_67(self):
+        """
+ Línea de pago de cupón corporativo (67).
+Representa la línea cuando se paga con cupón corporativo.
+IdentificadorLinea #
+ NumeroDeLinea # TipoLinea
+ # TimestampLinea
+ #
+CodigoMedioPago
+ #
+ CodigoMoneda
+ #
+ TotalMedioPagoMoneda
+ #
+TotalMedioPagoMonedaMonedaReferencia
+ #
+ TotalPagado
+ #
+TotalPagadoMonedaReferencia # Cambio # TipoOperacion # LineaUltimoPago
+ #
+CodigoCupon # AutorizaSupervisora # CodigoSupervisora # LineaCancelada
+CodigoMedioPago->Código del medio de pago.
+CodigoMoneda->Código de la moneda.
+TotalMedioPagoMoneda -> Monto total de lo que se puede pagar con el medio de pago
+moneda.
+TotalMedioPagoMonedaMonedaReferencia -> Idem que el anterior pero expresado en
+la moneda de referencia.
+TotalEntregado-> Total entregado de ese medio de pago-moneda.
+TotalEntregadoMonedaReferencia->Total entregado expresado en la moneda de
+referencia.
+Cambio -> Cambio de la línea de pago (su valor puede ser 0.00 (no hay cambio) o
+positvo que es parte del cambio que se le da al cliente).
+TipoOperacion -> 0-Si corresponde a una venta (los importes van en positivo).
+1-Si corresponde a una devolución por parte del cliente (los importes
+van en negativo).
+LineaUltimoPago-> 0-No es la línea del último pago. Esto sucede cuando el ticket se
+paga con múltiples pagos (inclusive de distintos medios de pago-
+monedas) cuando el importe abonado es menor al total a pagar.
+1-Es la línea del último pago.
+CodigoCupon->Código de barras del cupón corporativo.
+AutorizaSupervisora-> 0-La línea de pago no tuvo autorización de la supervisora.
+1-La línea de pago tuvo autorización de la supervisora.
+CodigoSupervisora->Código de la supervisora si AutorizaSupervisora=1, sino va vacío.
+LineaCancelada->0-Línea de pago no cancelada.
+1-Línea de pago cancelada.
+Ejemplo de un pago con cupón corporativo con código 989016000000101400 de 140.00
+pesos. No es la línea de último pago.
+
+L#12#67#155100#15#1#347.40#347.40#140.00#140.00#0.00#0#0#9890160000001014
+00#0##0
+
+
+
+
+        """
+
+
+    def lt_68(self):
+        """
+        Línea de entrega a domicilio (68).
+        Representa la línea de entrega a domicilio (delivery) con los datos del cliente.
+
+        (La usamos para obtener los datos [nombre y número de cuenta] de una cobranza de cta.cte.)
+
+        IdentificadorLinea # NumeroDeLinea # TipoLinea # TimestampLinea # Código # Nombre # Telefono # Direccion # Esquina1 # Esquina2 # Gratis # LineaCancelada
+        Código->Código del cliente.
+        Nombre->Nombre del cliente.
+        Telefono->Telefono del cliente.
+        Direccion->Direccion del cliente.
+        Esquina1->Primera esquina donde se encuentra el cliente.
+        Esquina2->Segunda esquina donde se encuentra el cliente.
+        Gratis-> Según el monto de venta, se cobra el delivery o no y se indica de la siguiente forma:
+        1-El delivery es gratis.
+        0-El delivery se cobra.
+        LineaCancelada->0-Línea no cancelada.
+        1-Línea cancelada. Este tipo de línea no tiene valor contable.
+
+        C#1#4#1294#131#20151218113128#F#0#15603.00#20#12
+        L#1#5#113128#
+        L#3#7#113128#131#SHIRLEY BRAVO
+        L#4#53#113128#TICKET DE VENTA#0
+        L#5#57#113128#20##0###
+        L#6#47#113128#1#15602.83#1#0###0
+        L#7#68#113143#4580#ROIG ELBIO##JUAN M.GUTIERREZ 1643 -21490###1#0
+        L#8#4#113229#15602.83#0.00#0.00#0.00
+        L#9#63#113229#15602.83#0.17#15603.00#1#1
+        L#10#9#113229#1#1#15603.00#15603.00#15603.00#15603.00#0.00#0#1#0##0
+
+        ticket = {
+            ('C', '1', '4', '1294', '131', '20151218113128', 'F', '0', '15603.00', '20', '12') :
+                ['L', '1', '5', '113128', ''],
+                ['L', '3', '7', '113128', '131', 'SHIRLEY BRAVO'],
+                ['L', '4', '53', '113128', 'TICKET DE VENTA', '0'],
+                ['L', '5', '57', '113128', '20', '', '0', '', '', ''],
+                ['L', '6', '47', '113128', '1', '15602.83', '1', '0', '', '', '0'],
+
+           --> ['L', '7', '68', '113143', '4580', 'ROIG ELBIO', '', 'JUAN M.GUTIERREZ 1643 -21490', '', '', '1', '0'], <--
+
+                ['L', '8', '4', '113229', '15602.83', '0.00', '0.00', '0.00'],
+                ['L', '9', '63', '113229', '15602.83', '0.17', '15603.00', '1', '1'],
+                ['L', '10', '9', '113229', '1', '1', '15603.00', '15603.00', '15603.00', '15603.00', '0.00', '0', '1', '0', '', '0']
+            }
+
+            Código # Nombre # Telefono # Direccion # Esquina1 # Esquina2 # Gratis # LineaCancelada
+               0       1          2          3           4          5         6           7
+        """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'codigocliente'                         : lin[0],
+                        'nombrecliente'                         : lin[1],
+                        'telefonocliente'                       : lin[2],
+                        'direccioncliente'                      : lin[3],
+                        'Esquina1'                              : lin[4],
+                        'Esquina2'                              : lin[5],
+                        'enviogratis'                           : lin[6],
+                        'lineacancelada'                        : lin[7]
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_71(self):
+        pass
+
+
+    def lt_72(self):
+        pass
+
+
+    def lt_73(self):
+        """
+            QUIEN DIJO QUE LAS FEAS NO BAILAN, ¿¿ eh ??
+            ===========================================
+
+            Línea de ticket Z (73)
+            Subtipos de líneas que son:
+            Contiene informacion de cabecera de la Z (por lo tanto solamente debe haber solo un sub tipo de línea 1 en el informe Z).
+
+            SubTipo # CodigoCaja # NumeroZ # TotalVenta # TotalPagoServicios # TotalVentaGeneral # GranTotal # CantidadPagoCajas # ImportePagoCajas # ImporteRedondeo
+
+            1) Sub tipo línea Z. (obligatoria, es el cabezal del tipo de línea de detalle Z
+
+                SubTipo -> Sub tipo de línea que es 1.
+                CodigoCaja -> Codigo de la caja.
+                NumeroZ  -> Número emitido de la Z en la caja.
+                TotalVenta -> Total de venta de la caja de mercaderia (incluye ivas pero no los pago de servicios).
+                TotalPagoServicios -> Total de pago de servicios.
+                TotalVentaGeneral -> Total de venta de la caja mas el total de venta de los pagos de servicios (TotalVenta + TotalPagoServicios).
+                GranTotal -> Gran total de la caja en el momento de la emision de la Z.
+                CantidadPagoCajas -> Cantidad de pagos de la caja.
+                ImportePagoCajas -> Importe de pagos de la caja.
+                ImporteRedondeo -> Importe (saldo) del redondeo acumulado en la sesion de la caja.
+
+                Ejemplo de sub tipo de línea 1 de la caja 1, con numero de Z 954, con un total de venta de 1696.80, un total de pago de servicios de 153.00 pesos, un total de venta general de 1849.80 , un gran total de 20125014.50 pesos, se hicieron 2 pagos de caja por un monto de 750.00 pesos y el acumulado de redondeo es 2.00 pesos.
+                    L#1#105#185528#1#1#954#1696.80#153.00#1849.80#20125014.50 # 2 # 750.00 # 2.00
+
+
+            2) Sub tipo línea Iva.
+
+                Representa el subtipo de línea de iva del informe Z.
+                Pueden existir varias líneas de este subtipo, una por cada codigo de iva aplicado en la sesion de venta de la caja.
+                    SubTipo # CodigoCaja # NumeroZ # CodigoIva # VentaBrutaIva # VentaNetaIva # VentaIva
+                SubTipo -> Sub tipo de línea que es 2.
+                CodigoCaja -> Codigo de la caja.
+                NumeroZ  -> Número emitido de la Z en la caja.
+                CodigoIva -> Codigo de Iva.
+                VentaBrutaIva -> Es el total de la venta afectado por ese codigo de iva incluyendo al propio iva (VentaNetaIva + VentaIva).
+                VentaNetaIva -> Es el total de la venta afectado por ese codigo de iva sin incluir al propio iva (VentaBrutaIva – VentaIva).
+                VentaIva -> Importe solo de iva.
+
+                Ejemplo de subtipo de línea 2 de la caja 1, con numero de Z 954 , para el codigo de iva 1, con un total de venta bruta de 1696.80 pesos, 1390.82 de venta neta de iva y 305.98 de venta de iva.
+                    L#2#105#185528#2#1#954#1#1696.80#1390.82#305.98
+                Idem para el codigo de iva 2.
+                    L#3#105#185528#2#1#954#2#2568.90#2335.36#233.54
+
+            3) Sub tipo línea medios de pago-monedas.
+
+                Representa el subtipo de línea de los totales de los medios de pago-monedas (para la venta, para el fondo de caja y retiro) del informe Z. Pueden existir varias líneas de este subtipo, una por cada medio de pago-moneda en la sesion de venta de la caja.
+                SubTipo # CodigoCaja # NumeroZ # CodigoMedioPago # CodigoMoneda # ImporteVenta # ImporteFondo # ImporteRetiro
+                SubTipo -> Sub tipo de línea que es 3.
+                CodigoCaja -> Codigo de la caja.
+                NumeroZ  -> Número emitido de la Z en la caja.
+                CodigoMedioPago -> Código del medio de pago.
+                CodigoMoneda -> Código de la moneda
+                ImporteVenta -> Importe de la venta del medio de pago-moneda.
+                ImporteFondo -> Importe de fondeo para ese medio de pago-moneda.
+                ImporteRetiro -> Importe de retiro para ese medio de pago-moneda.
+
+                Ejemplo del subtipo 3, de la caja 1 para el número de Z 954, del medio de pago 1 y moneda 1, con un total acumulado de 1249.80 en ventas, se hizo un fondeo de 98.00 y un retiro de 47.00.
+                    L#5#105#185528#3#1#954#1#1#1249.80#98.00#47.00
+                Igual que el anterior para el codigo medio de pago 1 moneda 2, que tiene un fondo solamente de 12750.00.
+                    L#4#105#185528#3#1#954#1#2#0.00#12750.00#0.00
+
+            4) Sub tipo línea de pago de servicios.
+
+                Representa el subtipo de línea de los pagos de servicio del informe Z.
+                Pueden existir varias líneas de este subtipo, una por cada pago de servicio en la sesion de la caja.
+                SubTipo # CodigoCaja # NumeroZ # CodigoPagoServicio # CantidadPagos # ImportePagoServicios
+                SubTipo -> Sub tipo de línea que es 4.
+                CodigoCaja -> Codigo de la caja.
+                NumeroZ  -> Número emitido de la Z en la caja.
+                CodigoPagoServicio -> Código del pago de servicio.
+                CantidadPagos -> Cantidad de pagos de servicios
+            """
+
+        # eehh, no bailan, no.
+        pass
+
+
+    def lt_76(self):
+        # Línea de descuento producido por marcas (76)
+        pass
+
+
+    def lt_77(self):
+        # Línea de cabezal de marca (77)
+        pass
+
+
+    def lt_78(self):
+        # Línea de detalle de la marca (78)
+        pass
+
+
+    def lt_81(self):
+        # Línea de devolución de pago de servicio (81)
+        """
+        Línea de devolución de pago de servicio (81).
+        Representa la línea de devolución de un pago de servicio.
+        IdentificadorLinea # NumeroDeLinea # TipoLinea # TimestampLinea #
+
+        Código # Importe # Moneda # ModoIngreso # CodigoSupervisora # CodigoVendedor #
+           0        1        2           3              4                   5
+        Referencia # LineaCancelada
+            6              7
+
+        Código      ->  Código del pago de servicio
+        Importe     ->  Importe de la devolución del pago de servicio (en negativo).
+        Moneda      ->  Código de moneda.
+        ModoIngreso ->  0-Teclado
+                        1-Scanner.
+                        2-Banda magnética.
+        CodigoSupervisora   ->  Código de la supervisora si intervino, sino va vacío.
+        CodigoVendedor      ->  Código de vendedor si la caja está configurado para utilizar
+                                vendedor. Si no hay vendedor va vacío.
+        Referencia          ->  Referencia del pago de servicio.
+        LineaCancelada      ->  0-Línea de devolucion de pago de servicio no cancelada.
+                                1-Línea de devolucion de pago de servicio cancelada.
+                                No se deberia tomar en cuenta como valor contable.
+
+        Ejemplo de la devolucion del servicio 513 por -250.00 de la moneda 1, ingresado por
+        teclado (0) e intervino la supervisora 1, sin vendedor ni referencia y la línea no esta
+        canclada (0).
+        L#7#81#122220#513#-250.00#1#0#1###0
+        """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                'codigo'                : lin[0],
+                'importe'               : lin[1],
+                'moneda'                : lin[2],
+                'modoingreso'           : lin[3],
+                'codigosupervisora'     : lin[4],
+                'codigovendedor'        : lin[5],
+                'referencia'            : lin[6],
+                'lineacancelada'        : lin[7],
+            }
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_82(self):
+        # Línea de consulta de estado de cuenta de la cobranza (82).
+        pass
+
+
+    def lt_83(self):
+        """
+            Línea de voucher de la cobranza (83).
+            Representa el vocucher de un pago/devolución de tarjeta de crédito.
+            La mayoría de la información aquí presentada la retorna el autorizador y Jswitch
+            (referirse al documento Especificaciones jSwitch.doc por posibles cambios).
+
+            Descripcion # NumeroTarjeta # NumeroCuenta # Vencimiento # Autorizacion #
+            TipoAutorizacion # CodigoMoneda # Importe # TipoVoucher # TipoCobranza #
+            IndicadorPagoDev
+
+            NumeroCuenta->Numero de cuenta del cliente (cuando la cobranza se hace offline, si es
+            online puede venir vacio).
+            *Datos que no provienen de la autorizadora.
+
+            Ejemplo del voucher de cobranza VISA con numero de tarjeta 5898920239862737 sin
+            numero de cuenta con vencimineto 0705 , autorizacion 000000 que se hizo online (00)
+            con importe de 250.00 pesos (00), es la via del cliente (0) , se selecciono online (1) y
+            es un pago (0).
+            L#11#83#183404#VISA#5898920239862737##0705#000000#00#00#250.00#0#1#0
+
+            Idem para el establecimiento (1):
+            L#12#83#183404#VISA#5898920239862737##0705#000000#00#00#250.00#1#1#0
+
+        """
+        pass
+
+    def lt_84(self):
+        # Línea de apertura de gaveta.                           84
+        pass
+
+
+    def lt_85(self):
+        # Línea de pago de tarjeta offline (SM).                 85
+        """
+            Línea de pago de tarjeta offline (85) - SM.
+            ===========================================
+
+            Línea de ticket de cuando se paga con tarjeta de crédito pero de modo offline en SM.
+
+
+             0 CodigoMedioPago                         ->  Código del medio de pago.
+
+             1 CodigoMoneda                            ->  Código de la moneda.
+
+             2 TotalMedioPagoMoneda                    ->  Monto total de lo que se puede pagar con
+                                                                el medio de pago moneda.
+
+             3 TotalMedioPagoMonedaMonedaReferencia    ->  Idem que el anterior pero expresado en la
+                                                                moneda de referencia.
+
+             4 TotalEntregado                          ->  Total entregado de ese medio de pago-moneda.
+
+             5 TotalEntregadoMonedaReferencia          ->  Total entregado expresado en la moneda de referencia.
+
+             6 Cambio                                  ->  Cambio de la línea de pago.
+                                                                Su valor puede ser 0.00 (no hay cambio) o
+                                                                positvo que es parte del cambio que se le da
+                                                                al cliente.
+
+             7 TipoOperacion                           ->  0-Si corresponde a una venta
+                                                                los importes van en positivo.
+                                                           1-Si corresponde a una devolución por parte del cliente
+                                                                los importes van en negativo.
+
+             8 LineaUltimoPago                         ->  0-No es la línea del último pago.
+                                                                Esto sucede cuando el ticket se paga con
+                                                                múltiples pagos, inclusive distintos medios de
+                                                                pago-monedas, cuando el importe abonado es menor
+                                                                al total a pagar.
+                                                           1-Es la línea del último pago.
+
+             9 NumeroTarjetaCredito                    ->  Número de la tarjeta de crédito. Se graba solamente si
+                                                                es cliente de fidelización.
+
+            10 AutorizaSupervisora                     ->  0-La línea de pago no tuvo autorización de la supervisora.
+                                                           1-La línea de pago tuvo autorización de la supervisora.
+
+            11 LineaCancelada                          ->  0-Línea de pago no cancelada.
+                                                           1-Línea de pago cancelada.
+
+            CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda # TotalMedioPagoMonedaMonedaReferencia #
+                   0                1                 2                             3
+            TotalPagado # TotalPagadoMonedaReferencia # Cambio # TipoOperacion # LineaUltimoPago #
+                  4                   5                    6            7               8
+            NumeroTarjetaCredito # AutorizaSupervisora # CodigoSupervisora # LineaCancelada
+                      9                     10                  11                 12
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'codigomediopago'                       : lin[0],
+                        'codigomoneda'                          : lin[1],
+                        'totalmediopagomoneda'                  : lin[2],
+                        'totalmediopagomonedamonedareferencia'  : lin[3],
+                        'totalpagado'                           : lin[4],
+                        'totalpagadomonedareferencia'           : lin[5],
+                        'cambio'                                : lin[6],
+                        'tipooperacion'                         : lin[7],
+                        'lineaultimopago'                       : lin[8],
+                        'numerotarjetacredito'                  : lin[9],
+                        'autorizasupervisora'                   : lin[10],
+                        'codigosupervisora'                     : lin[11],
+                        'lineacancelada'                        : lin[12]
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+
+    def lt_86(self):
+        # Línea de recargo.                                      86
+        pass
+
+
+    def lt_87(self):
+        # Línea descuento a los medios de pago-moneda.           87
+        pass
+
+
+    def lt_88(self):
+        # Línea venta cómputos celular                           88
+        pass
+
+
+    def lt_89(self):
+        # Devolución línea venta cómputos celular.               89
+        pass
+
+
+    def lt_90(self):
+        """
+        Línea de pago ticket TAlimentos (90) SM.
+        ---------------------------------------
+
+         0 Código del medio de pago.
+         1 Código de la moneda.
+         2 Monto total de lo que se puede pagar con el medio de pago moneda.
+         3 Idem que el anterior pero expresado en la moneda de referencia.
+         4 Total entregado de ese medio de pago-moneda.
+         5 Total entregado expresado en la moneda de referencia.
+         6 Cambio de la línea de pago (valor >= 0.00 5).
+         7 TipoOperacion.
+             0 - Venta ( importes > 0.00).
+             1 - Devolución ( importes < 0.00).
+         8 LineaUltimoPago.
+             0 - No es la línea del último pago. Esto sucede cuando el ticket
+                 se paga con múltiples pagos (inclusive de distintos medios de
+                 pago-monedas) cuando el importe abonado es menor al total a pagar.
+             1 - Es la línea del último pago.
+         9 CodigoBarra.
+             1 - código de barras del cupón.
+             0 - monto total de los cupones o el codigo de barras ingresado
+                 manualmente de ese cupon.
+        10 ModoIngresoCupon.
+             0 - Teclado.Este modo de ingreso se efectua cuando la cajera
+                 ingresa el monto del total de los cupones o el codigo de
+                 barras de ese cupon.
+             1 - Scanner.Cuando se procesan los cupones por scanner, validando
+                 los mismos.
+        11 AutorizaSupervisora.
+             0 - La línea de pago no tuvo autorización de la supervisora.
+             1 - La línea de pago tuvo autorización de la supervisora.
+        12 CodigoSupervisora.
+        13 Código de la supervisora (vacío si no aplica)
+        14 LineaCancelada.
+             0 - activa.
+             1 - cancelada.
+
+
+        Indices:
+        -------
+
+        CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+             0                  1                 2
+
+        TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                        2                           4
+
+        TotalPagadoMonedaReferencia # Cambio # TipoOperacion #
+                    5                   6           7
+
+        LineaUltimoPago# CodigoBarra # ModoIngresoCupon # AutorizaSupervisora #
+                8           9               10                  11
+
+        CodigoSupervisora # LineaCancelada
+            12                  13
+        """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'codigomediopago'                       : lin[0],
+                        'codigomoneda'                          : lin[1],
+                        'totalmediopagomoneda'                  : lin[2],
+                        'totalmediopagomonedamonedareferencia'  : lin[3],
+                        'totalpagado'                           : lin[4],
+                        'totalpagadomonedareferencia'           : lin[5],
+                        'cambio'                                : lin[6],
+                        'tipooperacion'                         : lin[7],
+                        'lineaultimopago'                       : lin[8],
+                        'codigobarra'                           : lin[9],
+                        'modoingresocupon'                      : lin[10],
+                        'autorizasupervisora'                   : lin[11],
+                        'codigosupervisora'                     : lin[12],
+                        'lineacancelada'                        : lin[13]
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_91(self):
+        """
+        Línea de pago ticket Total (91) SM.
+        ----------------------------------
+
+         0 Código del medio de pago.
+         1 Código de la moneda.
+         2 Monto total de lo que se puede pagar con el medio de pago moneda.
+         3 Idem que el anterior pero expresado en la moneda de referencia.
+         4 Total entregado de ese medio de pago-moneda.
+         5 Total entregado expresado en la moneda de referencia.
+         6 Cambio de la línea de pago (valor >= 0.00 5).
+         7 TipoOperacion.
+             0 - Venta ( importes > 0.00).
+             1 - Devolución ( importes < 0.00).
+         8 LineaUltimoPago.
+             0 - No es la línea del último pago. Esto sucede cuando el ticket
+                 se paga con múltiples pagos (inclusive de distintos medios de
+                 pago-monedas) cuando el importe abonado es menor al total a pagar.
+             1 - Es la línea del último pago.
+         9 CodigoBarra.
+             1 - código de barras del cupón.
+             0 - monto total de los cupones o el codigo de barras ingresado
+                 manualmente de ese cupon.
+        10 ModoIngresoCupon.
+             0 - Teclado.Este modo de ingreso se efectua cuando la cajera
+                 ingresa el monto del total de los cupones o el codigo de
+                 barras de ese cupon.
+             1 - Scanner.Cuando se procesan los cupones por scanner, validando
+                 los mismos.
+        11 AutorizaSupervisora.
+             0 - La línea de pago no tuvo autorización de la supervisora.
+             1 - La línea de pago tuvo autorización de la supervisora.
+        12 CodigoSupervisora.
+        13 Código de la supervisora (vacío si no aplica)
+        14 LineaCancelada.
+             0 - activa.
+             1 - cancelada.
+
+
+        Indices:
+        -------
+
+        CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+             0                  1                 2
+
+        TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                        2                           4
+
+        TotalPagadoMonedaReferencia # Cambio # TipoOperacion #
+                    5                   6           7
+
+        LineaUltimoPago# CodigoBarra # ModoIngresoCupon # AutorizaSupervisora #
+                8           9               10                  11
+
+        CodigoSupervisora # LineaCancelada
+            12                  13
+        """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'codigomediopago'                       : lin[0],
+                        'codigomoneda'                          : lin[1],
+                        'totalmediopagomoneda'                  : lin[2],
+                        'totalmediopagomonedamonedareferencia'  : lin[3],
+                        'totalpagado'                           : lin[4],
+                        'totalpagadomonedareferencia'           : lin[5],
+                        'cambio'                                : lin[6],
+                        'tipooperacion'                         : lin[7],
+                        'lineaultimopago'                       : lin[8],
+                        'codigobarra'                           : lin[9],
+                        'modoingresocupon'                      : lin[10],
+                        'autorizasupervisora'                   : lin[11],
+                        'codigosupervisora'                     : lin[12],
+                        'lineacancelada'                        : lin[13]
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_92(self):
+        # Línea de Factura 2.                                    92
+        pass
+
+
+    def lt_94(self):
+        # Línea de pago con cheque cobranza.                     94
+        """
+            Línea de ticket cuando se paga con cheque pero para la cobranza (pago de servicios).
+            IdentificadorLinea #
+            NumeroDeLinea # TipoLinea
+            # TimestampLinea #
+            CodigoMedioPago
+            #
+            CodigoMoneda
+            #
+            TotalMedioPagoMoneda
+            #
+            TotalMedioPagoMonedaMonedaReferencia
+            #
+            TotalPagado
+            #
+            TotalPagadoMonedaReferencia # Cambio # TipoOperacion # LineaUltimoPago #
+            TipoCliente # IdCliente # AutorizaSupervisora # CodigoSupervisora # LineaCancelada
+            CodigoMedioPago->Código del medio de pago.
+            CodigoMoneda->Código de la moneda.
+            TotalMedioPagoMoneda -> Monto total de lo que se puede pagar con el medio de pago
+            moneda.
+            TotalMedioPagoMonedaMonedaReferencia -> Idem que el anterior pero expresado en
+            la moneda de referencia.
+            TotalEntregado-> Total entregado de ese medio de pago-moneda.
+            TotalEntregadoMonedaReferencia->Total entregado expresado en la moneda de
+            referencia.
+            Cambio -> Cambio de la línea de pago (su valor puede ser 0.00 (no hay cambio) o
+            positvo que es parte del cambio que se le da al cliente).
+            TipoOperacion -> 0-Si corresponde a una venta (los importes van en positivo).
+            1-Si corresponde a una devolución por parte del cliente (los importes
+            van en negativo).
+            LineaUltimoPago-> 0-No es la línea del último pago. Esto sucede cuando el ticket se
+            paga con múltiples pagos (inclusive de distintos medios de pago-
+            monedas) cuando el importe abonado es menor al total a pagar.
+            1-Es la línea del último pago.
+            TipoCliente ->Tipo de cliente
+            IdCliente ->Identificación cliente.
+            AutorizaSupervisora-> 0-La línea de pago no tuvo autorización de la supervisora.
+            1-La línea de pago tuvo autorización de la supervisora.
+            CodigoSupervisora->Código de la supervisora si AutorizaSupervisora=1, sino va vacío.
+            LineaCancelada->0-Línea de pago no cancelada.
+            1-Línea de pago cancelada.
+
+            Ejemplo de pago con cheque cobranza pesos (medio de pago 6, moneda 1) por un
+            importe de 250.00 pesos, para el tipo de cliente general (20) (por lo tanto no lleva id de
+            cliente).
+            L#8#94#174421#6#1#250.00#250.00#250.00#250.00#0.00#0#1#20##0##0
+
+            Idem que el anterior, por un monto de 400.00 pesos, para el tipo de cliente 0 cuyo
+            identificador es 9990003046413.
+            L#8#94#174544#6#1#400.00#400.00#400.00#400.00#0.00#0#1#0#9990003046413#0##0
+
+        """
+
+        pass
+
+
+    def lt_95(self):
+        # Línea de ticket de fondeo.                             95
+        pass
+
+
+    def lt_97(self):
+        # Línea de ticket de retiro                              97
+
+        """
+            Línea de ticket de retiro (97).
+
+            Este tipo de línea se presenta cuando la cajera realiza un retiro de caja.
+
+                CodigoMedioPago # CodigoMoneda # MontoRetiro
+                    0               1             2
+
+                0. CodigoMedioPago ->  Código del medio de pago.
+                1. CodigoMoneda    ->  Código de la moneda.
+                2. MontoRetiro     ->  Monto del retiro realizado.
+
+            Ejemplo de un retiro del codigo de medio de pago 1 y codigo de moneda 1 por 300.00 ,
+            del codigo de medio de pago 1 y codigo de moneda 2 por 500.00 y del codigo de medio
+            de pago 1 y codigo de moneda 4 por 300.00
+
+                L#8#97#201128#1#1#300.00
+                L#9#97#201128#1#2#500.00
+                L#10#97#201128#1#4#300.00
+        """
+
+        lin = self.esta_linea or False
+
+        result = dict()
+        try:
+            result.update(dict( codigomediopago = lin[0], codigomoneda = lin[1], montoretiro = lin[2] ))
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+        return result
+
+
+
+    def lt_99(self):
+        # Línea de ticket Cupones Numeros (SM)                   99
+        pass
+
+
+    def lt_100(self):
+        # Línea de ticket de cobranza (SM).               100
+        pass
+
+
+
+    def lt_101(self):
+        #Línea de ticket de devolucion de cobranza (SM). 101
+        pass
+
+
+    def lt_102(self):
+        # Línea de ticket de cancelacion de cobranza(SM). 102
+        pass
+
+
+    def lt_103(self):
+        # Cancelación de salida de cajera (SM)            103
+        pass
+
+
+    def lt_104(self):
+        # Seteo de monto de prestamo en efectivo (SM).    104
+        pass
+
+
+    def lt_105(self):
+        # Prestamo en efectivo (SM).                      105
+        pass
+
+
+    def lt_106(self):
+        # Ticket cliente facturacion (SM)                 106
+        pass
+
+
+    def lt_107(self):
+        # Ticket de informacion del cliente (SM)          107
+        pass
+
+
+    def lt_108(self):
+        # Ticket gift card (108)-SM                       108
+        pass
+
+
+    def lt_109(self):
+        # Devolución gift card (109)                      109
+        pass
+
+
+    def lt_115(self):
+        # Pago descuento Iva Afam (SM)                    115
+        pass
+
+
+    def lt_117(self):
+        # Preventa (SM)                                   117
+        pass
+
+
+    def lt_118(self):
+
+        """ Línea de ticket vale almuerzo (118)-SM
+
+            FlagTarjetaDocumento # TipoDocumento # NumeroDocumento # ModoIngreso #
+            Track1 # Track2 # NumeroTarjeta # ModoValeAlmuerzo # AcumuladoDiasSemana
+
+
+            FlagTarjetaDocumento    ->    Indicador si se trata de tarjeta o documento como dato
+            identificatorio.
+            0-Tarjeta.
+            1-Documento
+            TipoDocumento    ->     Tipo de documento si FlagTarjetaDocumento=1, sino va vacío.
+            C-Cédula de identidad.
+            O-Otro.
+            NumeroDocumento    ->     Número de documento si FlagTarjetaDocumento=1, sino va
+            vacío.El número de documento tiene concatenado el tipo de documento (primer
+            carácter).
+            ModoIngreso    ->     Modo de ingreso de la Tarjeta/Documento:
+            0-Teclado.
+            1-Scanner.
+            2-Lectora de banda magnética.
+            Track1    ->     Track 1 de la tarjeta si FlagTarjetaDocumento=0.Puede venir vacío.
+            Track2    ->     Track 2 de la tarjeta si FlagTarjetaDocumento=0.Puede venir vacío.
+            NumeroTarjeta    ->     Numero de la tarjeta si FlagTarjetaDocumento=0.Puede venir vacío.
+            ModoValeAlmuerzo    ->    D-Diario-El vale almuerzo se puede aplicar todos los dias de la
+            semana (aplicando el descuento correspondiente por dia).
+            S-Semanal-El vale almuerzo se aplica en su totalidad una vez a la
+            semana (aplicando el descuento acumulado una vez a la semana).
+            Dicho descuento depende de AcumuladoDiasSemana.
+            AcumuladoDiasSemana    ->    Acumulado de dias trabajados en la semana para aplicar el
+            descuento si es semanal.
+
+            Ejemplo de identificación de un vale almuerzo de tipo tarjeta (0) que se ingresó por la
+            lectora de banda magnetica (2), el valor del track 2 es 1032240472=0000 ,el numero de
+            tarjeta es 1032240472, el modo de vale almuerzo es semanal (S) y lo acumulado de dias
+            a la semana de trabajo es 6.
+            L#6#118#180726#0###2##1032240472=0000#1032240472#S#6
+
+            Ejemplo de identificación de un vale almuerzo de tipo documento (1) con tipo de
+            documento Otro (O), numero de documento O12345678 (el documento real seria
+            12345678 ya que el primer carácter tambien identifica el tipo de documento) y se
+            ingresó por teclado (0).
+            L#6#118#170035#1#O#O12345678#0###
+            """
+
+    def lt_119(self):
+
+        """
+
+        Ticket vale almuerzo (119)
+        --------------------------
+
+        CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+               0                1                 2
+
+        TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                    3                               4
+
+
+        TotalPagadoMonedaReferencia # Cambio # TipoOperacion # LineaUltimoPago #
+                    5                    6          7                8
+
+        AutorizaSupervisora # CodigoSupervisora # LineaCancelada
+                 9                    10                11
+
+        0. Código del medio de pago.
+        1. Código de la moneda.
+        2. Monto total de lo que se puede pagar con el medio de pago moneda.
+        3. Idem que el anterior pero expresado en la moneda de referencia.
+        4. Total entregado de ese medio de pago-moneda.
+        5. Total entregado expresado en la moneda de referencia.
+        6. Cambio de la línea de pago (valor >= 0.00)
+        7. Codigo de Operacion.
+                0 - Si corresponde a una venta (los importes van en positivo).
+                1 - Si corresponde a una devolución por parte del cliente (los
+                    importes van en negativo).
+        8. Ultimo pago.
+                0 - No es la línea del último pago. Esto sucede cuando el ticket
+                    se paga con múltiples pagos (inclusive de distintos medios
+                    de pago-monedas) cuando el importe abonado es menor al
+                    total a pagar.
+                1 - Es la línea del último pago.
+        9. Intervención supervisor.
+                0 - Línea de pago sin intervención de supervisor.
+                1 - Línea de pago autorizada por supervidor.
+       10. Código de la supervisora.
+       11. Estado de la línea de pago.
+            0-Línea de pago no cancelada.
+            1-Línea de pago cancelada.
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                'codigomediopago'                       : lin[0],
+                'codigomoneda'                          : lin[1],
+                'totalmediopagomoneda'                  : lin[2], # monto pagable en éste medio de pago expresado en la moneda usada.
+                'totalmediopagomonedamonedareferencia'  : lin[3], # lo mismo pero expresado en mon.referencia (PESOS)
+                'totalpagado'                           : lin[4], # Total recibido en la moneda usada.
+                'totalpagadomonedareferencia'           : lin[5], # lo mismo pero expresado en moneda de referencia (PESOS)
+                'cambio'                                : lin[6],
+                'tipooperacion'                         : lin[7],
+                'lineaultimopago'                       : lin[8],
+                'autorizasupervisora'                   : lin[9],
+                'codigosupervisora'                     : lin[10],
+                'lineacancelada'                        : lin[11],
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_120(self):
+        """
+            Línea de venta Mides (120)-SM
+            -----------------------------
+
+            Representa la línea de venta de un ticket de venta MIDES.
+
+            VentaMides  Texto que indica venta MIDES (Venta Mides).
+            CI          Cédula de identidad del cliente.Este campo es opcional,puede no venir.
+
+            VentaMides # CI
+        """
+        # import ipdb; ipdb.set_trace()n
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'ventamides': lin[0],
+                        'ci'        : lin[1]  if len(lin)>1 else ''
+                }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+        return result
+
+
+    def lt_121(self):
+        """
+            Línea de voucher retiro leche tarjeta Mides (121)-SM:
+            ====================================================
+            Representa la línea de retiro de productos (en este caso leche)
+            sin costo (hasta cierto tope) de la tarjeta Mides.
+
+            NumeroTarjeta # CedulaIdentidad # UnidadesRetiradas # SaldoUnidades # TipoVoucher # Modo
+
+            0. Numero de la tarjeta Mides.
+            1. Documento de identidad del cliente.
+            2. Cantidad de unidades retiradas.
+            3. Saldo de unidades que puede retirar sin costo.
+            4. Tipo de voucher asociado.
+                    0 - Original Cliente.
+                    1 - Vía Establecimiento.
+            5. Modo
+                    0 - Retiro de productos.
+                    1 - Devolución de productos.
+
+            NumeroTarjeta # CedulaIdentidad # UnidadesRetiradas # SaldoUnidades #
+
+            TipoVoucher # Modo
+
+        """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'numerotarjeta'      : lin[0],
+                        'cedulaidentidad'    : lin[1],
+                        'unidadesretiradas'  : lin[2],
+                        'saldounidades'      : lin[3],
+                        'tipovoucher'        : lin[4],
+                        'modo'               : lin[5],
+                }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_122(self):
+
+        """
+            Línea ticket info importe (122)-SM
+            Contiene la información de importes gravados de los pagos con Tarjeta de Credto/Debito, Lucheon, etc.
+
+            ImporteTotalTicket # ImporteGravadoTicket
+                    0                      1
+            ImporteTotalTicket   -> Importe total del ticket.
+            ImporteGravadoTicket -> Importe gravado del ticket.
+
+            Ejemplo de un importe con un total de ticket de 287.06 con un importe gravado de 235.30
+                L|10|122|191720|287.06|235.30
+
+        """
+
+        lin = self.esta_linea or False
+        result = {}
+        try:
+            result = {
+                        'importetotalticket'      : lin[0],
+                        'importegravadoticket'    : lin[1],
+                }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_123(self):
+        pass
+
+
+        """
+        Línea de pago TACRE (123)-SM / (126) P4 (no CFE).
+            Representa la línea de pago por Tarjeta Ticket Alimentacion/Canasta/Restaurante de forma electrónica.
+
+              CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+                    0                1               2
+              TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                             3                           4
+              TotalPagadoMonedaReferencia # Cambio # TipoOperacion # LineaUltimoPago #
+                           5                   6           7               8
+              NumeroTarjeta # NumeroAutorizacion # AutorizaSupervisora # CodigoSupervisora #
+                  9                 10                     11                   12
+              LineaCancelada # SiAplicaLeyDescIva # MontoDescuentoLeyIva # TextoLey
+                  13                 14                   15                  16
+
+
+
+             0. CodigoMedioPago                         ->  Código del medio de pago.
+
+             1. CodigoMoneda                            ->  Código de la moneda.
+
+             2. TotalMedioPagoMoneda                    ->  Monto total de lo que se puede pagar con el medio de pago
+                                                            moneda.
+
+             3. TotalMedioPagoMonedaMonedaReferencia    ->  Idem que el anterior pero expresado en
+                                                            la moneda de referencia.
+
+             4. TotalPagado                             ->  Total entregado de ese medio de pago-moneda.
+
+             5. TotalPagadoMonedaReferencia             ->  Total entregado expresado en la moneda de
+                                                            referencia.
+
+             6. Cambio                                  ->  Cambio de la línea de pago (su valor puede ser 0.00 (no hay cambio) o
+                                                            positvo que es parte del cambio que se le da al cliente).
+
+             7. TipoOperacion                           ->  0 - Si corresponde a una venta (los importes van en positivo).
+                                                            1 - Si corresponde a una devolución por parte del cliente (los importes
+                                                                van en negativo).
+
+             8. LineaUltimoPago                         ->  0 - No es la línea del último pago. Esto sucede cuando el ticket se
+                                                                paga con múltiples pagos (inclusive de distintos medios de pago-
+                                                                monedas) cuando el importe abonado es menor al total a pagar.
+                                                            1 - Es la línea del último pago.
+
+             9. NumeroTarjeta                           ->  Número de la tarjeta de crédito enmascarada (excepto grupo Disco).
+
+            10. NumeroAutorizacion                      ->  Número de autorización.
+
+            11. AutorizaSupervisora                     ->  0 - La línea de pago no tuvo autorización de la supervisora.
+                                                            1 - La línea de pago tuvo autorización de la supervisora.
+
+            12. CodigoSupervisora                       ->  Código de la supervisora si AutorizaSupervisora=1, sino va vacío.
+
+            13. LineaCancelada                          ->  0 - Línea no cancelada.
+                                                            1 - Línea cancelada. Este tipo de línea no tiene valor contable.
+
+            14. SiAplicaLeyDescIva                      ->  Flag que indica si se aplica la ley 19210 de inclusión financiera
+                                                            de descuento de iva.
+                                                            0 - No aplica ley de descuento de iva.
+                                                            1 - Aplica ley de descuento de iva.
+
+            15. MontoDescuentoLeyIva                    ->  Monto del descuento de Iva.
+
+            16. TextoLey                                ->  Texto de la ley (numero).
+
+
+            CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+                    0             1                    2
+            TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                            3                           4
+            TotalPagadoMonedaReferencia # Cambio # TipoOperacion # LineaUltimoPago #
+                        5                 6            7                8
+            NumeroTarjeta # NumeroAutorizacion # AutorizaSupervisora #
+                9                 10                   11
+            CodigoSupervisora # LineaCancelada # SiAplicaLeyDescIva #
+                12                13                   14
+            MontoDescuentoLeyIva # TextoLey
+                    15               16
+        """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                        'codigomediopago'                       : lin[0],
+                        'codigomoneda'                          : lin[1],
+                        'totalmediopagomoneda'                  : lin[2],
+                        'totalmediopagomonedamonedareferencia'  : lin[3],
+                        'totalpagado'                           : lin[4],
+                        'totalpagadomonedareferencia'           : lin[5],
+                        'cambio'                                : lin[6],
+                        'tipooperacion'                         : lin[7],
+                        'lineaultimopago'                       : lin[8],
+                        'numerotarjeta'                         : lin[9],
+                        'numeroautorizacion'                    : lin[10],
+                        'autorizasupervisora'                   : lin[11],
+                        'codigosupervisora'                     : lin[12],
+                        'lineacancelada'                        : lin[13],
+                        'siaplicaleydesciva'                    : lin[14],
+                        'montodescuentoleyiva'                  : lin[15],
+                        'textoley'                              : lin[16],
+                }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_124(self):
+
+        """
+            Línea de voucher de la tarjeta TACRE (124)-SM
+            =============================================
+
+            Muestran la información de un Voucher de pago por Tarjeta Ticket
+            Alimentacion/Canasta/Restaurante de forma electronica.
+
+             0. NumeroTarjeta    -> Número de la tarjeta.
+             1. Vencimiento      -> Vencimiento de la tarjeta (aamm).
+             2. Comprobante      -> Número de comprobante.
+             3. Autorizacion     -> Número de autorización.
+             4. CodigoTerminal   -> Código de la terminal asociado.
+             5. CodigoComercio   -> Código de comercio asociado.
+             6. TipoAutorizacion ->
+                    00-Online.
+                    01-Offline
+                    20-Online y aplica ley descuento IVA (ley 19210).
+                    21-Online, aplica ley descuento IVA (ley 19210) y no requiere firma.
+
+             7. NroLote          -> Número de lote asociado.
+             8. CodigoMoneda     -> Código de la moneda asociado.
+                    00-Pesos
+                    01-Dólares.
+
+             9. TipoTransaccion  -> Tipo de transacción asociado (MTI).
+                    1200-Compra
+                    1220-Confirmación Compra
+                    1240-Notificación de Compra
+                    1400-Devolución (Total o parcial)
+                    1420-Confirmación Devolución
+                    1440-Notificación de Devolución
+                    1900-VentaTACRE
+                    1901-Devolución TACRE
+                    1902-Anulación TACRE
+                    4900-Reversa venta TACRE
+                    4901-Reversa devolución TACRE
+                    4902-Reversa anulación TACRE
+                    9xxx-Entrenamiento
+
+            10. TipoVoucher         -> Tipo de voucher asociado.
+                    0-Original Cliente.
+                    1-Vía Establecimiento.
+
+            11. ImportePago         -> Importe pagado por la tarjeta.
+            12. FechaTransacccion   -> Fecha de transacción de la autorización (dd/mm/aaaa hh:mm:ss).
+            13. CodigoCaja          -> Código de la caja.
+            14. CodigoCajera        -> Código de la cajera.
+            15. NombrePropietario   -> Nombre del propietario de la tarjeta.
+            16. TipoIngreso         -> Tipo de ingreso asociado.
+                    0-Lectura magnética.
+                    1-Entrada manual
+                    2-Internet.
+
+            17. DescuentaIva        ->
+                    0-No descuenta iva (ley 17934).
+                    1-Descuenta iva (ley 17934).
+
+            18. SiAplicaLeyDescIva  -> Flag que indica si se aplica la ley 19210 de inclusión financiera
+                de descuento de iva.
+                    0-No aplica ley de descuento de iva.
+                    1-Aplica ley de descuento de iva
+
+            19. MontoDescuentoLeyIva    -> Monto del descuento de Iva.
+            20. MontoFactura            -> Monto de la factura.
+            21. MontoGravado            -> Monto gravado.
+            22. NombreTarjeta           -> Nombre de la tarjeta.
+            23. FlagImprimeFirma        ->
+                    0-No imprime la firma.
+                    1-Imprime la firma.
+
+            Ejemplo de un voucher de la tarjeta TACRE numero 6007940999999318,con
+            vencimiento de tarjeta 0116 (01/16),número de comprobante 1004002818,número de
+            autorización 000001,código de terminal 00000004, código de comercio asociado
+            42140140042, tipo de autorización 20,número de lote 1, moneda 00 (pesos), tipo de
+            transacción 1900, tipo voucher 0 (via cliente), importe de tarjeta de 287.06, fecha de
+            autorización 05/06/2015 19:17:10, caja 4,cajera 1,propietario tarjeta es PRUEBAS
+            REDBANK, tipo de ingreso de la tarjeta 0,descuenta Iva (1), aplica ley de descuento de
+            Iva (1) , el importe de descuento es de -10.00,monto de factura 1024.40,monto gravado
+            839.68,nombre tarjeta EDENRED y no imprime la firma.
+
+            L|13|124|191720|6007940999999318|0107|1004002818|000001|00000004|42140140042|20|1|00|1900|0|287.06|05/06/2015 19:17:10|4|1|PRUEBAS REDBANK|0|1|1|-10.00|1024.40|839.68|EDENRED|0
+
+
+                0               1             2             3               4
+           NumeroTarjeta # Vencimiento # Comprobante # Autorizacion # CodigoTerminal #
+                5                   6             7          8                9
+           CodigoComercio # TipoAutorizacion # NroLote # CodigoMoneda # TipoTransaccion #
+               10            11                 12             13           14
+           TipoVoucher # ImportePago # FechaTransacccion # CodigoCaja # CodigoCajera #
+                15                  16             17            18
+           NombrePropietario # TipoIngreso # DescuentaIva # SiAplicaLeyDescIva #
+                    19                 20                21          22               23
+           MontoDescuentoLeyIva # MontoFactura # MontoGravado # NombreTarjeta # FlagImprimeFirma
+
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                    'numerotarjeta'       : lin[0],
+                    'vencimiento'         : lin[1],
+                    'comprobante'         : lin[2],
+                    'autorizacion'        : lin[3],
+                    'codigoterminal'      : lin[4],
+                    'codigocomercio'      : lin[5],
+                    'tipoautorizacion'    : lin[6],
+                    'nrolote'             : lin[7],
+                    'codigomoneda'        : lin[8],
+                    'tipotransaccion'     : lin[9],
+                    'tipovoucher'         : lin[10],
+                    'importepago'         : lin[11],
+                    'fechatransaccion'    : lin[12],
+                    'codigocaja'          : lin[13],
+                    'codigocajera'        : lin[14],
+                    'nombrepropietario'   : lin[15],
+                    'tipoingreso'         : lin[16],
+                    'descuentaiva'        : lin[17],
+                    'siaplicaleydesciva'  : lin[18],
+                    'montodescuentoleyiva': lin[19],
+                    'montofactura'        : lin[20],
+                    'montogravado'        : lin[21],
+                    'nombretarjeta'       : lin[22],
+                    'flagimprimefirma'    : lin[23]
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+        return result
+
+
+    def lt_125(self):
+        pass
+
+
+    def lt_126(self):
+        """
+
+          Línea de ticket de cliente de cuenta corriente (126)-SM.
+          -------------------------------------------------------
+
+            Especificacion de la línea de ticket de cliente de cuenta corriente (clientes especiales).
+
+            0. CodigoCC     Código de cliente de cuenta corriente.
+            1. NombreCC     Nombre del cliente de cuenta corriente.
+            2. MontoPagoCC  Es el monto de pago del cliente de cuenta corriente
+                            No necesariamente es igual al monto total del ticket,
+                            cuando se usa medio de pago.
+
+             CodigoCC # NombreCC # MontoPagoCC
+                 0         1           2
+        """
+
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                'codigocc'   : lin[0],
+                'nombrecc'   : lin[1],
+                'montopagocc': lin[2],
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_127(self):
+        """
+          Línea de pago cuenta corriente (127)-SM   Medio de pago Venta o devolución
+          ---------------------------------------------------
+
+            Especificacion de la línea de ticket del pago de clientes de
+            cuenta corriente. Es igual a la línea de pago en efectivo (9),
+            solo que se refiere al codigo de medio de pago cuenta corriente
+            y moneda pesos.
+
+          Línea de pago de ticket en efectivo (9).
+          ---------------------------------------
+
+
+            0. Código del medio de pago.
+            1. Código de la moneda.
+            2. Monto total de lo que se puede pagar con el medio de pago moneda.
+            3. Idem que el anterior pero expresado en la moneda de referencia.
+            4. Total entregado de ese medio de pago-moneda.
+            5. Total entregado expresado en la moneda de referencia.
+            6. Cambio de la línea de pago (valor >= 0.00)
+            7. Codigo de Operacion.
+                    0 - Si corresponde a una venta (los importes van en positivo).
+                    1 - Si corresponde a una devolución por parte del cliente (los
+                        importes van en negativo).
+            8. Ultimo pago.
+                    0 - No es la línea del último pago. Esto sucede cuando el ticket
+                        se paga con múltiples pagos (inclusive de distintos medios
+                        de pago-monedas) cuando el importe abonado es menor al
+                        total a pagar.
+                    1 - Es la línea del último pago.
+            9. Intervención supervisor.
+                    0 - Línea de pago sin intervención de supervisor.
+                    1 - Línea de pago autorizada por supervidor.
+            10. Código de la supervisora. o vacio
+            11. Estado de la línea de pago.
+                    0-Línea de pago no cancelada.
+                    1-Línea de pago cancelada.
+
+            CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+                0                1                 2
+
+            TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                        3                               4
+
+
+            TotalPagadoMonedaReferencia # Cambio # TipoOperacion # LineaUltimoPago #
+                        5                    6          7                8
+
+            AutorizaSupervisora # CodigoSupervisora # LineaCancelada
+                    9                    10                11
+
+        """
+        lin = self.esta_linea or False
+
+        result = {}
+        try:
+            result = {
+                'codigomediopago'                       : lin[0],
+                'codigomoneda'                          : lin[1],
+                'totalmediopagomoneda'                  : lin[2],
+                'totalmediopagomonedamonedareferencia'  : lin[3],
+                'totalpagado'                           : lin[4],
+                'totalpagadomonedareferencia'           : lin[5],
+                'cambio'                                : lin[6],
+                'tipooperacion'                         : lin[7],
+                'lineaultimopago'                       : lin[8],
+                'autorizasupervisora'                   : lin[9],
+                'codigosupervisora'                     : lin[10],
+                'lineacancelada'                        : lin[11],
+            }
+
+        except Exception as ex:
+            msg = "[ERROR]: %s %s %s" % (ex, self.llave, self.descripcion)
+            frame = getframeinfo(currentframe()) if self.verbose else False
+            self.excepcion(msg, frame, self.id_tck)
+
+
+        return result
+
+
+    def lt_900(self):
+        pass
+
+# --- fin clase `IPLinea`
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/opentck3/ip_ticket/ticket_doc.py b/opentck3/ip_ticket/ticket_doc.py
new file mode 100644 (file)
index 0000000..a2ac805
--- /dev/null
@@ -0,0 +1,2684 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+
+__licence__ = "GNU/GPLv3"
+__author__  = "Marcelo Zunino (InfoPrimo SL) 2015"
+
+# import os
+import sys
+import logging
+
+# logfile = './log/ticket.log'
+# os.path.isdir('./log') or os.mkdir('./log')
+# os.path.isfile(logfile) or os.system("touch %s" % logfile)
+# logging.basicConfig(format='%(asctime)s %(message)s', filename=logfile, level=logging.INFO)
+ns = __name__
+
+class IPTicket(object):
+
+    """
+        Se defininen 3 clases para procesar el informe de salida pazos.
+        IPTicket, IPCabezal, IPLinea.
+
+        IPCabezales e IPLineas, siguen el orden, las denominaciones, etc del
+        documento: "Diseño de la salida estándar del CSTVIEW para el sistema
+        Pazos4 y Supermercado"¹. Versión: 1.6.55
+
+
+        Class IPTicket:
+
+            Superclase para "IPCabezal" e "IPLineas" en la que se definen
+            operaciones simples de uso en ambas clases.
+
+            Cada una de éstas clases hijas implementa un `diccionario python`
+            que clasifica y define las líneas de un `Ticket`.
+
+            Para el sistema Pazos4 el `Ticket` es la unidad básica de registro
+            de transaciones en los POS.
+
+            Cada ticket contiene líneas de `Tipo Cabezal` y líneas de tipo
+            `Tipo Líneas de Detalle`.
+
+            Diccionarios de tipo:
+
+                        dict = { llave0: valor, llaveX: valor, ... }
+
+            :llave: string
+                Coincide con el numeral de las tablas "Tipos de líneas de
+                cabezal de ticket" y "Tipos de línea cabezal" respectivamente,
+                de la documentación de "Pazos" mencionada.
+
+            :valor: list
+                Es una lista la de dos miembros [Descripción, Método] cuyo primer
+                elemento coincide con el título de la descripción en las tablas
+                mencionadas. El segundo, en caso de existir, es la referenica a
+                un método de clase que extrae los datos correspondientes al tipo
+                de `llave` que representa.
+
+
+        ¹20??-2015 © Sisteco S.A
+        ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
+    """
+
+    @staticmethod
+    def fecha10(strg):
+        """
+            param:     string (14 dígitos)
+            retorna:   string 'dd/mm/aaaa' día/mes/año (10 dígitos)
+        """
+        if len(strg) == 14:
+            res = "%s/%s/%s" % ( strg[6:8], strg[4:6], strg[:4] )
+        else:
+            res = '00/00/0000'
+        return res
+
+    @staticmethod
+    def fecha8(strg):
+        """
+            param:     string (14 dígitos) 'aaaammddhhmmss'
+            retorna:   string 'dd/mm/aa' día/mes/año (8 dígitos)
+        """
+        if len(strg) == 14:
+            res = "%s/%s/%s" % ( strg[6:8], strg[4:6], strg[2:4])
+        else:
+            res = '00/00/00'
+        return res
+
+    #fecha = ddmmyyyy         yymmdd
+
+    @staticmethod
+    def yyyymmdd(strg):
+        """
+            param:     string (14 dígitos)
+            retorna:   string 'aaaammdd' añomesdía (8 dígitos)
+        """
+        if len(strg) == 14:
+            res = "%s%s%s" % ( strg[0:4], strg[4:6], strg[6:8] )
+        else:
+            res = '00000000'
+        return res
+
+
+    @staticmethod
+    def yymmdd(strg):
+        """
+            param:     string (14 dígitos)
+            retorna:   string 'aammdd' añomesdía (6 dígitos)
+        """
+        if len(strg) == 14:
+            res = "%s%s%s" % ( strg[2:4], strg[4:6], strg[6:8] )
+        else:
+            res = '000000'
+        return res
+
+    # fecha = ddmmyyyy
+
+    @staticmethod
+    def dd(strg):
+        """
+            param:     string (14 dígitos)
+            retorna:   string 'dd' día del mes (2 dígitos)
+        """
+        if len(strg) == 14:
+            res = "%s" % (strg[6:8])
+        else:
+            res = '00'
+        return res
+
+
+    @staticmethod
+    def mm(strg):
+        """
+            param:     string (14 dígitos)
+            retorna:   string 'mm' mes del año (2 dígitos)
+        """
+        if len(strg) == 14:
+            res = "%s" % (strg[4:6])
+        else:
+            res = '00'
+        return res
+
+    @staticmethod
+    def yy(strg):
+        """
+            param:     string (14 dígitos)
+            retorna:   string 'aa' año (2 dígitos)
+        """
+        if len(strg) == 14:
+            res = "%s" % ( strg[2:4] )
+        else:
+            res = '0000'
+        return res
+
+    @staticmethod
+    def yyyy(strg):
+        """
+            param:     string (14 dígitos)
+            retorna:   string 'aaaa' año (4 dígitos)
+        """
+        if len(strg) == 14:
+            res = "%s" % ( strg[:4] )
+        else:
+            res = '0000'
+        return res
+
+
+    @staticmethod
+    def hora(strg):
+        """
+            param:     string (6 dígitos)
+            retorna:   string 'hh:mm:ss' hora:minutos:segundos
+        """
+        if len(strg) == 6:
+            res = "%s:%s:%s" % (strg[0:2], strg[2:4], strg[4:6])
+        else:
+            res = '00:00:00'
+        return res
+
+    @staticmethod
+    def hhmmss(strg):
+        """
+            Evita errores de hora (estilo salomón)
+            param:     string (6 dígitos)
+            retorna:   string 'hhmmss'
+        """
+        if len(strg) == 6:
+            res = strg
+        else:
+            res = '000000'
+        return res
+
+
+    @staticmethod
+    def rfalla():
+        """ notificación a stdout """
+        msg = '\n\tAtención: falla registrada.'
+        print ("%s  %s" % (msg, "Vea el log!"))
+
+
+# instancia compartida
+ipt = IPTicket()
+
+
+class IPCabezal(IPTicket):
+
+    """
+        Hereda de IPTicket, representa a una línea de tipo cabezal de Salidapazosnuevo-*
+
+        **Ejemplo**
+
+        Una línea tipo cabezal del informe Salidapazosnuevo:
+           C#1#2#350#2#20151121105326#F#4#183.40#20#13
+
+        La misma línea tal cómo llega a una instancia de `IPCabezal`
+          linea = ['1', '2', '350', '2', '20151121105326', 'F', '4', '183.40', '20', '13'] *
+          indices   0    1     2     3          4           5    6       7       8     9  **
+
+           * objeto python `list` Se usa como array: `lst = [ '1','dos', 357, 'hola']`
+          ** índice implícito en el objeto `list`:
+                la expresión lst[3] devolverá el string `hola`; lst[0] devolverá el literal '1',
+                en tanto lst[2] retorna el entero 357.
+
+        La instanciación sería `un_cabezal = IPCabezal(una_linea_tipo_cabezal)`
+
+        Se utlizan estructuras análogas para el caso de líneas de tipo detalle
+        del ticket. En ambos casos se omite el identificador de línea.
+
+        ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
+
+
+
+        Diccionario de tipos de línea cabezal:
+
+        No justifica métodos de línea para los cabezales, por tanto el segundo miembro
+        de la lista/valor de las llaves está vacío. Podría haberse optado por un tipo
+        simple para los valores, como `string`. Se ha mantenido `list` a efectos de
+        homogenizar la notación de acceso en los clientes de las clases.
+
+        :dic_tipo_cabezal:        : Miembro de clase
+
+    """
+
+    dic_tipo_cabezal = {'1'  : ['Ticket Venta/Ingreso'  , ],
+                        '3'  : ['Devolución'            , ],
+                        '4'  : ['Estado de cuenta'      , ],
+                        '6'  : ['Canje'                 , ],
+                        '7'  : ['Inventario'            , ],
+                        '8'  : ['Lin. de Cajera'        , ],
+                        '10' : ['Pago de caja'          , ],
+                        '11' : ['Factura'               , ],
+                        '14' : ['Consulta'              , ],
+                        '15' : ['Apertura de Gaveta'    , ],
+                        '16' : ['N.Credito Devolucion'  , ],
+                        '17' : ['Fondeo'                , ],
+                        '18' : ['Retiro'                , ],
+                        '19' : ['Prestamo efectivo'     , ],
+                        '20' : ['Retiro de Productos'   , ],
+                        '21' : ['Cab. Z de Caja'        , ],
+                       '999' : ['-Cabezal NO definido-' , ]}
+
+    def __init__(self, linea=None):
+
+        if len(linea) == 10:
+            # los cabezales ¿son siempre de largo 10?
+
+            self.dict_cabezal   = self.dic_tipo_cabezal
+            self.llave          = linea[0]
+            self.descripcion    = self.dic_tipo_cabezal[linea[0]][0]
+            self.n_caja         = linea[1]
+            self.n_ticket       = linea[2]
+            self.n_cajera       = linea[3]
+            self.timestamp      = linea[4]
+            self.fecha          = ipt.fecha10(linea[4])
+            self.estado         = linea[5]
+            self.cant_articulos = linea[6]
+            self.total_a_pagar  = linea[7]
+            self.tipo_d_cliente = linea[8]
+            self.cant_lineas    = linea[9]
+            self.yyyymmdd       = ipt.yyyymmdd(linea[4])
+            self.yymmdd         = ipt.yymmdd(linea[4])
+            self.yyyy           = ipt.yyyy(linea[4])
+            self.yy             = ipt.yy(linea[4])
+            self.mm             = ipt.mm(linea[4])
+            self.dd             = ipt.dd(linea[4])
+
+        else: #except Exception as ex:
+
+            msg  = ' %s [ ERROR ] Imposible inizializar la clase IPCabezal: la línea recibida ' % ns
+            msg += '\nno parece una línea de cabezal de ticket de SalidaPazos'
+            logging.error(msg)
+            sys.exit(1)
+
+# --- fin clase `IPCabezal`
+
+
+class IPLinea(IPTicket):
+
+    """
+        Hereda de IPTicket, representa a una línea de detalle de ticket
+        de Salidapazosnuevo.
+
+        ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
+
+
+        Diccionario (llave: valor) de "tipos de lineas de ticket".
+
+            En el diccionario de tipos, cada `llave` será el número que
+            identifica el tipo de línea de ticket, en tanto su valor`
+            será una lista (array) de dos elementos,
+
+            El primer elemento de ésta lista es un `string` que contiene
+            la descripción del tipo de línea de ticket.
+            El segundo elemento, también `string`, es el nombre de un método
+            que devuelve un objeto de datos de la línea, según sea llave.
+            Este segundo elemento se puede usar como invocación a dicho método.
+
+        La idea es ofrecer una clase se uso simple y flexible.
+        Ejemplo:
+
+            Tipo de línea: Total de ticket (4)
+
+            La línea represnta un ticket por un total de $774.05 e incluye
+            pago de servicio por $591.00
+
+                Total  774.05
+                Serv. -591.00
+                     --------
+                       183.05
+
+            en Salidapazos -> L#10#4#153713#774.05#21.97#183.05#21.97
+
+            Atributos específicos de éste tipo de línea:
+                TotalTicket # IvaTotalTicket # TotalTicketSinPagoServicios # IvaTotalTicketSinPagoServicios
+                   774.05   #      21.97     #           183.05            #            21.97
+
+            [código]
+                        from ticket import IPLinea
+
+                        linea   = ['10','4','153713','774.05','21.97','183.05','21.97']
+                        lin_obj = IPLinea(linea)
+                        data    = lin_obj.metodo()
+
+                        print( data['totalticket'],
+                               data['ivatotalticket'],
+                               data['totalticketsinpagoservicios'],
+                               data['ivatotalticketsinpagoservicios'] )
+            [/código]
+
+    """
+
+
+    def __init__(self, linea=None):
+        """
+            :param linea: línea de nticket
+
+            El nombre `tipos_linea_tckes` denomina el diccionario de tipos de líneas.
+        """
+        tipos_linea_tck = {
+            '1'    : ['Venta de ítem'                       , self.lt_1],
+            '4'    : ['Total del ticket'                    , self.lt_4],
+            '5'    : ['Cabezal de CFE'                      , self.lt_5],
+            '6'    : ['Pié de CFE'                          , self.lt_6],
+            '7'    : ['Identificación de la cajera'         , self.lt_7],
+            '9'    : ['Pago de ticket en efectivo'          , self.lt_9],
+            '10'   : ['Cabezal de un combo'                 , self.lt_10],
+            '11'   : ['Detalle de combo'                    , self.lt_11],
+            '12'   : ['Cancelación de ítem'                 , self.lt_12],
+            '13'   : ['Descuento a un ítem'                 , self.lt_13],
+            '15'   : ['Puntos generados de fidel. ítem'     , self.lt_15],
+            '16'   : ['Puntos totales de fidel. generados'  , self.lt_16],
+            '18'   : ['Regalo de artículos'                 , self.lt_18],
+            '19'   : ['Cupón'                               , self.lt_19],
+            '20'   : ['Devolución de un ítem'               , self.lt_20],
+            '21'   : ['Entrada de cajera'                   , self.lt_21],
+            '22'   : ['Salida de cajera'                    , self.lt_22],
+            '23'   : ['Pausa de cajera'                     , self.lt_23],
+            '24'   : ['Cancelacion ticket'                  , self.lt_24],
+            '26'   : ['Cabezal de beneficio al total'       , self.lt_26],
+            '27'   : ['Detalle de un beneficio al total'    , self.lt_27],
+            '28'   : ['Descuento al total'                  , self.lt_28],
+            '29'   : ['Devolución de envases'               , self.lt_29],
+            '30'   : ['Venta a la subfamilia'               , self.lt_30],
+            '32'   : ['Inventario'                          , self.lt_32],
+            '33'   : ['Canje de ítem'                       , self.lt_33],
+            '34'   : ['Información de cliente de fidel.'    , self.lt_34],
+            '35'   : ['Cancelación de un canje de ítem'     , self.lt_35],
+            '36'   : ['Total de canje'                      , self.lt_36],
+            '37'   : ['Pago con tarjeta'                    , self.lt_37],
+            '38'   : ['Pago con cheque'                     , self.lt_38],
+            '40'   : ['Pago luncheon ticket'                , self.lt_40],
+            '43'   : ['Voucher de la tarjeta'               , self.lt_43],
+            '44'   : ['Datos adicionales garantía articulo' , self.lt_44],
+            '47'   : ['Pago de servicio'                    , self.lt_47],
+            '49'   : ['Detalle beneficios med.pago-moneda'  , self.lt_49],
+            '52'   : ['Pago de caja'                        , self.lt_52],
+            '53'   : ['Tipo de ticket'                      , self.lt_53],
+            '55'   : ['Intervención de la supervisora'      , self.lt_55],
+            '56'   : ['Cancelacion de un pago de servicio'  , self.lt_56],
+            '57'   : ['Tipo de cliente'                     , self.lt_57],
+            '58'   : ['Ticket de cancelación de pago'       , self.lt_58],
+            '60'   : ['Cupón'                               , self.lt_60],
+            '61'   : ['Pedidos'                             , self.lt_61],
+            '62'   : ['Fin de pausa de cajera'              , self.lt_62],
+            '63'   : ['Redondeo importe total del ticket'   , self.lt_63],
+            '65'   : ['Puntos de fidelización'              , self.lt_65],
+            '67'   : ['Pago de cupón corporativo'           , self.lt_67],
+            '68'   : ['Id. Cliente '                        , self.lt_68],
+            '71'   : ['Puntos no generadas'                 , self.lt_71],
+            '72'   : ['Descuento para parking'              , self.lt_72],
+            '73'   : ['Ticket Z'                            , self.lt_73],
+            '76'   : ['Descuento producido por marcas'      , self.lt_76],
+            '77'   : ['Cabezal de marca'                    , self.lt_77],
+            '78'   : ['Detalle de la marca'                 , self.lt_78],
+            '81'   : ['Devolución de pago de servicio'      , self.lt_81],
+            '82'   : ['Consulta e.de cuenta de la cobranza.', self.lt_82],
+            '83'   : ['Voucher de la cobranza'              , self.lt_83],
+            '84'   : ['Apertura de gaveta'                  , self.lt_84],
+            '85'   : ['Pago de tarjeta offline'             , self.lt_85],
+            '86'   : ['Recargo'                             , self.lt_86],
+            '87'   : ['Descuento a los med.pago-moneda.'    , self.lt_87],
+            '88'   : ['Venta cómputos celular'              , self.lt_88],
+            '89'   : ['Devolución venta cómputos celular'   , self.lt_89],
+            '92'   : ['Linea de factura'                    , self.lt_92],
+            '90'   : ['Pago ticket TAlimentos'              , self.lt_90],
+            '91'   : ['Pago ticket Total'                   , self.lt_91],
+            '94'   : ['Pago con cheque cobranza'            , self.lt_94],
+            '95'   : ['Ticket de fondeo'                    , self.lt_95],
+            '97'   : ['Ticket de retiro'                    , self.lt_97],
+            '99'   : ['Cupones Numeros'                     , self.lt_99],
+            '100'  : ['Ticket de cobranza'                  , self.lt_100],
+            '101'  : ['Ticket de devolución de cobranza'    , self.lt_101],
+            '102'  : ['Ticket cancelacion de cobranza'      , self.lt_102],
+            '103'  : ['Cancelación de salida de cajera'     , self.lt_103],
+            '104'  : ['Seteo monto de prestamo en efectivo' , self.lt_104],
+            '105'  : ['Prestamo en efectivo'                , self.lt_105],
+            '106'  : ['Ticket del cliente de facturación '  , self.lt_106],
+            '107'  : ['Ticket de información del cliente'   , self.lt_107],
+            '108'  : ['Ticket gift card'                    , self.lt_108],
+            '109'  : ['Ticket devolución gift card'         , self.lt_109],
+            '115'  : ['Pago descuento iva a familia'        , self.lt_115],
+            '117'  : ['Preventa'                            , self.lt_117],
+            '118'  : ['Ticket vale almuerzo'                , self.lt_118],
+            '119'  : ['Ticket pago vale almuerzo'           , self.lt_119],
+            '120'  : ['Venta Mides'                         , self.lt_120],
+            '121'  : ['Voucher retiro leche tarjeta Mides'  , self.lt_121],
+            '122'  : ['Ticket info importe'                 , self.lt_122],
+            '123'  : ['Pago TCRE'                           , self.lt_123],
+            '124'  : ['Voucher de la tarjeta TCRE'          , self.lt_124],
+            '125'  : ['Total puntos PROMO'                  , self.lt_125],
+            '126'  : ['Ticket cliente de cuenta corriente'  , self.lt_126],
+            '127'  : ['Pago cuenta corriente'               , self.lt_127],
+            '900'  : ['Declaración de cajera'               , self.lt_900]
+        }
+
+        try:
+            """ 
+                Atributos compartidos por todas las `Líneas de Detalle`
+                ------------------------------------------------------
+                
+                     numerodelinea  ->   número secuencial de la línea en el ticket
+                     tipolinea      ->   llave
+                     timestamplinea ->   hhmss
+                     
+            """
+            self.numerodelinea = linea[0]                  # Número de línea
+            self.llave       = llave = linea[1]            # Tipo de línea de ticket
+            self.descripcion = tipos_linea_tck[llave][0]   # Descripción del  Tipo de línea de ticket
+            self.metodo      = tipos_linea_tck[llave][1]   # Método implementado para el tipo de línea de ticket
+
+            self.hora   = ipt.hora(linea[2])               # hh:mm:ss
+            self.hhmmss = ipt.hhmmss(linea[2])             # hhmmss
+            self.timestamplinea = ipt.hhmmss(linea[2])
+
+            self.esta_linea = linea[3:] # línea sin los elementos compartidos. (se usa en los métodos)
+        except Exception as ex:
+            import ipdb; ipdb.set_trace()
+            msg  = ' %s [ ERROR ] Imposible inizializar la clase IPLinea: la línea recibida ' % ns
+            msg += '\nno parece una línea de cabezal de ticket de SalidaPazos'
+            logging.info(msg)
+            logging.error("%s \n%s" % (ex, linea))
+            print ("%s  %s" % (msg, "Vea el log!"))
+            sys.exit(1)
+
+
+
+    """
+        Métodos "lt_nnn":
+        '''''''''''''''''
+                            Son métodos específicos para cada tipo de linea
+        cuya referencia cunsituye el segundo elemento de la lista de valores
+        en el diccionario de tipos.
+
+        Se han definido los métodos correspondiente a los tipos de líneas de
+        interés así como los encabezados para el resto de los métodos
+        'nombrados' en el diccionario de tipos.
+        A medida que sea necesario se irá desarrollando el resto. Por el
+        momento son `enduído` para namespaces.
+    """
+
+    def lt_1(self):
+        """
+            Línea de venta de ítem (1)-SM.
+            ------------------------------
+            (sin atributos comunes) `Tipo Líneas de Detalle`
+
+            CodigoArticulo # Cantidad # Precio # Iva # PrecioDescuento # IvaDescuento #
+                   0            1         2       3          4                5
+
+            PrecioDescuentoCombo # IvaDescuentoCombo # PrecioDescuentoMarca #
+                     6                    7                   8
+
+            IvaDescuentoMarca  #   PrecioDescuentoTotal # IvaDescuentoTotal #
+                    9                    10                      11
+
+            CantDescManuales # LineaCancelada # ModoIngreso # CodigoVendedor #
+                12                  13             14            15
+
+            Talle # Color # Marca # Modelo # SiEsTandem # CodigoArticuloOriginal #
+              16      17      18      19       20                  21
+
+            CodigoIva # SiAplicaDescFidel # MontoRealDescFidel # PrecioUnitario
+                  22          23                      24               25
+
+
+            Descripción:
+
+            0.Código interno del artículo.
+            1.Cantidad de artículos vendidos en esa línea. Es la cantidad que
+                sale impresa en el ticket.
+
+            2.Precio de la línea del articulo (cantidad x precio unitario)
+                expresado en la moneda de referencia. Es el precio “limpio”
+                al cual no se le efectuó ningún descuento (no incluye iva,
+                este va separado en el siguiente campo).
+            3.Iva de la línea del artículo expresado en la moneda de referencia.
+
+            4.Precio de la línea del artículo a la cual se aplicó un descuento
+                directo. Si esta es igual a Precio la línea no fue afectada
+                por un descuento directo.
+            5.Iva del descuento directo de la línea del articulo.
+
+            6.Precio de la línea del articulo la cual fue afectada por un
+                descuento de un Combo. Si el artículo pertenece a un combo y
+                este se efectuó, se le aplicará el descuento correspondiente
+                (excepto si el Combo otorga un descuento al total).
+                Si el importe es igual a PrecioDescuento la línea no fue
+                afectada por un descuento del Combo.
+            8.Iva del descuento del combo a la línea del artículo.
+
+            8.Precio de la línea del articulo la cual fue afectada por un
+                descuento por Marcas. Si el artículo pertenece a una Marca
+                y esta se efectuó, se le aplicará el descuento correspondiente
+                (excepto si la Marca otorga un descuento al total). Si el
+                importe es igual a PrecioDescuentoCombo la línea no fue
+                afectada por un descuento de Marca.
+            9.Iva del descuento a la Marca a la línea del artículo.
+
+           10.Precio de la línea del artìculo la cual fue afectada por un
+                descuento al total. Si bien es un descuento al total, se
+                prorratea a las líneas. Si esta es igual a PrecioDescuentoMarca
+                la línea no fue afectada por un descuento al total. Nota: Este
+                es el precio final de artículo una vez aplicado todos los
+                descuentos si corresponde (sino conserva el precio original),
+                por lo tanto si se va a procesar los importes de los artículos,
+                se debe tomar este valor mas el iva.
+           11.Iva del descuento al total a la línea del artículo.
+
+           12.Cantidad de descuentos manuales que realizó la cajera.
+           13.Estado
+                       0-Línea no cancelada.
+                       1-Línea cancelada.
+                       Este tipo de línea no tiene valor contable. A pesar
+                       que pudo haber sido afectada por descuentos, esta no
+                       se debe tomar en cuenta.
+           14.Modo de ingreso del artículo. Son los siguientes:
+                       0-De teclado.
+                       1-De scanner.
+                       2-Lectora de banda magnética.
+
+           15.Código de vendedor si aplica, sino va vacío.
+           16.Datos del talle si aplica, sino va vacío.
+           17.Color si aplica, sino va vacío.
+           18.Marca si aplica, sino va vacío.
+           19.Modelo si aplica, sino va vacío.
+           20.Es tandem.
+                   0 - No es artículo de tandem.
+                   1 - Es artículo de tandem.
+           21.Es el código original del artículo que ingresó la cajera, ya
+                sea el código de barras entero o el código digitado manualmente.
+                En el caso de repetir el ultimo articulo ingresado este campo
+                no se setea, ya que la cajera no lo ingresa en forma explicita.
+           22.Código de iva aplicado.Si no aplica IVA va 0.
+           23.Flag que indica si a la línea se le aplico control de descuento
+                al total por fidelización.
+                        0-No se aplico control de descuento.
+                        1-Se aplico control de descuento (ver MontoRealDescFidel).
+           24.Monto real del descuento controlado por fidelizacion.
+           25.Precio unitario del item (precio de lista que incluye IVA).
+        """
+
+        lin = self.esta_linea or False
+
+        iva_map = { '1': 0.22, '2': 0.10, '3': 0 }
+        try:
+            result = {
+                       'codigoarticulo'         : lin[0],
+                       'cantidad'               : lin[1],
+
+                       'precio'                 : lin[2],
+                       'iva'                    : lin[3],
+
+                       'preciodescuento'        : lin[4],
+                       'ivadescuento'           : lin[5],
+
+                       'preciodescuentocombo'   : lin[6],
+                       'ivadescuentocombo'      : lin[7],
+
+                       'preciodescuentomarca'   : lin[8],
+                       'ivadescuentomarca'      : lin[9],
+
+                       'preciodescuentototal'   : lin[10],
+                       'ivadescuentototal'      : lin[11],
+
+
+                       'cantdescmanuales'       : lin[12],
+                       'lineacancelada'         : lin[13],
+                       'modoingreso'            : lin[14],
+
+                       'codigovendedor'         : lin[15],
+                       'talle'                  : lin[16],
+                       'color'                  : lin[17],
+                       'marca'                  : lin[18],
+                       'modelo'                 : lin[19],
+
+                       'esdetandem'             : lin[20],
+                       'codigoarticulooriginal' : lin[21],
+                       'codigoiva'              : iva_map[lin[22]],
+                       'siaplicadescfidel'      : lin[23],
+                       'montorealdescfidel'     : lin[24],
+                       'preciounitario'         : lin[25],
+            }
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+        return result
+
+
+    def lt_4(self):
+
+        """
+            Línea de total del ticket (4)
+            Contiene el total del ticket:
+
+            TotalTicket # IvaTotalTicket # TotalTicketSinPagoServicios # IvaTotalTicketSinPagoServicios
+                 0              1                     2                                3
+            TotalTicket     ->  Importe total del ticket (incluye el iva).
+
+            IvaTotalTicket  ->  Iva del total de ticket (que esta sumado en TotalTicket).
+
+            TotalTicketSinPagoServicios ->  Total del ticket excluyendo los pagos de
+                servicios (incluye el iva). Si no hubo pago de servicios es igual que
+                TotalTicket.
+
+            IvaTotalTicketSinPagoServicios  ->  Iva del importe anterior (que esta sumado a
+                TotalTicketSinPagoServicios).
+
+            Ejemplo de total de ticket sin pago de servicios con un total de 261.76:
+            L#13#4#181644#261.76#47.21#261.76#47.21
+
+            Ejemplo de un total de ticket con un total de 774.05 que incluye un pago de servicio de
+            774.05 -183.05=591.00 (UTE):
+            L#10#4#153713#774.05#21.97#183.05#21.97
+
+        """
+        lin = self.esta_linea or False
+
+        try:
+            result = {'totalticket': lin[0],
+                      'ivatotalticket': lin[1],
+                      'totalticketsinpagoservicios': lin[2],
+                      'ivatotalticketsinpagoservicios': lin[3]
+                      }
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+        return result
+
+
+    def lt_5(self, *args):
+        """
+            Línea de cabezal CFE (5)
+
+            Si el sistema utiliza el modo de Comprobante Fiscal Electronico representa los datos del
+            cabezal del documento electronico:
+
+            TipoCFE #  DescripcionCFE # SerieCFE # NumeroCFE # TipoDocumentoReceptor
+               0             1             2           3                4
+            DocumentoReceptor # NombreReceptor # DireccionReceptor # CiudadReceptor
+                  5                   6                 7                 8
+
+            TipoCFE     -> Tipo de comprobante, estos pueden ser:
+                            101 e-Ticket
+                            102 Nota de Crédito de e-Ticket
+                            103 Nota de Débito de e-Ticket
+                            111 e-Factura
+                            112 Nota de Crédito de e-Factura
+                            113 Nota de Débito de e-Factura
+                            181 e-Remito
+                            182 e-Resguardo
+                            201 e-Ticket Contingencia
+                            202 Nota de Crédito de e-Ticket Contingencia
+                            203 Nota de Débito de e-Ticket Contingencia
+                            211 e-Factura Contingencia
+                            212 Nota de Crédito de e-Factura Contingencia
+                            213 Nota de Débito de e-Factura Contingencia
+                            281 e-Remito Contingencia
+                            282 e-Resguardo Contingencia
+
+            DescripcionCFE  -> Descripcion del tipo de CFE (ver arriba).
+
+            SerieCFE        -> Serie del CFE.
+
+            NumeroCFE       -> Número del CFE.
+
+            TipoDocumentoReceptor -> Tipo de documento del receptor del CFE.
+                este campo es opcional en eTicket y obligatorio en eFactura
+                (asímismo en sus recpectivos NdeCr. y NdeDeb.)
+
+                Los valores pueden ser:
+
+                    0: No usado.
+                    2: RUC (Uruguay)
+                    3: C.I. (Uruguay)
+                    4: Otros
+                    5: Pasaporte (todos los países)
+                    6: DNI (documento de identidad de Argentina, Brasil, Chile o Paraguay).
+
+            DocumentoReceptor->Documento del receptor del CFE si es factura.
+
+            NombreReceptor->Nombre del cliente receptor del CFE si es factura.
+
+            DireccionReceptor->Direccion del cliente receptor del CFE si es factura.
+
+            CiudadReceptor-> Ciudad del cliente receptor del CFE si es factura.
+
+            Ejemplo de un tipo Cfe 112 (Nota de credito de una e-Factura), con serie Cfe AA y
+            numero Cfe 5, tipo de documento 2 (Ruc) y numero de RUC 215303240017, a nombre
+            de Objetos T &S cuya direccion es Bacigalupi 2158 en la ciudad de Montevideo.
+            L#1#5#164324#112#Nota de Crédito de e-Factura# AA# 0000005# 2# 215303240017#
+            Objetos T &S # Bacigalupi 2158# Montevideo
+
+            Ejemplo de un tipo de Cfe 101 (e-Ticket) con serie AA y numero 10.
+            L#1#5#181708#101#e-Ticket#AA#0000010#0####
+
+            IdentificadorLinea # NumeroDeLinea # TipoLinea # TimestampLinea # (no se usan)
+
+            TipoCFE #  DescripcionCFE # SerieCFE # NumeroCFE # TipoDocumentoReceptor
+               0             1             2           3                4
+            DocumentoReceptor # NombreReceptor # DireccionReceptor # CiudadReceptor
+                   5                  6                7                   8
+
+        """
+        lin = self.esta_linea or False
+
+        try:
+            result = {
+                        'tipocfe'               : lin[0],
+                        'descripcioncfe'        : lin[1],
+                        'seriecfe'              : lin[2],
+                        'numerocfe'             : lin[3],
+                        'tipodocumentoreceptor' : lin[4],
+                        'documentoreceptor'     : lin[5],
+                        'nombrereceptor'        : lin[6],
+                        'direccionreceptor'     : lin[7],
+                        'ciudadreceptor'        : lin[8]
+            }
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+        return result
+
+
+    def lt_6(self):
+
+        """
+            Línea de pie CFE (6) pie del documento electronico:
+
+            Cliente # LinkDGI # TipoCFE # RucEmisor # NumeroCFE # FechaCFE # MontoNeto # Hash # CodigoCAE # SerieCFE
+               0         1         2         3           4           5           6         7        8           9
+            NroInicioCAE # NroFinCAE # FechaVencimientoCAE
+                10            11                12
+
+            NombreCliente       -> Nombre del cliente de fidelización (no de CFE, puede venir vacio si no aplica).
+            LinkDGI             -> Link al portal DGI.
+            TipoCFE             -> Tipo de CFE.
+            RucEmisor           -> Ruc de quien emite el CFE.
+            NumeroCFE           -> Numero de CFE.
+            FechaCFE            -> Fecha de emision del CFE (AAAAMMDD).
+            MontoNeto           -> Monto neto del CFE.
+            Hash                -> Hash del CFE (los 6 primeros caracteres se utiliza como codigo de seguridad).
+            CodigoCAE           -> Codigo de CAE.
+            NroInicioCAE        -> Rango de inicio de la CAE.
+            NroFinCAE           -> Rango fin de la CAE.
+            FechaVencimientoCAE -> Fecha de vencimiento de la CAE(AAAAMMDDHHmmSS).
+
+            Ejemplo de un Cfe tipo 101 cuyo Ruc Emisor es 210297450018, numero de CFE 284, con fecha de emision del CFE 2015/11/11 con un monto neto de 699.00, el hash del CFE es aeSfsWawQz4h9d1XuHnxW24eLNQ= , el codigo de CAE 90115003001,serie de Cfe AC, numero de inicio de rango de CAE 1 y fin 10000 con fecha de vencimiento 2015/12/31/ 00:00:00
+
+            L#12#6#170634# #https://www.efactura.dgi.gub.uy/consultaQR/cfe?#101#210297450018#0000284#2015 1111#699.00#aeSfsWawQz4h9d1XuHnxW24eLNQ=#90115003001#AC#1#10000#20 151231000000
+
+        """
+
+        lin = self.esta_linea or False
+
+        try:
+            result = {
+                'cliente'             : lin[0],
+                'linkdgi'             : lin[1],
+                'tipocfe'             : lin[2],
+                'rucemisor'           : lin[3],
+                'numerocfe'           : lin[4],
+                'fechacfe'            : lin[5],
+                'montoneto'           : lin[6],
+                'hash'                : lin[7],
+                'codigocae'           : lin[8],
+                'seriecfe'            : lin[9],
+                'nroiniciocae'        : lin[10],
+                'nrofincae'           : lin[11],
+                'fechavencimientocae' : lin[12]
+            }
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns, ex)
+            logging.error(msg)
+            sys.exit(1)
+        return result
+
+
+    def lt_7(self):
+        """
+            Línea de identificación de la cajera (7).
+            ----------------------------------------
+
+            CodigoCajera # Nombre
+            0.Código
+            1.Nombre
+        """
+        lin = self.esta_linea or False
+
+        try:
+            result = { 'codigocajera': lin[0], 'nombrecajera': lin[1] }
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+        return result
+
+
+    def lt_9(self, *args):
+        """
+        Línea de pago de ticket en efectivo (9).
+        ---------------------------------------
+
+        CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+               0                1                 2
+
+        TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                    3                               4
+
+
+        TotalPagadoMonedaReferencia # Cambio # TipoOperacion # LineaUltimoPago #
+                    5                    6          7                8
+
+        AutorizaSupervisora # CodigoSupervisora # LineaCancelada
+                 9                    10                11
+
+        0. Código del medio de pago.
+        1. Código de la moneda.
+        2. Monto total de lo que se puede pagar con el medio de pago moneda.
+        3. Idem que el anterior pero expresado en la moneda de referencia.
+        4. Total entregado de ese medio de pago-moneda.
+        5. Total entregado expresado en la moneda de referencia.
+        6. Cambio de la línea de pago (valor >= 0.00)
+        7. Codigo de Operacion.
+                0 - Si corresponde a una venta (los importes van en positivo).
+                1 - Si corresponde a una devolución por parte del cliente (los
+                    importes van en negativo).
+        8. Ultimo pago.
+                0 - No es la línea del último pago. Esto sucede cuando el ticket
+                    se paga con múltiples pagos (inclusive de distintos medios
+                    de pago-monedas) cuando el importe abonado es menor al
+                    total a pagar.
+                1 - Es la línea del último pago.
+        9. Intervención supervisor.
+                0 - Línea de pago sin intervención de supervisor.
+                1 - Línea de pago autorizada por supervidor.
+       10. Código de la supervisora.
+       11. Estado de la línea de pago.
+            0-Línea de pago no cancelada.
+            1-Línea de pago cancelada.
+        """
+        lin = self.esta_linea or False
+
+        try:
+            result = {
+                'codigomediopago'                       : lin[0],
+                'codigomoneda'                          : lin[1],
+                'totalmediopagomoneda'                  : lin[2],
+                'totalmediopagomonedamonedareferencia'  : lin[3],
+                'totalpagado'                           : lin[4],
+                'totalpagadomonedareferencia'           : lin[5],
+                'cambio'                                : lin[6],
+                'tipooperacion'                         : lin[7],
+                'lineaultimopago'                       : lin[8],
+                'autorizasupervisora'                   : lin[9],
+                'codigosupervisora'                     : lin[10],
+                'lineacancelada'                        : lin[11],
+            }
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+        return result
+
+
+    def lt_10(self, *args):
+        ''' Cabezal de un combo '''
+        pass
+
+
+    def lt_11(self, *args):
+        '''Detalle de combo'''
+        pass
+
+
+    def lt_12(self, *args):
+        """
+            Línea de cancelación de ítem (12).
+            ----------------------------------
+
+            La línea de cancelación de un artículo se produce cuando se cancela
+            una línea registrada de venta de artículo.
+
+            CodigoArtSubf # NroLineaVta # Importe # IndicadorArtSubf # NombreSupervisora # CodigoVendedor
+                  0             1            2              3                 4                 5
+            CodigoArtSubf-> Código del artículo o subfamilia que se cancela.
+            NroLineaVta-> Número de línea de venta que se cancela.
+                          Esto sirve para indicar cuando hay mas de un artículo
+                          de mismo código en la venta y se cancelo uno en particular.
+                          Este numero de línea de venta no corresponde a NumeroDeLinea
+                          (segundo campo) que es el numero de línea de ticket,
+                          sino al numero de línea de venta de tipo 1 (es decir, el numero
+                          de línea de venta de tipo 1 del ticket), o sea hay que contar
+                          los tipos de línea de venta 1 para llegar a la línea de venta
+                          cancelada.
+            Importe-> Importe cancelado. Es a nivel informativo, ya que debe coincidir con
+                      el importe de la línea de venta.Incluye Iva.
+            IndicadorArtSubf-> A-Cancelación de artículo.
+                               S-Cancelación de Subfamilia.
+                               C-Cancelación de Cobranza.
+                               T-Cancelación de artículo de tandem.
+            NombreSupervisora-> Nombre de la supervisora que intervino en la cancelación
+                                (también a nivel informativo).
+            CodigoVendedor-> Código de vendedor si la caja está configurado para utilizar vendedor.
+                             Si no hay vendedor va vacío.
+
+            Ejemplo de una línea de venta del artículo 241800, de importe 11.20 que fue cancelada (1):
+            L#6#1#191524#241800#1.000#9.18#2.02#9.18#2.02#9.18#2.02#9.18#2.02#9.18#2.02#0#1#1######0
+            El artículo 241800 fue cancelado, corresponde a la primera línea de venta,
+            el importe cancelado es de 11,20 (que también coincide con el importe de
+            la línea de venta 9.18 + 2.02).
+            El código de vendedor es 12:
+            L#8#12#191524#241800#1#-11.20#A#Supervisora Uno#12
+            Ejemplo de cancelación de subfamilia 3 por 250 pesos, sin código de vendedor.
+            L#9#12#133552#3#1#-250.00#S#Supervisora Uno#
+            La línea de venta de subfamilia 3 (tipo 30) que fue cancelada es:
+            L#7#30#133552#3#1.000#204.92#45.08#204.92#45.08#204.92#45.08##1#0
+        """
+        lin = self.esta_linea or False
+
+        try:
+            result = {
+                    'codigoarticulosubf'     : lin[0],
+                    'nrolineavta'            : lin[1],
+                    'importe_cancelado'      : lin[2],
+                    'indicadorartsubf'       : lin[3],
+                    'nombresupervisora'      : lin[4],
+                    'codigovendedor'         : lin[5],
+            }
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+        return result
+
+
+    def lt_13(self, *args):
+        '''Descuento a un ítem'''
+        pass
+
+
+    def lt_15(self, *args):
+        '''Puntos generados de fidelización por el ítem'''
+        pass
+
+
+    def lt_16(self, *args):
+        '''Puntos totales de fidelización generados'''
+        pass
+
+
+    def lt_18(self, *args):
+        '''Regalo de artículos'''
+        pass
+
+
+    def lt_19(self, *args):
+        '''Cupón'''
+        pass
+
+
+    def lt_20(self, *args):
+        """
+            Línea de devolución de un ítem (20) -SM.
+            ---------------------------------------
+
+            CodigoArticuloSubf -> Código de artículo/subfamilia.
+
+            Cantidad -> Cantidad de ítems devueltos.
+
+            Precio -> Precio del ítem (en negativo).El precio no siempre puede coincidir con el de venta (si es que se
+            vendió, pues puedo devolver un artículo que no es parte de la venta), pues se puede imputar un precio
+            distinto al de lista (generalmente sucede cuando el artículo tuvo descuentos o estaba de oferta).
+
+            Iva -> Iva del ítem (en negativo).
+
+            IndicadorArtSubf ->   A-Devolución de artículo.
+                                  S-Devolución de subfamilia.
+            CodigoSupervisora -> Código de la supervisora.
+
+            CodigoArticuloOriginal -> Es el código original del artículo que ingresó la cajera, ya sea el código de
+            barras entero o el código digitado manualmente.
+
+            ModoIngreso ->  Modo de ingreso del artículo/subfamilia. Son los siguientes:
+                                                                       0-De teclado.
+                                                                       1-De scanner.
+                                                                       2-Lectora de banda magnética.
+
+            CodigoVendedor -> Código de vendedor si aplica, si no vacío.
+
+            LineaCancelada -> 0-Línea no cancelada.
+                              1-Línea cancelada. La devolución del item fue cancelada. No debe ser tomada en cuenta como
+                              valor contable.
+
+            CodigoArticuloSubf # Cantidad # Precio # Iva # IndicadorArtSubf # CodigoSupervisora
+                    0               1         2       3          4                   5
+            # CodigoArticuloOriginal # ModoIngreso # CodigoVendedor # LineaCancelada
+                       6                   7               8                9
+            PrecioDescuento # IvaDescuento # CodigoIva
+                   10              11           12
+
+            Ejemplo de la línea de venta del artículo 972197 por 235.30 pesos y 51.76 de iva.
+            L#7#1#154232#972197#1.000#235.30#51.76#235.30#51.76 #235.30#51.76 #235.30#51.76#235.30#51.76 #0#0#0######0#1
+
+            Devolución del mismo artículo, con código de vendedor 12:
+            L#9#20#154232#972197#1.000#-235.30#-51.76#A#1#972197#1#12#0#-235.30#-51.76#1
+
+
+        """
+
+        lin = self.esta_linea or False
+
+        try:
+            result = {
+                'codigoarticulosubf'        : lin[0],
+                'cantidad'                  : lin[1],
+                'precio'                    : lin[2],
+                'iva'                       : lin[3],
+                'indicadorartsubf'          : lin[4],
+                'codigosupervisora'         : lin[5] if lin[5] != '0' else '1001',  # bug de especificacion o del cstwiew o de que el cajero 10 - supervisores, no pide barra y pone '0' en el 'codigosupervisora'
+                'codigoarticulooriginal'    : lin[6],
+                'modoingreso'               : lin[7],
+                'codigovendedor'            : lin[8],
+                'lineacancelada'            : lin[9],
+                'preciodescuento'           : lin[10],
+                'ivadescuento'              : lin[11],
+                'codigoiva'                 : lin[12]
+                }
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+        return result
+
+
+    def lt_21(self, *args):
+        '''Entrada de cajera'''
+        pass
+
+
+    def lt_22(self, *args):
+        '''Salida de cajera'''
+        pass
+
+
+    def lt_23(self, *args):
+        '''Pausa de cajera'''
+        pass
+
+
+    def lt_24(self, *args):
+        '''Cancelacion ticket'''
+        lin = self.esta_linea or False
+
+        try:
+            result = {'texto': lin[0]}
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+        return result
+
+
+    def lt_26(self, *args):
+        '''Cabezal de beneficio al total'''
+        pass
+
+
+    def lt_27(self, *args):
+        '''Detalle de un beneficio al total'''
+        pass
+
+
+    def lt_28(self, *args):
+        '''Descuento al total'''
+        pass
+
+
+    def lt_29(self, *args):
+        '''Devolución de envases'''
+        pass
+
+
+    def lt_30(self, *args):
+
+        """
+            Línea de venta a la subfamilia (30).
+            -----------------------------------
+
+            Representa las líneas de tickets de venta por imputación a una subfamilia.
+
+            Código-> Código de la subfamilia.
+            Cantidad-> Cantidad imputada a la subfamilia.
+            Precio-> Precio imputado a la subfamilia.
+            Iva-> Iva del precio.
+            ImporteDescuento-> Importe de la línea a la cual se aplicó un descuento directo. Si esta es igual a Precio la línea no fue afectada por un descuento directo.
+            IvaDescuento-> Iva del descuento.
+            ImporteDescuentoTotal-> Importe de la línea la cual fue afectada por un descuento al total. Si bien es un descuento al total, se prorratea a las líneas. Si esta es igual a ImporteDescuento la línea no fue afectada por un descuento al total.
+            IvaImporteDescuentoTotal-> Iva del importe del descuento al total.
+            CodigoVendedor-> Código de vendedor si aplica, sino va vacío.
+            LineaCancelada-> 0-Línea no cancelada.
+                            1-Línea cancelada.
+                                Este tipo de línea no tiene valor contable.
+                                A pesar que pudo haber sido afectada por descuentos, esta no se debe tomar en cuenta.
+            ModoIngreso-> Modo de ingreso del artículo. Son los siguientes:
+                            0-De teclado.
+                            1-De scanner.
+                            2-Lectora de banda magnética.
+
+            Código # Cantidad # Precio # Iva # ImporteDescuento # IvaDescuento # ImporteDescuentoTotal # IvaImporteDescuentoTotal # CodigoVendedor # LineaCancelada # ModoIngreso
+               0         1        2       3           4                5                 6                          7                     8               9               10
+            Ejemplo de una venta a la subfamilia 3 con cantidad unitaria, por in importe de 18.85 + 4.15 = 23.00, el cual no tuvo ni descuentos directos ni al total, sin vendedor, la línea no está cancelada y se ingresó por teclado.
+            L#8#30#160219#3#1.000#18.85#4.15#18.85#4.15#18.85#4.15##0#0
+        """
+        lin = self.esta_linea or False
+
+        try:
+            result = {
+                 'codigo'                   : lin[0],
+                 'cantidad'                 : lin[1],
+                 'precio'                   : lin[2],
+                 'iva'                      : lin[3],
+                 'importedescuento'         : lin[4],
+                 'ivadescuento'             : lin[5],
+                 'importedescuentototal'    : lin[6],
+                 'ivaimportedescuentototal' : lin[7],
+                 'codigovendedor'           : lin[8],
+                 'lineacancelada'           : lin[9],
+                 'modoingreso'              : lin[10]
+                }
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+        return result
+
+
+    def lt_32(self, *args):
+        pass
+
+
+    def lt_33(self, *args):
+        pass
+
+
+    def lt_34(self, *args):
+        pass
+
+
+    def lt_35(self, *args):
+        pass
+
+
+    def lt_36(self, *args):
+        pass
+
+
+    def lt_37(self, *args):
+        """
+        Pago con tarjeta
+        ----------------
+
+
+         0. Código del medio de pago.
+         1. Código de la moneda.
+         2. Monto total de lo que se puede pagar con el medio de pago moneda.
+         3. Idem que el anterior pero expresado en la moneda de referencia.
+         4. Total entregado de ese medio de pago-moneda.
+         5. Total entregado expresado en la moneda de referencia.
+         6. Cambio de la línea de pago (valor >= 0.00)
+         7. Codigo de Operacion.
+                 0 - Si corresponde a una venta (los importes van en positivo).
+                 1 - Si corresponde a una devolución por parte del cliente (los
+                     importes van en negativo).
+         8. Ultimo pago.
+                 0 - No es la línea del último pago. Esto sucede cuando el ticket
+                     se paga con múltiples pagos (inclusive de distintos medios
+                     de pago-monedas) cuando el importe abonado es menor al
+                     total a pagar.
+                 1 - Es la línea del último pago.
+         9. Numero de la tarjeta.
+        10. Cuotas.
+        11. Nro. de autorización del emisor.
+        12. Tipo de tarjeta - undocumented.
+        13. Intervención supervisor.
+                  0 - Línea de pago sin intervención de supervisor.
+                  1 - Línea de pago autorizada por supervidor.
+        15. Código de la supervisora.
+        15. Estado de la línea de pago.
+             0-Línea de pago no cancelada.
+             1-Línea de pago cancelada.
+        16. Plan utilizado por la tarjeta.
+        17. Numero de comercio al que pertenece el socio titular de la tarjeta.
+        18. Si aplica ley descuento iva
+        19. Monto Descuento Ley Iva
+        20. Texto Ley
+        21. Tarjeta de Debito/Credito.
+                 0 - No especificado.
+                 1 - La tarjeta es de credito.
+                 2 - La tarjeta es de debito.
+
+        CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+               0              1                   2
+
+        TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                        3                           4
+
+        TotalPagadoMonedaReferencia # Cambio # TipoOperacion # LineaUltimoPago #
+               5                         6           7             8
+
+        NumeroTarjetaCredito # CuotasTarjetaCredito #
+            9                   10
+
+        NumeroAutorizacionTarjetaCredito # TipoTarjetaCredito # AutorizaSupervisora  #
+                  11                              12                  13
+
+        CodigoSupervisora # LineaCancelada # Plan # NroComercio #
+                14                  15        16       17
+
+        SiAplicaLeyDescIva # MontoDescuentoLeyIva # # TextoLey # SiEsDebitoCredito
+              18                      19                  20            21
+
+
+        """
+        lin = self.esta_linea or False
+
+        try:
+            result = {
+                    'codigomediopago'                      : lin[0],
+                    'codigomoneda'                         : lin[1],
+                    'totalmediopagomoneda'                 : lin[2],
+                    'totalmediopagomonedamonedareferencia' : lin[3],
+                    'totalpagado'                          : lin[4],
+                    'totalpagadomonedareferencia'          : lin[5],
+                    'cambio'                               : lin[6],
+                    'tipooperacion'                        : lin[7],
+                    'lineaultimopago'                      : lin[8],
+                    'numerotarjetacredito'                 : lin[9],
+                    'cuotastarjetacredito'                 : lin[10],
+                    'numeroautorizaciontarjetacredito'     : lin[11],
+                    'tipotarjetacredito'                   : lin[12],
+                    'autorizasupervisora '                 : lin[13],
+                    'codigosupervisora'                    : lin[14],
+                    'lineacancelada'                       : lin[15],
+                    'plan'                                 : lin[16],
+                    'nrocomercio'                          : lin[17],
+                    'siaplicaleydesciva'                   : lin[18],
+                    'montodescuentoleyiva'                 : lin[19],
+                    'textoley'                             : lin[20],
+                    'siesdebitocredito'                    : lin[21]
+            }
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+        return result
+
+
+    def lt_38(self, *args):
+        """
+            Línea de pago con cheque (38)-SM.
+            --------------------------------
+
+            Línea de ticket cuando se paga con cheque. Cuando un cliente paga
+            con cheques, el mismo debe estar autorizado con un identificador
+            (campo idCliente).
+
+            0. Código del medio de pago.
+            1. Código de la moneda.
+            2. Monto total de lo que se puede pagar con el medio de pago moneda.
+            3. Idem que el anterior pero expresado en la moneda de referencia.
+            4. Total entregado de ese medio de pago-moneda.
+
+            5. Total entregado de ese medio de pago-moneda.
+            6. Total entregado expresado en la moneda de referencia.
+
+            7. Cambio de la línea de pago
+                    0 - Venta (valor >= 0.00 )
+                    1 - Devolución por parte del cliente (valor < 0.00 )
+
+            8. Lin. Ultimo Pago
+                    0 - No es la línea del último pago. Esto sucede cuando el
+                        ticket se paga con múltiples pagos (inclusive de
+                        distintos medios de pago-monedas) cuando el importe
+                        abonado es menor al total a pagar.
+                    1 - Es la línea del último pago.
+
+            9. Tipo de Cliente.
+           10. Identificación cliente.
+           11. Supervisora
+                       0 - La línea de pago no tuvo autorización de la
+                           supervisora.
+                       1 - La línea de pago tuvo autorización de la supervisora.
+
+           12. Código de la supervisora (vacío si no aplica)
+           13. Linea cancelada
+                       0 - Línea de pago no cancelada.
+                       1 - Línea de pago cancelada.
+
+            Indices:
+            -------
+
+            CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+                  0                 1                2
+
+            TotalMedioPagoMonedaMonedaReferencia #  TotalPagado #
+                             3                               4
+
+            TotalPagadoMonedaReferencia # Cambio # TipoOperacion #
+                        5                   6           7
+
+            LineaUltimoPago # TipoCliente # IdCliente # AutorizaSupervisora #
+                    8               9           10          11
+
+            CodigoSupervisora # LineaCancelada
+                  12                  13
+
+        """
+        lin = self.esta_linea or False
+
+        try:
+            result = {
+                        'codigomediopago'                       : lin[0],
+                        'codigomoneda'                          : lin[1],
+                        'totalmediopagomoneda'                  : lin[2],
+                        'totalmediopagomonedamonedareferencia'  : lin[3],
+                        'totalpagado'                           : lin[4],
+                        'totalpagadomonedareferencia'           : lin[5],
+                        'cambio'                                : lin[6],
+                        'tipooperacion'                         : lin[7],
+                        'lineaultimopago'                       : lin[8],
+                        'tipocliente'                           : lin[9],
+                        'idcliente'                             : lin[10],
+                        'autorizasupervisora'                   : lin[11],
+                        'codigosupervisora'                     : lin[12],
+                        'lineacancelada'                        : lin[13]
+            }
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+
+        return result
+
+
+    def lt_40(self):
+        """
+
+         Línea de pago luncheon ticket (40) SM.
+         -------------------------------------
+
+         0 Código del medio de pago.
+         1 Código de la moneda.
+         2 Monto total de lo que se puede pagar con el medio de pago moneda.
+         3 Idem que el anterior pero expresado en la moneda de referencia.
+         4 Total entregado de ese medio de pago-moneda.
+         5 Total entregado expresado en la moneda de referencia.
+         6 Cambio de la línea de pago (valor >= 0.00 5).
+         7 TipoOperacion.
+             0 - Venta ( importes > 0.00).
+             1 - Devolución ( importes < 0.00).
+         8 LineaUltimoPago.
+             0 - No es la línea del último pago. Esto sucede cuando el ticket
+                 se paga con múltiples pagos (inclusive de distintos medios de
+                 pago-monedas) cuando el importe abonado es menor al total a pagar.
+             1 - Es la línea del último pago.
+         9 CodigoBarra.
+             1 - código de barras del cupón.
+             0 - monto total de los cupones o el codigo de barras ingresado
+                 manualmente de ese cupon.
+        10 ModoIngresoCupon.
+             0 - Teclado.Este modo de ingreso se efectua cuando la cajera
+                 ingresa el monto del total de los cupones o el codigo de
+                 barras de ese cupon.
+             1 - Scanner.Cuando se procesan los cupones por scanner, validando
+                 los mismos.
+        11 AutorizaSupervisora.
+             0 - La línea de pago no tuvo autorización de la supervisora.
+             1 - La línea de pago tuvo autorización de la supervisora.
+        12 CodigoSupervisora.
+        13 Código de la supervisora (vacío si no aplica)
+        14 LineaCancelada.
+             0 - activa.
+             1 - cancelada.
+
+
+        Indices:
+        -------
+
+        CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+             0                  1                 2
+
+        TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                        2                           4
+
+        TotalPagadoMonedaReferencia # Cambio # TipoOperacion #
+                    5                   6           7
+
+        LineaUltimoPago# CodigoBarra # ModoIngresoCupon # AutorizaSupervisora #
+                8           9               10                  11
+
+        CodigoSupervisora # LineaCancelada
+            12                  13
+        """
+
+        lin = self.esta_linea or False
+
+        try:
+            result = {
+                        'codigomediopago'                       : lin[0],
+                        'codigomoneda'                          : lin[1],
+                        'totalmediopagomoneda'                  : lin[2],
+                        'totalmediopagomonedamonedareferencia'  : lin[3],
+                        'totalpagado'                           : lin[4],
+                        'totalpagadomonedareferencia'           : lin[5],
+                        'cambio'                                : lin[6],
+                        'tipooperacion'                         : lin[7],
+                        'lineaultimopago'                       : lin[8],
+                        'codigobarra'                           : lin[9],
+                        'modoingresocuponid'                    : lin[10],
+                        'autorizasupervisora'                   : lin[11],
+                        'codigosupervisora'                     : lin[12],
+                        'lineacancelada'                        : lin[13]
+            }
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+
+        return result
+
+
+    def lt_43(self):
+
+        """
+            Línea de voucher de la tarjeta (43)-SM.
+            Muestran la información de un Voucher de Pago cuando se paga con Tarjeta de Crédito/Debito.
+            La mayoría de la información aquí presentada la retorna el autorizador y Jswitch
+            (Referirse al documento Especificaciones jSwitch.doc por posibles cambios).
+
+            IdentificadorLinea* # NumeroDeLinea* # TipoLinea* # TimestampLinea* # NombreEmisorTarjeta #
+            NumeroTarjeta # Vencimiento # Comprobante # Autorizacion # Plan # CantidadCuotas          #
+            CodigoTerminal # CodigoComercio # TipoAutorizacion # NroLote # CodigoMoneda               #
+            TipoTransaccion # TipoVoucher # ImportePago # FechaTransacccion # CodigoCaja*             #
+            CodigoCajera* # NombrePropietario # TipoIngreso # DescuentaIvaRestaurante                 #
+            SiEsDebitoCredito # CardType # SaldoGift # TipoTarjetaCredito2 # DescuentoAfam            #
+            SiAplicaLeyDescIva # MontoDescuentoLeyIva # MontoTicket # MontoGravado                    #
+            FlagImprimeFirma
+
+            *Datos que no provienen de la autorizadora.
+
+            NombreEmisorTarjeta         -> Nombre emisor de la tarjeta.
+            NumeroTarjeta               -> Número de la tarjeta de crédito.
+            Vencimiento                 -> Vencimiento de la tarjeta de crédito (aamm).
+            Comprobante                 -> Número de comprobante.
+            Autorizacion                -> Número de autorización.
+            Plan                        -> Código de plan asociado.
+            CantidadCuotas              -> Cantidad de cuotas.
+            CodigoTerminal              -> Código de la terminal asociado.
+            CodigoComercio              -> Código de comercio asociado.
+            TipoAutorizacion            -> Tipos : 00-Online;
+                                                   01-Offline;
+                                                   20-Online aplica ley descuento IVA;
+            NroLote                     -> Número de lote asociado.
+            CodigoMoneda                -> Código de la moneda asociado.
+                                                   00-Pesos
+                                                   01-Dólares.
+            TipoTransaccion             -> Tipo de transacción asociado (MTI).
+                                                   1200 - Compra
+                                                   1220 - Confirmación Compra
+                                                   1240 - Notificación de Compra
+                                                   1400 - Devolución (Total o parcial)
+                                                   1420 - Confirmación Devolución
+                                                   1440 - Notificación de Devolución
+                                                   9xxx - Entrenamiento
+            TipoVoucher                 -> Tipo de voucher asociado.
+                                                   0-Original Cliente.
+                                                   1-Vía Establecimiento.
+            ImportePago                 -> Importe pagado por la tarjeta de crédito.
+            FechaTransacccion           -> Fecha de transacción de la autorización.
+            CodigoCaja*                 -> Código de la caja.
+            CodigoCajera*               -> Código de la cajera.
+            NombrePropietario           -> Nombre del propietario de la tarjeta de crédito.
+            TipoIngreso                 -> Tipo de ingreso asociado.
+                                                   0-Lectura magnética.
+                                                   1-Entrada manual
+                                                   2-Internet.
+            DescuentaIvaRestaurante     -> Descuento restaurante
+                                                   0 - No tiene descuento iva por ley 17934.
+                                                   1 - Tiene descuento iva por ley 17934.
+            SiEsDebitoCredito           -> Tipo de la tarjeta de crédito:
+                                                   0-Nada.
+                                                   1-Crédito.
+                                                   2-Débito.
+            CardType                    -> Card Type retornado por el autorizador.
+            SaldoGift                   -> Saldo de la tarjeta Gift (vacio si no es tarjeta gift).
+            TipoTarjetaCredito2         -> Tipo de tarjeta de credito (redundante con TipoTarjetaCredito)
+                                                   1-Crédito
+                                                   2-Débito.
+                                                   3-Gift
+            4-Afam
+            DescuentoAfam               -> Importe del descuento aplicado si la tarjeta es Afam (0.00 si no aplica).
+            SiAplicaLeyDescIva          -> Flag que indica si se aplica la ley 19210 de inclusión financiera de descuento de iva.
+                                                   0 - No aplica ley de descuento de iva.
+                                                   1 - Aplica ley de descuento de iva.
+            MontoDescuentoLeyIva        -> Monto del descuento de Iva (en negativo).
+            MontoTicket                 -> Monto del ticket.
+            MontoGravado                -> Monto gravado sin Iva del ticket.
+            FlagImprimeFirma            ->         0 - No se solicita la firma.
+                                                   1 - Se solicita la firma.
+        """
+        lin = self.esta_linea or False
+
+        try:
+            result = {
+                        'nombreemisortarjeta'       : lin[0],
+                        'numerotarjeta'             : lin[1],
+                        'vencimiento'               : lin[2],
+                        'comprobante'               : lin[3],
+                        'autorizacion'              : lin[4],
+                        'plan'                      : lin[5],
+                        'cantidadcuotas'            : lin[6],
+                        'codigoterminal'            : lin[7],
+                        'codigocomercio'            : lin[8],
+                        'tipoautorizacion'          : lin[9],
+                        'nrolote'                   : lin[10],
+                        'codigomoneda'              : lin[11],
+                        'tipotransaccion'           : lin[12],
+                        'tipovoucher'               : lin[13],
+                        'importepago'               : lin[14],
+                        'fechatransacccion'         : lin[15],
+                        'codigocaja'                : lin[16],
+                        'codigocajera'              : lin[17],
+                        'nombrepropietario'         : lin[18],
+                        'tipoingreso'               : lin[19],
+                        'descuentaivarestaurante'   : lin[20],
+                        'siesdebitocredito'         : lin[21],
+                        'cardtype'                  : lin[22],
+                        'saldogift'                 : lin[23],
+                        'tipotarjetacredito2'       : lin[24],
+                        'descuentoafam'             : lin[25],
+                        'siaplicaleydesciva'        : lin[26],
+                        'montodescuentoleyiva'      : lin[27],
+
+                        'montoticket'               : lin[28],
+                        'montogravado'              : lin[29],
+                        'flagimprimefirma'          : lin[30]
+            }
+
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+
+        return result
+
+
+    def lt_44(self, *args):
+        pass
+
+
+    def lt_47(self, *args):
+        """
+        Línea de pago de servicio (47) -cuenta corriente-
+
+        Representa las líneas de los pagos de servicios .
+        Código         -> Código del pago de servicio
+        Monto          -> Importe del pago de servicio.
+        Moneda         -> Código de moneda.
+        ModoIngreso    -> 0-Teclado. 1-Scanner. 2-Banda magnética.
+        CodigoVendedor -> Código de vendedor si la caja está configurado para utilizar vendedor.Si no hay vendedor va vacío.
+        Referencia     -> Referencia del pago de servicio.Esta se compone de dos partes,los primeros 10 dígitos corresponde al número de factura, los siguientes 10 dígitos al número de cuenta.Puede venir vacio.
+        LineaCancelada -> 0 - Línea de pago no cancelada. 1 - Línea de pago cancelada. No tiene valor contable.
+
+        C#1#4#1294#131#20151218113128#F#0#15603.00#20#12
+        L#1#5#113128#
+        L#3#7#113128#131#SHIRLEY BRAVO
+        L#4#53#113128#TICKET DE VENTA#0
+        L#5#57#113128#20##0###
+        L#6#47#113128#1#15602.83#1#0###0
+        L#7#68#113143#4580#ROIG ELBIO##JUAN M.GUTIERREZ 1643 -21490###1#0
+        L#8#4#113229#15602.83#0.00#0.00#0.00
+        L#9#63#113229#15602.83#0.17#15603.00#1#1
+        L#10#9#113229#1#1#15603.00#15603.00#15603.00#15603.00#0.00#0#1#0##0
+
+        ticket = {
+            ('C', '1', '4', '1294', '131', '20151218113128', 'F', '0', '15603.00', '20', '12') :
+                ['L', '1', '5', '113128', ''],
+                ['L', '3', '7', '113128', '131', 'SHIRLEY BRAVO'],
+                ['L', '4', '53', '113128', 'TICKET DE VENTA', '0'],
+                ['L', '5', '57', '113128', '20', '', '0', '', '', ''], """
+        _lin_ = ['L', '6', '47', '113128', '1', '15602.83', '1', '0', '', '', '0']
+        """,    ['L', '7', '68', '113143', '4580', 'ROIG ELBIO', '', 'JUAN M.GUTIERREZ 1643 -21490', '', '', '1', '0'],
+                ['L', '8', '4', '113229', '15602.83', '0.00', '0.00', '0.00'],
+                ['L', '9', '63', '113229', '15602.83', '0.17', '15603.00', '1', '1'],
+                ['L', '10', '9', '113229', '1', '1', '15603.00', '15603.00', '15603.00', '15603.00', '0.00', '0', '1', '0', '', '0']
+        }
+
+            Código # Monto # Moneda # ModoIngreso # CodigoVendedor # Referencia # LineaCancelada
+               0       1       2          3               4              5              6
+        """
+
+        lin = self.esta_linea or False
+
+        try:
+            result = {
+                               'codserviciopagado'        : lin[0], # '1' = cta.cte
+                               'importecobranza'          : lin[1],
+                               'codigomoneda'             : lin[2],
+                               'modoingreso'              : lin[3],
+                               'codigovendedor'           : lin[4],
+                               'referencia'               : lin[5],
+                               'lineacancelada'           : lin[6]
+                }
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+
+        return result
+
+
+    def lt_49(self, *args):
+        pass
+
+
+    def lt_52(self, *args):
+        """
+            Línea de pago de caja (52).
+            Representa la linea de pago de caja (similar a un retiro pero se
+            utiliza para pagos puntuales como pago a proveedores, taxis, etc.).
+
+
+            IdentificadorLinea # NumeroDeLinea # TipoLinea # TimestampLinea # Codigo # Importe
+            Codigo->Código del rubro de pago de caja.
+            Importe->Importe del pago de caja.
+            Ejemplo de un pago de caja con codigo 1 y monto de 150.00 pesos
+        """
+        pass
+
+
+    def lt_53(self):
+        """
+            Línea tipo de ticket (53)-SM.
+            '''''''''''''''''''''''''''''
+
+            Representa la línea del `tipo de ticket` (venta, devolucion, etc.)
+            y si se trata de un ticket normal o excento de iva.
+
+            DescripcionTipoTicket Descripcion del tipo de ticket.
+            TipoVenta             1 - El ticket esta excento de iva.
+                                  0 - Ticket normal.
+            Indices:
+            ''''''''
+
+            DescripcionTipoTicket # TipoVenta
+                    0                   1
+
+            Por ahora, este último campo sirve para los tickets de venta y
+            devolución.
+        """
+
+        lin = self.esta_linea or False
+
+        try:
+            result = {
+                        'descripciontipoticket': lin[0],
+                        'tipoventa'            : lin[1]
+                }
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+
+        return result
+
+
+    def lt_55(self, *args):
+
+        """Intervensión Supervidora"""
+
+        lin = self.esta_linea or False
+
+        try:
+            result = {'codigosuper': lin[0],
+                      'nombresuper': lin[1]}
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+
+        return result
+
+
+    def lt_56(self, *args):
+        pass
+
+
+    def lt_57(self):
+        """
+            Línea de tipo de cliente (57)-SM
+            --------------------------------
+
+            Representa el detalle del tipo de cliente en la venta.
+
+            0 Nombre del cliente (vacio si no aplica).
+            1 Número del cliente interno (vacio si no aplica).
+            2 Tipo de cliente interno.
+                0-Productor
+                1-Empleado
+                Vacio-General.
+
+            Indices:
+            --------
+
+            Tipo # NumeroTarjeta # ModoIngreso # Nombre # Numero #
+              0         1               2           3       4
+
+            TipoClienteInterno
+                   5
+
+        """
+        lin = self.esta_linea or False
+
+        try:
+            result = {
+                        'tipo'                : lin[0],
+                        'numerotarjeta'       : lin[1],
+                        'modoingreso'         : lin[2],
+                        'nombre'              : lin[3],
+                        'numero'              : lin[4],
+                        'tipoclienteinterno'  : lin[5]
+                }
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+
+        return result
+
+
+    def lt_58(self, *args):
+        pass
+
+
+    def lt_60(self, *args):
+        pass
+
+
+    def lt_61(self, *args):
+        pass
+
+
+    def lt_62(self, *args):
+        pass
+
+
+    def lt_63(self, *args):
+        """
+
+            Línea de redondeo del ticket.
+            ----------------------------
+
+            # ImporteTicket # ImporteRedondeo # ImporteTotalTicket # CodigoMedioPago # CodigoMoneda
+                    0                1                  2                  3                 4
+            ImporteTicket->Importe del total del ticket sin redondeo.
+
+            ImporteRedondeo->Importe del redondeo aplicado.
+
+            ImporteTotalTicket->Importe total del ticket que es ImporteTicket + ImporteRedondeo.
+
+            CodigoMedioPago->Codigo del medio de pago.
+
+            CodigoMoneda->Codigo de la moneda.
+
+            Ejemplo de una línea de redondeo con un importe de ticket de 42.90, al cual se le aplicó
+            un redondeo de 0.10 para obtener un importe total a abonar de 43.00 efectivo-pesos
+            L#9#63#164146#42.90#0.10#43.00#1#1   """
+
+        lin = self.esta_linea or False
+
+        try:
+            result = {
+                        'importeticket'      : lin[0],
+                        'importeredondeo'    : lin[1],
+                        'importetotalticket' : lin[2],
+                        'codigomediopago'    : lin[3],
+                        'codigomoneda'       : lin[4],
+            }
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+
+        return result
+
+
+    def lt_65(self, *args):
+        pass
+
+
+    def lt_67(self, *args):
+        pass
+
+
+    def lt_68(self, *args):
+        """
+        Línea de entrega a domicilio (68).
+        Representa la línea de entrega a domicilio (delivery) con los datos del cliente.
+
+        (La usamos para obtener los datos [nombre y número de cuenta] de una cobranza de cta.cte.)
+
+        IdentificadorLinea # NumeroDeLinea # TipoLinea # TimestampLinea # Código # Nombre # Telefono # Direccion # Esquina1 # Esquina2 # Gratis # LineaCancelada
+        Código->Código del cliente.
+        Nombre->Nombre del cliente.
+        Telefono->Telefono del cliente.
+        Direccion->Direccion del cliente.
+        Esquina1->Primera esquina donde se encuentra el cliente.
+        Esquina2->Segunda esquina donde se encuentra el cliente.
+        Gratis-> Según el monto de venta, se cobra el delivery o no y se indica de la siguiente forma:
+        1-El delivery es gratis.
+        0-El delivery se cobra.
+        LineaCancelada->0-Línea no cancelada.
+        1-Línea cancelada. Este tipo de línea no tiene valor contable.
+
+        C#1#4#1294#131#20151218113128#F#0#15603.00#20#12
+        L#1#5#113128#
+        L#3#7#113128#131#SHIRLEY BRAVO
+        L#4#53#113128#TICKET DE VENTA#0
+        L#5#57#113128#20##0###
+        L#6#47#113128#1#15602.83#1#0###0
+        L#7#68#113143#4580#ROIG ELBIO##JUAN M.GUTIERREZ 1643 -21490###1#0
+        L#8#4#113229#15602.83#0.00#0.00#0.00
+        L#9#63#113229#15602.83#0.17#15603.00#1#1
+        L#10#9#113229#1#1#15603.00#15603.00#15603.00#15603.00#0.00#0#1#0##0
+
+        ticket = {
+            ('C', '1', '4', '1294', '131', '20151218113128', 'F', '0', '15603.00', '20', '12') :
+                ['L', '1', '5', '113128', ''],
+                ['L', '3', '7', '113128', '131', 'SHIRLEY BRAVO'],
+                ['L', '4', '53', '113128', 'TICKET DE VENTA', '0'],
+                ['L', '5', '57', '113128', '20', '', '0', '', '', ''],
+                ['L', '6', '47', '113128', '1', '15602.83', '1', '0', '', '', '0'],"""
+
+        _lin_ = ['L', '7', '68', '113143', '4580', 'ROIG ELBIO', '', 'JUAN M.GUTIERREZ 1643 -21490', '', '', '1', '0']
+
+        """     ['L', '8', '4', '113229', '15602.83', '0.00', '0.00', '0.00'],
+                ['L', '9', '63', '113229', '15602.83', '0.17', '15603.00', '1', '1'],
+                ['L', '10', '9', '113229', '1', '1', '15603.00', '15603.00', '15603.00', '15603.00', '0.00', '0', '1', '0', '', '0']
+            }
+
+            Código # Nombre # Telefono # Direccion # Esquina1 # Esquina2 # Gratis # LineaCancelada
+               0       1          2          3           4          5         6           7
+        """
+
+        lin = self.esta_linea or False
+
+        try:
+            result = {
+                        'codigocliente'                         : lin[0],
+                        'nombrecliente'                         : lin[1],
+                        'telefonocliente'                       : lin[2],
+                        'direccioncliente'                      : lin[3],
+                        'Esquina1'                              : lin[4],
+                        'Esquina2'                              : lin[5],
+                        'enviogratis'                           : lin[6],
+                        'lineacancelada'                        : lin[7]
+            }
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+
+        return result
+
+
+    def lt_71(self, *args):
+        pass
+
+
+    def lt_72(self, *args):
+        pass
+
+
+    def lt_73(self, *args):
+        """
+            QUIEN DIJO QUE LAS FEAS NO BAILAN, ¿¿ eh ??
+            ===========================================
+
+            Línea de ticket Z (73)
+            Subtipos de líneas que son:
+            Contiene informacion de cabecera de la Z (por lo tanto solamente debe haber solo un sub tipo de línea 1 en el informe Z).
+
+            SubTipo # CodigoCaja # NumeroZ # TotalVenta # TotalPagoServicios # TotalVentaGeneral # GranTotal # CantidadPagoCajas # ImportePagoCajas # ImporteRedondeo
+
+            1) Sub tipo línea Z. (obligatoria, es el cabezal del tipo de línea de detalle Z
+
+                SubTipo -> Sub tipo de línea que es 1.
+                CodigoCaja -> Codigo de la caja.
+                NumeroZ  -> Número emitido de la Z en la caja.
+                TotalVenta -> Total de venta de la caja de mercaderia (incluye ivas pero no los pago de servicios).
+                TotalPagoServicios -> Total de pago de servicios.
+                TotalVentaGeneral -> Total de venta de la caja mas el total de venta de los pagos de servicios (TotalVenta + TotalPagoServicios).
+                GranTotal -> Gran total de la caja en el momento de la emision de la Z.
+                CantidadPagoCajas -> Cantidad de pagos de la caja.
+                ImportePagoCajas -> Importe de pagos de la caja.
+                ImporteRedondeo -> Importe (saldo) del redondeo acumulado en la sesion de la caja.
+
+                Ejemplo de sub tipo de línea 1 de la caja 1, con numero de Z 954, con un total de venta de 1696.80, un total de pago de servicios de 153.00 pesos, un total de venta general de 1849.80 , un gran total de 20125014.50 pesos, se hicieron 2 pagos de caja por un monto de 750.00 pesos y el acumulado de redondeo es 2.00 pesos.
+                    L#1#105#185528#1#1#954#1696.80#153.00#1849.80#20125014.50 # 2 # 750.00 # 2.00
+
+
+            2) Sub tipo línea Iva.
+
+                Representa el subtipo de línea de iva del informe Z.
+                Pueden existir varias líneas de este subtipo, una por cada codigo de iva aplicado en la sesion de venta de la caja.
+                    SubTipo # CodigoCaja # NumeroZ # CodigoIva # VentaBrutaIva # VentaNetaIva # VentaIva
+                SubTipo -> Sub tipo de línea que es 2.
+                CodigoCaja -> Codigo de la caja.
+                NumeroZ  -> Número emitido de la Z en la caja.
+                CodigoIva -> Codigo de Iva.
+                VentaBrutaIva -> Es el total de la venta afectado por ese codigo de iva incluyendo al propio iva (VentaNetaIva + VentaIva).
+                VentaNetaIva -> Es el total de la venta afectado por ese codigo de iva sin incluir al propio iva (VentaBrutaIva – VentaIva).
+                VentaIva -> Importe solo de iva.
+
+                Ejemplo de subtipo de línea 2 de la caja 1, con numero de Z 954 , para el codigo de iva 1, con un total de venta bruta de 1696.80 pesos, 1390.82 de venta neta de iva y 305.98 de venta de iva.
+                    L#2#105#185528#2#1#954#1#1696.80#1390.82#305.98
+                Idem para el codigo de iva 2.
+                    L#3#105#185528#2#1#954#2#2568.90#2335.36#233.54
+
+            3) Sub tipo línea medios de pago-monedas.
+
+                Representa el subtipo de línea de los totales de los medios de pago-monedas (para la venta, para el fondo de caja y retiro) del informe Z. Pueden existir varias líneas de este subtipo, una por cada medio de pago-moneda en la sesion de venta de la caja.
+                SubTipo # CodigoCaja # NumeroZ # CodigoMedioPago # CodigoMoneda # ImporteVenta # ImporteFondo # ImporteRetiro
+                SubTipo -> Sub tipo de línea que es 3.
+                CodigoCaja -> Codigo de la caja.
+                NumeroZ  -> Número emitido de la Z en la caja.
+                CodigoMedioPago -> Código del medio de pago.
+                CodigoMoneda -> Código de la moneda
+                ImporteVenta -> Importe de la venta del medio de pago-moneda.
+                ImporteFondo -> Importe de fondeo para ese medio de pago-moneda.
+                ImporteRetiro -> Importe de retiro para ese medio de pago-moneda.
+
+                Ejemplo del subtipo 3, de la caja 1 para el número de Z 954, del medio de pago 1 y moneda 1, con un total acumulado de 1249.80 en ventas, se hizo un fondeo de 98.00 y un retiro de 47.00.
+                    L#5#105#185528#3#1#954#1#1#1249.80#98.00#47.00
+                Igual que el anterior para el codigo medio de pago 1 moneda 2, que tiene un fondo solamente de 12750.00.
+                    L#4#105#185528#3#1#954#1#2#0.00#12750.00#0.00
+
+            4) Sub tipo línea de pago de servicios.
+
+                Representa el subtipo de línea de los pagos de servicio del informe Z.
+                Pueden existir varias líneas de este subtipo, una por cada pago de servicio en la sesion de la caja.
+                SubTipo # CodigoCaja # NumeroZ # CodigoPagoServicio # CantidadPagos # ImportePagoServicios
+                SubTipo -> Sub tipo de línea que es 4.
+                CodigoCaja -> Codigo de la caja.
+                NumeroZ  -> Número emitido de la Z en la caja.
+                CodigoPagoServicio -> Código del pago de servicio.
+                CantidadPagos -> Cantidad de pagos de servicios
+            """
+
+        # eehh, no bailan, no.
+        pass
+
+
+    def lt_76(self, *args):
+        pass
+
+
+    def lt_77(self, *args):
+        pass
+
+
+    def lt_78(self, *args):
+        pass
+
+
+    def lt_81(self, *args):
+        pass
+
+
+    def lt_82(self, *args):
+        pass
+
+
+    def lt_83(self, *args):
+        pass
+
+
+    def lt_84(self, *args):
+        pass
+
+
+    def lt_85(self, *args):
+        pass
+
+
+    def lt_86(self, *args):
+        pass
+
+
+    def lt_87(self, *args):
+        pass
+
+
+    def lt_88(self, *args):
+        pass
+
+
+    def lt_89(self, *args):
+        pass
+
+
+    def lt_90(self):
+        """
+        Línea de pago ticket TAlimentos (90) SM.
+        ---------------------------------------
+
+         0 Código del medio de pago.
+         1 Código de la moneda.
+         2 Monto total de lo que se puede pagar con el medio de pago moneda.
+         3 Idem que el anterior pero expresado en la moneda de referencia.
+         4 Total entregado de ese medio de pago-moneda.
+         5 Total entregado expresado en la moneda de referencia.
+         6 Cambio de la línea de pago (valor >= 0.00 5).
+         7 TipoOperacion.
+             0 - Venta ( importes > 0.00).
+             1 - Devolución ( importes < 0.00).
+         8 LineaUltimoPago.
+             0 - No es la línea del último pago. Esto sucede cuando el ticket
+                 se paga con múltiples pagos (inclusive de distintos medios de
+                 pago-monedas) cuando el importe abonado es menor al total a pagar.
+             1 - Es la línea del último pago.
+         9 CodigoBarra.
+             1 - código de barras del cupón.
+             0 - monto total de los cupones o el codigo de barras ingresado
+                 manualmente de ese cupon.
+        10 ModoIngresoCupon.
+             0 - Teclado.Este modo de ingreso se efectua cuando la cajera
+                 ingresa el monto del total de los cupones o el codigo de
+                 barras de ese cupon.
+             1 - Scanner.Cuando se procesan los cupones por scanner, validando
+                 los mismos.
+        11 AutorizaSupervisora.
+             0 - La línea de pago no tuvo autorización de la supervisora.
+             1 - La línea de pago tuvo autorización de la supervisora.
+        12 CodigoSupervisora.
+        13 Código de la supervisora (vacío si no aplica)
+        14 LineaCancelada.
+             0 - activa.
+             1 - cancelada.
+
+
+        Indices:
+        -------
+
+        CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+             0                  1                 2
+
+        TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                        2                           4
+
+        TotalPagadoMonedaReferencia # Cambio # TipoOperacion #
+                    5                   6           7
+
+        LineaUltimoPago# CodigoBarra # ModoIngresoCupon # AutorizaSupervisora #
+                8           9               10                  11
+
+        CodigoSupervisora # LineaCancelada
+            12                  13
+        """
+
+        lin = self.esta_linea or False
+
+        try:
+            result = {
+                        'codigomediopago'                       : lin[0],
+                        'codigomoneda'                          : lin[1],
+                        'totalmediopagomoneda'                  : lin[2],
+                        'totalmediopagomonedamonedareferencia'  : lin[3],
+                        'totalpagado'                           : lin[4],
+                        'totalpagadomonedareferencia'           : lin[5],
+                        'cambio'                                : lin[6],
+                        'tipooperacion'                         : lin[7],
+                        'lineaultimopago'                       : lin[8],
+                        'codigobarra'                           : lin[9],
+                        'modoingresocuponid'                    : lin[10],
+                        'autorizasupervisora'                   : lin[11],
+                        'codigosupervisora'                     : lin[12],
+                        'lineacancelada'                        : lin[13]
+            }
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+
+        return result
+
+
+    def lt_91(self):
+        """
+        Línea de pago ticket Total (91) SM.
+        ----------------------------------
+
+         0 Código del medio de pago.
+         1 Código de la moneda.
+         2 Monto total de lo que se puede pagar con el medio de pago moneda.
+         3 Idem que el anterior pero expresado en la moneda de referencia.
+         4 Total entregado de ese medio de pago-moneda.
+         5 Total entregado expresado en la moneda de referencia.
+         6 Cambio de la línea de pago (valor >= 0.00 5).
+         7 TipoOperacion.
+             0 - Venta ( importes > 0.00).
+             1 - Devolución ( importes < 0.00).
+         8 LineaUltimoPago.
+             0 - No es la línea del último pago. Esto sucede cuando el ticket
+                 se paga con múltiples pagos (inclusive de distintos medios de
+                 pago-monedas) cuando el importe abonado es menor al total a pagar.
+             1 - Es la línea del último pago.
+         9 CodigoBarra.
+             1 - código de barras del cupón.
+             0 - monto total de los cupones o el codigo de barras ingresado
+                 manualmente de ese cupon.
+        10 ModoIngresoCupon.
+             0 - Teclado.Este modo de ingreso se efectua cuando la cajera
+                 ingresa el monto del total de los cupones o el codigo de
+                 barras de ese cupon.
+             1 - Scanner.Cuando se procesan los cupones por scanner, validando
+                 los mismos.
+        11 AutorizaSupervisora.
+             0 - La línea de pago no tuvo autorización de la supervisora.
+             1 - La línea de pago tuvo autorización de la supervisora.
+        12 CodigoSupervisora.
+        13 Código de la supervisora (vacío si no aplica)
+        14 LineaCancelada.
+             0 - activa.
+             1 - cancelada.
+
+
+        Indices:
+        -------
+
+        CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+             0                  1                 2
+
+        TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                        2                           4
+
+        TotalPagadoMonedaReferencia # Cambio # TipoOperacion #
+                    5                   6           7
+
+        LineaUltimoPago# CodigoBarra # ModoIngresoCupon # AutorizaSupervisora #
+                8           9               10                  11
+
+        CodigoSupervisora # LineaCancelada
+            12                  13
+        """
+
+        lin = self.esta_linea or False
+
+        try:
+            result = {
+                        'codigomediopago'                       : lin[0],
+                        'codigomoneda'                          : lin[1],
+                        'totalmediopagomoneda'                  : lin[2],
+                        'totalmediopagomonedamonedareferencia'  : lin[3],
+                        'totalpagado'                           : lin[4],
+                        'totalpagadomonedareferencia'           : lin[5],
+                        'cambio'                                : lin[6],
+                        'tipooperacion'                         : lin[7],
+                        'lineaultimopago'                       : lin[8],
+                        'codigobarra'                           : lin[9],
+                        'modoingresocuponid'                    : lin[10],
+                        'autorizasupervisora'                   : lin[11],
+                        'codigosupervisora'                     : lin[12],
+                        'lineacancelada'                        : lin[13]
+            }
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+
+        return result
+
+
+    def lt_92(self, *args):
+        pass
+
+
+    def lt_94(self, *args):
+        pass
+
+
+    def lt_95(self, *args):
+        pass
+
+
+    def lt_97(self, *args):
+        pass
+
+
+    def lt_99(self):
+        pass
+
+
+    def lt_100(self, *args):
+        pass
+
+
+    def lt_101(self, *args):
+        pass
+
+
+    def lt_102(self, *args):
+        pass
+
+
+    def lt_103(self, *args):
+        pass
+
+
+    def lt_104(self, *args):
+        pass
+
+
+    def lt_105(self, *args):
+        pass
+
+
+    def lt_106(self, *args):
+        pass
+
+
+    def lt_107(self, *args):
+        pass
+
+
+    def lt_108(self, *args):
+        pass
+
+
+    def lt_109(self, *args):
+        pass
+
+
+    def lt_115(self, *args):
+        pass
+
+
+    def lt_117(self, *args):
+        pass
+
+
+    def lt_118(self, *args):
+        pass
+
+
+    def lt_119(self, *args):
+        pass
+
+
+    def lt_120(self, *args):
+        """
+            Línea de venta Mides (120)-SM
+            -----------------------------
+
+            Representa la línea de venta de un ticket de venta MIDES.
+
+            VentaMides  Texto que indica venta MIDES (Venta Mides).
+            CI          Cédula de identidad del cliente.Este campo es opcional,puede no venir.
+
+            VentaMides # CI
+        """
+
+        lin = self.esta_linea or False
+
+        try:
+            result = {
+                        'ventamides': lin[0],
+                        'ci'        : lin[1]
+                }
+
+        except Exception as ex:
+
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+
+        return result
+
+
+    def lt_121(self, *args):
+        """
+            Línea de voucher retiro leche tarjeta Mides (121)-SM:
+            ====================================================
+            Representa la línea de retiro de productos (en este caso leche)
+            sin costo (hasta cierto tope) de la tarjeta Mides.
+
+            NumeroTarjeta # CedulaIdentidad # UnidadesRetiradas # SaldoUnidades # TipoVoucher # Modo
+
+            0. Numero de la tarjeta Mides.
+            1. Documento de identidad del cliente.
+            2. Cantidad de unidades retiradas.
+            3. Saldo de unidades que puede retirar sin costo.
+            4. Tipo de voucher asociado.
+                    0 - Original Cliente.
+                    1 - Vía Establecimiento.
+            5. Modo
+                    0 - Retiro de productos.
+                    1 - Devolución de productos.
+
+            NumeroTarjeta # CedulaIdentidad # UnidadesRetiradas # SaldoUnidades #
+
+            TipoVoucher # Modo
+
+        """
+
+        lin = self.esta_linea or False
+
+        try:
+            result = {
+                        'numerotarjeta'      : lin[0],
+                        'cedulaidentidad'    : lin[1],
+                        'unidadesretiradas'  : lin[2],
+                        'saldounidades'      : lin[3],
+                        'tipovoucher'        : lin[4],
+                        'modo'               : lin[5],
+                }
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+
+        return result
+
+
+    def lt_122(self, *args):
+
+        """
+            Línea ticket info importe (122)-SM
+            Contiene la información de importes gravados de los pagos con Tarjeta de Credto/Debito, Lucheon, etc.
+
+            ImporteTotalTicket # ImporteGravadoTicket
+                    0                      1
+            ImporteTotalTicket   -> Importe total del ticket.
+            ImporteGravadoTicket -> Importe gravado del ticket.
+
+            Ejemplo de un importe con un total de ticket de 287.06 con un importe gravado de 235.30
+                L|10|122|191720|287.06|235.30
+
+        """
+
+        lin = self.esta_linea or False
+        try:
+            result = {
+                        'importetotalticket'      : lin[0],
+                        'importegravadoticket'    : lin[1],
+                }
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+
+        return result
+
+
+    def lt_123(self, *args):
+        """
+            Línea de pago TACRE (123)-SM.
+            -----------------------------
+
+            Representa la línea de pago por Tarjeta Ticket Alimentacion/Canasta/Restaurante de forma electrónica.
+
+            0. Código del medio de pago.
+            1. Código de la moneda.
+            2. Monto total de lo que se puede pagar con el medio de pago moneda.
+            3. Idem que el anterior pero expresado en la moneda de referencia.
+            4. Total entregado de ese medio de pago-moneda.
+            5. Total entregado expresado en la moneda de referencia.
+            6. Cambio de la línea de pago (su valor puede ser 0.00 (no hay cambio) o positvo que es parte del cambio que se le da al cliente).
+            7. Tipo Operacion
+                    0 - Si corresponde a una venta (los importes van en positivo).
+                    1 - Si corresponde a una devolución por parte del cliente (los importes van en negativo).
+            8. L.Ultimo Pag
+                    0 - No es la línea del último pago. Esto sucede cuando el ticket se paga con múltiples pagos (inclusive de distintos medios de pago-monedas) cuando el importe abonado es menor al total a pagar.
+                    1 - Es la línea del último pago.
+            9. Número de la tarjeta de crédito.
+           10. Número de autorización.
+
+           11.  Autoriza Supervisora
+                    0 - La línea de pago no tuvo autorización de la supervisora.
+                    1 - La línea de pago tuvo autorización de la supervisora.
+           12. Código de la supervisora si AutorizaSupervisora = 1, sino va vacío.
+
+           13. Línea Activa/Cancelada
+                    0 - Línea activa.
+                    1 - Línea cancelada. (sin tiene valor contable)
+           14. Flag que indica si se aplica la ley 19210 de inclusión financiera de descuento de iva.
+                    0 - No aplica ley de descuento de iva.
+                    1 - Aplica ley de descuento de iva.
+           15. Monto del descuento de Iva.
+           16. Texto de la ley (numero).
+
+        CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+                0             1                    2
+        TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                        3                           4
+        TotalPagadoMonedaReferencia # Cambio # TipoOperacion # LineaUltimoPago #
+                      5                 6            7                8
+        NumeroTarjeta # NumeroAutorizacion # AutorizaSupervisora #
+              9                 10                   11
+        CodigoSupervisora # LineaCancelada # SiAplicaLeyDescIva #
+              12                13                   14
+        MontoDescuentoLeyIva # TextoLey
+                15                  16
+        """
+        lin = self.esta_linea or False
+
+        try:
+            result = {
+                        'codigomediopago'                       : lin[0],
+                        'codigomoneda'                          : lin[1],
+                        'totalmediopagomoneda'                  : lin[2],
+                        'totalmediopagomonedamonedareferencia'  : lin[3],
+                        'totalpagado'                           : lin[4],
+                        'totalpagadomonedareferencia'           : lin[5],
+                        'cambio'                                : lin[6],
+                        'tipooperacion'                         : lin[7],
+                        'lineaultimopago'                       : lin[8],
+                        'numerotarjeta'                         : lin[9],
+                        'numeroautorizacion'                    : lin[10],
+                        'autorizasupervisora'                   : lin[11],
+                        'codigosupervisora'                     : lin[12],
+                        'lineacancelada'                        : lin[13],
+                        'siaplicaleydesciva'                    : lin[14],
+                        'montodescuentoleyiva'                  : lin[15],
+                        'textoley'                              : lin[16],
+                }
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+
+        return result
+
+
+    def lt_124(self, *args):
+        pass
+
+
+    def lt_125(self, *args):
+        pass
+
+
+    def lt_126(self, *args):
+        """
+
+          Línea de ticket de cliente de cuenta corriente (126)-SM.
+          -------------------------------------------------------
+
+            Especificacion de la línea de ticket de cliente de cuenta corriente (clientes especiales).
+
+            0. CodigoCC     Código de cliente de cuenta corriente.
+            1. NombreCC     Nombre del cliente de cuenta corriente.
+            2. MontoPagoCC  Es el monto de pago del cliente de cuenta corriente
+                            No necesariamente es igual al monto total del ticket,
+                            cuando se usa medio de pago.
+
+             CodigoCC # NombreCC # MontoPagoCC
+                 0         1           2
+        """
+
+        lin = self.esta_linea or False
+
+        try:
+            result = {
+                'codigocc'   : lin[0],
+                'nombrecc'   : lin[1],
+                'montopagocc': lin[2],
+            }
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+
+        return result
+
+
+    def lt_127(self):
+        """
+          Línea de pago cuenta corriente (127)-SM   Medio de pago Venta o devolución
+          ---------------------------------------------------
+
+            Especificacion de la línea de ticket del pago de clientes de
+            cuenta corriente. Es igual a la línea de pago en efectivo (9),
+            solo que se refiere al codigo de medio de pago cuenta corriente
+            y moneda pesos.
+
+          Línea de pago de ticket en efectivo (9).
+          ---------------------------------------
+
+
+            0. Código del medio de pago.
+            1. Código de la moneda.
+            2. Monto total de lo que se puede pagar con el medio de pago moneda.
+            3. Idem que el anterior pero expresado en la moneda de referencia.
+            4. Total entregado de ese medio de pago-moneda.
+            5. Total entregado expresado en la moneda de referencia.
+            6. Cambio de la línea de pago (valor >= 0.00)
+            7. Codigo de Operacion.
+                    0 - Si corresponde a una venta (los importes van en positivo).
+                    1 - Si corresponde a una devolución por parte del cliente (los
+                        importes van en negativo).
+            8. Ultimo pago.
+                    0 - No es la línea del último pago. Esto sucede cuando el ticket
+                        se paga con múltiples pagos (inclusive de distintos medios
+                        de pago-monedas) cuando el importe abonado es menor al
+                        total a pagar.
+                    1 - Es la línea del último pago.
+            9. Intervención supervisor.
+                    0 - Línea de pago sin intervención de supervisor.
+                    1 - Línea de pago autorizada por supervidor.
+            10. Código de la supervisora.
+            11. Estado de la línea de pago.
+                    0-Línea de pago no cancelada.
+                    1-Línea de pago cancelada.
+
+            CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+                0                1                 2
+
+            TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                        3                               4
+
+
+            TotalPagadoMonedaReferencia # Cambio # TipoOperacion # LineaUltimoPago #
+                        5                    6          7                8
+
+            AutorizaSupervisora # CodigoSupervisora # LineaCancelada
+                    9                    10                11
+
+        """
+        lin = self.esta_linea or False
+
+
+        try:
+            result = {
+                'codigomediopago'                       : lin[0],
+                'codigomoneda'                          : lin[1],
+                'totalmediopagomoneda'                  : lin[2],
+                'totalmediopagomonedamonedareferencia'  : lin[3],
+                'totalpagado'                           : lin[4],
+                'totalpagadomonedareferencia'           : lin[5],
+                'cambio'                                : lin[6],
+                'tipooperacion'                         : lin[7],
+                'lineaultimopago'                       : lin[8],
+                'autorizasupervisora'                   : lin[9],
+                'codigosupervisora'                     : lin[10],
+                'lineacancelada'                        : lin[11],
+            }
+
+        except Exception as ex:
+            self.rfalla()
+            msg = " %s %s " % (ns,ex)
+            logging.error(msg)
+            sys.exit(1)
+
+        return result
+
+
+    def lt_900(self, *args):
+        pass
+
+# --- fin clase `IPLinea`
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/opentck3/main.py b/opentck3/main.py
new file mode 100644 (file)
index 0000000..6f12249
--- /dev/null
@@ -0,0 +1,262 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+__licence__ = "GNU/GPLv3"
+__author__ = "Marcelo Zunino (InfoPrimo SL) 2015-2017"
+
+
+# from time import strftime
+import ipdb
+
+import sys
+import os
+import logging
+import csv
+import json
+import subprocess
+import inspect as insp
+
+import chk_json
+
+from decimal import Decimal
+from util import config
+from datetime import datetime
+from ip_ticket.ticket import IPCabezal, IPLinea
+
+from openxmlrpc import OpenConn
+settings = {
+    'hostname': 'localhost',
+    'port': 8069,
+    'database': 'zunicero',
+    'username': 'admin',
+    'password': 'fadmin',
+}
+op_conn = OpenConn(settings)
+
+#fantes = open('antes.json', "w") ; fantes.close()
+#fahora = open('ahora.json', "w") ; fahora.close()
+
+
+ns     = 'opentck3'
+oPath  = config.oPath
+sucursal = '01'
+
+logfile = './log/opentck3.log'
+os.path.isdir('./log') or os.mkdir('./log')
+os.path.isfile(logfile) or os.system("touch %s" % logfile)
+
+logging.basicConfig(format='%(asctime)s %(message)s', filename=logfile, level=logging.INFO)
+
+# solo para debugging
+# from inspect import currentframe, getframeinfo
+
+
+def msgout(msg=None):
+    msg = msg or "\n\tAlgo salio mal... FIN\n"
+    sys.stdout.write(msg,)
+
+
+def rell(rawcode=None, largo=6):
+    if not rawcode:
+        return '0'*largo
+    else:
+        return (largo - len(str(rawcode)))*'0' + str(rawcode)
+
+
+def run(command):
+    output = subprocess.check_output(command, shell=True)
+    return output
+
+
+def get_date(info_file):
+    """ :param info_file: archivo tckAAAAMMDD.tck
+        :return:   texto: una fecha
+
+        Parsea la primera línea del informe creado.
+        si bien el nombre del archivo representa a un fecha, su contenido puede corresponder a una fecha diferente.
+
+    ejemplo de primera línea de informe (siempre será un cabezal de ticket)
+        C#8#1#87#8#20151231080308#F#0#0.00#20#8
+                   |________|
+                   2015/12/31
+
+    :param info_file: archivo tckAAAAMMDD.tck
+    :return:   texto: una fecha
+
+    """
+    count_sep  = 0
+    date = ''
+    centinel = 0
+    head = run("head -1 %s" % info_file)
+    head = head.strip('\n')
+
+    for i in range(len(head)):
+        if head[i] == '#':
+            count_sep += 1
+        if count_sep >= 5 and centinel < 9:
+            date += head[i]
+            centinel += 1
+
+    date = date.strip('#')
+    # print date
+    return date
+
+
+def do_cabezales(cabezal,lineas):
+    return True
+
+
+
+class Excepcion(object):
+
+    stdout_err = 1  # `stdout_err = 1` mostrará errores en stdout
+    verbose    = 1  # `verbose = 1`    mostrará detalles del error
+    debug_log  = 0  # `debug = 1`      escribe detalles en el log
+    debug_vivo = 1  # `debug_vivo = 1` abre consola de debug en el error
+
+    def excep(self, mensaje, frame=None, id_ticket=None):
+        """ logging / notificación a stdout """
+        msg = mensaje or " algo salió mal... "
+        msgv = ''
+
+        if self.stdout_err and msg:
+            print("\t %s" % (msg,))
+        if self.verbose and frame and id_ticket:
+            msgv  = "aaaammdd cja tck: %s" % (id_ticket,)
+            msgv += " en: %s  lín: %s" % (frame.filename, frame.lineno)
+            print("\t %s" % (msgv,))
+        if self.debug_log:
+            msg += msgv
+        msg += " fin ejecución..."
+        if self.debug_vivo:
+            import ipdb; ipdb.set_trace()
+        return sys.exit(1)
+
+excepcion = Excepcion()
+
+class OpenTck(object):
+
+    def __init__(self, salidapazos):
+        # type: (object) -> object
+        self.salidapazos = salidapazos
+
+    def leer_informe(self):
+
+        """
+            ::PROCESA UN UNICO INFORME::
+            ============================
+
+            :param salidapazos: string: camino y nombre del archivo Salidapazos_nuevo
+            retorna: diccionario:
+
+                    { cabezal_tck0: linea_tck_pazos0, cabezal_tck1: linea_tck_pazos1, ... }
+
+
+            Ejemplo:
+
+            Dada la línea de cabezal: C#1#2#350#2#20151121105326#F#4#183.40#20#13
+            Cabezal_Tck1 = ('1', '2', '350', '2', '20151121105326', 'F', '4', '183.40', '20', '13')
+
+            Dada la línea de detalle: L#4#53#120435#TICKET DE VENTA#0
+            LinTckN_2 = ('4', '53', '120435', 'TICKET DE VENTA', '0')
+
+            En ambos casos se omite el identificador de línea,  "C" o "L"
+
+        """
+
+        salidapazos = self.salidapazos or None
+        if not salidapazos:
+            msgout("\n\n\t\t\t\t\t   Verificar ingreso ... %s" % ('\n\n',))
+            sys.exit(0)
+        key = None
+        informe = dict()
+        info_line = 0
+
+        with open(salidapazos, 'r') as f:
+            reader = csv.reader(f, delimiter='#')
+            for row in reader:
+                info_line += 1   # sólo para sber dónde se corta, si es que se corta.
+                if row[0] == 'C':
+                    key = tuple(row[1:]) # llave = línea de cabezal sin el primer caracter, o sea in la "C"
+                    informe[key] = []
+                elif row[0] == 'L':
+                    informe[key].append(tuple(row[1:])) # valores = líneas de detalle de ticket sin la "L"
+                else:
+                    msgout("\n\n\t\t\t\t\tEl infome salidapazos puede contener erores\n\t\t\t\t\t")
+                    msgout("\n\t\t\t\t\tNo se generaron los informes para \'findía\' Ver log.. %s\n\n" % (logfile,))
+                    logging.info(" %s [ Error ] : Verificar el contenido de %s at line %s" % (ns, salidapazos, info_line))
+                    sys.exit(0)
+        if not informe:
+            msg  = " %s [ Error ] : Ocurrió un error al leer informe. " % (ns,)
+            msg += "Verificar %s. No se generó el archivo .json" % (salidapazos,)
+            msgout(msg)
+            logging.info(msg)
+            sys.exit(0)
+
+        return informe
+
+
+
+
+def main():
+
+    """
+    :return: crea los archivo/s .json "tckAAAADDMM.json"
+
+        Procesa informes de salida de los POS, filtra movimientos
+        según criterios configurables, serializa la salida en
+        estructuras `json` que escribe en un archivo.
+
+        1. lee el directorio de salidapazos
+        2. prepara la lista de archivos salidapazos a procesar
+        3. lee los informes del filesystem
+        4. procesa cada informe salidapazos
+        5. crea archivos json correspondientes a cada informe
+        6. marca los informes procesaros en "/admi/pazos4/.sqlite3.db"
+
+        Los archivos json tiene la forma:
+
+        salida = [
+            ({lineas_cabezal},{lineas_detalle}),
+            ({lineas_cabezal},{lineas_detalle}),
+            ({lineas_cabezal},{lineas_detalle})
+        ]
+    """
+
+    #ipdb.set_trace()
+    # ####  1. 2.
+    infofile = chk_json.to_json()
+    # print len(infofile)
+
+    if not infofile:
+        msg =  '::No hay informes sin procesar!'
+        logging.warn( " %s [ Warninig ] : %s " % (ns, msg) )
+        sys.exit(0)
+
+    for i in infofile:
+        fecha = get_date(i)        # es la fecha en que pazos4 emitió el informe.
+
+        # ####  3.
+
+        informe = otck(i).leer_informe()  # levanta Salidapazos_nuevo (csv) y crea un diccionario
+
+        # ####  4.
+        #import ipdb;ipdb.set_trace()
+        cntctk, tcks_del_dia = passtck(informe)
+        _date = "%s-%s-%s" % (fecha[0:4], fecha[4:6], fecha[6:8])
+        print _date,',', cntctk
+
+        # #### 5.
+        json_file = "%stck%s.json" % (oPath,fecha,)
+        try:
+            with open(json_file, 'w') as fp:
+                json.dump(tcks_del_dia, fp, separators=(',', ': '), indent=3)
+
+            # #### 6.
+            json_done(i,fecha,json_file)
+            logging.info(" %s [ Info ] %s generado ok " % (ns,fecha))
+        except Exception as escritura:
+            logging.error( " %s [ Error ] : %s Imposible escribir el informe" % (ns, escritura) )
+
+if __name__ == '__main__':
+    main()
+
diff --git a/opentck3/mils.sh b/opentck3/mils.sh
new file mode 100755 (executable)
index 0000000..e73bbfd
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+echo "$1" >> /tmp/aca
diff --git a/opentck3/miscampos.py b/opentck3/miscampos.py
new file mode 100644 (file)
index 0000000..1a543b8
--- /dev/null
@@ -0,0 +1,41 @@
+from glob import glob
+import simplejson as json
+import sys
+
+cabezales = set()
+lineas = set()
+medios = set()
+cobzas = set()
+#import ipdb;ipdb.set_trace()
+#path = sys.argv[-1:][0]
+
+#path += ''.join('*')
+path = "/admi/pazos4/tck*.json"
+jfiles = glob(path)
+
+for jfile in jfiles:
+
+    with open(jfile, mode='r') as f:
+        print (jfile)
+        tcks = json.load(f)
+
+        for i in tcks:
+            for j in i[0].keys():
+                #if j in ('cobranzas_tck'):
+                #    for k in i[0][j]:
+                #        for l in k:
+                #            for m in k[l].keys():
+                #                medios.add(m)
+                cabezales.add(j)
+            for lin in i[1]:
+                for campo in lin.keys():
+                    lineas.add(campo)
+
+#print("cabezales: ", cabezales)
+print("lineas: ", lineas)
+
+#print medios
+
+
+
+
diff --git a/opentck3/opentck3.py b/opentck3/opentck3.py
new file mode 100755 (executable)
index 0000000..fa7dcfe
--- /dev/null
@@ -0,0 +1,1567 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+__licence__ = "GNU/GPLv3"
+__author__ = "Marcelo Zunino (InfoPrimo SL) 2015-2017"
+
+
+# from time import strftime
+import ipdb
+
+import sys
+import os
+import logging
+import csv
+import json
+import subprocess
+import inspect as insp
+
+from chk_json import to_json, json_done
+from decimal import Decimal
+from util import config
+from datetime import datetime
+from ip_ticket.ticket import IPCabezal, IPLinea
+
+from openxmlrpc import OpenConn
+settings = {
+    'hostname': 'localhost',
+    'port': 8069,
+    'database': 'zunicero',
+    'username': 'admin',
+    'password': 'fadmin',
+}
+op_conn = OpenConn(settings)
+
+#fantes = open('antes.json', "w") ; fantes.close()
+#fahora = open('ahora.json', "w") ; fahora.close()
+
+
+ns     = 'opentck3'
+oPath  = config.oPath
+sucursal = '01'
+
+logfile = './log/opentck3.log'
+os.path.isdir('./log') or os.mkdir('./log')
+os.path.isfile(logfile) or os.system("touch %s" % logfile)
+
+logging.basicConfig(format='%(asctime)s %(message)s', filename=logfile, level=logging.INFO)
+
+# solo para debugging
+# from inspect import currentframe, getframeinfo
+
+
+def msgout(msg=None):
+    msg = msg or "\n\tAlgo salio mal... FIN\n"
+    sys.stdout.write(msg,)
+
+
+def rell(rawcode=None, largo=6):
+    if not rawcode:
+        return '0'*largo
+    else:
+        return (largo - len(str(rawcode)))*'0' + str(rawcode)
+
+
+def run(command):
+    output = subprocess.check_output(command, shell=True)
+    return output
+
+
+def get_date(info_file):
+    """ :param info_file: archivo tckAAAAMMDD.tck
+        :return:   texto: una fecha
+
+        Parsea la primera línea del informe creado.
+        si bien el nombre del archivo representa a un fecha, su contenido puede corresponder a una fecha diferente.
+
+    ejemplo de primera línea de informe (siempre será un cabezal de ticket)
+        C#8#1#87#8#20151231080308#F#0#0.00#20#8
+                   |________|
+                   2015/12/31
+
+    :param info_file: archivo tckAAAAMMDD.tck
+    :return:   texto: una fecha
+
+    """
+    count_sep  = 0
+    date = ''
+    centinel = 0
+    head = run("head -1 %s" % info_file)
+    head = head.strip('\n')
+
+    for i in range(len(head)):
+        if head[i] == '#':
+            count_sep += 1
+        if count_sep >= 5 and centinel < 9:
+            date += head[i]
+            centinel += 1
+
+    date = date.strip('#')
+    # print date
+    return date
+
+
+def do_cabezales(cabezal,lineas):
+    return True
+
+
+
+class Excepcion(object):
+
+    stdout_err = 1  # `stdout_err = 1` mostrará errores en stdout
+    verbose    = 1  # `verbose = 1`    mostrará detalles del error
+    debug_log  = 0  # `debug = 1`      escribe detalles en el log
+    debug_vivo = 1  # `debug_vivo = 1` abre consola de debug en el error
+
+    def excep(self, mensaje, frame=None, id_ticket=None):
+        """ logging / notificación a stdout """
+        msg = mensaje or " algo salió mal... "
+        msgv = ''
+
+        if self.stdout_err and msg:
+            print("\t %s" % (msg,))
+        if self.verbose and frame and id_ticket:
+            msgv  = "aaaammdd cja tck: %s" % (id_ticket,)
+            msgv += " en: %s  lín: %s" % (frame.filename, frame.lineno)
+            print("\t %s" % (msgv,))
+        if self.debug_log:
+            msg += msgv
+        msg += " fin ejecución..."
+        if self.debug_vivo:
+            import ipdb; ipdb.set_trace()
+        return sys.exit(1)
+
+excepcion = Excepcion()
+
+class OpenTck(object):
+
+    def __init__(self, salidapazos):
+        # type: (object) -> object
+        self.salidapazos = salidapazos
+
+    def leer_informe(self):
+
+        """
+            ::PROCESA UN UNICO INFORME::
+            ============================
+
+            :param salidapazos: string: camino y nombre del archivo Salidapazos_nuevo
+            retorna: diccionario:
+
+                    { cabezal_tck0: linea_tck_pazos0, cabezal_tck1: linea_tck_pazos1, ... }
+
+
+            Ejemplo:
+
+            Dada la línea de cabezal: C#1#2#350#2#20151121105326#F#4#183.40#20#13
+            Cabezal_Tck1 = ('1', '2', '350', '2', '20151121105326', 'F', '4', '183.40', '20', '13')
+
+            Dada la línea de detalle: L#4#53#120435#TICKET DE VENTA#0
+            LinTckN_2 = ('4', '53', '120435', 'TICKET DE VENTA', '0')
+
+            En ambos casos se omite el identificador de línea,  "C" o "L"
+
+        """
+
+        salidapazos = self.salidapazos or None
+        if not salidapazos:
+            msgout("\n\n\t\t\t\t\t   Verificar ingreso ... %s" % ('\n\n',))
+            sys.exit(0)
+        key = None
+        informe = dict()
+        info_line = 0
+
+        with open(salidapazos, 'r') as f:
+            reader = csv.reader(f, delimiter='#')
+            for row in reader:
+                info_line += 1   # sólo para sber dónde se corta, si es que se corta.
+                if row[0] == 'C':
+                    key = tuple(row[1:]) # llave = línea de cabezal sin el primer caracter, o sea in la "C"
+                    informe[key] = []
+                elif row[0] == 'L':
+                    informe[key].append(tuple(row[1:])) # valores = líneas de detalle de ticket sin la "L"
+                else:
+                    msgout("\n\n\t\t\t\t\tEl infome salidapazos puede contener erores\n\t\t\t\t\t")
+                    msgout("\n\t\t\t\t\tNo se generaron los informes para \'findía\' Ver log.. %s\n\n" % (logfile,))
+                    logging.info(" %s [ Error ] : Verificar el contenido de %s at line %s" % (ns, salidapazos, info_line))
+                    sys.exit(0)
+        if not informe:
+            msg  = " %s [ Error ] : Ocurrió un error al leer informe. " % (ns,)
+            msg += "Verificar %s. No se generó el archivo .json" % (salidapazos,)
+            msgout(msg)
+            logging.info(msg)
+            sys.exit(0)
+
+        return informe
+
+otck = OpenTck
+
+
+
+def passtck(tickets):
+    """
+    tickets = { cabezal_Ticket0: [ lineaTicket0_0, lineaTicket0_1, lineaTicket0_2, lineaTicket0_N ],
+                cabezal_Ticket1: [ lineaTicket1_0, ... ],
+                cabezal_TicketN: [ lineaTicketN_0, ....]
+        }
+
+
+    Recibe los tickets del informe y parsea aquellos definidos en la configuración como `cabezales de interés`.
+        1. Instancia la clase `IPCabezal` con los datos de cabezal disponibles.
+           Algunos datos pueden ser obtenidos en el parseo de líneas.
+        2. Arma una lista con las líneas del ticket definidas como `lineas de interés` en la configuración.
+        3. Con cada ticket invoca al parser de líneas pasándole (cabezal, líneas) como parámetros.
+
+    :param tickets: dict : todos los tickets del informe
+    :return: tcks_del_dia: lista de tuplas [(cant_movimientos, tickets_del_dia), (,)...]
+    """
+    #import ipdb;ipdb.set_trace()
+
+    cabezales_pazos = tickets.keys()
+    tickets_procesados = 0
+
+    # pos_ticket_id = linea_tck_pazos_id = None
+    tcks_del_dia = list()
+    if 1: #try:
+        for cabezal_pazos in cabezales_pazos:
+            if cabezal_pazos[0] not in config.cabezales_interes.keys(): # saltear tickets que no interesan. solo lee venta/cobr, devol, ndcr
+                continue
+            C = IPCabezal(list(cabezal_pazos)) # print C.ticket, C.caja ,  C.timestamp
+            # :debug: reemplazar numero de ticket y nro. de caja
+            #  if C.ticket == 84174 and C.caja == 1:  import ipdb;ipdb.set_trace()
+            # print C.llave, C.descripcion
+            # se CREA "pos_ticket", miembro del cabezal "C"
+            # extrayendo/simplificando solo datos útiles de "C".
+            C.pos_ticket = dict(
+                    name            = C.id_ticket,
+                    sucursal_id     = sucursal,
+                    tipocabezal     = C.llave,
+                    descripcion_cab = C.descripcion,
+                    timestamptck    = datetime.strptime(C.timestamp, "%Y%m%d%H%M%S").strftime('%Y-%m-%d %H:%M:%S'),
+                    codigocaja      = int(C.caja),
+                    numerotck       = int(C.ticket),
+                    codigocajera    = C.nro_cajera,
+                    date            = C.yyyy + '-' + C.mm + '-' + C.dd,
+                    estadotck       = C.estado,
+                    cantarticulos   = int(C.cant_articulos),
+                    totalapagar     = round( Decimal(C.totalapagar), 2),
+                    tipocliente     = C.tipo_de_cliente,
+                    cantidadlineas  = int(C.cant_lineas),
+                    note            = ''
+            ) # en el volcado de datos a un ERP deberá redefinirse el concepto de cabzal de ticket
+
+            # se leen todas las líneas antes de confirmar el cabezal, dado que existen líneas pueden contener información relevnte para el cabezal.
+            if C.llave in ('8', '10','18'):  # tickets especiales 8 Linea Cajera (entrea-sale-pausa), 10 Pago, 18 Retiros
+                do_cabezales(C, tickets[cabezal_pazos]) # por ahora no hace nada, solo los saltea
+                continue
+            lineas_tck_pazos = []
+            for linea in tickets[cabezal_pazos]:
+                # es la llave en la instancia del objeto ticket
+                if linea[1] not in config.lineas_interes.keys(): #
+                    continue
+                lineas_tck_pazos.append(linea)
+            # print("llave: %s tst: %s  caja: %s  ticket: %s" % (C.llave, ttst14, caja, ticket))
+            # si hay tickets con líneas.
+            if isinstance(C, IPCabezal) and len(lineas_tck_pazos):
+                #try:
+                lineas_ticket = parse_lines(C.pos_ticket, lineas_tck_pazos)
+
+                tcks_del_dia.append((C.pos_ticket, lineas_ticket))
+
+                if C.pos_ticket['tipocabezal'] == '1' and C.pos_ticket.has_key('tipo_de_ticket_descrip'):   # venta
+                    tickets_procesados += 1
+
+                    #print '%s ' %  (tickets_procesados,),
+                elif C.pos_ticket['tipocabezal'] in ('3', '16') and C.pos_ticket.has_key('tipo_de_ticket_descrip'):
+                    # 3 modo devolución se anula algo previamente vendido
+                    # 16 Ticket Nota de Credito Devolucion devol. un ticket de venta con factura.
+                    # Es un cabezal indicador cuyos totales estan en 0.  -ver línea de detalla tipo 92
+                    tickets_procesados -= 1
+
+                    #print '\n\t devol : %s %s %s' %  (tickets_procesados, C.pos_ticket['tipocabezal'], C.pos_ticket['tipo_de_ticket_descrip']),
+                #mzs
+                #except Exception as err_msg:
+
+                #    msg = "[ERROR]: Error al parsear: %s %s %s" % (err_msg, C.llave, C.descripcion)
+                #    print(msg + ' adentro')
+                #    import ipdb;ipdb.set_trace()
+
+            else:
+                msg = " %s Ticket informado con errores %s Ver Salidapazos." % (ns, C.timestamp + C.caja + C.ticket)
+                logging.warn(msg)
+
+    #except Exception as ex:
+    #    print ex, 'ultimo'
+    #    import ipdb;ipdb.set_trace()
+
+    return tickets_procesados, tcks_del_dia
+
+
+
+def parse_lines(pos_ticket, lineas_tck_pazos):
+    """
+
+    :param pos_ticket:          diccionario con datos del cabezal
+    :param lineas_tck_pazos:    lineas del ticket
+    :param estado_tck:          estado del ticket en el pos
+
+    :return:     diccionario { cabezal: [lineas.] }
+    """
+
+    """
+        Recibe un cabezal de ticket y una lista de líneas de ticket.
+        Instanciará un objeto de la clase `IPLinea`
+        Devuelve un diccionario (cabezal y líneas) del modelo en openerp.
+        
+
+        Una particularidad de las líneas de Salidapazos es practicamente en la totalidad
+        de los tickets es que estas contienen datos típicos de cabezal que deben ser
+        extraídos y transformados en líneas de tipo cabezal. (medio de pago, cliente,
+        Id de la cajera, etc.)
+
+        Un ticket puede dar lugar a varios objetos de tipo cabezal diferentes.
+
+        Por ejemplo, en un ticket el nombre del cliente no es un dato frecuente.
+        No obstante si Salidapazos debe consignar un cliente específico, creará una
+        *línea* de detalle de ticket. Estos datos afectan a todas las líneas
+        del ticket. Por tal motivo, a nivel del ERP el objeto que los represente deberá
+        soportar una relación con una entidad o agente específico. Esta relación se
+        debe establlecer a partir del cabezal del ticket en el ERP.
+
+        Similar tratamiento llevan todos los tickets de venta o ingresos en lo que
+        refiere a los datos del medio o los medios de pago afectados a estos tickets.
+        Es decir, el detalle del medio de pago siempre es una *línea* del ticket en
+        Salidpazos. En cambio será un elemento del cabezal en el ERP.
+
+        Las razones de este tipo de estructura en Salidapazos... bueno se supone que
+        la expansión de funcionalidades que los POS son capaces de realizar ha
+        comprometido consecuentemente los diseños y estructuras subyasentes, constreñídas
+        por la necesidad de asegurar compatibilidad con stock muy diverso de aplicaciones
+        consumidoras de estos datos.
+
+        En la actualidad son tantas las variantes que puede tener un ticket que sus
+        cabezales deberían ser enormes para representar todos los tipos de tickets
+        posibles. Hay que admitirlo, la formalización de estas estructuras de datos
+        presenta desafíos muy interesantes,
+
+        La dificultad mayor radica en el parseo de las lineas de detalle del ticket.
+
+
+        nota de diseño, 29/11/17:
+            Además de deserializar los CSV de Salidapazos, extraer los datos significativos,
+            esta rutina clasifica, tranforma y/o mergea las líneas que contengan datos de
+            cabezal, creando incluso nuevas líneas de cabezal de ticket.
+
+            Considerando todos los tipos de líneas posibles, las líneas que contienen
+            datos de *cabezal* abarcan un amplio conjunto de tipos de líneas de detalle de
+            ticket diferetes.
+            En tando para las líneas que contienen datos típicos de *línea*, alcanza con tres
+            o cuatro tipos diferentes de líneas de detalle de ticket. Por este motivo el
+            parseo de líneas se vuelve más y más complejo a medida que se incorporan nuevas
+            necesidades para atender análisis de datos.
+
+            Una posibilidad de reducir la complejidad, sería quitar las tareas de modificación,
+            mergeo y creación de líneas de cabezal, dejando que las líneas sean simplemente
+            parseadas, sin modificar su  estructura del ticket.
+
+            El resto de las tareas quedarían en otro método específico.
+
+            Finalmente serían creados los obetos python a ser serializados en json.
+    """
+
+    estado_tck = pos_ticket['estadotck']
+
+    # import ipdb;ipdb.set_trace()   tck['numerotck'] tck['date']
+    tck = pos_ticket
+    tkfe = "%s %s %s" % (pos_ticket['numerotck'], pos_ticket['codigocaja'], pos_ticket['date'])
+
+    lineas_ticket = list()
+    #if pos_ticket['numerotck'] == 53920 and pos_ticket['codigocaja'] == 1:
+    #import ipdb; ipdb.set_trace()
+    #    print 'hola'
+
+    # sea agrega una clave por cada uno de los tipos de línea que pasan a cabezal
+
+    medios =  { 'cuentas_tck': [],  'redondeos_tck': [],   'tarjetas_tck': [],
+                'cheques_tck': [],  'devenvases_tck': [],  'efectivo_tck': [],
+                'puntos_tck': []}
+
+    pos_ticket_id = pos_ticket['name']
+    mediosdepago_ticket = { pos_ticket_id: medios }
+
+
+
+    linea_cobza = list()
+    lineas_salidas_caja = [ ]
+
+    pos_ticket['mediosdepago_tck']    = list()
+    pos_ticket['cobranzas_tck']       = list()
+    pos_ticket['cuentas_tck']         = list()
+    pos_ticket['vouchertar_tck']      = list()
+    pos_ticket['redondeoaltotal_tck'] = list()
+    pos_ticket['cfe_tck']             = list()
+
+
+    #if ttimestamp == '20171201194203':  # es cabezal_pazos[4] o C.timestamp
+    #if pos_ticket['numerotck'] == 84174 and pos_ticket.caja == 1:
+
+
+
+    l47 = l68 = False
+    for linea in lineas_tck_pazos:
+        lin = IPLinea(linea, pos_ticket['name'])    # ticket_id
+        llave = lin.llave
+        data = lin.metodo()
+        #print llave, lin.descripcion
+
+        # Datos comunes en todos los tipos de líneas
+        tck_line = dict(
+            name            = lin.id_linea,
+            numerodelinea   = lin.numerodelinea,
+            tipolinea       = llave,
+            descripcion_lin = lin.descripcion,
+            hora            = lin.hora,
+            codigoarticulo  = 'codigo art.',
+            nota            = '',
+        )
+        #tkfe = "%s %s %s %s" % (pos_ticket['numerotck'], pos_ticket['codigocaja'], pos_ticket['date'], llave)
+
+        if llave == '1':
+            # 'Venta de ítem'
+            # Los calculos extraen los montos finales de venta
+            importe_iva  = Decimal(data['ivadescuentototal'])
+            importe_siva = Decimal(data['preciodescuentototal'])
+            importe_civa = importe_siva + importe_iva
+            cantidad     = Decimal(data['cantidad'])
+            punit_siniva = importe_siva / cantidad
+            punit_coniva = importe_civa / cantidad
+
+            if not data['codigoarticulo']:
+                print "\tSIN INTERNO va original"
+                if not data['codigoarticulooriginal']:
+                    #data['codigoarticulo'] = data['codigoarticulooriginal']
+                    #else:
+                    print "\tSIN CODIGO!!!"
+                    raise Exception("\tsin código!\n")
+
+            tck_line.update(dict(
+                codigoiva           = data['codigoiva'],
+                cantidad            = round(cantidad,2),
+                lineacancelada      = int(data['lineacancelada']),
+                modoingreso         = data['modoingreso'],
+                codigoarticulo      = data['codigoarticulo']  or data['codigoarticulooriginal'],
+                codigooriginal      = data['codigoarticulooriginal'],
+                estandem            = int(data['siestandem']),
+                preciounitario      = round(Decimal(data['preciounitario']),2),  # precio unitario "de lista" con iva sin dtos.
+                cantdescmanuales    = data['cantdescmanuales'],
+                importe_siva        = round(importe_siva,2),
+                importe_civa        = round(importe_civa,2),
+                importe_iva         = round(importe_iva,2),
+                punit_siniva        = round(punit_siniva,2),
+                punit_coniva        = round(punit_coniva,2),
+                # product_id          = erp_product_id(data['codigoarticulo']),
+
+            ))
+
+            # ivadescuentototal   =
+            # preciodescuentototal= ,
+            # codigovendedor    = data['codigovendedor'],
+            # talle             = data['talle'],
+            # color             = data['color'],
+            # marca             = data['marca'],
+            # modelo            = data['modelo'],
+            # siaplicadescfidel = data['siaplicadescfidel'],            # fidellización
+            # montorealdescfidel= float(data['montorealdescfidel']
+
+        elif llave == '4':
+            # 'Total del ticket (discrimina pago de servicios)'
+            pos_ticket['totalticket']                    = round(Decimal(data['totalticket']),2)
+            pos_ticket['totalticketsinpagoservicios']    = round(Decimal(data['totalticketsinpagoservicios']),2)
+            pos_ticket['ivatotalticket']                 = round(Decimal(data['ivatotalticket']),2)
+            pos_ticket['ivatotalticketsinpagoservicios'] = round(Decimal(data['ivatotalticketsinpagoservicios']),2)
+
+        elif llave == '5':
+            # Línea de cabezal CFE (5)
+            cab_cfe = dict(
+                tipocfe               = data['tipocfe'],
+                descripcioncfe        = data['descripcioncfe'],
+                seriecfe              = data['seriecfe'],
+                numerocfe             = data['numerocfe'],
+                tipodocumentoreceptor = data['tipodocumentoreceptor'],
+                documentoreceptor     = data['documentoreceptor'],
+                nombrereceptor        = data['nombrereceptor'],
+                direccionreceptor     = data['direccionreceptor'],
+                ciudadreceptor        = data['ciudadreceptor']
+            )
+
+        elif llave == '6':
+            # Pie de CFE
+
+            # pos_ticket['cfe_tck'].append( dict(
+            pie_cfe = dict(
+                cliente             = data['cliente'],
+                linkdgi             = data['linkdgi'],
+                tipocfe             = data['tipocfe'],
+                rucemisor           = data['rucemisor'],
+                numerocfe           = data['numerocfe'],
+                fechacfe            = data['fechacfe'],
+                montoneto           = data['montoneto'],
+                hash_cfe            = data['hash'],
+                codigocae           = data['codigocae'],
+                seriecfe            = data['seriecfe'],
+                nroiniciocae        = data['nroiniciocae'],
+                nrofincae           = data['nrofincae'],
+                fechavencimientocae = data['fechavencimientocae']
+            )
+
+        elif llave == '7':
+            # 'Identificación de la cajera'
+            # No tiene importancia conservarlo cómo línea de ticket
+            # alcanza con cargar el dato en el cabezal codigocajera
+            if pos_ticket['codigocajera'] != data['codigocajera']:
+                # NO COINCIDE CAJRA DE LINEA y CAJERA DE TICKET !!!!!
+                pos_ticket['codigocajera'] = data['codigocajera']
+                # print(data['codigocajera'], data['nombrecajera'], pos_ticket['codigocaja'], pos_ticket['numerotck'], pos_ticket['date'])
+                # print("Estado : %s" % (estado_tck,))
+                # import ipdb;ipdb.set_trace()
+            pos_ticket['nombrecajera'] = data['nombrecajera']
+
+
+        elif llave == '9':
+            # 'Pago de ticket en efectivo
+            #import ipdb;ipdb.set_trace()
+
+            llave_9 = dict(
+                tipo_medio                           = 'efectivo',
+                codigomediopago                      = data['codigomediopago'],
+                codigomoneda                         = data['codigomoneda'],
+                totalmediopagomoneda                 = round(Decimal(data['totalmediopagomoneda']),2),
+                totalmediopagomonedamonedareferencia = round(Decimal(data['totalmediopagomonedamonedareferencia']),2),
+                totalpagado                          = round(Decimal(data['totalpagado']),2),
+                totalpagadomonedareferencia          = round(Decimal(data['totalpagadomonedareferencia']),2),
+                cambio                               = round(Decimal(data['cambio']),2),
+                tipooperacion                        = data['tipooperacion'],
+                lineaultimopago                      = data['lineaultimopago'],
+                autorizasupervisora                  = data['autorizasupervisora'],
+                codigosupervisora                    = data['codigosupervisora'],
+                lineacancelada                       = data['lineacancelada']
+            )
+
+
+            pos_ticket['mediosdepago_tck'].append( llave_9 )
+            #mediosdepago_ticket[pos_ticket_id].append(llave_9)
+
+            mediosdepago_ticket[pos_ticket_id]['efectivo_tck'].append(llave_9)
+
+        elif llave == '12':
+
+
+            # 'Cancelación de Ítem'
+            codigo = cancela_tipo = ''
+            if data['indicadorartsubf'] == 'C':
+                cancela_tipo = "Cancela Cobranza"
+                nota = ( data['importe_cancelado'], data['nombresupervisora'])
+                tck_line.update( dict(  cancela_tipo = "Cancela Cobranza",
+                                        nota         = nota,))
+            else:
+                if data['indicadorartsubf'] == 'A':
+                    cancela_tipo = 'Cancela un articulo'
+                    codigo = data['codigoarticulo'] if data.has_key('codigoarticulo') else data['codigoarticulosubf']
+
+                elif data['indicadorartsubf'] == 'S':
+                    cancela_tipo = 'Cancela a subfamilia'
+                    codigo = data['codigoarticulosubf']
+
+                elif data['indicadorartsubf'] == 'T':
+                    cancela_tipo = 'Art. cancelado es un tandem'
+                    codigo = data['codigoarticulo'] if data.has_key('codigoarticulo') else data['codigoarticulosubf']
+
+
+
+                importe_civa = Decimal(data['importe_cancelado'])
+
+                tck_line.update( dict(
+                    codigoarticulo    = codigo,
+                    cancela_tipo      = cancela_tipo,
+                    cantidad          = 1.0,
+                    nrolineavta       = data['nrolineavta'],
+                    importe_civa      = round(importe_civa,2),
+                    nota              = data['nombresupervisora'],
+                    # product_id        = erp_product_id(codigo)
+                ))  # codigovendedor = data['codigovendedor'],
+
+
+
+
+        elif llave == '20':
+            # 'Devolución de un ítem'
+
+            """
+                No discriminamos procesamos descuentos en las devoluciones
+                preciodescuentototal    = data['preciodescuentototal']
+                ivadescuentototal       = data['ivadescuentototal']
+                preciodescuento         = data['preciodescuento']
+
+                            codigoarticulosubf      = lin[ 0] or None,
+                            cantidad                = lin[ 1] or None,
+                            precio                  = lin[ 2] or None,
+                            iva                     = lin[ 3] or None,
+                            indicadorartsubf        = lin[ 4] or None,
+                            codigosupervisora       = lin[ 5] or None,
+                            codigoarticulooriginal  = lin[ 6] or None,
+                            modoingreso             = lin[ 7] or None,
+                            codigovendedor          = lin[ 8] or ' ',
+                            lineacancelada          = lin[ 9] or None,
+                            preciodescuento         = lin[10] or None,
+                            ivadescuento            = lin[11] or None,
+                            codigoiva               = lin[12] or None,
+            """
+            if data['lineacancelada']:
+                continue
+
+            if data['indicadorartsubf'] == 'S':
+                tck_line['nota'] = ' Devol. a subfamilia'
+                tck_line['codigoarticulo'] = data['codigoarticulosubf']
+
+            elif data['indicadorartsubf'] == 'A':
+                tck_line['nota'] = ' Devol. de artículo'
+                tck_line['codigoarticulo'] = data['codigoarticulosubf']
+
+            cantidad     = Decimal(data['cantidad'])
+            importe_iva  = Decimal(data['ivadescuento'])
+            importe_siva = Decimal(data['preciodescuento']) # hay una inconsistencia en salidapazos * cantidad ??
+            importe_civa = importe_siva + importe_iva
+            punit_siniva = importe_siva / cantidad
+            punit_coniva = importe_civa / cantidad
+
+
+            tck_line.update( dict(
+                cantidad       = round(cantidad,3),
+                importe_iva    = round(importe_iva ,2),
+                importe_siva   = round(importe_siva,2),
+                importe_civa   = round(importe_civa,2),
+                punit_siniva   = round(punit_siniva,2),
+                punit_coniva   = round(punit_coniva,2),
+
+                supervisora    = data['codigosupervisora'],
+                codigooriginal = data['codigoarticulooriginal'],
+                modoingreso    = data['modoingreso'],
+                nota           = "Cod. Supervisor/a: " + data['codigosupervisora'],
+
+                codigovendedor  = data['codigovendedor'],
+                lineacancelada  = data['lineacancelada'],
+                codigoiva       = data['codigoiva'],
+            ))
+
+        elif llave == '24':  # no se lee
+            # 'Pertenece a ticket cancelado'
+            if data['texto']:
+                tck_line.update({'texto': data['texto']})
+
+        elif llave == '26':   # no se lee
+            # 'Cabezal de beneficio al total'
+            pass
+
+        elif llave == '27':   # no se lee
+            # 'Detalle de un beneficio al total'
+            pass
+
+        elif llave == '29':
+            # 'Devolución de envases'                H A R D C O D E D
+            cantidad     = Decimal('1.0')
+            importe_iva  = Decimal(data['iva'])
+            importe_siva = Decimal(data['precio']) * cantidad
+            importe_civa = importe_siva + importe_iva
+
+            llave_29 = dict(
+                tipo_medio      = 'dev_envase',
+                cantidad        = 1.0,
+                importe_iva     = round(importe_iva, 2),
+                importe_siva    = round(importe_siva, 2),
+                importe_civa    = round(importe_civa, 2),
+                codigoiva       = '1',
+                codigoarticulo  = '4045',  # esto es así porque no podemos identificar los envases
+                codigooriginal  = '4045',
+                codigomediopago = 'dev_envases'
+            )
+            print "Devol Envase 29 -> ",  llave_29
+            tck_line.update(llave_29)
+            #mediosdepago_ticket[pos_ticket_id].append(llave_29)
+            mediosdepago_ticket[pos_ticket_id]['devenvases_tck'].append(llave_29)
+
+        elif llave == '30':
+            # 'Venta a subfamilia'
+            cantidad       =  Decimal(data['cantidad'])
+            importe_iva    =  Decimal(data['iva'])
+            importe_siva   =  Decimal(data['precio']) * cantidad
+            importe_civa   =  importe_siva + importe_iva
+
+            tck_line.update( dict(
+                cantidad       = round(cantidad    ,3),
+                importe_iva    = round(importe_iva ,2),
+                importe_siva   = round(importe_siva,2),
+                importe_civa   = round(importe_civa,2),
+                lineacancelada = data['lineacancelada'],
+                modoingreso    = data['modoingreso'],
+                codigoarticulo = data['codigo']
+            ))
+
+
+        elif llave == '37':
+            # 'Pago con tarjeta'
+
+            llave_37 = dict(
+                codigomediopago                      = data['codigomediopago'],
+                codigomoneda                         = data['codigomoneda'],
+                totalmediopagomoneda                 = round(Decimal(data['totalmediopagomoneda']),2),
+                totalmediopagomonedamonedareferencia = round(Decimal(data['totalmediopagomonedamonedareferencia']),2),
+                totalpagado                          = round(Decimal(data['totalpagado']),2),
+                totalpagadomonedareferencia          = round(Decimal(data['totalpagadomonedareferencia']),2),
+                cambio                               = round(Decimal(data['cambio']),2),
+                tipooperacion                        = data['tipooperacion'],
+                lineaultimopago                      = data['lineaultimopago'],
+                numerotarjetacredito                 = data['numerotarjetacredito'],
+                cuotastarjetacredito                 = data['cuotastarjetacredito'],
+                numeroautorizaciontarjetacredito     = data['numeroautorizaciontarjetacredito'],
+                tipotarjetacredito                   = data['tipotarjetacredito'],
+                autorizasupervisora                  = data['autorizasupervisora'],
+                codigosupervisora                    = data['codigosupervisora'],
+                lineacancelada                       = data['lineacancelada'],
+                plan                                 = data['plan'],
+                nrocomercio                          = data['nrocomercio'],
+                siaplicaleydesciva                   = data['siaplicaleydesciva'],
+                montodescuentoleyiva                 = data['montodescuentoleyiva'],
+                textoley                             = data['textoley'],
+                siesdebitocredito                    = data['siesdebitocredito'],
+            )
+
+
+            pos_ticket['mediosdepago_tck'].append( llave_37 )
+            #mediosdepago_ticket[pos_ticket_id].append(llave_37)
+            mediosdepago_ticket[pos_ticket_id]['tarjetas_tck'].append(llave_37)
+
+
+
+        elif llave == '38':
+            # 'Pago con cheque'
+
+            llave_38 = dict(
+                 medio_pago                            = 'cheque',
+                 codigomediopago                       = data['codigomediopago'],
+                 codigomoneda                          = data['codigomoneda'],
+                 totalmediopagomoneda                  = data['totalmediopagomoneda'],
+                 totalmediopagomonedamonedareferencia  = data['totalmediopagomonedamonedareferencia'],
+                 totalpagado                           = data['totalpagado'],
+                 totalpagadomonedareferencia           = data['totalpagadomonedareferencia'],
+                 cambio                                = data['cambio'],
+                 tipooperacion                         = data['tipooperacion'],
+                 lineaultimopago                       = data['lineaultimopago'],
+                 tipocliente                           = data['tipocliente'],
+                 idcliente                             = data['idcliente'],
+                 autorizasupervisora                   = data['autorizasupervisora'],
+                 codigosupervisora                     = data['codigosupervisora'],
+                 lineacancelada                        = data['lineacancelada']
+            )
+
+
+
+            pos_ticket['mediosdepago_tck'].append( llave_38 )
+            #mediosdepago_ticket[pos_ticket_id].append(llave_38)
+            mediosdepago_ticket[pos_ticket_id]['cheques_tck'].append(llave_38)
+
+        elif llave == '40':
+            # 'Pago con luncheon ticket'
+
+            llave_40 = dict(
+                tipo_medio                            = 'luncheon',
+                codigomediopago                       = data['codigomediopago'],
+                codigomoneda                          = data['codigomoneda'],
+                totalmediopagomoneda                  = data['totalmediopagomoneda'],
+                totalmediopagomonedamonedareferencia  = data['totalmediopagomonedamonedareferencia'],
+                totalpagado                           = data['totalpagado'],
+                totalpagadomonedareferencia           = data['totalpagadomonedareferencia'],
+                cambio                                = data['cambio'],
+                tipooperacion                         = data['tipooperacion'],
+                lineaultimopago                       = data['lineaultimopago'],
+                codigobarra                           = data['codigobarra'],
+                modoingresocupon                      = data['modoingresocupon'],
+                autorizasupervisora                   = data['autorizasupervisora'],
+                codigosupervisora                     = data['codigosupervisora'],
+                lineacancelada                        = data['lineacancelada']
+            )
+
+
+            pos_ticket['mediosdepago_tck'].append( llave_40 )
+            #mediosdepago_ticket[pos_ticket_id].append(llave_40)
+            mediosdepago_ticket[pos_ticket_id]['tarjeta_tck'].append(llave_40)
+
+        elif llave == '43':
+            # 'Voucher de tarjeta'" % ns )
+            if data['tipovoucher'] == '1': # solo la copia establecimiento.
+
+                pos_ticket['vouchertar_tck'].append(dict(
+                    nombreemisortarjeta     = data['nombreemisortarjeta'],
+                    numerotarjeta           = data['numerotarjeta'],
+                    # numerotarjetacredito    = data['numerotarjeta'],
+                    vencimiento             = data['vencimiento'],
+                    comprobante             = data['comprobante'],
+                    autorizacion            = data['autorizacion'],
+                    plan                    = data['plan'],
+                    cantidadcuotas          = data['cantidadcuotas'],
+                    codigoterminal          = data['codigoterminal'],
+                    codigocomercio          = data['codigocomercio'],
+                    tipoautorizacion        = data['tipoautorizacion'],
+                    nrolote                 = data['nrolote'],
+                    codigomoneda            = data['codigomoneda'],
+                    tipotransaccion         = data['tipotransaccion'],
+                    tipovoucher             = data['tipovoucher'],
+                    importepago             = data['importepago'],
+                    fechatransaccion        = data['fechatransaccion'],
+                    codigocaja              = data['codigocaja'],
+                    codigocajera            = data['codigocajera'],
+                    nombrepropietario       = data['nombrepropietario'],
+                    tipoingreso             = data['tipoingreso'],
+                    descuentaivarestaurante = data['descuentaivarestaurante'],
+                    siesdebitocredito       = data['siesdebitocredito'],
+                    cardtype                = data['cardtype'],
+                    saldogift               = data['saldogift'],
+                    tipotarjetacredito2     = data['tipotarjetacredito2'],
+                    descuentoafam           = data['descuentoafam'],
+                    siaplicaleydesciva      = data['siaplicaleydesciva'],
+                    montodescuentoleyiva    = data['montodescuentoleyiva'],
+                    montoticket             = data['montoticket'],
+                    montogravado            = data['montogravado'],
+                    flagimprimefirma        = data['flagimprimefirma']
+                ))
+
+        elif llave == '47':   # COBRANZA
+            #print('47')       # importe y tipo de servicio cobrado (por ahora solo cobranzas de ct.cte)
+            l47 = True     # hay_cobza = True
+            # si la línea de conbranza no tiene código de servicio pagado, lo hardcodeamos
+            if data.has_key('codserviciopagado'):
+                if data['codserviciopagado'] is None:
+                    data['codserviciopagado'] = '0'
+            else:
+                data['codserviciopagado'] = '0'
+
+            linea_cobza.append(
+                (pos_ticket['name'],
+                round(Decimal(data['importecobranza']),2),
+                data['codserviciopagado'])
+            )
+
+            # contenido de la linea de cobranza lista de tuplas (ver llave 68)
+            # lcobza = [ ( id_ticket, importecobranza, codserviciopagado ) ]
+
+            pos_ticket['tipocabezal'] = 'ccc'
+            pos_ticket['hay_cobza'] = True
+            pos_ticket['descripcion_cab'] = 'Ticket de Cobranza'
+
+
+        elif llave == '52':  # no se lee
+            # Pago desde caja
+
+            tck_line.update( dict(
+                    cantidad       = 1.0,
+
+                    importe_siva   = float( data['importe'] * -1 ),
+                    importe_iva    = float( data['importe'] * -1 ),
+                    importe_civa   = float( data['importe'] * -1 ),
+                    codigooriginal = data['codigo'],
+                    codigoarticulo = '9-pago-desde-caja'
+            ))
+
+
+        elif llave == '53':
+            # 'Tipo de ticket'
+            pos_ticket['tipo_de_ticket_descrip'] = data['descripciontipoticket']
+            pos_ticket['tipo_de_ticket_tipovta'] = data['tipoventa']
+
+
+        elif llave == '54':
+            # 'Pago de ticket en puntos'
+
+            llave_54 = dict(
+                tipo_medio                           = 'pago_con_puntos',
+                codigomediopago                      = data['codigomediopago'],
+                codigomoneda                         = data['codigomoneda'],
+                totalmediopagomoneda                 = round(Decimal(data['totalmediopagomoneda']),2),
+                totalmediopagomonedamonedareferencia = round(Decimal(data['totalmediopagomonedamonedareferencia']),2),
+                totalpagado                          = round(Decimal(data['totalpagado']),2),
+                totalpagadomonedareferencia          = round(Decimal(data['totalpagadomonedareferencia']),2),
+                cambio                               = round(Decimal(data['cambio']),2),
+                tipooperacion                        = data['tipooperacion'],
+                lineaultimopago                      = data['lineaultimopago'],
+                autorizasupervisora                  = data['autorizasupervisora'],
+                codigosupervisora                    = data['codigosupervisora'],
+                lineacancelada                       = data['lineacancelada']
+            )
+
+
+            pos_ticket['mediosdepago_tck'].append( llave_54 )
+            # mediosdepago_ticket[pos_ticket_id].append(llave_54)
+            mediosdepago_ticket[pos_ticket_id]['puntos_tck'].append(llave_54)
+
+
+        elif llave == '55':
+            # 'Intervensión Supervisora'
+            nota =  "Supervisor/a %s %s" % (data['codigosuper'], data['nombresuper'])
+            tck_line.update( dict( codigoarticulo = 'interv.super.',
+                                   codigosuper = data['codigosuper'],
+                                   nombresuper = data['nombresuper'],
+                                   nota = nota))
+
+        elif llave == '57':  # no se leera
+            # Tipo de cliente    fidelización
+            pass
+            """
+            tipodecliente = dict(
+                tipo_de_cliente    = data['tipo'],
+                numerotarjeta      = data['numerotarjeta'],
+                modoingreso        = data['modoingreso'],
+                nombre             = data['nombre'],
+                numero             = data['numero'],
+                tipoclienteinterno = data['tipoclienteinterno']))
+            """
+        elif llave == '63':
+            # 'Redondeo de importe' al total de ticket
+
+            llave_63 = dict(
+                tipo_medio         = 'redondeos',
+                codigomediopago    = data['codigomediopago'],    # x redondeo
+                importeticket      = round(Decimal(data['importeticket']),2),
+                importeredondeo    = round(Decimal(data['importeredondeo']),2),
+                importetotalticket = round(Decimal(data['importetotalticket']),2),
+                codigomoneda       = data['codigomoneda']
+            )
+
+            pos_ticket['redondeoaltotal_tck'].append( llave_63 )
+            # mediosdepago_ticket[pos_ticket_id].append(llave_63)
+            mediosdepago_ticket[pos_ticket_id]['redondeos_tck'].append(llave_63)
+
+
+        elif llave == '68': # Entrega a domicilio  (se usa ADEMÁS para identificar el cliente.
+
+            #import ipdb;ipdb.set_trace()
+            # l68 = True
+
+            # OJO se usa para identificar al cliente en las cobranzas
+            # OJO Si se habilita cobranza "dentro del ticket" de compra esto no funcionará
+
+            if data.has_key('codigocliente'):
+                codigocliente = data['codigocliente'].strip()
+            else:
+                codigocliente = 'Sin codigo de cliente'
+                logging.info(" %s [ WARNING ] : %s " % (ns, codigocliente))
+
+            if data.has_key('nombrecliente'):
+                nombrecliente = "%s" % (data['nombrecliente'],)
+            else:
+                nombrecliente = 'Sin nombre de cliente'
+                logging.info(" %s [ WARNING ] : %s " % (ns, nombrecliente))
+
+            llave68 = dict(codigocliente = codigocliente, nombrecliente = nombrecliente)
+
+            if len(linea_cobza):
+                for id_ticket, importecobranza, codserviciopagado in linea_cobza:
+                    if id_ticket == pos_ticket['name']:
+                        llave68.update( dict(
+                            codserviciopagado = codserviciopagado,
+                            importecobranza   = importecobranza
+                            )
+                        )
+                pos_ticket['cobranzas_tck'].append( llave68 )
+
+                linea_cobza = list()
+            else:
+                if llave68:
+                    pos_ticket['cobranzas_tck'].append( llave68 )
+                    pos_ticket['tipocabezal'] = 'ccc'
+                    pos_ticket['hay_cobza'] = True
+                    pos_ticket['descripcion_cab'] = 'Ticket de Cobranza'
+
+            #print llave68
+            # las líneas del ticket vienen ordenadas, si eso cambiara esto dejaría de funcionar.
+        elif llave == '81':
+            # Línea de devolución de pago de servicio (81)
+            #import ipdb;ipdb.set_trace()
+            # si la línea de devol cobranza no tiene código de servicio pagado, lo hardcodeamos
+            if data.has_key('codigo'):
+                if data['codigo'] is None:
+                    data['codigo'] = '0'
+            else:
+                data['codigo'] = '0'
+
+            data['codserviciopagado'] = data['codigo']
+
+            if data.has_key('importe'):
+                data['importecobranza'] = data['importe']
+            linea_cobza.append(
+                (pos_ticket['name'],
+                round(Decimal(data['importecobranza']),2),
+                data['codserviciopagado'],
+                data['codigosupervisora'],
+                )
+            )
+            pos_ticket['note'] +=  "\nReferencia: " + data['referencia'] + "Linea Cancelada: " + data['lineacancelada']
+            pos_ticket['tipocabezal'] = 'ccc'
+            pos_ticket['hay_cobza'] = True
+            pos_ticket['descripcion_cab'] = 'Devolución de Cobranza'
+            #import ipdb;ipdb.set_trace()
+
+        elif llave == '85':
+            # 'Pago de tarjeta offline'
+
+            llave_85 = dict(
+                    tipo_medio                            = 'tarjeta_off_line',
+                    codigomediopago                       = data['codigomediopago'],
+                    codigomoneda                          = data['codigomoneda'],
+                    totalmediopagomoneda                  = round(Decimal(data['totalmediopagomoneda']),2),
+                    totalmediopagomonedamonedareferencia  = round(Decimal(data['totalmediopagomonedamonedareferencia']),2),
+                    totalpagado                           = round(Decimal(data['totalpagado']),2),
+                    totalpagadomonedareferencia           = round(Decimal(data['totalpagadomonedareferencia']),2),
+                    cambio                                = round(Decimal(data['cambio']),2),
+                    tipooperacion                         = data['tipooperacion'],
+                    lineaultimopago                       = data['lineaultimopago'],
+                    numerotarjetacredito                  = data['numerotarjetacredito'],
+                    autorizasupervisora                   = data['autorizasupervisora'],
+                    codigosupervisora                     = data['codigosupervisora'],
+                    lineacancelada                        = data['lineacancelada']
+            )
+
+            pos_ticket['mediosdepago_tck'].append( llave_85 )
+            # mediosdepago_ticket[pos_ticket_id].append(llave_85)
+            mediosdepago_ticket[pos_ticket_id]['tarjetas_tck'].append(llave_85)
+
+
+        elif llave == '90':
+            # 'Pago ticket TAlimentos
+
+            llave_90 = dict(
+                  tipo_medio                            = 'ticket_alimentos',
+                  codigomediopago                       = data['codigomediopago'],
+                  codigomoneda                          = data['codigomoneda'],
+                  totalmediopagomoneda                  = round(Decimal(data['totalmediopagomoneda']),2),
+                  totalmediopagomonedamonedareferencia  = round(Decimal(data['totalmediopagomonedamonedareferencia']),2),
+                  totalpagado                           = round(Decimal(data['totalpagado']),2),
+                  totalpagadomonedareferencia           = round(Decimal(data['totalpagadomonedareferencia']),2),
+                  cambio                                = round(Decimal(data['cambio']),2),
+                  tipooperacion                         = data['tipooperacion'],
+                  lineaultimopago                       = data['lineaultimopago'],
+                  codigobarra                           = data['codigobarra'],
+                  modoingresocupon                      = data['modoingresocupon'],
+                  autorizasupervisora                   = data['autorizasupervisora'],
+                  codigosupervisora                     = data['codigosupervisora'],
+                  lineacancelada                        = data['lineacancelada']
+            )
+
+
+            pos_ticket['mediosdepago_tck'].append( llave_90 )
+            # mediosdepago_ticket[pos_ticket_id].append(llave_90)
+            mediosdepago_ticket[pos_ticket_id]['tarjetas_tck'].append(llave_90)
+
+
+        elif llave == '91':
+
+            # 'Pago con Tticket Total'
+
+            llave_91 = dict(
+                        tipo_medio                           = 'ticket_total',
+                        codigomediopago                      = data['codigomediopago'],
+                        codigomoneda                         = data['codigomoneda'],
+                        totalmediopagomoneda                 = round(Decimal(data['totalmediopagomoneda']),2),
+                        totalmediopagomonedamonedareferencia = round(Decimal(data['totalmediopagomonedamonedareferencia']),2),
+                        totalpagado                          = round(Decimal(data['totalpagado']),2),
+                        totalpagadomonedareferencia          = round(Decimal(data['totalpagadomonedareferencia']),2),
+                        cambio                               = round(Decimal(data['cambio']),2),
+                        tipooperacion                        = data['tipooperacion'],
+                        lineaultimopago                      = data['lineaultimopago'],
+                        codigobarra                          = data['codigobarra'],
+                        modoingresocupon                     = data['modoingresocupon'],
+                        autorizasupervisora                  = data['autorizasupervisora'],
+                        codigosupervisora                    = data['codigosupervisora'],
+                        lineacancelada                       = data['lineacancelada'],
+                        nombretarjeta                        = 'TICKET TOTAL'
+            )
+
+
+            pos_ticket['mediosdepago_tck'].append( llave_91 )
+            # mediosdepago_ticket[pos_ticket_id].append(llave_91)
+            mediosdepago_ticket[pos_ticket_id]['tarjetas_tck'].append(llave_91)
+
+
+        elif llave == '92': #no
+            # 'Emisión de factura'
+            pass
+
+
+
+
+        elif llave == '97': #no  tck_line
+            # 'Retiro'
+
+            tck_line.update(dict(
+                    cantidad       = 1.0,
+
+                    importe_siva   = round(Decimal(data['montoretiro']),2) * -1,
+                    importe_iva    = 0.0,
+                    importe_civa   = round(Decimal(data['montoretiro']),2) * -1,
+                    codigooriginal = '9-Retiros',
+                    codigoarticulo = '9-Retiros',
+                    nota = "Retiro de caja| codigomediopago : %s, codigomoneda : %s, montoretiro : %s " % \
+                           (data['codigomediopago'], data['codigomoneda'], data['montoretiro'])
+            ))
+            #pos_ticket['totalapagar'] += round(Decimal(data['montoretiro']),2) * -1
+
+        elif llave == '106': #no
+            # 'Cliente facturacion'
+            pass
+
+        elif llave == '109': #no
+            # Devolución gift card (109)                      109
+            pass
+
+        elif llave == '115': #no
+            # 'Pago descuento Iva Afam'
+            pass
+
+        elif llave == '117':
+            # Preventa
+            pass
+
+        elif llave == '118':
+            # Línea de ticket vale almuerzo (118)-SM
+            pass
+
+        elif llave == '119':
+            """
+            Línea de ticket pago vale almuerzo (119)-SM
+            ===========================================
+            Es identica a la línea de pago de efectivo (9) solo que se
+            distingue por el codigo medio de pago y moneda.
+
+            Línea de pago de ticket en efectivo (9).
+            ---------------------------------------
+
+            CodigoMedioPago # CodigoMoneda # TotalMedioPagoMoneda #
+                0                1                 2
+
+            TotalMedioPagoMonedaMonedaReferencia # TotalPagado #
+                        3                               4
+
+
+            TotalPagadoMonedaReferencia # Cambio # TipoOperacion # LineaUltimoPago #
+                        5                    6          7                8
+
+            AutorizaSupervisora # CodigoSupervisora # LineaCancelada
+                    9                    10                11
+
+            0. Código del medio de pago.
+            1. Código de la moneda.
+            2. Monto total de lo que se puede pagar con el medio de pago moneda.
+            3. Idem que el anterior pero expresado en la moneda de referencia.
+            4. Total entregado de ese medio de pago-moneda.
+            5. Total entregado expresado en la moneda de referencia.
+            6. Cambio de la línea de pago (valor >= 0.00)
+            7. Codigo de Operacion.
+                    0 - Si corresponde a una venta (los importes van en positivo).
+                    1 - Si corresponde a una devolución por parte del cliente (los
+                        importes van en negativo).
+            8. Ultimo pago.
+                    0 - No es la línea del último pago. Esto sucede cuando el ticket
+                        se paga con múltiples pagos (inclusive de distintos medios
+                        de pago-monedas) cuando el importe abonado es menor al
+                        total a pagar.
+                    1 - Es la línea del último pago.
+            9. Intervención supervisor.
+                    0 - Línea de pago sin intervención de supervisor.
+                    1 - Línea de pago autorizada por supervidor.
+            10. Código de la supervisora.
+            11. Estado de la línea de pago.
+                0-Línea de pago no cancelada.
+                1-Línea de pago cancelada.
+            """
+            try:
+
+
+                llave_119 = dict(
+                    tipo_medio                           = 'ticket_almuerzo',
+                    codigomediopago                      = data['codigomediopago'],
+                    codigomoneda                         = data['codigomoneda'],
+                    totalmediopagomoneda                 = round(Decimal(data['totalmediopagomoneda']),2),
+                    totalmediopagomonedamonedareferencia = round(Decimal(data['totalmediopagomonedamonedareferencia']),2),
+                    totalpagado                          = round(Decimal(data['totalpagado']),2),
+                    totalpagadomonedareferencia          = round(Decimal(data['totalpagadomonedareferencia']),2),
+                    cambio                               = round(Decimal(data['cambio']),2),
+                    tipooperacion                        = data['tipooperacion'],
+                    lineaultimopago                      = data['lineaultimopago'],
+                    autorizasupervisora                  = data['autorizasupervisora'],
+                    codigosupervisora                    = data['codigosupervisora'],
+                    lineacancelada                       = data['lineacancelada']
+                )
+
+
+
+                pos_ticket['mediosdepago_tck'].append( llave_119 )
+                #mediosdepago_ticket[pos_ticket_id].append(llave_119)
+                mediosdepago_ticket[pos_ticket_id]['tarjetas_tck'].append(llave_119)
+
+            except Exception as ex:
+                verbose = 1
+                msg = "[ERROR]: %s %s %s" % (ex, llave, pos_ticket['descripcion_cab'])
+                frame = insp.getframeinfo(insp.currentframe()) if verbose else False
+                excepcion(msg, frame, pos_ticket)
+
+
+        elif llave == '120':
+
+            # import ipdb;ipdb.set_trace()
+            pos_ticket['mides'] = data['ventamides'] + ' CI :' + data['ci']
+
+
+        elif llave == '121': #no
+            # 'Voucher retiro leche tarjeta Mides'
+            print data
+
+
+        elif llave == '123':
+            """
+                Línea de pago TACRE (123)-SM / (126) P4 (no CFE).
+                Representa la línea de pago por Tarjeta Ticket Alimentacion/Canasta/Restaurante de
+                forma electrónica.
+            """
+            try:
+
+                llave_123 = dict(
+                              tipo_medio                            = 'ticket_alim_electronico',
+                              codigomediopago                       = data['codigomediopago'],
+                              codigomoneda                          = data['codigomoneda'],
+                              totalmediopagomoneda                  = round(Decimal(data['totalmediopagomoneda']),2),
+                              totalmediopagomonedamonedareferencia  = round(Decimal(data['totalmediopagomonedamonedareferencia']),2),
+                              totalpagado                           = round(Decimal(data['totalpagado']),2),
+                              totalpagadomonedareferencia           = round(Decimal(data['totalpagadomonedareferencia']),2),
+                              cambio                                = round(Decimal(data['cambio']),2),
+                              tipooperacion                         = data['tipooperacion'],
+                              lineaultimopago                       = data['lineaultimopago'],
+                              # numerotarjeta                        = data['numerotarjeta'],
+                              numerotarjetacredito                  = data['numerotarjeta'],
+                              # numeroautorizacion                   = data['numeroautorizacion'],
+                              numeroautorizaciontarjetacredito      = data['numeroautorizacion'],
+                              autorizasupervisora                   = data['autorizasupervisora'],
+                              codigosupervisora                     = data['codigosupervisora'],
+                              lineacancelada                        = data['lineacancelada'],
+                              siaplicaleydesciva                    = data['siaplicaleydesciva'],
+                              montodescuentoleyiva                  = data['montodescuentoleyiva'],
+                              textoley                              = data['textoley'],
+                )
+                tacre123_id = data['numerotarjeta']+data['numeroautorizacion']
+
+
+                pos_ticket['mediosdepago_tck'].append( llave_123 )
+                # mediosdepago_ticket[pos_ticket_id].append(llave_123)
+
+
+            except Exception as ex:
+                verbose = 1
+                msg = "[ERROR]: %s %s %s" % (ex, llave, pos_ticket['descripcion_cab'])
+                frame = insp.getframeinfo(insp.currentframe()) if verbose else False
+                excepcion(msg, frame, pos_ticket)
+
+
+        elif llave == '124':
+
+
+            # Línea de voucher de la tarjeta TACRE   SODEXO/EDENRED/RADPAGOS ALIMENTOS
+
+            """
+                Línea de voucher de la tarjeta TACRE (124)-SM
+                =============================================
+
+                Muestran la información de un Voucher de pago por Tarjeta Ticket
+                Alimentacion/Canasta/Restaurante de forma electronica.
+
+                 0. NumeroTarjeta    -> Número de la tarjeta.
+                 1. Vencimiento      -> Vencimiento de la tarjeta (aamm).
+                 2. Comprobante      -> Número de comprobante.
+                 3. Autorizacion     -> Número de autorización.
+                 4. CodigoTerminal   -> Código de la terminal asociado.
+                 5. CodigoComercio   -> Código de comercio asociado.
+
+                    0               1             2             3               4
+               NumeroTarjeta # Vencimiento # Comprobante # Autorizacion # CodigoTerminal #
+                    5                   6             7          8                9
+               CodigoComercio # TipoAutorizacion # NroLote # CodigoMoneda # TipoTransaccion #
+                   10            11                 12             13           14
+               TipoVoucher # ImportePago # FechaTransacccion # CodigoCaja # CodigoCajera #
+                    15                  16             17            18
+               NombrePropietario # TipoIngreso # DescuentaIva # SiAplicaLeyDescIva #
+                        19                 20                21          22               23
+               MontoDescuentoLeyIva # MontoFactura # MontoGravado # NombreTarjeta # FlagImprimeFirma
+                  
+            """   #########################         llave == '124'
+            tipo = ''
+            #import ipdb;ipdb.set_trace()
+            if data['tipovoucher'] == "1": # solo copia establecimiento
+
+                if data['nombretarjeta'] == 'SODEXO':
+                    tipo = '11'
+
+                elif data['nombretarjeta'] == 'EDENRED':
+                    tipo = '12'
+
+                elif data['nombretarjeta'] == 'REDPAGOS ALIMENTOS':
+                    tipo = '002'
+
+                llave_124 = {
+                            'tipo_medio'          : 'ticket_alim_electronico' + '|' + tipo,
+                            'numerotarjeta'       : data['numerotarjeta'],
+                            'vencimiento'         : data['vencimiento'],
+                            'comprobante'         : data['comprobante'],
+                            'autorizacion'        : data['autorizacion'],
+                            'codigoterminal'      : data['codigoterminal'],
+                            'codigocomercio'      : data['codigocomercio'],
+                            'tipoautorizacion'    : data['tipoautorizacion'],
+                            'nrolote'             : data['nrolote'],
+                            'codigomoneda'        : data['codigomoneda'],
+                            'tipotransaccion'     : data['tipotransaccion'],
+                            'tipovoucher'         : data['tipovoucher'],
+                            'importepago'         : round(Decimal(data['importepago']),2),
+                            'fechatransaccion'    : data['fechatransaccion'],
+                            'codigocaja'          : data['codigocaja'],
+                            'codigocajera'        : data['codigocajera'],
+                            'nombrepropietario'   : data['nombrepropietario'],
+                            'tipoingreso'         : data['tipoingreso'],
+                            #'descuentaiva'        : data['descuentaiva'],
+                            'descuentaivarestaurante': data['descuentaiva'],
+                            'siaplicaleydesciva'  : data['siaplicaleydesciva'],
+                            'montodescuentoleyiva': round(Decimal(data['montodescuentoleyiva']),2),
+                            #'montofactura'        : round(Decimal(data['montofactura']),2),
+                            'montoticket'         : round(Decimal(data['montofactura']),2),
+                            'montogravado'        : round(Decimal(data['montogravado']),2),
+                            #'nombretarjeta'       : data['nombretarjeta'],
+                            'nombreemisortarjeta' : data['nombretarjeta'],
+                            'flagimprimefirma'    : data['flagimprimefirma'],
+
+                }
+
+                tacre124_id = (data['numerotarjeta']+data['autorizacion'], data['nombretarjeta'])
+                # print tacre124_id[0], tacre124_id, tacre124_id[1]
+                if tacre123_id and tacre123_id == tacre124_id[0]:
+                    # import ipdb; ipdb.set_trace()
+
+                    if llave_123.has_key('numerotarjetacredito') and llave_123.has_key('numeroautorizaciontarjetacredito'):
+                            if llave_123['numerotarjetacredito'] == data['numerotarjeta'] and \
+                                    llave_123['numeroautorizaciontarjetacredito'] == data['autorizacion']:
+                                llave_124['tipotarjetacredito'] = tipo
+
+                pos_ticket['vouchertar_tck'].append(llave_124)
+                mediosdepago_ticket[pos_ticket_id]['tarjetas_tck'].append(llave_124)
+                del llave_123
+
+
+        elif llave == '125':
+            pass
+
+
+        elif llave == '126':
+            # Línea de ticket de cliente de cuenta corriente  (126)-SM.
+            # Datos de indetificación cliente
+            # identificación / monto para auxiliar
+            # 'Cliente de cuenta corriente SM' (cuando compra)  Línea de ticket de cliente de cuenta corriente (99)-P4 / (126)-SM.
+
+            pos_ticket['cuentas_tck'].append(dict( codigocc    = data['codigocc'].strip() or 'no-codecc',
+                                                   nombrecc    = data['nombrecc'] or 'no-namecc',
+                                                   montopagocc = data['montopagocc'] or 0.0
+            ))
+
+
+        elif llave == '127':
+            # Medio de pago Cuenta Corriente 127
+
+            '''
+            Línea de pago cuenta corriente (104)-P4 / (127)-SM
+            Especificacion de la línea de ticket del pago de clientes de cuenta corriente.
+            Es igual a la línea de pago en efectivo (9), solo que se refiere al codigo de medio de
+            pago cuenta corriente y moneda pesos.
+            Ejemplo:
+            Pago de medio de pago cuenta corriente (19) efectivo (1) por 213.00.
+            L#9#104#162055#19#1#213.00#213.00#213.00#213.00#0.00#0#1#0##0  '''
+
+
+
+            llave_127 = dict(
+
+                tipo_medio                            = 'cuenta',
+                codigomediopago                       = data['codigomediopago'],
+                codigomoneda                          = data['codigomoneda'],
+                totalmediopagomoneda                  = round(Decimal(data['totalmediopagomoneda']),2),
+                totalmediopagomonedamonedareferencia  = round(Decimal(data['totalmediopagomonedamonedareferencia']),2),
+                totalpagado                           = round(Decimal(data['totalpagado']),2),
+                totalpagadomonedareferencia           = round(Decimal(data['totalpagadomonedareferencia']),2),
+                cambio                                = round(Decimal(data['cambio']),2),
+                tipooperacion                         = data['tipooperacion'],
+                lineaultimopago                       = data['lineaultimopago'],
+                autorizasupervisora                   = data['autorizasupervisora'],
+                codigosupervisora                     = data['codigosupervisora'],
+                lineacancelada                        = data['lineacancelada']
+            )
+            if pos_ticket['cuentas_tck']:
+                llave_127.update(pos_ticket['cuentas_tck'][0])
+            else:
+                llave_127.update( dict(codigocc      = 'compra_cta_sin_numero', nombrecc      = 'compra_cta_sin_nombre',
+                                      montopagocc   = 0.001 ))
+
+            pos_ticket['mediosdepago_tck'].append( llave_127 )
+            #mediosdepago_ticket[pos_ticket_id].append(llave_127)
+            mediosdepago_ticket[pos_ticket_id]['cuentas_tck'].append(llave_127)
+
+        elif llave == '128':
+            # 'Pago de ticket en Dev.Envases.'
+
+            llave_128 = dict(
+                tipo_medio              = 'dev_envase',
+                codigomediopago         = data['codigomediopago'],
+                codigomoneda            = data['codigomoneda'],
+                totalmediopagomoneda    = round(Decimal(data['totalmediopagomoneda']),2),
+                totalmediopagomonedamonedareferencia = round(Decimal(data['totalmediopagomonedamonedareferencia']),2),
+                totalpagadomonedareferencia          = round(Decimal(data['totalpagadomonedareferencia']),2),
+                totalpagado             = round(Decimal(data['totalpagado']),2),
+                cambio                  = round(Decimal(data['cambio']),2),
+                tipooperacion           = data['tipooperacion'],
+                lineaultimopago         = data['lineaultimopago'],
+                autorizasupervisora     = data['autorizasupervisora'],
+                codigosupervisora       = data['codigosupervisora'],
+                lineacancelada          = data['lineacancelada']
+            )
+            print 'Mpago Envase 128 ->', llave_128
+
+            pos_ticket['mediosdepago_tck'].append( llave_128 )
+            #mediosdepago_ticket[pos_ticket_id].append(llave_128)
+            mediosdepago_ticket[pos_ticket_id]['devenvases_tck'].append(llave_128)
+
+        if llave in config.linea_linea and tck_line:
+            lineas_ticket.append(tck_line)
+
+    mediosdepago_ticket[pos_ticket_id]['mediosdepago_tck']  =  pos_ticket['mediosdepago_tck']
+    pos_ticket['medios_pago'] = mediosdepago_ticket
+
+    print("\n+++++++++ antes \n { %s : " % (pos_ticket_id,))
+    for med in  [ 'mediosdepago_tck',  'cobranzas_tck', 'cuentas_tck',  'vouchertar_tck', 'redondeoaltotal_tck' ]:
+        if len(pos_ticket[med]):
+            print med, ': ', pos_ticket[med],', \n'
+    print '\n'
+
+    print '\n==== ahora \n'
+    for  medio in [ 'cuentas_tck', 'redondeos_tck', 'tarjetas_tck', 'cheques_tck', 'devenvases_tck',
+                    'efectivo_tck', 'puntos_tck' ]:
+        if len(mediosdepago_ticket[pos_ticket_id][medio]):
+            print medio, mediosdepago_ticket[pos_ticket_id][medio],',\n'
+    print '\n'
+    if 'pie_cfe' in locals() and len(pie_cfe)>0:
+        pos_ticket['cfe_tck'].append(pie_cfe)
+    #    del pie_cfe
+    #if 'cab_cfe' in locals():
+    #    pos_ticket['cfe_tck'].append(cab_cfe)
+    #    del cab_cfe
+
+    #if l47 or l68:
+    #    print(pos_ticket['cobranzas_tck'])
+    #if pos_ticket['numerotck']==130217 and pos_ticket['codigocaja'] == 1:
+    #    import ipdb; ipdb.set_trace()
+    #        #pass
+    """print "\t ENTRA +=="
+    for kv in pos_ticket['mediosdepago_tck']:
+        print "\tmediosdepago_tck %s" % (kv,)
+    print "\n pos ^   medio v \n"
+    for it in mediosdepago_ticket[pos_ticket_id]:
+        print "\tmediosdepago_ticket: %s" % (it,)
+    # antes de irte verificá los el cierre
+    print "\t SALE =======================" """
+    return lineas_ticket
+
+
+def erp_product_id(cod):
+    res = {}
+    try:
+        prod_id = op_conn.sock_execute('product.template', 'search', [('cod_sto', '=', cod)])
+        if prod_id:
+            res[cod] = prod_id[0]
+        else:
+            ean_id = op_conn.sock_execute('product.ean13', 'search', [('name', '=', cod)])
+            if ean_id:
+                product = op_conn.sock_execute('product.ean13', 'read', [ean_id])
+                if product:
+                    res[cod] = product[0]['product_id'][0]
+    except:
+        import ipdb;ipdb.set_trace()
+    return res
+
+def main():
+
+    """
+    :return: crea los archivo/s .json "tckAAAADDMM.json"
+
+        Procesa informes de salida de los POS, filtra movimientos
+        según criterios configurables, serializa la salida en
+        estructuras `json` que escribe en un archivo.
+
+        1. lee el directorio de salidapazos
+        2. prepara la lista de archivos salidapazos a procesar
+        3. lee los informes del filesystem
+        4. procesa cada informe salidapazos
+        5. crea archivos json correspondientes a cada informe
+        6. marca los informes procesaros en "/admi/pazos4/.sqlite3.db"
+
+        Los archivos json tiene la forma:
+
+        salida = [
+            ({lineas_cabezal},{lineas_detalle}),
+            ({lineas_cabezal},{lineas_detalle}),
+            ({lineas_cabezal},{lineas_detalle})
+        ]
+    """
+
+    #ipdb.set_trace()
+    # ####  1. 2.
+    infofile = to_json()
+    # print len(infofile)
+
+    if not infofile:
+        msg =  '::No hay informes sin procesar!'
+        logging.warn( " %s [ Warninig ] : %s " % (ns, msg) )
+        sys.exit(0)
+
+    for i in infofile:
+        fecha = get_date(i)        # es la fecha en que pazos4 emitió el informe.
+
+        # ####  3.
+
+        informe = otck(i).leer_informe()  # levanta Salidapazos_nuevo (csv) y crea un diccionario
+
+        # ####  4.
+        #import ipdb;ipdb.set_trace()
+        cntctk, tcks_del_dia = passtck(informe)
+        _date = "%s-%s-%s" % (fecha[0:4], fecha[4:6], fecha[6:8])
+        print _date,',', cntctk
+
+        # #### 5.
+        json_file = "%stck%s.json" % (oPath,fecha,)
+        try:
+            with open(json_file, 'w') as fp:
+                json.dump(tcks_del_dia, fp, separators=(',', ': '), indent=3)
+
+            # #### 6.
+            json_done(i,fecha,json_file)
+            logging.info(" %s [ Info ] %s generado ok " % (ns,fecha))
+        except Exception as escritura:
+            logging.error( " %s [ Error ] : %s Imposible escribir el informe" % (ns, escritura) )
+
+if __name__ == '__main__':
+    main()
+    """
+    json_fil = "/tmp/llave124.json"
+    try:
+        with open(json_fil, 'w') as fp:
+            json.dump(LLAVE124, fp, separators=(',', ': '), indent=3)
+    except Exception as escritura:
+        logging.error( " %s [ Error ] : %s Imposible escribir el informe" % (ns, escritura) )
+    """
diff --git a/opentck3/openxmlrpc.py b/opentck3/openxmlrpc.py
new file mode 100644 (file)
index 0000000..0343aef
--- /dev/null
@@ -0,0 +1,19 @@
+# coding: utf-8
+import xmlrpclib
+
+class OpenConn:
+    def __init__(self, settings):
+        self.hostname = settings['hostname']
+        self.port = settings['port']
+        self.database = settings['database']
+        self.username = settings['username']
+        self.password = settings['password']
+
+        sock_common = xmlrpclib.ServerProxy('http://%s:%s/xmlrpc/common' % (self.hostname, self.port))
+        self.uid = sock_common.login(self.database, self.username, self.password)
+
+        self.sock = xmlrpclib.ServerProxy('http://%s:%s/xmlrpc/object' % (self.hostname, self.port))
+
+    def sock_execute(self, model_name, action, *args):
+        #print "xmlrpc  : ",model_name, action, args
+        return self.sock.execute(self.database, self.uid, self.password, model_name, action, *args)
diff --git a/opentck3/sp2py.py b/opentck3/sp2py.py
new file mode 100755 (executable)
index 0000000..319d49e
--- /dev/null
@@ -0,0 +1,1096 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+__licence__ = "GNU/GPLv3"
+__author__ = "Marcelo Zunino (InfoPrimo SL) 2015-2017"
+
+
+# from time import strftime
+import sys
+import os
+import logging
+import csv
+import json
+import spn2json_chk
+from decimal import Decimal
+from util import config
+from datetime import datetime
+from ip_ticket.ticket import IPCabezal, IPLinea
+from get_spn import get_date
+
+from openxmlrpc import OpenConn
+settings = {
+    'hostname': 'localhost',
+    'port': 8069,
+    'database': 'zunicero',
+    'username': 'admin',
+    'password': 'fadmin',
+}
+op_conn = OpenConn(settings)
+
+
+
+#  ._.                 ._.             ._.              ._.
+#  |.|                 |.|             |.|              |.|
+#  |.|__. .__._._.__.__|.| ___.___. .__|.|.___..__._..__|.|.__.  .__.
+#  |.'_.\./._`.|.'__/._`.|/.__/._.\./._`.|/._.\/._`.|/._`.|/._`./.__|
+#  |.| |.|.(_|.|.|.| (_|.|.(_|.(_).|.(_|.|..__/.(_|.|.(_|.|.(_|.\__.\.
+#  |_| |_|\__,_|_|  \__,_|\___\___/ \__,_|\___|\__,_|\__,_|\__,_|___/
+#  sucursal = '01' |  if llave == '47':  linea = {'codigoarticulo' : '999'} para cobranzas
+
+ns     = 'opentck2'
+oPath  = config.oPath
+sucursal = '01'
+
+logfile = './log/opentck2.log'
+os.path.isdir('./log') or os.mkdir('./log')
+os.path.isfile(logfile) or os.system("touch %s" % logfile)
+
+logging.basicConfig(format='%(asctime)s %(message)s', filename=logfile, level=logging.INFO)
+
+# solo para debugging
+# from inspect import currentframe, getframeinfo
+
+
+class Excepcion(object):
+
+    stdout_err = 1  # `stdout_err = 1` mostrará errores en stdout
+    verbose    = 1  # `verbose = 1`    mostrará detalles del error
+    debug_log  = 0  # `debug = 1`      escribe detalles en el log
+    debug_vivo = 1  # `debug_vivo = 1` abre consola de debug en el error
+
+    def excep(self, mensaje, frame=None, id_ticket=None):
+        """ logging / notificación a stdout """
+        msg = mensaje or " algo salió mal... "
+        msgv = ''
+
+        if self.stdout_err and msg:
+            print("\t %s" % (msg,))
+        if self.verbose and frame and id_ticket:
+            msgv  = "aaaammdd cja tck: %s" % (id_ticket,)
+            msgv += " en: %s  lín: %s" % (frame.filename, frame.lineno)
+            print("\t %s" % (msgv,))
+        if self.debug_log:
+            msg += msgv
+        msg += " fin ejecución..."
+        if self.debug_vivo:
+            import ipdb; ipdb.set_trace()
+        return sys.exit(1)
+
+excepcion = Excepcion()
+
+
+def msgout(msg=None):
+    msg = msg or "\n\tAlgo salio mal... FIN\n"
+    sys.stdout.write(msg,)
+
+
+def rell(rawcode=None, largo=6):
+    if not rawcode:
+        return '0'*largo
+    else:
+        return (largo - len(str(rawcode)))*'0' + str(rawcode)
+
+
+def leer_informe(salidapazos=None):
+
+
+    """
+        :param salidapazos: string: camino y nombre del archivo Salidapazos_nuevo
+        retorna: diccionario:
+
+                { cabezal_tck0: linea_tck_pazos0, cabezal_tck1: linea_tck_pazos1, ... }
+
+        A partir de un archivo `csv` conteniendo los datos de un lote de tickets,
+        esta rutina recontruye los tickets del lote en un diccionario python.
+        Cada elemento del diccionario representa a un ticket.
+
+        La *llave* del elemento ticket es una tupla conformada por los valores
+        de los campos posicionales de la línea de cabezal de ticket (lineas "C").
+
+        El *valor* correspondiente a dicha llave será la lista (array) que alberga
+        al conjunto de líneas de detalle del ticket. Cada elemento de está lista
+        será a su vez, un tupla conteniendo los valores de los campos posicionales
+        de una línea de detalle de ticket (lineas "C").
+
+        Ejemplo de diccionario de tickets:
+
+        sp = {
+               Cabezal_Tck0: [ LinTck0_0, LinTck0_1, LinTck0_2, ..., LinTck0_N ],
+               Cabezal_Tck1: [ LinTck1_0, LinTck1_1, LinTck1_2, ..., LinTck1_N ],
+               ...
+               Cabezal_TckN: [ LinTckN_0, LinTckN_1, LinTckN_2, ..., LinTckN_N ]
+             }
+
+        donde:
+
+            Llave: Cabezal_Tck1
+            Valor: [ LinTck1_0, LinTck1_1, LinTck1_2, ..., LinTck1_N ]
+
+        Ejemplo:
+
+        Dada la línea de cabezal: C#1#2#350#2#20151121105326#F#4#183.40#20#13
+        Cabezal_Tck1 = ('1', '2', '350', '2', '20151121105326', 'F', '4', '183.40', '20', '13')
+
+        Dada la línea de detalle: L#4#53#120435#TICKET DE VENTA#0
+        LinTckN_2 = ('4', '53', '120435', 'TICKET DE VENTA', '0')
+
+        En ambos casos se omite el identificador de línea.
+
+    """
+
+    salidapazos = salidapazos or None
+    if not salidapazos:
+        msgout("\n\n\t\t\t\t\t   Verificar ingreso ... %s" % ('\n\n',))
+        sys.exit(0)
+    key = None
+    informe = {}
+    info_line = 0
+
+    with open(salidapazos, 'r') as f:
+        reader = csv.reader(f, delimiter='#')
+        for row in reader:
+            info_line += 1   # sólo para sber dónde se corta, si es que se corta.
+            if row[0] == 'C':
+                key = tuple(row[1:]) # llave = línea de cabezal sin el primer caracter, o sea in la "C"
+                informe[key] = []
+            elif row[0] == 'L' and row[2] == '20': # L#18#20#
+                informe[key].append(tuple(row[1:])) # valores = líneas de detalle de ticket sin la "L"
+            else:
+                continue 
+    if not informe:
+        msg  = " %s [ Error ] : Ocurrió un error al leer informe. " % (ns,)
+        msg += "Verificar %s. No se generó el archivo .json" % (salidapazos,)
+        msgout(msg)
+        logging.info(msg)
+        sys.exit(0)
+    return informe
+
+def do_cabezales(cabezal,lineas):
+
+    return True
+    # instancias de cabezal y lineas
+
+def passtck(tickets):
+    """
+    tickets = { cabezal_Ticket0: [ lineaTicket0_0, lineaTicket0_1, lineaTicket0_2, lineaTicket0_N ],
+                cabezal_Ticket1: [ lineaTicket1_0, ... ],
+                cabezal_TicketN: [ lineaTicketN_0, ....]
+        }
+
+
+    Recibe los tickets del informe y parsea aquellos definidos en la configuración como `cabezales de interés`.
+        1. Instancia la clase `IPCabezal` con los datos de cabezal disponibles.
+           Algunos datos pueden ser obtenidos en el parseo de líneas.
+        2. Arma una lista con las líneas del ticket definidas como `lineas de interés` en la configuración.
+        3. Con cada ticket invoca al parser de líneas pasándole (cabezal, líneas) como parámetros.
+
+    :param tickets: dict : todos los tickets del informe
+    :return: tcks_del_dia: lista de tuplas [(cant_movimientos, tickets_del_dia), (,)...]
+    """
+    #import ipdb;ipdb.set_trace()
+
+    cabezales_pazos = tickets.keys()
+    tickets_procesados = 0
+
+    # pos_ticket_id = linea_tck_pazos_id = None
+    tcks_del_dia = list()
+    for cabezal_pazos in cabezales_pazos:
+        if cabezal_pazos[0] not in config.cabezales_interes.keys(): # saltear tickets que no interesan. solo lee venta/cobr, devol, ndcr
+            continue
+        C = IPCabezal(list(cabezal_pazos)) # print C.ticket, C.caja ,  C.timestamp
+        # :debug: reemplazar numero de ticket y nro. de caja
+        #  if C.ticket == 84174 and C.caja == 1:  import ipdb;ipdb.set_trace()
+
+        C.pos_ticket = dict(
+                name            = C.id_ticket,
+                sucursal_id     = sucursal,
+                tipocabezal     = C.llave,
+                descripcion_cab = C.descripcion,
+                timestamptck    = datetime.strptime(C.timestamp, "%Y%m%d%H%M%S").strftime('%Y-%m-%d %H:%M:%S'),
+                codigocaja      = int(C.caja),
+                numerotck       = int(C.ticket),
+                codigocajera    = C.nro_cajera,
+                date            = C.yyyy + '-' + C.mm + '-' + C.dd,
+                estadotck       = C.estado,
+                cantarticulos   = int(C.cant_articulos),
+                totalapagar     = round( Decimal(C.totalapagar), 2),
+                tipocliente     = C.tipo_de_cliente,
+                cantidadlineas  = int(C.cant_lineas),
+        ) # en el volcado de datos a un ERP deberá redefinirse el concepto de cabzal de ticket
+
+        # se leen todas las líneas antes de confirmar el cabezal, dado que existen líneas pueden contener información relevnte para el cabezal.
+        if C.llave in ('8', '10','18'):  # saltear otros tickets que no interesan: 8 Linea Cajera (entrea-sale-pausa), 10 Pago, 18 Retiros
+            do_cabezales(C,tickets[cabezal_pazos]) # pocesar aparte (ahora por no hace nada, solo los saltea)
+            continue
+        lineas_tck_pazos = []
+        for linea in tickets[cabezal_pazos]:
+            # es la llave en la instancia del objeto ticket
+            if linea[1] not in config.lineas_interes.keys(): #
+                continue
+            lineas_tck_pazos.append(linea)
+        # print("llave: %s tst: %s  caja: %s  ticket: %s" % (C.llave, ttst14, caja, ticket))
+        # si hay tickets con líneas.
+        if isinstance(C, IPCabezal) and len(lineas_tck_pazos):
+            try:
+                lineas_ticket = parse_lines(C.pos_ticket, lineas_tck_pazos, C.estado, C.timestamp)
+
+                tcks_del_dia.append((C.pos_ticket, lineas_ticket))
+
+                if   C.pos_ticket['tipocabezal'] == '1' and C.pos_ticket.has_key('tipo_de_ticket_descrip'):   # venta
+                    tickets_procesados += 1
+                    #print '%s ' %  (tickets_procesados,),
+                elif C.pos_ticket['tipocabezal'] in ('3', '16') and C.pos_ticket.has_key('tipo_de_ticket_descrip'):  # devolución
+                    tickets_procesados -= 1
+                    #print '\n\t devol : %s %s %s' %  (tickets_procesados, C.pos_ticket['tipocabezal'], C.pos_ticket['tipo_de_ticket_descrip']),
+            #mzs
+            except Exception as err_msg:
+
+                msg = "[ERROR]: Error al parsear: %s %s %s" % (err_msg, C.llave, C.descripcion)
+                print(msg)
+                import ipdb;ipdb.set_trace()
+
+        else:
+            msg = " %s Ticket informado con errores %s Ver Salidapazos." % (ns, C.timestamp + C.caja + C.ticket)
+            logging.warn(msg)
+
+    return tickets_procesados, tcks_del_dia
+
+
+
+def parse_lines(pos_ticket, lineas_tck_pazos, estado_tck, ttimestamp):
+    """
+        Recibe un cabezal de ticket y una lista de líneas de ticket.
+        Instancia un objeto de la clase `IPLinea`
+        Devuelve un diccionario (cabezal y líneas) del modelo en openerp.
+
+        Una particularidad de las líneas de Salidapazos es practicamente en la totalidad
+        de los tickets es que estas contienen datos típicos de cabezal que deben ser
+        extraídos y transformados en líneas de tipo cabezal. (medio de pago, cliente,
+        Id de la cajera, etc.)
+
+        Un ticket puede dar lugar a varios objetos de tipo cabezal diferentes.
+
+        Por ejemplo, en un ticket el nombre del cliente no es un dato frecuente.
+        No obstante si Salidapazos debe consignar un cliente específico, creará una
+        *línea* de detalle de ticket. Estos datos afectan a todas las líneas
+        del ticket. Por tal motivo, a nivel del ERP el objeto que los represente deberá
+        soportar una relación con una entidad o agente específico. Esta relación se
+        debe establlecer a partir del cabezal del ticket en el ERP.
+
+        Similar tratamiento llevan todos los tickets de venta o ingresos en lo que
+        refiere a los datos del medio o los medios de pago afectados a estos tickets.
+        Es decir, el detalle del medio de pago siempre es una *línea* del ticket en
+        Salidpazos. En cambio será un elemento del cabezal en el ERP.
+
+        Las razones de este tipo de estructura en Salidapazos... bueno se supone que
+        la expansión de funcionalidades que los POS son capaces de realizar ha
+        comprometido consecuentemente los diseños y estructuras subyasentes, constreñídas
+        por la necesidad de asegurar compatibilidad con stock muy diverso de aplicaciones
+        consumidoras de estos datos.
+
+        En la actualidad son tantas las variantes que puede tener un ticket que sus
+        cabezales deberían ser enormes para representar todos los tipos de tickets
+        posibles. Hay que admitirlo, la formalización de estas estructuras de datos
+        presenta desafíos muy interesantes,
+
+        La dificultad mayor radica en el parseo de las lineas de detalle del ticket.
+
+
+        nota de diseño, 29/11/17:
+            Además de deserializar los CSV de Salidapazos, extrar los datos significativos,
+            esta rutina clasifica, tranforma y/o megea las líneas que contengan datos de
+            cabezal, creando incluso nuevas líneas de cabezal de ticket.
+
+            Considerando todos los tipos de líneas posibles, las líneas que contienen
+            datos de *cabezal* abarcan un amplio conjunto de tipos de líneas de detalle de
+            ticket diferetes.
+            En tando para las líneas que contienen datos típicos de *línea*, alcanza con tres
+            o cuatro tipos diferentes de líneas de detalle de ticket. Por este motivo el
+            parseo de líneas se vuelve más y más complejo a medida que se incorporan nuevas
+            necesidades para atender análisis de datos gerenciales.
+
+            Una posibilidad de reducir la complejidad, sería quitar las tareas de modificación,
+            mergeo y creación de líneas de cabezal, dejando que las líneas sean simplemente
+            parseadas simplemente, sin modificar su  estructura del ticket.
+
+            El resto de las tareas quedarían en otro método específico.
+
+            Finalmente serían creados los obetos python a ser serializados en json.
+    """
+    tck = pos_ticket
+    lineas_ticket = list()
+    #if  pos_ticket['numerotck'] == 53920 and pos_ticket['codigocaja'] == 1:
+    #    import ipdb; ipdb.set_trace()
+    #    print 'hola'
+
+    # sea agrega una clave por cada uno de los tipos de línea que pasan a cabezal
+    pos_ticket['mediosdepago_tck']    = list()
+    pos_ticket['cobranzas_tck']       = list()
+    pos_ticket['cuentas_tck']         = list()
+    pos_ticket['vouchertar_tck']      = list()
+    pos_ticket['redondeoaltotal_tck'] = list()
+    pos_ticket['cfe_tck']             = list()
+
+    linea_cobza = list()
+
+    #if ttimestamp == '20171201194203':  # es cabezal_pazos[4] o C.timestamp
+    #if pos_ticket['numerotck'] == 84174 and pos_ticket.caja == 1:
+    #    import ipdb;ipdb.set_trace()
+    l47 = l68 = False
+    for linea in lineas_tck_pazos:
+        lin = IPLinea(linea, pos_ticket['name'])    # ticket_id
+        llave = lin.llave
+        data = lin.metodo()
+
+        # Datos comunes en todos los tipos de líneas
+        tck_line = dict(
+            name            = lin.id_linea,
+            numerodelinea   = lin.numerodelinea,
+            tipolinea       = llave,
+            descripcion_lin = lin.descripcion,
+            hora            = lin.hora,
+            codigoarticulo  = 'codigo art.',
+            nota            = '',
+        )
+
+        if   llave == '1':
+            # 'Venta de ítem'
+            # Los calculos extraen los montos finales de venta
+            importe_iva  = Decimal(data['ivadescuentototal'])
+            importe_siva = Decimal(data['preciodescuentototal'])
+            importe_civa = importe_siva + importe_iva
+            cantidad     = Decimal(data['cantidad'])
+            punit_siniva = importe_siva / cantidad
+            punit_coniva = importe_civa / cantidad
+
+            if not data['codigoarticulo']:
+                print "\tSIN INTERNO va original"
+                if not data['codigoarticulooriginal']:
+                    #data['codigoarticulo'] = data['codigoarticulooriginal']
+                    #else:
+                    print "\tSIN CODIGO!!!"
+                    raise Exception("\tsin código!\n")
+
+            tck_line.update(dict(
+                codigoiva           = data['codigoiva'],
+                cantidad            = round(cantidad,2),
+                lineacancelada      = int(data['lineacancelada']),
+                modoingreso         = data['modoingreso'],
+                codigoarticulo      = data['codigoarticulo']  or data['codigoarticulooriginal'],
+                codigooriginal      = data['codigoarticulooriginal'],
+                estandem            = int(data['siestandem']),
+                preciounitario      = round(Decimal(data['preciounitario']),2),  # precio unitario "de lista" con iva sin dtos.
+                cantdescmanuales    = data['cantdescmanuales'],
+                importe_siva        = round(importe_siva,2),
+                importe_civa        = round(importe_civa,2),
+                importe_iva         = round(importe_iva,2),
+                punit_siniva        = round(punit_siniva,2),
+                punit_coniva        = round(punit_coniva,2),
+                # product_id          = erp_product_id(data['codigoarticulo']),
+
+            ))
+
+            # ivadescuentototal   =
+            # preciodescuentototal= ,
+            # codigovendedor    = data['codigovendedor'],
+            # talle             = data['talle'],
+            # color             = data['color'],
+            # marca             = data['marca'],
+            # modelo            = data['modelo'],
+            # siaplicadescfidel = data['siaplicadescfidel'],            # fidellización
+            # montorealdescfidel= float(data['montorealdescfidel']
+
+        elif llave == '4':
+            # 'Total del ticket (discrimina pago de servicios)'
+            pos_ticket['totalticket']                    = round(Decimal(data['totalticket']),2)
+            pos_ticket['totalticketsinpagoservicios']    = round(Decimal(data['totalticketsinpagoservicios']),2)
+            pos_ticket['ivatotalticket']                 = round(Decimal(data['ivatotalticket']),2)
+            pos_ticket['ivatotalticketsinpagoservicios'] = round(Decimal(data['ivatotalticketsinpagoservicios']),2)
+
+        elif llave == '5':
+            # Línea de cabezal CFE (5)
+            cab_cfe = dict(
+                tipocfe               = data['tipocfe'],
+                descripcioncfe        = data['descripcioncfe'],
+                seriecfe              = data['seriecfe'],
+                numerocfe             = data['numerocfe'],
+                tipodocumentoreceptor = data['tipodocumentoreceptor'],
+                documentoreceptor     = data['documentoreceptor'],
+                nombrereceptor        = data['nombrereceptor'],
+                direccionreceptor     = data['direccionreceptor'],
+                ciudadreceptor        = data['ciudadreceptor']
+            )
+
+        elif llave == '6':
+            # Pie de CFE
+
+            # pos_ticket['cfe_tck'].append( dict(
+            pie_cfe = dict(
+                cliente             = data['cliente'],
+                linkdgi             = data['linkdgi'],
+                tipocfe             = data['tipocfe'],
+                rucemisor           = data['rucemisor'],
+                numerocfe           = data['numerocfe'],
+                fechacfe            = data['fechacfe'],
+                montoneto           = data['montoneto'],
+                hash_cfe            = data['hash'],
+                codigocae           = data['codigocae'],
+                seriecfe            = data['seriecfe'],
+                nroiniciocae        = data['nroiniciocae'],
+                nrofincae           = data['nrofincae'],
+                fechavencimientocae = data['fechavencimientocae']
+            )
+
+        elif llave == '7':
+            # 'Identificación de la cajera'
+            # No tiene importancia conservarlo cómo línea de ticket
+            # alcanza con cargar el dato en el cabezal codigocajera
+            if pos_ticket['codigocajera'] != data['codigocajera']:
+                # NO COINCIDE CAJRA DE LINEA y CAJERA DE TICKET !!!!!
+                pos_ticket['codigocajera'] = data['codigocajera']
+                # print(data['codigocajera'], data['nombrecajera'], pos_ticket['codigocaja'], pos_ticket['numerotck'], pos_ticket['date'])
+                # print("Estado : %s" % (estado_tck,))
+                # import ipdb;ipdb.set_trace()
+            pos_ticket['nombrecajera'] = data['nombrecajera']
+
+
+        elif llave == '9':
+            # 'Pago de ticket en efectivo
+            #import ipdb;ipdb.set_trace()
+            pos_ticket['mediosdepago_tck'].append(dict(
+                codigomediopago                      = data['codigomediopago'],
+                codigomoneda                         = data['codigomoneda'],
+                totalmediopagomoneda                 = round(Decimal(data['totalmediopagomoneda']),2),
+                totalmediopagomonedamonedareferencia = round(Decimal(data['totalmediopagomonedamonedareferencia']),2),
+                totalpagado                          = round(Decimal(data['totalpagado']),2),
+                totalpagadomonedareferencia          = round(Decimal(data['totalpagadomonedareferencia']),2),
+                cambio                               = round(Decimal(data['cambio']),2),
+                tipooperacion                        = data['tipooperacion'],
+                lineaultimopago                      = data['lineaultimopago'],
+                autorizasupervisora                  = data['autorizasupervisora'],
+                codigosupervisora                    = data['codigosupervisora'],
+                lineacancelada                       = data['lineacancelada']
+            ))
+
+        elif llave == '12':
+            # 'Cancelación de Ítem'
+            codigo = cancela_tipo = ''
+            if data['indicadorartsubf'] == 'C':
+                cancela_tipo = "Cancela Cobranza"
+                nota = ( data['importe_cancelado'], data['nombresupervisora'])
+                tck_line.update( dict(  cancela_tipo = "Cancela Cobranza",
+                                        nota         = nota,))
+            else:
+                if data['indicadorartsubf'] == 'A':
+                    cancela_tipo = 'Cancela un articulo'
+                    codigo = data['codigoarticulo'] if data.has_key('codigoarticulo') else data['codigoarticulosubf']
+
+                elif data['indicadorartsubf'] == 'S':
+                    cancela_tipo = 'Cancela a subfamilia'
+                    codigo = data['codigoarticulosubf']
+
+                elif data['indicadorartsubf'] == 'T':
+                    cancela_tipo = 'Art. cancelado es un tandem'
+                    codigo = data['codigoarticulo'] if data.has_key('codigoarticulo') else data['codigoarticulosubf']
+
+                tck_line.update( dict(
+                    codigoarticulo    = codigo,
+                    cancela_tipo      = cancela_tipo,
+                    cantidad          = float(data['cantidad']) if data.has_key('cantidad') else 1.0,
+                    nrolineavta       = data['nrolineavta'],
+                    importe_civa      = float(data['importe_cancelado']),
+                    nota              = data['nombresupervisora'],
+                    # product_id        = erp_product_id(codigo)
+                ))  # codigovendedor = data['codigovendedor'],
+
+
+
+
+        elif llave == '20':
+            # 'Devolución de un ítem'
+
+            """
+                No discriminamos procesamos descuentos en las devoluciones 
+                preciodescuentototal    = data['preciodescuentototal']
+                ivadescuentototal       = data['ivadescuentototal']
+                preciodescuento         = data['preciodescuento']
+            """
+
+            if data['indicadorartsubf'] == 'S':
+                tck_line['nota'] = ' Devol. a subfamilia'
+                tck_line['codigoarticulo'] = data['codigoarticulosubf']
+
+            elif data['indicadorartsubf'] == 'A':
+                tck_line['nota'] = ' Devol. de artículo'
+                tck_line['codigoarticulo'] = data['codigoarticulosubf']
+
+            cantidad     = Decimal(data['cantidad'])
+            importe_iva  = Decimal(data['iva'])
+            importe_siva = Decimal(data['precio']) * cantidad
+            importe_civa = importe_siva + importe_iva
+
+            tck_line.update( dict(
+                cantidad       = round(cantidad,3),
+                importe_iva    = round(importe_iva ,2),
+                importe_siva   = round(importe_siva,2),
+                importe_civa   = round(importe_civa,2),
+
+                # supervisora    = data['codigosupervisora'],
+                codigooriginal = data['codigoarticulooriginal'],
+                lineacancelada = data['lineacancelada'],
+                modoingreso    = data['modoingreso'],
+                nota           = "Cod. Supervisor/a: " + data['codigosupervisora']
+                #codigovendedor = data['codigovendedor'],
+            ))  
+
+        elif llave == '24':  # no se lee
+            # 'Pertenece a ticket cancelado'
+            if data['texto']:
+                tck_line.update({'texto': data['texto']})
+
+        elif llave == '26':   # no se lee
+            # 'Cabezal de beneficio al total'
+            pass
+
+        elif llave == '27':   # no se lee
+            # 'Detalle de un beneficio al total'
+            pass
+
+        elif llave == '29':
+            # 'Devolución de envases'# hardcoded
+            cantidad     = Decimal('1.0')
+            importe_iva  = Decimal(data['iva'])
+            importe_siva = Decimal(data['precio']) * cantidad
+            importe_civa = importe_siva + importe_iva
+
+            tck_line.update( dict(
+                cantidad       = 1.0,
+                importe_iva    = round(importe_iva ,2),
+                importe_siva   = round(importe_siva,2),
+                importe_civa   = round(importe_civa,2),
+                codigoiva      = '1',
+                codigoarticulo = '4045',   # esto es así porque no podemos identificar los envases
+                codigooriginal = '4045',   # tomra puede
+                # product_id     = erp_product_id(data['codigoarticulo'])
+
+            ))
+            #raw_input("linea dev env 29")
+
+        elif llave == '30':
+            # 'Venta a subfamilia'
+            cantidad       =  Decimal(data['cantidad'])
+            importe_iva    =  Decimal(data['iva'])
+            importe_siva   =  Decimal(data['precio']) * cantidad
+            importe_civa   =  importe_siva + importe_iva
+
+            tck_line.update( dict(
+                cantidad       = round(cantidad    ,3),
+                importe_iva    = round(importe_iva ,2),
+                importe_siva   = round(importe_siva,2),
+                importe_civa   = round(importe_civa,2),
+                lineacancelada = data['lineacancelada'],
+                modoingreso    = data['modoingreso'],
+                codigoarticulo = data['codigo']
+            ))
+            # 'codigovendedor': data['codigovendedor'],
+
+        elif llave == '37':
+            # 'Pago con tarjeta'
+
+            pos_ticket['mediosdepago_tck'].append(dict(
+                codigomediopago                      = data['codigomediopago'],
+                codigomoneda                         = data['codigomoneda'],
+                totalmediopagomoneda                 = round(Decimal(data['totalmediopagomoneda']),2),
+                totalmediopagomonedamonedareferencia = round(Decimal(data['totalmediopagomonedamonedareferencia']),2),
+                totalpagado                          = round(Decimal(data['totalpagado']),2),
+                totalpagadomonedareferencia          = round(Decimal(data['totalpagadomonedareferencia']),2),
+                cambio                               = round(Decimal(data['cambio']),2),
+                tipooperacion                        = data['tipooperacion'],
+                lineaultimopago                      = data['lineaultimopago'],
+                numerotarjetacredito                 = data['numerotarjetacredito'],
+                cuotastarjetacredito                 = data['cuotastarjetacredito'],
+                numeroautorizaciontarjetacredito     = data['numeroautorizaciontarjetacredito'],
+                tipotarjetacredito                   = data['tipotarjetacredito'],
+                autorizasupervisora                  = data['autorizasupervisora'],
+                codigosupervisora                    = data['codigosupervisora'],
+                lineacancelada                       = data['lineacancelada'],
+                plan                                 = data['plan'],
+                nrocomercio                          = data['nrocomercio'],
+                siaplicaleydesciva                   = data['siaplicaleydesciva'],
+                montodescuentoleyiva                 = data['montodescuentoleyiva'],
+                textoley                             = data['textoley'],
+                siesdebitocredito                    = data['siesdebitocredito'],
+            ))
+
+        elif llave == '38':
+            # 'Pago con cheque'
+
+            pos_ticket['mediosdepago_tck'].append(dict(
+                 codigomediopago                       = data['codigomediopago'],
+                 codigomoneda                          = data['codigomoneda'],
+                 totalmediopagomoneda                  = data['totalmediopagomoneda'],
+                 totalmediopagomonedamonedareferencia  = data['totalmediopagomonedamonedareferencia'],
+                 totalpagado                           = data['totalpagado'],
+                 totalpagadomonedareferencia           = data['totalpagadomonedareferencia'],
+                 cambio                                = data['cambio'],
+                 tipooperacion                         = data['tipooperacion'],
+                 lineaultimopago                       = data['lineaultimopago'],
+                 tipocliente                           = data['tipocliente'],
+                 idcliente                             = data['idcliente'],
+                 autorizasupervisora                   = data['autorizasupervisora'],
+                 codigosupervisora                     = data['codigosupervisora'],
+                 lineacancelada                        = data['lineacancelada']
+            ))
+
+        elif llave == '40':
+            # 'Pago con luncheon ticket'
+
+            pos_ticket['mediosdepago_tck'].append(dict(
+                codigomediopago                       = data['codigomediopago'],
+                codigomoneda                          = data['codigomoneda'],
+                totalmediopagomoneda                  = data['totalmediopagomoneda'],
+                totalmediopagomonedamonedareferencia  = data['totalmediopagomonedamonedareferencia'],
+                totalpagado                           = data['totalpagado'],
+                totalpagadomonedareferencia           = data['totalpagadomonedareferencia'],
+                cambio                                = data['cambio'],
+                tipooperacion                         = data['tipooperacion'],
+                lineaultimopago                       = data['lineaultimopago'],
+                codigobarra                           = data['codigobarra'],
+                modoingresocupon                      = data['modoingresocupon'],
+                autorizasupervisora                   = data['autorizasupervisora'],
+                codigosupervisora                     = data['codigosupervisora'],
+                lineacancelada                        = data['lineacancelada']
+            ))
+
+        elif llave == '43':
+            # 'Voucher de tarjeta'" % ns )
+            if  data['tipovoucher'] == '1': # solo la copia establecimiento.
+
+                pos_ticket['vouchertar_tck'].append(dict(
+                    nombreemisortarjeta     = data['nombreemisortarjeta'],
+                    numerotarjeta           = data['numerotarjeta'],
+                    vencimiento             = data['vencimiento'],
+                    comprobante             = data['comprobante'],
+                    autorizacion            = data['autorizacion'],
+                    plan                    = data['plan'],
+                    cantidadcuotas          = data['cantidadcuotas'],
+                    codigoterminal          = data['codigoterminal'],
+                    codigocomercio          = data['codigocomercio'],
+                    tipoautorizacion        = data['tipoautorizacion'],
+                    nrolote                 = data['nrolote'],
+                    codigomoneda            = data['codigomoneda'],
+                    tipotransaccion         = data['tipotransaccion'],
+                    tipovoucher             = data['tipovoucher'],
+                    importepago             = data['importepago'],
+                    fechatransaccion        = data['fechatransaccion'],
+                    codigocaja              = data['codigocaja'],
+                    codigocajera            = data['codigocajera'],
+                    nombrepropietario       = data['nombrepropietario'],
+                    tipoingreso             = data['tipoingreso'],
+                    descuentaivarestaurante = data['descuentaivarestaurante'],
+                    siesdebitocredito       = data['siesdebitocredito'],
+                    cardtype                = data['cardtype'],
+                    saldogift               = data['saldogift'],
+                    tipotarjetacredito2     = data['tipotarjetacredito2'],
+                    descuentoafam           = data['descuentoafam'],
+                    siaplicaleydesciva      = data['siaplicaleydesciva'],
+                    montodescuentoleyiva    = data['montodescuentoleyiva'],
+                    montoticket             = data['montoticket'],
+                    montogravado            = data['montogravado'],
+                    flagimprimefirma        = data['flagimprimefirma']
+                ))
+
+        elif llave == '47':   # cobranzas
+            #print('47')       # importe y tipo de servicio cobrado (por ahora solo cobranzas de ct.cte)
+            l47 = True
+            # si la línea de conbranza no tiene código de servicio pagado, lo hardcodeamos
+            if data.has_key('codserviciopagado'):
+                if data['codserviciopagado'] is None:
+                    data['codserviciopagado'] = '0'
+            else:
+                data['codserviciopagado'] = '0'
+
+            linea_cobza.append(
+                (pos_ticket['name'],
+                round(Decimal(data['importecobranza']),2),
+                data['codserviciopagado'])
+            )
+
+            # contenido de la linea de cobranza lista de tuplas (ver llave 68)
+            # lcobza = [ ( id_ticket, importecobranza, codserviciopagado ) ]
+
+            pos_ticket['tipocabezal'] = 'ccc'
+            pos_ticket['hay_cobza'] = True
+            pos_ticket['descripcion_cab'] = 'Ticket de Cobranza'
+
+        elif llave == '52':  # no se lee
+            # Pago desde caja
+
+            tck_line.update( dict(
+                    cantidad       = 1.0,
+
+                    importe_siva   = float( data['importe'] * -1 ),
+                    importe_iva    = float( data['importe'] * -1 ),
+                    importe_civa   = float( data['importe'] * -1 ),
+                    codigooriginal = data['codigo'],
+                    codigoarticulo = '9-pago-desde-caja'
+            ))
+
+
+        elif llave == '53':
+            # 'Tipo de ticket'
+            pos_ticket['tipo_de_ticket_descrip'] = data['descripciontipoticket']
+            pos_ticket['tipo_de_ticket_tipovta'] = data['tipoventa']
+
+
+        elif llave == '54':
+            # 'Pago de ticket en puntos'
+            pos_ticket['mediosdepago_tck'].append(dict(
+                codigomediopago                      = data['codigomediopago'],
+                codigomoneda                         = data['codigomoneda'],
+                totalmediopagomoneda                 = round(Decimal(data['totalmediopagomoneda']),2),
+                totalmediopagomonedamonedareferencia = round(Decimal(data['totalmediopagomonedamonedareferencia']),2),
+                totalpagado                          = round(Decimal(data['totalpagado']),2),
+                totalpagadomonedareferencia          = round(Decimal(data['totalpagadomonedareferencia']),2),
+                cambio                               = round(Decimal(data['cambio']),2),
+                tipooperacion                        = data['tipooperacion'],
+                lineaultimopago                      = data['lineaultimopago'],
+                autorizasupervisora                  = data['autorizasupervisora'],
+                codigosupervisora                    = data['codigosupervisora'],
+                lineacancelada                       = data['lineacancelada']
+            ))
+
+        elif llave == '55':
+            # 'Intervensión Supervisora'
+            nota =  "Supervisor/a %s %s" % (data['codigosuper'], data['nombresuper'])
+            tck_line.update( dict( codigoarticulo = 'interv.super.',
+                                   codigosuper = data['codigosuper'],
+                                   nombresuper = data['nombresuper'],
+                                   nota = nota))
+
+        elif llave == '57':  # no se leera
+            # Tipo de cliente    fidelización
+            pass
+            """
+            tipodecliente = dict(
+                tipo_de_cliente    = data['tipo'],
+                numerotarjeta      = data['numerotarjeta'],
+                modoingreso        = data['modoingreso'],
+                nombre             = data['nombre'],
+                numero             = data['numero'],
+                tipoclienteinterno = data['tipoclienteinterno']))
+            """
+        elif llave == '63':
+            # 'Redondeo de importe' al total de ticket
+            pos_ticket['redondeoaltotal_tck'].append( dict(
+                codigomediopago    = data['codigomediopago'],    # x redondeo
+                importeticket      = round(Decimal(data['importeticket']),2),
+                importeredondeo    = round(Decimal(data['importeredondeo']),2),
+                importetotalticket = round(Decimal(data['importetotalticket']),2),
+                codigomoneda       = data['codigomoneda']))
+
+
+        elif llave == '68': # or len(linea_cobza):    # datos del `servcio` cobrado (por ahora datos del cliente cc)
+            #import ipdb;ipdb.set_trace()
+            l68 = True
+            #print('68')
+            # 'Entrega a domicilio'  se usa para identificar al cliente en las cobranzas
+            # COBRANZAS id cliente
+            # OJO Si se habilita la cobranza dentro del ticket de compra esto no funcionará
+
+            if data.has_key('codigocliente'):
+                codigocliente = data['codigocliente']
+            else:
+                codigocliente = 'Sin codigo de cliente'
+                logging.info(" %s [ WARNING ] : %s " % (ns, codigocliente))
+
+            if  data.has_key('nombrecliente'):
+                nombrecliente = "%s" % (data['nombrecliente'],)
+            else:
+                nombrecliente = 'Falta el nombre de cliente'
+                logging.info(" %s [ WARNING ] : %s " % (ns, nombrecliente))
+
+            llave68 = dict(codigocliente = codigocliente, nombrecliente = nombrecliente)
+
+            if len(linea_cobza):
+                for id_ticket, importecobranza, codserviciopagado in linea_cobza:
+                    if id_ticket == pos_ticket['name']:
+                        llave68.update( dict(
+                            codserviciopagado = codserviciopagado,
+                            importecobranza   = importecobranza
+                            )
+                        )
+                pos_ticket['cobranzas_tck'].append( llave68 )
+                linea_cobza = list()
+            else:
+                if llave68:
+                    pos_ticket['cobranzas_tck'].append( llave68 )
+                    pos_ticket['tipocabezal'] = 'ccc'
+                    pos_ticket['hay_cobza'] = True
+                    pos_ticket['descripcion_cab'] = 'Ticket de Cobranza'
+
+            # las líneas del ticket vienen ordenadas, si eso cambiara esto dejaría de funcionar.
+
+        elif llave == '85':
+            # 'Pago de tarjeta offline'
+            pos_ticket['mediosdepago_tck'].append(dict(
+                    codigomediopago                       = data['codigomediopago'],
+                    codigomoneda                          = data['codigomoneda'],
+                    totalmediopagomoneda                  = round(Decimal(data['totalmediopagomoneda']),2),
+                    totalmediopagomonedamonedareferencia  = round(Decimal(data['totalmediopagomonedamonedareferencia']),2),
+                    totalpagado                           = round(Decimal(data['totalpagado']),2),
+                    totalpagadomonedareferencia           = round(Decimal(data['totalpagadomonedareferencia']),2),
+                    cambio                                = round(Decimal(data['cambio']),2),
+                    tipooperacion                         = data['tipooperacion'],
+                    lineaultimopago                       = data['lineaultimopago'],
+                    numerotarjetacredito                  = data['numerotarjetacredito'],
+                    autorizasupervisora                   = data['autorizasupervisora'],
+                    codigosupervisora                     = data['codigosupervisora'],
+                    lineacancelada                        = data['lineacancelada']
+            ))
+
+        elif llave == '90':
+            # 'Pago ticket TAlimentos
+            pos_ticket['mediosdepago_tck'].append(dict(
+                  codigomediopago                       = data['codigomediopago'],
+                  codigomoneda                          = data['codigomoneda'],
+                  totalmediopagomoneda                  = round(Decimal(data['totalmediopagomoneda']),2),
+                  totalmediopagomonedamonedareferencia  = round(Decimal(data['totalmediopagomonedamonedareferencia']),2),
+                  totalpagado                           = round(Decimal(data['totalpagado']),2),
+                  totalpagadomonedareferencia           = round(Decimal(data['totalpagadomonedareferencia']),2),
+                  cambio                                = round(Decimal(data['cambio']),2),
+                  tipooperacion                         = data['tipooperacion'],
+                  lineaultimopago                       = data['lineaultimopago'],
+                  codigobarra                           = data['codigobarra'],
+                  modoingresocupon                      = data['modoingresocupon'],
+                  autorizasupervisora                   = data['autorizasupervisora'],
+                  codigosupervisora                     = data['codigosupervisora'],
+                  lineacancelada                        = data['lineacancelada']
+            ))
+
+        elif llave == '91':
+
+            # 'Pago con Tticket Total'
+            pos_ticket['mediosdepago_tck'].append(dict(
+                        codigomediopago                      = data['codigomediopago'],
+                        codigomoneda                         = data['codigomoneda'],
+                        totalmediopagomoneda                 = round(Decimal(data['totalmediopagomoneda']),2),
+                        totalmediopagomonedamonedareferencia = round(Decimal(data['totalmediopagomonedamonedareferencia']),2),
+                        totalpagado                          = round(Decimal(data['totalpagado']),2),
+                        totalpagadomonedareferencia          = round(Decimal(data['totalpagadomonedareferencia']),2),
+                        cambio                               = round(Decimal(data['cambio']),2),
+                        tipooperacion                        = data['tipooperacion'],
+                        lineaultimopago                      = data['lineaultimopago'],
+                        codigobarra                          = data['codigobarra'],
+                        modoingresocupon                     = data['modoingresocupon'],
+                        autorizasupervisora                  = data['autorizasupervisora'],
+                        codigosupervisora                    = data['codigosupervisora'],
+                        lineacancelada                       = data['lineacancelada']
+            ))
+
+        elif llave == '92': #no
+            # 'Emisión de factura'
+            pass
+
+        elif llave == '97': #no  tck_line
+            # 'Retiro'
+            tck_line.update(dict(
+                    cantidad       = 1.0,
+
+                    importe_siva   = round(Decimal(data['montoretiro']),2) * -1,
+                    importe_iva    = 0.0,
+                    importe_civa   = round(Decimal(data['montoretiro']),2) * -1,
+                    codigooriginal = '9-Retiros',
+                    codigoarticulo = '9-Retiros',
+                    nota = "Retiro de caja| codigomediopago : %s, codigomoneda : %s, montoretiro : %s " % \
+                           (data['codigomediopago'], data['codigomoneda'], data['montoretiro'])
+            ))
+            #pos_ticket['totalapagar'] += round(Decimal(data['montoretiro']),2) * -1
+        elif llave == '106': #no
+            # 'Cliente facturacion'
+            pass
+
+        elif llave == '115': #no
+            # 'Pago descuento Iva Afam'
+            pass
+
+        elif llave == '120':
+
+            # import ipdb;ipdb.set_trace()
+            pos_ticket['mides'] = data['ventamides'] + ' CI :' + data['ci']
+
+
+        elif llave == '121': #no
+            # 'Voucher retiro leche tarjeta Mides'
+            pass
+
+        elif llave == '124':  # no interes
+            pass
+            """ Línea de voucher de la tarjeta TACRE
+            vouchers.append({'linea_voucher_tarjeta' : {
+                'numerotarjeta'       : data['numerotarjeta'],
+                'vencimiento'         : data['vencimiento'],
+                'comprobante'         : data['comprobante'],
+                'autorizacion'        : data['autorizacion'],
+                'codigoterminal'      : data['codigoterminal'],
+                'codigocomercio'      : data['codigocomercio'],
+                'tipoautorizacion'    : data['tipoautorizacion'],
+                'nrolote'             : data['nrolote'],
+                'codigomoneda'        : data['codigomoneda'],
+                'tipotransaccion'     : data['tipotransaccion'],
+                'tipovoucher'         : data['tipovoucher'],
+                'importepago'         : round(Decimal(data['importepago']),2),
+                'fechatransaccion'   : data['fechatransaccion'],
+                'codigocaja'          : data['codigocaja'],
+                'codigocajera'        : data['codigocajera'],
+                'nombrepropietario'   : data['nombrepropietario'],
+                'tipoingreso'         : data['tipoingreso'],
+                'descuentaiva'        : data['descuentaiva'],
+                'siaplicaleydesciva'  : data['siaplicaleydesciva'],
+                'montodescuentoleyiva': data['montodescuentoleyiva'],
+                'montofactura'        : data['montofactura'],
+                'montogravado'        : data['montogravado'],
+                'nombretarjeta'       : data['nombretarjeta'],
+                'flagimprimefirma'    : data['flagimprimefirma']
+            }})                                      """
+
+        elif  llave == '126':
+            # 'Cliente de cuenta corriente SM' (cuando compra)
+
+            pos_ticket['cuentas_tck'].append(dict( codigocc    = data['codigocc'] or 'no-codecc',
+                                                   nombrecc    = data['nombrecc'] or 'no-namecc',
+                                                   montopagocc = data['montopagocc'] or 0.0
+            ))
+
+        elif llave == '127':
+
+            # 127 'Detalles del Pago de ticket con cuenta corriente'   (cuando compra)
+
+            llave127 = dict(
+                codigomediopago                       = data['codigomediopago'],
+                codigomoneda                          = data['codigomoneda'],
+                totalmediopagomoneda                  = round(Decimal(data['totalmediopagomoneda']),2),
+                totalmediopagomonedamonedareferencia  = round(Decimal(data['totalmediopagomonedamonedareferencia']),2),
+                totalpagado                           = round(Decimal(data['totalpagado']),2),
+                totalpagadomonedareferencia           = round(Decimal(data['totalpagadomonedareferencia']),2),
+                cambio                                = round(Decimal(data['cambio']),2),
+                tipooperacion                         = data['tipooperacion'],
+                lineaultimopago                       = data['lineaultimopago'],
+                autorizasupervisora                   = data['autorizasupervisora'],
+                codigosupervisora                     = data['codigosupervisora'],
+                lineacancelada                        = data['lineacancelada']
+            )
+            if pos_ticket['cuentas_tck']:
+                llave127.update(pos_ticket['cuentas_tck'][0])
+            else:
+                llave127.update( dict(codigocc      = 'compra_cta_sin_numero', nombrecc      = 'compra_cta_sin_nombre',
+                                      montopagocc   = 0.001 ))
+            pos_ticket['mediosdepago_tck'].append( llave127 )
+
+        elif llave == '128':
+            # 'Pago de ticket en Dev.Envases.'
+            pos_ticket['mediosdepago_tck'].append(dict(
+                codigomediopago         = data['codigomediopago'],
+                codigomoneda            = data['codigomoneda'],
+                totalmediopagomoneda    = round(Decimal(data['totalmediopagomoneda']),2),
+                totalmediopagomonedamonedareferencia = round(Decimal(data['totalmediopagomonedamonedareferencia']),2),
+                totalpagadomonedareferencia          = round(Decimal(data['totalpagadomonedareferencia']),2),
+                totalpagado             = round(Decimal(data['totalpagado']),2),
+                cambio                  = round(Decimal(data['cambio']),2),
+                tipooperacion           = data['tipooperacion'],
+                lineaultimopago         = data['lineaultimopago'],
+                autorizasupervisora     = data['autorizasupervisora'],
+                codigosupervisora       = data['codigosupervisora'],
+                lineacancelada          = data['lineacancelada']
+            ))
+
+
+        if llave in config.linea_linea and tck_line:
+            lineas_ticket.append(tck_line)
+
+    if 'pie_cfe' in locals():
+            pos_ticket['cfe_tck'].append(pie_cfe)
+
+    #if l47 or l68:
+    #    print(pos_ticket['cobranzas_tck'])
+
+
+
+    return lineas_ticket
+
+
+def erp_product_id(cod):
+    res = {}
+    try:
+        prod_id = op_conn.sock_execute('product.template', 'search', [('cod_sto', '=', cod)])
+        if prod_id:
+            res[cod] = prod_id[0]
+        else:
+            ean_id = op_conn.sock_execute('product.ean13', 'search', [('name', '=', cod)])
+            if ean_id:
+                product = op_conn.sock_execute('product.ean13', 'read', [ean_id])
+                if product:
+                    res[cod] = product[0]['product_id'][0]
+    except:
+        import ipdb;ipdb.set_trace()
+    return res
+
+def main():
+
+    """
+    :return: crea los archivo/s .json "tckAAAADDMM.json"
+
+        Procesa informes de salida de los POS, filtra movimientos
+        según criterios configurables, serializa la salida en
+        estructuras `json` que escribe en un archivo.
+
+        1. lee el directorio de salidapazos
+        2. prepara la lista de archivos salidapazos a procesar
+        3. lee los informes del filesystem
+        4. procesa cada informe salidapazos
+        5. crea archivos json correspondientes a cada informe
+        6. marca los informes procesaros en "/admi/pazos4/.sqlite3.db"
+
+        Los archivos json tiene la forma:
+
+        salida = [
+            ({lineas_cabezal},{lineas_detalle}),
+            ({lineas_cabezal},{lineas_detalle}),
+            ({lineas_cabezal},{lineas_detalle})
+        ]
+    """
+
+    #import ipdb;ipdb.set_trace()
+    # ####  1. 2.
+    infofile = spn2json_chk.to_json()
+    # print len(infofile)
+
+    if not infofile:
+        msg =  '::No hay informes sin procesar!'
+        logging.warn( " %s [ Warninig ] : %s " % (ns, msg) )
+        sys.exit(0)
+
+    for i in infofile:
+        fecha = get_date(i)        # es la fecha en que pazos4 emitió el informe.
+
+        # ####  3.
+        informe = leer_informe(i)  # levanta Salidapazos_nuevo (csv) y crea un diccionario
+
+        # ####  4.
+        __, tcks_del_dia = passtck(informe)
+        _date = "%s-%s-%s" % (fecha[0:4], fecha[4:6], fecha[6:8])
+        print _date,',', __
+
+        # #### 5.
+        json_file = "%stck%s.json" % (oPath,fecha,)
+        try:
+            with open(json_file, 'w') as fp:
+                json.dump(tcks_del_dia, fp, separators=(',', ': '), indent=3)
+
+            # #### 6.
+            spn2json_chk.json_done(i,fecha,json_file)
+            logging.info(" %s [ Info ] %s generado ok " % (ns,fecha))
+        except Exception as escritura:
+            logging.error( " %s [ Error ] : %s Imposible escribir el informe" % (ns, escritura) )
+
+
diff --git a/opentck3/spn2json_chk.py b/opentck3/spn2json_chk.py
new file mode 100644 (file)
index 0000000..09f8a7d
--- /dev/null
@@ -0,0 +1,281 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+__licence__ = "GNU/GPLv3"
+__author__  = "Marcelo Zunino (InfoPrimo SL) 2015-2017"
+
+# from datetime import date, datetime
+import sys
+import os.path
+import sqlite3
+import re
+import logging
+from time import strftime
+from glob import glob
+from util import config
+
+
+iPrefijo = config.iPrefijo
+iPath    = config.iPath
+oPath    = config.oPath
+dbpath   = oPath + '.spazos_tck.db'
+ns       = __name__
+
+init = '''CREATE TABLE if not exists spazosjson(id INTEGER PRIMARY KEY AUTOINCREMENT, origen TEXT NOT NULL UNIQUE, cod_inifin TEXT NOT NULL UNIQUE, fecha_opera DATE NOT NULL UNIQUE, fecha_lectura DATE NOT NULL, destino TEXT NOT NULL UNIQUE);'''
+
+
+def end(msg=None):
+    msg = msg or "\n\tAlgo salió mal... FIN\n"
+    sys.stdout.write("\n\t%s\n\n" % (msg,))
+
+
+def pick_input(iPath=iPath, iPrefijo=iPrefijo):
+    """
+    Lee el contenido del directorio de salidapazos filtrado con el prfijo
+    del nombre de archivo del informe
+
+    :param iPath: path al archivo sqlite
+    :param iPrefijo:  "Salidapazosnuevo-1-20*"
+    :return: Lista de archivos candidatos a ser porcesados para generar el json.
+    """
+    # import ipdb; ipdb.set_trace()
+    iPath += iPrefijo
+    digitos = re.compile('[0-9]{3,4}$')
+    try:
+        file_list = glob(iPath)
+    except Exception as err_msg:
+        logging.error(err_msg)
+        msg = " [ Warninig ] : No se leyó nungún informe. "
+        logging.warn( " %s %s " % (ns, msg) )
+        end(msg)
+        sys.exit(0)
+
+    file_list.sort()
+
+    if len(file_list) > 0:
+        res = {}
+
+        for info_file in file_list:
+            if digitos.match(info_file[info_file.index('.')+1:]):
+                res.update({ int(info_file[info_file.index('.')+1:]): info_file})
+    else:
+        msg = " %s No se leyó nungún informe. info_list está vacía!!" % ns
+        logging.error(msg)
+        end(msg)
+        sys.exit(1)
+
+    return res
+
+
+class SqliteTckJson(object):
+
+
+    def __init__(self, dbpath, tablename):
+
+        if not dbpath:
+            msg = " %s Falta el path para la db" % ns
+            logging.error(msg)
+            end(msg)
+            sys.exit(1)
+
+        self.dbpath = dbpath
+        self.tablename = tablename
+
+
+    def conn(self):
+        """
+            Conexión a la db
+            :param dbpath:
+            :return:        una concexión sqlite3
+        """
+
+        dbpath = self.dbpath or None
+        try:
+            res = sqlite3.connect(dbpath, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES, isolation_level=None)
+            print res
+            if not res:
+                print("No hay CONEXION")
+                raise Exception
+        except Exception as err_msg:
+            logging.error(err_msg)
+            msg =  ' %s Imposible conectar a %s.' % (ns, dbpath,)
+            logging.warn(msg)
+            end(msg)
+            sys.exit(1)
+        return res
+
+
+    def close(self, cr, db):
+        """
+            bueno, eso, cierra la conexión a la db
+            :param cr:
+            :param db:
+            :return:  True or exit con mensaje
+        """
+        try:
+            cr.close()
+            db.close()
+        except Exception as err_msg:
+            msg =  ' %s No se pudo cerrar la db.' % ns
+            logging.error(err_msg)
+            logging.warn(msg)
+            end(msg)
+            sys.exit(1)
+        return True
+
+
+    def install(self, force=None):
+        """
+            Crear db sqlite3 en `dbpath`
+            :param dbpath:
+            :param force:
+            :return:
+        """
+        dbpath = self.dbpath or None
+        # ipdb.set_trace()
+        if not os.path.isfile(dbpath) or force:
+            try:
+                db = self.conn(dbpath)
+                cr = db.cursor()
+                cr.execute(init)
+                cr.close(cr,db)
+            except Exception as err_msg:
+                logging.error(err_msg)
+                msg =  ' %s No se pudo crear la db.' % ns
+                logging.warn(msg)
+                end(msg)
+                sys.exit(1)
+        return True
+
+
+    def test_table(self):
+        """
+            Verifica existencia db y tabla necesarias.
+            :param dbpath:
+            :return: True o exit con aviso
+        """
+        dbpath = self.dbpath
+        tablename = self.tablename
+        res = False
+
+        sql = """SELECT 1 FROM sqlite_master WHERE type='table' AND name='%s';""" % (tablename,)
+        try:
+            db = conn(dbpath)
+            cr = db.cursor()
+            cr.execute(sql)
+            test = cr.fetchone()
+            if not (isinstance(test, tuple) and test[0] == tablename):
+                install(dbpath,1)
+            res = True
+        except Exception as info_msg:
+            msg = '%s %s No existe %s. Fallo al intentar crear la tabla.' % (info_msg, ns, tablename)
+            logging.error(msg)
+            print msg, ' test_table'
+            sys.exit(1)
+
+        return res
+
+
+    def refresh_db(self):
+
+        db = conn(self.dbpath)
+        cr = db.cursor()
+        # si se reinstala : "CREATE TABLE spazosbak AS SELECT * FROM spazosjson;"
+        cr.execute("insert into spazosbak select * from spazosjson;")
+        cr.execute("delete from spazosjson;")
+        #create table spazosbak AS select * from spazosjson;
+
+
+    def to_json(self):
+        """
+        Filtra la lista de informes disponibles contra el historial de informes procesados.
+        retornando la lista de aquellos que no encuentra en el historial.
+
+        :param dbpath:  ubicación de la db del historial
+        :return:
+        """
+        dbpath = self.dbpath or None
+        test_table(dbpath)
+        try:
+            db = conn(dbpath)
+            cr = db.cursor()
+            cr.execute('''SELECT cod_inifin FROM spazosjson ORDER BY id;''')
+            proc = cr.fetchall()
+            close(cr,db)
+        except Exception as err_msg:
+            logging.error(err_msg)
+            msg = " %s : [ Error ] : No se leyó nungún informe. " % ( ns, )
+            print msg, ns, ' to_json'
+            logging.warn(msg)
+            sys.exit(1)
+
+        _inifin_done = [ int(i[0].encode('utf-8')) for i in proc if isinstance(proc,list)]
+        _inifin_done.sort()
+
+        # se lee la carpeta de informes disponibles.
+        candidatos = pick_input()
+        result = []# candidatos[i] for i in candidatos if i not in _inifin_done ]
+        for i in candidatos:
+            if i not in _inifin_done:
+                result.append(candidatos[i])
+
+        result.sort()
+
+        return result
+
+
+    def json_done(self, info, fecha, jsonfile):
+        """
+            Crea el registo para el historial/control
+
+            :param info:
+            :param fecha:
+            :param jsonfile:
+            :param dbpath:
+            :return:
+        """
+        dbpath = self.dbpath or None
+        try:
+
+            db = conn(dbpath)
+            cr = db.cursor()
+
+            origen = info
+            cod_inifin = info[info.index('.')+1:]
+            fecha_opera = fecha[:4] + '-' + fecha[4:6] + '-' + fecha[6:8]
+            fecha_lectura = strftime("%0Y.%0m.%0d %0H:%M:%0S")
+            destino = jsonfile
+
+            sql0 = "INSERT INTO spazosjson(origen,cod_inifin,fecha_opera,fecha_lectura,destino) VALUES("
+            sql1 = "'%s','%s','%s','%s','%s');" % ( origen,cod_inifin,fecha_opera,fecha_lectura,destino)
+
+        except Exception as err_msg:
+            logging.error(err_msg)
+            msg = " %s : [ Error ] : No se leyó nungún informe. " % ( ns, )
+            print msg, ns, ' to_json'
+            logging.warn(msg)
+            sys.exit(1)
+
+        cr.execute(sql0 + sql1)
+
+
+#import ipdb;ipdb.set_trace()
+if __name__ == '__main__':
+
+    test_table(dbpath)
+
+    db = conn(dbpath)
+    cr = db.cursor()
+    cr.execute('''SELECT * FROM spazosjson''')
+    rows = cr.fetchall()
+
+    close(cr,db)
+
+    if rows:
+        for row in rows:
+            print row
+    else:
+        print 'foi'
+
+    if len(rows) >= 1825:
+        refresh_db(dbpath)
+
diff --git a/opentck3/spn2pyth.py b/opentck3/spn2pyth.py
new file mode 100644 (file)
index 0000000..a539cae
--- /dev/null
@@ -0,0 +1,266 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+__licence__ = "GNU/GPLv3"
+__author__  = "Marcelo Zunino (InfoPrimo SL) 2015-2017"
+
+# from datetime import date, datetime
+import sys
+import os.path
+
+import sqlite3
+import re
+import logging
+from time import strftime
+from util import config
+from glob import glob
+
+import ipdb
+#logfile = './log/spn2json_chk.log'
+#os.path.isdir('./log') or os.mkdir('./log')
+#os.path.isfile(logfile) or os.system("touch %s" % logfile)
+#logging.basicConfig(format='%(asctime)s %(message)s', filename=logfile, level=logging.INFO)
+
+#  iPath = "/admi/informes/"
+#  oPath = "/admi/pazos4/"
+#  iPrefijo = "Salidapazosnuevo-1-201"
+
+iPrefijo = config.iPrefijo
+iPath  = config.iPath
+oPath  = config.oPath
+dbpath = oPath + '.spazos_tck.db'
+ns = __name__
+
+init = '''CREATE TABLE if not exists spazosjson(id INTEGER PRIMARY KEY AUTOINCREMENT, origen TEXT NOT NULL UNIQUE, cod_inifin TEXT NOT NULL UNIQUE, fecha_opera DATE NOT NULL UNIQUE, fecha_lectura DATE NOT NULL, destino TEXT NOT NULL UNIQUE);'''
+
+def end(msg=None):
+    msg = msg or "\n\tAlgo salió mal... FIN\n"
+    sys.stdout.write("\n\t%s\n\n" % (msg,))
+
+
+def pick_input(iPath=iPath, iPrefijo=iPrefijo):
+    """
+    Lee el contenido del directorio de salidapazos filtrado con el prfijo
+    del nombre de archivo del informe
+
+    :param iPath: path al archivo sqlite
+    :param iPrefijo:  "Salidapazosnuevo-1-20*"
+    :return: Lista de archivos candidatos a ser porcesados para generar el json.
+    """
+    # import ipdb; ipdb.set_trace()
+    iPath += iPrefijo
+    digitos = re.compile('[0-9]{3,4}$')
+    try:
+        file_list = glob(iPath)
+    except Exception as err_msg:
+        logging.error(err_msg)
+        msg = " [ Warninig ] : No se leyó nungún informe. "
+        logging.warn( " %s %s " % (ns, msg) )
+        end(msg)
+        sys.exit(0)
+
+    file_list.sort()
+
+    if len(file_list) > 0:
+        res = {}
+
+        for info_file in file_list:
+            if digitos.match(info_file[info_file.index('.')+1:]):
+                res.update({ int(info_file[info_file.index('.')+1:]): info_file})
+    else:
+        msg = " %s No se leyó nungún informe. info_list está vacía!!" % ns
+        logging.error(msg)
+        end(msg)
+        sys.exit(1)
+
+    return res
+
+
+def conn(dbpath):
+    """
+    Conexión a la db
+    :param dbpath:
+    :return:        una concexión sqlite3
+    """
+    res = False
+    if not dbpath:
+        msg = " %s Falta el path para la db" % ns
+        logging.error(msg)
+        end(msg)
+        sys.exit(1)
+    try:
+        res = sqlite3.connect(dbpath, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES, isolation_level=None)
+        if not res:
+            print("No hay CONNECTION")
+            raise  Exception
+    except Exception as err_msg:
+        logging.error(err_msg)
+        msg =  ' %s Imposible conectar a %s.' % (ns, dbpath,)
+        logging.warn(msg)
+        end(msg)
+        sys.exit(1)
+    return res
+
+
+def close(cr,db):
+    """
+    bueno, eso, cierra la conexión a la db
+        :param cr:
+        :param db:
+        :return:  True or exit con mensaje
+    """
+    try:
+        cr.close()
+        db.close()
+    except Exception as err_msg:
+        msg =  ' %s No se pudo cerrar la db.' % ns
+        logging.error(err_msg)
+        logging.warn(msg)
+        end(msg)
+        sys.exit(1)
+    return True
+
+
+def install(dbpath, force=None):
+    """
+    Crear db sqlite3 en `dbpath`
+    :param dbpath:
+    :param force:
+    :return:
+    """
+
+    #ipdb.set_trace()
+    if not os.path.isfile(dbpath) or force:
+        try:
+            db = conn(dbpath)
+            cr = db.cursor()
+            cr.execute(init)
+            close(cr,db)
+        except Exception as err_msg:
+            logging.error(err_msg)
+            msg =  ' %s No se pudo crear la db.' % ns
+            logging.warn(msg)
+            end(msg)
+            sys.exit(1)
+    return True
+
+
+def test_table(dbpath=dbpath):
+    """
+    Verifica existencia db y tabla necesarias.
+    :param dbpath:
+    :return: True o exit con aviso
+    """
+
+    res = False
+    table_name = 'spazosjson'
+    sql = """SELECT 1 FROM sqlite_master WHERE type='table' AND name='%s';""" % (table_name,)
+    try:
+        db = conn(dbpath)
+        cr = db.cursor()
+        cr.execute(sql)
+        test = cr.fetchone()
+        if not (isinstance(test, tuple) and test[0] == table_name):
+            install(dbpath,1)
+        res = True
+    except Exception as info_msg:
+        msg = '%s %s No existe %s. Fallo al intentar crear la tabla.' % (info_msg,ns,table_name)
+        logging.error(msg)
+        print msg, ' test_table'
+        sys.exit(1)
+
+    return res
+
+
+def refresh_db(dbpath):
+    db = conn(dbpath)
+    cr = db.cursor()
+    # si se reinstala : "CREATE TABLE spazosbak AS SELECT * FROM spazosjson;"
+    cr.execute("insert into spazosbak select * from spazosjson;")
+    cr.execute("delete from spazosjson;")
+    #create table spazosbak AS select * from spazosjson;
+
+
+def to_json(dbpath=dbpath):
+    """
+    Filtra la lista de informes disponibles contra el historial de informes procesados.
+    retornando la lista de aquellos que no encuentra en el historial.
+
+    :param dbpath:  ubicación de la db del historial
+    :return:
+    """
+
+    test_table(dbpath)
+    try:
+        db = conn(dbpath)
+        cr = db.cursor()
+        cr.execute('''SELECT cod_inifin FROM spazosjson ORDER BY id;''')
+        proc = cr.fetchall()
+        close(cr,db)
+    except Exception as err_msg:
+        logging.error(err_msg)
+        msg = " %s : [ Error ] : No se leyó nungún informe. " % ( ns, )
+        print msg, ns, ' to_json'
+        logging.warn(msg)
+        sys.exit(1)
+
+    _inifin_done = [ int(i[0].encode('utf-8')) for i in proc if isinstance(proc,list)]
+    _inifin_done.sort()
+
+    # se lee la carpeta de informes disponibles.
+    candidatos = pick_input()
+    result = []# candidatos[i] for i in candidatos if i not in _inifin_done ]
+    for i in candidatos:
+        if i not in _inifin_done: # and os.path.getsize(i)>0:
+            result.append(candidatos[i])
+            print(i)
+    result.sort()
+
+    return result
+
+
+def json_done(info,fecha,jsonfile,dbpath=dbpath):
+    """
+    crea el registo para el historial/control
+    :param info:
+    :param fecha:
+    :param jsonfile:
+    :param dbpath:
+    :return:
+    """
+
+    db = conn(dbpath)
+    cr = db.cursor()
+
+    origen = info
+    cod_inifin = info[info.index('.')+1:]
+    fecha_opera = fecha[:4] + '-' + fecha[4:6] + '-' + fecha[6:8]
+    fecha_lectura = strftime("%0Y.%0m.%0d %0H:%M:%0S")
+    destino = jsonfile
+
+    sql0 = "INSERT INTO spazosjson(origen,cod_inifin,fecha_opera,fecha_lectura,destino) VALUES("
+    sql1 = "'%s','%s','%s','%s','%s');" % ( origen,cod_inifin,fecha_opera,fecha_lectura,destino)
+    #print sql0 + sql1
+
+    cr.execute(sql0 + sql1)
+
+
+#import ipdb;ipdb.set_trace()
+if __name__ == '__main__':
+    test_table(dbpath)
+
+    db = conn(dbpath)
+    cr = db.cursor()
+    cr.execute('''SELECT * FROM spazosjson''')
+    rows = cr.fetchall()
+
+    close(cr,db)
+
+    if rows:
+        for row in rows:
+            print row
+    else:
+        print 'foi'
+
+    if len(rows) >= 1825:
+        refresh_db(dbpath)
+
diff --git a/opentck3/util/__init__.py b/opentck3/util/__init__.py
new file mode 100644 (file)
index 0000000..cf58786
--- /dev/null
@@ -0,0 +1 @@
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/opentck3/util/config.py b/opentck3/util/config.py
new file mode 100644 (file)
index 0000000..80a620e
--- /dev/null
@@ -0,0 +1,118 @@
+# coding: utf-8
+
+
+ioPath = "/admi"
+
+iPath = ioPath + "/informes/"
+oPath = ioPath + "/pazos4/"
+
+iPrefijo = "Salidapazosnuevo-1-20*"
+
+"""
+    Lineas de cabezal de interés:
+    ----------------------------
+
+        Cabezal de Venta (1).
+        Devolución (3).
+        Lin. de Cajera (8).
+        Pago de caja (10).
+        N.Credito Devolucion (16).
+        Retiro de Productos (20).
+
+"""
+cabezales = {
+    '1'  : 'Ticket Venta/Ingreso'  ,
+    '3'  : 'Devolución'            ,
+    '4'  : 'Estado de cuenta'      ,
+    '6'  : 'Canje'                 ,
+    '7'  : 'Inventario'            ,
+    '8'  : 'Lin. de Cajera'        ,
+    '10' : 'Pago de caja'          ,
+    '11' : 'Factura'               ,
+    '14' : 'Consulta'              ,
+    '15' : 'Apertura de Gaveta'    ,
+    '16' : 'N.Credito Devolucion'  ,
+    '17' : 'Fondeo'                ,
+    '18' : 'Retiro'                ,
+    '19' : 'Prestamo efectivo'     ,
+    '20' : 'Retiro de Productos'   ,
+    '21' : 'Cab. Z de Caja'        ,
+   '999' : '-Cabezal NO definido-' ,
+}
+cabezales_interes = {
+    '1'  : 'Ticket Venta/Ingreso'  ,
+    '3'  : 'Devolución'            ,
+    #'4'  : 'Estado de cuenta'      ,
+    #'6'  : 'Canje'                 ,
+    #'7'  : 'Inventario'            ,
+    '8'  : 'Lin. de Cajera'        ,
+    '10' : 'Pago de caja'          ,
+    #'11' : 'Factura'               ,
+    #'14' : 'Consulta'              ,
+    #'15' : 'Apertura de Gaveta'    ,
+    '16' : 'N.Credito Devolucion'  ,
+    #'17' : 'Fondeo'                ,
+    '18' : 'Retiro'                ,
+    #'19' : 'Prestamo efectivo'     ,
+    #'20' : 'Retiro de Productos'   ,
+    #'21' : 'Cab. Z de Caja'        ,
+   '999' : '-Cabezal NO definido-' ,
+}
+
+"""
+    Líneas de detalle de interés:
+    -----------------------------
+"""
+
+
+lineas_interes = { '1'   : 'Venta de ítem SM',
+                   '4'   : 'Total del ticket (discrimina pago de servicios)',
+                   '5'   : 'Cabezal CFE',
+                   '6'   : 'Pié de CFE',
+                   '7'   : 'Identificación de la cajera',
+                   '9'   : 'Pago de ticket en efectivo',
+                   '12'  : 'Cancelación de Ítem',
+                   '20'  : 'Devolución de un ítem SM',
+                   #'24'  : 'Pertenece a ticket cancelado SM',
+                   #'26' :: 'Cabezal de beneficio al total',
+                   #'27' :: 'Detalle de beneficio al total',
+                   '29'  : 'Devolución de envases',
+                   '30'  : 'Venta a subfamilia',
+                   '37'  : 'Pago con tarjeta',
+                   '38'  : 'Pago con cheque',
+                   '40'  : 'Pago con luncheon ticket',
+                   '43'  : 'Voucher de la tarjeta',
+                   '47'  : 'Cobranza de servicio',
+                   # '52'  : 'Pago desde caja',
+                   '53'  : 'Tipo de ticket',
+                   '54'  : 'Pago con puntos',
+                   '55'  : 'Intervensión Supervisora',
+                   #'57'  : 'Tipo de cliente',  # fidelización
+                   '63'  : 'Redondeo de importe',
+                   '68'  : 'Entrega a domicilio',
+                   '81'  : 'Devolución de Cobranza',
+                   '85'  : 'Pago de tarjeta offline',
+                   '90'  : 'Pago ticket TAlimentos',
+                   '91'  : 'Pago ticket Total',
+                   '97'  : 'Retiro de Caja',
+                   #'92'  : 'Emisión de factura',
+                   #'106' : 'Cliente facturacion',
+                   #'115' : 'Pago descuento Iva Afam',
+                   '119'  : '',
+                   '120' : 'Venta MIDES',
+                   #'121' : 'Voucher retiro leche tarjeta Mides',
+                   '123' : 'Pago con Tarjeta TAalim.',
+                   '124' : 'Tipo de Voucher de Tarjeta TAalim.', # es lo mismo que la 43 +o-
+                   '126' : 'Cliente de cuenta corriente SM',
+                   '127' : 'Pago con cuenta corriente',
+                   '128' : 'Pago con devolucion de envases',
+}
+
+# líneas de detalle de ticket 'L' que contienen datos de cabezal
+lineas_cabezal = []
+
+
+# lineas que no contienen datos de cabeal !!!!!!!!!!!!!!! ****************************
+linea_linea = ('1', '12', '20', '24', '29', '30', '68', '55', '97') #'47', '119', '123'
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/opentck3/util/config1314.py b/opentck3/util/config1314.py
new file mode 100644 (file)
index 0000000..78ee740
--- /dev/null
@@ -0,0 +1,116 @@
+# coding: utf-8
+
+
+WorkPath = "/home/dosmilun/Infoprimo/proyectos/zuni/zbin/var/lib/opentck2"
+
+
+iPath = WorkPath+"/informes/"
+oPath = WorkPath+"/pazos4/"
+
+iPrefijo = "Salidapazosnuevo-1-201712"
+
+"""
+    Lineas de cabezal de interés:
+    ----------------------------
+
+        Cabezal de Venta (1).
+        Devolución (3).
+        Lin. de Cajera (8).
+        Pago de caja (10).
+        N.Credito Devolucion (16).
+        Retiro de Productos (20).
+
+"""
+cabezales = {
+    '1'  : 'Ticket Venta/Ingreso'  ,
+    '3'  : 'Devolución'            ,
+    '4'  : 'Estado de cuenta'      ,
+    '6'  : 'Canje'                 ,
+    '7'  : 'Inventario'            ,
+    '8'  : 'Lin. de Cajera'        ,
+    '10' : 'Pago de caja'          ,
+    '11' : 'Factura'               ,
+    '14' : 'Consulta'              ,
+    '15' : 'Apertura de Gaveta'    ,
+    '16' : 'N.Credito Devolucion'  ,
+    '17' : 'Fondeo'                ,
+    '18' : 'Retiro'                ,
+    '19' : 'Prestamo efectivo'     ,
+    '20' : 'Retiro de Productos'   ,
+    '21' : 'Cab. Z de Caja'        ,
+   '999' : '-Cabezal NO definido-' ,
+}
+cabezales_interes = {
+    '1'  : 'Ticket Venta/Ingreso'  ,
+    '3'  : 'Devolución'            ,
+    #'4'  : 'Estado de cuenta'      ,
+    #'6'  : 'Canje'                 ,
+    #'7'  : 'Inventario'            ,
+    '8'  : 'Lin. de Cajera'        ,
+    '10' : 'Pago de caja'          ,
+    #'11' : 'Factura'               ,
+    #'14' : 'Consulta'              ,
+    #'15' : 'Apertura de Gaveta'    ,
+    '16' : 'N.Credito Devolucion'  ,
+    #'17' : 'Fondeo'                ,
+    '18' : 'Retiro'                ,
+    #'19' : 'Prestamo efectivo'     ,
+    #'20' : 'Retiro de Productos'   ,
+    #'21' : 'Cab. Z de Caja'        ,
+   '999' : '-Cabezal NO definido-' ,
+}
+
+"""
+    Líneas de detalle de interés:
+    -----------------------------
+"""
+
+
+lineas_interes = { '1'   : 'Venta de ítem SM',
+                   '4'   : 'Total del ticket (discrimina pago de servicios)',
+                   '5'   : 'Cabezal CFE',
+                   '6'   : 'Pié de CFE',
+                   '7'   : 'Identificación de la cajera',
+                   '9'   : 'Pago de ticket en efectivo',
+                   '12'  : 'Cancelación de Ítem',
+                   '20'  : 'Devolución de un ítem SM',
+                   #'24'  : 'Pertenece a ticket cancelado SM',
+                   #'26' :: 'Cabezal de beneficio al total',
+                   #'27' :: 'Detalle de beneficio al total',
+                   '29'  : 'Devolución de envases',
+                   '30'  : 'Venta a subfamilia',
+                   '37'  : 'Pago con tarjeta',
+                   '38'  : 'Pago con cheque',
+                   '40'  : 'Pago con luncheon ticket',
+                   '43'  : 'Voucher de la tarjeta',
+                   '47'  : 'Cobranza de servicio',
+                   '52'  : 'Pago desde caja',
+                   '53'  : 'Tipo de ticket',
+                   '54'  : 'Pago con puntos',
+                   '55'  : 'Intervensión Supervisora',
+                   #'57'  : 'Tipo de cliente',  # fidelización
+                   '63'  : 'Redondeo de importe',
+                   '68'  : 'Entrega a domicilio',
+                   '85'  : 'Pago de tarjeta offline',
+                   '90'  : 'Pago ticket TAlimentos',
+                   '91'  : 'Pago ticket Total',
+                   '97'  : 'Retiro de Caja',
+                   #'92'  : 'Emisión de factura',
+                   #'106' : 'Cliente facturacion',
+                   #'115' : 'Pago descuento Iva Afam',
+                   '120' : 'Venta MIDES',
+                   #'121' : 'Voucher retiro leche tarjeta Mides',
+                   #'124' : 'Tipo de Voucher de Tarjeta', # es lo mismo que la 43 +o-
+                   '126' : 'Cliente de cuenta corriente SM',
+                   '127' : 'Pago con cuenta corriente',
+                   '128' : 'Pago con devolucion de envases',
+}
+
+# líneas de detalle de ticket 'L' que contienen datos de cabezal
+lineas_cabezal = []
+
+
+# lineas que no contienen datos de cabeal
+linea_linea = ('1', '12', '20', '24', '29', '30', '47', '52', '55', '97')
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
index 47421f6..75b848d 100755 (executable)
@@ -39,6 +39,8 @@ import threading
 import traceback
 import time
 
+import pydevd
+
 import openerp
 __author__ = openerp.release.author
 __version__ = openerp.release.version
index 82fe569..fbe3a5b 100644 (file)
@@ -1,5 +1,5 @@
 [options]
-addons_path = /srv/zuni/runver/ip,/srv/zuni/runver/addons,/srv/zuni/runver/web/addons
+addons_path = /home/openerp/zuni/runver/ip,/home/openerp/zuni/runver/addons,/home/openerp/zuni/runver/web/addons
 admin_passwd = fadmin
 assert_exit_level = error
 cache_timeout = 100000
index 97ad230..9acc8ce 100755 (executable)
@@ -1,3 +1,4 @@
 #!/bin/bash
-cd /srv/zuni/runver/server
+WKD="/home/openerp"
+cd $WKD/zuni/runver/server
 exec ./openerp-server -c server.conf $@
index 97ad230..9acc8ce 100755 (executable)
@@ -1,3 +1,4 @@
 #!/bin/bash
-cd /srv/zuni/runver/server
+WKD="/home/openerp"
+cd $WKD/zuni/runver/server
 exec ./openerp-server -c server.conf $@