using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Globalization;
using System.Data.SqlClient;

namespace Baza_Reklam
{
    public partial class FakturowaniePoznanKatowice : Form
    {
        SLOWNIKDataSet.AGENCJERow agencjaPoznan;
        SLOWNIKDataSet.AGENCJERow agencjaKatowice;
        SLOWNIKDataSet.AGENCJERow agencjaRedakcja;
        SLOWNIKDataSet.KONTARow konto;

        REKLAMADataSet.KLIENCIRow klientPoznan;
        REKLAMADataSet.KLIENCIRow klientKatowice;

        int idZamowieniaPoznan;
        int idZamowieniaKatowice;

        public FakturowaniePoznanKatowice()
        {
            InitializeComponent();

            this.fAKTURYTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            this.fakturA_DETAILSTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            this.klienciTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            this.agencjeTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            this.kontaTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            this.wplatyTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;

            dtpZmianaDaty.Value = DateTime.Today;
            dtpZmianaDaty.MaxDate = DateTime.Today;

            nrTygodniaUpDown.Minimum = 1;
            nrTygodniaUpDown.Maximum = 53;

            CultureInfo ciCurr = CultureInfo.CurrentCulture;
            int weekNum = ciCurr.Calendar.GetWeekOfYear(DateTime.Today, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);

            nrTygodniaUpDown.Value = weekNum;


            if (ConnString.getConnString().Value.Contains("TEST"))
            {
                idZamowieniaKatowice = 149;
                idZamowieniaPoznan = 148;
            }
            else
            {
                //baza produkcyjna
                idZamowieniaPoznan = 272;
                idZamowieniaKatowice = 273;
            }
        }

        private void FakturowaniePoznanKatowice_Load(object sender, EventArgs e)
        {
            agencjaPoznan = (SLOWNIKDataSet.AGENCJERow)this.agencjeTableAdapter.GetDataByIdAgencji(6)[0];
            agencjaKatowice = (SLOWNIKDataSet.AGENCJERow)this.agencjeTableAdapter.GetDataByIdAgencji(4)[0];
            agencjaRedakcja = (SLOWNIKDataSet.AGENCJERow)this.agencjeTableAdapter.GetDataByIdAgencji(2)[0];

            konto = (SLOWNIKDataSet.KONTARow)this.kontaTableAdapter.GetDataById(43)[0];

            klientKatowice = (REKLAMADataSet.KLIENCIRow)this.klienciTableAdapter.GetDataByCustomerId(678)[0];
            klientPoznan = (REKLAMADataSet.KLIENCIRow)this.klienciTableAdapter.GetDataByCustomerId(18845)[0];
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (agencjaListBox.SelectedItem != null)
            {
                this.fAKTURYTableAdapter.FillByKodAgenta(this.rEKLAMADataSet.FAKTURY,
                    agencjaListBox.SelectedItem.ToString());
            }
        }

        private void fakturaButton_Click(object sender, EventArgs e)
        {
            REKLAMADataSet.FAKTURYRow naglowekFaktury = null;

            try
            {
                switch (agencjaListBox.SelectedItem.ToString())
                {
                    case "POZ":
                        naglowekFaktury = utworzNaglowekFaktury(klientPoznan, agencjaPoznan);
                        break;
                    case "KAT":
                        naglowekFaktury = utworzNaglowekFaktury(klientKatowice, agencjaKatowice);
                        break;
                }

                this.rEKLAMADataSet.FAKTURY.AddFAKTURYRow(naglowekFaktury);
                utworzPozycjeFaktury(naglowekFaktury);
                dodajWplate(naglowekFaktury);
               
                SqlConnection conn = new SqlConnection(ConnString.getConnString().Value);

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

                conn.Open();

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

                try
                {
                    fAKTURYTableAdapter.Update(this.rEKLAMADataSet.FAKTURY);
                    fakturA_DETAILSTableAdapter.Update(this.rEKLAMADataSet.FAKTURA_DETAILS);
                    wplatyTableAdapter.Update(this.rEKLAMADataSet.Wplaty);
                    transaction.Commit();
                    dtpZmianaDaty.Value = DateTime.Today;
                }
                catch (Exception e1)
                {
                    transaction.Rollback();
                    conn.Close();
                    this.rEKLAMADataSet.FAKTURA_DETAILS.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.FAKTURA_DETAILS.Clear();
                this.rEKLAMADataSet.Wplaty.Clear();
                this.fAKTURYBindingSource.ResetBindings(false);
                this.fAKTURYBindingSource.Sort = "NUMER";
                this.fAKTURYDataGridView.Refresh();
            }
        }

        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 = null;

                    switch (agencjaListBox.SelectedItem.ToString())
                    {
                        case "POZ":
                            naglowekKorekty = utworzNaglowekKorekty(faktura);
                            break;
                        case "KAT":
                            naglowekKorekty = utworzNaglowekKorekty(faktura);
                            break;
                    }

                    utworzPozycjeFakturyKorekty(naglowekKorekty);

                    if (!faktura.IsID_FK_KORNull())
                    {
                        naglowekKorekty.idFakturyKorekta = faktura.ID_FK_KOR;
                    }
            
                    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(this.rEKLAMADataSet.FAKTURY);

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

                        fAKTURYTableAdapter.Update(this.rEKLAMADataSet.FAKTURY);

                        fakturA_DETAILSTableAdapter.Update(this.rEKLAMADataSet.FAKTURA_DETAILS);
                       
                        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.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.idFakturyKorekta = faktura.ID_FAKTURY;
            naglowekKorekty.idFakturyVAT = 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;

            if (faktura.ID_SPRZEDAWCY == 6)
            {
                naglowekKorekty.idZamowienia = idZamowieniaPoznan;
            }
            else
            {
                naglowekKorekty.idZamowienia = idZamowieniaKatowice;
            }
            
            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(14);
            naglowekKorekty.opis = "rezygnacja z emisji reklamy";

            naglowekKorekty.SPOSOB_ZAPLATY = faktura.SPOSOB_ZAPLATY;
            
            naglowekKorekty.ZAPLACONO = false;

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

            naglowekKorekty.ID_KONTA = faktura.ID_KONTA;

            this.rEKLAMADataSet.FAKTURY.AddFAKTURYRow(naglowekKorekty);

            return naglowekKorekty;
        }



