julio 2015-10-26 13:06:03 +00:00
parent 1d92add413
commit 5f8fa3a878
8 changed files with 602 additions and 317 deletions

View File

@ -3,10 +3,13 @@ package com.rjconsultores.ventaboletos.dao;
import java.util.Date;
import java.util.List;
import com.rjconsultores.ventaboletos.entidad.Comissao;
import com.rjconsultores.ventaboletos.vo.comissao.BoletoComissao;
public interface ComissaoDAO {
public interface ComissaoDAO extends GenericDAO<Comissao, Integer> {
public List<BoletoComissao> buscarReceitasComissoes(Integer puntoVentaId, Integer empresaId, Date periodo);
public List<Comissao> buscaComissaoVigencia(Integer puntoVentaId, Integer empresaId, Date periodo);
}

View File

@ -16,6 +16,7 @@ import org.springframework.stereotype.Repository;
import com.rjconsultores.ventaboletos.dao.ComissaoDAO;
import com.rjconsultores.ventaboletos.entidad.Comissao;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.vo.comissao.BoletoComissao;
@Repository("comissaoHibernateDAO")
@ -39,17 +40,24 @@ public class ComissaoHibernateDAO extends GenericHibernateDAO<Comissao, Integer>
sql.append("coalesce(sum(b.importepedagio), 0) as pedagio, coalesce(sum(b.importetaxaembarque), 0) as embarque, ");
sql.append("coalesce(sum(case when ee.tipoeventoextra_id = 1 then ee.impingreso else 0 end), 0) as excessoBagagem, ");
sql.append("coalesce(sum(case when ee.tipoeventoextra_id = 21 then ee.impingreso else 0 end), 0) as seguroOpcional, ");
sql.append("coalesce(sum(case when ee.tipoeventoextra_id <> 21 or ee.tipoeventoextra_id <> 1 then ee.impingreso else 0 end), 0) as seguroOutros, ");
sql.append("case when c.ptovtaventa_id = b.puntoventa_id then 1 else 0 end as ptoVtaOrigem ");
sql.append("coalesce(sum(case when ee.tipoeventoextra_id <> 21 ");
sql.append(" or ee.tipoeventoextra_id <> 1 then ee.impingreso else 0 end), 0) as seguroOutros, ");
sql.append("case when c.ptovtaventa_id = b.puntoventa_id then 1 else 0 end as ptoVtaOrigem, ");
sql.append("ei.icms as icmsBase ");
sql.append("from boleto b ");
sql.append("inner join parada origen on origen.parada_id = b.origen_id ");
sql.append("inner join ciudad ci on origen.ciudad_id = ci.ciudad_id ");
sql.append("inner join estado e on ci.estado_id = e.estado_id ");
sql.append("inner join empresa_imposto ei on (ei.estado_id = e.estado_id ");
sql.append(" and ei.empresa_id = b.marca_id and ei.activo = 1) ");
sql.append("left join caja c on c.numoperacion = b.numoperacion and c.numfoliosistema = b.numfoliosistema ");
sql.append("and c.numfoliopreimpreso = b.numfoliopreimpreso and c.numseriepreimpresa = b.numseriepreimpresa ");
sql.append(" and c.numfoliopreimpreso = b.numfoliopreimpreso and c.numseriepreimpresa = b.numseriepreimpresa ");
sql.append("left join evento_extra ee on ee.boleto_id = b.boleto_id ");
sql.append("where ");
sql.append("to_char(b.fechorventa, 'mmyyyy') = to_char(:periodo, 'mmyyyy') ");
sql.append("and b.marca_id = :empresaId and b.puntoventa_id = :puntoventaId ");
sql.append("group by b.marca_id, b.puntoventa_id, to_char(b.fechorventa, 'dd-mm-yyyy'), ");
sql.append("b.indstatusboleto, b.tipoventa_id, b.motivocancelacion_id, c.ptovtaventa_id ");
sql.append("b.indstatusboleto, b.tipoventa_id, b.motivocancelacion_id, c.ptovtaventa_id, ei.icms ");
sql.append("order by datavenda ");
Query query = getSession().createSQLQuery(sql.toString())
@ -67,7 +75,7 @@ public class ComissaoHibernateDAO extends GenericHibernateDAO<Comissao, Integer>
.addScalar("seguroOpcional", BigDecimalType.INSTANCE)
.addScalar("seguroOutros", BigDecimalType.INSTANCE)
.addScalar("ptoVtaOrigem", BooleanType.INSTANCE)
.addScalar("icmsBase", BigDecimalType.INSTANCE)
.setResultTransformer(new AliasToBeanResultTransformer(BoletoComissao.class));
query.setTimestamp("periodo", periodo);
@ -76,4 +84,24 @@ public class ComissaoHibernateDAO extends GenericHibernateDAO<Comissao, Integer>
return query.list();
}
@SuppressWarnings("unchecked")
@Override
public List<Comissao> buscaComissaoVigencia(Integer puntoVentaId, Integer empresaId, Date periodo) {
StringBuilder hql = new StringBuilder();
hql.append(" from Comissao c ");
hql.append(" where c.activo = 1 ");
hql.append(" AND c.puntoVentaId = :puntoventaId ");
hql.append(" AND c.empresaId = :empresaId ");
hql.append(" AND c.competencia = :periodo ");
Query query = getSession().createQuery(hql.toString());
query.setString("periodo", DateUtil.getStringDate(periodo, "MM/yyyy"));
query.setInteger("puntoventaId", puntoVentaId);
query.setInteger("empresaId", empresaId);
return query.list();
}
}

View File

