diff --git a/brmbar3/SQL b/brmbar3/SQL index 1d1d32f..bae5a15 100644 --- a/brmbar3/SQL +++ b/brmbar3/SQL @@ -41,6 +41,8 @@ CREATE TABLE accounts ( ); INSERT INTO accounts (name, currency, acctype) VALUES ('BrmBar Cash', (SELECT id FROM currencies WHERE name='Kč'), 'cash'); INSERT INTO accounts (name, currency, acctype) VALUES ('BrmBar Profits', (SELECT id FROM currencies WHERE name='Kč'), 'income'); +INSERT INTO accounts (name, currency, acctype) VALUES ('BrmBar Excess', (SELECT id FROM currencies WHERE name='Kč'), 'income'); +INSERT INTO accounts (name, currency, acctype) VALUES ('BrmBar Deficit', (SELECT id FROM currencies WHERE name='Kč'), 'expense'); CREATE SEQUENCE barcodes_id_seq START WITH 1 INCREMENT BY 1; diff --git a/brmbar3/brmbar-cli.py b/brmbar3/brmbar-cli.py index 155b19f..7695986 100755 --- a/brmbar3/brmbar-cli.py +++ b/brmbar3/brmbar-cli.py @@ -8,7 +8,7 @@ import brmbar def help(): - print("""BrmBar v3 (c) Petr Baudis 2012 + print("""BrmBar v3 (c) Petr Baudis 2012-2013 Usage: brmbar-cli.py COMMAND ARGS... @@ -30,22 +30,8 @@ Usage: brmbar-cli.py COMMAND ARGS... screen of the GUI. adduser USER Add user (debt) account with given username. -! inventory ITEM1 NEW_AMOUNT1 ITEM2 NEW_AMOUNT2 ... - Create a special inventory recounting - - mensi pocet [item] == prevedu na ucet manko (deficiency) BEZ marginu - vetsi pocet [item] == prevedu z uctu primnozky (excess) - stejny pocet [item] == prazdny prevod mezi item a item - Create a custom transaction that will change balance - of a variety of items at once, and either deduce - buy price (+amt) or add sell price (-amt) to the - cash balance for all of these items. This is useful - e.g. after events where stock is sold offline or when - doing an inventory recount. - If cash balance discrepancy is discovered as well - during the inventory recounting, first do changestock, - then compare actual and nominal cash balance again, - then issue changecash command if necessary. + inventory NEW_AMOUNT1 ITEM1 NEW_AMOUNT2 ITEM2 + Inventory recounting (fixing the number of items) ! changecash +-AMT Create a custom transaction that updates nominal cash balance based on the actual cash balance counted @@ -159,5 +145,15 @@ elif sys.argv[1] == "adduser": acct.add_barcode(sys.argv[2]) # will commit print("{}: id {}".format(acct.name, acct.id)); +elif sys.argv[1] == "inventory": + if (len(sys.argv) % 2 != 0 or len(sys.argv) < 4): + print ("Invalid number of parameters, count your parameters.") + else: + iamt = int(sys.argv[2]) + iacct = load_item(sys.argv[3]) #TODO:use barcodes later + print("Current state {} (id {}): {} pcs".format(iacct.name, iacct.id, iacct.balance())) + shop.fix_inventory(item = iacct, amount = iamt) + print("New state {} (id {}): {} pcs".format(iacct.name, iacct.id, iacct.balance())) + else: help() diff --git a/brmbar3/brmbar/Shop.py b/brmbar3/brmbar/Shop.py index cbeb455..f872328 100644 --- a/brmbar3/brmbar/Shop.py +++ b/brmbar3/brmbar/Shop.py @@ -7,18 +7,22 @@ class Shop: Business logic so that only interaction is left in the hands of the frontend scripts. """ - def __init__(self, db, currency, profits, cash): + def __init__(self, db, currency, profits, cash, excess, deficit): self.db = db self.currency = currency # brmbar.Currency self.profits = profits # income brmbar.Account for brmbar profit margins on items self.cash = cash # our operational ("wallet") cash account + self.excess = excess # account from which is deducted cash during inventory item fixing (when system contains less items than is the reality) + self.deficit = deficit # account where is put cash during inventory item fixing (when system contains more items than is the reality) @classmethod def new_with_defaults(cls, db): return cls(db, currency = Currency.default(db), profits = Account.load(db, name = "BrmBar Profits"), - cash = Account.load(db, name = "BrmBar Cash")) + cash = Account.load(db, name = "BrmBar Cash"), + excess = Account.load(db, name = "BrmBar Excess"), + deficit = Account.load(db, name = "BrmBar Deficit")) def sell(self, item, user, amount = 1): # Sale: Currency conversion from item currency to shop currency @@ -139,3 +143,21 @@ class Shop: for inventory in cur: accts += [ Account.load(self.db, id = inventory[0]) ] return accts + + def fix_inventory(self, item, amount): + amount_in_reality = amount + amount_in_system = item.balance() + (buy, sell) = item.currency.rates(self.currency) + + diff = abs(amount_in_reality - amount_in_system) + buy_total = buy * diff + if amount_in_reality > amount_in_system: + transaction = self._transaction(description = "BrmBar inventory fix of {}pcs {} in system to {}pcs in reality".format(amount_in_system, item.name,amount_in_reality)) + item.debit(transaction, diff, "Inventory fix excess") + self.excess.credit(transaction, buy_total, "Inventory fix excess " + item.name) + self.db.commit() + elif amount_in_reality < amount_in_system: + transaction = self._transaction(description = "BrmBar inventory fix of {}pcs {} in system to {}pcs in reality".format(amount_in_system, item.name,amount_in_reality)) + item.credit(transaction, diff, "Inventory fix deficit") + self.deficit.credit(transaction, buy_total, "Inventory fix deficit " + item.name) + self.db.commit()