hmt преди 7 години
ревизия
369bf6f97a
променени са 18 файла, в които са добавени 942 реда и са изтрити 0 реда
  1. 2 0
      .gitignore
  2. 9 0
      Gemfile
  3. 97 0
      Gemfile.lock
  4. 67 0
      bewerbung.rb
  5. 2 0
      config.ru
  6. 62 0
      create_forms.rb
  7. 34 0
      create_migrations.rb
  8. 50 0
      create_selects.rb
  9. 208 0
      migrations/01_initial.rb
  10. 0 0
      public/bk_logo.svg
  11. 10 0
      views/anrede.slim
  12. 31 0
      views/form.slim
  13. 89 0
      views/form_inputs.slim
  14. 11 0
      views/geschlecht.slim
  15. 16 0
      views/konfession.slim
  16. 8 0
      views/layout.slim
  17. 216 0
      views/nationalitaet.slim
  18. 30 0
      views/schulform.slim

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+config.json
+*.db

+ 9 - 0
Gemfile

@@ -0,0 +1,9 @@
+source "https://rubygems.org"
+
+gem 'puma'
+gem 'sass'
+gem 'google_drive'
+gem 'sinatra'
+gem 'slim'
+gem 'sequel'
+gem 'sqlite3'

+ 97 - 0
Gemfile.lock

@@ -0,0 +1,97 @@
+GEM
+  remote: https://rubygems.org/
+  specs:
+    addressable (2.5.2)
+      public_suffix (>= 2.0.2, < 4.0)
+    declarative (0.0.10)
+    declarative-option (0.1.0)
+    faraday (0.13.1)
+      multipart-post (>= 1.2, < 3)
+    ffi (1.9.18)
+    google-api-client (0.13.6)
+      addressable (~> 2.5, >= 2.5.1)
+      googleauth (~> 0.5)
+      httpclient (>= 2.8.1, < 3.0)
+      mime-types (~> 3.0)
+      representable (~> 3.0)
+      retriable (>= 2.0, < 4.0)
+    google_drive (2.1.6)
+      google-api-client (>= 0.11.0, < 0.14.0)
+      googleauth (>= 0.5.0, < 1.0.0)
+      nokogiri (>= 1.5.3, < 2.0.0)
+    googleauth (0.6.2)
+      faraday (~> 0.12)
+      jwt (>= 1.4, < 3.0)
+      logging (~> 2.0)
+      memoist (~> 0.12)
+      multi_json (~> 1.11)
+      os (~> 0.9)
+      signet (~> 0.7)
+    httpclient (2.8.3)
+    jwt (2.1.0)
+    little-plugger (1.1.4)
+    logging (2.2.2)
+      little-plugger (~> 1.1)
+      multi_json (~> 1.10)
+    memoist (0.16.0)
+    mime-types (3.1)
+      mime-types-data (~> 3.2015)
+    mime-types-data (3.2016.0521)
+    mini_portile2 (2.3.0)
+    multi_json (1.12.2)
+    multipart-post (2.0.0)
+    mustermann (1.0.1)
+    nokogiri (1.8.1)
+      mini_portile2 (~> 2.3.0)
+    os (0.9.6)
+    public_suffix (3.0.1)
+    puma (3.10.0)
+    rack (2.0.3)
+    rack-protection (2.0.0)
+      rack
+    rb-fsevent (0.10.2)
+    rb-inotify (0.9.10)
+      ffi (>= 0.5.0, < 2)
+    representable (3.0.4)
+      declarative (< 0.1.0)
+      declarative-option (< 0.2.0)
+      uber (< 0.2.0)
+    retriable (3.1.1)
+    sass (3.5.3)
+      sass-listen (~> 4.0.0)
+    sass-listen (4.0.0)
+      rb-fsevent (~> 0.9, >= 0.9.4)
+      rb-inotify (~> 0.9, >= 0.9.7)
+    sequel (5.2.0)
+    signet (0.8.1)
+      addressable (~> 2.3)
+      faraday (~> 0.9)
+      jwt (>= 1.5, < 3.0)
+      multi_json (~> 1.10)
+    sinatra (2.0.0)
+      mustermann (~> 1.0)
+      rack (~> 2.0)
+      rack-protection (= 2.0.0)
+      tilt (~> 2.0)
+    slim (3.0.9)
+      temple (>= 0.7.6, < 0.9)
+      tilt (>= 1.3.3, < 2.1)
+    sqlite3 (1.3.13)
+    temple (0.8.0)
+    tilt (2.0.8)
+    uber (0.1.0)
+
+PLATFORMS
+  ruby
+
+DEPENDENCIES
+  google_drive
+  puma
+  sass
+  sequel
+  sinatra
+  slim
+  sqlite3
+
+BUNDLED WITH
+   1.16.0

+ 67 - 0
bewerbung.rb

