pindesk / openbravoposru

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

Autologoff. Автоматический выход пользователя по таймеру. #179

Open GoogleCodeExporter opened 8 years ago

GoogleCodeExporter commented 8 years ago
Проблема возникает когда одной кассой 
пользуются несколько человек в течение 
одной смены.
Для того, чтобы продажи велись от имени 
конкретного пользователя ему необходимо 
сделать logoff и затем logon.
Было бы здорово, если бы в настройках был бы 
параметр - время простоя перед autologoff в 
минутах, чтобы по истечении этого времени 
на кассе он происходил автоматически. 
Тогда пользователя остается только logon 
причем это можно сделать по карте.
использую 0.3.0 на openSUSE 11.4.

Original issue reported on code.google.com by dpeti...@gmail.com on 26 Sep 2011 at 5:47

GoogleCodeExporter commented 8 years ago
Добавить таймер никакой сложности нет. 
Есть готовое решение.

Original comment by masterum...@gmail.com on 12 Nov 2011 at 11:29

GoogleCodeExporter commented 8 years ago
Если не сложно поделитесь, а то я думаю эта 
тема актуальна для всех у кого внедрения в 
организациях, где на кассе работает 
несколько пользователей.

Original comment by svinin...@gmail.com on 10 Dec 2011 at 5:34

GoogleCodeExporter commented 8 years ago
Вы еще ждете?))
Простите, я забыл ответить.

Значит повесить таймер достаточно просто, 
НО! Только на JTicketsBag...Map. Если юзер открыл 
Тикет, то тот будет открыт сколько угодно 
времени (ИМХО так и нужно, поэтому я сделал 
у себя так)

В JTicketsBag...Map
добавляем новую переменную (javax.swing.Timer)
    private Timer m_jtimer;

Добавляем в JPrincipalApp метод, который будет 
вызывать собственно выход юзера.

public void exitApp() {
    m_appview.closeAppView();
}

И так как доступа к этому методу у нас нет, 
то расшариваем его на интерфейс AppUserView:

public void exitApp();

Добавляем новый класс в JTicketsBag...Map, он 
маленький и приватный. Будет останавливать 
таймер и выбрасывать на окошко авторизации.

private class TimerAction implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        if (deactivate()) {
            m_jtimer.stop();
            m_App.getAppUserView().exitApp();
        }
    }
}

Теперь можно инициализировать наш таймер:

m_jtimer = new 
javax.swing.Timer(здесь_время_в_миллисекундах, new 
TimerAction());

в метод activate разумеется, перед showView его и 
вставляем.
Сразу скажу, чтобы задавать время 
опционально, я вынес значение времени в 
Ticket.Buttons и указываю его в секундах:

<timer value="10"/>

Изменим значение 
здесь_время_в_миллисекундах на

panelticket.getTime()*1000

Ах, у вас нет panelticket? Так добавьте ее!)

this.panelticket = (JPanelTicket) panelticket;

а в JPanelTicket определим значение getTime

public int getTime() {
    return Integer.parseInt(m_jbtnconfig.getProperty("timer", "0"));
}

Итак, теперь таймер будет выглядеть так:

m_jtimer = new javax.swing.Timer(panelticket.getTime()*1000, new TimerAction());

Ну, на совершенство кода я не претендую, 
поэтому значение времени можно хранить и в 
другом месте, мне так было удобнее сначала, 
а теперь лень переделывать.

Ну теперь самое сложное:
Запускаем его

if (panelticket.getTime() > 0) {
    m_jtimer.start();
}

Условие сделано для того, что если он нам 
больше не понадобится по какой-то причине, 
то установив значение времени в 0 он не 
будет запускаться.
Если нужно, чтобы не для всех он работал, то 
соответственно через условие, кому. 
Расписывать не буду, ранее уже описывал в 
Столах для Официантов.

Если мы выйдем из Map раньше времени, то 
выхватим исключение, потому что Таймер 
тикает в своем потоке, а объект, который ему 
вызывать по окончанию, уже будет уничтожен.

Значит нужно расставить остановку таймера, 
везде, где только мы выходим из объекта. Это 
будут:

deactivate
setActivePlace
m_jbtnReservationsActionPerformed

Теперь если мы что-то делаем на Map'е, надо, 
чтоб таймер не стопорился, поэтому мы будем 
его снова запускать, как только куда-нибудь 
будем нажимать

if (panelticket.getTime() > 0) {
    m_jtimer.start();
}

Таймер просто будет обновлять регистр в 
значение, заданное нами, и после последнего 
нажатия будет всегда оставаться точно то 
время, которое мы указывали.
Итак, добавляем:

viewTables
m_jbtnRefreshActionPerformed

Вроде больше некуда, если вдруг что 
пропустил, сильно не пинайте, давно писал, 
мог забыть уже.
Готово, можно проверять.

P.S. Андрей, если будете добавлять в 
мейнстрим, то прошу данный пост удалить, 
спасибо.

Original comment by masterum...@gmail.com on 23 May 2012 at 2:26