OpenConcerto

Dépôt officiel du code source de l'ERP OpenConcerto
sonarqube

svn://code.openconcerto.org/openconcerto

Compare Revisions

Regard whitespace Rev 146 → Rev 147

/trunk/Modules/Module Customer Support/module.properties
New file
0,0 → 1,6
# [\p{Alnum}_.]{3,}
id=org.openconcerto.modules.customersupport
# \p{Digit}(\.\p{Digit}+)?
version=1.0
contact=ILM Informatique
/trunk/Modules/Module Customer Support/src/org/openconcerto/modules/customersupport/RemindDateRenderer.java
New file
0,0 → 1,37
package org.openconcerto.modules.customersupport;
 
import java.awt.Color;
import java.awt.Component;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
 
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
 
import org.openconcerto.ui.table.TableCellRendererUtils;
 
public class RemindDateRenderer extends DefaultTableCellRenderer {
 
private static final Color COLOR_ORANGE = new Color(253, 173, 53);
private final DateFormat dateFormat = new SimpleDateFormat("dd/MM/yy");
private final java.util.Date toDay = Calendar.getInstance().getTime();
 
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
final Component res = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
TableCellRendererUtils.setColors(res, table, isSelected);
if (value != null) {
final Date date = (Date) value;
String t = dateFormat.format(date);
((JLabel) res).setText(t);
if (toDay.after(date)) {
((JLabel) res).setBackground(COLOR_ORANGE);
}
}
return res;
}
 
}
/trunk/Modules/Module Customer Support/src/org/openconcerto/modules/customersupport/SQLElementNames_fr.xml
New file
0,0 → 1,5
<translations>
<element refid="customersupport.ticket" nameClass="masculine" name="ticket de support" />
<element refid="customersupport.ticket.history" nameClass="feminine" name="Intervention sur ticket" />
 
</translations>
/trunk/Modules/Module Customer Support/src/org/openconcerto/modules/customersupport/translation_fr.xml
New file
0,0 → 1,3
<translation lang="fr">
<item id="customersupportticket.ticket.history.content" label="Détails de l'intervention" />
</translation>
/trunk/Modules/Module Customer Support/src/org/openconcerto/modules/customersupport/CustomerSupportTicketSQLComponent.java
New file
0,0 → 1,90
package org.openconcerto.modules.customersupport;
 
import java.sql.SQLException;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
 
import javax.swing.JComponent;
import javax.swing.JLabel;
 
import org.openconcerto.sql.element.GroupSQLComponent;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.sqlobject.SQLSearchableTextCombo;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.ui.JDateTime;
import org.openconcerto.ui.component.ComboLockedMode;
import org.openconcerto.ui.component.ITextArea;
import org.openconcerto.ui.group.Group;
import org.openconcerto.utils.ExceptionHandler;
 
public class CustomerSupportTicketSQLComponent extends GroupSQLComponent {
public CustomerSupportTicketSQLComponent(SQLElement element, Group group) {
super(element, group);
}
 
@Override
protected Set<String> createRequiredNames() {
final Set<String> s = new HashSet<String>(1);
s.add("ID_CLIENT");
s.add("ID_USER_COMMON");
s.add("LABEL");
s.add("DATE");
s.add("STATUS");
return s;
}
 
@Override
public int insert(SQLRow order) {
 
int id = super.insert(order);
SQLRow row = getTable().getRow(id);
try {
final SQLRowValues createEmptyUpdateRow = row.createEmptyUpdateRow();
createEmptyUpdateRow.put("NUMBER", id);
if (row.getObject("DATE") == null) {
createEmptyUpdateRow.put("DATE", new Date());
}
SQLRowValues rowValsHisto = new SQLRowValues(getTable().getTable(Module.TABLE_CUSTOMER_SUPPORT_TICKET_HISTORY));
rowValsHisto.put("INFORMATION", "Ouverture du ticket");
rowValsHisto.put("DATE", row.getObject("DATE"));
rowValsHisto.put("ID_USER_COMMON", row.getForeignID("ID_USER_COMMON"));
rowValsHisto.put("ID_" + getTable().getName(), createEmptyUpdateRow);
createEmptyUpdateRow.commit();
} catch (SQLException e) {
ExceptionHandler.handle("Impossible d'affecter un numéro sur le ticket", e);
}
return id;
}
 
@Override
public JComponent createEditor(String id) {
 
if (id.equals("INFOS")) {
final ITextArea jTextArea = new ITextArea();
jTextArea.setFont(new JLabel().getFont());
jTextArea.setRows(3);
return jTextArea;
} else if (id.equals("TYPE") || id.equals("STATUS") || id.equals("RATING")) {
return new SQLSearchableTextCombo(ComboLockedMode.UNLOCKED, 1, 20, false);
} else if (id.equals("DATE")) {
return new JDateTime(true);
}
return super.createEditor(id);
}
 
@Override
protected SQLRowValues createDefaults() {
SQLRowValues rowVals = new SQLRowValues(getTable());
rowVals.put("STATUS", "Nouveau");
rowVals.put("RATING", "Normale");
 
final int idUser = UserManager.getInstance().getCurrentUser().getId();
rowVals.put("ID_USER_COMMON", idUser);
 
return rowVals;
}
 
}
/trunk/Modules/Module Customer Support/src/org/openconcerto/modules/customersupport/labels_fr.xml
New file
0,0 → 1,22
<?xml version="1.0" encoding="UTF-8" ?>
<ROOT>
<TABLE name="CUSTOMER_SUPPORT_TICKET">
<FIELD name="STATUS" label="Status" />
<FIELD name="LABEL" label="Libellé" />
<FIELD name="ID_CLIENT" label="Client" />
<FIELD name="NUMBER" label="Numéro" />
<FIELD name="ID_USER_COMMON" label="Assigné à" />
<FIELD name="INFOS" label="Détails du ticket" />
<FIELD name="RATING" label="Priorité" />
<FIELD name="TYPE" label="Type" />
<FIELD name="REMIND_DATE" label="Prochain rappel le" />
<FIELD name="DATE" label="Date" />
<FIELD name="CLOSED_AND_ARCHIVED" label="Archivé" />
</TABLE>
<TABLE name="CUSTOMER_SUPPORT_TICKET_HISTORY">
<FIELD name="ID_CUSTOMER_SUPPORT_TICKET" label="Ticket" />
<FIELD name="ID_USER_COMMON" label="Utilisateur en charge" />
<FIELD name="INFORMATION" label="Détails de l'intervention" />
<FIELD name="DATE" label="Date" />
</TABLE>
</ROOT>
/trunk/Modules/Module Customer Support/src/org/openconcerto/modules/customersupport/CustomerSupportTicketHistoryListAction.java
New file
0,0 → 1,42
package org.openconcerto.modules.customersupport;
 
import java.awt.GridBagConstraints;
 
import javax.swing.JFrame;
import javax.swing.JPanel;
 
import org.openconcerto.erp.action.CreateFrameAbstractAction;
import org.openconcerto.erp.core.common.ui.IListFilterDatePanel;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.view.ListeAddPanel;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.PanelFrame;
 
