Objetivo


Esse documento tem como objetivo mostrar os Totalizadores existentes no Storex Custom e como devemos fazer para customizá-los.


Totalizadores


Atualmente o Storex Custom fornece uma gama de classes Totalizadores, que possuem o objetivo de armazenar informações das transações realizadas ao longo de um dia de movimento do caixa.

Esses Totalizadores são armazenados em conjuntos específicos e suas informações são utilizadas nos processos de emissão de Leituras do Operador, Leituras do Dia, Fechamento X e para fazer o controle do saldo do caixa.


Conjuntos de totalizadores

Conjuntos de Totalizadores existentes no Storex. Eles são disponibilizados dentro da lib do linx-p2k-entities e esta é uma das dependências requeridas pelos demais componentes.

  • ConjuntoTotalFidelizacao

  • ConjuntoTotalImposto

  • ConjuntoTotalOperacao

  • ConjuntoTotalOperador

  • ConjuntoTotalPorAutorizadora

  • ConjuntoTotalRecebimento

Mais abaixo vamos explicar a função de cada um desses conjuntos.


Totais de Recebimentos

Define um conjunto de total dos recebimentos, com as funções básicas de inclusão, remoção, consulta e busca.

A classe ConjuntoTotalRecebimento é o conjunto responsável por armazenar o valor total por forma recebida, nas operações realizadas ao longo de um dia de movimento no caixa.

Ao lado podemos ver a implementação dos principais métodos dessa classe. Os métodos inclui() e atualizaElemento() aceitam um tipo com.csi.info.transacoes.operacional.TotalRecebimento.

A classe com.csi.info.transacoes.operacional.TotalRecebimento representa a totalização para um dado Recebimento. Ou seja, possui informações pertinentes a um recebimento, como por exemplo a forma utilizada (dinheiro, crédito, débito, etc) e o valor recebido (R$ 10,00, R$ 15,00, etc).


Métodos da classe ConjuntoTotalRecebimento
public void atualizaElemento(TotalRecebimento total) throws
	ExcecaoObjetoJaExistente, ExcecaoObjetoInexistente {
	this.deleta(total.getChave());		
	this.inclui(total);
}

public TotalRecebimento busca(Chave chave) throws ExcecaoObjetoInexistente {
	Object result = colecao.busca(chave);
	return ((TotalRecebimento) result);
}

public boolean consulta(Chave chave) {
	return colecao.consulta(chave);
}

public void deleta(Chave chave) throws ExcecaoObjetoInexistente {
	colecao.deleta(chave);
}

public Enumeration elementos() {
	return colecao.elementos();
}

public boolean equals(Object obj) {
	if (obj instanceof ConjuntoTotalRecebimento) {
		ConjuntoTotalRecebimento temp;
		temp = (ConjuntoTotalRecebimento) obj;
		return colecao.equals(temp.colecao);
	}
	return false;
}

public void inclui(TotalRecebimento elemento) throws ExcecaoObjetoJaExistente {
	colecao.inclui(elemento);
}

Totais de impostos

A classe ConjuntoTotalImposto define um conjunto de total dos impostos, com as funções básicas de inclusão, remoção, consulta e busca.

Ao lado podemos ver a implementação dos principais métodos dessa classe. Os métodos inclui() e atualizaElemento() aceitam um tipo com.csi.info.transacoes.operacional.TotalImposto.

A classe TotalImposto é utilizada para contabilizar o total de encargos por tipo de imposto.


Métodos da classe ConjuntoTotalImposto
public boolean consulta(Chave chave) {
	return colecao.consulta(chave);
}

public void deleta(Chave chave) throws ExcecaoObjetoInexistente {
	colecao.deleta(chave);
}

public Enumeration elementos() {
	return colecao.elementos();
}

public void inclui(TotalImposto elemento) throws ExcecaoObjetoJaExistente {
	colecao.inclui(elemento);
}

public void atualizaElemento(TotalImposto total) throws
	ExcecaoObjetoInexistente {
	this.deleta(total.getChave());
	try {
		this.inclui(total);
	} catch (ExcecaoObjetoJaExistente e) {
	}
}

Totais de Fidelizações

A classe ConjuntoTotalFidelizacao define um conjunto de total das fidelizações, com as funções básicas de inclusão, remoção, consulta e busca.

Ao lado podemos ver a implementação dos principais métodos dessa classe. O método inclui() aceita um tipo com.csi.info.transacoes.operacional.TotalFidelizacao.

A classe TotalFidelizacao é utilizada para contabilizar as fidelizações por tipo e valor, nas operações realizadas ao longo de um dia de movimento no caixa.


Métodos da classe ConjuntoTotalFidelizacao
public TotalFidelizacao busca(Chave chave) throws ExcecaoObjetoInexistente {
	Object result = colecao.busca(chave);
	return ((TotalFidelizacao) result);
}