@@ -0,0 +1,67 @@
+require 'sinatra'
+require 'sequel'
+# require 'mailgun-ruby'
+# require 'envyable'
+# env.yml mit den unten verwendeten ENV anleg
+# Envyable.load("#{File.dirname(__FILE__)}/config/env.yml")
+#
+DB = Sequel.connect("sqlite://form.db")
+
+class SchuelerBasisdaten < Sequel::Model(:'SchuelerBasisdaten.dat')
+  def volljaehrig?(geburtsdatum)
+    n = DateTime.now
+    g = DateTime.parse(geburtsdatum)
+    g >> 12*18 < n
+  end
+
+  def before_save
+    self[:"Schulpflicht erf."] ||= volljaehrig?(self[:"Geburtsdatum"]) ? "J" : "N"
+    super
+  end
+end
+
+class SchuelerZusatzdaten < Sequel::Model(:'SchuelerZusatzdaten.dat')
+end
+class SchuelerErzieher < Sequel::Model(:'SchuelerErzieher.dat')
+end
+class SchuelerTelefonnummern < Sequel::Model(:'SchuelerTelefonnummern.dat')
+end
+
+configure do
+  enable :sessions
+  set :session_secret, (ENV['S_SESSION_SECRET'] || 'your_secret')
+end
+
+helpers do
+  def partial(template, locals = {})
+    slim template, :layout => false, :locals => locals
+  end
+end
+
+get '/' do
+  slim :form, :locals => {:keys => []}
+end
+
+post '/bewerbung' do
+  p params
+  keys = []
+  entries = []
+  params.keys.each do |k|
+    keys << "Ausbildung" if params["Ausbildung"].empty?
+    keys << "Taetigkeit" if params["Taetigkeit"].empty?
+    next unless k.include?(".dat")
+    keys << params[k].keys.select{|kk| puts kk; params[k][kk].empty? && !kk.include?("2.Person")}.map{|kk| k+"["+kk+"]"}
+    entries << Module.const_get(k.chomp(".dat")).new(params[k])
+  end
+  if keys.flatten!.empty?
+    entries.each do |e|
+      e[:Vorname]     ||= params["SchuelerBasisdaten.dat"]["Vorname"]
+      e[:Nachname]    ||= params["SchuelerBasisdaten.dat"]["Nachname"]
+      e[:Geburtsdatum]||= params["SchuelerBasisdaten.dat"]["Geburtsdatum"]
+      e.save
+    end
+    "ok"
+  else
+    slim :form, :locals => {:keys => keys}
+  end
+end

+ 2 - 0
config.ru

@@ -0,0 +1,2 @@
+require './bewerbung'
+run Sinatra::Application

+ 62 - 0
create_forms.rb

@@ -0,0 +1,62 @@
+require "google_drive"
+
+def type(arg)
+  case
+  when arg.start_with?("Text")
+    "text"
+  when arg == "Datum"
+    "date"
+  when arg == "Integer"
+    "number"
+  end
+end
+
+session = GoogleDrive::Session.from_config("config.json")
+key = "1-QkYYrbFtj_MIz9wsfsoKW6UzVJslrjAhXt18VMcF_8"
+ary = []
+
+session.spreadsheet_by_key(key).worksheets.each do |w|
+  title = w.title
+
+  w.rows.each do |r|
+    next if r[6] != "x"
+    ary[r[7].to_i] = <<-HEREDOC
+    .form-group.form-group-lg class=("has-error" if keys.include?("#{title+"["+r[2]+"]"}"))
+      label.control-label for="#{title+"["+r[2]+"]"}"
+        |#{r[1]}
+      input.form-control id="#{title+"["+r[2]+"]"}" name="#{title+"["+r[2]+"]"}" type="#{type(r[3])}"
+    HEREDOC
+  end
+end
+
+panel_daten = <<-HEREDOC
+.panel.panel-default
+  .panel-heading Persönliche Angaben
+  .panel-body
+HEREDOC
+
+panel_erzieher = <<-HEREDOC
+.panel.panel-default
+  .panel-heading Angaben Erziehungsberechtigte
+  .panel-body
+HEREDOC
+
+schule_beruf = <<-HEREDOC
+    .form-group.form-group-lg class=("has-error" if keys.include?("Taetigkeit"))
+      label.control-label for="Taetigkeit"
+        |Geben Sie bitte den Namen Ihrer derzeitigen Schule oder Einrichtung an
+      textarea.form-control name="Taetigkeit" rows="3"
+      HEREDOC
+
+ary[0]  = panel_daten
+ary[5]  = "    ==partial :geschlecht, :keys => keys"
+ary[11] = "    ==partial :nationalitaet, :keys => keys"
+ary[12] = "    ==partial :konfession, :keys => keys"
+ary[13] = "    ==partial :schulform, :keys => keys"
+ary[16] = "    ==partial :anrede, {:keys => keys, :i => 1}"
+ary[19] = "    ==partial :anrede, {:keys => keys, :i => 2}"
+ary.insert(15, schule_beruf, panel_erzieher)
+
+File.open("views/form_inputs.slim", 'w') do |f|
+  f.puts ary
+end

+ 34 - 0
create_migrations.rb

@@ -0,0 +1,34 @@
+require "google_drive"
+
+session = GoogleDrive::Session.from_config("config.json")
+key = "1-QkYYrbFtj_MIz9wsfsoKW6UzVJslrjAhXt18VMcF_8"
+ary = []
+
+File.open("migrations/01_initial.rb", 'w') do |f|
+  f.puts <<-HEREDOC
+Sequel.migration do
+  change do
+  HEREDOC
+end
+
+session.spreadsheet_by_key(key).worksheets.each do |w|
+  title = w.title
+
+  File.open("migrations/01_initial.rb", 'a') do |f|
+    f.puts "    create_table(:'#{title}') do"
+    f.puts "      primary_key :id"
+    w.rows.each do |r|
+      f.puts "      ##{r[5]}"
+      f.puts "      #{r[3] == 'Integer' ? 'Integer' : 'String'} :'#{r[2]}', :null => #{r[4] == 'Nein' ? 'false' : 'true'}#{r[8] == "" || r[8].nil? ? "" : ", :default => '#{r[8]}'"}"
+    end
+    f.puts "    end"
+  end
+end
+
+File.open("migrations/01_initial.rb", 'a') do |f|
+  f.puts <<-HEREDOC
+  end
+end
+  HEREDOC
+end
+

+ 50 - 0
create_selects.rb