        private REKLAMADataSet.FAKTURYRow utworzNaglowekFaktury(REKLAMADataSet.KLIENCIRow klientAgencja, SLOWNIKDataSet.AGENCJERow agencja)
        {
            REKLAMADataSet.FAKTURYRow naglowekFaktury = (REKLAMADataSet.FAKTURYRow)this.rEKLAMADataSet.FAKTURY.NewRow();

            naglowekFaktury.NUMER_ROZ = agencjaListBox.SelectedItem.ToString();
            naglowekFaktury.NUMER = Utils.numerNowejFaktury(naglowekFaktury.NUMER_ROZ, DateTime.Today.Year);
            naglowekFaktury.NUMER_ROK = DateTime.Today.Year;
            naglowekFaktury.DATA_WYSTAWIENIA = DateTime.Today;
            
            if (dtpZmianaDaty.Value != DateTime.Today)
            {
                naglowekFaktury.DATA_WYSTAWIENIA = dtpZmianaDaty.Value;
            }

            if (agencja.Id_agencji == 6)
            {
                naglowekFaktury.idZamowienia = idZamowieniaPoznan;
            }
            else
            {
                naglowekFaktury.idZamowienia = idZamowieniaKatowice;
            }

            naglowekFaktury.ID_SPRZEDAWCY = agencja.Id_agencji;

            naglowekFaktury.EKSPORT = false;
            
            naglowekFaktury.MIEJSCOWOSC_WYSTAWIENIA = agencjaRedakcja.miasto;
            naglowekFaktury.SPRZEDAWCA_ADRES = agencjaRedakcja.Adres_Fk;
            naglowekFaktury.SPRZEDAWCA_NIP = agencjaRedakcja.NIP;

            naglowekFaktury.PODPIS_WYSTAWIL = string.Empty;
            naglowekFaktury.DATA_SPRZEDAZY = naglowekFaktury.DATA_WYSTAWIENIA;

            naglowekFaktury.ID_NABYWCY = klientAgencja.CustomerID;
            naglowekFaktury.NABYWCA_ADRES = klientAgencja.Adres_Fkatura;
            naglowekFaktury.NABYWCA_NIP = klientAgencja.Nip;
            naglowekFaktury.opis = string.Empty;

            naglowekFaktury.SPOSOB_ZAPLATY = "Przelew";
           
            naglowekFaktury.TERMIN_ZAPLATY = naglowekFaktury.DATA_SPRZEDAZY.AddDays(14);
            naglowekFaktury.ZAPLACONO = false;

            naglowekFaktury.FAKTURA_TYP = 2;
            naglowekFaktury.FAKTURA_PODTYP = 1;

            naglowekFaktury.ID_KONTA = Convert.ToInt16(konto.id);

            naglowekFaktury.EndEdit();
            return naglowekFaktury;
        }

