def ballotNumber(self, seq=1):
		"""Cierra una boleta fiscal"""

		#formato del paquete de datos (son 13 "bits")
		format = '9B'
		#tamanio del paquete de datos
		datalen= 02
		#paquete de datos especificos para abrir la boleta fiscal
		package = (self.CMD_GETNBOL,0)

		paquetehexa= struct.pack('2B',self.CMD_GETNBOL,0)
		crc= tools.crc32(paquetehexa)
		
		command = struct.pack(format,
			self.CMD_OPEN_COMMAND,
			seq,
			datalen,
			int(crc[2:4], 16),
			int(crc[4:6], 16),
			int(crc[6:8], 16),
			int(crc[8:10], 16),
			package[0],
			package[1]
			)
		return command
	def subtotal(self, seq=3):
		"""agrega el sub total a la boleta"""

		#formato del paquete de datos (son 13 "bits")
		format = '10B'
		#tamanio del paquete de datos
		datalen= 03
		#paquete de datos especificos para abrir la boleta fiscal
		package = (self.CMD_SUBTOTAL_BF,1,1)

		paquetehexa= struct.pack('3B',self.CMD_SUBTOTAL_BF,1,1)
		crc= tools.crc32(paquetehexa)
		
		command = struct.pack(format,
			self.CMD_OPEN_COMMAND,
			seq,
			datalen,
			int(crc[2:4], 16),
			int(crc[4:6], 16),
			int(crc[6:8], 16),
			int(crc[8:10], 16),
			package[0],
			package[1],
			package[2])
		return command
	def cerrar(self,seq=6):
		"""Cierra una boleta fiscal"""

		#formato del paquete de datos (son 13 "bits")
		format = '11B'
		#tamanio del paquete de datos
		datalen= 04
		#paquete de datos especificos para abrir la boleta fiscal
		package = (self.CMD_CERRAR_BF, 2,0,1)

		paquetehexa= struct.pack('4B',self.CMD_CERRAR_BF, 2,0,1)
		crc= tools.crc32(paquetehexa)
		
		command = struct.pack(format,
			self.CMD_OPEN_COMMAND,
			seq,
			datalen,
			int(crc[2:4], 16),
			int(crc[4:6], 16),
			int(crc[6:8], 16),
			int(crc[8:10], 16),
			package[0],
			package[1],
			package[2],
			package[3])
		return command
	def xreport(self, seq=1):
		"""
		Imprime el reporte X
		"""

		#formato del paquete de datos (son 8 "bits")
		format = 'BBBBBBBBBB'
		#tamanio del paquete de datos
		datalen= 03
		#paquete de datos especificos para abrir la boleta fiscal
		package = (self.CMD_INFX, 1,0)

		paquetehexa= struct.pack('BBB',self.CMD_INFX, 1,0)
		crc= tools.crc32(paquetehexa)
		
		command = struct.pack(format,
			self.CMD_OPEN_COMMAND,
			seq,
			datalen,
			int(crc[2:4], 16),
			int(crc[4:6], 16),
			int(crc[6:8], 16),
			int(crc[8:10], 16),
			package[0],
			package[1],
			package[2])
		return command
	def zreport(self, seq=1):
		"""
		Imprime el reporte Z

		nota: no lo imprime si la impresora no tiene boletas abiertas en la jornada fiscal
		"""

		#formato del paquete de datos (son 8 "bits")
		format = 'BBBBBBBBBB'
		#tamanio del paquete de datos
		datalen= 03
		#paquete de datos especificos para abrir la boleta fiscal
		package = (self.CMD_CIERRE_Z, 1,0)

		paquetehexa= struct.pack('BBB',self.CMD_CIERRE_Z, 1,0)
		crc= tools.crc32(paquetehexa)
		
		command = struct.pack(format,
			self.CMD_OPEN_COMMAND,
			seq,
			datalen,
			int(crc[2:4], 16),
			int(crc[4:6], 16),
			int(crc[6:8], 16),
			int(crc[8:10], 16),
			package[0],
			package[1],
			package[2])
		return command
	def bell(self, seq=1):
		"""
		Suena la campana
		"""

		#formato del paquete de datos (son 8 "bits")
		format = '8B'
		#tamanio del paquete de datos
		datalen= 01
		#paquete de datos especificos para abrir la boleta fiscal
		package = (self.CMD_CMD_BELL,0)

		paquetehexa= struct.pack('B',self.CMD_CMD_BELL)
		crc= tools.crc32(paquetehexa)
		
		command = struct.pack(format,
			self.CMD_OPEN_COMMAND,
			seq,
			datalen,
			int(crc[2:4], 16),
			int(crc[4:6], 16),
			int(crc[6:8], 16),
			int(crc[8:10], 16),
			package[0])
		return command
	def addItem(self, seq=2, descripcion="Hub USB", valor=1,  cantidad=10):
		"""
		Agrega un item a la boleta fiscal

		"""

		cant1= cantidad / 1000
		cant2= cantidad % 1000

		valorenBits= (  (0xFF000000 & valor)>>24,(0xFF0000 & valor)>>16,(0xFF00 & valor)>>8,(0xFF & valor))

		strings = ""
		descripcionlen= len(descripcion)
		packageValues = (self.CMD_ITEM_BF,
			9 + descripcionlen ,
			(0xFF00 & cant2)>>8 , (0xFF & cant2),
			(0xFF00 & cant1)>>8 , (0xFF & cant1),
			valorenBits[0] ,valorenBits[1],
			valorenBits[2], valorenBits[3] ,
			descripcionlen )
		for letter in descripcion:
		 	packageValues += (letter,)
		 	strings += 's '
		s = struct.Struct('11B '+ strings)

		paquetehexa= s.pack(*packageValues)
		datalen= s.size

		crc= tools.crc32(paquetehexa)
		
		command= struct.Struct('18B' + strings)

		datacommand= (self.CMD_OPEN_COMMAND,
			seq,
			datalen,
			int(crc[2:4], 16),
			int(crc[4:6], 16),
			int(crc[6:8], 16),
			int(crc[8:10],16),
			packageValues[0],
			packageValues[1],
			packageValues[2],
			packageValues[3],
			packageValues[4],
			packageValues[5],
			packageValues[6],
			packageValues[7],
			packageValues[8],
			packageValues[9],
			packageValues[10])
		for letter in descripcion :
			datacommand += (letter,)
		print datacommand
		return command.pack(*datacommand)
	def openbox(self, seq=1):
		"""Cierra una boleta fiscal"""

		#formato del paquete de datos (son 9 "bits")
		format = '9B'
		#tamanio del paquete de datos
		datalen= 02
		#paquete de datos especificos para abrir la boleta fiscal
		package = (self.CMD_ABRIR_CAJON,0)

		paquetehexa= struct.pack('2B',self.CMD_GETNBOL,0)
		crc= tools.crc32(paquetehexa)
		
		command = struct.pack(format,
			self.CMD_OPEN_COMMAND,
			seq,
			datalen,
			int(crc[2:4], 16),
			int(crc[4:6], 16),
			int(crc[6:8], 16),
			int(crc[8:10], 16),
			package[0],
			package[1]
			)
		'''
long COcxsam350Ctrl::abrircajon() 
{

unsigned char msg[]={0x74, 0};
unsigned char buff[4];
CrcBytes(msg,2,buff);
PortWrite(0xA0);

PortWrite(seq);
seq++;
PortWrite(2);
PortWrite(buff[0]);
PortWrite(buff[1]);
PortWrite(buff[2]);
PortWrite(buff[3]);
for (int k=0; k<2; k++) PortWrite(msg[k]);
return esperarespuesta();

	// TODO: Add your dispatch handler code here

	return 0;
}

'''

		return command
	def openballot(self, seq=1):
		"""
		Abre una boleta, imprimiendo los datos del contribuyente, un logo y las lineas de
		encabezado si corresponde. Se debe ejecutar en estado secundario 'jornada fiscal inicializada' o
		'jornada fiscal	no inicializada' . En caso de ni inicializada, la abre automaticamente.
		"""
		# Herramientas de convercion de datos a hexadecimal y calculo de CRC32
		# Paquete de datos especifico para abrir una boleta fiscal
		package = (self.CMD_ABRIR_BOLETA_FISCAL,04,00,00,01,00)
		# formato del paquete de datos
		s = struct.Struct('6B')
		# paquete de datos en hexa
		paquetehexa = s.pack(*package)
		# crc calculado
		crc= tools.crc32(paquetehexa)
		# tamanio del paquete de datos
		datalen= s.size

		#formato de envio del paquete de datos
		command= struct.Struct('13B')
		print (self.CMD_OPEN_COMMAND,
					seq,
					datalen,
					int(crc[2:4], 16),
					int(crc[4:6], 16),
					int(crc[6:8], 16),
					int(crc[8:10], 16),
					package[0],
					package[1],
					package[2],
					package[3],
					package[4],
					package[5])
		return command.pack(
			self.CMD_OPEN_COMMAND,
			seq,
			datalen,
			int(crc[2:4], 16),
			int(crc[4:6], 16),
			int(crc[6:8], 16),
			int(crc[8:10], 16),
			package[0],
			package[1],
			package[2],
			package[3],
			package[4],
			package[5])
	def pagos(self, seq=5,tipo=0, valor=10000 ):
		"""agrega un pago a la boleta"""

		#formato del paquete de datos (son 13 "bits")
		format = '14B'
		#tamanio del paquete de datos
		datalen= 07
		#paquete de datos especificos para abrir la boleta fiscal
		package = (self.CMD_PAGOS_BF,
			05,
			tipo,
			(0xFF000000 & valor)>>24,
			(0xFF0000 & valor)>>16,
			(0xFF00 & valor)>>8,
			(0xFF & valor))

		paquetehexa= struct.pack('7B',self.CMD_PAGOS_BF,
			05,
			tipo,
			(0xFF000000 & valor)>>24,
			(0xFF0000 & valor)>>16,
			(0xFF00 & valor)>>8,
			(0xFF & valor))
		crc= tools.crc32(paquetehexa)
		
		command = struct.pack(format,
			self.CMD_OPEN_COMMAND,
			seq,
			datalen,
			int(crc[2:4], 16),
			int(crc[4:6], 16),
			int(crc[6:8], 16),
			int(crc[8:10], 16),
			package[0],
			package[1],
			package[2],
			package[3],
			package[4],
			package[5],
			package[6])
		return command