Giter Site home page Giter Site logo

sde1000 / quicktill Goto Github PK

View Code? Open in Web Editor NEW
38.0 9.0 6.0 5.88 MB

Figure out where all the money and stock went to

License: GNU General Public License v3.0

Shell 0.18% Python 60.13% CSS 0.86% HTML 8.52% JavaScript 30.31%
pos python epos cash-register escpos point-of-sale

quicktill's People

Contributors

sde1000 avatar zakx avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

quicktill's Issues

Confusing behaviour of modifier keys

Will pointed out at the Pembury that Pint1 Half Pint1 records a pint and a half on pump 1, whereas Half Pint1 Pint1 records two halves. He is confused by this - possibly quite reasonably.

Consider changing modifiers to affect the next line key press only - I.e. include them in the match condition for repeating a keypress.

Message field for users

Perhaps have a "message" field for users to explain where their transaction went to if it was taken over by another user? At the moment we report the other user's name when they take over a transaction being worked on on an active register, but if a transaction is "stolen" while there's no register page active for it there's no message given to the user who had it.

Update .deb packaging

We need to change the package name to avoid the new version being installed on tills before the database and configuration file are updated. I suggest "quicktill1" with versions 0.10.0, 0.10.1, ... leading on to the stable release of version 1.0. (The current stable version is 0.9.32; going back to 0.1, 0.2, ... before 1.0 would be confusing.)

Automatic lock on transaction close

Leave transaction on the screen but ignore further input if configured to auto-lock. Clear user? Make sure there are no popups and the "locked" register doesn't appear on the lock screen as unsaved.

Better handling of conflict between registers

At the moment, the register code attempts to "teleport" the user's current transaction to wherever the user presses a key. There's a concept of which register instance is the user's "current" one and pressing a key always sets it to be the till where the key was pressed. The code deals with conflicts (eg. between the current displayed transaction and the user's last-used transactions) in a fairly arbitrary way with lots of special cases.

In practice, if a user's session is left unlocked on a till then other users will accidentally hit keys on it - perhaps just brushing the keyboard on their way to sign in. This makes the "teleport to keypress" feature rather unhelpful.

Change the code such that when a key is pressed on a register which isn't the user's "current" one, the page immediately locks. The only way for a user to set their "current" register is to sign in with their token. This should let us get rid of lots of special cases in the code!

UI improvement for new void system

Users are (predictably) being confused by the new "void" system.

When a Void transaction is created, pop up a payment methods dialog asking how they want to process the void; the user can either choose a payment method to complete the void immediately, or cancel the popup to add other lines to the transaction. (Eg. replacing a bad pint: void the unwanted one, cancel the popup, enter the new one; the till now shows the amount to be refunded or the extra amount to be paid.)

Change "firstpage" to be a "default" page

At the moment the till software creates an instance of the configured "firstpage" on startup. After that the "firstpage" config option isn't used. Register and stock control pages that want to exit do so by explicitly invoking the lock screen.

Change this so that the "firstpage" config option is used when there is no current page, and alter register and stock control pages simply to delete themselves when they want to exit.

ObjectDeletedError at Haymakers

(Version 0.10.26)

  File "/usr/lib/python2.7/dist-packages/quicktill/till.py", line 97, in run
    curses.wrapper(start)
  File "/usr/lib/python2.7/curses/wrapper.py", line 43, in wrapper
    return func(stdscr, *args, **kwds)
  File "/usr/lib/python2.7/dist-packages/quicktill/till.py", line 54, in start
    event.eventloop()
  File "/usr/lib/python2.7/dist-packages/quicktill/event.py", line 31, in eventloop
    for i in rd: i.doread()
  File "/usr/lib/python2.7/dist-packages/quicktill/user.py", line 282, in doread
    ui.handle_keyboard_input(token(d))
  File "/usr/lib/python2.7/dist-packages/quicktill/ui.py", line 98, in handle_keyboard_input
    basicwin._focus.hotkeypress(k)
  File "/usr/lib/python2.7/dist-packages/quicktill/ui.py", line 199, in hotkeypress
    self.parent.hotkeypress(k)
  File "/usr/lib/python2.7/dist-packages/quicktill/register.py", line 1568, in hotkeypress
    super(page,self).hotkeypress(k)
  File "/usr/lib/python2.7/dist-packages/quicktill/ui.py", line 296, in hotkeypress
    tillconfig.usertoken_handler(k)
  File "<string>", line 455, in <lambda>
  File "/usr/lib/python2.7/dist-packages/quicktill/register.py", line 1603, in handle_usertoken
    p.select(u)
  File "/usr/lib/python2.7/dist-packages/quicktill/register.py", line 1573, in select
    self._redraw()
  File "/usr/lib/python2.7/dist-packages/quicktill/register.py", line 303, in _redraw
    self.updateheader()
  File "/usr/lib/python2.7/dist-packages/quicktill/ui.py", line 279, in updateheader
    if i==basicpage._basepage: m=i.pagename()+' '
  File "/usr/lib/python2.7/dist-packages/quicktill/register.py", line 290, in pagename
    self.user.shortname,self.trans.id,
  File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/attributes.py", line 168, in __get__
    return self.impl.get(instance_state(instance),dict_)
  File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/attributes.py", line 451, in get
    value = callable_(passive)
  File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/state.py", line 281, in __call__
    self.manager.deferred_scalar_loader(self, toload)
  File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/mapper.py", line 1706, in _load_scalar_attributes
    raise orm_exc.ObjectDeletedError(state)