@@ -0,0 +1,50 @@
+require "google_drive"
+
+@session = GoogleDrive::Session.from_config("config.json")
+key = "1o0kc9WqK32KqWWCEmwBLHDsdBXO_lmM3EDUtqZmyeEM"
+
+w = @session.spreadsheet_by_key(key).worksheet_by_title("Schulformen")
+File.open("views/schulform.slim", 'w') do |f|
+    f.puts <<-HEREDOC
+.form-group.form-group-lg class=("has-error" if keys.include?("SchuelerBasisdaten.dat[LS Schulform]"))
+  label.control-label for='SchuelerBasisdaten.dat[LS Schulform]'
+    |Derzeitige Schule bzw. letzte Schulform
+  select.select.form-control id='SchuelerBasisdaten.dat[LS Schulform]' name='SchuelerBasisdaten.dat[LS Schulform]'
+    option value="" bitte auswählen
+    HEREDOC
+  w.rows.each do |r|
+    next if r[1] == "SF"
+    next if r[1] == "G"
+    f.puts "    option value='#{r[1]}' #{r[2]}"
+  end
+end
+
+w = @session.spreadsheet_by_key(key).worksheet_by_title("Religionen")
+File.open("views/konfession.slim", 'w') do |f|
+    f.puts <<-HEREDOC
+.form-group.form-group-lg class=("has-error" if keys.include?("SchuelerBasisdaten.dat[StatistikKrz Konfession]"))
+  label.control-label for='SchuelerBasisdaten.dat[StatistikKrz Konfession]'
+    |Religionszugehörigkeit
+  select.select.form-control id='SchuelerBasisdaten.dat[StatistikKrz Konfession]' name='SchuelerBasisdaten.dat[StatistikKrz Konfession]'
+    option value="" bitte auswählen
+    HEREDOC
+  w.rows.each do |r|
+    next if r[1] == "Schlüssel"
+    f.puts "    option value='#{r[1]}' #{r[0]}"
+  end
+end
+
+w = @session.spreadsheet_by_key(key).worksheet_by_title("Nationalitäten")
+File.open("views/nationalitaet.slim", 'w') do |f|
+    f.puts <<-HEREDOC
+.form-group.form-group-lg class=("has-error" if keys.include?("SchuelerBasisdaten.dat[1. Staatsang.]"))
+  label.control-label for='SchuelerBasisdaten.dat[1. Staatsang.]'
+    |1. Staatsangehörigkeit/Land
+  select.select.form-control id='SchuelerBasisdaten.dat[1. Staatsang.]' name='SchuelerBasisdaten.dat[1. Staatsang.]'
+    option value="" bitte auswählen
+    HEREDOC
+  w.rows.each do |r|
+    next if r[0] == "Schlüssel"
+    f.puts "    option value='#{r[0]}' #{r[1]}"
+  end
+end

+ 208 - 0
migrations/01_initial.rb

