Alle Beiträge von Werner

Logging in Griffon 2
using Log4j

I’ve done quite some Java programming for the Desktop with JavaFX lately. For that I’ve jumped into using the Griffon Framework and I really love it.

For logging, it comes with SLF4J (the Simple Logging Facade for Java), so you can plug in the actual framework of your chioce – and I gave it a try with Log4J 2 . Since it took me a little while to get it all working the way I wanted it to, here are the basic steps that worked for me:

first, in build.gradle, you have to put

    runtime('log4j:log4j:1.2.17') {
        exclude group: 'ant',         module: 'ant-nodeps'
        exclude group: 'ant',         module: 'ant-junit'
        exclude group: 'ant-contrib', module: 'ant-contrib'
    }
    runtime "org.slf4j:slf4j-log4j12:${slf4jVersion}"

then, create griffon-app/resources/log4j.properties:

log4j.rootLogger=TRACE,myapp

log4j.appender.myapp=org.apache.log4j.ConsoleAppender
log4j.appender.myapp.Target=System.out
log4j.appender.myapp.layout=org.apache.log4j.PatternLayout
# log4j.appender.myapp.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{8}:%L - %m%n
log4j.appender.myapp.layout.ConversionPattern=%-5p %c{8}:%L - %m%n

# show tool versions at startup:
log4j.logger.org.codehaus.griffon.runtime=INFO

# turn down noise on griffon's internals:
log4j.logger.org.codehaus=WARN
log4j.logger.griffon=WARN
# you might need those when searching for a problem
#log4j.logger.griffon.core=WARN
#log4j.logger.griffon.util=WARN
#log4j.logger.griffon.javafx=WARN
#log4j.logger.org.codehaus.griffon=WARN

# logs the app itself:
log4j.logger.griffon.app=TRACE

That is it! This of corse is just a very basic configuration but it is exactly what I need and use during development – for deployment, you just need to change the ConsoleAppender to e.g. a RollingFileAppender or whatever you prefer. And you may change the app’s logging level to something less noisy.

Now  just like in Grails, you get a log variable injected into your MVC-members
and you can  for example…

log.info "hello world!"

Quite simple, IMHO.

HTH! cheers, weHe

Vaadin on Grails 3.x

[see my update for Vaadin 8 at the bottom!]

Over the last ten years I’ve been doing quite a lot of work with Grails and ZK plugged-in  and got great results – and I got quite used to using a component based UI toolkit in Grails. Unfortunately the ZK plugin for Grails only supports the Grails 2.x branch (with it’s latest update in Sept 2014) so that ceased to be an option for new projects.

Vaadin on the other hand also is a vibrant and powerful component toolkit for Java, so I’d fancy it as a replacement… but  so far, Ondrej Kvasnovsky’s Vaadin-Plugin was also only available for the Grails 2.x branch which is at the time being (April 2017) over 2 years  behind… so unfortunately, Vaadin wasn’t really an option for a component based UI toolkit in Grails either lately – quite a dire situation for a Grails addict.

But now Ondrej has finally finished his version of the Vaadin-Plugin for the current Grails 3.x branch. It plugs Vaadin 7.7.8 into Grails 3.2.8 (or later) – while Vaadin 8 is already supported by a later version of the same plugin right now (see note at the bottom).

The Vaadin-Website has a great Getting-Started Tutorial at vaadin.com/tutorial which walks you step by step through the creation of a customer list and form and even comes with a set of videos – and which I recommend as a good first introduction to Vaadin with Java. I’ve created a Groovy-vied version of this tutorial using Gorm against H2-DB  in order to test the old version of the Vaadin plugin against Grails 2.x and documented the result in this blog post.

For the new Grails3- Vaadin-Plugin I’ve adapted this tutorial project – and the plugin seems to work just well – YEAH! Here is how to put this togehter:

As of now, the new plugin’s documentation / tutorial is only on the plugins issues-pages on github – you’ll need to follow the steps therein, but note:

  • you might install Grails 3.2.8 using sdkman
  • my demo project uses the package and name of ‚demo.grails3vaadin‘,
    so instaed of ‚grails create-app sample-project‘,
    you ‚grails create-app demo.grails3vaadin‘
  • you don’t need Spring, so seed your project
    using ‚gradle vaadin-quickstart‘
  • then you drop in the files of my demo-project
  • notice that in VaadinConfig.groovy I’ve changed
    the openSessionInViewFilter to use hibernate5

That should do the job!
All the best & cheers, weHe

Update:  since version 2 the plugin uses Vaadin 8
(as opposed to 7.7.8 in the earlier version used here):

 

 

Experten: Europas Verwaltungen zu abhängig von Microsoft

Quelle: ORF.AT am So, 9.April 2017

Die öffentlichen Verwaltungen in Europa nutzen auf ihren Computern fast ausschließlich Software des US-Konzerns Microsoft. Diese Abhängigkeit birgt nach Ansicht internationaler Experten große Risiken, wie das Journalistenteam Investigate Europe und der Berliner „Tagesspiegel“ heute berichteten.

Nach Ansicht des früheren Abteilungsleiters für Informationstechnik und Cybersicherheit im deutschen Innenministerium, Martin Schallbruch, sind viele staatliche Verwaltungen so abhängig von Microsoft, „dass sie nicht mehr die Wahl haben, welche Software sie nutzen wollen“. Schallbruch zufolge laufen die Staaten Europas „Gefahr, die Kontrolle über ihre eigene IT-Infrastruktur zu verlieren“.

