[ Startseite ]
[ EN | DE ]
Zeiterfassung: Task Liste exportieren und importieren
(A) Exportieren und importieren der Taskliste
• Exportiere die Taskliste auf deinem „Master“ Gerät mit einer der „Exportieren“ Option.
• Das Dateiformat ist „Freitext“, d.h. du kannst es danach mit einem Texteditor bearbeiten.
• Speicherort bei „Exportieren | Google Drive“ ist „Zeiterfassung / timerec-tasks-free.txt“ oder „ZeiterfassungPro / timerec-tasks-pro.txt“
• Nach dem Editieren der Datei, oder um neue Geräte aufzusetzen, benutze „Importieren“.
• Beachte: die Taskreihenfolge wird beim Importieren abgeleitet aus der Zeilenreihenfolge innerhalb der Textdatei.
(B) Importieren via Intranet-Seite
• Kopiere die exportierte Datei auf einen Webserver.
• Benutze „Importieren | Webseite“ gemäss oben. Dies ist verfügbar seit Zeiterfassung Version 7.67
(C) Power-User Optionen
• Der Task-ID Bereich von 20'000 bis 29'999 ist reserviert und wird *nicht* von der App benutzt für neu erzeugte Tasks;
das heisst, du kannst in deiner Import-Datei Task-IDs aus diesem Bereich benutzen, um einen ID-Konflikt zwischen „Task in der App durch Benutzer angelegt“ und „Task importiert via Datei“ zu verhindern.
• Das Importieren unterstützt optional den „MERGE“ Modus (anstelle des Standards „Ganze Liste beim Importieren ersetzen“).
Wenn aktiviert, dann werden nur neue Tasks angelegt bzw bestehende aktualisiert (anhand der Task-ID);
bereits bestehende Tasks, welche nicht in der Import-Datei sind, werden unverändert beibehalten.
Füge folgende Zeile in der Importdatei ein um dies zu aktivieren:
!MERGE
Tasklöschung im „MERGE“ Modus kann erzwungen werden mit dieser Anweisung (eine Zeile pro Löschung):
!DELETE {taskid}
(D) API Aufruf
Die Tasks Textdatei kann via Android App API Aufruf exportiert und importiert werden. Beispiele:
// export
Button btExport = new Button(this);
btExport.setText("Tasks Export Test");
btExport.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
// for "Pro" use "com.dynamicg.timerecording.pro"
intent.setComponent(new ComponentName("com.dynamicg.timerecording"
, "com.dynamicg.timerecording.PublicServices"));
intent.setAction("com.dynamicg.timerecording.TASKLIST_EXPORT");
BroadcastReceiver resultReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Bundle result = this.getResultExtras(true);
System.out.println("## EXPORT STATUS> "+result.getString("STATUS"));
System.out.println("## EXPORT FILEPATH> "+result.getString("FILEPATH"));
String data = result.getString("DATA"); // this is the full file content of file pointed to by FILEPATH
System.out.println("## EXPORT DATA LEN> "+(data!=null ? data.length() : -1));
System.out.println("## EXPORT ERRORS> "+result.getString("ERRORS"));
}
};
context.sendOrderedBroadcast(intent, null, resultReceiver, null, 0, null, null);
}
});
body.addView(btExport);
// import
Button btImport = new Button(this);
btImport.setText("Tasks Import Merge Test");
btImport.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
// for "Pro" use "com.dynamicg.timerecording.pro"
intent.setComponent(new ComponentName("com.dynamicg.timerecording"
, "com.dynamicg.timerecording.PublicServices"));
intent.setAction("com.dynamicg.timerecording.TASKLIST_IMPORT");
String data = "### TEST IMPORT WITH MERGE ###"
+"\n!MERGE"
+"\n20001|Import-Task1|Import-ClientA"
+"\n20002|Import-Task2|Import-ClientA"
+"\n20003|Import-Task3|Import-ClientB"
;
intent.putExtra("DATA", data);
BroadcastReceiver resultReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Bundle result = this.getResultExtras(true);
System.out.println("## IMPORT STATUS> "+result.getString("STATUS"));
System.out.println("## IMPORT INFO> "+result.getString("INFO"));
System.out.println("## IMPORT ERRORS> "+result.getString("ERRORS"));
}
};
context.sendOrderedBroadcast(intent, null, resultReceiver, null, 0, null, null);
}
});
body.addView(btImport);