@@ -0,0 +1,208 @@
+Sequel.migration do
+  change do
+    create_table(:'SchuelerBasisdaten.dat') do
+      primary_key :id
+      #Falls notwendig, mit Klasse ergänzen (mit #-Zeichen getrennt)
+      String :'Nachname', :null => false
+      #
+      String :'Vorname', :null => false
+      #In der Form TT.MM.JJJJ
+      String :'Geburtsdatum', :null => false
+      #Als „m“ oder „w“
+      String :'Geschlecht', :null => false
+      #0: Neuaufnahme 1: Warteliste 2: Aktiv 3: Beurlaubt 6: Extern 8: Abschluss 9: Abgänger ohne Abschluss
+      Integer :'Status', :null => false, :default => '0'
+      #
+      String :'PLZ', :null => true
+      #Falls PLZ angegeben, darf Wohnort nicht leer sein!
+      String :'Ort', :null => true
+      #Mit Hausnr
+      String :'Straße', :null => true
+      #„J“ oder „N“
+      String :'Aussiedler', :null => true, :default => 'N'
+      #Als Statistik-Kürzel (z.B. 000 für Deutschland) aus Statkue.mdb, Tabelle „Nationalitäten“
+      String :'1. Staatsang.', :null => true
+      #Klarttext für Konfession
+      String :'Konfession', :null => true
+      #Statistik-Kürzel der Konfession aus Statkue.mdb, Tabelle „Religionen“
+      String :'StatistikKrz Konfession', :null => true
+      #Datum der Aufnahme an Schule
+      String :'Aufnahmedatum', :null => true
+      #
+      String :'Abmeldedatum Religionsunterricht', :null => true
+      #
+      String :'Anmeldedatum Religionsunterricht', :null => true
+      #Als „J“ oder „N“
+      String :'Schulpflicht erf.', :null => false
+      #Als Statistik-Kürzel aus Statkue.mdb, Tabelle „Reformpädagogik“
+      String :'Reform-Pädagogik', :null => true
+      #Nummer der Stammschule, nur bei Status = Extern notwendig
+      String :'Nr. Stammschule', :null => true
+      #Das Schuljahr, in dem sich der Schüler befindet. Muss nicht immer identisch mit dem aktuellen Schuljahr sein (z.B. bei Abgängern)
+      Integer :'Jahr', :null => true
+      #Der Abschnitt, in dem sich der Schüler befindet. Muss nicht immer identisch mit dem aktuellen Abschnitt sein (z.B. bei Abgängern)
+      Integer :'Abschnitt', :null => true
+      #Muss identisch sein mit einer Bezeichnung aus Jahrgaenge.dat
+      String :'Jahrgang', :null => true
+      #Aktuelle Klasse, muss auf einen Eintrag aus Klassen.dat verweisen
+      String :'Klasse', :null => true
+      #Aktuelle Gliederung (z.B: ***, A01)Als Statistik-Kürzel (z.B. ***, A01) aus Statkue.mdb, Tabelle „Gliederung“, Felder BKAnlage + BKTyp
+      String :'Schulgliederung', :null => true
+      #Aktuelle Organisationsform. Als Statistik-Kürzel aus Statkue.mdb, Tabelle „Organisationsform“.
+      String :'OrgForm', :null => true
+      #Als Statistik-Kürzel aus Statkue.mdb, Tabelle „ZulKlArt“. Bleibt bei Berufskollegs leer.
+      String :'Klassenart', :null => true
+      #Nur bei BKAktuelle FachklasseIn der Form BKIndex-Fachklassenschlüssel-Ausprägung (z.B.1-113-00 Bankkaufmann), aus Statkue.mdb, Tabelle „Fachklasse“.
+      String :'Fachklasse', :null => true
+      #Noch leer lassen
+      String :'', :null => true
+      #Als „J“ oder „N“
+      String :'Verpflichtung Sprachförderkurs', :null => false, :default => 'N'
+      #Als „J“ oder „N“
+      String :'Teilnahme Sprachförderkurs', :null => false, :default => 'N'
+      #
+      Integer :'Einschulungsjahr', :null => true
+      #Als Statistik-Kürzel aus Statkue.mdb, Tabelle „SchuelerUebergangsempfehlung5Jg“.
+      String :'Übergangsempf. JG5', :null => true
+      #
+      Integer :'Jahr Wechsel S1', :null => true
+      #Als Statistik-Kürzel aus Statkue.mdb, Tabelle „SchuelerErsteSchulformSekI“.
+      String :'1. Schulform S1', :null => true
+      #
+      Integer :'Jahr Wechsel S2', :null => true
+      #Als Statistik-Kürzel aus Statkue.mdb, Tabelle „Förderschwerpunkt“.
+      String :'Förderschwerpunkt', :null => true
+      #Als Statistik-Kürzel aus Statkue.mdb, Tabelle „Förderschwerpunkt“.
+      String :'2. Förderschwerpunkt', :null => true
+      #Als „J“ oder „N“
+      String :'Schwerstbehinderung', :null => false, :default => 'N'
+      #Als „J“ oder „N“
+      String :'Autist', :null => false, :default => 'N'
+      #
+      String :'LS Schulnr.', :null => true
+      #Als Statistik-Kürzel aus Statkue.mdb, Tabelle „Schulformen“.
+      String :'LS Schulform', :null => true
+      #Statistik-Kürzel aus Statkue.mdb, Tabelle „Herkunftsschulform“
+      String :'Herkunft', :null => true
+      #Als TT.MM.JJJJ
+      String :'LS Entlassdatum', :null => true
+      #Als Statistik-Kürzel aus Statkue.mdb, Tabelle „ZulJahrgänge“
+      String :'LS Jahrgang', :null => true
+      #0: Ja 1: Nein2: Freiw. Rücktritt
+      Integer :'LS Versetzung', :null => true
+      #Als Statistik-Kürzel aus Statkue.mdb, Tabelle „Reformpädagogik“
+      String :'LS Reformpädagogik', :null => true
+      #Als Statistik-Kürzel aus Statkue.mdb, Tabelle „Gliederung“, Felder BKAnlage + BKTyp
+      String :'LS Gliederung', :null => true
+      #Nur bei BKAktuelle FachklasseIn der Form BKIndex-Fachklassenschlüssel-Ausprägung (z.B.1-113-00 Bankkaufmann)Aus Statkue.mdb, Tabelle „Fachklasse“
+      String :'LS Fachklasse', :null => true
+      #Als Statistik-Kürzel aus Statkue.mdb, Tabelle „Abgangsart“
+      String :'LS Abschluss', :null => true
+      #Als Statistik-Kürzel aus Statkue.mdb, Tabelle „Abgangsart“
+      String :'Abschluss', :null => true
+      #
+      String :'Schulnr. neue Schule', :null => true
+      #
+      Integer :'Zuzugsjahr', :null => true
+      #Als Statistik-Kürzel (z.B. 000 für Deutschland) aus Statkue.mdb, Tabelle „Nationalitäten
+      String :'Geburtsland Schüler', :null => true
+      #Als Statistik-Kürzel (z.B. 000 für Deutschland) aus Statkue.mdb, Tabelle „Nationalitäten
+      String :'Geburtsland Mutter', :null => true
+      #Als Statistik-Kürzel (z.B. 000 für Deutschland) aus Statkue.mdb, Tabelle „Nationalitäten
+      String :'Geburtsland Vater', :null => true
+      #Als Statistik-Kürzel (z.B. „de“ für Deutsch) aus Statkue.mdb, Tabelle „SchuelerVerkehrssprache“
+      String :'Verkehrssprache', :null => true
+      #Nur bei Grundschulengültige Einträge0: Kein Kindergarten1: unter 1 Jahr 2: 1 bis unter 2 Jahre 3: 2 bis unter 3 Jahre 4: 3 Jahre und mehr
+      String :'Dauer Kindergartenbesuch', :null => true
+    end
+    create_table(:'SchuelerZusatzdaten.dat') do
+      primary_key :id
+      #Muss in Verbindung mit Vorname und Geburtsdatum auf einen Eintrag aus SchuelerBasisdaten.dat verweisen. Falls notwendig, mit Klasse ergänzen (mit #-Zeichen getrennt - siehe Beschreibung zu SchuelerBasisdaten.dat)
+      String :'Nachname', :null => false
+      #
+      String :'Vorname', :null => false
+      #Als TT.MM.JJJJ
+      String :'Geburtsdatum', :null => false
+      #
+      String :'Namenszusatz', :null => true
+      #
+      String :'Geburtsname', :null => true
+      #
+      String :'Geburtsort', :null => true
+      #
+      String :'Ortsteil', :null => true
+      #
+      String :'Telefon-Nr.', :null => true
+      #
+      String :'E-Mail', :null => true
+      #Als Statistik-Kürzel (z.B. 163 für Türkei)
+      String :'2. Staatsang.', :null => true
+      #z.B. aus Einwohnermeldeamt
+      String :'Externe ID-Nr.', :null => true
+      #
+      String :'Sportbefreiung', :null => true
+      #
+      String :'Fahrschülerart', :null => true
+      #
+      String :'Haltestelle', :null => true
+      #Als Klartextnormalvorzeitigzurückgestellt
+      String :'Einschulungsart', :null => true
+      #
+      String :'Entlassdatum', :null => true
+      #Muss auf eine schulinterne Kurzbez. aus Jahrgaenge.dat verweisen
+      String :'Entlassjahrgang', :null => true
+      #
+      String :'Datum Schulwechsel', :null => true
+      #
+      String :'Bemerkungen', :null => true
+    end
+    create_table(:'SchuelerErzieher.dat') do
+      primary_key :id
+      #Muss in Verbindung mit Vorname und Geburtsdatum auf einen Eintrag aus SchuelerBasisdaten.dat verweisen. Falls notwendig, mit Klasse ergänzen (mit #-Zeichen getrennt - siehe Beschreibung zu SchuelerBasisdaten.dat)
+      String :'Nachname', :null => false
+      #
+      String :'Vorname', :null => false
+      #Als TT.MM.JJJJ
+      String :'Geburtsdatum', :null => false
+      #z.B. „Eltern“, „Mutter“, „Vater“ usw.
+      String :'Erzieherart', :null => false
+      #„Herr“ oder „Frau“
+      String :'Anrede 1.Person', :null => false
+      #
+      String :'Titel 1.Person', :null => true
+      #
+      String :'Nachname1.Person', :null => false
+      #
+      String :'Vorname 1.Person', :null => false
+      #„Herr“ oder „Frau“
+      String :'Anrede 2.Person', :null => true
+      #
+      String :'Titel 2.Person', :null => true
+      #
+      String :'Nachname 2.Person', :null => true
+      #
+      String :'Vorname 2.Person', :null => true
+      #
+      String :'Straße', :null => false
+      #
+      String :'PLZ', :null => false
+      #
+      String :'Ort', :null => false
+      #
+      String :'Ortsteil', :null => true
+    end
+    create_table(:'SchuelerTelefonnummern.dat') do
+      primary_key :id
+      #Muss in Verbindung mit Vorname und Geburtsdatum auf einen Eintrag aus SchuelerBasisdaten.dat verweisen. Falls notwendig, mit Klasse ergänzen (mit #-Zeichen getrennt - siehe Beschreibung zu SchuelerBasisdaten.dat)
+      String :'Nachname', :null => false
+      #
+      String :'Vorname', :null => false
+      #Als TT.MM.JJJJ
+      String :'Geburtsdatum', :null => false
+      #
+      String :'Telefonnr.', :null => false
+      #Beschreibung der Telefonnr, z.B. „Eltern“, „Handy Schüler“, „Büro Vater“, „Handy Mutter“ usw.
+      String :'Art', :null => false
+    end
+  end
+end

Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
public/bk_logo.svg


