private decimal GetSalaryPercentage(IEmployee employee, Company company)
 {
     decimal salaryPrecentage = 0.15m;
     if (employee.Department == null)
     {
         return salaryPrecentage;
     }
     salaryPrecentage = GetSalaryPercentage(employee.Department.Manager, company) - 0.01m;
     return salaryPrecentage;
 }
 public decimal GetSalary(IEmployee employee, Company company)
 {
     return (decimal)employee.SalaryFactor * GetSalaryPercentage(employee, company) * company.CEO.Salary;
 }
        private string ExecuteCreateSubDepartmentCommand(ICommand command, Company company)
        {
            string mainDepartmentName = command.Parameters[4];
            var mainDepartment = company.Departments.FirstOrDefault(d => d.Name == mainDepartmentName);
            if (mainDepartment == null)
            {
                return string.Format($"There is no department {mainDepartmentName} in {company.Name}");
            }
            string managerFirstName = command.Parameters[2];
            string managerLastName = command.Parameters[3];
            var manager = mainDepartment.Employees.FirstOrDefault(e => e.FirstName == managerFirstName && e.LastName == managerLastName);
            if (manager == null)
            {
                return string.Format($"There is no employee called {managerFirstName} {managerLastName} in department {mainDepartment.Name}");
            }

            if (!(manager is Manager))
            {
                string position = manager.GetType().Name;
                string realPosition = position[0].ToString();
                for (int i = 1; i < position.Length; i++)
                {
                    if (realPosition[i].ToString().ToUpper() == realPosition[i].ToString())
                    {
                        realPosition += " " + position[i];
                    }
                    else
                    {
                        realPosition += position[i];
                    }
                }

                return string.Format($"{managerFirstName} {managerLastName} is not a manager (real position: {position})");
            }

            string departmentName = command.Parameters[1];

            if (mainDepartment.SubDepartment.Any(sd => sd.Name == departmentName))
            {
                return string.Format($"Department {departmentName} already exists in {mainDepartment.Name}");
            }

            if (company.Departments.Any(d => d.Name == departmentName))
            {
                return string.Format($"Department {departmentName} already exists in {company.Name}");
            }

            var department = new Department(departmentName, manager as Manager);
            mainDepartment.SubDepartment.Add(department);

            return null;
        }
        private string ExecuteCreateDepartmentInCompanyCommand(ICommand command, Company company)
        {
            string managerFirstName = command.Parameters[2];
            string managerLastName = command.Parameters[3];
            var manager = company.Employees.FirstOrDefault(e => e.FirstName == managerFirstName && e.LastName == managerLastName);
            if (manager == null)
            {
                return string.Format($"There is no employee called {managerFirstName} {managerLastName} in company {company.Name}");
            }

            try
            {
                CheckEmployeeIsManager(manager);
            }
            catch (ArgumentException ex)
            {
                return ex.Message;
            }

            string departmentName = command.Parameters[1];
            if (company.Departments.Any(d => d.Name == departmentName))
            {
                return string.Format($"Department {departmentName} already exists in company {company.Name}");
            }

            var department = new Department(departmentName, manager as Manager);
            company.Departments.Add(department);

            return null;
        }
        private string ExecuteCreateCompanyCommand(ICommand command)
        {
            var ceo = new CEO(command.Parameters[1], command.Parameters[2], decimal.Parse(command.Parameters[3]));
            this.database.TotalSalaries[ceo] = 0m;
            var company = new Company(command.Parameters[0], ceo);
            if (this.database.Companies.Any(c => c.Name == company.Name))
            {
                return string.Format($"Company {company.Name} already exists");
            }
            this.database.Companies.Add(company);

            return null;
        }
 public decimal GetSalary(IEmployee employee, Company company)
 {
     return GetSalaryPercentage(employee, company) * company.Ceo.Salary * employee.SalaryFactor;
 }
        private string ExecuteCreateSubDepartmentCommand(ICommand command, Company company)
        {
            string mainDepartmentName = command.Parameters[4];
            var mainDepartment = GetDepartment(company, mainDepartmentName);

            if (mainDepartment == null)
            {
                return string.Format($"There is no department {mainDepartmentName} in {company.Name}");
            }

            string managerFirstName = command.Parameters[2];
            string managerLastName = command.Parameters[3];
            var manager = GetEmployeeByName(mainDepartment, managerFirstName, managerLastName);
            if (manager == null)
            {
                return string.Format($"There is no employee called {managerFirstName} {managerLastName} in department {mainDepartment.Name}");
            }

            try
            {
                CheckEmployeeIsManager(manager);
            }
            catch (ArgumentException ex)
            {
                return ex.Message;
            }

            string departmentName = command.Parameters[1];

            if (mainDepartment.SubDepartments.Any(sd => sd.Name == departmentName))
            {
                return string.Format($"Department {departmentName} already exists in {mainDepartment.Name}");
            }

            if (company.Departments.Any(d => departmentName == d.Name))
            {
                return string.Format($"Department {departmentName} already exists in {company.Name}");
            }

            var department = new Department(departmentName, manager as Manager);
            mainDepartment.SubDepartments.Add(department);
            return null;
        }
        private static Department GetDepartment(Company company, string mainDepartmentName)
        {
            var mainDepartment = company.Departments.FirstOrDefault(d => d.Name == mainDepartmentName);
            var subDepartments = company.Departments.SelectMany(d => d.SubDepartments);
            while (mainDepartment == null && subDepartments.Any())
            {
                mainDepartment = subDepartments.FirstOrDefault(sd => sd.Name == mainDepartmentName);
                subDepartments = subDepartments.SelectMany(sd => sd.SubDepartments);
            }

            return mainDepartment;
        }
 private string ExecuteCreateSubDepartmentInCompanyComand(ICommand command, Company company)
 {
     var mainDepartment = company.Departments.FirstOrDefault(d => d.Name == command.Parameters[4]);
     if (mainDepartment == null)
     {
         return String.Format("There is no department {0} in company {1}", command.Parameters[4], company.Name);
     }
     var manager = GetEmployeeByName(mainDepartment, command.Parameters[2], command.Parameters[3]);
     if (manager == null)
     {
         return String.Format("There is no employee called {0} {1} in department {3}", command.Parameters[2], command.Parameters[3], mainDepartment.Name);
     }
     try
     {
         CheckEmployeeIsManager(manager);
     }
     catch (ArgumentException ex)
     {
         return ex.Message;
     }
     if (mainDepartment.SubDepartments.Any(sd => sd.Name == command.Parameters[1]))
     {
         return String.Format("Departament {0} already exists in {2}", command.Parameters[1], mainDepartment.Name);
     }
     // if (mainDepartment.Employees.Where(e => e is Manager).Cast<Manager>().Any(m => company.Departments.Select(d => d.Manager).Contains(m)))
     if (company.Departments.Any(d => command.Parameters[1] == d.Name))
     {
         return String.Format("Departament {0} already exists in {2}", command.Parameters[1], company.Name);
     }
     var department = new Department(command.Parameters[1], manager as Manager);
     mainDepartment.SubDepartments.Add(department);
     //            company.Departments.Add(department);
     return null;
 }
        private string ExecuteCreateDepartmentInCompanyComand(ICommand command, Company company)
        {
            var manager = GetEmployeeByName(company, command.Parameters[2], command.Parameters[3]);
            if (manager == null)
            {
                return string.Format("There is no employee called {0} {1} in {3}", command.Parameters[2], command.Parameters[3], company.Name);
            }
            try
            {
                CheckEmployeeIsManager(manager);
            }
            catch (ArgumentException ex)
            {
                return ex.Message;
            }

            if (company.Departments.Any(d => d.Name == command.Parameters[1]))
            {
                return String.Format("Departament {0} already exists in {2}", command.Parameters[1], company.Name);
            }
            var department = new Department(command.Parameters[1], manager as Manager);
            company.Departments.Add(department);
            return null;
        }