Laba2 Tikhonov

mail@pastecode.io avatar
unknown
csharp
2 years ago
17 kB
9
Indexable
Never
using System;
using System.Collections.Generic;
using static ConsoleApp8.Program;
using System.IO;

namespace ConsoleApp8
{
    internal class Program
    {
        static void PrintMenu()
        {
            Console.WriteLine("1 - Добавить запись \r\n2 - Просмотреть записи \r\n3 - Изменить запись \r\n4 - Удалить запись \r\n5 - Сгенерировать отчет \r\n6 - Выход");
        }
        static MainRecord Inp()
        {
            MainRecord mainRecord = new MainRecord();
            MainRecord1 mainRecord1 = new MainRecord1();
            MainRecord2 mainRecord2 = new MainRecord2();
            Console.WriteLine("Введите имя клиента:");
            mainRecord.Client = Console.ReadLine();

            string[] clientList = mainRecord.Client.Split(" ");

            if (clientList.Length == 1)
            {
                Console.WriteLine("Введите фамилию");
                mainRecord1.surname = Console.ReadLine();
            }
            else
            {
                Console.WriteLine("Введите отчество");
                mainRecord2.lastname = Console.ReadLine();
            }

            Console.WriteLine("Введите дату начала в формате: 'ГГГГ-ММ-ДД':");
            mainRecord.StartDate = Console.ReadLine();

            Console.WriteLine("Введите дату окончания в формате: 'ГГГГ-ММ-ДД':");
            mainRecord.FinishDate = Console.ReadLine();

            Console.WriteLine("Введите стоимость:");
            mainRecord.Price = Console.ReadLine();

            return mainRecord;
        }
        static void Main(string[] args)
        {

            Loader loader = new Loader();
            MainRecord rec = new MainRecord();
            List<MainRecord> mainRecords = new List<MainRecord>();
            MainRecord mainRecord = new MainRecord();

            PrintMenu();

            int sch = 1;
            string xz = "-1";
            while (xz != "6")
            {
                xz = Console.ReadLine();
                switch (xz)
                {
                    case "1":
                        mainRecord.id = sch;
                        sch++;
                        do
                        {
                            MainRecord mainRecord3 = new MainRecord();
                            mainRecord3 = Inp();
                            mainRecord.Client = mainRecord3.Client;
                            mainRecord.StartDate = mainRecord3.StartDate;
                            mainRecord.FinishDate = mainRecord3.FinishDate;
                            mainRecord.Price = mainRecord3.Price;

                            rec = loader.Sav(mainRecord);

                            if ((rec.StartDate == "-") || (rec.FinishDate == "-"))
                            {
                                Console.WriteLine("Неправильный формат даты. Введите данные заново.");
                            }


                        }
                        while ((rec.StartDate == "-") || (rec.FinishDate == "-"));
                        Console.WriteLine("Запись добавлена");
                        break;
                    case "2":
                        List<MainRecord> records = loader.GetRecords();

                        if (records.Count == 0)
                        {
                            Console.WriteLine("Записи отсутсвуют.");
                        }
                        else
                        {
                            Console.WriteLine();
                            foreach (MainRecord record in records)
                            {
                                Console.WriteLine($"id: {record.id} | Клиент: {record.Client} | Дата начала: {record.StartDate} | Дата окончания: {record.FinishDate} | Стоимость: {record.Price}\n");
                            }
                        }

                        break;
                    case "3":
                        Console.WriteLine("Введите id записи, которую нужно изменить");
                        mainRecord.id = Convert.ToInt32(Console.ReadLine());
                        do
                        {

                            MainRecord mainRecord3 = new MainRecord();
                            mainRecord3 = Inp();
                            mainRecord.Client = mainRecord3.Client;
                            mainRecord.StartDate = mainRecord3.StartDate;
                            mainRecord.FinishDate = mainRecord3.FinishDate;
                            mainRecord.Price = mainRecord3.Price;
                            rec = loader.EditRecords(mainRecord);

                            if ((rec.StartDate == "-") || (rec.FinishDate == "-"))
                            {
                                Console.WriteLine("Неправильный формат даты. Введите данные заново.");
                            }


                        }
                        while ((rec.StartDate == "-") || (rec.FinishDate == "-"));
                        Console.WriteLine("Запись изменена");
                        break;
                    case "4":
                        Console.WriteLine("Введите id записи, которую нужно удвлить:");
                        try
                        {
                            int num = Convert.ToInt32(Console.ReadLine());
                            if (loader.Del(num) == true)
                            {
                                
                                Console.WriteLine("Запись удалена");
                            } else
                            {
                                Console.WriteLine("Неверный id.");
                            }
                        } catch {
                            Console.WriteLine("Ошибка.");
                        }
                        break;
                    case "6":
                        Console.WriteLine("Вы вышли.");
                        break;
                    case "5":
                        try
                        {
                            Console.WriteLine("Введите путь до файла:");
                            string filePath = Console.ReadLine();
                            Console.WriteLine("Введите срок ремонта от:");
                            DateOnly startDate = DateOnly.Parse(Console.ReadLine());
                            Console.WriteLine("Введите срок ремонта до:");
                            DateOnly finishDate = DateOnly.Parse(Console.ReadLine());

                            if (loader.RenderReport(filePath, startDate, finishDate))
                            {
                                Console.WriteLine("Отчет сгенерирован.");
                            } else
                            {
                                Console.WriteLine("Ошибка.");
                            }

                        } catch
                        {
                            Console.WriteLine("Неправильная дата");
                        }

                        break;
                    default:
                        break;
                }

            }
            Environment.Exit(0);
        }

        public class Loader
        {
            FileDataSource fileDataSource = new FileDataSource("C:\\Users\\theGeekBeard\\Desktop\\data.dat");

            public bool RenderReport(string filePath, DateOnly startDate, DateOnly finishDate)
            {
                List<MainRecord> records = fileDataSource.GetAll();

                int generalPrice = 0;

                foreach (MainRecord record in records)
                {
                    DateOnly StartDate = DateOnly.Parse(record.StartDate);
                    DateOnly FinishDate = DateOnly.Parse(record.FinishDate);

                    if (startDate < StartDate && finishDate > FinishDate) {
                        try
                        {
                            int price = Convert.ToInt32(record.Price);
                            generalPrice += price;
                        } catch
                        {
                            continue;
                        }
                    } 
                }

                try
                {
                    using (StreamWriter writer = new StreamWriter(filePath, true))
                    {
                        writer.Write($"\nОбщая стоимость от {startDate} до {finishDate}: {generalPrice}");
                    }
                    return true;
                }
                    catch (Exception ex)
                {
                    return false;
                }

                
            }

            public MainRecord Sav(MainRecord record)
            {
                try
                {
                    DateOnly StartDate = DateOnly.Parse(record.StartDate);
                    DateOnly FinishDate = DateOnly.Parse(record.FinishDate);

                    if (StartDate > FinishDate)
                    {
                        record.StartDate = "-";
                        return record;
                    } 

                    fileDataSource.Save(record);
                    return record;
                }
                catch (FormatException)
                {
                    record.StartDate = "-";
                    return record;
                }

            }
            
            public List<MainRecord> GetRecords()
            {
                List<MainRecord> xz = fileDataSource.GetAll();
                xz = xz.OrderBy(o => o.StartDate).ToList();
                xz = xz.OrderBy(o => o.Client).ToList();
                return xz;
            }

            public MainRecord EditRecords(MainRecord record)
            {
                try
                {
                    DateTime StartDate = DateTime.Parse(record.StartDate);
                    DateTime FinishDate = DateTime.Parse(record.FinishDate);

                    if (StartDate > FinishDate)
                    {
                        record.StartDate = "-";
                        return record;
                    }

                    fileDataSource.Edit(record);
                    return record;
                }
                catch (FormatException)
                {
                    record.StartDate = "-";
                    return record;
                }

            }

            public bool Del(int id)
            {
                return fileDataSource.Delete(id);
            }

        }
        public class MainRecord
        {
            public int id;
            public string Client;
            public string StartDate;
            public string FinishDate;
            public string Price;
        }
        public class MainRecord2 : MainRecord
        {
            public string lastname;
        }
        public class MainRecord1 : MainRecord
        {
            public string surname;
        }
        public interface IDataSource
        {

            MainRecord Save(MainRecord record);
            MainRecord Edit(MainRecord record);
            bool Delete(int id);
            List<MainRecord> GetAll();
        }

        public class FileDataSource: IDataSource
        {
            public string filePath;

            public FileDataSource(string path = "C:\\Users\\theGeekBeard\\Desktop\\data.dat")
            {
                filePath = path;
            }

            private List<MainRecord> records = new List<MainRecord>();

            public MainRecord Save(MainRecord record)
            {
                MainRecord mainRecord = new MainRecord();
                mainRecord.id = record.id;
                mainRecord.Client = record.Client;
                mainRecord.StartDate = record.StartDate;
                mainRecord.FinishDate = record.FinishDate;
                mainRecord.Price = record.Price;

                List<MainRecord> rec = GetAll();

                using (BinaryWriter writer = new BinaryWriter(File.Open(filePath, FileMode.Append)))
                {
                    writer.Write(rec.Last().id + 1);
                    writer.Write(mainRecord.Client);
                    writer.Write(mainRecord.StartDate);
                    writer.Write(mainRecord.FinishDate);
                    writer.Write(mainRecord.Price);
                }

                return record;
            }

            public MainRecord Edit(MainRecord record)
            {
                MainRecord mainRecord = new MainRecord();
                mainRecord.id = record.id;
                mainRecord.Client = record.Client;
                mainRecord.StartDate = record.StartDate;
                mainRecord.FinishDate = record.FinishDate;
                mainRecord.Price = record.Price;

                List<MainRecord> rec = GetAll();

                foreach (MainRecord recItem in rec)
                {
                    if (recItem.id == record.id)
                    {
                        rec.Remove(recItem);
                        rec.Add(record);
                        break;
                    }
                }

                if (File.Exists(filePath))
                {
                    try
                    {
                        File.Delete(filePath);
                    }
                    catch (Exception e)
                    {
                        ;
                    }
                }

                using (BinaryWriter writer = new BinaryWriter(File.Open(filePath, FileMode.Append)))
                {
                    foreach (MainRecord recItem in rec)
                    {
                        writer.Write(recItem.id);
                        writer.Write(recItem.Client);
                        writer.Write(recItem.StartDate);
                        writer.Write(recItem.FinishDate);
                        writer.Write(recItem.Price);
                    }
                }

                return record;
            }

            public bool Delete(int id)
            {

                List<MainRecord> rec = GetAll();

                foreach (MainRecord recItem in rec)
                {
                    if (recItem.id == id)
                    {
                        rec.Remove(recItem);
                        break;
                    }
                    if (recItem == rec.Last()) return false;
                }

                if (File.Exists(filePath))
                {
                    try
                    {
                        File.Delete(filePath);
                    }
                    catch (Exception e)
                    {
                        ;
                    }
                }

                using (BinaryWriter writer = new BinaryWriter(File.Open(filePath, FileMode.Append)))
                {
                    foreach (MainRecord recItem in rec)
                    {
                        writer.Write(recItem.id);
                        writer.Write(recItem.Client);
                        writer.Write(recItem.StartDate);
                        writer.Write(recItem.FinishDate);
                        writer.Write(recItem.Price);
                    }
                }
                return true;
            }
            public List<MainRecord> GetAll()
            {
                records.Clear();

                using (BinaryReader reader = new BinaryReader(File.Open("C:\\Users\\theGeekBeard\\Desktop\\data.dat", FileMode.Open)))
                {
                    while (reader.PeekChar() > -1)
                    {
                        int id = reader.ReadInt32();
                        string client = reader.ReadString();
                        string startDate = reader.ReadString();
                        string finishDate = reader.ReadString();
                        string price = reader.ReadString();

                        MainRecord mainRecord = new MainRecord();
                        mainRecord.id = id;
                        mainRecord.Client = client;
                        mainRecord.StartDate = startDate;
                        mainRecord.FinishDate = finishDate;
                        mainRecord.Price = price;

                        records.Add(mainRecord);
                    }

                }

                return records;
            }
        }

    }

}