„Digitale Souveränität“ Europas in Gefahr

Michael Waidner, Direktor des Fraunhofer-Instituts für sichere Informationstechnik und einer der führenden europäischen Experten für Cybersicherheit, beklagte im Gespräch mit dem Rechercheteam den Verlust der „digitalen Souveränität“ Europas. Staaten und die Europäische Union müssten „in der Lage sein, zu testen, ob Hardware und Software ihrer Informationstechnik nur das tun, was sie sollen und nichts sonst“.

Darum sollten alle Staaten darauf bestehen, dass „ihre Experten alle nötigen Informationen haben, um die Software in sicherheitsempfindlichen Sektoren zu testen.“

„Zugang zu Quellcode unverzichtbar“

Das sei aber mit den Produkten von Microsoft bisher nicht möglich, heißt es weiter. Das US-Unternehmen hält grundsätzlich den Quellcode für seine Programme geheim. Doch nur damit können Fachleute nachvollziehen, wie Programme konstruiert sind, und gegebenenfalls Sicherheitslücken finden.

Das Europäische Parlament hatte bereits 2015 gefordert, dass die EU und ihre Mitgliedsländer bei Software für die staatliche Verwaltung die Offenlegung des Quellcodes von den Anbietern verlangen. Doch sowohl die EU-Kommission als auch die Regierungen verweigern die Umsetzung des Parlamentsbeschlusses. Microsoft verfügt in vielen EU-Staaten über hochrangige Kontakte in die Regierungsapparate, ergaben die Recherchen von Investigate Europe.


Quelle: ORF.AT am So, 9.April 2017
voller Text in: Der Tagesspiegel, Europas fatale Abhängigkeit von Microsoft
weiters: Futurezone,  Europas Verwaltungen sind von Microsoft zu abhängig

Vaadin on Grails 2.x

I’ve been doing quite a lot of work with Grails and Zkoss over the last ten years and got great results.

Recently I came across Vaadin several times and got quite curious to see how Grails and Vaadin would go together. So I sat down and read Vaadin’s great Java Tutorial (highly recommended!) and used  Ondrej Kvasnovsky’s Vaadin-Plugin  to run the code in Grails after simplifying it for Grails / Groovy.

As the Plugin right now just works on Grails 2.x, I used the most recent release of the Grails 2.x branch, Grails 2.5.5 (a release of the plugin for Grails 3.x is promised).

Here’s my entire project as a ZIP archive!

Other than the pure Java version, my Grails version does in fact persist the Customer data! BootStrap.groovy checks if it runs in development mode and creates the test customers. The data source defiition uses H2-Db with a ‚create-drop‘ policy, so the DB is created anew and populated on each start of the app. Both the domain and the service classes are much smaller due to Grail’s instrumentation like e.g. for the hibernate persistence, automatic getters & setters, and all the other magic.

Have a look at the code – thanks to Grails and Groovy, it is much cleaner and leaner than the original Java version, at least IMHO.

src/groovy/my/app/CustomerStatus.groovy:

package my.app

public enum CustomerStatus {
    ImportedLead, NotContacted, Contacted, Customer, ClosedLost
}

grails-app/domain/my/app/Customer.grrovy:

package my.app

public class Customer implements Comparable {

    String firstName = ""
    String lastName = ""
    Date birthDate
    CustomerStatus status = CustomerStatus.ImportedLead;
    String email = ""


    static constraints = {
        firstName blank: false, nullable: false, maxSize: 50
        lastName blank: false, nullable: false, maxSize: 50
        email blank: false, nullable: false, maxSize: 50, email: true
    }

    static mapping = {
        table 'customer'
        version false
        firstName column: 'firstname'
        lastName column: 'lastname'
        email column: 'email'
    }

    public String toString() {
        return firstName + " " + lastName;
    }

    int compareTo(Object other) {
        this.toString().compareTo(other.toString())
    }

}

grails-app/services/my/app/CustomerService.groovy:

package my.app

class CustomerService {

    private static TEST_DATA = [
            "Gabrielle Patel", "Brian Robinson", "Eduardo Haugen",
            "Koen Johansen", "Alejandro Macdonald", "Angel Karlsson", "Yahir Gustavsson", "Haiden Svensson",
            "Emily Stewart", "Corinne Davis", "Ryann Davis", "Yurem Jackson", "Kelly Gustavsson",
            "Eileen Walker", "Katelyn Martin", "Israel Carlsson", "Quinn Hansson", "Makena Smith",
            "Danielle Watson", "Leland Harris", "Gunner Karlsen", "Jamar Olsson", "Lara Martin",
            "Ann Andersson", "Remington Andersson", "Rene Carlsson", "Elvis Olsen", "Solomon Olsen",
            "Jaydan Jackson", "Bernard Nilsen"
    ]

    /**
     * retrieves customers and filters
     * @param filter optional, to be contained in customer.toString(), case ignored
     * @return customers matched - or all
     */
    List<Customer> findAll(String filter=null) {
        List<Customer> rtn = Customer.findAll()
        if (filter) {
            filter = filter.toLowerCase()
            rtn = rtn.findAll {Customer cust -> cust.toString().toLowerCase().contains(filter)}
        }
        rtn.sort()
    }

