ig3tool 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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/lib/ldap.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
beetje stuff om te authen naar ldap
|
4
|
+
bvb:
|
5
|
+
bitch?("joske", "dejoszijnpasswd")
|
6
|
+
=> true/false
|
7
|
+
|
8
|
+
TODO: filteren op debugger!
|
9
|
+
|
10
|
+
=end
|
11
|
+
|
12
|
+
require 'mymd5'
|
13
|
+
|
14
|
+
begin
|
15
|
+
|
16
|
+
require "ldap"
|
17
|
+
|
18
|
+
class IGLDAP < LDAP::Conn
|
19
|
+
DN = "cn=Proxyuser,dc=infogroep,dc=be"
|
20
|
+
PASS = "pRoxyAuth"
|
21
|
+
BASE_DN = "dc=infogroep,dc=be"
|
22
|
+
PEOPLE_DN = "ou=People,dc=infogroep,dc=be"
|
23
|
+
LDAP_HOST = "infogroep.be"
|
24
|
+
LDAP_PORT = 389
|
25
|
+
PROTOCOL_VERSION = 3
|
26
|
+
|
27
|
+
def initialize (host = LDAP_HOST, version = PROTOCOL_VERSION)
|
28
|
+
super( host, LDAP_PORT )
|
29
|
+
set_option( LDAP::LDAP_OPT_PROTOCOL_VERSION, version )
|
30
|
+
return self
|
31
|
+
end
|
32
|
+
|
33
|
+
def bind(dn = DN, pass = PASS)
|
34
|
+
super( dn, pass )
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.bitchke?(user, pass)
|
38
|
+
begin
|
39
|
+
conn = IGLDAP.new.bind
|
40
|
+
attrs = %w{uid userPassword}
|
41
|
+
filter = "uid=#{user}"
|
42
|
+
result = conn.search2(IGLDAP::PEOPLE_DN, LDAP::LDAP_SCOPE_SUBTREE,filter, attrs)
|
43
|
+
|
44
|
+
passr = result.first["userPassword"].first.gsub(/\{crypt\}/, "")
|
45
|
+
|
46
|
+
|
47
|
+
match = passr.match(/(\$.+\$.+\$)(.*)/)
|
48
|
+
#salt = match[1]
|
49
|
+
salt = match[1].gsub(/\$1\$/, "").delete("$")
|
50
|
+
passh = match[2]
|
51
|
+
#pass.crypt(salt) == passr
|
52
|
+
crypt(pass, :md5, salt) == passr
|
53
|
+
rescue Exception => e
|
54
|
+
false
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
rescue
|
61
|
+
|
62
|
+
require 'net/ldap'
|
63
|
+
include Net
|
64
|
+
|
65
|
+
class IGLDAP
|
66
|
+
DN = "cn=Proxyuser,dc=infogroep,dc=be"
|
67
|
+
PASS = "pRoxyAuth"
|
68
|
+
BASE_DN = "dc=infogroep,dc=be"
|
69
|
+
PEOPLE_DN = "ou=People,dc=infogroep,dc=be"
|
70
|
+
LDAP_HOST = "infogroep.be"
|
71
|
+
LDAP_PORT = 389
|
72
|
+
PROTOCOL_VERSION = 3
|
73
|
+
|
74
|
+
def initialize
|
75
|
+
@conn = Net::LDAP.new( {:host => LDAP_HOST, :port => LDAP_PORT, :auth => { :method => :simple, :username => DN, :password => PASS }} )
|
76
|
+
end
|
77
|
+
|
78
|
+
def bind
|
79
|
+
@conn.bind
|
80
|
+
@conn
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.bitchke?(user, pass)
|
84
|
+
begin
|
85
|
+
conn = IGLDAP.new.bind
|
86
|
+
attrs = %w{uid userPassword}
|
87
|
+
filter = "uid=#{user}"
|
88
|
+
result = conn.search(:base => PEOPLE_DN, :filter => filter)
|
89
|
+
|
90
|
+
passr = result.first["userPassword"].first.gsub(/\{crypt\}/, "")
|
91
|
+
|
92
|
+
match = passr.match(/(\$.+\$.+\$)(.*)/)
|
93
|
+
salt = match[1].gsub(/\$1\$/, "").delete("$")
|
94
|
+
#salt = match[1]
|
95
|
+
passh = match[2]
|
96
|
+
crypt(pass, :md5, salt) == passr
|
97
|
+
#pass.crypt(salt) == passr
|
98
|
+
rescue Exception => e
|
99
|
+
false
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
end
|
data/lib/log.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
module Ig3tool
|
2
|
+
|
3
|
+
class LogEntry < ActiveRecord::Base
|
4
|
+
|
5
|
+
set_table_name "log"
|
6
|
+
|
7
|
+
validates_presence_of :system,
|
8
|
+
:subsystem,
|
9
|
+
:timestamp,
|
10
|
+
:message
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
class Logger
|
15
|
+
|
16
|
+
def self.log(system, subsystem, message)
|
17
|
+
LogEntry.create(:system => system.to_s,
|
18
|
+
:timestamp => Time.now.to_i,
|
19
|
+
:subsystem => subsystem.to_s,
|
20
|
+
:message => message.to_s)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
data/lib/membership.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
module Ig3tool
|
2
|
+
class Membership < ActiveRecord::Base
|
3
|
+
set_table_name "Memberships"
|
4
|
+
set_nonauto_primary_key :barcode
|
5
|
+
|
6
|
+
validates_uniqueness_of :barcode
|
7
|
+
|
8
|
+
validates_presence_of :barcode,
|
9
|
+
:username,
|
10
|
+
:year,
|
11
|
+
:status
|
12
|
+
|
13
|
+
validates_inclusion_of :status,
|
14
|
+
:in => ["debugger",
|
15
|
+
"ex-debugger",
|
16
|
+
"member",
|
17
|
+
"honorary member"]
|
18
|
+
|
19
|
+
belongs_to :person,
|
20
|
+
:class_name => "Person",
|
21
|
+
:foreign_key => "username"
|
22
|
+
|
23
|
+
def self.member?(barcode)
|
24
|
+
begin
|
25
|
+
membership = find(barcode)
|
26
|
+
membership.year == Time.werkjaar
|
27
|
+
rescue ActiveRecord::RecordNotFound
|
28
|
+
false
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/mymd5.rb
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'English'
|
2
|
+
require 'base64'
|
3
|
+
require 'md5'
|
4
|
+
require 'sha1'
|
5
|
+
|
6
|
+
ITOA64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
|
7
|
+
|
8
|
+
|
9
|
+
def crypt(password, algo = :md5, salt = nil, magic='$1$')
|
10
|
+
|
11
|
+
salt ||= generate_salt(8)
|
12
|
+
|
13
|
+
case algo
|
14
|
+
when :md5, :sha1, :rmd160
|
15
|
+
require "digest/#{algo}"
|
16
|
+
when :sha256, :sha384, :sha512
|
17
|
+
require "digest/sha2"
|
18
|
+
else
|
19
|
+
raise(ArgumentError, "unknown algorithm")
|
20
|
+
end
|
21
|
+
digest_class = Digest.const_get(algo.to_s.upcase)
|
22
|
+
|
23
|
+
# The password first, since that is what is most unknown. Then our magic string. Then the raw salt.
|
24
|
+
m = digest_class.new
|
25
|
+
m.update(password + magic + salt)
|
26
|
+
|
27
|
+
# Then just as many characters of the MD5(pw,salt,pw)
|
28
|
+
mixin = digest_class.new.update(password + salt + password).digest
|
29
|
+
password.length.times do |i|
|
30
|
+
m.update(mixin[i % 16].chr)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Then something really weird...
|
34
|
+
# Also really broken, as far as I can tell. -m
|
35
|
+
i = password.length
|
36
|
+
while i != 0
|
37
|
+
if (i & 1) != 0
|
38
|
+
m.update("\x00")
|
39
|
+
else
|
40
|
+
m.update(password[0].chr)
|
41
|
+
end
|
42
|
+
i >>= 1
|
43
|
+
end
|
44
|
+
|
45
|
+
final = m.digest
|
46
|
+
|
47
|
+
# and now, just to make sure things don't run too fast
|
48
|
+
1000.times do |i|
|
49
|
+
m2 = digest_class.new
|
50
|
+
|
51
|
+
if (i & 1) != 0
|
52
|
+
m2.update(password)
|
53
|
+
else
|
54
|
+
m2.update(final)
|
55
|
+
end
|
56
|
+
|
57
|
+
if (i % 3) != 0
|
58
|
+
m2.update(salt)
|
59
|
+
end
|
60
|
+
if (i % 7) != 0
|
61
|
+
m2.update(password)
|
62
|
+
end
|
63
|
+
|
64
|
+
if (i & 1) != 0
|
65
|
+
m2.update(final)
|
66
|
+
else
|
67
|
+
m2.update(password)
|
68
|
+
end
|
69
|
+
|
70
|
+
final = m2.digest
|
71
|
+
end
|
72
|
+
|
73
|
+
# This is the bit that uses to64() in the original code.
|
74
|
+
|
75
|
+
rearranged = ""
|
76
|
+
|
77
|
+
[ [0, 6, 12], [1, 7, 13], [2, 8, 14], [3, 9, 15], [4, 10, 5] ].each do |a, b, c|
|
78
|
+
|
79
|
+
v = final[a] << 16 | final[b] << 8 | final[c]
|
80
|
+
|
81
|
+
4.times do
|
82
|
+
rearranged += ITOA64[v & 0x3f].chr
|
83
|
+
v >>= 6
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
v = final[11]
|
88
|
+
|
89
|
+
2.times do
|
90
|
+
rearranged += ITOA64[v & 0x3f].chr
|
91
|
+
v >>= 6
|
92
|
+
end
|
93
|
+
|
94
|
+
magic + salt + '$' + rearranged
|
95
|
+
end
|
data/lib/people.rb
ADDED
@@ -0,0 +1,143 @@
|
|
1
|
+
require 'utils'
|
2
|
+
|
3
|
+
module Ig3tool
|
4
|
+
|
5
|
+
class Person < ActiveRecord::Base
|
6
|
+
|
7
|
+
set_table_name "people"
|
8
|
+
set_nonauto_primary_key :username
|
9
|
+
|
10
|
+
# XXX wat willen we dat aanwezig is?
|
11
|
+
validates_presence_of :username,
|
12
|
+
:email,
|
13
|
+
:first_name,
|
14
|
+
:last_name
|
15
|
+
|
16
|
+
validates_uniqueness_of :username,
|
17
|
+
:email
|
18
|
+
|
19
|
+
has_one :interne,
|
20
|
+
:class_name => "Interne",
|
21
|
+
:foreign_key => "username"
|
22
|
+
|
23
|
+
# breekt horribly met to_yaml, zucht
|
24
|
+
# has_one :membership,
|
25
|
+
# :conditions => ["year = ?", Time.werkjaar],
|
26
|
+
# :class_name => 'Membership',
|
27
|
+
# :foreign_key => "username"
|
28
|
+
|
29
|
+
has_many :memberships,
|
30
|
+
:class_name => "Membership",
|
31
|
+
:foreign_key => "username",
|
32
|
+
:order => "year desc"
|
33
|
+
|
34
|
+
has_one :print_user,
|
35
|
+
:class_name => "PrintUser",
|
36
|
+
:foreign_key => "username"
|
37
|
+
# :dependent => :destroy # destroyes printuser when person gets deleted
|
38
|
+
# XXX do we want that?
|
39
|
+
|
40
|
+
def membership
|
41
|
+
if !memberships.empty? and memberships[0].year == Time.werkjaar
|
42
|
+
memberships[0]
|
43
|
+
else
|
44
|
+
nil
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def username=(newusername)
|
49
|
+
write_attribute(:username, newusername)
|
50
|
+
end
|
51
|
+
|
52
|
+
def member?
|
53
|
+
not membership.nil?
|
54
|
+
end
|
55
|
+
|
56
|
+
def honorarymember?
|
57
|
+
member? and membership.status == "honorary member"
|
58
|
+
end
|
59
|
+
|
60
|
+
def exhonorarymember?
|
61
|
+
not honorarymember? and not memberships.find(:all).find_all{|m| m.status == "honorary member"}.empty?
|
62
|
+
end
|
63
|
+
|
64
|
+
def debugger?
|
65
|
+
(not interne.nil?) and (interne.afgesloten != 1) and member? and (membership.status == "debugger")
|
66
|
+
end
|
67
|
+
|
68
|
+
def exdebugger?
|
69
|
+
(not debugger?) and (not memberships.find(:all).find_all{|m| m.status == "debugger" or m.status == "ex-debugger"}.empty?)
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.everybody
|
73
|
+
find(:all)
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.members
|
77
|
+
find(:all).find_all{|p| p.member?}
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.nonmembers
|
81
|
+
find(:all).find_all{|p| p.membership.nil?}
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.debuggers
|
85
|
+
find(:all).find_all{|p| p.debugger?}
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.exdebuggers
|
89
|
+
find(:all).find_all{|p| p.exdebugger?}
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.honorarymembers
|
93
|
+
find(:all).find_all{|p| p.honorarymember?}
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.exhonorarymembers
|
97
|
+
find(:all).find_all{|p| p.exhonorarymember?}
|
98
|
+
end
|
99
|
+
|
100
|
+
def unbugger!
|
101
|
+
raise NotADebugger unless debugger?
|
102
|
+
raise SaldoNotZero if interne.saldo != 0
|
103
|
+
|
104
|
+
interne.afgesloten = true
|
105
|
+
membership.status = "member"
|
106
|
+
|
107
|
+
transaction do
|
108
|
+
print_user.remove_aliases
|
109
|
+
|
110
|
+
membership.save!
|
111
|
+
interne.save!
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def bugger!
|
116
|
+
raise NotAMember unless member?
|
117
|
+
raise IG3Error, "already a debugger" if debugger?
|
118
|
+
|
119
|
+
membership.status = "debugger"
|
120
|
+
|
121
|
+
# interne
|
122
|
+
self.interne = i = Interne.new
|
123
|
+
i.username = username
|
124
|
+
i.saldo = 0
|
125
|
+
i.afgesloten = false
|
126
|
+
|
127
|
+
transaction do
|
128
|
+
# centjes overzetten
|
129
|
+
if print_user.saldo > 0
|
130
|
+
i.deposit("printaccount", print_user.saldo, "printkrediet")
|
131
|
+
# XXX print krediet?
|
132
|
+
# print_user.saldo = 0
|
133
|
+
end
|
134
|
+
|
135
|
+
membership.save!
|
136
|
+
i.save!
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
141
|
+
|
142
|
+
|
143
|
+
end
|
data/lib/printing.rb
ADDED
@@ -0,0 +1,238 @@
|
|
1
|
+
module Ig3tool
|
2
|
+
|
3
|
+
# The printing section of ig3tool
|
4
|
+
#
|
5
|
+
# Classes & methods:
|
6
|
+
#
|
7
|
+
# PrintUser
|
8
|
+
# ---------
|
9
|
+
# lookup(username)
|
10
|
+
# looks for a printuser by username as well as alias
|
11
|
+
# use this method to look usernames up
|
12
|
+
#
|
13
|
+
# add_credit(amount)
|
14
|
+
# adds amount of credit to a user' saldo
|
15
|
+
#
|
16
|
+
# refund(amount, printid, msg)
|
17
|
+
# refunds a failed job
|
18
|
+
# should ONLY be called from PrintTransaction
|
19
|
+
#
|
20
|
+
# remove(username)
|
21
|
+
# removes a printuser along its aliasses
|
22
|
+
#
|
23
|
+
# print(job, pages, copies, host, amount, queue, message)
|
24
|
+
# handles the printing of a job
|
25
|
+
# should ONLY be used by the printscript
|
26
|
+
#
|
27
|
+
# err(queue, message)
|
28
|
+
# logs an error
|
29
|
+
# again printscript ONLY
|
30
|
+
#
|
31
|
+
#
|
32
|
+
#
|
33
|
+
# PrintAlias
|
34
|
+
# ----------
|
35
|
+
# no special functions
|
36
|
+
#
|
37
|
+
#
|
38
|
+
#
|
39
|
+
# PrintTransaction
|
40
|
+
# ----------------
|
41
|
+
# refund()
|
42
|
+
# refunds a specific job, calls aprintuser.refund()
|
43
|
+
#
|
44
|
+
#
|
45
|
+
#
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
# Implements a printuser.
|
51
|
+
class PrintUser < ActiveRecord::Base
|
52
|
+
|
53
|
+
set_table_name "print_users"
|
54
|
+
set_nonauto_primary_key :username
|
55
|
+
validates_uniqueness_of :username
|
56
|
+
|
57
|
+
# _username_ and _saldo_ must be provided
|
58
|
+
# a PrintUser must be linked with an existing _person_
|
59
|
+
validates_presence_of :username, :saldo, :person
|
60
|
+
belongs_to :person, :class_name => "Person", :foreign_key => "username"
|
61
|
+
has_many :print_transactions, :class_name => "PrintTransaction", :foreign_key => "username"
|
62
|
+
has_many :print_aliases, :class_name => "PrintAlias", :foreign_key => "username", :dependent => :destroy
|
63
|
+
attr_accessible :username
|
64
|
+
validates_associated :person
|
65
|
+
|
66
|
+
# override because of non-standard primary key
|
67
|
+
def username=(newusername)
|
68
|
+
write_attribute(:username, newusername)
|
69
|
+
save!
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.lookup(username)
|
73
|
+
user = nil
|
74
|
+
begin
|
75
|
+
user = PrintUser.find(username) # Error if not found
|
76
|
+
rescue
|
77
|
+
begin
|
78
|
+
user = PrintAlias.find(username).print_user
|
79
|
+
rescue
|
80
|
+
raise NotFound, "the ig3tool imps found no such user..."
|
81
|
+
end
|
82
|
+
end
|
83
|
+
user
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.errortest
|
87
|
+
raise NotFound
|
88
|
+
end
|
89
|
+
|
90
|
+
def remove_aliases
|
91
|
+
print_aliases.each {|pa| pa.destroy }
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.remove(username)
|
95
|
+
user = PrintUser.lookup(username)
|
96
|
+
user.destroy
|
97
|
+
end
|
98
|
+
|
99
|
+
def email
|
100
|
+
self.person.email
|
101
|
+
end
|
102
|
+
|
103
|
+
def debugger?
|
104
|
+
self.person.debugger?
|
105
|
+
end
|
106
|
+
|
107
|
+
def add_credit (amount)
|
108
|
+
if self.debugger?
|
109
|
+
raise PermissionDenied, "debuggers cannot add credits to their account..."
|
110
|
+
else
|
111
|
+
PrintUser.transaction do
|
112
|
+
reload()
|
113
|
+
PrintTransaction.new do |pt|
|
114
|
+
pt.time = Time.now()
|
115
|
+
pt.username = username
|
116
|
+
pt.refunded = 0
|
117
|
+
pt.amount = amount.to_i
|
118
|
+
pt.queue = "ig3tool"
|
119
|
+
pt.message = "added #{amount} eurocents to #{username}'s account."
|
120
|
+
pt.category = "add"
|
121
|
+
pt.save!
|
122
|
+
end
|
123
|
+
self.saldo += amount.to_i
|
124
|
+
save!
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def refund(amount, printid, undo, msg)
|
130
|
+
PrintUser.transaction do
|
131
|
+
reload()
|
132
|
+
pt = PrintTransaction.new
|
133
|
+
pt.time = Time.now()
|
134
|
+
pt.username = username
|
135
|
+
pt.refunded = 0
|
136
|
+
pt.queue = "ig3tool"
|
137
|
+
pt.amount = amount.to_i
|
138
|
+
pt.message = "#{"undo " if undo}refunded print #{printid} of #{amount} euro to #{username}."
|
139
|
+
pt.category = "refund"
|
140
|
+
pt.save!
|
141
|
+
if debugger?
|
142
|
+
person.interne.refundprint(amount, "#{"undo " if undo }refund print, id: #{printid}", undo)
|
143
|
+
else
|
144
|
+
if undo
|
145
|
+
self.saldo += amount
|
146
|
+
else
|
147
|
+
self.saldo -= amount
|
148
|
+
end
|
149
|
+
save!
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def print(job, pages, copies, host, amount, queue, message)
|
155
|
+
PrintUser.transaction do
|
156
|
+
reload()
|
157
|
+
PrintTransaction.new do |pt|
|
158
|
+
pt.time = Time.now()
|
159
|
+
pt.username = username
|
160
|
+
pt.refunded = 0
|
161
|
+
pt.amount = amount.to_i
|
162
|
+
pt.pages = pages.to_i
|
163
|
+
pt.copies = copies.to_i
|
164
|
+
pt.host = host
|
165
|
+
pt.queue = queue
|
166
|
+
pt.job = job
|
167
|
+
pt.message = "Printed #{job} of #{pages} pages for #{amount} EUR - #{message}"
|
168
|
+
pt.category = "print"
|
169
|
+
pt.save!
|
170
|
+
end
|
171
|
+
if debugger?
|
172
|
+
person.interne.print(amount, "job: #{job}")
|
173
|
+
else
|
174
|
+
if self.saldo < amount.to_i
|
175
|
+
raise NotEnoughCredit, "you are broke!"
|
176
|
+
else
|
177
|
+
self.saldo -= amount.to_i
|
178
|
+
save!
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
|
185
|
+
def err(message, queue)
|
186
|
+
PrintTransaction.new do |pt|
|
187
|
+
pt.time = Time.now()
|
188
|
+
pt.username = username
|
189
|
+
pt.queue = queue
|
190
|
+
pt.category = "error"
|
191
|
+
pt.save!
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
end
|
196
|
+
|
197
|
+
|
198
|
+
class PrintAlias < ActiveRecord::Base
|
199
|
+
|
200
|
+
set_table_name "print_aliases"
|
201
|
+
set_primary_key :alias
|
202
|
+
validates_uniqueness_of :alias
|
203
|
+
validates_presence_of :alias, :username, :print_user
|
204
|
+
belongs_to :print_user, :class_name => "PrintUser", :foreign_key => "username"
|
205
|
+
validates_associated :print_user
|
206
|
+
|
207
|
+
def alias=(newalias)
|
208
|
+
@attributes["alias"] = newalias
|
209
|
+
end
|
210
|
+
|
211
|
+
end
|
212
|
+
|
213
|
+
|
214
|
+
class PrintTransaction < ActiveRecord::Base
|
215
|
+
|
216
|
+
set_table_name "print_transactions"
|
217
|
+
validates_presence_of :time, :username, :category, :queue
|
218
|
+
validates_inclusion_of :category, :in => ["error", "add", "print", "refund", "debug"]
|
219
|
+
belongs_to :printuser, :class_name => "PrintUser", :foreign_key => "username"
|
220
|
+
attr_protected :refunded
|
221
|
+
|
222
|
+
def refund
|
223
|
+
PrintTransaction.transaction do
|
224
|
+
reload()
|
225
|
+
if category == "print" then
|
226
|
+
printuser.refund(amount, id, !refunded.to_b, message)
|
227
|
+
toggle!(:refunded)
|
228
|
+
else
|
229
|
+
raise WrongPrintlogType
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
end # class PrintTransaction
|
235
|
+
|
236
|
+
|
237
|
+
|
238
|
+
end # module Ig3tool
|