using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Baza_Reklam
{
    public partial class ZamowieniaForm : Form
    {
        private REKLAMADataSet.KLIENCIRow klient;

        private int idZamowienia = 0;
        private int idFaktury = 0;

        private REKLAMADataSet.REKLAMADataTable reklamyBezZamowienia;

        private REKLAMADataSetTableAdapters.KLIENCITableAdapter klienciTableAdapter =
            new REKLAMADataSetTableAdapters.KLIENCITableAdapter();

        private SLOWNIKDataSetTableAdapters.AGENCJETableAdapter agencjeTableAdapter =
            new SLOWNIKDataSetTableAdapters.AGENCJETableAdapter();

        private SLOWNIKDataSetTableAdapters.AGENCITableAdapter agenciTableAdapter =
            new SLOWNIKDataSetTableAdapters.AGENCITableAdapter();

        private REKLAMADataSetTableAdapters.UKAZE_SIE_W_NRTableAdapter emisjeTableAdapter =
            new Baza_Reklam.REKLAMADataSetTableAdapters.UKAZE_SIE_W_NRTableAdapter();

        private REKLAMADataSetTableAdapters.FAKTURA_DETAILSTableAdapter fakturyDetailsTableAdapter =
            new Baza_Reklam.REKLAMADataSetTableAdapters.FAKTURA_DETAILSTableAdapter();

        private REKLAMADataSetTableAdapters.WplatyTableAdapter wplatyTableAdapter =
            new Baza_Reklam.REKLAMADataSetTableAdapters.WplatyTableAdapter();

        private REKLAMADataSetTableAdapters.DatyWydanTableAdapter datyWydanTableAdapter =
            new Baza_Reklam.REKLAMADataSetTableAdapters.DatyWydanTableAdapter();

        private SLOWNIKDataSetTableAdapters.Kursy_WalutTableAdapter kursyWalutTableAdapter =
            new Baza_Reklam.SLOWNIKDataSetTableAdapters.Kursy_WalutTableAdapter();

        #region properties

        public REKLAMADataSet.REKLAMADataTable ReklamyBezZamowienia
        {
            get { return reklamyBezZamowienia; }
            set { reklamyBezZamowienia = value; }
        }

        #endregion properties

        public ZamowieniaForm(REKLAMADataSet.KLIENCIRow klient)
        {
            InitializeComponent();
            InitTableAdatpers();

            this.klient = klient;
        }

        public ZamowieniaForm(int idKlienta)
        {
            InitializeComponent();
            InitTableAdatpers();

            this.klient = klienciTableAdapter.GetDataByCustomerId(idKlienta)[0];
        }

        public ZamowieniaForm(int idKlienta, int idZamowienia)
        {
            InitializeComponent();
            InitTableAdatpers();

            this.klient = klienciTableAdapter.GetDataByCustomerId(idKlienta)[0];
            this.idZamowienia = idZamowienia;

        }

        private void InitTableAdatpers()
        {
            this.rEKLAMABindingSource1.DataSource = ReklamyBezZamowienia;
            this.zamowieniaTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            this.rEKLAMATableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            this.fAKTURYTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            this.fakturyDetailsTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            this.klienciTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            this.agencjeTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            this.agenciTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            this.emisjeTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            this.datyWydanTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            this.kursyWalutTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            this.wplatyTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
        }

        private void ZamowieniaForm_Load(object sender, EventArgs e)
        {
            usunFaktureButton.Enabled = User.getUser().St_kierownik;
            dtpZmianaDaty.Enabled = User.getUser().St_kierownik;
            dtpZmianaDaty.Value = DateTime.Today;
            dtpZmianaDaty.MaxDate = DateTime.Today;

            zamowieniaBindingSource.CurrentChanged += zamowieniaBindingSource_CurrentChanged;

            ReklamyBezZamowienia = rEKLAMATableAdapter.GetDataByCustomerIdandIdZamowienia(klient.CustomerID);
            rEKLAMABindingSource1.DataSource = ReklamyBezZamowienia;
            this.zamowieniaTableAdapter.FillByIdKlienta(this.rEKLAMADataSet.zamowienia, klient.CustomerID);

            if (idZamowienia != 0)
            {
                zamowieniaBindingSource.Position = zamowieniaBindingSource.Find("idZamowienia", idZamowienia);
                rEKLAMATableAdapter.FillByIdZamowienia(this.rEKLAMADataSet.REKLAMA, idZamowienia);
                fAKTURYTableAdapter.FillByIdZamowienia(this.rEKLAMADataSet.FAKTURY, idZamowienia);
            }
            else
            {
                zamowieniaBindingSource.Position = 0;
            }

            if (klient != null)
            {
                this.KlientLabel.Text = "KOD KLIENTA:  " + klient.kodKlienta;
            }
        }

        private void dodajButton_Click(object sender, EventArgs e)
        {
            if (klient.IskodKlientaNull() || klient.kodKlienta.Trim() == string.Empty)
            {
                MessageBox.Show("Uzupełnij kod klienta");
                return;
            }

            AddZamowienieForm azf = new AddZamowienieForm(0, klient.CustomerID);
            if (azf.ShowDialog() == DialogResult.OK)
            {
                //rEKLAMADataSet.zamowienia.Clear();
                //this.zamowieniaTableAdapter.FillByIdKlienta(this.rEKLAMADataSet.zamowienia, klient.CustomerID);
                rEKLAMADataSet.zamowienia.ImportRow(azf.Zamowienia[0]);
                int idZam = azf.Zamowienia[0].idZamowienia;
                zamowieniaBindingSource.Position = zamowieniaBindingSource.Find("idZamowienia", idZam);
                rEKLAMATableAdapter.FillByIdZamowienia(this.rEKLAMADataSet.REKLAMA, idZam);
                fAKTURYTableAdapter.FillByIdZamowienia(this.rEKLAMADataSet.FAKTURY, idZam);
            }
        }

        private void edytujButton_Click(object sender, EventArgs e)
        {
            if (zamowieniaBindingSource.Current != null)
            {
                DataRowView z = (DataRowView)zamowieniaBindingSource.Current;
                REKLAMADataSet.zamowieniaRow zamowienie = (REKLAMADataSet.zamowieniaRow)z.Row;

                int idZam = zamowienie.idZamowienia;

                AddZamowienieForm azf = new AddZamowienieForm(idZam, klient.CustomerID);
                if (azf.ShowDialog() == DialogResult.OK)
                {
                    rEKLAMADataSet.zamowienia.Clear();
                    this.zamowieniaTableAdapter.FillByIdKlienta(this.rEKLAMADataSet.zamowienia, klient.CustomerID);
                    zamowieniaBindingSource.Position = zamowieniaBindingSource.Find("idZamowienia", idZam);
                }
            }
        }

        private void dodajDoZamButton_Click(object sender, EventArgs e)
        {
            if (zamowieniaBindingSource.Current != null)
            {
                if (rEKLAMADataGridView1.SelectedRows.Count > 0)
                {
                    DataRowView z = (DataRowView)zamowieniaBindingSource.Current;
                    REKLAMADataSet.zamowieniaRow zamowienie = (REKLAMADataSet.zamowieniaRow)z.Row;

                    REKLAMADataSet.REKLAMARow row = (REKLAMADataSet.REKLAMARow)((DataRowView)rEKLAMADataGridView1.SelectedRows[0].DataBoundItem).Row;

                    string s = string.Empty;

                    s = CzyMoznaDodacDoZam(zamowienie,rEKLAMADataSet.REKLAMA, row, s);

                    if (s != string.Empty)
                    {
                        s += "\n Reklamy nie mogą być w obrębie jednego zamówienia";
                        MessageBox.Show(s, "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }

                    row.idZamowienia = zamowienie.idZamowienia;

                    if (zamowienie.IsidKontaNull() && !row.IsBrutto_Euro_MianoNull())
                    {
                        // zmiana domyślnego konta do faktury dla EUR
                        if (User.getUser().IdAgencji != 4 & (row.Brutto_Euro_Miano == "EUR"))
                        {
                            if (User.getUser().IdAgencji == 1223940396 | User.getUser().IdAgencji == 1223940398)
                            {
                                zamowienie.idKonta = 3;
                            }
                            else
                            {
                                zamowienie.idKonta = 5;
                            }
                        }
                    }

                    this.rEKLAMADataSet.REKLAMA.ImportRow(row);
                    ReklamyBezZamowienia.Rows.Remove(row);
                    rEKLAMATableAdapter.Update(this.rEKLAMADataSet.REKLAMA);
                    zamowieniaTableAdapter.Update(this.rEKLAMADataSet.zamowienia);
                }
            }
        }

        private string CzyMoznaDodacDoZam(REKLAMADataSet.zamowieniaRow zamowienie,
            REKLAMADataSet.REKLAMADataTable reklamyWZamowieniu,
            REKLAMADataSet.REKLAMARow row, string s)
        {
            if (zamowienie.zafakturowanoWszystko)
            {
                s += "Zamówienie jest już w całości zafakturowane.";
            }

            //sprawdzenie waluty i VAT
            if (reklamyWZamowieniu.Count > 0)
            {
                REKLAMADataSet.REKLAMARow rek = reklamyWZamowieniu[0];

                if (rek.IsBrutto_Euro_MianoNull() ^ row.IsBrutto_Euro_MianoNull())
                {
                    if ((rek.IsBrutto_Euro_MianoNull() || row.IsBrutto_Euro_MianoNull())
                        ||
                        (rek.Brutto_Euro_Miano != row.Brutto_Euro_Miano))
                    {
                        s += "Reklamy są w różnych walutach. \n";
                    }
                }

                REKLAMADataSet.DatyWydanDataTable t = datyWydanTableAdapter.GetDataByPierwszaEmisjaWZamowieniu(zamowienie.idZamowienia);

                if (t.Rows.Count == 0)
                {
                    s += "Reklama nie ma wybranych emisji. \n";
                }
                else
                {
                    if (!zamowienie.IsdataOstatniejZafakturowanejEmisjiNull())
                    {
                        if (t[0].DATA_W < zamowienie.dataOstatniejZafakturowanejEmisji)
                        {
                            s += "Reklama zawiera emisję na okres, który już został zafakturowany";
                        }
                    }
                }

                if (rek.VAT != row.VAT)
                {
                    s += "Reklamy mają różne stawki VAT. \n";
                }
            }
            return s;
        }

        private void usunZZamButton_Click(object sender, EventArgs e)
        {
            if (zamowieniaBindingSource.Current != null && rEKLAMADataGridView.SelectedRows.Count != 0)
            {
                DataRowView z = (DataRowView)zamowieniaBindingSource.Current;
                REKLAMADataSet.zamowieniaRow zamowienie = (REKLAMADataSet.zamowieniaRow)z.Row;

                DataRowView row = (DataRowView)rEKLAMADataGridView.SelectedRows[0].DataBoundItem;

                if (Convert.ToBoolean(row["FAKTURA WYSTAWIONO"]) == true)
                {
                    MessageBox.Show("Reklama ma zafakturowane emisje. Nie można usunąć reklamy.");
                    return;
                }

                row["idZamowienia"] = DBNull.Value;
                row.EndEdit();

                ReklamyBezZamowienia.ImportRow(row.Row);
                this.rEKLAMADataSet.REKLAMA.Rows.Remove(row.Row);

                rEKLAMATableAdapter.Update(ReklamyBezZamowienia);
                zamowieniaTableAdapter.Update(this.rEKLAMADataSet.zamowienia);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (zamowieniaBindingSource.Current != null)
            {
                this.Cursor = Cursors.WaitCursor;

                DataRowView z = (DataRowView)zamowieniaBindingSource.Current;
                REKLAMADataSet.zamowieniaRow zamowienie = (REKLAMADataSet.zamowieniaRow)z.Row;

                REKLAMADataSet.KLIENCIRow klient = (REKLAMADataSet.KLIENCIRow)this.klienciTableAdapter.GetDataByCustomerId(zamowienie.idKlienta).Rows[0];
                string errorMessage = czyMoznaZafakturowac(zamowienie, klient);

                if (errorMessage != string.Empty)
                {
                    MessageBox.Show(errorMessage);
                    this.Cursor = Cursors.Default;
                    return;
                }

                wystawFakture(zamowienie, klient);

                this.Cursor = Cursors.Default;
            }
        }

        private int wystawFakture(REKLAMADataSet.zamowieniaRow zamowienie, REKLAMADataSet.KLIENCIRow klient)
        {
            int idNaglowka = 0;
            
            try
            {
                REKLAMADataSet.FAKTURYRow naglowekFaktury = utworzNaglowekFaktury(zamowienie, klient);
                this.rEKLAMADataSet.FAKTURY.AddFAKTURYRow(naglowekFaktury);
                pobierzOznaczEmisje(zamowienie, naglowekFaktury);
                utworzPozycjeFaktury(naglowekFaktury);
                dodajWplate(naglowekFaktury);

                zamowienie.zafakturowano = true;
                zamowienie.EndEdit();

                SqlConnection conn = new SqlConnection(ConnString.getConnString().Value);

                fAKTURYTableAdapter.Connection = conn;
                emisjeTableAdapter.Connection = conn;
                zamowieniaTableAdapter.Connection = conn;
                fakturyDetailsTableAdapter.Connection = conn;
                rEKLAMATableAdapter.Connection = conn;
                wplatyTableAdapter.Connection = conn;

                conn.Open();

                SqlTransaction transaction = conn.BeginTransaction();
                fAKTURYTableAdapter.AttachTransaction(transaction);
                emisjeTableAdapter.AttachTransaction(transaction);
                zamowieniaTableAdapter.AttachTransaction(transaction);
                fakturyDetailsTableAdapter.AttachTransaction(transaction);
                rEKLAMATableAdapter.AttachTransaction(transaction);
                wplatyTableAdapter.AttachTransaction(transaction);

                try
                {
                    fAKTURYTableAdapter.Update(this.rEKLAMADataSet.FAKTURY);
                    idNaglowka = naglowekFaktury.ID_FAKTURY;
                    emisjeTableAdapter.Update(this.rEKLAMADataSet.UKAZE_SIE_W_NR);
                    fakturyDetailsTableAdapter.Update(this.rEKLAMADataSet.FAKTURA_DETAILS);
                    wplatyTableAdapter.Update(this.rEKLAMADataSet.Wplaty);

                    int il = (int)emisjeTableAdapter.iloscNiezafakturowanychEmisjiWZamowieniu(
                        zamowienie.idZamowienia);
                    if (il == 0)
                    {
                        zamowienie.zafakturowanoWszystko = true;
                    }

                    zamowieniaTableAdapter.Update(this.rEKLAMADataSet.zamowienia);
                    rEKLAMATableAdapter.Update(this.rEKLAMADataSet.REKLAMA);

                    transaction.Commit();
                    dtpZmianaDaty.Value = DateTime.Today;
                }
                catch (Exception e1)
                {
                    transaction.Rollback();
                    conn.Close();
                    this.rEKLAMADataSet.UKAZE_SIE_W_NR.Clear();
                    this.rEKLAMADataSet.DatyWydan.Clear();
                    this.rEKLAMADataSet.FAKTURA_DETAILS.Clear();
                    this.rEKLAMADataSet.Wplaty.Clear();
                    this.rEKLAMADataSet.FAKTURY.RemoveFAKTURYRow(naglowekFaktury);
                    this.fAKTURYBindingSource.ResetBindings(false);
                    this.fAKTURYDataGridView.Refresh();
                    throw e1;
                }
            }
            catch (Exception e2)
            {
                MessageBox.Show("Wystąpił błąd: \n" + e2.ToString());
            }
            finally
            {
                this.rEKLAMADataSet.UKAZE_SIE_W_NR.Clear();
                this.rEKLAMADataSet.DatyWydan.Clear();
                this.rEKLAMADataSet.FAKTURA_DETAILS.Clear();
                this.rEKLAMADataSet.Wplaty.Clear();
                this.fAKTURYBindingSource.ResetBindings(false);
                this.fAKTURYBindingSource.Sort = "NUMER";
                this.fAKTURYDataGridView.Refresh();
                this.zamowieniaBindingSource.ResetBindings(false);
                
            }

            return idNaglowka;
        }

        private void dodajWplate(REKLAMADataSet.FAKTURYRow naglowekFaktury)
        {
            REKLAMADataSet.WplatyRow wplata = this.rEKLAMADataSet.Wplaty.NewWplatyRow();
            wplata.idFaktury = naglowekFaktury.ID_FAKTURY;
            wplata.idZamowienia = naglowekFaktury.idZamowienia;
            this.rEKLAMADataSet.Wplaty.AddWplatyRow(wplata);
        }

        private void utworzPozycjeFaktury(REKLAMADataSet.FAKTURYRow naglowekFaktury)
        {
            decimal brutto_waluta = 0;

            foreach (REKLAMADataSet.UKAZE_SIE_W_NRRow em in this.rEKLAMADataSet.UKAZE_SIE_W_NR)
            {
                REKLAMADataSet.FAKTURA_DETAILSRow fakturaDetailsRow = this.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
                {
                    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;
                }

                this.rEKLAMADataSet.FAKTURA_DETAILS.AddFAKTURA_DETAILSRow(fakturaDetailsRow);
            }

            if (brutto_waluta != 0)
            {
                naglowekFaktury.waluta_brutto = Math.Round(Convert.ToDouble(brutto_waluta),2);
                naglowekFaktury.EndEdit();
            }
        }

        private void pobierzOznaczEmisje(REKLAMADataSet.zamowieniaRow zamowienie, REKLAMADataSet.FAKTURYRow naglowekFaktury)
        {
            this.emisjeTableAdapter.ClearBeforeFill = false;
            this.datyWydanTableAdapter.ClearBeforeFill = false;

            REKLAMADataSet.DatyWydanDataTable t = datyWydanTableAdapter.GetDataByPierwszaEmisjaWZamowieniu(zamowienie.idZamowienia);

            if (t.Rows.Count == 0)
            {
                throw new Exception("Nie ma co fakturować!");
            }

            DateTime d = t[0].DATA_W;
            d = zamowienie.IsdataOstatniejZafakturowanejEmisjiNull() ? d : zamowienie.dataOstatniejZafakturowanejEmisji.AddMonths(1);

            foreach (DataRow r in this.rEKLAMADataSet.REKLAMA.Rows)
            {
                REKLAMADataSet.REKLAMARow reklama = (REKLAMADataSet.REKLAMARow)r;

                switch (zamowienie.rodzajFakturowania)
                {
                    //3m
                    case 1:
                        this.emisjeTableAdapter.FillByNiezafakturowane3MSRekID(
                            this.rEKLAMADataSet.UKAZE_SIE_W_NR,
                            reklama.ReklamaID,
                            d);
                        this.datyWydanTableAdapter.FillByReklamaId(this.rEKLAMADataSet.DatyWydan, reklama.ReklamaID);
                        break;
                    //calosc
                    case 2:
                        this.emisjeTableAdapter.FillByNiezafakturowane(this.rEKLAMADataSet.UKAZE_SIE_W_NR, reklama.ReklamaID);
                        this.datyWydanTableAdapter.FillByReklamaId(this.rEKLAMADataSet.DatyWydan, reklama.ReklamaID);
                        break;
                    //1ms
                    default:
                        this.emisjeTableAdapter.FillByNiezafakturowane1MSrekId(
                            this.rEKLAMADataSet.UKAZE_SIE_W_NR,
                            reklama.ReklamaID,
                            d);
                        this.datyWydanTableAdapter.FillByReklamaId(this.rEKLAMADataSet.DatyWydan, reklama.ReklamaID);
                        break;
                }

                // ustawiane by pozniej blokowac mozliwosc zmiany rabatu itp.
                reklama.FAKTURA_WYSTAWIONO = true;
                reklama.EndEdit();
            }

            if (zamowienie.IsdataOstatniejZafakturowanejEmisjiNull())
            {
                zamowienie.dataOstatniejZafakturowanejEmisji = DateTime.Today.AddMonths(-1);
            }

            foreach (DataRow r in this.rEKLAMADataSet.REKLAMA.Rows)
            {
                REKLAMADataSet.REKLAMARow reklama = (REKLAMADataSet.REKLAMARow)r;
                
                foreach (DataRow em in this.rEKLAMADataSet.UKAZE_SIE_W_NR)
                {
                    REKLAMADataSet.UKAZE_SIE_W_NRRow emisja = (REKLAMADataSet.UKAZE_SIE_W_NRRow)em;
                    emisja.idFaktury = naglowekFaktury.ID_FAKTURY;
                    emisja.zafakturowana = true;

                    if (emisja.ReklamaId == reklama.ReklamaID)
                    {
                        reklama.FAKTURA_WYSTAWIONO = true;

                        if (naglowekFaktury.Iswaluta_mianoNull())
                        {
                            emisja.netto = Convert.ToDecimal(reklama.CENA_JEDN * (1 - reklama.RABAT));
                        }
                        else
                        {
                            emisja.netto = Convert.ToDecimal(Math.Round(reklama.Brutto_Euro / reklama.KROTNOŚĆ, 2) * (1 - reklama.RABAT));
                            emisja.netto = emisja.netto * Convert.ToDecimal(naglowekFaktury.waluta_kurs);
                        }
                    }

                    REKLAMADataSet.DatyWydanRow[] dataWydanTable =
                                       (REKLAMADataSet.DatyWydanRow[])em.GetChildRows("UKAZE_SIE_W_NR_DatyWydan");
                    REKLAMADataSet.DatyWydanRow dataWydania = dataWydanTable[0];

                    if (dataWydania.DATA_W > zamowienie.dataOstatniejZafakturowanejEmisji)
                    {
                        zamowienie.dataOstatniejZafakturowanejEmisji = dataWydania.DATA_W;
                    }
                }
            }

            zamowienie.EndEdit();
        }

        private REKLAMADataSet.FAKTURYRow utworzNaglowekFaktury(REKLAMADataSet.zamowieniaRow zamowienie, REKLAMADataSet.KLIENCIRow klient)
        {
            REKLAMADataSet.FAKTURYRow naglowekFaktury = (REKLAMADataSet.FAKTURYRow)this.rEKLAMADataSet.FAKTURY.NewRow();

            naglowekFaktury.idZamowienia = zamowienie.idZamowienia;
            naglowekFaktury.NUMER_ROZ = zamowienie.kodAgenta;
            naglowekFaktury.NUMER = Utils.numerNowejFaktury(naglowekFaktury.NUMER_ROZ, DateTime.Today.Year);
            naglowekFaktury.NUMER_ROK = DateTime.Today.Year;
            naglowekFaktury.DATA_WYSTAWIENIA = DateTime.Today;

            if (User.getUser().St_kierownik)
            {
                if (dtpZmianaDaty.Value != DateTime.Today)
                {
                    naglowekFaktury.DATA_WYSTAWIENIA = dtpZmianaDaty.Value;
                }
            }

            SLOWNIKDataSet.AGENCJERow agencja = (SLOWNIKDataSet.AGENCJERow)this.agencjeTableAdapter.GetDataByKodAgenta(zamowienie.kodAgenta).Rows[0];
            naglowekFaktury.ID_SPRZEDAWCY = agencja.Id_agencji;
            naglowekFaktury.MIEJSCOWOSC_WYSTAWIENIA = agencja.miasto;
            naglowekFaktury.SPRZEDAWCA_ADRES = agencja.Adres_Fk;
            naglowekFaktury.SPRZEDAWCA_NIP = agencja.NIP;

            SLOWNIKDataSet.AGENCIRow agent = (SLOWNIKDataSet.AGENCIRow)this.agenciTableAdapter.GetDataByKodAgenta(zamowienie.kodAgenta).Rows[0];
            naglowekFaktury.PODPIS_WYSTAWIL = agent.Imię + " " + agent.Nazwisko;
            naglowekFaktury.DATA_SPRZEDAZY = naglowekFaktury.DATA_WYSTAWIENIA;

            naglowekFaktury.ID_NABYWCY = zamowienie.idKlienta;
            naglowekFaktury.NABYWCA_ADRES = klient.Adres_Fkatura;
            naglowekFaktury.NABYWCA_NIP = klient.Nip;
            naglowekFaktury.opis = "Faktura za reklamy zgodnie z zamówieniem: " 
                + klient.kodKlienta + 
                "/" + zamowienie.nrZamowienia + 
                "/" + zamowienie.kodAgenta + 
                "/" + zamowienie.rokZamowienia;

            switch (zamowienie.sposobZaplaty)
            {
                case 0:
                    naglowekFaktury.SPOSOB_ZAPLATY = "Karta kredytowa";
                    break;
                case 1:
                    naglowekFaktury.SPOSOB_ZAPLATY = "Przelew";
                    break;
                case 2:
                    naglowekFaktury.SPOSOB_ZAPLATY = "Gotówka";
                    break;
                case 3:
                    naglowekFaktury.SPOSOB_ZAPLATY = "Barter";
                    break;
                default:
                    break;
            }

            naglowekFaktury.TERMIN_ZAPLATY = naglowekFaktury.DATA_SPRZEDAZY.AddDays(zamowienie.czasPlatnosci);
            naglowekFaktury.ZAPLACONO = false;

            naglowekFaktury.FAKTURA_TYP = 2;
            naglowekFaktury.FAKTURA_PODTYP = 1;

            naglowekFaktury.ID_KONTA = Convert.ToInt16(zamowienie.idKonta);

            //WALUTOWE
            if (!this.rEKLAMADataSet.REKLAMA[0].IsBrutto_Euro_MianoNull() &&
                this.rEKLAMADataSet.REKLAMA[0].Brutto_Euro_Miano != string.Empty)
            {
                naglowekFaktury.SPRZEDAWCA_NIP = agencja.vies;
                naglowekFaktury.NABYWCA_NIP = klient.nipKraj + " " + klient.Nip;
                naglowekFaktury.waluta_miano = this.rEKLAMADataSet.REKLAMA[0].Brutto_Euro_Miano;

                DateTime dataPublikacji = naglowekFaktury.DATA_WYSTAWIENIA;

                SLOWNIKDataSet.Kursy_WalutDataTable kurs = kursyWalutTableAdapter.GetDataByDataPublikacji(
                     naglowekFaktury.waluta_miano, dataPublikacji);

                if (kurs.Count == 0)
                {
                    throw new Exception("Błąd przy pobieraniu kursu waluty.");
                }

                naglowekFaktury.waluta_kurs = User.getUser().IdAgencji == 6 ? kurs[0].Kurs_Sredni_Poznan : kurs[0].Kurs_Sredni;
                naglowekFaktury.waluta_kurs_z_dnia = kurs[0].Data_Publikacji;
                naglowekFaktury.waluta_przelicznik = kurs[0].przelicznik;
                naglowekFaktury.waluta_tabela_nr = kurs[0].Numer_Tabeli;
            }

            naglowekFaktury.EndEdit();
            return naglowekFaktury;
        }

        private string czyMoznaZafakturowac(REKLAMADataSet.zamowieniaRow zamowienie, REKLAMADataSet.KLIENCIRow klient)
        {
            string errorMessage = string.Empty;

            errorMessage += zamowienie.zafakturowanoWszystko ? "Nie ma co fakturowac! \n" : "";
            errorMessage += zamowienie.IsrodzajFakturowaniaNull() ? "Nie wybrano sposobu fakturowania. \n" : "";
            errorMessage += zamowienie.IsidKontaNull() ? "Nie wybrano konta. \n" : "";
            errorMessage += zamowienie.IssposobZaplatyNull() ? "Nie wybrano sposobu zapłaty. \n" : "";
            errorMessage += klient.IsCountryNull() || klient.Country == string.Empty ? "Brak państwa klienta. \n" : "";
            errorMessage += klient.IsAdres_FkaturaNull() || klient.Adres_Fkatura == string.Empty ? "Brak adresu faktury klienta. \n" : "";
            errorMessage += klient.IsNipNull() || klient.Nip == string.Empty ? "Brak nipu klienta. \n" : "";

            if (klient.Country != "Polska")
            {
                errorMessage += klient.IsnipKrajNull() || klient.nipKraj == string.Empty ? "Brak symbolu kraju w nipie klienta. \n" : "";
            }

            if (rEKLAMADataSet.REKLAMA.Select("[ZATWIERDZONO DO DRUKU] = 0").Length > 0)
            {
                errorMessage += "W zamówieniu są reklamy niezatwierdzone do druku \n";
            }

            return errorMessage;
        }


        private void WydrukButton_Click(object sender, EventArgs e)
        {
            if (zamowieniaBindingSource.Current != null)
            {
                DataRowView z = (DataRowView)zamowieniaBindingSource.Current;
                REKLAMADataSet.zamowieniaRow zamowienie = (REKLAMADataSet.zamowieniaRow)z.Row;

                OrderViewer ov = new OrderViewer(zamowienie.idZamowienia, 9);
                ov.ShowDialog();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (fAKTURYBindingSource.Current != null)
            {
                REKLAMADataSet.FAKTURYRow row =
                    (REKLAMADataSet.FAKTURYRow)
                    ((DataRowView)fAKTURYBindingSource.Current).Row;

                if (row.IsidFakturyKorektaNull())
                {
                    FactureViewer fv = new FactureViewer(row.ID_FAKTURY,false);
                    fv.ShowDialog();
                }
                else
                {
                    FactureViewer fv = new FactureViewer(row.idFakturyKorekta, row.ID_FAKTURY);
                    fv.ShowDialog();
                }

            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (rEKLAMADataSet.REKLAMA.Rows.Count == 0 && rEKLAMADataSet.FAKTURY.Rows.Count == 0)
            {
                this.zamowieniaBindingSource.Remove(this.zamowieniaBindingSource.Current);
                this.zamowieniaBindingSource.EndEdit();
                this.zamowieniaTableAdapter.Update(this.rEKLAMADataSet.zamowienia);
            }
            else
            {
                MessageBox.Show("Nie można usunąć zamówienia.");
            }
        }

        private void korektaButton_Click(object sender, EventArgs e)
        {
            if (fAKTURYBindingSource.Current != null)
            {
                this.Cursor = Cursors.WaitCursor;

                DataRowView row = (DataRowView)fAKTURYBindingSource.Current;
                REKLAMADataSet.FAKTURYRow faktura = (REKLAMADataSet.FAKTURYRow)row.Row;
                                
                if (faktura.KOREKTA)
                {
                    MessageBox.Show("Nie można wystawić korekty do korekty");
                    this.Cursor = Cursors.Default;
                    return;
                }

                //sprawdzenie czy korekta nie byla juz wystawiona
                if (!faktura.IsID_FK_KORNull())
                {
                    MessageBox.Show("Istnieje już faktura korekta");
                 //   return;
                }

                try
                {
                    REKLAMADataSet.FAKTURYRow naglowekKorekty = utworzNaglowekKorekty(faktura);
                    pobierzEmisjeDoKorekty(faktura);
                    utworzPozycjeFakturyKorekty(naglowekKorekty);

                    if (!faktura.IsID_FK_KORNull())
                    {
                        naglowekKorekty.idFakturyKorekta = faktura.ID_FK_KOR;
                    }
                    
                    faktura.ID_FK_KOR = naglowekKorekty.ID_FAKTURY;
                    faktura.EndEdit();

                    SqlConnection conn = new SqlConnection(ConnString.getConnString().Value);

                    fAKTURYTableAdapter.Connection = conn;
                    emisjeTableAdapter.Connection = conn;
                    zamowieniaTableAdapter.Connection = conn;
                    fakturyDetailsTableAdapter.Connection = conn;
                    rEKLAMATableAdapter.Connection = conn;

                    conn.Open();

                    SqlTransaction transaction = conn.BeginTransaction();
                    fAKTURYTableAdapter.AttachTransaction(transaction);
                    emisjeTableAdapter.AttachTransaction(transaction);
                    zamowieniaTableAdapter.AttachTransaction(transaction);
                    fakturyDetailsTableAdapter.AttachTransaction(transaction);
                    rEKLAMATableAdapter.AttachTransaction(transaction);

                    try
                    {
                        fAKTURYTableAdapter.Update(this.rEKLAMADataSet.FAKTURY);
                        emisjeTableAdapter.Update(this.rEKLAMADataSet.UKAZE_SIE_W_NR);
                        fakturyDetailsTableAdapter.Update(this.rEKLAMADataSet.FAKTURA_DETAILS);
                        zamowieniaTableAdapter.Update(this.rEKLAMADataSet.zamowienia);

                        transaction.Commit();
                    }
                    catch (Exception e1)
                    {
                        transaction.Rollback();
                        conn.Close();
                        throw e1;
                    }
                }
                catch (Exception e2)
                {
                    MessageBox.Show("Wystąpił błąd: \n" + e2.ToString());
                }
                finally
                {
                    this.rEKLAMADataSet.UKAZE_SIE_W_NR.Clear();
                    this.rEKLAMADataSet.DatyWydan.Clear();
                    this.rEKLAMADataSet.FAKTURA_DETAILS.Clear();
                    this.fAKTURYBindingSource.ResetBindings(false);
                    this.fAKTURYDataGridView.Refresh();
                }
            }

            this.Cursor = Cursors.Default;
        }

        private REKLAMADataSet.FAKTURYRow utworzNaglowekKorekty(REKLAMADataSet.FAKTURYRow faktura)
        {
            REKLAMADataSet.FAKTURYRow naglowekKorekty = this.rEKLAMADataSet.FAKTURY.NewFAKTURYRow();
            naglowekKorekty.KOREKTA = true;
            //  naglowekKorekty.EKSPORT = true;

            naglowekKorekty.idZamowienia = faktura.idZamowienia;
            naglowekKorekty.idFakturyKorekta = faktura.ID_FAKTURY;

            naglowekKorekty.NUMER_ROZ = faktura.NUMER_ROZ; ;
            naglowekKorekty.NUMER = Utils.numerNowejFakturyKorekty(naglowekKorekty.NUMER_ROZ, DateTime.Today.Year);
            naglowekKorekty.NUMER_ROK = DateTime.Today.Year;
            naglowekKorekty.DATA_WYSTAWIENIA = DateTime.Today;

            naglowekKorekty.ID_SPRZEDAWCY = faktura.ID_SPRZEDAWCY;
            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;
            }

            this.rEKLAMADataSet.FAKTURY.AddFAKTURYRow(naglowekKorekty);

            return naglowekKorekty;
        }


        private void pobierzEmisjeDoKorekty(REKLAMADataSet.FAKTURYRow naglowekFaktury)
        {
            this.emisjeTableAdapter.ClearBeforeFill = false;
            this.datyWydanTableAdapter.ClearBeforeFill = false;

            this.emisjeTableAdapter.FillByIdFaktury(this.rEKLAMADataSet.UKAZE_SIE_W_NR, naglowekFaktury.ID_FAKTURY);
            this.datyWydanTableAdapter.FillByIdFaktury(this.rEKLAMADataSet.DatyWydan, naglowekFaktury.ID_FAKTURY);
        }

        private void utworzPozycjeFakturyKorekty(REKLAMADataSet.FAKTURYRow naglowekFaktury)
        {
            decimal brutto_waluta = 0;

            foreach (REKLAMADataSet.UKAZE_SIE_W_NRRow em in this.rEKLAMADataSet.UKAZE_SIE_W_NR)
            {
                if (em.status != 2)
                {
                    REKLAMADataSet.FAKTURA_DETAILSRow fakturaDetailsRow = this.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;
                    }

                    this.rEKLAMADataSet.FAKTURA_DETAILS.AddFAKTURA_DETAILSRow(fakturaDetailsRow);
                }
            }

            if (brutto_waluta != 0)
            {
                naglowekFaktury.waluta_brutto = Math.Round(Convert.ToDouble(brutto_waluta),2);
                naglowekFaktury.EndEdit();
            }
        }

        private void fAKTURYDataGridView_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            foreach (DataGridViewRow row in fAKTURYDataGridView.Rows)
            {
                DataRowView r = (DataRowView)row.DataBoundItem;
                REKLAMADataSet.FAKTURYRow f = (REKLAMADataSet.FAKTURYRow)r.Row;
                if (!f.IsidFakturyKorektaNull())
                {
                    row.DefaultCellStyle.ForeColor = Color.Red;
                }
            }
        }

        private void korektaDoExportButton_Click(object sender, EventArgs e)
        {
            if (fAKTURYBindingSource.Current != null)
            {
                this.Cursor = Cursors.WaitCursor;

                DataRowView row = (DataRowView)fAKTURYBindingSource.Current;
                REKLAMADataSet.FAKTURYRow faktura = (REKLAMADataSet.FAKTURYRow)row.Row;

                if (faktura.KOREKTA && faktura.EKSPORT)
                {
                    faktura.EKSPORT = false;
                    fAKTURYBindingSource.EndEdit();
                    fAKTURYTableAdapter.Update(this.rEKLAMADataSet.FAKTURY);
                }

                this.Cursor = Cursors.Default;
            }
        }

        private void button6_Click(object sender, EventArgs e)
        {
            if (fAKTURYBindingSource.Current != null)
            {
                DataRowView row = (DataRowView)fAKTURYBindingSource.Current;
                REKLAMADataSet.FAKTURYRow f =
                    (REKLAMADataSet.FAKTURYRow)row.Row;

                REKLAMADataSetTableAdapters.WplatyTableAdapter wplatyTableAdapter
                = new Baza_Reklam.REKLAMADataSetTableAdapters.WplatyTableAdapter();
                wplatyTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
                REKLAMADataSet.WplatyDataTable table = wplatyTableAdapter.GetDataByIdFaktury(f.ID_FAKTURY);

                PaymentForm2 pf2;

                if (table.Count == 0)
                {
                    pf2 = new PaymentForm2(0, f.ID_FAKTURY);
                }
                else
                {
                    pf2 = new PaymentForm2(table[0].idWplaty, f.ID_FAKTURY);
                }

                pf2.ShowDialog();
            }
        }

        private void reklama1Button_Click(object sender, EventArgs e)
        {
            if (rEKLAMABindingSource.Current != null)
            {
                DataRowView row = (DataRowView)rEKLAMABindingSource.Current;
                REKLAMADataSet.REKLAMARow reklama = (REKLAMADataSet.REKLAMARow)row.Row;
                int id = reklama.ReklamaID;

                OrderDetails.getOrderDetails().pokazSzczegolyZamowienia(id);

                if (OrderDetails.getOrderDetails().ShowDialog() == DialogResult.OK)
                {
                    rEKLAMATableAdapter.FillByIdZamowienia(this.rEKLAMADataSet.REKLAMA, reklama.idZamowienia);
                    rEKLAMABindingSource.Position = rEKLAMABindingSource.Find("reklamaId", id);
                }
            }
        }

        private void reklama2Button_Click(object sender, EventArgs e)
        {
            if (rEKLAMABindingSource1.Current != null)
            {
                DataRowView row = (DataRowView)rEKLAMABindingSource.Current;
                REKLAMADataSet.REKLAMARow reklama = (REKLAMADataSet.REKLAMARow)row.Row;
                int id = reklama.ReklamaID;

                OrderDetails.getOrderDetails().pokazSzczegolyZamowienia(id);
                if (OrderDetails.getOrderDetails().ShowDialog() == DialogResult.OK)
                {
                    ReklamyBezZamowienia = rEKLAMATableAdapter.GetDataByCustomerIdandIdZamowienia(klient.CustomerID);
                    rEKLAMABindingSource1.Position = rEKLAMABindingSource1.Find("reklamaId", id);
                }
            }
        }

        private void fAKTURYBindingSource_CurrentChanged(object sender, EventArgs e)
        {
            if (fAKTURYBindingSource.Current != null)
            {
                if (
                    ((REKLAMADataSet.FAKTURYRow)
                    ((DataRowView)fAKTURYBindingSource.Current).Row).KOREKTA)
                {
                    wplataButton.Enabled = false;
                }
                else
                {
                    wplataButton.Enabled = true;
                }
            }
        }

        private void zamowieniaBindingSource_CurrentChanged(object sender, EventArgs e)
        {
            if (zamowieniaBindingSource.Current != null)
            {
                DataRowView z = (DataRowView)zamowieniaBindingSource.Current;
                REKLAMADataSet.zamowieniaRow zamowienie = (REKLAMADataSet.zamowieniaRow)z.Row;
                rEKLAMATableAdapter.FillByIdZamowienia(this.rEKLAMADataSet.REKLAMA, zamowienie.idZamowienia);
                fAKTURYTableAdapter.FillByIdZamowienia(this.rEKLAMADataSet.FAKTURY, zamowienie.idZamowienia);

                dodajDoZamButton.Enabled = !zamowienie.zafakturowanoWszystko;
                usunZZamButton.Enabled = !zamowienie.zafakturowanoWszystko;
            }
        }

        private void usunFaktureButton_Click(object sender, EventArgs e)
        {
            if (fAKTURYBindingSource.Current != null)
            {
                if (
                    MessageBox.Show("Czy na pewno chcesz usunąć fakturę ?",
                    "",
                    MessageBoxButtons.OKCancel,
                    MessageBoxIcon.Question)
                    == DialogResult.OK)
                {
                    this.Cursor = Cursors.WaitCursor;

                    REKLAMADataSet.FAKTURYRow faktura = (REKLAMADataSet.FAKTURYRow)
                        ((DataRowView)fAKTURYBindingSource.Current).Row;

                    if (faktura.KOREKTA)
                    {
                        int i = fAKTURYBindingSource.Find("idFakturyKorekta",faktura.ID_FAKTURY);
                        if (i > -1)
                        {
                            MessageBox.Show("Nie można usunąć faktury");
                        }
                        else
                        {
                            usunKorekte(faktura);
                        }
                    }
                    else
                    {
                        usunFakture(faktura);
                    }

                    this.Cursor = Cursors.Default;
                }
            }
        }

        private void usunKorekte(REKLAMADataSet.FAKTURYRow korekta)
        {
            int idKorekty = korekta.ID_FAKTURY;
            int idKorygowanejFaktury = korekta.idFakturyKorekta;
            int idZam = korekta.idZamowienia;

              int i = fAKTURYBindingSource.Find("ID_FK_KOR",idKorekty);
         
            REKLAMADataSet.FAKTURYRow korygowanaFaktura = (REKLAMADataSet.FAKTURYRow)
                ((DataRowView)fAKTURYBindingSource.List[i]).Row;

             int j = fAKTURYBindingSource.Find("ID_FAKTURY",idKorygowanejFaktury);

             if (j > -1)
             {
                 REKLAMADataSet.FAKTURYRow poprzedniaKorekta = (REKLAMADataSet.FAKTURYRow)
                     ((DataRowView)fAKTURYBindingSource.List[j]).Row;

                 korygowanaFaktura.ID_FK_KOR = poprzedniaKorekta.ID_FAKTURY;
             }
             else
             {
                 korygowanaFaktura.SetID_FK_KORNull();
             }
            
            fAKTURYBindingSource.EndEdit();

            SqlConnection conn = new SqlConnection(ConnString.getConnString().Value);

            fAKTURYTableAdapter.Connection = conn;
            fakturyDetailsTableAdapter.Connection = conn;

            conn.Open();
            SqlTransaction transaction = conn.BeginTransaction();

            fAKTURYTableAdapter.AttachTransaction(transaction);
            fakturyDetailsTableAdapter.AttachTransaction(transaction);

            try
            {
                fAKTURYTableAdapter.Update(this.rEKLAMADataSet.FAKTURY);
                fAKTURYTableAdapter.Delete(idKorekty);
                fakturyDetailsTableAdapter.Delete(idKorekty);

                transaction.Commit();
            }
            catch (Exception ex)
            {
                transaction.Rollback();
                throw ex;
            }
            finally
            {
                fAKTURYTableAdapter.FillByIdZamowienia(this.rEKLAMADataSet.FAKTURY, idZam);
                conn.Close();
            }
        }

        private void usunFakture(REKLAMADataSet.FAKTURYRow faktura)
        {
            int idFakt = faktura.ID_FAKTURY;
            int idZam = faktura.idZamowienia;
            bool zmienReklamyOrazZamowienie = false;

            if (this.fAKTURYBindingSource.List.Count == 1)
            {
                zmienReklamyOrazZamowienie = true;
            }

            this.emisjeTableAdapter.ClearBeforeFill = false;
            this.emisjeTableAdapter.FillByIdFaktury(this.rEKLAMADataSet.UKAZE_SIE_W_NR, idFakt);

            foreach (DataRow r in this.rEKLAMADataSet.UKAZE_SIE_W_NR.Rows)
            {
                REKLAMADataSet.UKAZE_SIE_W_NRRow row = (REKLAMADataSet.UKAZE_SIE_W_NRRow)r;

                row.SetidFakturyNull();
                row.SetnettoNull();
                row.zafakturowana = false;
                row.EndEdit();
            }

            DataRowView zam = (DataRowView)zamowieniaBindingSource.Current;
            REKLAMADataSet.zamowieniaRow zamowienie =
                (REKLAMADataSet.zamowieniaRow)zam.Row;
         
            if (zmienReklamyOrazZamowienie)
            {
                foreach (DataRow r in this.rEKLAMADataSet.REKLAMA.Rows)
                {
                    REKLAMADataSet.REKLAMARow reklama = (REKLAMADataSet.REKLAMARow)r;
                    reklama.FAKTURA_WYSTAWIONO = false;
                    reklama.EndEdit();
                }

                zamowienie.zafakturowano = false;
                zamowienie.zafakturowanoWszystko = false;
            }

            zamowienie.SetdataOstatniejZafakturowanejEmisjiNull();
            zamowienie.EndEdit();
           
            SqlConnection conn = new SqlConnection(ConnString.getConnString().Value);

            fAKTURYTableAdapter.Connection = conn;
            emisjeTableAdapter.Connection = conn;
            zamowieniaTableAdapter.Connection = conn;
            fakturyDetailsTableAdapter.Connection = conn;
            rEKLAMATableAdapter.Connection = conn;

            conn.Open();
            SqlTransaction transaction = conn.BeginTransaction();

            fAKTURYTableAdapter.AttachTransaction(transaction);
            emisjeTableAdapter.AttachTransaction(transaction);
            zamowieniaTableAdapter.AttachTransaction(transaction);
            fakturyDetailsTableAdapter.AttachTransaction(transaction);
            rEKLAMATableAdapter.AttachTransaction(transaction);

            try
            {
                fAKTURYTableAdapter.Delete(idFakt);
                fakturyDetailsTableAdapter.Delete(idFakt);
                wplatyTableAdapter.Delete(idFakt);
                emisjeTableAdapter.Update(this.rEKLAMADataSet.UKAZE_SIE_W_NR);
                zamowieniaTableAdapter.Update(this.rEKLAMADataSet.zamowienia);
                rEKLAMATableAdapter.Update(this.rEKLAMADataSet.REKLAMA);

                transaction.Commit();
            }
            catch (Exception e)
            {
                transaction.Rollback();
            }
            finally
            {
                this.rEKLAMADataSet.UKAZE_SIE_W_NR.Clear();
                fAKTURYTableAdapter.FillByIdZamowienia(this.rEKLAMADataSet.FAKTURY, idZam);
                conn.Close();
            }
        }

        private void proformaButton_Click(object sender, EventArgs e)
        {
            if (zamowieniaBindingSource.Current != null)
            {
                this.Cursor = Cursors.WaitCursor;

                DataRowView z = (DataRowView)zamowieniaBindingSource.Current;
                REKLAMADataSet.zamowieniaRow zamowienie = (REKLAMADataSet.zamowieniaRow)z.Row;

                REKLAMADataSet.KLIENCIRow klient = (REKLAMADataSet.KLIENCIRow)this.klienciTableAdapter.GetDataByCustomerId(zamowienie.idKlienta).Rows[0];
                string errorMessage = czyMoznaZafakturowac(zamowienie, klient);

                if (errorMessage != string.Empty)
                {
                    MessageBox.Show(errorMessage);
                    this.Cursor = Cursors.Default;
                    return;
                }

                int id = wystawFakture(zamowienie, klient);
                FactureViewer fv = new FactureViewer(id,true);

                fv.ShowDialog();

                DataRow[] rows = this.rEKLAMADataSet.FAKTURY.Select("id_faktury=" + id);
                usunFakture((REKLAMADataSet.FAKTURYRow)rows[0]);

                this.Cursor = Cursors.Default;
            }
        }
    }
}