Google doesn't allow "constantly running" background apps, but you should have no problem scheduling a service to run at a specific time each day (just like alarm app works - using StartServiceAt call)
For the situation with the worker not getting paid for last weeks work because there was no internet, you should configure your app to "report in" every day even if there is no new checkin/out data to report. This way, when your backend goes to calculate the weekly payroll, if it didn't hear from your app on a particular day, it could report to the backend admin with a message like "Checkin/out data has not been received from the remote app on day xxxx, so there could be missing wage info that was not reported".
For the situation of both a background service and a user starting the app trying to report at the same time, this should not be a problem because I'm pretty sure the OS will not let two different instances of your reporting service to run, so only one can report at a time. And when the app tries to run the upload routine right after the previous background upload routine ran, it should simply exit immediately because the second call of the service should not find any unsent records to upload because the previous call did that.