pankajgarg1986 Ответов: 2

Как разработать систему управления отпусками сотрудников


система управления отпусками сотрудников
работник может взять 2 отпуска в месяц.если он не берет отпуск, то отпуск будет перенесен на следующий месяц,но в общей сложности через 2 года эти переносные листья не могут быть использованы.как я могу рассчитать доступные отпуска каждый месяц?
public bool CheckLeaveStatus(int empid, DateTime date)
    {
        bool temp = false;
        int totalleave = 0;
        string qry = "select joining from profile where profileid=@id";
        MySqlParameter idP = new MySqlParameter("@id", empid);
        DataRow dr = MySqlHelper.ExecuteDataRow(Common.GetConnectionString(), qry, idP);
        if (dr != null)
        {
            DateTime joiningdate = Convert.ToDateTime(dr["joining"]);
            int legaldate = joiningdate.Day;
            if (legaldate <= 15)
            {
                totalleave += 2;
            }
            else
            {
                totalleave += 0;
            }
            //TimeSpan t1 = date - joiningdate;
            int monthspassed = Common.MonthDifference(date, joiningdate);
            if (monthspassed > 3)//then he is allowd to take leave
            {
                int startmonth = joiningdate.Month + 1;
                int endmonth = date.Month;
                int monthdiffernce = endmonth - startmonth;
              /*here i am having problem how can i written logic for two years passed from joiningdate and after that every month again two leaves issued .in this previous leave is not taken care off and leave taken count from new logic because two years passed */
                if (monthdiffernce > 24)
                {
                    monthdiffernce = 24;
                }
                int leaves = (monthdiffernce) * 2;
                int allowedleaves = leaves + totalleave;
                int availablelaves = allowedleaves - LeaveTaken(empid);
                if (availablelaves > 0)
                {
                    temp = true;
                }
            }
            //DateTime previousdate = date.AddYears(-2);
        }
        return temp;
    }
 public int LeaveTaken(int empid)
    {
        try
        {
            int taken = 0;
            string qry = "select count(*) from leavestatus where empid=@id";
            MySqlParameter idP = new MySqlParameter("@id", empid);
            taken = Convert.ToInt32(MySqlHelper.ExecuteScalar(Common.GetConnectionString(), qry, idP));
            return taken;
        }
        catch
        {
            return 0;
        }
    }
    public void AddLeaves(int empid, DateTime date, string status)
    {
        if (status == "L")
        {
            string qry = "insert into leavestatus(empid,takenon)values(@empid,@takenon)";
            MySqlParameter idP = new MySqlParameter("@empid", empid);
            MySqlParameter takenonP = new MySqlParameter("@takenon", date);
            MySqlParameter[] p = { idP, takenonP };
            MySqlHelper.ExecuteNonQuery(Common.GetConnectionString(), qry, p);
        }
    }


Что я уже пробовал:

как я могу это сделать? пожалуйста, скажите мне

Suvendu Shekhar Giri

Что вы пробовали до сих пор?

buffedcheesy

Было бы полезно рассказать нам, с какой системой вы работаете, используете ли вы sql server или локальную БД и т. д.

pankajgarg1986

я использую sql server с asp .net c#

2 Ответов

Рейтинг:
2

OriginalGriff

Начните с определения стажа работы сотрудника в целых месяцах.
Возьмите минимум этого и 24-это общее количество месяцев-и вычислите дату начала с этой и текущей даты.
Посмотрите назад в своих записях до даты начала и подсчитайте количество листьев. Удвойте общее количество месяцев и вычтите число, которое он взял.

Это всего лишь грубое предположение, основанное на практике "хорошо для сотрудника". Ваша компания может иметь более ограничительные практики, и если это так, вам нужно будет включить их. Вполне возможно, вам придется включить своего рода" взгляд вперед", чтобы позволить сотруднику использовать отпуск летом, который он получит в последующие месяцы - это довольно нормально в реальном мире, но может оказаться ненужным для этого упражнения.


pankajgarg1986

как я могу рассчитать, что прошло два года и работник может использовать не взятый отпуск до 2 лет, после чего все пропущенные отпуска не переносятся вперед.

OriginalGriff

- Простите? не хотите ли попытаться объяснить это более подробно?
Помните, что мы не можем видеть ваш экран, получить доступ к вашему жесткому диску или прочитать ваши мысли.

pankajgarg1986

каждый месяц работник может взять 2 отпуска, а через месяц, если он берет меньше 2 отпусков, предположим, 1, то остается 1 отпуск, который действителен в течение двух лет.он может взять эти листья + 2 листа в ближайшие месяцы и так далее. но эти переносные листья нельзя использовать после того, как прошло два года.

OriginalGriff

Хорошо , а как вы их храните?

pankajgarg1986

у меня нет идеи, пожалуйста, предложите

OriginalGriff

ОК. Вы, вероятно, используете какую-то БД, да?
Да-вы добавили, что используете SQL server.
Так...какие таблицы у вас есть, и что вы храните в них?

Maciej Los

Похоже, у вас нет никаких проблем с дизайном. Ваш вопрос заключается в том, как написать правильный алгоритм? Воспользуйся Улучшить вопрос виджет и переместите этот код к вопросу. Укажите, какая часть алгоритма не работает.

Рейтинг:
2

Patrice T

Настоящий кодекс:

if (legaldate <= 15)
{
    totalleave += 2;
}
else
{
    totalleave += 0;
}

может быть упрощен до
if (legaldate <= 15)
{
    totalleave += 2;
}

потому что
totalleave += 0;

ничего не делать.

Если у вас есть проблема в вашем коде, задайте вопрос.

Если ваша проблема:
Мацей Лос написал:
Ваш вопрос заключается в том, как написать правильный алгоритм?

Я рекомендую изучить некоторые методы анализа, Метод Дейкстры сверху вниз это хорошее начало.
https://en.wikipedia.org/wiki/Top-down_and_bottom-up_design[^]
https://en.wikipedia.org/wiki/Structured_programming[^]
https://en.wikipedia.org/wiki/Edsger_W._Dijkstra[^]
https://www.cs.utexas.edu/users/EWD/ewd03xx/EWD316.PDF[^]