/*******************************************************************************
* Copyright (c) 2007-2010, G. Weirich and Elexis
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* G. Weirich - initial implementation
*
*******************************************************************************/
package ch.elexis.core.ui.views.rechnung;
import static ch.elexis.core.ui.text.TextTemplateRequirement.TT_LIST;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import ch.elexis.admin.AccessControlDefaults;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.data.events.ElexisEventDispatcher;
import ch.elexis.core.exceptions.ElexisException;
import ch.elexis.core.ui.Hub;
import ch.elexis.core.ui.commands.Handler;
import ch.elexis.core.ui.commands.MahnlaufCommand;
import ch.elexis.core.ui.constants.UiResourceConstants;
import ch.elexis.core.ui.icons.Images;
import ch.elexis.core.ui.locks.AllOrNoneLockRequestingAction;
import ch.elexis.core.ui.locks.AllOrNoneLockRequestingRestrictedAction;
import ch.elexis.core.ui.locks.LockRequestingAction;
import ch.elexis.core.ui.text.ITextPlugin.ICallback;
import ch.elexis.core.ui.text.TextContainer;
import ch.elexis.core.ui.util.SWTHelper;
import ch.elexis.core.ui.views.FallDetailView;
import ch.elexis.data.AccountTransaction;
import ch.elexis.data.Brief;
import ch.elexis.data.Fall;
import ch.elexis.data.Patient;
import ch.elexis.data.Rechnung;
import ch.elexis.data.RnStatus;
import ch.rgw.tools.ExHandler;
import ch.rgw.tools.Money;
import ch.rgw.tools.TimeTool;
import ch.rgw.tools.Tree;
/**
* Collection of bill-related actions
*
* @author gerry
*
*/
public class RnActions {
Action rnExportAction, editCaseAction, delRnAction, reactivateRnAction, patDetailAction;
Action expandAllAction, collapseAllAction, reloadAction, mahnWizardAction;
Action addPaymentAction, addExpenseAction, changeStatusAction, stornoAction;
Action increaseLevelAction, printListeAction, rnFilterAction;
Action addAccountExcessAction;
RnActions(final RechnungsListeView view){
printListeAction = new Action(Messages.RnActions_printListAction) { //$NON-NLS-1$
{
setImageDescriptor(Images.IMG_PRINTER.getImageDescriptor());
setToolTipText(Messages.RnActions_printListTooltip); //$NON-NLS-1$
}
@Override
public void run(){
Object[] sel = view.cv.getSelection();
new RnListeDruckDialog(view.getViewSite().getShell(), sel).open();
}
};
mahnWizardAction = new Action(Messages.RnActions_remindersAction) { //$NON-NLS-1$
{
setToolTipText(Messages.RnActions_remindersTooltip); //$NON-NLS-1$
setImageDescriptor(Images.IMG_WIZARD.getImageDescriptor());
}
@Override
public void run(){
if (!MessageDialog.openConfirm(view.getViewSite().getShell(),
Messages.RnActions_reminderConfirmCaption, //$NON-NLS-1$
Messages.RnActions_reminderConfirmMessage)) { //$NON-NLS-1$
return;
}
Handler.execute(view.getViewSite(), MahnlaufCommand.ID, null);
view.cfp.clearValues();
view.cfp.cbStat
.setText(RnControlFieldProvider.stats[RnControlFieldProvider.stats.length - 5]);
view.cfp.fireChangedEvent();
}
};
rnExportAction = new Action(Messages.RechnungsListeView_printAction) { //$NON-NLS-1$
{
setToolTipText(Messages.RechnungsListeView_printToolTip); //$NON-NLS-1$
setImageDescriptor(Images.IMG_GOFURTHER.getImageDescriptor());
}
@Override
public void run(){
List<Rechnung> list = view.createList();
new RnOutputDialog(view.getViewSite().getShell(), list).open();
}
};
patDetailAction = new Action(Messages.RnActions_patientDetailsAction) { //$NON-NLS-1$
@Override
public void run(){
IWorkbenchPage rnPage =
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
try {
/* PatientDetailView fdv=(PatientDetailView) */rnPage
.showView(UiResourceConstants.PatientDetailView2_ID);
} catch (Exception ex) {
ExHandler.handle(ex);
}
}
};
editCaseAction = new Action(Messages.RnActions_edirCaseAction) { //$NON-NLS-1$
@Override
public void run(){
IWorkbenchPage rnPage =
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
try {
rnPage.showView(FallDetailView.ID);
} catch (Exception ex) {
ExHandler.handle(ex);
}
}
};
delRnAction =
new AllOrNoneLockRequestingAction<Rechnung>(Messages.RnActions_deleteBillAction) {
@Override
public List<Rechnung> getTargetedObjects(){
return view.createList();
}
@Override
public void doRun(List<Rechnung> lockedElements){
for (Rechnung rn : lockedElements) {
rn.storno(true);
}
}
};
reactivateRnAction = new AllOrNoneLockRequestingAction<Rechnung>(Messages.RnActions_reactivateBillAction) {
@Override
public List<Rechnung> getTargetedObjects(){
return view.createList();
}
@Override
public void doRun(List<Rechnung> lockedElements){
for (Rechnung rn : lockedElements) {
rn.setStatus(RnStatus.OFFEN);
}
}
};
expandAllAction = new Action(Messages.RnActions_expandAllAction) { //$NON-NLS-1$
@Override
public void run(){
view.cv.getViewerWidget().getControl().setRedraw(false);
((TreeViewer) view.cv.getViewerWidget()).expandAll();
view.cv.getViewerWidget().getControl().setRedraw(true);
}
};
collapseAllAction = new Action(Messages.RnActions_collapseAllAction) { //$NON-NLS-1$
@Override
public void run(){
view.cv.getViewerWidget().getControl().setRedraw(false);
((TreeViewer) view.cv.getViewerWidget()).collapseAll();
view.cv.getViewerWidget().getControl().setRedraw(true);
}
};
reloadAction = new Action(Messages.RnActions_reloadAction) { //$NON-NLS-1$
{
setToolTipText(Messages.RnActions_reloadTooltip); //$NON-NLS-1$
setImageDescriptor(Images.IMG_REFRESH.getImageDescriptor());
}
@Override
public void run(){
view.cfp.fireChangedEvent();
}
};
addPaymentAction = new Action(Messages.RnActions_addBookingAction) { //$NON-NLS-1$
{
setToolTipText(Messages.RnActions_addBookingTooltip); //$NON-NLS-1$
setImageDescriptor(Images.IMG_ADDITEM.getImageDescriptor());
}
@Override
public void run(){
List<Rechnung> list = view.createList();
if (list.size() > 0) {
Rechnung actRn = list.get(0);
try {
if (new RnDialogs.BuchungHinzuDialog(view.getViewSite().getShell(),
actRn).open() == Dialog.OK) {
ElexisEventDispatcher.update(actRn);
}
} catch (ElexisException e) {
SWTHelper.showError("Zahlung hinzufügen ist nicht möglich",
e.getLocalizedMessage());
}
}
}
};
addExpenseAction = new Action(Messages.RnActions_addFineAction) { //$NON-NLS-1$
{
setImageDescriptor(Images.IMG_REMOVEITEM.getImageDescriptor());
}
@Override
public void run(){
List<Rechnung> list = view.createList();
if (!list.isEmpty()) {
try {
if (list.size() == 1) {
Rechnung actRn = list.get(0);
if (new RnDialogs.GebuehrHinzuDialog(view.getViewSite().getShell(),
actRn).open() == Dialog.OK) {
ElexisEventDispatcher.update(actRn);
}
} else {
if (new RnDialogs.MultiGebuehrHinzuDialog(view.getViewSite()
.getShell(), list).open() == Dialog.OK) {
for (Rechnung rn : list) {
ElexisEventDispatcher.update(rn);
}
}
}
} catch (ElexisException e) {
SWTHelper.showError("Zahlung hinzufügen ist nicht möglich",
e.getLocalizedMessage());
}
}
}
};
changeStatusAction =
new AllOrNoneLockRequestingRestrictedAction<Rechnung>(AccessControlDefaults.ADMIN_CHANGE_BILLSTATUS_MANUALLY,
Messages.RnActions_changeStateAction) { //$NON-NLS-1$
{
setToolTipText(Messages.RnActions_changeStateTooltip); //$NON-NLS-1$
setImageDescriptor(Images.IMG_EDIT.getImageDescriptor());
}
@Override
public List<Rechnung> getTargetedObjects(){
return view.createList();
}
@Override
public void doRun(List<Rechnung> list){
if (list.size() == 1) {
Rechnung actRn = list.get(0);
if (new RnDialogs.StatusAendernDialog(view.getViewSite().getShell(),
actRn).open() == Dialog.OK) {
ElexisEventDispatcher.update(actRn);
}
} else {
if (new RnDialogs.MultiStatusAendernDialog(view.getViewSite()
.getShell(), list).open() == Dialog.OK) {
for (Rechnung rn : list) {
ElexisEventDispatcher.update(rn);
}
}
}
}
};
stornoAction = new LockRequestingAction<Rechnung>(Messages.RnActions_stornoAction) {
{
setImageDescriptor(Images.IMG_DELETE.getImageDescriptor());
setToolTipText(Messages.RnActions_stornoActionTooltip);
}
@Override
public Rechnung getTargetedObject(){
List<Rechnung> list = view.createList();
if (!list.isEmpty()) {
return list.get(0);
}
return null;
}
@Override
public void doRun(Rechnung actRn){
if (new RnDialogs.StornoDialog(view.getViewSite().getShell(), actRn).open() == Dialog.OK) {
ElexisEventDispatcher.update(actRn);
}
}
};
increaseLevelAction = new Action(Messages.RnActions_increaseReminderLevelAction) { //$NON-NLS-1$
{
setToolTipText(Messages.RnActions_increadeReminderLevelTooltip); //$NON-NLS-1$
}
@Override
public void run(){
List<Rechnung> list = view.createList();
if (list.size() > 0) {
for (Rechnung actRn : list) {
switch (actRn.getStatus()) {
case RnStatus.OFFEN_UND_GEDRUCKT:
actRn.setStatus(RnStatus.MAHNUNG_1);
break;
case RnStatus.MAHNUNG_1_GEDRUCKT:
actRn.setStatus(RnStatus.MAHNUNG_2);
break;
case RnStatus.MAHNUNG_2_GEDRUCKT:
actRn.setStatus(RnStatus.MAHNUNG_3);
break;
default:
SWTHelper.showInfo(Messages.RnActions_changeStateErrorCaption, //$NON-NLS-1$
Messages.RnActions_changeStateErrorMessage); //$NON-NLS-1$
}
}
}
}
};
addAccountExcessAction = new Action(Messages.RnActions_addAccountGood) { //$NON-NLS-1$
{
setToolTipText(Messages.RnActions_addAccountGoodTooltip); //$NON-NLS-1$
}
@Override
public void run(){
List<Rechnung> list = view.createList();
if (list.size() > 0) {
Rechnung actRn = list.get(0);
// Allfaelliges Guthaben des Patienten der Rechnung als
// Anzahlung hinzufuegen
Fall fall = actRn.getFall();
Patient patient = fall.getPatient();
Money prepayment = patient.getAccountExcess();
if (prepayment.getCents() > 0) {
// make sure prepayment is not bigger than amount of
// bill
Money amount;
if (prepayment.getCents() > actRn.getBetrag().getCents()) {
amount = new Money(actRn.getBetrag());
} else {
amount = new Money(prepayment);
}
if (SWTHelper
.askYesNo(
Messages.RnActions_transferMoneyCaption, //$NON-NLS-1$
"Das Konto von Patient \""
+ patient.getLabel()
+ "\" weist ein positives Kontoguthaben auf. Wollen Sie den Betrag von "
+ amount.toString() + " dieser Rechnung \"" + actRn.getNr()
+ ": " + fall.getLabel() + "\" zuweisen?")) {
// remove amount from account and transfer it to the
// bill
Money accountAmount = new Money(amount);
accountAmount.negate();
new AccountTransaction(patient, null, accountAmount, null,
"Anzahlung von Kontoguthaben auf Rechnung " + actRn.getNr());
actRn.addZahlung(amount, "Anzahlung von Kontoguthaben", null);
}
}
}
}
};
rnFilterAction = new Action(Messages.RnActions_filterListAction, Action.AS_CHECK_BOX) { //$NON-NLS-1$
{
setImageDescriptor(Images.IMG_FILTER.getImageDescriptor());
setToolTipText(Messages.RnActions_filterLIstTooltip); //$NON-NLS-1$
}
@Override
public void run(){
if (isChecked()) {
RnFilterDialog rfd = new RnFilterDialog(view.getViewSite().getShell());
if (rfd.open() == Dialog.OK) {
view.cntp.setConstraints(rfd.ret);
view.cfp.fireChangedEvent();
}
} else {
view.cntp.setConstraints(null);
view.cfp.fireChangedEvent();
}
}
};
}
static class RnListeDruckDialog extends TitleAreaDialog implements ICallback {
ArrayList<Rechnung> rnn;
private TextContainer text;
public RnListeDruckDialog(final Shell shell, final Object[] tree){
super(shell);
rnn = new ArrayList<Rechnung>(tree.length);
for (Object o : tree) {
if (o instanceof Tree) {
Tree tr = (Tree) o;
if (tr.contents instanceof Rechnung) {
tr = tr.getParent();
}
if (tr.contents instanceof Fall) {
tr = tr.getParent();
}
if (tr.contents instanceof Patient) {
for (Tree tFall : (Tree[]) tr.getChildren().toArray(new Tree[0])) {
Fall fall = (Fall) tFall.contents;
for (Tree tRn : (Tree[]) tFall.getChildren().toArray(new Tree[0])) {
Rechnung rn = (Rechnung) tRn.contents;
rnn.add(rn);
}
}
}
}
}
}
@SuppressWarnings("unchecked")
@Override
protected Control createDialogArea(final Composite parent){
Composite ret = new Composite(parent, SWT.NONE);
text = new TextContainer(getShell());
ret.setLayout(new FillLayout());
ret.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
text.getPlugin().createContainer(ret, this);
text.getPlugin().showMenu(false);
text.getPlugin().showToolbar(false);
text.createFromTemplateName(null, TT_LIST, Brief.UNKNOWN, CoreHub.actUser,
Messages.RnActions_bills); //$NON-NLS-1$ //$NON-NLS-2$
text.getPlugin().insertText(
"[Titel]", //$NON-NLS-1$
Messages.RnActions_billsListPrintetAt + new TimeTool().toString(TimeTool.DATE_GER)
+ "\n", //$NON-NLS-1$ //$NON-NLS-2$
SWT.CENTER);
String[][] table = new String[rnn.size() + 1][];
Money sum = new Money();
int i;
for (i = 0; i < rnn.size(); i++) {
Rechnung rn = rnn.get(i);
table[i] = new String[3];
StringBuilder sb = new StringBuilder();
Fall fall = rn.getFall();
Patient p = fall.getPatient();
table[i][0] = rn.getNr();
sb.append(p.getLabel()).append(" - ").append(fall.getLabel()); //$NON-NLS-1$
table[i][1] = sb.toString();
Money betrag = rn.getBetrag();
sum.addMoney(betrag);
table[i][2] = betrag.getAmountAsString();
}
table[i] = new String[3];
table[i][0] = ""; //$NON-NLS-1$
table[i][1] = Messages.RnActions_sum; //$NON-NLS-1$
table[i][2] = sum.getAmountAsString();
text.getPlugin().setFont("Helvetica", SWT.NORMAL, 9); //$NON-NLS-1$
text.getPlugin().insertTable("[Liste]", 0, table, new int[] { //$NON-NLS-1$
10, 80, 10
});
text.getPlugin().showMenu(true);
text.getPlugin().showToolbar(true);
return ret;
}
@Override
public void create(){
super.create();
getShell().setText(Messages.RnActions_billsList); //$NON-NLS-1$
setTitle(Messages.RnActions_printListCaption); //$NON-NLS-1$
setMessage(Messages.RnActions_printListMessage); //$NON-NLS-1$
getShell().setSize(900, 700);
SWTHelper.center(Hub.plugin.getWorkbench().getActiveWorkbenchWindow().getShell(),
getShell());
}
@Override
protected void okPressed(){
super.okPressed();
}
public void save(){
// TODO Auto-generated method stub
}
public boolean saveAs(){
// TODO Auto-generated method stub
return false;
}
}
}