ig3tool 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/ig3tool +17 -21
- data/lib/actions/bib.rb +295 -0
- data/lib/actions/bitching.rb +19 -0
- data/lib/actions/cultuur.rb +3 -0
- data/lib/actions/interne.rb +98 -0
- data/lib/actions/kaching.rb +90 -0
- data/lib/actions/people.rb +178 -0
- data/lib/actions/printing.rb +125 -0
- data/lib/actions/product.rb +154 -0
- data/lib/bib.rb +94 -0
- data/lib/billing.rb +112 -0
- data/lib/bitching.rb +49 -0
- data/lib/config.rb +19 -0
- data/lib/glade/cola_light_small.png +0 -0
- data/lib/glade/cola_light_xsmall.png +0 -0
- data/lib/glade/cola_small.png +0 -0
- data/lib/glade/cola_xsmall.png +0 -0
- data/lib/glade/doos_small.png +0 -0
- data/lib/glade/doos_xsmall.png +0 -0
- data/lib/glade/icons/cola_light_small.png +0 -0
- data/lib/glade/icons/cola_light_xsmall.png +0 -0
- data/lib/glade/icons/cola_small.png +0 -0
- data/lib/glade/icons/cola_xsmall.png +0 -0
- data/lib/glade/icons/doos_small.png +0 -0
- data/lib/glade/icons/doos_xsmall.png +0 -0
- data/lib/glade/icons/piggy_small.png +0 -0
- data/lib/glade/icons/piggy_xsmall.png +0 -0
- data/lib/glade/money_small.png +0 -0
- data/lib/glade/money_xsmall.png +0 -0
- data/lib/glade/newinterne.glade +504 -0
- data/lib/glade/piggy_small.png +0 -0
- data/lib/glade/piggy_xsmall.png +0 -0
- data/lib/glade/sales.glade +89 -87
- data/lib/horrible_hack.rb +15 -0
- data/lib/interne.rb +111 -0
- data/lib/ldap.rb +104 -0
- data/lib/log.rb +25 -0
- data/lib/membership.rb +32 -0
- data/lib/mymd5.rb +95 -0
- data/lib/people.rb +143 -0
- data/lib/printing.rb +238 -0
- data/lib/request.rb +14 -0
- data/lib/sales.rb +158 -0
- data/lib/ui/automaatwindow.rb +2 -2
- data/lib/ui/bibliotheekwindow.rb +16 -17
- data/lib/ui/bibwindow.rb +15 -15
- data/lib/ui/gladehelper.rb +20 -6
- data/lib/ui/internewindow.rb +12 -9
- data/lib/ui/loginwindow.rb +2 -4
- data/lib/ui/memberswindow.rb +9 -9
- data/lib/ui/newinterne.rb +258 -0
- data/lib/ui/peoplewindow.rb +14 -16
- data/lib/ui/printenwindow.rb +11 -11
- data/lib/ui/printingwindow.rb +19 -20
- data/lib/ui/productswindow.rb +27 -15
- data/lib/ui/saleswindow.rb +21 -8
- data/lib/ui/toolwindow.rb +5 -3
- data/lib/utils.rb +106 -0
- data/lib/web.rb +98 -0
- metadata +48 -3
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'sales'
|
2
|
+
require 'people'
|
3
|
+
require 'interne'
|
4
|
+
|
5
|
+
module Ig3tool
|
6
|
+
class Actions
|
7
|
+
|
8
|
+
# This one's for you, joris :P
|
9
|
+
def self.kaching_cola(params)
|
10
|
+
scribble(params.update({"items" => {"5449000000996" => 1}}))
|
11
|
+
end
|
12
|
+
|
13
|
+
# Verwacht een array van [barcode,aantal] in 'items'
|
14
|
+
# Verwacht een username in 'debugger'
|
15
|
+
# Geeft het nieuwe saldo terug
|
16
|
+
def self.scribble!(params)
|
17
|
+
name = params['debugger'] or raise Needed, "debugger"
|
18
|
+
|
19
|
+
interne = _interne(name) or raise NotADebugger, name
|
20
|
+
Product.transaction do
|
21
|
+
_kaching_log :scribble, name, params['items']
|
22
|
+
total = _kaching(params['items'], "debugger")
|
23
|
+
interne.saldo -= total
|
24
|
+
interne.save!
|
25
|
+
total
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Verwacht een hash van barcode => aantal in 'items'
|
30
|
+
# Optioneel een status in 'status'
|
31
|
+
# Geeft kost terug.
|
32
|
+
def self.kaching!(params)
|
33
|
+
Product.transaction do
|
34
|
+
total = _kaching(params['items'], params['status'] || "plebs")
|
35
|
+
_kaching_log :kaching, params['debugger'], params['items']
|
36
|
+
total
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Automaat bijvullen. 'items' zoals kaching, en 'debugger'
|
41
|
+
def self.product_restock!(params)
|
42
|
+
debugger = params['debugger']
|
43
|
+
items = params['items']
|
44
|
+
|
45
|
+
Product.transaction do
|
46
|
+
total = _kaching(items, "plebs")
|
47
|
+
_kaching_log(:restock, debugger, items)
|
48
|
+
total
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
# Verwacht een hash van barcode => aantal en een status
|
55
|
+
# Past de stock aan, en geeft de kost terug.
|
56
|
+
def self._kaching(items, status)
|
57
|
+
cost = 0
|
58
|
+
raise Needed, "items" if items.nil? or items.empty?
|
59
|
+
Product.transaction do
|
60
|
+
items.each do |barcode, amount|
|
61
|
+
p = Product.find(barcode)
|
62
|
+
p.decrement_stock(amount)
|
63
|
+
cost += p.price(status, amount)
|
64
|
+
end
|
65
|
+
|
66
|
+
cost
|
67
|
+
end
|
68
|
+
rescue ActiveRecord::RecordNotFound => e
|
69
|
+
raise ProductNotFound, e.message[/ID=(.*)/]
|
70
|
+
end
|
71
|
+
|
72
|
+
def self._kaching_log(action, naam, items)
|
73
|
+
Product.transaction do
|
74
|
+
items.each do |barcode, amount|
|
75
|
+
p = Product.find(barcode)
|
76
|
+
raise IG3Error, "You did not enter a correct amount!" unless !amount.nil? and amount.integer? and amount > 0
|
77
|
+
action_lookup = { :kaching => "sold",
|
78
|
+
:scribble => "scribbled",
|
79
|
+
:restock => "restocked automaat with" }
|
80
|
+
action_str = action_lookup[action] or raise NotFound, "action"
|
81
|
+
Logger::log :sales, action, "%s %s %d %s" %
|
82
|
+
[ naam, action_str, amount, p.name ]
|
83
|
+
end
|
84
|
+
end
|
85
|
+
rescue ActiveRecord::RecordNotFound => e
|
86
|
+
raise ProductNotFound, e.message[/ID=(.*)/]
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,178 @@
|
|
1
|
+
module Ig3tool
|
2
|
+
class Actions
|
3
|
+
|
4
|
+
STATUSSEN = { 0 => "non-member", 1 => "member", 2 => "honorary member", 3 => "debugger", 4 => "ex-debugger"}
|
5
|
+
|
6
|
+
# Methods om alle mensen op te vragen
|
7
|
+
singleton = class << self; self; end
|
8
|
+
%w(everybody nonmembers honorarymembers members debuggers).each do |k|
|
9
|
+
body = Proc.new do |params|
|
10
|
+
Person.send(k.to_sym)
|
11
|
+
end
|
12
|
+
|
13
|
+
singleton.class_eval { define_method "person_#{k}", body}
|
14
|
+
end
|
15
|
+
|
16
|
+
# Zoekt persons op adhv attributes
|
17
|
+
# Verwacht minstens 1 key => value pair, kan meerdere mensen teruggeven.
|
18
|
+
# Mogelijke keys: username, email, first_name, last_name, rolnr, address, phone, gsm
|
19
|
+
def self.person_lookup(params)
|
20
|
+
raise Needed, "At least one search value" if params[:given_uri] < 1
|
21
|
+
raise Needed, "Even number of search values" if params[:given_uri] % 2 == 1
|
22
|
+
|
23
|
+
keys = params[:from_uri].to_h
|
24
|
+
status = keys.delete 'status'
|
25
|
+
valid_keys = %w(username email first_name last_name rolnr address phone gsm)
|
26
|
+
res = Person.hash_lookup(keys, valid_keys)
|
27
|
+
|
28
|
+
if status
|
29
|
+
return res.select {|x| x.send "#{status}?".to_sym }
|
30
|
+
else
|
31
|
+
return res
|
32
|
+
end
|
33
|
+
rescue RuntimeError => e
|
34
|
+
raise IG3Error, e.message
|
35
|
+
end
|
36
|
+
|
37
|
+
# Geeft de memberships van een persoon terug, gesorteerd op datum
|
38
|
+
# Verwacht een username.
|
39
|
+
def self.person_memberships(params)
|
40
|
+
raise Needed, "username" if params[:given_uri] != 1
|
41
|
+
Person.find(params[:from_uri].first).memberships.sort { |a,b| b.year <=> a.year }
|
42
|
+
end
|
43
|
+
|
44
|
+
# Returnt een persoon adhv een membership barcode
|
45
|
+
def self.person_member(params)
|
46
|
+
raise Needed, "memberid" if params[:given_uri] != 1
|
47
|
+
memberid = params[:from_uri].first
|
48
|
+
member = Membership.find_by_barcode(memberid)
|
49
|
+
raise NotAMember if member.nil?
|
50
|
+
Person.find(member.username) # Zoek het member, en return de persoon
|
51
|
+
end
|
52
|
+
|
53
|
+
# Verwijdert een member (indien mogelijk -> Geen openstaande leningen/niet-0-internes/...)
|
54
|
+
def self.person_remove!(params)
|
55
|
+
username = params["username"] or raise Needed, "username"
|
56
|
+
|
57
|
+
p = Person.find username
|
58
|
+
|
59
|
+
# Controleer Interne
|
60
|
+
i = p.interne
|
61
|
+
raise SaldoNotZero, "Debugger: saldo not zero!" if !i.nil? and i.saldo != 0
|
62
|
+
|
63
|
+
# Controleer leningen
|
64
|
+
p.memberships.each do |m|
|
65
|
+
unless m.nil?
|
66
|
+
loans = BibLoan.find_by_member_id m.id
|
67
|
+
raise StillHaveLoans, "Member: outstanding loans" unless loans.nil? or loans.empty?
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
begin
|
72
|
+
p.destroy
|
73
|
+
rescue ActiveRecord::RecordNotFound
|
74
|
+
raise NotFound, "Person"
|
75
|
+
else
|
76
|
+
:ok
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# Returnt alle mogelijk statussen
|
81
|
+
def self.person_statussen(params)
|
82
|
+
STATUSSEN # Return de Hash
|
83
|
+
end
|
84
|
+
|
85
|
+
# Voegt een persoon toe
|
86
|
+
def self.person_add!(params)
|
87
|
+
p = Person.new
|
88
|
+
p.username = params['username'] or raise Needed, "Username"
|
89
|
+
p.email = params['email'] or raise Needed, "Email"
|
90
|
+
p.first_name = params['first_name'] or raise Needed, "First_name"
|
91
|
+
p.last_name = params['last_name'] or raise Needed, "Last_name"
|
92
|
+
p.rolnr = params['rolnr']
|
93
|
+
p.address = params['address']
|
94
|
+
p.phone = params['phone']
|
95
|
+
p.gsm = params['gsm']
|
96
|
+
|
97
|
+
status = params['status'] || "non-member"
|
98
|
+
memberid = params['memberid']
|
99
|
+
if status != "non-member"
|
100
|
+
m = Membership.new
|
101
|
+
m.barcode = memberid
|
102
|
+
m.username = p.username
|
103
|
+
m.status = status
|
104
|
+
m.year = Time.werkjaar
|
105
|
+
end
|
106
|
+
|
107
|
+
pu = PrintUser.new
|
108
|
+
pu.saldo = 0
|
109
|
+
|
110
|
+
Person.transaction do
|
111
|
+
# Set username as latest because it calls save!
|
112
|
+
p.save!
|
113
|
+
pu.username = p.username
|
114
|
+
pu.save!
|
115
|
+
m.save! if status != "non-member"
|
116
|
+
|
117
|
+
pu.add_credit(200) if status == "member"
|
118
|
+
"OK"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
# Update een persoon (adhv een id)
|
123
|
+
def self.person_update!(params)
|
124
|
+
raise Needed, "Username" unless params['username']
|
125
|
+
p = Person.find_by_username(params['username'])
|
126
|
+
raise NotFound if p.nil?
|
127
|
+
p.email = params['email'] or raise Needed, "Email"
|
128
|
+
p.first_name = params['first_name'] or raise Needed, "First_name"
|
129
|
+
p.last_name = params['last_name'] or raise Needed, "Last_name"
|
130
|
+
p.rolnr = params['rolnr']
|
131
|
+
p.address = params['address']
|
132
|
+
p.phone = params['phone']
|
133
|
+
p.gsm = params['gsm']
|
134
|
+
p.save!
|
135
|
+
end
|
136
|
+
|
137
|
+
def self.person_isdebugger(params)
|
138
|
+
raise Needed, "Username" unless params[:from_uri].size > 0
|
139
|
+
p = Person.find_by_username(params[:from_uri].first)
|
140
|
+
raise NotFound if p.nil?
|
141
|
+
p.debugger?
|
142
|
+
end
|
143
|
+
|
144
|
+
def self.person_status(params)
|
145
|
+
raise Needed, "Username" unless params[:from_uri].size > 0
|
146
|
+
p = Person.find_by_username(params[:from_uri].first)
|
147
|
+
raise NotFound if p.nil?
|
148
|
+
if p.debugger?
|
149
|
+
"debugger"
|
150
|
+
elsif p.member?
|
151
|
+
"member"
|
152
|
+
else
|
153
|
+
"non-member"
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def self.person_bugger!(params)
|
158
|
+
raise Needed, "Username" unless params['username']
|
159
|
+
p = Person.find_by_username(params['username'])
|
160
|
+
raise NotFound if p.nil?
|
161
|
+
raise NotAMember unless p.member?
|
162
|
+
raise IG3Error, "already a debugger" if p.debugger?
|
163
|
+
|
164
|
+
p.bugger!
|
165
|
+
"OK"
|
166
|
+
end
|
167
|
+
|
168
|
+
def self.person_unbugger!(params)
|
169
|
+
raise Needed, "Username" unless params['username']
|
170
|
+
p = Person.find_by_username(params['username'])
|
171
|
+
raise NotFound if p.nil?
|
172
|
+
raise NotADebugger unless p.debugger?
|
173
|
+
|
174
|
+
p.unbugger!
|
175
|
+
"OK"
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'people'
|
2
|
+
require 'interne'
|
3
|
+
require 'printing'
|
4
|
+
|
5
|
+
module Ig3tool
|
6
|
+
class Actions
|
7
|
+
|
8
|
+
def self.print_users(params)
|
9
|
+
PrintUser.find(:all, :order => "username")
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.print_debuggers(params)
|
13
|
+
users = PrintUser.find(:all, :order => "username")
|
14
|
+
users.select{|user| user.debugger?}
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.print_logs(params)
|
18
|
+
max_lines = (params[:given_uri] < 1 ? 50 : params[:given_uri].first)
|
19
|
+
PrintTransaction.find(:all, :limit => max_lines, :order => "time DESC")
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.print_user(params)
|
23
|
+
raise Needed, "username or alias" if params[:given_uri] < 1
|
24
|
+
username = params[:from_uri].first
|
25
|
+
PrintUser.lookup(username)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.print_remove!(params)
|
29
|
+
username = params["username"] or raise Needed, "username"
|
30
|
+
PrintUser.remove(username)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.print_addcredit!(params)
|
34
|
+
username = params["username"] or raise Needed, "username"
|
35
|
+
amount = params["amount"] or raise Needed, "amount"
|
36
|
+
pu = PrintUser.lookup(username) or raise NotFound, "username"
|
37
|
+
pu.add_credit(amount)
|
38
|
+
pu
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.print_errortest(params)
|
42
|
+
PrintUser.errortest
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.print_update!(params)
|
46
|
+
username = params["username"] or raise Needed, "username"
|
47
|
+
firstname = params["firstname"]
|
48
|
+
lastname = params["lastname"]
|
49
|
+
email = params["email"]
|
50
|
+
raise Needed, "at least one of: username, firstname, lastname" if lastname.nil? && firstname.nil? && email.nil?
|
51
|
+
amount = params["amount"] || 0
|
52
|
+
begin
|
53
|
+
p = Person.find(username)
|
54
|
+
rescue
|
55
|
+
p = Person.new
|
56
|
+
p.username = username
|
57
|
+
raise Needed, "username, firstname and lastname" if lastname.nil? && firstname.nil? && email.nil?
|
58
|
+
end
|
59
|
+
p.first_name = firstname unless firstname.nil?
|
60
|
+
p.last_name = lastname unless lastname.nil?
|
61
|
+
p.email = email unless email.nil?
|
62
|
+
p.save!
|
63
|
+
begin
|
64
|
+
pu = PrintUser.lookup(username)
|
65
|
+
rescue NotFound => err
|
66
|
+
pu = PrintUser.new
|
67
|
+
pu.username = username
|
68
|
+
pu.save!
|
69
|
+
end
|
70
|
+
pu.add_credit(amount) if amount.to_i.to_b
|
71
|
+
pu
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.print_refund!(params)
|
75
|
+
logid = params["logid"] or raise Needed, "logid"
|
76
|
+
begin
|
77
|
+
transaction = PrintTransaction.find(logid)
|
78
|
+
transaction.refund
|
79
|
+
rescue
|
80
|
+
raise TransactionNotFound, "this log id is not valid"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.print_print!(params)
|
85
|
+
username = params["username"] or raise Needed, "username"
|
86
|
+
job = params["job"] or raise Needed, "job"
|
87
|
+
pages = params["pages"] or raise Needed, "pages"
|
88
|
+
copies = params["copies"] or raise Needed, "copies"
|
89
|
+
host = params["host"] or raise Needed, "host"
|
90
|
+
amount = params["amount"] or raise Needed, "amount"
|
91
|
+
queue = params["queue"] or raise Needed, "queue"
|
92
|
+
message = params["message"] || ""
|
93
|
+
pu = PrintUser.lookup(username)
|
94
|
+
pu.print(job, pages, copies, host, amount, queue, message)
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.print_addalias!(params)
|
98
|
+
username = params["username"] or raise Needed, "username"
|
99
|
+
nwalias = params["alias"] or raise Needed, "alias"
|
100
|
+
pu = PrintUser.find(username) # dit is eigenlijk overkill, lekker!
|
101
|
+
pa = PrintAlias.new
|
102
|
+
pa.username = username
|
103
|
+
pa.alias = nwalias
|
104
|
+
pa.save!
|
105
|
+
end
|
106
|
+
|
107
|
+
def self.print_removealias!(params)
|
108
|
+
username = params["username"] or raise Needed, "username"
|
109
|
+
a = params["alias"] or raise Needed, "alias"
|
110
|
+
pa = PrintAlias.find(a)
|
111
|
+
if pa.print_user.username == username
|
112
|
+
pa.destroy
|
113
|
+
else
|
114
|
+
raise NotFound, "wrong username"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def self.print_removealiases!(params)
|
119
|
+
username = params["username"] or raise Needed, "username"
|
120
|
+
pu = PrintUser.lookup(username).remove_aliases
|
121
|
+
pu
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,154 @@
|
|
1
|
+
require 'sales'
|
2
|
+
module Ig3tool
|
3
|
+
class Actions
|
4
|
+
|
5
|
+
# Geeft alle categorieen terug.
|
6
|
+
def self.product_categories(params)
|
7
|
+
Category.find(:all)
|
8
|
+
end
|
9
|
+
|
10
|
+
# Geeft alle producten uit een categorie terug
|
11
|
+
def self.product_category(params)
|
12
|
+
raise Needed, "Category" if params[:given_uri] != 1
|
13
|
+
Category.find(params[:from_uri].first).products
|
14
|
+
end
|
15
|
+
|
16
|
+
# Verwacht een barcode in de URL
|
17
|
+
# Geeft het product terug
|
18
|
+
def self.product_lookup(params)
|
19
|
+
raise Needed, "Barcode" if params[:given_uri] != 1
|
20
|
+
|
21
|
+
p = params[:from_uri].first
|
22
|
+
_product(p)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Verwacht geen parameters
|
26
|
+
# Geeft alle producten in de stock terug
|
27
|
+
def self.product_all(params)
|
28
|
+
#Product.find :all, :conditions => { 'stock_gt' => 0 } # Stock Greater than
|
29
|
+
Product.find :all, :include => [:purchases]
|
30
|
+
end
|
31
|
+
|
32
|
+
# Verwacht een barcode in de URL
|
33
|
+
# Geeft de stock terug
|
34
|
+
def self.product_stock(params)
|
35
|
+
raise Needed, "Barcode" if params[:given_uri] != 1
|
36
|
+
|
37
|
+
prod = _product(params[:from_uri].first)
|
38
|
+
prod.stock
|
39
|
+
end
|
40
|
+
|
41
|
+
# Verwacht een barcode en de stock in de URL
|
42
|
+
# Geeft de diff stock terug
|
43
|
+
# Verwijdert de oudste items indien newstock < oldstock
|
44
|
+
# Voegt items toe met de nieuwste prijs indien newstock > oldstock
|
45
|
+
def self.product_diff!(params)
|
46
|
+
barcode = params["barcode"] or raise Needed, "Barcode"
|
47
|
+
newstock = params["stock"] or raise Needed, "Stock"
|
48
|
+
p = _product(barcode)
|
49
|
+
oldstock = p.stock
|
50
|
+
|
51
|
+
if oldstock < newstock
|
52
|
+
# TODO XXX Set Price!
|
53
|
+
else
|
54
|
+
# TODO remove from stock!
|
55
|
+
end
|
56
|
+
|
57
|
+
Logger::log :stock, :diff, "%s stock changed from %d to %d" %
|
58
|
+
[ p.name, oldstock, p.stock ]
|
59
|
+
end
|
60
|
+
|
61
|
+
# Voegt een product toe aan de DB
|
62
|
+
# Verwacht 'barcode', 'name', 'category', 'nmprice', 'mprice' en 'dprice'
|
63
|
+
def self.product_add!(params)
|
64
|
+
notfound = []
|
65
|
+
|
66
|
+
[:barcode, :name, :category, :nmprice, :mprice, :dprice].each do |k|
|
67
|
+
notfound << k unless params.include? k.to_s and !params[k.to_s].nil?
|
68
|
+
end
|
69
|
+
|
70
|
+
raise Needed, notfound unless notfound.empty?
|
71
|
+
|
72
|
+
p = \
|
73
|
+
Product.create(:barcode => params["barcode"],
|
74
|
+
:name => params["name"],
|
75
|
+
:category => Category.find_by_name(params["category"].capitalize),
|
76
|
+
:nmprice => params["nmprice"],
|
77
|
+
:mprice => params["mprice"],
|
78
|
+
:dprice => params["dprice"],
|
79
|
+
:stock => 0) # XXX of params["amount"] ?
|
80
|
+
|
81
|
+
Logger::log :product, :add, "Added %d (%s)" % [ params["barcode"], params["name"] ]
|
82
|
+
|
83
|
+
"OK"
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.product_remove!(params)
|
87
|
+
barcode = params["barcode"] or raise Needed, "Barcode"
|
88
|
+
p = _product(barcode)
|
89
|
+
|
90
|
+
raise "still in stock, won't delete!" if p.stock > 0
|
91
|
+
|
92
|
+
p.destroy
|
93
|
+
|
94
|
+
"OK"
|
95
|
+
end
|
96
|
+
|
97
|
+
# Laat een 'debugger' een aankoop ingeven, met factuurnummer 'reference'.
|
98
|
+
# Verwacht een hash barcode => [amount, cost] in 'items'.
|
99
|
+
def self.product_purchase!(params)
|
100
|
+
name = params["debugger"] or raise NeedDebugger
|
101
|
+
debugger = Person.find_by_username(name)
|
102
|
+
raise NotADebugger.new(name) unless !debugger.nil? && debugger.debugger?
|
103
|
+
|
104
|
+
notfound = []
|
105
|
+
params["items"].each do |barcode, item|
|
106
|
+
_product(barcode, false) or notfound << barcode
|
107
|
+
item[0] = item[0].to_i
|
108
|
+
item[1] = item[1].to_i
|
109
|
+
amount, cost = item
|
110
|
+
raise "You're funny." unless amount.integer?
|
111
|
+
end
|
112
|
+
|
113
|
+
raise ProductNotFound.new(notfound.join(', ')) unless notfound.empty?
|
114
|
+
|
115
|
+
Product.transaction do
|
116
|
+
params["items"].each do |barcode, data|
|
117
|
+
amount, cost = data
|
118
|
+
p = _product(barcode)
|
119
|
+
p.stock += amount
|
120
|
+
p.save
|
121
|
+
|
122
|
+
Purchase.create(:time => Time.now,
|
123
|
+
:debugger => debugger,
|
124
|
+
:product => p,
|
125
|
+
:count => amount,
|
126
|
+
:cost => cost)
|
127
|
+
|
128
|
+
Logger::log :purchase, :add, "%s purchased %d x '%s' for %0.2f" %
|
129
|
+
[ debugger.username, amount, p.name, cost ]
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
"OK"
|
134
|
+
end
|
135
|
+
|
136
|
+
def self.product_purchases(params)
|
137
|
+
p = params[:from_uri].first
|
138
|
+
if p.nil? or p == "all"
|
139
|
+
Purchase.find :all, :order => "product, time desc"
|
140
|
+
else
|
141
|
+
Purchase.find_all_by_barcode(p, :order => "product, time desc")
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
private
|
146
|
+
def self._product(barcode, complain=true)
|
147
|
+
Product.find(barcode, :include => [:purchases])
|
148
|
+
rescue
|
149
|
+
raise NotFound, "Product" if complain
|
150
|
+
nil
|
151
|
+
end
|
152
|
+
|
153
|
+
end
|
154
|
+
end
|