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
data/bin/ig3tool
CHANGED
@@ -12,13 +12,7 @@ require "lib/util"
|
|
12
12
|
|
13
13
|
module Ig3tool
|
14
14
|
|
15
|
-
$global = {
|
16
|
-
'client' => '',
|
17
|
-
'amazon_loaded' => false
|
18
|
-
}
|
19
|
-
|
20
15
|
CONFIG = {
|
21
|
-
|
22
16
|
'amazon-associates-id' => 'webservices-20',
|
23
17
|
# You need an Amazon dev token (Lookup ISBN feature)
|
24
18
|
'amazon-dev-token' => 'D2CCFZZMOO6ZB9'
|
@@ -33,29 +27,19 @@ module Ig3tool
|
|
33
27
|
|
34
28
|
host = ENV['IG3TOOL_HOST'] || "igwe.vub.ac.be"
|
35
29
|
port = ENV['IG3TOOL_PORT'] || 2007
|
36
|
-
$
|
30
|
+
$client = Ig3tool::Client.new(host, port)
|
37
31
|
Gtk::init
|
38
32
|
|
39
|
-
def error_dialog (parent, exception)
|
40
|
-
dialog = Gtk::MessageDialog.new \
|
41
|
-
parent,
|
42
|
-
Gtk::Dialog::MODAL | Gtk::Dialog::DESTROY_WITH_PARENT,
|
43
|
-
Gtk::MessageDialog::WARNING,
|
44
|
-
Gtk::MessageDialog::BUTTONS_CLOSE,
|
45
|
-
exception.to_s
|
46
|
-
dialog.run
|
47
|
-
dialog.destroy
|
48
|
-
end
|
49
33
|
begin
|
50
|
-
if $
|
34
|
+
if $client.validate
|
51
35
|
ToolWindow.new(@klasses)
|
52
36
|
else
|
53
|
-
LoginWindow.new($
|
37
|
+
LoginWindow.new($client) do
|
54
38
|
ToolWindow.new(@klasses)
|
55
39
|
end
|
56
40
|
end
|
57
41
|
rescue Exception => e
|
58
|
-
LoginWindow.new($
|
42
|
+
LoginWindow.new($client) do
|
59
43
|
ToolWindow.new(@klasses)
|
60
44
|
end
|
61
45
|
end
|
@@ -71,6 +55,18 @@ module Ig3tool
|
|
71
55
|
retry
|
72
56
|
end
|
73
57
|
end
|
58
|
+
|
59
|
+
|
60
|
+
def error_dialog (parent, exception)
|
61
|
+
dialog = Gtk::MessageDialog.new \
|
62
|
+
parent,
|
63
|
+
Gtk::Dialog::MODAL | Gtk::Dialog::DESTROY_WITH_PARENT,
|
64
|
+
Gtk::MessageDialog::WARNING,
|
65
|
+
Gtk::MessageDialog::BUTTONS_CLOSE,
|
66
|
+
exception.to_s
|
67
|
+
dialog.run
|
68
|
+
dialog.destroy
|
69
|
+
end
|
74
70
|
|
75
71
|
|
76
72
|
@klasses = []
|
@@ -105,7 +101,7 @@ require "ui/automaatwindow"
|
|
105
101
|
require "ui/peoplewindow"
|
106
102
|
require "ui/saleswindow"
|
107
103
|
require "ui/printingwindow.rb"
|
108
|
-
require "ui/
|
104
|
+
require "ui/newinterne.rb"
|
109
105
|
require "ui/productswindow.rb"
|
110
106
|
require "ui/loginwindow.rb"
|
111
107
|
|
data/lib/actions/bib.rb
ADDED
@@ -0,0 +1,295 @@
|
|
1
|
+
module Ig3tool
|
2
|
+
class Actions
|
3
|
+
|
4
|
+
# Geeft alle secties terug die in de bib te vinden zijn.
|
5
|
+
def self.bib_sections(params)
|
6
|
+
BibSection.find(:all, :order => "name")
|
7
|
+
end
|
8
|
+
|
9
|
+
# Geeft een lijst van boeken terug.
|
10
|
+
# Geen params -> alle boeken
|
11
|
+
# ALL UPPERCASE -> alle boeken in die sectie
|
12
|
+
# else -> zoek in titels en auteurs
|
13
|
+
def self.bib_books(params)
|
14
|
+
p = params[:from_uri].first
|
15
|
+
if p.nil? || p.empty? then
|
16
|
+
BibBook.find(:all, :order => "title")
|
17
|
+
elsif p =~ /^(\d|X){10,}/ # Indien hij begint met X of een digit -> ISBN
|
18
|
+
BibBook.find(_isbn(p))
|
19
|
+
elsif p == p.upcase # Indien in uppercase -> Section
|
20
|
+
BibSection.find(p).books
|
21
|
+
else
|
22
|
+
p = '%' + p + '%'
|
23
|
+
BibBook.find(:all, :order => "title", :conditions => [ "title like ? or author like ?", p, p ])
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Geeft alle info over een boek terug
|
28
|
+
# Verwacht een ISBN
|
29
|
+
def self.bib_info(params)
|
30
|
+
raise Needed, "barcode" if params[:given_uri] != 1
|
31
|
+
isbn = _isbn(params[:from_uri].first) or raise InvalidISBN, "Invalid isbn number"
|
32
|
+
BibBook.find_by_isbn isbn # Return een boek
|
33
|
+
end
|
34
|
+
|
35
|
+
# Geeft alle uitgeleende boeken terug
|
36
|
+
# Verwacht geen parameters
|
37
|
+
def self.bib_loans(params)
|
38
|
+
if params[:given_uri] == 1
|
39
|
+
memberid = params[:from_uri].first
|
40
|
+
BibLoan.find_by_member_id(memberid)
|
41
|
+
else
|
42
|
+
BibLoan.find(:all, :order => "return_date ASC")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Kijkt of een bepaald boek url[0] beschikbaar is
|
47
|
+
def self.bib_availableinfo(params)
|
48
|
+
raise Needed, "barcode" if params[:given_uri] != 1
|
49
|
+
isbn = _isbn(params[:from_uri].first)
|
50
|
+
_available(isbn,true)
|
51
|
+
end
|
52
|
+
|
53
|
+
# Kijkt of een bepaald boek url[0] beschikbaar is
|
54
|
+
def self.bib_available(params)
|
55
|
+
raise Needed, "barcode" if params[:given_uri] != 1
|
56
|
+
isbn = _isbn(params[:from_uri].first) or raise InvalidISBN, "Invalid isbn number"
|
57
|
+
_available(isbn)
|
58
|
+
end
|
59
|
+
|
60
|
+
# Vernietigt de lening van het gegeven 'isbn' en 'member'
|
61
|
+
def self.bib_return!(params)
|
62
|
+
isbn = _isbn(params["isbn"]) or raise InvalidISBN, "Invalid isbn number"
|
63
|
+
member = params["member"] or raise Needed, "membership"
|
64
|
+
name = Membership.find(member).username
|
65
|
+
book = BibBook.find(isbn)
|
66
|
+
l = BibLoan.find(:all, :conditions =>
|
67
|
+
[ "member_id = ? and isbn = ?", member, isbn ])
|
68
|
+
if l.empty?
|
69
|
+
raise NotFound, "Book #{isbn} not loaned by #{name}" if loan.nil?
|
70
|
+
else
|
71
|
+
Logger::log :bib, :return, "%s returned %s (%s)" %
|
72
|
+
[ name, isbn, book.title ]
|
73
|
+
|
74
|
+
l.first.destroy
|
75
|
+
"OK"
|
76
|
+
end
|
77
|
+
rescue ActiveRecord::RecordNotFound
|
78
|
+
raise NotAMember, params['member']
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.bib_lookup(params)
|
82
|
+
raise Needed, "search value" if params[:given_uri] == 0
|
83
|
+
raise Needed, "even number of values" if params[:given_uri] % 2 == 1
|
84
|
+
|
85
|
+
valid_keys = %w(title author publisher year section copies isbn)
|
86
|
+
h = params[:from_uri].to_h
|
87
|
+
h["isbn"] = _isbn(h["isbn"]) unless h["isbn"].nil?
|
88
|
+
BibBook.hash_lookup(h, valid_keys)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Maakt een lening aan voor het gegeven 'isbn' voor 'member' met 'warranty'.
|
92
|
+
# Standaard datum van teruggave is nu+3 weken,
|
93
|
+
# standaard garantie is "debugger ? 0 : 5"
|
94
|
+
def self.bib_loan!(params)
|
95
|
+
isbn = _isbn(params["isbn"]) or raise InvalidISBN, "Invalid isbn number"
|
96
|
+
book = BibBook.find(isbn)
|
97
|
+
|
98
|
+
raise BookNotAvaible, "All copies loaned out!" unless book.available?
|
99
|
+
|
100
|
+
member = Membership.find params["member"]
|
101
|
+
raise NotAMember, params["member"] if member.nil?
|
102
|
+
|
103
|
+
warranty = params["warranty"] || (member.debugger? ? 0 : 5)
|
104
|
+
loan_date = Time.now
|
105
|
+
return_date = Time.now + 3.weeks
|
106
|
+
|
107
|
+
BibLoan.create(:isbn => book.isbn,
|
108
|
+
:member_id => member.barcode,
|
109
|
+
:warranty => warranty,
|
110
|
+
:loan_date => loan_date,
|
111
|
+
:return_date => return_date)
|
112
|
+
|
113
|
+
Logger::log :bib, :loan, "%s loaned %s (%s)." %
|
114
|
+
[ member.person.username, isbn, book.title ]
|
115
|
+
|
116
|
+
"OK"
|
117
|
+
end
|
118
|
+
|
119
|
+
# Verleng een lening voor het gegeven 'isbn' voor 'member'.
|
120
|
+
def self.bib_extend!(params)
|
121
|
+
isbn = _isbn(params["isbn"]) or raise InvalidISBN, "Invalid isbn number"
|
122
|
+
|
123
|
+
member = Membership.find params["member"]
|
124
|
+
raise NotAMember, params["member"] if member.nil?
|
125
|
+
|
126
|
+
book = BibBook.find(isbn)
|
127
|
+
loan = BibLoan.find_by_isbn_and_member_id(book.isbn, member.barcode)
|
128
|
+
return_date = Time.parse(loan.return_date) + 3.weeks
|
129
|
+
#return_date = Time.now + 3.weeks
|
130
|
+
#
|
131
|
+
loan.return_date = return_date
|
132
|
+
loan.save!
|
133
|
+
|
134
|
+
Logger::log :bib, :loan, "%s extended %s (%s)." %
|
135
|
+
[ member.person.username, isbn, book.title ]
|
136
|
+
|
137
|
+
loan # Return Loan
|
138
|
+
end
|
139
|
+
|
140
|
+
# Een boek aanmaken. Verwacht "isbn", "title", "author", "publisher", "year".
|
141
|
+
# Mogelijkheid om "copies" ook bij te zetten, default 1.
|
142
|
+
# Returnt het ISBN van het nieuwe boek.
|
143
|
+
def self.bib_add!(params)
|
144
|
+
notfound = []
|
145
|
+
[:isbn, :title, :author, :publisher, :year].each do |k|
|
146
|
+
notfound << k if params[k.to_s].nil?
|
147
|
+
end
|
148
|
+
|
149
|
+
raise Needed, notfound unless notfound.empty?
|
150
|
+
isbn = _isbn(params["isbn"]) or raise InvalidISBN, "Invalid isbn number"
|
151
|
+
|
152
|
+
b = BibBook.find_by_isbn(isbn)
|
153
|
+
|
154
|
+
unless b.nil?
|
155
|
+
b.title = params["title"]
|
156
|
+
b.author = params["author"]
|
157
|
+
b.publisher = params["publisher"]
|
158
|
+
b.year = params["year"]
|
159
|
+
b.section = params["section"]
|
160
|
+
b.copies = params["copies"] || 1
|
161
|
+
b.save # DB Save
|
162
|
+
|
163
|
+
Logger::log :bib, :update, "Book %s (%s) updated." %
|
164
|
+
[ params["isbn"], params["title"] ]
|
165
|
+
|
166
|
+
else
|
167
|
+
b = BibBook.new(:isbn => isbn,
|
168
|
+
:title => params["title"],
|
169
|
+
:author => params["author"],
|
170
|
+
:publisher => params["publisher"],
|
171
|
+
:year => params["year"],
|
172
|
+
:section => params["section"],
|
173
|
+
:copies => params["copies"] || 1)
|
174
|
+
|
175
|
+
b.save!
|
176
|
+
|
177
|
+
Logger::log :bib, :add, "Book %s (%s) created." %
|
178
|
+
[ isbn, params["title"] ]
|
179
|
+
end
|
180
|
+
|
181
|
+
b.isbn
|
182
|
+
|
183
|
+
rescue ActiveRecord::RecordInvalid
|
184
|
+
raise BibSectionNotFound, "the ig3tool imps want you to select a section..."
|
185
|
+
end
|
186
|
+
|
187
|
+
# Een boek verwijderen, verwacht het ISBN nummer in :isbn.
|
188
|
+
def self.bib_remove!(params)
|
189
|
+
isbn = _isbn(params["isbn"]) or raise InvalidISBN, "Invalid isbn number"
|
190
|
+
book = BibBook.find(isbn)
|
191
|
+
raise BookNotAvaible, "Book is loaned" unless book.loans.empty?
|
192
|
+
|
193
|
+
book.destroy
|
194
|
+
|
195
|
+
Logger::log :bib, :remove, "Book %d removed." % params["isbn"]
|
196
|
+
|
197
|
+
"OK"
|
198
|
+
rescue ActiveRecord::RecordNotFound
|
199
|
+
raise NotFound, "book"
|
200
|
+
end
|
201
|
+
|
202
|
+
private
|
203
|
+
# Kijk of een bepaald boek nog beschikbaar is
|
204
|
+
def self._available(isbn,extra_info = false)
|
205
|
+
begin
|
206
|
+
begin
|
207
|
+
b = BibBook.find(isbn)
|
208
|
+
rescue ActiveRecord::RecordNotFound
|
209
|
+
b = BibBook.find(_isbn(isbn))
|
210
|
+
end
|
211
|
+
|
212
|
+
|
213
|
+
if extra_info
|
214
|
+
{ "copies" => b.copies, "loans" => b.loans.length }
|
215
|
+
else
|
216
|
+
b.available?
|
217
|
+
end
|
218
|
+
rescue ActiveRecord::RecordNotFound
|
219
|
+
raise NotFound, "the ig3tool imps found no such book..."
|
220
|
+
end
|
221
|
+
|
222
|
+
end
|
223
|
+
|
224
|
+
# Controleert op de geldigheid van een isbn nummer
|
225
|
+
# isbn nummers die beginnen met IG0 zijn gevrijwaard van de controle
|
226
|
+
# en dienen voor zelfgemaakte barcode
|
227
|
+
def self._isbn (code, strong_check = false)
|
228
|
+
code = code.to_s.gsub(/\W/, '')
|
229
|
+
raise Needed, "ISBN" if code.nil? or code.empty?
|
230
|
+
|
231
|
+
if !strong_check and code =~ /^IG0/ # Indien zelfgemaakte barcode
|
232
|
+
return code
|
233
|
+
|
234
|
+
# indien oude isbn (10 cijfers)
|
235
|
+
elsif code.length == 10
|
236
|
+
code = code.gsub(/[^0-9Xx]+/, '').tr('x', 'X')
|
237
|
+
|
238
|
+
sum = 0
|
239
|
+
9.times {|i| sum += code[i].chr.to_i * (10 - i) }
|
240
|
+
sum += if code =~ /X$/ then 10 else code[9].chr.to_i end
|
241
|
+
|
242
|
+
# geldige barcode, converten naar 13
|
243
|
+
if sum % 11 == 0
|
244
|
+
return BibBook._isbn13(code)
|
245
|
+
end
|
246
|
+
|
247
|
+
# indien nieuwe isbn (13 cijfers - jan 2007)
|
248
|
+
elsif code.length == 13
|
249
|
+
sum = 0
|
250
|
+
multiply = 1
|
251
|
+
0.upto(11){|i|
|
252
|
+
sum += code[i].chr.to_i * multiply
|
253
|
+
if multiply == 1 then multiply = 3 else multiply = 1 end
|
254
|
+
}
|
255
|
+
|
256
|
+
return code if code[12].chr.to_i == (10 - (sum % 10))
|
257
|
+
end
|
258
|
+
|
259
|
+
# geen geldig isbn
|
260
|
+
return nil
|
261
|
+
end
|
262
|
+
|
263
|
+
# XXX move naar util.rb?
|
264
|
+
# Convert ISBN10 naar ISBN13
|
265
|
+
def self._isbn13(code)
|
266
|
+
raise InvalidISBN if code.length != 10
|
267
|
+
code.chop!
|
268
|
+
code = "978" + code
|
269
|
+
|
270
|
+
sum = 0
|
271
|
+
code.split(//).each_with_index do |c, i|
|
272
|
+
sum += c.to_i * ( i % 2 == 0 ? 1 : 3 )
|
273
|
+
end
|
274
|
+
|
275
|
+
rem = sum % 10
|
276
|
+
check = (rem == 0) ? 0 : 10 - rem
|
277
|
+
|
278
|
+
code = code + check.to_s
|
279
|
+
end
|
280
|
+
|
281
|
+
# Convert ISBN13 naar ISBN10
|
282
|
+
def self._isbn10(code)
|
283
|
+
raise InvalidISBN if code.length != 13
|
284
|
+
code = code[3..11]
|
285
|
+
|
286
|
+
sum = 0
|
287
|
+
9.times {|i| sum += code[i].chr.to_i * (10 - i) }
|
288
|
+
|
289
|
+
check = 11 - sum % 11
|
290
|
+
check = 0 if sum == 0
|
291
|
+
check = 'X' if check == 10
|
292
|
+
code = code + check.to_s
|
293
|
+
end
|
294
|
+
end
|
295
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'bitching'
|
2
|
+
|
3
|
+
module Ig3tool
|
4
|
+
class Actions
|
5
|
+
|
6
|
+
def self.wannabe!(params)
|
7
|
+
username = params["username"] or raise Needed, "username"
|
8
|
+
password = params["password"] or raise Needed, "password"
|
9
|
+
Bitch.wannabe(username, password)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.register!(params)
|
13
|
+
username = params["username"] or raise Needed, "username"
|
14
|
+
password = params["password"] or raise Needed, "password"
|
15
|
+
Bitch.wannabe(username, password)
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'people'
|
2
|
+
require 'interne'
|
3
|
+
|
4
|
+
module Ig3tool
|
5
|
+
class Actions
|
6
|
+
|
7
|
+
def self.internes(params)
|
8
|
+
internes = {}
|
9
|
+
Interne.find(:all) \
|
10
|
+
.sort { |a,b| a.person.username <=> b.person.username } \
|
11
|
+
.each { |i| internes[i.person.username] = i.saldo }
|
12
|
+
internes
|
13
|
+
end
|
14
|
+
|
15
|
+
# Verwacht een 'username' in de URL
|
16
|
+
# Geeft saldo terug
|
17
|
+
def self.interne(params)
|
18
|
+
raise NeedDebugger unless params[:given_uri] == 1
|
19
|
+
name = params[:from_uri].first
|
20
|
+
_interne(name).saldo
|
21
|
+
end
|
22
|
+
|
23
|
+
# Toon de InterneTransactions
|
24
|
+
# Geen debugger-username -> Alles
|
25
|
+
# Debugger-username -> Donor + Recipient
|
26
|
+
def self.interne_log(params)
|
27
|
+
# XXX TODO
|
28
|
+
# Change from LogEntry to InterneTransaction
|
29
|
+
# MAAR:
|
30
|
+
# eerst nog zorgen dat alle transacties ivm interne (dus ook scribblen enzo) ook weergegeven worden
|
31
|
+
# voorlopig dus via LogEntry zodat je meer info hebt
|
32
|
+
name, max_lines = params[:from_uri]
|
33
|
+
max_lines = 500 if max_lines.nil?
|
34
|
+
|
35
|
+
if name
|
36
|
+
name = "%#{name}%"
|
37
|
+
LogEntry.find(:all, :conditions => ["system = 'interne' and
|
38
|
+
subsystem = 'transfer' and
|
39
|
+
message like ?", name],
|
40
|
+
:order => "timestamp DESC",
|
41
|
+
:limit => max_lines)
|
42
|
+
else
|
43
|
+
LogEntry.find(:all, :order => "timestamp DESC",
|
44
|
+
:limit => max_lines)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Verwacht in 'from','to' usernames
|
49
|
+
# Verwacht in 'saldo' een getal
|
50
|
+
# Geeft saldo terug.
|
51
|
+
def self.interne_transfer!(params)
|
52
|
+
from = params['from'] or raise Needed, "source interne"
|
53
|
+
to = params['to'] or raise Needed, "target interne"
|
54
|
+
amount = params['amount'].to_i or raise Needed, "amount"
|
55
|
+
|
56
|
+
if amount < 0 then
|
57
|
+
amount *= -1
|
58
|
+
from, to = to, from
|
59
|
+
end
|
60
|
+
|
61
|
+
raise IG3Error, "Having fun playing with yourself?" if from == to
|
62
|
+
raise IG3Error, "No sense in transferring 0 credits.." if amount == 0
|
63
|
+
|
64
|
+
case
|
65
|
+
when from == "kas" # geld UIT de kassa
|
66
|
+
Logger::log :interne, :withdraw, '%s withdrew %.2f from kas' % [to, amount.to_f / 100]
|
67
|
+
_with_interne(to) { |s| s - amount }
|
68
|
+
|
69
|
+
when to == "kas" # geld IN de kassa
|
70
|
+
Logger::log :interne, :deposit, '%s deposited %.2f in kas' % [from, amount.to_f / 100]
|
71
|
+
_with_interne(from) { |s| s + amount }
|
72
|
+
|
73
|
+
else
|
74
|
+
Logger::log :interne, :transfer, '%s transferred %.2f to %s' % [from, amount.to_f / 100, to]
|
75
|
+
Interne.transaction do
|
76
|
+
_with_interne(to) { |s| s + amount }
|
77
|
+
_with_interne(from) { |s| s - amount }
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
|
84
|
+
def self._interne(name)
|
85
|
+
d = Person.find(name)
|
86
|
+
raise NotADebugger, name.to_s unless d.debugger?
|
87
|
+
d.interne
|
88
|
+
end
|
89
|
+
|
90
|
+
def self._with_interne(name)
|
91
|
+
i = _interne(name)
|
92
|
+
i.saldo = yield i.saldo
|
93
|
+
i.save
|
94
|
+
i.saldo
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
end
|