import { Component, OnInit } from "@angular/core"; import { BuildingService } from "../service/monitoring-api.service"; import { CostManagementService } from "../service/cost-management.service"; import { NgbModal } from "@ng-bootstrap/ng-bootstrap"; import { ModalAddActualComponent } from "./modal-add-actual/modal-add-actual.component"; import "chartist-plugin-tooltips"; import { ModalExportComponent } from "./modal-export/modal-export.component"; import { TableexcelService } from "src/app/_services/tableexcel.service"; import { ToastrService } from "ngx-toastr"; import { LoginService } from "../service/login.service"; @Component({ selector: "app-cost-management", templateUrl: "./cost-management.component.html", styleUrls: ["./cost-management.component.css"], }) export class CostManagementComponent implements OnInit { public breadcrumb: any; data: any; filteredRows: any[]; data_cost: any; searchTerm: string = ""; kwhTerm: string = ""; costTerm: string = ""; rows: any = []; dataMasterCategori: any; dataBuildingList: any; public focucedElement = ""; spinnerActive = false; spinnerActiveActual = false; spinnerFilterActive = false; barChart: any; dateSelected: any; buildingSelected: any; categorySelected: any; dataCompPrev: any; dataCompAct: any; storedData: any; chartOption: any; chartOption2: any; spinnerExportActive = false; constructor( private monitoringApiService: BuildingService, private costService: CostManagementService, private modalService: NgbModal, private tableexcelService: TableexcelService, private toastr: ToastrService, private authService: LoginService ) {} ngOnInit() { this.authService.checkTokenAndRedirect(); this.breadcrumb = { mainlabel: "Cost Management", links: [ { name: "Home", isLink: false, }, { name: "Cost Management", isLink: false, }, ], }; this.storedData = JSON.parse(localStorage.getItem("currentUser")); this.buildingSelected = this.storedData.buildingId; const currentDate = new Date(); this.dateSelected = currentDate.toISOString().slice(0, 7); this.fetchData( this.storedData.buildingId, this.dateSelected, this.categorySelected ); this.dataListMaster(); this.dataListBuilding(); this.dataCompPrevMonthCost(this.storedData.buildingId); this.dataCompActEstCost(this.storedData.buildingId); } fetchData(id, period, category) { this.costService .getCostManagement(id, period, category) .subscribe((response) => { this.data = response.results.data; this.filteredRows = this.data; this.kwhTerm = response.results.kwh; this.costTerm = response.results.cost; this.data_cost = this.filteredRows.map((item) => ({ building: item.name, roomName: item.room_name, categoryName: item.category_name, estimationCost: item.estimation_cost, totalUse: item.total_use, endDate: this.convertToUTC7(item.end_date), // endDate: item.end_date, statusId: item.status_id, categoryId: item.category_id, roomId: item.room_id, })); console.log(this.data_cost); }); } convertToUTC7(dateString: string): string { const date = new Date(dateString); const utc7Offset = 7 * 60; // UTC+7 in minutes const localOffset = date.getTimezoneOffset(); const totalOffset = utc7Offset - localOffset; const utc7Date = new Date(date.getTime() + totalOffset * 60 * 1000); return utc7Date.toISOString(); } dataListMaster() { this.monitoringApiService.getMasterListData().subscribe((data) => { const dataCategory = data.data.find( (item) => item.name === "master_category" ).headerDetailParam; this.dataMasterCategori = dataCategory.filter( (item) => item.status === "2" ); }); } dataListBuilding() { this.monitoringApiService.getBuildingList().subscribe((data) => { this.dataBuildingList = data.data.filter((item) => item.statusId === 2); }); } dataCompPrevMonthCost(buildingId) { this.costService.getCompPrevMonthCost(buildingId).subscribe((data) => { this.dataCompPrev = data.data; this.chartOption = { grid: { left: "25%", right: "25%", top: "20%", bottom: "20%", }, // Add tooltip tooltip: { trigger: "axis", enterable: false, formatter: function (params) { return `${params[0].name}
${ params[0].seriesName }: Rp. ${params[0].value.toLocaleString()}`; }, }, // Add legend legend: false, // Add custom colors color: ["#BEF264"], // Horizontal axis xAxis: [ { type: "category", data: [this.dataCompPrev[0].name, this.dataCompPrev[1].name], axisLine: { show: true, lineStyle: { color: "#BEF264", width: 4, }, }, axisTick: { show: false, }, splitLine: { show: false, }, axisLabel: { show: false, }, }, ], // Vertical axis yAxis: [ { type: "value", axisLine: { show: false, }, axisTick: { show: false, }, splitLine: { show: false, }, axisLabel: { show: false, }, }, ], // Add series series: [ { name: "Cost", type: "bar", data: [this.dataCompPrev[0].rupiah, this.dataCompPrev[1].rupiah], label: { show: true, position: "top", color: "#ffffff", formatter: function (params) { return `Rp. ${params.value.toLocaleString()}`; }, }, barWidth: "50%", }, ], }; }); } dataCompActEstCost(buildingId) { this.costService.getCompActEstCost(buildingId).subscribe((data) => { this.dataCompAct = data.data[0]; this.chartOption2 = { grid: { left: "25%", right: "25%", top: "20%", bottom: "20%", }, // Add tooltip tooltip: { trigger: "axis", enterable: false, formatter: function (params) { return `${params[0].name}
${ params[0].seriesName }: Rp. ${params[0].value.toLocaleString()}`; }, }, // Add legend legend: false, // Add custom colors color: ["#BEF264"], // Horizontal axis xAxis: [ { type: "category", data: ["Estimation Cost", "Actual Cost"], axisLine: { show: true, lineStyle: { color: "#BEF264", width: 4, }, }, axisTick: { show: false, }, splitLine: { show: false, }, axisLabel: { show: false, }, }, ], // Vertical axis yAxis: [ { type: "value", axisLine: { show: false, }, axisTick: { show: false, }, splitLine: { show: false, }, axisLabel: { show: false, }, }, ], // Add series series: [ { name: "Cost", type: "bar", data: [this.dataCompAct.est_cost, this.dataCompAct.real_cost], label: { show: true, position: "top", color: "#ffffff", formatter: function (params) { return `Rp. ${params.value.toLocaleString()}`; }, }, barWidth: "50%", // Adjust bar width }, ], }; }); } syncData() { const dataDate = { buildingId: this.buildingSelected, periode: this.dateSelected, }; this.spinnerActive = true; this.costService.getSyncCost(dataDate).subscribe((data) => { console.log(data); this.dataCompPrevMonthCost(this.storedData.buildingId); this.dataCompActEstCost(this.storedData.buildingId); }); setTimeout(() => { this.spinnerActive = false; this.fetchData( this.buildingSelected, this.dateSelected, this.categorySelected ); }, 3000); } actualData() { this.spinnerActiveActual = true; this.costService .getRealCostByBuildingId(4, this.dateSelected) .subscribe((data) => { // console.log(data.data[0]); // this.costTerm = data.data[0].est_cost }); setTimeout(() => { this.spinnerActiveActual = false; this.fetchData( this.buildingSelected, this.dateSelected, this.categorySelected ); }, 3000); } doFilter() { if (this.dateSelected) { this.spinnerFilterActive = true; setTimeout(() => { this.spinnerFilterActive = false; this.fetchData( this.buildingSelected, this.dateSelected, this.categorySelected ); }, 3000); } else { this.toastr.error("Warning", "Format date tidak valid.", { timeOut: 5000, closeButton: true, }); } } addFieldValue() { const modalRef = this.modalService.open(ModalAddActualComponent, { size: "sm", centered: true, }); modalRef.componentInstance.buildingId = this.buildingSelected; modalRef.componentInstance.periode = this.dateSelected; modalRef.result.then( (result) => { if (result) { this.rows.push(result); this.rows = [...this.rows]; this.dataCompActEstCost(this.buildingSelected); } }, (reason) => { console.log(`Dismissed: ${reason}`); } ); } focusElement(focucedElement: any) { this.focucedElement = focucedElement; } filterRows() { if (!this.searchTerm) { this.filteredRows = [...this.data.rows]; } else { this.filteredRows = this.data.rows.filter((row) => this.rowContainsSearchTerm(row) ); } } rowContainsSearchTerm(row: any): boolean { const searchTermLC = this.searchTerm.toLowerCase(); return Object.values(row).some( (value) => value !== null && value.toString().toLowerCase().includes(searchTermLC) ); } viewRow(row) { const modalRef = this.modalService.open(ModalExportComponent, { size: "xl", centered: true, }); modalRef.componentInstance.buildingId = this.buildingSelected; modalRef.componentInstance.dataRow = row; modalRef.result.then( (result) => { if (result) { this.rows.push(result); this.rows = [...this.rows]; } }, (reason) => { console.log(`Dismissed: ${reason}`); } ); } export() { this.spinnerExportActive = true; setTimeout(() => { const columnsToExport = [ "building", "roomName", "categoryName", "totalUse", "estimationCost", "endDate", ]; this.tableexcelService.exportAsExcelFileCostManage( this.data_cost, "Smart_building_cost_management", columnsToExport ); this.spinnerExportActive = false; }, 3000); } }