IntroduĂ§Ă£o
Nesse dĂ©cimo post vou mostrar como utilizar a biblioteca de parĂ¢metros do JARCH. Essa biblioteca permite o gerenciamento e utilizaĂ§Ă£o de parĂ¢metros de um modo simples e prĂ¡tico. Para utilizar essa biblioteca Ă© necessario estender algumas classes. Um de nossos clientes da nossa aplicaĂ§Ă£o de Contas Pagar e Receber solicitou que fosse desabilitado as informações de Banco, Centro de Custo, Categoria e Pessoa, sua alegaĂ§Ă£o Ă© que essas informações pra ele sĂ£o irrelevantes. EntĂ£o vou demonstrar como atender a essa necessidade com parĂ¢metros, uma vez que os demais clientes dessa aplicaĂ§Ă£o vĂ£o utilizar essas informações.
Biblioteca ParĂ¢metro
O JARCH jĂ¡ possuĂ uma estrutura pronta para utilizar parĂ¢metro, mas para isso precisa ser implementado algumas classes estendendo do JARCH. EntĂ£o vou criar um pacote chamado parametro dentro do mĂ³dulo client e vou implementar as seguintes classes:
ParametroEntity.java:
@Table(name = "tb_parametro")
@Entity(name = "parametro")
public class ParametroEntity extends BaseParameterEntity {
}
IParametroManager.java:
public interface IParametroManager extends IBaseParameterManager<ParametroEntity> {
}
ParametroFacade.java
public class ParametroFacade extends BaseParameterFacade<ParametroEntity, IParametroManager> {
}
ParametroAction.java:
@Named("parameterAction")
@ViewScoped
public class ParametroAction extends BaseParameterAction<ParametroFacade> {
}
ParametroFilterSelectAction.java:
@JArchViewScoped
public class ParametroFilterSelectAction extends BaseFilterSelectAction<ParametroEntity> {
}
ParametroJpaqlBuilder.java:
public final class ParametroJpaqlBuilder {
private ParametroJpaqlBuilder() {
}
public static ClientJpaql<ParametroEntity> newInstance() {
return ClientJpaqlBuilder.newInstance(ParametroEntity.class);
}
}
ParametroManager.java:
@Dependent
public class ParametroManager extends BaseParameterManager<ParametroEntity> implements IParametroManager {
}
ParametroSearch.java:
@Dependent
public class ParametroSearch extends Search<ParametroEntity> {
}
Pronto, agora a aplicaĂ§Ă£o estĂ¡ preparada para utilizar os parĂ¢metros.
Criando ParĂ¢metros
Agora vou criar o primeiro parĂ¢metro, que vai definir se vai ser utilizado o banco nos lançamentos:
ParametroUtilizaBanco.java:
@JArchParameter
public class ParametroUtilizaBanco extends Parameter<Boolean, ParametroFacade> {
@Override
public String system() {
return BundleUtils.messageBundle("label.siglaSistema");
}
@Override
public String category() {
return BundleUtils.messageBundle("label.lancamento");
}
@Override
public String description() {
return BundleUtils.messageBundle("label.utilizaBanco");
}
@Override
public String explanation() {
return BundleUtils.messageBundle("message.utilizaBancoLancamento");
}@Override@Override
public Boolean getValue() {
return Boolean.valueOf(getValueString()) || getValueString().equals("S");
}
public void setValue(Boolean value) {
if (value == null) {
setValueString(null);
} else {
setValueString(value ? "S" : "N");
} }
@Override
public FieldType getType() {
return FieldType.BOOLEAN;
}
@Override
public Boolean valueDefault() {
return true;
}@Override}
public int row() {
return 1;
}
bundle_pt_BR.properties:
label.utilizaBanco=Utiliza Banco
Agora ao acessar o menu ParĂ¢metro:
Agora vamos definir os demais parĂ¢metros de utilizaĂ§Ă£o do Centro Custo, Categoria e Pessoa.
ParametroUtilizaCentroCusto.java:
@JArchParameter
public class ParametroUtilizaCentroCusto extends Parameter<Boolean, ParametroFacade> {
@Override
public String system() {
return BundleUtils.messageBundle("label.siglaSistema");
}
@Override
public String category() {
return BundleUtils.messageBundle("label.lancamento");
}
@Override
public String description() {
return BundleUtils.messageBundle("label.utilizaCentroCusto");
}
@Override
public String explanation() {
return BundleUtils.messageBundle("message.utilizaCentroCustoLancamento");
}
@Override
public Boolean getValue() {
return Boolean.valueOf(getValueString()) || getValueString().equals("S");
}
@Override
public void setValue(Boolean value) {
if (value == null) {
setValueString(null);
} else {
setValueString(value ? "S" : "N");
} }
@Override
public FieldType getType() {
return FieldType.BOOLEAN;
}
@Override
public Boolean valueDefault() {
return true;
}
@Override
public int row() {
return 2;
}
}
ParametroUtilizaCategoria.java:
@JArchParameter
public class ParametroUtilizaCategoria extends Parameter<Boolean, ParametroFacade> {
@Override
public String system() {
return BundleUtils.messageBundle("label.siglaSistema");
}
@Override
public String category() {
return BundleUtils.messageBundle("label.lancamento");
}
@Override
public String description() {
return BundleUtils.messageBundle("label.utilizaCategoria");
}
@Override
public String explanation() {
return BundleUtils.messageBundle("message.utilizaCategoriaLancamento");
}
@Override
public Boolean getValue() {
return Boolean.valueOf(getValueString()) || getValueString().equals("S");
}
@Override
public void setValue(Boolean value) {
if (value == null) {
setValueString(null);
} else {
setValueString(value ? "S" : "N");
} }
@Override
public FieldType getType() {
return FieldType.BOOLEAN;
}
@Override
public Boolean valueDefault() {
return true;
}
@Override
public int row() {
return 3;
}
}
ParametroUtilizaPessoa.java:
@JArchParameter
public class ParametroUtilizaPessoa extends Parameter<Boolean, ParametroFacade> {
@Override
public String system() {
return BundleUtils.messageBundle("label.siglaSistema");
}
@Override
public String category() {
return BundleUtils.messageBundle("label.lancamento");
}
@Override
public String description() {
return BundleUtils.messageBundle("label.utilizaPessoa");
}
@Override
public String explanation() {
return BundleUtils.messageBundle("message.utilizaPessoaLancamento");
}
@Override
public Boolean getValue() {
return Boolean.valueOf(getValueString()) || getValueString().equals("S");
}
@Override
public void setValue(Boolean value) {
if (value == null) {
setValueString(null);
} else {
setValueString(value ? "S" : "N");
} }
@Override
public FieldType getType() {
return FieldType.BOOLEAN;
}
@Override
public Boolean valueDefault() {
return true;
}
@Override
public int row() {
return 4;
}
}
Ajustando o bundle_pt_BR.properties:
label.utilizaBanco=Utiliza Banco
label.utilizaCentroCusto=Utiliza Centro Custo
label.utilizaCategoria=Utiliza Categoria
label.utilizaPessoa=Utiliza Pessoa
Alterando os parametros para nĂ£o utilizar as informações de Banco, Centro Custo, Categoria e Banco:
Vou agora ajustar a tela de lançamento para mostrar as informações de Banco, Centro Custo, Categoria e Pessoa de acordo com a configuraĂ§Ă£o do parĂ¢metro.Na action de dados vou injetar esses parametros e disponibilizar via gettter para configuraĂ§Ă£o na pĂ¡gina.
LancamentoDataAction.java:
@JArchViewScoped
public class LancamentoDataAction extends CrudDataAction<LancamentoEntity, LancamentoFacade> {
@Inject
@JArchParameter
private ParametroUtilizaBanco parametroUtilizaBanco;
@Inject
@JArchParameter
private ParametroUtilizaCentroCusto parametroUtilizaCentroCusto;
@Inject
@JArchParameter
private ParametroUtilizaCategoria parametroUtilizaCategoria;
@Inject
@JArchParameter
private ParametroUtilizaPessoa parametroUtilizaPessoa;
/** CĂ³digo ocultado **\
public boolean isUtilizaBanco() {
return parametroUtilizaBanco.getValue();
}
public boolean isUtilizaCentroCusto() {
return parametroUtilizaCentroCusto.getValue();
}
public boolean isUtilizaCategoria() {
return parametroUtilizaCategoria.getValue();
}
public boolean isUtilizaPessoa() {
return parametroUtilizaPessoa.getValue();
}/** CĂ³digo ocultado **\
}
lancamentoData.xhtml:
...
<a:panelGrid columns="1" rendered="#{lancamentoDataAction.utilizaBanco}">
<h:panelGroup>
<e:lookup id="idLancamentoBanco" labelUnique="#{e:bundle('label.banco')}"
header="#{e:bundle('label.banco')}" value="#{lancamentoDataAction.entity.banco}"
actionFilterSelect="#{bancoFilterSelectAction}"
disabled="#{lancamentoDataAction.blockedMaster}" required="true"
createExtensionInternal="true"/>
</h:panelGroup>
</a:panelGrid>
<a:panelGrid columns="1" rendered="#{lancamentoDataAction.utilizaCentroCusto}">
<h:panelGroup>
<e:lookup id="idLancamentoCentroCusto" labelUnique="#{e:bundle('label.centroCusto')}"
header="#{e:bundle('label.centroCusto')}"
value="#{lancamentoDataAction.entity.centroCusto}"
actionFilterSelect="#{centroCustoFilterSelectAction}"
disabled="#{lancamentoDataAction.blockedMaster}" required="true"
createExtensionInternal="true"/>
</h:panelGroup>
</a:panelGrid>
<a:panelGrid columns="1" rendered="#{lancamentoDataAction.utilizaCategoria}">
<h:panelGroup>
<e:lookup id="idLancamentoCategoria" labelUnique="#{e:bundle('label.categoria')}"
header="#{e:bundle('label.categoria')}"
value="#{lancamentoDataAction.entity.categoria}"
actionFilterSelect="#{categoriaFilterSelectAction}"
disabled="#{lancamentoDataAction.blockedMaster}" required="true"
createExtensionInternal="true"/>
</h:panelGroup>
</a:panelGrid>
<a:panelGrid columns="1" rendered="#{lancamentoDataAction.utilizaPessoa}">
<h:panelGroup>
<e:lookup id="idLancamentoPessoa" labelUnique="#{e:bundle('label.pessoa')}"
header="#{e:bundle('label.pessoa')}" value="#{lancamentoDataAction.entity.pessoa}"
actionFilterSelect="#{pessoaFilterSelectAction}"
disabled="#{lancamentoDataAction.blockedMaster}" required="true"
createExtensionInternal="true" widthCode="120" typeCode="cpf-cnpj"/>
</h:panelGroup>
</a:panelGrid>
...
Agora a tela de lançamento ficou assim:

ParĂ¢metros Default
Nosso CRUD de lançamento obriga o preenchimento do Banco, Centro Custo, Categoria e Pessoa, mas como esses campos nĂ£o serĂ£o mais mostrados na tela, entĂ£o preciso preenche-los com um valor default. Eu poderia remover a obrigatoridade dos campos mas como essa aplicaĂ§Ă£o Ă© multitenant e os demais clientes vĂ£o utilizar essas informações entĂ£o vou resolver isso atravĂ©s de parametros default. Para cada CRUD vou criar um parĂ¢metro para configurar o valor default.
ParamentroBancoDefault.java:
@JArchParameter
public class ParametroBancoDefault extends Parameter<BancoEntity, ParametroFacade> {
@Override
public String system() {
return BundleUtils.messageBundle("label.siglaSistema");
}
@Override
public String category() {
return BundleUtils.messageBundle("label.lancamento");
}
@Override
public String description() {
return BundleUtils.messageBundle("label.bancoDefault");
}
@Override
public String explanation() {
return BundleUtils.messageBundle("message.bancoDefaultLancamento");
}
@Override
public BancoEntity getValue() {
if (getValueInteger() == null) {
return null;
}
return BancoJpqlBuilder
.newInstance()
.where()
.equalsTo(BancoEntity_.id, getValueInteger().longValue())
.collect()
.singleOptional()
.orElse(null);
}
@Override
public void setValue(BancoEntity value) {
if (value == null) {
setValueInteger(null);
} else {
setValueInteger(BigInteger.valueOf(value.getId()));
}
}
@Override
public FieldType getType() {
return FieldType.ENTITY;
}
@Override
public String getFilterSelection() {
return "bancoFilterSelectAction";
}
@Override
public int row() {
return 5;
}
@Override
public boolean isRequired() {
return true;
}
}
ParametroCentroCustoDefault.java:
@JArchParameter
public class ParametroCentroCustoDefault extends Parameter<CentroCustoEntity, ParametroFacade> {
@Override
public String system() {
return BundleUtils.messageBundle("label.siglaSistema");
}
@Override
public String category() {
return BundleUtils.messageBundle("label.lancamento");
}
@Override
public String description() {
return BundleUtils.messageBundle("label.centroCustoDefault");
}
@Override
public String explanation() {
return BundleUtils.messageBundle("message.centroCustoDefaultLancamento");
}
@Override
public CentroCustoEntity getValue() {
if (getValueInteger() == null) {
return null;
}
return CentroCustoJpqlBuilder
.newInstance()
.where()
.equalsTo(CentroCustoEntity_.id, getValueInteger().longValue())
.collect()
.singleOptional()
.orElse(null);
}
@Override
public void setValue(CentroCustoEntity value) {
if (value == null) {
setValueInteger(null);
} else {
setValueInteger(BigInteger.valueOf(value.getId()));
}
}
@Override
public FieldType getType() {
return FieldType.ENTITY;
}
@Override
public String getFilterSelection() {
return "centroCustoFilterSelectAction";
}
@Override
public int row() {
return 6;
}
@Override
public boolean isRequired() {
return true;
}
}
ParametroCategoriaDefault.java:
@JArchParameter
public class ParametroCategoriaDefault extends Parameter<CentroCustoEntity, ParametroFacade> {
@Override
public String system() {
return BundleUtils.messageBundle("label.siglaSistema");
}
@Override
public String category() {
return BundleUtils.messageBundle("label.lancamento");
}
@Override
public String description() {
return BundleUtils.messageBundle("label.centroCustoDefault");
}
@Override
public String explanation() {
return BundleUtils.messageBundle("message.centroCustoDefaultLancamento");
}
@Override
public CentroCustoEntity getValue() {
if (getValueInteger() == null) {
return null;
}
return CentroCustoJpqlBuilder
.newInstance()
.where()
.equalsTo(CentroCustoEntity_.id, getValueInteger().longValue())
.collect()
.singleOptional()
.orElse(null);
}
@Override
public void setValue(CentroCustoEntity value) {
if (value == null) {
setValueInteger(null);
} else {
setValueInteger(BigInteger.valueOf(value.getId()));
}
}
@Override
public FieldType getType() {
return FieldType.ENTITY;
}
@Override
public String getFilterSelection() {
return "centroCustoFilterSelectAction";
}
@Override
public int row() {
return 7;
}
@Override
public boolean isRequired() {
return true;
}
}
ParametroPessoaDefault.java:
@JArchParameter
public class ParametroPessoaDefault extends Parameter<PessoaEntity, ParametroFacade> {
@Override
public String system() {
return BundleUtils.messageBundle("label.siglaSistema");
}
@Override
public String category() {
return BundleUtils.messageBundle("label.lancamento");
}
@Override
public String description() {
return BundleUtils.messageBundle("label.pessoaDefault");
}
@Override
public String explanation() {
return BundleUtils.messageBundle("message.pessoaDefaultLancamento");
}
@Override
public PessoaEntity getValue() {
if (getValueInteger() == null) {
return null;
}
return PessoaJpqlBuilder
.newInstance()
.where()
.equalsTo(PessoaEntity_.id, getValueInteger().longValue())
.collect()
.singleOptional()
.orElse(null);
}
@Override
public void setValue(PessoaEntity value) {
if (value == null) {
setValueInteger(null);
} else {
setValueInteger(BigInteger.valueOf(value.getId()));
}
}
@Override
public FieldType getType() {
return FieldType.ENTITY;
}
@Override
public String getFilterSelection() {
return "pessoaFilterSelectAction";
}
@Override
public int row() {
return 8;
}
@Override
public boolean isRequired() {
return true;
}
}
bundle_pt_BR.properties:
label.bancoDefault=Banco Default
label.centroCustoDefault=Centro Custo Default
label.categoriaDefault=Categoria Default
label.pessoaDefault=Pessoa Default
Agora executando novamente a tela de parĂ¢metros:
Ajuste Evento InclusĂ£o
O que preciso fazer agora Ă© interceptar a inclusĂ£o de lançamento e setar o Banco, Centro Custo, Categoria e Pessoa com o que estĂ¡ configurado nos parĂ¢metros. EntĂ£o no LancamentoObserver faço a seguinte implementaĂ§Ă£o:
LancamentoObserver.java:
public class LancamentoObserver {
@JArchParameter
@Inject
private ParametroBancoDefault parametroBancoDefault;
@JArchParameter
@Inject
private ParametroCentroCustoDefault parametroCentroCustoDefault;
@JArchParameter
@Inject
private ParametroCategoriaDefault parametroCategoriaDefault;
@JArchParameter
@Inject
private ParametroPessoaDefault parametroPessoaDefault;
/** CĂ³digo Ocultado **\
private void criacaoLancamento(@Observes @JArchEventCreateEntity LancamentoEntity lancamento) {
lancamento.setAberto(true);
lancamento.setBanco(parametroBancoDefault.getValue());
lancamento.setCentroCusto(parametroCentroCustoDefault.getValue());
lancamento.setCategoria(parametroCategoriaDefault.getValue());
lancamento.setPessoa(parametroPessoaDefault.getValue());
}/** CĂ³digo Ocultado **\}
Agora no lançamento de uma conta a pagar ou receber temos:
ConclusĂ£o
Nesse post mostrei como utilizar um recurso muito importante na configuraĂ§Ă£o da aplicaĂ§Ă£o, a biblioteca de ParĂ¢metros do JARCH. Para habilitar precisamos criar as classes concretas estendendo das classes do JARCH, e agora sempre que for necessĂ¡rio criar um parĂ¢metro, basta criar uma classe estendendo da classe Parameter. Com certeza essa biblioteca vai atender todas as necessidades de parĂ¢metros da aplicaĂ§Ă£o, desde os tipos primitivos atĂ© tipos mais complexos como Classes, Imagens, etc. E na criaĂ§Ă£o de um novo parĂ¢metro nĂ£o precisei mexer em banco de dados nem na interface grĂ¡fica, o JARCH jĂ¡ faz isso automaticamente. No prĂ³ximo post explorarei mais recursos do JARCH.
Segue o link dessa video aula: https://youtu.be/eH2tAEFChm4
Até mais,
Nenhum comentĂ¡rio:
Postar um comentĂ¡rio