public class CustomerSupportTicketHistoryListAction extends CreateFrameAbstractAction {
 
@Override
public JFrame createFrame() {
return new PanelFrame(getPanel(), "Historique des tickets de support");
}
 
public CustomerSupportTicketHistoryListAction() {
super("Historique des tickets de support");
}
 
public JPanel getPanel() {
final SQLElement eltTicket = Configuration.getInstance().getDirectory().getElement(Module.TABLE_CUSTOMER_SUPPORT_TICKET_HISTORY);
final ListeAddPanel panel = new ListeAddPanel(eltTicket);
final IListFilterDatePanel panelDate = new IListFilterDatePanel(panel.getListe(), eltTicket.getTable().getField("DATE"), IListFilterDatePanel.getDefaultMap());
final GridBagConstraints c = new DefaultGridBagConstraints();
c.gridy = 1;
c.gridwidth = GridBagConstraints.REMAINDER;
c.weightx = 1;
c.weighty = 0;
c.gridy++;
panel.add(panelDate, c);
 
return panel;
}
 
}
/trunk/Modules/Module Customer Support/src/org/openconcerto/modules/customersupport/CustomerSupportTicketGroup.java
New file
0,0 → 1,33
package org.openconcerto.modules.customersupport;
 
import org.openconcerto.ui.group.Group;
import org.openconcerto.ui.group.LayoutHints;
 
public class CustomerSupportTicketGroup extends Group {
 
public CustomerSupportTicketGroup() {
super("customersupportticket.ticket.default");
final Group g = new Group("customersupportticket.ticket.identifier");
g.addItem("NUMBER");
g.addItem("DATE");
g.addItem("ID_CLIENT", new LayoutHints(true, false, true, true, false, false));
g.addItem("LABEL", new LayoutHints(true, false, true, true, true, false));
g.addItem("ID_USER_COMMON", new LayoutHints(true, false, true, true, false, false));
this.add(g);
 
final Group gInfos = new Group("customersupportticket.ticket.info");
gInfos.addItem("INFOS", new LayoutHints(true, true, true, true, true, true, true));
this.add(gInfos);
 
final Group gState = new Group("customerrelationship.lead.state");
gState.addItem("RATING");
gState.addItem("TYPE");
gState.addItem("STATUS");
gState.addItem("REMIND_DATE");
gState.addItem("CLOSED_AND_ARCHIVED");
 
this.add(gState);
 
}
 
}
/trunk/Modules/Module Customer Support/src/org/openconcerto/modules/customersupport/HistoryPanel.java
New file
0,0 → 1,93
package org.openconcerto.modules.customersupport;
 
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
 
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
 
import org.openconcerto.erp.core.edm.AttachmentPanel;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.FrameUtil;
import org.openconcerto.ui.JLabelBold;
import org.openconcerto.ui.PanelFrame;
import org.openconcerto.ui.component.ITextArea;
 
public class HistoryPanel extends JPanel {
HistoryPanel(final SQLRowAccessor sqlRowAccessor, final SuiviTicketPanel panelSource) {
 
final SQLRowAccessor foreignUser = sqlRowAccessor.getForeign("ID_USER_COMMON");
final Date date = sqlRowAccessor.getDate("DATE") == null ? new Date() : sqlRowAccessor.getDate("DATE").getTime();
String user = foreignUser.getString("PRENOM") + " " + foreignUser.getString("NOM");
String info = sqlRowAccessor.getString("INFORMATION");
 
this.setOpaque(true);
this.setBackground(Color.WHITE);
this.setLayout(new GridBagLayout());
this.setBorder(BorderFactory.createLineBorder(Color.GRAY));
 
final GridBagConstraints c = new DefaultGridBagConstraints();
final DateFormat format = new SimpleDateFormat("dd/MM/yy HH:mm");
JLabel l1 = new JLabelBold("Le " + format.format(date) + ", créé par " + user);
this.add(l1, c);
String files = "Fichiers liés";
if (sqlRowAccessor.getInt("ATTACHMENTS") > 0) {
files += " (" + sqlRowAccessor.getInt("ATTACHMENTS") + ")";
}
final JButton button = new JButton(files);
button.setOpaque(false);
button.addActionListener(new ActionListener() {
 
@Override
public void actionPerformed(ActionEvent e) {
AttachmentPanel panel = new AttachmentPanel(sqlRowAccessor);
panel.addListener(new ListDataListener() {
 
@Override
public void intervalRemoved(ListDataEvent e) {
panelSource.fillPanelHistory();
}
 
@Override
public void intervalAdded(ListDataEvent e) {
panelSource.fillPanelHistory();
}
 
@Override
public void contentsChanged(ListDataEvent e) {
panelSource.fillPanelHistory();
}
});
 
PanelFrame frame = new PanelFrame(panel, "Liste des fichiers liés");
FrameUtil.show(frame);
 
}
});
c.gridx++;
c.anchor = GridBagConstraints.EAST;
this.add(button, c);
 
c.gridy++;
c.gridx = 0;
ITextArea text = new ITextArea(3, 50);
text.setEditable(false);
text.setEnabled(false);
text.setBorder(null);
text.setDisabledTextColor(Color.BLACK);
text.setText(info);
c.weightx = 1;
this.add(text, c);
}
}
/trunk/Modules/Module Customer Support/src/org/openconcerto/modules/customersupport/CustomerTicketHistorySQLElement.java
New file
0,0 → 1,110
package org.openconcerto.modules.customersupport;
 
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
 
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
 
import org.openconcerto.erp.core.edm.AttachmentAction;
import org.openconcerto.erp.modules.AbstractModule;
import org.openconcerto.erp.modules.ModuleElement;
import org.openconcerto.sql.element.GroupSQLComponent;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
import org.openconcerto.ui.JDateTime;
 
public class CustomerTicketHistorySQLElement extends ModuleElement {
 
public CustomerTicketHistorySQLElement(AbstractModule module) {
super(module, Module.TABLE_CUSTOMER_SUPPORT_TICKET_HISTORY);
this.setL18nLocation(CustomerTicketHistorySQLElement.class);
PredicateRowAction actionAttachment = new PredicateRowAction(new AttachmentAction().getAction(), true);
actionAttachment.setPredicate(IListeEvent.getSingleSelectionPredicate());
getRowActions().add(actionAttachment);
}
 
@Override
protected String createCode() {
return "customersupport.ticket.history";
}
 
@Override
protected List<String> getListFields() {
final List<String> l = new ArrayList<String>();
l.add("ID_USER_COMMON");
l.add("DATE");
l.add("ID_" + Module.TABLE_CUSTOMER_SUPPORT_TICKET);
l.add("INFORMATION");
return l;
}
 
@Override
protected List<String> getComboFields() {
final List<String> l = new ArrayList<String>();
l.add("DATE");
l.add("INFORMATION");
return l;
}
 
@Override
protected String getParentFFName() {
return "ID_" + Module.TABLE_CUSTOMER_SUPPORT_TICKET;
}
 
@Override
public SQLComponent createComponent() {
return new GroupSQLComponent(this, new CustomerTicketSupportHistoryGroup()) {
 
@Override
protected Set<String> createRequiredNames() {
final Set<String> s = new HashSet<String>(1);
s.add("ID_USER_COMMON");
s.add("DATE");
return s;
}
 
// @Override
// public JComponent getLabel(String id) {
// if (id.equals("customerrelationship.lead.call.content")) {
// return new JLabelBold("Description de l'appel téléphonique");
// } else if (id.equals("customerrelationship.lead.call.next")) {
// return new JLabelBold("Suite à donner");
// }
// return super.getLabel(id);
// }
 
@Override
public JComponent createEditor(String id) {
if (id.equals("INFORMATION")) {
final JTextArea jTextArea = new JTextArea();
jTextArea.setFont(new JLabel().getFont());
jTextArea.setMinimumSize(new Dimension(200, 150));
jTextArea.setPreferredSize(new Dimension(200, 150));
return new JScrollPane(jTextArea);
} else if (id.equals("DATE")) {
return new JDateTime(true);
}
return super.createEditor(id);
}
 
@Override
protected SQLRowValues createDefaults() {
SQLRowValues rowVals = new SQLRowValues(getTable());
final int idUser = UserManager.getInstance().getCurrentUser().getId();
rowVals.put("ID_USER_COMMON", idUser);
return rowVals;
}
 
};
}
 
}
/trunk/Modules/Module Customer Support/src/org/openconcerto/modules/customersupport/ModuleResources_fr.properties
New file
0,0 → 1,2
name=Tickets supports clients
description=Gestion du support client
/trunk/Modules/Module Customer Support/src/org/openconcerto/modules/customersupport/SuiviTicketPanel.java
New file
0,0 → 1,205
package org.openconcerto.modules.customersupport;
 
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
 
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLSelect.LockStrength;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.EditPanel.EditMode;
import org.openconcerto.sql.view.EditPanelListener;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.FrameUtil;
import org.openconcerto.ui.JLabelBold;
import org.openconcerto.ui.component.ITextArea;
 