+ 10 - 0
views/anrede.slim

@@ -0,0 +1,10 @@
+.form-group.form-group-lg class=("has-error" if keys.include?("SchuelerErzieher.dat[Anrede #{i}.Person]"))
+  label.control-label for="SchuelerErzieher.dat[Anrede #{i}.Person]"
+    |Anrede #{i}. Person
+  input.form-control name="SchuelerErzieher.dat[Anrede #{i}.Person]" type='hidden' value=""
+  label.radio-inline
+    input.form-control name="SchuelerErzieher.dat[Anrede #{i}.Person]" type="radio" value="Herr"
+      |Herr
+  label.radio-inline
+    input.form-control name="SchuelerErzieher.dat[Anrede #{i}.Person]" type="radio" value="Frau"
+      |Frau

+ 31 - 0
views/form.slim

@@ -0,0 +1,31 @@
+.container
+  .row
+    .col-md-offset-3.col-md-6.col-sm-12.col-xs-12
+      img src="/bk_logo.svg" width="100%"
+      hr
+      h2 Online-Bewerbung des BK-Bethel
+      |Bitte füllen Sie alle Felder vollständig aus:
+      -if !keys.empty?
+        .alert.alert-danger role="alert"
+          strong<> Fehler:
+          |Bitte füllen Sie die rot markierten Felder noch aus.
+      form method="post" action="/bewerbung"
+        .form-group.form-group-lg class=("has-error" if keys.include?("Ausbildung"))
+          label.control-label for="Ausbildung"
+            |Wählen Sie den Bildungsgang aus, für den Sie sich bewerben möchten
+          select.select.form-control id="Ausbildung" name="Ausbildung"
+            option value="" bitte auswählen
+            option Allgemeine Hochschulreife, Schwerpunkt Gesundheit
+            option Erzieher_in, Allgemeine Hochschulreife
+            option Erzieher_in, einjähriges Berufspraktikum
+            option Erzieher_in, praxisintegrierte Form
+            option Fachoberschule Schwerpunkt Gesundheit
+            option Fachoberschule Schwerpunkt Soziales
+            option Sozialassistent_in
+            option Sozialassistent_in Schwerpunkt Heilerziehung
+            option Heilerziehungspfleger_in, einjähriges Berufspraktikum
+            option Heilerziehungspfleger_in, praxisintegrierte Form
+            option Heilpädagoge/Heilpädagogin
+        ==partial :form_inputs, :keys => keys
+        .form-group.form-group-lg
+          button.btn.btn-primary.btn-lg.btn-block name="submit" type="submit" Weiter

+ 89 - 0
views/form_inputs.slim

