glebtv / openbravoposru

Automatically exported from code.google.com/p/openbravoposru
1 stars 1 forks source link

Блокирование столов за пользователями #197

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
Есть ли какая-то возможность запретить 
редактировать столы юзеру, если он их не 
открывал?

Original issue reported on code.google.com by giichmob...@gmail.com on 3 Jan 2012 at 1:23

GoogleCodeExporter commented 9 years ago
Это нужно чтобы официанты случайно не 
добавили чего-нибудь на чужой стол :)

Original comment by giichmob...@gmail.com on 3 Jan 2012 at 1:23

GoogleCodeExporter commented 9 years ago
Что необходимо понятно, как будет время 
посмотрю, что можно сделать для реализации 
данного функционала.

Original comment by svinin...@gmail.com on 11 Jan 2012 at 8:19

GoogleCodeExporter commented 9 years ago
У меня так работает, стол просто неактивен 
для другого юзера

Original comment by masterum...@gmail.com on 22 May 2012 at 8:55

GoogleCodeExporter commented 9 years ago
Открываем класс 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

GoogleCodeExporter commented 9 years ago
[deleted comment]
GoogleCodeExporter commented 9 years ago
Ах да, совсем забыл, чтобы менеджеры, 
кассиры, администрация, и прочие 
нахлебники могли 
просматривать/редактировать чужие столы, 
необходимо добавлять вызов 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

GoogleCodeExporter commented 9 years ago
Попробовал вылетает на этом условии:
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

GoogleCodeExporter commented 9 years ago
У меня создается впечатление, что 
пользователь в Sharedticket не храниться? Или я 
ошибаюсь. В каких таблицах вообще хранятся 
продажи? И открытые столы?

Original comment by s...@profex.com.ua on 31 May 2012 at 8:48

GoogleCodeExporter commented 9 years ago
Так это ж 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

GoogleCodeExporter commented 9 years ago
в SHAREDTICKETS -> CONTENT как раз и хранятся открытые 
столы... и юзер там сохраняется при выходе 
из редактирования чека. Но вы его там не 
увидите через БД, данные сериализованы.

Original comment by masterum...@gmail.com on 7 Jun 2012 at 8:21

GoogleCodeExporter commented 9 years ago
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

GoogleCodeExporter commented 9 years ago
Странно, но при открытии нового стола, в 
тикет устанавливается текущий юзер, и при 
выходе он же и сохраняется, а при повторном 
открытии снова устанавливается текущий.
Покажите на всякий случай свой метод 
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

GoogleCodeExporter commented 9 years ago
Да, com.openbravo.pos.ticket.TicketInfo и com.openbravo.pos.ticket.UserInfo 
выложите тоже.

Original comment by masterum...@gmail.com on 10 Jun 2012 at 9:37

GoogleCodeExporter commented 9 years ago
Не обязательно удалять столы, я разобрался. 
Необходимо править TicketInfo.

Original comment by masterum...@gmail.com on 11 Jun 2012 at 8:35

GoogleCodeExporter commented 9 years ago
TicketInfo выложит полностью?

Original comment by s...@profex.com.ua on 11 Jun 2012 at 9:15

GoogleCodeExporter commented 9 years ago
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

GoogleCodeExporter commented 9 years ago
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

GoogleCodeExporter commented 9 years ago
Замените методы на эти

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

GoogleCodeExporter commented 9 years ago
УРАААААААА!!! ЗАРАБОТАЛО!
Автору спасибо. 
Если кто будет добавлять то дополнительно 
к посту номер 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

GoogleCodeExporter commented 9 years ago
В дополнение 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

GoogleCodeExporter commented 9 years ago
Спасибо masterumely и serg за проделанную работу. 
Если есть время сбросьте, что у вас 
получилось в репозитарий нашего проекта, я 
вас добавил в коммитеры. Мог бы сам, но меня 
тут перекинули на новое направление, так 
что ждите пополнение в списке 
поддерживаемого оборудования :) И вообще 
лучше когда много участников в проекте. Жду 
ваших патчей. 

Единственное замечание, замените русское 
"Бог", на более понятное "restaurant.AllTablesAvailable", 
ну и "Раб" на "restaurant.AllTablesNotAvailable".

Original comment by svinin...@gmail.com on 14 Jun 2012 at 4:08