Open GoogleCodeExporter opened 8 years ago
Это нужно чтобы официанты случайно не
добавили чего-нибудь на чужой стол :)
Original comment by giichmob...@gmail.com
on 3 Jan 2012 at 1:23
Что необходимо понятно, как будет время
посмотрю, что можно сделать для реализации
данного функционала.
Original comment by svinin...@gmail.com
on 11 Jan 2012 at 8:19
У меня так работает, стол просто неактивен
для другого юзера
Original comment by masterum...@gmail.com
on 22 May 2012 at 8:55
Открываем класс JTicketsBagRestaurantMap
Добавляем метод tableAccess:
private void tableAccess(Place place) {
AppUser user = m_App.getAppUserView().getUser();
TicketInfo ticket = getTicketInfo(place);
if (ticket != null) { //Тикет создан?
if (!user.getId().equals(ticket.getUser().getId())) { //Совпадает имя юзера с открывшим тикет?
place.getButton().setEnabled(false); //Деактивируем стол
}
}
}
Затем в методе printState в конец каждого цикла
for (Place place : m_aplaces) {...} добавляем вызов -
tableAccess(place);
Перебор конечно большой, но даже при 100
созданных столах задержки не было. Кто
знает, как оптимизировать, предлагайте.
Original comment by masterum...@gmail.com
on 22 May 2012 at 9:59
[deleted comment]
Ах да, совсем забыл, чтобы менеджеры,
кассиры, администрация, и прочие
нахлебники могли
просматривать/редактировать чужие столы,
необходимо добавлять вызов tableAccess через
условие:
if (m_App.getAppUserView().getUser().hasPermission("Раб")) {
tableAccess(place);
}
Ну и всем Фицикам и прочим простым грешным,
кому не разрешается лезть в чужие столы, в
Role.Employee.xml, и в остальных бесправных ролях,
(если они есть) добавить
<class name="Раб"/>
Original comment by masterum...@gmail.com
on 22 May 2012 at 10:22
Попробовал вылетает на этом условии:
if (!user.getId().equals(ticket.getUser().getId()))
пишет: if (!user.getId().equals(ticket.getUser().getId())) = >Метод
"getId" вызван на нулевом объекте.<
И у самого ticket параметр m_User равен null хотя
создавал его администратором.
Original comment by s...@profex.com.ua
on 31 May 2012 at 8:18
У меня создается впечатление, что
пользователь в Sharedticket не храниться? Или я
ошибаюсь. В каких таблицах вообще хранятся
продажи? И открытые столы?
Original comment by s...@profex.com.ua
on 31 May 2012 at 8:48
Так это ж user.getId() выдает ошибку... вы
смотрели, что в ticket.getUser() в этот момент?
А из (JTicketsBagRestaurantMap.tableAccess(Place place))
AppUser user = m_App.getAppUserView().getUser();
в m_App наверно надо передать
AppView app переданный JTicketsBagRestaurantMap...
Вылетает при попытке открыть JPanelTicketSales?
Original comment by masterum...@gmail.com
on 7 Jun 2012 at 8:15
в SHAREDTICKETS -> CONTENT как раз и хранятся открытые
столы... и юзер там сохраняется при выходе
из редактирования чека. Но вы его там не
увидите через БД, данные сериализованы.
Original comment by masterum...@gmail.com
on 7 Jun 2012 at 8:21
user.getId() как раз выдает правильно m_sName =
"Продавец" с m_sId = "4".
А вот ticket.getUser() как раз равно null.
Просмотрев сериализованые данные в Sharedtickets
не смог ничего понять толком. Но учитывая
что ID пользователя под которым он
создавался равно 0. Так вот в
сериализованых данных 0 нет вообще, как и
имени Администратор. Могу выложить
сериализовные данные.
Может Вы у себя доделывали запись
пользователя в сериализованые данные
Shareticket?
Или может какая то настройка это включает?
Original comment by s...@profex.com.ua
on 8 Jun 2012 at 1:59
Странно, но при открытии нового стола, в
тикет устанавливается текущий юзер, и при
выходе он же и сохраняется, а при повторном
открытии снова устанавливается текущий.
Покажите на всякий случай свой метод
setActiveTicket, если он отличается от
нижеприведенного.
У меня все совсем по другому, но это не
важно.
Вообщем, разбираем код.
В методе setActiveTicket класса
com.openbravo.pos.sales.JPanelTicket условие
if (m_oTicket != null) {
// Asign preeliminary properties to the receipt
m_oTicket.setUser(m_App.getAppUserView().getUser().getUserInfo());
m_oTicket.setActiveCash(m_App.getActiveCashIndex());
m_oTicket.setDate(new Date()); // Set the edition date.
}
дополняем
if (m_oTicket != null) {
// Asign preeliminary properties to the receipt
if (m_oTicket.getUser() == null) {
m_oTicket.setUser(m_App.getAppUserView().getUser().getUserInfo());
}
m_oTicket.setActiveCash(m_App.getActiveCashIndex());
m_oTicket.setDate(new Date()); // Set the edition date.
}
НО! перед внесением изменений, и ранее
описанных тоже, удалить/закрыть ВСЕ
столы/счета ОБЯЗАТЕЛЬНО!!!!!
Original comment by masterum...@gmail.com
on 10 Jun 2012 at 9:33
Да, com.openbravo.pos.ticket.TicketInfo и com.openbravo.pos.ticket.UserInfo
выложите тоже.
Original comment by masterum...@gmail.com
on 10 Jun 2012 at 9:37
Не обязательно удалять столы, я разобрался.
Необходимо править TicketInfo.
Original comment by masterum...@gmail.com
on 11 Jun 2012 at 8:35
TicketInfo выложит полностью?
Original comment by s...@profex.com.ua
on 11 Jun 2012 at 9:15
SetActiveTicket такой же как в верхнем варианте.
Дополнил Вашим кодом, не помогло.
TicketInfo:
public class TicketInfo implements SerializableRead, Externalizable {
private static final long serialVersionUID = 2765650092387265178L;
public static final int RECEIPT_NORMAL = 0;
public static final int RECEIPT_REFUND = 1;
public static final int RECEIPT_PAYMENT = 2;
private static DateFormat m_dateformat = new SimpleDateFormat("hh:mm");
private String m_sId;
private int tickettype;
private int m_iTicketId;
private java.util.Date m_dDate;
private Properties attributes;
private UserInfo m_User;
private CustomerInfoExt m_Customer;
private String m_sActiveCash;
private List<TicketLineInfo> m_aLines;
private List<PaymentInfo> payments;
private List<TicketTaxInfo> taxes;
private String m_sResponse;
/** Creates new TicketModel */
public TicketInfo() {
m_sId = UUID.randomUUID().toString();
tickettype = RECEIPT_NORMAL;
m_iTicketId = 0; // incrementamos
m_dDate = new Date();
attributes = new Properties();
m_User = null;
m_Customer = null;
m_sActiveCash = null;
m_aLines = new ArrayList<TicketLineInfo>(); // vacio de lineas
payments = new ArrayList<PaymentInfo>();
taxes = null;
m_sResponse = null;
}
public void writeExternal(ObjectOutput out) throws IOException {
// esto es solo para serializar tickets que no estan en la bolsa de tickets pendientes
out.writeObject(m_sId);
out.writeInt(tickettype);
out.writeInt(m_iTicketId);
out.writeObject(m_Customer);
out.writeObject(m_dDate);
out.writeObject(attributes);
out.writeObject(m_aLines);
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
// esto es solo para serializar tickets que no estan en la bolsa de tickets pendientes
m_sId = (String) in.readObject();
tickettype = in.readInt();
m_iTicketId = in.readInt();
m_Customer = (CustomerInfoExt) in.readObject();
m_dDate = (Date) in.readObject();
attributes = (Properties) in.readObject();
m_aLines = (List<TicketLineInfo>) in.readObject();
m_User = null;
m_sActiveCash = null;
payments = new ArrayList<PaymentInfo>();
taxes = null;
}
public void readValues(DataRead dr) throws BasicException {
m_sId = dr.getString(1);
tickettype = dr.getInt(2).intValue();
m_iTicketId = dr.getInt(3).intValue();
m_dDate = dr.getTimestamp(4);
m_sActiveCash = dr.getString(5);
try {
byte[] img = dr.getBytes(6);
if (img != null) {
attributes.loadFromXML(new ByteArrayInputStream(img));
}
} catch (IOException e) {
}
m_User = new UserInfo(dr.getString(7), dr.getString(8));
m_Customer = new CustomerInfoExt(dr.getString(9));
m_aLines = new ArrayList<TicketLineInfo>();
payments = new ArrayList<PaymentInfo>();
taxes = null;
}
public TicketInfo copyTicket() {
TicketInfo t = new TicketInfo();
t.tickettype = tickettype;
t.m_iTicketId = m_iTicketId;
t.m_dDate = m_dDate;
t.m_sActiveCash = m_sActiveCash;
t.attributes = (Properties) attributes.clone();
t.m_User = m_User;
t.m_Customer = m_Customer;
t.m_aLines = new ArrayList<TicketLineInfo>();
for (TicketLineInfo l : m_aLines) {
t.m_aLines.add(l.copyTicketLine());
}
t.refreshLines();
t.payments = new LinkedList<PaymentInfo>();
for (PaymentInfo p : payments) {
t.payments.add(p.copyPayment());
}
// taxes are not copied, must be calculated again.
return t;
}
public String getId() {
return m_sId;
}
public int getTicketType() {
return tickettype;
}
public void setTicketType(int tickettype) {
this.tickettype = tickettype;
}
public int getTicketId() {
return m_iTicketId;
}
public void setTicketId(int iTicketId) {
m_iTicketId = iTicketId;
// refreshLines();
}
public String getName(Object info) {
StringBuffer name = new StringBuffer();
if (getCustomerId() != null) {
name.append(m_Customer.toString());
name.append(" - ");
}
if (info == null) {
if (m_iTicketId == 0) {
name.append("(" + m_dateformat.format(m_dDate) + " " + Long.toString(m_dDate.getTime() % 1000) + ")");
} else {
name.append(Integer.toString(m_iTicketId));
}
} else {
name.append(info.toString());
}
return name.toString();
}
public String getName() {
return getName(null);
}
public java.util.Date getDate() {
return m_dDate;
}
public void setDate(java.util.Date dDate) {
m_dDate = dDate;
}
public UserInfo getUser() {
return m_User;
}
public void setUser(UserInfo value) {
m_User = value;
}
public CustomerInfoExt getCustomer() {
return m_Customer;
}
public void setCustomer(CustomerInfoExt value) {
m_Customer = value;
}
public String getCustomerId() {
if (m_Customer == null) {
return null;
} else {
return m_Customer.getId();
}
}
public String getTransactionID(){
return (getPayments().size()>0)
? ( getPayments().get(getPayments().size()-1) ).getTransactionID()
: StringUtils.getCardNumber(); //random transaction ID
}
public String getReturnMessage(){
return ( (getPayments().get(getPayments().size()-1)) instanceof PaymentInfoMagcard )
? ((PaymentInfoMagcard)(getPayments().get(getPayments().size()-1))).getReturnMessage()
: LocalRes.getIntString("button.ok");
}
public void setActiveCash(String value) {
m_sActiveCash = value;
}
public String getActiveCash() {
return m_sActiveCash;
}
public String getProperty(String key) {
return attributes.getProperty(key);
}
public String getProperty(String key, String defaultvalue) {
return attributes.getProperty(key, defaultvalue);
}
public void setProperty(String key, String value) {
attributes.setProperty(key, value);
}
public Properties getProperties() {
return attributes;
}
public TicketLineInfo getLine(int index) {
return m_aLines.get(index);
}
public void addLine(TicketLineInfo oLine) {
oLine.setTicket(m_sId, m_aLines.size());
m_aLines.add(oLine);
}
public void insertLine(int index, TicketLineInfo oLine) {
m_aLines.add(index, oLine);
refreshLines();
}
public void setLine(int index, TicketLineInfo oLine) {
oLine.setTicket(m_sId, index);
m_aLines.set(index, oLine);
}
public void removeLine(int index) {
m_aLines.remove(index);
refreshLines();
}
private void refreshLines() {
for (int i = 0; i < m_aLines.size(); i++) {
getLine(i).setTicket(m_sId, i);
}
}
public int getLinesCount() {
return m_aLines.size();
}
public double getArticlesCount() {
double dArticles = 0.0;
TicketLineInfo oLine;
for (Iterator<TicketLineInfo> i = m_aLines.iterator(); i.hasNext();) {
oLine = i.next();
dArticles += oLine.getMultiply();
}
return dArticles;
}
public double getSubTotal() {
double sum = 0.0;
for (TicketLineInfo line : m_aLines) {
sum += line.getSubValue();
}
return sum;
}
public double getDiscountTotal() {
double discountsum = 0.0;
for (TicketLineInfo line : m_aLines) {
discountsum += line.getDiscountTotalLine();
}
return discountsum;
}
public double getTotalNoDiscount() {
return getTotal() + getDiscountTotal();
}
public double getDiscountAvgRate() {
return getDiscountTotal() / getTotalNoDiscount();
}
public double getTax() {
double sum = 0.0;
if (hasTaxesCalculated()) {
for (TicketTaxInfo tax : taxes) {
sum += tax.getTax(); // Taxes are already rounded...
}
} else {
for (TicketLineInfo line : m_aLines) {
sum += line.getTax();
}
}
return sum;
}
public double getTotal() {
return getSubTotal() + getTax();
}
public double getTotalPaid() {
double sum = 0.0;
for (PaymentInfo p : payments) {
if (!"debtpaid".equals(p.getName())) {
sum += p.getTotal();
}
}
return sum;
}
public List<TicketLineInfo> getLines() {
return m_aLines;
}
public void setLines(List<TicketLineInfo> l) {
m_aLines = l;
}
public List<PaymentInfo> getPayments() {
return payments;
}
public void setPayments(List<PaymentInfo> l) {
payments = l;
}
public void resetPayments() {
payments = new ArrayList<PaymentInfo>();
}
public List<TicketTaxInfo> getTaxes() {
return taxes;
}
public boolean hasTaxesCalculated() {
return taxes != null;
}
public void setTaxes(List<TicketTaxInfo> l) {
taxes = l;
}
public void resetTaxes() {
taxes = null;
}
public TicketTaxInfo getTaxLine(TaxInfo tax) {
for (TicketTaxInfo taxline : taxes) {
if (tax.getId().equals(taxline.getTaxInfo().getId())) {
return taxline;
}
}
return new TicketTaxInfo(tax);
}
public TicketTaxInfo[] getTaxLines() {
Map<String, TicketTaxInfo> m = new HashMap<String, TicketTaxInfo>();
TicketLineInfo oLine;
for (Iterator<TicketLineInfo> i = m_aLines.iterator(); i.hasNext();) {
oLine = i.next();
TicketTaxInfo t = m.get(oLine.getTaxInfo().getId());
if (t == null) {
t = new TicketTaxInfo(oLine.getTaxInfo());
m.put(t.getTaxInfo().getId(), t);
}
t.add(oLine.getSubValue());
}
// return dSuma;
Collection<TicketTaxInfo> avalues = m.values();
return avalues.toArray(new TicketTaxInfo[avalues.size()]);
}
public String printId() {
if (m_iTicketId > 0) {
// valid ticket id
return Formats.INT.formatValue(new Integer(m_iTicketId));
} else {
return "";
}
}
public String printTicketName() {
return getName();
}
public String printDate() {
return Formats.TIMESTAMP.formatValue(m_dDate);
}
public String printUser() {
return m_User == null ? "" : m_User.getName();
}
public String printCustomer() {
return m_Customer == null ? "" : m_Customer.getName();
}
public String printArticlesCount() {
return Formats.DOUBLE.formatValue(new Double(getArticlesCount()));
}
public String printSubTotal() {
return Formats.CURRENCY.formatValue(new Double(getSubTotal()));
}
public String printTax() {
return Formats.CURRENCY.formatValue(new Double(getTax()));
}
public String printTotal() {
return Formats.CURRENCY.formatValue(new Double(getTotal()));
}
public String printTotalPaid() {
return Formats.CURRENCY.formatValue(new Double(getTotalPaid()));
}
public String printDiscountTotal() {
return Formats.CURRENCY.formatValue(new Double(getDiscountTotal()));
}
public String printTotalNoDiscount() {
return Formats.CURRENCY.formatValue(new Double(getTotalNoDiscount()));
}
public String printDiscountAvgRate() {
return Formats.PERCENT.formatValue(new Double(getDiscountAvgRate()));
}
}
Original comment by s...@profex.com.ua
on 11 Jun 2012 at 9:20
UserInfo:
package com.openbravo.pos.ticket;
import java.io.Serializable;
/**
*
* @author adrianromero
*/
public class UserInfo implements Serializable {
private static final long serialVersionUID = 7537578737839L;
private String m_sId;
private String m_sName;
/** Creates a new instance of UserInfoBasic */
public UserInfo(String id, String name) {
m_sId = id;
m_sName = name;
}
public String getId() {
return m_sId;
}
public String getName() {
return m_sName;
}
}
Original comment by s...@profex.com.ua
on 11 Jun 2012 at 10:11
Замените методы на эти
public void writeExternal(ObjectOutput out) throws IOException {
// esto es solo para serializar tickets que no estan en la bolsa de tickets pendientes
out.writeObject(m_sId);
out.writeInt(tickettype);
out.writeInt(m_iTicketId);
out.writeObject(m_Customer);
out.writeObject(m_dDate);
out.writeObject(attributes);
out.writeObject(m_aLines);
out.writeObject(m_User);
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
// esto es solo para serializar tickets que no estan en la bolsa de tickets pendientes
m_sId = (String) in.readObject();
tickettype = in.readInt();
m_iTicketId = in.readInt();
m_Customer = (CustomerInfoExt) in.readObject();
m_dDate = (Date) in.readObject();
attributes = (Properties) in.readObject();
m_aLines = (List<TicketLineInfo>) in.readObject();
m_User = (UserInfo) in.readObject();
m_sActiveCash = null;
payments = new ArrayList<PaymentInfo>();
taxes = null;
}
Original comment by masterum...@gmail.com
on 11 Jun 2012 at 11:27
УРАААААААА!!! ЗАРАБОТАЛО!
Автору спасибо.
Если кто будет добавлять то дополнительно
к посту номер 6 добавить:
com.openbravo.pos.ticket.TicketInfo
в public void writeExternal добавить
out.writeObject(m_User);
в public void readExternal
строку : m_User = null;
заменить: m_User = (UserInfo) in.readObject();
Еще раз спасибо.
Original comment by s...@profex.com.ua
on 11 Jun 2012 at 11:48
В дополнение 6 поста, правильнее будет
делать условие наоборот,
if (!m_App.getAppUserView().getUser().hasPermission("Бог")) {
tableAccess(place);
}
И всем приближенным, чтобы могли смотреть
ЧУЖИЕ столы, добавить в Role.xxx
<class name="Бог"/>
Original comment by masterum...@gmail.com
on 11 Jun 2012 at 12:14
Спасибо masterumely и serg за проделанную работу.
Если есть время сбросьте, что у вас
получилось в репозитарий нашего проекта, я
вас добавил в коммитеры. Мог бы сам, но меня
тут перекинули на новое направление, так
что ждите пополнение в списке
поддерживаемого оборудования :) И вообще
лучше когда много участников в проекте. Жду
ваших патчей.
Единственное замечание, замените русское
"Бог", на более понятное "restaurant.AllTablesAvailable",
ну и "Раб" на "restaurant.AllTablesNotAvailable".
Original comment by svinin...@gmail.com
on 14 Jun 2012 at 4:08
Original issue reported on code.google.com by
giichmob...@gmail.com
on 3 Jan 2012 at 1:23