[  Startseite  ]   [  EN  |  DE  ]  

Zeiterfassung: Public Services

Zeiterfassung bietet Services für Integration in andere Apps an (zum Beispiel "Tasker"), sowie für Entwickler welche diese selber einbinden möchten.

BroadcastReceivers
com.dynamicg.timerecording.CHECK_IN
com.dynamicg.timerecording.CHECK_OUT
com.dynamicg.timerecording.PUNCH
com.dynamicg.timerecording.START_NEW_TASK
com.dynamicg.timerecording.DATA_EXPORT
com.dynamicg.timerecording.GET_INFO

Activities
com.dynamicg.timerecording.activity.CHECK_IN
com.dynamicg.timerecording.activity.CHECK_OUT
com.dynamicg.timerecording.activity.PUNCH
com.dynamicg.timerecording.activity.SWITCH_TASK

App Package Namen
Beachte dass die Activity- und Broadcast-Namen identisch sind in beiden App-Versionen ("Free" und "Pro"); der App Package Name muss jeweils als Zusatzargument übergeben werden, konkret einer dieser Werte:
com.dynamicg.timerecording
com.dynamicg.timerecording.pro

Trivialer Broadcast-Test mit ADB
adb shell am broadcast -a com.dynamicg.timerecording.GET_INFO com.dynamicg.timerecording
adb shell am broadcast -a com.dynamicg.timerecording.GET_INFO com.dynamicg.timerecording.pro

Bestimmten Task fürs Stempeln setzen
• Setze das "com.dynamicg.timerecording.TASK" Extra. Wert ist die numerische Task-ID, welche auf dem "Task editieren" Schirm sichtbar ist.
• Alternativ: setze das "com.dynamicg.timerecording.TASK_NAME" Extra mit dem Task-Namen. Falls derselbe Task für mehrere Kunden existiert, dann benutze Format "taskname[[kundenname]]".
• Tasker Info: benutze dieses Format in Tasker: com.dynamicg.timerecording.TASK:{ID}

Bestimmte Zeit fürs Stempeln setzen
• Setze das "com.dynamicg.timerecording.TIME" Extra.
• Format ist "hh24:mm" (d.h. 00:00 bis 23:59).
• Um das Gültigkeitsdatum auf den nächsten Tag zu setzen: benutze Format "hh24:mm+1", z.B. "00:45+1"

Arbeitsnotiz fürs Stempeln setzen
• Setze das "com.dynamicg.timerecording.NOTES" Extra

GET_INFO
• Dies ist für Entwickler die Statusinformationen von Zeiterfassung in eigenen Apps oder Widgets integrieren möchten. GET_INFO sendet aktuellen Task, laufendes Total, "Delta" und mehr an den definierten BroadcastReceiver.
• Beispielprojekt siehe hier: TimeRecInfoGetter-src.zip
• Der relevante Aufruf ist: com.dynamicg.timerecinfogetter.TimeRecDataGetter.getData()
• Alternativ stellt das "Tasker Plugin" der App die "GET_INFO_BROADCAST" Aktion zur Verfügung, welche alle GET_INFO Daten als "Key/Value Bundle" retourniert. Die "Zeiterfassung Tasker Plugin" Konfigurationsseite zeigt mehr Informationen wenn diese Option selektiert wird.

DATA_EXPORT
Berichte können über einen Broadcast Intent erzeugt werden. Beispiel siehe unten.

Was ist “Check in” versus “Punch” versus “Start new task”
• “Check in” stempelt einmalig ein. Wiederholte Aufrufe weren ignoriert.
• “Punch” führt ein Einstempeln oder Ausstempeln aus, abhängig vom aktuellen Stempel-Zustand.
• “Start new task” startet eine neue Arbeitseinheit. Falls bereits eingestempelt, dann wird die bestehende Einheit mit "Ausstempeln" abgeschlossen.

