using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
using Baza_Reklam.Classes.Helpers;
using Baza_Reklam.Classes.Interfaces;
using Baza_Reklam.Classes.Model;
using Baza_Reklam.Classes.Repositories;

namespace Baza_Reklam
{
    public partial class Facturer : Form
    {
        private int reklamaId;
        private int customerId;

        private List<Title> _titles;

        public Facturer(int rekId)
        {
            InitializeComponent();
            reklamaId = rekId;

            kLIENCITableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            kONTATableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            fAKTURYTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            rEKLAMATableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            emisjeTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            fakturA_DETAILSTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            datyWydanTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;

            TitleRepository repository = new TitleRepository(ConnString.getConnString().Value);
            _titles = repository.FindAllActive();
        }

        /// <summary>
        /// Ładuje informacje z reklamy o fakturze - jeżeli była wcześniej wystawiona proforma
        /// lub inna faktura, to w tabeli REKLAMA sa zapamietane min. daty. Jeżeli faktura jest wystawiana
        /// po raz pierwszy to wpisuje daty systemowe.
        /// </summary>
        private void Facturer_Load(object sender, EventArgs e)
        {
            rEKLAMATableAdapter.FillByReklamaId(rEKLAMADataSet.REKLAMA, reklamaId);

            if (rEKLAMABindingSource.Current != null)
            {
                DataRowView row = (DataRowView)rEKLAMABindingSource.Current;

                int idAgencji = DbUtils.idAgencji(row["SYMBOL AKWIZYTORA"].ToString());

                kONTATableAdapter.FillByIdAgencji(sLOWNIKDataSet.KONTA, idAgencji);

                rEKLAMABindingSource.ResetBindings(false);

                customerId = Convert.ToInt32(row["customerId"]);

                kLIENCITableAdapter.FillByCustomerId(rEKLAMADataSet.KLIENCI, customerId);

                if (row["id_faktury"] != DBNull.Value)
                {
                    wystawFaktureButton.Enabled = false;
                    wystawProformeButton.Enabled = false;
                    //  usunButton.Enabled = true & User.Instance().St_kierownik;

                    nUMER_ROZTextBox.Text = DbUtils.tagAgenta(row["SYMBOL AKWIZYTORA"].ToString());

                    string numer_fakt = Convert.ToString(row["FAKTURA NUMER"]);
                    string[] read = new string[3];
                    read = numer_fakt.Split("/".ToCharArray(), 3);
                    nUMERTextBox.Text = read[0];

                    groupBox2.Enabled = true & User.Instance().IsAdmin; 
                 
                }
                else
                {
                    Title title = _titles.Find(delegate(Title t) { return t.ShortName == row["TYTUŁ"].ToString(); });
                    IInvoiceProvider invoiceProvider = InvoiceProviderFactory.GetInvoiceProviderById(title.InvoiceProvider);
                    
                    nUMER_ROZTextBox.Text = DbUtils.tagAgenta(row["SYMBOL AKWIZYTORA"].ToString());
                    nUMERTextBox.Text = DbUtils.numerNowejFaktury(nUMER_ROZTextBox.Text, DateTime.Today.Year, invoiceProvider.SystemKsiegowyId).ToString();

                    if (row["FAKTURA DATA SPRZEDAŻY"] == DBNull.Value)
                    {
                        dATA_SPRZEDAZYDateTimePicker.Value = DateTime.Today;
                    }

                    if (row["FAKTURA DATA WYSTAWIENIA"] == DBNull.Value)
                    {
                        dATA_WYSTAWIENIADateTimePicker.Value = DateTime.Today;
                    }

                    if (row["Zaliczka_Data"] == DBNull.Value)
                    {
                        zaliczka_DataDateTimePicker.Value = DateTime.Today;
                    }

                    if (row["FAKTURA TERMIN ZAPŁATY"] == DBNull.Value)
                    {
                        tERMIN_ZAPLATYDateTimePicker.Value = DateTime.Today.AddDays(7);
                    }

                    sPOSOB_ZAPLATYListBox.SelectedIndex = 1;

                    rEKLAMABindingSource.EndEdit();

                    wystawFaktureButton.Enabled = true;
                    wystawProformeButton.Enabled = true;
                    // usunButton.Enabled = false;

                    //  iD_KONTAComboBox.SelectedIndex = 0;
                }
            }
        }

        /// <summary>
        /// Wyświetla szczegóły konta
        /// </summary>
        private void button1_Click(object sender, EventArgs e)
        {
            if (kONTABindingSource.Current != null)
            {
                DataRowView row = (DataRowView)kONTABindingSource.Current;
                MessageBox.Show(row["konto"].ToString());
            }
        }

