package tela.dialog;
import static aplicacao.helper.MessageHelper.openWarning;
import static aplicacao.helper.ValidatorHelper.validar;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.PojoObservables;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.core.databinding.observable.map.IObservableMap;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
import org.eclipse.jface.databinding.viewers.ViewersObservables;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import tela.componentes.MecasoftText;
import aplicacao.exception.ValidationException;
import aplicacao.helper.FormatterHelper;
import aplicacao.helper.UsuarioHelper;
import aplicacao.service.DuplicataService;
import aplicacao.service.FormaPagamentoService;
import banco.modelo.Duplicata;
import banco.modelo.FormaPagamento;
import banco.modelo.FormaPagtoUtilizada;
import banco.modelo.ServicoPrestado;
public class AdicionarFormaPagamentoDialog extends TitleAreaDialog {
private Table tableDuplicatas;
private ComboViewer cvForma;
private MecasoftText txtValor;
private MecasoftText txtValorEntrada;
private TableViewer tvDuplicatas;
private MecasoftText txtNumeroParcela;
private MecasoftText txtDias;
private MecasoftText txtDataParcela;
private FormaPagamentoService formaPagamentoService = new FormaPagamentoService();
private DuplicataService duplicataService = new DuplicataService();
private List<FormaPagamento> listaFormaPagto;
private List<Duplicata> listaDuplicatas;
private Integer numeroParcelas;
private Integer diasParcelas = 30;
private boolean isEdicao;
private BigDecimal resto;
private FormaPagtoUtilizada formaUtilizada;
private ServicoPrestado servico;
public AdicionarFormaPagamentoDialog(Shell parentShell, ServicoPrestado servico, FormaPagtoUtilizada fpu, boolean isEdicao,
List<Duplicata> listaDuplicata) {
super(parentShell);
this.isEdicao = isEdicao;
listaFormaPagto = formaPagamentoService.findAllAtivos();
this.servico = servico;
//edi��o... duplicatas
if(isEdicao)
this.listaDuplicatas = listaDuplicata;
else
this.listaDuplicatas = new ArrayList<Duplicata>();
formaUtilizada = fpu;
formaUtilizada.setServicoPrestado(servico);
//desconta do valor total caso o servi�o ja tenha alguma forma pagando uma parte dele
//e apenas se n�o for uma edi��o da forma de pagamento
if(!isEdicao){
formaUtilizada.setValor(servico.getValorTotal());
for(FormaPagtoUtilizada forma : servico.getListaFormaPagto()){
if(forma.getValor().compareTo(formaUtilizada.getValor()) > 0){
formaUtilizada.setValor(BigDecimal.ZERO);
break;
}else
formaUtilizada.setValor(formaUtilizada.getValor().subtract(forma.getValor()));
}
}else
formaUtilizada.setValor(fpu.getValor());
}
@Override
protected Control createDialogArea(Composite parent) {
setTitle("Adicionar forma de pagamento");
Composite area = (Composite) super.createDialogArea(parent);
Composite container = new Composite(area, SWT.NONE);
container.setLayout(new GridLayout(2, false));
container.setLayoutData(new GridData(GridData.FILL_BOTH));
Label lblPagamento = new Label(container, SWT.NONE);
lblPagamento.setText("Pagamento:");
cvForma = new ComboViewer(container, SWT.READ_ONLY);
Combo cbForma = cvForma.getCombo();
cbForma.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
IStructuredSelection selecao = (IStructuredSelection)cvForma.getSelection();
if(selecao.isEmpty())
return;
FormaPagamento forma = (FormaPagamento)selecao.getFirstElement();
if(forma.isGeraDuplicata())
formaUtilizada.setValor(servico.getValorTotal());
else if(forma.isGeraPagVista()){
servico.setValorEntrada(BigDecimal.ZERO);
listaDuplicatas.clear();
}
initDataBindings();
}
});
cbForma.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
//edi��o...
cbForma.setEnabled(!isEdicao);
Label lblValor = new Label(container, SWT.NONE);
lblValor.setText("Valor:");
txtValor = new MecasoftText(container, SWT.NONE);
txtValor.setOptions(MecasoftText.NUMEROS, -1);
txtValor.addChars(FormatterHelper.MECASOFTTXTMOEDA, new Integer[]{-2}, null, null);
txtValor.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Label lblNParcelas = new Label(container, SWT.NONE);
lblNParcelas.setText("N\u00BA parcelas:");
txtNumeroParcela = new MecasoftText(container, SWT.NONE);
txtNumeroParcela.text.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
atualizarValores(false);
}
});
txtNumeroParcela.setEnabled(false);
txtNumeroParcela.setOptions(MecasoftText.NUMEROS, -1);
txtNumeroParcela.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
//edi��o.. numero de parcelas
if(isEdicao && formaUtilizada.getFormaPagamento().isGeraDuplicata())
txtNumeroParcela.setText(listaDuplicatas.size()+"");
Label lblValorEntrada = new Label(container, SWT.NONE);
lblValorEntrada.setText("Valor entrada:");
txtValorEntrada = new MecasoftText(container, SWT.NONE);
txtValorEntrada.text.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
atualizarValores(false);
}
});
txtValorEntrada.setEnabled(false);
txtValorEntrada.setOptions(MecasoftText.NUMEROS, -1);
txtValorEntrada.addChars(FormatterHelper.MECASOFTTXTMOEDA, new Integer[]{-2}, null, null);
txtValorEntrada.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Label lblDiasEntreParcelas = new Label(container, SWT.NONE);
lblDiasEntreParcelas.setText("Dias entre parcelas:");
txtDias = new MecasoftText(container, SWT.NONE);
txtDias.text.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
atualizarValores(true);
}
});
txtDias.setEnabled(false);
txtDias.setOptions(MecasoftText.NUMEROS, -1);
txtDias.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
txtDias.setText(diasParcelas.toString());
//edi��o.. dias entre parcelas
if(isEdicao && formaUtilizada.getFormaPagamento().isGeraDuplicata()){
//verifica se tem 1 parcela ou mais
//caso tenha 1, pega da data atual ate a data da parcela
//caso tenha mais, pega da data da 1� parcela ate a data da 2�
int parcela = 0;
Calendar dtInicial = Calendar.getInstance();
if(listaDuplicatas.size() > 1){
dtInicial.setTime(listaDuplicatas.get(parcela).getDataVencimento());
parcela++;
}
Calendar totalDias = Calendar.getInstance();
totalDias.setTime(listaDuplicatas.get(parcela).getDataVencimento());
//calcula
totalDias.add(Calendar.DAY_OF_MONTH, dtInicial.get(Calendar.DAY_OF_MONTH) * -1);
totalDias.add(Calendar.MONTH, dtInicial.get(Calendar.MONTH) * -1);
totalDias.add(Calendar.YEAR, dtInicial.get(Calendar.YEAR) * -1);
txtDias.setText(totalDias.get(Calendar.DAY_OF_MONTH)+"");
}
Label lblDtParcela = new Label(container, SWT.NONE);
lblDtParcela.setText("Dt. primeira parcela:");
txtDataParcela = new MecasoftText(container, SWT.NONE);
txtDataParcela.text.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
gerarDuplicata();
}
});
txtDataParcela.setEnabled(false);
txtDataParcela.setOptions(MecasoftText.NUMEROS, 10);
txtDataParcela.addChars(FormatterHelper.MECASOFTTXTDATA, new Integer[]{2, 4}, null, null);
txtDataParcela.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
//edi��o.. dia da primeira parcela
if(isEdicao && formaUtilizada.getFormaPagamento().isGeraDuplicata()){
txtDataParcela.setText(FormatterHelper.getDateFormatData().format(listaDuplicatas.get(0).getDataVencimento()));
}
tvDuplicatas = new TableViewer(container, SWT.BORDER | SWT.FULL_SELECTION);
tableDuplicatas = tvDuplicatas.getTable();
tableDuplicatas.setEnabled(false);
tableDuplicatas.setLinesVisible(true);
tableDuplicatas.setHeaderVisible(true);
GridData gd_tableDuplicatas = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1);
gd_tableDuplicatas.heightHint = 95;
tableDuplicatas.setLayoutData(gd_tableDuplicatas);
TableViewerColumn tvcDuplicataNum = new TableViewerColumn(tvDuplicatas, SWT.NONE);
tvcDuplicataNum.setLabelProvider(new ColumnLabelProvider(){
@Override
public String getText(Object element) {
return ((Duplicata)element).getNumero();
}
});
TableColumn tblclmnDuplicataN = tvcDuplicataNum.getColumn();
tblclmnDuplicataN.setWidth(132);
tblclmnDuplicataN.setText("Duplicata N\u00BA");
TableViewerColumn tvcVencimento = new TableViewerColumn(tvDuplicatas, SWT.NONE);
tvcVencimento.setLabelProvider(new ColumnLabelProvider(){
@Override
public String getText(Object element) {
return FormatterHelper.getDateFormatData().format(((Duplicata)element).getDataVencimento());
}
});
TableColumn tblclmnVencimento = tvcVencimento.getColumn();
tblclmnVencimento.setWidth(146);
tblclmnVencimento.setText("Vencimento");
TableViewerColumn tvcValor = new TableViewerColumn(tvDuplicatas, SWT.NONE);
tvcValor.setLabelProvider(new ColumnLabelProvider(){
@Override
public String getText(Object element) {
return FormatterHelper.getDecimalFormat().format(((Duplicata)element).getValor());
}
});
TableColumn tblclmnValor = tvcValor.getColumn();
tblclmnValor.setWidth(137);
tblclmnValor.setText("Valor");
//remove as formas de pagamento que geram duplicatas
//caso a ordem ja tenha uma forma a vista
if(servico.getListaFormaPagto() != null && !servico.getListaFormaPagto().isEmpty()){
if(servico.getListaFormaPagto().get(0).getFormaPagamento().isGeraPagVista()){
//clone da lista pq nao � possivel editala no loop
List<FormaPagamento> listaClone = new ArrayList<FormaPagamento>();
listaClone.addAll(listaFormaPagto);
for(FormaPagamento forma : listaClone){
if(forma.isGeraDuplicata())
listaFormaPagto.remove(forma);
}
}
}
initDataBindings();
return area;
}
/**
* Create contents of the button bar.
* @param parent
*/
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
true);
createButton(parent, IDialogConstants.CANCEL_ID,
IDialogConstants.CANCEL_LABEL, false);
}
@Override
protected void buttonPressed(int buttonId) {
if(buttonId == OK){
try {
validar(formaUtilizada);
if(formaUtilizada.getFormaPagamento().isGeraDuplicata())
atualizarValores(false);
if(servico.getValorEntrada() == null)
servico.setValorEntrada(BigDecimal.ZERO);
if(servico.getValorEntrada().compareTo(servico.getValorTotal()) > 0){
setErrorMessage("O valor de entrada n�o pode ser superior ao valor total");
return;
}
//caso n�o seja uma edi��o...
if(!isEdicao)
servico.getListaFormaPagto().add(formaUtilizada);
} catch (ValidationException e) {
setErrorMessage(e.getMessage());
return;
}
}
super.buttonPressed(buttonId);
}
private void atualizarValores(boolean atualizarData){
try{
//pega o periodo entre o vencimento de uma parcela e outra
diasParcelas = txtDias.getText().isEmpty() ? 30 : new Integer(txtDias.getText());
Date dtPrimeiraParcela;
//calcula data da primeira parcela
Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_MONTH, diasParcelas);
dtPrimeiraParcela = c.getTime();
if(txtDataParcela.getText().isEmpty() || atualizarData)
txtDataParcela.setText(FormatterHelper.getDateFormatData().format(dtPrimeiraParcela));
//gera as duplicatas
gerarDuplicata();
}catch(Exception e){
openWarning("Informe a data da primeira parcela corretamente.");
}
}
private void gerarDuplicata(){
try{
//pega a data da 1� parcela
Calendar data = Calendar.getInstance();
data.setTime(FormatterHelper.getDateFormatData().parse(txtDataParcela.getText()));
//pega o numero de parcelas
numeroParcelas = txtNumeroParcela.getText().isEmpty() ? 1 : new Integer(txtNumeroParcela.getText());
//valor total descontada a entrada
BigDecimal valorTotal = formaUtilizada.getValor().subtract(servico.getValorEntrada() == null ? BigDecimal.ZERO : servico.getValorEntrada());
//pega o que sobra da divis�o do total pela quantidade de parcelas para jogar na ultima parcela
//e calcula o valor de cada parcela
resto = valorTotal.remainder(new BigDecimal(numeroParcelas));
BigDecimal valorParcela = valorTotal.subtract(resto).divide(new BigDecimal(numeroParcelas));
//pega o id da ultima duplicata registrada para usa-lo como numero
Long numeroDuplicata = duplicataService.findUltimaDuplicata() == null ? new Long(0) : duplicataService.findUltimaDuplicata().getId();
numeroDuplicata++;
//gera as duplicatas
listaDuplicatas.clear();
//caso o valor da parcela seja maior que 0, ele gera as duplicatas
if(valorParcela.compareTo(BigDecimal.ZERO) > 0){
for(int c = 0; c < numeroParcelas; c++){
Duplicata d = new Duplicata();
d.setDataVencimento(data.getTime());
d.setNumero(numeroDuplicata.toString());
d.setServicoPrestado(servico);
d.setValor(valorParcela);
d.setUsuario(UsuarioHelper.getUsuarioLogado());
listaDuplicatas.add(d);
//seta a variavel data para a data da proxima duplicata e o numeroDuplicata para o numero da proxima duplicata
data.add(Calendar.DAY_OF_MONTH, diasParcelas);
numeroDuplicata++;
}
//adiciona o que sobrou na ultima parcela
valorParcela = valorParcela.add(resto);
listaDuplicatas.get(listaDuplicatas.size()-1).setValor(valorParcela);
//caso seja 0, ele gera apenas 1 duplicata com o valor total da forma
}else{
Duplicata d = new Duplicata();
d.setDataVencimento(data.getTime());
d.setNumero(numeroDuplicata.toString());
d.setServicoPrestado(servico);
d.setValor(valorTotal);
d.setUsuario(UsuarioHelper.getUsuarioLogado());
listaDuplicatas.add(d);
}
tvDuplicatas.refresh();
}catch(Exception e){
openWarning("Informe a data da primeira parcela corretamente.");
}
}
/**
* Return the initial size of the dialog.
*/
@Override
protected Point getInitialSize() {
return new Point(450, 458);
}
protected DataBindingContext initDataBindings() {
DataBindingContext bindingContext = new DataBindingContext();
//
ObservableListContentProvider listContentProvider = new ObservableListContentProvider();
IObservableMap observeMap = PojoObservables.observeMap(listContentProvider.getKnownElements(), FormaPagamento.class, "nome");
cvForma.setLabelProvider(new ObservableMapLabelProvider(observeMap));
cvForma.setContentProvider(listContentProvider);
//
WritableList writableList = new WritableList(listaFormaPagto, FormaPagamento.class);
cvForma.setInput(writableList);
//
IObservableValue cvFormaObserveSingleSelection = ViewersObservables.observeSingleSelection(cvForma);
IObservableValue formaUtilizadaFormaPagamentoObserveValue = PojoObservables.observeValue(formaUtilizada, "formaPagamento");
bindingContext.bindValue(cvFormaObserveSingleSelection, formaUtilizadaFormaPagamentoObserveValue, null, null);
//
IObservableValue txtValortextObserveTextObserveWidget = SWTObservables.observeText(txtValor.text, SWT.Modify);
IObservableValue formaUtilizadaValorObserveValue = PojoObservables.observeValue(formaUtilizada, "valor");
bindingContext.bindValue(txtValortextObserveTextObserveWidget, formaUtilizadaValorObserveValue, null, null);
//
IObservableValue txtValorEntradatextObserveTextObserveWidget = SWTObservables.observeText(txtValorEntrada.text, SWT.Modify);
IObservableValue servicoValorEntradaObserveValue = PojoObservables.observeValue(servico, "valorEntrada");
bindingContext.bindValue(txtValorEntradatextObserveTextObserveWidget, servicoValorEntradaObserveValue, null, null);
//
ObservableListContentProvider listContentProvider_1 = new ObservableListContentProvider();
// IObservableMap[] observeMaps = PojoObservables.observeMaps(listContentProvider_1.getKnownElements(), Duplicata.class, new String[]{"numero", "dataVencimento", "valor"});
// tvDuplicatas.setLabelProvider(new ObservableMapLabelProvider(observeMaps));
tvDuplicatas.setContentProvider(listContentProvider_1);
//
WritableList writableList_1 = new WritableList(listaDuplicatas, Duplicata.class);
tvDuplicatas.setInput(writableList_1);
//
IObservableValue txtNumeroParcelatextObserveEnabledObserveWidget = SWTObservables.observeEnabled(txtNumeroParcela.text);
IObservableValue formaUtilizadaFormaPagamentogeraDuplicataObserveValue = PojoObservables.observeValue(formaUtilizada, "formaPagamento.geraDuplicata");
bindingContext.bindValue(txtNumeroParcelatextObserveEnabledObserveWidget, formaUtilizadaFormaPagamentogeraDuplicataObserveValue, null, null);
//
IObservableValue txtValorEntradatextObserveEnabledObserveWidget = SWTObservables.observeEnabled(txtValorEntrada.text);
bindingContext.bindValue(txtValorEntradatextObserveEnabledObserveWidget, formaUtilizadaFormaPagamentogeraDuplicataObserveValue, null, null);
//
IObservableValue txtDiastextObserveEnabledObserveWidget = SWTObservables.observeEnabled(txtDias.text);
bindingContext.bindValue(txtDiastextObserveEnabledObserveWidget, formaUtilizadaFormaPagamentogeraDuplicataObserveValue, null, null);
//
IObservableValue txtDataParcelatextObserveEnabledObserveWidget = SWTObservables.observeEnabled(txtDataParcela.text);
bindingContext.bindValue(txtDataParcelatextObserveEnabledObserveWidget, formaUtilizadaFormaPagamentogeraDuplicataObserveValue, null, null);
//
IObservableValue tableDuplicatasObserveEnabledObserveWidget = SWTObservables.observeEnabled(tableDuplicatas);
bindingContext.bindValue(tableDuplicatasObserveEnabledObserveWidget, formaUtilizadaFormaPagamentogeraDuplicataObserveValue, null, null);
//
IObservableValue txtValortextObserveEnabledObserveWidget = SWTObservables.observeEnabled(txtValor.text);
IObservableValue formaUtilizadaFormaPagamentogeraPagVistaObserveValue = PojoObservables.observeValue(formaUtilizada, "formaPagamento.geraPagVista");
bindingContext.bindValue(txtValortextObserveEnabledObserveWidget, formaUtilizadaFormaPagamentogeraPagVistaObserveValue, null, null);
//
return bindingContext;
}
public List<Duplicata> getListaDuplicatas() {
return listaDuplicatas;
}
public void setListaDuplicatas(List<Duplicata> listaDuplicatas) {
this.listaDuplicatas = listaDuplicatas;
}
}