public class SuiviTicketPanel extends JPanel {
 
private final SQLRowAccessor rowTicket;
private JPanel panelHistory = new JPanel(new GridBagLayout());
private DateFormat format = new SimpleDateFormat("dd/MM/yy HH:mm");
 
public SuiviTicketPanel(SQLRowAccessor rowTicket) {
super(new GridBagLayout());
this.rowTicket = rowTicket;
initUI();
}
 
public void initUI() {
GridBagConstraints c = new DefaultGridBagConstraints();
 
c.gridwidth = GridBagConstraints.REMAINDER;
 
JLabel label1 = new JLabel(
"Ticket N°" + this.rowTicket.getString("NUMBER") + " du " + format.format(this.rowTicket.getDate("DATE").getTime()) + " - Statut : " + this.rowTicket.getString("STATUS"));
JLabel label2 = new JLabel("Client : " + this.rowTicket.getForeign("ID_CLIENT").getString("NOM"));
String type = this.rowTicket.getString("TYPE");
if (type == null || type.trim().isEmpty()) {
type = "non renseigné";
}
JLabel label3 = new JLabel("Type : " + type + " - Intitulé : " + this.rowTicket.getString("LABEL"));
c.gridwidth = GridBagConstraints.REMAINDER;
this.add(label1, c);
c.gridy++;
this.add(label2, c);
c.gridy++;
this.add(label3, c);
 
final ITextArea textInfos = new ITextArea();
textInfos.setEditable(false);
textInfos.setEnabled(false);
textInfos.setBorder(null);
textInfos.setDisabledTextColor(Color.BLACK);
textInfos.setBackground(this.getBackground());
textInfos.setText(this.rowTicket.getString("INFOS"));
c.gridy++;
c.weightx = 1;
c.weighty = 0;
c.fill = GridBagConstraints.HORIZONTAL;
final JScrollPane comp = new JScrollPane(textInfos);
comp.setBorder(null);
DefaultGridBagConstraints.lockMinimumSize(comp);
this.add(comp, c);
 
final JLabelBold intSep = new JLabelBold("Liste des interventions");
c.gridwidth = GridBagConstraints.REMAINDER;
c.gridy++;
c.gridx = 0;
c.weightx = 1;
this.add(intSep, c);
 
c.gridy++;
c.weightx = 0;
c.weighty = 0;
c.fill = GridBagConstraints.NONE;
final JButton addSuivi = new JButton("Ajouter une intervention");
this.add(addSuivi, c);
addSuivi.addActionListener(new ActionListener() {
 
@Override
public void actionPerformed(ActionEvent e) {
final SQLElement element = Configuration.getInstance().getDirectory().getElement(Module.TABLE_CUSTOMER_SUPPORT_TICKET_HISTORY);
EditFrame frame = new EditFrame(element, EditMode.CREATION);
SQLRowValues rowVals = new SQLRowValues(element.getTable());
rowVals.put("DATE", new Date());
rowVals.put("ID_" + Module.TABLE_CUSTOMER_SUPPORT_TICKET, rowTicket.getID());
frame.getSQLComponent().select(rowVals);
FrameUtil.showPacked(frame);
 
frame.addEditPanelListener(new EditPanelListener() {
 
@Override
public void modified() {
}
 
@Override
public void inserted(int id) {
fillPanelHistory();
}
 
@Override
public void deleted() {
}
 
@Override
public void cancelled() {
}
});
}
});
 
// Historique
 
JScrollPane scrollPane = new JScrollPane(this.panelHistory);
scrollPane.setBorder(null);
fillPanelHistory();
c.gridy++;
c.fill = GridBagConstraints.BOTH;
c.weightx = 1;
c.weighty = 1;
this.add(scrollPane, c);
 
JButton buttonClose = new JButton("Fermer");
c.gridy++;
c.fill = GridBagConstraints.NONE;
c.weightx = 0;
c.weighty = 0;
c.gridwidth = GridBagConstraints.REMAINDER;
c.anchor = GridBagConstraints.EAST;
this.add(buttonClose, c);
buttonClose.addActionListener(new ActionListener() {
 
@Override
public void actionPerformed(ActionEvent e) {
JFrame frame = (JFrame) SwingUtilities.getRoot(SuiviTicketPanel.this);
frame.dispose();
}
});
}
 
public void fillPanelHistory() {
 
this.panelHistory.removeAll();
 
GridBagConstraints cHistory = new DefaultGridBagConstraints();
cHistory.anchor = GridBagConstraints.NORTHWEST;
cHistory.insets = new Insets(4, 1, 4, 1);
final SQLSelect sel = new SQLSelect();
sel.addSelectStar(this.rowTicket.getTable().getTable(Module.TABLE_CUSTOMER_SUPPORT_TICKET_HISTORY));
sel.setWhere(new Where(this.rowTicket.getTable().getTable(Module.TABLE_CUSTOMER_SUPPORT_TICKET_HISTORY).getField("ID_" + Module.TABLE_CUSTOMER_SUPPORT_TICKET), "=", this.rowTicket.getID()));
sel.setLockStrength(LockStrength.UPDATE);
List<SQLRow> histoRows = SQLRowListRSH.execute(sel, false, false);
List<SQLRowAccessor> histoRowsOrder = new ArrayList<SQLRowAccessor>();
histoRowsOrder.addAll(histoRows);
Collections.sort(histoRowsOrder, new Comparator<SQLRowAccessor>() {
@Override
public int compare(SQLRowAccessor o1, SQLRowAccessor o2) {
return o2.getDate("DATE").compareTo(o1.getDate("DATE"));
}
});
 
for (SQLRowAccessor sqlRowAccessor : histoRowsOrder) {
HistoryPanel p = new HistoryPanel(sqlRowAccessor, this);
cHistory.gridy++;
cHistory.weightx = 1;
cHistory.weighty = 0;
cHistory.fill = GridBagConstraints.BOTH;
panelHistory.add(p, cHistory);
}
cHistory.gridy++;
cHistory.weightx = 1;
cHistory.weighty = 1;
JPanel spacer = new JPanel();
spacer.setOpaque(false);
panelHistory.add(spacer, cHistory);
this.panelHistory.updateUI();
this.panelHistory.revalidate();
this.panelHistory.repaint();
}
 
}
/trunk/Modules/Module Customer Support/src/org/openconcerto/modules/customersupport/Module.java
New file
0,0 → 1,188
package org.openconcerto.modules.customersupport;
 