@ -30,136 +30,148 @@ import javax.persistence.TemporalType;
@SequenceGenerator(name = "PTOVTA_COMISSAO_SEQ", sequenceName = "PTOVTA_COMISSAO_SEQ", allocationSize = 1)
@Table(name = "PTOVTA_COMISSAO")
public class PtovtaComissao implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "PTOVTA_COMISSAO_SEQ")
@Column(name = "PTOVTACOMISSAO_ID")
private Integer ptovtaComissaoId;
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "PTOVTA_COMISSAO_SEQ")
@Column(name = "PTOVTACOMISSAO_ID")
private Integer ptovtaComissaoId;
@Column(name = "ISSRETIDO")
private BigDecimal issretido;
@Column(name = "ISSRETIDO")
private BigDecimal issretido;
@Column(name = "ROYALTIES")
private BigDecimal royalties;
@Column(name = "ROYALTIES")
private BigDecimal royalties;
@Column(name = "ENVIARRECIBO")
private Boolean enviarRecibo;
@Column(name = "ENVIARRECIBO")
private Boolean enviarRecibo;
@Column(name = "RECEITA")
private String receita;
@Column(name = "RECEITA")
private String receita;
@OneToOne
@JoinColumn(name = "PTOVTADESCOMISSAO_ID")
private PuntoVenta descComissaoId;
@OneToOne
@JoinColumn(name = "PTOVTADESCOMISSAO_ID")
private PuntoVenta descComissaoId;
@Column(name = "PASSAGEMALTA")
private BigDecimal passagemAlta;
@Column(name = "PASSAGEMALTA")
private BigDecimal passagemAlta;
@Column(name = "PASSAGEMBAIXA")
private BigDecimal passagemBaixa;
@Column(name = "PASSAGEMBAIXA")
private BigDecimal passagemBaixa;
@Column(name = "SEGUROALTA")
private BigDecimal seguroAlta;
@Column(name = "SEGUROALTA")
private BigDecimal seguroAlta;
@Column(name = "SEGUROBAIXA")
private BigDecimal seguroBaixa;
@Column(name = "SEGUROBAIXA")
private BigDecimal seguroBaixa;
@Column(name = "OUTROSBAIXA")
private BigDecimal outrosBaixa;
@Column(name = "OUTROSBAIXA")
private BigDecimal outrosBaixa;
@Column(name = " OUTROSALTA")
private BigDecimal outrosAlta;
@Column(name = " OUTROSALTA")
private BigDecimal outrosAlta;
@Column(name = "EXCESSOALTA")
private BigDecimal excessoAlta;
@Column(name = "EXCESSOALTA")
private BigDecimal excessoAlta;
@Column(name = "EXCESSOBAIXA")
private BigDecimal excessoBaixa;
@Column(name = "EXCESSOBAIXA")
private BigDecimal excessoBaixa;
@Column(name = "TARIFARECEITA")
private Boolean tarifaReceita;
@Column(name = "TARIFARECEITA")
private Boolean tarifaReceita;
@Column(name = " SEGURORECEITA")
private Boolean seguroReceita;
@Column(name = " SEGURORECEITA")
private Boolean seguroReceita;
@Column(name = "TAXARECEITA")
private Boolean taxaReceita;
@Column(name = "TAXARECEITA")
private Boolean taxaReceita;
@Column(name = "PEDAGIORECEITA")
private Boolean pedagioReceita;
@Column(name = "PEDAGIORECEITA")
private Boolean pedagioReceita;
@Column(name = " TARIFADEV")
private Boolean tarifaDev;
@Column(name = " TARIFADEV")
private Boolean tarifaDev;
@Column(name = " SEGURO_DEV")
private Boolean seguroDev;
@Column(name = " SEGURO_DEV")
private Boolean seguroDev;
@Column(name = "TAXADEV")
private Boolean taxaDev;
@Column(name = "TAXADEV")
private Boolean taxaDev;
@Column(name = "PEDAGIODEV")
private Boolean pedagioDev;
@Column(name = "PEDAGIODEV")
private Boolean pedagioDev;
@Column(name = "ACTIVO")
private Boolean activo;
@Column(name = "ACTIVO")
private Boolean activo;
@Column(name = "FECMODIF")
@Temporal(TemporalType.TIMESTAMP)
private Date fecmodif;
@Column(name = "FECMODIF")
@Temporal(TemporalType.TIMESTAMP)
private Date fecmodif;
@Column(name = "USUARIO_ID")
private int usuarioId;
@Column(name = "USUARIO_ID")
private int usuarioId;
@Column(name = "INDDESCONTOPORC")
private Boolean inddescontoporc;
@Column(name = "INDDESCONTOPORC")
private Boolean inddescontoporc;
@Column(name = "DESCONTO")
private BigDecimal desconto;
@Column(name = "DESCONTO")
private BigDecimal desconto;
@JoinColumn(name = "PUNTOVENTA_ID", referencedColumnName = "PUNTOVENTA_ID")
@ManyToOne
private PuntoVenta puntoventaId;
@JoinColumn(name = "PUNTOVENTA_ID", referencedColumnName = "PUNTOVENTA_ID")
@ManyToOne
private PuntoVenta puntoventaId;
@JoinColumn(name = "EMPRESA_ID", referencedColumnName = "EMPRESA_ID")
@ManyToOne
private Empresa empresaId;
@JoinColumn(name = "EMPRESA_ID", referencedColumnName = "EMPRESA_ID")
@ManyToOne
private Empresa empresaId;
public PtovtaComissao() {
}
public PtovtaComissao() {
}
public enum enumReceita {
// Declaração dos enum
RECEITABRUTA ("RECEITA BRUTA", "RB"),
public enum Receita {
// Declaração dos enum
RECEITABRUTA("RECEITA BRUTA", "RB"),
RECEITALIQUIDA ("RECEITA LÍQUIDA ", "RL");
RECEITALIQUIDA("RECEITA LÍQUIDA ", "RL");
// Definição das constantes
public final String valor;
public final String descricao;
// Definição das constantes
public final String valor;
public final String descricao;
public String valor() {
public String valor() {
return this.valor;
}
public String descricao() {
public String descricao() {
return this.descricao;
}
private enumReceita( String descricao, String valor) {
private Receita(String descricao, String valor) {
this.descricao = descricao;
this.valor = valor;
}
public static Receita getByValor(String valor) {
if (valor == null) {
return Receita.RECEITABRUTA;
} else {
if (valor.equals("RB"))
return Receita.RECEITABRUTA;
if (valor.equals("RL"))
return Receita.RECEITALIQUIDA;
}
}
return null;
public PtovtaComissao(Integer ptovtaComissaoId) {
this.ptovtaComissaoId = ptovtaComissaoId;
}
}
public PtovtaComissao(Integer ptovtaComissaoId, BigDecimal issretido, BigDecimal royalties, Boolean enviarrecibo, String receita, BigDecimal passagemAlta, BigDecimal passagemBaixa, BigDecimal seguroAlta, BigDecimal seguroBaixa, BigDecimal outrosBaixa, BigDecimal outrosAlta, BigDecimal excessoAlta, BigDecimal excessoBaixa, Boolean tarifaReceita, Boolean seguroReceita, Boolean taxaReceita, Boolean pedagioReceita, Boolean tarifaDev, Boolean seguroDev, Boolean taxaDev, Boolean pegagioDev, Boolean activo, Date fecmodif, int usuarioId, Boolean inddescontoporc, BigDecimal desconto) {
}
public PtovtaComissao(Integer ptovtaComissaoId) {
this.ptovtaComissaoId = ptovtaComissaoId;
}
public PtovtaComissao(Integer ptovtaComissaoId, BigDecimal issretido, BigDecimal royalties, Boolean enviarrecibo, String receita, BigDecimal passagemAlta, BigDecimal passagemBaixa, BigDecimal seguroAlta, BigDecimal seguroBaixa, BigDecimal outrosBaixa, BigDecimal outrosAlta, BigDecimal excessoAlta, BigDecimal excessoBaixa, Boolean tarifaReceita, Boolean seguroReceita, Boolean taxaReceita, Boolean pedagioReceita, Boolean tarifaDev, Boolean seguroDev, Boolean taxaDev, Boolean pegagioDev, Boolean activo, Date fecmodif, int usuarioId, Boolean inddescontoporc, BigDecimal desconto) {
super();
this.ptovtaComissaoId = ptovtaComissaoId;
this.issretido = issretido;
@ -206,38 +218,38 @@ public class PtovtaComissao implements Serializable {
}
public BigDecimal getIssretido() {
return issretido;
}
return issretido;
}
public void setIssretido(BigDecimal issretido) {
this.issretido = issretido;
}
public void setIssretido(BigDecimal issretido) {
this.issretido = issretido;
}
public BigDecimal getRoyalties() {
return royalties;
}
public BigDecimal getRoyalties() {
return royalties;
}
public void setRoyalties(BigDecimal royalties) {
this.royalties = royalties;
}
public void setRoyalties(BigDecimal royalties) {
this.royalties = royalties;
}
public Boolean getEnviarrecibo() {
return enviarRecibo;
}
public Boolean getEnviarrecibo() {
return enviarRecibo;
}
public void setEnviarrecibo(Boolean enviarRecibo) {
this.enviarRecibo = enviarRecibo;
}
public void setEnviarrecibo(Boolean enviarRecibo) {
this.enviarRecibo = enviarRecibo;
}
public String getReceita() {
return receita;
}
public String getReceita() {
return receita;
}
public void setReceita(String receita) {
this.receita = receita;
}
public void setReceita(String receita) {
this.receita = receita;
}
public BigDecimal getPassagemAlta() {
public BigDecimal getPassagemAlta() {
return passagemAlta;
}
@ -366,43 +378,40 @@ public class PtovtaComissao implements Serializable {
}
public Boolean getActivo() {
return activo;
}
return activo;
}
public void setActivo(Boolean activo) {
this.activo = activo;
}
public void setActivo(Boolean activo) {
this.activo = activo;
}
public Date getFecmodif() {
return fecmodif;
}
public Date getFecmodif() {
return fecmodif;
}
public void setFecmodif(Date fecmodif) {
this.fecmodif = fecmodif;
}
public void setFecmodif(Date fecmodif) {
this.fecmodif = fecmodif;
}
public int getUsuarioId() {
return usuarioId;
}
public int getUsuarioId() {
return usuarioId;
}
public void setUsuarioId(int usuarioId) {
this.usuarioId = usuarioId;
}
public void setUsuarioId(int usuarioId) {
this.usuarioId = usuarioId;
}
public PuntoVenta getPuntoventaId() {
return puntoventaId;
}
public void setPuntoventaId(PuntoVenta puntoventaId) {
this.puntoventaId = puntoventaId;
}
public PuntoVenta getPuntoventaId() {
return puntoventaId;
}
//
public void setPuntoventaId(PuntoVenta puntoventaId) {
this.puntoventaId = puntoventaId;
}
//
/**
/**
* @return the empresaId
*/
public Empresa getEmpresaId() {
@ -410,36 +419,37 @@ public class PtovtaComissao implements Serializable {
}
/**
* @param empresaId the empresaId to set
* @param empresaId
* the empresaId to set
*/
public void setEmpresaId(Empresa empresaId) {
this.empresaId = empresaId;
}
@Override
public int hashCode() {
int hash = 0;
hash += (ptovtaComissaoId != null ? ptovtaComissaoId.hashCode() : 0);
return hash;
}
public int hashCode() {
int hash = 0;
hash += (ptovtaComissaoId != null ? ptovtaComissaoId.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof PtovtaComissao)) {
return false;
}
PtovtaComissao other = (PtovtaComissao) object;
if ((this.ptovtaComissaoId == null && other.ptovtaComissaoId != null) || (this.ptovtaComissaoId != null && !this.ptovtaComissaoId.equals(other.ptovtaComissaoId))) {
return false;
}
return true;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof PtovtaComissao)) {
return false;
}
PtovtaComissao other = (PtovtaComissao) object;
if ((this.ptovtaComissaoId == null && other.ptovtaComissaoId != null) || (this.ptovtaComissaoId != null && !this.ptovtaComissaoId.equals(other.ptovtaComissaoId))) {
return false;
}
return true;
}
@Override
public String toString() {
return "com.rjconsultores.ventaboletos.entidad.PtovtaComissao[ ptovtaComissaoId=" + ptovtaComissaoId + " ]";
}
@Override
public String toString() {
return "com.rjconsultores.ventaboletos.entidad.PtovtaComissao[ ptovtaComissaoId=" + ptovtaComissaoId + " ]";
}
public Boolean getInddescontoporc() {
return inddescontoporc;

View File

@ -0,0 +1,7 @@
package com.rjconsultores.ventaboletos.service;
import com.rjconsultores.ventaboletos.entidad.Comissao;
public interface ComissaoService extends GenericService<Comissao, Integer> {
}

View File

@ -5,7 +5,9 @@ import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -14,27 +16,36 @@ import org.springframework.stereotype.Service;
import com.rjconsultores.ventaboletos.constantes.Constantes;
import com.rjconsultores.ventaboletos.dao.ComissaoDAO;
import com.rjconsultores.ventaboletos.entidad.Comissao;
import com.rjconsultores.ventaboletos.entidad.DescontoComissao;
import com.rjconsultores.ventaboletos.entidad.PtovtaComissao;
import com.rjconsultores.ventaboletos.entidad.PtovtaComissao.Receita;
import com.rjconsultores.ventaboletos.enums.IndStatusBoleto;
import com.rjconsultores.ventaboletos.service.CalculoComissaoService;
import com.rjconsultores.ventaboletos.service.ComissaoService;
import com.rjconsultores.ventaboletos.service.DescontoComissaoService;
import com.rjconsultores.ventaboletos.service.PtovtaComissaoService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.vo.comissao.BoletoComissao;
import com.rjconsultores.ventaboletos.vo.comissao.ComissaoDesconto;
import com.rjconsultores.ventaboletos.vo.comissao.ComissaoDesconto.TipoDesconto;
import com.rjconsultores.ventaboletos.vo.comissao.ComissaoReceita;
import com.rjconsultores.ventaboletos.vo.comissao.ComissaoReceita.TipoIcms;
import com.rjconsultores.ventaboletos.vo.comissao.RegistroCalculo;
@Service("calculoComissaoService")
public class CalculoComissaoServiceImpl implements CalculoComissaoService {
private static final Logger log = LoggerFactory.getLogger(CalculoComissaoServiceImpl.class);
BigDecimal CEM = BigDecimal.TEN.multiply(BigDecimal.TEN);
@Autowired
private PtovtaComissaoService ptovtaComissaoService;
@Autowired
private ComissaoService comissaoService;
@Autowired
private ComissaoDAO comissaoDAO;
@ -43,7 +54,39 @@ public class CalculoComissaoServiceImpl implements CalculoComissaoService {
@Override
public void registrarCalculoComissao(Integer puntoVentaId, Integer empresaId, Date periodo) {
RegistroCalculo rc = realizarCalculoComissao(puntoVentaId, empresaId, periodo);
List<Comissao> comissoes = comissaoDAO.buscaComissaoVigencia(puntoVentaId, empresaId, periodo);
if (comissoes.isEmpty()) {
RegistroCalculo rc = realizarCalculoComissao(puntoVentaId, empresaId, periodo);
Comissao comissao = new Comissao();
String competencia = DateUtil.getStringDate(periodo, "MM/yyyy");
comissao.setCompetencia(competencia);
comissao.setDataPagamento(Calendar.getInstance().getTime());
comissao.setEmpresaId(empresaId);
comissao.setPuntoVentaId(puntoVentaId);
comissao.setBonificacaoMetas(rc.getComissaoBonificaoMetas());
comissao.setComissaoBpr(rc.getComissaoBPR());
comissao.setEntregasPassagem(rc.getComissaoEntregaPassagem());
comissao.setReceitaExcessobagagem(rc.getComissaoExcessoBagagem());
comissao.setReceitaSeguroopcional(rc.getComissaoSegOpcional());
comissao.setRoyaties(rc.getRoyaties());
comissao.setIssRetido(rc.getRetidoISS());
comissao.setBonificacaoMetas(rc.getComissaoBonificaoMetas());
comissao.setDescontosEventuais(rc.getDescontos());
comissao.setIndPago(true);
comissao.setUsuarioPagamentoId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
comissao = comissaoService.suscribir(comissao);
} else {
}
}
@Override
@ -51,93 +94,75 @@ public class CalculoComissaoServiceImpl implements CalculoComissaoService {
return realizarCalculoComissao(puntoVentaId, empresaId, periodo);
}
public RegistroCalculo realizarCalculoComissao(Integer puntoVentaId, Integer empresaId, Date periodo) {
private BigDecimal calculoComisssaoBPR(boolean isAltaTemporada, boolean isReceitaLiquida, PtovtaComissao ptovtaComissao, ComissaoReceita cr) {
PtovtaComissao ptovtaComissao = ptovtaComissaoService.buscarPuntaVentaEmpresa(puntoVentaId, empresaId);
List<BoletoComissao> receitasBoleto = comissaoDAO.buscarReceitasComissoes(puntoVentaId, empresaId, periodo);
Calendar calendario = Calendar.getInstance();
calendario.setTime(periodo);
int ultimodia = calendario.getActualMaximum(Calendar.DAY_OF_MONTH);
int mes = calendario.get(Calendar.MONTH) + 1;
int ano = calendario.get(Calendar.YEAR);
List<ComissaoReceita> receitas = calculaReceitaComissao(ptovtaComissao, receitasBoleto, ultimodia, mes, ano);
for (ComissaoReceita comissaoReceita : receitas) {
log.info("Item=" + comissaoReceita.toString());
// Comissão BPR = Receita Comissão * (% Com BPR)
BigDecimal bpr = BigDecimal.ZERO;
BigDecimal receitaBPR = cr.getReceitaBPR().add(cr.getReceitaGAP());
if (isReceitaLiquida) {
for (TipoIcms tipoIcms : cr.getDescontosIcms()) {
if (tipoIcms.equals(TipoIcms.BPR) || tipoIcms.equals(TipoIcms.GAP))
receitaBPR = receitaBPR.add(tipoIcms.getValor().negate());
}
}
RegistroCalculo rc = new RegistroCalculo();
BigDecimal comissaoBPR = BigDecimal.ZERO;
BigDecimal comissaoExcessoBagagem = BigDecimal.ZERO;
BigDecimal comissaoSegOpcional = BigDecimal.ZERO;
BigDecimal comissaoEntregaPassagem = BigDecimal.ZERO;
for (ComissaoReceita cr : receitas) {
BigDecimal cem = BigDecimal.TEN.multiply(BigDecimal.TEN);
// Está parte esta encapsulada, posteriormente será implementada a validação de alta e baixa temporada
// Inicialmente só será validado os calculos de comissão em baixa temporada
boolean isAltaTemporada = false;
// Comissão BPR = Receita Comissão * (% Com BPR)
BigDecimal bpr = BigDecimal.ZERO;
if (isAltaTemporada) {
bpr = cr.getReceitaBPR().multiply(ptovtaComissao.getPassagemAlta().divide(cem));
} else {
bpr = cr.getReceitaBPR().multiply(ptovtaComissao.getPassagemBaixa().divide(cem));
}
cr.setComissaoBPRDiaria(bpr);
comissaoBPR = comissaoBPR.add(bpr);
// Comissão Excesso = Receita Excesso Bagagem * (% Com. Exc. Bag)
BigDecimal excessoBagagem = BigDecimal.ZERO;
if (isAltaTemporada) {
excessoBagagem = cr.getReceitaExcessoBagagem().multiply(ptovtaComissao.getExcessoAlta().divide(cem));
} else {
excessoBagagem = cr.getReceitaExcessoBagagem().multiply(ptovtaComissao.getExcessoBaixa().divide(cem));
}
cr.setComissaoExcessoBagagemDiaria(excessoBagagem);
comissaoExcessoBagagem = comissaoExcessoBagagem.add(excessoBagagem);
// Comissão Seg. Opcional = Receita Seguro Opcional * (% Com. Seg. Pol)
BigDecimal segOpcional = BigDecimal.ZERO;
if (isAltaTemporada) {
segOpcional = cr.getReceitaSeguroOpcional().multiply(ptovtaComissao.getSeguroAlta().divide(cem));
} else {
segOpcional = cr.getReceitaSeguroOpcional().multiply(ptovtaComissao.getSeguroBaixa().divide(cem));
}
cr.setComissaoSegOpcionalDiaria(segOpcional);
comissaoSegOpcional = comissaoSegOpcional.add(segOpcional);
// EntregaPassagem (Internet/Venda Impressão Posterior/Outros)
BigDecimal entregaPassagem = BigDecimal.ZERO;
if (ptovtaComissao.getInddescontoporc()) {
entregaPassagem = cr.getGapImpressa().multiply(ptovtaComissao.getDesconto().divide(cem));
} else {
entregaPassagem = ptovtaComissao.getDesconto().multiply(new BigDecimal(cr.getContImpressa()));
}
cr.setComissaoEntregaPassagemDiaria(entregaPassagem);
comissaoEntregaPassagem = comissaoEntregaPassagem.add(entregaPassagem);
if (isAltaTemporada) {
bpr = receitaBPR.multiply(ptovtaComissao.getPassagemAlta().divide(CEM));
} else {
bpr = receitaBPR.multiply(ptovtaComissao.getPassagemBaixa().divide(CEM));
}
rc.setLsReceitas(receitas);
return bpr;
}
rc.setComissaoBPR(comissaoBPR);
rc.setComissaoExcessoBagagem(comissaoExcessoBagagem);
rc.setComissaoSegOpcional(comissaoSegOpcional);
rc.setComissaoEntregaPassagem(comissaoEntregaPassagem);
private BigDecimal calculoEntregaPassagem(boolean isAltaTemporada, boolean isReceitaLiquida, PtovtaComissao ptovtaComissao, ComissaoReceita cr) {
// Bonificação Metas
BigDecimal comissaoBonificaoMetas = BigDecimal.ZERO;
rc.setComissaoBonificaoMetas(comissaoBonificaoMetas);
// EntregaPassagem (Internet/Venda Impressão Posterior/Outros)
BigDecimal entregaPassagem = BigDecimal.ZERO;
BigDecimal receitaEntrega = cr.getGapImpressa().add(cr.getInternet());
if (isReceitaLiquida) {
for (TipoIcms tipoIcms : cr.getDescontosIcms()) {
if (tipoIcms.equals(TipoIcms.INTERNET) || tipoIcms.equals(TipoIcms.GAP_IMPRESSA))
receitaEntrega = receitaEntrega.add(tipoIcms.getValor().negate());
}
}
if (ptovtaComissao.getInddescontoporc()) {
entregaPassagem = receitaEntrega.multiply(ptovtaComissao.getDesconto().divide(CEM));
} else {
entregaPassagem = ptovtaComissao.getDesconto().multiply(new BigDecimal(cr.getContImpressa()));
}
return entregaPassagem;
}
private BigDecimal calculoExcessoBagagem(boolean isAltaTemporada, PtovtaComissao ptovtaComissao, ComissaoReceita cr) {
// Comissão Excesso = Receita Excesso Bagagem * (% Com. Exc. Bag)
BigDecimal excessoBagagem = BigDecimal.ZERO;
if (isAltaTemporada) {
excessoBagagem = cr.getReceitaExcessoBagagem().multiply(ptovtaComissao.getExcessoAlta().divide(CEM));
} else {
excessoBagagem = cr.getReceitaExcessoBagagem().multiply(ptovtaComissao.getExcessoBaixa().divide(CEM));
}
return excessoBagagem;
}
private BigDecimal calculoSeguroOpcional(boolean isAltaTemporada, PtovtaComissao ptovtaComissao, ComissaoReceita cr) {
// Comissão Seg. Opcional = Receita Seguro Opcional * (% Com. Seg. Pol)
BigDecimal segOpcional = BigDecimal.ZERO;
if (isAltaTemporada) {
segOpcional = cr.getReceitaSeguroOpcional().multiply(ptovtaComissao.getSeguroAlta().divide(CEM));
} else {
segOpcional = cr.getReceitaSeguroOpcional().multiply(ptovtaComissao.getSeguroBaixa().divide(CEM));
}
return segOpcional;
}
private Map<String, Object> calculoDescontos(Integer puntoVentaId, Integer empresaId, Date periodo, PtovtaComissao ptovtaComissao) {
// Descontos (Fixos e Eventuais)
List<ComissaoDesconto> lsDescontos = new ArrayList<ComissaoDesconto>();
BigDecimal valorDescontoTotal = BigDecimal.ZERO;
@ -161,24 +186,111 @@ public class CalculoComissaoServiceImpl implements CalculoComissaoService {
lsDescontos.add(desconto);
}
rc.setDescontos(valorDescontoTotal);
rc.setLsDescontos(lsDescontos);
Map<String, Object> respDescontos = new HashMap<String, Object>();
respDescontos.put("LISTA_DESCONTOS", lsDescontos);
respDescontos.put("VALOR_DESCONTOS", valorDescontoTotal);
return respDescontos;
}
@SuppressWarnings("unchecked")
public RegistroCalculo realizarCalculoComissao(Integer puntoVentaId, Integer empresaId, Date periodo) {
PtovtaComissao ptovtaComissao = ptovtaComissaoService.buscarPuntaVentaEmpresa(puntoVentaId, empresaId);
List<BoletoComissao> receitasBoleto = comissaoDAO.buscarReceitasComissoes(puntoVentaId, empresaId, periodo);
Calendar calendario = Calendar.getInstance();
calendario.setTime(periodo);
int ultimodia = calendario.getActualMaximum(Calendar.DAY_OF_MONTH);
int mes = calendario.get(Calendar.MONTH) + 1;
int ano = calendario.get(Calendar.YEAR);
List<ComissaoReceita> receitas = calculaReceitaComissao(ptovtaComissao, receitasBoleto, ultimodia, mes, ano);
RegistroCalculo rc = new RegistroCalculo();
BigDecimal comissaoBPR = BigDecimal.ZERO;
BigDecimal comissaoExcessoBagagem = BigDecimal.ZERO;
BigDecimal comissaoSegOpcional = BigDecimal.ZERO;
BigDecimal comissaoEntregaPassagem = BigDecimal.ZERO;
BigDecimal receitaTotal = BigDecimal.ZERO;
for (ComissaoReceita cr : receitas) {
// Está parte esta encapsulada, posteriormente será implementada a validação de alta e baixa temporada
// Inicialmente só será validado os calculos de comissão em baixa temporada
boolean isAltaTemporada = false;
// Receita Total -- bruta/liquida - abatimento do valor do icms
boolean isReceitaLiquida = false;
Receita receita = Receita.getByValor(ptovtaComissao.getReceita());
if (receita.equals(Receita.RECEITALIQUIDA)) {
isReceitaLiquida = true;
receitaTotal = receitaTotal.add(cr.getReceitaBPR()).add(cr.getGapImpressa()).add(cr.getInternet()).add(cr.getReceitaGAP());
for (TipoIcms tipoIcms : cr.getDescontosIcms()) {
receitaTotal = receitaTotal.add(tipoIcms.getValor().negate());
}
} else if (receita.equals(Receita.RECEITABRUTA)) {
receitaTotal = receitaTotal.add(cr.getReceitaBPR()).add(cr.getGapImpressa()).add(cr.getInternet()).add(cr.getReceitaGAP());
}
BigDecimal bpr = calculoComisssaoBPR(isAltaTemporada, isReceitaLiquida, ptovtaComissao, cr);
cr.setComissaoBPRDiaria(bpr);
comissaoBPR = comissaoBPR.add(bpr);
BigDecimal entregaPassagem = calculoEntregaPassagem(isAltaTemporada, isReceitaLiquida, ptovtaComissao, cr);
cr.setComissaoEntregaPassagemDiaria(entregaPassagem);
comissaoEntregaPassagem = comissaoEntregaPassagem.add(entregaPassagem);
BigDecimal excessoBagagem = calculoExcessoBagagem(isAltaTemporada, ptovtaComissao, cr);
cr.setComissaoExcessoBagagemDiaria(excessoBagagem);
comissaoExcessoBagagem = comissaoExcessoBagagem.add(excessoBagagem);
BigDecimal segOpcional = calculoSeguroOpcional(isAltaTemporada, ptovtaComissao, cr);
cr.setComissaoSegOpcionalDiaria(segOpcional);
comissaoSegOpcional = comissaoSegOpcional.add(segOpcional);
}
rc.setLsReceitas(receitas);
rc.setComissaoBPR(comissaoBPR);
rc.setComissaoExcessoBagagem(comissaoExcessoBagagem);
rc.setComissaoSegOpcional(comissaoSegOpcional);
rc.setComissaoEntregaPassagem(comissaoEntregaPassagem);
// Descontos (Fixos e Eventuais)
Map<String, Object> respDescontos = calculoDescontos(puntoVentaId, empresaId, periodo, ptovtaComissao);
rc.setDescontos((BigDecimal) respDescontos.get("VALOR_DESCONTOS"));
rc.setLsDescontos((List<ComissaoDesconto>) respDescontos.get("LISTA_DESCONTOS"));
// Bonificação Metas
BigDecimal comissaoBonificaoMetas = BigDecimal.ZERO;
rc.setComissaoBonificaoMetas(comissaoBonificaoMetas);
// Royaties
BigDecimal royaties = BigDecimal.ZERO;
royaties = receitaTotal.multiply(ptovtaComissao.getRoyalties().divide(CEM));
rc.setRoyaties(royaties);
// ISS retido
BigDecimal issRetido = BigDecimal.ZERO;
issRetido = receitaTotal.multiply(ptovtaComissao.getIssretido().divide(CEM));
rc.setRetidoISS(issRetido);
// bruta/liquida - abatimento do valor do icms
// Comissão à pagar = Comissão BPR + Comissão Excesso Bagagem + Comissão Seg. Opcional + Bonificação Metas + Internet(EntregaPassagem) - Descontos (Fixos e Eventuais) - Royaties - ISS retido
// Comissão à pagar = Comissão BPR + Comissão Excesso Bagagem + Comissão Seg. Opcional + Bonificação Metas + Internet(EntregaPassagem)
BigDecimal comissaoPagar = BigDecimal.ZERO;
comissaoPagar = comissaoBPR.add(comissaoExcessoBagagem).add(comissaoSegOpcional).add(comissaoSegOpcional);
comissaoPagar = comissaoPagar.add(comissaoBPR).add(comissaoExcessoBagagem).add(comissaoSegOpcional);
comissaoPagar = comissaoPagar.add(comissaoEntregaPassagem).add(comissaoBonificaoMetas);
comissaoPagar = comissaoPagar.add(valorDescontoTotal.negate()).add(royaties.negate()).add(issRetido.negate());
// Descontos // - Descontos (Fixos e Eventuais) - Royaties - ISS retido
comissaoPagar = comissaoPagar.add(rc.getDescontos().negate()).add(royaties.negate()).add(issRetido.negate());
rc.setComissaoPagar(comissaoPagar);
return rc;
@ -217,8 +329,12 @@ public class CalculoComissaoServiceImpl implements CalculoComissaoService {
BigDecimal gapImpressa = BigDecimal.ZERO;
int contImpressa = 0;
List<TipoIcms> descontosIcms = new ArrayList<TipoIcms>();
for (BoletoComissao rcc : list) {
IndStatusBoleto statusBoleto = IndStatusBoleto.valueOf(rcc.getIndstatusboleto());
BigDecimal receitaItem = BigDecimal.ZERO;
BigDecimal receitaDevItem = BigDecimal.ZERO;
@ -240,8 +356,8 @@ public class CalculoComissaoServiceImpl implements CalculoComissaoService {
}
// Totais de Devolução / Cancelamento
if (ptovtaComissao.getTarifaDev()) {
receitaDevItem = receitaDevItem.add(rcc.getValorpagado());
if (ptovtaComissao.getTarifaDev()) {
}
if (ptovtaComissao.getTaxaDev()) {
@ -256,36 +372,57 @@ public class CalculoComissaoServiceImpl implements CalculoComissaoService {
receitaDevItem = receitaDevItem.add(rcc.getPedagio());
}
if (rcc.getMotivoCancelacionId() == null) {
// Boletos impressos no punto venta
if (statusBoleto.equals(IndStatusBoleto.E)) {
contImpressa++;
IndStatusBoleto statusBoleto = IndStatusBoleto.valueOf(rcc.getIndstatusboleto());
// Calculo de ICMS sobre o valor do bilhete
TipoIcms icms = TipoIcms.GAP_IMPRESSA;
icms.setValor(receitaItem.multiply(rcc.getIcmsBase().divide(CEM)));
descontosIcms.add(icms);
// Boletos impressos no punto venta
if (statusBoleto.equals(IndStatusBoleto.E)) {
contImpressa++;
gapImpressa = gapImpressa.add(receitaItem);
gapImpressa = gapImpressa.add(receitaItem);
} else {
// Receitas calculadas sempre
receitaExcessoBagagem = receitaExcessoBagagem.add(rcc.getExcessoBagagem());
receitaSeguroOpcional = receitaSeguroOpcional.add(rcc.getSeguroOpcional());
receitaSeguroOutros = receitaSeguroOutros.add(rcc.getSeguroOutros());
// Receita GAP
if (rcc.getTipoVenta().equals(Constantes.TPV_BOLETO_REMOTO.intValue())) {
receitaGAP = receitaGAP.add(receitaItem);
}
// Internet
else if (rcc.getTipoVenta().equals(Constantes.TPV_POR_INTERNET.intValue())) {
internet = internet.add(receitaItem);
}
// Receita BPR
else {
receitaBPR = receitaBPR.add(receitaItem);
}
}
} else {
// Receitas calculadas sempre
receitaExcessoBagagem = receitaExcessoBagagem.add(rcc.getExcessoBagagem());
receitaSeguroOpcional = receitaSeguroOpcional.add(rcc.getSeguroOpcional());
receitaSeguroOutros = receitaSeguroOutros.add(rcc.getSeguroOutros());
// Receita GAP
if (rcc.getTipoVenta().equals(Constantes.TPV_BOLETO_REMOTO.intValue())) {
// Calculo de ICMS sobre o valor do bilhete
TipoIcms icms = TipoIcms.GAP;
icms.setValor(receitaItem.multiply(rcc.getIcmsBase().divide(CEM)));
descontosIcms.add(icms);
receitaGAP = receitaGAP.add(receitaItem);
}
// Internet
else if (rcc.getTipoVenta().equals(Constantes.TPV_POR_INTERNET.intValue())) {
// Calculo de ICMS sobre o valor do bilhete
TipoIcms icms = TipoIcms.INTERNET;
icms.setValor(receitaItem.multiply(rcc.getIcmsBase().divide(CEM)));
descontosIcms.add(icms);
internet = internet.add(receitaItem);
}
// Receita BPR
else {
// Calculo de ICMS sobre o valor do bilhete
TipoIcms icms = TipoIcms.BPR;
icms.setValor(receitaItem.multiply(rcc.getIcmsBase().divide(CEM)));
descontosIcms.add(icms);
receitaBPR = receitaBPR.add(receitaItem);
}
}
if (statusBoleto.equals(IndStatusBoleto.C)) {
// Devolução Receita
if (rcc.getMotivoCancelacionId().equals(Constantes.MVO_CANCEL_DEVOLUCAO)) {
@ -321,7 +458,6 @@ public class CalculoComissaoServiceImpl implements CalculoComissaoService {
}
}
}
}
@ -341,6 +477,9 @@ public class CalculoComissaoServiceImpl implements CalculoComissaoService {
cr.setGapImpressa(gapImpressa);
cr.setContImpressa(contImpressa);
// cr.setCancelamentoICMS(cancelamentoICMS);
// cr.setReceitaICMS(receitaICMS);
// Receita Comissão = Receita BPR + Receita GAP - GapImpressa - Internet - Cancelados - Devoluções Origem - Cancelados GAP - Devoluções GAP Origem - Devoluções - Devoluções GAP
receitaComissao = receitaComissao.add(receitaBPR).add(receitaGAP);
receitaComissao = receitaComissao.add(gapImpressa.negate()).add(internet.negate()).add(cancelados.negate());
@ -352,6 +491,7 @@ public class CalculoComissaoServiceImpl implements CalculoComissaoService {
}
return receitas;
}
private List<BoletoComissao> verificaCalculoComissaoProDia(List<BoletoComissao> list, Integer dia, Integer mes) {

View File

@ -0,0 +1,62 @@
package com.rjconsultores.ventaboletos.service.impl;
import java.util.Calendar;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.rjconsultores.ventaboletos.dao.ComissaoDAO;
import com.rjconsultores.ventaboletos.entidad.Comissao;
import com.rjconsultores.ventaboletos.service.ComissaoService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
@Service("comissaoService")
public class ComissaoServiceImpl implements ComissaoService {
@Autowired
private ComissaoDAO comissaoDAO;
@Override
public List<Comissao> obtenerTodos() {
return comissaoDAO.obtenerTodos();
}
@Override
public Comissao obtenerID(Integer id) {
return comissaoDAO.obtenerID(id);
}
@Override
@Transactional
public Comissao suscribir(Comissao entidad) {
entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
entidad.setFecmodif(Calendar.getInstance().getTime());
entidad.setActivo(Boolean.TRUE);
return comissaoDAO.suscribir(entidad);
}
@Override
@Transactional
public Comissao actualizacion(Comissao entidad) {
entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
entidad.setFecmodif(Calendar.getInstance().getTime());
entidad.setActivo(Boolean.TRUE);
return comissaoDAO.actualizacion(entidad);
}
@Override
@Transactional
public void borrar(Comissao entidad) {
entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
entidad.setFecmodif(Calendar.getInstance().getTime());
entidad.setActivo(Boolean.FALSE);
comissaoDAO.actualizacion(entidad);
}
}

View File

@ -28,6 +28,7 @@ public class BoletoComissao {
private String uf;
private String desccategoria;
private Integer status;
private BigDecimal icmsBase;
public Integer getEmpresaId() {
return empresaId;
@ -217,4 +218,12 @@ public class BoletoComissao {
return "";
}
public BigDecimal getIcmsBase() {
return icmsBase;
}
public void setIcmsBase(BigDecimal icmsBase) {
this.icmsBase = icmsBase;
}
}

View File

@ -2,9 +2,25 @@ package com.rjconsultores.ventaboletos.vo.comissao;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
public class ComissaoReceita {
public enum TipoIcms {
BPR, GAP, GAP_IMPRESSA, INTERNET;
private BigDecimal valor;
public BigDecimal getValor() {
return valor;
}
public void setValor(BigDecimal valor) {
this.valor = valor;
}
}
private Date data;
private BigDecimal receitaComissao;
private BigDecimal receitaBPR;
@ -26,6 +42,8 @@ public class ComissaoReceita {
private BigDecimal comissaoSegOpcionalDiaria;
private BigDecimal comissaoEntregaPassagemDiaria;
List<TipoIcms> descontosIcms;
public Date getData() {
return data;
}
@ -178,6 +196,14 @@ public class ComissaoReceita {
this.comissaoEntregaPassagemDiaria = comissaoEntregaPassagemDiaria;
}
public List<TipoIcms> getDescontosIcms() {
return descontosIcms;
}
public void setDescontosIcms(List<TipoIcms> descontosIcms) {
this.descontosIcms = descontosIcms;
}
@Override
public String toString() {
return "ComissaoReceita [data=" + data + ", receitaComissao=" + receitaComissao + ", receitaBPR=" + receitaBPR + ", receitaGAP=" + receitaGAP + ", gapImpressa=" + gapImpressa + ", internet=" + internet + ", cancelados=" + cancelados + ", canceladosGAP=" + canceladosGAP + ", devolvidos=" + devolvidos + ", devolvidosGAP=" + devolvidosGAP + ", devolucoesOrigem=" + devolucoesOrigem + ", devolucoesOrigemGAP=" + devolucoesOrigemGAP + ", receitaExcessoBagagem=" + receitaExcessoBagagem + ", receitaSeguroOpcional=" + receitaSeguroOpcional + ", contImpressa=" + contImpressa + ", comissaoBPRDiaria=" + comissaoBPRDiaria + ", comissaoExcessoBagagemDiaria=" + comissaoExcessoBagagemDiaria + ", comissaoSegOpcionalDiaria=" + comissaoSegOpcionalDiaria + ", comissaoEntregaPassagemDiaria=" + comissaoEntregaPassagemDiaria + "]";