forked from brmlab/brmbar-github
Added logic for fixing inventory status
This commit is contained in:
parent
32f76b290c
commit
0706054e81
3 changed files with 39 additions and 19 deletions
|
@ -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;
|
||||
|
|
|
@ -8,7 +8,7 @@ import brmbar
|
|||
|
||||
|
||||
def help():
|
||||
print("""BrmBar v3 (c) Petr Baudis <pasky@ucw.cz> 2012
|
||||
print("""BrmBar v3 (c) Petr Baudis <pasky@ucw.cz> 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()
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue