Задача
Напишите консольный калькулятор начисления за одну смену. Программа принимает обязательные аргументы --hours, --regular-limit, --regular-rate и --overtime-rate. Первые два значения — количество отработанных часов и предел обычной части смены; ставки задаются в рублях за час. Часы и ставки могут быть десятичными, но обязаны быть конечными числами. Порог относится к одной смене, считается обычным временем включительно: часы до порога оплачиваются по обычной ставке, только превышение — по ставке сверхурочных.
Программа должна вычислить обычные часы как меньшее из общего времени и лимита, сверхурочные — как превышение над лимитом, но не меньше нуля. Начисление равно сумме произведений часов каждой части на соответствующую ставку. Не вводите надбавку за ночное время, налоги, премии, округление по дням или перенос остатка часов между сменами: программа обрабатывает ровно одну смену и показывает только начисление до удержаний. Вывод должен содержать обычные часы, сверхурочные часы и итоговую сумму в рублях с двумя знаками после запятой. Денежный результат округляется до копейки один раз после сложения частей; для неотрицательной суммы ровно половина копейки округляется вверх.
Все четыре аргумента обязательны. Отклоняйте пропущенные флаги, некорректные числа, NaN и бесконечность, отрицательные часы, отрицательный лимит и отрицательные ставки. Ноль часов и нулевые ставки разрешены; нулевой лимит означает, что все отработанное время считается сверхурочным. При ошибке напечатайте краткое описание в stderr и завершитесь с ненулевым кодом, не показывая расчёт. Реализуйте вычисление отдельно от чтения аргументов, чтобы его можно было проверить обычными тестами Go.
Структура программы
Пусть main.go читает аргументы, вызывает расчёт смены и отвечает за вывод ошибки и результата. В другом файле package main реализуйте чистую функцию разбиения часов на обычные и сверхурочные и вычисления суммы; оформление строк отчёта вынесите отдельно. Тестируйте расчёт напрямую, без запуска main и os.Exit.