using System; namespace su.divan2000.SalaryApp.Models { public class SalaryData { // Входные данные public double SalaryBase { get; private set; } public int DaysWorked { get; private set; } public int NightShifts { get; private set; } public int OvertimeHours { get; private set; } public int ExperienceYears { get; private set; } public bool HasViolations { get; private set; } // Результаты расчёта public double Bonus { get; private set; } public double Penalty { get; private set; } public double Tax { get; private set; } public double TotalSalary { get; private set; } public DateTime CalculationDate { get; private set; } // Константы расчёта private const double NightShiftBonusRate = 0.20; // 20% от дневной ставки private const double OvertimeRate = 300.0; // руб/час private const double TaxRate = 0.13; // 13% НДФЛ private const double ViolationPenaltyRate = 0.15; // 15% штраф при нарушениях public SalaryData(double salaryBase, int daysWorked, int nightShifts, int overtimeHours, int experienceYears, bool hasViolations) { if (daysWorked <= 0) throw new ArgumentException("Количество рабочих дней должно быть больше нуля."); if (nightShifts < 0 || nightShifts > daysWorked) throw new ArgumentException("Ночных смен не может быть больше отработанных дней и меньше нуля."); if (overtimeHours < 0) throw new ArgumentException("Сверхурочные часы не могут быть отрицательными."); if (salaryBase <= 0) throw new ArgumentException("Оклад должен быть положительным."); SalaryBase = salaryBase; DaysWorked = daysWorked; NightShifts = nightShifts; OvertimeHours = overtimeHours; ExperienceYears = experienceYears; HasViolations = hasViolations; } public void CalculateSalary() { double dailyRate = SalaryBase / DaysWorked; double nightBonus = dailyRate * NightShifts * NightShiftBonusRate; double overtimePay = OvertimeHours * OvertimeRate; double experienceBonus = 0; if (ExperienceYears > 10) experienceBonus = SalaryBase * 0.20; else if (ExperienceYears > 5) experienceBonus = SalaryBase * 0.10; Bonus = nightBonus + overtimePay + experienceBonus; double subtotal = SalaryBase + Bonus; Penalty = HasViolations ? subtotal * ViolationPenaltyRate : 0; subtotal -= Penalty; Tax = subtotal * TaxRate; TotalSalary = subtotal - Tax; CalculationDate = DateTime.Now; } public override string ToString() { return $"Дата расчёта: {CalculationDate:d}\n" + $"Оклад: {SalaryBase:F2} руб.\n" + $"Премия: {Bonus:F2} руб.\n" + $"Штраф: {Penalty:F2} руб.\n" + $"Налог: {Tax:F2} руб.\n" + $"Итого: {TotalSalary:F2} руб.\n"; } } }