• Facebook
  • Twitter
  • Reddit
  • StumbleUpon
  • Digg
  • email

#-*- encoding: iso-8859-1 -*-
#-*- coding: iso-8859-1 -*-
 
import os
import PyQt4
from pyHed.common import *
from pyHed.components import *
import frameCustomRpt
import pyHedReportList
import pyHedReportMd
 
wherePrivateWord = '%WHERECLAUSE%'
 
class FrameCustomRptCondition(frameCustomRpt.FrameCustomRpt):
	"""
		Nesta classe, você encontra diversas facilidades para geração do seu relatório. Usando o componentes do condComponents, ele irá montar todo o SQL
		do relatório e já irá chamar o classe do relatório e mostrará o mesmo na tela para o usuário
			- reportPath = caminho para geração do arquivo .pdf
			- masterFields = field's Master (usados na hora da criação do Master/Detail)
			- detailFields = field's Details (usados na hora da criação do Master/Detail)
			- masterKey = Coluna Usada para separar os Registros
			- sql = sql do relatório já com o %WHERECLAUSE%
			- exportCsvFields = fields dos masters do CSV
			- params = parâmetros adicionais
		Edgar, 25/set/2008
	"""
	def __init__(self, parent, reportFields, reportPath, exportCsvFields, sql=None, params=None):
		super(FrameCustomRptCondition, self).__init__(parent, params)
 
		# caminho para criação do pdf na máquina
		self.__reportPath = reportPath
		# Campos do Relatório
		self.__reportFields = reportFields
		# Fields Para Exportar para CSV
		self.__exportCsvFields = exportCsvFields
		# SQL do relatório
		self.__sql = sql
 
	def onPaint(self):
		super(FrameCustomRptCondition, self).onPaint()
 
		# botão de impressão
		self.btnImprimir = components.Button(self.PnlButtons, text=u"&" + pyHedConsts.translation.getItem('framecustomrptcondition', 'print_button'), icon='%s/icon_impressora.gif' % pyHedConsts.pyHedImagePath, x=10, y=4, width=100, hint=pyHedConsts.translation.getItem('framecustomrptcondition', 'print_button_hint'))
		self.connect(self.btnImprimir, PyQt4.QtCore.SIGNAL('clicked()'), self.evtImprimir)
		# botão de exportar para planilha
		self.btnExportar = components.Button(self.PnlButtons, text=u"&" + pyHedConsts.translation.getItem('framecustomrptcondition', 'export_button'), icon='%s/icon_exportar_csv.gif' % pyHedConsts.pyHedImagePath, x=self.btnImprimir.width()+20, y=4, width=100, hint=pyHedConsts.translation.getItem('framecustomrptcondition', 'export_button_hint'))
		#self.btnExportar.setVisible(False)		
		self.connect(self.btnExportar, PyQt4.QtCore.SIGNAL('clicked()'), self.evtExportar)
 
	def getWhereClause(self, container = None):
		def getValues(container):
			where = ''
			for comp in container.children():
				# if the comp is a container, then, re-calls the getWhereClause to search conditions inside it
				if comp.children() != [] and not issubclass(comp.__class__, condComponents.CustomCondition):
					where += getValues(comp)
				elif issubclass(comp.__class__, condComponents.CustomCondition):
					if comp.getSqlClause() is None and comp.getRequired():
						raise pyHedExceptions.UserException('%s %s' % (pyHedConsts.translation.getItem('framecustombtndb', 'required_field'), comp.label.text().toLatin1()))
					elif comp.getSqlClause() is not None:
						where += comp.getSqlClause() + ' and '
			return where[:len(where) - 5]
 
		"""
			Retorna o where montado para passagem para o sql. Percorre todos os componentes condition do PnlMain
			Edgar, 25/set/2008
		"""
		# if container is None, getWhereClause must search throughout the PnlMain
		if container is None:
			return getValues(self.PnlMain)
		else:
			return getValues(container)
 
	def evtImprimir(self):
		"""
			Função responsável por gerar o sql e criar/passar para o relatório definido. Percorre todos os componentes condition's que possuem como parent o
			PnlMain e busca os valores do where.
			Edgar, 25/set/2008
		"""
		self.setCursor(PyQt4.QtCore.Qt.WaitCursor)
		try:			
 
			# busca a cláusula where e executa a sql
			rs = pyHedConsts.dbInst.getConnection().execute(self.__sql.replace(wherePrivateWord, self.getWhereClause())).fetchall()
 
			# Verifica os Master e Detail Fields e Chama o Relatório Específico.			
			if self.__reportFields.get("masterFields"):
				report = pyHedReportMd.PyHedReportMd(reportFields=self.__reportFields, reportPath=self.__reportPath, dataSet=rs)
				self.evtBeforeBuild(report)
				report.build()
			elif self.__reportFields.get("detailFields") and not self.__reportFields.get("masterFields"):
				report = pyHedReportList.PyHedReportList(reportFields=self.__reportFields, reportPath=self.__reportPath, dataSet=rs)
				self.evtBeforeBuild(report)
				report.build()
			else:
				raise pyHedExceptions.UserException(pyHedConsts.translation.getItem('framecustomrptcondition', 'no_fields_defined'))
 
		finally:
			self.setCursor(PyQt4.QtCore.Qt.ArrowCursor)
 
	def evtBeforeBuild(self, report):
		"""
			Atention: This method is called before mounting the report, if want to set its properties you must inherit it from.
			John, 29/may/2009
		"""
		pass
 
	def evtExportar(self):
		"""
			Função responsável por gerar a exportacao do csv de um relatório, salvando no local escolhido apartir da consulta selecionada
			Uso MasterFields:
			__masterFields, para o uso de Labels nas colunas do csv é necessário que se use a váriavel padrão __masterFields passando o valor dos labels,
			fica compatível com a evtImprimir padrão, caso o método evtImprimir seja herdado e reescrito, é necessário que seja diferenciado o
			__masterFields de cada um pois neste método ele necessita de todos os labels dos campos setados na sql.
			John, 31/out/2008
		"""
		self.setCursor(PyQt4.QtCore.Qt.WaitCursor)
		try:			
			recordSet = pyHedConsts.dbInst.getConnection().execute(self.__sql.replace(wherePrivateWord, self.getWhereClause())).fetchall()
			if len(recordSet) > 0:
				# Abre modal do PyQt4 para escolher o local onde salvar o arquivo
				fileDialog = PyQt4.QtGui.QFileDialog(self, pyHedConsts.translation.getItem('framecustomrptcondition', 'save_file_dialog'))
				fileDialog.setAcceptMode(PyQt4.QtGui.QFileDialog.AcceptSave)
				if fileDialog.exec_():
					# Chama função do dbMain.exportCsv padrão de csv e passa o recordSet, o path e os labels, com retorno True exibe a mensagem.
					if pyHedConsts.dbInst.exportCsv(recordSet, fileDialog.selectedFiles()[0].toLatin1(), self.__exportCsvFields):
						components.messageBox(pyHedConsts.translation.getItem('framecustomrptcondition', 'data_exported_success'))
			else: 
				raise pyHedExceptions.UserException(pyHedConsts.translation.getItem('framecustomrptcondition', 'no_data_resulted'))
		finally:
			self.setCursor(PyQt4.QtCore.Qt.ArrowCursor)
 
	def getSql(self):
		return self.__sql
 
	def setSql(self, value):
		if str(value).find(wherePrivateWord) == -1:
			raise Exception(u'The private word was not found on the whereClause. It should be informed on the sql to put the correct where clause no the SQL. Private word: %s' % wherePrivateWord)
		self.__sql = value
 
	def __getEvtAfterWhereClause(self):
		return self.__evtAfterWhereClause
 
	def __setEvtAfterWhereClause(self, value):
		self.__evtAfterWhereClause = value
 
	# retorna a sql do relatório
	SQL = property(getSql, setSql)