85 lines
3.5 KiB
C#
85 lines
3.5 KiB
C#
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";
|
||
}
|
||
}
|
||
}
|