IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Daňové odpisy

výběr z kódu

plain-text

**********************************************************************************************
**********************************************************************************************
Třída Přehled Majetku - přehled položek majetku.
**********************************************************************************************
**********************************************************************************************

    public partial class PrehledMajetku : Form
    {
        /// <summary>
        /// Řádek ve vystupPrehledListView.
        /// </summary>
        private ListViewItem item;
        /// <summary>
        /// Instance třídy Filtrovac - práce s databází.
        /// </summary>
        Filtrovac filtrovac = new Filtrovac();
        /// <summary>
        /// Převzato - řazení sloupců.
        /// </summary>
        private ListViewColumnSorter lvwColumnSorter;
        /// <summary>
        /// Pole představující parametry pro filtr.
        /// </summary>
        private string[] filtr = new string[6];

        /// <summary>
        /// Konstruktor - úvodní nastavení.
        /// </summary>
        public PrehledMajetku()
        {
            InitializeComponent();
            NactiToolTipy();
            //úvodní zobrazení
            idDotextBox.Text = "100";
            datumOdDateTimePicker.Text= "1.1.2000";
            datumDoDateTimePicker.Text = DateTime.Now.ToShortDateString();
            odpisovaSkupComboBox.SelectedIndex = 0;
            ZobrazMajetek();
            //kliknutí na řádek vystupPrehledListView
            vystupPrehledListView.MouseDown += new MouseEventHandler(this.vystupPrehledListView_MouseDown);
            //řazení sloucpů
            lvwColumnSorter = new ListViewColumnSorter();
            this.vystupPrehledListView.ListViewItemSorter = lvwColumnSorter;
            this.vystupPrehledListView.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.vystupPrehledListView_ColumnClick);
        }

        /// <summary>
        /// Metoda pro výpis vybraného majetku na vystupListView.
        /// Volá metodu Zobraz ve tříde Filtrovač s parametrem NastavFiltr()
        /// </summary>
        private void ZobrazMajetek()
        {
            foreach (string[] radek in filtrovac.Zobraz(NastavFiltr()))
            {
                item = new ListViewItem(radek);
                vystupPrehledListView.Items.Add(item);
            }
         }

        /// <summary>
        /// Metoda, která nastaví parametry filtru dle zadaných údajů uživatelem pro zobrazení vybraných položek majetku.
        /// </summary>
        /// <returns>string[] parametry pro filtr</returns>
        private string[] NastavFiltr()
        {           
            for (int i = 0; i < filtr.Length; i++)
                filtr[i] = "0";
            if (nazevTextBox.Text != "")
                filtr[0] = nazevTextBox.Text;
            if (idOdtextBox.Text != "")
                filtr[1] = idOdtextBox.Text;
            if (idDotextBox.Text != "")
                filtr[2] = idDotextBox.Text;
            filtr[3] = datumOdDateTimePicker.Value.ToString();
            filtr[4] = datumDoDateTimePicker.Value.ToString();
            filtr[5] = (odpisovaSkupComboBox.SelectedIndex).ToString();
            vystupPrehledListView.Items.Clear();
            return filtr;
        }

        /// <summary>
        /// Otevře okno pro přidání okno (formulář) položky majetku.
        /// </summary>
        private void pridejPolozkuButton_Click(object sender, EventArgs e)
        {
            PridavacMajetku novy = new PridavacMajetku();
            novy.ShowDialog();
        }

        /// <summary>
        /// Reakce při dvojkliku - otevření příslušné položky majetku (přepnutí do kalkulátoru odpisů).
        /// </summary>
        private void vystupPrehledListView_MouseDown(Object sender, MouseEventArgs e)
        {
            // e.Clicks == 2 - dvojklik
            if ((e.Button == MouseButtons.Left) && (e.Clicks == 2))
            {
                    int id = int.Parse(vystupPrehledListView.SelectedItems[0].SubItems[0].Text);
                    Odpisovac odpisovac = new Odpisovac(filtrovac.VratDleID(id));
                    odpisovac.ShowDialog();
            }
        }

        /// <summary>
        /// Zkontroluje údaje zadané uživatelem a volá metoda ZobrazMajetek() pro výpis vybraných položek majetku.
        /// </summary>
        private void filtrujButton_Click(object sender, EventArgs e)
        {
            long id1;
            long id2;
            string s1 = "0";
            string s2 = "0";
            if (idOdtextBox.Text != "")
                s1 = idOdtextBox.Text;
            if (idDotextBox.Text != "")
                s2 = idDotextBox.Text;
            if (!long.TryParse(s1, out id1)  | !long.TryParse(s2, out id2) | id1 < 0 | id2 < 0 | id1 > id2)
                MessageBox.Show("Neplatné ID - ID musí být nezáporné celé číslo, kde ID od je větší nebo rovno do!", "Zpráva", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            else if (datumOdDateTimePicker.Value > datumDoDateTimePicker.Value)
                MessageBox.Show("Datum od musí být větší nebo stejné jako datum do!", "Zpráva", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            else
                ZobrazMajetek();
        }

        /// <summary>
        /// Nastaví všechny políčka filtru na původní hodnotu.
        /// </summary>
        private void resetButton_Click(object sender, EventArgs e)
        {
            nazevTextBox.Text = "";
            idOdtextBox.Text = "";
            idDotextBox.Text = "100";
            odpisovaSkupComboBox.SelectedIndex = 0;
            datumOdDateTimePicker.Text = "1.1.2000";
            datumDoDateTimePicker.Text = DateTime.Now.ToShortDateString();
            ZobrazMajetek();
        }
...
}

**********************************************************************************************
**********************************************************************************************
Filtrovac - třída pro práci s databází - vrací výstup zpět Třídě PřehledMajetku
**********************************************************************************************
**********************************************************************************************

    class Filtrovac
    {
        /// <summary>
        /// Kontext databáze.
        /// </summary>
        DataClassesDataContext kontext = new DataClassesDataContext();
        /// <summary>
        /// Proměnná název položky majetku.
        /// </summary>
        string nazev = "";
        /// <summary>
        /// Oveření použítí názvu ve filtru.
        /// </summary>
        bool nazevAno = false;
        /// <summary>
        /// ID majetku od kterého se vyhledává.
        /// </summary>
        long idOd;
        /// <summary>
        /// ID majetku do kterého se vyhledává.
        /// </summary>
        long idDo;
        /// <summary>
        /// Datum pořízení majetku od kterého se vyhledává.
        /// </summary>
        DateTime datumOd;
        /// <summary>
        /// Datum majetku do kterého vyhledává.
        /// </summary>
        DateTime datumDo;
        /// <summary>
        /// Odpisová skupina majetku.
        /// </summary>
        int odpisovaSkupina = 0;
        /// <summary>
        /// Oveření pouzžití odpisové skupiny ve filtru.
        /// </summary>
        bool odpisovaSkupinaAno = false;

        public Filtrovac()
        {

        }



        /// <summary>
        /// Metoda dle zadaných parametrů filtruje položky majetku z databáze.
        /// </summary>
        /// <param name="filtr">Vstup převzatý z PrehledMajetku.</param>
        /// <returns>List výběr (z db)</returns>
        public List<string[]> Zobraz(string[] filtr)
        {

            NastavHodnotyFiltru(filtr);
            List<string[]> vyber = new List<string[]>();

            var dotaz = from r in kontext.Majeteks
                        where (r.MajetekID == 0)
                        select new { MajetekID = r.MajetekID.ToString(), r.Name, Price = r.Price.ToString(), Date = r.Date.ToShortDateString(), Group = r.Group.ToString() };
            if (!nazevAno & !odpisovaSkupinaAno)
            {
                var dotaz1 = from r in kontext.Majeteks
                             where (r.MajetekID >= idOd & r.MajetekID <= idDo
                             & r.Date >= datumOd & r.Date <= datumDo)
                             select new { MajetekID = r.MajetekID.ToString(), r.Name, Price = r.Price.ToString(), Date = r.Date.ToShortDateString(), Group = r.Group.ToString() };
                dotaz = dotaz1;
            }
            else if (nazevAno & !odpisovaSkupinaAno)
            {
                var dotaz2 = from r in kontext.Majeteks
                             where (r.MajetekID >= idOd & r.MajetekID <= idDo
                         & r.Date >= datumOd & r.Date <= datumDo
                         & r.Name.ToLower().Contains(nazev.ToLower())
                         )
                             select new { MajetekID = r.MajetekID.ToString(), r.Name, Price = r.Price.ToString(), Date = r.Date.ToShortDateString(), Group = r.Group.ToString() };
                dotaz = dotaz2;
            }
            else if (!nazevAno & odpisovaSkupinaAno)
            {
                var dotaz3 = from r in kontext.Majeteks
                             where (r.MajetekID >= idOd & r.MajetekID <= idDo
                             & r.Date >= datumOd & r.Date <= datumDo
                             & r.Group == odpisovaSkupina)
                             select new { MajetekID = r.MajetekID.ToString(), r.Name, Price = r.Price.ToString(), Date = r.Date.ToShortDateString(), Group = r.Group.ToString() };
                dotaz = dotaz3;
            }
            else if (nazevAno & odpisovaSkupinaAno)
            {
                var dotaz4 = from r in kontext.Majeteks
                             where (r.MajetekID >= idOd & r.MajetekID <= idDo
                             & r.Date >= datumOd & r.Date <= datumDo
                             & r.Name.ToLower().Contains(nazev.ToLower())
                             & r.Group == odpisovaSkupina)
                             select new { MajetekID = r.MajetekID.ToString(), r.Name, Price = r.Price.ToString(), Date = r.Date.ToShortDateString(), Group = r.Group.ToString() };
                dotaz = dotaz4;
            }
            foreach (var row in dotaz)
            {
                string d = row.ToString();
                filtr = d.Split(',');
                vyber.Add(filtr);
            }
            vyber = Vycisti(vyber);
            return vyber;
        }

        /// <summary>
        /// Nastaví úvodní hodnoty filtru
        /// </summary>
        /// <param name="filtr">Vstup převzatý z formuláře PrehledMajetku.</param>
        private void NastavHodnotyFiltru(string[] filtr)
        {
            nazevAno = false;
            odpisovaSkupina = 0;
            odpisovaSkupinaAno = false;
            if (filtr[0] != "0")
            {
                nazev = filtr[0];
                nazevAno = true;
            }
            idOd = long.Parse(filtr[1]);
            if (filtr[2] != "0")
                idDo = long.Parse(filtr[2]);
            else
                idDo = 9999999999;
            datumOd = DateTime.Parse(filtr[3]);
            datumDo = DateTime.Parse(filtr[4]);
            if (filtr[5] != "0")
            {
                odpisovaSkupina = int.Parse(filtr[5]) - 1;
                odpisovaSkupinaAno = true;
            }
        }

        /// <summary>
        /// Vyhledá v databází údaj dle ID majetku.
        /// </summary>
        /// <param name="id">ID majetku.</param>
        /// <returns>Pole z požadovanými údaji, najitými v databází dle ID majetku.</returns>
        public string[] VratDleID(int id)
        {
            string[] filtr = new string[6];
            var dotaz = from r in kontext.Majeteks
                        where (r.MajetekID == id)
                        select new { MajetekID = r.MajetekID.ToString(), r.Name, Price = r.Price.ToString(), Date = r.Date.ToShortDateString(), Group = r.Group.ToString() };
            foreach (var row in dotaz)
            {
                string d = row.ToString();
                filtr = d.Split(',');
            }
            filtr = VycistiRadek(filtr);
            return filtr;
        }

        /// <summary>
        /// Metoda, která opakovaně volá (po jednotlivých "řádcích"/polích v listu) metodu VycistiRadek.
        /// </summary>
        /// <param name="vyber">List výběr</param>
        /// <returns>List výběr očištěný o nepotřebné znaky</returns>
        private List<string[]> Vycisti(List<string[]> vyber)
        {
            foreach (string[] radek in vyber)
            {
                VycistiRadek(radek);
                //+1 u zobrazení odpisové skupiny (indexace od nuly +1)
                radek[radek.Length - 1] = (int.Parse(radek[radek.Length - 1]) + 1).ToString();
            }
            return vyber;
        }

        /// <summary>
        /// Metoda, která upravuje výběr z databáze - odebítá nepotřebné znaky (např. "{Name = něco" -> "něco")
        /// </summary>
        /// <param name="vyber">pole řádek</param>
        /// <returns>pole řádek očištěný o nepotřebné znaky</returns>
        private string[] VycistiRadek(string[] radek)
        {
            int p;
            int delka = radek.Length;
            //úprava pro začátek a střed řádku
            for (int l = 0; l < delka - 1; l++)
            {

                p = radek[l].IndexOf('=');
                radek[l] = radek[l].Remove(0, p + 2);
            }
            //úprava pro konec řádku
            p = radek[delka - 1].IndexOf('=');
            radek[delka - 1] = radek[delka - 1].Remove(0, p + 2);
            p = radek[delka - 1].IndexOf('}');
            radek[delka - 1] = radek[delka - 1].Remove(p - 1, 2);
            return radek;
        }

    }

**********************************************************************************************
**********************************************************************************************
Odpisovač - metoda pro zobrazení odpisů a startu jejich výpočtu.
**********************************************************************************************
**********************************************************************************************
    public partial class Odpisovac : Form
    {
        /// <summary>
        /// Pořizovací cena majetku pro počítání odpisů.
        /// </summary>
        private decimal Cena { get; set; }
        /// <summary>
        /// Vlastnost pro datum zařazení majetku do používání.
        /// </summary>
        private DateTime Datum { get; set; }
        /// <summary>
        /// Řádek ve vystupListView.
        /// </summary>
        private ListViewItem item;
         /// <summary>
        /// Proměnná pro typ odpisů (zrychlené = true, rovnoměrné = false)
        /// </summary>
        private bool typ;
        /// <summary>
        /// ID položky příslušného majetku v databázi.
        /// (vztah 1 majetek...n odpisů)
        /// </summary>
        private long MajetekID { get; set; }
        /// <summary>
        /// Název položky majetku.
        /// </summary>
        string Nazev { get; set; }
        /// <summary>
        /// Odpisová skupina majetku.
        /// </summary>
        private int OdpisovaSkupina { get; set; }
        /// <summary>
        /// Instance třídy kalkulátor, kde probíhá výpočet odpisů dle zadaných parametrů.
        /// </summary>
        Kalkulator kalkulator = new Kalkulator();
        /// <summary>
        /// Instance třídy filtrovac odpisů - pro práci s databází.
        /// </summary>
        FiltrovacOdpisu filtrovac = new FiltrovacOdpisu();

        /// <summary>
        /// Konstruktor - nastavení úvodních hodnot
        /// </summary>
        /// <param name="identifikace">Pole parametrů (vstupů) v daném pořadí.</param>
        public Odpisovac(string[] identifikace)
        {
            InitializeComponent();
            MajetekID = long.Parse(identifikace[0]);
            Nazev = identifikace[1];
            cenaTextBox.Text = (decimal.Parse(identifikace[2].Remove(identifikace[2].Length - 3, 3))).ToString();
            datumDateTimePicker.Value = DateTime.Parse(identifikace[3]);
            odpisovaSkupinaComboBox.SelectedIndex = int.Parse(identifikace[4]);
            cenaTextBox.ReadOnly = true;
            datumDateTimePicker.Enabled = false;
            odpisovaSkupinaComboBox.Enabled = false;
            upravButton.Hide();
            NactiToolTipy();
            Vypis(filtrovac.ZobrazDleMajetekID(MajetekID));
            if (filtrovac.ZobrazDleMajetekID(MajetekID).Count != 0)
                Zamkni();
        }

        /// <summary>
        /// Reakce na tlačítko Vypočti - kontrola vstupů a volání metod pro vypsání(výpočet) odpisů.
        /// </summary>
        private void vypoctiButton_Click(object sender, EventArgs e)
        {
            //pomocná proměnná (true při zjištěné chybě)
            bool chyba = false;
            decimal cena;
            typ = zrychleneRadioButton.Checked;
            //kontrola vstupů
            if (!decimal.TryParse(cenaTextBox.Text, out cena) | (cena < 2000))
            {
                MessageBox.Show("Neplatná hodnota - Pořizovací cena! Pořizovací cena musí být vyšší než 2 000!", "Zpráva", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                chyba = true;
            }
            //spuštění nastavení a výpočtů
            if (!chyba)
            {
                
                Cena = Math.Ceiling(cena);
                Datum = datumDateTimePicker.Value;
                OdpisovaSkupina = odpisovaSkupinaComboBox.SelectedIndex;
                Vypis(kalkulator.Vypocti(typ, Cena, Datum, OdpisovaSkupina));
            }
        }

        /// <summary>
        /// Metoda pro vypsání 1 naformátovaného řádku tabulky (vystupListView).
        /// </summary>
        private void Vypis(List<string[]> list)
        {
            vystupListView.Items.Clear();
            foreach (string[] radek in list)
            {
                for (int i = 0; i < radek.Length; i++)
                {
                    if (radek[i].Contains(".00"))
                        radek[i] = radek[i].Remove(radek[i].Length - 3, 3);
                }
                item = new ListViewItem(radek);
                vystupListView.Items.Add(item);
            }
        }

        /// <summary>
        /// Metoda naplní list náplň (z vystupListView) a volá metodu pro uložení náplně do databáze.
        /// V případě, že první krok proběhne v pořádku, volá metodu pro zamknutí možností výpočtu.
        /// </summary>
        private void ulozButton_Click(object sender, EventArgs e)
        {
            List <string[]> napln = new List<string[]>();
            int i = 0;
            
            if (vystupListView.Items.Count == 0)
                MessageBox.Show("Chybí vstupní data pro vytvoření souboru.", "Zpráva", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            else
            {
                foreach (ListViewItem item in vystupListView.Items)
                {
                    string[] zaznam = new string[5];
                    item.Selected = true;
                    //nastaveni vystupu
                    zaznam[4] = MajetekID.ToString();
                    for (int j = 0; j < zaznam.Length - 1; j++)
                    {
                        zaznam[j] = vystupListView.SelectedItems[i].SubItems[j].Text;
                    }
                    napln.Add(zaznam);
                    i++;
                }
                filtrovac.UlozDoDb(napln, MajetekID);
                MessageBox.Show("Uloženo", "Zpráva", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                Zamkni();
            }
        }

        /// <summary>
        /// Tlačítko Uprav volá metodu pro odemknutí možností výpočtu.
        /// </summary>
        private void upravButton_Click(object sender, EventArgs e)
        {
            Odemkni();
        }

        /// <summary>
        /// Metoda uzamyká možnosti výpočtu a uložení do databáze.
        /// </summary>
        private void Zamkni()
        {
            upravButton.Show();
            ulozButton.Hide();
            vypoctiButton.Hide();
        }

        /// <summary>
        /// Metoda odemyká možnosti výpočtu a uložení do databáze.
        /// </summary>
        private void Odemkni()
        {
            ulozButton.Show();
            vypoctiButton.Show();
            upravButton.Hide();
        }

    }

**********************************************************************************************
**********************************************************************************************
Třída Kalkulátor pro samotný výpočet odpisů.
**********************************************************************************************
**********************************************************************************************
    class Kalkulator
    {

        /// <summary>
        /// Proměnná pro pořizovací cenu majetku.
        /// </summary>
        private decimal cena;
        /// <summary>
        /// Proměnná pro zůstatkovou cenu.
        /// </summary>
        private decimal zcena;
        /// <summary>
        /// Proměnná pro počet let (dle odpisové třídy zadané uživatelem)
        /// </summary>
        private byte PocetLet { get; set; }
        /// <summary>
        /// Proměnná pro rok pořízení majetku a začátku jeho odpisování (zadáná uživatelem).
        /// </summary>
        private int letopocet; 
        /// <summary>
        /// Proměnná představující částku odpisu v daném roce.
        /// </summary>
        private decimal odpis; 
        /// <summary>
        /// Pole pro počty let odpisování definované zákonem dle odpisových skupin.
        /// </summary>
        byte[] poctyLet = { 3, 5, 10, 20, 30, 50 };
        /// <summary>
        /// Pole pro koeficienty rovnoměrného odpisování definované zákonem dle odpisových skupin.
        /// </summary>
        decimal[] koeficienty = { 40, 22.25m, 10.5m, 5.15m, 3.4m, 2.02m };
        /// <summary>
        /// Promenná představující koeficient u rovnoměrných odpisů.
        /// </summary>
        private decimal Koeficient { get; set; }
        private int odpisovaSkupina;
        /// <summary>
        ///  Vlastnost odpisová skupina - při její změně dochází i k nastavení koeficientu a počtu let.
        /// </summary>
        private int OdpisovaSkupina
        {
            get
            {
                return odpisovaSkupina;
            }
            set
            {
                odpisovaSkupina = value;
                Koeficient = koeficienty[odpisovaSkupina];
                PocetLet = poctyLet[odpisovaSkupina];
            }
        }
        /// <summary>
        /// List polí výsledku výpočtu daňových odpisů.
        /// </summary>
        private List<string[]> vypocet = new List<string[]>();

        /// <summary>
        /// Metoda nastavuje hodnoty výpočtu dle zadaných parametrů a volá metodu představující příslušný způsob výpočtu.
        /// </summary>
        /// <param name="typ">Odpisy zrychlené true, rovnoměrné false</param>
        /// <param name="cena">Cena pořízení majetku.</param>
        /// <param name="datum">Datum zařazení do užívání.</param>
        /// <param name="odpisSkup">Odpisová skupina majetku.</param>
        /// <returns></returns>
        public List<string[]> Vypocti(bool typ, decimal cena, DateTime datum, int odpisSkup)
        {
            this.cena = cena;
            zcena = cena;
            OdpisovaSkupina = odpisSkup;
            letopocet = datum.Year;
            vypocet.Clear();
            if (typ)
                ZrychleneOdpis();
            else
                RovnomerneOdpis();
            return vypocet;
        }

        /// <summary>
        /// Metoda pro výpočt zrychlených odpisů.
        /// Volá metodu ZahrnDoListu() pro zařazení výpočtu daného roku do listu vypocet.
        /// </summary>
        private void ZrychleneOdpis()
        {
            odpis = Math.Ceiling(zcena / PocetLet);
            zcena = zcena - odpis;
            ZahrnDoListu();
            letopocet = letopocet + 1;
            for (int i = 1; i < PocetLet; i++)
            {
                odpis = Math.Ceiling(2 * zcena / (PocetLet + 1 - i));
                zcena = zcena - odpis;
                ZahrnDoListu();
                letopocet = letopocet + 1;
            }
        }

        /// <summary>
        /// Metoda pro výpočet rovnoměrných odpisů.
        /// Volá metodu ZahrnDoListu() pro zařazení výpočtu daného roku do listu vypocet.
        /// </summary>
        private void RovnomerneOdpis()
        {
            odpis = cena * (100 - (Koeficient * (PocetLet - 1))) / 100;
            odpis = Math.Ceiling(odpis);
            zcena = zcena - odpis;
            ZahrnDoListu();
            letopocet = letopocet + 1;
            for (int i = 1; i < PocetLet; i++)
            {
                if (i == PocetLet - 1 & zcena < odpis)
                {
                    odpis = zcena;
                    zcena = zcena - odpis;
                    ZahrnDoListu();
                }
                else
                {
                    odpis = cena * Koeficient / 100;
                    odpis = Math.Ceiling(odpis);
                    zcena = zcena - odpis;
                    ZahrnDoListu();
                    letopocet = letopocet + 1;
                }
            }
        }

        /// <summary>
        /// Metoda přidá výpočet 1 roku (který představuje 1 řádek ve na výstupu) do listu výpočet.
        /// </summary>
        private void ZahrnDoListu()
        {
            string[] zaznam = new string[4];
            zaznam[0] = letopocet.ToString();
            zaznam[1] = odpis.ToString();
            zaznam[2] = zcena.ToString();
            zaznam[3] = (cena-zcena).ToString();
            vypocet.Add(zaznam);
        }

    }

**********************************************************************************************
**********************************************************************************************

Neformátovaný

Přidáno: 8.6.2013
Expirace: Neuvedeno

Aktivity