Our state of the art Gantt chart


Post by revill »

Hi Alex,
I was able to find the issue in the meantime. It was related to the dates which for some segments were not in the range of the project and were causing the issue. Right now when I'm filtering out the out-of-range segments, they are displayed properly.

However, there is another thing. Not all of the needed segments are displayed. I have two types of segments:
-Events that last only one day
-Phases, which last more than one day

When I'm displaying phases and events it generates only part of the segment arrays. For example:
Image
Here should be displayed 4 segments, but we can see only one phase and one event. Except for one row, where there is no phase, so all 3 event segments are displayed properly.

If I remove all phases it displays usually all event segments:
Image
Except for the second row, where the first segment, which should be placed at the beginning of the Project should be displayed, as it is in other rows. But it's created in the same way as other ones.

I have noticed also two things:
-Task end date is set as the end date for the last segment, not the end date specified for the whole Task in the field projectEndDate.
Image

  • When I'm zooming in, the one-day events are displayed on the whole width of the Task:
    Image

Could you kindly help me with finding the solution for those issues?

Here is my code:

export default class Gantt_component extends LightningElement {
    projects;
    error;
    hideCountryColumn = true;
    hideFullSiteName = true;
    hideProjectTemplate = true;
    hideGCBudgetCodeCol = true;
    hideConstructionBudgetCol = true;
    hideProjectStatusCol = true;
    configurationList = [];
    currentConfigurationUsed;
    currentconfigPhasesAndEvents;
    configurationNames = [];
    mapOfConfigurationsByname = new Map();

@wire(getObjectInfo, { objectApiName: PHASE_EVENT_CONFIG_OBJECT })
phaseEventObjectInfo;

get recordTypeId() {
    // Returns a map of record type Ids 
    const rtis = this.phaseEventObjectInfo.data.recordTypeInfos;
    console.log('recordTypeId map : ',rtis );
    return Object.keys(rtis).find(rti => rtis[rti].name === 'Phase');
}


renderedCallback() {
    if (this.bryntumInitialized) {
        return;
    }
    this.bryntumInitialized = true;

    Promise.all([
        loadScript(this, GANTT + "/gantt.lwc.module.js"),
        loadStyle(this, GANTT + "/gantt.stockholm.css")
    ])
        .then(() => {
            this.handleConfigurations();
            this.handleProjectLoad();
        })
        .catch(error => {
            this.dispatchEvent(
                new ShowToastEvent({
                    title: "Error loading Bryntum Gantt",
                    message: error,
                    variant: "error"
                })
            );
        });
}

createGantt(tasks, startDate) {
    console.log('Tasks ', tasks);
    const GanttToolbar = GanttToolbarMixin(bryntum.gantt.Toolbar);
    const project = new bryntum.gantt.ProjectModel({
        calendar: data.project.calendar,
        tasksData: tasks
    });
        
    let columns = [
        { type: "name", width: 250 },
        { type: "startdate", field : 'startDate', format : 'YYYY-MM-DD'},
        { type: "enddate",  field : 'projectEndDate', format : 'YYYY-MM-DD'},
        { text  : "country", hidden : false, field : 'Country' },
        { text  : "Full Site Name", hidden : this.hideFullSiteName,  field : 'FullSiteName'},
        { text  : "Project Template" , hidden : this.hideProjectTemplate, field : 'ProjectTemplate'},
        { text  : "GC Budget Code", hidden : this.hideGCBudgetCodeCol, field : 'GCBudgetCode'},
        { text  : "Construction Budet Code", hidden : this.hideConstructionBudgetCol, field : 'ConstructionBudget'},
        { text  : "Project Status" , hidden : this.hideProjectStatusCol, field : 'ProjectStatus' },
        { type: "addnew" }
    ];

    const gantt = new bryntum.gantt.Gantt({
        project,
        appendTo: this.template.querySelector(".container"),
        taskRenderer({ taskRecord }) {
            // Display segment names
            if (taskRecord.isEventSegment) {
                return bryntum.gantt.StringHelper.encodeHtml(taskRecord.name);
            }

            return '';
        },
        columns: columns,
        subGridConfigs: {
            locked: {
                flex: 3
            },
            normal: {
                flex: 4
            }
        },
        tbar : [
            {
                type : 'button',
                text : '<<',
                onClick : (event) => {
                    const collapseEvent = event.source.up ('gantt');
                    collapseEvent.shiftPrevious(); 
                }
            },
            {
                type : 'button',
                text : '>>',
                onClick : (event) => {
                    const collapseEvent = event.source.up ('gantt');
                    collapseEvent.shiftNext(); 
                }
            },
            {
                type : 'button',
                text : 'Zoom to fit',
                onClick : (event) => {
                    const collapseEvent = event.source.up ('gantt');
                    collapseEvent.zoomToFit(); 
                }
            },
            {
                type : 'button',
                text : '+',
                onClick : (event) => {
                    const collapseEvent = event.source.up ('gantt');
                    collapseEvent.zoomIn(); 
                }
            },{
                type : 'button',
                text : '-',
                onClick : (event) => {
                    const collapseEvent = event.source.up ('gantt');
                    collapseEvent.zoomOut(); 
                }
            }                   
        ],
        columnLines: false,
        features: {
            cellEdit       : false,
            taskEdit       : false,
            taskMenu       : false,
            taskDrag       : false,
            taskResize     : false,
            taskDragCreate : false,
            rollups: {
                disabled: true
            },
            baselines: {
                disabled: true
            },
            progressLine: {
                disabled: true,
                statusDate: new Date(2019, 0, 25)
            },
            criticalPaths : false,
            filter: true,
            dependencyEdit: true,
            timeRanges: {
                showCurrentTimeLine: true
            },
            labels: {
                left: {
                    field: "name",
                    editor: {
                        type: "textfield"
                    }
                }
            }
        }
    });

    project.commitAsync().then(() => {
        // console.timeEnd("load data");
        const stm = gantt.project.stm;

        stm.enable();
        stm.autoRecord = true;

        // let's track scheduling conflicts happened
        project.on("schedulingconflict", context => {
            // show notification to user
            bryntum.gantt.Toast.show(
                "Scheduling conflict has happened ..recent changes were reverted"
            );
            // as the conflict resolution approach let's simply cancel the changes
            context.continueWithResolutionResult(
                bryntum.gantt.EffectResolutionResult.Cancel
            );
        });
    });
}

handleProjectLoad() {
    getProjects()
    .then((result) => {
        let phases = [];
        let events = [];

        this.currentconfigPhasesAndEvents.forEach (element => {
            if (element.RecordTypeId == this.recordTypeId) {
                phases.push (element);
            } else {
                events.push (element);
            }
        });

        this.projects = result;
        this.error = undefined;
            let projectTasks = new Array;
            let idNumber = 1;
            let earliestStartDate = new Date();
            this.projects.forEach(element => { 
                let projectStartDate =  element.sitetracker__Project_Start_Date_A__c == undefined ? element.sitetracker__Project_Start_Date_F__c : element.sitetracker__Project_Start_Date_A__c;
                let projectEndDate = element.Start_of_construction_A__c == undefined ? element.Start_of_construction_F__c : element.Start_of_construction_A__c;
                if (projectEndDate != undefined && projectEndDate != null && projectStartDate != undefined && projectStartDate < projectEndDate) {
                    let segments = [];
                    this.createPhaseSegments(phases, element, projectStartDate, projectEndDate, segments);
                    this.createEventSegments(events, element, projectStartDate, projectEndDate, segments);
                    let projectRow = this.createProjectRow(element, projectStartDate, projectEndDate, segments, earliestStartDate, idNumber);
                    projectTasks.push(projectRow);
                    idNumber++;
                }
            });
            this.createGantt(projectTasks, earliestStartDate);
    })
    .catch((error) => {
        this.error = error;
        console.log('ERROR: ', error);
        this.projects = undefined;
    });
};

createProjectRow(element, projectStartDate, projectEndDate, segments, earliestStartDate, idNumber) {
    let parsedDate = new Date(projectStartDate);
    let parsedEndDate = new Date(projectEndDate);
    let projectRow;
    let isoDate = parsedDate.toISOString().split('T')[0];
    
    if (parsedDate.getDate() =='1' && parsedDate.getMonth() == '0' && parsedDate.getFullYear() == '1900') {
        projectRow = {"id" : idNumber, "startDate" : isoDate, "manuallyScheduled": true, "segments" : segments, "name" : element.sitetracker__Site__r.Name, "endDate" : projectEndDate, "salesforceId" : element.Id, "ProjectTemplate" : element.sitetracker__Project_Template__c, "Country" : element.Country__c, "ProjectTemplate" : element.sitetracker__Project_Template__c, "GCBudgetCode" : element.GC_Budget_Code__c, "ConstructionBudget" : element.Construction_Budget_Code__c, "ProjectStatus" : element.sitetracker__Project_Status__c};
    } else {
        if (parsedDate < earliestStartDate) {
            earliestStartDate = parsedDate;
        }
        projectRow = {"id" : idNumber, "manuallyScheduled": true, "startDate" : String (projectStartDate), "projectEndDate" : String (projectEndDate), "segments" : segments, "name" : element.sitetracker__Site__r.Name, "salesforceId" : element.Id, "ProjectTemplate" : element.sitetracker__Project_Template__c,  "Country" : element.Country__c, "ProjectTemplate" : element.sitetracker__Project_Template__c, "GCBudgetCode" : element.GC_Budget_Code__c, "ConstructionBudget" : element.Construction_Budget_Code__c, "ProjectStatus" : element.sitetracker__Project_Status__c};
    }
    return projectRow;
}

createEventSegments (events,element, projectStartDate, projectEndDate, eventSegments) {
    if (!element) {return [];}

    for (const event of events) {
        let forecastFieldStartField = this.checkActualForecastField(event.Start_Date_Field__c,element);
        let eventStartDate = element[event.Start_Date_Field__c] == undefined ? element[forecastFieldStartField] : element[event.Start_Date_Field__c];
        if (eventStartDate != undefined && eventStartDate != null && (eventStartDate >= projectStartDate && eventStartDate < projectEndDate)) {
            let parsedDate = new Date(eventStartDate);
            if (parsedDate.getMonth() == '0' && parsedDate.getDate() == '1' && parsedDate.getFullYear() == '1900') {
                continue;
            }
            let newstartEventDate = new Date(eventStartDate);
            let endEventDate = new Date(eventStartDate);
            endEventDate.setDate(newstartEventDate.getDate() + 1);
            let startDateString = newstartEventDate.toISOString().split('T')[0];
            let endDateString = endEventDate.toISOString().split('T')[0];
            console.log('event startDateString',startDateString);
            console.log('event endDateString',endDateString);

            eventSegments.push({"name" : event.Name, "startDate" : String(startDateString), "endDate" : String(endDateString)});
        }
    }
}

createPhaseSegments (phases, element, projectStartDate, projectEndDate, phaseSegments) {
    if (!element) {return [];}

    for ( const phase of phases) {
        if ((phase.Name === 'Grid Connection' || phase.Name === 'Building Permit') && (!element.Grid_Connection_required__c || !element.Building_Permit_required__c) ) {
            continue;
        }
        let forecastFieldStartField = this.checkActualForecastField(phase.Start_Date_Field__c,element);
        let forecastFieldEndField = this.checkActualForecastField(phase.End_Date_Field__c,element);
        let phaseStartDate = element[phase.Start_Date_Field__c] == undefined ? element[forecastFieldStartField] : element[phase.Start_Date_Field__c];
        let phaseEndDate = element[phase.End_Date_Field__c] == undefined ? element[forecastFieldEndField] : element[phase.End_Date_Field__c];

        if (((phaseEndDate != undefined && phaseEndDate != null) || (phaseStartDate != undefined && phaseStartDate != null)) && (phaseStartDate >= projectStartDate && phaseEndDate <= projectEndDate && phaseStartDate < projectEndDate && phaseEndDate > projectStartDate)) {
            console.log('phase if ');
            let parsedDate = new Date(phaseStartDate);
            if (parsedDate.getMonth() == '0' && parsedDate.getDate() == '1' && parsedDate.getFullYear() == '1900') {
                continue;
            }
            let phaseEDate = new Date(phaseEndDate);
            let phaseSDate = new Date(phaseStartDate);

            let endDateString = phaseEDate.toISOString().split('T')[0];
            let startDateString = phaseSDate.toISOString().split('T')[0];
            console.log('phase startDateString',startDateString);
            console.log('phase endDateString',endDateString);
            console.log('phase name',phase.Name);
            phaseSegments.push({ "name" : phase.Name, "startDate" :phaseStartDate, "endDate" : phaseEndDate});

            //displays phase, but not displays all events
            // phaseSegments.push({ "name" : phase.Name, "startDate" :phaseStartDate, "endDate" : phaseEndDate});
            // phaseSegments.push({ "name" : phase.Name, "startDate" :String(phaseStartDate), "endDate" : String(phaseEndDate)});
            // phaseSegments.push({ "name" : phase.Name, "startDate" :String(phaseSDate), "endDate" : String(phaseEDate)});
            // phaseSegments.push({ "name" : phase.Name, "startDate" :String(phaseSDate.toISOString()), "endDate" : String(phaseEDate.toISOString())}); 
            // phaseSegments.push({ "name" : phase.Name, "startDate" :String(startDateString), "endDate" : String(endDateString)});
        }
    }
}

checkActualForecastField (fieldActual, object) {
    const sufix = 'F__c';
    if (fieldActual != null && fieldActual != undefined && object != null && object != undefined) {
        fieldActual += '';
        let fieldNameWithoutSufix = fieldActual.substring(0, fieldActual.length-4);
        console.log('fild name without sufx ', fieldNameWithoutSufix);
        return fieldNameWithoutSufix.concat(sufix);
    }
};

handleConfigurations() {
    let configwrapper;
    getGanttChartConfigurationsWrapper()
    .then((configWrapper) => {
        let mainConfigObjects = configWrapper.configurations;
        this.configurationList = configWrapper.configurations;
        if (this.configurationNames?.length === 0 || this.mapOfConfigurationsByname.length === 0) {
            configWrapper.configurations.forEach(element => {    
                if (element?.Name != undefined) {
                    this.configurationNames.push(element.Name);
                    this.mapOfConfigurationsByname.set(element.Name, element);
                }
            })
            this.currentConfigurationUsed = mainConfigObjects[0];   
        }

        this.currentconfigPhasesAndEvents = configWrapper.phaseEvents;
        let fieldsToBeDisplayed = this.currentConfigurationUsed.Display_Fields__c;
        let groupByField = this.currentConfigurationUsed.Grouping_By__c;
    })
    .catch((error) => {
        console.log('error: ', error);
        this.error = error;
        this.configWrapper = undefined;
    });
}
}

Post by alex.l »

Hi revill,

Please attach JSON example also, we should be able to run and debug the code, it's card to find the problem only by visual check.

All the best,
Alex


Post by revill »

Hi Alex,
sure. Here is JSON with the data used:

