sde1000 / quicktill Goto Github PK
View Code? Open in Web Editor NEWFigure out where all the money and stock went to
License: GNU General Public License v3.0
Figure out where all the money and stock went to
License: GNU General Public License v3.0
Department 11 has been hard-coded, and keyboard.K_DEPT11 isn't guaranteed to exist. Make this configurable.
The manual page included in the Debian package is out of date.
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.
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.
When the stock control terminal is left unattended for some time, return to the lock screen.
It currently looks very strange in widescreen! Being scrollable would also be good.
Recording of waste against "display" stocklines isn't implemented.
We want to be able to link stock annotations to users; this requires a database change.
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.)
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.
If there's a query with an order, having the name of the person who took the order printed on the kitchen's copy of it will help them resolve it.
Prints of open transactions are showing "receipt number" as well as "transaction number". They should not.
We can't fit the price of 12 kegs of Moravka in the cost price field!
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!
Raise an error if the discount policy, footer or department is missing.
Some fields are read using a function, some are read using attribute access on 'f'. Go through all the code and made this consistent!
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.)
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.
(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.
The Bar Billiards checker has a hard-coded VAT band 'A'. Either make this configurable or remove the code entirely; we don't use it any more and it's only useful as an example.
(From Tom)
When entering deliveries - default to the most used field ie Milton rather than Milestone, to save time.
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!)
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.
This ought to help with the proliferation of different locations at some pubs!
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.
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".
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.
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.
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.
The stock picker needs to support sorting by stock line affinity first.
Start field is not filled in on auto-allocate.
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.
IPL-specific kludge needs removing.
When a release is re-built using the -r option, the release script doesn't embed the correct version number in quicktill/version.py; it leaves it as "git".
This is a regression. While you're at it, the popup is a bit slow appearing too!
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:
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.
The session page treats a business called 'IPL' differently. Move this to a column of the business table?
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.
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?
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.
3, a printable key-mapping for easy reference - to help new staff locate rarely sold stuff,
https://docs.google.com/document/d/1JNzHdokXndHn7DK9BjyYS59cxxWjxE8yOobbJBWTLKk/pub
At the moment we fail when displaying currency amounts because we can't call .quantize() on floats
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:
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.
Some unicode problem...?
Quick printout of price list on receipt printer.
Maybe an option for a PDF price list too?
There's a global configuration option "allow_tabs" which needs to be removed.
We have the "stop" annotation type but don't use it at the moment, except when purging stock. Use it wherever stock is disconnected from a stockline.
Undefer totals column
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!
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.