private Invoices GetInvoice(out string message)
    {
        message = string.Empty;
        InvoicesRepository invoiceRepo = new InvoicesRepository();
        if (!datInvoiceDate.SelectedDate.HasValue)
        {
            message = ResourceManager.GetString("messageInvoiceDateNotNull");
            return null;
        }

        string[] fiscalKey = WebConfig.FiscalDate.Split('/');

        Invoices saveItem = null;
        int firstFutureNumber = int.Parse(WebConfig.FirstNumberFutureInvoice);
        //if (SessionManager.CurrentInvoice != null)
        if (!string.IsNullOrEmpty(Request.QueryString["InvoiceIdPK"]))
        {
            saveItem = SessionManager.CurrentInvoice;
            DateTime fiscalDateMin = new DateTime(saveItem.IdYear, int.Parse(fiscalKey[1]), int.Parse(fiscalKey[0]));
            DateTime fiscalDateMax = new DateTime(saveItem.IdYear + 1, int.Parse(fiscalKey[1]), int.Parse(fiscalKey[0]));
            if (datInvoiceDate.SelectedDate.Value < fiscalDateMin
                || datInvoiceDate.SelectedDate.Value >= fiscalDateMax)
            {
                message = string.Format(ResourceManager.GetString("messageInvoiceDateNotValidFiscalDate"),
                    fiscalDateMin.ToString("dd/MM/yyyy"), fiscalDateMax.ToString("dd/MM/yyyy"));
                return null;
            }
            //if this is a future invoice.
            if (!string.IsNullOrEmpty(Request.QueryString["type"]) && Request.QueryString["type"] == "future")
            {
                //If change the date less than or equal today, we will change this future invoice to normal invoice.
                if (datInvoiceDate.SelectedDate.Value <= DateTime.Today)
                {
                    Invoices lastNormalInvoice = invoiceRepo.GetInvoicesWithMaxNumber(
                        saveItem.IdYear, saveItem.IdTypeInvoice, false, firstFutureNumber);
                    if (lastNormalInvoice != null && lastNormalInvoice.Date.HasValue
                        && lastNormalInvoice.Date.Value > datInvoiceDate.SelectedDate.Value)
                    {
                        message = ResourceManager.GetString("messageInvoiceDateMustHigherthan") + lastNormalInvoice.Date.Value.ToString("dd/MM/yyyy");
                    }
                    else
                    {
                        saveItem.IdFactNumberNew = new InvoicesRepository().GetMaxInvoiceNumber(
                            saveItem.IdYear, saveItem.IdTypeInvoice, false, firstFutureNumber);
                        if (!saveItem.IdFactNumberNew.HasValue)
                        {
                            if (saveItem.IdTypeInvoice == "I")
                                saveItem.IdFactNumberNew = int.Parse(WebConfig.FirstNumberInvoice);
                            else
                                saveItem.IdFactNumberNew = int.Parse(WebConfig.FirstNumberCreditNote);
                        }
                        else
                        {
                            saveItem.IdFactNumberNew = saveItem.IdFactNumberNew.Value + 1;
                        }
                    }
                }
            }
            else
            {
                //If the date is changed.
                if (datInvoiceDate.SelectedDate.Value != saveItem.Date.Value)
                {
                    bool isFuture = saveItem.IdFactNumber >= firstFutureNumber;
                    Invoices nextInvoice = invoiceRepo.GetNextInvoices(saveItem.IdFactNumber,
                        saveItem.IdYear, saveItem.IdTypeInvoice, isFuture, firstFutureNumber);
                    if (nextInvoice != null && nextInvoice.Date.HasValue
                        && nextInvoice.Date.Value < datInvoiceDate.SelectedDate.Value)
                    {
                        message = ResourceManager.GetString("messageInvoiceDateMustHigherthan") + nextInvoice.Date.Value.ToString("dd/MM/yyyy");
                    }

                    Invoices previousInvoice = invoiceRepo.GetPreviousInvoices(saveItem.IdFactNumber,
                        saveItem.IdYear, saveItem.IdTypeInvoice, isFuture, firstFutureNumber);
                    if (previousInvoice != null && previousInvoice.Date.HasValue
                        && previousInvoice.Date.Value > datInvoiceDate.SelectedDate.Value)
                    {
                        message = ResourceManager.GetString("messageInvoiceDateMustLowerthan") + previousInvoice.Date.Value.ToString("dd/MM/yyyy");

                    }
                    //If this is the lasted normal invocie, then change the date to future, we have to change this invoice to future invoice.
                    if (string.IsNullOrEmpty(message))
                    {
                        int? maxNumber = invoiceRepo.GetMaxInvoiceNumber(
                            saveItem.IdYear, saveItem.IdTypeInvoice, false, firstFutureNumber);
                        if (maxNumber.HasValue && maxNumber.Value == saveItem.IdFactNumber
                            && datInvoiceDate.SelectedDate.Value > DateTime.Today)
                        {
                            int? maxNumberFuture = invoiceRepo.GetMaxInvoiceNumber(
                                saveItem.IdYear, saveItem.IdTypeInvoice, true, firstFutureNumber);
                            if (maxNumberFuture.HasValue)
                                saveItem.IdFactNumberNew = maxNumberFuture.Value + 1;
                            else
                                saveItem.IdFactNumberNew = firstFutureNumber;
                        }

                    }
                }
            }
        }
        else
        {
            saveItem = new Invoices();
            int idYear = 0;
            string type = "C";
            int idFactNumber = 0;
            if (radInvoice.Checked)
            {
                type = "I";
                idFactNumber = int.Parse(WebConfig.FirstNumberInvoice);
            }
            else
                idFactNumber = int.Parse(WebConfig.FirstNumberCreditNote);

            DateTime today = DateTime.Today;
            DateTime fiscalDate = new DateTime(DateTime.Today.Year, int.Parse(fiscalKey[1]), int.Parse(fiscalKey[0]));
            //If Current date is lower than FiscalDate in the current civil year:
            //    IdYear=Year(Current Date) – 1
            //Elseif Current date is higher than FiscalDate in the current civil year:
            //    IdYear= Year(Current Date)
            if (today < fiscalDate)
                idYear = today.Year - 1;
            else
                idYear = today.Year;

            int? maxNbr = 1;
            if (datInvoiceDate.SelectedDate.HasValue && datInvoiceDate.SelectedDate.Value > today)
            {
                maxNbr = new InvoicesRepository().GetMaxInvoiceNumber(idYear, type, true, firstFutureNumber);
                idFactNumber = firstFutureNumber;
            }
            else
            {
                maxNbr = new InvoicesRepository().GetMaxInvoiceNumber(idYear, type, false, firstFutureNumber);
            }

            if (maxNbr.HasValue)
                idFactNumber = maxNbr.Value + 1;

            saveItem.IdFactNumber = idFactNumber;
            saveItem.IdYear = idYear;
            saveItem.IdTypeInvoice = type;

            bool isFuture = saveItem.IdFactNumber >= firstFutureNumber;
            Invoices lastNormalInvoice = invoiceRepo.GetInvoicesWithMaxNumber(
                       saveItem.IdYear, saveItem.IdTypeInvoice, isFuture, firstFutureNumber);
            if (lastNormalInvoice != null && lastNormalInvoice.Date.HasValue
                    && lastNormalInvoice.Date.Value > datInvoiceDate.SelectedDate.Value)
            {
                message = ResourceManager.GetString("messageInvoiceDateMustHigherthan") + lastNormalInvoice.Date.Value.ToString("dd/MM/yyyy");
            }
        }

        saveItem.InvoiceIdPK = saveItem.IdFactNumber.ToString() + "-" + saveItem.IdTypeInvoice + "-" + saveItem.IdYear;

        saveItem.RefCustomerNumber = int.Parse(hiddenCompanyAddressId.Value);
        saveItem.Date = datInvoiceDate.SelectedDate;
        saveItem.Currency = WebConfig.Currency;
        if (!string.IsNullOrEmpty(txtTotalVAT.Text))
        {
            saveItem.AmountVatEuro = Convert.ToDouble(txtTotalVAT.Text, Common.GetDoubleFormatProvider());
        }
        else
        {
            saveItem.AmountVatEuro = 0;
        }
        if (!string.IsNullOrEmpty(txtTotalHTVA.Text))
        {
            saveItem.TotalHtvaEuro = Convert.ToDouble(txtTotalHTVA.Text, Common.GetDoubleFormatProvider());
        }
        else
        {
            saveItem.TotalHtvaEuro = 0;
        }
        saveItem.Remark = txtRemark.Text;
        saveItem.Remark_Internal = txtInternalRemark.Text;
        saveItem.Payement = chkPayment.Checked;
        saveItem.Factoring = chkFactoring.Checked;
        if (!string.IsNullOrEmpty(txtPaymentDate.Text))
            saveItem.DateOfPayement = DateTime.ParseExact(txtPaymentDate.Text, "dd/MM/yyyy",
                    System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat);
        return saveItem;
    }