first try
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
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";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user