public boolean consulta(Chave chave) {
	return colecao.consulta(chave);
}

public void deleta(Chave chave) throws ExcecaoObjetoInexistente {
	colecao.deleta(chave);
}

public Enumeration elementos() {
	return colecao.elementos();
}

public void inclui(TotalFidelizacao elemento) throws ExcecaoObjetoJaExistente {
	colecao.inclui(elemento);
}

Totais por Autorizadora

Define um conjunto de total dos recebimentos por autorizadora de cartão, com as funções básicas de inclusão, remoção, consulta e busca.

Ao lado podemos ver a implementação dos principais métodos dessa classe. O método inclui() aceita um tipo com.csi.info.transacoes.operacional.TotalPorAutorizadora.

Métodos da classe ConjuntoTotalPorAutorizadora
public boolean consulta(Chave chave) {
	return colecao.consulta(chave);
}

public void deleta(Chave chave) throws ExcecaoObjetoInexistente {
	colecao.deleta(chave);
}

public int tamanho() {
	return colecao.tamanho();
}

public void atualizaElemento(TotalPorAutorizadora total) throws
	ExcecaoObjetoJaExistente, ExcecaoObjetoInexistente {
	this.deleta(total.getChave());		
	this.inclui(total);
}

public TotalPorAutorizadora busca(Chave chave) throws ExcecaoObjetoInexistente {
	Object result = colecao.busca(chave);
	return ((TotalPorAutorizadora) result);
}

public void inclui(TotalPorAutorizadora elemento) throws ExcecaoObjetoJaExistente {
	colecao.inclui(elemento);
}

Totais de Operações

Define um conjunto de total das operações, com as funções básicas de inclusão, remoção, consulta e busca.

Ao lado podemos ver a implementação dos principais métodos dessa classe. O método inclui() aceita um tipo com.csi.info.transacoes.operacional.TotalOperacao.

A classe TotalOperacao representa o total por operações. Ou seja, ela é usada para acumular informações, como o valor registrado na operação, valor de encargos, valor de descontos, valor de itens cancelados. Além disso possui um ConjuntoTotalRecebimento, que pode ser usado para registrar o valor de cada recebimento por código da forma utilizada (dinheiro, cartão de crédito, cartão de débito, etc).









A classe TotalOperacao possui um atributo String tipoDeOperacao;. Esse atributo é utilizado para identificar qual é a operação que o TotalOperacao representa. São dezenas de tipos disponíveis, representados por constantes nessa mesma classe. Ao lado temos alguns exemplos de tipos de operação.

O construtor de TotalOperacao exige que seja informado o tipo de operação. Portanto, ao criar uma instância de TotalOperacao é obrigatório informar uma das constantes disponibilizadas pela classe.






Métodos da classe ConjuntoTotalOperacao
public TotalOperacao busca(Chave chave) throws ExcecaoObjetoInexistente {
	Object result = colecao.busca(chave);
	return ((TotalOperacao) result);
}
	
public boolean consulta(Chave chave) {
	return colecao.consulta(chave);
}
	
public void deleta(Chave chave) throws ExcecaoObjetoInexistente {
	colecao.deleta(chave);
}

public void inclui(TotalOperacao elemento) throws ExcecaoObjetoJaExistente {
	colecao.inclui(elemento);
}
Atributo tipo da classe TotalOperacao
 /**
 * Constante que padroniza o tipo de operação para venda em cupom fiscal
 */
 public static final String VENDA_CUPOM_FISCAL="VENDA_CUPOM_FISCAL";
 
 /**
 * Constante que padroniza o tipo de operação para venda em cupom não fiscal
 */
 public static final String VENDA_CUPOM_NAO_FISCAL = "VENDA_CUPOM_NAO_FISCAL";

 /**
 * Constante que padroniza o tipo de operação para pagamento em carne
 */
 public static final String PAGAMENTO_CARNE="PAGAMENTO_CARNE";
 
 /**
 * Constante que padroniza o tipo de pedido
 */
 public static final String PEDIDO_CUPOM_FISCAL="PEDIDO_CUPOM_FISCAL";

 /**
  * Constante que padroniza o tipo de operação de anulacao de venda
  */
 public static final String ANULACAO_VENDA = "ANULACAO_VENDA";


public TotalOperacao(String tipoOperacao)
			throws ExcecaoStringInvalido, ExcecaoTipoInvalido {
	// implementação do construtor.
}

Totais do Operador

O conjunto de totais do operador é representado pela classe ConjuntoTotalOperador e este por sua vez define um conjunto de com.csi.info.transacoes.operacional.TotalOperador, com as funções básicas de inclusão, remoção, consulta e busca.

Essa classe representa os totais de todos os tipos de operações para um operador realizadas no PDV que mexem com o caixa do PDV. O Operador realiza diversas operações ao longo do dia. Essas operações são armazenadas nesse conjunto, onde cada tipo de operação é acumulada usando-se a classe TotalOperacao, citada mais acima.

