Mein Freiberufler Büro als macOS App

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Mein Freiberufler Büro als macOS App

    Hallo zusammen,

    ich will euch meine App Evolve Tracking Freelancer vorstellen.

    Zuerst ein bisschen Hintergrund. Als ich mich Mitte 2016 (zum zweiten mal) als Freiberufler selbständig gemacht habe, war mir klar das ich das leidige Thema Zeiterfassung wohl besser nicht komplett ignorieren sollte. In der Vergangenheit war ich allerdings nicht gerade gut darin meine Tätigkeiten zeitlich genau festzuhalten. Gleichzeitig war mir aber bewusst, dass ich gerade als Freiberufler sehr genau hinschauen muss, ob Aufwand und Ertrag meiner Aufträge auch in einer sinnvollen Relation zueinander stehen.
    In der Vergangenheit hatte ich oft die Erfahrung gemacht, dass man sich leicht selbst „in die Tasche“ lügen kann, wenn am Ende eines Projekts endlich das Geld auf dem Konto angekommen ist. Auf einmal gerät der eventuell mühsame Weg dorthin etwas in Vergessenheit. Um dies einfach schwarz auf weiss zu haben, habe ich mich nach Zeiterfassungstools umgesehen.

    Was ich grob wollte war folgendes:

    • Native macOS Applikation
    • Zeiterfassung auf Kunden, Projekt und Task Basis
    • Sinnvolle Auswertungen wie: Tatsächlicher Stundensatz, Wieviel Prozent der Zeit wurde gezahlt, wenn man den eigentlichen Stundensatz anlegt, etc.


    Dazu muss man wissen, dass ich häufig Angebote abgebe und diese Angebote dann auch erstmal feststehen. D.h. ich trage oft selbst das Risiko, dass die Arbeiten eventuell länger dauern.

    Die Idee war, mit den oben genannten Auswertungen dann konkret sehen zu können, wie gut die Angebote geschätzt werden für jeden Kunden und wo Nachbesserungsbedarf besteht.

    Ich bin mir gar nicht sicher ob ich ernsthaft nach vorhandener Software gesucht habe oder schon im Hinterkopf, wie so oft, dachte: „Das mache ich selbst!“. Auf jeden Fall habe ich nichts gefunden, was den Kriterien entsprach, da viele Zeiterfassungen die Ansicht vertreten, dass jede gebuchte Stunde auch mit dem jeweiligen Stundensatz in Rechnung gestellt wird.
    Und auch die automatischen Auswertungen haben mir oft nicht genau das gezeigt was ich eigentlich wissen wollte.

    Was macht man da also als Softwareentwickler… Man fängt natürlich selbst an zu basteln ;)

    Ich startete also mit der Funktion zum Erfassen von Zeiten. Um die Auswertungen angezeigt zu bekommen die ich gerne direkt sehen möchte, war es allerdings notwendig das Programm auch noch mit den gestellten Rechnungen zu füttern, also kam ein rudimentäres Rechnungsmodul dazu.
    Und wo ich schon dabei war, durfte natürlich auch ein Export beliebiger Zeiteinträge nicht fehlen. Eine Todo-Liste wäre auch noch interessant, also rein damit!

    Da ich in der Vergangenheit schon unzählige eigene Projekte angefangen hatte, diese aber nie fertiggestellt hatte, war mein Hauptziel dieses mal eine Version zu erreichen, die ich auch veröffentlichen könnte.

    Das war dann mein großes Ziel, welches ich dann tatsächlich dieses Jahr erreicht habe!
    Auf dem Weg dorthin habe ich aber gemerkt, dass die Version zwar schon das macht, was ich anfangs wollte und sogar noch ein paar Sachen mehr an die ich anfangs nicht gedacht habe. Aber mir sind auch so viele Dinge eingefallen, um die ich die App noch verbessern und erweitern möchte. Deswegen arbeite ich weiter daran und hoffe das ich nicht der einzige bin, der mit der App etwas anzufangen weiß!

    Im Endeffekt ist jetzt aus der Zeiterfassung für Freiberufler eher eine Bürosoftware für Freiberufler geworden.

    Falls sich jemand die App anschauen möchte, ist eine Testversion kostenlos im App Store erhältlich. Feedback ist natürlich willkommen!

    -> Website und Doku

    -> Mac App Store
  • Herzlichen Glückwunsch und viel Erfolg ... Schön wäre, wenn Du noch 1-2 Insights zur Programmentwicklung - z. B. Herausforderungen und Lösungen - teilen würdest: Schliesslich sind wir hier in erster Linie ein Entwicklerforum. Toll, wenn der ein oder andere Deine App nutzen kann, aber dies sollte nur ein Nebeneffekt Deines Postings sein...

    Nix für ungut :)

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Also die Codebasis besteht zu ca. 60% aus Objective-C und der Rest dann Swift. Ich habe im Laufe des Projekts umgestellt und schreibe neuen Code fast nur noch in Swift (Es sei denn ich muss eine Anpassung an vorhandenen Klassen vornehmen).

    Zu den "besonderen" Funktionalitäten gehören:
    • Nutzung eines NSStatusBar Items welches ein Popover öffnet. Was generell ein cooles MacOS feature ist um bestimmte Funktionen schnell zu erreichen. Ich habe das genutzt um schnell die Zeitnahme zu starten oder zu stoppen
    • Ein Today Widget welches die noch offenen Rechnungen und das erwartete Zahlungsdatum anzeigt. Da das Today Widget quasi eine eigene App darstellt nutze ich ein Shared Framework welches das Model enthält welches zwischen App und Today Widget kommuniziert wird. Die Model-Datei implementiert das NSCoding Protokoll für die De-/Serialisierung
    • IAP Purchases mit lokaler Zertifikatsvaliderung. Da die App vorher im voraus bezahlt werden musste, musste ich hier sicherstellen, dass die alten Benutzer automatisch eine freigeschaltete Version erhalten. Das scheint auch ganz gut zu klappen in dem man das OriginalPurchaseVersion Feld im App Store Receipt nutzt.
    Im Moment arbeite ich an einem automatischen Rechnungsexport, für den ich AppleScript einsetze. Hier gibt es sehr viele Möglichkeiten, was wirklich interessant ist, allerdings kommt einem hier die Sandbox öfters in die Quere, da muss ich noch eine finale Lösung finden.

    Performancetechnisch war die Kalenderansicht nicht ganz so einfach. Es ist sehr rechenintensiv viele Zeichenketten zu zeichnen und die gibt es bei einem Kalender in der Jahresübersicht zu hauf. Das heißt beim resizen merkt man das es nicht ganz flüssig ist. Ich habe mir jetzt damit geholfen, dass ich während des Resizens (inLiveResize von NSView), die Tageszahlen ausblende und erst wieder einblende wenn das Resizen beendet wurde. Damit läuft es dann flüssig, ist aber nicht ganz optimal. Falls da jemand Tipps hat wie es Apple in der Jahresansicht hinbekommt, gerne melden ;)


    Anatol
  • flexxx schrieb:

    • IAP Purchases mit lokaler Zertifikatsvaliderung. Da die App vorher im voraus bezahlt werden musste, musste ich hier sicherstellen, dass die alten Benutzer automatisch eine freigeschaltete Version erhalten. Das scheint auch ganz gut zu klappen in dem man das OriginalPurchaseVersion Feld im App Store Receipt nutzt.
    Hey, danke für die Infos! Den oben beschriebenen Weg gehe ich auch, um Bestandskunden (unter iOS) einen IAP freizuschalten und habe damit bisher keine schlechten Erfahrungen gemacht. Hast Du die Receipt-Validierung selber geschrieben? Ich muss gestehen, dass ich hierbei auf Receigen zurückgegriffen habe, mit dem ich - abgesehen vom kürzlichen Hin und Her bzgl. Prefixes - sehr zufrieden bin.

    Frohes Osterfest, Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • flexxx schrieb:


    Performancetechnisch war die Kalenderansicht nicht ganz so einfach. Es ist sehr rechenintensiv viele Zeichenketten zu zeichnen und die gibt es bei einem Kalender in der Jahresübersicht zu hauf. Das heißt beim resizen merkt man das es nicht ganz flüssig ist. Ich habe mir jetzt damit geholfen, dass ich während des Resizens (inLiveResize von NSView), die Tageszahlen ausblende und erst wieder einblende wenn das Resizen beendet wurde. Damit läuft es dann flüssig, ist aber nicht ganz optimal. Falls da jemand Tipps hat wie es Apple in der Jahresansicht hinbekommt, gerne melden ;)

    Wie zeichnest Du die Texte für die Tageszahlen? Per NSTextStorage und NSLayoutManager? Dies sollte eigentlich keine Probleme bei der Performance bereiten.
  • MyMattes schrieb:

    flexxx schrieb:


    • IAP Purchases mit lokaler Zertifikatsvaliderung. Da die App vorher im voraus bezahlt werden musste, musste ich hier sicherstellen, dass die alten Benutzer automatisch eine freigeschaltete Version erhalten. Das scheint auch ganz gut zu klappen in dem man das OriginalPurchaseVersion Feld im App Store Receipt nutzt.

    Hey, danke für die Infos! Den oben beschriebenen Weg gehe ich auch, um Bestandskunden (unter iOS) einen IAP freizuschalten und habe damit bisher keine schlechten Erfahrungen gemacht. Hast Du die Receipt-Validierung selber geschrieben? Ich muss gestehen, dass ich hierbei auf Receigen zurückgegriffen habe, mit dem ich - abgesehen vom kürzlichen Hin und Her bzgl. Prefixes - sehr zufrieden bin.
    Frohes Osterfest, Mattes
    Ich habe mich an github.com/roddi/ValidateStoreReceipt orientiert. Welches allerdings in der aktuellen Fassung nicht mehr richtig funktioniert für das Laden der InAppPurchases aus dem App Store receipt. Anscheinend ist das Projekt also nicht mehr wirklich aktuell und wird wohl nicht mehr häufig genutzt.

    MCDan schrieb:

    flexxx schrieb:

    Performancetechnisch war die Kalenderansicht nicht ganz so einfach. Es ist sehr rechenintensiv viele Zeichenketten zu zeichnen und die gibt es bei einem Kalender in der Jahresübersicht zu hauf. Das heißt beim resizen merkt man das es nicht ganz flüssig ist. Ich habe mir jetzt damit geholfen, dass ich während des Resizens (inLiveResize von NSView), die Tageszahlen ausblende und erst wieder einblende wenn das Resizen beendet wurde. Damit läuft es dann flüssig, ist aber nicht ganz optimal. Falls da jemand Tipps hat wie es Apple in der Jahresansicht hinbekommt, gerne melden ;)
    Wie zeichnest Du die Texte für die Tageszahlen? Per NSTextStorage und NSLayoutManager? Dies sollte eigentlich keine Probleme bei der Performance bereiten.
    Danke für den Hinweis, das werde ich mir mal anschauen, im Moment überschreibe ich draw( dirtyRect: NSRect ) in einer NSView und zeichne die Texte mit String. draw(in:withAttributes:)
  • flexxx schrieb:

    MCDan schrieb:

    flexxx schrieb:

    Performancetechnisch war die Kalenderansicht nicht ganz so einfach. Es ist sehr rechenintensiv viele Zeichenketten zu zeichnen und die gibt es bei einem Kalender in der Jahresübersicht zu hauf. Das heißt beim resizen merkt man das es nicht ganz flüssig ist. Ich habe mir jetzt damit geholfen, dass ich während des Resizens (inLiveResize von NSView), die Tageszahlen ausblende und erst wieder einblende wenn das Resizen beendet wurde. Damit läuft es dann flüssig, ist aber nicht ganz optimal. Falls da jemand Tipps hat wie es Apple in der Jahresansicht hinbekommt, gerne melden ;)
    Wie zeichnest Du die Texte für die Tageszahlen? Per NSTextStorage und NSLayoutManager? Dies sollte eigentlich keine Probleme bei der Performance bereiten.
    Danke für den Hinweis, das werde ich mir mal anschauen, im Moment überschreibe ich draw( dirtyRect: NSRect ) in einer NSView und zeichne die Texte mit String. draw(in:withAttributes:)

    Alternativ könntest Du es nochl mit einem NSTextField (als Label) versuchen. Dies sollte auch deutlich schneller als String. draw(in:withAttributes:) sein.