Compare commits

..

16 Commits

Author SHA1 Message Date
crudo
68b59ce478 Merge branch 'master' of subnixr/macao-pos into master 2017-03-26 21:25:55 +02:00
1b3fa43a23 Clean little code 2017-03-26 21:17:07 +02:00
257eba61b0 Add floating point input 2017-03-26 21:09:46 +02:00
ce0092303f Update .gitignore to exclude rotated log files. 2017-03-26 20:37:15 +02:00
65e42c0c6e Add transaction total in sell page and style update to fit in a tablet. 2017-03-26 20:17:46 +02:00
8dab5b7ab2 Include UID in ticket. 2017-03-26 20:17:46 +02:00
71ba505c8b Implement transaction printing. 2017-03-26 20:17:46 +02:00
2cf749fd6f Fix query bug that prevented events with undefined end date being used. 2017-03-26 20:17:46 +02:00
a6e878c6fd Fix exception raising on 'event list' command when event has no transactions. 2017-03-26 20:17:46 +02:00
819a38e2d3 Database schema change. Implement ProductCategory.
* The user can now create product categories with the 'category add' command.
* The user can now add products to categories with the
  'product add --category INT' command.
2017-03-26 20:17:46 +02:00
729402ef6d Database schema change. Minor database refactoring. 2017-03-26 20:17:46 +02:00
b93478ac85 Minor cli.py refactoring. 2017-03-26 20:17:46 +02:00
c771aaadbc Database schema change and new UI feature. The user can now rearrange the products.
* Product has a new 'order' column.
* The user can now specify the sort order at product creation time with the
  'product add --sort INT' command.
* The user can now rearrange the products with the 'products set --sort INT'
  comand.
* The user can now show a sorted list of products in cli.py with the
  'product list --sort' command.
2017-03-26 20:17:46 +02:00
800be08471 Fix typos in cli.py. 2017-03-26 20:17:46 +02:00
22476bfb7b Implement 'user set' command in cli.py. 2017-03-26 20:17:45 +02:00
96ccea0899 Implement new features for cli.py 'event' command.
* The user can now create a new event with a not defined end date.
* The user can now edit the name and the start and end date of a given event.
* The software can now check if the event the user is creating or editing
  is overlapping another event already present in the database.
* The software will allow the shortcut keywords 'now' and 'none' in the
  'event set --end' command.
2017-03-26 20:17:38 +02:00
5 changed files with 67 additions and 66 deletions

2
.gitignore vendored
View File

@ -96,4 +96,4 @@ ENV/
# macao-pos files # macao-pos files
conf/ conf/
pos.db pos.db
pos.log pos.log*

View File

@ -58,12 +58,12 @@ python3 cli.py user add username password
Add some products with: Add some products with:
``` ```
python3 cli.py product add "Birra media" 300 python3 cli.py product add "Birra media" 3
python3 cli.py product add "Birra grande" 400 python3 cli.py product add "Birra grande" 4
python3 cli.py product add "Cocktail" 500 python3 cli.py product add "Cocktail" 5
python3 cli.py product add "Vino" 400 python3 cli.py product add "Vino" 4
python3 cli.py product add "Amaro" 200 python3 cli.py product add "Amaro" 2
python3 cli.py product add "Acqua" 100 python3 cli.py product add "Acqua" 0.5
``` ```
And finally add and event you can play with: And finally add and event you can play with:

3
cli.py
View File

@ -289,10 +289,11 @@ def tabulate_products(products):
@product.command('add') @product.command('add')
@click.argument('name') @click.argument('name')
@click.argument('price') @click.argument('price', type=float)
@click.option('-s', '--sort', type=click.INT) @click.option('-s', '--sort', type=click.INT)
@click.option('-c', '--category', type=click.INT) @click.option('-c', '--category', type=click.INT)
def product_add(name, price, sort, category): def product_add(name, price, sort, category):
price = int(price * 100)
product = Product(name=name, price=price) product = Product(name=name, price=price)
if sort: if sort:

