aboutsummaryrefslogtreecommitdiffstats
path: root/timetask/time_entry.go
AgeCommit message (Collapse)Author
2017-06-03Change `TimeEntry.Time` to a `float64`Teddy Wing
I had forgotten that time spent can be a decimal. Make this field a float and change related code accordingly: * --time flag * `NewTimeEntry()` `time` argument * `buildSubmissionParams()` can't use `strconv.Itoa` as that's an integer function. Instead we use `FormatFloat`. Truncate time parsing to two decimal places because to me that seems like enough. Who's going to say they spent `0.324` hours on something? Also, in order to be able to properly submit values to TimeTask (at least on the edition I use), the times must be written in European/French format, with commas (`,`) as decimal separators. Do a string replace to get this, as the float formatter will give us a period (`.`) separator.
2017-06-03Run gofmt on all project filesTeddy Wing
2017-06-03Add `NewTimeEntry()`Teddy Wing
A new function that creates a `TimeEntry` build from a `Profile`, `Project`, and a few other parameters. Makes it a bit easier to create `TimeEntry`ies. Additionally, add a `PersonID` field to `TimeEntry` so we can pass it around as a self-contained thing without worrying about having to pass a `Profile` along with it.
2017-06-03time_entry.go: Rewrite `TimeEntry` type for the new eraTeddy Wing
Change [Client, Project, Module, Task, WorkType] fields to `int`s instead of strings. In the new era, with config2.toml, these fields will be populated directly with the proper int IDs from TimeTask. Thus these fields need to be `int`s. Get rid of the `UnmarshalYAML` function as in the new era we won't be submitting time entries by YAML file. Instead they will be submitted directly via command line arguments (plus the IDs coming from the config file).
2017-03-12TimeEntry.UnmarshalYAML: Don't error if date empty stringTeddy Wing
The date is allowed to be empty in the config defaults hash. Don't error if it is.
2017-03-12Change all `uint` types to `int`Teddy Wing
Because `strings.Itoa` is so much easier to call than `strconv.ParseUint`, and I needed to parse ints into strings to build the URL params in `buildSubmissionParams` (17f4ecc63615e3f3bef21a80f15e7c7b0e0cffa1).
2017-03-12TimeEntry: Add missing Module fieldTeddy Wing
Forgot to add this field originally. Do the same as when we added the `Time` field.
2017-03-12time_entry.go: Properly unmarshal Time fieldTeddy Wing
Fix 7a8db5312bbb43c986fbae7aa14960e22080b03b to ensure that the `Time` field actually gets unmarshalled into `TimeEntry` structs.
2017-03-12time_entry.go: Add missing `Time` fieldTeddy Wing
Include billable hours field.
2017-03-12Parse timesheet filesTeddy Wing
Expect a timesheet file as the last argument to the program. Parse the contents into `TimeEntry` objects. `TimeEntry`ies will then be able to be POSTed to Time Task to submit times. The time entries input file is a YAML document in this format: - client: A client project: A project module: A module task: A task work_type: type date: 2017-03-06 time: 7 billable: true description: It contains an array where each element is a time entry. Had a lot of trouble parsing the date into a `time.Time`. Finally realised that my first and biggest problem was somehow I was importing `yaml.v1` instead of `yaml.v2`, and thus my `UnmarshalYAML` function was never getting called. Wanted a way to get the time as a string and parse it myself into a time. At first tried using an `UnmarshalText` function: type Time time.Time func (t *Time) UnmarshalText(text []byte) error { parsed, err := time.Parse("2006-01-02", string(text)) if err == nil { *t = Time(parsed) } return err } But in order to do that I had to make a type alias to `time.Time`. Doing so was not ideal, because then I'd have to convert my `Time` into a `time.Time` any time I wanted to use it for real. Ended up going with a suggestion from here: https://mlafeldt.github.io/blog/decoding-yaml-in-go/ Creating an auxiliary struct in `UnmarshalYAML` to unmarshal the date into a string and then parse it myself as a date. I don't really like it because it's a lot of ceremony just to parse one type myself, but can't come up with a better solution right now so there you have it.