import React, { Fragment, useEffect, useState } from 'react'; import { Breadcrumb, BreadcrumbItem, Row, Col, Card, CardBody, Button, ButtonGroup, Form, FormGroup, Input, Label, CustomInput, Spinner, } from 'reactstrap'; import CountUp from 'react-countup'; import Datetime from 'react-datetime'; import moment from 'moment'; import loadable from '@loadable/component'; import Cascader from 'rc-cascader'; import CardSummary from '../common/CardSummary'; import LineChart from '../common/LineChart'; import SharePie from '../common/SharePie'; import { getCookieValue, createCookie } from '../../../helpers/utils'; import withRedirect from '../../../hoc/withRedirect'; import { withTranslation } from 'react-i18next'; import { toast } from 'react-toastify'; import ButtonIcon from '../../common/ButtonIcon'; import { APIBaseURL } from '../../../config'; import { periodTypeOptions } from '../common/PeriodTypeOptions'; import { comparisonTypeOptions } from '../common/ComparisonTypeOptions'; const DetailedDataTable = loadable(() => import('../common/DetailedDataTable')); const TenantSaving = ({ setRedirect, setRedirectUrl, t }) => { let current_moment = moment(); useEffect(() => { let is_logged_in = getCookieValue('is_logged_in'); let user_name = getCookieValue('user_name'); let user_display_name = getCookieValue('user_display_name'); let user_uuid = getCookieValue('user_uuid'); let token = getCookieValue('token'); if (is_logged_in === null || !is_logged_in) { setRedirectUrl(`/authentication/basic/login`); setRedirect(true); } else { //update expires time of cookies createCookie('is_logged_in', true, 1000 * 60 * 60 * 8); createCookie('user_name', user_name, 1000 * 60 * 60 * 8); createCookie('user_display_name', user_display_name, 1000 * 60 * 60 * 8); createCookie('user_uuid', user_uuid, 1000 * 60 * 60 * 8); createCookie('token', token, 1000 * 60 * 60 * 8); } }); // State // Query Parameters const [selectedSpaceName, setSelectedSpaceName] = useState(undefined); const [selectedSpaceID, setSelectedSpaceID] = useState(undefined); const [tenantList, setTenantList] = useState([]); const [selectedTenant, setSelectedTenant] = useState(undefined); const [comparisonType, setComparisonType] = useState('month-on-month'); const [periodType, setPeriodType] = useState('daily'); const [basePeriodBeginsDatetime, setBasePeriodBeginsDatetime] = useState(current_moment.clone().subtract(1, 'months').startOf('month')); const [basePeriodEndsDatetime, setBasePeriodEndsDatetime] = useState(current_moment.clone().subtract(1, 'months')); const [basePeriodBeginsDatetimeDisabled, setBasePeriodBeginsDatetimeDisabled] = useState(true); const [basePeriodEndsDatetimeDisabled, setBasePeriodEndsDatetimeDisabled] = useState(true); const [reportingPeriodBeginsDatetime, setReportingPeriodBeginsDatetime] = useState(current_moment.clone().startOf('month')); const [reportingPeriodEndsDatetime, setReportingPeriodEndsDatetime] = useState(current_moment); const [cascaderOptions, setCascaderOptions] = useState(undefined); // buttons const [submitButtonDisabled, setSubmitButtonDisabled] = useState(true); const [spinnerHidden, setSpinnerHidden] = useState(true); const [exportButtonHidden, setExportButtonHidden] = useState(true); //Results const [TCEShareData, setTCEShareData] = useState([]); const [TCO2EShareData, setTCO2EShareData] = useState([]); const [cardSummaryList, setCardSummaryList] = useState([]); const [totalInTCE, setTotalInTCE] = useState({}); const [totalInTCO2E, setTotalInTCO2E] = useState({}); const [tenantLineChartLabels, setTenantLineChartLabels] = useState([]); const [tenantLineChartData, setTenantLineChartData] = useState({}); const [tenantLineChartOptions, setTenantLineChartOptions] = useState([]); const [parameterLineChartLabels, setParameterLineChartLabels] = useState([]); const [parameterLineChartData, setParameterLineChartData] = useState({}); const [parameterLineChartOptions, setParameterLineChartOptions] = useState([]); const [detailedDataTableData, setDetailedDataTableData] = useState([]); const [detailedDataTableColumns, setDetailedDataTableColumns] = useState([{dataField: 'startdatetime', text: t('Datetime'), sort: true}]); const [excelBytesBase64, setExcelBytesBase64] = useState(undefined); useEffect(() => { let isResponseOK = false; fetch(APIBaseURL + '/spaces/tree', { method: 'GET', headers: { "Content-type": "application/json", "User-UUID": getCookieValue('user_uuid'), "Token": getCookieValue('token') }, body: null, }).then(response => { console.log(response); if (response.ok) { isResponseOK = true; } return response.json(); }).then(json => { console.log(json); if (isResponseOK) { // rename keys json = JSON.parse(JSON.stringify([json]).split('"id":').join('"value":').split('"name":').join('"label":')); setCascaderOptions(json); setSelectedSpaceName([json[0]].map(o => o.label)); setSelectedSpaceID([json[0]].map(o => o.value)); // get Tenants by root Space ID let isResponseOK = false; fetch(APIBaseURL + '/spaces/' + [json[0]].map(o => o.value) + '/tenants', { method: 'GET', headers: { "Content-type": "application/json", "User-UUID": getCookieValue('user_uuid'), "Token": getCookieValue('token') }, body: null, }).then(response => { if (response.ok) { isResponseOK = true; } return response.json(); }).then(json => { if (isResponseOK) { json = JSON.parse(JSON.stringify([json]).split('"id":').join('"value":').split('"name":').join('"label":')); console.log(json); setTenantList(json[0]); if (json[0].length > 0) { setSelectedTenant(json[0][0].value); // enable submit button setSubmitButtonDisabled(false); } else { setSelectedTenant(undefined); // disable submit button setSubmitButtonDisabled(true); } } else { toast.error(json.description) } }).catch(err => { console.log(err); }); // end of get Tenants by root Space ID } else { toast.error(json.description); } }).catch(err => { console.log(err); }); }, []); const labelClasses = 'ls text-uppercase text-600 font-weight-semi-bold mb-0'; let onSpaceCascaderChange = (value, selectedOptions) => { setSelectedSpaceName(selectedOptions.map(o => o.label).join('/')); setSelectedSpaceID(value[value.length - 1]); let isResponseOK = false; fetch(APIBaseURL + '/spaces/' + value[value.length - 1] + '/tenants', { method: 'GET', headers: { "Content-type": "application/json", "User-UUID": getCookieValue('user_uuid'), "Token": getCookieValue('token') }, body: null, }).then(response => { if (response.ok) { isResponseOK = true; } return response.json(); }).then(json => { if (isResponseOK) { json = JSON.parse(JSON.stringify([json]).split('"id":').join('"value":').split('"name":').join('"label":')); console.log(json) setTenantList(json[0]); if (json[0].length > 0) { setSelectedTenant(json[0][0].value); // enable submit button setSubmitButtonDisabled(false); } else { setSelectedTenant(undefined); // disable submit button setSubmitButtonDisabled(true); } } else { toast.error(json.description) } }).catch(err => { console.log(err); }); } let onComparisonTypeChange = ({ target }) => { console.log(target.value); setComparisonType(target.value); if (target.value === 'year-over-year') { setBasePeriodBeginsDatetimeDisabled(true); setBasePeriodEndsDatetimeDisabled(true); setBasePeriodBeginsDatetime(moment(reportingPeriodBeginsDatetime).subtract(1, 'years')); setBasePeriodEndsDatetime(moment(reportingPeriodEndsDatetime).subtract(1, 'years')); } else if (target.value === 'month-on-month') { setBasePeriodBeginsDatetimeDisabled(true); setBasePeriodEndsDatetimeDisabled(true); setBasePeriodBeginsDatetime(moment(reportingPeriodBeginsDatetime).subtract(1, 'months')); setBasePeriodEndsDatetime(moment(reportingPeriodEndsDatetime).subtract(1, 'months')); } else if (target.value === 'free-comparison') { setBasePeriodBeginsDatetimeDisabled(false); setBasePeriodEndsDatetimeDisabled(false); } else if (target.value === 'none-comparison') { setBasePeriodBeginsDatetime(undefined); setBasePeriodEndsDatetime(undefined); setBasePeriodBeginsDatetimeDisabled(true); setBasePeriodEndsDatetimeDisabled(true); } } let onBasePeriodBeginsDatetimeChange = (newDateTime) => { setBasePeriodBeginsDatetime(newDateTime); } let onBasePeriodEndsDatetimeChange = (newDateTime) => { setBasePeriodEndsDatetime(newDateTime); } let onReportingPeriodBeginsDatetimeChange = (newDateTime) => { setReportingPeriodBeginsDatetime(newDateTime); if (comparisonType === 'year-over-year') { setBasePeriodBeginsDatetime(newDateTime.clone().subtract(1, 'years')); } else if (comparisonType === 'month-on-month') { setBasePeriodBeginsDatetime(newDateTime.clone().subtract(1, 'months')); } } let onReportingPeriodEndsDatetimeChange = (newDateTime) => { setReportingPeriodEndsDatetime(newDateTime); if (comparisonType === 'year-over-year') { setBasePeriodEndsDatetime(newDateTime.clone().subtract(1, 'years')); } else if (comparisonType === 'month-on-month') { setBasePeriodEndsDatetime(newDateTime.clone().subtract(1, 'months')); } } var getValidBasePeriodBeginsDatetimes = function (currentDate) { return currentDate.isBefore(moment(basePeriodEndsDatetime, 'MM/DD/YYYY, hh:mm:ss a')); } var getValidBasePeriodEndsDatetimes = function (currentDate) { return currentDate.isAfter(moment(basePeriodBeginsDatetime, 'MM/DD/YYYY, hh:mm:ss a')); } var getValidReportingPeriodBeginsDatetimes = function (currentDate) { return currentDate.isBefore(moment(reportingPeriodEndsDatetime, 'MM/DD/YYYY, hh:mm:ss a')); } var getValidReportingPeriodEndsDatetimes = function (currentDate) { return currentDate.isAfter(moment(reportingPeriodBeginsDatetime, 'MM/DD/YYYY, hh:mm:ss a')); } // Handler const handleSubmit = e => { e.preventDefault(); console.log('handleSubmit'); console.log(selectedSpaceID); console.log(selectedTenant); console.log(comparisonType); console.log(periodType); console.log(basePeriodBeginsDatetime != null ? basePeriodBeginsDatetime.format('YYYY-MM-DDTHH:mm:ss') : undefined); console.log(basePeriodEndsDatetime != null ? basePeriodEndsDatetime.format('YYYY-MM-DDTHH:mm:ss') : undefined); console.log(reportingPeriodBeginsDatetime.format('YYYY-MM-DDTHH:mm:ss')); console.log(reportingPeriodEndsDatetime.format('YYYY-MM-DDTHH:mm:ss')); // disable submit button setSubmitButtonDisabled(true); // show spinner setSpinnerHidden(false); // hide export buttion setExportButtonHidden(true) // Reinitialize tables setDetailedDataTableData([]); let isResponseOK = false; fetch(APIBaseURL + '/reports/tenantsaving?' + 'tenantid=' + selectedTenant + '&periodtype=' + periodType + '&baseperiodstartdatetime=' + (basePeriodBeginsDatetime != null ? basePeriodBeginsDatetime.format('YYYY-MM-DDTHH:mm:ss') : '') + '&baseperiodenddatetime=' + (basePeriodEndsDatetime != null ? basePeriodEndsDatetime.format('YYYY-MM-DDTHH:mm:ss') : '') + '&reportingperiodstartdatetime=' + reportingPeriodBeginsDatetime.format('YYYY-MM-DDTHH:mm:ss') + '&reportingperiodenddatetime=' + reportingPeriodEndsDatetime.format('YYYY-MM-DDTHH:mm:ss'), { method: 'GET', headers: { "Content-type": "application/json", "User-UUID": getCookieValue('user_uuid'), "Token": getCookieValue('token') }, body: null, }).then(response => { if (response.ok) { isResponseOK = true; }; return response.json(); }).then(json => { if (isResponseOK) { console.log(json) let cardSummaryArray = [] json['reporting_period']['names'].forEach((currentValue, index) => { let cardSummaryItem = {} cardSummaryItem['name'] = json['reporting_period']['names'][index]; cardSummaryItem['unit'] = json['reporting_period']['units'][index]; cardSummaryItem['subtotal'] = json['reporting_period']['subtotals_saving'][index]; cardSummaryItem['increment_rate'] = parseFloat(json['reporting_period']['increment_rates_saving'][index] * 100).toFixed(2) + "%"; cardSummaryItem['subtotal_per_unit_area'] = json['reporting_period']['subtotals_per_unit_area_saving'][index]; cardSummaryArray.push(cardSummaryItem); }); setCardSummaryList(cardSummaryArray); let totalInTCE = {}; totalInTCE['value'] = json['reporting_period']['total_in_kgce_saving'] / 1000; // convert from kg to t totalInTCE['increment_rate'] = parseFloat(json['reporting_period']['increment_rate_in_kgce_saving'] * 100).toFixed(2) + "%"; totalInTCE['value_per_unit_area'] = json['reporting_period']['total_in_kgce_per_unit_area_saving'] / 1000; // convert from kg to t setTotalInTCE(totalInTCE); let totalInTCO2E = {}; totalInTCO2E['value'] = json['reporting_period']['total_in_kgco2e_saving'] / 1000; // convert from kg to t totalInTCO2E['increment_rate'] = parseFloat(json['reporting_period']['increment_rate_in_kgco2e_saving'] * 100).toFixed(2) + "%"; totalInTCO2E['value_per_unit_area'] = json['reporting_period']['total_in_kgco2e_per_unit_area_saving'] / 1000; // convert from kg to t setTotalInTCO2E(totalInTCO2E); let TCEDataArray = []; json['reporting_period']['names'].forEach((currentValue, index) => { let TCEDataItem = {} TCEDataItem['id'] = index; TCEDataItem['name'] = currentValue; TCEDataItem['value'] = json['reporting_period']['subtotals_in_kgce_saving'][index] / 1000; // convert from kg to t TCEDataItem['color'] = "#"+((1<<24)*Math.random()|0).toString(16); TCEDataArray.push(TCEDataItem); }); setTCEShareData(TCEDataArray); let TCO2EDataArray = []; json['reporting_period']['names'].forEach((currentValue, index) => { let TCO2EDataItem = {} TCO2EDataItem['id'] = index; TCO2EDataItem['name'] = currentValue; TCO2EDataItem['value'] = json['reporting_period']['subtotals_in_kgco2e_saving'][index] / 1000; // convert from kg to t TCO2EDataItem['color'] = "#"+((1<<24)*Math.random()|0).toString(16); TCO2EDataArray.push(TCO2EDataItem); }); setTCO2EShareData(TCO2EDataArray); let timestamps = {} json['reporting_period']['timestamps'].forEach((currentValue, index) => { timestamps['a' + index] = currentValue; }); setTenantLineChartLabels(timestamps); let values = {} json['reporting_period']['values_saving'].forEach((currentValue, index) => { values['a' + index] = currentValue; }); setTenantLineChartData(values); let names = Array(); json['reporting_period']['names'].forEach((currentValue, index) => { let unit = json['reporting_period']['units'][index]; names.push({ 'value': 'a' + index, 'label': currentValue + ' (' + unit + ')'}); }); setTenantLineChartOptions(names); timestamps = {} json['parameters']['timestamps'].forEach((currentValue, index) => { timestamps['a' + index] = currentValue; }); setParameterLineChartLabels(timestamps); values = {} json['parameters']['values'].forEach((currentValue, index) => { values['a' + index] = currentValue; }); setParameterLineChartData(values); names = Array(); json['parameters']['names'].forEach((currentValue, index) => { if (currentValue.startsWith('TARIFF-')) { currentValue = t('Tariff') + currentValue.replace('TARIFF-', '-'); } names.push({ 'value': 'a' + index, 'label': currentValue }); }); setParameterLineChartOptions(names); let detailed_value_list = []; if (json['reporting_period']['timestamps'].length > 0) { json['reporting_period']['timestamps'][0].forEach((currentTimestamp, timestampIndex) => { let detailed_value = {}; detailed_value['id'] = timestampIndex; detailed_value['startdatetime'] = currentTimestamp; json['reporting_period']['values_saving'].forEach((currentValue, energyCategoryIndex) => { detailed_value['a' + energyCategoryIndex] = json['reporting_period']['values_saving'][energyCategoryIndex][timestampIndex]; }); detailed_value_list.push(detailed_value); }); }; let detailed_value = {}; detailed_value['id'] = detailed_value_list.length; detailed_value['startdatetime'] = t('Subtotal'); json['reporting_period']['subtotals_saving'].forEach((currentValue, index) => { detailed_value['a' + index] = currentValue; }); detailed_value_list.push(detailed_value); setDetailedDataTableData(detailed_value_list); let detailed_column_list = []; detailed_column_list.push({ dataField: 'startdatetime', text: t('Datetime'), sort: true }) json['reporting_period']['names'].forEach((currentValue, index) => { let unit = json['reporting_period']['units'][index]; detailed_column_list.push({ dataField: 'a' + index, text: currentValue + ' (' + unit + ')', sort: true, formatter: function (decimalValue) { return decimalValue.toFixed(2); } }) }); setDetailedDataTableColumns(detailed_column_list); setExcelBytesBase64(json['excel_bytes_base64']); // enable submit button setSubmitButtonDisabled(false); // hide spinner setSpinnerHidden(true); // show export buttion setExportButtonHidden(false); } else { toast.error(json.description) } }).catch(err => { console.log(err); }); }; const handleExport = e => { e.preventDefault(); const mimeType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' const fileName = 'tenantsaving.xlsx' var fileUrl = "data:" + mimeType + ";base64," + excelBytesBase64; fetch(fileUrl) .then(response => response.blob()) .then(blob => { var link = window.document.createElement("a"); link.href = window.URL.createObjectURL(blob, { type: mimeType }); link.download = fileName; document.body.appendChild(link); link.click(); document.body.removeChild(link); }); }; return (
{t('Tenant Data')}{t('Saving')}

setSelectedTenant(target.value)} > {tenantList.map((tenant, index) => ( ))} {comparisonTypeOptions.map((comparisonType, index) => ( ))} setPeriodType(target.value)} > {periodTypeOptions.map((periodType, index) => ( ))}





{cardSummaryList.map(cardSummaryItem => ( {cardSummaryItem['subtotal'] && } ))} {totalInTCE['value'] && } {totalInTCO2E['value'] && }

); }; export default withTranslation()(withRedirect(TenantSaving));