/*
* PanelSicklistEdit.java
*
* Created on 11 Август 2008 г., 13:00
*/
package clips.doctor.sicklist.sicklist;
import cli_fmw.delegate.DelegateLine2;
import clips.delegate.directory.ro.DirectoryCollaboratorItem;
import clips.delegate.doctor.sicklist.SicklistLocal;
import clips.doctor.sicklist.dialogs.DialogSicklistClose;
import clips.doctor.sicklist.dialogs.DialogSicklistContinue;
import cli_fmw.main.CheckableDocListener;
import cli_fmw.main.PageContainer;
import cli_fmw.main.PageGeneric;
import cli_fmw.main.Persistentable;
import cli_fmw.utils.MessageBox;
import cli_fmw.utils.ModalDialog;
import cli_fmw.main.ClipsException;
import cli_fmw.main.MainWindow;
import cli_fmw.report.CombinedReportCreator;
import cli_fmw.report.ReporterFactory;
import cli_fmw.utils.table_config_states.SplitPaneState;
import cli_fmw.utils.table_config_states.StateSaver;
import clips.delegate.service.SerRenLocal;
import clips.login.UserInfo;
import beans.doctor.sicklist.entity.Sicklist;
import java.util.Calendar;
import javax.swing.ListSelectionModel;
import framework.utils.DateTimeUtils;
import framework.utils.FormatChecker;
import java.util.GregorianCalendar;
/**
* Панель просмотра больничного
* @author petr
*/
public class PanelSicklistView extends PageGeneric implements
Persistentable {
private SicklistLocal sicklist;
public PanelSicklistView(PageContainer container, SicklistLocal sicklist) throws ClipsException {
super(container);
initComponents();
this.sicklist = sicklist;
int prolongationCount = sicklist.getProlongationCount();
if (prolongationCount == 0){
btContinue.setEnabled(false);
btClose.setEnabled(false);
}
updateFields();
StateSaver.setDefaultState(this, jSplitPane1, new SplitPaneState(250d, SplitPaneState.OffsetType.rightOffset));
StateSaver.setDefaultState(this, jSplitPane2, new SplitPaneState(150d, SplitPaneState.OffsetType.rightOffset));
StateSaver.attachTo(this);
}
/**
* Данные из больничного перегоняет в хтмл
* @param sicklist больничный
* @return форматированный текст
* @throws generic.ClipsException
*/
private String CreateHTML(SicklistLocal sicklist) throws ClipsException {
String s = "<html>";
String serial = sicklist.getSerial();
if (serial == null || serial.trim().isEmpty()) {
serial = "<font color = red>Не введен</font>";
}
s += "<p><i>Серийный номер: </i> <b>" + serial + "</b></p>";
s += "<p><i>Кому выдан: </i> <b>" + sicklist.getClient().toString() + "</b></p>";
String opener;
if (sicklist.getOpener() != null) {
opener = sicklist.getOpener().toString();
} else if (sicklist.getAltOpener() != null) {
opener = sicklist.getAltOpener() + " (другая клиника)";
} else {
opener = "<font color = red>неизвестно</font>";
}
s += "<p><i>Кем выдан: </i> <b>" + opener + "</b></p>";
String lpu = sicklist.getLpuName();
s += "<p><i>Где выдан: </i><b>" + (lpu == null? "<font color = red>неизвестно</font>": lpu) + "</b></p>";
DirectoryCollaboratorItem creator = sicklist.getCreator();
s += "<p><i>Добавил в базу данных: </i><b>" + (creator != null ? creator.getTitle() : "<i>неизвестно</i>") + "</b></p>";
s += "<p><i>Дата открытия: </i> <b>" +
framework.utils.Converter.dateToString(sicklist.getDateOpen().getTime()) + "</b> </p>";
String direction;
if (sicklist.getEnterprise().getID() != 0) {
direction = sicklist.getEnterprise().getTitle();
} else if (sicklist.getOtherDirection() != null) {
direction = sicklist.getOtherDirection();
} else {
direction = "<font color = green>неизвестно</font>";
}
s += "<p><i>Куда: </i> <b>" + direction + "</b></p>";
s += "<p><i>Диагноз открытия: </i><b>" + sicklist.getDiagnosisOpen().getMkbAndStage() + "</b></p>";
s += "<p><i>Вид нетрудоспособности: </i><b>" + sicklist.getDisability().getTitle() +
"</b></p>";
if (sicklist.getPreviousSicklist() != null) {
System.out.println("SR: " + sicklist.getPreviousSicklist().toString());
s += "<p><i>Номер предыдущего больничного: </i><b>" +
sicklist.getPreviousSicklist().getSerial() + "</b></p>";
}
if (sicklist.isClosed()) {
s += "<p><i>Статус больничного:</i> <b><font color = red>Закрыт</font></b></p>";
s += "<p><i>Диагноз закрытия: </i><b>" + sicklist.getDiagnosisClose().getMkbAndStage() + "</b></p>";
s += "<p><i>Врач, закрывший больничный:</i> <b><font color = red>"
+ sicklist.getCloser() + " </font></b></p>";
s += "<p><i>Приступить к работе: </i><b><font color = red>" +
framework.utils.Converter.dateToString(sicklist.getDateToWork().getTime()) + "</font></b></p>";
} else {
s += "<p><i>Статус:</i><b> <font color = green>Открыт</font></b></p>";
}
s += " </p></html>";
return s;
}
/**
* если больничный закрыт отключает кнопки закрытия и продления
* @throws generic.ClipsException
*/
private void checkButtons() throws ClipsException {
boolean closed = sicklist.isClosed();
boolean hasSerial = sicklist.getSerial() != null && !sicklist.getSerial().trim().isEmpty();
btContinue.setEnabled(!closed && hasSerial);
btClose.setEnabled(!closed && hasSerial && !isDirty());
btPrint.setEnabled(closed);
}
/**
* обновляет панель
* @throws generic.ClipsException
*/
private void updateFields() throws ClipsException {
checkButtons();
lblSicklistInfo.setText(CreateHTML(sicklist));
taDescription.setText(sicklist.getDescription());
updateTable();
String serial = sicklist.getSerial();
if (serial != null && !serial.isEmpty()) {
tfSerial.setText(serial);
tfSerial.setEditable(false);
} else {
tfSerial.setText("");
tfSerial.getDocument().addDocumentListener(new CheckableDocListener(tfSerial, FormatChecker.SICK_LIST_SERIAL) {
@Override
public void setField(String doc) {
updateSerial();
}
});
}
sicklist.addContentStateListener(getContainer());
}
/**
* обновляет таблицу продлений
* @throws generic.ClipsException
*/
private void updateTable() throws ClipsException{
TableModelSicklistContinued model = new TableModelSicklistContinued(sicklist);
tblFSicklistContinued.setModel(model);
tblFSicklistContinued.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
/** Creates new form PanelSicklistEdit */
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jPanel3 = new javax.swing.JPanel();
btPrint1 = new javax.swing.JButton();
btPrint = new javax.swing.JButton();
btContinue = new javax.swing.JButton();
btClose = new javax.swing.JButton();
jPanel1 = new javax.swing.JPanel();
jSplitPane2 = new javax.swing.JSplitPane();
jPanel12 = new javax.swing.JPanel();
jPanel2 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
tfSerial = new javax.swing.JTextField();
jSplitPane1 = new javax.swing.JSplitPane();
jPanel4 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
lblSicklistInfo = new javax.swing.JLabel();
jPanel5 = new javax.swing.JPanel();
jScrollPane2 = new javax.swing.JScrollPane();
taDescription = new javax.swing.JTextArea();
jPanel10 = new javax.swing.JPanel();
jScrollPane3 = new javax.swing.JScrollPane();
tblFSicklistContinued = new cli_fmw.utils.sorted_table.SortedTable();
jPanel3.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT, 10, 5));
btPrint1.setText("Распечатать больничный");
btPrint1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btPrint1ActionPerformed(evt);
}
});
jPanel3.add(btPrint1);
btPrint.setText("Талон на законченый случай");
btPrint.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btPrintActionPerformed(evt);
}
});
jPanel3.add(btPrint);
btContinue.setText("Продлить....");
btContinue.setToolTipText("Продлить больничный лист...");
btContinue.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btContinueActionPerformed(evt);
}
});
jPanel3.add(btContinue);
btClose.setText("Закрыть...");
btClose.setToolTipText("Закрыть больничный лист...");
btClose.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btCloseActionPerformed(evt);
}
});
jPanel3.add(btClose);
jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder());
jPanel1.setPreferredSize(new java.awt.Dimension(300, 604));
jPanel1.setLayout(new java.awt.BorderLayout());
jSplitPane2.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
jPanel12.setBorder(javax.swing.BorderFactory.createTitledBorder("Больничный лист"));
jPanel12.setLayout(new java.awt.BorderLayout());
jPanel2.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));
jLabel1.setText("Номер:");
jPanel2.add(jLabel1);
tfSerial.setPreferredSize(new java.awt.Dimension(250, 19));
jPanel2.add(tfSerial);
jPanel12.add(jPanel2, java.awt.BorderLayout.NORTH);
jPanel4.setLayout(new java.awt.BorderLayout());
jScrollPane1.setBackground(new java.awt.Color(255, 255, 255));
jScrollPane1.setPreferredSize(new java.awt.Dimension(500, 0));
lblSicklistInfo.setBackground(tfSerial.getBackground());
lblSicklistInfo.setFont(tfSerial.getFont());
lblSicklistInfo.setText("<HTML> \n<p> Текст\n<HTML>");
lblSicklistInfo.setVerticalAlignment(javax.swing.SwingConstants.TOP);
lblSicklistInfo.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5));
lblSicklistInfo.setOpaque(true);
lblSicklistInfo.setVerticalTextPosition(javax.swing.SwingConstants.TOP);
jScrollPane1.setViewportView(lblSicklistInfo);
jPanel4.add(jScrollPane1, java.awt.BorderLayout.CENTER);
jSplitPane1.setLeftComponent(jPanel4);
jPanel5.setLayout(new java.awt.BorderLayout());
jScrollPane2.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
jScrollPane2.setPreferredSize(new java.awt.Dimension(200, 102));
taDescription.setColumns(20);
taDescription.setEditable(false);
taDescription.setLineWrap(true);
taDescription.setRows(5);
taDescription.setWrapStyleWord(true);
taDescription.setBorder(javax.swing.BorderFactory.createTitledBorder("Примечание"));
jScrollPane2.setViewportView(taDescription);
jPanel5.add(jScrollPane2, java.awt.BorderLayout.CENTER);
jSplitPane1.setRightComponent(jPanel5);
jPanel12.add(jSplitPane1, java.awt.BorderLayout.CENTER);
jSplitPane2.setLeftComponent(jPanel12);
jPanel10.setBorder(javax.swing.BorderFactory.createTitledBorder("Освобождение от работы"));
jPanel10.setPreferredSize(new java.awt.Dimension(200, 200));
jPanel10.setLayout(new java.awt.BorderLayout());
jScrollPane3.setViewportView(tblFSicklistContinued);
jPanel10.add(jScrollPane3, java.awt.BorderLayout.CENTER);
jSplitPane2.setRightComponent(jPanel10);
jPanel1.add(jSplitPane2, java.awt.BorderLayout.CENTER);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 638, Short.MAX_VALUE)
.addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 323, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
);
}// </editor-fold>//GEN-END:initComponents
/**
* клик на "продолжить"
* открывет диалог продления
* @param evt
*/
private void btContinueActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btContinueActionPerformed
try {
if (sicklist.getProlongationCount() == Sicklist.SICKLIST_PROLONGATION_LIMIT ){
MessageBox.showWarning("Нельзя продлять больничный более " + (Sicklist.SICKLIST_PROLONGATION_LIMIT - 1) + " раз, создайте новый");
return;
}
GregorianCalendar till = sicklist.getTill();
DialogSicklistContinue dsc = new DialogSicklistContinue(MainWindow.mainWindow, sicklist.getClient(), till, getAuditManager());
dsc.setVisible(true);
if (dsc.getDlgResult() == ModalDialog.DLG_OK) {
Calendar newLong = dsc.getDateTill();
SerRenLocal serren = dsc.getSerren();
GregorianCalendar coll = new GregorianCalendar();
coll.setTime(DateTimeUtils.getDateOnly(newLong.getTime()));
coll.add(GregorianCalendar.DAY_OF_MONTH, -1);
if (till.after(coll)){
MessageBox.showError(MessageBox.E_INCORRECT_SICKLIST_PROLOG_DATE);
return;
}
sicklist.prolongate(newLong,serren);
updateFields();
}
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}//GEN-LAST:event_btContinueActionPerformed
/**
* клик на "закрыть"
* открывает диалог закрытия
* @param evt
*/
private void btCloseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btCloseActionPerformed
try {
DialogSicklistClose dsc = new DialogSicklistClose(MainWindow.mainWindow, sicklist, getAuditManager());
dsc.setVisible(true);
if (dsc.getDlgResult() == ModalDialog.DLG_OK) {
Calendar dateToWork = dsc.getDateToWork();
if (DateTimeUtils.daysBetween(sicklist.getTill(), dateToWork) != 1) {
if (MessageBox.showConfirmYesNo(MessageBox.C_DATE_TO_WORK_BAD) == MessageBox.ANSWER_NO) {
return;
}
}
sicklist.setDateToWork(dsc.getDateToWork());
sicklist.setCloser(UserInfo.get().getCollaborator());
sicklist.setDiagnosisClose(dsc.getDiagnosisClose());
sicklist.setSerrenClosed(dsc.getSerren());
updateFields();
}
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}//GEN-LAST:event_btCloseActionPerformed
private void btPrintActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btPrintActionPerformed
try {
CombinedReportCreator parCreator = ReporterFactory.getFinalCreator();
parCreator.setUpReport();
sicklist.print(parCreator);
parCreator.finish();
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}//GEN-LAST:event_btPrintActionPerformed
private void btPrint1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btPrint1ActionPerformed
try {
sicklist.printOverBlank();
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}//GEN-LAST:event_btPrint1ActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btClose;
private javax.swing.JButton btContinue;
private javax.swing.JButton btPrint;
private javax.swing.JButton btPrint1;
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel10;
private javax.swing.JPanel jPanel12;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JPanel jPanel5;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JSplitPane jSplitPane1;
private javax.swing.JSplitPane jSplitPane2;
private javax.swing.JLabel lblSicklistInfo;
private javax.swing.JTextArea taDescription;
private cli_fmw.utils.sorted_table.SortedTable tblFSicklistContinued;
private javax.swing.JTextField tfSerial;
// End of variables declaration//GEN-END:variables
@Override
public String getPageTitle() {
return "Редактирование больничного";
}
/**
* пишет данные из поля ввода номера в делегат
*/
private void updateSerial() {
try {
sicklist.setSerial(tfSerial.getText());
sicklist.setRegistrator(UserInfo.get().getCollaborator());
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}
@Override
public boolean isDirty() {
return sicklist == null ? false : sicklist.isDirty();
}
@Override
public void save() throws ClipsException {
if (sicklist != null) {
sicklist.save1();
}
updateFields();
}
@Override
public void restore() {
try {
if (sicklist != null) {
sicklist.restore();
}
updateFields();
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}
@Override
public DelegateLine2 getDelegate() {
return sicklist;
}
}