import java.io.File;
import java.io.IOException;
import java.sql.Date;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Calendar;
import java.util.List;
import java.util.Set;
 
import org.openconcerto.erp.config.Gestion;
import org.openconcerto.erp.config.MainFrame;
import org.openconcerto.erp.modules.AbstractModule;
import org.openconcerto.erp.modules.ComponentsContext;
import org.openconcerto.erp.modules.DBContext;
import org.openconcerto.erp.modules.MenuContext;
import org.openconcerto.erp.modules.ModuleFactory;
import org.openconcerto.erp.modules.ModuleManager;
import org.openconcerto.erp.modules.ModulePackager;
import org.openconcerto.erp.modules.RuntimeModuleFactory;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.GlobalMapper;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.element.SQLElementDirectory;
import org.openconcerto.sql.model.FieldPath;
import org.openconcerto.sql.model.SQLRequestLog;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.model.graph.Path;
import org.openconcerto.sql.ui.ConnexionPanel;
import org.openconcerto.sql.utils.SQLCreateTable;
import org.openconcerto.sql.view.ListeAddPanel;
import org.openconcerto.sql.view.list.BaseSQLTableModelColumn;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.SQLTableModelSourceOnline;
import org.openconcerto.utils.CollectionUtils;
 
public final class Module extends AbstractModule {
 
public static final String TABLE_CUSTOMER_SUPPORT_TICKET = "CUSTOMER_SUPPORT_TICKET";
public static final String TABLE_CUSTOMER_SUPPORT_TICKET_HISTORY = "CUSTOMER_SUPPORT_TICKET_HISTORY";
 
public Module(ModuleFactory f) throws IOException {
super(f);
}
 
@Override
protected void install(DBContext ctxt) {
super.install(ctxt);
// TODO use version to upgrade
if (ctxt.getRoot().getTable(TABLE_CUSTOMER_SUPPORT_TICKET) == null) {
final SQLCreateTable createTable = ctxt.getCreateTable(TABLE_CUSTOMER_SUPPORT_TICKET);
 
createTable.addIntegerColumn("NUMBER", 0);
createTable.addVarCharColumn("LABEL", 256);
//
createTable.addForeignColumn("CLIENT");
createTable.addForeignColumn("ID_USER_COMMON", ctxt.getRoot().findTable("USER_COMMON"));
//
createTable.addVarCharColumn("INFOS", 4096);
//
createTable.addVarCharColumn("RATING", 200);
createTable.addVarCharColumn("TYPE", 128);
createTable.addVarCharColumn("STATUS", 128);
createTable.addDateAndTimeColumn("REMIND_DATE");
createTable.addDateAndTimeColumn("DATE");
createTable.addBooleanColumn("CLOSED_AND_ARCHIVED", Boolean.FALSE, false);
 
// Suivi
final SQLCreateTable createHistory = ctxt.getCreateTable(TABLE_CUSTOMER_SUPPORT_TICKET_HISTORY);
createHistory.addDateAndTimeColumn("DATE");
createHistory.addForeignColumn(createTable);
createHistory.addVarCharColumn("INFORMATION", 10240);
createHistory.addIntegerColumn("ATTACHMENTS", 0);
createHistory.addForeignColumn("ID_USER_COMMON", ctxt.getRoot().findTable("USER_COMMON"));
 
// STATUT
// NOUVEAU, OUVERT, FERME, REJETE, EN COURS
try {
List<String> status = Arrays.asList("En cours", "Fermé", "Nouveau", "Ouvert", "Rejeté");
for (String s : status) {
 
SQLRowValues rowVals = new SQLRowValues(ctxt.getRoot().getTable("COMPLETION"));
rowVals.put("CHAMP", TABLE_CUSTOMER_SUPPORT_TICKET + ".STATUS");
rowVals.put("LABEL", s);
rowVals.insert(true, false);
}
 
List<String> prio = Arrays.asList("Basse", "Normale", "Haute");
for (String p : prio) {
 
SQLRowValues rowVals = new SQLRowValues(ctxt.getRoot().getTable("COMPLETION"));
rowVals.put("CHAMP", TABLE_CUSTOMER_SUPPORT_TICKET + ".RATING");
rowVals.put("LABEL", p);
rowVals.insert(true, false);
}
 
} catch (SQLException e) {
throw new IllegalStateException("erreur lors de l'ajout des status", e);
}
}
}
 
@Override
protected void setupElements(final SQLElementDirectory dir) {
super.setupElements(dir);
final CustomerSupportTicketSQLElement element = new CustomerSupportTicketSQLElement(this);
GlobalMapper.getInstance().map(element.getCode() + ".default", new CustomerSupportTicketGroup());
dir.addSQLElement(element);
dir.addSQLElement(new CustomerTicketHistorySQLElement(this));
}
 
@Override
protected void setupComponents(ComponentsContext ctxt) {
// nothing
}
 
@Override
protected void setupMenu(final MenuContext ctxt) {
ctxt.addMenuItem(new CustomerSupportTicketListAction(), MainFrame.LIST_MENU);
ctxt.addMenuItem(new CustomerSupportTicketHistoryListAction(), MainFrame.LIST_MENU);
}
 
@Override
protected void start() {
 
final SQLElement elt = Configuration.getInstance().getDirectory().getElement(Module.TABLE_CUSTOMER_SUPPORT_TICKET);
// Filter
final SQLTableModelSourceOnline source = elt.getTableSource(true);
source.getColumns().remove(source.getColumn(elt.getTable().getField("CLOSED_AND_ARCHIVED")));
Where wAttente = new Where(elt.getTable().getField("CLOSED_AND_ARCHIVED"), "=", Boolean.FALSE);
source.getReq().setWhere(wAttente);
 
// Filter
BaseSQLTableModelColumn dateRemind = new BaseSQLTableModelColumn("Date de rappel", Date.class) {
 
@Override
protected Object show_(SQLRowAccessor r) {
 
Calendar c = r.getDate("REMIND_DATE");
if (c == null) {
return null;
} else {
return new Date(c.getTime().getTime());
}
 
}
 
@Override
public Set<FieldPath> getPaths() {
Path p = new Path(elt.getTable());
return CollectionUtils.createSet(new FieldPath(p, "REMIND_DATE"));
}
};
 
dateRemind.setRenderer(new RemindDateRenderer());
source.getColumns().add(dateRemind);
 
final ListeAddPanel pane = new ListeAddPanel(elt, new IListe(source), "Open");
pane.getListe().setOpaque(false);
pane.setOpaque(false);
MainFrame.getInstance().getTabbedPane().addTab("Ticket support ouvert", pane);
 
}
 
@Override
protected void stop() {
// nothing to stop
}
 
public static void main(String[] args) throws IOException {
System.setProperty(ConnexionPanel.QUICK_LOGIN, "true");
final File propsFile = new File("module.properties");
System.out.println(propsFile.getAbsolutePath());
final ModuleFactory factory = new RuntimeModuleFactory(propsFile);
SQLRequestLog.setEnabled(true);
SQLRequestLog.showFrame();
// uncomment to create and use the jar
final ModulePackager modulePackager = new ModulePackager(propsFile, new File("bin/"));
modulePackager.writeToDir(new File("../OpenConcerto/Modules"));
ModuleManager.getInstance().addFactories(new File("../OpenConcerto/Modules"));
ModuleManager.getInstance().addFactoryAndStart(factory, false);
Gestion.main(args);
}
 
}
/trunk/Modules/Module Customer Support/src/org/openconcerto/modules/customersupport/ModuleResources.properties
New file
0,0 → 1,2
name=Customer Ticket
description=Adds customer ticket support
/trunk/Modules/Module Customer Support/src/org/openconcerto/modules/customersupport/CustomerSupportTicketListAction.java
New file
0,0 → 1,146
package org.openconcerto.modules.customersupport;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.sql.Date;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
 
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
 