    /**
     * called by BootStrap
     * @param log
     */
    public static void createTestCustomers(log) {
        log.trace "storing customer data:"
        listTestCustomers().each { Customer c ->
            log.trace " '${c}'"
            c.save()
        }
    }
         private static List<Customer> listTestCustomers() {
            List<Customer> rtn = []
            Random r = new Random(0);
            for (String name : TEST_DATA) {
                String[] split = name.split(" ")
                Customer c = new Customer()
                c.firstName = split[0]
                c.lastName = split[1]
                c.email = split[0].toLowerCase() + "@" + split[1].toLowerCase() + ".com"
                c.status = CustomerStatus.values()[r.nextInt(CustomerStatus.values().length)]
                Calendar cal = Calendar.getInstance()
                int daysOld = 0 - r.nextInt(365 * 15 + 365 * 60)
                cal.add(Calendar.DAY_OF_MONTH, daysOld)
                c.birthDate = cal.getTime()
                rtn << c
            }
            rtn
        }


}

src/groovy/my/app/MyGui.groovy:

package my.app

import com.vaadin.annotations.Theme
import com.vaadin.data.util.BeanItemContainer
import com.vaadin.server.FontAwesome
import com.vaadin.ui.Button
import com.vaadin.ui.CssLayout
import com.vaadin.ui.Grid
import com.vaadin.ui.HorizontalLayout
import com.vaadin.ui.TextField
import com.vaadin.ui.UI
import com.vaadin.ui.VerticalLayout
import com.vaadin.server.VaadinRequest
import com.vaadin.grails.Grails
import com.vaadin.ui.themes.ValoTheme

@Theme('mytheme')
class MyUI extends UI {

    private Grid grid = new Grid()
    private CustomerService customerService = Grails.get(CustomerService)
    private TextField filterText = new TextField()
    private CustomerForm form = new CustomerForm(this)

    protected void init(VaadinRequest vaadinRequest) {
        VerticalLayout layout = new VerticalLayout()

        filterText.setInputPrompt("filter by name...")
        filterText.addTextChangeListener { evt -> grid.containerDataSource =
                    new BeanItemContainer<Customer>(Customer.class, customerService.findAll(evt.text) )
        }

        Button clearFilterTextBtn = new Button(FontAwesome.TIMES)
        clearFilterTextBtn.description = "clear the current filter"
        clearFilterTextBtn.addClickListener { evt ->
            filterText.clear()
            updateList()
        }

        CssLayout filtering = new CssLayout()
        filtering.addComponents(filterText, clearFilterTextBtn)
        filtering.styleName = ValoTheme.LAYOUT_COMPONENT_GROUP

        Button addCustomerBtn = new Button("Add new customer");
        addCustomerBtn.addClickListener { evt ->
            grid.select(null)
            form.customer = new Customer()
        }

        HorizontalLayout toolbar = new HorizontalLayout(filtering, addCustomerBtn)
        toolbar.spacing = true
        grid.setColumns('firstName', 'lastName', 'email')

        HorizontalLayout main = new HorizontalLayout(grid, form)
        main.spacing = true
        main.setSizeFull()
        grid.setSizeFull()
        main.setExpandRatio(grid,1)
        layout.addComponents(toolbar, main)

        updateList()
        layout.margin = true
        content = layout
        grid.addSelectionListener { evt ->
            if (evt.selected.empty) {
                form.visible = false
            } else {
                Customer customer = (Customer) evt.selected.iterator().next()
                form.customer = customer
            }
        }
        form.visible = false
    }

    public void updateList() {
        List<Customer> customers = customerService.findAll(filterText.value)
        grid.setContainerDataSource(new BeanItemContainer<>(Customer.class, customers))
    }

}

src/groovy/my/app/CustomerForm.groovy:
(localize birthdate to your own locale and date format in the constructor)

package my.app

import com.vaadin.data.fieldgroup.BeanFieldGroup
import com.vaadin.event.ShortcutAction.KeyCode
import com.vaadin.ui.Button
import com.vaadin.ui.FormLayout
import com.vaadin.ui.HorizontalLayout
import com.vaadin.ui.NativeSelect
import com.vaadin.ui.PopupDateField
import com.vaadin.ui.TextField
import com.vaadin.grails.Grails
import com.vaadin.ui.themes.ValoTheme

class CustomerForm extends FormLayout {

    private CustomerService service = Grails.get(CustomerService)
    private Customer customer
    private MyUI myUI

    private TextField firstName = new TextField("First name")
    private TextField lastName = new TextField("Last name")
    private TextField email = new TextField("Email")
    private NativeSelect status = new NativeSelect("Status")
    private PopupDateField birthdate = new PopupDateField("Birthday")
    private Button save = new Button("Save")
    private Button delete = new Button("Delete")

    public CustomerForm(MyUI myUI) {
        this.myUI = myUI
        status.addItems(CustomerStatus.values())
        // birthdate.locale = Locale.GERMAN
        // birthdate.dateFormat = 'dd.MM.yyyy'
        save.styleName = ValoTheme.BUTTON_PRIMARY
        save.setClickShortcut(KeyCode.ENTER)    // property assignment (=) breaks code!
        delete.styleName = ValoTheme.BUTTON_DANGER
        setSizeUndefined()
        HorizontalLayout buttons = new HorizontalLayout(save, delete)
        buttons.spacing = true
        addComponents(firstName, lastName, email, status, birthdate, buttons)
        save.addClickListener { evt -> this.save() }
        delete.addClickListener { evt -> this.delete() }
    }

    public void setCustomer(Customer customer) {
        this.customer = customer;
        BeanFieldGroup.bindFieldsUnbuffered(customer, this);
        delete.visible = customer.id>0  // Show delete button for only customers already in the database
        this.visible = true
        firstName.selectAll()
    }

