def calculate_assumed_expenses(client,
                                project,
                                expected_actuals_df,
                                level,
                                parent: dict = None):
     progress = collection.get_document("Data",
                                        client=client,
                                        project=project,
                                        data_set="progress")
     n_houses = float(progress.get("totaal"))
     if parent:
         parent_value = (parent.get("value")
                         if parent.get("value") != "has" else "hpend")
     else:
         parent_value = None
     progress_percent = {
         k if k != "hpend" else "has": float(v) / n_houses
         for k, v in progress.items()
         if k in ([parent_value]
                  if parent else ["schouwen", "montage", "civiel", "hpend"])
     }
     if parent:
         assumed_expenses_df = (pd.Series({
             v[level]: v["bedrag"] * progress_percent.get(
                 "has" if parent_value == "hpend" else parent_value, 0)
             for k, v in expected_actuals_df.iterrows()
         }).dropna().to_frame().reset_index())
     else:
         assumed_expenses_df = ((
             expected_actuals_df.set_index(level).bedrag *
             pd.Series(progress_percent)).dropna().to_frame().reset_index())
     assumed_expenses_df.columns = [level, "bedrag"]
     return assumed_expenses_df
    def financial_storage(dropdown_selection, client=client):
        if dropdown_selection:
            warnings = [
                # dbc.Alert("Operationele voortgang voor civiel word berekend o.b.v. het status_civiel veld"
                #           " i.p.v. de opleverstatus", color="info")
            ]
            finances = collection.get_document(collection="Finance",
                                               project=dropdown_selection,
                                               client=client)
            finance_document_names = {
                "expected_actuals": "Prognose einde werk",
                "budget": "Begroting",
                "actuals": "Realisatie",
            }
            missing_document_consequence = {
                "expected_actuals":
                "De begroting word nu als referentie gebruikt."
                "De prognose einde werk wordt gelijkgesteld aan de begroting."
            }
            for document, value in finances.items():
                if not value:
                    warnings.append(
                        dbc.Alert(
                            f"{dropdown_selection} heeft geen {finance_document_names[document]}. "
                            f"{missing_document_consequence.get(document, '')}",
                            color="warning",
                        ))

                    if document == "expected_actuals":
                        finances[document] = finances["budget"]
            return [warnings]
        return [None]
 def budget_bar_category(dropdown_selection, project, client=client):
     data = collection.get_document(collection="Finance",
                                    project=dropdown_selection,
                                    client=client)
     if data:
         fig = calculate_figure(client, project, data, "categorie")
         return [fig]
     return [no_graph("Barchart")]
def pie_chart(client, key="overview"):
    if key == "overview":
        fig = collection.get_document(collection="Data",
                                      client=client,
                                      graph_name="reden_na_overview")["figure"]
    else:
        fig = collection.get_document(
            collection="Data",
            client=client,
            graph_name="reden_na_projects",
            project="pie_na_" + key,
        )["figure"]
    data = fig["data"]
    trace = go.Pie(data)
    layout = fig["layout"]
    data = [trace]
    fig = go.Figure(data, layout=layout)
    return fig
 def load_year_dropdown(dummy_data, reset, client=client):
     return [
         [
             {"label": year, "value": year}
             for year in collection.get_document(
                 collection="Data", client=client, graph_name="List_of_years"
             )
         ],
         str(datetime.now().year),
     ]
