예제 #1
0
        /// <summary>
        /// Metode for imprtering av Elguide transaksjoner fra Program 137
        /// </summary>
        /// <param name="bw">Backgroundworker</param>
        /// <param name="unattended">Vil ikke bruke dialogbokser ved unattended kjøring</param>
        /// <returns>Success or not</returns>
        public bool DoImportTransactions(BackgroundWorker bw, bool unattended)
        {
            if (bw == null)
                throw new ArgumentNullException("Backgroundworker er null!");
            if (csvFilesToImport.Count == 0)
                csvFilesToImport.Add(main.appConfig.csvElguideExportFolder + @"\irank.csv");

            this.returnCode = 0;
            this.importReadErrors = 0;
            //this.importTimerLastValue = DateTime.MinValue;
            //this.importTimerLastValueChanged = DateTime.MinValue;
            csvImport[] csvTransAll = new csvImport[] { };

            main.processing.SetValue = 0;

            try
            {
                // Les inn alle CSV filene til csvTransAll..
                foreach (String file in csvFilesToImport)
                {
                    if (bw.CancellationPending) {
                        this.returnCode = 2;
                        return true;
                    }

                    if (!File.Exists(file))
                    {
                        Log.n("Finner ikke fil " + file, Color.Red);
                        if (unattended) {
                            if (MessageBox.Show("Finner ikke fil " + file + "\n\nKontroller import lokasjon!",
                                "KGSA - Finner ikke fil", MessageBoxButtons.OKCancel, MessageBoxIcon.Error)
                                == System.Windows.Forms.DialogResult.Cancel)
                                continue;
                        }
                        else
                            this.returnCode = 9;
                    }

                    FileInfo f = new FileInfo(file);
                    decimal s1 = f.Length;
                    this.csvSizeGuess = Math.Round(s1 / numberScale, 2);

                    Log.n("Leser CSV fra Elguide '" + file + "'..");
                    var csvTrans = ReadCsv(file, bw, unattended);
                    if (csvTrans == null)
                    {
                        this.returnCode = 9;
                        return false;
                    }

                    int oldLength = csvTransAll.Length;
                    Array.Resize<csvImport>(ref csvTransAll, oldLength + csvTrans.Length);
                    Array.Copy(csvTrans, 0, csvTransAll, oldLength, csvTrans.Length);

                    Log.d("Lest ferdig '" + file + "' - Totalt: " + csvTrans.Length);
                }

                if (bw.CancellationPending) {
                    this.returnCode = 2;
                    return false;
                }

                if (csvTransAll.Length < 25) {
                    Log.n("Import: Ingen eller for få transaksjoner funnet!"
                        + "Kontroller om eksportering er korrekt eller sjekk innstillinger.", Color.Red);
                    {
                        this.returnCode = 4;
                        return false;
                    }
                }

                int csvLengde = csvTransAll.Length;

                Log.n("Prosesserer " + csvLengde.ToString("#,##0") + " transaksjoner..");
                main.processing.SetText = "Prosesserer " + csvLengde.ToString("#,##0") + " transaksjoner..";
                main.processing.SetProgressStyle = ProgressBarStyle.Marquee;

                DateTime dtFirst = DateTime.MaxValue;
                DateTime dtLast = DateTime.MinValue;
                int valider = 0;

                List<string> avd = new List<string>();

                // sjekk for først og siste dato, samt hvilke avdelinger den inneholder
                string csvAvdelinger = "";
                for (int i = 0; i < csvLengde; i++)
                {
                    if (bw.CancellationPending)
                    {
                        this.returnCode = 2;
                        return false;
                    }

                    if (!csvAvdelinger.Contains(csvTransAll[i].Avd))
                        csvAvdelinger += csvTransAll[i].Avd.ToString() + ";";

                    DateTime dtTemp = DateTime.ParseExact(csvTransAll[i].Dato.ToString(), dateFormat, FormMain.norway);

                    //DateTime dtTemp = Convert.ToDateTime(csvTransAll[i].Dato.ToString());
                    if (DateTime.Compare(dtTemp, dtFirst) < 0)
                        dtFirst = dtTemp;

                    if (DateTime.Compare(dtTemp, dtLast) > 0)
                        dtLast = dtTemp;

                    if (valider < 25) {
                        if (csvTransAll[i].Kgm.StartsWith("2") || csvTransAll[i].Kgm.StartsWith("4") || csvTransAll[i].Kgm.StartsWith("5"))
                            valider++;
                    }
                }
                string[] arrayAvdelinger = csvAvdelinger.Split(';');
                Log.d("Avdelinger funnet i fil (funnetAvdelinger): Antall: (" + arrayAvdelinger.Length + ") Innhold: " + csvAvdelinger);

                string sqlRemoveAvd = "";
                if (main.appConfig.importSetting.Equals("FullFavoritt")) // vi skal bare importere favoritt avdelinger
                    foreach (string arrayAvd in arrayAvdelinger)
                        foreach (string avdel in FormMain.Favoritter)
                            if (arrayAvd.Equals(avdel))  // Avdelingen finnes i csv OG som favoritt avdeling..
                                sqlRemoveAvd += " Avdeling = '" + arrayAvd + "' OR "; // legger til avdeling for sletting før import

                if (main.appConfig.importSetting.Equals("Full")) // vi skal importere ALLE avdelinger i CSV, derfor må vi slette alle avdelinger før import
                    foreach (string arrayAvd in arrayAvdelinger)
                        sqlRemoveAvd += " Avdeling = '" + arrayAvd + "' OR "; // legger til avdeling for sletting før import

                if (sqlRemoveAvd.Length > 3) // Fjen sist "OR" fra sql string for å gjøre den gyldig
                    sqlRemoveAvd = sqlRemoveAvd.Remove(sqlRemoveAvd.Length - 3);

                Log.n("Import: CSV inneholder " + csvLengde + " transaksjoner, solgt mellom "
                    + dtFirst.ToString("dddd d. MMMM yyyy", FormMain.norway) + " og "
                    + dtLast.ToString("dddd d. MMMM yyyy", FormMain.norway) + ".", Color.Black, true);

                string strSqlDateFirst = dtFirst.ToString("yyy-MM-dd");
                string strSqlDateLast = dtLast.ToString("yyy-MM-dd");

                if (valider < 25) {
                    Log.n("Import: Bare et begrenset antall transaksjoner var gyldig ("
                        + valider + "), kan ikke fortsett. Eksporter transaksjoner på nytt!", Color.Red);
                    {
                        this.returnCode = 1;
                        return false;
                    }
                }

                bool addPrize = false;
                Dictionary<string, decimal> dictPrizes = new Dictionary<string, decimal>();
                if (main.appConfig.dbObsoleteUpdated != FormMain.rangeMin)
                    addPrize = true;

                var table = new DataTable();
                table.Columns.Add("Selgerkode", typeof(string));
                table.Columns.Add("Varegruppe", typeof(Int16));
                table.Columns.Add("Varekode", typeof(string));
                table.Columns.Add("Dato", typeof(DateTime));
                table.Columns.Add("Antall", typeof(int));
                table.Columns.Add("Btokr", typeof(decimal));
                table.Columns.Add("Avdeling", typeof(Int16));
                table.Columns.Add("Salgspris", typeof(decimal));
                table.Columns.Add("Bilagsnr", typeof(int));
                table.Columns.Add("Mva", typeof(decimal));

                main.processing.SetText = "Prosesserer " + csvLengde.ToString("#,##0") + " transaksjoner.. (Konverterer)";

                for (int i = 0; i < csvLengde; i++)
                {
                    if (bw.CancellationPending)
                    {
                        this.returnCode = 2;
                        return false;
                    }

                    if (ImportThisLine(csvTransAll[i]))
                    {
                        int varegruppe = 0, avdeling = 0, bilagsnr = 0;
                        int.TryParse(csvTransAll[i].Kgm.Substring(0, 3), out varegruppe);
                        int.TryParse(csvTransAll[i].Avd, out avdeling);
                        int.TryParse(csvTransAll[i].BilagsNr, out bilagsnr);

                        DataRow dtRow = table.NewRow();
                        dtRow[0] = csvTransAll[i].Sk; // Selgerkode
                        dtRow[1] = varegruppe; // varegruppe
                        dtRow[2] = csvTransAll[i].Varenummer; // varekode
                        dtRow[3] = csvTransAll[i].Dato;
                        dtRow[4] = csvTransAll[i].Antall;
                        dtRow[5] = csvTransAll[i].Btokr;
                        dtRow[6] = avdeling;
                        dtRow[7] = csvTransAll[i].Salgspris;
                        dtRow[8] = bilagsnr;
                        if (csvTransAll[i].Mva == 0)
                            dtRow[9] = 1;
                        else
                            dtRow[9] = (csvTransAll[i].Mva / 100) + 1;

                        // Lagre salgsprisen..
                        if (addPrize)
                            if (csvTransAll[i].Rab == 0 && csvTransAll[i].Antall > 0
                                && csvTransAll[i].Dato.AddDays(main.appConfig.storeMaxAgePrizes) > main.appConfig.dbObsoleteUpdated)
                                if (!dictPrizes.ContainsKey(csvTransAll[i].Varenummer))
                                    dictPrizes.Add(csvTransAll[i].Varenummer, csvTransAll[i].Salgspris);

                        // sjekk lengde på fields før vi legger dem til..
                        if (dtRow[0].ToString().Length < 11 && dtRow[2].ToString().Length < 25)
                            table.Rows.Add(dtRow);
                        else
                        {
                            importReadErrors++;
                            Log.n("Import: Format feil ved linje " + i
                                + ": Felt var for lange for databasen, hopper over.", Color.Orange);
                            Log.d("Linje: " + dtRow[0] + ";" + dtRow[1] + ";" + dtRow[2] + ";"
                                + dtRow[3] + ";" + dtRow[4] + ";" + dtRow[5] + ";" + dtRow[6] + ";"
                                + dtRow[7] + ";" + dtRow[8] + ";" + dtRow[9]);
                        }
                    }
                }

                if (addPrize && dictPrizes.Count > 0)
                {
                    Log.n("Lager: Oppdaterer vareinfo med priser fra " + dictPrizes.Count + " forskjellige varer..", null, true);
                    UpdatePrizes(dictPrizes);
                    Log.n("Lager: Ferdig med oppdatering av priser", null, true);
                }

                // På ditte tidspunktet kan ikke prosessen avbrytes..
                main.processing.SetText = "Sletter gamle transaksjoner..";
                main.processing.SupportsCancelation = false;

                if (table.Rows.Count >= 25)
                {
                    Log.n("Import: Klar til å lagre transaksjoner. Sletter overlappende transaksjoner nå..");
                    try
                    {
                        // Slett overlappende transaksjoner vi har i databasen fra før..
                        string sqlRemove = "DELETE FROM tblSalg WHERE (Dato >= '" + strSqlDateFirst
                            + "') AND (Dato <= '" + strSqlDateLast + "')";
                        if (!main.appConfig.importSetting.Equals("Normal"))
                            sqlRemove += " AND (" + sqlRemoveAvd + ")";

                        SqlCeCommand command = new SqlCeCommand(sqlRemove, main.connection);
                        var result = command.ExecuteNonQuery();
                        Log.d("Import: Slettet " + result + " transaksjoner fra databasen.");

                    }
                    catch (Exception ex)
                    {
                        Log.Unhandled(ex);
                    }
                }

                Log.n("Import: Lagrer " + table.Rows.Count.ToString("#,##0") + " transaksjoner..");
                main.processing.SetText = "Lagrer " + table.Rows.Count.ToString("#,##0") + " transaksjoner.. (kan ta litt tid)";

                TimeWatch timewatch = new TimeWatch();
                timewatch.Start();
                // Send data til SQL server og avslutt forbindelsen
                main.database.DoBulkCopy(table, "tblSalg");
                Log.n("Import: Lagring av " + table.Rows.Count.ToString("#,##0") + " transaksjoner tok "
                    + timewatch.Stop() + " sekunder.", Color.Black, true);
                main.processing.SupportsCancelation = true;

                // nuller ut database periode fra-til, tvinger oppdatering ved reload senere
                main.appConfig.dbFrom = DateTime.MinValue;
                main.appConfig.dbTo = DateTime.MinValue;

                Log.n("Import: Importering ferdig (Tid: " + timewatch.Stop() + ")");
                main.processing.SetText = "Fullført importering av transaksjoner! Vent litt..";
                main.processing.SetProgressStyle = ProgressBarStyle.Continuous;
                main.processing.SetValue = 90;

                this.importCount = table.Rows.Count;
                this.returnCode = 0;
                return true;
            }
            catch (Exception ex)
            {
                FormError errorMsg = new FormError("Sorry! Kritisk uhåndtert feil oppstod under importering.",
                    ex, "CSV filer: " + String.Join("\n", csvFilesToImport.ToArray()));
                errorMsg.ShowDialog(main);
            }
            this.returnCode = -1;
            return false;
        }
예제 #2
0
 private bool ImportThisLine(csvImport line)
 {
     if (main.appConfig.importSetting.Equals("Full")) // Importer alle transaksjoner uten unntak.
         return true;
     if (main.appConfig.importSetting.Equals("FullFavoritt") && FormMain.Favoritter.Contains(line.Avd)) // Importer bare favoritt avdelinger
         return true;
     if (main.appConfig.importSetting.Equals("Normal") && strGroupImportNormal.Contains(line.Kgm.Substring(0, 3)))
         return true;
     return false;
 }