    private void delete() {
        customer.delete(flush:true)
        myUI.updateList()
        this.visible = false
    }

    private void save() {
        customer.save()
        myUI.updateList()
        this.visible = false
    }
    
}

grails-app/conf/BootStrap.groovy:

import my.app.CustomerService
import grails.util.Environment

class BootStrap {
    CustomerService customerService	// spring dependency injection!

    def init = { servletContext ->

        if (Environment.current.name == 'development') {
            customerService.createTestCustomers(log)
        }
    }

    def destroy = {
    }
}

You will also need these – they are in the archive:

grails-app/conf/BuidConfig.groovy
grails-app/conf/Config.groovy
grails-app/conf/DataSource.groovy
grails-app/conf/UrlMapping.groovy
grails-app/conf/VaadinConfig.groovy

Hope it helps!
cheers, weHe

— end,

 

 

 

Schau.auf.Bregenz

Webanwendung nach dem Modell von ‚Schau.auf.Linz‘

Schau auf Bregenz“ ist ein Internet-Angebot, das Bürgerinnen und Bürgern ermöglicht, Probleme, Mängel und Verbesserungsvorschläge online zu melden. Der Ort wird auf dem Bregenzer Stadtplan markiert, es ist auch möglich Fotos zum jeweiligen Problem online zu stellen. Die Idee und das Konzept beruhen auf der Onlineplattform „Schau auf Linz“ der Oberösterreichischen Landeshauptstadt Linz.
Die inhaltliche Befüllung erfolgt durch die Nutzerinnen und Nutzer. Es ist sowohl möglich, sich zu registrieren als auch anonym Anliegen zu melden (Nutzer/in).

(Impressum von Schau.auf.Bregenz)

Umfang:
  • Entgegennahme von Meldungen mit Ort und optional mit Foto,
    Bearbeitung der Meldungen durch das städtische Bürgerservice,
    Verfolgung der Meldungen via Bearbeitungs-Status, Listen-Filter etc
  • Benutzer-Anmeldung & -Verwaltung, Benachrichtigung per Email
  • Verwaltungs-Interface für die redaktionelle Betreuung, Benutzerverwaltung, Standard-Antworten, Strassen- & Hausnummern-Upload, etc
  • Integration der städtischen Landkarte,
    Verknüpfung der Strassennamen und Hausnummern mit der Karte,
    Steuerung der Kartenfunktionen wie Zoom, Pan, Pins setzen, etc
  • Service-Schnittstelle (API) zur Unterstützung der mobilen App
    mit Benuzter-Anlage, Meldungs-Feed, Neu-Meldung, etc
Ausführung:
  • 2012/2013, ca. 5,5 kZeilen Code
  • erstellt als Java-Webanwendung mit Grails gegen MySql
  • programmiert in Groovy,
    Web-2.0 Steuerung IN Java-/Coffee-Script
  • Karten-Integration via OpenLayers-Toolkit,
    angesteuert mit CoffeeScript
  • Bild-Bearbeitung mit ImageMagick
  • Textseiten (Impressum, DasIst, Hilfe)
    und Email-Schablonen am Dateisystem wartbar
SlideShow:

Benützen sie die Tastatur, Pfeile, oder die Punktleiste zum Blättern,
ggfs auch den Vollbildmodus.

Start-Seite, Meldungen-ListeMeldung-DetailÜbersicht Meldungen - Karte mit Pins, Liste der Meldungs-Titelneue Meldungneue Meldung - Karte eingeblendetRedaktion: Meldung bearbeitenRedaktion: Antwort-TexteRedaktion: Benutzer-ListeTextseite - Das ist "Schau auf Bregenz"Textseite - HilfeTextseite - Impressum

 

Kanal

Webanwendung zur Abrechnung
gewerblicher Kanalgebühren
für das Rathaus Bregenz

Umfang:
  • Verwaltung der Abnehmer-Stammdaten und
    ihre Verknüpfung mit den entsprechenden Konten der BuHa
  • jährlicher Import der Verbräuche pro Zähler via CSV-Importdatei von den Stadtwerken (‚externe Verbräuche‘)
  • Führung interner Verbrauchs-Sätze
    für Subzähler, Eigenwasser- & Freiwasser-Mengen
  • Erstellung von Serienbriefen
    zur Meldung der Subzähler-Stände, Frei- & Eigenwassermengen
  • Erstellung der Abrechnungen inkl Vorschreibungen
  • Verbuchung durch Erstellung einer Import-Datei für die BuHa

 

  • Anschluß an das Dokumentenmanagement-System (Dms3 & eAkteOpen):
    alle An/Abmeldungen, Abrechnungen, Serienbriefe werden zeitgleich als PDF archiviert und stehen unabhängig von der Fachanwendung zur Verfügung
    (Organisation & Zugriffskontrolle via eAkten für die Abnehmer)
  • Anschluss an die Buchhaltung (K5 Kommunalmanagement): Verknüpfung jedes Abnehmers  mit einem BuHa-Konto; die Anschrift wird aus der BuHa gelesen; Buchungen werden als XML-Datei für den Import in die BuHa erstellt.
  • Anschluß an das Benutzerverzeichnis des Rathauses
    (Microsoft Active Directory via LDAP)
  • die Belege (Serienbriefe & Vorschreibungen) werden mit Adress-Informationen (als Metadaten) archiviert und können von dort elektronisch versandt werden (Duale Zustellung des Bundes, an Email oder ggfs Ausdruck in externer Druckstrasse samt Postversand)

 