Beispiel #6
0
def fetch_data_for_status_redenna_piechart(project_name, client, click_filter=None):

    counts = pd.DataFrame(
        collection.get_document(
            collection="Indicators",
            graph_name="ActualStatusBarChartIndicator",
            project=project_name,
            client=client,
        )
    )

    if not counts.empty:
        clusters = config.client_config[client]["clusters_reden_na"]
        cluster_types = pd.CategoricalDtype(
            categories=list(clusters.keys()), ordered=True
        )
        counts["cluster_redenna"] = counts["cluster_redenna"].astype(cluster_types)

        mask = pd.Series([True]).repeat(len(counts.index)).values
        if click_filter:
            for col, value in click_filter.items():
                mask = mask & (counts[col] == value)
            cols_filter = list(click_filter.keys())
        else:
            cols_filter = []

        cols = list(dict.fromkeys(cols_filter + ["cluster_redenna"])) + ["laagbouw"]
        result = counts[mask][cols + ["count"]].groupby(cols).sum().reset_index()

        total = (
            result.groupby("cluster_redenna")
            .sum()
            .reset_index()[["cluster_redenna", "count"]]
        )
        laagbouw = (
            result[result.laagbouw]
            .groupby("cluster_redenna")
            .sum()
            .reset_index()[["cluster_redenna", "count"]]
        )
        hoogbouw = (
            result[~result.laagbouw]
            .groupby("cluster_redenna")
            .sum()
            .reset_index()[["cluster_redenna", "count"]]
        )

    else:
        total = pd.DataFrame()
        laagbouw = pd.DataFrame()
        hoogbouw = pd.DataFrame()

    return total, laagbouw, hoogbouw
Beispiel #7
0
def get_search_bar(client, project):
    return [
        html.Div(
            [
                dcc.Dropdown(
                    id=f"project-dropdown-{client}",
                    options=collection.get_document(
                        collection="Data",
                        client=client,
                        graph_name="project_names").get("filters"),
                    value=project if project else None,
                    placeholder="Select a project",
                )
            ],
            className="two-third column",
        ),
        html.Div(
            children=html.Div(
                children=[
                    dcc.Dropdown(
                        id=f"year-dropdown-{client}",
                        placeholder="Select a year",
                        clearable=False,
                    ),
                ],
                className="column",
                style={"width": "77px"},
            ),
            className="container-display",
        ),
        html.Div([
            dbc.Button(
                "Reset overzicht",
                id=f"overview-reset-{client}",
                n_clicks=0,
                style={
                    "margin-left": "10px",
                    "margin-right": "55px",
                    "background-color": colors["vwt_blue"],
                },
            )
        ]),
        html.Div(
            [
                dbc.Button(
                    "Terug naar overzicht alle projecten",
                    id="overzicht-button-" + client,
                    style={"background-color": colors["vwt_blue"]},
                )
            ],
            className="one-third column",
        ),
    ]
def clickbar_lb(drop_selectie, mask_all):
    fig = collection.get_document(
        collection="Data",
        graph_name="status_bar_chart",
        project=drop_selectie,
        filter=mask_all,
    )["bar"]
    bar = {}
    for key in fig:
        if "LB" in key:
            bar[key] = [int(fig[key])]
    labels = ["Schouwen", "BIS", "Montage-lasAP", "Montage-lasDP", "HAS"]
    barLB1HC = dict(
        x=labels,
        y=bar["SchouwenLB1"] + bar["BISLB1"] + bar["Montage-lasAPLB1"] +
        bar["Montage-lasDPLB1"] + bar["HASLB1"],
        name="Opgeleverd HC",
        type="bar",
        marker=dict(color=colors["green"]),
    )
    barLB1HP = dict(
        x=labels,
        y=[0] + [0] + [0] + [0] + bar["HASLB1HP"],
        name="Opgeleverd zonder HC",
        type="bar",
        marker=dict(color=colors["yellow"]),
    )
    barLB0 = dict(
        x=labels,
        y=bar["SchouwenLB0"] + bar["BISLB0"] + bar["Montage-lasAPLB0"] +
        bar["Montage-lasDPLB0"] + bar["HASLB0"],
        name="Niet opgeleverd",
        type="bar",
        marker=dict(color=colors["red"]),
    )
    fig = dict(
        data=[barLB1HC, barLB1HP, barLB0],
        layout=dict(
            barmode="stack",
            clickmode="event+select",
            showlegend=True,
            height=350,
            plot_bgcolor=colors["plot_bgcolor"],
            paper_bgcolor=colors["paper_bgcolor"],
            title={
                "text":
                "Status oplevering per fase (LB)<br>[selectie resets na 3x klikken]:",
                "x": 0.5,
            },
            yaxis={"title": "[aantal woningen]"},
        ),
    )
    return fig
 def budget_bar_sub_category(click, project, client=client):
     ctx = dash.callback_context
     if "budget-bar-category" in [
             x["prop_id"].rpartition("-")[0] for x in ctx.triggered
     ]:
         for point in click.get("points", []):
             data = collection.get_document(collection="Finance",
                                            project=project,
                                            client=client)
             if data:
                 parent = dict(level="categorie", value=point.get("label"))
                 fig = calculate_figure(client, project, data,
                                        "sub_categorie", parent)
                 return [fig, point.get("label")]
             break
     return [no_graph(text="Geen selectie"), ""]
