first try

This commit is contained in:
2025-11-13 07:51:17 +04:00
parent e99f67905d
commit 5505f5152c
10 changed files with 722 additions and 0 deletions

View File

@@ -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";
}
}
}