import org.openconcerto.erp.action.CreateFrameAbstractAction;
import org.openconcerto.erp.core.common.ui.IListFilterDatePanel;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.FieldPath;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.model.graph.Path;
import org.openconcerto.sql.view.ListeAddPanel;
import org.openconcerto.sql.view.list.BaseSQLTableModelColumn;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.SQLTableModelSourceOnline;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.PanelFrame;
import org.openconcerto.utils.CollectionUtils;
 
public class CustomerSupportTicketListAction extends CreateFrameAbstractAction {
 
private SQLElement eltTicket = Configuration.getInstance().getDirectory().getElement(Module.TABLE_CUSTOMER_SUPPORT_TICKET);
 
@Override
public JFrame createFrame() {
return new PanelFrame(getPanel(), "Liste des tickets de support");
}
 
public CustomerSupportTicketListAction() {
super("Liste des tickets de support");
}
 
@SuppressWarnings("unchecked")
public JPanel getPanel() {
 
JPanel panel = new JPanel(new GridBagLayout());
 
final GridBagConstraints c = new DefaultGridBagConstraints();
c.fill = GridBagConstraints.NONE;
 
JTabbedPane tabbedPane = new JTabbedPane();
 
// Tous
Map<IListe, SQLField> listeFilter = new HashMap<IListe, SQLField>();
ListeAddPanel panelAll = createPanel(null);
listeFilter.put(panelAll.getListe(), panelAll.getListe().getModel().getTable().getField("DATE"));
 
tabbedPane.add("Tous", panelAll);
 
// Sans statut
ListeAddPanel panelEmpty = createPanel("");
listeFilter.put(panelEmpty.getListe(), panelEmpty.getListe().getModel().getTable().getField("DATE"));
 
tabbedPane.add("Sans statut", panelEmpty);
 
SQLSelect selStatus = new SQLSelect();
selStatus.addSelect(this.eltTicket.getTable().getField("STATUS"));
selStatus.addGroupBy(this.eltTicket.getTable().getField("STATUS"));
selStatus.addFieldOrder(this.eltTicket.getTable().getField("STATUS"));
 
final List<String> listStatus = Configuration.getInstance().getBase().getDataSource().executeCol(selStatus.asString());
 
// Date panel
 
for (String status : listStatus) {
if (status != null && status.trim().length() > 0) {
ListeAddPanel p = createPanel(status);
listeFilter.put(p.getListe(), p.getListe().getModel().getTable().getField("DATE"));
tabbedPane.add(status, p);
}
}
 
c.weightx = 1;
c.weighty = 1;
c.fill = GridBagConstraints.BOTH;
c.gridx = 0;
c.gridy++;
c.gridwidth = GridBagConstraints.REMAINDER;
panel.add(tabbedPane, c);
IListFilterDatePanel panelDate = new IListFilterDatePanel(listeFilter, IListFilterDatePanel.getDefaultMap());
 
c.gridy = 1;
c.gridwidth = GridBagConstraints.REMAINDER;
c.weightx = 1;
c.weighty = 0;
c.gridy++;
panel.add(panelDate, c);
 
return panel;
}
 
private ListeAddPanel createPanel(String status) {
// Filter
final SQLTableModelSourceOnline source = this.eltTicket.getTableSource(true);
 
if (status != null) {
Where wAttente = new Where(this.eltTicket.getTable().getField("STATUS"), "=", status);
source.getReq().setWhere(wAttente);
}
 
// Filter
BaseSQLTableModelColumn dateRemind = new BaseSQLTableModelColumn("Date de rappel", Date.class) {
 
@Override
protected Object show_(SQLRowAccessor r) {
 
Calendar c = r.getDate("REMIND_DATE");
if (c == null) {
return null;
} else {
return c.getTime();
}
 
}
 
@Override
public Set<FieldPath> getPaths() {
Path p = new Path(eltTicket.getTable());
return CollectionUtils.createSet(new FieldPath(p, "REMIND_DATE"));
}
};
 
dateRemind.setRenderer(new RemindDateRenderer());
source.getColumns().add(dateRemind);
 
final ListeAddPanel pane = new ListeAddPanel(this.eltTicket, new IListe(source), "Status" + status);
pane.getListe().setOpaque(false);
pane.setOpaque(false);
 
return pane;
}
}
/trunk/Modules/Module Customer Support/src/org/openconcerto/modules/customersupport/CustomerSupportTicketSQLElement.java
New file
0,0 → 1,153
package org.openconcerto.modules.customersupport;
 
import java.awt.GridBagConstraints;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
 
import javax.swing.AbstractAction;
 
import org.openconcerto.erp.core.common.ui.IListFilterDatePanel;
import org.openconcerto.erp.core.common.ui.PanelFrame;
import org.openconcerto.erp.modules.AbstractModule;
import org.openconcerto.erp.modules.ModuleElement;
import org.openconcerto.sql.element.GlobalMapper;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.EditPanel.EditMode;
import org.openconcerto.sql.view.IListFrame;
import org.openconcerto.sql.view.ListeAddPanel;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.RowAction;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.FrameUtil;
import org.openconcerto.ui.group.Group;
import org.openconcerto.utils.ListMap;
 