Beispiel #10
0
def fetch_data_productionstatus(project, client, freq, phase_name, unit_type=""):
    indicator_values = {}
    timeseries = {}
    name_indicator = {
        "target": "Target",
        "poc_verwacht": "Gerealiseerd & verwacht verloop",
        "poc_ideal": "Gerealiseerd & ideaal verloop",
        "work_stock": "Totale productie voorafgaande fase",
        "work_stock_amount": "Hoeveelheid Werkvoorraad",
    }
    line_graph_bool = False
    for key in [
        "target",
        "work_stock",
        "poc_verwacht",
        "poc_ideal",
        "work_stock_amount",
    ]:
        indicator_dict = collection.get_document(
            collection="Lines",
            line=key + "_indicator" + unit_type,
            project=project,
            client=client,
            phase=phase_name,
        )
        if indicator_dict:
            line_graph_bool = True
            indicator_values[name_indicator[key]] = int(indicator_dict["next_" + freq])
            timeseries[name_indicator[key]] = pd.Series(
                indicator_dict["series_" + freq]
            )
        else:
            indicator_values[name_indicator[key]] = 0
            timeseries[name_indicator[key]] = pd.Series()

    if indicator_values["Hoeveelheid Werkvoorraad"] < 0:
        indicator_values["Hoeveelheid Werkvoorraad"] = 0
    if phase_name == "geulen":
        indicator_values["Hoeveelheid Werkvoorraad"] = None

    del timeseries["Hoeveelheid Werkvoorraad"]

    return indicator_values, timeseries, line_graph_bool
def info_table():
    document = collection.get_document(collection="Graphs",
                                       client="kpn",
                                       graph_name="info_table")
    df = pd.read_json(document["table"], orient="records")
    df = df[document["col"]]
    fig = dash_table.DataTable(
        columns=[{
            "name": i,
            "id": i
        } for i in df.columns],
        data=df.to_dict("rows"),
        filter_action="native",
        sort_action="native",
        style_table={"overflowX": "auto"},
        style_header=table_styles["header"],
        style_cell=table_styles["cell"]["action"],
        style_filter=table_styles["filter"],
        css=[{
            "selector": "table",
            "rule": "width: 100%;"
        }],
    )
    return fig
 def load_dropdown(dummy_data, client=client):
     return [
         collection.get_document(
             collection="Data", client=client, graph_name="project_names"
         )["filters"]
     ]
    def progress_over_time(click, project, client=client):
        ctx = dash.callback_context
        if "budget-bar-category" in [
                x["prop_id"].rpartition("-")[0] for x in ctx.triggered
        ]:
            for point in click.get("points", []):

                finance_data = collection.get_document(collection="Finance",
                                                       project=project,
                                                       client=client)

                if finance_data:
                    parent = dict(level="categorie", value=point.get("label"))
                    actuals_df = pd.DataFrame(
                        finance_data.get("actuals", {
                            parent.get("level"): [],
                            "bedrag": []
                        }))
                    actuals_df = actuals_df[actuals_df[parent.get("level")] ==
                                            parent.get("value")]
                    time_series = (actuals_df.groupby("vastlegdatum")
                                   ["bedrag"].sum().sort_index().cumsum())

                    if "expected_actuals" in finance_data:
                        expected_cost = pd.DataFrame(
                            finance_data.get(
                                "expected_actuals",
                                {
                                    parent.get("level"): [],
                                    "bedrag": []
                                },
                            ))
                    else:
                        expected_cost = pd.DataFrame(
                            finance_data.get("budget", {
                                parent.get("level"): [],
                                "bedrag": []
                            }))

                    expected_cost = expected_cost[expected_cost[parent.get(
                        "level")] == parent.get("value")].bedrag.sum()

                    traces = [
                        go.Scatter(
                            x=time_series.index,
                            y=time_series,
                            mode="lines+markers",
                            name="Financieel",
                            line=dict(color=config.colors_vwt["vwt_blue"]),
                        )
                    ]

                    if parent.get("value") in [
                            "has", "civiel", "montage", "schouwen"
                    ]:
                        progress_data = collection.get_document(
                            collection="Data",
                            project=project,
                            client=client,
                            data_set="progress_over_time",
                        )

                        traces.append(
                            get_progress_scatter(
                                expected_cost,
                                progress_data,
                                parent.get("value"),
                                color=config.colors_vwt["darkgray"],
                            ))

                    fig = go.Figure(data=traces)
                    fig.update_layout(
                        height=500,
                        paper_bgcolor=config.colors_vwt["paper_bgcolor"],
                        plot_bgcolor=config.colors_vwt["plot_bgcolor"],
                    )
                    return [fig, parent.get("value")]
                break
        return [no_graph(text="Geen selectie"), ""]
