using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Globalization;
using System.Data.SqlClient;
using Baza_Reklam.Classes.Helpers;
using Baza_Reklam.Classes.Model;

namespace Baza_Reklam
{
    public partial class FakturowaniePoznanKatowice : Form
    {
        //HACK: hardcoded SystemKsiegowyId
        private const int ACCOUNTING_SYSTEM = 1;
        
        private SLOWNIKDataSet.AGENCJERow _agencjaRedakcja;
        private SLOWNIKDataSet.KONTARow _konto;

        public FakturowaniePoznanKatowice()
        {
            InitializeComponent();

            txtYear.Text = DateTime.Now.Year.ToString();

            fAKTURYTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            fakturA_DETAILSTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            klienciTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            agencjeTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            kontaTableAdapter.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 - 1;
            monthUpDown.Value = DateTime.Now.Month;
        }

        private void FakturowaniePoznanKatowice_Load(object sender, EventArgs e)
        {
            ResetChildInvoices();
            cbAgency.SelectedIndex = 0;
            _agencjaRedakcja = agencjeTableAdapter.GetDataByIdAgencji((int)FakturaHelper.OfficeId.Redakcja)[0];

            _konto = kontaTableAdapter.GetDataById((int)FakturaHelper.BankAccount.CentralaPln)[0];
        }

        private SLOWNIKDataSet.AGENCJERow GetAgency(string numerRoz)
        {
            switch (numerRoz)
            {
                case "POZ":
                    return agencjeTableAdapter.GetDataByIdAgencji((int) FakturaHelper.OfficeId.Poznan)[0];
                case "KAT":
                    return agencjeTableAdapter.GetDataByIdAgencji((int) FakturaHelper.OfficeId.Katowice)[0];
                default:
                    return null;
            }
        }

        private REKLAMADataSet.KLIENCIRow GetClient(string numerRoz)
        {
            switch (numerRoz)
            {
                case "POZ":
                    return klienciTableAdapter.GetDataByCustomerId((int)FakturaHelper.ClientId.Poznan)[0];
                case "KAT":
                    return klienciTableAdapter.GetDataByCustomerId((int)FakturaHelper.ClientId.Katowice)[0];
                default:
                    return null;
            }
        }

        private string ValidateSearch()
        {
            int year;
            StringBuilder errorMsg = new StringBuilder();

            if (string.IsNullOrEmpty(txtYear.Text) || !Int32.TryParse(txtYear.Text, out year))
                errorMsg.Append("- Proszę podać poprawny rok \n");
            if (cbAgency.SelectedItem == null)
                errorMsg.Append("- Proszę wybrać agencję");

            if (!string.IsNullOrEmpty(errorMsg.ToString()))
                errorMsg.Insert(0, "Proszę poprawić:\n");

            return errorMsg.ToString();
        }

        private void btnSearch_Click(object sender, EventArgs e)
        {
            ResetChildInvoices();

            string errorMsg = ValidateSearch();
            if (!string.IsNullOrEmpty(errorMsg))
            {
                MessageBox.Show(errorMsg, "Wyszukiwanie");
                return;
            }

            Cursor = Cursors.WaitCursor;

            fAKTURYDataGridView.DataSource = FakturaHelper.GetPartnerInvoiceList(int.Parse(txtYear.Text),
                                                                                 (int)monthUpDown.Value,
                                                                                 cbAgency.Text);
            Cursor = Cursors.Default;
        }

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

            SLOWNIKDataSet.AGENCJERow agencja = GetAgency(cbAgency.Text);

            REKLAMADataSet.FAKTURYDataTable fakturyDataTable = GetInvoices(dtpZmianaDaty.Value.Year,
                                                                           dtpZmianaDaty.Value.Month,
                                                                           (int) nrTygodniaUpDown.Value,
                                                                           agencja.Id_agencji,
                                                                           false);
            if (fakturyDataTable.Rows.Count <= 0)
            {
                Cursor = Cursors.Default;
                MessageBox.Show("Nie ma co fakturować lub faktura już wystawiona na wybrany tydzień!",
                                "Faktury - Poznań i Katowice");

                CreateBarterInvoices();
                return;
            }
            