App-Package-Erkennung
Die nachfolgenden Beispiele referenzieren die Variable "timeRecPkgName" als App-Packagenamen; diese kann entweder hartcodiert werden mit "com.dynamicg.timerecording" bzw. "com.dynamicg.timerecording.pro", oder du kannst über den Android Package Manager die installierte App ableiten: public static String getTimeRecPackage(Context context) { final String pkgFree = "com.dynamicg.timerecording", pkgPro = "com.dynamicg.timerecording.pro"; // caution: these these packages need to be registered as "<queries>" in the Android app manifest (since Android 11) try { if (context.getPackageManager().getPackageInfo(pkgPro, PackageManager.GET_ACTIVITIES)!=null) { return pkgPro; } } catch (NameNotFoundException e) {} return pkgFree; }
GET_TASKS
Das ist für Entwickler welche die Taskliste auslesen möchten. Siehe auch "Tasks Export/Import". Intent intent = new Intent("com.dynamicg.timerecording.GET_TASKS"); intent.setPackage(timeRecPkgName); BroadcastReceiver resultReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent resultIntent) { Bundle extras = this.getResultExtras(true); if (extras!=null) { ArrayList<Integer> taskIds = extras.getIntegerArrayList("com.dynamicg.timerecording.GET_TASKS.IDS"); String[] taskNames = extras.getStringArray("com.dynamicg.timerecording.GET_TASKS.NAMES"); String[] clientNames = extras.getStringArray("com.dynamicg.timerecording.GET_TASKS.CLIENTS"); String[] extra1 = extras.getStringArray("com.dynamicg.timerecording.GET_TASKS.EXTRA1"); String[] extra2 = extras.getStringArray("com.dynamicg.timerecording.GET_TASKS.EXTRA2"); boolean currentlyCheckedIn = extras.getBoolean("com.dynamicg.timerecording.GET_TASKS.STATE_CHECKED_IN"); int currentTaskId = extras.getInt("com.dynamicg.timerecording.GET_TASKS.STATE_TASK_ID"); } } }; context.sendOrderedBroadcast(intent, null, resultReceiver, null, Activity.RESULT_OK, null, null);
UPDATE_STAMP_VALUE
• Hiermit wird eines der "Werte" Felder aktualisiert
• Broadcast receiver: com.dynamicg.timerecording.SERVICE_DISPATCHER mit OPERATION=STAMP_VALUE_UPDATE
• Bundle-Werte: Key={VALUE_1|VALUE_2|VALUE_A|VALUE_B|VALUE_C|VALUE_D}, Value={der zu setzende Wert}
• Standardmässig wird die aktuelle Arbeitseinheit aktualisiert. Optionaler Bundle-Wert: Key=TIME, Value=Zeitstempel im Format hh24:mm derjenigen Arbeitseinheit die aktualisiert werden soll.
• Beispiel: Intent intent = new Intent("com.dynamicg.timerecording.SERVICE_DISPATCHER"); intent.setPackage(timeRecPkgName); intent.putExtra("OPERATION", "UPDATE_STAMP_VALUE"); intent.putExtra("VALUE_A", "TestA_"+new java.util.Date()); intent.putExtra("TIME", "08:46"); context.sendBroadcast(intent);
DATA_EXPORT Beispiel
final String dateFrom = "2017-08-01"; // format "yyyy-mm-yy" final String dateTo = "2017-08-31"; // format "yyyy-mm-yy" final String exportType = "e3"; // "e2" to "e10" final String exportFormat = "html"; // values [html, xls, pdf, csv, xml] Intent intent = new Intent("com.dynamicg.timerecording.DATA_EXPORT"); intent.setPackage(timeRecPkgName); intent.putExtra("com.dynamicg.timerecording.DATE_FROM", dateFrom); intent.putExtra("com.dynamicg.timerecording.DATE_TO", dateTo); intent.putExtra("com.dynamicg.timerecording.EXPORT_TYPE", exportType); intent.putExtra("com.dynamicg.timerecording.EXPORT_FORMAT", exportFormat); // provide your package name so that TimeRec can grant the file uri: intent.putExtra("com.dynamicg.timerecording.CALLED_BY_PKG", context.getPackageName()); // ALTERNATIVELY: PASS ALL PARAMS WITH ONE SINGLE "EXTRA" //String exportData = dateFrom+","+dateTo+","+exportType+","+exportFormat; //intent.putExtra("com.dynamicg.timerecording.EXPORT_DATA", exportData); BroadcastReceiver resultReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent resultIntent) { Bundle bundle = this.getResultExtras(true); String uristring = bundle.getString("com.dynamicg.timerecording.FILE_URI"); android.net.Uri uri = android.net.Uri.parse(uristring); Toast.makeText(context, "uri: "+uri.toString(), Toast.LENGTH_SHORT).show(); // content can be accessed via the uri's input stream, like so: // InputStream is = context.getContentResolver().openInputStream(uri); } }; context.sendOrderedBroadcast(intent, null, resultReceiver, null, Activity.RESULT_OK, null, null);


  [  Nach oben  ]  
  [  © DynamicG Android Apps  ]