Beispiel #14
0
def fetch_data_for_status_barchart(project_name, client, click_filter=None):

    counts = pd.DataFrame(
        collection.get_document(
            collection="Indicators",
            graph_name="ActualStatusBarChartIndicator",
            project=project_name,
            client=client,
        )
    )

    categories = [
        "schouw_status",
        "bis_status",
        "lasAP_status",
        "lasDP_status",
        "HAS_status",
    ]

    phase_category = pd.CategoricalDtype(categories=categories)

    status_category = pd.CategoricalDtype(
        categories=[
            "niet_opgeleverd",
            "ingeplanned",
            "opgeleverd",
            "opgeleverd_zonder_hc",
        ]
    )

    if not counts.empty:
        mask = pd.Series([True]).repeat(len(counts.index)).values
        if click_filter:
            for col, value in click_filter.items():
                mask = mask & (counts[col] == value)
            cols_filter = list(click_filter.keys())
        else:
            cols_filter = []

        laagbouw_matrix = []
        hoogbouw_matrix = []

        for category in categories:
            cols = list(dict.fromkeys(cols_filter + [category])) + ["laagbouw"]
            result = counts[mask][cols + ["count"]].groupby(cols).sum().reset_index()

            lb = result[result.laagbouw][[category, "count"]]
            for i, row in lb.iterrows():
                laagbouw_matrix.append([category] + row.values.tolist())

            hb = result[~result.laagbouw][[category, "count"]]
            for i, row in hb.iterrows():
                hoogbouw_matrix.append([category] + row.values.tolist())

        lb_df = pd.DataFrame(laagbouw_matrix, columns=["phase", "status", "count"])
        lb_df["status"] = lb_df.status.astype(status_category)
        lb_df["phase"] = lb_df.phase.astype(phase_category)
        lb_df = lb_df.groupby(by=["phase", "status"]).sum().reset_index()
        if lb_df.empty:
            lb_df["count"] = 0
        else:
            lb_df["count"] = lb_df["count"].fillna(0)
        data_laagbouw = lb_df

        hb_df = pd.DataFrame(hoogbouw_matrix, columns=["phase", "status", "count"])
        hb_df["status"] = hb_df.status.astype(status_category)
        hb_df["phase"] = hb_df.phase.astype(phase_category)
        hb_df = hb_df.groupby(by=["phase", "status"]).sum().reset_index()
        if hb_df.empty:
            hb_df["count"] = 0
        else:
            hb_df["count"] = hb_df["count"].fillna(0)
        data_hoogbouw = hb_df

    else:
        data_laagbouw = pd.DataFrame()
        data_hoogbouw = pd.DataFrame()

    return data_laagbouw, data_hoogbouw
Beispiel #15
0
def fetch_data_for_project_info_table(client):
    return collection.get_document(
        collection="ProjectInfo", graph_name="project_dates", client=client
    )