@@ -0,0 +1,89 @@
+.panel.panel-default
+  .panel-heading Persönliche Angaben
+  .panel-body
+    .form-group.form-group-lg class=("has-error" if keys.include?("SchuelerBasisdaten.dat[Nachname]"))
+      label.control-label for="SchuelerBasisdaten.dat[Nachname]"
+        |Nachname
+      input.form-control id="SchuelerBasisdaten.dat[Nachname]" name="SchuelerBasisdaten.dat[Nachname]" type="text"
+    .form-group.form-group-lg class=("has-error" if keys.include?("SchuelerBasisdaten.dat[Vorname]"))
+      label.control-label for="SchuelerBasisdaten.dat[Vorname]"
+        |Vorname
+      input.form-control id="SchuelerBasisdaten.dat[Vorname]" name="SchuelerBasisdaten.dat[Vorname]" type="text"
+    .form-group.form-group-lg class=("has-error" if keys.include?("SchuelerBasisdaten.dat[Geburtsdatum]"))
+      label.control-label for="SchuelerBasisdaten.dat[Geburtsdatum]"
+        |Geburtsdatum
+      input.form-control id="SchuelerBasisdaten.dat[Geburtsdatum]" name="SchuelerBasisdaten.dat[Geburtsdatum]" type="date"
+    .form-group.form-group-lg class=("has-error" if keys.include?("SchuelerZusatzdaten.dat[Geburtsort]"))
+      label.control-label for="SchuelerZusatzdaten.dat[Geburtsort]"
+        |Geburtsort
+      input.form-control id="SchuelerZusatzdaten.dat[Geburtsort]" name="SchuelerZusatzdaten.dat[Geburtsort]" type="text"
+    ==partial :geschlecht, :keys => keys
+    .form-group.form-group-lg class=("has-error" if keys.include?("SchuelerBasisdaten.dat[Straße]"))
+      label.control-label for="SchuelerBasisdaten.dat[Straße]"
+        |Straße
+      input.form-control id="SchuelerBasisdaten.dat[Straße]" name="SchuelerBasisdaten.dat[Straße]" type="text"
+    .form-group.form-group-lg class=("has-error" if keys.include?("SchuelerBasisdaten.dat[PLZ]"))
+      label.control-label for="SchuelerBasisdaten.dat[PLZ]"
+        |PLZ
+      input.form-control id="SchuelerBasisdaten.dat[PLZ]" name="SchuelerBasisdaten.dat[PLZ]" type="text"
+    .form-group.form-group-lg class=("has-error" if keys.include?("SchuelerBasisdaten.dat[Ort]"))
+      label.control-label for="SchuelerBasisdaten.dat[Ort]"
+        |Ort
+      input.form-control id="SchuelerBasisdaten.dat[Ort]" name="SchuelerBasisdaten.dat[Ort]" type="text"
+    .form-group.form-group-lg class=("has-error" if keys.include?("SchuelerZusatzdaten.dat[Telefon-Nr.]"))
+      label.control-label for="SchuelerZusatzdaten.dat[Telefon-Nr.]"
+        |Telefon-Nr.
+      input.form-control id="SchuelerZusatzdaten.dat[Telefon-Nr.]" name="SchuelerZusatzdaten.dat[Telefon-Nr.]" type="text"
+    .form-group.form-group-lg class=("has-error" if keys.include?("SchuelerZusatzdaten.dat[E-Mail]"))
+      label.control-label for="SchuelerZusatzdaten.dat[E-Mail]"
+        |E-Mail
+      input.form-control id="SchuelerZusatzdaten.dat[E-Mail]" name="SchuelerZusatzdaten.dat[E-Mail]" type="text"
+    ==partial :nationalitaet, :keys => keys
+    ==partial :konfession, :keys => keys
+    ==partial :schulform, :keys => keys
+
+    .form-group.form-group-lg class=("has-error" if keys.include?("Taetigkeit"))
+      label.control-label for="Taetigkeit"
+        |Geben Sie bitte den Namen Ihrer derzeitigen Schule oder Einrichtung an
+      textarea.form-control name="Taetigkeit" rows="3"
+.panel.panel-default
+  .panel-heading Angaben Erziehungsberechtigte
+  .panel-body
+    .form-group.form-group-lg class=("has-error" if keys.include?("SchuelerErzieher.dat[Erzieherart]"))
+      label.control-label for="SchuelerErzieher.dat[Erzieherart]"
+        |Erzieherart
+      input.form-control id="SchuelerErzieher.dat[Erzieherart]" name="SchuelerErzieher.dat[Erzieherart]" type="text"
+    ==partial :anrede, {:keys => keys, :i => 1}
+    .form-group.form-group-lg class=("has-error" if keys.include?("SchuelerErzieher.dat[Nachname1.Person]"))
+      label.control-label for="SchuelerErzieher.dat[Nachname1.Person]"
+        |Nachname 1. Person
+      input.form-control id="SchuelerErzieher.dat[Nachname1.Person]" name="SchuelerErzieher.dat[Nachname1.Person]" type="text"
+    .form-group.form-group-lg class=("has-error" if keys.include?("SchuelerErzieher.dat[Vorname 1.Person]"))
+      label.control-label for="SchuelerErzieher.dat[Vorname 1.Person]"
+        |Vorname 1. Person
+      input.form-control id="SchuelerErzieher.dat[Vorname 1.Person]" name="SchuelerErzieher.dat[Vorname 1.Person]" type="text"
+    ==partial :anrede, {:keys => keys, :i => 2}
+    .form-group.form-group-lg class=("has-error" if keys.include?("SchuelerErzieher.dat[Nachname 2.Person]"))
+      label.control-label for="SchuelerErzieher.dat[Nachname 2.Person]"
+        |Nachname 2. Person
+      input.form-control id="SchuelerErzieher.dat[Nachname 2.Person]" name="SchuelerErzieher.dat[Nachname 2.Person]" type="text"
+    .form-group.form-group-lg class=("has-error" if keys.include?("SchuelerErzieher.dat[Vorname 2.Person]"))
+      label.control-label for="SchuelerErzieher.dat[Vorname 2.Person]"
+        |Vorname 2. Person
+      input.form-control id="SchuelerErzieher.dat[Vorname 2.Person]" name="SchuelerErzieher.dat[Vorname 2.Person]" type="text"
+    .form-group.form-group-lg class=("has-error" if keys.include?("SchuelerErzieher.dat[Straße]"))
+      label.control-label for="SchuelerErzieher.dat[Straße]"
+        |Straße u. Hausnr.
+      input.form-control id="SchuelerErzieher.dat[Straße]" name="SchuelerErzieher.dat[Straße]" type="text"
+    .form-group.form-group-lg class=("has-error" if keys.include?("SchuelerErzieher.dat[PLZ]"))
+      label.control-label for="SchuelerErzieher.dat[PLZ]"
+        |PLZ
+      input.form-control id="SchuelerErzieher.dat[PLZ]" name="SchuelerErzieher.dat[PLZ]" type="text"
+    .form-group.form-group-lg class=("has-error" if keys.include?("SchuelerErzieher.dat[Ort]"))
+      label.control-label for="SchuelerErzieher.dat[Ort]"
+        |Ort
+      input.form-control id="SchuelerErzieher.dat[Ort]" name="SchuelerErzieher.dat[Ort]" type="text"
+    .form-group.form-group-lg class=("has-error" if keys.include?("SchuelerTelefonnummern.dat[Telefonnr.]"))
+      label.control-label for="SchuelerTelefonnummern.dat[Telefonnr.]"
+        |Telefon-Nummer
+      input.form-control id="SchuelerTelefonnummern.dat[Telefonnr.]" name="SchuelerTelefonnummern.dat[Telefonnr.]" type="text"