            try
            {
                REKLAMADataSet.FAKTURA_DETAILSDataTable fakturaDetailsDataTable =
                    GetInvoiceDetails(dtpZmianaDaty.Value.Year,
                                      dtpZmianaDaty.Value.Month,
                                      (int) nrTygodniaUpDown.Value,
                                      agencja.Id_agencji,
                                      false);

                
                REKLAMADataSet.FAKTURYRow naglowekFaktury = FakturaHelper.GetInvoice(rEKLAMADataSet.FAKTURY,
                                                                                     GetClient(cbAgency.Text),
                                                                                     agencja,
                                                                                     _agencjaRedakcja,
                                                                                     _konto,
                                                                                     cbAgency.Text,
                                                                                     FakturaHelper.PaymentType.Transfer,
                                                                                     dtpZmianaDaty.Value,
                                                                                     ACCOUNTING_SYSTEM);

                rEKLAMADataSet.FAKTURY.AddFAKTURYRow(naglowekFaktury);
                UtworzPozycjeFaktury(naglowekFaktury, fakturyDataTable, fakturaDetailsDataTable);
                DodajWplate(naglowekFaktury);

                FakturaHelper.AddInvoice(rEKLAMADataSet,
                                         fAKTURYTableAdapter,
                                         fakturA_DETAILSTableAdapter,
                                         wplatyTableAdapter,
                                         naglowekFaktury);


                dtpZmianaDaty.Value = DateTime.Today;
            }
            finally
            {
                Cursor = Cursors.Default;
                rEKLAMADataSet.FAKTURA_DETAILS.Clear();
                rEKLAMADataSet.Wplaty.Clear();
                fAKTURYBindingSource.ResetBindings(false);
                fAKTURYBindingSource.Sort = "NUMER";

                fAKTURYDataGridView.DataSource = FakturaHelper.GetPartnerInvoiceList(int.Parse(txtYear.Text),
                                                                                     (int) monthUpDown.Value,
                                                                                     cbAgency.Text);

                if (fAKTURYTableAdapter.Connection != null &&
                    fAKTURYTableAdapter.Connection.State == ConnectionState.Open)
                {
                    fAKTURYTableAdapter.Connection.Close();
                    fAKTURYTableAdapter.Connection.Dispose();
                }
            }

            CreateBarterInvoices();
        }


        private void CreateBarterInvoices()
        {
            Cursor = Cursors.WaitCursor;
            SLOWNIKDataSet.AGENCJERow agencja = GetAgency(cbAgency.Text);
            REKLAMADataSet.FAKTURYDataTable barters = GetInvoices(dtpZmianaDaty.Value.Year,
                                                                  dtpZmianaDaty.Value.Month,
                                                                  (int) nrTygodniaUpDown.Value,
                                                                  agencja.Id_agencji,
                                                                  true);
            Cursor = Cursors.Default;
            if (barters.Rows.Count <= 0) return;

            DialogResult dialogResult = MessageBox.Show("Czy chcesz wystawić faktury dla barterów?",
                                                        "Faktura - Poznań i Katowice",
                                                        MessageBoxButtons.YesNo,
                                                        MessageBoxIcon.Question);
            if (dialogResult != DialogResult.Yes) return;

            Cursor = Cursors.WaitCursor;

            REKLAMADataSet.FAKTURA_DETAILSDataTable barterDetails = GetInvoiceDetails(dtpZmianaDaty.Value.Year,
                                                                                      dtpZmianaDaty.Value.Month,
                                                                                      (int) nrTygodniaUpDown.Value,
                                                                                      agencja.Id_agencji,
                                                                                      true);

            foreach (REKLAMADataSet.FAKTURYRow row in barters)
            {
                
                REKLAMADataSet.FAKTURYRow barterInvoice = FakturaHelper.GetInvoice(rEKLAMADataSet.FAKTURY,
                                                                                   GetClient(cbAgency.Text),
                                                                                   agencja,
                                                                                   _agencjaRedakcja,
                                                                                   _konto,
                                                                                   cbAgency.Text,
                                                                                   FakturaHelper.PaymentType.Barter,
                                                                                   dtpZmianaDaty.Value,
                                                                                   ACCOUNTING_SYSTEM);

                rEKLAMADataSet.FAKTURY.AddFAKTURYRow(barterInvoice);
                foreach (REKLAMADataSet.FAKTURA_DETAILSRow barterDetail in barterDetails.Select("ID_FAKTURY=" + row.ID_FAKTURY))
                {
                    FakturaHelper.AddInvoiceDetails(barterInvoice, row, barterDetail, rEKLAMADataSet.FAKTURA_DETAILS);
                }

                DodajWplate(barterInvoice);

                FakturaHelper.AddInvoice(rEKLAMADataSet,
                                         fAKTURYTableAdapter,
                                         fakturA_DETAILSTableAdapter,
                                         wplatyTableAdapter,
                                         barterInvoice);
            }

            rEKLAMADataSet.FAKTURA_DETAILS.Clear();
            rEKLAMADataSet.Wplaty.Clear();
            fAKTURYBindingSource.ResetBindings(false);
            fAKTURYBindingSource.Sort = "NUMER";

            fAKTURYDataGridView.DataSource = FakturaHelper.GetPartnerInvoiceList(int.Parse(txtYear.Text),
                                                                     (int)monthUpDown.Value,
                                                                     cbAgency.Text);

            if (fAKTURYTableAdapter.Connection != null &&
                fAKTURYTableAdapter.Connection.State == ConnectionState.Open)
            {
                fAKTURYTableAdapter.Connection.Close();
                fAKTURYTableAdapter.Connection.Dispose();
            }
            Cursor = Cursors.Default;

        }

