bewerbung.rb 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. require 'sinatra'
  2. require "pry"
  3. require 'sequel'
  4. require 'spreadsheet'
  5. # require 'mailgun-ruby'
  6. # require 'envyable'
  7. # env.yml mit den unten verwendeten ENV anleg
  8. # Envyable.load("#{File.dirname(__FILE__)}/config/env.yml")
  9. #
  10. DB = Sequel.connect("sqlite://form.db")
  11. STATKUE = Sequel.connect("sqlite://statkue.db")
  12. Sequel::Model.strict_param_setting = false
  13. Sequel::Model.plugin :csv_serializer
  14. class SchuelerBasisdaten < Sequel::Model(:'SchuelerBasisdaten.dat')
  15. one_to_one :tracker
  16. def volljaehrig?(geburtsdatum)
  17. n = DateTime.now
  18. g = DateTime.parse(geburtsdatum)
  19. g >> 12*18 < n
  20. end
  21. def before_save
  22. begin
  23. self[:"Geburtsdatum"] = Time.parse(self[:"Geburtsdatum"]).strftime("%d.%m.%Y")
  24. rescue
  25. self[:"Geburtsdatum"] = Time.strptime(self[:"Geburtsdatum"], "%m/%d/%Y").strftime("%d.%m.%Y")
  26. end
  27. self[:"Schulpflicht erf."] ||= volljaehrig?(self[:"Geburtsdatum"]) ? "J" : "N"
  28. self[:"Verpflichtung Sprachförderkurs"] ||= "N"
  29. self[:"Teilnahme Sprachförderkurs"] ||= "N"
  30. self[:"Autist"] ||= "N"
  31. super
  32. end
  33. end
  34. class SchuelerZusatzdaten < Sequel::Model(:'SchuelerZusatzdaten.dat')
  35. one_to_one :tracker
  36. end
  37. class SchuelerErzieher < Sequel::Model(:'SchuelerErzieher.dat')
  38. one_to_one :tracker
  39. def before_save
  40. self[:"Vorname 1.Person"] ||= ""
  41. self[:"Nachname1.Person"] ||= ""
  42. self[:"Anrede 1.Person"] ||= ""
  43. self[:"Erzieherart"] ||= ""
  44. self[:"Straße"] ||= ""
  45. self[:"PLZ"] ||= ""
  46. self[:"Ort"] ||= ""
  47. end
  48. end
  49. class SchuelerTelefonnummern < Sequel::Model(:'SchuelerTelefonnummern.dat')
  50. many_to_one :tracker
  51. def before_save
  52. self[:"Art"] ||= "Erzieher"
  53. super
  54. end
  55. end
  56. class Tracker < Sequel::Model
  57. one_to_one :schueler, :class => SchuelerBasisdaten, :key => :id
  58. one_to_one :zusatzdaten, :class => SchuelerZusatzdaten, :key => :id
  59. one_to_one :erzieher, :class => SchuelerErzieher, :key => :id
  60. one_to_many :telefon, :class => SchuelerTelefonnummern, :key => :id
  61. end
  62. class BasisApp < Sinatra::Application
  63. configure do
  64. enable :sessions
  65. set :session_secret, (ENV['S_SESSION_SECRET'] || 'your_secret')
  66. end
  67. helpers do
  68. def partial(template, locals = {})
  69. slim template, :layout => false, :locals => locals
  70. end
  71. def get_bildungsgang(fachklasse)
  72. a=fachklasse.split("-")
  73. STATKUE[:Fachklasse].where(Flag: a.shift[0], FKS: a.shift, AP: a.shift).first[:Beschreibung_MW]
  74. end
  75. def import_daten
  76. # Dir[File.dirname(__FILE__)+"/views/*"]
  77. files = Dir["/home/zorro/temp/schild-docker/shared/*"]
  78. .reject{|f| File.directory?(f) || !f[".dat"]}
  79. files.insert(0, files.delete(files.select{|f|f.include? 'SchuelerBasisdaten'}.join))
  80. end
  81. end
  82. end
  83. class BewerbungApp < BasisApp
  84. get '/' do
  85. slim :form, :locals => {:keys => []}
  86. end
  87. post '/anmeldung' do
  88. p params
  89. keys, entries = [], []
  90. keys << "bildungsgang" if params["bildungsgang"].empty?
  91. keys << "taetigkeit" if params["taetigkeit"].empty?
  92. params.keys.select{|k|k.include? ".dat"}.each do |k|
  93. keys << params[k].keys.select{|kk| params[k][kk].empty?}.map{|kk| k+"["+kk+"]"}
  94. entries << Module.const_get(k.chomp(".dat")).new(params[k])
  95. end
  96. keys.flatten!
  97. if keys.empty?
  98. t = Tracker.create(:bildungsgang => params[:bildungsgang], :taetigkeit => params[:taetigkeit])
  99. entries.each do |e|
  100. e[:Vorname] ||= params["SchuelerBasisdaten.dat"]["Vorname"]
  101. e[:Nachname] ||= params["SchuelerBasisdaten.dat"]["Nachname"]
  102. e[:Geburtsdatum]||= params["SchuelerBasisdaten.dat"]["Geburtsdatum"]
  103. e.save
  104. e.tracker = t
  105. end
  106. if entries.find{|e| e[:"Schulpflicht erf."] == "J"}
  107. t.valid = true
  108. slim :fertig, :locals => {:t => t}
  109. else
  110. t.valid = false
  111. slim :form2, :locals => {:keys => [], :tid => t[:id]}
  112. end
  113. else
  114. slim :form, :locals => {:keys => keys}
  115. end
  116. end
  117. post '/anmeldung_erzieher' do
  118. t = Tracker[params[:tid].to_i]
  119. p params
  120. keys, entries = [], []
  121. params.keys.select{|k|k.include? ".dat"}.each do |k|
  122. keys << params[k].keys.select{|kk| params[k][kk].empty? && !kk.include?("2.Person")}.map{|kk| k+"["+kk+"]"}
  123. entries << Module.const_get(k.chomp(".dat")).new(params[k])
  124. end
  125. keys.flatten!
  126. # binding.pry
  127. if keys.empty?
  128. entries.each do |e|
  129. e[:Vorname] = t.schueler[:"Vorname"]
  130. e[:Nachname] = t.schueler[:"Nachname"]
  131. e[:Geburtsdatum]= t.schueler[:"Geburtsdatum"]
  132. e.save
  133. e.tracker = t
  134. end
  135. t.valid = true
  136. slim :fertig, :locals => {:t => t}
  137. else
  138. t.valid = false
  139. slim :form2, :locals => {:keys => keys, :tid => t[:id]}
  140. end
  141. end
  142. end
  143. class BewerbungAdminApp < BasisApp
  144. configure do
  145. if ENV['S_AUTH'] != "false"
  146. use Rack::Auth::Basic, "Bitte anmelden" do |username, password|
  147. username == "test" && password == "test"
  148. end
  149. end
  150. end
  151. get '/out' do
  152. book = Spreadsheet::Workbook.new
  153. bewerber = Tracker.all
  154. bewerber.group_by{|b| b[:bildungsgang]}.each_pair do |key,value|
  155. sheet = book.create_worksheet :name => key.tr('[]*?:/\\','_')
  156. sheet.row(0).concat (%w{Name Vorname m/w Geb.-Dat Geb.-Ort Straße\ und\ Hausnr. PLZ\ Wohnort Telefon Mail})
  157. value.each_with_index do |v,i|
  158. sheet.update_row i+1, v.schueler[:Nachname],
  159. v.schueler[:Vorname],
  160. v.schueler.Geschlecht,
  161. v.schueler.Geburtsdatum,
  162. v.zusatzdaten.Geburtsort,
  163. v.schueler.Straße,
  164. v.schueler.PLZ+" "+v.schueler.Ort,
  165. v.zusatzdaten[:"Telefon-Nr."],
  166. v.zusatzdaten[:"E-Mail"]
  167. end
  168. end
  169. book.write 'out.xls'
  170. file = File.path('out.xls')
  171. send_file(file, :disposition => 'attachment')
  172. end
  173. get '/in' do
  174. import_daten.each do |f|
  175. p f
  176. csv=CSV.read(f, {col_sep: "|", headers: true, encoding: "bom|utf-8"})
  177. csv.each do |row|
  178. Module.const_get(File.basename(f).chomp(".dat")).create(row)
  179. end
  180. end
  181. SchuelerBasisdaten.each do |s|
  182. if s.tracker.nil?
  183. t =Tracker.create(schueler_basisdaten_id: s.id,
  184. schueler_zusatzdaten_id: SchuelerZusatzdaten.where(Vorname: s.Vorname, Nachname: s.Nachname).first.id,
  185. schueler_erzieher_id: SchuelerErzieher.where(Vorname: s.Vorname, Nachname: s.Nachname).first.id,
  186. # schueler_telefonnummern_id: SchuelerTelefonnummern.where(Vorname: s.Vorname, Nachname: s.Nachname).all.map{|t|t.id},
  187. valid: true,
  188. bildungsgang: get_bildungsgang(s.Fachklasse))
  189. SchuelerTelefonnummern.where(Vorname: s.Vorname, Nachname: s.Nachname).each{|fon| fon.tracker_id = t.id}
  190. end
  191. end
  192. "alles drin"
  193. end
  194. end