public class CustomerSupportTicketSQLElement extends ModuleElement {
 
public CustomerSupportTicketSQLElement(final AbstractModule module) {
super(module, Module.TABLE_CUSTOMER_SUPPORT_TICKET);
this.setL18nLocation(CustomerSupportTicketSQLElement.class);
 
// Suivi
final RowAction.PredicateRowAction addSuiviAction = new RowAction.PredicateRowAction(new AbstractAction("Suivi du ticket") {
 
@Override
public void actionPerformed(ActionEvent e) {
SQLRow sRow = IListe.get(e).getSelectedRow().asRow();
SuiviTicketPanel panel = new SuiviTicketPanel(sRow);
PanelFrame frame = new PanelFrame(panel, "Suivi ticket client");
frame.setSize(800, 600);
FrameUtil.show(frame);
}
}, true) {
};
addSuiviAction.setPredicate(IListeEvent.getSingleSelectionPredicate());
getRowActions().add(addSuiviAction);
 
// Suivi
final RowAction.PredicateRowAction detailsAction = new RowAction.PredicateRowAction(new AbstractAction("Détails client") {
 
@Override
public void actionPerformed(ActionEvent e) {
SQLRow sRow = IListe.get(e).getSelectedRow().asRow();
EditFrame frame = new EditFrame(getForeignElement("ID_CLIENT"), EditMode.READONLY);
frame.selectionId(sRow.getForeignID("ID_CLIENT"));
frame.pack();
FrameUtil.show(frame);
}
}, true) {
};
detailsAction.setPredicate(IListeEvent.getSingleSelectionPredicate());
getRowActions().add(detailsAction);
 
// Histo
final RowAction.PredicateRowAction addHistoriqueAction = new RowAction.PredicateRowAction(new AbstractAction("Historique des interventions sur tickets") {
 
@Override
public void actionPerformed(ActionEvent e) {
final SQLElement elementHisto = getDirectory().getElement(Module.TABLE_CUSTOMER_SUPPORT_TICKET_HISTORY);
final ListeAddPanel panel = new ListeAddPanel(elementHisto);
IListFrame frame = new IListFrame(panel);
 
IListFilterDatePanel panelDate = new IListFilterDatePanel(panel.getListe(), elementHisto.getTable().getField("DATE"), IListFilterDatePanel.getDefaultMap());
GridBagConstraints c = new DefaultGridBagConstraints();
c.gridy = 1;
c.gridwidth = GridBagConstraints.REMAINDER;
c.weightx = 1;
c.weighty = 0;
c.gridy++;
panel.add(panelDate, c);
FrameUtil.show(frame);
}
}, true) {
};
addHistoriqueAction.setPredicate(IListeEvent.createSelectionCountPredicate(0, Integer.MAX_VALUE));
getRowActions().add(addHistoriqueAction);
 
}
 
@Override
public Set<String> getReadOnlyFields() {
Set<String> s = new HashSet<String>();
s.add("NUMBER");
return s;
}
 
@Override
protected String createCode() {
return "customersupport.ticket";
}
 
@Override
protected List<String> getListFields() {
final List<String> l = new ArrayList<String>();
l.add("NUMBER");
l.add("DATE");
l.add("LABEL");
l.add("ID_CLIENT");
l.add("STATUS");
l.add("RATING");
l.add("INFOS");
l.add("CLOSED_AND_ARCHIVED");
return l;
}
 
@Override
protected List<String> getComboFields() {
final List<String> l = new ArrayList<String>();
l.add("NUMBER");
l.add("DATE");
l.add("ID_CLIENT");
l.add("LABEL");
return l;
}
 
@Override
public ListMap<String, String> getShowAs() {
ListMap<String, String> map = new ListMap<String, String>();
map.put(null, Arrays.asList("NUMBER", "DATE", "ID_CLIENT", "LABEL", "RATING", "STATUS"));
return map;
}
 
@Override
public SQLComponent createComponent() {
final String groupId = this.getCode() + ".default";
final Group group = GlobalMapper.getInstance().getGroup(groupId);
if (group == null) {
throw new IllegalStateException("No group found for id " + groupId);
}
return createComponent(group);
}
 
protected SQLComponent createComponent(final Group group) {
return new CustomerSupportTicketSQLComponent(this, group);
}
}
/trunk/Modules/Module Customer Support/src/org/openconcerto/modules/customersupport/SQLElementNames_en.xml
New file
0,0 → 1,3
<translations>
<element refid="customersupportticket.ticket" name="support ticket" />
</translations>
/trunk/Modules/Module Customer Support/src/org/openconcerto/modules/customersupport/CustomerSupportTicketListOpenPanel.java
New file
0,0 → 1,136
package org.openconcerto.modules.customersupport;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.sql.Date;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
 
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
 
import org.openconcerto.erp.core.common.ui.IListFilterDatePanel;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.FieldPath;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.model.graph.Path;
import org.openconcerto.sql.view.ListeAddPanel;
import org.openconcerto.sql.view.list.BaseSQLTableModelColumn;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.SQLTableModelSourceOnline;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.utils.CollectionUtils;
 
public class CustomerSupportTicketListOpenPanel {
 
private SQLElement eltTicket;
 
public CustomerSupportTicketListOpenPanel(SQLElement elt) {
this.eltTicket = elt;
}
 
@SuppressWarnings("unchecked")
public JPanel getPanel() {
 
JPanel panel = new JPanel(new GridBagLayout());
 
final GridBagConstraints c = new DefaultGridBagConstraints();
c.fill = GridBagConstraints.NONE;
 
JTabbedPane tabbedPane = new JTabbedPane();
 
// Tous
Map<IListe, SQLField> listeFilter = new HashMap<IListe, SQLField>();
ListeAddPanel panelAll = createPanel(null);
listeFilter.put(panelAll.getListe(), panelAll.getListe().getModel().getTable().getField("DATE"));
 
tabbedPane.add("Tous", panelAll);
 
// Sans statut
ListeAddPanel panelEmpty = createPanel("");
listeFilter.put(panelEmpty.getListe(), panelEmpty.getListe().getModel().getTable().getField("DATE"));
 
tabbedPane.add("Sans statut", panelEmpty);
 
SQLSelect selStatus = new SQLSelect();
selStatus.addSelect(this.eltTicket.getTable().getField("STATUS"));
selStatus.addGroupBy(this.eltTicket.getTable().getField("STATUS"));
selStatus.addFieldOrder(this.eltTicket.getTable().getField("STATUS"));
 
final List<String> listStatus = Configuration.getInstance().getBase().getDataSource().executeCol(selStatus.asString());
 
// Date panel
for (String status : listStatus) {
if (status != null && status.trim().length() > 0) {
ListeAddPanel p = createPanel(status);
listeFilter.put(p.getListe(), p.getListe().getModel().getTable().getField("DATE"));
tabbedPane.add(status, p);
}
}
 
c.weightx = 1;
c.weighty = 1;
c.fill = GridBagConstraints.BOTH;
c.gridx = 0;
c.gridy++;
c.gridwidth = GridBagConstraints.REMAINDER;
panel.add(tabbedPane, c);
IListFilterDatePanel panelDate = new IListFilterDatePanel(listeFilter, IListFilterDatePanel.getDefaultMap());
 
c.gridy = 1;
c.gridwidth = GridBagConstraints.REMAINDER;
c.weightx = 1;
c.weighty = 0;
c.gridy++;
panel.add(panelDate, c);
 
return panel;
}
 
private ListeAddPanel createPanel(String status) {
// Filter
final SQLTableModelSourceOnline source = this.eltTicket.getTableSource(true);
 
if (status != null) {
Where wAttente = new Where(this.eltTicket.getTable().getField("STATUS"), "=", status);
source.getReq().setWhere(wAttente);
}
 
// Filter
BaseSQLTableModelColumn dateRemind = new BaseSQLTableModelColumn("Date de rappel", Date.class) {
 
@Override
protected Object show_(SQLRowAccessor r) {
 
Calendar c = r.getDate("REMIND_DATE");
if (c == null) {
return null;
} else {
return c.getTime();
}
 
}
 
@Override
public Set<FieldPath> getPaths() {
Path p = new Path(eltTicket.getTable());
return CollectionUtils.createSet(new FieldPath(p, "REMIND_DATE"));
}
};
 
dateRemind.setRenderer(new RemindDateRenderer());
source.getColumns().add(dateRemind);
 
final ListeAddPanel pane = new ListeAddPanel(this.eltTicket, new IListe(source), "Status" + status);
pane.getListe().setOpaque(false);
pane.setOpaque(false);
return pane;
}
}
/trunk/Modules/Module Customer Support/src/org/openconcerto/modules/customersupport/CustomerTicketSupportHistoryGroup.java
New file
0,0 → 1,21
package org.openconcerto.modules.customersupport;
 
import org.openconcerto.ui.group.Group;
import org.openconcerto.ui.group.LayoutHints;
 