        private void UtworzPozycjeFaktury(REKLAMADataSet.FAKTURYRow naglowekFaktury, REKLAMADataSet.FAKTURYDataTable naglowkiFakturDlaKlientow, REKLAMADataSet.FAKTURA_DETAILSDataTable pozycjeFakturDlaKlientow)
        {

            foreach (REKLAMADataSet.FAKTURA_DETAILSRow pozycjaFaktury in pozycjeFakturDlaKlientow)
            {

                REKLAMADataSet.FAKTURYRow faktura = naglowkiFakturDlaKlientow.FindByID_FAKTURY(pozycjaFaktury.ID_FAKTURY);

                FakturaHelper.AddInvoiceDetails(naglowekFaktury, faktura, pozycjaFaktury, rEKLAMADataSet.FAKTURA_DETAILS);
            }
        }

        private REKLAMADataSet.FAKTURYDataTable GetInvoices(int year, int month, int week, int sellerId, bool barters)
        {

            if (fAKTURYTableAdapter.Connection != null &&
                string.IsNullOrEmpty(fAKTURYTableAdapter.Connection.ConnectionString))
                fAKTURYTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;

            if (barters)
                return fAKTURYTableAdapter.GetBartersByWeekNumber(year, week, sellerId, month);

            return fAKTURYTableAdapter.GetDataByNrTygodniaWRoku(year, week, sellerId, month);
        }



        private REKLAMADataSet.FAKTURA_DETAILSDataTable GetInvoiceDetails(int year, int month, int week, int sellerId, bool barters)
        {
            if (fakturA_DETAILSTableAdapter.Connection != null && string.IsNullOrEmpty(fakturA_DETAILSTableAdapter.Connection.ConnectionString))
                fakturA_DETAILSTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;

            if (barters)
                return fakturA_DETAILSTableAdapter.GetBartersByWeekNumber(year, week, sellerId, month);

            return fakturA_DETAILSTableAdapter.GetDataByNrTygodniaWRoku(year, week, sellerId, month);
        }

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