[{"id":1,"manuallyScheduled":true,"startDate":"2021-03-11","projectEndDate":"2023-04-09","segments":[{"name":"Test Phase","startDate":"2022-01-24","endDate":"2022-03-25"},{"name":"Test Event","startDate":"2021-03-11","endDate":"2021-03-12"},{"name":"Contract Signed","startDate":"2021-10-22","endDate":"2021-10-23"},{"name":"Substation Placement","startDate":"2022-10-15","endDate":"2022-10-16"}],"name":"Diksmuide Ijzer Noord","salesforceId":"a0i7Q000000ctE4QAI","ProjectTemplate":"New Station","Country":"BEL","ProjectStatus":"Research"},{"id":2,"manuallyScheduled":true,"startDate":"2019-07-08","projectEndDate":"2023-08-01","segments":[{"name":"Test Phase","startDate":"2020-04-03","endDate":"2020-08-11"},{"name":"Location Agreement Signed","startDate":"2020-06-24","endDate":"2020-06-25"},{"name":"Test Event","startDate":"2019-07-08","endDate":"2019-07-09"},{"name":"Substation Placement","startDate":"2023-02-07","endDate":"2023-02-08"}],"name":"Walshoutem Noord","salesforceId":"a0i7Q000000ctEhQAI","ProjectTemplate":"New Station","Country":"BEL","GCBudgetCode":"B2203","ProjectStatus":"Location Agreement"},{"id":3,"manuallyScheduled":true,"startDate":"2021-11-02","projectEndDate":"2023-08-01","segments":[{"name":"Test Phase","startDate":"2022-09-19","endDate":"2022-11-18"},{"name":"Test Event","startDate":"2021-11-02","endDate":"2021-11-03"},{"name":"Contract Signed","startDate":"2022-06-17","endDate":"2022-06-18"},{"name":"Substation Placement","startDate":"2023-02-07","endDate":"2023-02-08"}],"name":"Ringlaan (Jumbo Kuurne)","salesforceId":"a0i7Q000000ctEiQAI","ProjectTemplate":"New Station","Country":"BEL","GCBudgetCode":"B2203","ProjectStatus":"Contracting"},{"id":4,"manuallyScheduled":true,"startDate":"2021-12-07","projectEndDate":"2023-03-14","segments":[{"name":"Test Event","startDate":"2021-12-07","endDate":"2021-12-08"},{"name":"Contract Signed","startDate":"2022-08-03","endDate":"2022-08-04"},{"name":"Substation Placement","startDate":"2022-09-21","endDate":"2022-09-22"}],"name":"Staatsbaan, Halen (McDonalds)","salesforceId":"a0i7Q000000ctEjQAI","ProjectTemplate":"New Station","Country":"BEL","GCBudgetCode":"B2203","ProjectStatus":"Grid Connection"},{"id":5,"manuallyScheduled":true,"startDate":"2016-11-02","projectEndDate":"2019-04-29","segments":[{"name":"Location Agreement Signed","startDate":"2016-11-02","endDate":"2016-11-03"},{"name":"Test Event","startDate":"2016-11-02","endDate":"2016-11-03"}],"name":"Vrijenban","salesforceId":"a0i7Q000000cXdiQAE","ProjectTemplate":"New Station","Country":"NLD","GCBudgetCode":"N/A","ConstructionBudget":"B2104","ProjectStatus":"Complete"},{"id":6,"manuallyScheduled":true,"startDate":"2017-07-21","projectEndDate":"2019-10-21","segments":[{"name":"Location Agreement Signed","startDate":"2017-07-21","endDate":"2017-07-22"},{"name":"Test Event","startDate":"2017-07-21","endDate":"2017-07-22"}],"name":"Hendriksbos","salesforceId":"a0i7Q000000cXdlQAE","ProjectTemplate":"New Station","Country":"NLD","GCBudgetCode":"B1901","ConstructionBudget":"B1903","ProjectStatus":"Complete"},{"id":7,"manuallyScheduled":true,"startDate":"2015-06-10","projectEndDate":"2021-12-08","segments":[{"name":"Location Agreement Signed","startDate":"2015-06-10","endDate":"2015-06-11"},{"name":"Test Event","startDate":"2015-06-10","endDate":"2015-06-11"}],"name":"De Buunderkamp","salesforceId":"a0i7Q000000cXf9QAE","ProjectTemplate":"New Station","Country":"NLD","GCBudgetCode":"B2102","ConstructionBudget":"B2103","ProjectStatus":"Complete"},{"id":8,"manuallyScheduled":true,"startDate":"2019-04-01","projectEndDate":"2020-10-12","segments":[{"name":"Test Phase","startDate":"2020-04-23","endDate":"2020-06-18"},{"name":"Test Event","startDate":"2019-04-01","endDate":"2019-04-02"}],"name":"Lenzburg","salesforceId":"a0i7Q000000cXhOQAU","ProjectTemplate":"New Station","Country":"CHE","GCBudgetCode":"B2001","ConstructionBudget":"B2002","ProjectStatus":"Complete"},{"id":9,"manuallyScheduled":true,"startDate":"2019-03-06","projectEndDate":"2021-10-11","segments":[{"name":"Test Phase","startDate":"2020-07-07","endDate":"2020-10-30"},{"name":"Test Event","startDate":"2019-03-06","endDate":"2019-03-07"}],"name":"Eching","salesforceId":"a0i7Q000000cXiMQAU","ProjectTemplate":"New Station","Country":"DEU","GCBudgetCode":"B2101","ConstructionBudget":"B2102","ProjectStatus":"Complete"},{"id":10,"manuallyScheduled":true,"startDate":"2021-03-11","projectEndDate":"2023-04-09","segments":[{"name":"Test Phase","startDate":"2022-01-24","endDate":"2022-03-25"},{"name":"Test Event","startDate":"2021-03-11","endDate":"2021-03-12"},{"name":"Contract Signed","startDate":"2021-10-22","endDate":"2021-10-23"},{"name":"Substation Placement","startDate":"2022-10-15","endDate":"2022-10-16"}],"name":"Ieper Reigersburg","salesforceId":"a0i7Q000000ctE5QAI","ProjectTemplate":"New Station","Country":"BEL","ProjectStatus":"Research"}]

Post by arcady »

I'm sorry I couldn't run your test case.. too many not existing objects/data it references (like PHASE_EVENT_CONFIG_OBJECT, phaseEventObjectInfo, configWrapper.phaseEvents etc).
Please provide a runnable clean test case that we could investigate.


Post by revill »

Hi Arcady,
sorry for that. Here is a whole code with all data sets, so it should run now properly. Because of the character limit I have to split it into two parts

     /* globals bryntum : true */
import { LightningElement, api, wire } from "lwc";
import { ShowToastEvent } from "lightning/platformShowToastEvent";
import { loadScript, loadStyle } from "lightning/platformResourceLoader";
import GANTT from "@salesforce/resourceUrl/bryntum_gantt";
import GanttToolbarMixin from "./lib/GanttToolbar";
import data from './data/launch-saas'
import getProjects from '@salesforce/apex/GanttChartApexHandler.getProjects';
import getGanttChartConfigurationsWrapper from '@salesforce/apex/GanttChartApexHandler.getGanttChartConfigurationsWrapper'
import { getObjectInfo } from 'lightning/uiObjectInfoApi';
import PHASE_EVENT_CONFIG_OBJECT from '@salesforce/schema/Phase_Event_Gantt_Chart__c';
import { NavigationMixin, CurrentPageReference } from 'lightning/navigation';

