20120928

Neuzugänge

Im Modul Neuzugänge wird langsam einiges klarer, nachdem Gerd und ich über Klienten-Workflows geredet haben.

Die Liste “Neue Klienten” zeigt eine “andere” Liste von Klienten, speziell auf die Bedürfnisse der Neuantragsverwaltung zugeschnitten. Hat ein eigenes Parameter-Panel mit folgenden Optionen:

  • auch abgewiesene Klienten
  • auch veraltete Klienten
  • neu begleitete Klienten seit

Insbesondere auch einen Reiter “Neuzugänge”, in dem man eine Liste der verfügbaren Agenten für diesen Klienten sehen kann. Diese Tabelle hat eine Zeilenaktion “Attribute” (“Zuweisen”): momentan wird dann (1) ein Coaching erstellt und (2) der Status des Klienten auf “Begleitet” gesetzt. (TODO: auch Mails verschicken)

Der Button “[Refuse]” (“Abweisen”) ist zwar schon da und versucht schon das Dialogfenster zur Eingabe der Begründung zu öffnen, aber dieses zerknallt bevor es überhaupt da ist: der entsprechende Code JS-wird z.B. momentan noch nicht mal generiert.

Kontaktpersonen und Verträge

Fallbeispiel: Bei Firma Soundso wechselt der Direktor. In den Kontaktpersonen der Firma wollen wir den alten Direktor nicht mehr sehen. Aber es gibt Verträge, bei denen der die Firma vertritt. Diese Situation war bisher nicht gut gehandhabt. Man musste eine neue Kontaktperson anlegen und durfte den alten Direktor nicht löschen. Und oops: wenn man in der bestehenden Kontaktperson die Person änderte, wurde der alte Direktor auch in bestehenden Verträgen rückwirkend ersetzt. Nicht sehr legal…

Deshalb ersetzen wir CompanyContact durch das neue Mixin lino.modlib.contacts.models.ContactRelated. En passant (wo wir ja jetzt doch migrieren müssen) benennen wir das Feld person nach client um.

Vorher Nachher  
company company die Firma
person client der Klient
contact get_contact() der Record aus der Tabelle Firmenkontakte
contact.person contact_person die vertretende Person
contact.type contact_role die Rolle (“Direktor”)

This change caused a new challenge for migrating the database. The natural approach would be something like:

def find_contact(contact_id):
    try:
        return contacts_Role.objects.get(pk=contact_id)
    except contacts_Role.DoesNotExist:
        return None

def create_isip_contract(id, user_id, ...):
    contact = find_contact(contact_id)
    return isip_Contract(id=id,...
      client_id=person_id,
      company_id=company_id,
      contact_person=contact.person,
      contact_role=contact.type,
      #~ contact_id=contact_id,
      language=language,...)

But that fails because the contacts.Role entries aren’t guaranteed to exist when a person is being deserialized.

The most elegant solution seems a way to add a possibility of specifying custom code per instance to be run from lino.utils.dumpy.FakeDeserializedObject.try_save(). to before_dumpy_save:

def add_contact_fields(obj,contact_id):
    def fn():
        contact = find_contact(contact_id)
        obj.contact_person=contact.person
        obj.contact_role=contact.type
    return fn

def create_isip_contract(id, user_id, build_time, person_id, company_id, contact_id, language, applies_from, applies_until, date_decided, date_issued, user_asd_id, exam_policy_id, ending_id, date_ended, type_id, stages, goals, duties_asd, duties_dsbe, duties_company, duties_person):
    obj = isip_Contract(id=id,...
      client_id=person_id,
      company_id=company_id,
      #~ contact_id=contact_id,
      language=language,...)
    obj.before_dumpy_save = add_contact_fields(obj,contact_id)
    return obj