+ 11 - 0
views/geschlecht.slim

@@ -0,0 +1,11 @@
+.form-group.form-group-lg class=("has-error" if keys.include?("SchuelerBasisdaten.dat[Geschlecht]"))
+  label.control-label for="SchuelerBasisdaten.dat[Geschlecht]"
+    |Geschlecht
+  input.form-control name="SchuelerBasisdaten.dat[Geschlecht]" type='hidden' value=""
+  label.radio-inline
+    input.form-control name="SchuelerBasisdaten.dat[Geschlecht]" type="radio" value="m"
+      |m&auml;nnlich
+  label.radio-inline
+    input.form-control name="SchuelerBasisdaten.dat[Geschlecht]" type="radio" value="w"
+      |weiblich
+

+ 16 - 0
views/konfession.slim

@@ -0,0 +1,16 @@
+.form-group.form-group-lg class=("has-error" if keys.include?("SchuelerBasisdaten.dat[StatistikKrz Konfession]"))
+  label.control-label for='SchuelerBasisdaten.dat[StatistikKrz Konfession]'
+    |Religionszugehörigkeit
+  select.select.form-control id='SchuelerBasisdaten.dat[StatistikKrz Konfession]' name='SchuelerBasisdaten.dat[StatistikKrz Konfession]'
+    option value="" bitte auswählen
+    option value='ER' evangelisch
+    option value='KR' katholisch
+    option value='XR' andere Religionen
+    option value='OH' ohne Bekenntnis
+    option value='IR' islamisch
+    option value='OR' griechisch-orthodox
+    option value='HR' jüdisch
+    option value='XO' sonstige orthodoxe
+    option value='SO' syrisch-orthodox
+    option value='AR' alevitisch
+    option value='ME' mennonitische BG NRW

+ 8 - 0
views/layout.slim

@@ -0,0 +1,8 @@
+doctype 5
+html lang="en"
+  head
+    meta charset="utf-8"
+    meta name="viewport" content="width=device-width, initial-scale=1.0"
+    link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" type="text/css"
+  body
+    ==yield

+ 216 - 0
views/nationalitaet.slim