56
static/js/sell.js Normal file
View File

@ -0,0 +1,56 @@
function updateTotal(amount) {
total_el = document.getElementById('total')
total = parseFloat(total_el.innerText)
total += amount
total_el.innerText = total.toFixed(2)
}
function renderBasketItem(uid, name) {
return '<button id="basketitem_' + uid + '"' +
'onclick="delProduct(' + uid + ')">' +
'1 x ' + name +
'</button>'
}
function addProduct(uid) {
// This is the hidden input element inside the form. We'll use this DOM
// element to keep informations about the product, such as the name,
// the price and the value inside the 'data-' tag.
form_el = document.getElementById('prod_' + uid)
basket = document.getElementById('basket')
basket_el = document.getElementById('basketitem_' + uid)
form_el.value = parseInt(form_el.value) + 1
// If there is not a button for the given product inside the basket
// div we'll create it.
if (basket_el === null) {
basket.innerHTML += renderBasketItem(uid, form_el.dataset.name)
} else {
// Otherwise we'll just update it.
console.log(form_el.value)
new_text = form_el.value + ' x ' + form_el.dataset.name
basket_el.innerText = new_text
}
updateTotal(parseFloat(form_el.dataset.price))
}
function delProduct(uid) {
form_el = document.getElementById('prod_' + uid)
basket = document.getElementById('basket')
basket_el = document.getElementById('basketitem_' + uid)
form_el.value = parseInt(form_el.value) - 1
if (form_el.value == 0) {
basket.removeChild(basket_el)
} else {
new_text = form_el.value + ' x ' + form_el.dataset.name
basket_el.innerText = new_text
}
updateTotal(parseFloat(-form_el.dataset.price))
}

View File

@ -27,66 +27,10 @@
</form> </form>
</div> </div>
<script type="text/javascript" src="{{ url_for('static', filename='js/sell.js') }}">
<script type="text/javascript"> <script type="text/javascript">
function reset() {
{%- for product in products %} {%- for product in products %}
document.getElementById('prod_{{ product.uid }}').value = 0 document.getElementById('prod_{{ product.uid }}').value = 0
{%- endfor %} {%- endfor %}
}
function updateTotal(amount) {
total_el = document.getElementById('total')
total = parseFloat(total_el.innerText)
total += amount
total_el.innerText = total.toFixed(2)
}
function addProduct(uid) {
// This is the hidden input element inside the form. We'll use this DOM
// element to keep informations about the product, such as the name,
// the price and the value inside the 'data-' tag.
form_el = document.getElementById('prod_' + uid)
basket = document.getElementById('basket')
basket_el = document.getElementById('basketitem_' + uid)
form_el.value = parseInt(form_el.value) + 1
// If there is not a button for the given product inside the basket
// div we'll create it.
if (basket_el === null) {
new_basket_el =
'<button id="basketitem_' + uid + '"' +
'onclick="delProduct(' + uid + ')">' +
'1 x ' + form_el.dataset.name +
'</button>'
basket.innerHTML += new_basket_el
} else {
// Otherwise we'll just update it.
console.log(form_el.value)
new_text = form_el.value + ' x ' + form_el.dataset.name
basket_el.innerText = new_text
}
updateTotal(parseFloat(form_el.dataset.price))
}
function delProduct(uid) {
form_el = document.getElementById('prod_' + uid)
basket = document.getElementById('basket')
basket_el = document.getElementById('basketitem_' + uid)
form_el.value = parseInt(form_el.value) - 1
if (form_el.value == 0) {
basket.removeChild(basket_el)
} else {
new_text = form_el.value + ' x ' + form_el.dataset.name
basket_el.innerText = new_text
}
updateTotal(parseFloat(-form_el.dataset.price))
}
reset()
</script> </script>
{% endblock %} {% endblock %}