export default class Gantt_component extends LightningElement {
    projects = [
        {
           "Id":"a0i7Q000000ctE3QAI",
           "Name":"P-000219",
           "Country__c":"BEL",
           "sitetracker__Project_Status__c":"Research",
           "sitetracker__Project_Template__c":"New Station",
           "sitetracker__Site__c":"a0p7Q000000YWVWQA4",
           "sitetracker__Project_Start_Date_A__c":"2021-03-11",
           "sitetracker__ProjectTemplate__c":"a0h7Q000000c8RFQAY",
           "sitetracker__Project_Manager__c":"0057Q0000055YuGQAU",
           "Architect__c":"0057Q0000055YuHQAU",
           "Construction_Manager__c":"0057Q0000055Yu2QAE",
           "Grid_Connection_required__c":false,
           "Building_Permit_required__c":false,
           "Director_Construction_Management__c":"0057Q0000022O2OQAU",
           "Approve_site_for_research_F__c":"1900-01-01",
           "Pre_permit_application_process__c":true,
           "Approve_site_for_research_A__c":"1900-01-01",
           "Amendments_required__c":false,
           "Site_Visit_CM__c":false,
           "Site_Visit_LD__c":false,
           "Extended_procedure__c":false,
           "Network_Development_Manager__c":"0057Q0000055YuJQAU",
           "Separate_Location_Agreement__c":false,
           "Signing_of_HoT_required__c":false,
           "sitetracker__Site__r":{
              "Name":"Koning Albert I-laan",
              "Id":"a0p7Q000000YWVWQA4"
           }
        },
        {
           "Id":"a0i7Q000000ctE4QAI",
           "Name":"P-000220",
           "Country__c":"BEL",
           "sitetracker__Project_Status__c":"Research",
           "sitetracker__Project_Template__c":"New Station",
           "sitetracker__Site__c":"a0p7Q000000YWYqQAO",
           "sitetracker__Project_Start_Date_A__c":"2021-03-11",
           "Start_of_construction_F__c":"2023-04-09",
           "sitetracker__ProjectTemplate__c":"a0h7Q000000c8RFQAY",
           "sitetracker__Project_Complete_F__c":"2023-06-02",
           "sitetracker__Project_Manager__c":"0057Q0000055YuGQAU",
           "Architect__c":"0057Q0000055YuHQAU",
           "Construction_Manager__c":"0057Q0000055Yu2QAE",
           "Grid_Connection_required__c":false,
           "Building_Permit_required__c":false,
           "Director_Construction_Management__c":"0057Q0000022O2OQAU",
           "Legal_approval_validation_template_F__c":"2021-09-17",
           "Define_Business_case_F__c":"2021-08-24",
           "GPS_survey_F__c":"2021-05-28",
           "Internal_Fastned_Approval_F__c":"2021-09-24",
           "Define_heads_of_terms_F__c":"2021-04-30",
           "Building_Permit_drawings_F__c":"2021-12-27",
           "Sign_energy_supply_contract_F__c":"2022-08-30",
           "Order_metering_F__c":"2022-08-30",
           "Negotiate_terms_with_landlord_F__c":"2021-08-28",
           "Approve_site_for_research_F__c":"1900-01-01",
           "Create_existing_situation_drawing_F__c":"2021-06-11",
           "Make_Final_Execution_Drawings_F__c":"2023-01-25",
           "Approve_GC_budget_F__c":"2022-06-12",
           "Receive_external_reports_F__c":"2021-12-27",
           "Order_substation_F__c":"2022-06-24",
           "Pre_permit_application_process__c":false,
           "Hand_in_final_Building_Permit_F__c":"2022-01-24",
           "Review_of_Execution_Drawings_F__c":"2022-12-28",
           "Hand_in_pre_permit_application_F__c":"2022-01-24",
           "Approve_site_for_research_A__c":"1900-01-01",
           "Concept_CAD_drawing_F__c":"2021-08-10",
           "Make_Execution_Drawings_F__c":"2022-09-08",
           "Check_utilities_F__c":"2021-05-21",
           "Prepare_contracts_F__c":"2021-10-08",
           "Negotiate_location_design_F__c":"2022-04-19",
           "Initial_capex_budget_F__c":"2021-04-24",
           "Amendments_required__c":false,
           "Site_Visit_CM__c":false,
           "Economic_Evaluation_F__c":"2021-04-08",
           "Contract_works_F__c":"2023-02-08",
           "Building_Permit_Approved_F__c":"2022-03-25",
           "Approve_Construction_Budget_F__c":"2022-12-14",
           "Contract_signed_by_all_F__c":"2021-11-05",
           "Sign_Heads_of_Terms_F__c":"2021-10-22",
           "Initial_design_sketch_F__c":"2021-04-24",
           "Receive_GC_contract_F__c":"2022-05-13",
           "All_reports_completed_F__c":"2023-01-28",
           "Contract_drawing_F__c":"2021-09-15",
           "Submit_amendments_to_Building_Permit_F__c":"2022-02-07",
           "Site_Visit_LD__c":false,
           "Opening_of_Site_F__c":"2023-05-12",
           "Generate_drawings_for_GC_request_F__c":"2022-04-08",
           "All_permits_for_construction_receive_F__c":"2023-01-28",
           "Design_Approval_Substation_F__c":"2022-08-16",
           "Place_substation_F__c":"2022-10-15",
           "Internal_Design_Approval_F__c":"2021-08-25",
           "Contract_signed_by_Fastned_F__c":"2021-10-22",
           "Extended_procedure__c":false,
           "Sign_GC_contract_F__c":"2022-06-17",
           "Request_GC_contract_F__c":"2022-04-15",
           "Check_zoning_F__c":"2021-05-21",
           "Energize_grid_connection_F__c":"2022-11-14",
           "Physical_evaluation_F__c":"2021-04-24",
           "Request_for_Quotations_for_works_F__c":"2022-10-06",
           "Determine_BP_Scope_F__c":"2021-11-12",
           "Determine_scope_Execution_Drawing_F__c":"2022-08-11",
           "Revise_BP_drawings_F__c":"2022-01-17",
           "Network_Development_Manager__c":"0057Q0000055YuJQAU",
           "Report_deviations_F__c":"2021-10-15",
           "Separate_Location_Agreement__c":false,
           "Signing_of_HoT_required__c":false,
           "Update_capex_budget_F__c":"2021-08-24",
           "sitetracker__Site__r":{
              "Name":"Diksmuide Ijzer Noord",
              "Id":"a0p7Q000000YWYqQAO"
           }
        },
        {
           "Id":"a0i7Q000000ctEhQAI",
           "Name":"P-000242",
           "Country__c":"BEL",
           "sitetracker__Project_Status__c":"Location Agreement",
           "sitetracker__Project_Template__c":"New Station",
           "GC_Budget_Code__c":"B2203",
           "sitetracker__Site__c":"a0p7Q000000YWmYQAW",
           "sitetracker__Project_Start_Date_A__c":"2019-07-08",
           "Start_of_construction_F__c":"2023-08-01",
           "sitetracker__ProjectTemplate__c":"a0h7Q000000c8RFQAY",
           "sitetracker__Project_Complete_F__c":"2023-09-26",
           "sitetracker__Project_Manager__c":"0057Q0000055YuGQAU",
           "Construction_Manager__c":"0057Q0000055Yu2QAE",
           "Grid_Connection_required__c":false,
           "Building_Permit_required__c":false,
           "Director_Construction_Management__c":"0057Q0000022O2OQAU",
           "GC_Budget_Value__c":560632.12,
           "Legal_approval_validation_template_A__c":"1900-01-01",
           "Legal_approval_validation_template_F__c":"1900-01-01",
           "Define_Business_case_F__c":"1900-01-01",
           "GPS_survey_F__c":"2020-01-24",
           "Sign_GC_contract_A__c":"2022-10-10",
           "Internal_Fastned_Approval_F__c":"1900-01-01",
           "Define_heads_of_terms_F__c":"1900-01-01",
           "Building_Permit_drawings_F__c":"1900-01-01",
           "Sign_energy_supply_contract_F__c":"2022-12-23",
           "Order_metering_F__c":"2022-12-23",
           "Negotiate_terms_with_landlord_F__c":"1900-01-01",
           "Approve_site_for_research_F__c":"1900-01-01",
           "Physical_evaluation_A__c":"1900-01-01",
           "Hand_in_final_Building_Permit_A__c":"2020-04-03",
           "Create_existing_situation_drawing_F__c":"2020-02-07",
           "Make_Final_Execution_Drawings_F__c":"2023-05-19",
           "Building_Permit_drawings_A__c":"1900-01-01",
           "Define_Business_case_A__c":"1900-01-01",
           "Approve_GC_budget_F__c":"2020-10-29",
           "Receive_external_reports_F__c":"1900-01-01",
           "Order_substation_F__c":"2022-05-31",
           "Pre_permit_application_process__c":false,
           "Generate_drawings_for_GC_request_A__c":"1900-01-01",
           "Review_of_Execution_Drawings_F__c":"2023-04-21",
           "Negotiate_terms_with_landlord_A__c":"1900-01-01",
           "Location_Agreement_signed_by_all_F__c":"2020-06-24",
           "Hand_in_pre_permit_application_F__c":"2020-09-11",
           "Approve_site_for_research_A__c":"1900-01-01",
           "Concept_CAD_drawing_F__c":"2020-04-07",
           "Make_Execution_Drawings_F__c":"2022-08-12",
           "Check_utilities_F__c":"2020-01-17",
           "Prepare_contracts_F__c":"1900-01-01",
           "Negotiate_location_design_F__c":"2020-06-10",
           "Prepare_contracts_A__c":"1900-01-01",
           "Initial_capex_budget_F__c":"1900-01-01",
           "Define_heads_of_terms_A__c":"1900-01-01",
           "Amendments_required__c":false,
           "Economic_Evaluation_A__c":"1900-01-01",
           "Initial_capex_budget_A__c":"1900-01-01",
           "Approve_GC_budget_A__c":"2022-05-17",
           "Receive_GC_contract_A__c":"2022-09-16",
           "Site_Visit_CM__c":true,
           "Initial_design_sketch_A__c":"1900-01-01",
           "Economic_Evaluation_F__c":"1900-01-01",
           "Contract_works_F__c":"2023-06-02",
           "Approve_Construction_Budget_F__c":"2023-04-08",
           "Sign_Heads_of_Terms_F__c":"2020-02-20",
           "Initial_design_sketch_F__c":"1900-01-01",
           "Receive_GC_contract_F__c":"2020-09-29",
           "All_reports_completed_F__c":"2023-05-23",
           "Contract_drawing_F__c":"2020-05-13",
           "Submit_amendments_to_Building_Permit_F__c":"2020-04-17",
           "Building_Permit_Approved_A__c":"2020-08-11",
           "Site_Visit_LD__c":true,
           "Contract_signed_by_Fastned_A__c":"1900-01-01",
           "Request_GC_contract_A__c":"1900-01-01",
           "Opening_of_Site_F__c":"2023-09-05",
           "Generate_drawings_for_GC_request_F__c":"1900-01-01",
           "All_permits_for_construction_receive_F__c":"2023-05-23",
           "Design_Approval_Substation_F__c":"2022-12-09",
           "Place_substation_F__c":"2023-02-07",
           "Internal_Design_Approval_F__c":"2020-04-22",
           "Contract_signed_by_Fastned_F__c":"1900-01-01",
           "Extended_procedure__c":false,
           "Internal_Fastned_Approval_A__c":"1900-01-01",
           "Sign_GC_contract_F__c":"2022-05-24",
           "Receive_external_reports_A__c":"1900-01-01",
           "Request_GC_contract_F__c":"1900-01-01",
           "Check_zoning_F__c":"2020-01-17",
           "Energize_grid_connection_F__c":"2023-03-09",
           "Physical_evaluation_F__c":"1900-01-01",
           "Contract_signed_by_all_A__c":"2019-12-28",
           "Request_for_Quotations_for_works_F__c":"2022-09-09",
           "Determine_BP_Scope_F__c":"1900-01-01",
           "Determine_BP_Scope_A__c":"1900-01-01",
           "Determine_scope_Execution_Drawing_F__c":"2022-07-16",
           "Revise_BP_drawings_F__c":"1900-01-01",
           "Revise_BP_drawings_A__c":"1900-01-01",
           "Network_Development_Manager__c":"0057Q0000055YuJQAU",
           "Ordered_Capacity__c":1600,
           "Report_deviations_A__c":"1900-01-01",
           "Report_deviations_F__c":"1900-01-01",
           "Requested_Capacity__c":1600,
           "Separate_Location_Agreement__c":true,
           "Signing_of_HoT_required__c":false,
           "Update_capex_budget_A__c":"1900-01-01",
           "Update_capex_budget_F__c":"1900-01-01",
           "Grid_Connection__c":"a2R7Q0000000snWUAQ",
           "sitetracker__Site__r":{
              "Name":"Walshoutem Noord",
              "Id":"a0p7Q000000YWmYQAW"
           }
        },
        {
           "Id":"a0i7Q000000ctEiQAI",
           "Name":"P-000243",
           "Country__c":"BEL",
           "sitetracker__Project_Status__c":"Contracting",
           "sitetracker__Project_Template__c":"New Station",
           "GC_Budget_Code__c":"B2203",
           "sitetracker__Site__c":"a0p7Q000000YWllQAG",
           "sitetracker__Project_Start_Date_A__c":"2021-11-02",
           "Start_of_construction_F__c":"2023-08-01",
           "sitetracker__ProjectTemplate__c":"a0h7Q000000c8RFQAY",
           "sitetracker__Project_Complete_F__c":"2023-09-26",
           "sitetracker__Project_Manager__c":"0057Q0000055YuGQAU",
           "Construction_Manager__c":"0057Q0000055Yu2QAE",
           "Grid_Connection_required__c":false,
           "Building_Permit_required__c":false,
           "Director_Construction_Management__c":"0057Q0000022O2OQAU",
           "GC_Budget_Value__c":134000,
           "Legal_approval_validation_template_A__c":"1900-01-01",
           "Legal_approval_validation_template_F__c":"1900-01-01",
           "Define_Business_case_F__c":"1900-01-01",
           "GPS_survey_F__c":"1900-01-01",
           "Sign_GC_contract_A__c":"2022-10-10",
           "Internal_Fastned_Approval_F__c":"1900-01-01",
           "Define_heads_of_terms_F__c":"1900-01-01",
           "Building_Permit_drawings_F__c":"2022-08-22",
           "Sign_energy_supply_contract_F__c":"2022-12-23",
           "Order_metering_F__c":"2022-12-23",
           "Negotiate_terms_with_landlord_F__c":"1900-01-01",
           "Approve_site_for_research_F__c":"1900-01-01",
           "Physical_evaluation_A__c":"1900-01-01",
           "Create_existing_situation_drawing_F__c":"1900-01-01",
           "Make_Final_Execution_Drawings_F__c":"2023-05-19",
           "Create_existing_situation_drawing_A__c":"1900-01-01",
           "Define_Business_case_A__c":"1900-01-01",
           "Approve_GC_budget_F__c":"2023-02-05",
           "Receive_external_reports_F__c":"2022-08-22",
           "Sign_energy_supply_contract_A__c":"2022-10-11",
           "Order_substation_F__c":"2022-05-31",
           "Pre_permit_application_process__c":false,
           "Concept_CAD_drawing_A__c":"1900-01-01",
           "Generate_drawings_for_GC_request_A__c":"1900-01-01",
           "Hand_in_final_Building_Permit_F__c":"2022-09-19",
           "Review_of_Execution_Drawings_F__c":"2023-04-21",
           "Negotiate_terms_with_landlord_A__c":"1900-01-01",
           "Hand_in_pre_permit_application_F__c":"2022-09-19",
           "Approve_site_for_research_A__c":"1900-01-01",
           "Concept_CAD_drawing_F__c":"1900-01-01",
           "Make_Execution_Drawings_F__c":"2022-08-12",
           "Check_utilities_F__c":"1900-01-01",
           "Prepare_contracts_F__c":"2022-06-03",
           "Negotiate_location_design_F__c":"2022-12-13",
           "Initial_capex_budget_F__c":"1900-01-01",
           "Define_heads_of_terms_A__c":"1900-01-01",
           "Amendments_required__c":false,
           "Economic_Evaluation_A__c":"1900-01-01",
           "Initial_capex_budget_A__c":"1900-01-01",
           "Approve_GC_budget_A__c":"2022-05-17",
           "Receive_GC_contract_A__c":"2022-09-15",
           "Site_Visit_CM__c":false,
           "Contract_drawing_A__c":"1900-01-01",
           "Initial_design_sketch_A__c":"1900-01-01",
           "Check_zoning_A__c":"1900-01-01",
           "Economic_Evaluation_F__c":"1900-01-01",
           "Contract_works_F__c":"2023-06-02",
           "Building_Permit_Approved_F__c":"2022-11-18",
           "Approve_Construction_Budget_F__c":"2023-04-08",
           "Contract_signed_by_all_F__c":"2022-07-01",
           "Sign_Heads_of_Terms_F__c":"2022-06-17",
           "Initial_design_sketch_F__c":"1900-01-01",
           "Receive_GC_contract_F__c":"2022-08-16",
           "All_reports_completed_F__c":"2023-05-23",
           "Contract_drawing_F__c":"1900-01-01",
           "Check_utilities_A__c":"1900-01-01",
           "Submit_amendments_to_Building_Permit_F__c":"2022-10-03",
           "Site_Visit_LD__c":false,
           "Internal_Design_Approval_A__c":"1900-01-01",
           "Request_GC_contract_A__c":"2022-07-19",
           "Opening_of_Site_F__c":"2023-09-05",
           "Generate_drawings_for_GC_request_F__c":"1900-01-01",
           "All_permits_for_construction_receive_F__c":"2023-05-23",
           "Design_Approval_Substation_F__c":"2022-12-09",
           "GPS_survey_A__c":"1900-01-01",
           "Place_substation_F__c":"2023-02-07",
           "Internal_Design_Approval_F__c":"1900-01-01",
           "Contract_signed_by_Fastned_F__c":"2022-06-17",
           "Extended_procedure__c":false,
           "Internal_Fastned_Approval_A__c":"1900-01-01",
           "Sign_GC_contract_F__c":"2022-05-24",
           "Check_zoning_F__c":"1900-01-01",
           "Energize_grid_connection_F__c":"2023-03-09",
           "Physical_evaluation_F__c":"1900-01-01",
           "Request_for_Quotations_for_works_F__c":"2022-09-09",
           "Determine_BP_Scope_F__c":"2022-07-08",
           "Determine_scope_Execution_Drawing_F__c":"2022-07-16",
           "Revise_BP_drawings_F__c":"2022-09-12",
           "Network_Development_Manager__c":"0057Q0000055YuJQAU",
           "Ordered_Capacity__c":1600,
           "Report_deviations_F__c":"2022-06-10",
           "Requested_Capacity__c":1600,
           "Separate_Location_Agreement__c":false,
           "Signing_of_HoT_required__c":false,
           "Update_capex_budget_A__c":"1900-01-01",
           "Update_capex_budget_F__c":"1900-01-01",
           "Grid_Connection__c":"a2R7Q0000000snZUAQ",
           "sitetracker__Site__r":{
              "Name":"Ringlaan (Jumbo Kuurne)",
              "Id":"a0p7Q000000YWllQAG"
           }
        },
        {
           "Id":"a0i7Q000000ctEjQAI",
           "Name":"P-000244",
           "Country__c":"BEL",
           "sitetracker__Project_Status__c":"Grid Connection",
           "sitetracker__Project_Template__c":"New Station",
           "GC_Budget_Code__c":"B2203",
           "sitetracker__Site__c":"a0p7Q000000YWnbQAG",
           "sitetracker__Project_Start_Date_A__c":"2021-12-07",
           "Start_of_construction_F__c":"2023-03-14",
           "sitetracker__ProjectTemplate__c":"a0h7Q000000c8RFQAY",
           "sitetracker__Project_Complete_F__c":"2023-05-09",
           "sitetracker__Project_Manager__c":"0057Q0000055YuGQAU",
           "Architect__c":"0057Q0000055YuHQAU",
           "Construction_Manager__c":"0057Q0000055Yu2QAE",
           "Grid_Connection_required__c":false,
           "Building_Permit_required__c":false,
           "Director_Construction_Management__c":"0057Q0000022O2OQAU",
           "GC_Budget_Value__c":134000,
           "Legal_approval_validation_template_A__c":"1900-01-01",
           "Legal_approval_validation_template_F__c":"1900-01-01",
           "Define_Business_case_F__c":"1900-01-01",
           "GPS_survey_F__c":"1900-01-01",
           "Internal_Fastned_Approval_F__c":"1900-01-01",
           "Define_heads_of_terms_F__c":"1900-01-01",
           "Building_Permit_drawings_F__c":"1900-01-01",
           "Sign_energy_supply_contract_F__c":"2022-08-05",
           "Order_metering_F__c":"2022-08-05",
           "Negotiate_terms_with_landlord_F__c":"1900-01-01",
           "Approve_site_for_research_F__c":"1900-01-01",
           "Physical_evaluation_A__c":"1900-01-01",
           "Hand_in_final_Building_Permit_A__c":"1900-01-01",
           "Create_existing_situation_drawing_F__c":"1900-01-01",
           "Make_Final_Execution_Drawings_F__c":"2022-12-30",
           "Create_existing_situation_drawing_A__c":"1900-01-01",
           "Building_Permit_drawings_A__c":"1900-01-01",
           "Define_Business_case_A__c":"1900-01-01",
           "Approve_GC_budget_F__c":"2022-09-07",
           "Receive_external_reports_F__c":"1900-01-01",
           "Order_substation_F__c":"2022-05-31",
           "Pre_permit_application_process__c":false,
           "Concept_CAD_drawing_A__c":"1900-01-01",
           "Hand_in_final_Building_Permit_F__c":"1900-01-01",
           "Review_of_Execution_Drawings_F__c":"2022-12-02",
           "Negotiate_terms_with_landlord_A__c":"1900-01-01",
           "Hand_in_pre_permit_application_F__c":"2022-10-21",
           "Approve_site_for_research_A__c":"1900-01-01",
           "Concept_CAD_drawing_F__c":"1900-01-01",
           "Make_Execution_Drawings_F__c":"2022-08-12",
           "Check_utilities_F__c":"1900-01-01",
           "Prepare_contracts_F__c":"1900-01-01",
           "Negotiate_location_design_F__c":"2023-01-15",
           "Prepare_contracts_A__c":"1900-01-01",
           "Initial_capex_budget_F__c":"1900-01-01",
           "Define_heads_of_terms_A__c":"1900-01-01",
           "Amendments_required__c":false,
           "Economic_Evaluation_A__c":"1900-01-01",
           "Initial_capex_budget_A__c":"1900-01-01",
           "Approve_GC_budget_A__c":"2022-05-17",
           "Site_Visit_CM__c":false,
           "Contract_drawing_A__c":"1900-01-01",
           "Initial_design_sketch_A__c":"1900-01-01",
           "Check_zoning_A__c":"1900-01-01",
           "Economic_Evaluation_F__c":"1900-01-01",
           "Contract_works_F__c":"2023-01-13",
           "Approve_Construction_Budget_F__c":"2022-11-20",
           "Contract_signed_by_all_F__c":"2022-08-17",
           "Sign_Heads_of_Terms_F__c":"2022-07-22",
           "Initial_design_sketch_F__c":"1900-01-01",
           "Receive_GC_contract_F__c":"2022-08-08",
           "All_reports_completed_F__c":"2023-01-04",
           "Contract_drawing_F__c":"1900-01-01",
           "Check_utilities_A__c":"1900-01-01",
           "Building_Permit_Approved_A__c":"2022-06-20",
           "Site_Visit_LD__c":false,
           "Internal_Design_Approval_A__c":"1900-01-01",
           "Contract_signed_by_Fastned_A__c":"2022-08-03",
           "Opening_of_Site_F__c":"2023-04-18",
           "Generate_drawings_for_GC_request_F__c":"2022-07-04",
           "All_permits_for_construction_receive_F__c":"2023-01-04",
           "Design_Approval_Substation_F__c":"2022-07-23",
           "GPS_survey_A__c":"1900-01-01",
           "Place_substation_F__c":"2022-09-21",
           "Internal_Design_Approval_F__c":"1900-01-01",
           "Contract_signed_by_Fastned_F__c":"2022-07-22",
           "Extended_procedure__c":false,
           "Internal_Fastned_Approval_A__c":"1900-01-01",
           "Sign_GC_contract_F__c":"2022-05-24",
           "Receive_external_reports_A__c":"1900-01-01",
           "Request_GC_contract_F__c":"2022-07-11",
           "Check_zoning_F__c":"1900-01-01",
           "Energize_grid_connection_F__c":"2022-10-21",
           "Physical_evaluation_F__c":"1900-01-01",
           "Contract_signed_by_all_A__c":"2022-08-03",
           "Request_for_Quotations_for_works_F__c":"2022-09-09",
           "Determine_BP_Scope_F__c":"1900-01-01",
           "Determine_BP_Scope_A__c":"1900-01-01",
           "Determine_scope_Execution_Drawing_F__c":"2022-07-16",
           "Revise_BP_drawings_F__c":"1900-01-01",
           "Revise_BP_drawings_A__c":"1900-01-01",
           "Network_Development_Manager__c":"0057Q0000055YuJQAU",
           "Report_deviations_A__c":"1900-01-01",
           "Report_deviations_F__c":"1900-01-01",
           "Separate_Location_Agreement__c":false,
           "Signing_of_HoT_required__c":false,
           "Update_capex_budget_A__c":"1900-01-01",
           "Update_capex_budget_F__c":"1900-01-01",
           "Grid_Connection__c":"a2R7Q0000000snaUAA",
           "sitetracker__Site__r":{
              "Name":"Staatsbaan, Halen (McDonalds)",
              "Id":"a0p7Q000000YWnbQAG"
           }
        },
        {
           "Id":"a0i7Q000000cXdiQAE",
           "Name":"P-000016",
           "Country__c":"NLD",
           "sitetracker__Project_Status__c":"Complete",
           "sitetracker__Project_Template__c":"New Station",
           "Construction_Budget_Code__c":"B2104",
           "GC_Budget_Code__c":"N/A",
           "sitetracker__Site__c":"a0p7Q000000YWpRQAW",
           "sitetracker__Project_Start_Date_A__c":"2016-11-02",
           "sitetracker__ProjectTemplate__c":"a0h7Q000000c8RFQAY",
           "sitetracker__Project_Complete_A__c":"2019-05-17",
           "Grid_Connection_required__c":false,
           "Building_Permit_required__c":false,
           "GC_Budget_Value__c":0,
           "Legal_approval_validation_template_A__c":"1900-01-01",
           "Legal_approval_validation_template_F__c":"1900-01-01",
           "Place_substation_A__c":"1900-01-01",
           "Define_Business_case_F__c":"1900-01-01",
           "GPS_survey_F__c":"1900-01-01",
           "Sign_GC_contract_A__c":"2018-02-19",
           "Internal_Fastned_Approval_F__c":"1900-01-01",
           "Define_heads_of_terms_F__c":"1900-01-01",
           "Building_Permit_drawings_F__c":"1900-01-01",
           "Sign_energy_supply_contract_F__c":"1900-01-01",
           "Order_metering_F__c":"1900-01-01",
           "Negotiate_terms_with_landlord_F__c":"1900-01-01",
           "Approve_site_for_research_F__c":"1900-01-01",
           "Physical_evaluation_A__c":"1900-01-01",
           "Hand_in_final_Building_Permit_A__c":"1900-01-01",
           "Create_existing_situation_drawing_F__c":"1900-01-01",
           "Negotiate_location_design_A__c":"1900-01-01",
           "Make_Final_Execution_Drawings_F__c":"1900-01-01",
           "Create_existing_situation_drawing_A__c":"1900-01-01",
           "Building_Permit_drawings_A__c":"1900-01-01",
           "Define_Business_case_A__c":"1900-01-01",
           "Approve_GC_budget_F__c":"1900-01-01",
           "Receive_external_reports_F__c":"1900-01-01",
           "Sign_energy_supply_contract_A__c":"1900-01-01",
           "Order_metering_A__c":"1900-01-01",
           "Order_substation_F__c":"1900-01-01",
           "Pre_permit_application_process__c":false,
           "Concept_CAD_drawing_A__c":"1900-01-01",
           "Generate_drawings_for_GC_request_A__c":"1900-01-01",
           "Hand_in_final_Building_Permit_F__c":"1900-01-01",
           "Review_of_Execution_Drawings_F__c":"1900-01-01",
           "Negotiate_terms_with_landlord_A__c":"1900-01-01",
           "All_permits_for_construction_receive_A__c":"1900-01-01",
           "Make_Execution_Drawings_A__c":"1900-01-01",
           "Hand_in_pre_permit_application_F__c":"2018-08-03",
           "Approve_site_for_research_A__c":"1900-01-01",
           "Concept_CAD_drawing_F__c":"1900-01-01",
           "Make_Execution_Drawings_F__c":"1900-01-01",
           "Location_Agreement_signed_by_all_A__c":"2016-11-02",
           "Check_utilities_F__c":"1900-01-01",
           "Start_of_construction_A__c":"2019-04-29",
           "Prepare_contracts_F__c":"1900-01-01",
           "Negotiate_location_design_F__c":"1900-01-01",
           "Prepare_contracts_A__c":"1900-01-01",
           "Initial_capex_budget_F__c":"1900-01-01",
           "Define_heads_of_terms_A__c":"1900-01-01",
           "Amendments_required__c":false,
           "Economic_Evaluation_A__c":"1900-01-01",
           "Initial_capex_budget_A__c":"1900-01-01",
           "Order_substation_A__c":"1900-01-01",
           "Approve_GC_budget_A__c":"1900-01-01",
           "Receive_GC_contract_A__c":"2018-02-15",
           "Site_Visit_CM__c":false,
           "Energize_grid_connection_A__c":"2019-05-09",
           "Contract_drawing_A__c":"1900-01-01",
           "Initial_design_sketch_A__c":"1900-01-01",
           "Check_zoning_A__c":"1900-01-01",
           "Economic_Evaluation_F__c":"1900-01-01",
           "Contract_works_F__c":"1900-01-01",
           "All_reports_completed_A__c":"1900-01-01",
           "Approve_Construction_Budget_F__c":"1900-01-01",
           "Request_for_Quotations_for_works_A__c":"1900-01-01",
           "Sign_Heads_of_Terms_F__c":"2017-06-16",
           "Initial_design_sketch_F__c":"1900-01-01",
           "All_reports_completed_F__c":"1900-01-01",
           "Opening_of_Site_A__c":"2019-05-17",
           "Contract_drawing_F__c":"1900-01-01",
           "Check_utilities_A__c":"1900-01-01",
           "Submit_amendments_to_Building_Permit_F__c":"2018-08-17",
           "Building_Permit_Approved_A__c":"2017-09-25",
           "Site_Visit_LD__c":false,
           "Approve_Construction_Budget_A__c":"2021-09-20",
           "Internal_Design_Approval_A__c":"1900-01-01",
           "Contract_signed_by_Fastned_A__c":"1900-01-01",
           "Request_GC_contract_A__c":"1900-01-01",
           "Review_of_Execution_Drawings_A__c":"1900-01-01",
           "Generate_drawings_for_GC_request_F__c":"1900-01-01",
           "All_permits_for_construction_receive_F__c":"1900-01-01",
           "Design_Approval_Substation_F__c":"1900-01-01",
           "GPS_survey_A__c":"1900-01-01",
           "Place_substation_F__c":"1900-01-01",
           "Internal_Design_Approval_F__c":"1900-01-01",
           "Contract_signed_by_Fastned_F__c":"1900-01-01",
           "Extended_procedure__c":false,
           "Internal_Fastned_Approval_A__c":"1900-01-01",
           "Receive_external_reports_A__c":"1900-01-01",
           "Request_GC_contract_F__c":"1900-01-01",
           "Check_zoning_F__c":"1900-01-01",
           "Contract_works_A__c":"1900-01-01",
           "Make_Final_Execution_Drawings_A__c":"1900-01-01",
           "Physical_evaluation_F__c":"1900-01-01",
           "Design_Approval_Substation_A__c":"1900-01-01",
           "Contract_signed_by_all_A__c":"2018-05-15",
           "Request_for_Quotations_for_works_F__c":"1900-01-01",
           "Determine_BP_Scope_F__c":"1900-01-01",
           "Determine_BP_Scope_A__c":"1900-01-01",
           "Determine_scope_Execution_Drawing_F__c":"1900-01-01",
           "Determine_scope_Execution_Drawing_A__c":"1900-01-01",
           "Revise_BP_drawings_F__c":"1900-01-01",
           "Revise_BP_drawings_A__c":"1900-01-01",
           "Report_deviations_A__c":"1900-01-01",
           "Report_deviations_F__c":"1900-01-01",
           "Requested_Capacity__c":800,
           "Separate_Location_Agreement__c":true,
           "Signing_of_HoT_required__c":false,
           "Update_capex_budget_A__c":"1900-01-01",
           "Update_capex_budget_F__c":"1900-01-01",
           "Grid_Connection__c":"a2R7Q0000000q6ZUAQ",
           "sitetracker__Site__r":{
              "Name":"Vrijenban",
              "Id":"a0p7Q000000YWpRQAW"
           }
        },
        {
           "Id":"a0i7Q000000cXdlQAE",
           "Name":"P-000017",
           "Country__c":"NLD",
           "sitetracker__Project_Status__c":"Complete",
           "sitetracker__Project_Template__c":"New Station",
           "Construction_Budget_Code__c":"B1903",
           "GC_Budget_Code__c":"B1901",
           "sitetracker__Site__c":"a0p7Q000000YWV1QAO",
           "sitetracker__Project_Start_Date_A__c":"2017-07-21",
           "sitetracker__ProjectTemplate__c":"a0h7Q000000c8RFQAY",
           "sitetracker__Project_Complete_A__c":"2019-11-08",
           "Grid_Connection_required__c":false,
           "Building_Permit_required__c":false,
           "GC_Budget_Value__c":30800,
           "Legal_approval_validation_template_A__c":"1900-01-01",
           "Legal_approval_validation_template_F__c":"1900-01-01",
           "Place_substation_A__c":"1900-01-01",
           "Define_Business_case_F__c":"1900-01-01",
           "GPS_survey_F__c":"1900-01-01",
           "Sign_GC_contract_A__c":"2018-11-27",
           "Internal_Fastned_Approval_F__c":"1900-01-01",
           "Define_heads_of_terms_F__c":"1900-01-01",
           "Building_Permit_drawings_F__c":"1900-01-01",
           "Sign_energy_supply_contract_F__c":"1900-01-01",
           "Order_metering_F__c":"1900-01-01",
           "Negotiate_terms_with_landlord_F__c":"1900-01-01",
           "Approve_site_for_research_F__c":"1900-01-01",
           "Physical_evaluation_A__c":"1900-01-01",
           "Hand_in_final_Building_Permit_A__c":"1900-01-01",
           "Create_existing_situation_drawing_F__c":"1900-01-01",
           "Negotiate_location_design_A__c":"1900-01-01",
           "Make_Final_Execution_Drawings_F__c":"1900-01-01",
           "Create_existing_situation_drawing_A__c":"1900-01-01",
           "Building_Permit_drawings_A__c":"1900-01-01",
           "Define_Business_case_A__c":"1900-01-01",
           "Approve_GC_budget_F__c":"1900-01-01",
           "Receive_external_reports_F__c":"1900-01-01",
           "Sign_energy_supply_contract_A__c":"1900-01-01",
           "Order_metering_A__c":"1900-01-01",
           "Order_substation_F__c":"1900-01-01",
           "Pre_permit_application_process__c":false,
           "Concept_CAD_drawing_A__c":"1900-01-01",
           "Generate_drawings_for_GC_request_A__c":"1900-01-01",
           "Hand_in_final_Building_Permit_F__c":"1900-01-01",
           "Review_of_Execution_Drawings_F__c":"1900-01-01",
           "Negotiate_terms_with_landlord_A__c":"1900-01-01",
           "All_permits_for_construction_receive_A__c":"1900-01-01",
           "Make_Execution_Drawings_A__c":"1900-01-01",
           "Hand_in_pre_permit_application_F__c":"2018-06-25",
           "Approve_site_for_research_A__c":"1900-01-01",
           "Concept_CAD_drawing_F__c":"1900-01-01",
           "Make_Execution_Drawings_F__c":"1900-01-01",
           "Location_Agreement_signed_by_all_A__c":"2017-07-21",
           "Check_utilities_F__c":"1900-01-01",
           "Start_of_construction_A__c":"2019-10-21",
           "Prepare_contracts_F__c":"1900-01-01",
           "Negotiate_location_design_F__c":"1900-01-01",
           "Prepare_contracts_A__c":"1900-01-01",
           "Initial_capex_budget_F__c":"1900-01-01",
           "Define_heads_of_terms_A__c":"1900-01-01",
           "Amendments_required__c":false,
           "Economic_Evaluation_A__c":"1900-01-01",
           "Initial_capex_budget_A__c":"1900-01-01",
           "Order_substation_A__c":"1900-01-01",
           "Approve_GC_budget_A__c":"2019-05-05",
           "Receive_GC_contract_A__c":"1900-01-01",
           "Site_Visit_CM__c":false,
           "Energize_grid_connection_A__c":"2019-09-12",
           "Contract_drawing_A__c":"1900-01-01",
           "Initial_design_sketch_A__c":"1900-01-01",
           "Check_zoning_A__c":"1900-01-01",
           "Economic_Evaluation_F__c":"1900-01-01",
           "Contract_works_F__c":"1900-01-01",
           "All_reports_completed_A__c":"1900-01-01",
           "Approve_Construction_Budget_F__c":"1900-01-01",
           "Request_for_Quotations_for_works_A__c":"1900-01-01",
           "Sign_Heads_of_Terms_F__c":"2018-03-02",
           "Initial_design_sketch_F__c":"1900-01-01",
           "Receive_GC_contract_F__c":"1900-01-01",
           "All_reports_completed_F__c":"1900-01-01",
           "Opening_of_Site_A__c":"2019-11-08",
           "Contract_drawing_F__c":"1900-01-01",
           "Check_utilities_A__c":"1900-01-01",
           "Building_Permit_Approved_A__c":"2018-06-19",
           "Site_Visit_LD__c":false,
           "Approve_Construction_Budget_A__c":"2019-10-22",
           "Internal_Design_Approval_A__c":"1900-01-01",
           "Contract_signed_by_Fastned_A__c":"1900-01-01",
           "Request_GC_contract_A__c":"1900-01-01",
           "Review_of_Execution_Drawings_A__c":"1900-01-01",
           "Generate_drawings_for_GC_request_F__c":"1900-01-01",
           "All_permits_for_construction_receive_F__c":"1900-01-01",
           "Design_Approval_Substation_F__c":"1900-01-01",
           "GPS_survey_A__c":"1900-01-01",
           "Place_substation_F__c":"1900-01-01",
           "Internal_Design_Approval_F__c":"1900-01-01",
           "Contract_signed_by_Fastned_F__c":"1900-01-01",
           "Extended_procedure__c":false,
           "Internal_Fastned_Approval_A__c":"1900-01-01",
           "Receive_external_reports_A__c":"1900-01-01",
           "Request_GC_contract_F__c":"1900-01-01",
           "Check_zoning_F__c":"1900-01-01",
           "Contract_works_A__c":"1900-01-01",
           "Make_Final_Execution_Drawings_A__c":"1900-01-01",
           "Physical_evaluation_F__c":"1900-01-01",
           "Design_Approval_Substation_A__c":"1900-01-01",
           "Contract_signed_by_all_A__c":"2018-04-06",
           "Request_for_Quotations_for_works_F__c":"1900-01-01",
           "Determine_BP_Scope_F__c":"1900-01-01",
           "Determine_BP_Scope_A__c":"1900-01-01",
           "Determine_scope_Execution_Drawing_F__c":"1900-01-01",
           "Determine_scope_Execution_Drawing_A__c":"1900-01-01",
           "Revise_BP_drawings_F__c":"1900-01-01",
           "Revise_BP_drawings_A__c":"1900-01-01",
           "Report_deviations_A__c":"1900-01-01",
           "Report_deviations_F__c":"1900-01-01",
           "Requested_Capacity__c":500,
           "Separate_Location_Agreement__c":true,
           "Signing_of_HoT_required__c":false,
           "Update_capex_budget_A__c":"1900-01-01",
           "Update_capex_budget_F__c":"1900-01-01",
           "Grid_Connection__c":"a2R7Q0000000q6aUAA",
           "sitetracker__Site__r":{
              "Name":"Hendriksbos",
              "Id":"a0p7Q000000YWV1QAO"
           }
        },
        {
           "Id":"a0i7Q000000cXeFQAU",
           "Name":"P-000035",
           "Country__c":"NLD",
           "sitetracker__Project_Status__c":"Complete",
           "sitetracker__Project_Template__c":"New Station",
           "Construction_Budget_Code__c":"N/A",
           "GC_Budget_Code__c":"N/A",
           "sitetracker__Site__c":"a0p7Q000000YWpWQAW",
           "sitetracker__Project_Start_Date_A__c":"2013-06-04",
           "Start_of_construction_F__c":"1900-01-01",
           "sitetracker__ProjectTemplate__c":"a0h7Q000000c8RFQAY",
           "sitetracker__Project_Complete_A__c":"2014-03-11",
           "Grid_Connection_required__c":false,
           "Building_Permit_required__c":false,
           "GC_Budget_Value__c":0,
           "Legal_approval_validation_template_A__c":"1900-01-01",
           "Legal_approval_validation_template_F__c":"1900-01-01",
           "Place_substation_A__c":"1900-01-01",
           "Define_Business_case_F__c":"1900-01-01",
           "GPS_survey_F__c":"1900-01-01",
           "Sign_GC_contract_A__c":"2013-11-12",
           "Internal_Fastned_Approval_F__c":"1900-01-01",
           "Define_heads_of_terms_F__c":"1900-01-01",
           "Building_Permit_drawings_F__c":"1900-01-01",
           "Sign_energy_supply_contract_F__c":"1900-01-01",
           "Order_metering_F__c":"1900-01-01",
           "Negotiate_terms_with_landlord_F__c":"1900-01-01",
           "Approve_site_for_research_F__c":"1900-01-01",
           "Physical_evaluation_A__c":"1900-01-01",
           "Hand_in_final_Building_Permit_A__c":"2013-10-08",
           "Create_existing_situation_drawing_F__c":"1900-01-01",
           "Negotiate_location_design_A__c":"1900-01-01",
           "Make_Final_Execution_Drawings_F__c":"1900-01-01",
           "Create_existing_situation_drawing_A__c":"1900-01-01",
           "Building_Permit_drawings_A__c":"1900-01-01",
           "Define_Business_case_A__c":"1900-01-01",
           "Approve_GC_budget_F__c":"1900-01-01",
           "Receive_external_reports_F__c":"1900-01-01",
           "Sign_energy_supply_contract_A__c":"1900-01-01",
           "Order_metering_A__c":"1900-01-01",
           "Order_substation_F__c":"1900-01-01",
           "Pre_permit_application_process__c":false,
           "Concept_CAD_drawing_A__c":"1900-01-01",
           "Generate_drawings_for_GC_request_A__c":"1900-01-01",
           "Review_of_Execution_Drawings_F__c":"1900-01-01",
           "Negotiate_terms_with_landlord_A__c":"1900-01-01",
           "All_permits_for_construction_receive_A__c":"1900-01-01",
           "Make_Execution_Drawings_A__c":"1900-01-01",
           "Hand_in_pre_permit_application_F__c":"2015-12-04",
           "Approve_site_for_research_A__c":"1900-01-01",
           "Concept_CAD_drawing_F__c":"1900-01-01",
           "Make_Execution_Drawings_F__c":"1900-01-01",
           "Location_Agreement_signed_by_all_A__c":"2013-06-04",
           "Check_utilities_F__c":"1900-01-01",
           "Start_of_construction_A__c":"1900-01-01",
           "Prepare_contracts_F__c":"1900-01-01",
           "Negotiate_location_design_F__c":"1900-01-01",
           "Prepare_contracts_A__c":"1900-01-01",
           "Initial_capex_budget_F__c":"1900-01-01",
           "Define_heads_of_terms_A__c":"1900-01-01",
           "Amendments_required__c":false,
           "Economic_Evaluation_A__c":"1900-01-01",
           "Initial_capex_budget_A__c":"1900-01-01",
           "Order_substation_A__c":"1900-01-01",
           "Approve_GC_budget_A__c":"1900-01-01",
           "Receive_GC_contract_A__c":"1900-01-01",
           "Site_Visit_CM__c":false,
           "Energize_grid_connection_A__c":"1900-01-01",
           "Contract_drawing_A__c":"1900-01-01",
           "Initial_design_sketch_A__c":"1900-01-01",
           "Check_zoning_A__c":"1900-01-01",
           "Economic_Evaluation_F__c":"1900-01-01",
           "Contract_works_F__c":"1900-01-01",
           "All_reports_completed_A__c":"1900-01-01",
           "Approve_Construction_Budget_F__c":"1900-01-01",
           "Request_for_Quotations_for_works_A__c":"1900-01-01",
           "Sign_Heads_of_Terms_F__c":"2014-01-17",
           "Initial_design_sketch_F__c":"1900-01-01",
           "Receive_GC_contract_F__c":"1900-01-01",
           "All_reports_completed_F__c":"1900-01-01",
           "Opening_of_Site_A__c":"2014-03-11",
           "Contract_drawing_F__c":"1900-01-01",
           "Check_utilities_A__c":"1900-01-01",
           "Submit_amendments_to_Building_Permit_F__c":"2013-10-22",
           "Building_Permit_Approved_A__c":"2013-10-08",
           "Site_Visit_LD__c":false,
           "Approve_Construction_Budget_A__c":"1900-01-01",
           "Internal_Design_Approval_A__c":"1900-01-01",
           "Contract_signed_by_Fastned_A__c":"1900-01-01",
           "Request_GC_contract_A__c":"1900-01-01",
           "Review_of_Execution_Drawings_A__c":"1900-01-01",
           "Generate_drawings_for_GC_request_F__c":"1900-01-01",
           "All_permits_for_construction_receive_F__c":"1900-01-01",
           "Design_Approval_Substation_F__c":"1900-01-01",
           "GPS_survey_A__c":"1900-01-01",
           "Place_substation_F__c":"1900-01-01",
           "Internal_Design_Approval_F__c":"1900-01-01",
           "Contract_signed_by_Fastned_F__c":"1900-01-01",
           "Extended_procedure__c":false,
           "Internal_Fastned_Approval_A__c":"1900-01-01",
           "Receive_external_reports_A__c":"1900-01-01",
           "Request_GC_contract_F__c":"1900-01-01",
           "Check_zoning_F__c":"1900-01-01",
           "Contract_works_A__c":"1900-01-01",
           "Energize_grid_connection_F__c":"1900-01-01",
           "Make_Final_Execution_Drawings_A__c":"1900-01-01",
           "Physical_evaluation_F__c":"1900-01-01",
           "Design_Approval_Substation_A__c":"1900-01-01",
           "Contract_signed_by_all_A__c":"2015-09-15",
           "Request_for_Quotations_for_works_F__c":"1900-01-01",
           "Determine_BP_Scope_F__c":"1900-01-01",
           "Determine_BP_Scope_A__c":"1900-01-01",
           "Determine_scope_Execution_Drawing_F__c":"1900-01-01",
           "Determine_scope_Execution_Drawing_A__c":"1900-01-01",
           "Revise_BP_drawings_F__c":"1900-01-01",
           "Revise_BP_drawings_A__c":"1900-01-01",
           "Report_deviations_A__c":"1900-01-01",
           "Report_deviations_F__c":"1900-01-01",
           "Requested_Capacity__c":8,
           "Separate_Location_Agreement__c":true,
           "Signing_of_HoT_required__c":false,
           "Update_capex_budget_A__c":"1900-01-01",
           "Update_capex_budget_F__c":"1900-01-01",
           "Grid_Connection__c":"a2R7Q0000000q72UAA",
           "sitetracker__Site__r":{
              "Name":"Vundelaar",
              "Id":"a0p7Q000000YWpWQAW"
           }
        },
  

Post by revill »

Part two:

{
           "Id":"a0i7Q000000cXeeQAE",
           "Name":"P-000050",
           "Country__c":"NLD",
           "sitetracker__Project_Status__c":"Complete",
           "sitetracker__Project_Template__c":"New Station",
           "Construction_Budget_Code__c":"N/A",
           "GC_Budget_Code__c":"N/A",
           "sitetracker__Site__c":"a0p7Q000000YWUuQAO",
           "sitetracker__Project_Start_Date_A__c":"2015-01-21",
           "Start_of_construction_F__c":"1900-01-01",
           "sitetracker__ProjectTemplate__c":"a0h7Q000000c8RFQAY",
           "sitetracker__Project_Complete_A__c":"2015-11-27",
           "Grid_Connection_required__c":false,
           "Building_Permit_required__c":false,
           "GC_Budget_Value__c":0,
           "Legal_approval_validation_template_A__c":"1900-01-01",
           "Legal_approval_validation_template_F__c":"1900-01-01",
           "Place_substation_A__c":"1900-01-01",
           "Define_Business_case_F__c":"1900-01-01",
           "GPS_survey_F__c":"1900-01-01",
           "Sign_GC_contract_A__c":"2015-05-21",
           "Internal_Fastned_Approval_F__c":"1900-01-01",
           "Define_heads_of_terms_F__c":"1900-01-01",
           "Building_Permit_drawings_F__c":"1900-01-01",
           "Sign_energy_supply_contract_F__c":"1900-01-01",
           "Order_metering_F__c":"1900-01-01",
           "Negotiate_terms_with_landlord_F__c":"1900-01-01",
           "Approve_site_for_research_F__c":"1900-01-01",
           "Physical_evaluation_A__c":"1900-01-01",
           "Hand_in_final_Building_Permit_A__c":"1900-01-01",
           "Create_existing_situation_drawing_F__c":"1900-01-01",
           "Negotiate_location_design_A__c":"1900-01-01",
           "Make_Final_Execution_Drawings_F__c":"1900-01-01",
           "Create_existing_situation_drawing_A__c":"1900-01-01",
           "Building_Permit_drawings_A__c":"1900-01-01",
           "Define_Business_case_A__c":"1900-01-01",
           "Approve_GC_budget_F__c":"1900-01-01",
           "Receive_external_reports_F__c":"1900-01-01",
           "Sign_energy_supply_contract_A__c":"1900-01-01",
           "Order_metering_A__c":"1900-01-01",
           "Order_substation_F__c":"1900-01-01",
           "Pre_permit_application_process__c":false,
           "Concept_CAD_drawing_A__c":"1900-01-01",
           "Generate_drawings_for_GC_request_A__c":"1900-01-01",
           "Hand_in_final_Building_Permit_F__c":"1900-01-01",
           "Review_of_Execution_Drawings_F__c":"1900-01-01",
           "Negotiate_terms_with_landlord_A__c":"1900-01-01",
           "All_permits_for_construction_receive_A__c":"1900-01-01",
           "Make_Execution_Drawings_A__c":"1900-01-01",
           "Hand_in_pre_permit_application_F__c":"2017-04-20",
           "Approve_site_for_research_A__c":"1900-01-01",
           "Concept_CAD_drawing_F__c":"1900-01-01",
           "Make_Execution_Drawings_F__c":"1900-01-01",
           "Location_Agreement_signed_by_all_A__c":"2015-01-21",
           "Check_utilities_F__c":"1900-01-01",
           "Start_of_construction_A__c":"1900-01-01",
           "Prepare_contracts_F__c":"1900-01-01",
           "Negotiate_location_design_F__c":"1900-01-01",
           "Prepare_contracts_A__c":"1900-01-01",
           "Initial_capex_budget_F__c":"1900-01-01",
           "Define_heads_of_terms_A__c":"1900-01-01",
           "Amendments_required__c":false,
           "Economic_Evaluation_A__c":"1900-01-01",
           "Initial_capex_budget_A__c":"1900-01-01",
           "Order_substation_A__c":"1900-01-01",
           "Approve_GC_budget_A__c":"1900-01-01",
           "Receive_GC_contract_A__c":"1900-01-01",
           "Site_Visit_CM__c":false,
           "Energize_grid_connection_A__c":"1900-01-01",
           "Contract_drawing_A__c":"1900-01-01",
           "Initial_design_sketch_A__c":"1900-01-01",
           "Check_zoning_A__c":"1900-01-01",
           "Economic_Evaluation_F__c":"1900-01-01",
           "Contract_works_F__c":"1900-01-01",
           "All_reports_completed_A__c":"1900-01-01",
           "Approve_Construction_Budget_F__c":"1900-01-01",
           "Request_for_Quotations_for_works_A__c":"1900-01-01",
           "Sign_Heads_of_Terms_F__c":"2015-09-04",
           "Initial_design_sketch_F__c":"1900-01-01",
           "Receive_GC_contract_F__c":"1900-01-01",
           "All_reports_completed_F__c":"1900-01-01",
           "Opening_of_Site_A__c":"2015-11-27",
           "Contract_drawing_F__c":"1900-01-01",
           "Check_utilities_A__c":"1900-01-01",
           "Submit_amendments_to_Building_Permit_F__c":"2017-05-04",
           "Building_Permit_Approved_A__c":"2015-02-25",
           "Site_Visit_LD__c":false,
           "Approve_Construction_Budget_A__c":"1900-01-01",
           "Internal_Design_Approval_A__c":"1900-01-01",
           "Contract_signed_by_Fastned_A__c":"1900-01-01",
           "Request_GC_contract_A__c":"1900-01-01",
           "Review_of_Execution_Drawings_A__c":"1900-01-01",
           "Generate_drawings_for_GC_request_F__c":"1900-01-01",
           "All_permits_for_construction_receive_F__c":"1900-01-01",
           "Design_Approval_Substation_F__c":"1900-01-01",
           "GPS_survey_A__c":"1900-01-01",
           "Place_substation_F__c":"1900-01-01",
           "Internal_Design_Approval_F__c":"1900-01-01",
           "Contract_signed_by_Fastned_F__c":"1900-01-01",
           "Extended_procedure__c":false,
           "Internal_Fastned_Approval_A__c":"1900-01-01",
           "Receive_external_reports_A__c":"1900-01-01",
           "Request_GC_contract_F__c":"1900-01-01",
           "Check_zoning_F__c":"1900-01-01",
           "Contract_works_A__c":"1900-01-01",
           "Energize_grid_connection_F__c":"1900-01-01",
           "Make_Final_Execution_Drawings_A__c":"1900-01-01",
           "Physical_evaluation_F__c":"1900-01-01",
           "Design_Approval_Substation_A__c":"1900-01-01",
           "Contract_signed_by_all_A__c":"2017-01-30",
           "Request_for_Quotations_for_works_F__c":"1900-01-01",
           "Determine_BP_Scope_F__c":"1900-01-01",
           "Determine_BP_Scope_A__c":"1900-01-01",
           "Determine_scope_Execution_Drawing_F__c":"1900-01-01",
           "Determine_scope_Execution_Drawing_A__c":"1900-01-01",
           "Revise_BP_drawings_F__c":"1900-01-01",
           "Revise_BP_drawings_A__c":"1900-01-01",
           "Report_deviations_A__c":"1900-01-01",
           "Report_deviations_F__c":"1900-01-01",
           "Requested_Capacity__c":500,
           "Separate_Location_Agreement__c":true,
           "Signing_of_HoT_required__c":false,
           "Update_capex_budget_A__c":"1900-01-01",
           "Update_capex_budget_F__c":"1900-01-01",
           "Grid_Connection__c":"a2R7Q0000000q7XUAQ",
           "sitetracker__Site__r":{
              "Name":"Bospoort",
              "Id":"a0p7Q000000YWUuQAO"
           }
        },
        {
           "Id":"a0i7Q000000cXf9QAE",
           "Name":"P-000069",
           "Country__c":"NLD",
           "sitetracker__Project_Status__c":"Complete",
           "sitetracker__Project_Template__c":"New Station",
           "Construction_Budget_Code__c":"B2103",
           "GC_Budget_Code__c":"B2102",
           "sitetracker__Site__c":"a0p7Q000000YWXTQA4",
           "sitetracker__Project_Start_Date_A__c":"2015-06-10",
           "sitetracker__ProjectTemplate__c":"a0h7Q000000c8RFQAY",
           "sitetracker__Project_Complete_A__c":"2021-12-21",
           "Grid_Connection_required__c":false,
           "Building_Permit_required__c":false,
           "GC_Budget_Value__c":78611,
           "Legal_approval_validation_template_A__c":"1900-01-01",
           "Legal_approval_validation_template_F__c":"1900-01-01",
           "Place_substation_A__c":"1900-01-01",
           "Define_Business_case_F__c":"1900-01-01",
           "GPS_survey_F__c":"1900-01-01",
           "Sign_GC_contract_A__c":"2021-03-30",
           "Internal_Fastned_Approval_F__c":"1900-01-01",
           "Define_heads_of_terms_F__c":"1900-01-01",
           "Building_Permit_drawings_F__c":"1900-01-01",
           "Sign_energy_supply_contract_F__c":"1900-01-01",
           "Order_metering_F__c":"1900-01-01",
           "Negotiate_terms_with_landlord_F__c":"1900-01-01",
           "Approve_site_for_research_F__c":"1900-01-01",
           "Physical_evaluation_A__c":"1900-01-01",
           "Hand_in_final_Building_Permit_A__c":"1900-01-01",
           "Create_existing_situation_drawing_F__c":"1900-01-01",
           "Negotiate_location_design_A__c":"1900-01-01",
           "Make_Final_Execution_Drawings_F__c":"1900-01-01",
           "Create_existing_situation_drawing_A__c":"1900-01-01",
           "Building_Permit_drawings_A__c":"1900-01-01",
           "Define_Business_case_A__c":"1900-01-01",
           "Approve_GC_budget_F__c":"1900-01-01",
           "Receive_external_reports_F__c":"1900-01-01",
           "Sign_energy_supply_contract_A__c":"1900-01-01",
           "Order_metering_A__c":"1900-01-01",
           "Order_substation_F__c":"1900-01-01",
           "Pre_permit_application_process__c":false,
           "Concept_CAD_drawing_A__c":"1900-01-01",
           "Generate_drawings_for_GC_request_A__c":"1900-01-01",
           "Hand_in_final_Building_Permit_F__c":"1900-01-01",
           "Review_of_Execution_Drawings_F__c":"1900-01-01",
           "Negotiate_terms_with_landlord_A__c":"1900-01-01",
           "All_permits_for_construction_receive_A__c":"1900-01-01",
           "Make_Execution_Drawings_A__c":"1900-01-01",
           "Hand_in_pre_permit_application_F__c":"2021-03-05",
           "Approve_site_for_research_A__c":"1900-01-01",
           "Concept_CAD_drawing_F__c":"1900-01-01",
           "Make_Execution_Drawings_F__c":"1900-01-01",
           "Location_Agreement_signed_by_all_A__c":"2015-06-10",
           "Check_utilities_F__c":"1900-01-01",
           "Start_of_construction_A__c":"2021-12-08",
           "Prepare_contracts_F__c":"1900-01-01",
           "Negotiate_location_design_F__c":"1900-01-01",
           "Prepare_contracts_A__c":"1900-01-01",
           "Initial_capex_budget_F__c":"1900-01-01",
           "Define_heads_of_terms_A__c":"1900-01-01",
           "Amendments_required__c":false,
           "Economic_Evaluation_A__c":"1900-01-01",
           "Initial_capex_budget_A__c":"1900-01-01",
           "Order_substation_A__c":"1900-01-01",
           "Approve_GC_budget_A__c":"2021-03-11",
           "Receive_GC_contract_A__c":"1900-01-01",
           "Site_Visit_CM__c":false,
           "Energize_grid_connection_A__c":"2021-12-15",
           "Contract_drawing_A__c":"1900-01-01",
           "Initial_design_sketch_A__c":"1900-01-01",
           "Check_zoning_A__c":"1900-01-01",
           "Economic_Evaluation_F__c":"1900-01-01",
           "Contract_works_F__c":"1900-01-01",
           "All_reports_completed_A__c":"1900-01-01",
           "Building_Permit_Approved_F__c":"1900-01-01",
           "Approve_Construction_Budget_F__c":"1900-01-01",
           "Request_for_Quotations_for_works_A__c":"1900-01-01",
           "Sign_Heads_of_Terms_F__c":"2016-01-22",
           "Initial_design_sketch_F__c":"1900-01-01",
           "Receive_GC_contract_F__c":"1900-01-01",
           "All_reports_completed_F__c":"1900-01-01",
           "Opening_of_Site_A__c":"2021-12-21",
           "Contract_drawing_F__c":"1900-01-01",
           "Check_utilities_A__c":"1900-01-01",
           "Building_Permit_Approved_A__c":"1900-01-01",
           "Site_Visit_LD__c":false,
           "Approve_Construction_Budget_A__c":"2021-05-17",
           "Internal_Design_Approval_A__c":"1900-01-01",
           "Contract_signed_by_Fastned_A__c":"1900-01-01",
           "Request_GC_contract_A__c":"1900-01-01",
           "Review_of_Execution_Drawings_A__c":"1900-01-01",
           "Generate_drawings_for_GC_request_F__c":"1900-01-01",
           "All_permits_for_construction_receive_F__c":"1900-01-01",
           "Design_Approval_Substation_F__c":"1900-01-01",
           "GPS_survey_A__c":"1900-01-01",
           "Place_substation_F__c":"1900-01-01",
           "Internal_Design_Approval_F__c":"1900-01-01",
           "Contract_signed_by_Fastned_F__c":"1900-01-01",
           "Extended_procedure__c":false,
           "Internal_Fastned_Approval_A__c":"1900-01-01",
           "Receive_external_reports_A__c":"1900-01-01",
           "Request_GC_contract_F__c":"1900-01-01",
           "Check_zoning_F__c":"1900-01-01",
           "Contract_works_A__c":"1900-01-01",
           "Make_Final_Execution_Drawings_A__c":"1900-01-01",
           "Physical_evaluation_F__c":"1900-01-01",
           "Design_Approval_Substation_A__c":"1900-01-01",
           "Contract_signed_by_all_A__c":"2020-12-16",
           "Request_for_Quotations_for_works_F__c":"1900-01-01",
           "Determine_BP_Scope_F__c":"1900-01-01",
           "Determine_BP_Scope_A__c":"1900-01-01",
           "Determine_scope_Execution_Drawing_F__c":"1900-01-01",
           "Determine_scope_Execution_Drawing_A__c":"1900-01-01",
           "Revise_BP_drawings_F__c":"1900-01-01",
           "Revise_BP_drawings_A__c":"1900-01-01",
           "Report_deviations_A__c":"1900-01-01",
           "Report_deviations_F__c":"1900-01-01",
           "Requested_Capacity__c":500,
           "Separate_Location_Agreement__c":true,
           "Signing_of_HoT_required__c":false,
           "Update_capex_budget_A__c":"1900-01-01",
           "Update_capex_budget_F__c":"1900-01-01",
           "Grid_Connection__c":"a2R7Q0000000q8EUAQ",
           "sitetracker__Site__r":{
              "Name":"De Buunderkamp",
              "Id":"a0p7Q000000YWXTQA4"
           }
        }
     ];
    error;
    hideCountryColumn = true;
    hideFullSiteName = true;
    hideProjectTemplate = true;
    hideGCBudgetCodeCol = true;
    hideConstructionBudgetCol = true;
    hideProjectStatusCol = true;
    configurationList = [];
    currentConfigurationUsed;
    currentconfigPhasesAndEvents;
    configurationNames = [];
    mapOfConfigurationsByname = new Map();

// @wire(getObjectInfo, { objectApiName: PHASE_EVENT_CONFIG_OBJECT })
// phaseEventObjectInfo;

get recordTypeId() {
    // Returns a map of record type Ids 
    const rtis = {"012000000000000AAA":{"available":true,"defaultRecordTypeMapping":false,"master":true,"name":"Master","recordTypeId":"012000000000000AAA"},"0123M0000005mSzQAI":{"available":true,"defaultRecordTypeMapping":true,"master":false,"name":"Phase","recordTypeId":"0123M0000005mSzQAI"},"0123M0000005mT4QAI":{"available":true,"defaultRecordTypeMapping":false,"master":false,"name":"Event","recordTypeId":"0123M0000005mT4QAI"}};
    console.log('recordTypeId map : ',JSON.stringify(rtis) );
    return Object.keys(rtis).find(rti => rtis[rti].name === 'Phase');
}


renderedCallback() {
    if (this.bryntumInitialized) {
        return;
    }
    this.bryntumInitialized = true;

Promise.all([
    loadScript(this, GANTT + "/gantt.lwc.module.js"),
    loadStyle(this, GANTT + "/gantt.stockholm.css")
])
    .then(() => {
        console.log('handleConfigurations');
        try {
            this.handleConfigurations();
            console.log('handleConfigurations after');

            this.handleProjectLoad();
            console.log('handleProjectLoad after');
        } catch (error) {
            console.log('Error catch', error);
        }
        

    })
    .catch(error => {
        this.dispatchEvent(
            new ShowToastEvent({
                title: "Error loading Bryntum Gantt",
                message: error,
                variant: "error"
            })
        );
    });
}

createGantt(tasks, startDate) {
    console.log('Tasks ', tasks);
    const GanttToolbar = GanttToolbarMixin(bryntum.gantt.Toolbar);
    const project = new bryntum.gantt.ProjectModel({
        calendar: data.project.calendar,
        tasksData: tasks
    });
        
let columns = [ { type: "name", width: 250 }, { type: "startdate", field : 'startDate', format : 'YYYY-MM-DD'}, { type: "enddate", field : 'projectEndDate', format : 'YYYY-MM-DD'}, { text : "country", hidden : false, field : 'Country' }, { text : "Full Site Name", hidden : this.hideFullSiteName, field : 'FullSiteName'}, { text : "Project Template" , hidden : this.hideProjectTemplate, field : 'ProjectTemplate'}, { text : "GC Budget Code", hidden : this.hideGCBudgetCodeCol, field : 'GCBudgetCode'}, { text : "Construction Budet Code", hidden : this.hideConstructionBudgetCol, field : 'ConstructionBudget'}, { text : "Project Status" , hidden : this.hideProjectStatusCol, field : 'ProjectStatus' }, { type: "addnew" } ]; const gantt = new bryntum.gantt.Gantt({ project, appendTo: this.template.querySelector(".container"), taskRenderer({ taskRecord }) { // Display segment names if (taskRecord.isEventSegment) { return bryntum.gantt.StringHelper.encodeHtml(taskRecord.name); } return ''; }, columns: columns, subGridConfigs: { locked: { flex: 3 }, normal: { flex: 4 } }, tbar : [ { type : 'button', text : '<<', onClick : (event) => { const collapseEvent = event.source.up ('gantt'); collapseEvent.shiftPrevious(); } }, { type : 'button', text : '>>', onClick : (event) => { const collapseEvent = event.source.up ('gantt'); collapseEvent.shiftNext(); } }, { type : 'button', text : 'Zoom to fit', onClick : (event) => { const collapseEvent = event.source.up ('gantt'); collapseEvent.zoomToFit(); } }, { type : 'button', text : '+', onClick : (event) => { const collapseEvent = event.source.up ('gantt'); collapseEvent.zoomIn(); } },{ type : 'button', text : '-', onClick : (event) => { const collapseEvent = event.source.up ('gantt'); collapseEvent.zoomOut(); } } ], columnLines: false, features: { cellEdit : false, taskEdit : false, taskMenu : false, taskDrag : false, taskResize : false, taskDragCreate : false, rollups: { disabled: true }, baselines: { disabled: true }, progressLine: { disabled: true, statusDate: new Date(2019, 0, 25) }, criticalPaths : false, filter: true, dependencyEdit: true, timeRanges: { showCurrentTimeLine: true }, labels: { left: { field: "name", editor: { type: "textfield" } } } } }); project.commitAsync().then(() => { // console.timeEnd("load data"); const stm = gantt.project.stm; stm.enable(); stm.autoRecord = true; // let's track scheduling conflicts happened project.on("schedulingconflict", context => { // show notification to user bryntum.gantt.Toast.show( "Scheduling conflict has happened ..recent changes were reverted" ); // as the conflict resolution approach let's simply cancel the changes context.continueWithResolutionResult( bryntum.gantt.EffectResolutionResult.Cancel ); }); }); } handleProjectLoad() { // getProjects() // .then((result) => { let phases = []; let events = []; console.log('currentconfigPhasesAndEvents before',this.currentconfigPhasesAndEvents); this.currentconfigPhasesAndEvents.forEach (element => { if (element.RecordTypeId == this.recordTypeId) { phases.push (element); } else { events.push (element); } }); console.log('currentconfigPhasesAndEvents after'); // this.projects = result; this.error = undefined; let projectTasks = new Array; let idNumber = 1; let earliestStartDate = new Date(); this.projects.forEach(element => { console.log('element', element); let projectStartDate = element.sitetracker__Project_Start_Date_A__c == undefined ? element.sitetracker__Project_Start_Date_F__c : element.sitetracker__Project_Start_Date_A__c; console.log('projectStartDate', projectStartDate); let projectEndDate = element.Start_of_construction_A__c == undefined ? element.Start_of_construction_F__c : element.Start_of_construction_A__c; console.log('projectEndDate', projectStartDate); if (projectEndDate != undefined && projectEndDate != null && projectStartDate != undefined && projectStartDate < projectEndDate) { let segments = []; this.createPhaseSegments(phases, element, projectStartDate, projectEndDate, segments); this.createEventSegments(events, element, projectStartDate, projectEndDate, segments); let projectRow = this.createProjectRow(element, projectStartDate, projectEndDate, segments, earliestStartDate, idNumber); console.log('projectRow', projectRow); projectTasks.push(projectRow); idNumber++; } }); this.createGantt(projectTasks, earliestStartDate); // ) // .catch((error) => { // this.error = error; // console.log('ERROR: ', error); // this.projects = undefined; // }); }; createProjectRow(element, projectStartDate, projectEndDate, segments, earliestStartDate, idNumber) { let parsedDate = new Date(projectStartDate); let parsedEndDate = new Date(projectEndDate); let projectRow; let isoDate = parsedDate.toISOString().split('T')[0];
if (parsedDate.getDate() =='1' && parsedDate.getMonth() == '0' && parsedDate.getFullYear() == '1900') { projectRow = {"id" : idNumber, "startDate" : isoDate, "manuallyScheduled": true, "segments" : segments, "name" : element.sitetracker__Site__r.Name, "endDate" : projectEndDate, "salesforceId" : element.Id, "ProjectTemplate" : element.sitetracker__Project_Template__c, "Country" : element.Country__c, "ProjectTemplate" : element.sitetracker__Project_Template__c, "GCBudgetCode" : element.GC_Budget_Code__c, "ConstructionBudget" : element.Construction_Budget_Code__c, "ProjectStatus" : element.sitetracker__Project_Status__c}; } else { if (parsedDate < earliestStartDate) { earliestStartDate = parsedDate; } projectRow = {"id" : idNumber, "manuallyScheduled": true, "startDate" : String (projectStartDate), "projectEndDate" : String (projectEndDate), "segments" : segments, "name" : element.sitetracker__Site__r.Name, "salesforceId" : element.Id, "ProjectTemplate" : element.sitetracker__Project_Template__c, "Country" : element.Country__c, "ProjectTemplate" : element.sitetracker__Project_Template__c, "GCBudgetCode" : element.GC_Budget_Code__c, "ConstructionBudget" : element.Construction_Budget_Code__c, "ProjectStatus" : element.sitetracker__Project_Status__c}; } return projectRow; } createEventSegments (events,element, projectStartDate, projectEndDate, eventSegments) { if (!element) {return [];} for (const event of events) { let forecastFieldStartField = this.checkActualForecastField(event.Start_Date_Field__c,element); let eventStartDate = element[event.Start_Date_Field__c] == undefined ? element[forecastFieldStartField] : element[event.Start_Date_Field__c]; if (eventStartDate != undefined && eventStartDate != null && (eventStartDate >= projectStartDate && eventStartDate < projectEndDate)) { let parsedDate = new Date(eventStartDate); if (parsedDate.getMonth() == '0' && parsedDate.getDate() == '1' && parsedDate.getFullYear() == '1900') { continue; } let newstartEventDate = new Date(eventStartDate); let endEventDate = new Date(eventStartDate); endEventDate.setDate(newstartEventDate.getDate() + 1); let startDateString = newstartEventDate.toISOString().split('T')[0]; let endDateString = endEventDate.toISOString().split('T')[0]; console.log('event startDateString',startDateString); console.log('event endDateString',endDateString); eventSegments.push({"name" : event.Name, "startDate" : String(startDateString), "endDate" : String(endDateString)}); } } } createPhaseSegments (phases, element, projectStartDate, projectEndDate, phaseSegments) { if (!element) {return [];} for ( const phase of phases) { if ((phase.Name === 'Grid Connection' || phase.Name === 'Building Permit') && (!element.Grid_Connection_required__c || !element.Building_Permit_required__c) ) { continue; } let forecastFieldStartField = this.checkActualForecastField(phase.Start_Date_Field__c,element); let forecastFieldEndField = this.checkActualForecastField(phase.End_Date_Field__c,element); let phaseStartDate = element[phase.Start_Date_Field__c] == undefined ? element[forecastFieldStartField] : element[phase.Start_Date_Field__c]; let phaseEndDate = element[phase.End_Date_Field__c] == undefined ? element[forecastFieldEndField] : element[phase.End_Date_Field__c]; if (((phaseEndDate != undefined && phaseEndDate != null) || (phaseStartDate != undefined && phaseStartDate != null)) && (phaseStartDate >= projectStartDate && phaseEndDate <= projectEndDate && phaseStartDate < projectEndDate && phaseEndDate > projectStartDate)) { console.log('phase if '); let parsedDate = new Date(phaseStartDate); if (parsedDate.getMonth() == '0' && parsedDate.getDate() == '1' && parsedDate.getFullYear() == '1900') { continue; } let phaseEDate = new Date(phaseEndDate); let phaseSDate = new Date(phaseStartDate); let endDateString = phaseEDate.toISOString().split('T')[0]; let startDateString = phaseSDate.toISOString().split('T')[0]; console.log('phase startDateString',startDateString); console.log('phase endDateString',endDateString); console.log('phase name',phase.Name); phaseSegments.push({ "name" : phase.Name, "startDate" :phaseStartDate, "endDate" : phaseEndDate}); //displays phase, but not displays all events // phaseSegments.push({ "name" : phase.Name, "startDate" :phaseStartDate, "endDate" : phaseEndDate}); // phaseSegments.push({ "name" : phase.Name, "startDate" :String(phaseStartDate), "endDate" : String(phaseEndDate)}); // phaseSegments.push({ "name" : phase.Name, "startDate" :String(phaseSDate), "endDate" : String(phaseEDate)}); // phaseSegments.push({ "name" : phase.Name, "startDate" :String(phaseSDate.toISOString()), "endDate" : String(phaseEDate.toISOString())}); // phaseSegments.push({ "name" : phase.Name, "startDate" :String(startDateString), "endDate" : String(endDateString)}); } } } checkActualForecastField (fieldActual, object) { const sufix = 'F__c'; if (fieldActual != null && fieldActual != undefined && object != null && object != undefined) { fieldActual += ''; let fieldNameWithoutSufix = fieldActual.substring(0, fieldActual.length-4); console.log('fild name without sufx ', fieldNameWithoutSufix); return fieldNameWithoutSufix.concat(sufix); } }; handleConfigurations() { let configWrapper = { "configurations":[ { "Id":"a2X3M000000H5fGUAS", "Chart_Object__c":"sitetracker__Project__c", "Display_Fields__c":"sitetracker__Site__r.Full_Site_Name__c;sitetracker__Project_Template__c;GC_Budget_Code__c;Construction_Budget_Code__c;sitetracker__Project_Status__c", "Name":"Test configuration", "Grouping_By__c":"Country__c" }, { "Id":"a2X3M000000BzH4UAK", "Chart_Object__c":"sitetracker__Project__c", "Display_Fields__c":"sitetracker__Site__r.Full_Site_Name__c;sitetracker__Project_Template__c;GC_Budget_Code__c", "Name":"Test2 configuration", "Grouping_By__c":"Construction_Budget_Code__c" } ], "phaseEvents":[ { "Id":"a2Y3M000000AQH5UAO", "End_Date_Field__c":"Opening_of_Site_A__c", "Start_Date_Field__c":"Start_of_construction_A__c", "Use_Forecast_Fields__c":true, "Gantt_Chart_Configuration__c":"a2X3M000000H5fGUAS", "Project__c":"a0i3M000000C8OyQAK", "Type__c":"Phase", "Name":"Construction", "RecordTypeId":"0123M0000005mSzQAI" }, { "Id":"a2Y3M000000AQGvUAO", "End_Date_Field__c":"Building_Permit_Approved_A__c", "Start_Date_Field__c":"Hand_in_final_Building_Permit_A__c", "Use_Forecast_Fields__c":true, "Condition__c":"Grid_Connection_required__c == true AND Building_Permit_required__c == true", "Gantt_Chart_Configuration__c":"a2X3M000000H5fGUAS", "Project__c":"a0i3M000000C8OyQAK", "Type__c":"Phase", "Name":"Building Permit", "RecordTypeId":"0123M0000005mSzQAI" }, { "Id":"a2Y3M000000AQHFUA4", "Start_Date_Field__c":"Location_Agreement_signed_by_all_A__c", "Use_Forecast_Fields__c":true, "Condition__c":"Separate_Location_Agreement__c == true", "Gantt_Chart_Configuration__c":"a2X3M000000H5fGUAS", "Project__c":"a0i3M000000C8OyQAK", "Type__c":"Event", "Name":"Location Agreement Signed", "RecordTypeId":"0123M0000005mT4QAI" }, { "Id":"a2Y3M000000DWztUAG", "End_Date_Field__c":"Building_Permit_Approved_A__c", "Start_Date_Field__c":"Hand_in_final_Building_Permit_A__c", "Use_Forecast_Fields__c":true, "Gantt_Chart_Configuration__c":"a2X3M000000H5fGUAS", "Project__c":"a0i3M000000C8OyQAK", "Type__c":"Phase", "Name":"Test Phase", "RecordTypeId":"0123M0000005mSzQAI" }, { "Id":"a2Y3M000000DWzoUAG", "Start_Date_Field__c":"sitetracker__Project_Start_Date_A__c", "Use_Forecast_Fields__c":true, "Gantt_Chart_Configuration__c":"a2X3M000000H5fGUAS", "Project__c":"a0i3M000000C8OyQAK", "Type__c":"Event", "Name":"Test Event", "RecordTypeId":"0123M0000005mT4QAI" }, { "Id":"a2Y3M000000AQHAUA4", "Start_Date_Field__c":"Contract_signed_by_Fastned_A__c", "Use_Forecast_Fields__c":true, "Condition__c":"Grid_Connection_required__c == true AND Building_Permit_required__c == true", "Gantt_Chart_Configuration__c":"a2X3M000000H5fGUAS", "Project__c":"a0i3M000000C8OyQAK", "Type__c":"Event", "Name":"Contract Signed", "RecordTypeId":"0123M0000005mT4QAI" }, { "Id":"a2Y3M000000AQH0UAO", "End_Date_Field__c":"Energize_grid_connection_A__c", "Start_Date_Field__c":"Sign_GC_contract_A__c", "Use_Forecast_Fields__c":true, "Condition__c":"Grid_Connection_required__c == true AND Building_Permit_required__c == true", "Gantt_Chart_Configuration__c":"a2X3M000000H5fGUAS", "Project__c":"a0i3M000000C8OyQAK", "Type__c":"Phase", "Name":"Grid Connection", "RecordTypeId":"0123M0000005mSzQAI" }, { "Id":"a2Y3M000000AQHKUA4", "Start_Date_Field__c":"Place_substation_A__c", "Use_Forecast_Fields__c":true, "Condition__c":"Grid_Connection_required__c == true AND Building_Permit_required__c == true", "Gantt_Chart_Configuration__c":"a2X3M000000H5fGUAS", "Project__c":"a0i3M000000C8OyQAK", "Type__c":"Event", "Name":"Substation Placement", "RecordTypeId":"0123M0000005mT4QAI" } ] }; // getGanttChartConfigurationsWrapper() // .then((configWrapper) => { let mainConfigObjects = configWrapper.configurations; this.configurationList = configWrapper.configurations; if (this.configurationNames?.length === 0 || this.mapOfConfigurationsByname.length === 0) { configWrapper.configurations.forEach(element => {
if (element?.Name != undefined) { this.configurationNames.push(element.Name); this.mapOfConfigurationsByname.set(element.Name, element); } }) this.currentConfigurationUsed = mainConfigObjects[0];
} console.log('configWrapper.phaseEvents', configWrapper.phaseEvents); this.currentconfigPhasesAndEvents = configWrapper.phaseEvents; let fieldsToBeDisplayed = this.currentConfigurationUsed.Display_Fields__c; let groupByField = this.currentConfigurationUsed.Grouping_By__c; // }) // .catch((error) => { // console.log('error: ', error); // this.error = error; // this.configWrapper = undefined; // }); } }

Post by arcady »

Again you have not provided all the data.. namely data.project.calendar is missing.

But even w/o having it I see in your screenshots that segments data looks incorrect:

1) first of segments are supposed to be sorted by dates ascending
2) I see the task starting on 2021-03-11 but first segment starts on 2022-01-24


Post by revill »

Hi arcady,
thank you for the response and your help. Finally, it appears that it was a matter of order. After I sorted the segments by the date they are displayed all of the passed segments.
But I'm still facing an issue with the events displaying in the whole task width when I zoom in.

Here is the fixed code with the missing calendar definition (just 2nd part of the code updated with the calendar definition:

{
           "Id":"a0i7Q000000cXeeQAE",
           "Name":"P-000050",
           "Country__c":"NLD",
           "sitetracker__Project_Status__c":"Complete",
           "sitetracker__Project_Template__c":"New Station",
           "Construction_Budget_Code__c":"N/A",
           "GC_Budget_Code__c":"N/A",
           "sitetracker__Site__c":"a0p7Q000000YWUuQAO",
           "sitetracker__Project_Start_Date_A__c":"2015-01-21",
           "Start_of_construction_F__c":"1900-01-01",
           "sitetracker__ProjectTemplate__c":"a0h7Q000000c8RFQAY",
           "sitetracker__Project_Complete_A__c":"2015-11-27",
           "Grid_Connection_required__c":false,
           "Building_Permit_required__c":false,
           "GC_Budget_Value__c":0,
           "Legal_approval_validation_template_A__c":"1900-01-01",
           "Legal_approval_validation_template_F__c":"1900-01-01",
           "Place_substation_A__c":"1900-01-01",
           "Define_Business_case_F__c":"1900-01-01",
           "GPS_survey_F__c":"1900-01-01",
           "Sign_GC_contract_A__c":"2015-05-21",
           "Internal_Fastned_Approval_F__c":"1900-01-01",
           "Define_heads_of_terms_F__c":"1900-01-01",
           "Building_Permit_drawings_F__c":"1900-01-01",
           "Sign_energy_supply_contract_F__c":"1900-01-01",
           "Order_metering_F__c":"1900-01-01",
           "Negotiate_terms_with_landlord_F__c":"1900-01-01",
           "Approve_site_for_research_F__c":"1900-01-01",
           "Physical_evaluation_A__c":"1900-01-01",
           "Hand_in_final_Building_Permit_A__c":"1900-01-01",
           "Create_existing_situation_drawing_F__c":"1900-01-01",
           "Negotiate_location_design_A__c":"1900-01-01",
           "Make_Final_Execution_Drawings_F__c":"1900-01-01",
           "Create_existing_situation_drawing_A__c":"1900-01-01",
           "Building_Permit_drawings_A__c":"1900-01-01",
           "Define_Business_case_A__c":"1900-01-01",
           "Approve_GC_budget_F__c":"1900-01-01",
           "Receive_external_reports_F__c":"1900-01-01",
           "Sign_energy_supply_contract_A__c":"1900-01-01",
           "Order_metering_A__c":"1900-01-01",
           "Order_substation_F__c":"1900-01-01",
           "Pre_permit_application_process__c":false,
           "Concept_CAD_drawing_A__c":"1900-01-01",
           "Generate_drawings_for_GC_request_A__c":"1900-01-01",
           "Hand_in_final_Building_Permit_F__c":"1900-01-01",
           "Review_of_Execution_Drawings_F__c":"1900-01-01",
           "Negotiate_terms_with_landlord_A__c":"1900-01-01",
           "All_permits_for_construction_receive_A__c":"1900-01-01",
           "Make_Execution_Drawings_A__c":"1900-01-01",
           "Hand_in_pre_permit_application_F__c":"2017-04-20",
           "Approve_site_for_research_A__c":"1900-01-01",
           "Concept_CAD_drawing_F__c":"1900-01-01",
           "Make_Execution_Drawings_F__c":"1900-01-01",
           "Location_Agreement_signed_by_all_A__c":"2015-01-21",
           "Check_utilities_F__c":"1900-01-01",
           "Start_of_construction_A__c":"1900-01-01",
           "Prepare_contracts_F__c":"1900-01-01",
           "Negotiate_location_design_F__c":"1900-01-01",
           "Prepare_contracts_A__c":"1900-01-01",
           "Initial_capex_budget_F__c":"1900-01-01",
           "Define_heads_of_terms_A__c":"1900-01-01",
           "Amendments_required__c":false,
           "Economic_Evaluation_A__c":"1900-01-01",
           "Initial_capex_budget_A__c":"1900-01-01",
           "Order_substation_A__c":"1900-01-01",
           "Approve_GC_budget_A__c":"1900-01-01",
           "Receive_GC_contract_A__c":"1900-01-01",
           "Site_Visit_CM__c":false,
           "Energize_grid_connection_A__c":"1900-01-01",
           "Contract_drawing_A__c":"1900-01-01",
           "Initial_design_sketch_A__c":"1900-01-01",
           "Check_zoning_A__c":"1900-01-01",
           "Economic_Evaluation_F__c":"1900-01-01",
           "Contract_works_F__c":"1900-01-01",
           "All_reports_completed_A__c":"1900-01-01",
           "Approve_Construction_Budget_F__c":"1900-01-01",
           "Request_for_Quotations_for_works_A__c":"1900-01-01",
           "Sign_Heads_of_Terms_F__c":"2015-09-04",
           "Initial_design_sketch_F__c":"1900-01-01",
           "Receive_GC_contract_F__c":"1900-01-01",
           "All_reports_completed_F__c":"1900-01-01",
           "Opening_of_Site_A__c":"2015-11-27",
           "Contract_drawing_F__c":"1900-01-01",
           "Check_utilities_A__c":"1900-01-01",
           "Submit_amendments_to_Building_Permit_F__c":"2017-05-04",
           "Building_Permit_Approved_A__c":"2015-02-25",
           "Site_Visit_LD__c":false,
           "Approve_Construction_Budget_A__c":"1900-01-01",
           "Internal_Design_Approval_A__c":"1900-01-01",
           "Contract_signed_by_Fastned_A__c":"1900-01-01",
           "Request_GC_contract_A__c":"1900-01-01",
           "Review_of_Execution_Drawings_A__c":"1900-01-01",
           "Generate_drawings_for_GC_request_F__c":"1900-01-01",
           "All_permits_for_construction_receive_F__c":"1900-01-01",
           "Design_Approval_Substation_F__c":"1900-01-01",
           "GPS_survey_A__c":"1900-01-01",
           "Place_substation_F__c":"1900-01-01",
           "Internal_Design_Approval_F__c":"1900-01-01",
           "Contract_signed_by_Fastned_F__c":"1900-01-01",
           "Extended_procedure__c":false,
           "Internal_Fastned_Approval_A__c":"1900-01-01",
           "Receive_external_reports_A__c":"1900-01-01",
           "Request_GC_contract_F__c":"1900-01-01",
           "Check_zoning_F__c":"1900-01-01",
           "Contract_works_A__c":"1900-01-01",
           "Energize_grid_connection_F__c":"1900-01-01",
           "Make_Final_Execution_Drawings_A__c":"1900-01-01",
           "Physical_evaluation_F__c":"1900-01-01",
           "Design_Approval_Substation_A__c":"1900-01-01",
           "Contract_signed_by_all_A__c":"2017-01-30",
           "Request_for_Quotations_for_works_F__c":"1900-01-01",
           "Determine_BP_Scope_F__c":"1900-01-01",
           "Determine_BP_Scope_A__c":"1900-01-01",
           "Determine_scope_Execution_Drawing_F__c":"1900-01-01",
           "Determine_scope_Execution_Drawing_A__c":"1900-01-01",
           "Revise_BP_drawings_F__c":"1900-01-01",
           "Revise_BP_drawings_A__c":"1900-01-01",
           "Report_deviations_A__c":"1900-01-01",
           "Report_deviations_F__c":"1900-01-01",
           "Requested_Capacity__c":500,
           "Separate_Location_Agreement__c":true,
           "Signing_of_HoT_required__c":false,
           "Update_capex_budget_A__c":"1900-01-01",
           "Update_capex_budget_F__c":"1900-01-01",
           "Grid_Connection__c":"a2R7Q0000000q7XUAQ",
           "sitetracker__Site__r":{
              "Name":"Bospoort",
              "Id":"a0p7Q000000YWUuQAO"
           }
        },
        {
           "Id":"a0i7Q000000cXf9QAE",
           "Name":"P-000069",
           "Country__c":"NLD",
           "sitetracker__Project_Status__c":"Complete",
           "sitetracker__Project_Template__c":"New Station",
           "Construction_Budget_Code__c":"B2103",
           "GC_Budget_Code__c":"B2102",
           "sitetracker__Site__c":"a0p7Q000000YWXTQA4",
           "sitetracker__Project_Start_Date_A__c":"2015-06-10",
           "sitetracker__ProjectTemplate__c":"a0h7Q000000c8RFQAY",
           "sitetracker__Project_Complete_A__c":"2021-12-21",
           "Grid_Connection_required__c":false,
           "Building_Permit_required__c":false,
           "GC_Budget_Value__c":78611,
           "Legal_approval_validation_template_A__c":"1900-01-01",
           "Legal_approval_validation_template_F__c":"1900-01-01",
           "Place_substation_A__c":"1900-01-01",
           "Define_Business_case_F__c":"1900-01-01",
           "GPS_survey_F__c":"1900-01-01",
           "Sign_GC_contract_A__c":"2021-03-30",
           "Internal_Fastned_Approval_F__c":"1900-01-01",
           "Define_heads_of_terms_F__c":"1900-01-01",
           "Building_Permit_drawings_F__c":"1900-01-01",
           "Sign_energy_supply_contract_F__c":"1900-01-01",
           "Order_metering_F__c":"1900-01-01",
           "Negotiate_terms_with_landlord_F__c":"1900-01-01",
           "Approve_site_for_research_F__c":"1900-01-01",
           "Physical_evaluation_A__c":"1900-01-01",
           "Hand_in_final_Building_Permit_A__c":"1900-01-01",
           "Create_existing_situation_drawing_F__c":"1900-01-01",
           "Negotiate_location_design_A__c":"1900-01-01",
           "Make_Final_Execution_Drawings_F__c":"1900-01-01",
           "Create_existing_situation_drawing_A__c":"1900-01-01",
           "Building_Permit_drawings_A__c":"1900-01-01",
           "Define_Business_case_A__c":"1900-01-01",
           "Approve_GC_budget_F__c":"1900-01-01",
           "Receive_external_reports_F__c":"1900-01-01",
           "Sign_energy_supply_contract_A__c":"1900-01-01",
           "Order_metering_A__c":"1900-01-01",
           "Order_substation_F__c":"1900-01-01",
           "Pre_permit_application_process__c":false,
           "Concept_CAD_drawing_A__c":"1900-01-01",
           "Generate_drawings_for_GC_request_A__c":"1900-01-01",
           "Hand_in_final_Building_Permit_F__c":"1900-01-01",
           "Review_of_Execution_Drawings_F__c":"1900-01-01",
           "Negotiate_terms_with_landlord_A__c":"1900-01-01",
           "All_permits_for_construction_receive_A__c":"1900-01-01",
           "Make_Execution_Drawings_A__c":"1900-01-01",
           "Hand_in_pre_permit_application_F__c":"2021-03-05",
           "Approve_site_for_research_A__c":"1900-01-01",
           "Concept_CAD_drawing_F__c":"1900-01-01",
           "Make_Execution_Drawings_F__c":"1900-01-01",
           "Location_Agreement_signed_by_all_A__c":"2015-06-10",
           "Check_utilities_F__c":"1900-01-01",
           "Start_of_construction_A__c":"2021-12-08",
           "Prepare_contracts_F__c":"1900-01-01",
           "Negotiate_location_design_F__c":"1900-01-01",
           "Prepare_contracts_A__c":"1900-01-01",
           "Initial_capex_budget_F__c":"1900-01-01",
           "Define_heads_of_terms_A__c":"1900-01-01",
           "Amendments_required__c":false,
           "Economic_Evaluation_A__c":"1900-01-01",
           "Initial_capex_budget_A__c":"1900-01-01",
           "Order_substation_A__c":"1900-01-01",
           "Approve_GC_budget_A__c":"2021-03-11",
           "Receive_GC_contract_A__c":"1900-01-01",
           "Site_Visit_CM__c":false,
           "Energize_grid_connection_A__c":"2021-12-15",
           "Contract_drawing_A__c":"1900-01-01",
           "Initial_design_sketch_A__c":"1900-01-01",
           "Check_zoning_A__c":"1900-01-01",
           "Economic_Evaluation_F__c":"1900-01-01",
           "Contract_works_F__c":"1900-01-01",
           "All_reports_completed_A__c":"1900-01-01",
           "Building_Permit_Approved_F__c":"1900-01-01",
           "Approve_Construction_Budget_F__c":"1900-01-01",
           "Request_for_Quotations_for_works_A__c":"1900-01-01",
           "Sign_Heads_of_Terms_F__c":"2016-01-22",
           "Initial_design_sketch_F__c":"1900-01-01",
           "Receive_GC_contract_F__c":"1900-01-01",
           "All_reports_completed_F__c":"1900-01-01",
           "Opening_of_Site_A__c":"2021-12-21",
           "Contract_drawing_F__c":"1900-01-01",
           "Check_utilities_A__c":"1900-01-01",
           "Building_Permit_Approved_A__c":"1900-01-01",
           "Site_Visit_LD__c":false,
           "Approve_Construction_Budget_A__c":"2021-05-17",
           "Internal_Design_Approval_A__c":"1900-01-01",
           "Contract_signed_by_Fastned_A__c":"1900-01-01",
           "Request_GC_contract_A__c":"1900-01-01",
           "Review_of_Execution_Drawings_A__c":"1900-01-01",
           "Generate_drawings_for_GC_request_F__c":"1900-01-01",
           "All_permits_for_construction_receive_F__c":"1900-01-01",
           "Design_Approval_Substation_F__c":"1900-01-01",
           "GPS_survey_A__c":"1900-01-01",
           "Place_substation_F__c":"1900-01-01",
           "Internal_Design_Approval_F__c":"1900-01-01",
           "Contract_signed_by_Fastned_F__c":"1900-01-01",
           "Extended_procedure__c":false,
           "Internal_Fastned_Approval_A__c":"1900-01-01",
           "Receive_external_reports_A__c":"1900-01-01",
           "Request_GC_contract_F__c":"1900-01-01",
           "Check_zoning_F__c":"1900-01-01",
           "Contract_works_A__c":"1900-01-01",
           "Make_Final_Execution_Drawings_A__c":"1900-01-01",
           "Physical_evaluation_F__c":"1900-01-01",
           "Design_Approval_Substation_A__c":"1900-01-01",
           "Contract_signed_by_all_A__c":"2020-12-16",
           "Request_for_Quotations_for_works_F__c":"1900-01-01",
           "Determine_BP_Scope_F__c":"1900-01-01",
           "Determine_BP_Scope_A__c":"1900-01-01",
           "Determine_scope_Execution_Drawing_F__c":"1900-01-01",
           "Determine_scope_Execution_Drawing_A__c":"1900-01-01",
           "Revise_BP_drawings_F__c":"1900-01-01",
           "Revise_BP_drawings_A__c":"1900-01-01",
           "Report_deviations_A__c":"1900-01-01",
           "Report_deviations_F__c":"1900-01-01",
           "Requested_Capacity__c":500,
           "Separate_Location_Agreement__c":true,
           "Signing_of_HoT_required__c":false,
           "Update_capex_budget_A__c":"1900-01-01",
           "Update_capex_budget_F__c":"1900-01-01",
           "Grid_Connection__c":"a2R7Q0000000q8EUAQ",
           "sitetracker__Site__r":{
              "Name":"De Buunderkamp",
              "Id":"a0p7Q000000YWXTQA4"
           }
        }
     ];
    error;
    hideCountryColumn = true;
    hideFullSiteName = true;
    hideProjectTemplate = true;
    hideGCBudgetCodeCol = true;
    hideConstructionBudgetCol = true;
    hideProjectStatusCol = true;
    configurationList = [];
    currentConfigurationUsed;
    currentconfigPhasesAndEvents;
    configurationNames = [];
    mapOfConfigurationsByname = new Map();

// @wire(getObjectInfo, { objectApiName: PHASE_EVENT_CONFIG_OBJECT })
// phaseEventObjectInfo;

get recordTypeId() {
    // Returns a map of record type Ids 
    const rtis = {"012000000000000AAA":{"available":true,"defaultRecordTypeMapping":false,"master":true,"name":"Master","recordTypeId":"012000000000000AAA"},"0123M0000005mSzQAI":{"available":true,"defaultRecordTypeMapping":true,"master":false,"name":"Phase","recordTypeId":"0123M0000005mSzQAI"},"0123M0000005mT4QAI":{"available":true,"defaultRecordTypeMapping":false,"master":false,"name":"Event","recordTypeId":"0123M0000005mT4QAI"}};
    console.log('recordTypeId map : ',JSON.stringify(rtis) );
    return Object.keys(rtis).find(rti => rtis[rti].name === 'Phase');
}


renderedCallback() {
    if (this.bryntumInitialized) {
        return;
    }
    this.bryntumInitialized = true;

Promise.all([
    loadScript(this, GANTT + "/gantt.lwc.module.js"),
    loadStyle(this, GANTT + "/gantt.stockholm.css")
])
    .then(() => {
        console.log('handleConfigurations');
        try {
            this.handleConfigurations();
            console.log('handleConfigurations after');

        this.handleProjectLoad();
        console.log('handleProjectLoad after');
    } catch (error) {
        console.log('Error catch', error);
    }
    

})
.catch(error => {
    this.dispatchEvent(
        new ShowToastEvent({
            title: "Error loading Bryntum Gantt",
            message: error,
            variant: "error"
        })
    );
});
}

createGantt(tasks, startDate) {
    console.log('Tasks ', tasks);
    const GanttToolbar = GanttToolbarMixin(bryntum.gantt.Toolbar);
   const project = new bryntum.gantt.ProjectModel({
            // calendar: data.project.calendar,
            calendar : {
                "calendar"  : "general",
                "startDate" : "2019-01-14"
            },
            tasksData: tasks
        });
        
let columns = [ { type: "name", width: 250 }, { type: "startdate", field : 'startDate', format : 'YYYY-MM-DD'}, { type: "enddate", field : 'projectEndDate', format : 'YYYY-MM-DD'}, { text : "country", hidden : false, field : 'Country' }, { text : "Full Site Name", hidden : this.hideFullSiteName, field : 'FullSiteName'}, { text : "Project Template" , hidden : this.hideProjectTemplate, field : 'ProjectTemplate'}, { text : "GC Budget Code", hidden : this.hideGCBudgetCodeCol, field : 'GCBudgetCode'}, { text : "Construction Budet Code", hidden : this.hideConstructionBudgetCol, field : 'ConstructionBudget'}, { text : "Project Status" , hidden : this.hideProjectStatusCol, field : 'ProjectStatus' }, { type: "addnew" } ]; const gantt = new bryntum.gantt.Gantt({ project, appendTo: this.template.querySelector(".container"), taskRenderer({ taskRecord }) { // Display segment names if (taskRecord.isEventSegment) { return bryntum.gantt.StringHelper.encodeHtml(taskRecord.name); } return ''; }, columns: columns, subGridConfigs: { locked: { flex: 3 }, normal: { flex: 4 } }, tbar : [ { type : 'button', text : '<<', onClick : (event) => { const collapseEvent = event.source.up ('gantt'); collapseEvent.shiftPrevious(); } }, { type : 'button', text : '>>', onClick : (event) => { const collapseEvent = event.source.up ('gantt'); collapseEvent.shiftNext(); } }, { type : 'button', text : 'Zoom to fit', onClick : (event) => { const collapseEvent = event.source.up ('gantt'); collapseEvent.zoomToFit(); } }, { type : 'button', text : '+', onClick : (event) => { const collapseEvent = event.source.up ('gantt'); collapseEvent.zoomIn(); } },{ type : 'button', text : '-', onClick : (event) => { const collapseEvent = event.source.up ('gantt'); collapseEvent.zoomOut(); } } ], columnLines: false, features: { cellEdit : false, taskEdit : false, taskMenu : false, taskDrag : false, taskResize : false, taskDragCreate : false, rollups: { disabled: true }, baselines: { disabled: true }, progressLine: { disabled: true, statusDate: new Date(2019, 0, 25) }, criticalPaths : false, filter: true, dependencyEdit: true, timeRanges: { showCurrentTimeLine: true }, labels: { left: { field: "name", editor: { type: "textfield" } } } } }); project.commitAsync().then(() => { // console.timeEnd("load data"); const stm = gantt.project.stm; stm.enable(); stm.autoRecord = true; // let's track scheduling conflicts happened project.on("schedulingconflict", context => { // show notification to user bryntum.gantt.Toast.show( "Scheduling conflict has happened ..recent changes were reverted" ); // as the conflict resolution approach let's simply cancel the changes context.continueWithResolutionResult( bryntum.gantt.EffectResolutionResult.Cancel ); }); }); } handleProjectLoad() { // getProjects() // .then((result) => { let phases = []; let events = []; console.log('currentconfigPhasesAndEvents before',this.currentconfigPhasesAndEvents); this.currentconfigPhasesAndEvents.forEach (element => { if (element.RecordTypeId == this.recordTypeId) { phases.push (element); } else { events.push (element); } }); console.log('currentconfigPhasesAndEvents after'); // this.projects = result; this.error = undefined; let projectTasks = new Array; let idNumber = 1; let earliestStartDate = new Date(); this.projects.forEach(element => { console.log('element', element); let projectStartDate = element.sitetracker__Project_Start_Date_A__c == undefined ? element.sitetracker__Project_Start_Date_F__c : element.sitetracker__Project_Start_Date_A__c; console.log('projectStartDate', projectStartDate); let projectEndDate = element.Start_of_construction_A__c == undefined ? element.Start_of_construction_F__c : element.Start_of_construction_A__c; console.log('projectEndDate', projectStartDate); if (projectEndDate != undefined && projectEndDate != null && projectStartDate != undefined && projectStartDate < projectEndDate) { let segments = []; this.createPhaseSegments(phases, element, projectStartDate, projectEndDate, segments); this.createEventSegments(events, element, projectStartDate, projectEndDate, segments); let projectRow = this.createProjectRow(element, projectStartDate, projectEndDate, segments, earliestStartDate, idNumber); console.log('projectRow', projectRow); projectTasks.push(projectRow); idNumber++; } }); this.createGantt(projectTasks, earliestStartDate); // ) // .catch((error) => { // this.error = error; // console.log('ERROR: ', error); // this.projects = undefined; // }); }; createProjectRow(element, projectStartDate, projectEndDate, segments, earliestStartDate, idNumber) { let parsedDate = new Date(projectStartDate); let parsedEndDate = new Date(projectEndDate); let projectRow; let isoDate = parsedDate.toISOString().split('T')[0];
if (parsedDate.getDate() =='1' && parsedDate.getMonth() == '0' && parsedDate.getFullYear() == '1900') { projectRow = {"id" : idNumber, "startDate" : isoDate, "manuallyScheduled": true, "segments" : segments, "name" : element.sitetracker__Site__r.Name, "endDate" : projectEndDate, "salesforceId" : element.Id, "ProjectTemplate" : element.sitetracker__Project_Template__c, "Country" : element.Country__c, "ProjectTemplate" : element.sitetracker__Project_Template__c, "GCBudgetCode" : element.GC_Budget_Code__c, "ConstructionBudget" : element.Construction_Budget_Code__c, "ProjectStatus" : element.sitetracker__Project_Status__c}; } else { if (parsedDate < earliestStartDate) { earliestStartDate = parsedDate; } projectRow = {"id" : idNumber, "manuallyScheduled": true, "startDate" : String (projectStartDate), "projectEndDate" : String (projectEndDate), "segments" : segments, "name" : element.sitetracker__Site__r.Name, "salesforceId" : element.Id, "ProjectTemplate" : element.sitetracker__Project_Template__c, "Country" : element.Country__c, "ProjectTemplate" : element.sitetracker__Project_Template__c, "GCBudgetCode" : element.GC_Budget_Code__c, "ConstructionBudget" : element.Construction_Budget_Code__c, "ProjectStatus" : element.sitetracker__Project_Status__c}; } return projectRow; } createEventSegments (events,element, projectStartDate, projectEndDate, eventSegments) { if (!element) {return [];} for (const event of events) { let forecastFieldStartField = this.checkActualForecastField(event.Start_Date_Field__c,element); let eventStartDate = element[event.Start_Date_Field__c] == undefined ? element[forecastFieldStartField] : element[event.Start_Date_Field__c]; if (eventStartDate != undefined && eventStartDate != null && (eventStartDate >= projectStartDate && eventStartDate < projectEndDate)) { let parsedDate = new Date(eventStartDate); if (parsedDate.getMonth() == '0' && parsedDate.getDate() == '1' && parsedDate.getFullYear() == '1900') { continue; } let newstartEventDate = new Date(eventStartDate); let endEventDate = new Date(eventStartDate); endEventDate.setDate(newstartEventDate.getDate() + 1); let startDateString = newstartEventDate.toISOString().split('T')[0]; let endDateString = endEventDate.toISOString().split('T')[0]; console.log('event startDateString',startDateString); console.log('event endDateString',endDateString); eventSegments.push({"name" : event.Name, "startDate" : String(startDateString), "endDate" : String(endDateString)}); } } } createPhaseSegments (phases, element, projectStartDate, projectEndDate, phaseSegments) { if (!element) {return [];} for ( const phase of phases) { if ((phase.Name === 'Grid Connection' || phase.Name === 'Building Permit') && (!element.Grid_Connection_required__c || !element.Building_Permit_required__c) ) { continue; } let forecastFieldStartField = this.checkActualForecastField(phase.Start_Date_Field__c,element); let forecastFieldEndField = this.checkActualForecastField(phase.End_Date_Field__c,element); let phaseStartDate = element[phase.Start_Date_Field__c] == undefined ? element[forecastFieldStartField] : element[phase.Start_Date_Field__c]; let phaseEndDate = element[phase.End_Date_Field__c] == undefined ? element[forecastFieldEndField] : element[phase.End_Date_Field__c]; if (((phaseEndDate != undefined && phaseEndDate != null) || (phaseStartDate != undefined && phaseStartDate != null)) && (phaseStartDate >= projectStartDate && phaseEndDate <= projectEndDate && phaseStartDate < projectEndDate && phaseEndDate > projectStartDate)) { console.log('phase if '); let parsedDate = new Date(phaseStartDate); if (parsedDate.getMonth() == '0' && parsedDate.getDate() == '1' && parsedDate.getFullYear() == '1900') { continue; } let phaseEDate = new Date(phaseEndDate); let phaseSDate = new Date(phaseStartDate); let endDateString = phaseEDate.toISOString().split('T')[0]; let startDateString = phaseSDate.toISOString().split('T')[0]; console.log('phase startDateString',startDateString); console.log('phase endDateString',endDateString); console.log('phase name',phase.Name); phaseSegments.push({ "name" : phase.Name, "startDate" :phaseStartDate, "endDate" : phaseEndDate}); //displays phase, but not displays all events // phaseSegments.push({ "name" : phase.Name, "startDate" :phaseStartDate, "endDate" : phaseEndDate}); // phaseSegments.push({ "name" : phase.Name, "startDate" :String(phaseStartDate), "endDate" : String(phaseEndDate)}); // phaseSegments.push({ "name" : phase.Name, "startDate" :String(phaseSDate), "endDate" : String(phaseEDate)}); // phaseSegments.push({ "name" : phase.Name, "startDate" :String(phaseSDate.toISOString()), "endDate" : String(phaseEDate.toISOString())}); // phaseSegments.push({ "name" : phase.Name, "startDate" :String(startDateString), "endDate" : String(endDateString)}); } } } checkActualForecastField (fieldActual, object) { const sufix = 'F__c'; if (fieldActual != null && fieldActual != undefined && object != null && object != undefined) { fieldActual += ''; let fieldNameWithoutSufix = fieldActual.substring(0, fieldActual.length-4); console.log('fild name without sufx ', fieldNameWithoutSufix); return fieldNameWithoutSufix.concat(sufix); } }; handleConfigurations() { let configWrapper = { "configurations":[ { "Id":"a2X3M000000H5fGUAS", "Chart_Object__c":"sitetracker__Project__c", "Display_Fields__c":"sitetracker__Site__r.Full_Site_Name__c;sitetracker__Project_Template__c;GC_Budget_Code__c;Construction_Budget_Code__c;sitetracker__Project_Status__c", "Name":"Test configuration", "Grouping_By__c":"Country__c" }, { "Id":"a2X3M000000BzH4UAK", "Chart_Object__c":"sitetracker__Project__c", "Display_Fields__c":"sitetracker__Site__r.Full_Site_Name__c;sitetracker__Project_Template__c;GC_Budget_Code__c", "Name":"Test2 configuration", "Grouping_By__c":"Construction_Budget_Code__c" } ], "phaseEvents":[ { "Id":"a2Y3M000000AQH5UAO", "End_Date_Field__c":"Opening_of_Site_A__c", "Start_Date_Field__c":"Start_of_construction_A__c", "Use_Forecast_Fields__c":true, "Gantt_Chart_Configuration__c":"a2X3M000000H5fGUAS", "Project__c":"a0i3M000000C8OyQAK", "Type__c":"Phase", "Name":"Construction", "RecordTypeId":"0123M0000005mSzQAI" }, { "Id":"a2Y3M000000AQGvUAO", "End_Date_Field__c":"Building_Permit_Approved_A__c", "Start_Date_Field__c":"Hand_in_final_Building_Permit_A__c", "Use_Forecast_Fields__c":true, "Condition__c":"Grid_Connection_required__c == true AND Building_Permit_required__c == true", "Gantt_Chart_Configuration__c":"a2X3M000000H5fGUAS", "Project__c":"a0i3M000000C8OyQAK", "Type__c":"Phase", "Name":"Building Permit", "RecordTypeId":"0123M0000005mSzQAI" }, { "Id":"a2Y3M000000AQHFUA4", "Start_Date_Field__c":"Location_Agreement_signed_by_all_A__c", "Use_Forecast_Fields__c":true, "Condition__c":"Separate_Location_Agreement__c == true", "Gantt_Chart_Configuration__c":"a2X3M000000H5fGUAS", "Project__c":"a0i3M000000C8OyQAK", "Type__c":"Event", "Name":"Location Agreement Signed", "RecordTypeId":"0123M0000005mT4QAI" }, { "Id":"a2Y3M000000DWztUAG", "End_Date_Field__c":"Building_Permit_Approved_A__c", "Start_Date_Field__c":"Hand_in_final_Building_Permit_A__c", "Use_Forecast_Fields__c":true, "Gantt_Chart_Configuration__c":"a2X3M000000H5fGUAS", "Project__c":"a0i3M000000C8OyQAK", "Type__c":"Phase", "Name":"Test Phase", "RecordTypeId":"0123M0000005mSzQAI" }, { "Id":"a2Y3M000000DWzoUAG", "Start_Date_Field__c":"sitetracker__Project_Start_Date_A__c", "Use_Forecast_Fields__c":true, "Gantt_Chart_Configuration__c":"a2X3M000000H5fGUAS", "Project__c":"a0i3M000000C8OyQAK", "Type__c":"Event", "Name":"Test Event", "RecordTypeId":"0123M0000005mT4QAI" }, { "Id":"a2Y3M000000AQHAUA4", "Start_Date_Field__c":"Contract_signed_by_Fastned_A__c", "Use_Forecast_Fields__c":true, "Condition__c":"Grid_Connection_required__c == true AND Building_Permit_required__c == true", "Gantt_Chart_Configuration__c":"a2X3M000000H5fGUAS", "Project__c":"a0i3M000000C8OyQAK", "Type__c":"Event", "Name":"Contract Signed", "RecordTypeId":"0123M0000005mT4QAI" }, { "Id":"a2Y3M000000AQH0UAO", "End_Date_Field__c":"Energize_grid_connection_A__c", "Start_Date_Field__c":"Sign_GC_contract_A__c", "Use_Forecast_Fields__c":true, "Condition__c":"Grid_Connection_required__c == true AND Building_Permit_required__c == true", "Gantt_Chart_Configuration__c":"a2X3M000000H5fGUAS", "Project__c":"a0i3M000000C8OyQAK", "Type__c":"Phase", "Name":"Grid Connection", "RecordTypeId":"0123M0000005mSzQAI" }, { "Id":"a2Y3M000000AQHKUA4", "Start_Date_Field__c":"Place_substation_A__c", "Use_Forecast_Fields__c":true, "Condition__c":"Grid_Connection_required__c == true AND Building_Permit_required__c == true", "Gantt_Chart_Configuration__c":"a2X3M000000H5fGUAS", "Project__c":"a0i3M000000C8OyQAK", "Type__c":"Event", "Name":"Substation Placement", "RecordTypeId":"0123M0000005mT4QAI" } ] }; // getGanttChartConfigurationsWrapper() // .then((configWrapper) => { let mainConfigObjects = configWrapper.configurations; this.configurationList = configWrapper.configurations; if (this.configurationNames?.length === 0 || this.mapOfConfigurationsByname.length === 0) { configWrapper.configurations.forEach(element => {
if (element?.Name != undefined) { this.configurationNames.push(element.Name); this.mapOfConfigurationsByname.set(element.Name, element); } }) this.currentConfigurationUsed = mainConfigObjects[0];
} console.log('configWrapper.phaseEvents', configWrapper.phaseEvents); this.currentconfigPhasesAndEvents = configWrapper.phaseEvents; let fieldsToBeDisplayed = this.currentConfigurationUsed.Display_Fields__c; let groupByField = this.currentConfigurationUsed.Grouping_By__c; // }) // .catch((error) => { // console.log('error: ', error); // this.error = error; // this.configWrapper = undefined; // }); } }

Post by alex.l »

Hi revill,

Unfortunately, we cannot check your data, because it's too custom and cannot be applied to any of our applications. The code you posted above cannot be ran because of many dependencies that we actually can't resolve.
Please provide a runnable test case that we might debug.

All the best,
Alex


Post by revill »

Hi Alex,
could you kindly provide me information what kind of dependencies are there? Because from my point of view it should be runnable, I removed all calls to the apex classes and all calls to the org and replaced it with mocked data. I don't know what else could cause problems.

Thank you in advance,
Revill


Post Reply