Umsetzung:
  • erstellt 2010ff, ca 2,5kZeilen Code
  • Ausführung als Java-Webanwendung mit Grails und ZKoss (Formulare)
SlideShow:

Benützen sie die Tastatur, Pfeile, oder die Punktleiste zum Blättern,
ggfs auch den Vollbildmodus.

Vor dem Login, Build-InfoWillkommen, Anwendungs-Status, Build-InfoProgramm-EinstellungenAbnehmer-Browser, seitenweise und mit FilterAbnehmer-Formular, Aktions-Kombo offenVerbrauchs-Satz offen zum Abnehmer-FormularAbnehmer-Formular mit Aktions-Kombo offenStarter Serienbrief-ErstellungSerienbrief-Ansicht Eigenwasser-MeldungSerienbrief-Ansicht Freiwasser-MeldungStarter Maildaten-Export CSVStarter jährlicher Upload externer Verbrauchs-SätzeVerbrauch Browser, seitenweise & mit Filterninterner Verbrauchs-Satz, Aktions-Kombo offenBuchungs-ListeStarter für AbrechnungslaufStarter f. Dateiexport BuchungssätzeBerichte-MenüBericht: Vorrauszahlungen vs aktueller VerbrauchBericht: Verbrauchs-Sätze mit AbnehmernBericht: AbnehmerBericht: Abnehmer ohne VerbauchssätzeBericht: Verbauchssätze ohne AbnehmerAbehmer mit BuHa-Konten mit mehrfachen Folgenummern

KiGa

Kindergarten Programm –
Webanwendung für das
Rathaus Bregenz

Unterstützung der Aufgaben zur Verrechnung in der Dienststelle
und aller Abläufe vor Ort beim Betrieb in den Kindergärten.

[ Videos und Diaschau sind am Ende der Seite!]
[Videos & Slideshow at the bottim of the page!]

Ausführung:
  • mehrere Workshops zur Anforderungs-Analyse, Anwendungs-Entwurf
  • ca 2012-2015, für FireFox; knappe 20 kZeilen Code
  • vier getrennte Schnittstellen: für die Dienststelle, für die Kindergarten-Leitung,
    für die Gruppen, zusätzlich mobiles Tablet-Interface für die Gruppe
  • als Java Webanwendung mit Grails gegen MySql, programmiert in Groovy
  • Web2.0 Formulare in ZKOSS
  • Web2.0 Dialoge mit jQuery, jQueryUI und CoffeeScript

 

  • Anschluß an das Dokumentenmanagement-System (Dms3 & eAkteOpen):
    alle Stammdaten & Geschäftsfälle werden zeitgleich als PDF archiviert
    und stehen unabhängig von der Fachanwendung zur Verfügung
    (Organisation & Zugriffskontrolle via eAkten für Kind und Rechnungsempfänger)
  • Anschluss an die Buchhaltung (K5 Kommunalmanagement): Verknüpfung jedes Kindes mit einem BuHa-Konto; Anschrift des Rechnungsempfängers wird aus der BuHa gelesen (statt aus den Stammdaten des Kindes); Buchungen werden als XML-Datei für den Import in die BuHa erstellt.
  • Anschluß an das Benutzerverzeichnis des Rathauses
    (Microsoft Active Directory via LDAP)
  • Rechnungen, Rundschreiben und einzelne Mitteilungen werden mit Adress-Informationen (als Metadaten) archiviert und können von dort elektronisch versandt werden (Duale Zustellung des Bundes, an Email oder ggfs Ausdruck in externer Druckstrasse samt Postversand)
  • Erstellung der monatlichen Rechnungen über die bestellten Dienstleistungs-Module samt Kostenersätzen für die tatsächlich konsumierten Essen; Erstellung als PDFs, Archivierung in der eAkte des Rechnungsempfängers, elektronische Zustellung.
  • Abbildung in den Kontenrahmen: eigene Steuer-Arten (BuHa-Konten) für jede Modul-Art pro Kindergarten (optional auch pro Gruppe).
Anwendungsfälle für die Dienststelle (u.a.):
  • Verwaltung der KiGas & ihrer Gruppen-Räume,
    Zuordnung der Steuerarten zu den KiGas (oder ihrer Räume)
  • Verwaltung der Benutzer und ihrer Zugriffsrechte auf die KiGas bzw Gruppen
  • Verwaltung der Module
  • Überprüfung der durch die KiGa-Leitungen angelegten Kinder-Stammdaten,
    Freigabe von Änderungen durch die KiGa-Leitungen an den Modul-Einsätzen bei den Kindern
  • Verknüfung der Kinder mit den zugehörigen BuHa-Konten
  • Jahresabschluß, Listen, Statistiken
  • Verwaltung Team-Infos
  • Verwaltung Vorlagen / Wissensbasis
  • Verwaltung Mischtexte für Belege, Hilfeseiten für Dialoge,
    Willkommensmeldung Startschirm
