import { Component, EventEmitter, Input, OnInit, Output, ViewChild, ElementRef, AfterViewInit } from '@angular/core'; import { ItemChange } from '@progress/kendo-angular-charts/common/collection.service'; import { GridDataResult } from '@progress/kendo-angular-grid'; import { process, State, aggregateBy, AggregateResult, AggregateDescriptor, } from "@progress/kendo-data-query"; import { UserNotificationService } from 'projects/compass-minerals/src/public-api'; import { sum } from 'ramda'; import { OpportunityRelease, OpportunityReleaseAgreementNote } from '../../models/opportunity-model'; import { OpportunityReleaseLineCalculatedPricing, OpportunityReleaseLineCalculatedPricingDto } from '../../models/releaselinedepotcostingdto.model'; import { OpportunityReleaseService } from '../../services/opportunity-release.service'; import $ from 'jquery'; import { ContentScrollEvent, GridComponent } from '@progress/kendo-angular-grid'; export interface IElementRef { element: Element, [key: string]: any } @Component({ selector: 'app-releaseline-pricing-details', styles: [` >>> .k-grid, >>> .k-grid .k-button {font-size:12px;} >>> .k-grid td, >>> .k-grid th {padding:0;} >>> app-releaseline-pricing-details .hide-scrollbar > * { margin-right: -7px; } `], templateUrl: './releaseline-pricing-details.component.html', styleUrls: ['./releaseline-pricing-details.component.scss'], template: ` ` }) export class ReleaselinePricingDetailsComponent implements OnInit, AfterViewInit, IElementRef { releaseInfo:OpportunityRelease; @Input() agreementComments: OpportunityReleaseAgreementNote[]; public linesInfo: OpportunityReleaseLineCalculatedPricing[]; public deliveredLines : OpportunityReleaseLineCalculatedPricing[]; public pickupLines : OpportunityReleaseLineCalculatedPricing[]; @Input() releaseId: number; @Output() showAwardingBtn = new EventEmitter(); @Input() data: any[]; @Input() hideScrollbar: boolean = true; @Output() contentScroll: EventEmitter; //The event we'll listen to @ViewChild(GridComponent, { static: true }) gridEl: GridComponent; //Our actual kendo grid reference public element: Element; //Part of IElementRef, so the sync functions have something to reference public gridData: GridDataResult; public gridSummaryData: GridDataResult; isDelivered: boolean = false; isPickup: boolean = false; public format = "c2"; public percentFormat = "p"; public state: State = { skip: 0, take: 5, filter: { logic: "and", filters: [], }, }; public total: AggregateResult; constructor(public opportunityReleaseService: OpportunityReleaseService, private notificationService: UserNotificationService) { } ngAfterViewInit(): void { this.contentScroll = this.gridEl.contentScroll; //use the kendo grid's native scroll event } ngOnInit(): void { this.loadReleaseDetails(); this.loadReleaseLinesPricingInfo(); } public loadReleaseLinesPricingInfo() { this.opportunityReleaseService.getOpportunityReleaseLinesPricings(this.releaseId).subscribe(x => { if (x) { this.linesInfo = x; this.deliveredLines = this.linesInfo.filter(y=>y.isDelivered); this.pickupLines = this.linesInfo.filter(y=>(!y.isDelivered)); this.linesInfo.forEach((item, idx) => { if(item.isDelivered){ this.isDelivered=true; }else{ this.isPickup=true; } }); this.gridData = process(this.linesInfo, this.state); ///load summary data; let summaryRow = new OpportunityReleaseLineCalculatedPricing(); summaryRow.gsp = 0; summaryRow.gsP_Change = 0.0; summaryRow.margin = 0; let summaryData = [summaryRow]; this.gridSummaryData = process(summaryData, this.state); /// setup the margin values for input fields. this.ongspChange(null); /// calculate the avg for remaining fields. this.calculateAvg(); } }); } public selectionChanged(){ if(this.isDelivered && this.isPickup){ this.gridData = process(this.linesInfo, this.state); }else if(this.isDelivered){ this.gridData = process(this.deliveredLines, this.state); }else if(this.isPickup){ this.gridData = process(this.pickupLines, this.state); }else{ this.gridData = process([], this.state); } ///load summary data; let summaryRow = new OpportunityReleaseLineCalculatedPricing(); summaryRow.gsp = 0; summaryRow.gsP_Change = 0.0; summaryRow.margin = 0; let summaryData = [summaryRow]; this.gridSummaryData = process(summaryData, this.state); /// setup the margin values for input fields. this.ongspChange(null); /// calculate the avg for remaining fields. this.calculateAvg(); } public loadReleaseDetails() { this.opportunityReleaseService.getRelease(this.releaseId).subscribe(x => { if (x) { this.releaseInfo = x; console.log(this.releaseInfo); } }); } public saveData() { var payload = new OpportunityReleaseLineCalculatedPricingDto(); payload.releaseId = this.releaseId; payload.opportunityReleaseLineCalculatedPricingItems = this.linesInfo; this.opportunityReleaseService.lockOpportunityReleaseLinesPricings(payload).subscribe(x => { if (x) { this.showAwardingBtn.emit(); this.notificationService.success("Pricing details saved successfullly."); } }); } ///change events of data. public ongspChange(value: string): void { if(!isNaN(parseInt(value))){ let gspSum = 0; this.gridData.data.forEach(item => { if (!isNaN(parseInt(item.gsp))) { gspSum += parseInt(item.gsp); if(item.lYGSP && item.gsp){ item.gsP_Change=(((item.gsp-item.lYGSP)/item.lYGSP)*100) }else{ item.gsP_Change=0; } item.margin = parseFloat(item.gsp)-parseFloat(item.totalCost); } }); let summaryRecord = this.gridSummaryData.data[0]; summaryRecord.gsp = (gspSum / this.gridData.data.length); ///calculate gsp % change let gsppercSum = 0; this.gridData.data.forEach(item => { if (!isNaN(parseInt(item.gsP_Change))) { gsppercSum += parseInt(item.gsP_Change); } }); summaryRecord.gsP_Change = (gsppercSum / this.gridData.data.length); ///calculate margin let marginSum = 0; this.gridData.data.forEach(item => { if (!isNaN(parseInt(item.margin))) { marginSum += parseInt(item.margin); } }); summaryRecord.margin = (marginSum / this.gridData.data.length); } } public ongspPerctChange(value: string): void { let sumVal =0; if(!isNaN(parseInt(value))){ this.gridData.data.forEach(item => { if (!isNaN(parseInt(item.gsP_Change))) { if(item.lYGSP && item.gsP_Change){ item.gsp=(((item.gsP_Change*item.lYGSP)/100)+item.lYGSP); sumVal+= parseFloat(item.gsp); item.margin = parseFloat(item.gsp)-parseFloat(item.totalCost); } if(item.lYGSP && item.gsp){ item.gsP_Change=(((item.gsp-item.lYGSP)/item.lYGSP)*100) } } }); let summaryRecord = this.gridSummaryData.data[0]; summaryRecord.gsp = (sumVal / this.gridData.data.length); ///calculate gsp % change let gsppercSum = 0; this.gridData.data.forEach(item => { if (!isNaN(parseInt(item.gsP_Change))) { gsppercSum += parseInt(item.gsP_Change); } }); summaryRecord.gsP_Change = (gsppercSum / this.gridData.data.length); ///calculate margin let marginSum = 0; this.gridData.data.forEach(item => { if (!isNaN(parseInt(item.margin))) { marginSum += parseInt(item.margin); } }); summaryRecord.margin = (marginSum / this.gridData.data.length); } } public onmarginChange(value: string): void { let sumVal =0; if(!isNaN(parseInt(value))){ this.gridData.data.forEach(item => { if (!isNaN(parseInt(item.margin))) { if(item.margin){ item.gsp= parseInt(item.margin)+parseInt(item.totalCost); sumVal+= parseFloat(item.gsp); } if(item.lYGSP && item.gsp){ item.gsP_Change=(((item.gsp-item.lYGSP)/item.lYGSP)*100) } } }); let summaryRecord = this.gridSummaryData.data[0]; summaryRecord.gsp = (sumVal / this.gridData.data.length); ///calculate gsp % change let gsppercSum = 0; this.gridData.data.forEach(item => { if (!isNaN(parseInt(item.gsP_Change))) { gsppercSum += parseInt(item.gsP_Change); } }); summaryRecord.gsP_Change = (gsppercSum / this.gridData.data.length); ///calculate margin let marginSum = 0; this.gridData.data.forEach(item => { if (!isNaN(parseInt(item.margin))) { marginSum += parseInt(item.margin); } }); summaryRecord.margin = (marginSum / this.gridData.data.length); } } ///Summary Events public ongspSumChange(value: string): void { this.gridData.data.forEach(item => { item.gsp = value; if(item.lygsp && item.gsp){ item.gsP_Change=(((item.gsp-item.lygsp)/item.lygsp)*100) }else{ item.gsP_Change=0; } item.margin = item.gsp-item.totalCost; }); let summaryRecord = this.gridSummaryData.data[0]; if(summaryRecord.lygsp && summaryRecord.gsp){ summaryRecord.gsP_Change=(((summaryRecord.gsp-summaryRecord.lygsp)/summaryRecord.lygsp)*100) }else{ summaryRecord.gsP_Change=0; } summaryRecord.margin = summaryRecord.gsp-summaryRecord.totalCost; } public ongspPerctSumChange(value: string): void { this.gridData.data.forEach(item => { if (!isNaN(parseInt(item.lYGSP))) { if(item.lYGSP){ item.gsP_Change=value; item.gsp=(((item.gsP_Change*item.lYGSP)/100)+item.lYGSP) item.margin = item.gsp-item.totalCost; } } }); let summaryRecord = this.gridSummaryData.data[0]; if(summaryRecord.lygsp && summaryRecord.gsP_Change){ summaryRecord.gsp=(((summaryRecord.gsP_Change*summaryRecord.lYGSP)/100)+summaryRecord.lYGSP) }else{ summaryRecord.gsp=0; } summaryRecord.margin = summaryRecord.gsp-summaryRecord.totalCost; } public onmarginSumChange(value: string): void { this.gridData.data.forEach(item => { item.margin=value; item.gsp= item.margin+item.totalCost; if(item.lygsp){ item.gsP_Change=(((item.gsp-item.lygsp)/item.lygsp)*100) } }); let summaryRecord = this.gridSummaryData.data[0]; summaryRecord.gsp = summaryRecord.margin+summaryRecord.lygsp; if(summaryRecord.lygsp){ summaryRecord.gsP_Change=(((summaryRecord.gsp-summaryRecord.lygsp)/summaryRecord.lygsp)*100) } } ///calculate the avg for all columns onload public calculateAvg(){ let totalSum = 0; let earlyFillSum=0; let reserveSum=0; let lyAwardSum=0; let lyAwardPriceSum=0; let lyAwardmarginSum=0; let lyGSPSum=0; let dCostSum=0; let fCostSum=0; let fSurSum=0; let tFreightSum=0; let tcostSum=0; let cogsSum=0; this.gridData.data.forEach(item => { if (!isNaN(parseInt(item.total))) { totalSum += item.total; } if (!isNaN(parseInt(item.earlyFill))) { earlyFillSum += item.earlyFill; } if (!isNaN(parseInt(item.reserve))) { reserveSum += item.reserve; } if (!isNaN(parseInt(item.lyAwardTo))) { lyAwardSum += item.lyAwardTo; } if (!isNaN(parseInt(item.lyAwardPrice))) { lyAwardPriceSum += item.lyAwardPrice; } if (!isNaN(parseInt(item.lyAwardMargin))) { lyAwardmarginSum += item.lyAwardMargin; } if (!isNaN(parseInt(item.lygsp))) { lyGSPSum += item.lygsp; } if (!isNaN(parseInt(item.depotCost))) { dCostSum += item.depotCost; } if (!isNaN(parseInt(item.freightCost))) { fCostSum += item.freightCost; } if (!isNaN(parseInt(item.fuelSurcharge))) { fSurSum += item.fuelSurcharge; } if (!isNaN(parseInt(item.totalFreight))) { tFreightSum += item.totalFreight; } if (!isNaN(parseInt(item.cogs))) { cogsSum += item.cogs; } if (!isNaN(parseInt(item.totalCost))) { tcostSum += item.totalCost; } }); let summaryRecord = this.gridSummaryData.data[0]; summaryRecord.total = totalSum; summaryRecord.earlyFill = earlyFillSum; summaryRecord.reserve = reserveSum; summaryRecord.lyAwardTo = (lyAwardSum / this.gridData.data.length) summaryRecord.lyAwardPrice = (lyAwardPriceSum/ this.gridData.data.length) summaryRecord.lyAwardMargin = (lyAwardmarginSum / this.gridData.data.length) summaryRecord.lygsp = (lyGSPSum / this.gridData.data.length) summaryRecord.depotCost = (dCostSum / this.gridData.data.length) summaryRecord.freightCost = (fCostSum / this.gridData.data.length) summaryRecord.fuelSurcharge = (fSurSum / this.gridData.data.length) summaryRecord.totalFreight = (tFreightSum/ this.gridData.data.length) summaryRecord.totalCost = (tcostSum/ this.gridData.data.length) summaryRecord.cogs = (cogsSum / this.gridData.data.length) } }