        private void utworzPozycjeFaktury(REKLAMADataSet.FAKTURYRow naglowekFaktury)
        {
            REKLAMADataSet.FAKTURA_DETAILSDataTable pozycjeFakturDlaKlientow =
                this.fakturA_DETAILSTableAdapter.GetDataByNrTygodniaWRoku(
                    dtpZmianaDaty.Value.Year, nrTygodniaUpDown.Value, naglowekFaktury.ID_SPRZEDAWCY, dtpZmianaDaty.Value.Month);
                        
            REKLAMADataSet.FAKTURYDataTable naglowkiFakturDlaKlientow =
                this.fAKTURYTableAdapter.GetDataByNrTygodniaWRoku(
                    dtpZmianaDaty.Value.Year, nrTygodniaUpDown.Value, naglowekFaktury.ID_SPRZEDAWCY,dtpZmianaDaty.Value.Month);

            if (pozycjeFakturDlaKlientow.Rows.Count == 0 || naglowkiFakturDlaKlientow.Rows.Count == 0)
            {
                throw new Exception("Nie ma co fakturować");
            }
        
            foreach (REKLAMADataSet.FAKTURA_DETAILSRow pozycjaFaktury in pozycjeFakturDlaKlientow)
            {
                REKLAMADataSet.FAKTURA_DETAILSRow fakturaDetailsRow = this.rEKLAMADataSet.FAKTURA_DETAILS.NewFAKTURA_DETAILSRow();
                REKLAMADataSet.FAKTURYRow faktura = naglowkiFakturDlaKlientow.FindByID_FAKTURY(pozycjaFaktury.ID_FAKTURY);

                fakturaDetailsRow.ROK = pozycjaFaktury.ROK;
                fakturaDetailsRow.MIESIAC = pozycjaFaktury.MIESIAC;
                fakturaDetailsRow.TYTUL = pozycjaFaktury.TYTUL;
                fakturaDetailsRow.NAZWA_USLUGI = faktura != null ? faktura.NUMER + "/" + faktura.NUMER_ROZ + "/" 
                    + faktura.NUMER_ROK + " | " + pozycjaFaktury.NAZWA_USLUGI : "";
                fakturaDetailsRow.reklamaId = pozycjaFaktury.reklamaId; 
                fakturaDetailsRow.NR_WYDANIA = pozycjaFaktury.NR_WYDANIA;

                fakturaDetailsRow.CENA_JEDN = pozycjaFaktury.CENA_JEDN;
                fakturaDetailsRow.ILOSC = 1;
                fakturaDetailsRow.JM = "szt.";

                fakturaDetailsRow.UPUST_NETTO = pozycjaFaktury.UPUST_NETTO;
                fakturaDetailsRow.UPUST_PR = pozycjaFaktury.UPUST_PR;
                decimal netto = (1 - Convert.ToDecimal(pozycjaFaktury.UPUST_PR))
                    * pozycjaFaktury.CENA_JEDN;
                fakturaDetailsRow.NETTO = netto;
                fakturaDetailsRow.S_VAT = 0.22;
                decimal VAT = Convert.ToDecimal(0.22);
                fakturaDetailsRow.VAT = Convert.ToDecimal(Math.Round(VAT * netto, 2));
                fakturaDetailsRow.BRUTTO = Convert.ToDecimal(Math.Round((1 + VAT) * netto, 2));

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

                if (!pozycjaFaktury.IswyroznienieNull())
                {
                    if (pozycjaFaktury.wyroznienie)
                    {
                        fakturaDetailsRow.wyroznienie = true;
                    }
                }
                
                this.rEKLAMADataSet.FAKTURA_DETAILS.AddFAKTURA_DETAILSRow(fakturaDetailsRow);
            }
        }