Anwendungsfälle für die KiGa-Leitungen (u.a):
  • Bearbeiten der Gruppen-Namen, -Bilder, -Kontaktinfos etc
  • Anmeldungen der Neu-Zugänge erfassen,
    mit Stammdaten, Kontakten, Module
  • Verwaltung Termine Erstgespräche, Anmelder-Mailings für Erstgespächs-Termine
  • Führung der  wochenweisen pädagogischen Planungstexte der Gruppen:
    Langzeitplanung, Wochenplan, Reflexion, Sprachförderung
  • Bearbeitung / Änderung der Kinder-Stammdaten, Kontakte etc
  • datierte Dokumentations-Einträge für einzelnes Kind oder ganze Gruppe
  • Aktennotzen f. einzelnes Kind, Gruppe oder ganzen KiGa (PDF archiviert)
  • Elternbrief für einzelnes Kind, Gruppe oder ganzen KiGa (PDF archiviert, Duale Zustellung)
  • Kurznachricht an einzelnes Kind/Eltern  oder alle Kinder/Eltern des KiGa (SMS)
  • Gruppen-Änderung eines Kindes
  • zukünfiger KiGa-Wechsel des Kindes (wg Prognosen)
  • Erstellung bzw Widerruf von Abholer-Vollmachten zum Kind
  • Führung / Verwaltung von Listen mit den Kindern (gefiltert, Attribute wählbar)
  • Kontrolle der Essen gruppen- oder monatsweise
  • Abruf Team-Infos
  • Abruf Voragen / Wissensbasis
  • Berichte, Prognosen (Personalbedarf),
    Stammdaten-Download (CSV), etc…
Anwendungsfälle für die Gruppen (u.a.):
  • Führung der  wochenweisen pädagogischen Planungstexte der Gruppen:
    Langzeitplanung, Wochenplan, Reflexion, Sprachförderung
  • Bearbeitung / Änderung der Kinder-Stammdaten, Kontakte, persönliches Bild, etc
  • Führung der  wochenweisen pädagogischen Planungstexte:
    Langzeitplanung, Wochenplan, Reflexion, Sprachförderung
  • datierte Dokumentations-Einträge für einzelnes Kind oder ganze Gruppe
  • Aktennotizen für einzelnes Kind oder ganze Gruppe (PDF archiviert)
  • Elternbrief für einzelnes Kind oder ganze Gruppe (PDF archiviert, Duale Zustellung)
  • Kurznachricht an einzelnes Kind/Eltern  oder alle Kinder/Eltern der Gruppe (SMS)
  • Führung / Verwaltung von Listen mit den Kindern (gefiltert, Attribute wählbar)
  • Abruf Team-Infos
  • Abruf Vorlagen / Wissensbasis
  • Umschalten des Tagesabschnittes für die Kinderliste
  •  Änderung Anwesenheits-Status der Kinder (kommt/geht) mit zeilicher Verbuchung,
    Erfassung von Entschuldigungen, ggfs tägliche Erfassung der Essen
  • Übernahme Kinder aus anderen Gruppen des selben KiGas
  • datierte Team-Notizen innerhalb der Gruppe
  • Berichte, Geburtstags-Liste, Tagesblatt leer,
    Stammdaten-Download (CSV), etc…
Tablet-Version:

vereinfachte Schittstelle für die Gruppe zur Bewegung im Raum

  • Status-Änderungen (kommt / geht, entschuldigt)
  • Buchung von Essen und Freigabe
  • Abruf Stammdaten-Blatt des Kindes (mit Kontakte-Infos, Abholer-Infos)
  • Übernahme der Kinder anderere Gruppen des selben KiGas
  • datierte Dokumentations-Einträge für einzelnes Kind
  • Umschalten des Tagesabschnittes für die Kinderliste
  • datierte Team-Notizen innerhalb der Gruppe

Die externen Abhängigkeiten auf Benutzer-Verzeichnis, Buchhaltung und die eAkte sind im Code gekapselt und könnten durch vergleichbare andere ersetzt werden.

Demoversion auf Anfrage:

Auf Anfrage kann ich ein Docker-Image zur Verfügung stellen, das ohne weitere Abhängigkeiten lauffähig ist: es enthält eine Linux-VM mit Java, Tomcat und die KiGa-Anwendung, MySql mit anonymisierten KiGa-Daten und mit den Daten einer Ersatz-Buchhaltung, ein Fake-LDAP-DropIn mit CSV-Daten.

Bei Interesse senden sie mir bitte eine Nachricht und ich nehme mit Ihnen Kontakt auf.

Video: Gruppen-Pädagogin:
Video: Kindergarten-Leiterin:
 Video: Dienststelle:
 SlideShow: Tablet-Ansicht der Gruppe

Benützen sie die Tastatur, Pfeile, oder die Punktleiste zum Blättern,
ggfs auch den Vollbildmodus.

Tablet-Ansicht der GruppeSchaltflächen der Tablet-AnsichtStammdaten-Ansicht eines KindesJournal-Eintrag (Dokumentation) für ein KindGruppen-WechselTeam/TagesnotizTagesabschnitt ändernÜbernahme der Kinder aus anderen Gruppen

 

 

employee

„employee ist ein externer Beratungsservice, den Unternehmen ihren Führungskräften und MitarbeiterInnen zur Verfügung stellen. Diese nutzen employee, um berufliche und private Probleme zu lösen. Dadurch werden die Gesundheit, die Leistungsfähigkeit und die Motivation der Führungskräfte und der MitarbeiterInnen gestärkt.

Im Mittelpunkt des externen Beratungsservices stehen individuelle Beratungsgespräche mit qualifizierten FachberaterInnen. Durch deren systemischen Ansatz gelingt die effektive Lösungen in kurzer Zeit.“ (website www.employee.at Stand Ende 2016)

Ich habe für employee im Zeitraum 2006-2009 eine Webanwendung erstellt, als nach einer Zeit des Wachstums der Firma der Aufwand für die Organisation der Abläufe und deren Qualität aus dem Ruder zu laufen begann.

