[ 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.
Packages (Free, Pro)
com.dynamicg.timerecording
com.dynamicg.timerecording.pro
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
Bestimmten Task 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 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 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()
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.
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(getTimeRecPackage(context));
BroadcastReceiver resultReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent resultIntent) {
Bundle extras = this.getResultExtras(true);
if (extras!=null) {
ArrayList 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(getTimeRecPackage(context));
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(getTimeRecPackage(context));
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);
// ** deprecated, based on direct file access; this works on devices up to Android 10
//String filepath = bundle.getString("com.dynamicg.timerecording.FILE");
//File file = new File(filepath);
//String feedback = "File=["+file+"], canRead=["+file.canRead()+"]";
//Toast.makeText(context, feedback, Toast.LENGTH_LONG).show();
//System.err.println(feedback);
// ** starting with Time Recording 7.50 Beta 2 we're returning the file's android.net.Uri
// ** caution: this strictly required passing your package in "com.dynamicg.timerecording.CALLED_BY_PKG" above
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);