            wplata.idZamowienia = naglowekFaktury.ID_SPRZEDAWCY == (int) FakturaHelper.OfficeId.Poznan
                                                                      ? (int) FakturaHelper.OrderId.Poznan
                                                                      : (int) FakturaHelper.OrderId.Katowice;
            wplata.EndEdit();
            rEKLAMADataSet.Wplaty.AddWplatyRow(wplata);
        }

        private void wydrukButton_Click(object sender, EventArgs e)
        {
            if (fAKTURYDataGridView.SelectedRows.Count != 1) return;

            Cursor = Cursors.WaitCursor;

            PreviewInvoice((Invoice) fAKTURYDataGridView.SelectedRows[0].DataBoundItem);

            Cursor = Cursors.Default;
        }


        private void usunFaktureButton_Click(object sender, EventArgs e)
        {
            if (fAKTURYDataGridView.SelectedRows.Count != 1) return;

            DialogResult dialogResult = MessageBox.Show("Czy na pewno chcesz usunąć fakturę?",
                                                        "Faktura - usuwanie",
                                                        MessageBoxButtons.YesNo,
                                                        MessageBoxIcon.Question);
            if (dialogResult != DialogResult.Yes) return;

            Cursor = Cursors.WaitCursor;


            Invoice invoice = (Invoice)fAKTURYDataGridView.SelectedRows[0].DataBoundItem;

            if (Convert.ToBoolean(invoice.IsCorrectionInvoice))
            {
                MessageBox.Show("Nie można usunąć faktury");
                Cursor = Cursors.Default;
                return;
            }

            UsunFakture(invoice);
            ResetChildInvoices();
            fAKTURYDataGridView.DataSource = FakturaHelper.GetPartnerInvoiceList(int.Parse(txtYear.Text),
                                                                                 (int) monthUpDown.Value, 
                                                                                 cbAgency.Text);

            Cursor = Cursors.Default;
        }


        private void UsunFakture(Invoice invoice)
        {
            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(invoice.Id);
                fakturA_DETAILSTableAdapter.Delete(invoice.Id);
                wplatyTableAdapter.Delete(invoice.Id);

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

        private void fAKTURYDataGridView_SelectionChanged(object sender, EventArgs e)
        {
            if (fAKTURYDataGridView.SelectedRows.Count != 1) return;

            Invoice invoice = (Invoice)fAKTURYDataGridView.SelectedRows[0].DataBoundItem;

            List<Invoice> invoices = FakturaHelper.GetInvoiceList(invoice.Id);
            dgvChildInvoices.DataSource = invoices;
        }

        private void dgvChildInvoices_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            if (dgvChildInvoices.RowCount == 0)
            {
                txtTotalAmount.Text = decimal.Zero.ToString("C2");
                return;
            }
            decimal totalAmount = decimal.Zero;
            foreach (DataGridViewRow invoiceViewRow in dgvChildInvoices.Rows)
            {
                totalAmount += ((Invoice) invoiceViewRow.DataBoundItem).Amount;
            }

            txtTotalAmount.Text = totalAmount.ToString("C2");
        }

        private void ResetChildInvoices()
        {
            dgvChildInvoices.DataSource = new List<Invoice>();
            txtTotalAmount.Text = decimal.Zero.ToString("C2");
        }

        private void dgvChildInvoices_DoubleClick(object sender, EventArgs e)
        {
            if (dgvChildInvoices.SelectedRows.Count != 1) return;

            Cursor = Cursors.WaitCursor;

            PreviewInvoice((Invoice) dgvChildInvoices.SelectedRows[0].DataBoundItem);

            Cursor = Cursors.Default;

        }

        private static void PreviewInvoice(Invoice invoice)
        {
            if (!invoice.IsCorrectionInvoice)
            {
                FactureViewer fv = new FactureViewer(invoice.Id, false);
                fv.ShowDialog();
            }
            else
                MessageBox.Show("Do zrobienia - podgląd faktury korekty...");            
        }

        private void fAKTURYDataGridView_DoubleClick(object sender, EventArgs e)
        {
            if (fAKTURYDataGridView.SelectedRows.Count != 1) return;

            Cursor = Cursors.WaitCursor;

            PreviewInvoice((Invoice)fAKTURYDataGridView.SelectedRows[0].DataBoundItem);

            Cursor = Cursors.Default;
        }


        #region Korekta

        private void korektaButton_Click(object sender, EventArgs e)
        {
            if (fAKTURYBindingSource.Current != null)
            {
                Cursor = Cursors.WaitCursor;

                DataRowView row = (DataRowView)fAKTURYBindingSource.Current;
                REKLAMADataSet.FAKTURYRow faktura = (REKLAMADataSet.FAKTURYRow)row.Row;

                if (Convert.ToBoolean(faktura.KOREKTA))
                {
                    MessageBox.Show("Nie można wystawić korekty do korekty");
                    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);

                    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(rEKLAMADataSet.FAKTURY);

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

                        fAKTURYTableAdapter.Update(rEKLAMADataSet.FAKTURY);

                        fakturA_DETAILSTableAdapter.Update(rEKLAMADataSet.FAKTURA_DETAILS);

                        transaction.Commit();
                    }
                    catch (Exception)
                    {
                        transaction.Rollback();
                        conn.Close();
                        throw;
                    }
                }
                finally
                {
                    rEKLAMADataSet.FAKTURA_DETAILS.Clear();
                    fAKTURYBindingSource.ResetBindings(false);
                    fAKTURYDataGridView.Refresh();
                    Cursor = Cursors.Default;
                }
            }
        }


        private REKLAMADataSet.FAKTURYRow UtworzNaglowekKorekty(REKLAMADataSet.FAKTURYRow faktura)
        {
            REKLAMADataSet.FAKTURYRow naglowekKorekty = 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 = FakturaHelper.GetNewCorrectionInvoiceNumber(DateTime.Today.Year, faktura.SystemKsiegowyId);
            naglowekKorekty.NUMER_ROK = DateTime.Today.Year;
            naglowekKorekty.DATA_WYSTAWIENIA = DateTime.Today;

            naglowekKorekty.idZamowienia = faktura.ID_SPRZEDAWCY == (int)FakturaHelper.OfficeId.Poznan ?
                                           (int)FakturaHelper.OrderId.Poznan : (int)FakturaHelper.OrderId.Katowice;

            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;

            rEKLAMADataSet.FAKTURY.AddFAKTURYRow(naglowekKorekty);

            return naglowekKorekty;
        }


        private void UtworzPozycjeFakturyKorekty(REKLAMADataSet.FAKTURYRow naglowekFaktury)
        {
            REKLAMADataSet.FAKTURA_DETAILSDataTable pozycjeFakturDlaKlientow =
                fakturA_DETAILSTableAdapter.GetDataByNrTygodniaRokZKorekta(dtpZmianaDaty.Value.Month,
                                                                           dtpZmianaDaty.Value.Year,
                                                                           nrTygodniaUpDown.Value,
                                                                           naglowekFaktury.ID_SPRZEDAWCY);

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

            if (pozycjeFakturDlaKlientow.Rows.Count == 0 || naglowkiFakturDlaKlientow.Rows.Count == 0)
            {
                //TODO: check is there is anythig to invoice before callind that method
                throw new ApplicationException("Nie ma co fakturować - Poznań | Katowice");
            }

            foreach (REKLAMADataSet.FAKTURA_DETAILSRow pozycjaFaktury in pozycjeFakturDlaKlientow)
            {
                REKLAMADataSet.FAKTURA_DETAILSRow fakturaDetailsRow =
                    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 = FakturaHelper.GetNazwaUslugiPozKat(faktura, pozycjaFaktury);
                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 = (decimal)(1 - pozycjaFaktury.UPUST_PR) * pozycjaFaktury.CENA_JEDN;
                fakturaDetailsRow.NETTO = netto;
                fakturaDetailsRow.S_VAT = VatHelper.PL22;
                fakturaDetailsRow.VAT = (decimal)VatHelper.PL22 * netto;
                fakturaDetailsRow.BRUTTO = (decimal)(1 + VatHelper.PL22) * netto;

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

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

                rEKLAMADataSet.FAKTURA_DETAILS.AddFAKTURA_DETAILSRow(fakturaDetailsRow);
            }
        }


        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(rEKLAMADataSet.FAKTURY);
                fAKTURYTableAdapter.Delete(idKorekty);
                fakturA_DETAILSTableAdapter.Delete(idKorekty);

                transaction.Commit();
            }
            catch
            {
                transaction.Rollback();
                throw;
            }
            finally
            {
                fAKTURYTableAdapter.FillByIdZamowienia(rEKLAMADataSet.FAKTURY, idZam);
                conn.Close();
            }
        }

        #endregion

    }
}