Umfang:
  • Stammdaten: Verwaltung von Konzernen & Verträgen,Standorten, Ressourcen, Produkten, BeraterInnen
  • Mehrsprachigkeit: Verwaltung von Sprachen, Übersetzungen & Benachrichtigungen
  • Verwaltung von zeitlichen Verfügbarkeiten pro Ort durch die BeraterInnen
  • zentrale Erfassung von Terminen (Telefon-Hotline),
    Zuordnung von verfügbaren Zeiten bzw Erstellung von Termin-Anfragen an Berater
  • Führung von Ressource-Kalendern, Buchung von Ressourcen mit den Terminen
  • laufende Kommunikation mit Klienten und BeraterInnen (SMS und / oder Mail)
  • div. Auswertungen, besonders nach Konzernen(Verträgen) und nach Beratern
Ausführung:
  • geschrieben in PHP 3 gegen MySQL (Sql-Zugriffe), reine HTML-Formulare (Web1.0)
  • Views isoliert mit der Smarty Template Engine
  • JavaScript-Menü
  • Termine-Download im iCal Calender-Format
  • SMS-Zustellung via SMS.AT
  • Statistik-Daten optional als CSV-Download
  • separate Installation einer Ausfalls-Server-Instanz,
    automatische DatenReplikation, Steuerung aus der Anwendung
SlideShow:

Benützen sie die Tastatur, Pfeile, oder die Punktleiste zum Blättern,
ggfs auch den Vollbildmodus.

Vor der AnmeldungWillkommen & Termine-StatusProgramm-MenüAdministrator-Menü & Stammdaten...Berater-Menü & Berichte...Operator-Menü & Termine...Operator-Menü & Anfragen....Operator-Menü & Berichte....Operator-Menü & Suche...Hilfe-Menü, darunter: 'über'Programm-EinstellungenBeraterInnen-Vewaltung: ListeBeraterInnen-Verwaltung: MaskeStandorte-Verwaltung: Maske, Liste darunterProdukte verwalten: Maske, Liste darunterTermine-Liste (Operator)Verfügbarkeiten anlegen aus VorlageVerfügbarkeinen verwalten: Maske & Liste darunterListe TerminanfragenAnzeige TerminanfrageTerminanfrage bearbeitenneuen Termin anlegen: Startneuer Termin: Terminsuche (negativ)neuer Termin: als Anfrage an BeraterDatums-Auswahl, hier im Bericht-FilterAuswertungen, zB Arbeitszeiten der BeraterInnenBenachrichtigungen bearbeiten: verfügbare TextschablonenBenachrichtigungen bearbeiten: Textschablone bearbeiten

— Ende =:-)

SozDok

WebAnwendung für das Case-Management
im Sozialamt des Rathauses Bregenz
zur Dokumentation aller Klienten, Besuche & Massnahmen
Umfang:
  • Klienten-Stammdaten, Dokumentation der Besuche & Massnahmen
  • aus der Anwendung konfigurierter Katalog an Massnahmen
    mit Wiedervorlagen / Terminwarnungen
  • Statistik mit Altersgruppen (konfigurierbar),
    Massnahmen in sparse-Matrix zur Weiterverarbeitung in Excel,
    wahlweise als CSV-Download und als Pivot-Tablelle (f. Excel)
Ausführung:
  • ab 2011, ca 3kZeilen Code.
  • gebaut als Java WebAnwendung mit Grails ggn MySql, Formulare mit ZKOSS
  • Anschluß an das Dokumentmanagement-System & eAkte (OTS Dms3/eAkte):
    Stammdaten & alle Geschäftsfälle werden kontinuierlich als PDFs archiviert
    und stehen unabhängig von der Anwendung langfristig zur Verfügung
  • Anschluß an das  Benutzerverzeichnis  (per LDAP an das lokale MS-ActiveDirectory)
  • Variabel konfigurierbare Massnahmen-Typen (‚QuickForm-DSL‘) mit entsprechenden automatisch erstellten Formularen – siehe Auszug aus der Massnahmen-Konfiguration am Ende der Seite.
ScreenShots:

Benützen sie die Tastatur, Pfeile, oder die Punktleiste zum Blättern,
ggfs auch den Vollbildmodus.

Startschrim mit Build- & Anwendungs-StatusLogin-Maske (vorbefüllt durch Firefox)Willkommen, ggfs mit Terminwarnungen f. MassnahmenKlienten-Formular, Anlegen eines neuen Klientenneuen Kontakt zu bestehendem Klienten eintragenneue Massnahme f. bestehenden Klienten eintragenneue Massnahme f. bestehenden Klienten eintragenKlienten-Browser: bestehende Klienten seitenweise, SuchfelderKlienten-Ansicht: Klienten-Stammdaten & KontaktKlienten-Stammdaten, Kontakt & MassnahmeKlienten-Ansicht: Klienten-Stammdaten & MassnahmenFilter für Kienten-BerichtFilter für Kontakte-BerichtFilter für Massnahmen-BerichtStatistik-Maske, Zeitraum & Ausgabe-OptionenStatistik-Maske, Datums-AuswahlStatistik mit Anzahlen je Massnahmen-ArtMassnahmen-Auswahl im Filter zum Massnahmen-BerichteAkte: Deckblatt einer Klienten-AkteeAkte: Übersicht über die Massnahmen-Belege
Auszug aus der Massnahmen-Konfiguration:

Die DSL (Domain-Specific Language) ist eine fachspezifische Computersprache, in diesem Fall zur Beschreibung von Betreuungs-Massnahmen, mit ihren Eigenschaften und Verhalten. Aus diesem Beschreibungen ergibt sich das Aussehen und das Verhalten der Massnahmen-Formulare.

