.jpeg
.jpg
.idea
-.kdev4
-.pydevproject
-.ropeproject
-.settings
+.kdev4
+.pydevproject
+.ropeproject
+.settings
.project
*.sql
*.lzma
*.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/
+
ip_zuni
-'''''''
+-------
A set of openerp v6.1 modules for retail customization in ZuniMercado. Salto, Uruguay 2014 YTD
+++ /dev/null
-repo: c5343f11333495aa6db306ccbb5174508c4d9dac
-node: 043bf5bd9fc6d3b5d90f2c0824aa828b19ac36e6
-branch: default
-latesttag: null
-latesttagdistance: 25
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
+
import openerp.addons.product.product as product
from osv import osv, fields
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
'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),
'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):
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'
: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
-<?xml version="1.0"?> acata
+<?xml version="1.0"?>
<openerp>
<data>
<report auto="False"
+++ /dev/null
- 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;
+++ /dev/null
-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
+++ /dev/null
-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;
-
-
+++ /dev/null
- 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;
+++ /dev/null
-<?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
+++ /dev/null
-<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
+++ /dev/null
-<component name="InspectionProjectProfileManager">
- <settings>
- <option name="USE_PROJECT_PROFILE" value="false" />
- </settings>
-</component>
\ No newline at end of file
+++ /dev/null
-<?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
+++ /dev/null
-<?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
+++ /dev/null
-<?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
+++ /dev/null
-<?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
+++ /dev/null
-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";
+++ /dev/null
-drop table cab_grouped cascade,
-drop table agrupa_articulo cascade,
-drop table agrupa_categoria cascade,
-drop table agrupa_familia cascade;
+++ /dev/null
-
-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
+++ /dev/null
-
-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
+++ /dev/null
-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
+++ /dev/null
-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
-);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+++ /dev/null
-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
-);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
##############################################################################
{
- "name" : "IP Tickets",
+ "name" : "IP Ticket",
"version" : "0.1",
"author" : "InfoPrimo SL",
'category' : 'Sale Management ZM',
</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"/>
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)
"""
</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>
</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"/>
</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>
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"/>
#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')
#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)
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"/>
-->
<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"/>
<menuitem id="menu_informes_consolid"
name="Informes Consolidados"
- parent="ip_tck.menu_gestion_tickets"
+ parent="ip_ticket.menu_gestion_tickets"
sequence="2"/>
<!--
</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>
</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>
</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>
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']
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()
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),
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
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>
+"""
+
for line in lineas:
if not line['codigoarticulo'].strip().isdigit():
line = auxlinea(line)
# FIN for line in lineas
+"""
\ No newline at end of file
--- /dev/null
+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) )
--- /dev/null
+#!/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)
+
--- /dev/null
+#!/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:
--- /dev/null
+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:
--- /dev/null
+#!/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:
--- /dev/null
+#!/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:
--- /dev/null
+#!/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()
+
--- /dev/null
+#!/bin/bash
+
+echo "$1" >> /tmp/aca
--- /dev/null
+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
+
+
+
+
--- /dev/null
+#!/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) )
+ """
--- /dev/null
+# 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)
--- /dev/null
+#!/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) )
+
+
--- /dev/null
+#!/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)
+
--- /dev/null
+#!/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)
+
--- /dev/null
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
--- /dev/null
+# 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:
--- /dev/null
+# 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:
import traceback
import time
+import pydevd
+
import openerp
__author__ = openerp.release.author
__version__ = openerp.release.version
[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
#!/bin/bash
-cd /srv/zuni/runver/server
+WKD="/home/openerp"
+cd $WKD/zuni/runver/server
exec ./openerp-server -c server.conf $@
#!/bin/bash
-cd /srv/zuni/runver/server
+WKD="/home/openerp"
+cd $WKD/zuni/runver/server
exec ./openerp-server -c server.conf $@