Files
ProgLab2/Models/SalaryData.cs
2025-11-13 07:51:17 +04:00

85 lines
3.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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";
}
}
}