diff --git a/src/hr/timesheets.go b/src/hr/timesheets.go index 9b17c37..ac8960c 100644 --- a/src/hr/timesheets.go +++ b/src/hr/timesheets.go @@ -18,7 +18,7 @@ type ( FilePath string Records *[][]string SkipFirstRow bool - ReportLines *[]*HourReportLine + ReportLines *[]*HourReportLineLegacy } HourReportLoadTask struct { @@ -26,7 +26,8 @@ type ( Err error } - HourReportLine struct { + // HourReportLineLegacy Container for the first iteration of the timesheet reports + HourReportLineLegacy struct { PayGroup string LName string FName string @@ -42,6 +43,32 @@ type ( Service float64 Total float64 } + + // HourReportLine Container struct for the new version of the hour report + // + // Badge #,Brv,Hol,OT,Reg,Service,Sick,Total + HourReportLine struct { + EEid int + Bereavement float64 + Holiday float64 + Overtime float64 + Regular float64 + Service float64 + Sick float64 + Total float64 + WeekEnding string + } + + // DirectoryReportLine Container struct for employee directory information + // Paygroup,Last Name,First Name,EEId,Department Name,Manager + DirectoryReportLine struct { + Paygroup string + LName string + FName string + EEId int + DepartmentName string + Manager string + } ) var namePattern = regexp.MustCompile("^\\d{1,2}.\\d{1,2}.\\d{2}-(\\d{1,2}.\\d{1,2}.\\d{2}).*csv$") @@ -70,7 +97,7 @@ func UpdateTimesheetReport(pathlike string) { connector.ExecuteSqlScript(tableWipe) for _, hourReport := range *reports { log.Printf("Updating database\n") - db.BlockUpdate[HourReportLine](connector, db.MercuryDatabaseName, "update-mercury-hrTimesheets.sql", hourReport.ReportLines) + db.BlockUpdate[HourReportLineLegacy](connector, db.MercuryDatabaseName, "update-mercury-hrTimesheets.sql", hourReport.ReportLines) log.Printf("Updates finished.\n") } @@ -102,8 +129,8 @@ func NewHourReport(pathlike string, skipFirstRow bool) *HourReport { return &report } -func processReportToLines(report HourReport) *[]*HourReportLine { - lines := make([]*HourReportLine, 0, 250) +func processReportToLines(report HourReport) *[]*HourReportLineLegacy { + lines := make([]*HourReportLineLegacy, 0, 250) localTable := *report.Records headersRaw := (localTable)[0] headers := make([]string, len(headersRaw), len(headersRaw)) @@ -114,7 +141,7 @@ func processReportToLines(report HourReport) *[]*HourReportLine { for i := 1; i < len(localTable); i++ { row := localTable[i] - line := newHourReportLineFromRow(headers, row) + line := newHourReportLineLegacyFromRow(headers, row) line.WeekEnding = fileNameToSQLDate(report.FilePath) lines = append(lines, &line) } @@ -131,11 +158,42 @@ func fileNameToSQLDate(fileName string) string { return fmt.Sprintf("%s-%s-%s", year, month, date) } -// I hate that this has a ton of hard-coded stuff. I'm not sure if there's a way around it though -func newHourReportLineFromRow(headers []string, row []string) HourReportLine { - line := HourReportLine{} +func newDirectoryReportLine(headers []string, row []string) DirectoryReportLine { + line := DirectoryReportLine{} + if len(headers) != len(row) { + panic("header array and row array are different sizes in newHourReportLineLegacyFromRow") + } + //Paygroup,Last Name,First Name,EEId,Department Name,Manager + for i, header := range headers { + strVal := row[i] + switch header { + case "Paygroup": + line.Paygroup = strVal + case "Last Name": + line.LName = strVal + case "First Name": + line.FName = strVal + case "EEId": + v, err := strconv.Atoi(strVal) + if err != nil { + v = 0 + } + line.EEId = v + case "Department Name": + line.DepartmentName = strVal + case "Manager": + line.Manager = strVal + } + } + + return line +} + +// I hate that this has a ton of hard-coded stuff. I'm not sure if there's a better way, though +func newHourReportLineLegacyFromRow(headers []string, row []string) HourReportLineLegacy { + line := HourReportLineLegacy{} if len(headers) != len(row) { - panic("header array and row array are different sizes in newHourReportLineFromRow") + panic("header array and row array are different sizes in newHourReportLineLegacyFromRow") } //"Paygroup", "Last Name", "First Name", "Home Department", "Manager Name", "Worked DeptName", "OT", "Reg", "Sick", "Vac", "Total" @@ -162,7 +220,6 @@ func newHourReportLineFromRow(headers []string, row []string) HourReportLine { line.Overtime = v case "Reg": - v, err := strconv.ParseFloat(strVal, 64) if err != nil { v = 0 @@ -170,7 +227,6 @@ func newHourReportLineFromRow(headers []string, row []string) HourReportLine { line.Regular = v case "Sick": - v, err := strconv.ParseFloat(strVal, 64) if err != nil { v = 0 @@ -178,7 +234,6 @@ func newHourReportLineFromRow(headers []string, row []string) HourReportLine { line.Sick = v case "Vac": - v, err := strconv.ParseFloat(strVal, 64) if err != nil { v = 0 @@ -186,7 +241,6 @@ func newHourReportLineFromRow(headers []string, row []string) HourReportLine { line.Vacation = v case "Total": - v, err := strconv.ParseFloat(strVal, 64) if err != nil { v = 0 @@ -199,6 +253,72 @@ func newHourReportLineFromRow(headers []string, row []string) HourReportLine { return line } +// I hate that this has a ton of hard-coded stuff. I'm not sure if there's a better way, though +func newHourReportLineFromRow(headers []string, row []string) HourReportLine { + line := HourReportLine{} + if len(headers) != len(row) { + panic("header array and row array are different sizes in newHourReportLineLegacyFromRow") + } + // Badge #,Brv,Hol,OT,Reg,Service,Sick,Total + + for i, header := range headers { + strVal := row[i] + switch header { + case "Badge #": + v, err := strconv.Atoi(strVal) + if err != nil { + v = 0 + } + line.EEid = v + case "Brv": + v, err := strconv.ParseFloat(strVal, 64) + if err != nil { + v = 0 + } + line.Bereavement = v + case "Hol": + v, err := strconv.ParseFloat(strVal, 64) + if err != nil { + v = 0 + } + line.Holiday = v + case "OT": + v, err := strconv.ParseFloat(strVal, 64) + if err != nil { + v = 0 + } + line.Overtime = v + case "Reg": + v, err := strconv.ParseFloat(strVal, 64) + if err != nil { + v = 0 + } + line.Regular = v + case "Service": + v, err := strconv.ParseFloat(strVal, 64) + if err != nil { + v = 0 + } + line.Service = v + case "Sick": + v, err := strconv.ParseFloat(strVal, 64) + if err != nil { + v = 0 + } + line.Sick = v + + case "Total": + v, err := strconv.ParseFloat(strVal, 64) + if err != nil { + v = 0 + } + line.Total = v + } + } + + return line +} + func loadTimeSheet(pathlike string, asyncChan chan<- *HourReportLoadTask) { f, err := os.OpenFile(pathlike, os.O_RDONLY, 0755) if err != nil { @@ -221,7 +341,7 @@ func loadTimeSheet(pathlike string, asyncChan chan<- *HourReportLoadTask) { close(asyncChan) } -func (line HourReportLine) ToQueryBlock() string { +func (line HourReportLineLegacy) ToQueryBlock() string { return fmt.Sprintf( "('%s','%s','%s','%s','%s','%s','%d','%f','%f','%f','%f','%f','%f','%f')", line.PayGroup,