        private void wystawFaktureButton_Click(object sender, EventArgs e)
        {
            Cursor = Cursors.WaitCursor;

            bool ok = false;

            // if (tYPLabel1.Text == "BEZPŁATNA"

            if (zATWIERDZONO_DO_DRUKUCheckBox.CheckState != CheckState.Checked)
            {
                MessageBox.Show("Zamówienie nie jest zatwierdzone do druku.");
                Cursor = Cursors.Default;
                return;
            }

            if (DbUtils.istniejeFaktura(Convert.ToInt32(nUMERTextBox.Text),
                nUMER_ROZTextBox.Text, dATA_WYSTAWIENIADateTimePicker.Value.Year))
            {
                MessageBox.Show("Istnieje już faktura o numerze " + nUMERTextBox.Text + "/" + nUMER_ROZTextBox.Text + "/" + dATA_WYSTAWIENIADateTimePicker.Value.Year.ToString());
                Cursor = Cursors.Default;
                return;
            }

            if (iD_KONTAComboBox.SelectedValue == null)
            {
                MessageBox.Show("Wybierz konto");
                Cursor = Cursors.Default;
                return;
            }


            if ((nipKrajTextBox.Text.Length == 0) && ((int)iD_KONTAComboBox.SelectedValue != 1))
            {
                if (MessageBox.Show("Brak kodu kraju w EU. Czy na pewno chcesz wystawić fakturę?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation)
                    == DialogResult.No)
                {
                    Cursor = Cursors.Default;
                    return;
                }
            }

            SqlConnection conn = new SqlConnection(ConnString.getConnString().Value);

            SqlTransaction transaction;

            SqlCommand command = new SqlCommand("Proc_Make_Faktura_Waluty", conn);
            command.CommandType = CommandType.StoredProcedure;

            //dodawanie parametrow 
            command.Parameters.AddWithValue("@ReklamaID", reklamaId);
            command.Parameters.AddWithValue("@FakturaNumer", nUMERTextBox.Text);
            command.Parameters.AddWithValue("@NumerRoz", nUMER_ROZTextBox.Text);

            switch (sPOSOB_ZAPLATYListBox.SelectedIndex)
            {
                case 1:
                    command.Parameters.AddWithValue("@FakturaSposobZaplaty", "Przelew");
                    break;
                case 2:
                    command.Parameters.AddWithValue("@FakturaSposobZaplaty", "Gotówka");
                    break;
                case 3:
                    command.Parameters.AddWithValue("@FakturaSposobZaplaty", "Barter");
                    break;
                default:
                    command.Parameters.AddWithValue("@FakturaSposobZaplaty", "Karta kredytowa");
                    break;
            }

            DataRowView row = (DataRowView)rEKLAMABindingSource.Current;

            command.Parameters.AddWithValue("@Zaplacono", zAPLACONOCheckBox.Checked);
            command.Parameters.AddWithValue("@FakturaDataWyst", dATA_WYSTAWIENIADateTimePicker.Value);
            command.Parameters.AddWithValue("@FakturaDataSprzed", dATA_SPRZEDAZYDateTimePicker.Value);
            command.Parameters.AddWithValue("@FakturaTerminZaplaty", tERMIN_ZAPLATYDateTimePicker.Value);
            command.Parameters.AddWithValue("@Konto", iD_KONTAComboBox.SelectedValue);
            command.Parameters.AddWithValue("@StawkaVat", row["VAT"]);

            if (zaliczka_BruttoTextBox.Text != "")
            {
                command.Parameters.AddWithValue("@Zaliczka_Brutto", row["Zaliczka_Brutto"]);
                command.Parameters.AddWithValue("@Zaliczka_Data", zaliczka_DataDateTimePicker.Value);
            }

            command.Parameters.AddWithValue("@wyroznienie", row["wyroznienie"]);

            //dodawanie parametrow do faktury w walucie
            SqlCommand command2 = new SqlCommand();
            command2.Connection = conn;
            command2.CommandType = CommandType.Text;
            command2.CommandText = "select Brutto_Euro, Brutto_Euro_Miano, waluta_kurs, waluta_przelicznik,waluta_kurs_z_dnia,waluta_tabela_nr from "
                + "reklama where reklamaId= " + reklamaId;

            conn.Open();

            SqlDataReader reader = command2.ExecuteReader();
            while (reader.Read())
            {
                command.Parameters.AddWithValue("@waluta_brutto", reader.GetValue(0));
                command.Parameters.AddWithValue("@waluta_miano", reader.GetValue(1));
                command.Parameters.AddWithValue("@waluta_kurs", reader.GetValue(2));
                command.Parameters.AddWithValue("@waluta_przelicznik", reader.GetValue(3));
                command.Parameters.AddWithValue("@waluta_kurs_z_dnia", reader.GetValue(4));
                command.Parameters.AddWithValue("@waluta_tabela_nr", reader.GetValue(5));
            }

            conn.Close();

            conn.Open();

            //wystawanie faktury
            transaction = conn.BeginTransaction();

            command.Transaction = transaction;

            try
            {
                command.ExecuteNonQuery();
                transaction.Commit();
                ok = true;
                MessageBox.Show("Fakture dodano!");
            }
            catch
            {
                transaction.Rollback();

                throw;
            }

            conn.Close();


            //odswiezanie - musi być bo faktura jest dodawana przez procedure

            if (ok)
            {
                rEKLAMADataSet.REKLAMA.Clear();
                rEKLAMATableAdapter.FillByReklamaId(rEKLAMADataSet.REKLAMA, reklamaId);
                row = (DataRowView)rEKLAMABindingSource.Current;

                rEKLAMADataSet.FAKTURY.Clear();
                int idFaktury = Convert.ToInt32(row["id_faktury"]);
                fAKTURYTableAdapter.FillByIdFaktury(rEKLAMADataSet.FAKTURY, idFaktury);

                //wydruk faktury
                FactureViewer fv = new FactureViewer(idFaktury, true);
                fv.ShowDialog();

                Cursor = Cursors.Default;

                wystawFaktureButton.Enabled = false;
                wystawProformeButton.Enabled = false;
                DialogResult = DialogResult.OK;
                Close();
            }
            else
            {
                Cursor = Cursors.Default;
            }
        }


        /// <summary>
        ///  Wystawienie proformy polega na wystawieniu faktury i poźniejszym usunięciu jej z bazy...
        /// </summary>
        private void wystawProformeButton_Click(object sender, EventArgs e)
        {
            bool ok = false;

            if (iD_KONTAComboBox.SelectedValue == null)
            {
                MessageBox.Show("Wybierz konto");
                return;
            }

            SqlConnection conn = new SqlConnection(
                        ConnString.getConnString().Value);

            SqlTransaction transaction;

            SqlCommand command = new SqlCommand("Proc_Make_Faktura_Waluty", conn);
            command.CommandType = CommandType.StoredProcedure;

            command.Parameters.AddWithValue("@ReklamaID", reklamaId);
            command.Parameters.AddWithValue("@FakturaNumer", nUMERTextBox.Text);
            command.Parameters.AddWithValue("@NumerRoz", nUMER_ROZTextBox.Text);

            switch (sPOSOB_ZAPLATYListBox.SelectedIndex)
            {
                case 1:
                    command.Parameters.AddWithValue("@FakturaSposobZaplaty", "Przelew");
                    break;
                case 2:
                    command.Parameters.AddWithValue("@FakturaSposobZaplaty", "Gotówka");
                    break;
                case 3:
                    command.Parameters.AddWithValue("@FakturaSposobZaplaty", "Barter");
                    break;
                default:
                    command.Parameters.AddWithValue("@FakturaSposobZaplaty", "Karta kredytowa");
                    break;
            }

            DataRowView r = (DataRowView)rEKLAMABindingSource.Current;

            command.Parameters.AddWithValue("@Zaplacono", zAPLACONOCheckBox.Checked);
            command.Parameters.AddWithValue("@FakturaDataWyst", dATA_WYSTAWIENIADateTimePicker.Value);
            command.Parameters.AddWithValue("@FakturaDataSprzed", dATA_SPRZEDAZYDateTimePicker.Value);
            command.Parameters.AddWithValue("@FakturaTerminZaplaty", tERMIN_ZAPLATYDateTimePicker.Value);
            command.Parameters.AddWithValue("@Konto", iD_KONTAComboBox.SelectedValue);
            command.Parameters.AddWithValue("@StawkaVat", r["VAT"]);

            if (zaliczka_BruttoTextBox.Text != "")
            {
                command.Parameters.AddWithValue("@Zaliczka_Brutto", r["Zaliczka_Brutto"]);
                command.Parameters.AddWithValue("@Zaliczka_Data", zaliczka_DataDateTimePicker.Value);
            }

            command.Parameters.AddWithValue("@wyroznienie", r["wyroznienie"]);

            SqlCommand command2 = new SqlCommand();
            command2.Connection = conn;
            command2.CommandType = CommandType.Text;
            command2.CommandText = "select Brutto_Euro, Brutto_Euro_Miano, waluta_kurs, waluta_przelicznik,waluta_kurs_z_dnia,waluta_tabela_nr from "
                + "reklama where reklamaId= " + reklamaId;

            conn.Open();

            SqlDataReader reader = command2.ExecuteReader();
            while (reader.Read())
            {
                command.Parameters.AddWithValue("@waluta_brutto", reader.GetValue(0));
                command.Parameters.AddWithValue("@waluta_miano", reader.GetValue(1));
                command.Parameters.AddWithValue("@waluta_kurs", reader.GetValue(2));
                command.Parameters.AddWithValue("@waluta_przelicznik", reader.GetValue(3));
                command.Parameters.AddWithValue("@waluta_kurs_z_dnia", reader.GetValue(4));
                command.Parameters.AddWithValue("@waluta_tabela_nr", reader.GetValue(5));
            }

            conn.Close();

            conn.Open();

            transaction = conn.BeginTransaction();

            command.Transaction = transaction;

            try
            {
                command.ExecuteNonQuery();
                transaction.Commit();
                ok = true;
            }
            catch
            {
                transaction.Rollback();
                throw;
            }
            finally
            {
                conn.Close();
            }

            //odswiezanie
            if (ok)
            {
                rEKLAMADataSet.REKLAMA.Clear();
                rEKLAMATableAdapter.FillByReklamaId(rEKLAMADataSet.REKLAMA, reklamaId);
                DataRowView row = (DataRowView)rEKLAMABindingSource.Current;

                int idFaktury = Convert.ToInt32(row["id_faktury"]);
                fAKTURYTableAdapter.FillByIdFaktury(rEKLAMADataSet.FAKTURY, idFaktury);

                FactureViewer fv = new FactureViewer(idFaktury, false);
                fv.ShowDialog();

                usunFakture(idFaktury);

                //odswiezenie reklam
                rEKLAMADataSet.REKLAMA.Clear();
                rEKLAMATableAdapter.FillByReklamaId(rEKLAMADataSet.REKLAMA, reklamaId);
                row = (DataRowView)rEKLAMABindingSource.Current;

                //ustawienie pól formularza na dodanie nowej faktury
                Title title = _titles.Find(delegate(Title t) { return t.ShortName == row["TYTUŁ"].ToString(); });
                IInvoiceProvider invoiceProvider = InvoiceProviderFactory.GetInvoiceProviderById(title.InvoiceProvider);
                
                nUMER_ROZTextBox.Text = DbUtils.tagAgenta(row["SYMBOL AKWIZYTORA"].ToString());
                nUMERTextBox.Text = DbUtils.numerNowejFaktury(nUMER_ROZTextBox.Text, DateTime.Today.Year, invoiceProvider.SystemKsiegowyId).ToString();

                if (row["FAKTURA DATA SPRZEDAŻY"] == DBNull.Value)
                {
                    dATA_SPRZEDAZYDateTimePicker.Value = DateTime.Today;
                }

                if (row["FAKTURA DATA WYSTAWIENIA"] == DBNull.Value)
                {
                    dATA_WYSTAWIENIADateTimePicker.Value = DateTime.Today;
                }

                if (row["Zaliczka_Data"] == DBNull.Value)
                {
                    zaliczka_DataDateTimePicker.Value = DateTime.Today;
                }

                if (row["FAKTURA TERMIN ZAPŁATY"] == DBNull.Value)
                {
                    tERMIN_ZAPLATYDateTimePicker.Value = DateTime.Today.AddDays(7);
                }

                //iD_KONTAComboBox.SelectedIndex = 0;

                sPOSOB_ZAPLATYListBox.SelectedIndex = 1;

                rEKLAMABindingSource.EndEdit();

                wystawFaktureButton.Enabled = true;
                wystawProformeButton.Enabled = true;
            }
        }

        /// <summary>
        /// Zmiana faktury dla Poznania.
        /// </summary>
        private void fakturaPoznan(int idFaktury)
        {

            int idSprzedawcy = 6;
            int idNabywcy = 18845;
            int idKonta = 43;

            SqlCommand command = new SqlCommand();
            command.Connection = new SqlConnection(ConnString.getConnString().Value);
            command.CommandText = "select Adres_Fkatura from Klienci where CustomerId=18845";

            command.Connection.Open();

            string nabywcaAdres = Convert.ToString(command.ExecuteScalar());

            command.CommandText = "select Nip from KLIENCI where  CustomerId=18845";

            string nabywcaNIP = Convert.ToString(command.ExecuteScalar());

            command.CommandText = "select Adres_Fk from AGENCJE where Id_agencji = 2";

            string sprzedawcaAdres = Convert.ToString(command.ExecuteScalar());

            command.CommandText = "select NIP from AGENCJE where Id_agencji = 2";

            string sprzedawcaNIP = Convert.ToString(command.ExecuteScalar());

            command.Connection.Close();

            command.CommandText = "update faktury set ID_SPRZEDAWCY=@idSprzedawcy, ID_NABYWCY=@idNabywcy," +
            "NABYWCA_ADRES=@nadres,SPRZEDAWCA_ADRES=@sadres,NABYWCA_NIP=@nnip,SPRZEDAWCA_NIP=@snip," +
            "ID_KONTA=@idKonta where ID_FAKTURY=@idFaktury";

            command.Parameters.AddWithValue("@idSprzedawcy", idSprzedawcy);
            command.Parameters.AddWithValue("@idNabywcy", idNabywcy);
            command.Parameters.AddWithValue("@nadres", nabywcaAdres);
            command.Parameters.AddWithValue("@sadres", sprzedawcaAdres);
            command.Parameters.AddWithValue("@nnip", nabywcaNIP);
            command.Parameters.AddWithValue("@snip", sprzedawcaNIP);
            command.Parameters.AddWithValue("@idKonta", idKonta);
            command.Parameters.AddWithValue("@idFaktury", idFaktury);

            try
            {
                command.Connection.Open();
                command.ExecuteNonQuery();
            }
            finally
            {
                command.Connection.Close();
            }
        }

        /// <summary>
        /// Zmiana faktury dla Katowic.
        /// </summary>
        private void fakturaKatowice(int idFaktury)
        {
            int idSprzedawcy = 4;
            int idNabywcy = 678;
            int idKonta = 43;

            SqlCommand command = new SqlCommand();
            command.Connection = new SqlConnection(ConnString.getConnString().Value);
            command.CommandText = "select Adres_Fkatura from Klienci where CustomerId=678";

            command.Connection.Open();

            string nabywcaAdres = Convert.ToString(command.ExecuteScalar());

            command.CommandText = "select Nip from KLIENCI where  CustomerId=678";

            string nabywcaNIP = Convert.ToString(command.ExecuteScalar());

            command.CommandText = "select Adres_Fk from AGENCJE where Id_agencji = 2";

            string sprzedawcaAdres = Convert.ToString(command.ExecuteScalar());

            command.CommandText = "select NIP from AGENCJE where Id_agencji = 2";

            string sprzedawcaNIP = Convert.ToString(command.ExecuteScalar());

            command.Connection.Close();

            command.CommandText = "update faktury set ID_SPRZEDAWCY=@idSprzedawcy, ID_NABYWCY=@idNabywcy," +
            "NABYWCA_ADRES=@nadres,SPRZEDAWCA_ADRES=@sadres,NABYWCA_NIP=@nnip,SPRZEDAWCA_NIP=@snip," +
            "ID_KONTA=@idKonta where ID_FAKTURY=@idFaktury";

            command.Parameters.AddWithValue("@idSprzedawcy", idSprzedawcy);
            command.Parameters.AddWithValue("@idNabywcy", idNabywcy);
            command.Parameters.AddWithValue("@nadres", nabywcaAdres);
            command.Parameters.AddWithValue("@sadres", sprzedawcaAdres);
            command.Parameters.AddWithValue("@nnip", nabywcaNIP);
            command.Parameters.AddWithValue("@snip", sprzedawcaNIP);
            command.Parameters.AddWithValue("@idKonta", idKonta);
            command.Parameters.AddWithValue("@idFaktury", idFaktury);

            try
            {
                command.Connection.Open();
                command.ExecuteNonQuery();
            }
            finally 
            {
                command.Connection.Close();
            }


        }

        private void zamknijButton_Click(object sender, EventArgs e)
        {
            fAKTURYBindingSource.CancelEdit();
            DialogResult = DialogResult.Cancel;
            Close();
        }

        private void usunButton_Click(object sender, EventArgs e)
        {
            if (rEKLAMABindingSource.Current != null)
            {
                bool ok = MessageBox.Show("Czyna pewno chcesz usunąć fakturę?", "", MessageBoxButtons.YesNo) == DialogResult.Yes ? true : false;

                if (ok)
                {
                    DataRowView row = (DataRowView)rEKLAMABindingSource.Current;
                    int idFaktury = Convert.ToInt32(row["id_faktury"]);

                    usunFakture(idFaktury);

                    rEKLAMADataSet.REKLAMA.Clear();
                    rEKLAMATableAdapter.FillByReklamaId(rEKLAMADataSet.REKLAMA, reklamaId);
                    wystawFaktureButton.Enabled = true;
                    wystawProformeButton.Enabled = true;
                    //    usunButton.Enabled = false;
                }
            }
        }

        /// <summary>
        /// Usuwa fakture z tabel: FAKTURA, FAKTURA_DETAILS, REKLAMA (częsciowo)
        /// </summary>
        /// <param name="idFaktury"></param>
        private void usunFakture(int idFaktury)
        {

            SqlConnection conn = new SqlConnection(
                       ConnString.getConnString().Value);

            //usuwanie faktury
            SqlCommand command3 = new SqlCommand();
            command3.CommandText = "delete from faktury where id_faktury = @param ";
            command3.CommandType = CommandType.Text;
            command3.Parameters.AddWithValue("@param", idFaktury);

            command3.Connection = conn;

            conn.Open();

            command3.ExecuteNonQuery();

            conn.Close();

            //usuwanie pozycji faktury
            command3 = new SqlCommand();
            command3.CommandText = "delete from faktura_details where id_faktury = @param ";
            command3.CommandType = CommandType.Text;
            command3.Parameters.AddWithValue("@param", idFaktury);

            command3.Connection = conn;

            conn.Open();

            command3.ExecuteNonQuery();

            conn.Close();

            //usuniecie informacji o fakturze z tabeli REKLAMA
            command3.CommandText = "update REKLAMA set ID_FAKTURY = null where ID_FAKTURY = @param ";

            conn.Open();

            command3.ExecuteNonQuery();

            conn.Close();
        }

        private void poznanKatowiceButton_Click(object sender, EventArgs e)
        {
            DataRowView row = (DataRowView)rEKLAMABindingSource.Current;

            // zmiana faktury dla Poznania i Katowic
            if (row["customerId_Sub"] != DBNull.Value)
            {
                if (row["id_faktury"] == DBNull.Value)
                {
                    MessageBox.Show("Faktura nie została wystawiona");
                    return;
                }

                int idFaktury = Convert.ToInt32(row["id_faktury"]);

                switch (Convert.ToInt32(row["customerId_Sub"]))
                {
                    case 678:
                        fakturaKatowice(idFaktury);
                        MessageBox.Show("Faktura została zmieniona");
                        break;
                    case 18845:
                        fakturaPoznan(idFaktury);
                        MessageBox.Show("Faktura została zmieniona");
                        break;
                }
            }
        }

        private void Facturer_Shown(object sender, EventArgs e)
        {
            if (!User.Instance().IsKierownik)
            {
                foreach (Control c in Controls)
                {
                    c.Enabled = false;
                }
            }
        }

        private void korektaButton_Click(object sender, EventArgs e)
        {            
            Cursor = Cursors.WaitCursor;

            REKLAMADataSet.REKLAMARow reklama = (REKLAMADataSet.REKLAMARow)
          ((DataRowView)rEKLAMABindingSource.Current).Row;

            fAKTURYTableAdapter.FillByIdFaktury(rEKLAMADataSet.FAKTURY,reklama.ID_FAKTURY);

            REKLAMADataSet.FAKTURYRow faktura = rEKLAMADataSet.FAKTURY[0];
                     
            //sprawdzenie czy korekta nie byla juz wystawiona
            if (!faktura.IsID_FK_KORNull())
            {
                MessageBox.Show("Istnieje już faktura korekta");
                //   return;
            }

            SqlConnection conn = null;

            try
            {
                REKLAMADataSet.FAKTURYRow naglowekKorekty = utworzNaglowekKorekty(faktura);
                pobierzEmisjeDoKorekty(faktura, reklama.ReklamaID);
                utworzPozycjeFakturyKorekty(naglowekKorekty);

                if (!faktura.IsID_FK_KORNull())
                {
                    naglowekKorekty.idFakturyKorekta = faktura.ID_FK_KOR;
                }

                conn = new SqlConnection(ConnString.getConnString().Value);

                fAKTURYTableAdapter.Connection = conn;
                emisjeTableAdapter.Connection = conn;
                fakturA_DETAILSTableAdapter.Connection = conn;
                rEKLAMATableAdapter.Connection = conn;

                conn.Open();

                SqlTransaction transaction = conn.BeginTransaction();
                fAKTURYTableAdapter.AttachTransaction(transaction);
                emisjeTableAdapter.AttachTransaction(transaction);
                fakturA_DETAILSTableAdapter.AttachTransaction(transaction);
                rEKLAMATableAdapter.AttachTransaction(transaction);

                try
                {
                    fAKTURYTableAdapter.Update(rEKLAMADataSet.FAKTURY);

                    faktura.ID_FK_KOR = naglowekKorekty.ID_FAKTURY;
                    faktura.EndEdit();

                    fAKTURYTableAdapter.Update(rEKLAMADataSet.FAKTURY);

                    emisjeTableAdapter.Update(rEKLAMADataSet.UKAZE_SIE_W_NR);
                    fakturA_DETAILSTableAdapter.Update(rEKLAMADataSet.FAKTURA_DETAILS);

                    transaction.Commit();
                }
                catch
                {
                    transaction.Rollback();
                    
                    throw;
                }
            }
            finally
            {
                if(conn!=null && conn.State == ConnectionState.Open)
                {
                    conn.Close();
                    conn.Dispose();
                }

                rEKLAMADataSet.UKAZE_SIE_W_NR.Clear();
                rEKLAMADataSet.DatyWydan.Clear();
                rEKLAMADataSet.FAKTURA_DETAILS.Clear();
                fAKTURYBindingSource.ResetBindings(false);
            }

            RestoreConnections();

            Cursor = Cursors.Default;

        }

        private REKLAMADataSet.FAKTURYRow utworzNaglowekKorekty(REKLAMADataSet.FAKTURYRow faktura)
        {
            REKLAMADataSet.FAKTURYRow naglowekKorekty = rEKLAMADataSet.FAKTURY.NewFAKTURYRow();
            naglowekKorekty.KOREKTA = true;
            //  naglowekKorekty.EKSPORT = true;

            //naglowekKorekty.idZamowienia = faktura.idZamowienia;
            naglowekKorekty.idFakturyKorekta = faktura.ID_FAKTURY;
            naglowekKorekty.idFakturyVAT = faktura.ID_FAKTURY;

            naglowekKorekty.NUMER_ROZ = faktura.NUMER_ROZ;
            naglowekKorekty.NUMER = FakturaHelper.GetNewCorrectionInvoiceNumber(DateTime.Today.Year, faktura.SystemKsiegowyId);
            naglowekKorekty.NUMER_ROK = DateTime.Today.Year;
            naglowekKorekty.DATA_WYSTAWIENIA = DateTime.Today;

            naglowekKorekty.ID_SPRZEDAWCY = faktura.ID_SPRZEDAWCY;

            if (naglowekKorekty.ID_SPRZEDAWCY == 4 || naglowekKorekty.ID_SPRZEDAWCY == 6 ||
                naglowekKorekty.ID_SPRZEDAWCY == 1223940400)
            {
                naglowekKorekty.EKSPORT = true;
            }

            naglowekKorekty.MIEJSCOWOSC_WYSTAWIENIA = faktura.MIEJSCOWOSC_WYSTAWIENIA;
            naglowekKorekty.SPRZEDAWCA_ADRES = faktura.SPRZEDAWCA_ADRES;
            naglowekKorekty.SPRZEDAWCA_NIP = faktura.SPRZEDAWCA_NIP;

            naglowekKorekty.PODPIS_WYSTAWIL = faktura.PODPIS_WYSTAWIL;
            naglowekKorekty.DATA_SPRZEDAZY = DateTime.Today;

            naglowekKorekty.ID_NABYWCY = faktura.ID_NABYWCY;
            naglowekKorekty.NABYWCA_ADRES = faktura.NABYWCA_ADRES;
            naglowekKorekty.NABYWCA_NIP = faktura.NABYWCA_NIP;
            naglowekKorekty.TERMIN_ZAPLATY = DateTime.Today.AddDays(7);
            naglowekKorekty.opis = "rezygnacja z emisji reklamy";

            naglowekKorekty.SPOSOB_ZAPLATY = faktura.SPOSOB_ZAPLATY;

            naglowekKorekty.TERMIN_ZAPLATY = faktura.TERMIN_ZAPLATY;
            naglowekKorekty.ZAPLACONO = false;

            naglowekKorekty.FAKTURA_TYP = 2;
            naglowekKorekty.FAKTURA_PODTYP = 1;

            naglowekKorekty.ID_KONTA = faktura.ID_KONTA;

            if (!faktura.Iswaluta_mianoNull())
            {
                naglowekKorekty.SPRZEDAWCA_NIP = faktura.SPRZEDAWCA_NIP;
                naglowekKorekty.NABYWCA_NIP = faktura.NABYWCA_NIP;
                naglowekKorekty.waluta_miano = faktura.waluta_miano;

                naglowekKorekty.waluta_kurs = faktura.waluta_kurs;
                naglowekKorekty.waluta_kurs_z_dnia = faktura.waluta_kurs_z_dnia;
                naglowekKorekty.waluta_przelicznik = faktura.waluta_przelicznik;
                naglowekKorekty.waluta_tabela_nr = faktura.waluta_tabela_nr;
            }

            rEKLAMADataSet.FAKTURY.AddFAKTURYRow(naglowekKorekty);

            return naglowekKorekty;
        }


        private void pobierzEmisjeDoKorekty(REKLAMADataSet.FAKTURYRow naglowekFaktury, int reklamaID)
        {
            emisjeTableAdapter.ClearBeforeFill = false;
            datyWydanTableAdapter.ClearBeforeFill = false;

            emisjeTableAdapter.FillByReklamaId(rEKLAMADataSet.UKAZE_SIE_W_NR, reklamaID);
            datyWydanTableAdapter.FillByReklamaId(rEKLAMADataSet.DatyWydan, reklamaID);
        }

        private void utworzPozycjeFakturyKorekty(REKLAMADataSet.FAKTURYRow naglowekFaktury)
        {
            decimal brutto_waluta = 0;

            foreach (REKLAMADataSet.UKAZE_SIE_W_NRRow em in rEKLAMADataSet.UKAZE_SIE_W_NR)
            {
                if (em.status != 2)
                {
                    REKLAMADataSet.FAKTURA_DETAILSRow fakturaDetailsRow = rEKLAMADataSet.FAKTURA_DETAILS.NewFAKTURA_DETAILSRow();

                    REKLAMADataSet.DatyWydanRow[] dataWydanTable =
                        (REKLAMADataSet.DatyWydanRow[])em.GetChildRows("UKAZE_SIE_W_NR_DatyWydan");
                    REKLAMADataSet.DatyWydanRow dataWydania = dataWydanTable[0];

                    REKLAMADataSet.REKLAMARow reklama = (REKLAMADataSet.REKLAMARow)em.GetParentRow("REKLAMA_UKAZE_SIE_W_NR");

                    fakturaDetailsRow.ROK = Convert.ToInt16(dataWydania.rok);
                    fakturaDetailsRow.MIESIAC = Convert.ToInt16(dataWydania.ms);
                    fakturaDetailsRow.TYTUL = Convert.ToInt16(dataWydania.idTytulu);
                    fakturaDetailsRow.NAZWA_USLUGI = reklama.ID_REKLAMY + " | " + em.Nr_Wydania;
                    fakturaDetailsRow.reklamaId = reklama.ReklamaID;
                    fakturaDetailsRow.NR_WYDANIA = em.Nr_Wydania;

                    fakturaDetailsRow.CENA_JEDN = Convert.ToDecimal(reklama.CENA_JEDN);
                    fakturaDetailsRow.ILOSC = 1;
                    fakturaDetailsRow.JM = "szt.";

                    if (naglowekFaktury.Iswaluta_mianoNull())
                    {
                        fakturaDetailsRow.UPUST_NETTO = Convert.ToDecimal(reklama.RABAT) * fakturaDetailsRow.CENA_JEDN;
                        fakturaDetailsRow.UPUST_PR = reklama.RABAT;
                        decimal netto = (1 - Convert.ToDecimal(reklama.RABAT)) * fakturaDetailsRow.CENA_JEDN;
                        fakturaDetailsRow.NETTO = netto;
                        fakturaDetailsRow.S_VAT = reklama.VAT;
                        decimal VAT = Convert.ToDecimal(reklama.VAT);
                        fakturaDetailsRow.VAT = Convert.ToDecimal(Math.Round(VAT * netto, 2));
                        fakturaDetailsRow.BRUTTO = Convert.ToDecimal(Math.Round((1 + VAT) * netto, 2));
                    }
                    else
                    {
                        //int krotnosc = this.rEKLAMADataSet.UKAZE_SIE_W_NR.PoliczAktywne(reklama.ReklamaID);

                        fakturaDetailsRow.BRUTTO = Convert.ToDecimal((reklama.Brutto_Euro / reklama.KROTNOŚĆ) * naglowekFaktury.waluta_kurs);
                        brutto_waluta += Convert.ToDecimal(reklama.Brutto_Euro / reklama.KROTNOŚĆ);
                        fakturaDetailsRow.S_VAT = reklama.VAT;
                        decimal VAT = Convert.ToDecimal(reklama.VAT);
                        decimal brutto = fakturaDetailsRow.BRUTTO;
                        fakturaDetailsRow.VAT = Convert.ToDecimal(Math.Round(VAT * brutto / (1 + VAT), 2));
                        decimal netto = brutto - fakturaDetailsRow.VAT;
                        fakturaDetailsRow.NETTO = netto;
                        fakturaDetailsRow.UPUST_PR = reklama.RABAT;
                        if (fakturaDetailsRow.UPUST_PR != 0)
                        {
                            fakturaDetailsRow.UPUST_NETTO = netto / Convert.ToDecimal(reklama.RABAT) - netto;
                        }
                        else
                        {
                            fakturaDetailsRow.UPUST_NETTO = 0;
                        }

                        fakturaDetailsRow.CENA_JEDN = Convert.ToDecimal(netto + fakturaDetailsRow.UPUST_NETTO);
                    }

                    fakturaDetailsRow.TYP = 2;
                    fakturaDetailsRow.PODTYP = 1;
                    fakturaDetailsRow.ID_FAKTURY = naglowekFaktury.ID_FAKTURY;

                    if (reklama.wyroznienie)
                    {
                        fakturaDetailsRow.wyroznienie = true;
                    }

                    rEKLAMADataSet.FAKTURA_DETAILS.AddFAKTURA_DETAILSRow(fakturaDetailsRow);
                }
            }

            if (brutto_waluta != 0)
            {
                naglowekFaktury.waluta_brutto = Math.Round(Convert.ToDouble(brutto_waluta), 2);
                naglowekFaktury.EndEdit();
            }
        }

        private void wydrukKorektyButton_Click(object sender, EventArgs e)
        {
            Cursor = Cursors.WaitCursor;

            REKLAMADataSet.REKLAMARow reklama = (REKLAMADataSet.REKLAMARow)
          ((DataRowView)rEKLAMABindingSource.Current).Row;

            REKLAMADataSet.FAKTURYDataTable table =
             fAKTURYTableAdapter.GetDataByFaktury(reklama.ID_FAKTURY);

            if (table.Rows.Count < 1)
            {
                return;
            }
            REKLAMADataSet.FAKTURYRow faktura = table[0];

            if (!faktura.IsID_FK_KORNull())
            {
                REKLAMADataSet.FAKTURYDataTable korekta =
           fAKTURYTableAdapter.GetDataByFaktury(faktura.ID_FK_KOR);

                if (korekta.Rows.Count > 0)
                {
                    if (!korekta[0].IsidFakturyKorektaNull())
                    {
                        FactureViewer fv = new FactureViewer(korekta[0].ID_FAKTURY, korekta[0].idFakturyVAT, korekta[0].idFakturyKorekta);
                        fv.ShowDialog();
                    }
                }
            }

            Cursor = Cursors.Default;
        }
        private void RestoreConnections()
        {
            fAKTURYTableAdapter.Connection = new SqlConnection(ConnString.getConnString().Value);
            emisjeTableAdapter.Connection = new SqlConnection(ConnString.getConnString().Value);
            fakturA_DETAILSTableAdapter.Connection = new SqlConnection(ConnString.getConnString().Value);
            rEKLAMATableAdapter.Connection = new SqlConnection(ConnString.getConnString().Value);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Cursor = Cursors.WaitCursor;

            REKLAMADataSet.REKLAMARow reklama = (REKLAMADataSet.REKLAMARow)
          ((DataRowView)rEKLAMABindingSource.Current).Row;

            REKLAMADataSet.FAKTURYDataTable table =
             fAKTURYTableAdapter.GetDataByFaktury(reklama.ID_FAKTURY);

            if (table.Rows.Count < 1)
            {
                return;
            }
            REKLAMADataSet.FAKTURYRow faktura = table[0];

            emisjeTableAdapter.UpdateQueryIdFaktury(faktura.ID_FAKTURY, reklama.ReklamaID);

            Cursor = Cursors.Default;
        }

        private void usunKorekteButton_Click(object sender, EventArgs e)
        {
            Cursor = Cursors.WaitCursor;

            REKLAMADataSet.REKLAMARow reklama = (REKLAMADataSet.REKLAMARow)
          ((DataRowView)rEKLAMABindingSource.Current).Row;

            REKLAMADataSet.FAKTURYDataTable table =
             fAKTURYTableAdapter.GetDataByFaktury(reklama.ID_FAKTURY);

            if (table.Rows.Count < 1)
            {
                return;
            }
            REKLAMADataSet.FAKTURYRow faktura = table[0];

            if (!faktura.IsID_FK_KORNull())
            {
                REKLAMADataSet.FAKTURYDataTable korekta =
           fAKTURYTableAdapter.GetDataByFaktury(faktura.ID_FK_KOR);

                if (korekta.Rows.Count > 0)
                {
                    usunKorekte(faktura, korekta[0]);
                }
            }

            Cursor = Cursors.Default;
        }


        private void usunKorekte(REKLAMADataSet.FAKTURYRow faktura, REKLAMADataSet.FAKTURYRow korekta)
        {
            int idKorekty = korekta.ID_FAKTURY;
            int idKorygowanejFaktury = korekta.idFakturyKorekta;
            //int idZam = korekta.idZamowienia;

            REKLAMADataSet.FAKTURYRow korygowanaFaktura = faktura;

            REKLAMADataSet.FAKTURYDataTable poprzedniaKorekta = 
                fAKTURYTableAdapter.GetDataByFaktury(idKorygowanejFaktury);
 
            if (poprzedniaKorekta.Rows.Count > 0) 
            {
                korygowanaFaktura.ID_FK_KOR = poprzedniaKorekta[0].ID_FAKTURY;
            }
            else
            {
                korygowanaFaktura.SetID_FK_KORNull();
            }

            fAKTURYBindingSource.EndEdit();

            SqlConnection conn = new SqlConnection(ConnString.getConnString().Value);

            fAKTURYTableAdapter.Connection = conn;
            fakturA_DETAILSTableAdapter.Connection = conn;

            conn.Open();
            SqlTransaction transaction = conn.BeginTransaction();

            fAKTURYTableAdapter.AttachTransaction(transaction);
            fakturA_DETAILSTableAdapter.AttachTransaction(transaction);

            try
            {
                fAKTURYTableAdapter.Update(korygowanaFaktura);
                fAKTURYTableAdapter.Delete(idKorekty);
                fakturA_DETAILSTableAdapter.Delete(idKorekty);

                transaction.Commit();
            }
            catch
            {
                transaction.Rollback();
                throw;
            }
            finally
            {
                conn.Close();
            }
        }

    }
}