ObjectDeletedError: Instance '<Transaction at 0x6eec250>' has been deleted, or its row is otherwise not present.

Set a minimum Bitcoin payment

Bitcoin transaction fees are relatively high at the moment (~10p) so prohibit transactions below around £2. (Also, the rounding on the merchant service looks to be a bit broken so transactions for very small amounts are reported as 'paid' immediately!)

List of payments for a session

It would be useful to be able to obtain a list of payments of a particular type (eg. CARD) for a session when trying to find out why the till totals don't match up with the actual totals! This can be done as a page in tillweb.

Deal with refunds properly

How do we deal with refunds from a closed transaction?

I've been working on the assumption that we select a set of transaction lines from the closed transaction, and create a new "void" transaction that has the same lines with negative "items" and "stockout.qty"; we then use the normal payment method selection process to issue the refund (eg. card refund or cash refund).

Some refund types can be made to require a permission, eg. card refunds require that the user has access to the PDQ supervisor card.

Last used field for user token

User tokens should have a "last used" field so that it's easier to spot which ones have been lost, when looking at a list all described as "red wrist strap".

Add logging of what users get up to

At the moment we can log what users do in stock annotations. Add a table for other records of what users have been doing which aren't necessarily related to stock.

Define default sets of permissions for groups in the main code

At the moment, "basic-user", "skilled-user" and "manager" groups are defined in the example configuration file. This has been copied to the various sites and edited.

Define these in quicktill/user.py instead as sets of permissions that the configuration file can make use of; that way we can change the defaults in the code and still leave site-specific changes in place.

Show name of user in list of transactions on Recall Trans button

Users are complaining that the till sometimes "loses" their current transaction. I suspect what's actually happening is that another user is hunting down the "Recall Transaction" list, picks it (and claims it), realises it's not the one they want, and releases it. If transactions already claimed by other users are highlighted, this is less likely to happen.

Let the user choose the location in the stock terminal

At the moment we can have different locations shown on the stock terminal page by binding them to separate buttons in the configuration file. It would be nice to be able to pick a new location from a popup menu while the stock terminal is being displayed.

Update notification

When the lock screen is shown and no users have "unsaved work", the till should check for updates and restart automatically if there are any present.

I can think of three possible types of update:

  1. An updated configuration file (store a hash of the one loaded at init time; periodically re-load and compare hashes)
  2. Updated version of till software installed
  3. Updated version of till software available for installation

The first is simple. How do we detect the other two?

The till software is currently deployed on Ubuntu, but this may change and it may have to work with different types of package management system. It's probably best to be able to configure a file for the lock page to look at which defines what the current state of the system is and describes the exit codes the system should use to specify an upgrade should be done.

Strip whitespace from text input fields

After field value access has been made consistent across the codebase, make text input fields strip leading and trailing whitespace automatically whenever they are accessed.

Slow payment methods

Some payment methods (eg. Bitcoin) will need to create a Payment object early to get an object ID to pass to an external service. There must then be a way of going back to that Payment and updating it.

Perhaps add an attribute "payments_mutable" on the payment method so the register code can do something appropriate when the cursor is on a payment of that type?

Function for creating arbitrary transaction lines

Sometimes it's useful for a manager to be able to create a transaction line with a free text description and a value that might be outside the usual range for the department. Let managers with the appropriate permission do so.

Even better handling of kitchen printer failure

At the moment we "ping" the kitchen printer to see if it's reachable before accepting an order. If we catch an exception while sending the order to the kitchen, we pop up a box telling the user to take the customer copy into the kitchen.

A better system would be:

  1. Initial ping to see whether there's a potential problem. Allow the user to continue even if there's a problem, after showing an informational box.
  2. Ping again after accepting the order. Send the order to the kitchen printer. If the ping or sending fails, print the order on the local receipt printer.
  3. Print the order on the local receipt printer.

This way we always end up with two copies of the order; if there's a problem with the kitchen printer then the bar staff just have to run the order ticket to the kitchen manually.

Focus problem with food orders

When a food order is printed and the underlying transaction is not fresh (I.e. a box has to be popped up warning the user it may have changed) the input focus ends up in the wrong place and the popup cannot be dismissed.

Catch this issue and try to make sure the food order isn't thrown away at the same time!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.