public class CustomerTicketSupportHistoryGroup extends Group {
 
public CustomerTicketSupportHistoryGroup() {
super("customersupportticket.ticket.history");
final Group g = new Group("customersupportticket.ticket.history.identifier");
g.addItem("DATE");
g.addItem("ID_" + Module.TABLE_CUSTOMER_SUPPORT_TICKET, LayoutHints.DEFAULT_LARGE_FIELD_HINTS);
g.addItem("ID_USER_COMMON", LayoutHints.DEFAULT_LARGE_FIELD_HINTS);
this.add(g);
 
final Group gAddress = new Group("customersupportticket.ticket.history.content", LayoutHints.DEFAULT_SEPARATED_GROUP_HINTS);
gAddress.addItem("INFORMATION", new LayoutHints(true, true, false, true, true, true));
this.add(gAddress);
 
}
}
/trunk/Modules/Module Operation/src/org/openconcerto/modules/operation/CheckListModel.java
5,9 → 5,9
 
import javax.swing.AbstractListModel;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
 
import org.openconcerto.ui.list.CheckListItem;
import org.openconcerto.utils.SwingWorker2;
 
public abstract class CheckListModel extends AbstractListModel {
private List<CheckListItem> items = new ArrayList<CheckListItem>();
24,7 → 24,7
 
public void loadContent() {
assert SwingUtilities.isEventDispatchThread();
SwingWorker2<List<CheckListItem>, Object> worker = new SwingWorker2<List<CheckListItem>, Object>() {
SwingWorker<List<CheckListItem>, Object> worker = new SwingWorker<List<CheckListItem>, Object>() {
 
@Override
protected List<CheckListItem> doInBackground() throws Exception {
/trunk/Modules/Module Operation/src/org/openconcerto/modules/operation/OperationHistoryPanel.java
17,6 → 17,7
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingWorker;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
 
33,7 → 34,6
import org.openconcerto.sql.users.rights.JListSQLTablePanel;
import org.openconcerto.sql.view.IListPanel;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.utils.SwingWorker2;
import org.openconcerto.utils.cc.ITransformer;
 
public class OperationHistoryPanel extends JPanel {
40,10 → 40,10
OperationHistoryPanel() {
this.setLayout(new GridLayout(1, 1));
final SQLBase b = ((ComptaPropsConfiguration) Configuration.getInstance()).getSQLBaseSociete();
final Map<String, List<String>> mapList = new HashMap<String, List<String>>();
final Map<String, List<String>> mapList = new HashMap<>();
mapList.put("Interventions", Arrays.asList("OPERATION"));
 
final Map<SQLTable, SQLField> map = new HashMap<SQLTable, SQLField>();
final Map<SQLTable, SQLField> map = new HashMap<>();
final ComboSQLRequest comboRequest = JListSQLTablePanel.createComboRequest(Configuration.getInstance().getDirectory().getElement(b.getTable("SITE")), true);
 
JPanel panel = new JPanel();
73,7 → 73,7
final List<SQLRowValues> selectedRows = list.getSelectedRows();
final IListPanel listePanel = listHistoriquePanel.getListePanel(0);
if (selectedRows != null && !selectedRows.isEmpty()) {
final Set<Long> idsCalendarItemGroup = new HashSet<Long>();
final Set<Long> idsCalendarItemGroup = new HashSet<>();
for (SQLRowValues sqlRowValues : selectedRows) {
idsCalendarItemGroup.add(Long.valueOf(sqlRowValues.getForeign("ID_CALENDAR_ITEM_GROUP").getID()));
}
87,7 → 87,7
 
select.setWhere(where);
 
final SwingWorker2<Boolean, String> w = new SwingWorker2<Boolean, String>() {
final SwingWorker<Boolean, String> w = new SwingWorker<Boolean, String>() {
 
@Override
protected Boolean doInBackground() throws Exception {
96,6 → 96,7
return l.isEmpty();
}
 
@Override
protected void done() {
Boolean b;
try {
108,8 → 109,8
e.printStackTrace();
}
 
}
};
};
w.execute();
 
}
/trunk/Modules/Module Operation/src/org/openconcerto/modules/operation/UserColor.java
10,15 → 10,15
 
public class UserColor {
private static UserColor instance;
private String[] colors = new String[] { "#303F9F", "#31DE39", "#FFC107", "#C2185B", "#00796B", "#212121", "#00BCD4", "#A6A6A6", "#795548", "#B3E5FC", "#FF0000" };
private Map<Integer, Color> map = new HashMap<Integer, Color>();
private static final String[] COLORS = new String[] { "#303F9F", "#31DE39", "#FFC107", "#C2185B", "#00796B", "#212121", "#00BCD4", "#A6A6A6", "#795548", "#B3E5FC", "#FF0000" };
private final Map<Integer, Color> map = new HashMap<>();
 
public UserColor() {
List<User> users = UserManager.getInstance().getAllUser();
final List<User> users = UserManager.getInstance().getAllActiveUsers();
final int size = users.size();
for (int i = 0; i < size; i++) {
User u = users.get(i);
map.put(u.getId(), Color.decode(colors[i % colors.length]));
final User u = users.get(i);
map.put(u.getId(), Color.decode(COLORS[i % COLORS.length]));
}
}
 
26,7 → 26,7
return map.get(id);
}
 
public synchronized static final UserColor getInstance() {
public static final synchronized UserColor getInstance() {
if (instance == null) {
instance = new UserColor();
}
/trunk/Modules/Module Operation/src/org/openconcerto/modules/operation/OperationMenuProvider.java
22,6 → 22,7
 
public class OperationMenuProvider implements JPopupMenuProvider {
public OperationMenuProvider() {
//
}
 
@Override
40,7 → 41,7
}
if (!selectedItems.isEmpty()) {
final JMenu menuAssign = new JMenu("Assigner à");
final List<User> users = UserManager.getInstance().getAllUser();
final List<User> users = UserManager.getInstance().getAllActiveUsers();
// Sort by full name
Collections.sort(users, new UserComparator());
for (User user : users) {
81,12 → 82,10
menu.add(dup);
}
 
if (!selectedItems.isEmpty()) {
if (!oneIsLocked) {
if (!selectedItems.isEmpty() && !oneIsLocked) {
menu.addSeparator();
menu.add(new DeleteAction(selectedItems));
}
}
return menu;
}
 
/trunk/Modules/Module Badge/.classpath
1,7 → 1,7
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry combineaccessrules="false" kind="src" path="/OpenConcerto"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="output" path="bin"/>
</classpath>
/trunk/Modules/Module Lead/src/org/openconcerto/modules/customerrelationship/lead/LeadGroup.java
2,6 → 2,7
 
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRights;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.ui.group.Group;
import org.openconcerto.ui.group.LayoutHints;
 
48,7 → 49,7
gState.addItem("STATUS");
gState.addItem("ID_COMMERCIAL");
gState.addItem("REMIND_DATE");
UserRights rights = UserManager.getInstance().getCurrentUser().getRights();
UserRights rights = UserRightsManager.getCurrentUserRights();
if (rights.haveRight("CLIENT_PROSPECT")) {
gState.addItem("ID_CLIENT");
}
/trunk/Modules/Module Lead/src/org/openconcerto/modules/customerrelationship/lead/LeadSQLElement.java
29,6 → 29,8
import org.openconcerto.sql.model.graph.Path;
import org.openconcerto.sql.users.User;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRights;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.EditPanel.EditMode;
import org.openconcerto.sql.view.EditPanelListener;
99,21 → 101,19
 
super._initTableSource(source);
 
User user = UserManager.getInstance().getCurrentUser();
if (!user.getRights().haveRight(LeadSQLElement.CODE_NOT_RESTRICT)) {
SQLRow row = Configuration.getInstance().getRoot().findTable("USER_COMMON").getRow(UserManager.getInstance().getCurrentUser().getId());
List<SQLRow> rows = row.getReferentRows(Configuration.getInstance().getRoot().findTable("COMMERCIAL").getField("ID_USER_COMMON"));
if (!UserRightsManager.getCurrentUserRights().haveRight(LeadSQLElement.CODE_NOT_RESTRICT)) {
final SQLRow row = Configuration.getInstance().getRoot().findTable("USER_COMMON").getRow(UserManager.getInstance().getCurrentUser().getId());
final List<SQLRow> rows = row.getReferentRows(Configuration.getInstance().getRoot().findTable("COMMERCIAL").getField("ID_USER_COMMON"));
final List<Integer> listComm = new ArrayList<Integer>();
for (SQLRow sqlRow : rows) {
listComm.add(sqlRow.getID());
}
if (listComm != null && listComm.size() > 0) {
if (!listComm.isEmpty()) {
source.getReq().setSelectTransf(new ITransformer<SQLSelect, SQLSelect>() {
 
@Override
public SQLSelect transformChecked(SQLSelect input) {
 
SQLField field = input.getTable(Module.TABLE_LEAD).getField("ID_COMMERCIAL");
final SQLField field = input.getTable(Module.TABLE_LEAD).getField("ID_COMMERCIAL");
Where w = new Where(field, listComm);
w = w.or(new Where(field, "IS", (Object) null));
w = w.or(new Where(field, "=", getTable().getTable("COMMERCIAL").getUndefinedID()));
128,9 → 128,8
 
@Override
protected Object show_(SQLRowAccessor r) {
SQLRowAccessor rAdr = r.getForeign("ID_ADRESSE");
final SQLRowAccessor rAdr = r.getForeign("ID_ADRESSE");
if (rAdr != null && !rAdr.isUndefined()) {
 
return rAdr.getString("RUE");
}
return "";
265,7 → 264,6
try {
rowVals.commit();
} catch (SQLException exn) {
// TODO Bloc catch auto-généré
exn.printStackTrace();
}
}
/trunk/Modules/Module Google API/.classpath
1,7 → 1,6
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry combineaccessrules="false" kind="src" path="/OpenConcerto"/>
<classpathentry exported="true" kind="lib" path="lib/gdata-analytics-2.1.jar"/>
<classpathentry exported="true" kind="lib" path="lib/gdata-analytics-meta-2.1.jar"/>
48,5 → 47,6
<classpathentry exported="true" kind="lib" path="lib/gdata-youtube-meta-2.0.jar"/>
<classpathentry exported="true" kind="lib" path="lib/guava-10.0.1.jar"/>
<classpathentry exported="true" kind="lib" path="lib/mail.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="output" path="bin"/>
</classpath>
/trunk/Modules/Module Expense/src/org/openconcerto/modules/humanresources/travel/expense/Module.java
54,6 → 54,7
GlobalMapper.getInstance().map(ExpenseStateSQLElement.ELEMENT_CODE + ".default", new ExpenseStateGroup());
dir.addSQLElement(new ExpenseSQLElement());
dir.addSQLElement(new ExpenseStateSQLElement());
dir.getShowAs().show(Module.TABLE_EXPENSE_STATE, "NAME");
}
 
@Override
/trunk/Modules/Module Batch Processing/src/org/openconcerto/modules/common/batchprocessing/BatchEditorPanel.java
22,6 → 22,7
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
 
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.PropsConfiguration;
32,7 → 33,6
import org.openconcerto.ui.JLabelBold;
import org.openconcerto.ui.ReloadPanel;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.SwingWorker2;
 
public class BatchEditorPanel extends JPanel {
 
43,7 → 43,7
List<SQLField> f = new ArrayList<SQLField>();
for (SQLField sqlField : fields) {
if (ForbiddenFieldName.isAllowed(sqlField.getName()) && translator.getLabelFor(sqlField) != null) {
if (filter == null || (filter != null && !filter.isFiltered(sqlField))) {
if (filter == null || !filter.isFiltered(sqlField)) {
f.add(sqlField);
}
}
60,12 → 60,12
GridBagConstraints c = new DefaultGridBagConstraints();
this.add(new JLabel("Champ"), c);
 
final JComboBox combo = new JComboBox(f.toArray());
final JComboBox<SQLField> combo = new JComboBox<SQLField>(f.toArray(new SQLField[1]));
combo.setRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
value = translator.getLabelFor(((SQLField) value));
return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
String label = translator.getLabelFor(((SQLField) value));
return super.getListCellRendererComponent(list, label, index, isSelected, cellHasFocus);
}
});
 
127,7 → 127,7
 
combo.setEnabled(false);
reload.setMode(ReloadPanel.MODE_ROTATE);
SwingWorker2<Object, Object> w = new SwingWorker2<Object, Object>() {
SwingWorker<Object, Object> w = new SwingWorker<Object, Object>() {
 
@Override
protected Object doInBackground() throws Exception {
/trunk/Modules/Module HTTP/.classpath
1,7 → 1,6
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry combineaccessrules="false" kind="src" path="/OpenConcerto"/>
<classpathentry exported="true" kind="lib" path="lib/commons-codec-1.4.jar"/>
<classpathentry exported="true" kind="lib" path="lib/commons-logging-1.1.1.jar"/>
11,5 → 10,6
<classpathentry exported="true" kind="lib" path="lib/httpmime-4.1.2.jar"/>
<classpathentry exported="true" kind="lib" path="lib/sardine.jar"/>
<classpathentry exported="true" kind="lib" path="lib/slf4j-api-1.6.2.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="output" path="bin"/>
</classpath>
/trunk/Modules/Module Exchange Rates/src/org/openconcerto/modules/finance/accounting/exchangerates/Module.java
1,5 → 1,6
package org.openconcerto.modules.finance.accounting.exchangerates;
 
import java.awt.GraphicsEnvironment;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
130,9 → 131,11
}
} catch (Exception e) {
e.printStackTrace();
if (!GraphicsEnvironment.isHeadless()) {
JOptionPane.showMessageDialog(null, "Impossible de mettre à jour les taux de change");
}
}
}
 
@Override
public List<ModulePreferencePanelDesc> getPrefDescriptors() {
178,8 → 181,13
if (this.commercialConverter != null) {
tauxCommercial = commercialConverter.convert(BigDecimal.ONE, report.getMainCurrencyCode(), code, date, true);
} else {
try {
tauxCommercial = converter.convert(BigDecimal.ONE, report.getMainCurrencyCode(), code, date, true);
} catch (IllegalStateException e) {
// Aucun taux n'existe encore dans la base.
tauxCommercial = null;
}
}
if (tauxCommercial == null) {
tauxCommercial = BigDecimal.ONE;
}
/trunk/Modules/Module OCR/src/org/openconcerto/modules/ocr/parser/OrangeInvoiceParser.java
1,7 → 1,6
package org.openconcerto.modules.ocr.parser;
 
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
/trunk/Modules/Module Axis SOAP/.classpath
1,11 → 1,11
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry combineaccessrules="false" kind="src" path="/OpenConcerto"/>
<classpathentry exported="true" kind="lib" path="lib/axis-1.4.jar"/>
<classpathentry exported="true" kind="lib" path="lib/commons-discovery-0.2.jar"/>
<classpathentry exported="true" kind="lib" path="lib/jaxrpc.jar"/>
<classpathentry exported="true" kind="lib" path="lib/wsdl4j-1.5.1.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="output" path="bin"/>
</classpath>