예제 #1
0
        internal void Maak_Lijst(DateTime pStartDatum, DateTime pEindDatum, List <PoortViewMandagen> selxMANDAGEN, List <allArbeidsRelaty> _AllArbeidsrelaties, List <PoortViewRegistratiebevoegd> _AllProjectleiders, List <PoortViewProject> _AllProjecten, List <PoortViewBedrijf> _AllBedrijven, List <PoortViewVakman> _AllVakmannen, EvoTools.HeaderFooter LijstGegevens)
        {
            // Start met allereerste pagina
            htmlBody = string.Empty;
            records  = string.Empty;

            //
            // Deel periode in x-aantal weken in
            //

            // Week van Startdatum begin op maandag
            List <DateTime> WeekStart = new List <DateTime>();
            List <DateTime> WeekEinde = new List <DateTime>();

            // Trek DayofWeek van startdatum af om de maandag van die week te bepalen
            // Let op: Pak de HELE periode, niet slechts de keuze in de UI (Met showall wordt de periode automatisch uitgebreid!)
            DateTime pAllMinDatum = selxMANDAGEN.Select(x => x.Begintijd).Min();
            DateTime pAllMaxDatum = selxMANDAGEN.Select(x => x.Begintijd).Max();

            // Bepaal de maandag van de startweek
            DateTime Maandag = pAllMinDatum;

            while (Maandag.DayOfWeek != DayOfWeek.Monday)
            {
                Maandag = Maandag.AddDays(-1);
            }
            //DateTime PeriodeStart = Maandag;
            do
            {
                WeekStart.Add(Maandag);
                Maandag = Maandag.AddDays(7);
                WeekEinde.Add(Maandag);
            } while (Maandag <= pAllMaxDatum);// pEindDatum);
            //DateTime PeriodeEinde = Maandag;

            // Weekstart en einde kunnen nooit vóór of na totaalplaatje liggen!
            // Let daar op, want misschien is niet een gehele week geselecteerd, dan kan dit voorkomen. Pas periode's dan aan!
            //if (WeekStart[0] < pStartDatum)
            //    WeekStart[0] = pStartDatum;
            //if (WeekEinde[WeekEinde.Count - 1] > pEindDatum)
            //    WeekEinde[WeekEinde.Count - 1] = pEindDatum.AddDays(1);

            // Eerst even Totaal alle vakmannen
            double UrenT      = 0;
            double UrenV      = 0;
            int    Vakmannen  = 0;
            int    VakmannenT = 0;

            string[] RegelVars = new string[] { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" };

            // Bereken voor elke dienstbetrekking het totaal (per dag!!!)
            htmlBody = htmlcontainer;
            DayOfWeek DagvdWeek = new DayOfWeek();
            DateTime  EenWillekeurigeMaandag = new DateTime(2013, 10, 21).Date;

            for (int Weekdag = 0; Weekdag <= 6; Weekdag++)
            {
                //int DagvdWeek = Weekdag == 0 ? 7 : Weekdag; // Dagvdweek begint nu van 7 (maandag), dan
                DagvdWeek = EenWillekeurigeMaandag.AddDays(Weekdag).DayOfWeek; // Zo starten we dus bij Maandag en gaan door tot Zondag
                allArbeidsRelaty Allen = new allArbeidsRelaty();
                Allen.ArbeidsRelatieID   = 0;
                Allen.ArbeidsRelatieNaam = "Select ALL";
                Allen.SorteerVolgorde    = -1;
                _AllArbeidsrelaties.Add(Allen);
                //for (int c = -1; c <= 7; c = c + 2)
                foreach (var Arbeidsrelatie in _AllArbeidsrelaties)
                {
                    // Uren
                    UrenV = selxMANDAGEN.Where(x =>
                                               (x.ArbeidsrelatieVW == Arbeidsrelatie.ArbeidsRelatieID || Arbeidsrelatie.ArbeidsRelatieID == -1) &&
                                               x.Begintijd.DayOfWeek == DagvdWeek
                                               ).Sum(x => x.Uren) * 60;
                    UrenV += selxMANDAGEN.Where(x =>
                                                (x.ArbeidsrelatieVW == Arbeidsrelatie.ArbeidsRelatieID || Arbeidsrelatie.ArbeidsRelatieID == -1) &&
                                                x.Begintijd.DayOfWeek == DagvdWeek
                                                ).Sum(x => x.Minuten);
                    UrenV /= 60.0;
                    // Plaats ureen in HTML voorblad
                    htmlBody = htmlBody.Replace("{" + Weekdag.ToString() + "u" + Arbeidsrelatie.ArbeidsRelatieID.ToString() + "}"
                                                , (UrenV == 0) ? "" : UrenV.ToString());

                    // Dagen
                    Vakmannen = selxMANDAGEN.Where(x =>
                                                   (x.ArbeidsrelatieVW == Arbeidsrelatie.ArbeidsRelatieID || Arbeidsrelatie.ArbeidsRelatieID == -1) &&
                                                   x.Begintijd.DayOfWeek == DagvdWeek
                                                   )
                                // Pak liever versch. vakmannen per dag ipv versch aantal vakmnnen
                                //.Select(x => x.Mandag.VakmanId).Distinct().Count();
                                .Select(x => new { x.VakmanId, x.Begintijd.Date }).Distinct().Count();
                    //if (Arbeidsrelatie.ArbeidsRelatieID == -1)
                    //    RegelVars[Arbeidsrelatie.ArbeidsRelatieID + 2] = (Vakmannen == 0) ? "nvt" : Vakmannen.ToString();
                    //else
                    // Plaats vakmandagen in HTML voorblad
                    htmlBody = htmlBody.Replace("{" + Weekdag.ToString() + "d" + Arbeidsrelatie.ArbeidsRelatieID.ToString() + "}"
                                                , (UrenV == 0) ? "" : Vakmannen.ToString());

                    // 'Halve vakmannen (vakmannen die op dezelfde dag op meerdere projecten zaten
                    // ??? hoeft hier volegsn mij geen rekening mee gehouden te worden; in het totaalplaatje zit dat al 'verrekend'
                }
            }

            // Zeker weten dat alle mogelijke {xxx} variabelen verwijderd zijn uit voorblad:
            for (int d = 0; d <= 6; d++)
            {
                for (int i = 0; i <= 4; i++)
                {
                    htmlBody = htmlBody.Replace("{" + d.ToString() + "d" + i.ToString() + "}", "");
                    htmlBody = htmlBody.Replace("{" + d.ToString() + "u" + i.ToString() + "}", "");
                }
            }



            // Periode
            htmlBody = htmlBody.Replace("[%periode%]",
                                        string.Format("{0:dd-MM-yyyy} t/m {1:dd-MM-yyyy}", pStartDatum, pEindDatum)); // Periode

            /*
             * Okay we hebben het totaal van alles, fijn.
             * nu dan per week:
             * (Week-tabblad maken op nieuw pagina met totalen)
             *  per Project
             *  (Project-tabblad maken op nieuwe pagina)
             *      Per Vakman
             *          Per dag van de week
             *          Gewerkte uren van deze valkman
             *      (Regel met alle uren van de week toevoegen aan tabel)
             * */


            // Bepaal voor elke week de totalen
            string Tabellen = string.Empty;

            for (int i = 0; i < WeekStart.Count(); i++)
            {
                DateTime _StartTijd = WeekStart[i];
                DateTime _EindeTijd = WeekEinde[i];

                UrenV = 0;
                UrenT = 0;

                Array.Clear(RegelVars, 0, 15);

                var ProjectIDsDezeWeek = selxMANDAGEN.Where(x =>
                                                            x.Begintijd >= _StartTijd &&
                                                            x.Begintijd < _EindeTijd)
                                         .OrderBy(x => x.project_NR)
                                         .Select(x => x.project_NR)
                                         .Distinct().ToList();
                // Per project
                foreach (var DitProject in  _AllProjecten.Where(y => ProjectIDsDezeWeek.Contains(y.ProjectNR)))
                {
                    // Start tabel
                    records = string.Empty;
                    var UitvoerdersIDsOpDitPorject = selxMANDAGEN.Where(x =>
                                                                        x.project_NR == DitProject.ProjectNR)
                                                     .Select(x => x.ProjectleiderId).Distinct().ToList();
                    var UitvoerdersOpDitPorject = selxMANDAGEN.Where(x =>
                                                                     x.ProjectId == DitProject.ProjectNR)
                                                  .Select(x => x.ProjectleiderId).Distinct().ToList();
                    string Uitvoerders = string.Empty;
                    foreach (var uitv in _AllProjectleiders.Where(x => UitvoerdersIDsOpDitPorject.Contains(x.ProjectleiderId ?? -1)))
                    {
                        Uitvoerders += (Uitvoerders == string.Empty ? "" : " / ");
                        Uitvoerders += uitv.Gebruikersnaam;
                    }


                    string NieuwProjectTabel = ET.ReplStr(htmltabel, new string[] {
                        DitProject.ProjectNR.ToString(),
                        (from og in _AllBedrijven
                         where og.bedrijf_nr == DitProject.BedrijfVW
                         select og.naam).FirstOrDefault() ?? "<Onbekend>",
                        DitProject.Naam,
                        DitProject.plaats,
                        DitProject.bouw_straat,
                        Uitvoerders,
                        CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(_StartTijd, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday).ToString(),
                        _StartTijd.ToShortDateString() + " t/m " + _EindeTijd.AddDays(-1).ToShortDateString()
                    }, 8);

                    //Per Vakman
                    //foreach (var DezeVakman in selxMANDAGEN.Where(x =>
                    //    x.Begintijd >= _StartTijd &&
                    //    x.Begintijd < _EindeTijd &&
                    //    x.ProjectId == DitProject.ProjectId)
                    //    .OrderBy(x => x.ArbeidsrelatieVW) //.ThenBy(x => x.VolledigeNaam)
                    //    .Select(x => new { x.VakmanId, x.ArbeidsrelatieVW}).Distinct().ToList())
                    foreach (var DezeVakman in selxMANDAGEN.Where(x =>
                                                                  x.Begintijd >= _StartTijd &&
                                                                  x.Begintijd < _EindeTijd &&
                                                                  x.ProjectId == DitProject.ProjectId)
                             .Select(x => new { x.VakmanId, x.ArbeidsrelatieVW,
                                                _Vakman = _AllVakmannen.Where(y => y.VakmanId == x.VakmanId).FirstOrDefault() }).Distinct().ToList()
                             .OrderBy(x => x.ArbeidsrelatieVW).ThenBy(x => x._Vakman.Naam)) //.ThenBy(x => x.VolledigeNaam)
                    {
                        Array.Clear(RegelVars, 0, 17);
                        string Arbeidsrelatie = _AllArbeidsrelaties.Where(x => x.ArbeidsRelatieID == DezeVakman.ArbeidsrelatieVW).Select(x => x.ArbeidsRelatieNaam).FirstOrDefault();
                        //PoortViewVakman _Vakman = _AllVakmannen.Where(x => x.VakmanId == DezeVakman.VakmanId).FirstOrDefault();
                        RegelVars[0] = Arbeidsrelatie + // Moet zijn: Werkelijke waarde
                                       (Arbeidsrelatie.ToLower() == "intern" ?
                                        " " + DezeVakman.VakmanId.ToString() : "");

                        RegelVars[1] = DezeVakman._Vakman.Bsn;// _Vakman.Bsn;

                        RegelVars[2] = DezeVakman._Vakman.Naam;

                        // Regelvar[3] geeft uren van Maandag... ect tm regelvar[9] (zondag)
                        // Bepaal startpositie afhankelijk van de dag (if maandag, then startpositie = 3)
                        int regelDagvdWeekPositie = 2 + (
                            ((int)_StartTijd.DayOfWeek == 0) ? 7 : (int)_StartTijd.DayOfWeek // .Dayofweek loopt van 0 (zonadg) tot Zaterdag (6)
                            );
                        // MSZ: 2014-1-22 Hey dit is fout, het moet < zijn en niet <=
                        //for (DateTime dag = _StartTijd.Date; dag <= _EindeTijd; dag = dag.AddDays(1))
                        for (DateTime dag = _StartTijd.Date; dag < _EindeTijd; dag = dag.AddDays(1))
                        {
                            string project = DitProject.Naam;
                            UrenV = selxMANDAGEN.Where(x =>
                                                       x.Begintijd >= dag &&
                                                       x.Begintijd < dag.AddDays(1) &&
                                                       x.Begintijd.Date == dag &&
                                                       x.ProjectId == DitProject.ProjectId &&
                                                       x.VakmanId == DezeVakman.VakmanId)
                                    .Select(x => x.Uren * 60 + x.Minuten).Sum() / 60.0;
                            //UrenV += selxMANDAGEN.Where(x =>
                            //    x.Mandag.Begintijd >= dag &&
                            //    x.Mandag.Begintijd < dag.AddDays(1) &&
                            //    x.Mandag.Begintijd.Date == dag &&
                            //    x.Mandag.ProjectId == DitProject.Project.MandagenReg.ProjectId &&
                            //    x.Mandag.VakmanId == DezeVakman.Vakman.MandagenReg.VakmanId)
                            //    .Select(x => x.Mandag.Minuten).Sum();
                            //UrenV /= 60.0;

                            RegelVars[regelDagvdWeekPositie++] = (UrenV == 0) ? "" : UrenV.ToString();
                        } // Next Dag van de Week

                        // Voeg nieuwe tabel-regel toe
                        records += ET.ReplStr(htmltabelrow, RegelVars, 17);
                    } // Next Vakman

                    NieuwProjectTabel = NieuwProjectTabel.Replace("[%Regels%]", records);
                    Tabellen         += NieuwProjectTabel;
                } // Next Project
            }     // Next Week

            // Eddy Ready Go.
            // We hebben nu feitelijk alle regels gevuld, laten we de HTMl pagina opmaken!


            // NIEUWE METHODE:
            string HtmLtOTAAL = htmlBody.Replace("[%Overzicht%]", Tabellen);

            ET.MakePdf(HtmLtOTAAL, LijstGegevens, true);
            return;


            //
            // Open Evo gebeuren
            //

            PdfConverter pdfConverter = new PdfConverter();

            pdfConverter.LicenseKey = "B4mYiJubiJiInIaYiJuZhpmahpGRkZE=";
            pdfConverter.LicenseKey = "EpyMnY6OnYyPjJ2Jk42djoyTjI+ThISEhA==";

            // Linker en rechter-marge instellen want het document was net te breed
            pdfConverter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Landscape;
            pdfConverter.PdfDocumentOptions.LeftMargin         = 10;
            pdfConverter.PdfDocumentOptions.RightMargin        = 10;
            pdfConverter.PdfDocumentOptions.TopMargin          = 10;
            pdfConverter.PdfDocumentOptions.BottomMargin       = 10;
            pdfConverter.PdfDocumentOptions.FitWidth           = true; // Default
            pdfConverter.PdfDocumentOptions.AutoSizePdfPage    = true; //Default

            ET.AddHeaderElements(pdfConverter);


            // HTML Totaalplaatje genereren
            //string fullHtml = htmlcontainer.Replace("[%Overzicht%]", htmlBody);
            string fullHtml = htmlBody.Replace("[%Overzicht%]", Tabellen);
            // HTML: PDF creeren
            string outFilePath = System.IO.Path.Combine(xHtmlFolder, "ConvertHtmlString-" + "-" + DateTime.Now.Month + "-" + DateTime.Now.Day + "-" + DateTime.Now.Hour + "-" + DateTime.Now.Minute + "-" + DateTime.Now.Second + "-" + DateTime.Now.Millisecond + ".pdf");

            pdfConverter.SavePdfFromHtmlStringToFile(fullHtml, outFilePath);

            System.Diagnostics.Process.Start(outFilePath);
        }
        internal void Maak_Lijst(DateTime pStartDatum, DateTime pEindDatum, List <PoortViewMandagen> selxMANDAGEN, List <allArbeidsRelaty> _AllArbeidsrelaties, List <PoortViewRegistratiebevoegd> _AllProjectleiders, List <PoortViewProject> _AllProjecten, List <PoortViewBedrijf> _AllBedrijven, List <PoortViewVakman> _AllVakmannen, EvoTools.HeaderFooter LijstGegevens, bool _PlusInfo)
        {
            string tabellen     = string.Empty;
            string tabellenPlus = string.Empty;
            // Bepaal start-maandag
            // Let op: Pak de HELE periode, niet slechts de keuze in de UI (Met showall wordt de periode automatisch uitgebreid!)
            DateTime pAllMinDatum = selxMANDAGEN.Select(x => x.Begintijd.Date).Min(); if (pStartDatum < pAllMinDatum)
            {
                pAllMinDatum = pStartDatum;
            }
            DateTime pAllMaxDatum = selxMANDAGEN.Select(x => x.Begintijd.Date).Max(); if (pEindDatum > pAllMaxDatum)
            {
                pAllMaxDatum = pEindDatum;
            }

            // Bepaal de maandag van de startweek
            //DateTime Maandag = pAllMinDatum;
            // We willen gewoon alle weken zien, ook de weken voorafgaande aan de eerste week met echte data dus pak pStartdatum
            DateTime Maandag = pAllMinDatum;

            while (Maandag.DayOfWeek != DayOfWeek.Monday)
            {
                Maandag = Maandag.AddDays(-1);
            }

            /*
             * Verzamel nu per project, per week de nodige data
             * */

            // Per Project
            string tabel     = string.Empty;
            string tabelPlus = string.Empty;

            records = string.Empty;
            var ProjectIDs = selxMANDAGEN
                             .OrderBy(x => x.project_NR)
                             .Select(x => x.project_NR)
                             .Distinct().ToList();
            bool FirstPage = true;

            foreach (var DitProject in _AllProjecten.Where(y => ProjectIDs.Contains(y.ProjectNR)))
            {
                try
                {
                    // Bepaal weken voor dit project
                    Bepaal_Projectweken(DitProject.ProjectId, Maandag, selxMANDAGEN, pAllMaxDatum);

                    // Bereken nu alvast totaal aantal detailregels voor dit project
                    DetailregelsLeft = selxMANDAGEN.Where(x =>
                                                          x.ProjectId == DitProject.ProjectId)
                                       .Select(x => new { VK = x.VakmanId, Week = ET.weeknummerNEW(x.Begintijd, false) }).Distinct().ToList().Count();

                    // Algemene Projectgegevens (Nieuwe tabel)
                    tabel     = TabelProject;
                    tabelPlus = TabelVakman; VakmanNr = 0;
                    if (FirstPage)
                    {
                        tabel     = tabel.Replace("TableOnNewPage", "TableOnSamePage");
                        FirstPage = false;
                    }
                    tabel = tabel.Replace("{Rapportnaam}", LijstGegevens.LijstNaam);
                    tabel = tabel.Replace("{Bestandscode}", LijstGegevens.LijstCode);
                    string WeekS = ET.weeknummerNEW(pAllMinDatum, true);
                    string WeekE = ET.weeknummerNEW(pAllMaxDatum, true);
                    tabel = tabel.Replace("{Week}", WeekS + (WeekS == WeekE ? "" : " tot en met " + WeekE));
                    tabel = tabel.Replace("{Periode}", string.Format("{0} - {1}", pAllMinDatum.ToLongDateString(), pAllMaxDatum.ToLongDateString()));
                    tabel = tabel.Replace("{Projectnummer}", DitProject.ProjectNR.ToString());
                    string __Opdrachtgever = (from og in _AllBedrijven
                                              where og.bedrijf_nr == DitProject.BedrijfVW
                                              select og.naam).FirstOrDefault() ?? "{Onbekend}";
                    // Opdrachtger / Aannemer (aannemer = 'Select AannwmerVW, anders gelijk aan opdrachtgever)
                    tabel = tabel.Replace("{Opdrachtgever}", __Opdrachtgever);
                    if (DitProject.AannemerVW == DitProject.BedrijfVW || DitProject.AannemerVW == null)
                    {
                        tabel = tabel.Replace("{Aannemer}", __Opdrachtgever);
                    }
                    else
                    {
                        tabel = tabel.Replace("{Aannemer}", (from og in _AllBedrijven
                                                             where og.bedrijf_nr == DitProject.AannemerVW
                                                             select og.naam).FirstOrDefault() ?? "{Onbekend}");
                    }
                    tabel = tabel.Replace("{Onderaannemer}", "Tegelzettersbedrijf J.H.J Zeebregts BV"); // Voorlopig gewoon altijd 'Zeebregts', tzt nemen we dit in de database op en wordt et variabel

                    tabel = tabel.Replace("{Projectnaam}", DitProject.Naam);
                    tabel = tabel.Replace("{Projectlocatie}", DitProject.plaats);
                    tabel = tabel.Replace("{Projectstraat}", DitProject.bouw_straat);

                    // Voeg handtekening toe (Als ie niet bestaat vervang 'm dan door standaard vakman 0-handtekening
                    string pathhandtekeningPL = ("0000000000" + DitProject.ProjectleiderId.ToString());
                    pathhandtekeningPL = pathhandtekeningPL.Substring(pathhandtekeningPL.Length - 6);
                    pathhandtekeningPL = pathhandtekening.Replace("000000", pathhandtekeningPL).Replace("handtekening0", "handtekening" + DitProject.ProjectleiderId.ToString());

                    // Het checken van het handtekeningenbestand blijft steeds hangen en  levert niks op.
                    // Laat maar zitten dus die check, ik plaats wel voor alle mogelijk vakmannen standaard een leeg handtekeningenbestand

                    //System.Net.HttpWebRequest request = null;
                    //System.Net.HttpWebResponse response = null;
                    //request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(pathhandtekeningPL);
                    //request.Timeout = 30000;
                    //try
                    //{
                    //    response = (System.Net.HttpWebResponse)request.GetResponse();
                    tabel = tabel.Replace("{handtekening}", pathhandtekeningPL);
                    //}
                    //catch
                    //{
                    //    tabel = tabel.Replace("{handtekening}", pathhandtekening);
                    //}

                    var ss = _AllProjectleiders.Where(x => x.ProjectleiderId == DitProject.ProjectleiderId).Select(x => x.Gebruikersnaam).FirstOrDefault();
                    tabel = tabel.Replace("{ondertekenaar}", ss);
                    tabel = tabel.Replace("{datum}", DateTime.Now.Date.ToString("d-M-yyyy"));

                    var UitvoerdersIDsOpDitPorject = selxMANDAGEN.Where(x =>
                                                                        x.project_NR == DitProject.ProjectNR)
                                                     .Select(x => x.ProjectleiderId).Distinct().ToList();
                    var UitvoerdersOpDitPorject = selxMANDAGEN.Where(x =>
                                                                     x.ProjectId == DitProject.ProjectNR)
                                                  .Select(x => x.ProjectleiderId).Distinct().ToList();
                    string Uitvoerders = string.Empty;
                    foreach (var uitv in _AllProjectleiders.Where(x => UitvoerdersIDsOpDitPorject.Contains(x.ProjectleiderId ?? -1)))
                    {
                        Uitvoerders += (Uitvoerders == string.Empty ? "" : " / ");
                        Uitvoerders += uitv.Gebruikersnaam;
                    }
                    //tabel = tabel.Replace("{Projectleider}", Uitvoerders);
                    var Opdrachtgever = _AllBedrijven.Where(x => x.bedrijf_nr == DitProject.BedrijfVW).FirstOrDefault();
                    tabel = tabel.Replace("{Opdrachtgever}", Opdrachtgever.naam);;


                    // ProjectTotaal hele periode (en gedetailleerd per vakman)
                    records       = string.Empty;
                    recordsVakman = string.Empty;

                    if (_PlusInfo)
                    {
                        BTotaal = 0;
                        GTotaal = 0;
                        foreach (var DezeVakman in selxMANDAGEN.Where(x =>
                                                                      x.ProjectId == DitProject.ProjectId)
                                 .Select(x => new
                                         // Let op:
                                         // Neem Arbeidsrelatie mee in de distinct zodat vakman als aparte vakman wordt gezien
                                         // indien wijziging van arbeidsrelatie gedurende deze periode
                        {
                            x.VakmanId,
                            _Vakman = _AllVakmannen.Where(y => y.VakmanId == x.VakmanId).FirstOrDefault(),
                            _Relatie = x.ArbeidsrelatieVW,
                            _RelatieNaam = (x.KetenpartnerVW == 1 ? _AllArbeidsrelaties.Where(z => z.ArbeidsRelatieID == x.ArbeidsrelatieVW).Select(z => z.ArbeidsRelatieNaam).FirstOrDefault() : "Extern")
                        }).Distinct().ToList()
                                 .OrderBy(x => x._Vakman.Naam))
                        {
                            int VakmanFouten = VakmannenWithNoBedrijf.Length + VakmannenWithNoBsn.Length + VakmannenWithNoGeboortedatum.Length + VakmannenWithNoID.Length + VakmannenWithVerlopenID.Length;
                            recordsVakman += Vul_VakmanRegel(DezeVakman._RelatieNaam, DezeVakman._Vakman, DezeVakman._Relatie, _AllBedrijven, selxMANDAGEN.Where(x => x.ProjectId == DitProject.ProjectId && x.VakmanId == DezeVakman.VakmanId).ToList());
                            // Als een gegeven van een vakman niet bekend was is die bij vul_vakmanRegel() toegevoegd aan "VakmannenWithNo...,
                            // dus dan is de totale lengte van dat alles groter dan daarvoor
                            if (VakmanFouten < VakmannenWithNoBedrijf.Length + VakmannenWithNoBsn.Length + VakmannenWithNoGeboortedatum.Length + VakmannenWithNoID.Length + VakmannenWithVerlopenID.Length &&
                                !ProjectenWithVakmanNulls.Contains(DitProject.Naam))
                            {
                                ProjectenWithVakmanNulls += (ProjectenWithVakmanNulls.Length > 1 ? ", " : "") + DitProject.Naam + " (" + DitProject.ProjectNR + ")";
                            }
                        }
                        tabel = VerwijderLabel(tabel, "vakmanregel");
                        tabel = tabel.Replace("<!-- /VAKMANREGEL -->", recordsVakman);
                        tabel = tabel.Replace("{T}", Uurformaat(BTotaal, true));
                        tabel = tabel.Replace("{G}", Uurformaat(GTotaal, true));
                    }
                    else
                    {
                        tabel = VerwijderLabel(tabel, "VakmanTabel");
                        tabel = VerwijderLabel(tabel, "Verklaring");
                    }


                    // NIEUW voer totaalperiode-overzicht alleen uit als de periode meer dan twee weken beslaat.
                    // Anders heeft totaaltelling zo weing nut!

                    DateTime mindag = selxMANDAGEN.Where(x => x.ProjectId == DitProject.ProjectId).Select(x => x.Begintijd).Min();
                    DateTime maxdag = selxMANDAGEN.Where(x => x.ProjectId == DitProject.ProjectId).Select(x => x.Begintijd).Max();
                    if (ET.weeknummerNEW(mindag, true) != ET.weeknummerNEW(maxdag, true))
                    {
                        records += vul_TotaalRegel(selxMANDAGEN, DitProject);
                        // En nu uitgesplitst per vakman
                        foreach (var DezeVakman in selxMANDAGEN.Where(x =>
                                                                      x.ProjectId == DitProject.ProjectId)
                                 .Select(x => new
                        {
                            x.VakmanId,
                            _Vakman = _AllVakmannen.Where(y => y.VakmanId == x.VakmanId).FirstOrDefault(),
                        }).Distinct().ToList()
                                 .OrderBy(x => x._Vakman.Naam))
                        {
                            records += Vul_DetailRegel(selxMANDAGEN, DitProject, DezeVakman._Vakman, ref tabel);
                        }
                        tabel = tabel.Replace("{T}", Uurformaat(BTotaal + GTotaal));
                        //tabel = tabel.Replace("{B}", Uurformaat(BTotaal));
                        if (GTotaal == 0)
                        {
                            tabel = tabel.Replace("{G}", "0:00");
                        }
                        else
                        {
                            tabel = tabel.Replace("{G}", Uurformaat(GTotaal));
                        }
                    }


                    // ProjectTotaal per week (en detailregels uitgesplitst per Vakman)
                    for (int i = 0; i < WeekStart.Count(); i++)
                    {
                        DateTime _StartTijd = WeekStart[i]; DateTime _EindeTijd = WeekEinde[i];
                        records += Vul_TotaalRegel(selxMANDAGEN, DitProject, _StartTijd, _EindeTijd);

                        // En nu uitgesplitst per vakman
                        foreach (var DezeVakman in selxMANDAGEN.Where(x =>
                                                                      x.Begintijd >= _StartTijd &&
                                                                      x.Begintijd < _EindeTijd &&
                                                                      x.ProjectId == DitProject.ProjectId)
                                 .Select(x => new
                        {
                            x.VakmanId,
                            _Vakman = _AllVakmannen.Where(y => y.VakmanId == x.VakmanId).FirstOrDefault(),
                        }).Distinct().ToList()
                                 .OrderBy(x => x._Vakman.Naam))
                        {
                            records += Vul_DetailRegel(selxMANDAGEN, DitProject, DezeVakman._Vakman, _StartTijd, _EindeTijd, ref tabel);
                        }
                    } // Week
                    tabel     = tabel.Replace("<!-- /TABELREGELS -->", records);
                    tabellen += tabel;
                } // Project
                catch (Exception e)
                {
                    string foutmelding = string.Format("Fout geconstateerd! Programma was bezig met verwerken van project={0}. Foutmelding:{1}", DitProject.Naam, e);
                    MessageBox.Show(foutmelding);
                    return;
                }
            }


            // Geef eerste een melding als er vakmangegevens ontbraken
            string melding = string.Empty;

            if (VakmannenWithNoBedrijf.Length > 1)
            {
                melding += "\nBedrijfsnaam van " + VakmannenWithNoBedrijf + " niet bekend";
            }
            if (VakmannenWithNoBsn.Length > 1)
            {
                melding += "\nBsn nr van " + VakmannenWithNoBsn + " niet bekend";
            }
            if (VakmannenWithNoGeboortedatum.Length > 1)
            {
                melding += "\nGeboortedatum " + VakmannenWithNoGeboortedatum + " niet bekend";
            }
            if (VakmannenWithNoID.Length > 1)
            {
                melding += "\nPaspoort nr van " + VakmannenWithNoID + " niet bekend of niet volledig";
            }
            if (VakmannenWithVerlopenID.Length > 1)
            {
                melding += string.Format("\nGeldigheidsdatum identiteitsbewijs is verlopen van {0}", VakmannenWithVerlopenID);
            }
            if (melding.Length > 1)
            {
                MessageBox.Show("Sommige vakmangegevens zijn niet bekend: \n\n" + melding + "\n\n Zie project(en): " + ProjectenWithVakmanNulls);
            }

            // Maak PDF aan volgens NIEUWE METHODE
            string test = HTMLTotaal.Replace("<!-- /PROJECTTABEL -->", tabellen);

            ET.Log(test);
            ET.MakePdf(test, LijstGegevens, htmlfooter, false, 0);
        }
        internal void Maak_Lijst(DateTime pStartDatum, DateTime pEindDatum, List <PoortViewMandagen> selxMANDAGEN, List <PoortViewVakman> Vakmannen, List <allContract> Contracten, List <string> _opties, DateTime UI_Startdatum, DateTime UI_Einddatum, EvoTools.HeaderFooter LijstGegevens)
        {
            // Start en Einddata van projecten
            var _VanTotDatums =
                selxMANDAGEN.Select(x => new { x.VakmanId, Datum = x.Begintijd }).Distinct();

            //
            // Deel periode in x-aantal weken in
            //

            // Week van Startdatum begin op maandag
            List <DateTime> WeekStart = new List <DateTime>();
            List <DateTime> WeekEinde = new List <DateTime>();
            // Trek DayofWeek van startdatum af om de maandag van die week te bepalen
            DateTime Maandag      = pStartDatum.AddDays((1 - ((int)pStartDatum.DayOfWeek == 0 ? 7 : (int)pStartDatum.DayOfWeek)));
            DateTime PeriodeStart = Maandag;
            int      StartWeekNr  = new GregorianCalendar(GregorianCalendarTypes.Localized).GetWeekOfYear(PeriodeStart, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);

            do
            {
                if (Maandag < pStartDatum)
                {
                    WeekStart.Add(pStartDatum);
                }
                else
                {
                    WeekStart.Add(Maandag);
                }

                Maandag = Maandag.AddDays(7);

                if (Maandag > pEindDatum)
                {
                    WeekEinde.Add(pEindDatum.AddDays(1));
                }
                else
                {
                    WeekEinde.Add(Maandag);
                }
            } while (Maandag <= pEindDatum);
            DateTime PeriodeEinde = Maandag;

            double DagenT, UrenT;
            double DagenD = 0;
            double UrenD  = 0;

            // Bepaal aantal bij elkaar te houden regels
            int RowSpan = ET.GetRowSpan(htmlTabelTotaalRegel);
            int Rows;

            // ****************************************************************************************************
            //
            // Start opbouwen van de totaalregels
            // Per 'DO'
            //  Bereken het totaal van de betreffende periode;
            //  Berken per Vakman het totaal van de betreffende periode
            //
            // We beginnen met Totaalperiode van periodestart tot periodeeind
            // vlak voor de 'WHILE' starten we met de 1e weekperiode te selecteren, daarna alle andere weekperiodes
            //
            // ****************************************************************************************************

            // Startsetting zodat we de gehele periode pakken
            DateTime SelectieStart     = PeriodeStart;
            DateTime SelectieEinde     = PeriodeEinde;
            string   regelSamenvatting = "Totaal";
            // WeekIndex gebruiken we pas nadat de 1e lus is doorlopen
            int WeekIndex = 0; string mindag = "", maxdag = ""; bool DIKKESTREEP = false;


            do // Start met totaal-periode; Neem daarna alle weekperiodes
            {
                UrenT = 0; DagenT = 0; mindag = ""; maxdag = "";
                string TotaalRegel = htmlTabelTotaalRegel;
                // Voeg extra dikke lijn toe na tonen van totaalgegevens (Alleen eerste keer!)
                if (DIKKESTREEP)
                {
                    TotaalRegel = TotaalRegel.Replace("<!--LINE-->", "<tr><td colspan=\"14\" style=\"width:100%; border-bottom:1px solid black\"></td></tr>");
                    DIKKESTREEP = false;
                }


                // Bereken voor alle 3 mogelijkheden het totaal over deze periode
                foreach (int prod in new List <int> {
                    1, 2
                })                                           // 1 = Intern, 2 = Extern
                {
                    foreach (int contr in new List <int> {
                        1, 2
                    })                                            //1 = Per uur, 2 = Per meter
                    {
                        if (prod == 1 && contr == 2)
                        {
                            break;                          // Intern, Per meter doet niet mee
                        }
                        UrenD = (selxMANDAGEN.Where(x => x.Begintijd >= SelectieStart && x.Begintijd < SelectieEinde &&
                                                    x.ProductieVW == prod && x.ContractVW == contr
                                                    ).Sum(x => x.Uren * 60 + x.Minuten)) / 60.0;
                        DagenD = selxMANDAGEN.Where(x => x.Begintijd >= SelectieStart && x.Begintijd < SelectieEinde &&
                                                    x.ProductieVW == prod && x.ContractVW == contr
                                                    ).Select(y => new { y.VakmanId, y.Begintijd.Date }).Distinct().Count();
                        UrenT += UrenD; DagenT += DagenD;

                        TotaalRegel = TotaalRegel.Replace("{pcu" + prod.ToString() + contr.ToString() + "}", DagUurToString(UrenD));
                        TotaalRegel = TotaalRegel.Replace("{pcd" + prod.ToString() + contr.ToString() + "}", DagUurToString(DagenD));
                    } // Next contr
                }     // Next prod
                TotaalRegel = TotaalRegel.Replace("{omschrijving}", regelSamenvatting);
                TotaalRegel = TotaalRegel.Replace("{tu}", DagUurToString(UrenT));
                TotaalRegel = TotaalRegel.Replace("{td}", DagUurToString(DagenT));

                // min en maxdatum
                if (UrenT > 0)
                {
                    mindag = selxMANDAGEN.Where(x => x.Begintijd >= SelectieStart && x.Begintijd < SelectieEinde).Select(x => x.Begintijd).Min().ToString("d-M-yyy");
                    maxdag = selxMANDAGEN.Where(x => x.Begintijd >= SelectieStart && x.Begintijd < SelectieEinde).Select(x => x.Begintijd).Max().ToString("d-M-yyy");
                }
                TotaalRegel = TotaalRegel.Replace("{van}", mindag);
                TotaalRegel = TotaalRegel.Replace("{tot}", maxdag);

                // loonkosten Intern
                var KostPrijs = Convert.ToDouble(
                    selxMANDAGEN.Where(x =>
                                       x.Begintijd >= SelectieStart &&
                                       x.Begintijd < SelectieEinde &&
                                       x.ProductieVW == 1 &&
                                       x.ContractVW == 1)// Moet 'Per uur' zijn anders is het onzin)
                    .Sum(x => x.Loonkosten));
                TotaalRegel = TotaalRegel.Replace("{KPi}", ET.EuroPresentatie(KostPrijs, 2));

                //Loonkosten Extern
                KostPrijs = Convert.ToDouble(
                    selxMANDAGEN.Where(x =>
                                       x.Begintijd >= SelectieStart &&
                                       x.Begintijd < SelectieEinde &&
                                       x.ProductieVW == 2 &&
                                       x.ContractVW == 1)// Moet 'Per uur' zijn anders is het onzin
                    .Sum(x => x.Loonkosten));
                TotaalRegel = TotaalRegel.Replace("{KPe}", ET.EuroPresentatie(KostPrijs, 2));

                // Regel compleet. Row toevoegen aan tabelregels
                records += TotaalRegel; Rows = 2;

                // Bereken nu PER VAKMAN voor elke dienstbetrekking het totaal over deze periode
                var _vakmanIDs = selxMANDAGEN
                                 .Where(x => x.Begintijd >= SelectieStart &&
                                        x.Begintijd < SelectieEinde)
                                 .OrderBy(x => x.VakmanId)
                                 .Select(x => x.VakmanId).Distinct().ToList();
                var _VakmanSelecties = selxMANDAGEN
                                       .Where(x => x.Begintijd >= SelectieStart &&
                                              x.Begintijd < SelectieEinde)
                                       .OrderBy(x => x.VakmanId)
                                       .Select(x => new { VID         = x.VakmanId
                                                          , Productie = x.ProductieVW
                                                          , Contract  = x.ContractVW
                                                          , Vakman    = Vakmannen.Where(z => z.VakmanId == x.VakmanId).FirstOrDefault() }).Distinct().ToList();
                var _Vakmannen = Vakmannen.Where(x => _vakmanIDs.Contains(x.VakmanId));

                int regelnummer = 0;
                foreach (var Vakman in _Vakmannen
                         .OrderBy(x => x.Naam)
                         )
                {
                    UrenT       = 0; DagenT = 0;
                    TotaalRegel = htmlTabelSubRegel;
                    // Steeds per 3 regels van kleur wisselen
                    TotaalRegel = htmlTabelSubRegel.Replace("ProjectRegel", "ProjectRegelColor" + ((regelnummer++ % 6) / 3).ToString());

                    for (int prod = 1; prod <= 2; prod++)
                    {
                        for (int contr = 1; contr <= 2; contr++)
                        {
                            if (prod == 1 && contr == 2) // Intern per meter mag niet voorkomen!
                            {
                                break;
                            }
                            UrenD = (selxMANDAGEN.Where(x => x.Begintijd >= SelectieStart && x.Begintijd < SelectieEinde &&
                                                        x.VakmanId == Vakman.VakmanId && x.ProductieVW == prod && x.ContractVW == contr
                                                        ).Sum(x => x.Uren * 60 + x.Minuten)) / 60.0;
                            UrenT += UrenD;
                            DagenD = selxMANDAGEN.Where(x => x.Begintijd >= SelectieStart && x.Begintijd < SelectieEinde &&
                                                        x.VakmanId == Vakman.VakmanId && x.ProductieVW == prod && x.ContractVW == contr
                                                        ).Select(y => new { y.VakmanId, y.Begintijd.Date }).Distinct().Count();
                            DagenT += DagenD;

                            // Totaal van dienstbetrekking invullen
                            TotaalRegel = TotaalRegel.Replace("{pcu" + prod.ToString() + contr.ToString() + "}", DagUurToString(UrenD));
                            TotaalRegel = TotaalRegel.Replace("{pcd" + prod.ToString() + contr.ToString() + "}", DagUurToString(DagenD));
                        }
                    }

                    if (Vakman.Naam == null)
                    {
                        TotaalRegel = TotaalRegel.Replace("{omschrijving}", "Onbekende vakman met ID = " + Vakman.VakmanId.ToString());
                    }
                    else
                    {
                        TotaalRegel = TotaalRegel.Replace("{omschrijving}", Vakman.Naam);
                    }

                    TotaalRegel = TotaalRegel.Replace("{tu}", DagUurToString(UrenT));
                    TotaalRegel = TotaalRegel.Replace("{td}", DagUurToString(DagenT));

                    // loonkosten Intern
                    KostPrijs = Convert.ToDouble(
                        selxMANDAGEN.Where(x =>
                                           x.Begintijd >= SelectieStart &&
                                           x.Begintijd < SelectieEinde &&
                                           x.VakmanId == Vakman.VakmanId &&
                                           x.ProductieVW == 1 &&
                                           x.ContractVW == 1 // Moet 'Per uur' zijn anders is het onzin
                                           )
                        .Sum(x => x.Loonkosten));
                    TotaalRegel = TotaalRegel.Replace("{KPi}", ET.EuroPresentatie(KostPrijs, 2));

                    // Loonkosten Extern (Let op: Vakman kan gedeelte van de tijd zowel intern als extern geweest zijn
                    KostPrijs = Convert.ToDouble(
                        selxMANDAGEN.Where(x =>
                                           x.Begintijd >= SelectieStart &&
                                           x.Begintijd < SelectieEinde &&
                                           x.VakmanId == Vakman.VakmanId &&
                                           x.ProductieVW == 2 &&
                                           x.ContractVW == 1 // Moet 'Per uur' zijn anders is het onzin
                                           )
                        .Sum(x => x.Loonkosten));

                    TotaalRegel = TotaalRegel.Replace("{KPe}", ET.EuroPresentatie(KostPrijs, 2));

                    // Alle waarden zijn gevuld; Voeg regel toe aan HTML pagina
                    // (Als er geen uren staan voor deze vakman, dan ook geen regel aan besteden dus alleen tonen als er uren gemaakt zijn)
                    if (UrenT > 0)
                    {
                        // min en maxdatum
                        if (UrenT > 0)
                        {
                            mindag = selxMANDAGEN.Where(x => x.Begintijd >= SelectieStart && x.Begintijd < SelectieEinde && x.VakmanId == Vakman.VakmanId).Select(x => x.Begintijd).Min().ToString("d-M-yyy");
                            maxdag = selxMANDAGEN.Where(x => x.Begintijd >= SelectieStart && x.Begintijd < SelectieEinde && x.VakmanId == Vakman.VakmanId).Select(x => x.Begintijd).Max().ToString("d-M-yyy");
                        }
                        TotaalRegel = TotaalRegel.Replace("{van}", mindag);
                        TotaalRegel = TotaalRegel.Replace("{tot}", maxdag);

                        records += TotaalRegel; Rows++;
                    }
                }

                // Nodig ivm eerste paar subregels bij kopregel op één pagina houden:
                // Pas Rowspan aan indien er minder subregels bij elkaar te houden zijn dan in de rowspan is aangegeven
                if (Rows < RowSpan)
                {
                    records = ET.SetRowSpan(records, RowSpan, Rows);
                }

                // bij de 1e lus was de periode ingesteld op totaalperiode, vanaf nu pakken we de weekperiodes
                if (WeekIndex < WeekStart.Count())
                {
                    SelectieStart = WeekStart[WeekIndex];
                    SelectieEinde = WeekEinde[WeekIndex];
                    if (regelSamenvatting.ToLower().Contains("totaal"))
                    {
                        DIKKESTREEP = true;
                    }
                    regelSamenvatting = "Week " + ET.Weeknummer(WeekStart[WeekIndex], true);
                }
            } while (++WeekIndex <= WeekStart.Count());


            // Eco PDF eenmaken, vullen en tonen
            string FilledTable = htmlTabel.Replace("{tabelregels}", records);

            ET.MakePdf(FilledTable, LijstGegevens);
        }
예제 #4
0
        internal void Maak_Lijst(DateTime pStartDatum, DateTime pEindDatum, List <PoortViewMandagen> selxMANDAGEN, List <PoortViewRegistratiebevoegd> _gebruikers, List <allContract> Contracten, EvoTools.HeaderFooter LijstGegevens)
        {
            // Bepaal aantal bij elkaar te houden regels
            int RowSpan = ET.GetRowSpan(htmlTabelTotaalRegel);
            int Rows;

            ET.Log("Start van Maak Lijst 8b");
            //
            // Deel periode in x-aantal weken in
            //

            // Week van Startdatum begin op maandag
            List <DateTime> WeekStart = new List <DateTime>();
            List <DateTime> WeekEinde = new List <DateTime>();
            // Trek DayofWeek van startdatum af om de maandag van die week te bepalen
            DateTime Maandag      = pStartDatum.AddDays((1 - ((int)pStartDatum.DayOfWeek == 0 ? 7 : (int)pStartDatum.DayOfWeek)));
            DateTime PeriodeStart = Maandag;
            int      StartWeekNr  = new GregorianCalendar(GregorianCalendarTypes.Localized).GetWeekOfYear(PeriodeStart, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);

            do
            {
                // Voorlopig nog even geen 'ShowAll', dus WeekStart niet eerder dan startdatum
                if (Maandag < pStartDatum)
                {
                    WeekStart.Add(pStartDatum);
                }
                else
                {
                    WeekStart.Add(Maandag);
                }

                Maandag = Maandag.AddDays(7);

                // Voorlopig nog even geen 'ShowAll', dus WeekEinde niet later dan einddatum
                if (Maandag > pEindDatum)
                {
                    WeekEinde.Add(pEindDatum.AddDays(1));
                }
                else
                {
                    WeekEinde.Add(Maandag);
                }
            } while (Maandag <= pEindDatum);
            DateTime PeriodeEinde = Maandag;

            // Okay we doen het nu helemaal f*****g anders!
            // Bereken per Vakman hoeveel uren hij op die dag heeft gemaakt, hoeveel uren hij op voor een project heeft gemaakt
            // en bepaal het dagdeel (percentage) wat dan kan worden toegekend aan dat project
            var VakmanUrenPerDag = selxMANDAGEN
                                   .GroupBy(a => new { Datum = a.Begintijd.Date, a.VakmanId })
                                   .Select(a => new { a.Key.Datum, a.Key.VakmanId, Uren = a.Sum(x => x.Uren * 60 + x.Minuten) / 60.0, Projecten = a.Count() })
                                   .OrderBy(a => a.Datum).ThenBy(a => a.VakmanId)
                                   .ToList();
            var VakmanUrenPerDagPerProjectLeiderPerProdContr = selxMANDAGEN
                                                               .GroupBy(a => new { Datum = a.Begintijd.Date, a.VakmanId, a.ProjectleiderId, a.ProductieVW, a.ContractVW })
                                                               .Select(a => new { a.Key.ProjectleiderId, a.Key.Datum, a.Key.VakmanId, a.Key.ProductieVW, a.Key.ContractVW, Uren = a.Sum(x => x.Uren * 60 + x.Minuten) / 60.0 })
                                                               //.OrderBy(a => a.Name2.Datum )
                                                               .ToList();
            var VakmanDagdelenPerDagPerProjectPerProdContr = (from a in VakmanUrenPerDagPerProjectLeiderPerProdContr
                                                              join b in VakmanUrenPerDag
                                                              on new { a.Datum, a.VakmanId } equals new { b.Datum, b.VakmanId }
                                                              select new { a, UrenAlleProjecten = b.Uren, DagDeel = a.Uren / b.Uren })
                                                             .OrderBy(x => x.a.Datum)
                                                             .ToList()
                                                             .OrderBy(x => x.a.Datum);

            // Eerst even Totaal alle vakmannen tesamen
            //List<char> Dienstbetrekkingscode = new List<int>("1,3,U,A".Split(',').Select(n => char.Parse(n)).ToList());
            double DagenT, UrenT;
            double DagenD = 0;
            double UrenD  = 0;

            // ****************************************************************************************************
            //
            // Start opbouwen van de totaalregels
            // Per 'DO'
            //  Bereken het totaal van de betreffende periode;
            //  Berken per vakman het totaal van de betreffende periode
            //
            // We beginnen met Totallperiode van periodestart tot periodeeind
            // vlak voor de 'WHILE' starten we met de 1e weekperiode te selecteren, daarna alle andere weekperiodes
            //
            // ****************************************************************************************************

            // Startsetting zodat we de gehele periode pakken
            DateTime SelectieStart     = PeriodeStart;
            DateTime SelectieEinde     = PeriodeEinde;
            string   regelSamenvatting = "Totaal";
            // WeekIndex gebruiken we pas nadat de 1e lus is doorlopen
            int WeekIndex = 0; string mindag = "", maxdag = ""; bool DIKKESTREEP = false;

            do // Start met totaal-periode; Neem daarna alle weekperiodes
            {
                UrenT = 0; DagenT = 0;
                // Bereken voor elke dienstbetrekking het totaal over deze periode
                //for (int c = -1; c <= 7; c += 2)
                var _AllContracten = (Contracten.Select(x => x.ContractID).ToList()).OrderBy(x => x);
                var _AllProducties = new List <int> {
                    1, 2
                };
                string TotaalRegel = htmlTabelTotaalRegel;
                // Voeg extra dikke lijn toe na tonen van totaalgegevens (Alleen eerste keer!)
                if (DIKKESTREEP)
                {
                    TotaalRegel = TotaalRegel.Replace("<!--LINE-->", "<tr><td colspan=\"14\" style=\"width:100%; border-bottom:1px solid black\"></td></tr>");
                    DIKKESTREEP = false;
                }

                foreach (int prod in _AllProducties)
                {
                    foreach (int contr in _AllContracten)
                    {
                        if (prod == 1 && contr == 2)
                        {
                            break;                          // Intern, Per meter komt niet voor (wordt op gecontroleerd bij de invoer)
                        }
                        // Uren
                        UrenD = selxMANDAGEN.Where(x =>
                                                   x.Begintijd >= SelectieStart &&
                                                   x.Begintijd < SelectieEinde &&
                                                   (x.ContractVW == contr && x.ProductieVW == prod)
                                                   ).Sum(x => x.Uren) * 60;
                        UrenD += selxMANDAGEN.Where(x =>
                                                    x.Begintijd >= SelectieStart &&
                                                    x.Begintijd < SelectieEinde &&
                                                    (x.ContractVW == contr && x.ProductieVW == prod)
                                                    ).Sum(x => x.Minuten);
                        UrenD /= 60.0;
                        UrenT += UrenD;
                        // Dagen
                        DagenD = selxMANDAGEN.Where(x =>
                                                    x.Begintijd >= SelectieStart &&
                                                    x.Begintijd < SelectieEinde &&
                                                    (x.ContractVW == contr && x.ProductieVW == prod)
                                                    ).Select(y => new { y.VakmanId, y.Begintijd.Date }).Distinct().Count();
                        DagenT += DagenD;

                        TotaalRegel = TotaalRegel.Replace("{pcu" + prod.ToString() + contr.ToString() + "}", DagUurToString(UrenD));
                        TotaalRegel = TotaalRegel.Replace("{pcd" + prod.ToString() + contr.ToString() + "}", DagUurToString(DagenD));
                    } // NBext C
                }     // Next P

                // Regel verder invullen ---
                //---------------------- ---

                // min en maxdatum
                if (UrenD > 0)
                {
                    mindag = selxMANDAGEN.Where(x => x.Begintijd >= SelectieStart && x.Begintijd < SelectieEinde).Select(x => x.Begintijd).Min().ToString("d-M-yyy");
                    maxdag = selxMANDAGEN.Where(x => x.Begintijd >= SelectieStart && x.Begintijd < SelectieEinde).Select(x => x.Begintijd).Max().ToString("d-M-yyy");
                }
                TotaalRegel = TotaalRegel.Replace("{van}", mindag);
                TotaalRegel = TotaalRegel.Replace("{tot}", maxdag);

                // Omschrijving en Totaaluren
                TotaalRegel = TotaalRegel.Replace("{omschrijving}", regelSamenvatting);
                TotaalRegel = TotaalRegel.Replace("{tu}", DagUurToString(UrenT));
                TotaalRegel = TotaalRegel.Replace("{td}", DagUurToString(DagenT));

                // Loonkosten
                var LK = Convert.ToDouble
                             (selxMANDAGEN.Where(x =>
                                                 x.Begintijd >= SelectieStart &&
                                                 x.Begintijd < SelectieEinde &&
                                                 x.ProductieVW == 1 &&
                                                 x.ContractVW == 1 // Moet 'Per uur' zijn anders is het onzin
                                                 ).Sum(x => x.Loonkosten));
                TotaalRegel = TotaalRegel.Replace("{KPi}", ET.EuroPresentatie(LK, 2));

                LK = Convert.ToDouble
                         (selxMANDAGEN.Where(x =>
                                             x.Begintijd >= SelectieStart &&
                                             x.Begintijd < SelectieEinde &&
                                             x.ProductieVW == 2 &&
                                             x.ContractVW == 1 // Moet 'Per uur' zijn anders is het onzin
                                             ).Sum(x => x.Loonkosten));
                TotaalRegel = TotaalRegel.Replace("{KPe}", ET.EuroPresentatie(LK, 2));

                //records += "<b>" + ET.HtmlFormat(htmlrecord, RegelVars) + "</b>";
                records += TotaalRegel; Rows = 2;

                // Bereken nu PER PROJECTLEIDER voor elke dienstbetrekking het totaal over deze periode
                List <int> _ProjectleiderIDs = selxMANDAGEN.Select(x => x.ProjectleiderId).Distinct().ToList();
                var        _Projectleiders   = _gebruikers.Where(x => _ProjectleiderIDs.Contains(x.ProjectleiderId ?? 0)).Select(x => new { x.ProjectleiderId, x.Gebruikersnaam }).Distinct().ToList();
                int        regelnummer       = 0;
                var        projectleiders    = selxMANDAGEN.Where(x =>
                                                                  x.Begintijd >= SelectieStart &&
                                                                  x.Begintijd < SelectieEinde).Select(x => x.ProjectleiderId).Distinct();

                foreach (var Projectleider in _Projectleiders.Where(x => projectleiders.Contains(x.ProjectleiderId ?? 0))
                         .OrderBy(x => x.Gebruikersnaam))
                {
                    UrenT = 0; DagenT = 0; mindag = ""; maxdag = "";

                    // Steeds per 3 regels van kleur wisselen
                    TotaalRegel = htmlTabelSubRegel.Replace("ProjectRegel", "ProjectRegelColor" + ((regelnummer++ % 6) / 3).ToString());
                    foreach (int prod in _AllProducties)
                    {
                        foreach (int contr in _AllContracten)
                        {
                            if (prod == 1 && contr == 2)
                            {
                                break;                         // Intern, Per meter doen we niet aan
                            }
                            // Uren
                            UrenD = selxMANDAGEN.Where(x =>
                                                       x.Begintijd >= SelectieStart &&
                                                       x.Begintijd < SelectieEinde &&
                                                       x.ProjectleiderId == Projectleider.ProjectleiderId &&
                                                       x.ContractVW == contr && x.ProductieVW == prod
                                                       ).Sum(x => x.Uren) * 60;
                            UrenD += selxMANDAGEN.Where(x =>
                                                        x.Begintijd >= SelectieStart &&
                                                        x.Begintijd < SelectieEinde &&
                                                        x.ProjectleiderId == Projectleider.ProjectleiderId &&
                                                        x.ContractVW == contr && x.ProductieVW == prod
                                                        ).Sum(x => x.Minuten);
                            UrenD /= 60.0;
                            UrenT += UrenD;

                            // Dagen (Als percentage 'Dagdeel')
                            DagenD = VakmanDagdelenPerDagPerProjectPerProdContr
                                     .Where(x =>
                                            x.a.Datum >= SelectieStart &&
                                            x.a.Datum < SelectieEinde &&
                                            x.a.ProjectleiderId == Projectleider.ProjectleiderId &&
                                            x.a.ContractVW == contr && x.a.ProductieVW == prod)
                                     .Select(x => x.DagDeel).Sum();
                            DagenT += DagenD;

                            // Totaal van geselecteeerd Productie/Contract invullen
                            TotaalRegel = TotaalRegel.Replace("{pcu" + prod.ToString() + contr.ToString() + "}", DagUurToString(UrenD));
                            TotaalRegel = TotaalRegel.Replace("{pcd" + prod.ToString() + contr.ToString() + "}", DagUurToString(DagenD));
                        } // Next contract
                    }     // Next Productie

                    TotaalRegel = TotaalRegel.Replace("{omschrijving}",
                                                      Projectleider.Gebruikersnaam
                                                      );
                    TotaalRegel = TotaalRegel.Replace("{tu}", DagUurToString(UrenT));
                    TotaalRegel = TotaalRegel.Replace("{td}", DagUurToString(DagenT));

                    // min en maxdatum
                    if (UrenT > 0)
                    {
                        mindag = selxMANDAGEN.Where(x => x.Begintijd >= SelectieStart && x.Begintijd < SelectieEinde && x.ProjectleiderId == Projectleider.ProjectleiderId).Select(x => x.Begintijd).Min().ToString("d-M-yyy");
                        maxdag = selxMANDAGEN.Where(x => x.Begintijd >= SelectieStart && x.Begintijd < SelectieEinde && x.ProjectleiderId == Projectleider.ProjectleiderId).Select(x => x.Begintijd).Max().ToString("d-M-yyy");
                    }
                    TotaalRegel = TotaalRegel.Replace("{van}", mindag);
                    TotaalRegel = TotaalRegel.Replace("{tot}", maxdag);

                    // Loonkosten
                    LK = Convert.ToDouble
                             (selxMANDAGEN.Where(x =>
                                                 x.Begintijd >= SelectieStart &&
                                                 x.Begintijd < SelectieEinde &&
                                                 x.ProjectleiderId == Projectleider.ProjectleiderId &&
                                                 x.ProductieVW == 1 &&
                                                 x.ContractVW == 1 // Moet 'Per uur' zijn anders is het onzin
                                                 ).Sum(x => x.Loonkosten));
                    TotaalRegel = TotaalRegel.Replace("{KPi}", ET.EuroPresentatie(LK, 2));

                    LK = Convert.ToDouble
                             (selxMANDAGEN.Where(x =>
                                                 x.Begintijd >= SelectieStart &&
                                                 x.Begintijd < SelectieEinde &&
                                                 x.ProjectleiderId == Projectleider.ProjectleiderId &&
                                                 x.ProductieVW == 2 &&
                                                 x.ContractVW == 1 // Moet 'Per uur' zijn anders is het onzin
                                                 ).Sum(x => x.Loonkosten));
                    TotaalRegel = TotaalRegel.Replace("{KPe}", ET.EuroPresentatie(LK, 2));


                    // Alle waarden zijn gevuld; Voeg regel toe aan HTML pagina
                    // NIEUW als er geen uren staan voor deze vakman, dan ook geen regel aan besteden dus alleen tonen als er uren gemaakt zijn
                    if (UrenT > 0 || LK > 0)
                    //records += ET.HtmlFormat(htmlrecord, RegelVars);
                    {
                        records += TotaalRegel; Rows++;
                    }
                }

                // Nodig ivm eerste paar subregels bij kopregel op één pagina houden:
                // Pas Rowspan aan indien er minder subregels bij elkaar te houden zijn dan in de rowspan is aangegeven
                if (Rows < RowSpan)
                {
                    records = ET.SetRowSpan(records, RowSpan, Rows);
                }

                // bij de 1e lus was de periode ingesteld op totaalperiode, vanaf nu pakken we de weekperiodes
                if (WeekIndex < WeekStart.Count())
                {
                    SelectieStart = WeekStart[WeekIndex];
                    SelectieEinde = WeekEinde[WeekIndex];
                    if (regelSamenvatting.ToLower().Contains("totaal"))
                    {
                        DIKKESTREEP = true;
                    }
                    regelSamenvatting = string.Format("Week {0}", ET.Weeknummer(SelectieStart, true));
                }
            } while (++WeekIndex <= WeekStart.Count());


            // Eco PDF eenmaken, vullen en tonen
            string FilledTable = htmlTabel.Replace("{tabelregels}", records);

            ET.MakePdf(FilledTable, LijstGegevens);
        }
예제 #5
0
        internal void Maak_Lijst(DateTime pStartDatum, DateTime pEindDatum, List <PoortViewMandagen> selxMANDAGEN, List <allContract> Contracten, EvoTools.HeaderFooter LijstGegevens)
        {
            // Bepaal aantal bij elkaar te houden regels
            int RowSpan = ET.GetRowSpan(htmlTabelTotaalRegel);
            int Rows;

            //
            // Deel periode in x-aantal weken in
            //

            // Week van Startdatum begin op maandag
            List <DateTime> WeekStart = new List <DateTime>();
            List <DateTime> WeekEinde = new List <DateTime>();
            // Trek DayofWeek van startdatum af om de maandag van die week te bepalen
            DateTime Maandag      = pStartDatum.AddDays((1 - ((int)pStartDatum.DayOfWeek == 0 ? 7 : (int)pStartDatum.DayOfWeek)));
            DateTime PeriodeStart = Maandag;

            do
            {
                // Voorlopig nog even geen 'ShowAll', dus WeekStart niet eerder dan startdatum
                if (Maandag < pStartDatum)
                {
                    WeekStart.Add(pStartDatum);
                }
                else
                {
                    WeekStart.Add(Maandag);
                }

                Maandag = Maandag.AddDays(7);

                // Voorlopig nog even geen 'ShowAll', dus WeekEinde niet later dan einddatum
                if (Maandag > pEindDatum)
                {
                    WeekEinde.Add(pEindDatum.AddDays(1));
                }
                else
                {
                    WeekEinde.Add(Maandag);
                }
            } while (Maandag <= pEindDatum);
            DateTime PeriodeEinde = Maandag;

            // Eerst even Totaal alle vakmannen
            double UrenT  = 0;
            double DagenT = 0;
            double DagenD = 0;
            double UrenD  = 0;

            // Bereken voor elke dienstbetrekking het totaal
            var    _AllContracten = (Contracten.Select(x => x.ContractID).ToList()).OrderBy(x => x);
            string TotaalRegel    = htmlTabelTotaalRegel;

            foreach (int prod in new List <int> {
                1, 2
            })
            {
                foreach (int contr in _AllContracten)
                {
                    // Uren
                    UrenD = selxMANDAGEN.Where(x =>
                                               x.Begintijd >= PeriodeStart &&
                                               x.Begintijd < PeriodeEinde &&
                                               x.ContractVW == contr && x.ProductieVW == prod
                                               ).Sum(x => x.Uren) * 60;
                    UrenD += selxMANDAGEN.Where(x =>
                                                x.Begintijd >= PeriodeStart &&
                                                x.Begintijd < PeriodeEinde &&
                                                x.ContractVW == contr && x.ProductieVW == prod
                                                ).Sum(x => x.Minuten);
                    UrenD /= 60.0;
                    UrenT += UrenD;

                    // Dagen
                    DagenD = selxMANDAGEN.Where(x =>
                                                x.Begintijd >= PeriodeStart &&
                                                x.Begintijd < PeriodeEinde &&
                                                x.ContractVW == contr && x.ProductieVW == prod
                                                ).Select(y => new { y.VakmanId, y.Begintijd.Date }).Distinct().Count();
                    DagenT += DagenD;

                    // Totaal van dienstbetrekking invullen
                    TotaalRegel = TotaalRegel.Replace("{pcu" + prod.ToString() + contr.ToString() + "}", DagUurToString(UrenD));
                    TotaalRegel = TotaalRegel.Replace("{pcd" + prod.ToString() + contr.ToString() + "}", DagUurToString(DagenD));
                }
            }

            //Datums
            string mindag = string.Empty, maxdag = string.Empty;

            if (UrenT > 0)
            {
                mindag = selxMANDAGEN.Select(x => x.Begintijd).Min().ToString("d-M-yyy");
                maxdag = selxMANDAGEN.Select(x => x.Begintijd).Max().ToString("d-M-yyy");
            }

            TotaalRegel = TotaalRegel.Replace("{omschrijving}", "Totaal");
            TotaalRegel = TotaalRegel.Replace("{tu}", DagUurToString(UrenT));
            TotaalRegel = TotaalRegel.Replace("{td}", DagUurToString(DagenT));
            TotaalRegel = TotaalRegel.Replace("{van}", mindag);
            TotaalRegel = TotaalRegel.Replace("{tot}", maxdag);

            // loonkosten
            var KostPrijs = Convert.ToDouble(
                selxMANDAGEN.Where(x => x.ProductieVW == 1 && x.ContractVW == 1).Sum(x => x.Loonkosten));

            TotaalRegel = TotaalRegel.Replace("{KPi}", ET.EuroPresentatie(KostPrijs, 2));

            KostPrijs = Convert.ToDouble(
                selxMANDAGEN.Where(x => x.ProductieVW == 2 && x.ContractVW == 1).Sum(x => x.Loonkosten));
            TotaalRegel = TotaalRegel.Replace("{KPe}", ET.EuroPresentatie(KostPrijs, 2));

            // Regel compleet. Row toevoegen aan tabelregels
            records += TotaalRegel; Rows = 2;

            // Bepaal voor elke week de totalen
            for (int i = 0; i < WeekStart.Count(); i++)
            {
                DateTime _StartTijd = WeekStart[i];
                DateTime _EindeTijd = WeekEinde[i];

                DagenD = 0;
                UrenD  = 0;
                UrenT  = 0;
                DagenT = 0;

                // Steeds per 3 regels van kleur wisselen
                TotaalRegel = htmlTabelWeekRegel.Replace("ProjectRegel", "ProjectRegelColor" + ((i % 6) / 3).ToString());
                foreach (int prod in new List <int> {
                    1, 2
                })
                {
                    foreach (int contr in _AllContracten)
                    {
                        UrenD = selxMANDAGEN.Where(x =>
                                                   x.Begintijd >= _StartTijd &&
                                                   x.Begintijd < _EindeTijd &&
                                                   x.ContractVW == contr && x.ProductieVW == prod
                                                   ).Sum(x => x.Uren) * 60;
                        UrenD += selxMANDAGEN.Where(x =>
                                                    x.Begintijd >= _StartTijd &&
                                                    x.Begintijd < _EindeTijd &&
                                                    x.ContractVW == contr && x.ProductieVW == prod
                                                    ).Sum(x => x.Minuten);
                        UrenD /= 60.0;
                        UrenT += UrenD;

                        // Dagen
                        DagenD = selxMANDAGEN.Where(x =>
                                                    x.Begintijd >= _StartTijd &&
                                                    x.Begintijd < _EindeTijd &&
                                                    x.ContractVW == contr && x.ProductieVW == prod
                                                    ).Select(y => new { y.VakmanId, y.Begintijd.Date }).Distinct().Count();
                        DagenT += DagenD;

                        // Totaal van dienstbetrekking invullen
                        TotaalRegel = TotaalRegel.Replace("{pcu" + prod.ToString() + contr.ToString() + "}", DagUurToString(UrenD));
                        TotaalRegel = TotaalRegel.Replace("{pcd" + prod.ToString() + contr.ToString() + "}", DagUurToString(DagenD));
                    } // Next contr
                }     // Nect prod

                TotaalRegel = TotaalRegel.Replace("{omschrijving}", "Week " + ET.Weeknummer(_StartTijd, true));
                TotaalRegel = TotaalRegel.Replace("{tu}", DagUurToString(UrenT));
                TotaalRegel = TotaalRegel.Replace("{td}", DagUurToString(DagenT));

                //Datums
                if (UrenT > 0)
                {
                    mindag = selxMANDAGEN.Where(x => x.Begintijd >= _StartTijd && x.Begintijd < _EindeTijd).Select(x => x.Begintijd).Min().ToString("d-M-yyy");
                    maxdag = selxMANDAGEN.Where(x => x.Begintijd >= _StartTijd && x.Begintijd < _EindeTijd).Select(x => x.Begintijd).Max().ToString("d-M-yyy");
                }
                else
                {
                    mindag = string.Empty;
                    maxdag = string.Empty;
                }


                TotaalRegel = TotaalRegel.Replace("{van}", mindag);
                TotaalRegel = TotaalRegel.Replace("{tot}", maxdag);

                // loonkosten
                KostPrijs = Convert.ToDouble
                            (
                    selxMANDAGEN.Where(x =>
                                       x.Begintijd >= _StartTijd &&
                                       x.Begintijd < _EindeTijd &&
                                       x.ProductieVW == 1 &&
                                       x.ContractVW == 1) // Moet 'Per uur' zijn anders is het onzin)
                    .Sum(x => x.Loonkosten)
                            );
                TotaalRegel = TotaalRegel.Replace("{KPi}", ET.EuroPresentatie(KostPrijs, 2));

                KostPrijs = Convert.ToDouble
                            (
                    selxMANDAGEN.Where(x =>
                                       x.Begintijd >= _StartTijd &&
                                       x.Begintijd < _EindeTijd &&
                                       x.ProductieVW == 2 &&
                                       x.ContractVW == 1) // Moet 'Per uur' zijn anders is het onzin)
                    .Sum(x => x.Loonkosten)
                            );
                TotaalRegel = TotaalRegel.Replace("{KPe}", ET.EuroPresentatie(KostPrijs, 2));

                // Regel compleet. Row toevoegen aan tabelregels
                records += TotaalRegel; Rows++;
            }

            // Nodig ivm eerste paar subregels bij kopregel op één pagina houden:
            // Pas Rowspan aan indien er minder subregels bij elkaar te houden zijn dan in de rowspan is aangegeven
            if (Rows < RowSpan)
            {
                records = ET.SetRowSpan(records, RowSpan, Rows);
            }

            // Eddy Ready Go.
            // We hebben nu feitelijk alle regels gevuld, laten we de HTMl pagina opmaken!

            // Eco PDF eenmaken, vullen en tonen
            string FilledTable = htmlTabel.Replace("{tabelregels}", records);

            ET.MakePdf(FilledTable, LijstGegevens);
        }
        internal void Maak_Lijst(DateTime pStartDatum, DateTime pEindDatum, List<PoortViewMandagen> selxMANDAGEN, List<PoortViewProject> _Projecten, List<allContract> Contracten, List<string> _opties, DateTime UI_Startdatum, DateTime UI_Einddatum, EvoTools.HeaderFooter LijstGegevens)
        {
            // Bepaal aantal bij elkaar te houden regels
            int RowSpan = ET.GetRowSpan(htmlTabelTotaalRegel);
            int Rows;

            // Start en Einddata van projecten
            var _VanTotDatums =
                selxMANDAGEN.Select(x => new { x.ProjectId, Datum = x.Begintijd }).Distinct();

            //
            // Deel periode in x-aantal weken in
            //

            // Week van Startdatum begin op maandag
            List<DateTime> WeekStart = new List<DateTime>();
            List<DateTime> WeekEinde = new List<DateTime>();
            // Trek DayofWeek van startdatum af om de maandag van die week te bepalen
            DateTime Maandag = pStartDatum.AddDays((1 - ((int)pStartDatum.DayOfWeek == 0 ? 7 : (int)pStartDatum.DayOfWeek)));
            DateTime PeriodeStart = Maandag;
            int StartWeekNr = new GregorianCalendar(GregorianCalendarTypes.Localized).GetWeekOfYear(PeriodeStart, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
            do
            {
                // Voorlopig nog even geen 'ShowAll', dus WeekStart niet eerder dan startdatum
                if (Maandag < pStartDatum)
                    WeekStart.Add(pStartDatum);
                else
                    WeekStart.Add(Maandag);

                Maandag = Maandag.AddDays(7);

                // Voorlopig nog even geen 'ShowAll', dus WeekEinde niet later dan einddatum
                if (Maandag > pEindDatum)
                    WeekEinde.Add(pEindDatum.AddDays(1));
                else
                    WeekEinde.Add(Maandag);
            } while (Maandag <= pEindDatum);
            DateTime PeriodeEinde = Maandag;

            // Okay we doen het nu helemaal f*****g anders!
            // Bereken per Vakman hoeveel uren hij op die dag heeft gemaakt, hoeveel uren hij op voor een project heeft gemaakt
            // en bepaal het dagdeel (percentage) wat dan kan worden toegekend aan dat project
            var VakmanUrenPerDag = selxMANDAGEN
                .GroupBy(a => new { Datum = a.Begintijd.Date, a.VakmanId })
                .Select(a => new { a.Key.Datum, a.Key.VakmanId , Uren = a.Sum(x => x.Uren * 60 + x.Minuten) / 60.0,  Projecten = a.Count() })
                .OrderBy(a => a.Datum ).ThenBy(a => a.VakmanId )
                .ToList();
            var VakmanUrenPerDagPerProjectPerProdContr = selxMANDAGEN
                .GroupBy(a => new { Datum = a.Begintijd.Date, a.VakmanId, a.ProjectId, a.ProductieVW, a.ContractVW  })
                .Select(a => new {a.Key.ProjectId ,a.Key.Datum, a.Key.VakmanId, a.Key.ProductieVW, a.Key.ContractVW , Uren = a.Sum(x => x.Uren * 60 + x.Minuten) / 60.0 })
                //.OrderBy(a => a.Name2.Datum )
                .ToList();
            var VakmanDagdelenPerDagPerProjectPerProdContr = (from a in VakmanUrenPerDagPerProjectPerProdContr
                        join b in VakmanUrenPerDag
                        on new { a.Datum, a.VakmanId } equals new { b.Datum, b.VakmanId }
                        select new { a, UrenAlleProjecten = b.Uren, DagDeel = a.Uren / b.Uren })
                        .OrderBy(x => x.a.Datum)
                        .ToList()
                        .OrderBy(x => x.a.Datum);

            // Eerst even Totaal alle vakmannen tesamen
            //List<char> Dienstbetrekkingscode = new List<int>("1,3,U,A".Split(',').Select(n => char.Parse(n)).ToList());
            double DagenT, UrenT;
            double DagenD = 0;
            double UrenD = 0;

            string[] RegelStrings = new string[] { "", "", "", "", "", "", "", "", "", "", "", "", "" };
            double[] DienstBetrekkingT = new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

            // ****************************************************************************************************
            //
            // Start opbouwen van de totaalregels
            // Per 'DO'
            //  Bereken het totaal van de betreffende periode;
            //  Berken per project het totaal van de betreffende periode
            // 
            // We beginnen met Totallperiode van periodestart tot periodeeind
            // vlak voor de 'WHILE' starten we met de 1e weekperiode te selecteren, daarna alle andere weekperiodes
            //
            // ****************************************************************************************************

            // Startsetting zodat we de gehele periode pakken
            DateTime SelectieStart = PeriodeStart;
            DateTime SelectieEinde = PeriodeEinde;
            string regelSamenvatting = "Totaal";
            // WeekIndex gebruiken we pas nadat de 1e lus is doorlopen
            int WeekIndex = 0; string mindag = "", maxdag = ""; 
            Boolean DIKKESTREEP = false;
            do // Start met totaal-periode; Neem daarna alle weekperiodes
            {
                UrenT = 0; DagenT = 0;
                // Bereken voor elke dienstbetrekking het totaal over deze periode
                var _AllProducties = (new List<int> { 1, 2});
                var _AllContracten = (Contracten.Select(x => x.ContractID).ToList()).OrderBy(x => x);
                string TotaalRegel = htmlTabelTotaalRegel;

                // Voeg extra dikke lijn toe na tonen van totaalgegevens (Alleen eerste keer!)
                if (DIKKESTREEP)
                {
                    TotaalRegel = TotaalRegel.Replace("<!--LINE-->", "<tr><td colspan=\"14\" style=\"width:100%; border-bottom:1px solid black\"></td></tr>");
                    DIKKESTREEP = false;
                }

                foreach (int p in _AllProducties)
                {
                    foreach (int c in _AllContracten)
                    {
                        if (p == 1 && c == 2) break; // Intern / Per Meter is niet toegestaan
                        // Uren
                        UrenD = (selxMANDAGEN.Where(x =>
                            x.Begintijd >= SelectieStart &&
                            x.Begintijd < SelectieEinde &&
                            (x.ContractVW == c && x.ProductieVW == p)
                            ).Sum(x => x.Uren * 60 + x.Minuten)) / 60.0;
                        UrenT += UrenD;

                        DagenD = VakmanDagdelenPerDagPerProjectPerProdContr
                            .Where(x =>
                                x.a.Datum >= SelectieStart &&
                                x.a.Datum < SelectieEinde &&
                                x.a.ContractVW == c && x.a.ProductieVW == p)
                            .Select(x => x.DagDeel).Sum();
                        DagenT += DagenD;

                        TotaalRegel = TotaalRegel.Replace("{pcu" + p.ToString() + c.ToString() + "}", DagUurToString(UrenD));
                        TotaalRegel = TotaalRegel.Replace("{pcd" + p.ToString() + c.ToString() + "}", DagUurToString(DagenD));
                    } // Next Contract
                } // Next Productie

                TotaalRegel = TotaalRegel.Replace("{omschrijving}", regelSamenvatting);
                TotaalRegel = TotaalRegel.Replace("{tu}", DagUurToString(UrenT));
                TotaalRegel = TotaalRegel.Replace("{td}", DagUurToString(DagenT));


                // loonkosten
                Double LK = Convert.ToDouble(
                    selxMANDAGEN.Where(x =>
                    x.Begintijd >= SelectieStart &&
                    x.Begintijd < SelectieEinde &&
                    x.ProductieVW == 1 &&
                    x.ContractVW == 1 // Moet 'Per uur' zijn anders is het onzin
                    ).Sum(x => x.Loonkosten)
                    );
                TotaalRegel = TotaalRegel.Replace("{KPi}", ET.EuroPresentatie(LK, 2));

                LK = Convert.ToDouble(
                    selxMANDAGEN.Where(x =>
                    x.Begintijd >= SelectieStart &&
                    x.Begintijd < SelectieEinde &&
                    x.ProductieVW == 2 &&
                    x.ContractVW == 1 // Moet 'Per uur' zijn anders is het onzin
                    ).Sum(x => x.Loonkosten)
                    );
                TotaalRegel = TotaalRegel.Replace("{KPe}", ET.EuroPresentatie(LK, 2));

                // Periode toevoegen
                if (UrenT > 0)
                {
                    mindag = _VanTotDatums.Where(x =>
                            x.Datum >= SelectieStart &&
                            x.Datum < SelectieEinde
                            ).Select(x => x.Datum).Min().ToShortDateString();
                    maxdag = _VanTotDatums.Where(x =>
                            x.Datum >= SelectieStart &&
                            x.Datum < SelectieEinde
                            ).Select(x => x.Datum).Max().ToShortDateString();
                }
                TotaalRegel = TotaalRegel.Replace("{van}", mindag);
                TotaalRegel = TotaalRegel.Replace("{tot}", maxdag);

                // Voeg Totaalregel toe en maak nieuwe tabelregel
                records += TotaalRegel; Rows = 2;


                // Bereken nu PER PROJECT voor elke dienstbetrekking het totaal over deze periode
                int regelnummer = 0;
                foreach (int ProjectID in selxMANDAGEN
                    .OrderBy(x => x.project_NR)
                    .Select(x => x.ProjectId).Distinct().ToList())
                {
                    UrenT = 0; DagenT = 0; mindag = ""; maxdag = "";

                    // Steeds per 3 regels van kleur wisselen
                    TotaalRegel = htmlTabelSubRegel.Replace("ProjectRegel", "ProjectRegelColor" + ((regelnummer++ % 6) / 3).ToString());
                    
                    foreach (int p in _AllProducties)
                    {
                        foreach (int c in _AllContracten)
                        {
                            if (p == 1 && c == 2) break; // Intern / Per Meter is niet toegestaan
                            // Uren
                            UrenD = selxMANDAGEN.Where(x =>
                                x.Begintijd >= SelectieStart &&
                                x.Begintijd < SelectieEinde &&
                                x.ProjectId == ProjectID &&
                                (x.ContractVW == c) && (x.ProductieVW == p)
                                ).Sum(x => x.Uren * 60 + x.Minuten) / 60.0;
                            UrenT += UrenD;

                            DagenD = VakmanDagdelenPerDagPerProjectPerProdContr
                                .Where(x =>
                                    x.a.Datum >= SelectieStart &&
                                    x.a.Datum < SelectieEinde &&
                                    x.a.ProjectId == ProjectID &&
                                    x.a.ContractVW == c && x.a.ProductieVW == p)
                                .Select(x => x.DagDeel).Sum();
                            DagenT += DagenD;

                            // Totaal van geselecteeerd Productie/Contract invullen
                            TotaalRegel = TotaalRegel.Replace("{pcu" + p.ToString() + c.ToString() + "}", DagUurToString(UrenD));
                            TotaalRegel = TotaalRegel.Replace("{pcd" + p.ToString() + c.ToString() + "}", DagUurToString(DagenD));

                        } // Next Contract
                    } // Next Productie

                    // LoonKosten
                    LK = Convert.ToDouble(selxMANDAGEN.Where(x =>
                        x.Begintijd >= SelectieStart &&
                        x.Begintijd < SelectieEinde &&
                        x.ProjectId == ProjectID &&
                        x.ProductieVW == 1 &&
                        x.ContractVW == 1 // Moet 'Per uur' zijn anders is het onzin
                        ).Sum(x => x.Loonkosten));
                    TotaalRegel = TotaalRegel.Replace("{KPi}", ET.EuroPresentatie(LK, 2));

                    LK = Convert.ToDouble(selxMANDAGEN.Where(x =>
                        x.Begintijd >= SelectieStart &&
                        x.Begintijd < SelectieEinde &&
                        x.ProjectId == ProjectID &&
                        x.ProductieVW == 2 &&
                        x.ContractVW == 1 // Moet 'Per uur' zijn anders is het onzin
                        ).Sum(x => x.Loonkosten));
                    TotaalRegel = TotaalRegel.Replace("{KPe}", ET.EuroPresentatie(LK, 2));

                    // RegelBegin en RegelTotalen toevoegen
                    TotaalRegel = TotaalRegel.Replace("{nr}",
                        _Projecten.Where(x => x.ProjectId == ProjectID).Select(x => x.ProjectNR).FirstOrDefault().ToString() ?? "<Onbekend project>");
                    TotaalRegel = TotaalRegel.Replace("{omschrijving}",
                        _Projecten.Where(x => x.ProjectId == ProjectID).Select(x => x.Naam).FirstOrDefault() ?? "<No Name>");
                    TotaalRegel = TotaalRegel.Replace("{tu}", DagUurToString(UrenT));
                    TotaalRegel = TotaalRegel.Replace("{td}", DagUurToString(DagenT));

                    // Alle waarden zijn gevuld; Voeg regel toe aan HTML pagina
                    // NIEUW als er geen uren staan voor deze vakman, dan ook geen regel aan besteden dus alleen tonen als er uren gemaakt zijn

                    if (UrenT > 0)
                    {
                        // Periode toevoegen
                        mindag = _VanTotDatums.Where(x =>
                                x.Datum >= SelectieStart &&
                                x.Datum < SelectieEinde &&
                                x.ProjectId == ProjectID
                                ).Select(x => x.Datum).Min().ToShortDateString();
                        maxdag = _VanTotDatums.Where(x =>
                                x.Datum >= SelectieStart &&
                                x.Datum < SelectieEinde &&
                                x.ProjectId == ProjectID
                                ).Select(x => x.Datum).Max().ToShortDateString();

                        // Steeds per 3 regels van kleur wisselen
                        //TotaalRegel = htmlTabelSubRegel.Replace("ProjectRegel", "ProjectRegelColor" + ((regelnummer++ % 6) / 3).ToString());
                        //records += ET.HtmlFormat(TotaalRegel, TotalenStringxx(RegelStrings, DienstBetrekkingT)); Rows++;
                    }
                    TotaalRegel = TotaalRegel.Replace("{van}", mindag);
                    TotaalRegel = TotaalRegel.Replace("{tot}", maxdag);

                    // Alle waarden zijn gevuld; Voeg regel toe aan HTML pagina
                    if (UrenT > 0)
                    {
                        records += TotaalRegel; Rows++;
                    }

                } // Next Project

                // Nodig ivm eerste paar subregels bij kopregel op één pagina houden: 
                // Pas Rowspan aan indien er minder subregels bij elkaar te houden zijn dan in de rowspan is aangegeven
                if (Rows < RowSpan)
                    records = ET.SetRowSpan(records, RowSpan, Rows);

                // bij de 1e lus was de periode ingesteld op totaalperiode, vanaf nu pakken we de weekperiodes
                if (WeekIndex < WeekStart.Count())
                {
                    SelectieStart = WeekStart[WeekIndex];
                    SelectieEinde = WeekEinde[WeekIndex];
                    if (regelSamenvatting.ToLower().Contains("totaal")) DIKKESTREEP = true;
                    regelSamenvatting = "Week " + ET.Weeknummer(WeekStart[WeekIndex], true);
                }
            } while (++WeekIndex <= WeekStart.Count());


            // Eco PDF eenmaken, vullen en tonen
            string FilledTable = htmlTabel.Replace("{tabelregels}", records);
            ET.MakePdf(FilledTable, LijstGegevens);

        }
        internal void Maak_Lijst(DateTime pStartDatum, DateTime pEindDatum, List <PoortViewMandagen> selxMANDAGEN, List <allArbeidsRelaty> _AllArbeidsrelaties, List <PoortViewRegistratiebevoegd> _AllProjectleiders, List <PoortViewProject> _AllProjecten, List <PoortViewBedrijf> _AllBedrijven, List <PoortViewVakman> _AllVakmannen, EvoTools.HeaderFooter LijstGegevens)
        {
            string tabellen = string.Empty;
            // Bepaal start-maandag
            // Let op: Pak de HELE periode, niet slechts de keuze in de UI (Met showall wordt de periode automatisch uitgebreid!)
            DateTime pAllMinDatum = selxMANDAGEN.Select(x => x.Begintijd.Date).Min(); if (pStartDatum < pAllMinDatum)
            {
                pAllMinDatum = pStartDatum;
            }
            DateTime pAllMaxDatum = selxMANDAGEN.Select(x => x.Begintijd.Date).Max(); if (pEindDatum > pAllMaxDatum)
            {
                pAllMaxDatum = pEindDatum;
            }

            // Bepaal de maandag van de startweek
            //DateTime Maandag = pAllMinDatum;
            // We willen gewoon alle weken zien, ook de weken voorafgaande aan de eerste week met echte data dus pak pStartdatum
            DateTime Maandag = pAllMinDatum;

            while (Maandag.DayOfWeek != DayOfWeek.Monday)
            {
                Maandag = Maandag.AddDays(-1);
            }

            /*
             * Verzamel nu per project, per week de nodige data
             * */

            // Per Project
            string tabel = string.Empty;

            records = string.Empty;
            var ProjectIDs = selxMANDAGEN
                             .OrderBy(x => x.project_NR)
                             .Select(x => x.project_NR)
                             .Distinct().ToList();
            bool FirstPage = true;

            foreach (var DitProject in _AllProjecten.Where(y => ProjectIDs.Contains(y.ProjectNR)))
            {
                // Bepaal weken voor dit project
                Bepaal_Projectweken(DitProject.ProjectId, Maandag, selxMANDAGEN, pAllMaxDatum);

                // Bereken nu alvast totaal aantal detailregels voor dit project
                DetailregelsLeft = selxMANDAGEN.Where(x =>
                                                      x.ProjectId == DitProject.ProjectId)
                                   .Select(x => new { VK = x.VakmanId, Week = ET.weeknummerNEW(x.Begintijd, false) }).Distinct().ToList().Count();

                // Algemene Projectgegevens (Nieuwe tabel)
                tabel = ProjectTabel;
                if (FirstPage)
                {
                    tabel     = tabel.Replace("TableOnNewPage", "TableOnSamePage");
                    FirstPage = false;
                }
                tabel = tabel.Replace("{Bestandscode}", LijstGegevens.LijstCode);
                string WeekS = ET.weeknummerNEW(pAllMinDatum, true);
                string WeekE = ET.weeknummerNEW(pAllMaxDatum, true);
                tabel = tabel.Replace("{Week}", WeekS + (WeekS == WeekE ? "" : " tot en met " + WeekE));
                tabel = tabel.Replace("{Periode}", string.Format("{0} - {1}", pAllMinDatum.ToLongDateString(), pAllMaxDatum.ToLongDateString()));
                tabel = tabel.Replace("{Projectnummer}", DitProject.ProjectNR.ToString());
                string __Opdrachtgever = (from og in _AllBedrijven
                                          where og.bedrijf_nr == DitProject.BedrijfVW
                                          select og.naam).FirstOrDefault() ?? "{Onbekend}";
                // Opdrachtger / Aannemer (aannemer = 'Select AannwmerVW, anders gelijk aan opdrachtgever)
                tabel = tabel.Replace("{Opdrachtgever}", __Opdrachtgever);
                if (DitProject.AannemerVW == DitProject.BedrijfVW || DitProject.AannemerVW == null)
                {
                    tabel = tabel.Replace("{Aannemer}", __Opdrachtgever);
                }
                else
                {
                    tabel = tabel.Replace("{Aannemer}", (from og in _AllBedrijven
                                                         where og.bedrijf_nr == DitProject.AannemerVW
                                                         select og.naam).FirstOrDefault() ?? "{Onbekend}");
                }

                tabel = tabel.Replace("{Projectnaam}", DitProject.Naam);
                tabel = tabel.Replace("{Projectlocatie}", DitProject.plaats);
                tabel = tabel.Replace("{Projectstraat}", DitProject.bouw_straat);

                var UitvoerdersIDsOpDitPorject = selxMANDAGEN.Where(x =>
                                                                    x.project_NR == DitProject.ProjectNR)
                                                 .Select(x => x.ProjectleiderId).Distinct().ToList();
                var UitvoerdersOpDitPorject = selxMANDAGEN.Where(x =>
                                                                 x.ProjectId == DitProject.ProjectNR)
                                              .Select(x => x.ProjectleiderId).Distinct().ToList();
                string Uitvoerders = string.Empty;
                foreach (var uitv in _AllProjectleiders.Where(x => UitvoerdersIDsOpDitPorject.Contains(x.ProjectleiderId ?? -1)))
                {
                    Uitvoerders += (Uitvoerders == string.Empty ? "" : " / ");
                    Uitvoerders += uitv.Gebruikersnaam;
                }
                tabel = tabel.Replace("{Projectleider}", Uitvoerders);


                // ProjectTotaal hele periode (en gedetailleerd per vakman)
                records = string.Empty;

                // NIEUW voer totaalperiode-overzicht alleen uit als de periode meer dan twee weken beslaat.
                // Anders heeft totaaltelling zo weing nut!
                DateTime mindag = selxMANDAGEN.Where(x => x.ProjectId == DitProject.ProjectId).Select(x => x.Begintijd).Min();
                DateTime maxdag = selxMANDAGEN.Where(x => x.ProjectId == DitProject.ProjectId).Select(x => x.Begintijd).Max();
                if (ET.weeknummerNEW(mindag, true) != ET.weeknummerNEW(maxdag, true))
                {
                    records += vul_TotaalRegel(selxMANDAGEN, DitProject);
                    // En nu uitgesplitst per vakman
                    foreach (var DezeVakman in selxMANDAGEN.Where(x =>
                                                                  x.ProjectId == DitProject.ProjectId)
                             .Select(x => new
                    {
                        x.VakmanId,
                        _Ketenpartner = (x.KetenpartnerVW == 1 ? _AllArbeidsrelaties.Where(z => z.ArbeidsRelatieID == x.ArbeidsrelatieVW).Select(z => z.ArbeidsRelatieNaam).FirstOrDefault() : "Extern"),
                        _Vakman = _AllVakmannen.Where(y => y.VakmanId == x.VakmanId).FirstOrDefault()
                    }).Distinct().ToList()
                             .OrderBy(x => x._Vakman.Naam))
                    {
                        records += Vul_DetailRegel(selxMANDAGEN, DitProject, DezeVakman._Ketenpartner, DezeVakman._Vakman);
                    }
                }


                // ProjectTotaal per week (en detailregels uitgesplitst per Vakman)
                for (int i = 0; i < WeekStart.Count(); i++)
                {
                    Volgnummer = 1;
                    DateTime _StartTijd = WeekStart[i]; DateTime _EindeTijd = WeekEinde[i];
                    records += Vul_TotaalRegel(selxMANDAGEN, DitProject, _StartTijd, _EindeTijd);

                    // En nu uitgesplitst per vakman
                    foreach (var DezeVakman in selxMANDAGEN.Where(x =>
                                                                  x.Begintijd >= _StartTijd &&
                                                                  x.Begintijd < _EindeTijd &&
                                                                  x.ProjectId == DitProject.ProjectId)
                             .Select(x => new
                    {
                        x.VakmanId,
                        _Ketenpartner = (x.KetenpartnerVW == 1 ? _AllArbeidsrelaties.Where(z => z.ArbeidsRelatieID == x.ArbeidsrelatieVW).Select(z => z.ArbeidsRelatieNaam).FirstOrDefault(): "Extern"),
                        _Vakman = _AllVakmannen.Where(y => y.VakmanId == x.VakmanId).FirstOrDefault()
                    }).Distinct().ToList()
                             .OrderBy(x => x._Vakman.Naam))
                    {
                        records += Vul_DetailRegel(selxMANDAGEN, DitProject, DezeVakman._Ketenpartner, DezeVakman._Vakman, _StartTijd, _EindeTijd);
                    }
                } // Week
                tabel     = tabel.Replace("<!-- /TABELREGELS -->", records);
                tabellen += tabel;
            } // Project



            // Maak PDF aan volgens NIEUWE METHODE
            string test = HTMLTotaal.Replace("<!-- /PROJECTTABEL -->", tabellen);

            ET.MakePdf(test, LijstGegevens, false, 0);

            //ET.MakePdf(HTMLTotaal.Replace("<!-- /TABELREGELS -->", records), LijstGegevens, false);
        }