@@ -0,0 +1,216 @@
+.form-group.form-group-lg class=("has-error" if keys.include?("SchuelerBasisdaten.dat[1. Staatsang.]"))
+  label.control-label for='SchuelerBasisdaten.dat[1. Staatsang.]'
+    |1. Staatsangehörigkeit/Land
+  select.select.form-control id='SchuelerBasisdaten.dat[1. Staatsang.]' name='SchuelerBasisdaten.dat[1. Staatsang.]'
+    option value="" bitte auswählen
+    option value='000' Deutschland
+    option value='121' Albanien
+    option value='122' Bosnien-Herzegowina
+    option value='123' Andorra
+    option value='124' Belgien
+    option value='125' Bulgarien
+    option value='126' Dänemark
+    option value='127' Estland
+    option value='128' Finnland
+    option value='129' Frankreich
+    option value='130' Kroatien
+    option value='131' Slowenien
+    option value='134' Griechenland
+    option value='135' Irland
+    option value='136' Island
+    option value='137' Italien
+    option value='139' Lettland
+    option value='141' Liechtenstein
+    option value='142' Litauen
+    option value='143' Luxemburg
+    option value='144' Mazedonien
+    option value='145' Malta
+    option value='146' Moldawien
+    option value='147' Monaco
+    option value='148' Niederlande
+    option value='149' Norwegen
+    option value='151' Österreich
+    option value='152' Polen
+    option value='153' Portugal
+    option value='154' Rumänien
+    option value='155' Slowakische Republik
+    option value='156' San Marino
+    option value='157' Schweden
+    option value='158' Schweiz
+    option value='160' Russland
+    option value='161' Spanien
+    option value='163' Türkei
+    option value='164' Tschechien
+    option value='165' Ungarn
+    option value='166' Ukraine
+    option value='167' Vatikan
+    option value='168' Großbritannien und Nordirland
+    option value='169' Weißrussland
+    option value='181' Zypern
+    option value='199' Übriges Europa
+    option value='221' Algerien
+    option value='223' Angola
+    option value='224' Eritrea
+    option value='225' Äthiopien
+    option value='226' Lesotho
+    option value='227' Botsuana
+    option value='229' Benin
+    option value='230' Dschibuti
+    option value='231' Elfenbeinküste
+    option value='232' Nigeria
+    option value='233' Simbabwe
+    option value='236' Gabun
+    option value='237' Gambia
+    option value='238' Ghana
+    option value='239' Mauretanien
+    option value='242' Kapverdische Inseln
+    option value='243' Kenia
+    option value='244' Komoren
+    option value='245' Kongo DR
+    option value='246' Kongo VR
+    option value='247' Liberia
+    option value='248' Libyen
+    option value='249' Madagaskar
+    option value='251' Mali
+    option value='252' Marokko
+    option value='253' Mauritius
+    option value='254' Mosambik
+    option value='255' Niger
+    option value='256' Malawi
+    option value='257' Sambia
+    option value='258' Burkina-Faso
+    option value='259' Guinea-Bissau
+    option value='261' Guinea
+    option value='262' Kamerun
+    option value='263' Südafrika
+    option value='265' Ruanda
+    option value='267' Namibia
+    option value='268' Sâo-Tomé
+    option value='269' Senegal
+    option value='271' Seychellen
+    option value='272' Sierra Leone
+    option value='273' Somalia
+    option value='274' Äquatorial-Guinea
+    option value='276' Sudan
+    option value='281' Swasiland
+    option value='282' Tansania
+    option value='283' Togo
+    option value='284' Tschad
+    option value='285' Tunesien
+    option value='286' Uganda
+    option value='287' Ägypten
+    option value='289' Zentralafrikanische Republik
+    option value='291' Burundi
+    option value='299' Übriges Afrika
+    option value='320' Antigua
+    option value='322' Barbados
+    option value='323' Argentinien
+    option value='324' Bahamas
+    option value='326' Bolivien
+    option value='327' Brasilien
+    option value='328' Guayana
+    option value='330' Belize
+    option value='332' Chile
+    option value='333' Dominica
+    option value='334' Costa Rica
+    option value='335' Dominikanische Republik
+    option value='336' Ecuador
+    option value='337' San Salvador
+    option value='340' Grenada
+    option value='345' Guatemala
+    option value='346' Haiti
+    option value='347' Honduras
+    option value='348' Kanada
+    option value='349' Kolumbien
+    option value='351' Kuba
+    option value='353' Mexiko
+    option value='354' Nicaragua
+    option value='355' Jamaica
+    option value='357' Panama
+    option value='359' Paraguay
+    option value='361' Peru
+    option value='364' Surinam
+    option value='365' Uruguay
+    option value='366' St. Lucia
+    option value='367' Venezuela
+    option value='368' Vereinigte Staaten
+    option value='369' St. Vincent
+    option value='370' St. Kitts und Nevis
+    option value='371' Trinidad und Tobago
+    option value='399' Übriges Amerika
+    option value='421' Jemen
+    option value='422' Armenien
+    option value='423' Afghanistan
+    option value='424' Bahrain
+    option value='425' Aserbaidschan
+    option value='426' Bhutan
+    option value='427' Myanmar
+    option value='429' Brunei
+    option value='430' Georgien
+    option value='431' Sri Lanka
+    option value='432' Vietnam
+    option value='434' Korea, Dem. Volksrepublik (früher Nordkorea)
+    option value='436' Indien
+    option value='437' Indonesien
+    option value='438' Irak
+    option value='439' Iran
+    option value='441' Israel
+    option value='442' Japan
+    option value='444' Kasachstan
+    option value='445' Jordanien
+    option value='446' Kambodscha
+    option value='447' Katar
+    option value='448' Kuwait
+    option value='449' Laos
+    option value='450' Kirgisien
+    option value='451' Libanon
+    option value='454' Malediven
+    option value='456' Oman
+    option value='457' Mongolei
+    option value='458' Nepal
+    option value='460' Bangla Desh
+    option value='461' Pakistan
+    option value='462' Philippinen
+    option value='467' Korea, Republik (früher Südkorea)
+    option value='469' Vereinigte Arabischen Emirate
+    option value='470' Tadschikistan
+    option value='471' Turkmenistan
+    option value='472' Saudi-Arabien
+    option value='474' Singapur
+    option value='475' Syrien
+    option value='476' Thailand
+    option value='477' Usbekistan
+    option value='479' China
+    option value='482' Malaysia
+    option value='483' Timor-Leste
+    option value='499' Übriges Asien
+    option value='523' Australien
+    option value='524' Salomonen
+    option value='526' Fidschi
+    option value='527' Cookinseln
+    option value='530' Kiribati
+    option value='531' Nauru
+    option value='532' Vanuatu
+    option value='533' Niuea
+    option value='536' Neuseeland
+    option value='537' Palau
+    option value='538' Papua-Neuguinea
+    option value='540' Tuvalu
+    option value='541' Tonga
+    option value='543' Samoa
+    option value='544' Marshall-Inseln
+    option value='545' Mikronesien
+    option value='599' Übriges Australien / Ozeanien
+    option value='997' Staatenlos
+    option value='998' Ungeklärt
+    option value='999' Ohne Angabe
+    option value='170' Serbien
+    option value='140' Montenegro
+    option value='150' Kosovo
+    option value='277' Sudan
+    option value='278' Südsudan
+    option value='185' Britisches Überseegebiet
+    option value='411' Hongkong
+    option value='412' Macau
+    option value='465' Taipeh
+    option value='242' Cabo Verde

+ 30 - 0
views/schulform.slim

@@ -0,0 +1,30 @@
+.form-group.form-group-lg class=("has-error" if keys.include?("SchuelerBasisdaten.dat[LS Schulform]"))
+  label.control-label for='SchuelerBasisdaten.dat[LS Schulform]'
+    |Derzeitige Schule bzw. letzte Schulform
+  select.select.form-control id='SchuelerBasisdaten.dat[LS Schulform]' name='SchuelerBasisdaten.dat[LS Schulform]'
+    option value="" bitte auswählen
+    option value='H' Hauptschule
+    option value='V' nicht umorganisierte Volksschule
+    option value='S' Förderschule im Bereich G/H
+    option value='R' Realschule
+    option value='GE' Gesamtschule
+    option value='FW' Freie Waldorfschule
+    option value='GY' Gymnasium
+    option value='WB' Weiterbildungskolleg
+    option value='BK' Berufskolleg
+    option value='SB' Förderschule im Bereich Berufskolleg
+    option value='SR' Förderschule im Bereich Realschule
+    option value='SG' Förderschule im Bereich Gymnasium
+    option value='FW' Hibernia
+    option value='S' Schule für Kranke
+    option value='AS' Ausländische Schüler, die zugewandert sind
+    option value='HU' Hochschule, Universität
+    option value='LB' Förderschule, Schwerpunkt Lernen
+    option value='SO' Sonstige Förderschulen
+    option value='SP' Ausgesiedelte Schüler, die zugewandert sind
+    option value='WZ' Wehrdienst bzw. Zivildienst
+    option value='XB' Berufstätigkeit, z.B. vor Besuch einer Fachschule
+    option value='XS' Sonstige Schulen bzw. keine Schule
+    option value='GM' Gemeinschaftschule
+    option value='SK' Sekundarschule
+    option value='PS' Schulversuch PRIMUS

Някои файлове не бяха показани, защото твърде много файлове са промени