Essas informações são utilizadas para emissão das Leituras de Operador e Fechamento X. Elas são utilizadas, também para fazer o controle de saldo de caixa, nas operações de saída de numerário.


Métodos da classe ConjuntoTotalOperador
public void atualizaElemento(TotalOperador total, int diferenciador) throws
	ExcecaoObjetoInexistente {
	// implementação do método
}

public TotalOperador busca(Chave chave, int diferenciador) throws ExcecaoObjetoInexistente {
	// implementação do método
}

public boolean consulta(Chave chave, int diferenciador) {
	// implementação do método
}

public void deleta(Chave chave, int diferenciador) throws ExcecaoObjetoInexistente {
	// implementação do método
}

public void inclui(TotalOperador elemento, int diferenciador) throws ExcecaoObjetoJaExistente{
	// implementação do método
}

Customizando um Totalizador


As classes que representam os totalizadores, possuem especializações chamadas de classes extensíveis. Através delas podemos fazer customizações nos totalizadores, incluindo novas informações para serem contabilizadas ao longo das operações realizadas pelos operadores de caixa.

Classes Extensíveis

Tomando como exemplo a classe com.csi.info.transacoes.operacional.TotalImposto, vamos encontrar a classe com.csi.info.transacoes.operacional.TotalImpostoExtensivel.

As classes extensíveis fornecem uma abstração que possibilita customização de novos dados do Storex Custom. Através dos métodos getCustomEntity() e setCustomEntity().

A classe CustomEntity foi criada para representar uma entidade capaz de contemplar as customizações de dados do Storex-Custom. Por ela ser uma classe abstrata, é necessário que seja implementado uma classe que herde de CustomEntity. Mais detalhes a respeito de como implementar uma classe que possua a herança de CustomEntity, será abordado em outro documento.





















Portanto, para realizar uma customização num Totalizador, é necessário criar uma classe que herde de CustomEntity. Esta por sua vez, será instanciada e passada para o método setCustomEntity() da classe TotalImpostoExtensivel. Ao lado temos um exemplo de implementação de uma classe que herda de CustomEntity.

TotalRecebimentoExtensivel
package com.csi.info.transacoes.operacional;


import com.csi.info.custom.CustomEntity;
// demais imports


public class TotalImpostoExtensivel extends TotalImposto {


  // implementação da classe


 /**
 * Retorna Dados customizados
 * @return Dados customizados
 */
 public CustomEntity getCustomEntity() {
	CustomEntity retorno = null;
	if(this.atributosObject.length > POS_OBJECT_CUSTOM_ENTITY) {
		retorno = (CustomEntity)this.atributosObject[POS_OBJECT_CUSTOM_ENTITY];
	}		
	return retorno;
 }

 /**
 * Dados customizados
 * @param dados customizados
 */
 public void setCustomEntity(CustomEntity customEntity) {
	try {
		if(this.atributosObject.length > POS_OBJECT_CUSTOM_ENTITY) {
			this.atributosObject[POS_OBJECT_CUSTOM_ENTITY] = customEntity;
		}
	} catch (Exception e) {}	
 }


}
Exemplo de CustomEntity
public class TotalImpostoCustom extends CustomEntity {

	private static final int OBJECT_POS_NOVO_IMPOSTO = 0;

	private static final int TAMANHO_ARR_OBJ = 1;
	private static final int TAMANHO_ARR_LONG = 0;
	private static final int TAMANHO_ARR_BOOL = 0;

    public TotalImpostoCustom() {
       super();
       inicializaArrays();
    }

	protected void inicializaArrays() {
		this.atributosObject = new Object[TAMANHO_ARR_OBJ];
		this.atributosBooleanos = new boolean[TAMANHO_ARR_BOOL];
		this.atributosLong = new long[TAMANHO_ARR_LONG];
	}

	public CSIBigDecimal getNovoImposto() {
		CSIBigDecimal novoImposto = null;
		try {
			if (this.atributosObject != null && this.atributosObject.length  > OBJECT_POS_NOVO_IMPOSTO) {
				novoImposto =  (CSIBigDecimal) this.atributosObject[OBJECT_POS_NOVO_IMPOSTO];
			}
		}catch (Exception e) {
		}
		
		return novoImposto;
	}

	public void setNovoImposto(CSIBigDecimal novoImposto) {
		try {
			if (this.atributosObject != null && this.atributosObject.length  > OBJECT_POS_NOVO_IMPOSTO) {
				this.atributosObject[OBJECT_POS_NOVO_IMPOSTO] = novoImposto;
			}
		}catch (Exception e) {
		}
	}
	
	public void somaValorImposto(CSIBigDecimal novoImposto){
	   // soma o valor do imposto
	}
	
	public void subtraiValorImposto(CSIBigDecimal novoImposto){
	   // subtrai o valor do imposto
	}
	
}



  • Sem rótulos