{"version":3,"mappings":"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","names":["ApDynGridColumnConfigBase","constructor","options","super","this","ApDynGridColumnControlType","key","width","field","undefined","showHeaderTitle","title","tooltip","filterable","Icon","ApNutrientDistributionComponent","nutrientDistributionStore","loginStore","formStore","fieldStore","mapStore","mapViewStore","roundNumericService","roundNumericPipe","nutrientService","areaUnitPipe","settingsStore","soilSampleFieldClassColorPipe","soilSampleClassNamePipe","translationService","soilSampleService","fieldFormatService","languageStore","dateService","statisticStore","fieldStatisticHistogramService","jobsStore","soilSampleDateStore","campaignYearStore","statisticService","elementService","of","ngOnInit","listenFieldNutrientDistributionsLoading$","combineLatest","Loading$","Listen","s","loading","pipe","map","loadingItems","some","x","_mapDistributionsToGrid","ngAfterContentInit","_onSelectionChanged","dynComponent","SelectedItems$","subscribe","d","_selectionChange","getMapViewMode","MapViewMode","showMapView","EnableDistributionView","_subscriptions","push","FirstSetting$","_settings","selectedYear","f","data","filter","campaignYear","fields","t","length","_","_readFieldGeomsOfCurrentLoadedFields","loadFieldNutrientDistributions","_currentFieldGeomIds","_gridBuilder","currentMenu","mapViewMenu","MapViewCurrentMenu","getSelectedItems","ngOnDestroy","removeStatisticData","DisableDistributionView","forEach","unsubscribe","e","_a","onCreate","openForm","component","ApNutrientPlanningComponent","Summary","Type","PlanningEntryComponentDataType","columns","ApDynGridStatusColumnConfig","class","description","pending","BlockedFieldIdsBuWsv$","pendingTooltip","BlockedFieldIdsBuWsvTooltip$","ApDynGridPropertyColumnConfig","headerFilterable","cssClass","sortIndex","filterType","FilterType","pipes","args","DigitsAfterDecimalPoint","hide","ApDynGridGroupColumnConfig","headerStyle","style","border","groupColumns","ApDynGridClassColorColumnConfig","GetElementStringByString","ApElementType","_classColorColumnWidth","_valueColumnWidth","formatCallback","dataItem","value","PIsGreaterE","APP_CONFIGURATION","KIsGreaterE","MgIsGreaterE","PhIsGreaterE","format","SelectedLanguage","DateFormat","ApDynGridEditColumnConfig","disabled","pager","ApDynGridPagerConfig","iconButtons","icon","callback","ApUtilService","exportAsXls","bind","tmp","FieldGeoms","geom","Id","_soilSampleClassName","transform","_soilClassColor","_areaUnitConvert","AreaUnit","items","itemsToSelect","changeSelectedField","toString","zoomFarmFields","getMapViewCurrentMenu","setTimeout","statisticData","Status","FieldId","a","Field","FieldName","c","_b","AreaHa","u","p","FieldGeom","_c","_d","Histograms","SourceItem","_getTitleForStatistic","generateHistogramStatistic","selectedItems","dataForTitles","totalItems","Area","Selected","z","generateFieldsAreaTitle","fileName","_getExportFilename","fieldGeometryIds","statisticDataExcelExport","customerExpr","SelectedFarm","CustomerNumber","toFarmDate","Date","translate","replace","items$","Distributions$","Dates$","dist","sampleDates","dis","fieldGeom","getFieldGeomById","FieldGeomId","getFieldByFieldGeomId","adminArea","Create","r","AdminArea","areaNumber","areaRound","area","roundAsNumber","newestSampleDate","getDateMidnight","classP","AvgClassP","classK","AvgClassK","classMG","AvgClassMg","classPH","AvgClassPh","pIsGreaterE","kIsGreaterE","mgIsGreaterE","phIsGreaterE","pValue","convertElementOxid","AvgP","ApElementOxydTypeEnum","MethodP","kValue","AvgK","MethodK","mgValue","AvgMg","MethodMg","phValue","AvgPh","pValueRounded","kValueRounded","mgValueRounded","phValueRounded","status","getStatus","NewestSampleDate","soilGroups","SoilGroups","Sort","join","StatusClass","StatusDesc","SoilGroup","FieldNumber","formatFieldNumber","ClassP","ClassK","ClassMg","ClassPh","StyleClassP","StyleClassK","StyleClassMg","StyleClassPh","PValue","KValue","MgValue","PhValue","PValueTooltip","formatClassificationTooltip","KValueTooltip","MgValueTooltip","PhValueTooltip","MethodPh","i0","selectors","ApDynComponentComponent","ctx","SoilSampleEdits","SoilSamplePlanningOverviewActions","SoilSamplePlanningReportStore","Store","backend","loaded","registerObservable","SoilSamplePlanningReportDownloadSuccess","SetLoadFinishState","download","Data","downloadSoilSamplePlanningReport","headline","bookname","reportData","SetLoadState","Mutate","DispatchBackend","SoilSamplePlanningReportDownload","Name","NetTypes","Value","ApCustomTypes","factory","ApSoilSamplePlanningOverviewComponent","soilSamplePlanningStore","cropRotationStore","soilSamplePlanningReportStore","EventEmitter","BehaviorSubject","min","I","getSelectedCampaignYear","Year","max","k","dateA","dateB","getTime","item","date","goIntoStatisticMenu","_previousMapViewMenu","_applyClicked","_onApplyClicked","_previousYear","_year$","next","_nextYear","history","Object","values","crops","crop","keys","years","reduce","b","concat","dates","Math","l","_cropRotationLimits$","isLoading$","planningLoading","soilSampleDatesLoading","campaignYearLoading","cropRotationLoading","fieldsLoading","cropRotation","soilSampleDates","plannings","i","fieldsJoinedWithSoilSamplePlanning","_areaTotal","SoilSamplePlanning","find","ssP","planning","getCurrentFieldGeom","organic","OrganicApplication","lastSamplingDate","indexOf","lastSamplingDateMidnight","m","toFarmDateFromUtc","toDate","plannedSamplingDate","PlannedSamplingdate","NrSNr","getFieldNumberAndSubNumber","Geom","LastSamplingDate","PlannedSamplingDate","getDateNoonToFarmTime","Crop","loadSoilSamplePlanning","shapeExport","downloadShapeExportZipped","debounceTime","delay","generateStats","SelectedFarm$","gridBuilder","fillWizardChoiceData","columns$","limits","ApDynGridColumnHideConfig","mapHide","selfHide","mode","sortDesc","headerButtons","nextClicked","nextDisabled","y","previousClicked","previousDisabled","getCropRotationGridConfigs","widthHidePriority","CurrentDateFormat","listMassEditing","ApRoleTypeService","User","_listMassEditing","apply","hasPermission","exportAsPdf","exportShape","iYear","pdfExport","year","unit","MainCropName","sYieldUnit","SecondCrop","SecondCropName","SecondCropYield","MainCropYield","yesNo","MainCropStraw","id","name","type","ApGridPagerType","label","getExportFilename","goIntoMapMenu","$event","modifiedPlannings","foundItems","foundItem","ObjectFactory","object","Description","UserId","ApGuidUtil","saveSoilSamplePlannings","zipContent","saveAs","Blob","Uint8Array","selectedGridItems","exportItems","SelectedCampaignYear","LastSampleDate","CropTypeNameMinus1","hasOwnProperty","CropTypeName","_e","CropTypeNamePlus1","C","_f","F","_g","CropTypeNamePlus2","S","_h","G","_j","DefaultStart","Key","exportFileName","dynGrid","contentRows","row","defaultFieldGeom","isNaN","parseFloat","FieldSubNumber","FieldSubnumber","FieldArea","CropTypeMinus1","h","CropType","CropTypePlus1","N","CropTypePlus2","T","_k","w","_l","dateToMoment","NextSampleDate","A","IsValidGeometry","_getReportColumnNames","Content","HeaderLabels","get","Rows","Header","bookName","selectionChange","Convert","columnNames","Map","selectedCampaignYear","set","emptyMessage","setStatisticData","ApStatsType","allItemsSelected","chartSets","Add","generateLastSamplingStat","generatePlannedSamplingStat","chartSet","axes","minX","maxX","chartLastSampling","titleX","categories","noteField","sort","compareDates","soilSampleItem","buYear","getFullYear","barData","Find","category","color","getStatBarColor","AddIfNotExists","calculateNoteTexts","chartPlannedSampling","plannedMonthYear","moment","barColor","chart","percentSum","areaSum","biggestValueIdx","biggestArea","percent","note","createNote","percentage","static","icons","preselect","option","index","text","onSubmit","ApNutrientManagementOverviewComponent","cropTypeStore","permissionPipe","rbStore","fieldNutrientDistributionStore","basicFertilisationSummariesStore","fertilizerStore","nutrientStatisticService","modalDialogStore","translationStore","nutrientStore","fertilizerService","baseFertilizationService","tooltipContentService","baseFertilizationCommonService","ApPermissions","_defaultRemain","P","K","Mg","CaO","Min","Max","loading$","historyLoading","cr","bfs","rb","_getItems","_getPager","_getBaseGrid","details$","_getDetailsGrid","_onCheckFieldEvent","_onCheckField","_onNavigateToReportEvent","_onNavigateToReport","fieldGeomId","skip","_onSelectedYearChanged","checkResult","_handleRbStoreCheckResult","_handleFieldStoreData","mapMenu","_onMapMenuChanged","FormClose$","_isOnCreatePressed","_handleLegendsAndLayers","Layers","OnLayerChange","revertLegends","isCreateNewAllowed","SampleRegions$","Summaries$","BlockedFieldIdsBuWsvCeIrRbFieldRaster$","cropRotationAttributes","_1","sampleRegions","bFS","jobFieldGeomIds","cropRotationAttribute","rbResult","FirstOrDefault","hasRbRaster","HasRbRaster","apps","PlanIds","summary","BasicFertilisationPlanBooks","includes","sampleDateObject","getGDStatusByCrAttribute","applications","planBook","fertilizer","getFertilizer","Product_Id","User_Appl_Unit","getFertilizerUnit","isBooked","L","BookedAt","Z","getFertilizerStatus","User_Appl_Mode","getFertilizerStatusDescription","IsBooked","Product","getFertilizerProductName","ProductId","ProductUnit","ProductTooltip","getProductContentInfoTooltip","Amount","User_Appl_Rate","AmountUnit","AmountValue","LeadNutrient","Q","Element","OutputDate","ApplicationDate","Nutrient","q","Operation_Mode","ApOperationMode","GetElementStringByIElement","Title","PlanNumber","CreatedAt","Remain2","CalculateElementOxidValueByGivenElementValue","getAverageNutrientFromStatistic","Statistic","ie","ee","calculateNElementByLeadElement","Average","ne","_statusCss","Nr","TNr","NrTNr","AreaOriginal","SampleDate","ColumnLoading","Contains","Remain1","getAverageRb","CrNeeds","CropRotationNeed","Applications","iconOptions","_onPdf","_onXls","PagerBuilder","detailsGridPopupOptions","_onShow","_onExport","_onBooking","_onUnbookBookedPlan","_onOneDelete","_onDownloadPackage","selectedLanguage","language","settings","setting","ApDynGridDetailsGridConfig","checkboxDisabled","FindTranslationForSelectedLanguage","User$","permission","user","BlockedFieldIdsBuWsvCeIrRbFieldRasterTooltip$","columnLoading","GetRoundNumericPipeConfig","_getCropRotationConfigs","redirectSummaryToShowView","redirectSummaryToExportView","bookPlanBooks","unbookSummaryPlanBook","deleteSummaryPlanBook","createNutrientPlanningPackage","_generateStats","loadBasicFertilisationSummaries","buttons","primary","busy","show","formConfig","fieldSets","ApDynformsConfigFieldset","legend","useMaxWidth","config","ApDynformsConfigTextarea","rows","JSON","stringify","setModalDialogData","Array","isArray","g","loadRb","itemsId","handleLegends","disableLayers","TaskManagementLayer","handleLayers","event","window","open","checkField","mainComponentSelectionAvailability","emptyTitle","Any","_generateTooltipForCrop","yearCrop","MainCrop","yieldTranslation","contentMessage","cropsRemoval","_getRemovalFromCrops","RemovalP","RemovalK","RemovalMg","cropRotationYield","expectedYield","removalP","removalK","removalMg","mainCrop","getDefaultCroptype","_calculateCropExtraction","MainwdP","SecwdP","MsRatio","MainwdK","SecwdK","MainwdMg","SecwdMg","secondCrop","CalculateElementOxidValueByElementType","isStrawRemoved","mainWd","secondWd","msRatio","xlsExportFileName","generatePrintFilename","pdfExportFileName","ApNutrientPNeedComponent","GridBuilderService","PlanBooksGrid","ApplicationDateTooltip","dynCssClass","ApplicationDateItalic","FieldsTooltip","FirstSetting","SumTooltip","ApNutrientManagementPlanningComponent","routerStore","nutrientManagementService","fieldArchiveStore","HistoryLoading$","_buildGrid","gridInitialized","itemToSelect","selectedSummaryId","setSelectedSummaryKey","gridPaging","setSelectedKeys","Visibility","NutrientPlanningLayer","routerStoreData","gridItems","gridItemsLoading","url","startsWith","queryParams","first","isBooking","action","TaskManagementAction","targetComponent","ApNutrientBookingComponent","targetGridItem","dataObject","FieldIdToSelect","navigate","_statisticUpdateRequested","emit","mapMode","selectedKeys","selectedSourceItem","selectedSummaries","onSelectionChange","gridOptions","_onOneShow","_onOneExport","_onOneReplan","_onOneBooking","_onOneDownloadPackage","pagerOptions","_onReplan","_onDelete","cropTypesNames","GetHistory$","gridUpdate$","summaries","cropRotationHistory","isGridUpdateAllowed","fieldArchiveLoaded","DeletedAt","getArea","sum","getCalculateSumFertilizer","productTooltip","_getProductId","fertilizerUnit","sumTooltip","planBookApplicationDates","getApplicationDatesData","state","_getCropType","Count","getPlanBooksFieldsCount","OperationMode","User_Operation_Mode","NewestDate","Tooltip","IsMoreThanOneUniqDate","Plannings","Note","Sum","SumUnit","getLeadNutrient","getMin","getMax","getAverageNutrientFromStatistics","FieldIds","getFieldIds","getFieldCropsTooltip","Croptype_Id","_generatePrintFilename","replanSummary","deleteSummary","chartConfigs","planBooks","flat","pB","chartConfig","generateStatChartConfig","routes","path","canActivate","ApPermissionGuard","login","layout","PageMode","operationModeService","_getColumns","gridPopupOptions","_onOneReset","BookedBy","bandIdX0","bandIdX1","bandIdX2","bandIdX3","GetOperationMode","BookDate","FindLast","_onReset","unbookPlanBooks","ApNutrientManagementBookingComponent","ApNutrientManagementRoutes","RouterModule","ApNutrientManagementModule","ApGetCropTypeNamePipe","imports","CommonModule","GridModule","ApCoreModule","ApIconModule","ApTranslationModule","ApUtilsModule","ButtonModule","PDFModule","PagerModule","BodyModule","HeaderModule","SharedModule","ExcelModule","PDFExportModule","ApTooltipModule","ApResponsiveTextModule","ApSectionHeaderModule","GroupModule","ApDynComponentModule","ApPermissionModule","ApSoilSampleService","soilSampleField","FieldPart","sampleDate","difference","getCampaignYear","getMonth","FieldStatisticHistogramService","landUseStore","soilGroupFormatService","soilSampleClassColorService","getHistogramStatistic","Reduce","target","_createStatistic","ChartSetValueType","selected","soilPlanningYears","fieldSoilPlanningYears","hist","el","val","Values","cells","Counters","dateName","_mapDate","found","FindIndex","fieldId","allCells","counters","fill","res","valueType","getStatisticAxesConfig","step","_mapSampleRegion","_mapSampleMethods","mapSingle","_mapLanduse","decimalPlaces","getColor","colorCode","meta","fieldYears","method","SampleMethods","Method","region","SampleRegions","Region","landuse","LandUse","parseInt"],"sources":["./src/app/ap-dyngrids/config/ap-dyn-grid-class-color-column-config.ts","./src/app/ap-interface/enums/layout/icon.enum.ts","./src/app/nutrient-management/components/ap-nutrient-distribution.component.ts","./src/app/nutrient-management/types/base-fertilization-soil-sampleplanning.types.ts","./src/app/stores/nutrients/soilsampleplanning-report.store.ts","./src/app/nutrient-management/components/ap-soilsampleplanning-overview.component.ts","./src/app/nutrient-management/components/configs/pager-builder.ts","./src/app/nutrient-management/components/ap-nutrient-management-overview.component.ts","./src/app/nutrient-management/components/ap-nutrient-p-need.component.ts","./src/app/nutrient-management/components/configs/plan-books-grid-builder.service.ts","./src/app/nutrient-management/components/ap-nutrient-management-planning.component.ts","./src/app/nutrient-management/ap-nutrient-management.routes.ts","./src/app/nutrient-management/components/ap-nutrient-management-booking.component.ts","./src/app/nutrient-management/ap-nutrient-management.module.ts","./src/app/nutrient-management/service/ap-soil-sample.service.ts","./src/app/services/data/field-statistic-histogram.service.ts"],"sourcesContent":["import {\n ApDynGridColumnConfigBase,\n ApDynGridColumnControlType,\n ApDynGridColumnHideConfig,\n IPipeDefinition\n} from './ap-dyn-grid-column-config-base';\n\nexport class ApDynGridClassColorColumnConfig extends ApDynGridColumnConfigBase {\n public type = ApDynGridColumnControlType.ClassColor;\n public field: string;\n public showHeaderTitle: boolean;\n public title: string;\n public key: string;\n public width: number;\n public tooltip: string;\n public filterable: boolean;\n\n constructor(options: {\n hide?: boolean | ApDynGridColumnHideConfig,\n sortIndex?: number,\n sortDesc?: boolean,\n groupIndex?: number,\n groupDesc?: boolean,\n headerStyle?: any,\n style?: any,\n pdfExport?: boolean,\n xlsExport?: boolean,\n field?: string,\n showHeaderTitle?: boolean,\n title?: string,\n class?: string,\n key?: string,\n description?: string,\n width?: number,\n tooltip?: string,\n cssClass?: 'left' | 'right' | 'center',\n pipes?: IPipeDefinition[],\n tooltipPipes?: IPipeDefinition[],\n filterable?: boolean,\n } = {}) {\n super(options);\n this.key = options.key;\n this.width = options.width;\n this.field = options.field ? options.field : undefined;\n this.showHeaderTitle = options.showHeaderTitle ? options.showHeaderTitle : false;\n this.title = options.title ? options.title : ' ';\n this.tooltip = options.tooltip ? options.tooltip : '';\n this.filterable = options.filterable === false ? false : true; // default is true and can explicitly set to false in component\n }\n}\n","export enum Icon {\n Delete = 'delete',\n Edit = 'Edit',\n Print = 'print',\n Save = 'save',\n Source = 'source-code',\n XLS = 'file-xls',\n PDF = 'pdf',\n Shape = 'shape'\n}\n","import {AfterContentInit, Component, OnDestroy, OnInit, ViewChild} from '@angular/core';\nimport {combineLatest, Observable, of, Subscription} from 'rxjs';\nimport {ApElementOxydTypeEnum, MapViewCurrentMenu, MapViewMode} from '../../ap-interface';\nimport {\n ApDynComponentComponent\n} from '../../ap-dyncomponent/ap-dyncomponent.component';\nimport {\n ApDynGridColumnConfigBase\n} from '../../ap-dyngrids/config/ap-dyn-grid-column-config-base';\nimport {\n ApDynGridPagerConfigBase\n} from '../../ap-dyngrids/config/ap-dyn-grid-pager-config-base';\nimport {\n AreaUnit,\n AreaUnitConverterPipe,\n GetRoundNumericPipe,\n GetSoilSampleClassNamePipe,\n GetSoilSampleFieldClassColorPipe\n} from '../../ap-utils';\nimport {\n ApDynGridPropertyColumnConfig,\n FilterType\n} from '../../ap-dyngrids/config/ap-dyn-grid-property-column-config';\nimport {\n ApDynGridGroupColumnConfig\n} from '../../ap-dyngrids/config/ap-dyn-grid-group-column-config';\nimport {\n ApDynGridClassColorColumnConfig\n} from '../../ap-dyngrids/config/ap-dyn-grid-class-color-column-config';\nimport {\n ApDynGridEditColumnConfig\n} from '../../ap-dyngrids/config/ap-dyn-grid-edit-column-config';\nimport {\n ApDynGridPagerConfig\n} from '../../ap-dyngrids/config/ap-dyn-grid-pager-config';\nimport {SettingsStore} from '../../stores/base-data/settings.store';\nimport {FieldStore} from '../../stores/farm/field.store';\nimport {\n FieldNutrientDistributionStore\n} from '../../stores/nutrients/field-nutrient-distributions.store';\nimport {MapViewStore} from '../../stores/layout/mapview.store';\nimport {MapStore} from '../../stores/map/map.store';\nimport {filter, map} from 'rxjs/operators';\nimport {\n ApNutrientPlanningComponent\n} from '../../entry-components/ap-nutrients-management-entry-components/ap-nutrient-planning.component';\nimport {FormStore} from '../../stores/layout/form.store';\nimport {\n ApDynGridStatusColumnConfig\n} from '../../ap-dyngrids/config/ap-dyn-grid-status-column-config';\nimport {ApSoilSampleService} from '../service/ap-soil-sample.service';\nimport {\n GetRoundNumericService\n} from '../../ap-utils/service/get-round-numeric.service';\nimport {\n ApFieldFormatService\n} from '../../ap-utils/service/ap-field-format.service';\nimport {ApDateService} from '../../ap-core/services/ap-date-service';\nimport {LanguageStore} from '../../stores/translation/language.store';\nimport {StatisticStore} from '../../stores/statistic/statistic.store';\nimport {Create} from 'ts-tooling';\nimport {\n IImageStyle\n} from '../../ap-utils/service/get-soil-sample-class-color.service';\nimport {JobsStore} from '../../stores/administration/jobs.store';\nimport {\n GetElementService\n} from '../../ap-utils/service/ap-get-element.service';\nimport {ApNutrientService} from '../../ap-utils/service/ap-nutrient.service';\nimport {APP_CONFIGURATION} from '../../ap-core/config';\nimport {\n ApElementType\n} from '../../ap-interface/enums/ap-elements-type.enum';\nimport {CampaignYearStore} from '../../stores/login/campaignyear.store';\nimport {Icon} from '../../ap-interface/enums/layout/icon.enum';\nimport {ApUtilService} from '../../ap-utils/service/ap-util.service';\nimport {LoginStore} from '../../stores/login/login.store';\nimport {\n ApTranslationService\n} from '../../ap-utils/service/ap-translation.service';\nimport {\n IApFieldNutrientDistributionGrid\n} from '../types/bese-fertilization-distribution.types';\nimport {\n PlanningEntryComponentDataType\n} from '../../entry-components/ap-nutrients-management-entry-components/ap-nutrient-planning-configs/nutrient-planning-types';\nimport {\n FieldStatisticHistogramService,\n IFieldStatisticHistogramData\n} from '../../services/data/field-statistic-histogram.service';\nimport {StatisticService} from '../../services/data/statistic.service';\nimport IField = Data.FieldManagement.IField;\nimport ISettings = Data.BaseData.ISettings;\nimport {SoilSampleDateStore} from '../../stores/nutrients/soilsampledate.store';\n\n@Component({\n selector: 'ap-nutrients-distribution',\n template: `\n <ap-dyncomponent [caption]=\"'Global__NutrientDistribution'\"\n [canCreate]=\"true\"\n [canSearch]=\"true\"\n [headerIcon]=\"'ap-icon-base-fertilization'\"\n [filterTooltip]=\"'filterTooltip'\"\n [columns]=\"columns\"\n [items]=\"items$ | async\"\n [loading$]=\"listenFieldNutrientDistributionsLoading$\"\n [pager]=\"pager\"\n [groupable]=\"true\"\n [selectable]=\"{checkboxOnly: false, mode: 'multiple'}\"\n (create)=\"onCreate()\"\n ></ap-dyncomponent>\n `,\n styles: []\n})\nexport class ApNutrientDistributionComponent implements OnInit, AfterContentInit, OnDestroy {\n @ViewChild(ApDynComponentComponent, {static: true}) dynComponent: ApDynComponentComponent;\n public columns: ApDynGridColumnConfigBase[] = [];\n public items$: Observable<any[]> = of([]);\n public pager: ApDynGridPagerConfigBase;\n public listenFieldNutrientDistributionsLoading$: Observable<boolean> = of(true);\n\n private _subscriptions: Subscription[] = [];\n private _settings: ISettings;\n private _currentFieldGeomIds: string[] = [];\n private _onSelectionChanged: Subscription;\n private _classColorColumnWidth = 45;\n private _valueColumnWidth = 45;\n\n constructor(private nutrientDistributionStore: FieldNutrientDistributionStore,\n private loginStore: LoginStore,\n private formStore: FormStore,\n private fieldStore: FieldStore,\n private mapStore: MapStore,\n private mapViewStore: MapViewStore,\n private roundNumericService: GetRoundNumericService,\n private roundNumericPipe: GetRoundNumericPipe,\n private nutrientService: ApNutrientService,\n private areaUnitPipe: AreaUnitConverterPipe,\n private settingsStore: SettingsStore,\n private soilSampleFieldClassColorPipe: GetSoilSampleFieldClassColorPipe,\n private soilSampleClassNamePipe: GetSoilSampleClassNamePipe,\n private translationService: ApTranslationService,\n private soilSampleService: ApSoilSampleService,\n private fieldFormatService: ApFieldFormatService,\n private languageStore: LanguageStore,\n private dateService: ApDateService,\n private statisticStore: StatisticStore,\n private fieldStatisticHistogramService: FieldStatisticHistogramService,\n private jobsStore: JobsStore,\n private soilSampleDateStore: SoilSampleDateStore,\n private campaignYearStore: CampaignYearStore,\n private statisticService: StatisticService,\n private elementService: GetElementService) {\n }\n\n public ngOnInit(): void {\n this.listenFieldNutrientDistributionsLoading$ = combineLatest([\n this.nutrientDistributionStore.Loading$,\n this.fieldStore.Listen(s => s.loading)\n ]).pipe(\n map(loadingItems => loadingItems.some(x => x))\n );\n this._mapDistributionsToGrid();\n }\n\n public ngAfterContentInit(): void {\n this._onSelectionChanged = this.dynComponent.SelectedItems$.subscribe(d => this._selectionChange(d));\n if (this.mapViewStore.getMapViewMode() !== MapViewMode.NORMAL) {\n this.mapViewStore.showMapView();\n }\n // disable drawing the crop colors and the selected style\n this.mapStore.EnableDistributionView();\n this._subscriptions.push(this.settingsStore.FirstSetting$.subscribe(s => this._settings = s));\n this._subscriptions.push(combineLatest([\n this.campaignYearStore.Listen(s => s.selectedYear),\n this.fieldStore.Listen(f => f.data)\n ]).pipe(\n filter(([campaignYear, fields]) => campaignYear && fields && fields?.length > 0))\n .subscribe(([_, fields]) => {\n this._readFieldGeomsOfCurrentLoadedFields(fields);\n this.nutrientDistributionStore.loadFieldNutrientDistributions(this._currentFieldGeomIds);\n })\n );\n this._gridBuilder();\n this._subscriptions.push(this.mapViewStore.Listen(d => d.currentMenu).subscribe(mapViewMenu => {\n if (mapViewMenu === MapViewCurrentMenu.STATS) {\n this._selectionChange(this.dynComponent.getSelectedItems() as IApFieldNutrientDistributionGrid[]);\n }\n }));\n }\n\n public ngOnDestroy(): void {\n this.statisticStore.removeStatisticData();\n // enable drawing the crop colors and the selected style\n this.mapStore.DisableDistributionView();\n this._subscriptions.forEach(d => d.unsubscribe());\n this._onSelectionChanged?.unsubscribe();\n }\n\n public onCreate(): void {\n this.formStore.openForm({\n component: ApNutrientPlanningComponent,\n data: {\n Summary: null,\n Type: PlanningEntryComponentDataType.Create\n }\n });\n }\n\n private _gridBuilder(): void {\n this.columns = [\n new ApDynGridStatusColumnConfig({\n field: 'Status',\n class: 'StatusClass',\n description: 'StatusDesc',\n showHeaderTitle: false,\n filterable: true,\n pending: this.jobsStore.BlockedFieldIdsBuWsv$,\n pendingTooltip: this.jobsStore.BlockedFieldIdsBuWsvTooltip$\n }),\n new ApDynGridPropertyColumnConfig({\n field: 'FieldNumber',\n title: 'Global__NumberAbbr',\n filterable: true,\n width: 75,\n headerFilterable: true\n }),\n new ApDynGridPropertyColumnConfig({\n field: 'Field.FieldName',\n title: 'Global__FieldName',\n filterable: true,\n width: 180,\n headerFilterable: true,\n cssClass: 'left',\n sortIndex: 0\n }),\n new ApDynGridPropertyColumnConfig({\n field: 'Area',\n title: 'Global__Area',\n filterable: true,\n width: 60,\n cssClass: 'right', filterType: FilterType.NUMBER,\n headerFilterable: true,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [\n this._settings.DigitsAfterDecimalPoint\n ]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n field: 'SoilGroup',\n title: 'Nutrients__Soilgroup',\n width: 80,\n hide: true,\n filterable: true,\n filterType: FilterType.NUMBER_LIST,\n headerFilterable: true\n }),\n new ApDynGridGroupColumnConfig({\n headerStyle: {\n 'text-align': 'center'\n },\n style: {border: '1px solid #2c3237'},\n title: 'Global__Avg_Class',\n groupColumns: [\n new ApDynGridClassColorColumnConfig({\n field: 'StyleClassP',\n title: this.elementService.GetElementStringByString(ApElementType.P),\n key: 'ClassP',\n width: this._classColorColumnWidth,\n filterable: true,\n tooltip: 'PValueTooltip',\n cssClass: 'center'\n }),\n new ApDynGridClassColorColumnConfig({\n field: 'StyleClassK',\n title: this.elementService.GetElementStringByString(ApElementType.K),\n key: 'ClassK',\n width: this._classColorColumnWidth,\n filterable: true,\n tooltip: 'KValueTooltip',\n cssClass: 'center'\n }),\n new ApDynGridClassColorColumnConfig({\n field: 'StyleClassMg',\n title: this.elementService.GetElementStringByString(ApElementType.Mg),\n key: 'ClassMg',\n width: this._classColorColumnWidth,\n filterable: true,\n tooltip: 'MgValueTooltip',\n cssClass: 'center'\n }),\n new ApDynGridClassColorColumnConfig({\n field: 'StyleClassPh',\n title: 'Nutrients__Ph',\n key: 'ClassPh',\n width: this._classColorColumnWidth,\n filterable: true,\n tooltip: 'PhValueTooltip',\n cssClass: 'center'\n })\n ]\n }),\n new ApDynGridGroupColumnConfig({\n headerStyle: {\n 'text-align': 'center'\n },\n style: {border: '1px solid #2c3237'},\n title: 'Global__Avg_Content',\n hide: true,\n groupColumns: [\n new ApDynGridPropertyColumnConfig({\n field: 'PValue',\n title: this.elementService.GetElementStringByString(ApElementType.P),\n width: this._valueColumnWidth,\n hide: true,\n formatCallback: (dataItem, value) => `${(dataItem?.PIsGreaterE ? '> ' : '')}${value}`,\n filterable: true,\n cssClass: 'right', filterType: FilterType.NUMBER,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [\n APP_CONFIGURATION.SpecialDecimalPlaces.Distributions\n ]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n field: 'KValue',\n title: this.elementService.GetElementStringByString(ApElementType.K),\n width: this._valueColumnWidth,\n hide: true,\n formatCallback: (dataItem, value) => `${(dataItem?.KIsGreaterE ? '> ' : '')}${value}`,\n filterable: true,\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [\n APP_CONFIGURATION.SpecialDecimalPlaces.Distributions\n ]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n field: 'MgValue',\n title: this.elementService.GetElementStringByString(ApElementType.Mg),\n width: this._valueColumnWidth,\n hide: true,\n formatCallback: (dataItem, value) => `${(dataItem?.MgIsGreaterE ? '> ' : '')}${value}`,\n filterable: true,\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [\n APP_CONFIGURATION.SpecialDecimalPlaces.Distributions\n ]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n field: 'PhValue',\n title: 'Nutrients__Ph',\n width: this._valueColumnWidth,\n hide: true,\n formatCallback: (dataItem, value) => `${(dataItem?.PhIsGreaterE ? '> ' : '')}${value}`,\n filterable: true,\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [\n APP_CONFIGURATION.SpecialDecimalPlaces.Distributions\n ]\n }]\n })\n ]\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Nutrients_Ips_Pages__LastBu',\n field: 'NewestSampleDate',\n format: this.languageStore.SelectedLanguage.DateFormat,\n width: 80,\n hide: true,\n filterable: true,\n filterType: FilterType.MONTH\n }),\n new ApDynGridEditColumnConfig({\n disabled: true\n })\n ];\n this.pager = new ApDynGridPagerConfig({\n iconButtons: [\n {\n icon: Icon.XLS,\n callback: ApUtilService.createEventEmitter(this.exportAsXls.bind(this), this._subscriptions),\n tooltip: 'Global__Save_EXCEL'\n }\n ]\n });\n }\n\n private _readFieldGeomsOfCurrentLoadedFields(fields: IField[]): void {\n const tmp = [];\n for (const field of fields) {\n if (!field.FieldGeoms || typeof field.FieldGeoms !== typeof [] || field.FieldGeoms.length < 1) {\n // skip Fields without Geometry\n continue;\n }\n for (const geom of field.FieldGeoms) {\n tmp.push(geom.Id);\n }\n }\n this._currentFieldGeomIds = tmp;\n }\n\n private _soilSampleClassName(value: number): string {\n return this.soilSampleClassNamePipe.transform(value);\n }\n\n private _soilClassColor(value: string): IImageStyle {\n return this.soilSampleFieldClassColorPipe.transform(value, [false]);\n }\n\n private _areaUnitConvert(value: number): any {\n return this.areaUnitPipe.transform(\n value, [AreaUnit.SQUARE_METER, AreaUnit.HEKTAR]);\n }\n\n private _selectionChange(items: IApFieldNutrientDistributionGrid[]): void {\n let itemsToSelect: IApFieldNutrientDistributionGrid[] = items;\n if (itemsToSelect && itemsToSelect.length > 0) {\n this.fieldStore.changeSelectedField(itemsToSelect.map(x => x.Id.toString()));\n } else {\n itemsToSelect = this.dynComponent.items as IApFieldNutrientDistributionGrid[];\n this.fieldStore.changeSelectedField([]);\n this.fieldStore.zoomFarmFields();\n }\n // calculate statistic only if user is on statistic tab\n if (this.mapViewStore.getMapViewCurrentMenu() !== MapViewCurrentMenu.STATS) {\n return;\n }\n setTimeout(() => {\n this.statisticStore.removeStatisticData();\n const statisticData = itemsToSelect.map(x => {\n const item: IFieldStatisticHistogramData = {\n Status: x.Status,\n FieldId: x.Field?.Id,\n FieldName: x.Field?.FieldName,\n AreaHa: x.FieldGeom?.AreaHa ?? 0,\n Histograms: x.SourceItem.Histograms\n };\n return item;\n });\n const title = this._getTitleForStatistic(itemsToSelect);\n this.fieldStatisticHistogramService.generateHistogramStatistic(title, statisticData);\n }, 0);\n }\n\n private _getTitleForStatistic(selectedItems: IApFieldNutrientDistributionGrid[]): string {\n const totalItems = this.dynComponent.items as IApFieldNutrientDistributionGrid[];\n const dataForTitles = totalItems.map(x => ({\n AreaHa: x.Area,\n Selected: selectedItems.some(z => z.Id === x.Id)\n }));\n return this.statisticService.generateFieldsAreaTitle(dataForTitles);\n }\n\n private exportAsXls(): void {\n const fileName = this._getExportFilename();\n const items = this.dynComponent.getSelectedItems() as IApFieldNutrientDistributionGrid[];\n const fieldGeometryIds = items.map(x => x.FieldGeom.Id);\n this.nutrientDistributionStore.statisticDataExcelExport(fileName, fieldGeometryIds);\n }\n\n private _getExportFilename(): string {\n const customerExpr = this.loginStore.SelectedFarm?.CustomerNumber;\n const dateExpr = this.dateService.toFarmDate(new Date()).format('YYMMDD');\n const componentName = this.translationService.translate('Global__NutrientDistribution');\n return `${dateExpr}_${componentName.replace(' ', '_')}_${customerExpr}`;\n }\n\n private _mapDistributionsToGrid(): void {\n this.items$ = combineLatest([\n this.nutrientDistributionStore.Distributions$,\n this.soilSampleDateStore.Dates$\n ]).pipe(\n filter(([dist, sampleDates]) => !!dist && !!sampleDates),\n map(([dist, sampleDates]) => {\n return dist.map((dis: any) => {\n const fieldGeom = this.fieldStore.getFieldGeomById(dis.FieldGeomId);\n const field = this.fieldStore.getFieldByFieldGeomId(dis.FieldGeomId);\n const adminArea = Create(fieldGeom?.AdminArea, 0);\n const areaNumber = adminArea > 0 ? adminArea : '-';\n let areaRound: string | number;\n if (areaNumber !== '-') {\n const area = this._areaUnitConvert(areaNumber);\n areaRound = this.roundNumericService.roundAsNumber(area, this._settings.DigitsAfterDecimalPoint);\n } else {\n areaRound = '-';\n }\n const newestSampleDate = this.dateService.getDateMidnight(sampleDates[field?.Id as string]?.Date);\n const classP = this._soilSampleClassName(dis.AvgClassP);\n const classK = this._soilSampleClassName(dis.AvgClassK);\n const classMG = this._soilSampleClassName(dis.AvgClassMg);\n const classPH = this._soilSampleClassName(dis.AvgClassPh);\n const pIsGreaterE = dis.AvgClassP > 8;\n const kIsGreaterE = dis.AvgClassK > 8;\n const mgIsGreaterE = dis.AvgClassMg > 8;\n const phIsGreaterE = dis.AvgClassPh > 8;\n const pValue = this.nutrientService.convertElementOxid(dis.AvgP, ApElementOxydTypeEnum.P, dis.MethodP);\n const kValue = this.nutrientService.convertElementOxid(dis.AvgK, ApElementOxydTypeEnum.K, dis.MethodK);\n const mgValue = this.nutrientService.convertElementOxid(dis.AvgMg, ApElementOxydTypeEnum.Mg, dis.MethodMg);\n const phValue = dis.AvgPh;\n const pValueRounded = this.roundNumericService.roundAsNumber(pValue, APP_CONFIGURATION.SpecialDecimalPlaces.Distributions);\n const kValueRounded = this.roundNumericService.roundAsNumber(kValue, APP_CONFIGURATION.SpecialDecimalPlaces.Distributions);\n const mgValueRounded = this.roundNumericService.roundAsNumber(mgValue, APP_CONFIGURATION.SpecialDecimalPlaces.Distributions);\n const phValueRounded = this.roundNumericService.roundAsNumber(phValue, APP_CONFIGURATION.SpecialDecimalPlaces.Distributions);\n const status = this.soilSampleService.getStatus(dis.NewestSampleDate);\n const soilGroups = [...dis.SoilGroups].Sort().join(', ');\n const translations = [\n 'Nutrients_Ips_Pages__StatusRed',\n 'Nutrients_Ips_Pages__StatusYellow',\n 'Nutrients_Ips_Pages__StatusGreen',\n ];\n const classes = [\n 'ap-status-red',\n 'ap-status-yellow',\n 'ap-status-green'\n ];\n return {\n Id: field?.Id,\n Status: status,\n StatusClass: classes[status + 1],\n StatusDesc: translations[status + 1],\n SoilGroup: soilGroups,\n SourceItem: dis,\n FieldNumber: this.fieldFormatService.formatFieldNumber(field),\n Field: field,\n FieldGeom: fieldGeom,\n Area: areaRound,\n ClassP: classP,\n ClassK: classK,\n ClassMg: classMG,\n ClassPh: classPH,\n StyleClassP: this._soilClassColor(classP),\n StyleClassK: this._soilClassColor(classK),\n StyleClassMg: this._soilClassColor(classMG),\n StyleClassPh: this._soilClassColor(classPH),\n PValue: pValueRounded,\n KValue: kValueRounded,\n MgValue: mgValueRounded,\n PhValue: phValueRounded,\n PIsGreaterE: pIsGreaterE,\n KIsGreaterE: kIsGreaterE,\n MgIsGreaterE: mgIsGreaterE,\n PhIsGreaterE: phIsGreaterE,\n PValueTooltip: this.nutrientService.formatClassificationTooltip(dis.AvgP, pIsGreaterE, dis.MethodP),\n KValueTooltip: this.nutrientService.formatClassificationTooltip(dis.AvgK, kIsGreaterE, dis.MethodK),\n MgValueTooltip: this.nutrientService.formatClassificationTooltip(dis.AvgMg, mgIsGreaterE, dis.MethodMg),\n PhValueTooltip: this.nutrientService.formatClassificationTooltip(dis.AvgPh, phIsGreaterE, dis.MethodPh),\n NewestSampleDate: newestSampleDate,\n } as IApFieldNutrientDistributionGrid;\n });\n })\n );\n }\n}\n","import {IGridData} from '../../ap-interface';\nimport IField = Data.FieldManagement.IField;\nimport ISoilSamplePlanning = Data.IpsPlanning.ISoilSamplePlanning;\nimport IGuid = System.IGuid;\n\n/**\n * enumeration for all possible types of mass edit within this component\n */\nexport enum SoilSampleEdits {\n DeleteValues = 0,\n ShapeExport = 1,\n NextSample = 2,\n OrgApplication = 3,\n Description = 4,\n PdfExport = 5,\n XlsExport = 6,\n NextSampleDelete = 7\n}\n\nexport interface ISspFieldJoin {\n Id: IGuid;\n Field: IField;\n SoilSamplePlanning: ISoilSamplePlanning;\n}\n\nexport interface ISspFieldJoinGridData extends IGridData<ISspFieldJoin> {\n Status: any;\n StatusClass: any;\n StatusDesc: any;\n Geom: any;\n Area: number;\n LastSamplingDate: Date;\n PlannedSamplingDate: any;\n OrganicApplication: any;\n Crop: any;\n}\n\nexport enum SoilSamplePlanningOverviewActions {\n YES = 1,\n NO = 0,\n}\n","import {IStateStore} from '../../ap-interface/interfaces/store';\nimport {Injectable} from '@angular/core';\nimport {Store} from '../index';\nimport {\n ApCustomTypes,\n NetTypes,\n SoilSamplePlanningReportDownload,\n SoilSamplePlanningReportDownloadSuccess\n} from 'invoker-transport';\nimport * as download from 'downloadjs';\nimport IReportData = Agriport.Excel.Factory.InputData.SoilSamplePlanningReport.IReportData;\nimport {ApSignalrService} from '../../ap-core/services/ap-signalr.service';\n\ninterface ISoilSamplePlanningReportStore extends IStateStore<string> {\n}\n\n@Injectable({providedIn: 'root'})\nexport class SoilSamplePlanningReportStore extends Store<ISoilSamplePlanningReportStore> {\n constructor(public backend: ApSignalrService) {\n super(backend, {\n data: [],\n loaded: false,\n loading: false\n });\n\n backend.registerObservable(SoilSamplePlanningReportDownloadSuccess).subscribe(d => {\n super.SetLoadFinishState();\n download(d.Data[1], d.Data[0], 'application/excel');\n });\n }\n\n public downloadSoilSamplePlanningReport(headline: string, bookname: string, reportData: IReportData): void {\n super.SetLoadState();\n super.Mutate(s => s.data, () => []);\n this.DispatchBackend(new SoilSamplePlanningReportDownload([\n {Name: 'headline', Type: NetTypes.STRING, Value: headline},\n {Name: 'bookName', Type: NetTypes.STRING, Value: bookname},\n {\n Name: 'reportData',\n Type: ApCustomTypes.Agriport_Excel_Factory_InputData_SoilSamplePlanningReport_ReportData,\n Value: reportData\n }\n ]));\n }\n}\n","import {SoilSamplePlanningStore} from '../../stores/nutrients/soilsampleplanning.store';\nimport {\n SoilSamplePlanningReportStore\n} from '../../stores/nutrients/soilsampleplanning-report.store';\nimport {AfterContentInit, Component, EventEmitter, OnDestroy, OnInit, ViewChild} from '@angular/core';\nimport {BehaviorSubject, combineLatest, Observable, Subscription} from 'rxjs';\nimport {find} from 'lodash';\nimport {\n ApGridPagerType,\n ApStatsType,\n IBarLineAreaChartData,\n IBarLineAreaChartDataValue,\n IGridPagerData,\n IWizardChoiceData,\n MapViewCurrentMenu,\n MapViewMode\n} from '../../ap-interface';\nimport * as moment from 'moment';\nimport {saveAs} from '@progress/kendo-file-saver';\nimport {debounceTime, delay, filter, map} from 'rxjs/operators';\nimport {\n ApDynComponentComponent\n} from '../../ap-dyncomponent/ap-dyncomponent.component';\nimport {\n ApDynGridColumnConfigBase,\n ApDynGridColumnHideConfig\n} from '../../ap-dyngrids/config/ap-dyn-grid-column-config-base';\nimport {\n ApDynGridPagerConfigBase\n} from '../../ap-dyngrids/config/ap-dyn-grid-pager-config-base';\nimport {\n ApDynGridPropertyColumnConfig,\n FilterType\n} from '../../ap-dyngrids/config/ap-dyn-grid-property-column-config';\nimport {\n ApDynGridEditColumnConfig\n} from '../../ap-dyngrids/config/ap-dyn-grid-edit-column-config';\nimport {\n ApDynGridPagerConfig\n} from '../../ap-dyngrids/config/ap-dyn-grid-pager-config';\nimport {\n ApDynGridStatusColumnConfig\n} from '../../ap-dyngrids/config/ap-dyn-grid-status-column-config';\nimport {ApGuidUtil, GetRoundNumericPipe} from '../../ap-utils';\nimport {\n SettingsStore\n} from '../../stores/base-data/settings.store';\nimport {FieldStore} from '../../stores/farm/field.store';\nimport {\n LanguageStore\n} from '../../stores/translation/language.store';\nimport {\n MapViewStore\n} from '../../stores/layout/mapview.store';\nimport {\n LoginStore\n} from '../../stores/login/login.store';\nimport {\n CampaignYearStore\n} from '../../stores/login/campaignyear.store';\nimport {\n ApDateService\n} from '../../ap-core/services/ap-date-service';\nimport {Create, ObjectFactory} from 'ts-tooling';\nimport {\n ApNutrientPlanningComponent\n} from '../../entry-components/ap-nutrients-management-entry-components/ap-nutrient-planning.component';\nimport {\n FormStore\n} from '../../stores/layout/form.store';\nimport {\n ApSoilSampleService\n} from '../service/ap-soil-sample.service';\nimport {\n JobsStore\n} from '../../stores/administration/jobs.store';\nimport {\n IChartSet,\n StatisticStore\n} from '../../stores/statistic/statistic.store';\nimport {\n SoilSampleDateStore\n} from '../../stores/nutrients/soilsampledate.store';\nimport {\n ApDynGridGroupColumnConfig\n} from '../../ap-dyngrids/config/ap-dyn-grid-group-column-config';\nimport {\n CropRotationStore\n} from '../../stores/farm/crop.rotation.store';\nimport {\n ApTranslationService\n} from '../../ap-utils/service/ap-translation.service';\nimport {\n Icon\n} from '../../ap-interface/enums/layout/icon.enum';\nimport {\n ApUtilService\n} from '../../ap-utils/service/ap-util.service';\nimport {\n GetRoundNumericService\n} from '../../ap-utils/service/get-round-numeric.service';\nimport {\n ApRoleTypeService\n} from '../../services/common/ap-role-type.service';\nimport {\n ISspFieldJoinGridData,\n SoilSampleEdits,\n SoilSamplePlanningOverviewActions\n} from '../types/base-fertilization-soil-sampleplanning.types';\nimport {\n PlanningEntryComponentDataType\n} from '../../entry-components/ap-nutrients-management-entry-components/ap-nutrient-planning-configs/nutrient-planning-types';\nimport {\n StatisticService\n} from '../../services/data/statistic.service';\nimport ISettings = Data.BaseData.ISettings;\nimport IField = Data.FieldManagement.IField;\nimport ISoilSamplePlanning = Data.IpsPlanning.ISoilSamplePlanning;\nimport IContentRow = Agriport.Excel.Factory.InputData.SoilSamplePlanningReport.IContentRow;\nimport IReportData = Agriport.Excel.Factory.InputData.SoilSamplePlanningReport.IReportData;\nimport ISoilSamplePlanningExportData = Data.IpsPlanning.ISoilSamplePlanningExportData;\n\n/**\n * TODO EXCEL und PDF Export ermöglichen --> Jira Ticket angelegt https://jira.agricon.de/browse/APV49-826\n */\n\n@Component({\n selector: 'ap-soilsampleplanning-overview',\n template: `\n <ap-dyncomponent [caption]=\"'Base__OrderPlanning'\"\n [canCreate]=\"false\"\n [canSearch]=\"true\"\n [headerIcon]=\"'ap-icon-base-fertilization'\"\n [filterTooltip]=\"'filterTooltip'\"\n [columns]=\"columns$ | async\"\n [items]=\"items$ | async\"\n [loading$]=\"isLoading$\"\n [pager]=\"pager\"\n [groupable]=\"true\"\n [pdfExportTitle]=\"'Base__OrderPlanning'\"\n [exportFileName]=\"exportFileName\"\n [selectable]=\"{checkboxOnly: false, mode: 'multiple'}\"\n (selectionChange)=\"selectionChange()\"\n (create)=\"onCreate()\"\n ></ap-dyncomponent>`\n})\n\nexport class ApSoilSamplePlanningOverviewComponent implements OnInit, AfterContentInit, OnDestroy {\n @ViewChild(ApDynComponentComponent, {static: true}) dynComponent: ApDynComponentComponent;\n columns$: Observable<ApDynGridColumnConfigBase[]>;\n items$: Observable<ISspFieldJoinGridData[]>;\n pager: ApDynGridPagerConfigBase;\n isLoading$: Observable<boolean>;\n exportFileName = '';\n\n public fieldsJoinedWithSoilSamplePlanning: any[] = [];\n private _areaTotal = 0;\n private _listMassEditing = [];\n private _subscriptions: Array<Subscription> = [];\n private _applyClicked = new EventEmitter<any>();\n private _settings: ISettings;\n private _previousMapViewMenu: MapViewCurrentMenu;\n private _year$ = new BehaviorSubject<number>(undefined);\n private _previousYear = new EventEmitter<void>();\n private _nextYear = new EventEmitter<void>();\n private _cropRotationLimits$ = new BehaviorSubject<{ min: number, max: number }>({\n min: this.campaignYearStore?.getSelectedCampaignYear().Year,\n max: this.campaignYearStore?.getSelectedCampaignYear().Year\n });\n\n /**\n * Compares two dates\n * @param dateA\n * @param dateB\n * @private\n */\n private static compareDates(dateA: Date, dateB: Date): number {\n if (!dateA) {\n return -1;\n } else if (!dateB) {\n return 1;\n }\n return dateA?.getTime() - dateB.getTime();\n }\n\n /**\n * Calculates the statistic bar color depending on item's status\n * @param item\n * @param date\n * @private\n */\n private static getStatBarColor(item: ISspFieldJoinGridData, date: Date): string {\n if (!date) {\n return '#2c3237';\n } else {\n switch (item.Status) {\n case 0:\n return '#fdce3e';\n case 1:\n return '#5ec232';\n default:\n return '#980000';\n }\n }\n }\n\n constructor(private soilSamplePlanningStore: SoilSamplePlanningStore,\n private formStore: FormStore,\n private loginStore: LoginStore,\n private campaignYearStore: CampaignYearStore,\n private mapViewStore: MapViewStore,\n private translationService: ApTranslationService,\n private fieldStore: FieldStore,\n private languageStore: LanguageStore,\n private roundNumericPipe: GetRoundNumericPipe,\n private cropRotationStore: CropRotationStore,\n private settingsStore: SettingsStore,\n private soilSamplePlanningReportStore: SoilSamplePlanningReportStore,\n private dateService: ApDateService,\n private soilSampleService: ApSoilSampleService,\n private soilSampleDateStore: SoilSampleDateStore,\n private jobsStore: JobsStore,\n private roundNumericService: GetRoundNumericService,\n private statisticService: StatisticService,\n private statisticStore: StatisticStore) {\n }\n\n ngOnInit(): void {\n this.mapViewStore.goIntoStatisticMenu();\n this._previousMapViewMenu = this.mapViewStore.getMapViewCurrentMenu();\n this._subscriptions.push(this.settingsStore.FirstSetting$.subscribe(s => this._settings = s));\n this._subscriptions.push(this._applyClicked.subscribe((e) => this._onApplyClicked(e)));\n this._subscriptions.push(this._previousYear.subscribe(() => {\n this._year$.next(this._year$.value - 1);\n }));\n this._subscriptions.push(this._nextYear.subscribe(() => {\n this._year$.next(this._year$.value + 1);\n }));\n this._subscriptions.push(\n combineLatest([\n this.cropRotationStore.Listen(s => s.history).pipe(\n map((history) => Object.values(history)),\n filter((crops) => crops.length !== 0),\n map((crops) => crops.map((crop) => Object.keys(crop).filter((key) => crop[key] !== null).map((key) => +key))),\n map((years) => years.reduce((a, b) => a.concat(b)))),\n this.campaignYearStore.Listen(s => s.selectedYear)\n ]).pipe(\n map(([dates, campaignYear]) => ({\n min: Math.min(...dates, campaignYear.Year),\n max: Math.max(...dates, campaignYear.Year)\n }))).subscribe(l => this._cropRotationLimits$.next(l))\n );\n this.isLoading$ = combineLatest([\n this.soilSamplePlanningStore.Listen(s => s.loading),\n this.soilSampleDateStore.Listen(s => s.loading),\n this.campaignYearStore.Listen(s => s.loading),\n this.cropRotationStore.Listen(s => s.loading),\n this.fieldStore.Listen(s => s.loading)]).pipe(\n map(([planningLoading, soilSampleDatesLoading, campaignYearLoading, cropRotationLoading, fieldsLoading]) =>\n planningLoading || soilSampleDatesLoading || campaignYearLoading || cropRotationLoading || fieldsLoading)\n );\n this._subscriptions.push(this.campaignYearStore.Listen(s => s.selectedYear).subscribe((campaignYear) => {\n if (campaignYear) {\n this._year$.next(campaignYear.Year - 1);\n }\n }));\n this.items$ = combineLatest([\n this.campaignYearStore.Listen(s => s.selectedYear),\n this.cropRotationStore.Listen(s => s.history),\n this.fieldStore.Listen(s => s.data),\n this.soilSampleDateStore.Listen(s => s.dates),\n this.soilSamplePlanningStore.Listen(s => s.data)]).pipe(\n filter(([campaignYear, cropRotation, fields, soilSampleDates, plannings]) =>\n fields?.length !== 0 && !!plannings && campaignYear?.Year > 0 && !!soilSampleDates && !!cropRotation),\n map(([, cropRotation, fields, soilSampleDates, plannings]) => {\n this.fieldsJoinedWithSoilSamplePlanning = [];\n this._areaTotal = 0;\n for (const field of fields) {\n this.fieldsJoinedWithSoilSamplePlanning.push(\n {\n Id: field.Id,\n Field: field,\n SoilSamplePlanning: find(plannings, (ssP: any) => ssP && ssP.FieldId === field.Id) || {}\n });\n }\n return this.fieldsJoinedWithSoilSamplePlanning.map(planning => {\n const geom = this.fieldStore.getCurrentFieldGeom(planning.Field);\n const area = Create(geom?.AdminArea, 0) / 10000;\n if (area > 0) {\n this._areaTotal = this._areaTotal + area;\n }\n const organic = planning?.SoilSamplePlanning?.OrganicApplication ? 'Global__Yes' : 'Global__No';\n const lastSamplingDate = Object.keys(soilSampleDates).indexOf(planning.Id) >= 0 && soilSampleDates[planning.Id as string]\n ? soilSampleDates[planning.Id as string]\n : undefined;\n const lastSamplingDateMidnight = !!lastSamplingDate?.Date\n ? this.dateService.getDateMidnight(this.dateService.toFarmDateFromUtc(lastSamplingDate.Date).toDate())\n : undefined;\n const plannedSamplingDate = planning.SoilSamplePlanning.PlannedSamplingdate\n ? this.dateService.toFarmDateFromUtc(planning.SoilSamplePlanning.PlannedSamplingdate).toDate()\n : null;\n const status = this.soilSampleService.getStatus(lastSamplingDateMidnight);\n return {\n Id: planning.Id,\n SourceItem: planning,\n NrSNr: this.fieldStore.getFieldNumberAndSubNumber(planning.Field),\n Status: status,\n StatusClass: status === 1\n ? 'ap-status-green'\n : status === 0 ? 'ap-status-yellow' : 'ap-status-red',\n StatusDesc: status === 1\n ? 'Nutrients_Ips_Pages__StatusGreen'\n : status === 0 ? 'Nutrients_Ips_Pages__StatusYellow' : 'Nutrients_Ips_Pages__StatusRed',\n Geom: geom,\n Area: area,\n LastSamplingDate: lastSamplingDateMidnight,\n PlannedSamplingDate: plannedSamplingDate ? this.dateService.getDateNoonToFarmTime(plannedSamplingDate) : null,\n OrganicApplication: this.translationService.translate(organic),\n Crop: Object.keys(cropRotation).indexOf(planning.Id) >= 0 ? cropRotation[planning.Id as string] : null\n } as ISspFieldJoinGridData;\n });\n }));\n this.soilSamplePlanningStore.loadSoilSamplePlanning();\n this._subscriptions.push(this.soilSamplePlanningStore.Listen(s => s.shapeExport).subscribe(data => {\n if (data) {\n this.downloadShapeExportZipped(data);\n }\n }));\n this._subscriptions.push(this.items$.pipe(\n debounceTime(500),\n delay(1)).subscribe(_ => {\n setTimeout(() => this.generateStats(), 0);\n }));\n }\n\n ngAfterContentInit(): void {\n this._subscriptions.push(this.loginStore.SelectedFarm$.subscribe(\n () => this.soilSamplePlanningStore.loadSoilSamplePlanning()\n ));\n\n this.gridBuilder();\n this.fillWizardChoiceData();\n this.generateStats();\n }\n\n gridBuilder(): void {\n this.columns$ = this._cropRotationLimits$.pipe(\n filter((limits) => !!limits),\n /*map((limits) => ({\n limits\n })),*/\n map((limits) => [\n new ApDynGridStatusColumnConfig({\n field: 'Status',\n showHeaderTitle: true,\n class: 'StatusClass',\n description: 'StatusDesc',\n pending: this.jobsStore.BlockedFieldIdsBuWsv$,\n pendingTooltip: this.jobsStore.BlockedFieldIdsBuWsvTooltip$,\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Global__NumberAbbr',\n field: 'SourceItem.Field.FieldNumber',\n filterable: true,\n filterType: FilterType.NUMBER,\n cssClass: 'right',\n hide: true,\n headerFilterable: true,\n width: 60\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Global__FieldPartShort',\n field: 'SourceItem.Field.FieldSubnumber',\n filterable: true,\n filterType: FilterType.NUMBER,\n cssClass: 'right',\n headerFilterable: true,\n hide: true,\n width: 60\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Global__NumberAbbr',\n field: 'NrSNr',\n filterable: true,\n hide: new ApDynGridColumnHideConfig({\n mapHide: false,\n selfHide: this.mapViewStore.Listen(s => s.mode).pipe(map((m) => m !== MapViewMode.NORMAL)),\n }),\n width: 75,\n headerFilterable: true\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Global__FieldName',\n field: 'SourceItem.Field.FieldName',\n filterable: true,\n headerFilterable: true,\n sortIndex: 0,\n sortDesc: false,\n width: 180,\n cssClass: 'left',\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Global__Area_Unit',\n field: 'Area',\n headerFilterable: true,\n width: 60,\n cssClass: 'right', filterType: FilterType.NUMBER,\n tooltip: (dataItem) => dataItem['Area'],\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [this._settings.DigitsAfterDecimalPoint]\n }]\n }),\n new ApDynGridGroupColumnConfig({\n style: 'text-align:center',\n headerButtons: {\n nextClicked: this._nextYear,\n nextDisabled: this._year$.pipe(map((y) => y >= limits.max)),\n previousClicked: this._previousYear,\n previousDisabled: this._year$.pipe(map((y) => y <= limits.min)),\n },\n title: 'Global__Crop',\n groupColumns: this.getCropRotationGridConfigs(limits),\n width: 100,\n hide: new ApDynGridColumnHideConfig({\n widthHidePriority: 1\n })\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Nutrients_Ips_Pages__LastBu',\n field: 'LastSamplingDate',\n filterable: true,\n headerFilterable: true,\n format: this.languageStore.CurrentDateFormat,\n width: 80\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Nutrients_Ips_Pages__NextSample',\n field: 'PlannedSamplingDate',\n format: 'MM/YYYY',\n filterable: true,\n headerFilterable: true,\n width: 80\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Nutrients_Ips_Pages__OrganicSample',\n field: 'OrganicApplication',\n filterable: true,\n headerFilterable: true,\n width: 80\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Nutrients_Ips_Pages__Note',\n field: 'SourceItem.SoilSamplePlanning.Description',\n filterable: true,\n headerFilterable: true,\n width: 180,\n hide: true\n }),\n new ApDynGridEditColumnConfig({\n disabled: true\n })\n ]));\n\n this.pager = new ApDynGridPagerConfig({\n listMassEditing: ApRoleTypeService.hasAgriconRole(this.loginStore.User) ? this._listMassEditing : null,\n apply: this._applyClicked,\n hasPermission: true,\n iconButtons: [\n {\n icon: Icon.PDF,\n callback: ApUtilService.createEventEmitter(this.exportAsPdf.bind(this), this._subscriptions),\n tooltip: 'Global__Save_PDF'\n },\n {\n icon: Icon.XLS,\n callback: ApUtilService.createEventEmitter(this.exportAsXls.bind(this), this._subscriptions),\n tooltip: 'Global__Save_EXCEL'\n },\n {\n icon: Icon.Shape,\n callback: ApUtilService.createEventEmitter(this.exportShape.bind(this), this._subscriptions),\n tooltip: 'Nutrients_Ips_Pages__ShpExport'\n },\n ]\n });\n }\n\n private getCropRotationGridConfigs(limits: { min: number, max: number }): ApDynGridColumnConfigBase[] {\n const columns = [];\n for (let iYear = limits.min; iYear <= limits.max + 3; ++iYear) {\n columns.push(new ApDynGridPropertyColumnConfig({\n title: `${iYear}`,\n field: `Crop.${iYear}.MainCropName`,\n filterable: true,\n headerFilterable: iYear === this.campaignYearStore.getSelectedCampaignYear().Year,\n width: 100,\n pdfExport: iYear === this.campaignYearStore.getSelectedCampaignYear().Year || iYear === this.campaignYearStore.getSelectedCampaignYear().Year - 1 || iYear === this.campaignYearStore.getSelectedCampaignYear().Year + 1,\n hide: new ApDynGridColumnHideConfig({\n mapHide: false,\n selfHide: combineLatest([this._year$, this.mapViewStore.Listen(s => s.mode)]).pipe(\n map(([year, mode]) => {\n if (mode !== MapViewMode.HIDE) {\n // show middle year-column when map is visible\n return iYear !== (year + 1);\n } else {\n // show all 3 croprotation years\n return !(iYear >= year && iYear < year + 3);\n }\n }),\n ),\n }),\n tooltip: ((dataItem) => {\n const yesNo = (b: any) => this.translationService.translate(b ? 'LabelYes' : 'LabelNo');\n const unit = this.translationService.translate('Global__UnitDtPerHa');\n\n if (!dataItem || !dataItem['Crop'] || !dataItem['Crop'][iYear]) {\n return '';\n }\n\n const c = dataItem['Crop'][iYear].MainCropName;\n let s = '-';\n let sYieldUnit = '-';\n if (dataItem['Crop'][iYear].SecondCrop !== 0) {\n s = dataItem['Crop'][iYear].SecondCropName;\n sYieldUnit = dataItem['Crop'][iYear].SecondCropYield + ' ' + unit;\n }\n\n const mainCrop = `${this.translationService.translate('Nutrients_Pages_Popups__MainCrop')}: ${c}`;\n const targetMain = `${this.translationService.translate('Global__Target')}: ${dataItem['Crop'][iYear].MainCropYield} ${unit}`;\n const straw = `${this.translationService.translate('Nutrients_Pages__StrawRemoved')}: ${yesNo(dataItem['Crop'][iYear].MainCropStraw)}`;\n const interTillage = `${this.translationService.translate('Nutrients_Pages_Popups__Intertillage')}: ${s}`;\n const targetInter = `${this.translationService.translate('Global__Target')}: ${sYieldUnit}`;\n const br = '<br>';\n return `${mainCrop}${br}${targetMain}${br}${straw}${br}${interTillage}${br}${targetInter}`;\n })\n }));\n }\n return columns;\n }\n\n /**\n * Fill mass edit wizzard\n */\n fillWizardChoiceData(): void {\n this._listMassEditing.push(\n {\n id: SoilSampleEdits.DeleteValues,\n name: this.translationService.translate('Nutrients_Ips_Pages__DeleteValues'),\n type: ApGridPagerType.None,\n values: null\n } as IWizardChoiceData,\n {\n id: SoilSampleEdits.NextSampleDelete,\n name: this.translationService.translate('Nutrients_Ips_Pages__NextSample_delete'),\n type: ApGridPagerType.None,\n values: null\n } as IWizardChoiceData,\n {\n id: SoilSampleEdits.NextSample,\n name: this.translationService.translate('Nutrients_Ips_Pages__NextSample'),\n type: ApGridPagerType.CalenderMonthly,\n values: null\n } as IWizardChoiceData,\n {\n id: SoilSampleEdits.OrgApplication,\n name: this.translationService.translate('Nutrients_Ips_Pages__OrganicSample'),\n type: ApGridPagerType.DropDown,\n values: [\n {\n id: SoilSamplePlanningOverviewActions.YES,\n label: this.translationService.translate('Global__Yes'),\n },\n {\n id: SoilSamplePlanningOverviewActions.NO,\n label: this.translationService.translate('Global__No'),\n }\n ]\n } as IWizardChoiceData,\n {\n id: SoilSampleEdits.Description,\n name: this.translationService.translate('Nutrients_Ips_Pages__Note'),\n type: ApGridPagerType.Text,\n values: null\n } as IWizardChoiceData\n );\n }\n\n /**\n * generates the filename for Excel, pdf and shape export.\n */\n public getExportFilename(): string {\n const customerExpr = this.loginStore.SelectedFarm?.CustomerNumber;\n const dateExpr = this.dateService.toFarmDate(new Date()).format('YYMMDD');\n return `${dateExpr}_${this.translationService.translate('Base__OrderPlanning')}_${customerExpr}`;\n }\n\n ngOnDestroy(): void {\n // go back to mapViewMode when user leaves Probenahmeplanung\n if (this._previousMapViewMenu === MapViewCurrentMenu.MAP) {\n this.mapViewStore.goIntoMapMenu();\n }\n this.statisticStore.removeStatisticData();\n this._subscriptions.forEach(d => {\n d.unsubscribe();\n });\n }\n\n public onCreate(): void {\n this.formStore.openForm({\n component: ApNutrientPlanningComponent,\n data: {\n Summary: null,\n Type: PlanningEntryComponentDataType.Create\n }\n });\n }\n\n private _onApplyClicked($event: IGridPagerData): void {\n const modifiedPlannings: ISoilSamplePlanning[] = [];\n const foundItems = (this.dynComponent.getSelectedItems() as ISspFieldJoinGridData[]).map(d => {\n return d.SourceItem;\n });\n\n if (!foundItems || foundItems.length === 0) {\n return;\n }\n\n for (const foundItem of foundItems) {\n const item = ObjectFactory.Copy(foundItem);\n (item.SoilSamplePlanning as ISoilSamplePlanning).FieldId = (item.Field as IField).Id;\n switch ($event?.object?.id) {\n case SoilSampleEdits.DeleteValues: {\n (item.SoilSamplePlanning as ISoilSamplePlanning).Description = null;\n (item.SoilSamplePlanning as ISoilSamplePlanning).PlannedSamplingdate = null;\n (item.SoilSamplePlanning as ISoilSamplePlanning).OrganicApplication = null;\n break;\n }\n case SoilSampleEdits.NextSample: {\n // convert date from kendo (defaultz browser timezone) to farm timezone!\n (item.SoilSamplePlanning as ISoilSamplePlanning).PlannedSamplingdate =\n this.dateService.getDateNoonToFarmTime($event.value as Date, 1);\n (item.SoilSamplePlanning as ISoilSamplePlanning).UserId = this.loginStore.UserId;\n break;\n }\n case SoilSampleEdits.NextSampleDelete: {\n (item.SoilSamplePlanning as ISoilSamplePlanning).PlannedSamplingdate = undefined;\n (item.SoilSamplePlanning as ISoilSamplePlanning).UserId = this.loginStore.UserId;\n break;\n }\n case SoilSampleEdits.OrgApplication: {\n (item.SoilSamplePlanning as ISoilSamplePlanning).OrganicApplication =\n ($event.value.id === SoilSamplePlanningOverviewActions.YES);\n break;\n }\n case SoilSampleEdits.Description: {\n (item.SoilSamplePlanning as ISoilSamplePlanning).Description = ($event.value as any);\n break;\n }\n default:\n return;\n }\n\n // In case no user has been assigned to that particular soilSamplePlanning\n if ((item.SoilSamplePlanning as ISoilSamplePlanning).UserId == null) {\n (item.SoilSamplePlanning as ISoilSamplePlanning).UserId = this.loginStore.UserId;\n }\n\n // Generate GUID for new soilSamplePlanning\n if ((item.SoilSamplePlanning as ISoilSamplePlanning).Id == null) {\n (item.SoilSamplePlanning as ISoilSamplePlanning).Id = ApGuidUtil.generateNewGuid();\n }\n modifiedPlannings.push((item.SoilSamplePlanning as ISoilSamplePlanning));\n }\n\n this.soilSamplePlanningStore.saveSoilSamplePlannings(modifiedPlannings);\n }\n\n /**\n * When shape-export finished on backend this method is triggered\n * to download the zip archive\n */\n private downloadShapeExportZipped(zipContent: ArrayBuffer): void {\n saveAs(new Blob([new Uint8Array(zipContent)], {type: 'application/zip'}),\n this.getExportFilename() + '.zip');\n }\n\n /**\n * exports selected fields/plannings as shape\n */\n private exportShape(): void {\n const selectedGridItems = this.dynComponent.getSelectedItems() as ISspFieldJoinGridData[];\n if (!selectedGridItems || selectedGridItems.length === 0) {\n return;\n }\n const exportItems: ISoilSamplePlanningExportData[] = selectedGridItems.map(d => {\n const campaignYear = this.campaignYearStore.SelectedCampaignYear.Year;\n return {\n FieldId: d.SourceItem.Field?.Id,\n LastSampleDate: d.LastSamplingDate,\n CropTypeNameMinus1: d?.Crop?.hasOwnProperty(campaignYear - 1) ? d.Crop[campaignYear - 1]?.MainCropName : '',\n CropTypeName: d?.Crop?.hasOwnProperty(campaignYear) ? d.Crop[campaignYear]?.MainCropName : '',\n CropTypeNamePlus1: d?.Crop?.hasOwnProperty(campaignYear + 1) ? d.Crop[campaignYear + 1]?.MainCropName : '',\n CropTypeNamePlus2: d?.Crop?.hasOwnProperty(campaignYear + 2) ? d.Crop[campaignYear + 2]?.MainCropName : ''\n };\n });\n this.soilSamplePlanningStore.exportShape(\n exportItems,\n this.campaignYearStore.getSelectedCampaignYear().DefaultStart,\n this.getExportFilename(),\n this.languageStore?.SelectedLanguage?.Key);\n }\n\n private exportAsPdf(): void {\n // const now = this._moment().format(this.languageStore.CurrentDateTimeFormat);\n // const name = this.translationService.translate('Base_Pages__SampleFields');\n this.exportFileName = this.getExportFilename();\n this.dynComponent.dynGrid.exportAsPdf();\n }\n\n private exportAsXls(): void {\n const contentRows: IContentRow[] = [];\n const rows = this.dynComponent.getSelectedItems();\n rows.forEach(row => {\n const a = row as any;\n if (a) {\n const defaultFieldGeom = a.SourceItem?.Field?.FieldGeoms?.length > 0\n ? a.SourceItem.Field.FieldGeoms[0]\n : null;\n const campaignYear = this.campaignYearStore.SelectedCampaignYear.Year;\n contentRows.push({\n FieldNumber: isNaN(parseFloat(a.SourceItem.Field.FieldNumber)) ? 0 : parseFloat(a.SourceItem.Field.FieldNumber),\n FieldSubNumber: isNaN(parseFloat(a.SourceItem.Field.FieldSubnumber)) ? 0 : parseFloat(a.SourceItem.Field.FieldSubnumber),\n FieldName: a.SourceItem.Field.FieldName,\n FieldArea: this.roundNumericService.roundAsNumber(a.Area, this._settings.DigitsAfterDecimalPoint),\n CropTypeMinus1: a?.Crop?.hasOwnProperty(campaignYear - 1) ? a?.Crop[campaignYear - 1]?.MainCropName : '',\n CropType: a?.Crop?.hasOwnProperty(campaignYear) ? a.Crop[campaignYear]?.MainCropName : '',\n CropTypePlus1: a?.Crop?.hasOwnProperty(campaignYear + 1) ? a.Crop[campaignYear + 1]?.MainCropName : '',\n CropTypePlus2: a?.Crop?.hasOwnProperty(campaignYear + 2) ? a.Crop[campaignYear + 2]?.MainCropName : '',\n LastSampleDate: a.LastSamplingDate ?\n this.dateService.dateToMoment(a.LastSamplingDate).format(this.languageStore.CurrentDateFormat)\n : '',\n NextSampleDate: a.PlannedSamplingDate ?\n this.dateService.dateToMoment(a.PlannedSamplingDate).format(this.languageStore.CurrentDateFormat)\n : '',\n OrganicApplication: a.OrganicApplication,\n Description: a.SourceItem.SoilSamplePlanning.Description,\n Status: defaultFieldGeom && defaultFieldGeom?.IsValidGeometry\n ? this.translationService.translate('Global__Ok')\n : this.translationService.translate('Global__No_Geometry_For_Harvest_Year')\n });\n }\n });\n\n const columns = this._getReportColumnNames();\n const reportData: IReportData = {\n Content: {\n HeaderLabels: [\n columns.get('FieldNumber'),\n columns.get('FieldSubNumber'),\n columns.get('FieldName'),\n columns.get('FieldArea'),\n columns.get('CropTypeMinus1'),\n columns.get('CropType'),\n columns.get('CropTypePlus1'),\n columns.get('CropTypePlus2'),\n columns.get('LastSampleDate'),\n columns.get('NextSampleDate'),\n columns.get('OrganicApplication'),\n columns.get('Description'),\n columns.get('Status')\n ],\n Rows: contentRows,\n },\n Header: {\n FieldNumber: columns.get('FieldNumber'),\n FieldSubNumber: columns.get('FieldSubNumber'),\n FieldName: columns.get('FieldName'),\n FieldArea: columns.get('FieldArea'),\n CropTypeMinus1: columns.get('CropTypeMinus1'),\n CropType: columns.get('CropType'),\n CropTypePlus1: columns.get('CropTypePlus1'),\n CropTypePlus2: columns.get('CropTypePlus2'),\n LastSampleDate: columns.get('LastSampleDate'),\n NextSampleDate: columns.get('NextSampleDate'),\n OrganicApplication: columns.get('OrganicApplication'),\n Description: columns.get('Description'),\n Status: columns.get('Status')\n }\n };\n const bookName = this.getExportFilename();\n this.soilSamplePlanningReportStore.downloadSoilSamplePlanningReport(bookName, `${bookName}.xlsx`, reportData);\n }\n\n public selectionChange(): void {\n if (this.mapViewStore.getMapViewMode() !== MapViewMode.HIDE && this.mapViewStore.getMapViewCurrentMenu() === MapViewCurrentMenu.MAP) {\n const selectedItems = this.dynComponent.getSelectedItems() as ISspFieldJoinGridData[];\n this.fieldStore.changeSelectedField(selectedItems.Convert((e: any) => e.Id));\n }\n this.generateStats();\n }\n\n private _getReportColumnNames(): Map<string, string> {\n const columnNames = new Map<string, string>();\n const selectedCampaignYear = this.campaignYearStore.SelectedCampaignYear.Year;\n columnNames.set('FieldNumber', this.translationService.translate('Docu_Ini__Number'));\n columnNames.set('FieldSubNumber', this.translationService.translate('Docu_Ini_Subnumber'));\n columnNames.set('FieldName', this.translationService.translate('Global__FieldName'));\n columnNames.set('FieldArea', this.translationService.translate('Global__Area_Unit'));\n columnNames.set('CropTypeMinus1', this.translationService.translate('Global__CropType') + ` (${selectedCampaignYear - 1})`);\n columnNames.set('CropType', this.translationService.translate('Global__CropType') + ` (${selectedCampaignYear})`);\n columnNames.set('CropTypePlus1', this.translationService.translate('Global__CropType') + ` (${selectedCampaignYear + 1})`);\n columnNames.set('CropTypePlus2', this.translationService.translate('Global__CropType') + ` (${selectedCampaignYear + 2})`);\n columnNames.set('LastSampleDate', this.translationService.translate('Nutrients_Ips_Pages__LastBu'));\n columnNames.set('NextSampleDate', this.translationService.translate('Nutrients_Ips_Pages__NextSample'));\n columnNames.set('OrganicApplication', this.translationService.translate('Nutrients_Ips_Pages__OrganicSample'));\n columnNames.set('Description', this.translationService.translate('Nutrients_Ips_Pages__Note'));\n columnNames.set('Status', this.translationService.translate('Global__Status'));\n return columnNames;\n }\n\n /**\n * Generates the statistic diagrams for last sampling-dates and planned sampling dates\n * @private\n */\n private generateStats(): void {\n const emptyMessage = `${this.translationService.translate('Nutrients__StatisticsTitle')}\\n${this.translationService.translate('Base__OrderPlanning')}`;\n let items = this.dynComponent.getSelectedItems() as ISspFieldJoinGridData[];\n if (!items || items?.length === 0) {\n items = this.dynComponent.items as ISspFieldJoinGridData[];\n }\n if (items?.length === 0) {\n this.statisticStore.setStatisticData<IChartSet<IBarLineAreaChartData>>(\n [], ApStatsType.GenericBars, '', emptyMessage\n );\n return;\n }\n const allItemsSelected = items.length === this.dynComponent.items?.length;\n const chartSets: IChartSet<IBarLineAreaChartData>[] = [];\n // generate each diagram/chart\n chartSets.Add(this.generateLastSamplingStat(items, allItemsSelected));\n chartSets.Add(this.generatePlannedSamplingStat(items, allItemsSelected));\n\n // calculate min/max of both charts\n for (const chartSet of chartSets) {\n chartSet.axes.minX = 0;\n chartSet.axes.maxX = Math.max(...chartSet.data.data.map(_ => _.value)) * 1.2;\n }\n const title = this._getTitleForStatistic(items);\n this.statisticStore.setStatisticData<IChartSet<IBarLineAreaChartData>>(\n chartSets, ApStatsType.GenericBars, title, emptyMessage\n );\n }\n\n private _getTitleForStatistic(selectedItems: ISspFieldJoinGridData[]): string {\n const totalItems = this.dynComponent.items as ISspFieldJoinGridData[];\n const dataForTitles = totalItems.map(x => ({\n AreaHa: x.Area,\n Selected: selectedItems.some(z => z.Id === x.Id)\n }));\n return this.statisticService.generateFieldsAreaTitle(dataForTitles);\n }\n\n /**\n * Generates bar chart configuration for last sampling date per year\n * @param items the selected items\n * @param allItemsSelected indicates if user selected all(or none) items in grid\n * @private\n */\n private generateLastSamplingStat(items: ISspFieldJoinGridData[], allItemsSelected: boolean): IChartSet<IBarLineAreaChartData> {\n const chartLastSampling: IChartSet<IBarLineAreaChartData> = {\n axes: {titleX: 'Global__Area'},\n data: {\n data: [], categories: [],\n title: `${this.translationService.translate('Global__Area')} / ${this.translationService.translate('Nutrients_Ips_Pages__LastBu')}`\n },\n noteField: 'note'\n } as IChartSet<IBarLineAreaChartData>;\n // sort items asc by last sampling date:\n items = items.sort((a, b) => ApSoilSamplePlanningOverviewComponent.compareDates(a.LastSamplingDate, b.LastSamplingDate));\n for (const soilSampleItem of items) {\n // build categories by sampling year\n const buYear = `${soilSampleItem.LastSamplingDate?.getFullYear() ?? '-'}`;\n const barData = chartLastSampling.data?.data.Find(_ => _.category === buYear);\n if (!barData) {\n chartLastSampling.data.data.Add({\n category: buYear,\n value: soilSampleItem.Area,\n color: ApSoilSamplePlanningOverviewComponent.getStatBarColor(soilSampleItem, soilSampleItem.LastSamplingDate),\n } as IBarLineAreaChartDataValue);\n chartLastSampling.data.categories.AddIfNotExists(buYear);\n } else {\n barData.value = barData.value + soilSampleItem.Area;\n }\n }\n // calculate chart note texts\n // this needs to be done as part of the post-processing\n // when rounding the note's value it might lead to inconsistent results\n // e.g. instead of 100% the sum of all % values might be 101% or 99%\n // Here we adjust the values, so it matches the expectations\n this.calculateNoteTexts(chartLastSampling, allItemsSelected);\n return chartLastSampling;\n }\n\n /**\n * Generates bar chart configuration for planned sampling date per month and year\n * @param selectedItems the selected items\n * @param allItemsSelected indicates if user selected all(or none) items in grid\n * @private\n */\n private generatePlannedSamplingStat(selectedItems: ISspFieldJoinGridData[], allItemsSelected: boolean): IChartSet<IBarLineAreaChartData> {\n // Build chart for planned samplings by date\n const chartPlannedSampling: IChartSet<IBarLineAreaChartData> = {\n axes: {titleX: 'Global__Area'},\n data: {\n data: [], categories: [],\n title: `${this.translationService.translate('Global__Area')} / ${this.translationService.translate('Nutrients_Ips_Pages__NextSample')}`\n },\n noteField: 'note'\n } as IChartSet<IBarLineAreaChartData>;\n // sort items by planned sampling date asc\n selectedItems = selectedItems.sort((a, b) => ApSoilSamplePlanningOverviewComponent.compareDates(a.PlannedSamplingDate, b.PlannedSamplingDate));\n for (const soilSampleItem of selectedItems) {\n // build categories by planned sampling month + year\n // in case of samplings with different status for one planned sampling date\n // a second bar will be displayed with the corresponding color\n const plannedMonthYear = `${soilSampleItem.PlannedSamplingDate ? moment(soilSampleItem.PlannedSamplingDate).format('MM/YYYY') : '-'}`;\n const barColor = '#2c3237';\n const barData = chartPlannedSampling.data?.data.Find(_ => _.category === plannedMonthYear && _.color === barColor);\n if (!barData) {\n chartPlannedSampling.data.data.Add({\n category: plannedMonthYear,\n value: soilSampleItem.Area,\n color: barColor,\n } as IBarLineAreaChartDataValue);\n chartPlannedSampling.data.categories.AddIfNotExists(plannedMonthYear);\n } else {\n barData.value = barData.value + soilSampleItem.Area;\n }\n }\n // calculate chart note texts\n // this needs to be done as part of the post-processing\n // when rounding the note's value it might lead to inconsistent results\n // e.g. instead of 100% the sum of all % values might be 101% or 99%\n // Here we adjust the values, so it matches the expectations\n this.calculateNoteTexts(chartPlannedSampling, allItemsSelected);\n return chartPlannedSampling;\n }\n\n /**\n * Generates the bar chart note shown on top of each bar\n * @param chart the generated chart set\n * @param allItemsSelected indicates if user selected all(or none) items in grid => only then an adjustment of percentages is need.\n * @private\n */\n private calculateNoteTexts(chart: IChartSet<IBarLineAreaChartData>, allItemsSelected: boolean): void {\n if (chart?.data?.data?.length <= 0) {\n return;\n }\n\n let percentSum = 0;\n let areaSum = 0;\n let biggestValueIdx = 0;\n let biggestArea = 0;\n // we are going to adjust the element with the biggest value\n for (let i = 0; i < chart.data.data.length; i++) {\n const area = this.roundNumericService.roundAsNumber(chart.data.data[i].value, 0);\n const percent = this.roundNumericService.roundAsNumber(area / this._areaTotal * 100, 0);\n if (area > biggestArea) {\n biggestArea = area;\n biggestValueIdx = i;\n }\n percentSum += percent;\n areaSum += area;\n chart.data.data[i].note = this.createNote(percent, area);\n }\n\n // the adjustment of % only makes sense if all items in the grid are selected.\n // otherwise the percentage will be raised to 100% even if only 1 row is selected in grid\n if (!allItemsSelected) {\n return;\n }\n // Adjust the biggest value that total sum matches 100% and the selected area\n chart.data.data[biggestValueIdx].note = this.createNote(\n this.roundNumericService.roundAsNumber(biggestArea / this._areaTotal * 100, 0) + 100 - percentSum,\n biggestArea);\n }\n\n /**\n * Creates the actual note text containing percentage and area values\n * @param percentage the percentage value of the bar\n * @param area the area value of the bar\n * @private\n */\n private createNote(percentage: number, area: number): string {\n return `${(area < 1 ? '<1' : area)} ${this.translationService.translate('Global__Area')}\\n` +\n `(${(percentage < 1 ? '<1' : percentage)} %)`;\n }\n}\n","import {ApDynGridPagerConfig, IDynGridWizardChoiceData} from '../../../ap-dyngrids/config/ap-dyn-grid-pager-config';\nimport {ApGridPagerType} from '../../../ap-interface';\nimport {Icon} from '../../../ap-interface/enums/layout/icon.enum';\nimport {EventEmitter} from '@angular/core';\n\nexport class PagerBuilder {\n static NutrientManagementPager(options: { text: string, callback: EventEmitter<any> }[], icons: {\n icon: Icon,\n callback: EventEmitter<any>,\n tooltip: string\n }[]): ApDynGridPagerConfig {\n return new ApDynGridPagerConfig({\n preselect: false,\n listMassEditing: options.map((option, index) =>\n ({\n id: index,\n name: option.text,\n type: ApGridPagerType.None,\n onSubmit: option.callback,\n } as IDynGridWizardChoiceData)),\n iconButtons: icons.map((icon) =>\n ({\n icon: icon.icon,\n callback: icon.callback,\n tooltip: icon.tooltip\n }),\n )\n });\n }\n}\n","import {AfterContentInit, Component, EventEmitter, OnDestroy, OnInit, ViewChild} from '@angular/core';\nimport {\n ApDynComponentComponent\n} from '../../ap-dyncomponent/ap-dyncomponent.component';\nimport {\n ApDynGridColumnConfigBase,\n ApDynGridColumnHideConfig\n} from '../../ap-dyngrids/config/ap-dyn-grid-column-config-base';\nimport {\n ApDynGridEditColumnConfig\n} from '../../ap-dyngrids/config/ap-dyn-grid-edit-column-config';\nimport {\n ApDynGridPropertyColumnConfig,\n FilterType\n} from '../../ap-dyngrids/config/ap-dyn-grid-property-column-config';\nimport {\n ApDynGridGroupColumnConfig\n} from '../../ap-dyngrids/config/ap-dyn-grid-group-column-config';\nimport {\n BehaviorSubject,\n combineLatest,\n Observable,\n Subscription\n} from 'rxjs';\nimport {\n debounceTime,\n delay,\n filter,\n map,\n skip\n} from 'rxjs/operators';\nimport {\n CampaignYearStore\n} from '../../stores/login/campaignyear.store';\nimport {\n SettingsStore\n} from '../../stores/base-data/settings.store';\nimport {\n ApDynGridStatusColumnConfig\n} from '../../ap-dyngrids/config/ap-dyn-grid-status-column-config';\nimport {\n LanguageStore\n} from '../../stores/translation/language.store';\nimport {\n ApDynGridDetailsGridConfig\n} from '../../ap-dyngrids/config/details/ap-dyn-grid-details-grid-config';\nimport {\n MapViewStore\n} from '../../stores/layout/mapview.store';\nimport {\n ApElementOxydTypeEnum,\n ApStatsType,\n MapViewCurrentMenu,\n MapViewMode\n} from '../../ap-interface';\nimport {\n ApNutrientPlanningComponent\n} from '../../entry-components/ap-nutrients-management-entry-components/ap-nutrient-planning.component';\nimport {\n FormStore\n} from '../../stores/layout/form.store';\nimport {\n ApDynGridPagerConfig\n} from '../../ap-dyngrids/config/ap-dyn-grid-pager-config';\nimport {\n FieldStore\n} from '../../stores/farm/field.store';\nimport {\n SoilSampleDateStore\n} from '../../stores/nutrients/soilsampledate.store';\nimport {\n CropRotationStore,\n CropRotationYield\n} from '../../stores/farm/crop.rotation.store';\nimport {\n ApTranslationService\n} from '../../ap-utils/service/ap-translation.service';\nimport {\n GetRoundNumericPipe\n} from '../../ap-utils';\nimport {\n JobsStore\n} from '../../stores/administration/jobs.store';\nimport {\n GetPermissionPipe\n} from '../../ap-permission/pipes/get-permission.pipe';\nimport {\n LoginStore\n} from '../../stores/login/login.store';\nimport {\n RbStore\n} from '../../stores/nutrients/rb.store';\nimport {\n BasicFertilisationSummariesStore\n} from '../../stores/taskmanagement/basic.fertilisation.summaries.store';\nimport {\n FertilizerStore\n} from '../../stores/base-data/fertilizer.store';\nimport {\n ApNutrientStatisticService\n} from '../service/ap-nutrient-statistic.service';\nimport {\n ModalDialogStore\n} from '../../stores/dialog/modal.dialog.store';\nimport {\n IModalDialogData\n} from '../../ap-interface/interfaces/ap-modaldialog-data.interface';\nimport {\n ApDynformsConfigFieldset\n} from '../../ap-dynforms/config/ap-dynforms-config-fieldset';\nimport {\n ApDynformsConfigTextarea\n} from '../../ap-dynforms/config/ap-dynforms-config-textarea';\nimport {\n ApDateService\n} from '../../ap-core/services/ap-date-service';\nimport {\n PagerBuilder\n} from './configs/pager-builder';\nimport {\n ApUtilService\n} from '../../ap-utils/service/ap-util.service';\nimport {\n Icon\n} from '../../ap-interface/enums/layout/icon.enum';\nimport {\n GetElementService\n} from '../../ap-utils/service/ap-get-element.service';\nimport {\n ApPermissions\n} from 'invoker-transport';\nimport {\n StatisticStore\n} from '../../stores/statistic/statistic.store';\nimport {\n TranslationStore\n} from '../../stores/translation/translation.store';\nimport {\n APP_CONFIGURATION\n} from '../../ap-core/config';\nimport {\n ApOperationMode\n} from '../../ap-interface/enums/ap-operation-mode.enum';\nimport {\n NutrientStore\n} from '../../stores/nutrients/nutrient.store';\nimport {\n ApElementType\n} from '../../ap-interface/enums/ap-elements-type.enum';\nimport {\n ApNutrientService\n} from '../../ap-utils/service/ap-nutrient.service';\nimport {\n ApRoleTypeService\n} from '../../services/common/ap-role-type.service';\nimport {\n FertilizerService\n} from '../../services/data/fertilizer.service';\nimport {\n ApTooltipContentService\n} from '../../ap-utils/service/ap-tooltip-content.service';\nimport {\n BaseFertilizationService\n} from '../../services/data/base-fertilization.service';\nimport {\n BaseFertilizationCommonService\n} from '../service/base-fertilization-common.service';\nimport {\n INutrientOverviewApplGridData,\n INutrientOverviewGridData,\n INutrientOverviewRemainGridData,\n LimitsType\n} from '../types/base-fertilization-overview.types';\nimport {\n PlanningEntryComponentDataType\n} from '../../entry-components/ap-nutrients-management-entry-components/ap-nutrient-planning-configs/nutrient-planning-types';\nimport {\n StatisticService\n} from '../../services/data/statistic.service';\nimport {\n FieldNutrientDistributionStore\n} from '../../stores/nutrients/field-nutrient-distributions.store';\nimport {\n CropTypeStore\n} from '../../stores/base-data/crop.types.store';\nimport {\n GetRoundNumericService\n} from '../../ap-utils/service/get-round-numeric.service';\nimport {\n MapStore\n} from '../../stores/map/map.store';\nimport {\n GetRoundNumericPipeConfig\n} from '../../ap-utils/pipes/configs/get-round-numeric.pipe.config';\nimport IGuid = System.IGuid;\nimport IField = Data.FieldManagement.IField;\nimport ICampaignYear = Data.Authentication.ICampaignYear;\nimport IBasicFertilisationSummaries = Data.TaskManagement.IBasicFertilisationSummaries;\n\n@Component({\n selector: 'ap-nutrient-management-overview',\n template: `\n <ap-dyncomponent [caption]=\"'Admin_Pages__Overview'\"\n [canSearch]=\"true\"\n [headerIcon]=\"'ap-icon-base-fertilization'\"\n [loading$]=\"loading$\"\n [columns]=\"columns$ | async\"\n [items]=\"items$ | async\"\n [details]=\"details$ | async\"\n [pager]=\"pager\"\n [canCreate]=\"isCreateNewAllowed()\"\n (create)=\"onCreate()\">\n </ap-dyncomponent>\n `,\n styles: []\n})\nexport class ApNutrientManagementOverviewComponent implements OnInit, AfterContentInit, OnDestroy {\n @ViewChild(ApDynComponentComponent, {static: true}) dynComponent: ApDynComponentComponent;\n public columns$: Observable<ApDynGridColumnConfigBase[]>;\n public details$: Observable<ApDynGridDetailsGridConfig>;\n public loading$: Observable<boolean>;\n public items$: Observable<INutrientOverviewGridData[]>;\n public pager: ApDynGridPagerConfig;\n public ApPermissions = ApPermissions;\n\n private _cropRotationLimits$: BehaviorSubject<LimitsType>;\n private _year$ = new BehaviorSubject<number>(undefined);\n private _previousYear = new EventEmitter<void>();\n private _nextYear = new EventEmitter<void>();\n private _onCheckFieldEvent = new EventEmitter<any>();\n private _onNavigateToReportEvent = new EventEmitter<any>();\n private _subscriptions: Subscription[] = [];\n private _defaultRemain: INutrientOverviewRemainGridData;\n private _isOnCreatePressed = false;\n private _statusCss = [\n 'ap-status-red',\n 'ap-status-yellow',\n 'ap-status-green',\n 'ap-status-grey',\n ];\n\n constructor(private campaignYearStore: CampaignYearStore,\n private cropRotationStore: CropRotationStore,\n private cropTypeStore: CropTypeStore,\n private fieldStore: FieldStore,\n private formStore: FormStore,\n private languageStore: LanguageStore,\n private mapViewStore: MapViewStore,\n private roundNumericPipe: GetRoundNumericPipe,\n private settingsStore: SettingsStore,\n private soilSampleDateStore: SoilSampleDateStore,\n private translationService: ApTranslationService,\n private jobsStore: JobsStore,\n private permissionPipe: GetPermissionPipe,\n private loginStore: LoginStore,\n private rbStore: RbStore,\n private fieldNutrientDistributionStore: FieldNutrientDistributionStore,\n private basicFertilisationSummariesStore: BasicFertilisationSummariesStore,\n private fertilizerStore: FertilizerStore,\n private nutrientStatisticService: ApNutrientStatisticService,\n private statisticService: StatisticService,\n private modalDialogStore: ModalDialogStore,\n private dateService: ApDateService,\n private mapStore: MapStore,\n private elementService: GetElementService,\n private statisticStore: StatisticStore,\n private translationStore: TranslationStore,\n private nutrientStore: NutrientStore,\n private nutrientService: ApNutrientService,\n private fertilizerService: FertilizerService,\n private roundNumericService: GetRoundNumericService,\n private baseFertilizationService: BaseFertilizationService,\n private tooltipContentService: ApTooltipContentService,\n private baseFertilizationCommonService: BaseFertilizationCommonService) {\n }\n\n public ngOnInit(): void {\n this.fieldStore.changeSelectedField([]);\n this.statisticStore.removeStatisticData();\n const campaignYear = this.campaignYearStore.getSelectedCampaignYear();\n this._defaultRemain = {P: null, K: null, Mg: null, CaO: null, N: null};\n this._cropRotationLimits$ = new BehaviorSubject<LimitsType>({\n Min: campaignYear.Year,\n Max: campaignYear.Year\n });\n this._year$.next(campaignYear.Year);\n this.loading$ = combineLatest([\n this.fieldStore.Listen(s => s.loading),\n this.soilSampleDateStore.Listen(s => s.loading),\n this.cropRotationStore.Listen(s => s.historyLoading),\n this.basicFertilisationSummariesStore.Listen(s => s.loading),\n this.rbStore.Listen(s => s.loading)\n ]).pipe(\n map(([f, s, cr, bfs, rb]) => f || s || cr || bfs || rb)\n );\n this.items$ = this._getItems();\n this.pager = this._getPager();\n this.columns$ = this._getBaseGrid();\n this.details$ = this._getDetailsGrid();\n }\n\n public ngAfterContentInit(): void {\n this._subscriptions.push(this.dynComponent.SelectedItems$.pipe(\n debounceTime(100),\n delay(1)\n ).subscribe(d => this._selectionChange(d)));\n this._subscriptions.push(this._onCheckFieldEvent.subscribe(e => {\n this._onCheckField(e.Geom.Id);\n }));\n this._subscriptions.push(this._onNavigateToReportEvent.subscribe(e => this._onNavigateToReport({\n fieldGeomId: e.Geom.Id,\n year: this.campaignYearStore.SelectedCampaignYear.Year,\n })));\n this._subscriptions.push(\n this.campaignYearStore.Listen(s => s.selectedYear).pipe(skip(1)).subscribe((y) => this._onSelectedYearChanged(y))\n );\n this._subscriptions.push(\n this.rbStore.Listen(s => s.checkResult).subscribe(checkResult => this._handleRbStoreCheckResult(checkResult))\n );\n this._subscriptions.push(\n this.fieldStore.Listen(s => s.data).subscribe(fields => this._handleFieldStoreData(fields))\n );\n this._subscriptions.push(\n this._previousYear.subscribe(() => this._year$.next(this._year$.value - 1))\n );\n this._subscriptions.push(\n this._nextYear.subscribe(() => this._year$.next(this._year$.value + 1))\n );\n this._subscriptions.push(\n this.mapViewStore.Listen(s => s.currentMenu).subscribe(mapMenu => this._onMapMenuChanged(mapMenu))\n );\n this._subscriptions.push(\n combineLatest([\n this.cropRotationStore.Listen(s => s.history).pipe(\n map((history) => Object.values(history)),\n filter((crops) => crops.length !== 0),\n map((crops) => crops.map((crop) => Object.keys(crop).filter((key) => crop[key] !== null).map((key) => +key))),\n map((years) => years.reduce((a, b) => a.concat(b)))),\n this.campaignYearStore.Listen(s => s.selectedYear)\n ]).pipe(\n map(([dates, campaignYear]): LimitsType => ({\n Min: Math.min(...dates, campaignYear.Year),\n Max: Math.max(...dates, campaignYear.Year)\n }))).subscribe(l => this._cropRotationLimits$.next(l))\n );\n this._subscriptions.push(this.formStore.FormClose$.subscribe(() => {\n // trigger refresh of selection and map after entryComponent (e.g. 'NEW') closed\n if (this._isOnCreatePressed) {\n this._isOnCreatePressed = false;\n this._handleLegendsAndLayers();\n }\n }));\n this._subscriptions.push(this.mapStore.Layers.OnLayerChange.subscribe(() => {\n this._handleLegendsAndLayers();\n }));\n this._handleLegendsAndLayers();\n }\n\n public ngOnDestroy(): void {\n this.baseFertilizationCommonService.revertLegends();\n this._subscriptions.forEach(s => s?.unsubscribe());\n this.statisticStore.removeStatisticData();\n this.fieldStore.changeSelectedField([]);\n }\n\n public onCreate(): void {\n this.statisticStore.removeStatisticData();\n this.formStore.openForm({\n component: ApNutrientPlanningComponent,\n data: {\n Summary: null,\n Type: PlanningEntryComponentDataType.Create\n }\n });\n this._isOnCreatePressed = true;\n }\n\n public isCreateNewAllowed(): boolean {\n return ApRoleTypeService.hasDeveloperRole(this.loginStore.User);\n }\n\n private _getItems(): Observable<INutrientOverviewGridData[]> {\n return combineLatest([\n this.fieldStore.Listen(s => s.data),\n this.soilSampleDateStore.Listen(s => s.dates),\n this.fieldNutrientDistributionStore.SampleRegions$,\n this.cropRotationStore.Listen(s => s.history),\n this.rbStore.Listen(s => s.rb),\n this.basicFertilisationSummariesStore.Summaries$,\n this.jobsStore.BlockedFieldIdsBuWsvCeIrRbFieldRaster$,\n this.cropRotationStore.Listen(s => s.cropRotationAttributes),\n this.loading$\n ]).pipe(\n filter(([fields, , , cropRotation, rb, , _, _1, loading]) =>\n fields.length !== 0 && Object.keys(cropRotation).length !== 0 && !!rb && !loading),\n map(([fields, soilSampleDates, sampleRegions, cropRotation, rb, bFS, jobFieldGeomIds, cropRotationAttributes]) => fields.map<INutrientOverviewGridData>((field) => {\n const geom = this.fieldStore.getCurrentFieldGeom(field);\n const cropRotationAttribute = cropRotationAttributes.find(x => x?.FieldGeomId === geom?.Id);\n const area = geom != null && geom.AdminArea > 0 ? geom.AdminArea / 10000 : '-';\n const rbResult = rb.FirstOrDefault(x => x.FieldGeomId === geom?.Id);\n const hasRbRaster = cropRotationAttribute && cropRotationAttribute.HasRbRaster;\n const apps = bFS.filter(_ => !(hasRbRaster && (!rbResult?.PlanIds || rbResult.PlanIds.length <= 0)))\n .filter(summary => summary.BasicFertilisationPlanBooks.Find(x =>\n (rbResult?.PlanIds != null && rbResult.PlanIds.length > 0)\n ? rbResult.PlanIds.includes(x.Id)\n : x.FieldId === field?.Id))\n .map(summary => summary);\n const sampleDateObject = Object.keys(soilSampleDates).length > 0 ? soilSampleDates[field.Id as string] : undefined;\n const status = this.nutrientService.getGDStatusByCrAttribute(sampleDateObject, sampleRegions, cropRotationAttribute);\n let applications: INutrientOverviewApplGridData[] = [];\n if (!!apps || apps !== null) {\n applications = [];\n apps.forEach((summary: IBasicFertilisationSummaries) => {\n const planBook = summary.BasicFertilisationPlanBooks.Find(\n x => (rbResult?.PlanIds != null && rbResult.PlanIds.length > 0)\n ? rbResult.PlanIds.includes(x.Id)\n : x.FieldId === field?.Id);\n const fertilizer = this.fertilizerStore.getFertilizer(planBook.Product_Id);\n const unit = summary.User_Appl_Unit?.Id === 1\n ? this.fertilizerService.getFertilizerUnit(fertilizer, true)\n : this.translationService.translate(summary.User_Appl_Unit?.Key);\n const isBooked = planBook?.BookedAt !== null;\n applications.Add({\n Id: planBook.Id,\n Status: planBook.Status,\n StatusClass: this.nutrientService.getFertilizerStatus(summary.User_Appl_Mode, isBooked)?.class,\n StatusDesc: this.nutrientService.getFertilizerStatusDescription(summary.User_Appl_Mode, isBooked),\n IsBooked: isBooked,\n Product: this.fertilizerService.getFertilizerProductName(fertilizer),\n ProductId: planBook.Product_Id,\n ProductUnit: this.fertilizerService.getFertilizerUnit(fertilizer, false),\n ProductTooltip: this.tooltipContentService.getProductContentInfoTooltip(planBook.Product_Id),\n Amount: summary.User_Appl_Rate,\n AmountUnit: unit,\n AmountValue: summary.User_Appl_Rate,\n LeadNutrient: planBook.Element?.Id as ApElementType,\n OutputDate: new Date(planBook.ApplicationDate),\n Nutrient: planBook.Operation_Mode?.Id === ApOperationMode.Const ? '-' : this.elementService.GetElementStringByIElement(planBook.Element),\n Name: summary.Title,\n PlanNumber: summary.PlanNumber,\n CreatedAt: new Date(planBook.CreatedAt),\n Remain2: {\n P: this.elementService.CalculateElementOxidValueByGivenElementValue(this.nutrientStatisticService.getAverageNutrientFromStatistic(0, planBook.Statistic), ApElementOxydTypeEnum.P),\n K: this.elementService.CalculateElementOxidValueByGivenElementValue(this.nutrientStatisticService.getAverageNutrientFromStatistic(1, planBook.Statistic), ApElementOxydTypeEnum.K),\n Mg: this.elementService.CalculateElementOxidValueByGivenElementValue(this.nutrientStatisticService.getAverageNutrientFromStatistic(2, planBook.Statistic), ApElementOxydTypeEnum.Mg),\n CaO: this.nutrientStatisticService.getAverageNutrientFromStatistic(3, planBook.Statistic),\n N: this.baseFertilizationService.calculateNElementByLeadElement(planBook.Product_Id, planBook.Statistic)?.Average ?? ''\n },\n Field: field,\n Area: (planBook.Area ?? 0) / 10000,\n SourceItem: summary\n });\n });\n }\n return {\n Id: field.Id,\n Status: status[0],\n StatusClass: this._statusCss[status[0] + 1],\n StatusDesc: status[1],\n Geom: geom,\n Nr: field.FieldNumber,\n TNr: field.FieldSubnumber,\n NrTNr: this.fieldStore.getFieldNumberAndSubNumber(field),\n Name: field.FieldName,\n Area: area === '-' ? undefined : area,\n AreaOriginal: area === '-' ? undefined : area.toString(10),\n SampleDate: !!sampleDateObject?.Date ? this.dateService.getDateMidnight(sampleDateObject.Date) : undefined,\n ColumnLoading: Object.keys(soilSampleDates).length > 0 && (rb.length === 0 || jobFieldGeomIds.Contains(field.Id.toString())),\n Remain1: status[0] === 1 ? { /* Bei keinem definierten Fruchtfolgebedarf, darf auch kein RB angezeigt werden*/\n P: this.elementService.CalculateElementOxidValueByGivenElementValue(this.nutrientStatisticService.getAverageRb(0, rbResult), ApElementOxydTypeEnum.P),\n K: this.elementService.CalculateElementOxidValueByGivenElementValue(this.nutrientStatisticService.getAverageRb(1, rbResult), ApElementOxydTypeEnum.K),\n Mg: this.elementService.CalculateElementOxidValueByGivenElementValue(this.nutrientStatisticService.getAverageRb(2, rbResult), ApElementOxydTypeEnum.Mg),\n CaO: this.nutrientStatisticService.getAverageRb(3, rbResult),\n N: 0\n } : this._defaultRemain,\n Remain2: status[0] === 1 ? {\n P: this.elementService.CalculateElementOxidValueByGivenElementValue(this.nutrientStatisticService.getAverageRb(4, rbResult), ApElementOxydTypeEnum.P),\n K: this.elementService.CalculateElementOxidValueByGivenElementValue(this.nutrientStatisticService.getAverageRb(5, rbResult), ApElementOxydTypeEnum.K),\n Mg: this.elementService.CalculateElementOxidValueByGivenElementValue(this.nutrientStatisticService.getAverageRb(6, rbResult), ApElementOxydTypeEnum.Mg),\n CaO: this.nutrientStatisticService.getAverageRb(7, rbResult),\n N: 0\n } : this._defaultRemain,\n Crop: cropRotation[field.Id as string],\n CrNeeds: cropRotationAttribute?.CropRotationNeed,\n Applications: applications,\n SourceItem: field,\n } as INutrientOverviewGridData;\n }))\n );\n }\n\n private _getPager(): ApDynGridPagerConfig {\n const iconOptions = [\n {\n icon: Icon.PDF,\n callback: ApUtilService.createEventEmitter(this._onPdf.bind(this), this._subscriptions),\n tooltip: 'Global__Save_PDF'\n },\n {\n icon: Icon.XLS,\n callback: ApUtilService.createEventEmitter(this._onXls.bind(this), this._subscriptions),\n tooltip: 'Global__Save_EXCEL'\n }\n ];\n return PagerBuilder.NutrientManagementPager([], iconOptions);\n }\n\n private _getDetailsGrid(): Observable<ApDynGridDetailsGridConfig> {\n const detailsGridPopupOptions = new ApDynGridEditColumnConfig({\n data: [\n {\n text: 'Global__Show',\n callback: ApUtilService.createEventEmitter(this._onShow.bind(this), this._subscriptions)\n },\n {\n text: 'Global__Export',\n callback: ApUtilService.createEventEmitter(this._onExport.bind(this), this._subscriptions)\n },\n {\n text: 'Admin_Pages_Popups__Book',\n callback: ApUtilService.createEventEmitter(this._onBooking.bind(this), this._subscriptions),\n disabled: (dataItem: INutrientOverviewApplGridData) => dataItem.IsBooked\n },\n {\n text: 'Global__Planing_Reset',\n callback: ApUtilService.createEventEmitter(this._onUnbookBookedPlan.bind(this), this._subscriptions),\n disabled: (dataItem: INutrientOverviewApplGridData) => !dataItem.IsBooked\n },\n {\n text: 'Global__Delete',\n callback: ApUtilService.createEventEmitter(this._onOneDelete.bind(this), this._subscriptions),\n disabled: (dataItem: INutrientOverviewApplGridData) => dataItem.IsBooked\n },\n ]\n });\n if (ApRoleTypeService.hasAgriconRole(this.loginStore.User)) {\n detailsGridPopupOptions.data.push({\n text: 'Global__Download',\n callback: ApUtilService.createEventEmitter(this._onDownloadPackage.bind(this), this._subscriptions)\n });\n }\n return combineLatest([\n this.languageStore.Listen(s => s.selectedLanguage),\n this.settingsStore.Listen(s => s.data),\n ]).pipe(\n map(([language, settings]) => ({language, setting: settings[0]})),\n filter((p) => !!p.language && !!p.setting),\n map((p) =>\n new ApDynGridDetailsGridConfig({\n field: 'Applications',\n checkboxDisabled: true,\n hide: (dataItem) => dataItem.Applications.length === 0,\n columns: [\n new ApDynGridStatusColumnConfig({\n field: 'Status',\n class: 'StatusClass',\n description: 'StatusDesc'\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Global__Product',\n field: 'Product',\n cssClass: 'left',\n width: 100,\n tooltip: (dataItem) => dataItem['ProductTooltip'],\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Nutrients__FertilizationDate',\n field: 'OutputDate',\n format: p.language.DateFormat,\n tooltip: (dataItem) => `${this.translationStore.FindTranslationForSelectedLanguage('Global__Task')}\n ${this.translationStore.FindTranslationForSelectedLanguage('Docu_Ini__Number')}:\n ${dataItem?.PlanNumber}`,\n width: 80\n }),\n new ApDynGridPropertyColumnConfig({\n title: `${this.translationService.translate('Nutrients__Average_Amount_Goods')} / ${this.translationService.translate('Global__Remaining_Need_Two_Short')}`,\n field: 'Amount',\n hide: false,\n width: 60,\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n pipes: [\n {\n pipe: this.roundNumericPipe,\n args: [0]\n }\n ]\n }),\n new ApDynGridPropertyColumnConfig({\n title: '',\n field: 'AmountUnit',\n width: 40,\n hide: false,\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'AgriConnect__Nutrient',\n field: 'Nutrient',\n hide: true,\n width: 60\n }),\n new ApDynGridPropertyColumnConfig({\n title: this.elementService.GetElementStringByString(ApElementType.P),\n cssClass: 'right', filterType: FilterType.NUMBER,\n field: 'Remain2.P',\n width: 60,\n pipes: [\n {\n pipe: this.roundNumericPipe,\n args: [\n 0,\n ]\n }\n ]\n }),\n new ApDynGridPropertyColumnConfig({\n title: this.elementService.GetElementStringByString(ApElementType.K),\n cssClass: 'right', filterType: FilterType.NUMBER,\n field: 'Remain2.K',\n width: 60,\n pipes: [\n {\n pipe: this.roundNumericPipe,\n args: [\n 0,\n ]\n }\n ]\n }),\n new ApDynGridPropertyColumnConfig({\n title: this.elementService.GetElementStringByString(ApElementType.Mg),\n cssClass: 'right', filterType: FilterType.NUMBER,\n field: 'Remain2.Mg',\n width: 60,\n pipes: [\n {\n pipe: this.roundNumericPipe,\n args: [\n 0,\n ]\n }\n ]\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Global__NutrientCaO',\n field: 'Remain2.CaO',\n cssClass: 'right', filterType: FilterType.NUMBER,\n width: 60,\n pipes: [\n {\n pipe: this.roundNumericPipe,\n args: [\n 0,\n ]\n }\n ]\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Global__NutrientN',\n field: 'Remain2.N',\n cssClass: 'right', filterType: FilterType.NUMBER,\n width: 60,\n hide: true,\n pipes: [\n {\n pipe: this.roundNumericPipe,\n args: [\n 0,\n ]\n }\n ]\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Global__Note',\n field: 'Name',\n hide: true,\n cssClass: 'left',\n width: 100\n }),\n detailsGridPopupOptions\n ]\n }))\n );\n }\n\n private _getBaseGrid(): Observable<ApDynGridColumnConfigBase[]> {\n return combineLatest([\n this._cropRotationLimits$,\n this.languageStore.Listen(s => s.selectedLanguage),\n this.settingsStore.Listen(s => s.data),\n this.permissionPipe.transform(ApPermissions.EDIT_FIELDS),\n this.loginStore.User$,\n ]).pipe(\n filter(([limits, language, settings, permission, user]) => !!limits && !!language && !!settings[0] && !!permission && !!user),\n map(([limits, language, settings, permission, user]) => ({\n limits,\n language,\n setting: settings[0],\n permission,\n user\n })),\n map((p) => [\n new ApDynGridStatusColumnConfig({\n field: 'Status',\n class: 'StatusClass',\n description: 'StatusDesc',\n pending: this.jobsStore.BlockedFieldIdsBuWsvCeIrRbFieldRaster$,\n pendingTooltip: this.jobsStore.BlockedFieldIdsBuWsvCeIrRbFieldRasterTooltip$,\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Docu_Ini__Number',\n field: 'Nr',\n width: 60,\n hide: true,\n headerFilterable: true,\n filterType: FilterType.NUMBER,\n cssClass: 'right',\n filterable: true\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Docu_Ini_Subnumber',\n field: 'TNr',\n width: 60,\n hide: true,\n filterType: FilterType.NUMBER,\n cssClass: 'right',\n filterable: true\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Docu_Ini__Number',\n field: 'NrTNr',\n width: 75,\n filterable: true,\n headerFilterable: true,\n hide: new ApDynGridColumnHideConfig({\n mapHide: false,\n selfHide: this.mapViewStore.Listen(s => s.mode).pipe(map((m) => m !== MapViewMode.NORMAL)),\n })\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Docu_Ini__Name',\n field: 'Name',\n headerFilterable: true,\n filterable: true,\n width: 180,\n cssClass: 'left',\n sortIndex: 0,\n sortDesc: false,\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Docu_Ini__Area',\n field: 'Area',\n hide: true,\n headerFilterable: true,\n tooltip: (dataItem) => dataItem['AreaOriginal'],\n filterType: FilterType.NUMBER,\n width: 60,\n cssClass: 'right',\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [p.setting.DigitsAfterDecimalPoint]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Global__SampleDate_Short',\n field: 'SampleDate',\n format: p.language.DateFormat,\n hide: true,\n headerFilterable: true,\n filterable: true,\n filterType: FilterType.KENDO_DATE_RANGE,\n width: 80\n }),\n new ApDynGridGroupColumnConfig({\n title: 'Nutrients__Average_RemainingNeed_1_kg_ha',\n groupColumns: [\n new ApDynGridPropertyColumnConfig({\n title: this.elementService.GetElementStringByString(ApElementType.P),\n field: 'Remain1.P',\n width: 60,\n headerFilterable: true,\n columnLoading: 'ColumnLoading',\n cssClass: 'right', filterType: FilterType.NUMBER,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0, GetRoundNumericPipeConfig.NullToEmptyReplaceConfig]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n title: this.elementService.GetElementStringByString(ApElementType.K),\n field: 'Remain1.K',\n width: 60,\n headerFilterable: true,\n columnLoading: 'ColumnLoading',\n cssClass: 'right', filterType: FilterType.NUMBER,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0, GetRoundNumericPipeConfig.NullToEmptyReplaceConfig]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n title: this.elementService.GetElementStringByString(ApElementType.Mg),\n field: 'Remain1.Mg',\n width: 60,\n headerFilterable: true,\n columnLoading: 'ColumnLoading',\n cssClass: 'right', filterType: FilterType.NUMBER,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0, GetRoundNumericPipeConfig.NullToEmptyReplaceConfig]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Nutrients__CaO',\n field: 'Remain1.CaO',\n width: 60,\n headerFilterable: true,\n columnLoading: 'ColumnLoading',\n cssClass: 'right', filterType: FilterType.NUMBER,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0, GetRoundNumericPipeConfig.NullToEmptyReplaceConfig]\n }]\n })\n ],\n hide: true\n }),\n new ApDynGridGroupColumnConfig({\n title: 'Nutrients__Average_RemainingNeed_2_kg_ha',\n groupColumns: [\n new ApDynGridPropertyColumnConfig({\n title: this.elementService.GetElementStringByString(ApElementType.P),\n field: 'Remain2.P',\n width: 60,\n headerFilterable: true,\n columnLoading: 'ColumnLoading',\n cssClass: 'right', filterType: FilterType.NUMBER,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0, GetRoundNumericPipeConfig.NullToEmptyReplaceConfig]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n title: this.elementService.GetElementStringByString(ApElementType.K),\n field: 'Remain2.K',\n width: 60,\n headerFilterable: true,\n columnLoading: 'ColumnLoading',\n cssClass: 'right', filterType: FilterType.NUMBER,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0, GetRoundNumericPipeConfig.NullToEmptyReplaceConfig]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n title: this.elementService.GetElementStringByString(ApElementType.Mg),\n field: 'Remain2.Mg',\n width: 60,\n headerFilterable: true,\n columnLoading: 'ColumnLoading',\n cssClass: 'right', filterType: FilterType.NUMBER,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0, GetRoundNumericPipeConfig.NullToEmptyReplaceConfig]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Nutrients__CaO',\n field: 'Remain2.CaO',\n width: 60,\n headerFilterable: true,\n columnLoading: 'ColumnLoading',\n cssClass: 'right', filterType: FilterType.NUMBER,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0, GetRoundNumericPipeConfig.NullToEmptyReplaceConfig]\n }]\n })\n ],\n }),\n new ApDynGridGroupColumnConfig({\n title: 'Global__Crop',\n style: 'text-align:center',\n width: 100,\n headerButtons: {\n nextClicked: this._nextYear,\n nextDisabled: this._year$.pipe(map((y) => y >= p.limits.Max)),\n previousClicked: this._previousYear,\n previousDisabled: this._year$.pipe(map((y) => y <= p.limits.Min)),\n },\n groupColumns: this._getCropRotationConfigs(p.limits),\n hide: new ApDynGridColumnHideConfig({\n widthHidePriority: 1\n })\n }),\n new ApDynGridEditColumnConfig({\n data: (() => {\n const options = [];\n if (ApRoleTypeService.hasAgriconRole(p.user)) {\n options.Add({\n text: 'Global__Check_Data',\n callback: this._onCheckFieldEvent,\n });\n options.Add({\n text: 'Fertilisation__Report',\n callback: this._onNavigateToReportEvent,\n });\n }\n return options;\n })(),\n disabled: !p.permission,\n }\n )\n ])\n );\n }\n\n private _onShow(dataItem: INutrientOverviewApplGridData): void {\n this.baseFertilizationCommonService.redirectSummaryToShowView(dataItem.SourceItem.Id, dataItem.IsBooked,\n 'nutrients/overview', dataItem.Field.Id);\n }\n\n private _onExport(dataItem: INutrientOverviewApplGridData): void {\n this.baseFertilizationCommonService.redirectSummaryToExportView(dataItem.SourceItem.Id, dataItem.IsBooked,\n 'nutrients/overview', dataItem.Field.Id);\n }\n\n private _onBooking(dataItem: INutrientOverviewApplGridData): void {\n this.baseFertilizationCommonService.bookPlanBooks(dataItem.SourceItem, dataItem.Field.Id);\n }\n\n private _onUnbookBookedPlan(dataItem: INutrientOverviewApplGridData): void {\n this.baseFertilizationCommonService.unbookSummaryPlanBook(dataItem.SourceItem, dataItem.Id);\n }\n\n private _onOneDelete(dataItem: INutrientOverviewApplGridData): void {\n this.baseFertilizationCommonService.deleteSummaryPlanBook(dataItem.SourceItem, dataItem.Id);\n }\n\n private _onDownloadPackage(dataItem: INutrientOverviewApplGridData): void {\n this.nutrientStore.createNutrientPlanningPackage(dataItem.SourceItem.Id);\n }\n\n private _onMapMenuChanged(mapMenu: MapViewCurrentMenu): void {\n if (mapMenu === MapViewCurrentMenu.STATS) {\n this._generateStats();\n }\n }\n\n private _onSelectedYearChanged(campaignYear: ICampaignYear): void {\n if (campaignYear) {\n this.basicFertilisationSummariesStore.loadBasicFertilisationSummaries();\n this._year$.next(campaignYear.Year);\n }\n }\n\n private _handleRbStoreCheckResult(checkResult: string): void {\n if (checkResult == null || checkResult === '') {\n return;\n }\n const data = {\n buttons: [{\n key: 'apply',\n text: 'Global__Ok',\n primary: true,\n }],\n busy: false,\n show: true,\n title: this.translationService.translate('Global__Result_Check'),\n formConfig: {\n width: 500,\n fieldSets: [\n new ApDynformsConfigFieldset({\n key: 'result',\n legend: 'Global_IO_Values',\n columns: 1,\n useMaxWidth: true,\n config: [\n new ApDynformsConfigTextarea({\n key: 'Output',\n label: 'Global_Output',\n rows: 12,\n value: JSON.stringify(checkResult, null, 2)\n })\n ]\n })]\n }\n } as IModalDialogData;\n this.modalDialogStore.setModalDialogData(data);\n }\n\n private _handleFieldStoreData(fields: IField[]): void {\n if (fields == null) {\n return;\n }\n if (fields.length === 0) {\n return;\n }\n const tmp = [];\n for (const field of fields) {\n if (!field.FieldGeoms || !Array.isArray(field.FieldGeoms) || field.FieldGeoms.length < 1) {\n continue;\n }\n for (const geom of field.FieldGeoms.filter((g) => g?.Id != null)) {\n // this.rbStore.createRb(geom.Id);\n tmp.push(geom.Id);\n }\n }\n this.rbStore.loadRb(tmp);\n }\n\n private _selectionChange(items: any[]): void {\n if (items && items.length > 0) {\n const itemsId = items.map(item => item?.Id?.toString());\n this.fieldStore.changeSelectedField(itemsId);\n } else {\n this.fieldStore.changeSelectedField([]);\n this.fieldStore.zoomFarmFields();\n }\n this._handleLegendsAndLayers();\n this._generateStats();\n }\n\n private _handleLegendsAndLayers(): void {\n const disableLegends = [\n 'NutrientPlanningLegend',\n 'TaskMgmtLegend'\n ];\n let selectedItems = this.dynComponent?.getSelectedItems()?.length ?? 0;\n if (selectedItems <= 0) {\n // Adding total amount of items of grid because component logic works in next way:\n // If there is no data selected then we should use all data of grid for statistic, maps and legends\n selectedItems = this.dynComponent?.items?.length ?? 0;\n }\n this.baseFertilizationCommonService.handleLegends(selectedItems, disableLegends);\n const disableLayers = [this.mapStore.Layers.TaskManagementLayer?.name];\n this.baseFertilizationCommonService.handleLayers(disableLayers, []);\n }\n\n private _onNavigateToReport(event: { fieldGeomId: string, year: number }): void {\n window.open(`${APP_CONFIGURATION.MapFactory.Address}/reports/field/${event.fieldGeomId}/${event.year}?key=12345`, '_blank');\n }\n\n private _onCheckField(fieldGeomId: IGuid): void {\n this.rbStore.checkField(fieldGeomId);\n const data = {\n buttons: [\n {\n key: 'apply',\n text: 'Global__Ok',\n primary: true,\n }\n ],\n busy: true,\n show: true,\n title: this.translationService.translate('Global__Result_Check'),\n formConfig: null,\n } as IModalDialogData;\n this.modalDialogStore.setModalDialogData(data);\n }\n\n /**\n * build statistic tab if it is visible and selected\n * @private\n */\n private _generateStats(): void {\n if (this.mapViewStore.getMapViewCurrentMenu() !== MapViewCurrentMenu.STATS\n || !this.baseFertilizationCommonService.mainComponentSelectionAvailability) {\n return;\n }\n // put it on top of callstack to avoid lagging when user changes the selection\n setTimeout(() => {\n const emptyTitle = `${this.translationService.translate('Nutrients__StatisticsTitle')}\n ${this.translationService.translate('Global__BasicFertilization')}\n ${this.translationService.translate('Admin_Pages__Overview')}`;\n let items = this.dynComponent.getSelectedItems() as INutrientOverviewGridData[];\n if (!items.Any()) {\n items = this.dynComponent.items as INutrientOverviewGridData[];\n }\n if (!items?.Any()) {\n this.statisticStore.setStatisticData(\n [], ApStatsType.BaseFertStats, '', emptyTitle\n );\n return;\n }\n const title = this._getTitleForStatistic(items);\n this.statisticStore.setStatisticData<INutrientOverviewGridData>(\n items, ApStatsType.BaseFertStats, title, emptyTitle\n );\n }, 100);\n }\n\n private _getTitleForStatistic(selectedItems: INutrientOverviewGridData[]): string {\n const totalItems = this.dynComponent.items as INutrientOverviewGridData[];\n const dataForTitles = totalItems.map(x => ({\n AreaHa: x.Area,\n Selected: selectedItems.some(z => z.Id === x.Id)\n }));\n return this.statisticService.generateFieldsAreaTitle(dataForTitles);\n }\n\n private _getCropRotationConfigs(limits: LimitsType): ApDynGridColumnConfigBase[] {\n const columns = [];\n for (let iYear = limits.Min; iYear <= limits.Max + 3; ++iYear) {\n columns.push(new ApDynGridPropertyColumnConfig({\n title: `${iYear}`,\n field: `Crop.${iYear}.MainCropName`,\n filterable: true,\n headerFilterable: iYear === this.campaignYearStore.getSelectedCampaignYear().Year,\n width: 100,\n hide: new ApDynGridColumnHideConfig({\n mapHide: false,\n selfHide: combineLatest([this._year$, this.mapViewStore.Listen(s => s.mode)]).pipe(\n map(([year, mode]) => {\n if (year === iYear) {\n return false;\n }\n return !(mode === MapViewMode.HIDE && iYear > year && iYear < year + 4);\n }),\n ),\n }),\n tooltip: ((dataItem: INutrientOverviewGridData) => this._generateTooltipForCrop(dataItem, iYear))\n }));\n }\n return columns;\n }\n\n private _generateTooltipForCrop(dataItem: INutrientOverviewGridData, iYear: number): string {\n if (!dataItem || !dataItem.Crop || !dataItem.Crop[iYear]) {\n return '';\n }\n const yearCrop = dataItem.Crop[iYear];\n if (yearCrop.MainCrop === 0 && yearCrop.SecondCrop === 0) {\n return '';\n }\n const br = '<br>';\n const unit = this.translationService.translate('Global__UnitDtPerHa');\n const yieldTranslation = this.translationService.translate('Global__Target');\n let contentMessage = '';\n if (yearCrop.MainCrop !== 0) {\n const mainCropName = `${this.translationService.translate('Nutrients_Pages_Popups__MainCrop')}: ${yearCrop.MainCropName}`;\n contentMessage += `${mainCropName}${br}${yieldTranslation}: ${yearCrop.MainCropYield} ${unit}`;\n if (yearCrop.MainCropStraw) {\n contentMessage += `${br}${this.translationService.translate('Nutrients_Pages__StrawRemoved')}`;\n }\n }\n if (yearCrop.SecondCrop !== 0) {\n const secondCropName = `${this.translationService.translate('Nutrients_Pages_Popups__Intertillage')}: ${yearCrop.SecondCropName}`;\n contentMessage += `${br}${secondCropName}${br}${yieldTranslation}: ${yearCrop.SecondCropYield} ${unit}`;\n }\n const cropsRemoval = this._getRemovalFromCrops(yearCrop);\n const removalPMessage = `${this.elementService.GetElementStringByString(ApElementType.P)}: ${cropsRemoval.RemovalP}`;\n const removalKMessage = `${this.elementService.GetElementStringByString(ApElementType.K)}: ${cropsRemoval.RemovalK}`;\n const removalMgMessage = `${this.elementService.GetElementStringByString(ApElementType.Mg)}: ${cropsRemoval.RemovalMg}`;\n return `${contentMessage}${br}${removalPMessage}${br}${removalKMessage}${br}${removalMgMessage}`;\n }\n\n private _getRemovalFromCrops(cropRotationYield: CropRotationYield)\n : { RemovalP: number, RemovalK: number, RemovalMg: number } {\n let expectedYield = 0;\n let removalP = 0;\n let removalK = 0;\n let removalMg = 0;\n const mainCrop = this.cropTypeStore.getDefaultCroptype(cropRotationYield.MainCrop);\n if (cropRotationYield.MainCrop && mainCrop) {\n removalP += this._calculateCropExtraction(cropRotationYield.MainCropStraw, mainCrop.MainwdP, mainCrop.SecwdP, mainCrop.MsRatio);\n removalK += this._calculateCropExtraction(cropRotationYield.MainCropStraw, mainCrop.MainwdK, mainCrop.SecwdK, mainCrop.MsRatio);\n removalMg += this._calculateCropExtraction(cropRotationYield.MainCropStraw, mainCrop.MainwdMg, mainCrop.SecwdMg, mainCrop.MsRatio);\n expectedYield += cropRotationYield.MainCropYield;\n }\n const secondCrop = this.cropTypeStore.getDefaultCroptype(cropRotationYield.SecondCrop);\n if (cropRotationYield.SecondCrop && secondCrop) {\n removalP += secondCrop.MainwdP;\n removalK += secondCrop.MainwdK;\n removalMg += secondCrop.MainwdMg;\n expectedYield += cropRotationYield.SecondCropYield;\n }\n return {\n RemovalP: this.roundNumericService.roundAsNumber(\n this.elementService.CalculateElementOxidValueByElementType(removalP * expectedYield, ApElementType.P)\n ),\n RemovalK: this.roundNumericService.roundAsNumber(\n this.elementService.CalculateElementOxidValueByElementType(removalK * expectedYield, ApElementType.K)\n ),\n RemovalMg: this.roundNumericService.roundAsNumber(\n this.elementService.CalculateElementOxidValueByElementType(removalMg * expectedYield, ApElementType.Mg)\n )\n };\n }\n\n private _calculateCropExtraction(isStrawRemoved: boolean, mainWd: number, secondWd: number, msRatio: number): number {\n return isStrawRemoved ? mainWd + (secondWd * msRatio) : mainWd;\n }\n\n private _onXls(): void {\n this.dynComponent.dynGrid.xlsExportFileName = this.generatePrintFilename();\n this.dynComponent.dynGrid.exportAsXls();\n }\n\n private _onPdf(): void {\n this.dynComponent.dynGrid.pdfExportFileName = this.generatePrintFilename();\n this.dynComponent.dynGrid.exportAsPdf();\n }\n\n private generatePrintFilename(): string {\n return this.dateService.toFarmDate(new Date()).format('YYYY-MM-DD') + '_' +\n this.translationService.translate('Global__Plannings');\n }\n}\n","import {Component, OnInit, ViewChild} from '@angular/core';\nimport {ApDynComponentComponent} from '../../ap-dyncomponent/ap-dyncomponent.component';\nimport {ApDynGridColumnConfigBase} from '../../ap-dyngrids/config/ap-dyn-grid-column-config-base';\nimport {ApDynGridEditColumnConfig} from '../../ap-dyngrids/config/ap-dyn-grid-edit-column-config';\nimport {\n ApNutrientPlanningComponent\n} from '../../entry-components/ap-nutrients-management-entry-components/ap-nutrient-planning.component';\nimport {FormStore} from '../../stores/layout/form.store';\nimport {\n PlanningEntryComponentDataType\n} from '../../entry-components/ap-nutrients-management-entry-components/ap-nutrient-planning-configs/nutrient-planning-types';\n\n@Component({\n selector: 'ap-nutrient-p-need',\n template: `\n <ap-dyncomponent [caption]=\"'Global__P_Need'\"\n [canCreate]=\"true\"\n [headerIcon]=\"'ap-icon-base-fertilization'\"\n [columns]=\"columns\"\n (create)=\"onCreate()\">\n </ap-dyncomponent>\n `,\n styles: []\n})\nexport class ApNutrientPNeedComponent implements OnInit {\n @ViewChild(ApDynComponentComponent) dynComponent;\n columns: ApDynGridColumnConfigBase[] = [];\n\n constructor(private formStore: FormStore) {\n }\n\n ngOnInit(): void {\n this.gridBuilder();\n }\n\n gridBuilder(): void {\n this.columns = [\n new ApDynGridEditColumnConfig(\n {\n disabled: true\n }\n )\n ];\n }\n\n public onCreate(): void {\n this.formStore.openForm({\n component: ApNutrientPlanningComponent,\n data: {\n Summary: null,\n Type: PlanningEntryComponentDataType.Create\n }\n });\n }\n}\n","import {EventEmitter, Injectable} from '@angular/core';\nimport {ApDynGridStatusColumnConfig} from '../../../ap-dyngrids/config/ap-dyn-grid-status-column-config';\nimport {\n ApDynGridPropertyColumnConfig,\n FilterType\n} from '../../../ap-dyngrids/config/ap-dyn-grid-property-column-config';\nimport {ApDynGridGroupColumnConfig} from '../../../ap-dyngrids/config/ap-dyn-grid-group-column-config';\nimport {ApDynGridEditColumnConfig} from '../../../ap-dyngrids/config/ap-dyn-grid-edit-column-config';\nimport {ApDynGridColumnConfigBase} from '../../../ap-dyngrids/config/ap-dyn-grid-column-config-base';\nimport {LanguageStore} from '../../../stores/translation/language.store';\nimport {GetRoundNumericPipe} from '../../../ap-utils';\nimport {SettingsStore} from '../../../stores/base-data/settings.store';\nimport {GetElementService} from '../../../ap-utils/service/ap-get-element.service';\nimport {ApTranslationService} from '../../../ap-utils/service/ap-translation.service';\nimport {ApElementType} from '../../../ap-interface/enums/ap-elements-type.enum';\nimport {GetRoundNumericPipeConfig} from '../../../ap-utils/pipes/configs/get-round-numeric.pipe.config';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class GridBuilderService {\n\n constructor(private languageStore: LanguageStore,\n private roundNumericPipe: GetRoundNumericPipe,\n private settingsStore: SettingsStore,\n private translationService: ApTranslationService,\n private elementService: GetElementService) {\n }\n\n public PlanBooksGrid(options: { text: string, callback: EventEmitter<any> }[]): ApDynGridColumnConfigBase[] {\n return [\n new ApDynGridStatusColumnConfig({\n field: 'Status',\n class: 'StatusClass',\n description: 'StatusDesc',\n filterable: true,\n }),\n new ApDynGridPropertyColumnConfig({\n field: 'ApplicationDate',\n title: 'Nutrients__FertilizationDate',\n tooltip: (dataItem) => dataItem.ApplicationDateTooltip,\n dynCssClass: (dataItem) => dataItem.ApplicationDateItalic ? ' italic' : '',\n hide: true,\n width: 120,\n filterable: true,\n sortIndex: 1,\n sortDesc: true,\n format: this.languageStore.CurrentDateFormat\n }),\n new ApDynGridPropertyColumnConfig({\n field: 'Product',\n title: 'Global__Product',\n width: 170,\n filterable: true,\n tooltip: (dataItem) => dataItem['ProductTooltip']\n }),\n new ApDynGridGroupColumnConfig({\n title: `${this.translationService.translate('Nutrients__Average_Amount_Goods')} / ${this.translationService.translate('Global__Remaining_Need_Two_Short')}`,\n headerStyle: {'text-align': 'center'},\n groupColumns: [\n new ApDynGridPropertyColumnConfig({\n field: 'Amount',\n width: 80,\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n field: 'AmountUnit',\n width: 60\n })\n ]\n }),\n new ApDynGridPropertyColumnConfig({\n field: 'Count',\n title: 'Global__Amount',\n width: 70,\n filterable: true,\n tooltip: (dataItem) => dataItem?.FieldsTooltip,\n cssClass: 'right',\n filterType: FilterType.NUMBER\n }),\n new ApDynGridPropertyColumnConfig({\n field: 'Area',\n title: 'Global__Area_Unit',\n width: 80,\n filterable: true,\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n tooltip: (dataItem) => dataItem['AreaOriginal'],\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [this.settingsStore.FirstSetting.DigitsAfterDecimalPoint]\n }]\n }),\n new ApDynGridGroupColumnConfig({\n title: this.translationService.translate('Global__Sum_Goods'),\n headerStyle: {'text-align': 'center'},\n hide: true,\n groupColumns: [\n new ApDynGridPropertyColumnConfig({\n field: 'Sum',\n hide: true,\n width: 90,\n tooltip: (dataItem) => dataItem['SumTooltip'],\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n field: 'SumUnit',\n width: 60,\n hide: true,\n })\n ]\n }),\n new ApDynGridPropertyColumnConfig({\n field: 'LeadNutrient',\n title: 'AgriConnect__Nutrient',\n width: 90,\n filterable: true\n }),\n new ApDynGridGroupColumnConfig({\n title: 'Global__Average_Symbol_Nutrient_kg_ha',\n groupColumns: [\n new ApDynGridPropertyColumnConfig({\n title: this.elementService.GetElementStringByString(ApElementType.P),\n field: 'P',\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n width: 60,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0, GetRoundNumericPipeConfig.NullAndZeroToEmptyReplaceConfig]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n title: this.elementService.GetElementStringByString(ApElementType.K),\n field: 'K',\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n width: 60,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0, GetRoundNumericPipeConfig.NullAndZeroToEmptyReplaceConfig]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n title: this.elementService.GetElementStringByString(ApElementType.Mg),\n field: 'Mg',\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n width: 60,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0, GetRoundNumericPipeConfig.NullAndZeroToEmptyReplaceConfig]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Global__NutrientCaO',\n field: 'CaO',\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n width: 60,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0, GetRoundNumericPipeConfig.NullAndZeroToEmptyReplaceConfig]\n }]\n }),\n ]\n }),\n new ApDynGridGroupColumnConfig({\n title: 'Global__Good_ha',\n hide: true,\n groupColumns: [\n new ApDynGridPropertyColumnConfig({\n title: 'Min',\n field: 'Min',\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n width: 70,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Max',\n field: 'Max',\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n width: 70,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0]\n }]\n }),\n ]\n }),\n new ApDynGridPropertyColumnConfig({\n field: 'Note',\n title: 'Global__Note',\n hide: true,\n cssClass: 'left',\n width: 100\n }),\n new ApDynGridEditColumnConfig({\n data: options\n })\n ];\n }\n}\n","import {AfterContentInit, Component, EventEmitter, OnDestroy, OnInit, ViewChild} from '@angular/core';\nimport {combineLatest, Observable, Subscription} from 'rxjs';\nimport {debounceTime, filter, first, map, skip} from 'rxjs/operators';\nimport {\n ApDynComponentComponent\n} from '../../ap-dyncomponent/ap-dyncomponent.component';\nimport {\n ApDynGridColumnConfigBase\n} from '../../ap-dyngrids/config/ap-dyn-grid-column-config-base';\nimport {FormStore} from '../../stores/layout/form.store';\nimport {\n ApNutrientPlanningComponent\n} from '../../entry-components/ap-nutrients-management-entry-components/ap-nutrient-planning.component';\nimport {\n SettingsStore\n} from '../../stores/base-data/settings.store';\nimport {\n CampaignYearStore\n} from '../../stores/login/campaignyear.store';\nimport {\n BasicFertilisationSummariesStore\n} from '../../stores/taskmanagement/basic.fertilisation.summaries.store';\nimport {\n CropTypeStore\n} from '../../stores/base-data/crop.types.store';\nimport {FieldStore} from '../../stores/farm/field.store';\nimport {\n TranslationStore\n} from '../../stores/translation/translation.store';\nimport {\n FertilizerStore\n} from '../../stores/base-data/fertilizer.store';\nimport {\n ApDynGridPagerConfigBase\n} from '../../ap-dyngrids/config/ap-dyn-grid-pager-config-base';\nimport {\n GridBuilderService\n} from './configs/plan-books-grid-builder.service';\nimport {\n ApUtilService\n} from '../../ap-utils/service/ap-util.service';\nimport {\n ApNutrientBookingComponent\n} from '../../entry-components/ap-nutrients-management-entry-components/ap-nutrient-booking.component';\nimport {\n GetElementService\n} from '../../ap-utils/service/ap-get-element.service';\nimport {LoginStore} from '../../stores/login/login.store';\nimport {\n RouterStore\n} from '../../stores/router/router.store';\nimport {\n StatisticStore\n} from '../../stores/statistic/statistic.store';\nimport {\n GetRoundNumericService\n} from '../../ap-utils/service/get-round-numeric.service';\nimport {ApElementOxydTypeEnum, ApStatsType, MapViewCurrentMenu, MapViewMode} from '../../ap-interface';\nimport {\n ApNutrientStatisticService\n} from '../service/ap-nutrient-statistic.service';\nimport {\n ApDateService\n} from '../../ap-core/services/ap-date-service';\nimport {\n NutrientManagementService\n} from '../service/nutrient-management.service';\nimport {\n NutrientStore\n} from '../../stores/nutrients/nutrient.store';\nimport {PagerBuilder} from './configs/pager-builder';\nimport {\n Icon\n} from '../../ap-interface/enums/layout/icon.enum';\nimport {\n ApTooltipContentService\n} from '../../ap-utils/service/ap-tooltip-content.service';\nimport {GetRoundNumericPipe} from '../../ap-utils';\nimport {\n ApNutrientService\n} from '../../ap-utils/service/ap-nutrient.service';\nimport {\n ApTranslationService\n} from '../../ap-utils/service/ap-translation.service';\nimport {\n TaskManagementAction\n} from '../../task-management/task-management.types';\nimport {\n ApRoleTypeService\n} from '../../services/common/ap-role-type.service';\nimport {\n FertilizerService\n} from '../../services/data/fertilizer.service';\nimport {\n BaseFertilizationCommonService\n} from '../service/base-fertilization-common.service';\nimport {MapStore} from '../../stores/map/map.store';\nimport {\n CropRotationStore\n} from '../../stores/farm/crop.rotation.store';\nimport {\n PlanningEntryComponentDataType\n} from '../../entry-components/ap-nutrients-management-entry-components/ap-nutrient-planning-configs/nutrient-planning-types';\nimport {\n FieldArchiveStore\n} from '../../stores/farm/field-archive.store';\nimport {ObjectFactory} from 'ts-tooling';\nimport {\n MapViewStore\n} from '../../stores/layout/mapview.store';\nimport {\n GenericChartConfig\n} from '../../statistics/components/charts/ap-generic-chart.types';\nimport IBasicFertilisationSummaries = Data.TaskManagement.IBasicFertilisationSummaries;\nimport IBasicFertilisationPlanBooks = Data.TaskManagement.IBasicFertilisationPlanBooks;\n\n@Component({\n selector: 'ap-nutrient-planning',\n template: `\n <ap-dyncomponent [caption]=\"'Global__Plannings'\"\n [canCreate]=\"(loading$ | async) === false\"\n [headerIcon]=\"'ap-icon-base-fertilization'\"\n [columns]=\"columns\"\n [loading$]=\"loading$\"\n [items]=\"items$ | async\"\n [pager]=\"pager\"\n (create)=\"onCreate()\"\n [selectable]=\"{checkboxOnly: false, mode: 'single'}\">\n </ap-dyncomponent>\n `,\n styles: []\n})\nexport class ApNutrientManagementPlanningComponent implements OnInit, OnDestroy, AfterContentInit {\n @ViewChild(ApDynComponentComponent, {static: true}) dynComponent: ApDynComponentComponent;\n public columns: ApDynGridColumnConfigBase[] = [];\n public items$: Observable<any[]>;\n public pager: ApDynGridPagerConfigBase;\n public loading$: Observable<boolean>;\n private _statisticUpdateRequested = new EventEmitter<void>();\n\n private _subscriptions: Subscription[] = [];\n private _isOnCreatePressed = false;\n\n constructor(private formStore: FormStore,\n private settingsStore: SettingsStore,\n private campaignYearStore: CampaignYearStore,\n private basicFertilisationSummariesStore: BasicFertilisationSummariesStore,\n private cropTypeStore: CropTypeStore,\n private fieldStore: FieldStore,\n private translationStore: TranslationStore,\n private fertilizerStore: FertilizerStore,\n private gridBuilder: GridBuilderService,\n private elementService: GetElementService,\n private loginStore: LoginStore,\n private routerStore: RouterStore,\n private statisticStore: StatisticStore,\n private cropRotationStore: CropRotationStore,\n private roundNumericService: GetRoundNumericService,\n private nutrientStatisticService: ApNutrientStatisticService,\n private dateService: ApDateService,\n private nutrientManagementService: NutrientManagementService,\n private nutrientStore: NutrientStore,\n private tooltipContentService: ApTooltipContentService,\n private roundNumericPipe: GetRoundNumericPipe,\n private nutrientService: ApNutrientService,\n private translationService: ApTranslationService,\n private mapStore: MapStore,\n private baseFertilizationCommonService: BaseFertilizationCommonService,\n private fertilizerService: FertilizerService,\n private fieldArchiveStore: FieldArchiveStore,\n private mapViewStore: MapViewStore) {\n }\n\n public ngOnInit(): void {\n this.statisticStore.removeStatisticData();\n this.fieldStore.changeSelectedField([]);\n this.loading$ = combineLatest([\n this.fieldStore.Listen(s => s.loading),\n this.cropTypeStore.Listen(s => s.loading),\n this.basicFertilisationSummariesStore.Listen(s => s.loading),\n this.cropRotationStore.HistoryLoading$\n ]).pipe(\n map(loadingItems => loadingItems.some(x => x))\n );\n this._buildGrid();\n }\n\n public ngAfterContentInit(): void {\n // Auf Farm/EJ-Wechsel reagieren und Summaries neu laden\n this._subscriptions.push(this.dynComponent.gridInitialized.subscribe(() => {\n this._subscriptions.push(this.items$.subscribe(items => {\n const itemToSelect = items.find(x => x.Id === this.baseFertilizationCommonService.selectedSummaryId);\n if (itemToSelect) {\n this.baseFertilizationCommonService.setSelectedSummaryKey(undefined);\n this.dynComponent.dynGrid.gridPaging.setSelectedKeys([itemToSelect.Id]);\n }\n }));\n }));\n this._subscriptions.push(this.campaignYearStore.Listen(s => s.selectedYear).pipe(skip(1)).subscribe(() => {\n this.basicFertilisationSummariesStore.loadBasicFertilisationSummaries();\n }));\n this._subscriptions.push(this.mapStore.Layers.OnLayerChange.subscribe(() => {\n // in order to show the geometry of the planning we reuse the taskmanagement layer\n this.mapStore.Layers.TaskManagementLayer.Visibility = this.mapStore.Layers.NutrientPlanningLayer?.Visibility;\n }));\n this._subscriptions.push(this.dynComponent.SelectedItems$.subscribe(_ => this._selectionChange()));\n this._subscriptions.push(combineLatest([\n this.routerStore.Listen(s => s),\n this.items$,\n this.basicFertilisationSummariesStore.Listen(s => s.loading)\n ]).pipe(\n filter(([routerStoreData, gridItems, gridItemsLoading]) =>\n routerStoreData.url?.startsWith('/nutrients/planning') && routerStoreData.queryParams['id'] !== undefined && gridItems?.length !== 0 && !gridItemsLoading),\n first(),\n ).subscribe(([routerStoreData, gridItems]) => {\n const isBooking = routerStoreData.queryParams['action'] === TaskManagementAction.Booking;\n const targetComponent = isBooking ? ApNutrientBookingComponent : ApNutrientPlanningComponent;\n let targetGridItem = gridItems.find(_ => _.Id === routerStoreData.queryParams['id']);\n if (routerStoreData.queryParams['action'] === TaskManagementAction.Edit) {\n targetGridItem = targetGridItem?.SourceItem;\n }\n const dataObject: any = isBooking\n ? {Summary: targetGridItem, FieldIdToSelect: null}\n : {\n Summary: targetGridItem,\n Type: targetGridItem ? PlanningEntryComponentDataType.Create : PlanningEntryComponentDataType.Edit\n };\n setTimeout(() => {\n this.formStore.openForm({component: targetComponent, data: dataObject});\n if (routerStoreData.queryParams['url']) {\n this._subscriptions.push(this.formStore.FormClose$.subscribe(() => this.routerStore.navigate([routerStoreData.queryParams['url']])));\n }\n }, 0);\n }));\n this._subscriptions.push(this.formStore.FormClose$.subscribe(() => {\n // trigger refresh of selection and map after entryComponent (e.g. 'NEW') closed\n if (this._isOnCreatePressed) {\n this._isOnCreatePressed = false;\n setTimeout(() => {\n this._handleLegendsAndLayers(this.dynComponent.getSelectedItems().length);\n this._selectionChange();\n }, 1);\n }\n }));\n this._subscriptions.push(this.mapStore.Layers.OnLayerChange.subscribe(() => {\n this._handleLegendsAndLayers(this.dynComponent.getSelectedItems().length);\n }));\n this._subscriptions.push(this._statisticUpdateRequested.pipe(\n debounceTime(100)).subscribe(_ => this._generateStats()));\n this._subscriptions.push(this.items$.subscribe(_ => this._statisticUpdateRequested.emit()));\n this._subscriptions.push(\n combineLatest([\n this.mapViewStore.Listen(s => s.mode),\n this.mapViewStore.Listen(s => s.currentMenu)\n ]).subscribe(([mapMode, mapMenu]) => {\n if (mapMode !== MapViewMode.HIDE && mapMenu === MapViewCurrentMenu.STATS) {\n this._statisticUpdateRequested.emit();\n }\n }\n ));\n }\n\n public ngOnDestroy(): void {\n this.baseFertilizationCommonService.revertLegends();\n this._subscriptions.forEach(s => s?.unsubscribe());\n this.statisticStore.removeStatisticData();\n this.fieldStore.changeSelectedField([]);\n }\n\n public onCreate(): void {\n this.statisticStore.removeStatisticData();\n if (this.dynComponent.dynGrid.gridPaging.selectedKeys.length !== 0) {\n const selectedSourceItem = (this.dynComponent.dynGrid.gridPaging.items.find(x => x.Id === this.dynComponent.dynGrid.gridPaging.selectedKeys[0]) as any)?.SourceItem;\n this.formStore.openForm({\n component: ApNutrientPlanningComponent,\n data: {\n Summary: ObjectFactory.Copy(selectedSourceItem),\n Type: PlanningEntryComponentDataType.Edit\n }\n });\n } else {\n this.formStore.openForm({\n component: ApNutrientPlanningComponent,\n data: {\n Summary: null,\n Type: PlanningEntryComponentDataType.Create\n }\n });\n }\n\n this._isOnCreatePressed = true;\n }\n\n private _selectionChange(): void {\n if (!this.dynComponent?.dynGrid?.gridPaging) {\n return;\n }\n const selectedSummaries = this.dynComponent.dynGrid.gridPaging.selectedItems;\n if (selectedSummaries && selectedSummaries.length > 0) {\n this.baseFertilizationCommonService.onSelectionChange(selectedSummaries[0]['SourceItem'] as IBasicFertilisationSummaries, false);\n } else {\n this.baseFertilizationCommonService.onSelectionChange(null, false);\n }\n this._statisticUpdateRequested.emit();\n }\n\n private _buildGrid(): void {\n const gridOptions = [\n {\n text: 'Global__Show',\n callback: ApUtilService.createEventEmitter(this._onOneShow.bind(this), this._subscriptions)\n },\n {\n text: 'Global__Export',\n callback: ApUtilService.createEventEmitter(this._onOneExport.bind(this), this._subscriptions)\n },\n {\n text: 'Global__Replan',\n callback: ApUtilService.createEventEmitter(this._onOneReplan.bind(this), this._subscriptions)\n },\n {\n text: 'Admin_Pages_Popups__Book',\n callback: ApUtilService.createEventEmitter(this._onOneBooking.bind(this), this._subscriptions)\n },\n {\n text: 'Global__Delete',\n callback: ApUtilService.createEventEmitter(this._onOneDelete.bind(this), this._subscriptions)\n }\n ];\n if (ApRoleTypeService.hasAgriconRole(this.loginStore.User)) {\n gridOptions.Add({\n text: 'Global__Download',\n callback: ApUtilService.createEventEmitter(this._onOneDownloadPackage.bind(this), this._subscriptions)\n });\n }\n this.columns = this.gridBuilder.PlanBooksGrid(gridOptions);\n const pagerOptions = [\n {\n text: 'Global__Export',\n callback: ApUtilService.createEventEmitter(this._onExport.bind(this), this._subscriptions)\n },\n {\n text: 'Admin_Pages_Popups__Book',\n callback: ApUtilService.createEventEmitter(this._onBooking.bind(this), this._subscriptions)\n },\n {\n text: 'Global__Replan',\n callback: ApUtilService.createEventEmitter(this._onReplan.bind(this), this._subscriptions)\n },\n {\n text: 'Global__Delete',\n callback: ApUtilService.createEventEmitter(this._onDelete.bind(this), this._subscriptions)\n }\n ];\n const iconOptions = [\n {\n icon: Icon.PDF,\n callback: ApUtilService.createEventEmitter(this._onPdf.bind(this), this._subscriptions),\n tooltip: 'Global__Save_PDF'\n },\n {\n icon: Icon.XLS,\n callback: ApUtilService.createEventEmitter(this._onXls.bind(this), this._subscriptions),\n tooltip: 'Global__Save_EXCEL'\n }\n ];\n this.pager = PagerBuilder.NutrientManagementPager(pagerOptions, iconOptions);\n\n this.items$ = combineLatest([\n this.basicFertilisationSummariesStore.Summaries$,\n this.cropTypeStore.Listen(s => s.cropTypesNames),\n this.fieldStore.Listen(s => s.data),\n this.campaignYearStore.Listen(s => s.selectedYear),\n this.cropRotationStore.GetHistory$,\n this.baseFertilizationCommonService.gridUpdate$,\n this.fieldArchiveStore.Listen(s => s.loaded)\n ]).pipe(\n filter(([summaries, cropTypesNames, fields,\n campaignYear, cropRotationHistory, isGridUpdateAllowed, fieldArchiveLoaded]) => {\n return !!summaries && !!cropTypesNames && !!fields && !!campaignYear && !!cropRotationHistory && isGridUpdateAllowed && fieldArchiveLoaded;\n }),\n map(([summaries, cropTypesNames]) => {\n return summaries.filter(x => x.BasicFertilisationPlanBooks.some(planBook => !planBook.DeletedAt && !planBook.BookedAt))\n .map((summary) => {\n const area = this.nutrientManagementService.getArea(summary, false);\n const sum = this.nutrientManagementService.getCalculateSumFertilizer(summary, false);\n const productTooltip = this.tooltipContentService.getProductContentInfoTooltip(this._getProductId(summary));\n const fertilizer = this.fertilizerStore.getFertilizer(this._getProductId(summary));\n const fertilizerUnit = this.fertilizerService.getFertilizerUnit(fertilizer);\n const sumTooltip = this.roundNumericPipe.transform(sum, this.settingsStore.FirstSetting.DigitsAfterDecimalPoint) + ' ' + fertilizerUnit;\n const planBookApplicationDates = this.baseFertilizationCommonService.getApplicationDatesData(summary.BasicFertilisationPlanBooks, false);\n return {\n SourceItem: summary,\n Id: summary.Id,\n Status: this.nutrientService.getFertilizerStatus(summary.User_Appl_Mode, false)?.state,\n StatusClass: this.nutrientService.getFertilizerStatus(summary.User_Appl_Mode, false)?.class,\n StatusDesc: this.nutrientService.getFertilizerStatusDescription(summary.User_Appl_Mode, false),\n Crop: cropTypesNames[this._getCropType(summary)],\n Count: this.baseFertilizationCommonService.getPlanBooksFieldsCount(summary.BasicFertilisationPlanBooks, false),\n Area: this.roundNumericService.roundAsNumber(area, this.settingsStore.FirstSetting.DigitsAfterDecimalPoint),\n AreaOriginal: area.toString(10),\n OperationMode: this.translationService.translate(summary.User_Operation_Mode?.Key),\n Product: this.fertilizerService.getFertilizerProductName(fertilizer),\n ProductTooltip: productTooltip,\n ApplicationDate: planBookApplicationDates?.NewestDate,\n ApplicationDateTooltip: planBookApplicationDates?.Tooltip,\n ApplicationDateItalic: planBookApplicationDates?.IsMoreThanOneUniqDate,\n Plannings: summary.BasicFertilisationPlanBooks,\n Note: summary.Title,\n Amount: summary.User_Appl_Rate,\n AmountUnit: summary.User_Appl_Unit?.Id === 1 ? this.fertilizerService.getFertilizerUnit(fertilizer, true) : this.translationStore.FindTranslationForSelectedLanguage(summary.User_Appl_Unit?.Key),\n Sum: sum,\n SumUnit: fertilizerUnit,\n SumTooltip: sumTooltip,\n LeadNutrient: this.baseFertilizationCommonService.getLeadNutrient(summary),\n Min: this.nutrientManagementService.getMin(summary, false),\n Max: this.nutrientManagementService.getMax(summary, false),\n BasicFertilisationPlanBooks: summary.BasicFertilisationPlanBooks,\n P: this.elementService.CalculateElementOxidValueByGivenElementValue(this.nutrientStatisticService.getAverageNutrientFromStatistics(0, summary, false), ApElementOxydTypeEnum.P),\n K: this.elementService.CalculateElementOxidValueByGivenElementValue(this.nutrientStatisticService.getAverageNutrientFromStatistics(1, summary, false), ApElementOxydTypeEnum.K),\n Mg: this.elementService.CalculateElementOxidValueByGivenElementValue(this.nutrientStatisticService.getAverageNutrientFromStatistics(2, summary, false), ApElementOxydTypeEnum.Mg),\n CaO: this.nutrientStatisticService.getAverageNutrientFromStatistics(3, summary, false),\n Statistic: summary.Statistic,\n PlanNumber: summary.PlanNumber,\n FieldIds: this.baseFertilizationCommonService.getFieldIds(summary.BasicFertilisationPlanBooks, false),\n FieldsTooltip: this.baseFertilizationCommonService.getFieldCropsTooltip(summary.BasicFertilisationPlanBooks, false)\n };\n });\n })\n );\n }\n\n private _getProductId(summary: IBasicFertilisationSummaries): number | null {\n return summary.BasicFertilisationPlanBooks[0]?.Product_Id;\n }\n\n private _getCropType(summary: IBasicFertilisationSummaries): number | string {\n return summary.BasicFertilisationPlanBooks[0]?.Croptype_Id ?? '';\n }\n\n private _handleLegendsAndLayers(selectedItems: number): void {\n this.baseFertilizationCommonService.handleLegends(selectedItems ?? 0);\n // in order to show the geometry of the planning we reuse the taskmanagement layer\n this.mapStore.Layers.TaskManagementLayer.Visibility = this.mapStore.Layers.NutrientPlanningLayer?.Visibility;\n }\n\n private _onXls(): void {\n this.dynComponent.dynGrid.xlsExportFileName = this._generatePrintFilename();\n this.dynComponent.dynGrid.exportAsXls();\n }\n\n private _onPdf(): void {\n this.dynComponent.dynGrid.pdfExportFileName = this._generatePrintFilename();\n this.dynComponent.dynGrid.exportAsPdf();\n }\n\n private _generatePrintFilename(): string {\n return this.dateService.toFarmDate(new Date()).format('YYYY-MM-DD') + '_' +\n this.translationStore.FindTranslationForSelectedLanguage('Global__Plannings');\n }\n\n private _onExport(dataItem: any): void {\n if (dataItem.items === null || dataItem.items === undefined) {\n return;\n }\n this._onOneExport(dataItem.items[0]);\n }\n\n private _onOneExport(dataItem: any): void {\n this.dynComponent.dynGrid.gridPaging.setSelectedKeys([dataItem.Id]);\n this.baseFertilizationCommonService.redirectSummaryToExportView(dataItem.Id, false, 'nutrients/planning');\n }\n\n private _onBooking(dataItem: any): void {\n if (dataItem.items === null || dataItem.items === undefined) {\n return;\n }\n this._onOneBooking(dataItem.items[0]);\n }\n\n private _onOneBooking(dataItem: any): void {\n this.dynComponent.dynGrid.gridPaging.setSelectedKeys([dataItem.Id]);\n this.baseFertilizationCommonService.bookPlanBooks(dataItem.SourceItem);\n }\n\n private _onReplan(dataItem: any): void {\n if (!dataItem?.items || dataItem.items.length <= 0) {\n return;\n }\n this._onOneReplan(dataItem.items[0]);\n }\n\n private _onOneReplan(dataItem: any): void {\n this.dynComponent.dynGrid.gridPaging.setSelectedKeys([dataItem.Id]);\n this.baseFertilizationCommonService.replanSummary(dataItem.SourceItem);\n }\n\n private _onDelete(dataItem: any): void {\n if (dataItem.items === null || dataItem.items === undefined) {\n return;\n }\n this._onOneDelete(dataItem.items[0]);\n }\n\n private _onOneDelete(dataItem: any): void {\n this.baseFertilizationCommonService.deleteSummary(dataItem.SourceItem);\n }\n\n private _onOneShow(dataItem: any): void {\n this.dynComponent.dynGrid.gridPaging.setSelectedKeys([dataItem.Id]);\n this.baseFertilizationCommonService.redirectSummaryToShowView(dataItem.Id, false, 'nutrients/planning');\n }\n\n private _onOneDownloadPackage(dataItem: any): void {\n const summary = dataItem['SourceItem'] as IBasicFertilisationSummaries;\n this.nutrientStore.createNutrientPlanningPackage(summary.Id);\n }\n\n /**\n * Generates the statistic charts for the selected planbooks.\n * Grouped by product (=series)\n * Grouped by Month/Year (=category/y-axis)\n * @private\n */\n private _generateStats(): void {\n if (this.mapViewStore.getMapViewCurrentMenu() !== MapViewCurrentMenu.STATS || this.mapViewStore.getMapViewMode() === MapViewMode.HIDE) {\n return;\n }\n const title = `${this.translationService.translate('Global__Planning')}`;\n let items = this.dynComponent.getSelectedItems() as any[];\n if (!items || items?.length === 0) {\n items = this.dynComponent.items as any[];\n }\n if (!items || items?.length === 0) {\n this.statisticStore.setStatisticData<GenericChartConfig>(\n [], ApStatsType.GenericBars, title, title\n );\n return;\n }\n\n const chartConfigs: GenericChartConfig[] = [];\n let planBooks = items?.map(item => item?.BasicFertilisationPlanBooks).flat() as IBasicFertilisationPlanBooks[];\n planBooks = planBooks?.filter(pB => pB?.BookedAt == null && pB.DeletedAt == null);\n const chartConfig = this.baseFertilizationCommonService.generateStatChartConfig(planBooks);\n chartConfigs.push(chartConfig);\n\n this.statisticStore.setStatisticData<GenericChartConfig>(\n chartConfigs, ApStatsType.GenericChart, title, title\n );\n }\n}\n","import {Route, RouterModule} from '@angular/router';\nimport {NgModule} from '@angular/core';\nimport {PageMode} from '../ap-interface';\nimport {ApNutrientDistributionComponent} from './components/ap-nutrient-distribution.component';\nimport {ApSoilSamplePlanningOverviewComponent} from './components/ap-soilsampleplanning-overview.component';\nimport {ApNutrientManagementOverviewComponent} from './components/ap-nutrient-management-overview.component';\nimport {ApPermissionGuard} from '../guards/ap-permission-guard.service';\nimport {ApNutrientPNeedComponent} from './components/ap-nutrient-p-need.component';\nimport {ApNutrientManagementPlanningComponent} from './components/ap-nutrient-management-planning.component';\nimport {ApNutrientManagementBookingComponent} from './components/ap-nutrient-management-booking.component';\n\nexport const routes: Route[] = [\n {\n path: 'nutrients-distribution',\n component: ApNutrientDistributionComponent,\n canActivate: [ApPermissionGuard],\n data: {\n login: true,\n layout: PageMode.HALFSCREEN\n },\n },\n {\n path: 'overview',\n component: ApNutrientManagementOverviewComponent,\n canActivate: [ApPermissionGuard],\n data: {\n login: true,\n layout: PageMode.HALFSCREEN\n },\n },\n {\n path: 'p-need',\n component: ApNutrientPNeedComponent,\n canActivate: [ApPermissionGuard],\n data: {\n login: true,\n layout: PageMode.HALFSCREEN\n },\n },\n {\n path: 'planning',\n component: ApNutrientManagementPlanningComponent,\n canActivate: [ApPermissionGuard],\n data: {\n login: true,\n layout: PageMode.HALFSCREEN\n },\n },\n {\n path: 'booking',\n component: ApNutrientManagementBookingComponent,\n canActivate: [ApPermissionGuard],\n data: {\n login: true,\n layout: PageMode.HALFSCREEN\n },\n },\n {\n path: 'soil-sample-planning',\n component: ApSoilSamplePlanningOverviewComponent,\n canActivate: [ApPermissionGuard],\n data: {\n login: true,\n layout: PageMode.HALFSCREEN\n },\n }\n];\n\n@NgModule({\n imports: [\n RouterModule.forChild(routes)\n ],\n exports: [RouterModule]\n})\nexport class ApNutrientManagementRoutes {\n}\n","import {AfterContentInit, Component, EventEmitter, OnDestroy, OnInit, ViewChild} from '@angular/core';\nimport {\n ApDynGridColumnConfigBase\n} from '../../ap-dyngrids/config/ap-dyn-grid-column-config-base';\nimport {\n ApDynGridEditColumnConfig\n} from '../../ap-dyngrids/config/ap-dyn-grid-edit-column-config';\nimport {\n ApDynComponentComponent\n} from '../../ap-dyncomponent/ap-dyncomponent.component';\nimport {\n ApDynGridPropertyColumnConfig,\n FilterType\n} from '../../ap-dyngrids/config/ap-dyn-grid-property-column-config';\nimport {\n ApDynGridGroupColumnConfig\n} from '../../ap-dyngrids/config/ap-dyn-grid-group-column-config';\nimport {\n ApNutrientPlanningComponent\n} from '../../entry-components/ap-nutrients-management-entry-components/ap-nutrient-planning.component';\nimport {FormStore} from '../../stores/layout/form.store';\nimport {\n ApDynGridPagerConfig\n} from '../../ap-dyngrids/config/ap-dyn-grid-pager-config';\nimport {\n ApUtilService\n} from '../../ap-utils/service/ap-util.service';\nimport {combineLatest, Observable, Subscription} from 'rxjs';\nimport {\n Icon\n} from '../../ap-interface/enums/layout/icon.enum';\nimport {\n LanguageStore\n} from '../../stores/translation/language.store';\nimport {\n ApDynGridStatusColumnConfig\n} from '../../ap-dyngrids/config/ap-dyn-grid-status-column-config';\nimport {debounceTime, filter, map, skip} from 'rxjs/operators';\nimport {\n CampaignYearStore\n} from '../../stores/login/campaignyear.store';\nimport {\n SettingsStore\n} from '../../stores/base-data/settings.store';\nimport {GetRoundNumericPipe} from '../../ap-utils';\nimport {\n BasicFertilisationSummariesStore\n} from '../../stores/taskmanagement/basic.fertilisation.summaries.store';\nimport {FieldStore} from '../../stores/farm/field.store';\nimport {\n FertilizerStore\n} from '../../stores/base-data/fertilizer.store';\nimport {\n TranslationStore\n} from '../../stores/translation/translation.store';\nimport {\n GetElementService\n} from '../../ap-utils/service/ap-get-element.service';\nimport {\n GetOperationModeService\n} from '../../ap-utils/service/ap-get-operationmode.service';\nimport {\n ApDateService\n} from '../../ap-core/services/ap-date-service';\nimport {\n ApNutrientStatisticService\n} from '../service/ap-nutrient-statistic.service';\nimport {PagerBuilder} from './configs/pager-builder';\nimport {\n NutrientManagementService\n} from '../service/nutrient-management.service';\nimport {ApElementOxydTypeEnum, ApStatsType, MapViewCurrentMenu, MapViewMode} from '../../ap-interface';\nimport {\n ApTooltipContentService\n} from '../../ap-utils/service/ap-tooltip-content.service';\nimport {\n NutrientStore\n} from '../../stores/nutrients/nutrient.store';\nimport {LoginStore} from '../../stores/login/login.store';\nimport {\n ApElementType\n} from '../../ap-interface/enums/ap-elements-type.enum';\nimport {\n ApNutrientService\n} from '../../ap-utils/service/ap-nutrient.service';\nimport {\n ApRoleTypeService\n} from '../../services/common/ap-role-type.service';\nimport {\n FertilizerService\n} from '../../services/data/fertilizer.service';\nimport {\n BaseFertilizationCommonService\n} from '../service/base-fertilization-common.service';\nimport {MapStore} from '../../stores/map/map.store';\nimport {\n CropRotationStore\n} from '../../stores/farm/crop.rotation.store';\nimport {\n PlanningEntryComponentDataType\n} from '../../entry-components/ap-nutrients-management-entry-components/ap-nutrient-planning-configs/nutrient-planning-types';\nimport {\n FieldArchiveStore\n} from '../../stores/farm/field-archive.store';\nimport {\n StatisticStore\n} from '../../stores/statistic/statistic.store';\nimport {\n GenericChartConfig\n} from '../../statistics/components/charts/ap-generic-chart.types';\nimport {\n MapViewStore\n} from '../../stores/layout/mapview.store';\nimport {\n ApTranslationService\n} from '../../ap-utils/service/ap-translation.service';\nimport {\n GetRoundNumericPipeConfig\n} from '../../ap-utils/pipes/configs/get-round-numeric.pipe.config';\nimport IBasicFertilisationSummaries = Data.TaskManagement.IBasicFertilisationSummaries;\nimport IBasicFertilisationPlanBooks = Data.TaskManagement.IBasicFertilisationPlanBooks;\n\n@Component({\n selector: 'ap-nutrient-booking',\n template: `\n <ap-dyncomponent [caption]=\"'Global__Bookings'\"\n [canCreate]=\"false\"\n [headerIcon]=\"'ap-icon-base-fertilization'\"\n [columns]=\"columns$ | async\"\n [items]=\"items$ | async\"\n [loading$]=\"loading$\"\n [pager]=\"pager\"\n (create)=\"onCreate()\"\n [selectable]=\"{checkboxOnly: false, mode: 'single'}\">\n </ap-dyncomponent>\n `,\n styles: []\n})\nexport class ApNutrientManagementBookingComponent implements OnInit, OnDestroy, AfterContentInit {\n @ViewChild(ApDynComponentComponent, {static: true}) dynComponent: ApDynComponentComponent;\n public loading$: Observable<boolean>;\n public items$: Observable<any>;\n public columns$: Observable<ApDynGridColumnConfigBase[]>;\n public pager: ApDynGridPagerConfig;\n private _statisticUpdateRequested = new EventEmitter<void>();\n\n private _subscriptions: Subscription[] = [];\n private _isOnCreatePressed = false;\n\n constructor(private mapStore: MapStore,\n private formStore: FormStore,\n private fieldStore: FieldStore,\n private loginStore: LoginStore,\n private languageStore: LanguageStore,\n private settingsStore: SettingsStore,\n private dateService: ApDateService,\n private nutrientStore: NutrientStore,\n private statisticStore: StatisticStore,\n private fertilizerStore: FertilizerStore,\n private translationStore: TranslationStore,\n private cropRotationStore: CropRotationStore,\n private campaignYearStore: CampaignYearStore,\n private basicFertilisationSummariesStore: BasicFertilisationSummariesStore,\n private elementService: GetElementService,\n private nutrientService: ApNutrientService,\n private operationModeService: GetOperationModeService,\n private tooltipContentService: ApTooltipContentService,\n private nutrientManagementService: NutrientManagementService,\n private nutrientStatisticService: ApNutrientStatisticService,\n private baseFertilizationCommonService: BaseFertilizationCommonService,\n private fertilizerService: FertilizerService,\n private roundNumericPipe: GetRoundNumericPipe,\n private fieldArchiveStore: FieldArchiveStore,\n private mapViewStore: MapViewStore,\n private translationService: ApTranslationService) {\n }\n\n public ngOnInit(): void {\n this.statisticStore.removeStatisticData();\n this.fieldStore.changeSelectedField([]);\n this.columns$ = this._getColumns();\n this.pager = this._getPager();\n this.items$ = this._getItems();\n this.loading$ = combineLatest([\n this.fieldStore.Listen(s => s.loading),\n this.languageStore.Listen(s => s.loading),\n this.settingsStore.Listen(s => s.loading),\n this.basicFertilisationSummariesStore.Listen(s => s.loading),\n this.cropRotationStore.HistoryLoading$\n ]).pipe(\n map(loadingItems => loadingItems.some(x => x))\n );\n }\n\n public ngAfterContentInit(): void {\n this._subscriptions.push(this.campaignYearStore.Listen(s => s.selectedYear).pipe(skip(1)).subscribe(() => {\n this.basicFertilisationSummariesStore.loadBasicFertilisationSummaries();\n }));\n this._subscriptions.push(this.dynComponent.SelectedItems$.subscribe(_ => this._selectionChange()));\n this._subscriptions.push(this.formStore.FormClose$.subscribe(() => {\n // trigger refresh of selection and map after entryComponent (e.g. 'NEW') closed\n if (this._isOnCreatePressed) {\n this._isOnCreatePressed = false;\n setTimeout(() => this._selectionChange(), 1);\n this._handleLegendsAndLayers(this.dynComponent.getSelectedItems().length);\n }\n }));\n this._subscriptions.push(this.mapStore.Layers.OnLayerChange.subscribe(() => {\n this._handleLegendsAndLayers(this.dynComponent.getSelectedItems().length);\n }));\n this._subscriptions.push(this._statisticUpdateRequested.pipe(\n debounceTime(100)).subscribe(_ => this._generateStats()));\n this._subscriptions.push(this.items$.subscribe(_ => this._statisticUpdateRequested.emit()));\n this._subscriptions.push(\n combineLatest([\n this.mapViewStore.Listen(s => s.mode),\n this.mapViewStore.Listen(s => s.currentMenu)\n ]).subscribe(([mapMode, mapMenu]) => {\n if (mapMode !== MapViewMode.HIDE && mapMenu === MapViewCurrentMenu.STATS) {\n this._statisticUpdateRequested.emit();\n }\n }\n ));\n }\n\n public ngOnDestroy(): void {\n this.baseFertilizationCommonService.revertLegends();\n this._subscriptions.forEach(s => s?.unsubscribe());\n this.statisticStore.removeStatisticData();\n this.fieldStore.changeSelectedField([]);\n }\n\n public onCreate(): void {\n this.statisticStore.removeStatisticData();\n this.formStore.openForm({\n component: ApNutrientPlanningComponent,\n data: {\n Summary: null,\n Type: PlanningEntryComponentDataType.Create\n }\n });\n this._isOnCreatePressed = true;\n }\n\n private _selectionChange(): void {\n if (!this.dynComponent?.dynGrid?.gridPaging) {\n return;\n }\n const selectedSummaries = this.dynComponent.dynGrid.gridPaging.selectedItems;\n if (selectedSummaries && selectedSummaries.length > 0) {\n this.baseFertilizationCommonService.onSelectionChange(selectedSummaries[0]['SourceItem'] as IBasicFertilisationSummaries, true);\n } else {\n this.baseFertilizationCommonService.onSelectionChange(null, true);\n }\n this._statisticUpdateRequested.emit();\n }\n\n private _getColumns(): Observable<ApDynGridColumnConfigBase[]> {\n const gridPopupOptions = [\n {\n text: 'Global__Show',\n callback: ApUtilService.createEventEmitter(this._onOneShow.bind(this), this._subscriptions)\n },\n {\n text: 'Global__Reset',\n callback: ApUtilService.createEventEmitter(this._onOneReset.bind(this), this._subscriptions)\n },\n ];\n\n if (ApRoleTypeService.hasAgriconRole(this.loginStore.User)) {\n gridPopupOptions.Add({\n text: 'Global__Download',\n callback: ApUtilService.createEventEmitter(this._onDownloadPackage.bind(this), this._subscriptions)\n });\n }\n\n return combineLatest([\n this.languageStore.Listen(s => s.selectedLanguage),\n this.settingsStore.Listen(s => s.data),\n ]).pipe(\n filter(([language, settings]) => !!language && !!settings[0]),\n map(([language, settings]) => ({language, setting: settings[0]})),\n map((_) => [\n new ApDynGridStatusColumnConfig({\n field: 'Status',\n class: 'StatusClass',\n description: 'StatusDesc',\n filterable: true\n }),\n new ApDynGridPropertyColumnConfig({\n field: 'ApplicationDate',\n title: 'Nutrients__FertilizationDate',\n tooltip: (dataItem) => dataItem['ApplicationDateTooltip'],\n dynCssClass: (dataItem) => dataItem['ApplicationDateItalic'] ? ' italic' : '',\n hide: true,\n width: 80,\n filterable: true,\n sortIndex: 1,\n sortDesc: true,\n format: this.languageStore.CurrentDateFormat\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Global__Product',\n field: 'Product',\n width: 100,\n filterable: true,\n tooltip: (dataItem) => dataItem['ProductTooltip']\n }),\n new ApDynGridGroupColumnConfig({\n title: `${this.translationStore.FindTranslationForSelectedLanguage('Nutrients__Average_Amount_Goods')} / ${this.translationStore.FindTranslationForSelectedLanguage('Global__Remaining_Need_Two_Short')}`,\n headerStyle: {'text-align': 'center'},\n groupColumns: [\n new ApDynGridPropertyColumnConfig({\n field: 'Amount',\n width: 60,\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n field: 'AmountUnit',\n width: 40\n })\n ]\n }),\n new ApDynGridPropertyColumnConfig({\n field: 'Count',\n title: 'Global__Amount',\n width: 60,\n filterable: true,\n tooltip: (dataItem) => dataItem?.FieldsTooltip,\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n }),\n new ApDynGridPropertyColumnConfig({\n field: 'Area',\n title: 'Global__Area_Unit',\n width: 60,\n headerFilterable: true,\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n tooltip: (dataItem) => dataItem['AreaOriginal'],\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [this.settingsStore.FirstSetting.DigitsAfterDecimalPoint]\n }]\n }),\n new ApDynGridGroupColumnConfig({\n title: this.translationStore.FindTranslationForSelectedLanguage('Global__Sum_Goods'),\n headerStyle: {'text-align': 'center'},\n hide: true,\n groupColumns: [\n new ApDynGridPropertyColumnConfig({\n field: 'Sum',\n hide: true,\n width: 60,\n tooltip: (dataItem) => dataItem['SumTooltip'],\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n field: 'SumUnit',\n width: 60,\n hide: true\n })\n ]\n }),\n new ApDynGridPropertyColumnConfig({\n field: 'LeadNutrient',\n title: 'AgriConnect__Nutrient',\n width: 80,\n filterable: true\n }),\n new ApDynGridGroupColumnConfig({\n title: 'Global__Average_Symbol_Nutrient_kg_ha',\n groupColumns: [\n new ApDynGridPropertyColumnConfig({\n title: this.elementService.GetElementStringByString(ApElementType.P),\n field: 'P',\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n width: 60,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0, GetRoundNumericPipeConfig.NullAndZeroToEmptyReplaceConfig]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n title: this.elementService.GetElementStringByString(ApElementType.K),\n field: 'K',\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n width: 60,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0, GetRoundNumericPipeConfig.NullAndZeroToEmptyReplaceConfig]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n title: this.elementService.GetElementStringByString(ApElementType.Mg),\n field: 'Mg',\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n width: 60,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0, GetRoundNumericPipeConfig.NullAndZeroToEmptyReplaceConfig]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Nutrients__CaO',\n field: 'CaO',\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n width: 60,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0, GetRoundNumericPipeConfig.NullAndZeroToEmptyReplaceConfig]\n }]\n }),\n ]\n }),\n new ApDynGridGroupColumnConfig({\n title: 'Global__Good_ha',\n hide: true,\n groupColumns: [\n new ApDynGridPropertyColumnConfig({\n title: 'Min',\n field: 'Min',\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n width: 60,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0]\n }]\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Max',\n field: 'Max',\n cssClass: 'right',\n filterType: FilterType.NUMBER,\n width: 60,\n pipes: [{\n pipe: this.roundNumericPipe,\n args: [0]\n }]\n }),\n ]\n }),\n new ApDynGridPropertyColumnConfig({\n title: 'Global__Note',\n field: 'Note',\n hide: true,\n cssClass: 'left',\n width: 100\n }),\n new ApDynGridEditColumnConfig({\n data: gridPopupOptions\n })\n ]));\n }\n\n private _getItems(): Observable<any> {\n return combineLatest([\n this.basicFertilisationSummariesStore.Summaries$,\n this.fieldStore.Listen(s => s.data),\n this.cropRotationStore.GetHistory$,\n this.fieldArchiveStore.Listen(s => s.loaded)\n ]).pipe(\n filter(([summaries, fields, cropRotationHistory, fieldArchiveLoaded]) => {\n return !!summaries && !!fields && !!cropRotationHistory && fieldArchiveLoaded;\n }),\n map(([summaries]) => {\n return summaries.filter(_ => !!_.BasicFertilisationPlanBooks.Find(x => x.BookedBy != null)).map((summary) => {\n const area = this.nutrientManagementService.getArea(summary, true);\n const sum = this.nutrientManagementService.getCalculateSumFertilizer(summary, true);\n const productTooltip = this.tooltipContentService.getProductContentInfoTooltip(this._getProductId(summary));\n const fertilizer = this.fertilizerStore.getFertilizer(this._getProductId(summary));\n const fertilizerUnit = this.fertilizerService.getFertilizerUnit(fertilizer);\n const sumTooltip = this.roundNumericPipe.transform(sum, this.settingsStore.FirstSetting.DigitsAfterDecimalPoint) + ' ' + fertilizerUnit;\n const bandIdX0 = this.nutrientStatisticService.getAverageNutrientFromStatistics(0, summary, true);\n const bandIdX1 = this.nutrientStatisticService.getAverageNutrientFromStatistics(1, summary, true);\n const bandIdX2 = this.nutrientStatisticService.getAverageNutrientFromStatistics(2, summary, true);\n const bandIdX3 = this.nutrientStatisticService.getAverageNutrientFromStatistics(3, summary, true);\n const planBookApplicationDates = this.baseFertilizationCommonService.getApplicationDatesData(summary.BasicFertilisationPlanBooks, true);\n return {\n Id: summary.Id,\n SourceItem: summary,\n Status: this.nutrientService.getFertilizerStatus(summary.User_Appl_Mode, true)?.state,\n StatusClass: this.nutrientService.getFertilizerStatus(summary.User_Appl_Mode, true)?.class,\n StatusDesc: this.nutrientService.getFertilizerStatusDescription(summary.User_Appl_Mode, true),\n Count: this.baseFertilizationCommonService.getPlanBooksFieldsCount(summary.BasicFertilisationPlanBooks, true),\n Area: area,\n Product: this.fertilizerService.getFertilizerProductName(fertilizer),\n ProductTooltip: productTooltip,\n ApplicationDate: planBookApplicationDates.NewestDate,\n ApplicationDateTooltip: planBookApplicationDates.Tooltip,\n ApplicationDateItalic: planBookApplicationDates.IsMoreThanOneUniqDate,\n Note: summary.Title,\n Amount: summary.User_Appl_Rate,\n AmountUnit: summary.User_Appl_Unit?.Id === 1\n ? this.fertilizerService.getFertilizerUnit(fertilizer, true)\n : this.translationStore.FindTranslationForSelectedLanguage(summary.User_Appl_Unit?.Key),\n Sum: sum,\n SumUnit: fertilizerUnit,\n SumTooltip: sumTooltip,\n LeadNutrient: this.baseFertilizationCommonService.getLeadNutrient(summary),\n OperationMode: this.operationModeService.GetOperationMode(summary.User_Operation_Mode),\n BookDate: this.dateService.getDateMidnight(summary.BasicFertilisationPlanBooks.FindLast(x => x.BookedBy != null).BookedAt),\n P: this.elementService.CalculateElementOxidValueByGivenElementValue(bandIdX0, ApElementOxydTypeEnum.P),\n K: this.elementService.CalculateElementOxidValueByGivenElementValue(bandIdX1, ApElementOxydTypeEnum.K),\n Mg: this.elementService.CalculateElementOxidValueByGivenElementValue(bandIdX2, ApElementOxydTypeEnum.Mg),\n CaO: bandIdX3,\n Min: this.nutrientManagementService.getMin(summary, true),\n Max: this.nutrientManagementService.getMax(summary, true),\n Statistic: summary.Statistic,\n PlanNumber: summary.PlanNumber,\n FieldsTooltip: this.baseFertilizationCommonService.getFieldCropsTooltip(summary.BasicFertilisationPlanBooks, true)\n };\n });\n })\n );\n }\n\n private _getPager(): ApDynGridPagerConfig {\n const pagerOptions = [\n {\n text: 'Global__Planing_Reset',\n callback: ApUtilService.createEventEmitter(this._onReset.bind(this), this._subscriptions)\n }\n ];\n const iconOptions = [\n {\n icon: Icon.PDF,\n callback: ApUtilService.createEventEmitter(this._onPdf.bind(this), this._subscriptions),\n tooltip: 'Global__Save_PDF'\n },\n {\n icon: Icon.XLS,\n callback: ApUtilService.createEventEmitter(this._onXls.bind(this), this._subscriptions),\n tooltip: 'Global__Save_EXCEL'\n }\n ];\n return PagerBuilder.NutrientManagementPager(pagerOptions, iconOptions);\n }\n\n private _getProductId(summary: IBasicFertilisationSummaries): number | null {\n return summary.BasicFertilisationPlanBooks[0]?.Product_Id;\n }\n\n private _handleLegendsAndLayers(selectedItems: number): void {\n this.baseFertilizationCommonService.handleLegends(selectedItems ?? 0);\n // in order to show the geometry of the planning we reuse the taskmanagement layer\n this.mapStore.Layers.TaskManagementLayer.Visibility = this.mapStore.Layers.NutrientPlanningLayer?.Visibility;\n }\n\n private _onDownloadPackage(dataItem: any): void {\n const summary = dataItem['SourceItem'] as IBasicFertilisationSummaries;\n this.nutrientStore.createNutrientPlanningPackage(summary.Id);\n }\n\n private _onXls(): void {\n this.dynComponent.dynGrid.xlsExportFileName = this.generatePrintFilename();\n this.dynComponent.dynGrid.exportAsXls();\n }\n\n private _onPdf(): void {\n this.dynComponent.dynGrid.pdfExportFileName = this.generatePrintFilename();\n this.dynComponent.dynGrid.exportAsPdf();\n }\n\n private generatePrintFilename(): string {\n return this.dateService.toFarmDate(new Date()).format('YYYY-MM-DD') + '_' +\n this.translationStore.FindTranslationForSelectedLanguage('Global__Plannings');\n }\n\n private _onReset(dataItem: any): void {\n if (dataItem.items === null || dataItem.items === undefined) {\n return;\n }\n this._onOneReset(dataItem.items[0]);\n }\n\n private _onOneShow(dataItem: any): void {\n this.dynComponent.dynGrid.gridPaging.setSelectedKeys([dataItem.Id]);\n this.baseFertilizationCommonService.redirectSummaryToShowView(dataItem.Id, true, 'nutrients/booking');\n }\n\n private _onOneReset(dataItem: any): void {\n this.dynComponent.dynGrid.gridPaging.setSelectedKeys([dataItem.Id]);\n this.baseFertilizationCommonService.unbookPlanBooks(dataItem.SourceItem, dataItem.Field?.Id);\n }\n\n /**\n * Generates the statistic charts for the selected planbooks.\n * Grouped by product (=series)\n * Grouped by Month/Year (=category/y-axis)\n * @private\n */\n private _generateStats(): void {\n if (this.mapViewStore.getMapViewCurrentMenu() !== MapViewCurrentMenu.STATS || this.mapViewStore.getMapViewMode() === MapViewMode.HIDE) {\n return;\n }\n const title = `${this.translationService.translate('Global__Bookings')}`;\n let items = this.dynComponent.getSelectedItems() as any[];\n if (!items || items?.length === 0) {\n items = this.dynComponent.items as any[];\n }\n if (!items || items?.length === 0) {\n this.statisticStore.setStatisticData<GenericChartConfig>(\n [], ApStatsType.GenericBars, title, title\n );\n return;\n }\n\n const chartConfigs: GenericChartConfig[] = [];\n let planBooks = items?.map(item => item?.SourceItem.BasicFertilisationPlanBooks).flat() as IBasicFertilisationPlanBooks[];\n planBooks = planBooks?.filter(pB => pB?.BookedAt != null && pB.DeletedAt == null);\n\n const chartConfig = this.baseFertilizationCommonService.generateStatChartConfig(planBooks);\n chartConfigs.push(chartConfig);\n\n this.statisticStore.setStatisticData<GenericChartConfig>(\n chartConfigs, ApStatsType.GenericChart, title, title\n );\n }\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {ApNutrientManagementRoutes} from './ap-nutrient-management.routes';\nimport {\n BodyModule,\n ExcelModule,\n GridModule,\n GroupModule,\n HeaderModule,\n PagerModule,\n PDFModule,\n SharedModule\n} from '@progress/kendo-angular-grid';\nimport {ApCoreModule} from '../ap-core/ap-core.module';\nimport {ApIconModule} from '../icons/ap-icon.module';\nimport {ButtonModule} from '@progress/kendo-angular-buttons';\nimport {ApTranslationModule} from '../translation/ap-translation.module';\nimport {ApSoilSamplePlanningOverviewComponent} from './components/ap-soilsampleplanning-overview.component';\nimport {ApNutrientDistributionComponent} from './components/ap-nutrient-distribution.component';\nimport {ApUtilsModule} from '../ap-utils';\nimport {PDFExportModule} from '@progress/kendo-angular-pdf-export';\nimport {ApTooltipModule} from '../ap-tooltip/ap-tooltip.module';\nimport {ApResponsiveTextModule} from '../ap-responsive-text/ap-responsive-text.module';\nimport {ApSectionHeaderModule} from '../ap-section-header/ap-section-header.module';\nimport {ApDynComponentModule} from '../ap-dyncomponent/ap-dyncomponent.module';\nimport {ApNutrientManagementOverviewComponent} from './components/ap-nutrient-management-overview.component';\nimport {ApNutrientPNeedComponent} from './components/ap-nutrient-p-need.component';\nimport {ApNutrientManagementPlanningComponent} from './components/ap-nutrient-management-planning.component';\nimport {ApNutrientManagementBookingComponent} from './components/ap-nutrient-management-booking.component';\nimport {ApPermissionModule} from '../ap-permission/ap-permission.module';\nimport {ApGetCropTypeNamePipe} from './pipes/ap-get-croptype-name.pipe';\n\n@NgModule({\n declarations: [\n ApSoilSamplePlanningOverviewComponent,\n ApNutrientDistributionComponent,\n ApNutrientManagementOverviewComponent,\n ApNutrientPNeedComponent,\n ApNutrientManagementPlanningComponent,\n ApNutrientManagementBookingComponent,\n ApGetCropTypeNamePipe\n ],\n imports: [\n CommonModule,\n GridModule,\n ApCoreModule,\n ApIconModule,\n ApNutrientManagementRoutes,\n ApTranslationModule,\n ApUtilsModule,\n ButtonModule,\n PDFModule,\n PagerModule,\n BodyModule,\n HeaderModule,\n SharedModule,\n ExcelModule,\n PDFExportModule,\n ApTooltipModule,\n ApResponsiveTextModule,\n ApSectionHeaderModule,\n GroupModule,\n ApDynComponentModule,\n ApPermissionModule\n ],\n exports: [ApGetCropTypeNamePipe],\n providers: [ApGetCropTypeNamePipe]\n})\nexport class ApNutrientManagementModule {\n}\n","import {Injectable} from '@angular/core';\nimport {CampaignYearStore} from '../../stores/login/campaignyear.store';\nimport ISoilSampleField = Data.Nutrients.ISoilSampleField;\n\n@Injectable({providedIn: 'root'})\nexport class ApSoilSampleService {\n constructor(private campaignYearStore: CampaignYearStore) {\n }\n\n public getFieldNumberAndSubNumber(soilSampleField: ISoilSampleField): string {\n if (soilSampleField.FieldNumber !== null) {\n if (soilSampleField.FieldPart !== null) {\n return `${soilSampleField.FieldNumber} - ${soilSampleField.FieldPart}`;\n } else {\n return `${soilSampleField.FieldNumber}`;\n }\n } else {\n if (soilSampleField.FieldPart !== null) {\n return ` - ${soilSampleField.FieldPart}`;\n } else {\n return '';\n }\n }\n }\n\n public getStatus(sampleDate: Date | string): number {\n if (!sampleDate) {\n return -1;\n }\n if (typeof sampleDate === typeof '') {\n sampleDate = new Date(sampleDate as string);\n }\n const difference = this.campaignYearStore.getSelectedCampaignYear().Year - this.getCampaignYear(sampleDate as Date);\n if (difference > 5) {\n return -1;\n } else if (difference > 3) {\n return 0;\n }\n return 1;\n }\n\n public getCampaignYear(sampleDate: Date): number {\n if (!sampleDate) {\n return undefined;\n }\n if (sampleDate.getMonth() > 5) {\n return sampleDate.getFullYear() + 1;\n }\n return sampleDate.getFullYear();\n }\n}\n","import {Injectable} from '@angular/core';\nimport {ApStatsType, IBarLineAreaChartData, IBarLineAreaChartDataValue} from '../../ap-interface';\nimport {Create} from 'ts-tooling';\nimport {ChartSetValueType, IChartSet, StatisticStore} from '../../stores/statistic/statistic.store';\nimport {\n TranslationStore\n} from '../../stores/translation/translation.store';\nimport {SettingsStore} from '../../stores/base-data/settings.store';\nimport {ApDateService} from '../../ap-core/services/ap-date-service';\nimport {LandUseStore} from '../../stores/base-data/landuse.store';\nimport {\n FieldNutrientDistributionStore\n} from '../../stores/nutrients/field-nutrient-distributions.store';\nimport {\n SoilGroupFormatService\n} from '../../ap-utils/service/soil-group-format.service';\nimport {\n GetSoilSampleClassColorService\n} from '../../ap-utils/service/get-soil-sample-class-color.service';\nimport {GetSoilSampleClassNamePipe} from '../../ap-utils';\nimport IGuid = System.IGuid;\nimport IHistogram = Data.Nutrients.IHistogram;\n\nexport interface IFieldStatisticHistogramData {\n Status: number;\n FieldId: IGuid;\n FieldName: string;\n AreaHa: number;\n Histograms: IHistogram[];\n}\n\n@Injectable({providedIn: 'root'})\nexport class FieldStatisticHistogramService {\n constructor(private settings: SettingsStore,\n private landUseStore: LandUseStore,\n private statisticStore: StatisticStore,\n private translationStore: TranslationStore,\n private fieldNutrientDistributionStore: FieldNutrientDistributionStore,\n private dateService: ApDateService,\n private soilGroupFormatService: SoilGroupFormatService,\n private soilSampleClassColorService: GetSoilSampleClassColorService,\n private soilSampleClassNamePipe: GetSoilSampleClassNamePipe) {\n }\n\n public generateHistogramStatistic(title: string, items: IFieldStatisticHistogramData[]): void {\n if (!items || items.length <= 0) {\n this.statisticStore.setStatisticData([], ApStatsType.Nutrients, '', title);\n return;\n }\n\n this.statisticStore.setStatisticData(this.getHistogramStatistic(items), ApStatsType.Nutrients, title, 'Nutrient__Select_SoilSampleField');\n }\n\n public getHistogramStatistic(items: IFieldStatisticHistogramData[]): IChartSet<IBarLineAreaChartData>[] {\n if (!items || items.length <= 0) {\n return [];\n }\n\n const areaSum = items.Reduce((target, e) => Create(e.AreaHa, 0) + target, 0);\n return [\n ...this._createStatistic('Nutrient__Band_ClassP', ChartSetValueType.CLASS, areaSum, items),\n ...this._createStatistic('Nutrient__Band_ClassK', ChartSetValueType.CLASS, areaSum, items),\n ...this._createStatistic('Nutrient__Band_ClassMg', ChartSetValueType.CLASS, areaSum, items),\n ...this._createStatistic('Nutrient__Band_ClassPh', ChartSetValueType.CLASS, areaSum, items),\n ...this._createStatistic('Nutrient__Band_SoilPlanningYear', ChartSetValueType.DATE, areaSum, items),\n ...this._createStatistic('Nutrient__Band_SoilGroup', ChartSetValueType.SOIL_GROUP, areaSum, items),\n ...this._createStatistic('Nutrient__Band_Region', ChartSetValueType.REGION, areaSum, items),\n ...this._createStatistic('Nutrient__Band_TypeOfUse', ChartSetValueType.LANDUSE, areaSum, items),\n ...this._createStatistic('Nutrient__Band_MethodP', ChartSetValueType.METHOD, areaSum, items),\n ...this._createStatistic('Nutrient__Band_MethodK', ChartSetValueType.METHOD, areaSum, items),\n ...this._createStatistic('Nutrient__Band_MethodMg', ChartSetValueType.METHOD, areaSum, items),\n ...this._createStatistic('Nutrient__Band_MethodPh', ChartSetValueType.METHOD, areaSum, items),\n ];\n }\n\n private _createStatistic(name: string, type: ChartSetValueType, areaSum: number, selected: IFieldStatisticHistogramData[]): IChartSet<IBarLineAreaChartData>[] {\n if (!selected || !selected.Any()) {\n return [];\n }\n let soilPlanningYears: { date: number, category: number }[] = [];\n let fieldSoilPlanningYears: { fieldId: IGuid, dates: { date: string, percent: number }[] }[] = [];\n if (type === ChartSetValueType.DATE) {\n soilPlanningYears = selected.Reduce((target, e) => {\n const hist = e.Histograms.Find(el => el.Key === name);\n if (!hist) {\n return target;\n }\n for (const val of hist.Values) {\n if (target.Any(el => el.category === e.Status && el.date === val)) {\n continue;\n }\n target.Add({category: e.Status, date: val});\n }\n return target;\n }, [] as { date: number, category: number }[]);\n fieldSoilPlanningYears = selected.Reduce((target, e) => {\n const hist = e.Histograms.Find(el => el.Key === name);\n if (!hist) {\n return target;\n }\n for (const key in hist.Values) {\n if (!hist.Values.hasOwnProperty(key)) {\n continue;\n }\n const year = hist.Values[key];\n const cells = hist.Counters[key];\n const dateName = this._mapDate(year);\n const found = target.FindIndex(t => t.fieldId === e.FieldId);\n if (found < 0) {\n target.Add({\n fieldId: e.FieldId,\n dates: [\n {\n date: dateName,\n percent: cells,\n },\n ],\n });\n continue;\n }\n if (!target[found].dates.Any(d => d.date === dateName)) {\n target[found].dates.Add({\n date: dateName,\n percent: cells,\n });\n }\n }\n return target;\n }, [] as { fieldId: IGuid, dates: { date: string, percent: number }[] }[]);\n for (const item of fieldSoilPlanningYears) {\n const allCells = item.dates.map(el => el.percent).Sum();\n for (const date of item.dates) {\n date.percent = date.percent * 100 / allCells;\n }\n }\n }\n let max = 0;\n if (type === ChartSetValueType.CLASS) {\n max = selected.Reduce((target, e) => {\n const counters = e.Histograms.Find(el => el.Key === name).Counters;\n for (const key in counters) {\n if (!counters.hasOwnProperty(key)) {\n continue;\n }\n if (counters[key] > 0 && counters.Sum() > 0) {\n const tmp = counters[key] / counters.Sum();\n target[key] += tmp * e.AreaHa;\n }\n }\n return target;\n }, new Array(selected[0].Histograms.Find(el => el.Key === name).Counters.length).fill(0))\n .Max();\n max = max + (20 * max / 100);\n }\n const res: IChartSet<IBarLineAreaChartData>[] = [];\n for (const dis of selected) {\n const hist = dis.Histograms.Find(e => e.Key === name);\n if (!hist) {\n continue;\n }\n res.Add({\n valueType: type,\n axes: this.soilSampleClassColorService.getStatisticAxesConfig(type, undefined, max),\n step: 1,\n data: {\n title: name,\n name,\n categories: hist.Values.Convert((e: any) => {\n switch (type) {\n case ChartSetValueType.CLASS:\n return this.soilSampleClassNamePipe.transform(e);\n case ChartSetValueType.REGION:\n return this._mapSampleRegion(e);\n case ChartSetValueType.METHOD:\n return this._mapSampleMethods(e);\n case ChartSetValueType.SOIL_GROUP:\n return this.soilGroupFormatService.mapSingle(e);\n case ChartSetValueType.LANDUSE:\n return this._mapLanduse(e);\n case ChartSetValueType.DATE:\n return dis.Status;\n default:\n return e.toString();\n }\n }),\n data: hist.Counters.Convert((e: any) => {\n switch (type) {\n case ChartSetValueType.CLASS:\n return {\n value: dis && e > 0 ?\n e / hist.Counters.Sum() * Create(dis.AreaHa, 0) :\n 0,\n } as IBarLineAreaChartDataValue;\n default:\n return {\n value: e,\n } as IBarLineAreaChartDataValue;\n }\n }),\n },\n decimalPlaces: this.settings.FirstSetting.DigitsAfterDecimalPoint,\n color: (p) => {\n switch (type) {\n case ChartSetValueType.CLASS:\n return this.soilSampleClassColorService.getColor(p.category);\n case ChartSetValueType.DATE:\n switch (p) {\n case -1:\n return '#980000';\n case 0:\n return '#fdce3e';\n case 1:\n return '#5ec232';\n default:\n return undefined;\n }\n case ChartSetValueType.SOIL_GROUP:\n return this.soilGroupFormatService.colorCode(p);\n default:\n return undefined;\n }\n },\n meta: {\n fieldId: dis.FieldId,\n years: soilPlanningYears.map(item => {\n return {category: item.category, date: this._mapDate(item.date)};\n }),\n // die fieldSoilPlanningYears werden nur 1x ausgelesen → nur 1x im Statistik objekt halten\n // Objekt kann sonst sehr groß werden\n fieldYears: res.length === 0 ? fieldSoilPlanningYears : undefined,\n areaSum,\n }\n });\n }\n return res;\n }\n\n private _mapSampleMethods(value: number): string {\n const method = this.fieldNutrientDistributionStore.SampleMethods.Find(e => e.Id === value);\n if (!method) {\n return value.toString();\n }\n return this.translationStore.FindTranslationForSelectedLanguage(method.Method);\n }\n\n private _mapSampleRegion(value: number): string {\n const region = this.fieldNutrientDistributionStore.SampleRegions.Find(e => e.Id === value);\n if (!region) {\n return value.toString();\n }\n return this.translationStore.FindTranslationForSelectedLanguage(region.Region);\n }\n\n private _mapLanduse(value: number): string {\n const landuse = this.landUseStore.LandUse.Find(e => e.Id === value);\n if (!landuse) {\n return value.toString();\n }\n return this.translationStore.FindTranslationForSelectedLanguage(landuse.Key);\n }\n\n private _mapDate(value: number): string {\n return this.dateService.toFarmDate(new Date(parseInt(value.toString() + '000', 10))).format('YYYY');\n }\n}\n"],"sourceRoot":"webpack:///","file":"739.25138cd6faae51c1.js"}