/** QuickForms DSL - Domain Specific Language
 * zur Konfiguration der Massnahmen-Typen 
 **/
    caseext {
        name = 'CASE-Management extern'
        organisation = 'Krankenpfegeverein'
        intro = 'Fallführung übergeben'
        sofort = true
    }

    caseint {
        name = 'CASE-Management intern'
        organisation = 'Stadt Bregenz'
        intro = 'ist der Antrag gemeindeamtlich bestätigt?'
        sofort = true
        gesperrt = true
    }


    caritas {
        name = 'Caritas'
        organisation = 'Caritas'
        intro = 'Beratung empfohlen - hat sich der Klient bei Caritas gemeldet?'
        items {
            gemeldet {
                label = 'gemeldet'
                type = 'auswahl'
                kommentar= 'hat sich gemeldet ja oder nein'
                optionen = ['ja', 'nein']
            }
            bemerkung {
                optional = true
                label = 'Bemerkung'
                type = 'textbox'
                kommentar= 'optional'
            }
        }
    }

    delogprev {
        name = 'Delogierungsprävention'
        organisation = 'Stadt Bregenz'
        intro = 'ein Exekutionsantrag vom BG liegt vor. Kommt der Klient ins Amt?'
        items {
            kommz {
                label = 'kommt'
                type = 'auswahl'
                kommentar= 'kommt ins Amt ja oder nein'
                optionen = ['ja', 'nein']
            }
            bemerkung {
                optional = true
                label = 'Bemerkung'
                type = 'textbox'
                kommentar= 'optional'
            }
        }
    }

    dowas {
        name = 'Dowas'
        organisation = 'DOWAS'
        intro = 'Beratung empfohlen - hat sich der Klient beim DOWAS gemeldet?'
        items {
            gemeldet {
                label = 'gemeldet'
                type = 'auswahl'
                kommentar= 'hat sich gemeldet ja oder nein'
                optionen = ['ja', 'nein']
            }
            bemerkung {
                optional = true
                label = 'Bemerkung'
                type = 'textbox'
                kommentar= 'optional'
            }
        }
    }

    familienzuschuss {
        name = 'Familienzuschuss(s)'
        organisation = 'Vorarlberger Landesregierung'
        intro = 'Antrag gemeindeamtlich bestätigt?'
        sofort = true
    }

    
    hilfswerk {
        name = 'Hilfswerk'
        organisation = 'Stadt Bregenz'
        intro = 'Anspruch überprüfen'
        sofort = true
    }

    ifsberatung {
        name = 'IFS-Beratung'
        organisation = 'IFS'
        intro = 'Beratung empfohlen - hat sich der Klient beim IFS gemeldet?'
        dauer = 30
        items {
            gemeldet {
                label = 'gemeldet'
                type = 'auswahl'
                kommentar= 'hat sich gemeldet ja oder nein'
                optionen = ['ja', 'nein']
            }
            bemerkung {
                optional = true
                label = 'Bemerkung'
                type = 'textbox'
                kommentar= 'optional'
            }
        }
    }

    ifsschulden {
        name = 'IFS-Schuldenberatung'
        organisation = 'IFS'
        intro = 'Schuldenberatung empfohlen - hat sich der Klient beim IFS gemeldet?'
        items {
            gemeldet {
                label = 'gemeldet'
                type = 'auswahl'
                kommentar= 'hat sich gemeldet ja oder nein'
                optionen = ['ja', 'nein']
            }
            bemerkung {
                optional = true
                label = 'Bemerkung'
                type = 'textbox'
                kommentar= 'optional'
            }
        }
    }
    
    integrationshilfe {
        name = 'Integrationshilfe(s)'
        organisation = 'Vorarlberger Landesregierung'
        intro = 'Antrag gemeindeamtlich bestätigt?'
        sofort = true
    }
    
    jugendwohlfahrt{
        name = 'Jugendwohlfahrt'
        organisation = 'BH Bregenz'
        intro = 'wird die Jugendwohlfahrt tätig?'
        items {
            taetig {
                label = 'taetig'
                type = 'auswahl'
                kommentar= 'ja oder nein'
                optionen = ['ja', 'nein']
            }
            bemerkung {
                optional = true
                label = 'Bemerkung'
                type = 'textbox'
                kommentar= 'optional'
            }
        }
    }
    
    landespflegegeld {                    // todo: check db wg streichung
        name = 'Landespflegegeld'
        organisation = 'BH Bregenz'
        intro = 'ist der Antrag gemeindeamtlich bestätigt?'
        sofort = true
        gesperrt = true
    }

    ms_bestatt {
        name = 'Mindestsicherung Bestattung'
        organisation = 'BH Bregenz'
        intro = 'Antrag eingereicht'
        sofort = true
    }
    
    ms_finbeitr {
        name = 'Mindestsicherung Finanzierungsbeitrag'
        organisation = 'BH Bregenz'
        intro = 'ist der Antrag auf Mindestsicherung für Finanzierungsbeitrag gemeindeamtlich bestätigt?'
        items {
            bestaetigt {
                label = 'ist bestätigt'
                type = 'auswahl'
                kommentar= 'ja oder nein'
                optionen = ['ja', 'nein']
            }
            bemerkung {
                optional = true
                label = 'Bemerkung'
                type = 'textbox'
                kommentar= 'optional'
            }
        } // items
    }

— Ende =:-)