        private void utworzPozycjeFakturyKorekty(REKLAMADataSet.FAKTURYRow naglowekFaktury)
        {

            REKLAMADataSet.FAKTURA_DETAILSDataTable pozycjeFakturDlaKlientow =
                this.fakturA_DETAILSTableAdapter.GetDataByNrTygodniaRokZKorekta(dtpZmianaDaty.Value.Month,
                    dtpZmianaDaty.Value.Year, nrTygodniaUpDown.Value,naglowekFaktury.ID_SPRZEDAWCY);

            REKLAMADataSet.FAKTURYDataTable naglowkiFakturDlaKlientow =
                this.fAKTURYTableAdapter.GetDataByNrTygodniaWRokuZKorekta(dtpZmianaDaty.Value.Month,
                    dtpZmianaDaty.Value.Year, nrTygodniaUpDown.Value,naglowekFaktury.ID_SPRZEDAWCY);

            if (pozycjeFakturDlaKlientow.Rows.Count == 0 || naglowkiFakturDlaKlientow.Rows.Count == 0)
            {
                throw new Exception("Nie ma co fakturować");
            }

            foreach (REKLAMADataSet.FAKTURA_DETAILSRow pozycjaFaktury in pozycjeFakturDlaKlientow)
            {
                REKLAMADataSet.FAKTURA_DETAILSRow fakturaDetailsRow = this.rEKLAMADataSet.FAKTURA_DETAILS.NewFAKTURA_DETAILSRow();
                REKLAMADataSet.FAKTURYRow faktura = naglowkiFakturDlaKlientow.FindByID_FAKTURY(pozycjaFaktury.ID_FAKTURY);

                fakturaDetailsRow.ROK = pozycjaFaktury.ROK;
                fakturaDetailsRow.MIESIAC = pozycjaFaktury.MIESIAC;
                fakturaDetailsRow.TYTUL = pozycjaFaktury.TYTUL;
                fakturaDetailsRow.NAZWA_USLUGI = faktura != null ? faktura.NUMER + "/" + faktura.NUMER_ROZ + "/"
                    + faktura.NUMER_ROK + " | " + pozycjaFaktury.NAZWA_USLUGI : "";
                fakturaDetailsRow.reklamaId = pozycjaFaktury.reklamaId;
                fakturaDetailsRow.NR_WYDANIA = pozycjaFaktury.NR_WYDANIA;

                fakturaDetailsRow.CENA_JEDN = pozycjaFaktury.CENA_JEDN;
                fakturaDetailsRow.ILOSC = 1;
                fakturaDetailsRow.JM = "szt.";

                fakturaDetailsRow.UPUST_NETTO = pozycjaFaktury.UPUST_NETTO;
                fakturaDetailsRow.UPUST_PR = pozycjaFaktury.UPUST_PR;
                decimal netto = (1 - Convert.ToDecimal(pozycjaFaktury.UPUST_PR))
                    * pozycjaFaktury.CENA_JEDN;
                fakturaDetailsRow.NETTO = netto;
                fakturaDetailsRow.S_VAT = 0.22;
                decimal VAT = Convert.ToDecimal(0.22);
                fakturaDetailsRow.VAT = Convert.ToDecimal(Math.Round(VAT * netto, 2));
                fakturaDetailsRow.BRUTTO = Convert.ToDecimal(Math.Round((1 + VAT) * netto, 2));

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

                if (!pozycjaFaktury.IswyroznienieNull())
                {
                    if (pozycjaFaktury.wyroznienie)
                    {
                        fakturaDetailsRow.wyroznienie = true;
                    }
                }

                this.rEKLAMADataSet.FAKTURA_DETAILS.AddFAKTURA_DETAILSRow(fakturaDetailsRow);
            }
        }
        

        private void dodajWplate(REKLAMADataSet.FAKTURYRow naglowekFaktury)
        {
            REKLAMADataSet.WplatyRow wplata = this.rEKLAMADataSet.Wplaty.NewWplatyRow();
            wplata.idFaktury = naglowekFaktury.ID_FAKTURY;

            if (naglowekFaktury.ID_SPRZEDAWCY == 6)
            {
                wplata.idZamowienia = idZamowieniaPoznan;
            }
            else
            {
                wplata.idZamowienia = idZamowieniaKatowice;
            }
        }

        private void wydrukButton_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.ID_FAKTURY, row.idFakturyVAT, row.idFakturyKorekta);
                    fv.ShowDialog();
                }

            }
        }

        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;

                    string kod = faktura.NUMER_ROZ;

                    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.fAKTURYTableAdapter.FillByKodAgenta(this.rEKLAMADataSet.FAKTURY, kod);
                    
                    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 && i != j)
            {
                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;
            fakturA_DETAILSTableAdapter.Connection = conn;

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

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

            try
            {
                fAKTURYTableAdapter.Update(this.rEKLAMADataSet.FAKTURY);
                fAKTURYTableAdapter.Delete(idKorekty);
                fakturA_DETAILSTableAdapter.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;
          
            SqlConnection conn = new SqlConnection(ConnString.getConnString().Value);

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

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

            fAKTURYTableAdapter.AttachTransaction(transaction);
            fakturA_DETAILSTableAdapter.AttachTransaction(transaction);
            wplatyTableAdapter.AttachTransaction(transaction);
            
            try
            {
                fAKTURYTableAdapter.Delete(idFakt);
                fakturA_DETAILSTableAdapter.Delete(idFakt);
                wplatyTableAdapter.Delete(idFakt);
                
                transaction.Commit();
            }
            catch (Exception e)
            {
                transaction.Rollback();
            }
            finally
            {
                conn.Close();
            }
        }
    }
}