{"version":3,"sources":["../../wwwroot/app/spaces/planograms/components/planogramShelf.js","../../wwwroot/app/spaces/planograms/components/planogramPeg.controller.js","../../wwwroot/app/spaces/planograms/components/photoAudit.component.js","../../wwwroot/app/spaces/planograms/components/containerPlanogram.js","js/app.js","../../wwwroot/app/index.module.js","../../wwwroot/app/spaces/planogram/print/planogram-print-way-direction.component.js","../../wwwroot/app/spaces/planogram/print/planogram-print-stores.component.js","../../wwwroot/app/spaces/planogram/print/planogram-print-page.component.js","../../wwwroot/app/spaces/planogram/print/planogram-print-header.component.js","../../wwwroot/app/spaces/planogram/print/planogram-print-footer.component.js","../../wwwroot/app/spaces/planogram/dnd/droppable.directive.js","../../wwwroot/app/spaces/planogram/dnd/draggable.directive.js","../../wwwroot/app/spaces/planogram/dnd/drag-scroll.directive.js","../../wwwroot/app/spaces/planogram/dnd/dnd.service.js","../../wwwroot/app/shared_logic/services/security/tokensManagerService.js","../../wwwroot/app/shared_logic/services/security/ngAuthSettings.js","../../wwwroot/app/shared_logic/services/security/authService.js","../../wwwroot/app/shared_logic/services/security/authInterceptorService.js","../../wwwroot/app/shared_logic/services/helpers/server.service.js","../../wwwroot/app/shared_logic/services/helpers/http.service.js","../../wwwroot/app/shared_logic/services/helpers/error.service.js","../../wwwroot/app/shared_logic/components/suggestions/suggestions.js","../../wwwroot/app/shared_logic/components/priceMap/priceMap.js","../../wwwroot/app/shared_logic/components/priceEvolutionReport/priceEvolutionReport.js","../../wwwroot/app/shared_logic/components/priceEvolution/priceEvolution.js","../../wwwroot/app/shared_logic/components/notifications/notifications.js","../../wwwroot/app/shared_logic/components/marginsAndCosts/marginsAndCosts.js","../../wwwroot/app/shared_logic/components/listStoreComponent/listStore.js","../../wwwroot/app/shared_logic/components/kpiItemViewDefault/kpiItemviewDefault.js","../../wwwroot/app/shared_logic/components/kpiItemView/kpiItemview.js","../../wwwroot/app/shared_logic/components/displayPhoto/displayPhoto.js","../../wwwroot/app/shared_logic/components/competitorsLookup/competitorsLookup.js","../../wwwroot/app/shared_logic/components/choosePriceListsForCategories/choosePriceListsForCategories.js","../../wwwroot/app/shared_logic/components/chooseClustersForCategories/chooseClustersForCategories.js","../../wwwroot/app/shared_logic/components/chartComponent/chart.js","../../wwwroot/app/shared_logic/components/categoryLookup/categoryLookup.js","../../wwwroot/app/spaces/planograms/editPlanogram.controller.js","../../wwwroot/app/shared_logic/components/auditTrial/auditTrial.js","../../wwwroot/app/prices/decisions/redesign/decisions.controller.js","../../wwwroot/app/admin/security/users/users.controller.js","../../wwwroot/app/admin/security/roles/roles.controller.js","../../wwwroot/app/admin/security/reports/reports.controller.js","../../wwwroot/app/admin/security/audit/audit.controller.js","../../wwwroot/app/admin/reports/itemsToIgnore/itemsToIgnore.controller.js","../../wwwroot/app/admin/masters/stores/stores.controller.js","../../wwwroot/app/admin/masters/stores/editStores.controller.js","../../wwwroot/app/admin/masters/managementItems/managementItems.controller.js","../../wwwroot/app/admin/masters/items/items.controller.js","../../wwwroot/app/admin/masters/items/editItem.controller.js","../../wwwroot/app/admin/masters/cluster/cluster.controller.js","../../wwwroot/app/admin/masters/brands/brands.controller.js","../../wwwroot/app/spaces/ticketsTypes/ticketsTypes.controller.js","../../wwwroot/app/spaces/ticketsTypes/editTicketsTypes.controller.js","../../wwwroot/app/spaces/tickets/tickets.controller.js","../../wwwroot/app/spaces/reports/itemsByAssortment.controller.js","../../wwwroot/app/spaces/reports/generalKpis.controller.js","../../wwwroot/app/spaces/planograms/planograms.controller.js","../../wwwroot/app/spaces/planograms/createPlanogram.controller.js","../../wwwroot/app/spaces/planogram/svg.service.js","../../wwwroot/app/spaces/planogram/planogram.component.js","../../wwwroot/app/spaces/planogram/planogram-module-shelf.component.js","../../wwwroot/app/spaces/planogram/planogram-module-peg.component.js","../../wwwroot/app/spaces/planogram/planogram-level-shelf.component.js","../../wwwroot/app/spaces/planogram/planogram-level-peg.component.js","../../wwwroot/app/spaces/planogram/planogram-item-group2.component.js","../../wwwroot/app/spaces/layouts/addLevel.component.js","../../wwwroot/app/spaces/planogram/planogram-helper.service.js","../../wwwroot/app/spaces/planogram/planogram-column.component.js","../../wwwroot/app/spaces/planogram/image.service.js","../../wwwroot/app/spaces/planogram/ian-hold.directive.js","../../wwwroot/app/spaces/layouts/layouts.controller.js","../../wwwroot/app/spaces/layouts/editLayout.controller.js","../../wwwroot/app/shared_logic/services/spaces.service.js","../../wwwroot/app/shared_logic/services/queue-service.js","../../wwwroot/app/shared_logic/services/promotions.service.js","../../wwwroot/app/shared_logic/services/prices.service.js","../../wwwroot/app/shared_logic/services/markdown.service.js","../../wwwroot/app/shared_logic/services/inventory.service.js","../../wwwroot/app/shared_logic/services/home.service.js","../../wwwroot/app/shared_logic/services/components.service.js","../../wwwroot/app/shared_logic/services/assortmetreport.service.js","../../wwwroot/app/shared_logic/services/assortment.service.js","../../wwwroot/app/shared_logic/services/admin.service.js","../../wwwroot/app/shared_logic/filters/percentage.filter.js","../../wwwroot/app/shared_logic/filters/abbreviate.filter.js","../../wwwroot/app/shared_logic/directives/ui-sref.directive.js","../../wwwroot/app/shared_logic/directives/sideNavigation.directive.js","../../wwwroot/app/shared_logic/directives/sectionTools.directive.js","../../wwwroot/app/shared_logic/directives/scriptLoad.directive.js","../../wwwroot/app/shared_logic/directives/myEnter.directive.js","../../wwwroot/app/shared_logic/directives/myCarousel.directive.js","../../wwwroot/app/shared_logic/directives/minimalizaSidebar.directive.js","../../wwwroot/app/shared_logic/directives/layoutPreview.directive.js","../../wwwroot/app/shared_logic/directives/ionRangeSlider.directive.js","../../wwwroot/app/shared_logic/directives/iboxTools.directive.js","../../wwwroot/app/shared_logic/directives/focusme.directive.js","../../wwwroot/app/shared_logic/directives/enter.directive.js","../../wwwroot/app/shared_logic/directives/countTo.directive.js","../../wwwroot/app/shared_logic/directives/convertToNumber.directive.js","../../wwwroot/app/shared_logic/directives/colored.directive.js","../../wwwroot/app/shared_logic/directives/bufferedScroll.directive.js","../../wwwroot/app/shared_logic/config/translations.js","../../wwwroot/app/shared_logic/config/stateGoNewTab.js","../../wwwroot/app/shared_logic/commonJS/ian.js","../../wwwroot/app/promotions/workflows/workflows.controller.js","../../wwwroot/app/promotions/workflows/editWorkflow.controller.js","../../wwwroot/app/promotions/supplying/supplying.controller.js","../../wwwroot/app/promotions/storeControlAndExhibition/storeControlAndExhibition.controller.js","../../wwwroot/app/promotions/rules/promotionRules.controller.js","../../wwwroot/app/promotions/rules/editPromotionRule.controller.js","../../wwwroot/app/promotions/reviewTradeAgreements/reviewTradeAgreements.controller.js","../../wwwroot/app/promotions/reports/reports.controller.js","../../wwwroot/app/promotions/promotions/promotionSearch.controller.js","../../wwwroot/app/promotions/promotions/promotions.controller.js","../../wwwroot/app/promotions/promotions/overlappingReport.controller.js","../../wwwroot/app/promotions/promotions/editPromotion.controller.js","../../wwwroot/app/promotions/promotions/editInternalPromotion.controller.js","../../wwwroot/app/promotions/promotions/calendar.controller.js","../../wwwroot/app/promotions/promotions/BIReport.controller.js","../../wwwroot/app/promotions/priceSurveys/priceSurveys.controller.js","../../wwwroot/app/promotions/prices/prices.controller.js","../../wwwroot/app/promotions/myTasks/myTasks.controller.js","../../wwwroot/app/promotions/mechanics/editMechanic.controller.js","../../wwwroot/app/promotions/layouts/layoutsAssignment.controller.js","../../wwwroot/app/promotions/layouts/layouts.controller.js","../../wwwroot/app/promotions/layouts/editLayout.controller.js","../../wwwroot/app/promotions/items/forecastImporter.controller.js","../../wwwroot/app/promotions/items/editItem.controller.js","../../wwwroot/app/promotions/controlPanel/controlPanel.controller.js","../../wwwroot/app/promotions/comunication/comunication.controller.js","../../wwwroot/app/promotions/campaigns/editCampaign.controller.js","../../wwwroot/app/promotions/campaigns/campaigns.controller.js","../../wwwroot/app/promotions/AssortmentActivation/AssortmentActivation.controller.js","../../wwwroot/app/promotions/addItemToLayout/addItemToLayout.controller.js","../../wwwroot/app/promotions/activation/activation.controller.js","../../wwwroot/app/prices/rulesCategory/rulesCategory.controller.js","../../wwwroot/app/prices/rules/rules.controller.js","../../wwwroot/app/prices/reports/volumeMeasurement.controller.js","../../wwwroot/app/prices/reports/priceWeeklyReport.controller.js","../../wwwroot/app/prices/reports/priceMapReport.controller.js","../../wwwroot/app/prices/reports/priceEvolutionReport.controller.js","../../wwwroot/app/prices/reports/priceCompetitiveReport.controller.js","../../wwwroot/app/prices/reports/priceCompetitivePositionReport.controller.js","../../wwwroot/app/prices/reports/priceChangesReport.controller.js","../../wwwroot/app/prices/reports/informedPricesReport.controller.js","../../wwwroot/app/prices/reports/dailyMarginReport.controller.js","../../wwwroot/app/prices/reports/competitorsPrices.controller.js","../../wwwroot/app/prices/reports/competitiveIndex.controller.js","../../wwwroot/app/prices/regions/regions.controller.js","../../wwwroot/app/prices/regions/editRegion.controller.js","../../wwwroot/app/prices/priceRoundings/priceRoundings.controller.js","../../wwwroot/app/prices/priceRoundings/editPriceRoundings.controller.js","../../wwwroot/app/prices/priceMap/priceMap.controller.js","../../wwwroot/app/prices/pricelistsSubsidies/pricelistsSubsidies.controller.js","../../wwwroot/app/prices/pricelistsSubsidies/editPricelistsSubsidies.controller.js","../../wwwroot/app/prices/pricelists/pricelists.controller.js","../../wwwroot/app/prices/pricelists/editPricelist.controller.js","../../wwwroot/app/prices/output/priceOutput.controller.js","../../wwwroot/app/prices/outputWS/priceOutputWS.controller.js","../../wwwroot/app/prices/itemSensitivities/itemSensitivities.controller.js","../../wwwroot/app/prices/itemSensitivities/editItemSensitivity.controller.js","../../wwwroot/app/prices/decisions/decisions.controller.js","../../wwwroot/app/prices/costs/editCost.controller.js","../../wwwroot/app/prices/costs/costs.controller.js","../../wwwroot/app/prices/competitors/competitors.controller.js","../../wwwroot/app/prices/categorySummary/categorySummary.controller.js","../../wwwroot/app/prices/abTestingReports/abTestingReports.controller..js","../../wwwroot/app/prices/abTestingIndex/abTestingIndex.controller.js","../../wwwroot/app/prices/abTesting/abTesting.controller.js","../../wwwroot/app/markdowns/rulesSelection/markdownRulesSelection.controller.js","../../wwwroot/app/markdowns/rulesCreation/markdownRulesCreation.controller.js","../../wwwroot/app/markdowns/rulesCategory/markdownRulesCategories.controller.js","../../wwwroot/app/markdowns/decisions/markdownDecisions.controller.js","../../wwwroot/app/markdowns/categorySummary/category-summary-markdowns.controller.js","../../wwwroot/app/markdowns/activation/markdownActivation.controller.js","../../wwwroot/app/inventory/stockAnalysis/stockAnalysis.controller.js","../../wwwroot/app/home/weather/weather.controller.js","../../wwwroot/app/home/pivot/pivot.controller.js","../../wwwroot/app/home/pivot/catColor.service.js","../../wwwroot/app/home/scorecard/scorecard.controller.js","../../wwwroot/app/home/notifications/notifications.controller.js","../../wwwroot/app/home/mapv2/mapv2.controller.js","../../wwwroot/app/home/marketBoard/marketBoard.controller.js","../../wwwroot/app/home/maps/maps.controller.js","../../wwwroot/app/home/itemDashboard/itemDashboard.controller.js","../../wwwroot/app/home/heatMap/heatMapMargin.controller.js","../../wwwroot/app/home/heatMap/heatMap.controller.js","../../wwwroot/app/home/goals/goals.controller.js","../../wwwroot/app/home/deviations/deviations.controller.js","../../wwwroot/app/home/dst/dst.controller.js","../../wwwroot/app/home/dashboardOil/dashboardOil.controller.js","../../wwwroot/app/home/dashboard/dashboard.controller.js","../../wwwroot/app/home/categoryTreeMap/categoryTreeMap.controller.js","../../wwwroot/app/home/categoryTreeMap/categoryTreeMap - Copy.controller.js","../../wwwroot/app/home/benchmarks/benchmarks.controller.js","../../wwwroot/app/home/bcgmatrix/bcgmatrix.controller.js","../../wwwroot/app/home/assortmentReport/assortmentReport.controller.js","../../wwwroot/app/assortment/summaryReport/summaryReport.controller.js","../../wwwroot/app/assortment/rulesCategory/rulesCategory.controller.js","../../wwwroot/app/assortment/rules/rules.controller.js","../../wwwroot/app/assortment/reports/reports.controller.js","../../wwwroot/app/assortment/output/outputPrisma.controller.js","../../wwwroot/app/assortment/output/outputColombia.controller.js","../../wwwroot/app/assortment/output/outputChile.controller.js","../../wwwroot/app/assortment/output/output.controller.js","../../wwwroot/app/assortment/decisions/decisions.controller.js","../../wwwroot/app/assortment/clusterHierarchy/clusterHierarchy.controller.js","../../wwwroot/app/assortment/clusterCrossing/clusterCrossing.controller.js","../../wwwroot/app/assortment/categorySummary/categorySummary.controller.js","../../wwwroot/app/admin/missions/missions.controller.js","../../wwwroot/app/admin/missions/editMissions.controller.js","../../wwwroot/app/admin/items/items.controller.js","../../wwwroot/app/admin/items/editItem.controller.js","../../wwwroot/app/admin/interface/interface.controller.js","../../wwwroot/app/admin/importers/importer.controller.js","../../wwwroot/app/shared_logic/main.controller.js","../../wwwroot/app/login/login.controller.js","../../wwwroot/app/inspinia.js","../../wwwroot/app/index.run.js","../../wwwroot/app/index.route.js","../../wwwroot/app/index.config.js"],"names":["planogramShelfComponentController","$scope","$state","$timeout","$element","$stateParams","$translate","authService","spaceService","self","this","search","categoryFilter","selectedStatus","showGlobesId","planogramId","$firstUiView","parents","editPlanogramCtrl","controller","onGlobalClick","e","angular","isDefined","toElement","className","indexOf","undefined","calcLoadQuantity","item","level","planogram","Math","round","stackBehind","stackAbove","facings","getItemStack","direction","selectedUnitOfMeasure","alto","height","profundidad","width","depth","showMode","rotation","heigh","swal","translations","InsufficientSpaceSwal","InsufficientDepthSpaceSubtitleSwal","floor","guid","s4","random","toString","substring","onSizeChanged","planogramdiv","heightPx","document","getElementById","column","order","widthPx","clientWidth","levels","length","forEach","planogramFurnitures","_planogramFurniture","furniture","percentageWidth","_level","module","paddingItemsPx","cm","cmMax","pxMax","calcLevelWidth","itemPadding","getPaddingItems","items","calcItemSize","$","on","$on","off","hasPermissionToEdit","hasPermission","selectedGlobeItem","selectedGlobeLevel","$watch","newVal","oldVal","isEdit","current","url","contains","levelClick","calcItemWidth","calcItemHeight","depthPx","calcItemDepth","levelWidthPx","leveldiv","levelNumber","documentDiv","getItemColor","heatmapenabled","fill","groupmapenabled","selectItem","callbackFunction","selecteditemId","selecteditem","id","filtereditems","setActiveShelf","selectedbrand","selectedmanufacturer","categoryfilter","selectedstatus","selectedtagfilter","push","console","log","_item","selectedPlanogram","selectedLevel","selectedlevelparent","renderpiechartsparent","getLevelJustification","getUsedWidth","itemDroppedInLevel","index","UOM","external","type","planogramLevelId","WithoutSize","WithoutSizeSubtitle","InsufficientHeightSpaceSubtitleSwal","InsufficientWidthSpaceSubtitleSwal","categoryId","IncorrectCategorySwal","IncorrectCategorySubtitleSwal","categoryName","stateChange","uniqueId","selectedUnitOfMeasureId","autostack","stackTotal","textTooltipItemOrientation","ShowProfileItem","sort","a","b","i","name","itemInsertedInLevel","countplanogramitems","indexRemove","sumFacings","itemId","splice","groupItem","itemMovedFromLevel","_","remove","$$hashKey","usedWidth","setUsedHeight","minHeight","createNewArray","num","Array","showBubles","showIconMinus","hasLayDownItem","layDownItem","editHeightLevel","bool","ceil","HeightNotAllowed","HeightNotAllowedSubtitle","suma","deleteLevel","LevelWithItems","LevelWithItemsSubtitle","levelPlanogram","getItemStyles","isHideItems","applyOpacity","filteredItem","background-color","opacity","getItemDuplicateStyles","styles","getListItemStyles","updateItemData","init","then","all","element","window","throttle","$apply","planogramPegController","percentageToPixels","points","r","each","point","getPixelFromPercentage","planogramDiv","clientHeight","perc","maxPX","drawPlanogramObject","component","svgReference","pxPoints","pointsPx","imageUrl","canvas","image","size","move","position","draggable","rect","attr","stroke","dmove","layoutDiv","transform","color","back","front","calcHeightPx","dndId","domElementSize","getBoundingClientRect","calcWidthPx","container","domContainerSize","planogramLevel","levelObjects","nFronts","orientation","ticketCount","status","tags","brand","stackNum","spaceObjectId","isPlanogram","sellingAreaSpace","photoUri","totalSpace","squareMeters","linearFeets","newitem","itemstry","planogramObject","selectable","calcPlanogramSize","style","polygonContainer","drawLevelObject","drawCanvas","SVG","polygon","join","x","y","preventDefault","detail","p","loadPlanogramPeg","photoAuditController","ngDialog","file","imgWidth","imgheight","textContent","selectedStore","storePhotoAudit","noWrapSlides","active","slides","currIndex","addSlide","newSlide","uriPhoto","text","storeName","uploadFile","files","preview","firstChild","removeChild","formData","FormData","append","planograms","savePhotoAudit","uri","curFiles","list","createElement","appendChild","listItem","para","validFileType","FileName","FileSize","returnFileSize","src","URL","createObjectURL","onload","naturalWidth","naturalHeight","NotValidFileType","updateImageDisplay","querySelector","fileTypes","number","toFixed","isValidField","field","storeClicked","store","storeId","savePlanogramStorePhotoAudi","res","cancel","photoAudits","_photoAudit","stores","_store","ValidationSwalTitle","ValidationSwalSubtitle","confirm","close","$value","dismiss","getPlanogramInfo","getPhotoAudit","containerPlanogramController","updateSizePlanogram","columns","modules","widthPercentage","_module","widthPercent","calcWidthPercentage","containerSize","showSaveInElements","validation","isFirstInserction","model","showdoor","showDoor","isPlanogramColumnVisible","currColumn","moduleselected","showColumn","_indexColumn","_indexModule","isSelected","addNewModule","newModule","numLevels","insertModule","insertInPlanogram","insertIn","where","templateDroppedInPlanogramColumn","divisions","isRefrigerator","generateNewModule","open","template","scope","closePromise","data","calHeightLevels","showelements","selectModule","templateInsertedInPlanogramColumn","newColumn","unshift","_column","calHeightForLevel","showdeletebutton","resizeContainer","lenght","childrenModules","addColumnToContainer","add","pop","calcPlanogramHeightPx","getClassForTemplate","models","until","modulePositionOptions","InsertInNewColumnOnLeft","valor","InsertInNewColumnOnRight","$inject","planogramShelfController","addLevelController","agGrid","initialiseAgGridWithAngular1","templateUrl","bindings","selectedplanogramparent","sales","showloadquantity","showregularprice","showexhibitiondays","showdaysinstock","hideitems","showlevelmeasurebuttons","shownewticketmodal","zoom","directive","$q","$window","imageService","setImage","w","h","prop","restrict","link","attrs","$observe","value","load","catch","isloading","resolve","iscreate","rightToLeft","controllerAs","bindToController","$log","$onInit","$onDestroy","$onChanges","changesObj","Boolean","currentValue","orderBy","hasModel","ret","isObject","showHeader","showPrintWayDirection","showStores","storesOrderBy","showFooter","showPageInfo","isLastPage","columnSpaceBetween","showItemSketch","showGroupSketch","showLabelInfo","showLabel1","showLabel2","showOverlay","showColumnId","moduleSpaceBetween","levelSpaceBetween","itemSpaceBetween","shelfHeight","label1","label2","labelInfo","labelHeight","raiseOnRenderReady","transclude","header","body","footer","page","pageTotal","getFechaHora","moment","format","$parse","$rootScope","uid","$attr","raiseDragover","raiseDragenter","raiseDragleave","raiseDrop","newId","preventAndStop","$event","stopPropagation","String","onDragover","noop","onDragenter","onDragleave","onDrop","addClass","removeClass","$$phase","$document","dnDService","duid","holdTimeoutId","dataGetter","idGetter","targetGetter","snapToGridGetter","moveAtSetter","raiseDragEnd","enableGetter","unWatchDraggableEnable","onHold","holdTimeoutGetter","localUId","hasOnHold","draggableData","draggableId","draggableTarget","draggableSnapToGrid","draggableMoveAt","moveAtSetterAux","pageX","pageY","$clone","getDraggeable","shiftXAux","shiftYAux","shiftX","parseFloat","shiftY","css","left","top","moveAt","onDragend","draggableEnable","enableEvents","draggableHoldTimeout","currentDroppable","onGlobalEndHandler","$directive","getDirective","raiseEvent","dndRemoveAfter","onGlobalMoveHandler","setData","setDirective","setOnDrag","setDraggeable","isOnDrag","$refElement","target","isString","clone","clientX","clientY","zIndex","Number","MAX_SAFE_INTEGER","heigth","offset","setOffset","getDragabble","dragging","hidden","hide","elemBelow","elementFromPoint","show","droppableBelow","closest","$droppableBelow","$currentDroppable","raiseDragLeave","grid","isNumber","dropIndicator","$dropIndicator","eventName","newEvent","originalEvent","screenY","screenX","offsetY","offsetX","buttons","button","which","view","shiftKey","relatedTarget","metaKey","eventPhase","currentTarget","ctrlKey","cancelable","bubbles","altKey","delegateTarget","handleObj","trigger","onGlobaDragStarHandler","enable","timeout","originalMousePositionX","originalMousePositionY","originalScrollLeft","scrollLeft","originalScrollTop","scrollTop","exp","dragScroll","allowDrag","onGlobalMouseUpHandler","onGlobalMouseMoveHandler","service","prototype","getData","onDrag","draggeable","getOffset","factory","$http","ngAuthSettings","serviceBase","apiServiceBaseUri","tokenManagerServiceFactory","deleteRefreshTokens","tokenid","delete","results","getRefreshTokens","get","settings","clientId","$cookieStore","$location","localStorageService","serverService","companyJson","getApiUrl","authServiceFactory","_authentication","isAuth","userName","firstname","lastname","userId","companyId","companyCode","roles","permissions","categories","useRefreshTokens","redirectUrl","_logOut","username","role","local","Security","Federated","post","success","location","href","reload","_fillAuthData","authData","storeIds","isOpen401","login","loginData","password","client_id","deferred","defer","ian","urlCombine","response","authenticated","userinfo","set","token","categoryIds","refreshToken","reason","reject","err","error","promise","logOut","prompSessionLimit","title","icon","showCancelButton","showConfirmButton","customClass","willClose","siblings","fillAuthData","authentication","headers","Content-Type","access_token","refresh_token","getUserInfo","permission","promptSessionExpired","preCloseCallback","path","obtainAccessToken","externalData","params","provider","externalAccessToken","userRole","$injector","authInterceptorServiceFactory","request","config","Authorization","responseError","rejection","sessionLimit","wasKicked","warn","getRootUrl","$get","errorService","finalUrl","handle","rv","testPost","withCredentials","getDate","today","dd","Date","mm","getMonth","getHours","m","getMinutes","s","getSeconds","yyyy","getFullYear","closeAll","message","stackTrace","download","content","setAttribute","encodeURIComponent","display","click","_controller","$attrs","$filter","priceService","homeService","price","$uibModal","adminService","priceMap","country","priceSurveyType","erp","Implementation","priceSurveys","allPriceList","selectedPriceZone","selectedPriceZoneName","itemName","itemCode","selectedCompetitorGroups","priceSurveysFiltered","competitorsInit","competitorPriceList","competitorStates","competitorZones","selectedPriceLists","onlyMarkers","multizoneViewsCheckbox","isLoadingStores","getPriceSurveyType","markers","changes","isEmpty","previousValue","Basket","Extra","PriceIndex","Promotion","Own","Web","dashboards","getCountry","c","priceId","innerHTML","L","map","setView","moneySymbol","tileLayer","attribution","subdomains","addTo","getStorePriceListState","competitors","pricelists","getPriceLists","priceList","selected","priceListId","setFilterPriceZone","costs","getItems","selectedItem","getPrices","getCompetitorGroupPrice","competitorGroup","parentId","thisPrice","competitorsGroupPrices","competitorGroupId","priceAcum","count","competitorGroupParents","parent","getCompetitorGroupIC","_Price","getCompetitorGroupSuggestedIC","suggestedPrice","getCompetitorGroupNewIC","newPrice","navigateToCompetitor","marker","options","_latlng","openPopup","runFilters","removeLayer","averageLng","averageLat","latArray","lngArray","auxSelectedPriceLists","oxxoPrice","j","prices","filter","priceSurvey","addMarker","lat","lng","sumLat","sumLng","deviationLat","standardDeviation","deviation","deviationLng","abs","latlng","arr","n","sum","mean","variance","v1","v2","stddev","sqrt","removeAccents","str","normalize","replace","competitorLat","competitorLong","pl","priceListName","valid","competitorGroupIdsList","source","competitorGroupSelected","isMarker","mustShowPriceSurvey","competitorLogo","imgStr","upperDiv","abbreviateNumberThousand","competitorIcon","divIcon","html","iconSize","iconAnchor","popupAnchor","popupStr","competitorCode","competitor","observedDate","bindPopup","loadCompetitorGroups","isLoadingSurveys","allPrices","decisions","changePriceUsed","loadCompetitorGroupPrices","canChangePriceUsed","priceListIds","copy","z","cz","pricesurveys","onlyActiveByPriceListIds","includeOwnPrices","onlyActive","loadPriceSurveys","getCompetitorsGroupPrices","competitorPrices","showMapAndCompetitors","isMinimized","isMap","setTimeout","invalidateSize","priceZone","competitorGroupsParents","getCompetitorGroupsParentByPriceList","compGroupsParents","loadCompetitorGroupsParents","getCompetitorGroupsByPriceList","compGroups","competitorGroups","competitorGroupsFilteredByParentAndSurveys","includedIds","cg","len","groupId","competitorGroupsFilteredByParent","setCompetitorGroupFilter","onlyMarkerChanged","multizoneViews","priceLists","cpl","state","includes","changeStates","priceListIsInState","toLowerCase","code","changeZones","applyStatesFilters","getCompetitorsGroupPricesByPriceListIds","loadCompetitorGroupPricesByPriceListIds","getCompetitorGroupsParentByPriceListIds","loadCompetitorGroupsParentsByPriceListIds","getCompetitorGroupsByPriceListIds","loadCompetitorGroupsByPriceListIds","displayPhoto","animation","windowClass","changeItemSelected","validatePriceSurvey","confirmButtonColor","confirmButtonText","cancelButtonText","closeOnConfirm","closeOnCancel","isValid","changeCompetitorGroupParents","competitorGroupParent","getICBoxes","concat","changeCompetitorGroup","selectPrice","selectedCompetitor","competitorId","evolutionData","getHistorical","salesUnitOfMeasureId","priceType","priceHistory","uniqBy","getCompetitorUnitSales","unitsData","dateTo","dateFrom","setYear","updateChart","c3","generate","bindto","padding","right","bottom","xFormat","empty","label","colors","YPF","AXION","SHELL","OIL","BLANCA","REFINOR","PETROBRAS","axis","tick","rotate","PriceInS","d3","tooltip","ratio","line","connectNull","isLoadingChart","evolutionReport","getOxxoData","toISOString","valueToPush","uniqueArray","reduce","d","observedDateString","competitorsNamesObj","competitorsNames","find","cd","tradeName","keepPrice","competitorName","firstPrices","k","p2","findIndex","fp","flag","foundNullPrice","fillBlankValues","cp","componentsService","parseChartData","chartData","chart","dates","series","tempdate","currDate","serie","competitorInSerie","parseUnitsChartData","volumes","volume","date","UnitSales","volumesInSerie","updateCharts","pricesChartData","chartId","pricesChart","axes","pattern","toFormat","timerange","time","Price","unitsChart","axes2","getUnitsChartConfig","unitsChartData","updateChartType","selectedType","mix","volumesChart","isFocus","focus","blur","getStores","isExcluded","seletedstores","loadData","sameStores","kpis","getItemDashboardItemCluster","clusterId","priceDashboard","loadBoxData","withSameStores","isLoadingKPIs","getKpiDashboardYTD","dashboardComparisonDto","compareYtd","updateBoxes","itemForModal","selectedClusterForModal","hideBoxes","changeTimeRange","sameStoreChanges","timeTypeChange","getVsPrevious","VsPrevYear","currentDate","month","setMonth","year","monthNames","getMainBoxTitle","box","SALES","UNITS","COST","MARGIN","getBoxCompareValue","getBoxCompareTooltip","boxesCompareTo","compareMonth","getMainBoxValueGoal","getMainBoxTooltip","isMainBoxGoalSignPositive","getMainBoxValueYTD","prefix","decimals","getMainBoxValueAnual","getMainBoxAnualTooltip","getActualYtdValue","getActualYtdTooltipValue","getProjectedYtdValue","getProjectedYtdTooltipValue","projectedPositive","projected","annual","getBoxCompareIcon","delta","isBoxSignPositive","toggleLegend","legend","visible","compareTo","selectedMonth","vsPriorYearByMonth","currentYear","groups","actual","proyectado","objetivo","bar","rotated","getGoalChartTemplate","xValues","lastWeekXValues","lastMonthXValues","lastYearXValues","json","keys","units","margin","types","fit","shortWeekDayNames","getDay","shortMonthNames","y2","min","callback","subCategoryId","getItemsByCategory","loadItems","getStoresCombo","brands","getBrands","getPriceDashboardItemPriceList","updateChartVolume","getVolumeMeasurement_OXXO","datesArray","dayMonth","volumeDate","totalUnits","parseData","getVolumeMeasurementAnnual_OXXO","volumesAnnual","monthYear","units2","parseDataAnnual","getVolumeMeasurementAnnual","updateChartVolumeAnnual","Erp","selectedBrands","brandCriteria","competitorCriteria","competitorGroupIds","group","parameters","getKPIDashboardCompetitorsPrices","loadCompetitorPrices","chartTypes","competitorPrice","newCompetitorPrice","dateString","dataType","ctrl","searchText","noResults","loadingItems","lastSearch","onlyMarkersChange","onTextChange","onKeyup","evt","competitorsLookup","getCompetitors","onNewItems","validar","property","dataParsed","chartConfiguration","chartType","lastSeries","lastProperty","changeProperty","getChartConfig","labels","v","contents","defaultTitleFormat","defaultValueFormat","bgcolor","$$","titleFormat","tooltip_format_title","nameFormat","tooltip_format_name","valueFormat","tooltip_format_value","CLASS","levelColor","tooltipName","jsonData","names","defaultProperty","pie","multipleValues","properties","secondaryAxisProperty","chartReference","chartName","_chartType","ngModel","onKeydown","keyCode","onItemSelect","categoryLookup","getCategories","onSelect","clearOnSelect","HtmlHelper","getAngularAttributes","$node","attributes","attribute","test","getAngularClasses","split","cleanUpHtml","cleanUp","node","idx","$item","idx1","el","nodeType","children","removeAttr","classes","klass","getNgAttributes","getNgClasses","proptabindex","trailsInDays","changeDays","days","dateToCompare","setDate","auditTrail","auditDate","createdDate","setHours","TimeZone","Gmt","filters","checked","isSuggested","some","isPending","isEndorsed","isChild","priceListCode","regions","region","regionId","brandId","markets","market","marketId","departments","departmentWithZoning","zoning","departmentId","sectors","cityOfSector","department","city","sector","sectorId","sectorOfStore","priceTypes","pt","actions","situations","sit","priceIsFirst","hasStrongDecreases","hasStrongIncreases","hasLowMargin","hasHighMargin","hasNotSignificantVariation","hasNotFollowedSuggestion","hasOverlaps","ean","description","input","start","slice","$interval","changePriceNewImpact","selectedFilterForText","pageLoaded","getItemsToIgnore","itemsToIgnore","ignored","getItemsToEndorse","itemsToEndorse","newValidFrom","validFrom","getFilteredPrices","filteredPrices","appliedFilters","manualSearch","getCheckedPrices","isChecked","updateFilterCounters","totalFilteredPrices","closeAllPopovers","hoveringPopover","popOverIsOpen","getItemsToSave","itemsToSave","dirty","priceListIsBase","saveNewPrices","alertIfNochangesToSave","newPrices","getNewPricesToSaveOrEndorse","Attention","NoChangesWereRecorded","endorse","priceDecisionAction","validTo","newValidTo","priceSuggestionId","minMargin","maxMargin","minVariation","maxVariation","significantVariation","significantVariationInMargin","parentRuleItemId","parentRuleZoneId","mainItemId","mainPriceListId","child","markAsReviewed","ignorePendingSuggestions","subCategory","subcategory","categoryGroup","category","ConfirmedSwal","ConfirmedSwalSubtitle","fallback","ErrorTitleSwal","ErrorWhenWantingToMarkThisCategoryAsRevised","isLoadingPrices","numberOfNewPrices","averagePriceChanges","averagePriceNewVsSuggestedChanges","newImpact","newImpactShare","percentageOfChanges","percentageOfChangesVsSuggested","numberOfSuggestionsAccepted","suggestedImpact","categoryMargin","salesWithCurrentPrices","salesWithSuggestedPrices","numberOfSuggestions","salesWithNewPrices","suggestedImpactShare","exchangeRates","getCurrent","rate","exchangeRate","isEndorse","flattenPrices","showChilds","childPrice","showMe","parentPriceId","flattenChildren","extendedPrice","isExperimental","suggestionAccepted","priceChangeCount","getPrice","getMargin","newGrossMargin","grossMargin","getMarginAbs","newGrossMarginAbs","grossMarginAbs","getStatusIcon","rejected","getPopoverIcon","getStatusColor","newPriceByUser","allowManualChange","priceTypeDesc","getStatusTooltip","SuggestionTooltip","CurrentTooltip","NewTooltip","EndorsedTooltip","getStatusPopoverTitle","Suggested","Current","Pending","Endorsed","getStatusPopoverSubtitle","NewPriceSuggestion","ERPPrice","PriceNeedsEndorsement","ReadyToInformToERP","rejectPrice","RejectionComment","RejectionCommentSubtitle","inputPlaceholder","inputValue","rejectedReason","ignorePrice","toggleSuggestion","accept","changePrice","percentageOfAcceptedSuggestions","hasNewPriceFromDb","canEditPrice","getTitle","rejectedPrice","NewPriceHasBeenRejected","GoToTheAuditTab","oldNewPrice","cost","newCost","tax","newTax","taxRate","newTaxRate","priceDelta","competitorsPriceVsNew","competitorsPrice","newSales","priceSuggestionValidFrom","priceSuggestionValidTo","outOfGuidelines","suggestionDelta","suggestionDeltaAmount","isMarginOutOfGuidelines","minMarginAmount","maxMarginAmount","isVariationOutOfGuidelines","minVariationAmount","maxVariationAmount","priceDeltaAmount","suggestedPriceDelta","suggestedPriceDeltaAmount","overlappingPromotions","isParent","getImpact","getMarginInUSDxM3","fxRate","getSuggestedMarginInUSDxM3","suggestedGrossMarginAbs","getNewMarginInUSDxM3","assign","extendPriceObjects","removeDuplicates","tagIds","priceTagIds","parseInt","trim","itemTags","animate","paddingTop","paddingBottom","slideUp","getStoresZoning","dep","sec","showMarginInUSDperM3","pageNumber","pageSize","busy","allChecked","loadingPriceSurveys","JSON","parse","newGroupTag","newTagValue","groupTag","showChipsFilter","event","AlertWillLoseChanges","priceTypeName","DoYouWishToIgnorePendingSuggestions","Yes","alertMessage","PricesOfThisCategoryAsRevised","PricesOfThisCategoryAsRevisedPartial","CompetitionPricesOfThisCategoryAsRevised","CompetitionPricesOfThisCategoryAsRevisedPartial","NormalPricesOfThisCategoryAsRevised","NormalPricesOfThisCategoryAsRevisedPartial","swalConfig","DiscardConfirmTitle","ContinueSwal","CancelSwal","showLoaderOnConfirm","result","ErrorSwalSubtitle","canEndorse","onCheckboxFilterChanged","f","ignore","IgnoreSelectedSuggestions","ignoreSuggestions","resp","ConfirmedIgnoreSelectedSuggestions","EndorseTheModifiedPrices","newPricesToEndorse","endorsePrices","ConfirmedEndorseTheSelectedPrices","ErrorWhenWantingEndorsePrices","pricesToReject","currentUrl","rejectEndorse","RejectedItems","RejectedItemsSubtitle","openChatDialog","newScope","$new","showLoader","getChatForItem","chats","isSaving","newChat","pictureUrl","sendDate","saveMessage","saveChatForItem","showNewTagModal","filterByText","eInput","dateEditor","dateRenderer","updateDates","isValidFrom","UpdateDates","UpdateDatesSubtitleOp1","UpdateDatesSubtitleOp2","timestamp","isNaN","Success","showItemInDashboard","go","selectedPrice","toggleTabsRow","slideDown","toggleSuggestionTab","priceSurveyTypes","getByPriceSuggestionId","toggleMarginsAndCostsTab","marginTab","toggleNotificationsTab","notifications","isLoadingAuditTrails","toggleAuditTrailTab","getByObject","toggleCompetitonTab","viewMap","toggleKpiItemView","kpiItemView","acceptAll","endorseAll","onSearch","openPriceCopyDialog","priceTypeTarget","priceTypeSource","onChangePriceTypeTarget","copyPrices","updateType","updateValue","PriceUpdateConfirmTitle","PriceUpdateConfirmText","priceSource","openPriceUpdateDialog","priceUpdateStrategy","priceUpdateOperator","onChangeUpdateStrategy","update","targetMarginAmount","targetMargin","openPriceSimulationDialog","simulatePriceUpdate","isSimulated","isSimulationActive","cancelPriceSimulation","setEndorsed","unsetEndorsed","openStateActions","openTimer","onclick","saveAll","Pr_Decisions_SimulationWarningOnSave_Title","Pr_Decisions_SimulationWarningOnSave_Desc","toSave","toIgnore","toEndorse","toReject","TheFollowingChangesWillBeSaved","PriceChangesOp","IgnoredSuggestionsOp","EndorsedPricesOp","RejectedPricesOp","promises","newPricesToSave","onChangeItemTags","saveItemTags","saveNewTag","saveTag","HasBeenSuccessfullySavedSwal","saveNewGroupTag","NewTagGroup","showInputError","changeSuggestedPrice","changePriceAndCloseEditor","saveChangedPrices","AreYouSureSwalSubtitle","toggleCheckAll","onCheckboxChanged","clearSelectedFilter","removeIndex","applyFilters","closeSelectedFilters","cleanAllFilter","applyPricingZoneFilter","closeFilters","getAppliedFilters","toggleChilds","parentPrice","next","numberOfPages","previous","showFilters","toggleFilters","clickedElement","elementClasses","classList","closeFilterWhenClickingOutside","getFilterClass","showMultipleSelectionBar","totalCheckedPrices","showBar","isClosingBar","closeBar","animationCloseBar","stopSimulation","confirmSimulation","isNavCollapsed","isCollapsedHorizontal","isCollapsed","isStateCollapsed","isZoneCollapsed","isRegionsCollapsed","isMarketsCollapsed","isBrandsCollapsed","isDepartmentsCollapsed","isSectorsCollapsed","isStoresCollapsed","isPriceTypeCollapsed","isActionCollapsed","isSituationCollapsed","All","Regular","Competitive","Decrease","Increase","NewPrices","StrongFalls","StrongRises","DepressedMargins","HighMargins","LittleSignificantChanges","SuggestedNotRespected","Overlaps","countStatus","sf","countPriceLists","countPriceTypes","countActions","countSituations","getPriceTypes","decodeURIComponent","getTags","getTagGroups","tagGroups","readOnly","assignedStoresSwalTitle","assignedStoresSwalSubTitle","doSave","isConfirm","editUser","observations","security","saveUser","getRoles","getUsers","users","isLoading","translate","translation","searchStore","searchCategory","showChangeRoleDialog","user","showChangePasswordDialog","showAssignStoresDialog","userHasStore","showEditUserDialog","email","passwordConfirm","showAssignCategoriesDialog","cat","userHasCategory","hasStore","userStoreId","hasCat","userCatId","disableUser","disableUserDto","changeUserRole","newRole","changeRoleDto","oldRole","Observations","resetUserPassword","newPassword","resetUserPasswordDto","assignStoresToUser","assignStoresToUserDto","assignCategoriesToUser","assignCategoriesToUserDto","match","selectAllStores","filteredStores","doSelect","selectAllCategories","filteredCategories","getPermissions","searchPermission","showAssignPermissionsToRole","editRole","roleHasPermission","createRole","permissionName","assignPermissionsToRole","assignPermissionsToRoleDto","roleId","selectAllPermissions","filteredPermissions","ExportToExcel","tableHtml","worksheetName","btoa","unescape","base64","worksheet","table","selectedTable","showPermissionsToRole","rolePermissions","downloadExcel","u","exportHref","downloadUsersReport","row","downloadRolesReport","convertDate","inputFormat","pad","auditTrails","events","eventFilter","toDate","fromDate","scroll","getEventFormat","border-radius","font-size","getTime","getSecurityAuditTrails","audits","convertUTCDateToLocalDate","audit","filteredAudit","objectType","objectId","buildRow","filterByEvent","downloadLastReport","reports","getItemsToIgnoreLastReport","exportToExcel","exportItemsToIgnore","enableDisableSwalTitle","updatedStores","errorWhenSavingTheStore","loadStores","newStore","addNew","editStore","disableStore","excluded","storeCode","doesStoreCodeExists","exists","deleteStore","toggleNewStore","isExcludedLiteral","filterStatus","saveSwalTitle","storeSaved","validationNameStore","validationTypeStore","storeType1","storeType3","storesTypes","setupData","validationMessage","layouts","clusters","vendors","distributionCenters","operationsTypes","save","openedDate","Navigation","Prices","storeType","Assortment","operationType","validateBeforeSave","existingCodeText","category3Id","saveStore","changeSameStore","isSameStore","toggleSamePriceList","samePriceListForEveryCategory","toggleSameCluster","sameClusterForEveryCategory","choosePriceListsForCategories","chooseClustersForCategories","priceListChange","clusterChange","storeTypeChange","distributionCenterId","validations","EditStores","DistributionCenterMandatory","mustHidePriceChanges","HidePriceChanges","mustHideLiquidations","HideActiveLiquidations","isGeneralInformationCollapsed","isUbicationCollapsed","isOthersCollapsed","getCategoryGroups","getStore","last","cluster","getVendorsCombo","getDistributionCentersCombo","dc","getClusters","getBrandsCombo","selectedCategories","subCategories","selectedSubcategories","lstItems","newBrand","newManufacturer","newTags","isValidCategories","manufacturers","searchItems","YouMustSelectAtLeastOneCategory","allSubcategories","sc","subcategories","param","getItemsForManagement","onCategorySelected","saveNewBrand","NewBrand","AsignForPersist","saveNewManufacturer","NewManufacturer","manufacturer","saveManagementItems","isFiltersCollapsed","isEditItemsCollapsed","isTableCollapsed","loadingData","Promise","getCategoriesWithSubcategories","getManufacturers","getItemBrands","itemBrands","itemLookupText","itemsInLookup","loadingLookupItems","lookupItemsNoResults","previousLookupText","getItem","lookupText","SearchTerm","lookups","abmItemsLookup","Upload","anyError","uploadResults","severity","selectedCategory","selectedTypeId","loadingVerifyItemEan","resultsVerifyEan","isVerify","unitOfMeasureSelected","distributor","weight","imagePlanogramFront","imagePlanogramLeft","imagePlanogramTop","unitOfMeasures","isBaseUnitOfMeasure","conversion","history","loadSubcategories","togleExclude","t","isValiddUOM","allItemUoms","uomRepeated","_uom","ValidationSwalUomRepeted","SaveItemSwall","SaveItemSwallSubtitle","Cancel","saveItem","ItemSavedProperly","onBlur","isItemEanRepeat","getSubcategories","addUnitOfMeasure","deleteUnitOfMeasure","uom","togleBaseUnitOfMeasure","uploadFiles","errFiles","allowedSize","largeFiles","$error","$errorParam","filesToBig","isBusy","photoName","upload","loadResults","filesUploaded","processResults","showUploadPhotosModal","unitOfMeasure","okLoadPhoto","isBasicInformationCollapsed","isMeasurementsCollapsed","getTypes","baseUnitOfMeasureId","loadClusters","newCluster","showAllStores","isValidCode","searchCluster","toggleNewCluster","disableCluster","deleteCluster","editCluster","addStores","includedStores","key","o","includedInCluster","saveCluster","validateClusterCode","validatingClusterCode","getRegions","genericId","loadBrands","lstBrands","showPopup","saveBrand","isChangedIcon","Adm_brands_savedBrand","Adm_brands_subtitle","selectBrandColor","ticketTypes","ticketTypeId","editTicketType","ticketType","typesValue","numType","Planogram","tickets","getTicketTypes","objTypes","needsDescription","SaveEditTicketTitle","SaveEditTicketTitleSubtitle","saveTicketType","ValidationTypeTicket","ValidationNameTicket","getTicketTypeById","promotionsService","GenerateNewTicket","NEW","priority","created","comments","watch","editedTicket","showFormPriority","commentary","STATUS","RESOLVED","CLOSED","PRIORITY","LOW","MEDIUM","HIGH","filterPass","removeItemPlanogramFilter","setFilterPriority","textPrioritys","textTypes","priorityChange","ticket","editTicket","dataEdit","layoutObjectId","planogramLevelItemId","getColor","getPriorityText","priorityTickets","getStatusText","Resolved","Closed","showNewTicketModal","newTicket","showEditTicketModal","saveNewTicket","saveEditTicket","resolverTicket","closeTicket","timeSince","seconds","interval","Since","YearAgo","MonthAgo","DayAgo","HourAgo","MinuteAgo","Seconds","commentTicket","dataComment","ticketId","addComment","comment","toggleLook","Low","Medium","High","getItemTickets","getPlanogramTickets","getTickets","downloadCsv","activesItems","buildItemsByAssortmentReport","downloadFile","getLastReports","generatedFiles","selectedName","lastSelectedName","reportTypes","reportData","priceTypeId","oneAtATime","addItem","newItemNo","isCustomHeaderOpen","isFirstOpen","isFirstDisabled","lastDrilldownReportType","drillDownFunnelStep","drillDown","lastDrillownItemd","selectedReportType","drillUp","getIcColor","ic","changeReportType","acordionStatus","reportTypeChanged","isTagCollapsed","isClusterCollapsed","Sp_generalKpis_Category","Sp_generalKpis_planogram","Sp_generalKpis_store","gmros","gmroi","hurdleRate","avgPrice","spacing","loadPlanograms","getPlanograms","radioOption","shelves","viewPlanogram","shelvesInPlanogram","pageModal","getStatusName","NewOrModified","RequestForApproval","Approved","Communicated","paginationView","pag","nextPagination","privousPagination","newPlanogram","generateNewShelf","newShelf","addNewShelf","shelf","saveShelf","showShelf","addShelfToPlanogram","Object","planogramShelf","shelfId","indexShelfDelete","_shelf","totalWidth","addLevelToNewPlanogram","newLevel","planogramToCloneCode","planogramToCloneName","openPlanogramCloneDialog","planogramCode","planogramName","copyFromPlanogramId","orientationRightToLeft","isCloning","clonePlanogram","savePlanogram","SavedPlanogramSwal","SavedPlanogramaSwalSubtitle","ErrorWhenSaveThePlanogram","deletePlanogram","SureDeletePlanogramSwal","SureDeletePlanogramSwalDesc","ErasedPlanogram","ErasedPlanogramSubtitle","indexToDelete","AccessDenied","saveNewEditPlanogram","SavePlanogramSwalTitle","maximumNumberOfItems","planogramType","filterSubCategories","allSubCategories","assortmentService","DnDService","TICKET_TYPES","PLANOGRAM","ITEM","onGlobalMouseUp","onGlobalKeydown","forceUpdateModelCancel","labelInfoExp","activePlanogram","selectedColumn","selectedModule","activeShelf","hasPermissionToEndorse","hasPermissionToInform","showDimensions","isLoadingListItems","isLoadingPlanogram","itemList","planogramItems","heatMapEnabled","heatMapVariable","selectedBrand","selectedManufacturer","selectedTagFilter","filteredItems","editItem","translationLow","translationMedium","translationHeightF","typesTickets","selectedTag","textSelectedTag","textSelectedStatus","textClusters","tagsSelections","subcategoriesSelections","allTags","brandsFilter","brandSelection","manufacturersFilter","manufacturerSelection","showLoadQuantity","showExhibitionDays","showDaysInStock","showRegularPrice","analyzeBy","thereIsRefrigerator","thereIsPeg","autoAlign","autoStack","percentageSales","percentageSpaces","tooltipSpaced","editLevelMeasure","groupMapVariable","groupMapVariableValue","groupMapEnabled","groupMapList","groupMap","groupMapTags","groupTags","spaceModuleType","1","2","3","logoNavbar","changeZoom","onMouseUp","mouseDown","removeEventListener","onmousemove","positionPlanogram","positionElement","cloned","validPosition","isValidPosition","componentClone","selectedSpaceObject","itemTry","isNew","categoryColor","newItem","calculateStackTotalForPlanogram","loopThroughAll","calculateLoadQuantity","isAnalyzeByCollapsed","isSelectedClusterCollapsed","isSelectedStoreCollapsed","isGroupByCollapsed","isBrandCollapsed","isTagsCollapsed","isHeatMapCollapsed","isStatusCollapsed","selectSpaceObject","spaceObject","planogramByColums","componentMousedown","cloneNode","addEventListener","oPssEvt2","oMsEvent2","setItemLabel","labelType","showInfo","labelInfoClassExp","forceUpdateModel","calcExhibitionDays","exhibitionDays","calcDaysInStock","daysInStock","currentInventoryUnits","getTotalFacings","memoAllItemPlanogram","isRulesCollapsed","isCompleteCollapsed","isOrderCollapsed","isRestrictionCollapsed","isApplyCollapsed","isResultsCollapsed","itemsForAutocomplete","listedItems","leftToRight","topToBottom","ordenation","selectOrder","rules","selectRule","sortBySize","asc","brandsSelections","restrictions","selectRestriction","maxFront","minFront","frequency","clusterIds","activeAssortmentFilter","calculateSales","selectedCluster","is","wrapperAddFrontItem","wrapperAddItemAbove","wrapperDeleteItem","inventoryUnits","storesInfo","_itemList","inventory","regularPrice","currentInventory","itemStore","storeInfo","addItemAbove","isLayDown","askForLaydown","findPlanogram","findColumn","findFurniture","findLevel","findItem","usedHeight","getItemHeight","TheItemWasAdded","Aggregate","filterBy","doFilterApply","renderPieChartsParent","updateModel","clearFilteredItems","selectedItemId","rulesPromise","_items","_rules","rule","depthPlanogram","totalStoreInCluster","numItems","numItemsForClusters","itemPerFront","numFrontAutocomplete","GMROI","numFront","applyRuleAssignFrontsGMROI","GMROS","applyRuleAssignFrontsGMROS","maxNumItemsLevel","maxNumItems","facingsMaxPlanogram","rulePercentageSpaceValue","percentageSpaceType","criterioValues","facingsMax","facingsPlanogram","tag","applyRulePercentageSpace","hasPlanogramChanged","goToViewMode","goToEditMode","setAnalyzeBy","itemDroppedInItemsList","dndDragend","dropEffect","FilterByAssortments","currentAssortmenFilter","selectPlanogram","getStatusDescription","Sp_editPlanogram_new","Sp_editPlanogram_pendingApproval","Sp_editPlanogram_approved","Sp_editPlanogram_informed","itemWidth","setShowDimensions","renderSizes","addFrontItem","toAdd","getLevelUsedWidth","getItemWidth","addItemBehind","usedDepth","AddLayDownItemSwal","Laydown","Standup","rotateItem","changeFront","itemAux","requiredWidth","requiredHeight","itemToFront","itemToSide","itemToTop","deleteItem","itemLocal","levelLocal","SureDeleteItemSwal","RemoveSwal","countPlanogramItems","goToTickets","setShowProducts","showProducts","buttonTextProducts","HideProducts","ShowProducts","setShowInformationPanel","showInformationPanel","buttonTextInformationPanel","HideInformation","ShowInformation","showLevelEditor","editLevelsPlanogram","addLevelToPlanogram","addNewLevelToNewPlanogram","calHeigtLevel","searchAux","isListed","isOutOfStock","matchedTag","_tag","setHeatMap","displayName","variable","heatMapVariableValue","setGroupMap","max","getRanking","resetFillColor","ventasTotales","totalLinearSpace","blockKey","getGroupMapBlockKey","getGroupMapName","shareVentas","shareEspacios","share","espaciosLineal","orden","getLinearSpace","groupMapAux","reverse","itemFull","tagsValues","tagVal","NotInformed","getBlockMapStyle","getBlockMap","openChat","addChatToItem","closeChat","getMaxHeight","domElement","getElementsByClassName","getSelectedPlanogramBorder","setItemLayoutForPlanogram","justifyContent","totalItem","getItemsTotal","filterByStatus","filterByBrand","filterByManufacturer","filterByTag","openTicketDelist","tipo","type11","showDelistPopup","swaltitle","InsufficientPermissionsToEditPlanogram","FinishThePlanogram","InsufficientPermitsToApprove","YouWantToApproveThePlanogram","InsufficientPermissionsToReport","CommunicateThePlanogram","positionX","positionY","itemEan","filtered","isNewItem","showByAssortment","monthsForNewItem","daysOutOfStock","inventoryDays","parentCategoryId","parentCategoryName","editPlanogram","makeCopyForChangeDetection","AnErrorHasOccurred","InsufficientPermissionsToEdit","dataTicket","saveTicket","SavedTicketSwal","SavedTicketSwalSubtitle","filterBySubCategory","selectedItemList","selectTags","selectStatus","countItemActive","countItemWithoutExhibition","countItemDelist","calcNumItems","countItemWithExhibition","countItemNew","memoItemsIdWithoutExhibition","productStatus","showNoProductsImage","Actives","WithoutExhibition","WithExhibition","Delist","New","accordionStatus","getFilterColor","getInfoTitle","Brand","Manufacturer","filterByTextValue","filterItemListByTextSearch","onSearchTextChange","filterFunc","rankingHeatMap","allItems","total","rankCount","accumulatedFrequency","accumulatedPercentage","AccumulatedFrequency","percentage","AccumulatedPercentage","cache","planogramLocal","columnLocal","moduleLocal","getRankCount","itemsGroup","espaciosLinealGroup","espacioLinealTotal","vantasGroup","shareSpace","shareSales","spaceResult","Subspaced","Overpaced","spaceResultIcon","spaceResultColor","itemSales","totalSales","itemSpace","Sp_editPlanogram_spaced","getPercentageSales","getAnimationSales","getPercentageSpace","getAnimationSpace","animationSales","querySelectorAll","elem","transition","animationSpace","SalesShare","SalesRestProducts","SpaceShare","SpaceRestProcucts","getPlanogramWidth","clusterClicked","clearItemPlanograma","SureCleanPlanogramSwal","executeClearItemPlanograma","setSelectCluster","showAddRuleModal","okAddRuleModal","typeRule","minFrontGMROI","maxFrontGMROI","ratioGMROI","minFrontGMROS","maxFrontGMROS","ratioGMROS","rulePercentageSpaceBrandSelection","rulePercentageSpaceManufacturerSelection","rulePercentageSpaceTagsSelections","getCriterioRuleDescription","getCriterioRuleValueDescriptions","l","deleteRule","foundRule","selectHorizontalDirection","selectVerticalDirection","showAddOrderModal","okAddOrderModal","typeOrder","typeDesc","sortBySizeDesc","selectOrderDesc","deleteOrder","foundOrder","showAddRestrictionModal","okAddRestrictionModal","typeRestriction","isExists","restriction","getDescription","values","actualizarListadoItemsByRestrictions","getRestrictionValues","deleteRestriction","restrictionType","foundRestriction","filterItemListForAutocomplete","arrayItemBig","MultiCriteriaSorting","criteria","criteria1","asc1","conditionLeft","conditionRight","conditionLeft1","conditionRight1","selectSortBySize","measure","hasRules","generateAutocomplete","SureGenerateAutocompletePlanogramSwal","runAutocompleteEngine","executeGenerateAutocomplete","verticalDirection","horizontalDirection","WithoutLevelsSwal","WithoutLevelsSubtitleSwal","insertItemInLevel","i_level","i_column","i_module","rest","firstItem","shift","copia","div","mod","found","calcLevels","planogramRemainingSpace","tryAddItemToPlanogram","ruleDef","itemUsedSpace","ix","itemAdded","itemHeight","targetExhibitionDays","levelRemainingSpace","tryAddItemToLevel","isTagAdded","loadDataPlanograms","Allf","searchInfoPlanograms","getSpaceItemsForPlanogram","_planogram","_subCategory","allBrandsPlanogram","planogramCopy","getCopyOfSavableElements","obj1","col","lev","it","getHighestMouduleHeight","maxHeight","alert","maxFacings","ruleDefinition","totalPlanogramSpace","usedItems","excludedItems","currItemSpace","orderedLevels","colLevels","modLevels","planogramSalesShare","extraFacings","debug","autocompleteTotalItems","autocompleteExcludedItems","autocompleteUsedItems","passesSubcategoriesFilter","flat","subcategoryFilter","passesTagsFilter","tagFilter","passesBrandFilter","brandFilter","passesManufacturerFilter","manufacturerFilter","getUniqueItemsCount","groupBy","showPhotoAudit","modalInfo","dataSource","goItem","showKpisModal","buildPlanogramItemsReport","reportUrl","printPlanogram","EnterFurnitureToPrint","EnterFurnitureToPrintSubtitle","planogramToPrint","totalColumns","from","to","InvalidRank","finalColumns","overwriteId","InvalidRankSubtitle","ConfigurationFinished","AllReadyToPrintThePlanogram","Print","exportToPdf","currentSelectedPlanogram","when","planogramHeight","planogramWidth","columnHeight","moduleHeight","isTall","splitPlanogramByColums","getPlanogramStyles","finally","prepareExport","$pdf","write","print","ex","styleSheets","cssRules","selectorText","cssText","getUnitsColor","getUnitsTextInfoStore","TooltipForStoreUnits","TooltipForStoreUnits2","getUnitsText","toggleSenseOfOrientation","tagItem","existesTag","idCopy","original","equals","isInfoPlanogramCollapsed","isInfoAveragePerformanceCollapsed","isInfoStorePerformanceCollapsed","isInfoRankingCollapsed","isInfoRankingHeatMapCollapsed","isAditionalInfoCollapsed","isInfoAveragePerformanceCollapsedProduct","isInfoStorePerformanceCollapsedProduct","isRecommendationCollapsed","notCountFacings","layDownItemsHeight","showPlanogramComponentSvg","showPlanogramComponentHtml","getDraggableId","getDraggableTarget","planogramOnClickHandler","planogramSelect","keepSelected","planogramOnDropHandler","place","getNewItem","addItemTo","moveItemTo","planogramOnChangeLevelHeight","action","highestItemHeight","currentHeight","getHighestItemHeight","planogramOnDeleteLevel","levelIndex","isPeg","fixPostitionAligningItems","fixPostition","defaultValue","itemPrevLocal","itemNextLocal","findPrevItem","findNextItem","validateAddOrModifyItemInLevel","addItemToInternal","itemPrev","itemNext","newPosition","compareToById","movedItem","levelOld","removeFromLevelOld","compareToByUniqueId","isValidSize","collection","compareFn","isArray","isFunction","takeFirst","newIdx","takeLast","hasMultipleColumns","showItemActionToolbar","wrapperAddItemBehind","wrapperChangeFront","wrapperGoToTickets","wrapperShownewTicketModal","showItemActionRemoveFront","getActiveItemTextTooltipItemOrientation","showGotoTicketsButton","showTicketCount","getActiveItemTicketCount","initialOffset","originalPositionY","closestPositionY","closestPosition","pos","posDiff","closestPosDiff","allowDragScroll","aux","HeightF","getPlanogramId","PlanagramNotFoundSwal","PlanagramNotFoundSwalSubtitle1","PlanagramNotFoundSwalSubtitle2","uniqueParents","isEditPlanogram","uniq","scParentName","originalCategoryIds","originalSubcategoryIds","originalStoreIds","difference","ActionNotAllowed","ActionNotAllowedSubtitle","isImporting","getColumnsFromPlanogram","spaces_edit_planograms","oldPlanogram","showElements","showMassiveLoad","__columnStackedWithPrev_enabled","isNewLevelPlanogramCollapsed","isSizesPlanogramPegCollapsed","isDimensionsCollapsed","showLevelButtonAction","onEnterStoreCodes","trimedCodes","storeCodes","RegExp","ValidationToSaveAplanogram","goBack","layout","layoutStore","increase","centerZoom","setZoom","showListElements","changeWidth","setModuleWidth","minWidth","WidthNotAllowed","WidthNotAllowedSubtitle","viewAllModules","copyModule","moduleId","deleteModule","deletedColumn","nextColumn","showModulesOrder","sortModules","changedColumn","getSelectedColumn","getSelectedModule","showLevelMeasureButtons","saveImportPlanogram","warnings","missingItems","missingDimensions","warningMessages","saveMessageCallback","closeByEscape","closeByDocument","closeByNavigation","$dialogScope","closeDialog","closeThisDialog","onDropHandler","saveNewModuleSuccessful","heightForLevel","createLevels","currentHneight","applyPlanogramDimensionsChanges","findModule","templates","Shelf","Refrigerator","newSvgMatrix","svg","createElementNS","createSVGMatrix","convertToSvgMatrix","matrix","SVGMatrix","getDom","getAttribute","has","news","hasClass","toggleClass","eventToPoint","$svg","createSVGPoint","localCtm","getScreenCTM","localCtminvAux","inverse","localCtminv","localPoint","matrixTransform","globalCtm","getCTM","globalCtmInvAux","globalCtmInv","globalPoint","getBBox","global","getPlace","middle","allowDrop","allowEditStructure","scaleFactor","labelInfoClass","raiseOnClick","raiseOnDrop","raiseOnChangeLevelHeight","raiseOnDeleteLevel","showDropzone","$animate","svgService","planogramSpaceBetween","moduleShelfSide","label1Getter","label2Getter","labelInfoGetter","labelInfoClassGetter","calculateCancel","renderTimes","hash","hasItemsSelected","hasItemsFiltered","moduleShelfRefrigeratorTop","moduleShelfRefrigeratorBottom","drag","selectedElement","isOver","dropIndicatorX","dropIndicatorY","overTarget","dropIndicatorWidth","dropIndicatorHeight","register","getId","enabled","recalculate","calculate","getItemsGroup","getLevels","getModules","viewBox","$$original","prevColumn","calculateColumn","planogramStructure","array","columnStackedWithPrev","every","stackedWithPrev","prevColumnNoAcum","prevColumn2","antColumnWidth","$$id","prevModule","calculateModule","newColumnStructure","gridWidth","gridHeight","divisionWidth","prevLevel","calculateLevel","newModuleStructure","preLevel","fixWidth","fixHeight","itemsTotal","usedWidthPercentage","prevItemGroup","itemGroup","newItemGroup","calculateItemGroup","altImageUrl","itemDepth","imageResolved","showSketch","localItem","stackAboveItem","hasStack","hasLayDown","translateLayDownItem","stackHeight","itemStack","noLabel","itemLayDown","hasPosition","idxPropX","idxPropY","hasSelected","hasFiltered","onClickHandler","getModel","onDblClick","bbox","vbox","cx","cy","getTransformToElement","newx","newy","absoluteOffsetX","absoluteOffsetY","scale","scaledOffsetX","scaledOffsetY","scaledWidth","scaledHeight","getWidth","getDraggable","$target","isDraggable","startDrag","getMousePosition","transforms","baseVal","SVGTransform","SVG_TRANSFORM_TRANSLATE","$draggable","createSVGTransform","setTranslate","insertItemBefore","coord","endDrag","screenCtm","touches","getSvg","makeDraggable","bind","getHashCode","flags","getFlags","auxVars","calculateHash","chr","charCodeAt","newModel","colIdx","colNew","modIdx","moduleNew","lvlIdx","itemIdx","itemExt","getItemGroupX","getItemGroupY","levelExt","getLevelX","getLevelY","buttonsX","buttonsWidth","getLevelButtonsX","buttonsY","getLevelButtonsY","measureArrowX","getLevelMeasureArrowX","measureArrowY","getLevelMeasureArrowY","moduleExt","getModuleX","getModuleY","columnX","moduleX","levelX","columnY","moduleY","levelY","onLoadImage","findItemGroup","showDropIndicator","setOver","info","removeOver","showSelectedItem","itemOnClickHandler","$el","increaseLevel","reduceLevel","getTransform","getModuleHeight","selector","require","hasGrid","onDragOverAndEnterHandler","getModule","onDragEnterHandler","onDragOverHandler","onDragLeaveHandler","acumulator","usePegFixX0y0_krc","usePegFixX0y0_krc_siblings","levelWidthMts","levelDepthMts","calcDepth","calcWidth","NoFilesSelectedForUpload","loadFileLayout","saveLayoutLevels","ValidationSwalTitleAddLevel","ValidationSwalSubtitleAddLevel","validateNumbers","planogramItemGroup2Controller","itemSketchText","getItemSketchText","groupSketchText","getGroupSketchText","groupSketchTextY","getGroupSketchTextY","groupSketchTextLength","getGroupSketchTextLength","groupSketchTextTransform","getGroupSketchTextTransform","hitAreaY","getHitAreaY","hitAreaWidth","getHitAreaWidth","hitAreaHeight","getHitAreaHeight","getLabelInfo","getLabel1","getLabel2","getOpacity","itemSketchTextLength","getItemSketchTextLength","sketchTextY","getItemSketchTextY","itemSketchTextTransform","getItemSketchTextTransform","fixLabel","getItemSketchTextWidth","getGroupSketchTextWidth","getLabelInfoClass","labelInfoClasses","getModuleType","getAllowDrag","onDblClickHandler","onHoldHandler","onDragEnterAndOverHandler","onDragEndHandler","idAux","moduleType","siblingPeg","hassiblingPeg","cloneDom","daggableMoveAt","getSnapToGridConfig","PlanogramHelperService","getItemGeometry","editOrder","oldOrder","thisColumn","otherColumn","Image","$image","img","durationGetter","raiseOnHold","ianHoldDuration","ianHold","ianHoldEnable","timer","onGlobaEndHandler","onGlobaMousedownHandler","duration","newLayout","copyFromLayoutId","setFilterCluster","layoutToCloneCode","layoutToCloneName","openLayoutCloneDialog","layoutId","layoutCode","layoutName","showEditLayoutModal","saveNewEditLayout","saveLayout","SavedLayoutSwal","SavedLayoutSwalSubtitle","deleteLayout","indexLayout","idLayout","getLayouts","$compile","resetSales","spacePlanograms","clearSalesInfo","floorPlanograms","obj","skus","stockUnits","stock","floorSpace","aggregateSalesInfo","filteredSales","sale","calcAverageByStore","calcGmrosAndGmroi","spacePlanogramId","currentFloor","layoutCategoryIds","layoutCategories","salesShare","spaceShare","spaced","isOverSpaced","barWidth","calcLayoutSize","imgPlano","imgProportion","loadLevels","comp","createLevelCanvas","pixelsToPercentage","getDivPoints","levelDiv","isPlanogramRepeat","tempId","levelObjectClick","pointsToCheck","inside","areCollisions","divRect","baseX","baseY","vs","xi","yi","xj","yj","poly","imageWidth","imageHeight","imageOpacity","getComponentColor","g","imageMove","onlyPoly","fillColor","oldRotation","arrow","polyBox","arrowNested","nested","gArrow","isHorizontal","stroke-dasharray","gArrorBox","arrowNestedBox","arrowNestedBoxWidth","arrowNestedBoxHeight","arrowX","arrowY","_array","srcElement","maxPx","pixels","pixel","getPercentageFromPixel","selectedLevelItemId","showAttributes","selectedLevelItem","ticketsCount","selectedSvg","fileLayout","translationUnits","translationSales","translationMargin","translationPrice","translationInventory","translationStockOut","showSubcategories","categoryColors","getBlockCategoryColorStyle","heatMapVariableVal","setShowPlanogramsPanel","showPlanogramsPanel","buttonTextPlanogramsPanel","HidePlanograms","ShowPlanograms","showLabels","addLevel","SwalEmptyFloors","SwalEmptyFloorsSubtitle","editFloor","changeLevel","highlightByType","highlightByTypeDisplayName","toggleLabels","rMax","rMin","middlePoint","temp","getWidthHeight","font","relative","clear","stroke-width","rotateLayoutItem","grades","deleteLayoutItem","resizeLayoutItem","getComponentImage","levelObject","heatMapReversed","diff","low","mid","getLayoutTotal","SalesRestPlanograms","SpaceRestPlanograms","renderPieCharts","countPlanograms","layoutStoresHaveChanged","assignStoresToLayout","prevStores","SaveLayoutSwalTitle","copied","layoutData","saveLevels","selectSvg","showAttributesFunc","ViewLess","ViewMore","planogramSales","storeSales","categorySales","showSubCat","isInfoLayoutsCollapsed","isInfoPerformanceCollapsed","hideSubCat","createImage","overflow","loaded","loader","showZoomButtons","notRepeatPlanogram","spacePlanogram","clearFilter","isInfoCategoriesCollapsed","Units","Sales","Margin","Inventory","StockOut","getLayout","spaceObjects","getSpaceObjects","colorIndex","planogramCategoryId","getLayoutItemSales","planogramIdChange","onGlobalMouseup","initEvents","httpService","uploadLayout","imgData","dto","getLayoutLevels","getLayoutStoreSales","getPlanogramsList","getChildCategories","getPlanogramSales","planogramIds","getStoresForPlanogram","getItemsSalesForCluster","getTicketTypesByType","assortment","getAssortment","queuedTasks","queue","getTop5","newTasks","task","statusString","newTask","toastr","timeOut","positionClass","showToastForChangedTasks","polling","pendingTasksCount","clearInterval","pollingIntervalId","setInterval","updateQueuedTasks","createDummyTask","getStoreGroups","saveStoreGroup","storeGroup","deleteGroup","storeGroupId","getUserStores","holidays","getHolidays","promotions","getPromotions","getPromotionMediaPagesIds","getPromotionsByAdvancedSearch","searchCriterions","getPromotionsByReportFilters","getPromotionsOverlapping","getRejectedPromotions","getHistoricPromotions","dateRange","buildModifiedPromotions","promotionId","getPromotionsCalendar","getPromotion","getPromotionForPricingClose","pageId","getPromotionDataForPricingClose","savePricingClose","closePrices","deletePromotion","rejectPromotion","savePromotion","promotion","copyPromotion","getPromotionPages","getPromotionPagesItems","savePromotionMediaPages","getPromotionMediaPage","promotionMediaPageId","getPromotionData","informPromotion","taskId","comuicatePromotion","getPromotionPageData","promotionPageNumber","internalPromotions","saveInternalPromotion","getInternalPromotion","getRejectedPromotion","getPromotionItems","takeInternalPromotion","commentInternalPromotion","chat","informNewInternalPromotion","publishInternalPromotion","getOverlaps","getPromotionMediaPageId","getRuleParams","getRules","getRulesFiltered","getRule","ruleId","getRuleByCategory","getRulesByCategory","getExistingRules","saveRule","extendRules","getCompareToDescription","comparesTo","htmlVersion","mediaTypes","pageTypes","itemTypes","comparisonType","campaigns","getCampaigns","getCampaign","campaignId","deleteCampaign","saveCampaign","campaign","deleted","assigned","fd","transformRequest","identity","addPage","deletePage","mediaPageIdToDelete","getCategoriesGroups","saveCategoriesGroup","deleteCategoriesGroup","getItemInfo","promotionItemId","saleUnitOfMeasureId","getItemDailyInventory","getItemOverlaps","savePromotionItem","savePromotionVariantItem","saveReservedItem","promotionPageId","isHighlighted","saveReview","deletePromotionItem","deleteItemChat","chatId","loadItemChats","inPriceTask","loadItemsChats","promotionItemIds","saveChat","getItemsForecast","validateForecasts","updateForecasts","validateItemsBatchFile","updateItemsInBatch","getVariants","getPromotionVariants","swapPositions","itemFrom","itemTo","publishItem","positionTo","positionToIsHighlighted","getPromotionItemStores","validateItemExhibitionsBatchFile","updateItemExhibitionsInBatch","validateItemsBatchFileInternal","updateItemsInBatchInternal","validateChatsBatchFile","updateChatsInBatch","getLastPromotionItem","getCompetitivePrice","promotionItemType","getForecast","getCompetitivePrices","promotionItemsParamDto","mechanics","getMechanicCategories","getMechanicVendors","getMechanicItems","getPromotionInfo","getPromotionStores","saveMechanic","mechanic","savePanguiCode","mechanicId","panguiCode","getItemForMechanic","umvCode","getItemsForMechanic","massiveLoadParam","getMechanicInfo","promotionMechanicId","deleteMechanicItemOrCategory","itemOrCategoryId","isCategory","deleteAllSelection","isExtra","getMechanicOverlaps","overlaps","workflows","getWorkflows","loadTasks","getWorkflow","workflowId","deleteWorkflow","saveWorkflow","workflow","cloneWorkflow","workflowToCloneId","removeTask","taskToRemove","isWorkflowInUse","tasks","getTasks","getTask","getTaskName","getUserTasks","getTasksByPromotion","publishTask","mediaPageId","startTask","canStartTask","takeIssuesSnapshot","writePromotionPrices","canPublishActivation","getTaskIssues","checkTasksStartOrEnd","communications","getCommunication","getCommunications","getHistoricCommunications","setCommunicationFile","paramsDto","notificateAllPromotionsToStores","controlPanel","getPromotionsStatus","buildItemTasksReport","buildStoreItemTasksReport","buildItemStoreReport","buildItemBarCodesReport","buildCommentsReport","buildIBIReport","planned","getLastBIReports","buildOverlappingReport","buildMarkdownItemsReport","markdownReportDto","buildPricesReport","buildPriceSurveyReport","buildPromotionReport","promotionMediaTypes","userRoles","userAreas","getUserRolesByArea","userArea","Add","getUserAreasByRole","promotionMediaPageTypes","promotionMechanicTypes","promotionMechanicAnnouncementTypes","promotionMechanicPaymentTypes","promotionExhibitionType","calculateTariff","announcementType","tariff","getIssueName","getPricesPromise","getPriceDashboardPromise","lastCategoryId","lastEndorse","getCurrentCosts","getVendors","getDistributionCenters","saveAndGenerateSuggestions","getCategorySummary","categoryMinLevel","getPriceDashboard","fetchDataFromServer","getPriceDashboardItem","categorygroup","markAsEndorsed","getEndorsePrices","getCurrentPrices","getRegularPrice","isOwn","months","getCompetitorGroups","getCompetitorGroupsParent","compGroupId","getCompetitorsWithoutGroup","getCompetitorsTree","saveCompetitor","saveCompetitorsTree","competitorsTree","saveCompetitorsTreeRelations","competitorsTreeRelations","deleteCompetitor","deleteCompetitorsTree","CompetitorsTreeId","getAllPricelists","getPricelist","deletePricelist","savePricelist","pricelistsSubsidies","getPricelistsSubsidies","getAllPricelistsSubsidies","getPricelistSubsidy","deletePricelistSubsidy","savePricelistSubsidy","getRegion","saveRegion","salesUnitOfMeasurementId","getUnitsData","abTesting","getAbTestingGrid","itemsLookupByCategory","lookupParameter","deleteTests","ids","getStoresLookup","getDailySales","abTestingId","getCurrentPrice","saveAbTesting","getItemRules","getParents","savePriceRuleCompetitive","priceRule","savePriceRuleMargin","savePriceRuleParent","savePriceRuleZone","saveCategoryRules","getArticlesGroup","getPriceRuleTags","getPriceRuleItems","getPriceRulePriceLists","getPriceRuleVendors","getSubCategoriesById","getItemSensitivities","getParentUmvs","getPriceRulesForCategory","getPriceRule","priceRuleId","priceRuleType","deletePriceRule","getGenericItem","validateRulesInBatchFile","updateRulesInBatchFile","priceRoundings","getPriceRoundings","getPriceRoundingById","priceRoundingId","getPriceRoundingsByType","savePriceRounding","priceRounding","savePriceRoundings","deletePriceRounding","getRoundedNumber","numberToRound","suggestion","generateSuggestions","generateCostSuggestionsForAll","reviewCategory","suggestionsType","itemSensitivities","getItemSensitivity","itemSensitivityId","saveItemSensitivity","itemSensitivity","itemLookupByMainItemId","mainItemUmvId","getRoundingDecimalNames","decimalNames","Rounding3","Rounding2","Rounding1","Rounding0","RoundingM1","RoundingM2","RoundingM3","RoundingM4","RoundingM5","RoundingM6","getPriceSurveyTypes","priceSurveyTypeName","exclude","Exception","Markdown","Bonus","getPriceRoundingTypes","priceRoundingTypes","RoundingStandard","PricePoints","Terminations","getWeeklyReport","getInformedPrices","getInformedPricesExcel","getPricesDailyMargin","getPricesDailyMarginExcel","getCompetitorsPricesExcel","getCompetitiveIndex","getVolumeMeasurement","compare","getVolumeMeasurementCompetitors","getCompetitivePositionReport","getCompetitivePositionByPriceList","getCompetitiveReport","selectedMarketId","selectedPriceListId","selectedClculationType","priceOutput","getStorePricesToInform","informToErp","informToOxxoErp","pricesToInform","importPrices","downloadLastOutput","getLastOutputReports","getPriceOutputLimits","isReport","getStoresFilter","getCategoriesFilter","getReasonsFilter","getRulesCategories","updateRules","updateRulesAndGenerateSuggestions","reevaluateCurrentPlan","getStoresInMarkdown","getCategoriesForDecisions","GetMarkdownSuggestions","stage","acceptSuggestions","suggestions","endose","validate","reviewCategorySuggestions","reviewCategoryEndorse","reviewCategoryValidate","writeMarkdownPrices","getMotivoSugerencia","markdownItemId","markdownPlanType","ignoreAll","activation","activateMarkdowns","mardownsToInform","getMarkdownsToInformFiltered","getStockAnalysis","getItemDashboard","getHomeDashboard","getHeatMapByState","timeType","getHeatMapByStateMargin","getYtdComparison","getInventory","getAllDataDate","lang","getNotification","getLogosAndDomain","company","getCompanyConfig","categoryTreeMap","getCategoryTreeMap","dst","getCategoryBubbles","categoryGroupId","getStates","getBubbles","getLayoutCategories","getFullCategories","categoryBCGMatrix","getCategoryBCGMatrix","benchmark","getBenchmark","getBenchmarkValues","goals","getGoalsByCategory","getGoalsByStore","getPriceListsByCategory","scorecard","getScorecard","itemsLookup","storesLookup","getCums","ENA","companyName","saveTemplate","getTemplates","deleteTemplate","loadReportData","useNewClusterizer","report","getLastExecutedReport","openReport","downloadRulesReport","ruleType","downloadListingSuggestionsReport","getCategorySummaryPromise","getParetoByCategoryPromise","lastParetoCategoryId","getAssortmentDashboard","categoryLevel","getParetoByCategory","getParetoFiltersByCategory","getCategoryDetail","getPresenceDetail","getParetoSections","getHiddenColumnIndexes","saveDecisions","itemIdsToReject","assortmentIds","saveParetoSections","sections","updateLastRevisionDate","getClusterCrossing","saveClusterCrossing","dtos","saveColumnsToHide","columnIndexesToHide","getClustersByCategory","getClusterCategorySpaces","categoryRoleStrategyCoverages","getCoverages","getCoveragesForCategory","getStrategyAndRoles","getCategoriesForRules","getItemManufacturers","saveListingRule","listingRule","saveDelistingRule","delistingRule","saveCustomCategoryMonths","customCategoryMonths","isListing","output","getEndosedData","getEndosedDataCencosudColombia","getEndosedDataCencosudChile","changeOutputStatus","getPrismaEndosedData","summaryReport","getSummaryReport","getClusterHierarchy","getSalesAndMargin","importers","importer","importerName","processFiles","validateDataQuality","importData","removeAllSensitivities","getLastUploadedFile","importerType","tagIdsToSave","getNoCategoryItems","saveItemCategories","itemEansToAplyCategory","getItemsByCategories","missions","getMissions","getMission","getMissionEnums","getAgentCompetitors","saveMission","mission","deleteMission","missionId","getStoreFormats","getCustomerTypes","getCustomerFormatBrands","getStoreByClusters","onlyOwn","places","getPlacesCombo","getStorePriceLists","getMarkets","priceListsSubsidies","getPriceListsSubsidies","getStorePriceListsSubsidies","getCategoryTree","getCategorySector","getSubCategories","getCategoriesWithLevels","interfaces","getByBatch","batchIdentifier","getByDate","getLast","getDetails","interfaceLogId","getDetailSummary","getFile","filename","changeUserRoleDto","userDto","roleName","p1","precision","abbreviateNumber","compile","uiSrefDisabled","pre","stopImmediatePropagation","$evalAsync","metisMenu","args","toggle","section","slideToggle","resize","dataLazyLoad","Function","$eval","myEnter","ready","carousel","minimalize","fadeIn","recreateLayoutTable","drawTable","refreshLayoutTable","doRowspan","ct","layoutPreviewGrid","rowspan","rowNumber","colNumber","anyRowFound","_drawTable","doColspan","colspan","anyColFound","doLoadItem","isReserved","isItemEditEnabled","loadItemToPosition","doClearPosition","removeItem","doHighlight","doBlockPosition","openAddItemDialog","openAlternativeItemsDialog","isMechanic","getItemsCount","selectedPage","filteredArray","background","rows","showImage","highlightedClass","itemDescription","isActivationTask","itemPromotionalPrice","itemNormalPromotionPrice","itemBonusPrice","itemBonusPoints","issues","checkIssueInPosition","issueName","showChat","isLayoutEditable","isLayoutForReview","isLayoutCompare","isLayoutImageUpload","isFinalValidation","recreate","individualPage","promotionMediaPageLayoutId","details","gridCell","columnNumber","promotionalPrice","loyaltyPrice","loyaltyPoints","normalPromotionPrice","rangeOptions","onChange","onFinish","ionRangeSlider","fullscreen","showhide","ibox","closebox","focusMe","refreshInterval","steps","step","countTo","increment","timoutId","val","$parsers","$formatters","setBackgroundColor","colorName","getSubcategoryColor","newValue","oldValue","catColor","handler","bufferedScroll","scrollHeight","offsetHeight","$translateProvider","Points","Cost","CostsByProvider","CostsByVendors","Benchmark","TotalUnits","YesterdayPrice","Range","Language","English","Spanish","ProductCost","DiffInDollars","NotificationTitle","NotificationSubtitle","TheReasons","Reason1","Iagree","Idesagree","Discard","Reason2","SubReason1","ChartTitle","ChartTitleStrong","Week","Month","Year","SalesInDollars","MarginInDollars","ChartFooter","PricesTableTitle","PricesTableTitleCol1","PricesTableTitleCol2","PricesTableTitleCol3","PricesTableTitleCol4","PricesTableTitleCol5","MapTitle","Back","WeatherTitle","InSales","WeatherDesc","InventoryTitle","InventoryDays","InventoryComment","InventoryFooter","RangeTitle","RangeLine1","RangeLine1Sub","RangeLine2","RangeLine2Sub","RangeLine3","RangeLine3Sub","StoreManager","Profile","Contacts","Mailbox","Logout","Home","SmartDashboard","Maps","DeviationAnalysis","WeatherAnalysis","BcgMatrix","Pivot","Notifications","Decisions","Elasticities","PromotionAnalysis","Sensitivity","RulesAndStrategies","Competitors","RangeAnalysis","Segmentation","TicketAnalysis","BasketAnalysis","Spaces","Planograms","Layouts","SpaceAnalysis","StockAnalysis","OrderSuggestions","Suppliers","Administration","GeneralSettings","Importers","Masters","DiscardConfirmSub","YesDiscard","DiscardMessageTitle","DiscardMessageComment","ThanksForFeedback","ThanksForFeedbackComment","ThanksForFeedbackPoints","ThanksForFeedbackTitle2","DisagreeTitle","DisagreeSub","Send","Costs","CompetitorsPrices","CompetitivePosition","MarketAnalysis","Clusters","StoresIncluded","Stores","Store","StoresToBeIncludedByCategories","TypeOfStore","SelectTypeOfStore","AddStore","StoreMasters","AssignStores","Close","AssignmentOfStores","ByStore","ByStores","TopNavbarSearch","BenchmarksStepOne","StoresToCompare","SelectStores","PerformanceByProvinceSubtitle","PerformanceByProvinceSubtitle2","TotalStores","BaseStore","SelectStore","MirrorStore","ChooseComparableStores","MaintainThePriceOfMirrorStores","PriceChangesReportSubtitle","AddPricesArea","Name","National","Enabled","ToDisable","EnableTooltip","Save","ItsBase","ItsNational","Excluded","ExplicationCompetitors","NewGroup","NewCompetitor","CompetitorsGroup","DragCompetitorsHere","OnlyNew","WithoutGroups","Logo","SonOf","SelectFather","SelectFamily","ExternalCode","Address","CorporateName","Latitude","Length","Marker","Observe","SelectPriceZones","CreateSensitivity","Order","SurveyFrequency","Expiration","ValidityDays","MondayAbbreviation","TuesdayAbbreviation","WednesdayAbbreviation","ThursdayAbbreviation","FridayAbbreviation","SaturdayAbbreviation","SundayAbbreviation","SelectSurveyFrequency","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday","CreateRoundingRule","LoadItemsToExclude","RoundingRules","EditRoundingRuleSubtitle","TypeOfPrice","RoundingType","Decimals","Tolerance","DirectionRoundingRules","TestPanel","TestPanelSubtitle","PriceToRound","EnterValue","ResultWithRoundingApplied","TryRounding","SelectPriceType","SubcategoriesToInclude","SubcategoriesToExclude","AreasToInclude","AreasToBeExcluded","Select","AddNewRank","SelectDecimals","Insert","EditTerminations","New1","Accept","StrategyAndPriceRules","ExplicationStrategyAndPriceRules","DescriptionRule","Validity","AreaOfApplication","Acceptance","Description","Subcategories","Items","PlaceholderSearchItem","PriceTypes","PriceType","CompetitionAreas","Labels","Properties","RelationshipRule","Areas","RulesOfKinshipOfZones","SelectParentPriceZone","SelectKindOfType","DifferenceIn","AllSubcategories","AllArticleGroups","AllPricesZones","ExceptZoneFather","AllSuppliers","ApplySKUs","ScopeOfExclusion","ExcludeSKUs","SelectSubcategories","SelectArticleGroup","SelectSuppliers","SelectSensibilitiesToInclude","SelectLabelsToInclude","SelectSubcategoriesToExclude","SelectItemGroupsToExclude","SelectPriceAreasToExclude","SelectSuppliersToExclude","SelectSensitivityToExclude","SelectTagsToExclude","Products","RulesOfRelationshipOfProducts","Generic","ParentProductVariant","GenericRuleVariant","SuggestionRule","MarginRules","TargetMargin","KeepMargin","KeepSameMarginPercentage","KeepSameMargin$","Competitive1","CompetitiveRules","SelectPointOfSale","SelectTypesOfObservations","ConsiderOnlyCompetitorsSamePriceArea","Use","MoreThanOneFashionToUse","LessOfaFashionToUse","ApplyToProducts","CancelTheChangesMade","SaveCompetitionRule","SaveMargenRule","SaveParentageRule","SaveZoneRule","GenerateSuggestions","CategoryReview","TooltipGenerateSuggestionsButton","EvaluateMarginRules","EvaluateCompetitionRules","EvaluateRelationshipRules","ExportToAnExcel","IncludeAllItems","ExcludeAllItems","SaveAllChangesPriceDecisions","AcceptSuggestions","AcceptSuggestionsTooltip","EndorseAll","EndorseAllTooltip","MarkAsRevised","Normal","MarkAsRevisedAllNormalPricesTooltip","MarkAsRevisedAllPricesOfCompetitionTooltip","MarkAsRevisedAllPricesTooltip","Status","PreviousPrice","ThePriceVariationLimitHasBeenExceededTooltip","To","TheMarginLimitHasBeenExceededTooltip","GeneralInformation","Ean","BaseUm","ProductInformation","Maker","NewLabel","Quality","Premium","Apply","Area","Action","Situation","ChangePriceManually","AcceptSuggestion","Reverse","Endorse","ToRefuse","MarkAsEndosada","ModifyMargin","PercentajeMargin","DateFrom","DateUntil","ForEndorsement","Falls","Rises","NegativeMargins","SeeMap","Page","Position","CurrentPrices","Motive","Reasons","CompetitorsReferenceSameZone","ReasonForSuggestion","LowForts","LastPricesInformedERP","GenerationDate","GenerationTime","Archive","PricesPendingToInform","Un_select","PricesToInform","AllTypesOfPrice","AllStores","AllCategories","SelectAllVisiblePricesTooltip","GenerateTheFileToInformTheERPTooltip","Delete","NewTest","RemoveTheSelectedTestsTooltip","CreateAnewTestTooltip","PriceChangesReport","PriceMapReport","ReportInformed","OnlyThoseNotImplemented","DailyMarginsReport","VolumeMeasurement","MixEvolution","ImportantInformation","ExplanationNewCost","AddCost","SaveNewCosts","BulkLoad","Supplier","CenterOfDistribution","ProductCode","NameOfProduct","StartDate","NetCost","Taxes","SelectDistributionCenter","ItemCode","SelectItem","Tax","TaxRate","Subsidy","FreightCost","DateEffectiveFrom","FreightCostText","CreatePlanogram","Dimension","ModalTitleCreatePlanogram","NewPlanogramLegend1","NewPlanogramLegend2","NewPlanogramLegend3","ModalTitleEditPlanogram","Width","Height","Depth","AddShelfToPlanogram","RemoveShelfFromPlanogram","SaveShelf","LevelOfPlanogram","ExplanationAddLevels","Optional","ExplanationAddOneLevel","NumberOfEqualLevels","CompleteAllFieldsToCreateANewPlanogram","AtTheEndPressTheNextButton","Fornitures","PrintPlanogram","ShowDimensions","HideDimensions","FromThePlanogram","Clean","CleanPlanogram","EditDimensionsTooltip","EditPlanogramDimensions","GoToThePlanogramViewMode","GoToThePlanogramEditMode","GoToTheLayoutViewMode","GoToTheLayoutEditMode","AssignStoresLayout","SeeAuditPicture","RequestApproval","RequestApprovalTooltip","Approve","ApproveTooltip","AssingFrontsTo","Maximize","MinimumFronts","MaximumFronts","PercentageOfOccupiedSpace","Percentage","AddRule","TopToBottom","BottomToTop","LeftToRight","RightToLeft","Upward","Falling","Measure","AddOrder","AddRestriction","GENERATE","WithoutCategoryAssigned","SeeTickets","DeleteAnItem","AddItem","Front","Side","Top","Subcategory","SalesInStore","PriceInStore","UnitsInStore","StockInStore","SalesInCluster","AveragePriceInCluster","UnitsInCluster","StockInCluster","ExhibitionDays","ShowProductInformation","WithoutRule","RepositionFrequencyInDays","Tag","OrderBy","WithoutOrder","MarginInCluster","Weight","Aream2","WithoutFilters","Filters","SelectTag","SelectBrand","SelectManufacturer","NewSingular","Edit","NewTypeOfTicket","SelectTypeTicket","NeedDescription","NewPlanogram","Complete","From1","ChangeSenseOrientation","SenseCirculation","AutoStack","ShowDoor","Tags","ProductChat","NewMessage","Write","DelistProduct","LiquidarProduct","AskForWithdrawal","ChooseCriteria","HighPriority","MediumPriority","LowPriority","StopFollowingTicket","FollowTicket","Elements","EditElement","Container","Columns","AddElements","AddLevelToThePlanegram","AddLevel","Measurements","Dropzone","DragItemhere","NewFurniture","IncreaseHeightPlanogram","ReduceHeightPlanogram","RemovePlanogramLevel","NewModuleTitle","NumberLevels","DivisionsOrDoors","PositionIn","ShowElements","InsertInTheSameColumn","NewTags","Quantity","UnitOfMeasureAbbreviation","BaseUnitOfMeasure","ValidationEan1","ValidationEan2","UploadPhotosItem","UploadPhotosItemTooltip","RemoveThisUnitOfMeasure","UnitOfMeasureCode","AddUnitOfMeasure","UploadItemPictures","ItemInFront","ProfileItem","ItemAbove","Distributor","DischargeDate","Conversion","Dimensions","Place","HeightText","NoImage","NoImageSubtitle","EditLayout","EditUnitOfMeasures","ProductHigh","DeleteItem","ChangeFront","AddItemBehind","DeleteItemBehind","AddItemToRight","DeleteItemOnRight","AddItemAbove","DeleteItemAbove","MoreInformation","TooltipRemoveElement","MoreZoom","LessZoom","AveragePerformance","InformToERPTooltip","YouMustSelectACategory","NoResultsFor","AddFreightCost","CostOfFreightAndStimulus","ItemCode1","Stimulus","SelectArea","Article","AddRegion","Region","PricingZonesToExclude","PriceZonesToInclude","AcceptSelectedSuggestions","IgnoreSelectedSuggestions1","EndorseSelectedItems","RejectSelectedChanges","ModifyMarginInStaggeredWay","MassiveDatesUpdate","MassiveLoad","IndividualLoad","SaveABTesting","PercentageOfTheRiseOrFall","ItMustMatchExactly","FreightCostTooltip","StimulusTooltip","FilterApplied","LastModification","EditPlanogramStructure","CopyingThisStructure","ClearPlanogram","SaveThePlanogram","YouDoNotHavePermissionsToSave","Active","ClickToFilterBy","ClickToEdit","Copy","CopyTooltip","DataImporter","UploadFiles","DragTheFileHere","DragTheFileHere1","VerifyFormat","ValidateInformation","UpdateTables","UploadFile","ValidateData","AddCategories","Finalize","SelectSubcategory","Subcategory2","GoToStep2Tooltip","GoToStep3Tooltip","GoToStep4Tooltip","RestartTheImporter","ManualSettlementsOverwriteSuggestedSettlements","LiquidationsByExpirationOverwriteSuggestedLiquidations","BleachSensitivities","NewHighRule","NewRuleLows","SaveProductRegistrationRule","SaveProductDropRule","ButtonGenerateSuggestionsAssortmentTooltip","NewRuleTitle","NewHighRuleIntro","CoverageInfo","ObjectiveFor","SelectAnOption","AllClusters","AllTags","SelectSubcategoriesToInclude","SelectClustersToExclude","NewLowRuleIntro","AssortmentMatrixStep1","AssortmentMatrixStep2","AssortmentMatrixStep3","AssortmentMatrixStep4","AssortmentMatrixStep5","SaveTemplate","OpenTemplate","AssortmentReport","Flag","AllFlags","Format","AllFormats","Client","AllClients","Scope","Section","Family","Subfamily","AllSubfamily","Opening","UpTo5Labels","Months3","Months6","Run","Export","ManagementOfItems","ManagementOfItemsLegend1","ManagementOfItemsLegend2","ManagementOfItemsLegend3","ManageItems","SearchManageItems","FilterTooltip","SelectedTags","AddNewTagTooltip","Group","SelectedGroup","ManagementOfItemsTitle1","ManagementOfItemsTitle2","ManagementOfItemsTitle3","WithoutProducts","FullView","UnitsStock","Sp_generalKpis_Kpis","Sp_generalKpis_Filters","Sp_generalKpis_rentability","Sp_generalKpis_averagePrice","Sp_generalKpis_spacing","Sp_generalKpis_tags","Sp_generalKpis_zones","Sp_generalKpis_applyButton","Sp_editLayout_AddTicketTooltip","Sp_editLayout_rotateTooltip","Sp_editLayout_deleteTooltip","Sp_editPlanogram_Recommendation","Pr_competitors_checkboxMarker","Pr_competitors_checkboxObserve","PriceEvolution","CompetitiveIndex","CompetitiveByZone","CompetitiveByCompetitor","CompetitiveByCategory","SelectPricingZone","Pr_competitiveIndex_subtitle","Pr_competitiveIndex_GroupBy","Pr_competitiveIndex_CompetitivenessFor","Pr_competitiveIndex_Ci","Pr_competitiveIndex_Cheaper","Pr_competitiveIndex_TheSame","Pr_competitiveIndex_MoreExpensive","Pr_competitiveIndex_TypeOfSurvey","Pr_decisions_restore","Sp_editLayout_validationArea","Pr_decisions_ExperimentalPrice","Pr_decisions_Close","Pr_decisions_CloseTooltip","Pr_decisions_Experiment","Pr_decisions_ChangePrice","Pr_decisions_Selected","Pr_volumeMeasurement_legend1","Pr_volumeMeasurement_legend2","Pr_volumeMeasurement_legend3","Pr_volumeMeasurement_evolutionOfTheMIX","Pr_volumeMeasurement_validationDate","Sp_planograms_editStructure","Sp_planograms_editStructureTooltip","Sp_planograms_copyStructure","Sp_planograms_copyStructureAndProducts","Sp_editPlanogram_editLevelsTooltip","Sp_createPlanogram_loadStoresIndividually","Sp_createPlanogram_loadStoresMassively","Sp_editPlanogram_space","Sp_editLayout_moreZoomTooltip","Sp_editLayout_lessZoomTooltip","SP_editPlanogram_Autocomplete_Strategy","SP_editPlanogram_Autocomplete_ExhibitionDays","SP_editPlanogram_Autocomplete_Results","SP_editPlanogram_Autocomplete_ResultsSummary","SP_editPlanogram_Autocomplete_ResultsSummary_Part1","SP_editPlanogram_Autocomplete_ResultsSummary_Part2","SP_editPlanogram_Autocomplete_ResultsSummary_Part3","SP_editPlanogram_Autocomplete_ResultsSummary_Part4","SP_editPlanogram_Autocomplete_ResultsSummary_Part5","SP_editPlanogram_Autocomplete_ResultsSummary_Part6","SP_editPlanogram_Autocomplete_ResultsTableCode","SP_editPlanogram_Autocomplete_ResultsTableDesc","Pr_competitors_selectBrand","Ad_missions_newMissions","Ad_missions_mission","Ad_missions_missionType","Ad_missions_finishDate","Ad_missions_users","Ad_missions_advance","Ad_missions_daysToExpire","Ad_missions_programming","Ad_missions_surveyMethod","Ad_missions_selectMissionType","Ad_missions_selectsMethod","Ad_missions_selectFrecuency","Ad_missions_selectActionType","Ad_missions_timeToCompleteIt","Ad_missions_inDays","Ad_missions_startsOn","Ad_missions_endsThe","Ad_missions_brand","Ad_missions_selectBrand","Ad_missions_region","Ad_missions_selectRegion","Ad_missions_location","Ad_missions_selectLocation","Ad_missions_priceZone","Ad_missions_selectpriceZone","Ad_missions_specificStores","Ad_missions_selectSpecificStores","Ad_missions_products","Ad_missions_group","Ad_missions_selectGroup","Ad_missions_subGroup","Ad_missions_selectSubGroup","Ad_missions_Items","Ad_missions_selectItems","Ad_missions_responsible","Ad_missions_selectShopper","Ad_missions_shopper","Ad_missions_addShopper","Ad_missions_legendResponsable","Pr_competitors_selectPlace","Adm_brands_brands","Adm_brands_addBrand","Adm_brands_brandName","Adm_brands_searchBrand","Adm_brands_newBrand","Adm_brands_editBrand","SaveSwalTitle","StoreSaved","ErrorWhenSavingTheStore","ValidationNameStore","ValidationTypeStore","EnableDisableSwalTitle","UpdatedStores","AssignedStoresSwalTitle","AssignedStoresSwalSubTitle","ValidationMirrorStoreAndBaseStore","ValidationSelectedStoreNotHaveAPrice","DstPopUpInformativeGraphic","StoreAndCD","StoreDescendant","CategoryTreeMap","ByCategory","Setup","PriceZones","Rounding","Goals","Reports","Welcome","InformToERP","PriceElasticity","PriceChanges","PriceMap","InformedPrices","DailyMargins","ReplenishmentCosts","Promotions","Campaigns","Workflows","Rules","PromotionalActions","Calendar","ControlPanel","MyTasks","Communicate","BIReports","Markdowns","SelectionRules","Missions","MarketData","Sensitivities","Users","PrismaDevelopedBy","InformationUpdatedUpTo","SalesYTD","VsPlan","PlanProgress","AnnualPlan","Forecasted","MarginYTD","UnitsYTD","CostYTD","MarginDecreased","HeatMap","HeatMapSubtitle","PreviousMonth","SameMonthPrevYear","SelectCategory","SalesIn","Population","Households","GreaterThan","Between","And","LessThan","SelectSector","SelectState","Colors","Size","Period","START","Analysis","SelectedPeriod","DifferenceSamePeriodPrevYear","State","ShowSalesDistributionBetween","Categories","TheSizeOfTheCirclesCorresponds","Category","TheColorShowsTheVariation","DTSLegend1","PriceDecisionsCategory","PriceDecisionsCategorySubtitle1","PriceDecisionsCategorySubtitle2","Search","ClickToEnterCategory","RegularSuggestions","Suggestions","SuggestionsQuantity","NumberCompetitiveSuggestions","Impact","ShowsImpactInMargin","ShowsImpactInPesos","CompetitiveSuggestions","NewRegular","BigDrop","BigDropToolTip","BigIncrease","BigIncreaseToolTip","MarginMin","MarginMintTooltip","MarginMax","MarginMaxTooltip","NewCompetitive","OverCategoryTotal","MarginDifPerMonth","NumberOfChanges","OverTotalSuggestedChanges","AcceptedSuggestions","PercentageChange","VsSuggestedPrices","VsCurrentPrices","WeightedByUnitSales","AssumingSameUnitSales","Performance","Suggestion","Product","ValidFromDate","ValidFrom","ValidTo","ValidFromUpdateTooltip","ValidToUpdateTooltip","CompetitorsMap","CostsAndMargins","AuditTrails","PriceZone","CompetitorType","Competitor","OnlyMarkers","MultizoneViews","Any","SelectProduct","SelectCompetitorType","SelectCompetitor","Observed","Type","Rule","PricesEvaluatedByCompetitiveRule","CurrentPrice","SuggestedPriceBasedOnTargetMargin","AssortmentStrategyAndRules","AssortmentStrategyAndRulesSubtitle","GoalsSelectCategory","BenchmarksStepOne1","BenchmarksStepOne2","BenchmarksStepOne3","Compare","SectorsToCompare","SelectCategories","ClustersToCompare","SelectClusters","Filter","SectorsCategories","From","Bars","Spline","SalesComparison","Accumulated","MarginComparison","UnitsComparison","ComparePerformance","AreYouSureSwalTitle","EnableSwal","ToDisableSwal","TheZoneSwal","WarningStoresSwal","BelongZoneSwall","UpdatedZonesSwal","TheProcessContinuesSwal","ErrorWhenDisablingTheZoneSwal","SavePriceZoneSwalTitle","SaveSwal","SavedZoneSwal","SavedZoneSwalSubtitle","ErrorOccurredWhileSavingZoneSwal","SaveCompetitorValidationSwalSubtitle","SaveCompetitorTreeRelationsSwal","TheProcessOfContinuousStorageSwal","ThereWasAnErrorInSavingRelationshipsSwal","DisableCompetitorSwalTitle","CompetitorDisabledSwalTitle","CompetitorDisabledSwalSubtitle","TheProcessOfDisablingContinuesSwal","ThereWasAnErrorDisablingCompetitorSwal","EditCompetitor","TheCompetitorExistsInTheGroupSwalTitle","TheCompetitorExistsInTheGroupSwalSubtitle","YouAreSureToRemoveTheCompetitorSwal","FromTheGroupSwal","EditSensitivityTitle","NewSensitivityTitle","SaveSensitivitySwal","SavedSensitivitySwal","TheSensibilitySwal","ErrorSavingSensitivitySwal","EditRoundingRuleTitle","NewRoundingRuleTitle","DeleteTheRuleSwal","ErasedRuleSwal","HasBeenErasedCorrectlySwal","TheProcessOfContinuousDeletionSwal","ErrorWhenDeletingTheRule","DeleteSwal","ValidationNumberToRound","SaveTheRoundingRulesSwal","SavedRoundingRulesSwal","ErrorWhenSavingTheseRoundingRules","ValidationRangesSwal","ValidationRangesSwal1","AreYouSureSwal","WarningSwal","YouMustSaveSwal","NoChangeWasDetectedSwal","AreYouSureYouWantToReviewTheCategorySwal","RevisionOfCategorySwal","RevisionOfCategorySwalSubtitle","RevisionOfCategorySwalSubtitle2","TheContinuousCategoryReviewProcessSwal","ErrorWhenReviewingThisCategory","GenerateSuggestionsSwal","GenerationOfSuggestionsSwal","TheProcessEndedSuccessfullySwal","TheProcessEndedSuccessfullySwal2","TheSuggestionsContinueToBeGeneratedSwal","ErrorWhenGeneratingSuggestionsForThisCategorySwal","RemoveRuleSwal","RuleEliminatedSwal","TheRuleHasBeenSuccessfullyRemovedSwal","TheRuleSwal","AssociatedWithGenericSwal","ThereCanOnlyBe1RulePerGenericSwal","NoApplicationScopeOrItemsWereAddedSwal","NoApplicationScopeOrItemsWereAddedSwalSubtitle","AssortmentMatrix","ExportDecisions","ExportDecisionsPrisma","TextTooShort","Never","Daily","Weekly","Biweekly","Monthly","Bimonthly","Quarterly","Days1","StandardRounding","ToNearest","ToUp","ToDown","RoundingEndingValidation1","RoundingEndingValidation2","RoundingEndingValidation3","RoundingEndingValidation4","RoundingEndingValidation5","RoundingEndingValidation6","RoundingEndingValidation7","RoundingEndingValidation8","RoundingEndingValidation9","Direction","EditEndings","NewSuggestionRule","NewParentRule","Minimum","Average","Maximum","Mode","LowestModePrice","AverageModePrice","HighestModePrice","HighestRepetitions","PriceVariation","RULE","of","CI","SuggestedCI","NewCI","PriceHistoryAndEstimatedUnitSales","PriceHistory","UnitSalesHistory","CurrentWOTaxes","NewWOTaxes","CurrentTaxes","NewTaxes","CurrentTotalCostWOVat","NewTotalCostWOVat","TotalCostVariation","Margins","MarginHasChanged","CostHasChanged","TicketTypes","AnErrorHasOccurredInfo","ViewAdditionalInfo","DownloadInfo","RequestedActivityProcessing","SalesLegend","UnitsLegend","MarginLegend","PriceLegend","SundayS","MondayS","TuesdayS","WednesdayS","ThursdayS","FridayS","SaturdayS","JanuaryS","FebruaryS","MarchS","AprilS","Mays","JuneS","JulyS","AugustS","SeptemberS","OctoberS","NovemberS","DecemberS","January","February","March","April","May","June","July","August","September","October","November","December","IsThe","WithGreatestIncrease","WithGreatestDecrease","DTSLegend3","DSTFinalMessage","DSTFinalMessageInfo","OfThe","DstPopUpInformativeGraphicLess","RequestedActivityProcessingInfo","SessionExpired","SessionExpiredInfo","AccessDeniedInfo","Ignored","Ignore","Days","Event","User","AddNewFloor","ChoosePicture","NoSelectedFiles","SellingArea","TotalArea","LayoutEdition","LayoutEditionSubTitle","LayoutEditionLegend1","LayoutEditionLegend2","LayoutEditionLegend3","LayoutView","AnalyzeLayoutPerformance","ViewMode","EditMode","Rotate","ViewPlanogram","View","AddTicket","SelectedStore","Off","Floor","NewFloor","ShowInfo","HideInfo","ShowInformationPlanograms","HideInformationPlanograms","AddFloorToLayout","LayoutWOFloor","AddFloorToLayoutEditMode","NoPlanograms","NoPlanogramsSubtitle","InformationPanel","Facings","SquareMeters","LinearMeters","Legend","AdditionalInformation","NewTicket","SelectTicket","SelectPriority","Code","CreateLayout","SelectCluster","PressNextWhenDone","UseCreatedFurniture","First","Last","EditPlanogram","PlanogramView","AnalyzePlanogramPerformance","Communicate1","ExportToExcelInfoPlanogram","AuditPicture","CreateFurniture","ViewDimensions","ActiveInCluster","Autocomplete","Hypothesis","SelectAction","Value","SelectValueType","Forecast","ExpectVolumeSales","ExpectedValue","AvoidChangingOtherThanPrice","AssumptionsAndObservations","EditLevels","Load","DaysInDisplay","DaysInStock","ClusterPerformance","StorePerformance","LoadBehind","LoadAbove","ClearFilters","SelectedCluster","GroupBy","ClickHereViewCategory","MarginGuidelines","GenerateSuggestionsVarTooltipMin","AllowMin","AllowMax","GenerateSuggestionsVarTooltipMax","SignVar","SignVarTooltip","SignVarMargin","SignVarMarginTooltip","MainCompetitor","TargetMarginP","AllowMinTooltip","AllowMaxTooltip","GoToTarget","GoToTargetTooltip","KeepMarginTooltip","LowestPrice","AveragePrice","HighestPrice","SwalReviewCategoryPriceRules","RequestQueued","RequestQueuedInfo","TheProcessContinues","TheProcessContinuesReviewCategoryInfo","AnErrorOccurredReviewingCategory","AreYouSureGeneratePriceSuggestions","TheProcessContinuesGeneratePriceSuggestionsInfo","AnErrorOccurredGeneratingSuggestions","AreYouSureDeletePriceRule","DeletedRule","DeletedRuleInfo","TheProcessContinuesInfo","AnErrorDeletingRule","CompetitiveWrittenRule1","IfMoreThanOneMode","IfMoreThanOneModeWithSameReps","OnlyCompetitorsInSamePriceZone","SamePrice","DifferenceOf","SubsidiesFreights","Fields","PlanogramCreatedIn","In","UploadPicture","TicketsSubtitle","ResolveTicket","CloseTicket","CreatedTicketIn","TicketType","Priority","Comments","Comment","WriteComment","LowPercentage","RisePercentage","BasicInformation","UnitOfMeasure","ShowItemInfront","ShowItemAbove","Regions","Target","YouMustEnterValidNumber","ActionsAgGrid","WantToNotifyEndorsement","TheEndorsementWasNotified","ErrorWhenWantingNotifyEndorsement","ErrorWhenWantingIgnoreSuggestions","EndorseTheSelectedPrices","ModifyMarginIn","ModifyMarginSubtitle","EnterNewMarginValue","YouMustEnterValue","YouMustEnterNumericValue","MarginUpdated","TheMarginWasUpdatedCorrectly1","TheMarginWasUpdatedCorrectly2","SelectAtLeastOnePriceToContinue","EnterNewMarginValueforSelectedProducts","NewPrice","Present","SuggestedS","CurrentPrice1","Original","OriginalAverage","LastCost","CompetitivenessIndex","Sale","Volume","NewSale","CurrentAverage","SuggestedAverage","PercentajeNew","DolarNew","ValidityDates","FromN","ToN","OverlapsAbbreviation","ReportFilteredPricesToTheERP","YouMustSelectAPriceType","YouMustSelectAPriceTypeSubtitle","YouMustSelectAReason","YouMustSelectAReasonSubtitle","GeneratedPriceReport","GeneratedPriceReportSubtitle","DeleteSelectedTests","TestsWereDeleted","TestsWereDeletedSuccessfully","ErrorInWantingToEraseTests","Data","VariationInPrices","Change","Expected","SelectFieldsToElaborateAnHypothesis","IncorrectData","InvalidDateRange","Priceless","DateFromTooltip","StoreCode","ChangesSent","ChangesSentTooltip","NAtooltip","Atooltip","Limit","LimitTooltip","Detour","Discount","SuggestionsGenerated","SuggestionsGeneratedSubtitle","ValidationOfDates","YouWantToSaveThisNewCost","YouWantToSaveThisNewCostSubtitle","TheSubsidyCanNotBeGreaterThan100","SavedCost","SavedCostSubtitle","SavedCostSubtitle1","SavedCostSubtitle2","TheSubsidy","UpdatedSubsidies","ErrorDisablingSubsidy","SaveSubsidy","SavedSubsidy","SavedSubsidySubtitle","ErrorToSaveSubsidy","SaveRegion","SavedRegion","SavedRegionSubtitle","ErrorToSaveTheRegion","CanNotDeleteStores","Include","Exclude","GroupOfArticles","PricesAndCosts","CurrentCost","SalesUn","CompetitiveF","RelationshipItems","KinshipZones","StepOneOp1Importers","StepOneOp2Importers","IntroductionToTheStepsImporters","RemainingStepsImporters","NoCategoriesFoundForAllSKUs","YouWantToAddThem","ValidationWillRunAgain","Severity","Phase","File","WarningM","AllSensitivityRecordsWillBeDeleted","NoArticleInAnyAreaHasSensitivity","ItHasPendingFiles","TheImporterTypeParameterHasNotBeenReceived","UnitOfMeasureOfSale","TypeOfPriceForce","CompetitivePricesSurvey","MassiveLoadOfCosts","BulkLoadingOfLabels","ManualLiquidations","LiquidationsByMaturity","CancelLiquidations","UpdateFieldsOfMeasurementUnits","Liquidation","SelectReason","LowerPrice","IncreasePrice","LowM","Rise","RiseA","StaysTheSame","Drops","IfHyphotesis","ThePriceOfHyphotesis","InHyphotesis","TheDemandIsExpectedHyphotesis","AHyphotesis","ValueIn","Overlaps1","TypeCP","Rejected","PendingPrice","EndorsedPrice","ClickHereToLoadTags","ThePriceVariationLimitHasBeenExceeded","TheMarginsLimitHasBeenExceeded","ThisPriceHasAnOverlapWithAPromotion","SumErrorOfWeightedIndexes","PendingChangesWithoutSaving","TheChangesYouHaveMadeInRoleWillBeLost","RoleAndStrategy","Role","Strategy","Coverage","WeightedIndex","MarketSales","MarketUnits","AnalysisSchedule","Frequency","ActionType","LastRevision","InDays","CopyingThisStructureAndItems","ClonePlanogram","YourRequestToGenerateSuggestionsHasBeenPasted","TheSuggestionsContinueToBeGeneratedAssortment","ConfirmationCreateThisRule","SavedRule","SavedRuleSubtitle","ErrorWhenSavingTheRule","Associations","Values","MarketPrice","SalesRankingMarket","ShareOfSalesMarket","ShareOfUnitsMarket","AccumulatedSalesMarket","Margin2","WeightedIndex2","SalesRanking","UnitsRanking","MarginRanking","ShareOfUnits","ShareOfMargen","Margin2Percentage","ShareOfMargen2","Presence","AccumulatedSales","AccumulatedUnits","AccumulatedMargin","AccumulatedWeightedIndex","NameRole","NameValidation","SelectAtLeastOneFilter","SelectAtLeastOneCategory","TheTemplate","HasBeenCreatedSuccessfully","ErrorSavingTemplate","Confirm","ConfirmPeriod","GenerateTheReport","GeneratedReport","GeneratedReportSubtitle","GeneratingReport","GeneratingReportSubtitle","SKUsTooltip","SKUsTooltip1","SalesDolar","AmountOfSales","SalesQty","Dds","CategoryCluster","AmountSuggestions","HighF","NumberHighSuggestions","ImpactInDolar","PendindFalls","HighSlopes","ImpactByDecisionsByCluster","InternalPerformance","InternalPerformanceTooltip","SalePercentage","SaleUnTooltip","UnitsPercentage","ShareOfSalesInUnits","PercentageMargin","MarginShare","PercentageMargin2","SaleXsku","Rotation","PerformanceMarket","AssortmentCoverage","MarketSalePercentage","ShareOfSalesInTheMarket","GAPSale","GAPSaleTooltip","SaleInUnitsTooltip2","MarketUnitsPercentage","MarketUnitsPercentageTooltip","GAPUnits","GAPUnitsTooltip","InventoryInDolar","ShareOfInventoryValue","InventoryInUnits","GMROITooltip","Mlinear","MlinearTooltip","ProductFronts","GMROSTooltip","PercentageSpace","PercentageSpaceTooltip","Reviews","Revised","ClonePlanogramWarning","ClonePlanogramSubtitle","ImportFromSpaceman","MonthsForCalculation","ClickHereFilterByPriceList","CloneLayout","CloneLayoutWarning","Sp_editLayout_editFloorActionButton","Sp_addLevel_EditTitle","SP_editPlanogram_Autocomplete_AssingFronts","MapsMargin","Pr_Decisions_PriceUpdate","Pr_Decisions_PriceUpdateTooltip","Pr_Decisions_PriceUpdate_StrategySelection","Pr_Decisions_PriceUpdate_Value","Pr_Decisions_PriceUpdate_Variation","Pr_Decisions_PriceUpdate_GoToPrice","Pr_Decisions_PriceUpdate_GoToMargin","Pr_Decisions_ExperimentalPriceUpdate","Pr_Decisions_ExperimentalPriceUpdateTooltip","Pr_Decisions_PriceCopy","Pr_Decisions_PriceCopyTooltip","Pr_Decisions_PriceCopy_Source","Pr_Decisions_PriceCopy_Target","Pr_Decisions_Filters_Markets","Pr_Decisions_Filters_MarketsPlaceholder","Pr_Decisions_Filters_Brands","Pr_Decisions_Filters_BrandsPlaceholder","Pr_Decisions_Filters_Regions","Pr_Decisions_Filters_RegionsPlaceholder","Pr_Decisions_SimulationStop","Pr_Decisions_SimulationApply","Hm_marketBoard_marketBoard","EnterCodesSeparatedByComma","EnterCodesSeparatedBySpaces","EnterCodesSeparatedBySpacesDetail","Strip","Catalog","OneTime","Biannual","Annual","PriceSurvey","ExhibitionSurvey","PriceLabelScan","VoiceCommand","ManualEntry","Sort","TooltipSortModules","Ready","CompetitionCriteria","RegulatedPrices","highSlopes","preferredLanguage","$provide","decorator","$delegate","extended","goNewTab","stateName","absolute","extend","defaultDiacriticsRemovalMap","base","letters","toUnicode","txt","call","arguments","getCookie","cookie","c_start","c_end","setCookie","expires","setTime","toGMTString","escapeRegex","replaceAll","combine","separator","argArray","arg","startsWith","endsWith","apply","pathCombine","getRandomArbitrary","getRandomInt","suffix","isNegative","factor","pow","hasDecimals","imageExists","image_url","http","XMLHttpRequest","send","myArr","mapObj","defineProperty","enumerable","configurable","writable","searchString","lastIndexOf","subjectString","lastIndex","predicate","TypeError","thisArg","removeDiacritics","GSM2Unicode","0","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100","101","102","103","104","105","106","107","108","109","110","111","112","113","114","115","116","117","118","119","120","121","122","123","124","125","126","127","Latinise","latin_map","á","latinise","latinize","isLatin","workflowName","isOk","getMediaType","mediaTypeId","mt","openCloningDialog","newWorkflow","Id","promotionMediaType","promotionTypeChanged","promotionType","cloning","wf","ganttUtils","api","startPromotionDate","timespans","canEditTask","startDateOffset","toDateString","ganttOptions","columnsHeaders","model.name","columnsClasses","currentDateValue","timeFrames","day","end","working","default","noon","closed","weekend","holiday","startPromotion","dateFrames","evaluator","isoWeekday","targets","timeFramesWorkingMode","timeFramesNonWorkingMode","dependencies","conflictChecker","ganttdata","previousTasks","redrawGantt","ganttdataitems","initDate","itemsLeft","currentGroups","countGanttTasks","currentGroup","gdi","groupName","startDate","endDate","previousIdentifier","ganttitem","ganttitemTask","startFromDay","durationInDays","ganttItem","identifier","progress","percent","promotionTaskPreviousId","isStartMilestone","allPromotionMediaTypes","workflowtask","taskChanged","promotionTaskId","oldTask","isRequired","navigateToState","added","taskWithDependences","taskUpdated","closeEditDialog","handleEditTask","rowModel","editTask","handleRemoveTask","indexInWorckflowTasks","hasDependencies","taskHasDependencies","deleteDependencies","hasStartMilestoneTask","addTask","promotionWorkflowId","childTasks","childTask","previousTask","isInUse","linkStore","linkItem","canPublishSuplying","publish","openDownloadDialog","generateAndDownloadItems","selectedPromotion","showSwalWithLink","generateAndDownloadStores","batchLoad","processImporterResults","importerResults","isBusy2","isBusy3","isBusy4","gridOptions","setRowData","refreshView","gridVisible","currentStep","columnDefs","headerName","pinned","suppressMenu","suppressSorting","rowGroupIndex","cellRenderer","severityName","enableColResize","enableSorting","enableFilter","rowHeight","suppressHorizontalScroll","suppressCellSelection","groupUseEntireRow","groupSuppressAutoColumn","groupDefaultExpanded","icons","columnRemoveFromGroup","sortAscending","sortDescending","groupExpanded","groupContracted","columnGroupOpened","columnGroupClosed","angularCompileRows","showNextStep","pages","finishedUpload","validateUploadedFile","finishedValidation","reUploadFile","finishedUpdate","updateItems","finish","loadPromotion","generateAndDownload","selectedMediaTypes","selectedPageTypes","selectedItemTypes","setCategories","ruleParams","selectedCategoriesGroup","categoriesIds","ruleTypes","selectedRuleTypes","brandsIds","categoriesGroups","getSelectedCategoriesNames","openCategoriesDialog","lastCategoriesGroup","lastCategories","canSave","can","isExternal","modeRepeatTimes","modeType","existingRules","saving","savedRule","onChangeRuleType","getModeTypeDescription","competitorsGroupsIds","mediaTypeOnChange","pageTypeOnChange","itemTypeOnChange","cleanInput","promotionRuleId","modeTypeDescription","canPublishTradeAgreements","totalFilteredPromotions","promotionIds","promotionName","promotionCreationUsers","materialCodes","selectedPromotionMediaType","selectedIdsForPromotionReport","allPromotionsForReport","categoryAreas","categoryDepartments","categorySections","articleGroups","selectedCategoryArea","selectedCategoryDepartment","selectedCategorySection","selectedSubCategory","selectedArticleGroup","isLoadingCategoryTree","allReports","promotionTypes","storeLookupText","storesInLookup","loadingLookupStores","lookupStoresNoResults","deleteAll","deleteReport","deletePromotions","getNextCurrentDay","clearResult","run","maximumDateRange","selectedpromotionMediaTypeId","creationUsers","articleGroupId","setPromotionForReport","rangeDays","maximumDate","addDays","subtractDays","isValidDateRange","minimumDate","setAllPromotionsForReport","getElementsByTagName","cells","generateReport","limit","PromotionReportLimit","categoryTree","setDepartments","setSections","setSubCategories","setArticleGroups","isLoadingPromotions","criterions","ph","setFiltersInLocalStorage","criterios","localStorage","setItem","stringify","setSearchResultInLocalStorage","advancedSearch","filtersAux","getFilters","promotionstAux","getSearchResult","creators","createdUserName","createdUserNames","modif","lastModifiedUserName","modifUserNames","forOwn","distinctCampaigns","distinctMediaTypes","distinctStatus","distinctPromotionTypes","hasPermissionOfSuperUser","hasPermissionOfExternal","hasPermissionOfOther","hasPermissionOfInternal","selectedFilterForCampaign","selectedFilterForMediaType","selectedFilterForPromotionType","selectedFilterForStatus","selectedFilterForAsigned","selectedFilterForComunicated","selectedFilterForCreated","selectedFilterForModif","searchId","hideSearchId","optionalPromotionId","promotionMediaIds","comunicada","asignada","ultimaModificacion","creadaPor","campaña","tipoDeMedio","tipoDePromocion","estado","buscador","myFilter","promotionCampaignName","toLocaleLowerCase","promotionMediaTypeName","taken","publishedDate","searchById","filterByCampaign","filterByMediaType","filterByPromotionType","filterAsigned","asigned","filterComunicated","comunicated","filterForCreated","filterForModif","newPromotionPopup","goTo","goToPromotionSearch","goToInternal","rejectedPromotionsPopup","loadingRejectedPromotions","rejectedPromotions","openHistoricDialog","validateDateRange","openChangeControl","getChangeControlPromotions","fromDateNullable","toDateNullable","downloadPrices","mediaPagesIds","searchMediaPageIdByPromotionId","hasPermissionToDownLoad","isCopy","hasEditSpecialPermissions","storeGroups","storesDialogDisabled","allowCombinationGroups","taskMoved","movedTask","plannedStartDate","plannedEndDate","loadStoreGroups","promotionStoreGroupId","sg","selectStoreGroup","promotionStore","setCampaign","changeValidity","promotionCampaignId","buildPromotionTasksFromWorkflow","promotionOverflowDate","promotionTask","findPreviousIdentifier","allTasks","getWorkflowsForPromotion","filterStores","brandName","storesCount","columnMagnet","isSame","core","moveBegin","moveEnd","resizeEnd","promotionCampaignChanged","openStoresDialog","selectStore","brandOfStoreGroup","changeStoresFilter","unselectAll","storeInGroup","changeSwith","showCombinationGroups","saveStores","newStoreGroup","filterStoresByBrand","saveStoresAndGroup","closeStoresDialog","validFromReverted","hasError","getUTCFullYear","getUTCMonth","getUTCDate","isAfter","isBefore","validToReverted","weekendDays","date1","date2","d1","d2","isWeekend","promotionValidFrom","milestoneBranchFirstTask","firstTaskOfOtherBranches","greatestNegativeOffset","otherBranchesNegativeOffset","holidayOffset","holidayMoment","subtract","weekendTotalDays","newStartDate","remainingOffset","calculateDurationInDays","dateUpdated","newEndDate","startOfOffset","dat","valueOf","promotionItems","promotionPriceFileUrl","newComment","canTakePromotion","hasPermissionToTakeInternalPromotion","hasPermissionToCreateInternalPromotion","goToEditMechanic","goToEditItem","goToLoadItem","goToLoadMechanic","updateItemList","takePromotion","chatDto","stringvalidFrom","toLocaleDateString","stringvalidTo","inform","isCreatorUser","informed","lastPriceFileUrl","canReject","showOverlaps","currentOverlaps","normalPromotionalPrice","isLoadingItems","itemCounter","canPublish","getPromotionOverlaps","loadingOverlaps","viewMore","draw","selectedCampaignId","selectedMediaTypeId","promotionMediaTypeId","promotionGroup","prevGroupName","groupCount","drawTask","selectedUserArea","groupCopy","taskFrom","taskTo","selectedCampaign","selectedMediaType","selectedView","changeView","campaignName","mediaTypeName","filterByUserArea","getColumnWidth","reportList","openStatusDialog","canPublishPriceSurveys","$sce","isLoadingCompetitivePrices","pageNumbers","categoriesInFilter","mediaPageType","closingStatus","hasIssue","downloading","currentChats","getPageName","normalPrice","minPrice","actualPrice","actualPriceType","actualPriceReason","actualPriceValidFrom","actualPriceValidTo","prevPromotionalPrice","prevPromotionalAction","promotionalActionValidity","marketPrice","ps","isPromotion","getMarketInfo","internalIc","externalIc","actualInternalIc","actualExternalIc","newPromotionalPrice","varP","promotionMargin","promotionMargin2","forecast","bonusPrice","bonusPoints","openInfo","isLoadingChats","sending","newMessage","openSurveysDialog","surveys","openSuggestionDetailsDialog","sugInt","sugExt","sugInternal","sugExternal","filterPageType","filterPageNumber","filterByCategory","filterIssue","changeAllStatus","changePage","updatePrevious","newPrevious","calculateFields","bonusOrPromotionalPrice","forecastU","internalCost","getIssueStatus","isBonusCoexistence","validatePrices","getTitleForPrices","onChangeStatus","onChangePromotionalPrice","changeCategory","promotionItemsIds","promotionMechanicItemsIds","mechanicItemId","promotionMechanicItems","promotionMechanicItemId","suggestedForInternal","suggestedPriceForInternal","suggestedForExternal","suggestedPriceForExternal","arrayAverage","promotionValidTo","promotionData","taskName","taskNames","plannedStatusList","effectiveStatusList","allResponsables","textResponsable","setFilterResponsable","tarea","responsable","plannedStatusDesc","bloqueo","effectiveStatusDesc","isSuperUser","now","filterTask","setFilterPlannedStatus","setFilterEffectiveStatus","navigateToAction","startedTask","previousTaskName","effectiveStartedDate","effectiveEndedDate","filterDate","filterByDate","removeFilter","applyFilter","openTasksDialog","searchedByPromotion","reloadTasks","validationNegativeNumbers","camposError","mechanicPrice","manualForecast","salesForecast","categoriesExtra","itemsExtra","sellOutNegotiated","isEditPanguiCode","loadForInternalPromotion","hasPermissionToEditMechanic","promoDetails","categoriesInLookup","announcementTypes","itemsToMassiveCharge","extraItemsToMassiveCharge","itemCodes","paymentTypes","validationRetailP","validationSupermarketP","totalValidation","negotiationType","searchwithCheckbox","totalItemCounter","mechanicItemsFiltered","inputVisibility","promotionInfo","selectedVendor","selectedItemInModal","selectionItemOrCategory","selectionItemOrCategoryExtra","newMechanic","isCalculatingOverlap","goToLayout","isReview","isPrintLayoutCompare","goToEditPromotion","mechanicChanged","newType","mechanicType","setChargeRate","showOverlapping","saveComment","isOnlyOneItemInList","isItemInPhoto","validateCheckBoxItemInPhoto","hasCategoryOrSubCategory","observation","ticketDescription","otherDiscounts","startTime","toLocaleString","endTime","targetUnits","shortName","itemOrCategoryChanged","itemOrCategoryExtraChanged","setNegotiationType","sellIn","sellInNewCost","sellOut","setAcumPromotion","acumOtherPromotions","setApplyOfferPrices","applyOfferPrices","setCardRestriction","cardRestriction","bonusCard","wongCard","metroCard","otherCard","participantGoods","setUnitsRestriction","unitsRestriction","moneyRestriction","moneyRestrictionValue","setMoneyRestriction","unitsRestrictionValue","setAffectsClientMargin","affectsClientMargin","setCharge","charge","chargeRate","setApportionment","apportionment","retailP","supermarketP","negotiatedChargeRate","calculateControl","itemsSum","extraSum","promoVsNormal","targetItemDiscount","discount","discountP","isSubstitute","itemOrCategory","sourceUnits","buyCash","stickers","buyCashSponsors","stickersSponsors","payUnits","sourceItem","targetItem","targetUnitsAtDiscount","targetUnitsDiscount","itemPlusMoney","payAmount","ministerPermission","discountByCategoryP","vendorId","excludedItemCodes","paymentType","returnAgreement","estipulatedMarginP","estipulatedMargin","mecIt","umvId","addCategoryToMechanic","scrollY","saveCategory","selectedCategoryInModal","categoryCode","investmentApportionment","showClose","addCategoryExtraToMechanic","unitsToTake","addItemToMechanic","saleUnitOfMeasureCode","sapDescription","umv","subcategoryCode","subcategoryName","subcategoryId","minimalPrice","currentPrice","currentPriceType","currentPriceReason","fromPrice","toPrice","marginPriceP","minRange","maxRange","dailyAvgSales","dailyAvgUnits","unitsForecast","marginForecastP","marginForecast","internalPromotion","massiveCharge","isLoadingMassiveCharge","filterCategories","isAlreadyCharged","itemCargado","doMassiveLoad","extraMassiveCharge","addItemExtraToMechanic","itemType","deleteMechanicItem","deleteMechanicExtraItem","deleteMechanicCategory","deleteMechanicExtraCategory","deleteChat","takingExtra","blockDiscountP","blockDiscount","blockpunctualDiscountP","blockpunctualDiscount","punctualDiscount","punctualDiscountP","m3","m3name","m3Extra","totalExtra","m3SubTotal","dues","interest","c4","extraItemCodes","searchTerm","itemExtraLookupText","isTitleMechanicsCollapsed","isApportionmentCollapsed","isSelectionCollapsed","isExtraSelectionCollapsed","isControlCollapsed","isRestrictionsCollapsed","isOtherDataCollapsed","isNegotiationCollapsed","isExtrasCoverageCollapsed","calculateOverlap","distinctPromotionsOveralps","filterItemList","activationDate","promotionMediaPage","mainCategoryId","secondaryCategoriesIds","toList","canEditPages","categoriesCaptains","categoriesSecondaries","backgroundImageUrl","isValidating","isValidated","createPages","exist","promotionMediaPageType","updateChangeDetector","selectedPages","dataForSelectedPages","categoriesGroupEditMode","selectPage","addToSelectedPages","secondaryCategories","captainCategoryChanged","secondaryCategoryChanged","showPreview","secondaryCategoryId","$broadcast","getPageNumberAndType","isLayoutmodified","validateCategories","shouldCompleteAllPages","deleteCategoryGroup","indexOfPageOnChat","initPromotionMediaPageLayoutId","openCategoriesGroupDialog","selectionMode","newGroup","isSelection","toggleMode","addNewCategoriesGroup","isMain","onCategoriesOfGroupChanged","childs","allCategories","assignCategoriesGroup","mainCat","editCategoriesGroup","catOfGroup","setCategoryCaptainInGroup","openPromotionsExplorer","getOtherPromotionData","pageData","applyForSelectedPages","isRecreated","blockedForSave","recreateTable","layoutForm","$valid","layoutRows","layoutColumns","forecastItems","canPublishForecastManual","errorType","showCategorySwal","addCategoryConfirm","errorName","itemPosition","salesUnitOfMeasure","updateForecast","TAX","hasPermissionToEditItem","decimalFormat","integerFormat","canLookupItems","isLoadingSuggestedPrice","isLoadingMarketPrice","variants","savedFiles","selectedImage","selectedIndex","viewVariantInfoReadOnly","promotionItemForecastSales","forecastCash","estimatedMarginP","estimatedMarginCash","forecastMarginP","forecastMarginCash","strategyInternalIc","strategyExternalIc","marginP","proceedToCharge","changeProceedToCharge","chargeType","announceType","getAnnounceFee","promotionItemStores","promotionalAction","prevPromotionPrice","validity","announceFee","stockCash","storeStock","cdStock","storesUnderStockDays","storesUnderStockDaysDetail","dailyUnits","stockDays","loadOverlapping","vendorLookup","vendor","lastSearchedItem","vendorsInLookup","loadingLookupVendors","lookupVendorsNoResults","promotionItemVendors","changeNegotiationType","negotiatedAmount","negotiatdAnnounceFee","goToVariantView","baseUmvId","goToPublishedView","isLoadingForecast","getRangeTopography","rangeTopography","newIndex","oldIndex","isFinite","parameter1","anyItemInPhoto","variantItemsInPhoto","textCampaign","textTypeOfpromotion","layOutsAssignmentStatus","initialChargeStatus","partUploadForReview1Status","commercialReview1Status","partUploadForReview2Status","commercialReview2Status","closingPriceStatus","partUploadForReview3Status","finalValidationStatus","getTemplateForPopover","isOpenPopover","promotionStatusList","campaignsList","typeOfPromotionList","setFilterCampaign","setFilterPromotion","mediaType","popover","isOpen","setFilter","responseList","responseCampaings","canUploadFiles","canDownloadBarcodes","isStore","canNotifyStores","storesCode","selectedMarkdownTitle","currentPromotionalActionsList","promtoionAndMarkdownList","markdownPlanTypeStr","inputId","inputStartDate","showItem","showStore","filterId","updateVisibleList","filterMediaType","filtermarkdownPlanType","filterCampaign","filterPromotionType","query","lowercase","finishDate","openUploadDownloadDialog","comType","upDownDialog","getDownloadUrl","erratasUrl","digitalVersionUrl","exhibitionGuideUrl","downloadComments","closeUploadDownloadDialog","historics","isUploading","selectedMarkdownPlanType","AllowDownloadCommunications","communicationReportDownloaded","downloadMarkdownItems","expiredOnly","rejectedOnly","generateAndDownloadItemsForStores","downloadItemBarCodes","totalPages","currentPage","previousPage","nextPage","assistantList","begin","promoComms","isStoreProfile","markdownPlanTypes","allCampaigns","canSaveThisName","campai","loadCampaigns","promotionsList","canDelete","canPublishAssortmentActivation","canpublishValidacionFinal","canpublishSubidaDePieza","canpublishInputArmadoDePieza","canPublishSecondRevision","canPublishCargaArticulos","canDownloadPdfInFinalValidation","disableMassiveCharges","userCategories","showRelatedItems","variantsHaveLength","showAllitems","showIndividualItems","showRelated","existingItem","announceTypeLabel","chargeTypeLabel","existingItemDescription","idloadItemToPosition","batchLoadExhibitions","buildRowExhibition","itemStores","storesForItem","getExhibitionName","exhibitionTypeName","exhibition","downloadExcelExhibitions","uploadFileExhibitions","validateUploadedFileExhibitions","reUploadFileExhibitions","updateExhibitions","finishExhibitions","saveSwapping","totalPositions","gotoEditOptionalItem","setPageInLocalStorage","toDeleteCount","removeItemOfList","publishedItemsCount","GetLayuotLenghtAvailable","canPublishTask","uploadPageImage","uploadingPageImage","errorMsg","uploadMultiplePageImage","imgSizeMax","imgs","imgName","imgNamesArr","cont","printAll","selectIndividualPage","selectWorkingPage","checkSelectedPages","objPageIdAux","getPageId","positionInLayout","editItemWhitoutPosition","addReserved","reservedScope","itemChat","saveReserved","adding","cancelReserved","filterItems","edit","goToAddItem","goToAddMechanic","loadVariant","variantItem","hideExcludedStoresPostion","canEnterPage","catId","subCategoryIds","showExcludedStores","pageToSelect","pp","issue","checkIssueForSubstitute","showMechanicProgram","showInformPrices","goToLoadItems","goToOutput","numberColWidth","summary","summaryFiltered","summaryToUse","Levels","hideAmountParameters","copyValues","allowMaxVariation","allowMaxViolation","allowMinVariation","allowMinViolation","goToTargetMargin","keepMargin","keepMarginAmount","mainCompetitorGroup","mainCompetitorGroupId","dropDownDecisionEditor","editing","eCell","eLabel","createTextNode","eSelect","eOption","eOptionEmpty","colIds","colId","changedRows","refreshCells","nodeValue","getNodeChildDetails","rowItem","expanded","clearAlternativeColumn","alternativeColumn","percentageEditorWithDecimalAndZero","percentageRendererWithZero","eSpan","innerText","recomputeAggregates","moneyEditorWithZeros","moneyRendererWithZeros","gridOptions2","copiedSummary","onSearchKeyUp","filterSummary","dest","idsToRemove","anyOfThisAreValid","anyChildrenValid","copyValuesFromFilteredToComplete","completed","goToRules","encodedcategoryGroup","encodedcategory","encodedsubcategory","forEachNode","checkboxEditorMarginGuides","colDef","onFilterChanged","setQuickFilter","openImporterDialog","rowSelection","groupSelectsChildren","groupColumnDef","singleClickEdit","enableRangeSelection","renderer","checkbox","innerRenderer","parentName","anchor","headerTooltip","cellClass","getClassForCell","checkboxEditor","setColumnDefs","PriceRulesCategory","Grid","HideAmountParameters","queueService","itemsRule","priceRulesTable","priceRuleTypeNames","priceRuleTypeName","filterByPriceRuleTypeName","genericItems","isItemIncludeDisabled","includeAllItems","excludeAllItems","priceRuleTypeLabelColors","replaceAccents","defaultPriceSurveyTypes","selectedRuleId","excludedItemId","totalConflicts","isLoadingRules","articlesGroup","allArticlesGroup","zonePricelist","dropDrownNewSuggestionRule","allVendorsChecked","allArticlesGroupChecked","allPriceListsChecked","allCategoriesChecked","isEditingCompetitiveRule","isEditingMarginRule","isEditingParentRule","isEditingZoneRule","isEditing","dropDrownNewSuggestionRuleText","dropDrownNewParentRuleText","suggestionRuleTypes","parentRuleTypes","calculationTypes","modeFallbacks","modeTypes","relationshipTypes","excludedSubCategoryIds","excludedTags","includedItemProperties","excludedItemProperties","includedItems","itemproperties","exitemproperties","showGenericItem","setAsGenericParentRule","setItemSensitivities","setItemTags","existingCompetitiveRules","existingParentRules","includeItem","excludeItem","newCompetitiveRule","newMarginRule","newParentRule","newZoneRule","newRule","createCompetitorRule","createMarginRule","createParentRule","createZoneRule","canSaveCompetitiveRule","competitiveRule","writtenRule","calculationType","modeFallback","canSaveMarginRule","marginRule","canSaveParentRule","parentRule","canSaveZoneRule","zoneRule","deleteRuleFromTable","mapItemExcludeToGrid","itemRule","initRuleEdition","keepMarginType","marginRuleType","marginAmount","marginType","dtoCat","dtoArtGrp","artGrp","ag","pListDto","vDto","iSDto","itemSensitivitiesToInclude","tDto","itemTagsToInclude","tagId","itemProperties","iDto","includeItemProperty","exarticlesGroup","exArtGrp","eAg","expricelists","exPl","exvendors","exVendor","exitemSensitivities","eIsDto","exItemSensitivities","itemSensitivitiesToExclude","extags","exTagDto","exTags","itemTagsToExclude","exTag","excludeItemProperty","cgp","cgfp","percentageDifference1","differenceType","competitiveDifference","priceDifference1","onlyCompetitorsWithSamePriceList","itemLookupOnItemSelect","relationshipType","rst","percentageDifference2","priceDifference2","mainPriceList","zone","selectAllPriceListsForRule","selectAllVendorsForRule","selectAllCategoriesForRule","excategories","selectAllArticlesGroupForRule","addItemsToInclude","itemsToInclude","addExcluded","es","et","eip","deleteItemProperties","isExclude","categoryChanged","getArticleGroupsForCategories","ga","articleGroupParentId","existingRuleSelectedCompetitive","priceSurveyTypesText","compGrp","isLoadingCompetitors","compDiference","shouldIncludeItems","articlesGroupToExclude","vendorsToExclude","priceRuleCompetitiveDto","considerModeCount","priceRuleMarginDto","existingRuleSelectedParent","difType","existingGenericRule","genericItemId","itemLookupTextPrefix","isExternalFilterPresent","doesExternalFilterPass","isInSelectedPricelist","isInSelectedVendor","vendorCode","isInSelectedCategory","isInSelectedAlternativeCategory","alternativeCategoryCode","sensitivities","isInSelectedSensitivity","isInSelectedTag","isInSelectedItemProperties","itemWithUmv","excludedItem","objectIndexOf","isParentItem","includedItemsInRule","isIncludedAndIncludedInOtherRule","nodeData","marginRuleId","competitiveRuleId","parentRuleItem","parentRuleZone","priceListList","expriceListList","vendorList","exvendorList","categoryList","excategoryList","alternativeCategoryList","exalternativeCategoryList","articleGroupCode","sensitivity","exsensitivities","itemSensitivityName","splittedTags","st","tagName","exitemProperties","loadRules","loadExistingRules","isLoadingCompetitorGroupParents","isLoadingCompetitorGroups","loadPriceLists","loadVendors","loadCategories","loadArticlesGroup","priceRules","PriceRules","CompetitiveRule","DefaultPriceSurveyTypes","itemLookupNoResults","itemLookupLoading","itemLookupOnKeydown","onlyMainItems","dynamicTitle","dynamicText","priceRuleDescription","generalParentCode","priceRuleParentDto","excludeSelectedPriceList","priceRuleZoneDto","includeAction","includeChk","excludeChk","indexInc","indexExc","skipHeader","skipFooters","skipGroups","allColumns","onlySelected","suppressQuotes","fileName","columnSeparator","exportDataAsCsv","exportPriceRulesTable","pr","acceptance","dateOld","newDate","getDateToString","vendorName","includeSelectAll","forEachNodeAfterFilter","excludeSelectAll","marginRuleTypeChanged","marginTypeChanged","openTagsDialog","include","includeTagsDialog","groupTagsDialog","tagsDialog","itemTagsToIncludeDialog","distinctGroupTags","onChangeGroupTagsDialog","applyDialog","anyTags","itemTag","backdrop","keyboard","groupHideGroupColumns","rowDeselection","showToolPanel","suppressRowClickSelection","columnGroupShow","childrenAfterFilter","decimalRenderer","percentageRenderer","cellStyle","white-space","cell","conflicts","parentItems","ParentRuleItem","ShowGenericItem","competitorsChart","transactionDateString","productsNames","productGroup","prodOne","prodTwo","unitsProductsCompetitors","unitsProducts","pricesGAP","auxPrices","minorPrice","prod","productDate","gap","setDates","openCalendar","selectedPriceList","isLoadingChartCompetitors","dataCompetitors","updateChartCompetitors","changePriceListSelected","GAP","multiline","weeklyData","chartConfigurations","getChartConfiguration","mustShowChart","getPricesEvolution","setGridOptions","moneyRenderer","groupHeaders","dataSet","selectedCalculationType","pointsGraphValue","showLogos","selectedPriceListChart","getPercentageDeltaForCompetitor","competitorPriceLists","priceListIsInData","competitivePriceListPrices","toggleInfo","activePriceList","activeCompetitor","activeCompetitorPriceList","isShowInfo","getCompetitorPrice","priceAvg","priceDeltaPercentage","getShowInfoX","getXaxisForCompetitor","getShowInfoY","getShowInfoTextX","priceListXaxis","competitorXaxis","selectedPriceListsIds","selectedBrandsIds","xAxis","viewPriceListInfo","selectedBrandsNames","distinctPrices","distincBrands","brandsArrays","brandPrice","brandArray","OxxoGas","Shell","ExxonMobil","British Pretroleum","Chevron","lines","onChangePriceListsFilter","xOffset","onChangeBrandsFilter","gapWithLimit","percentageRendererNoDecimals","cls","implementedDate","dateTimeRenderer","onlyNotImplemented","onlyNotImplementedChange","lastFromDate","lastToDate","first","second","downloadFrame","filteredPriceLists","filteredCompetitorGroups","filteredBrands","filteredTags","filteredPriceSurveyTypes","reportType","sensitivityIds","hideZonesFilter","hideCompetitorsFilter","changePriceType","isCategoryCollapsed","isCompetitorsGroupCollapsed","isTypeSurveyCollapsed","loadRegions","editRegion","storeSelected","getDecimalsName","decimal","roundNumber","priceTypeToTest","roundedNumber","unmodifiedPoints","selectedPriceType","showDd","inputNewTermination","newPointValue","newRoundingAdded","addNewPriceRounding","roundingTolerance","roundingToleranceP","roundingDecimals","pointsStr","priceRoundingType","priceRoundingMidPointType","changeType","loadPriceRoundings","showInputNewPrice","setRoundingTolerance","showPointsEditor","showInputNewTermination","deleteTermination","cancelDialog","addNewTermination","errorMessage","decimalPlaces","saveTermination","exids","plids","plexids","priceRoundingMidPointTypes","selectedPriceListName","markersLayer","FeatureGroup","iconUrl","addLayer","FilterByPriceList","loadPriceListsSubsidies","disablePriceListSubsidy","excludedText","editPricelistSubsidies","priceListSubsidyId","priceListSubsidy","truckCost","subsidy","itemSelected","priceListSelected","storePricelists","storePriceLists","disablePriceList","storeNames","spl","getStorePriceListNames","editPricelist","isNational","isBase","listIndex","doInform","informingPrices","reasons","selectedReasons","implementation","swalOptions","informResult","loadPreviousReports","loadingPrices","showPriceGrid","loadingReasons","distinctPriceTypes","allSelected","checkboxSelection","headerCheckboxSelection","headerCheckboxSelectionFilteredOnly","colWidth","getClassForCel","groupKeys","suppressColumnMoveAnimation","onGridSizeChanged","sizeColumnsToFit","selectedFilterForPriceType","setMinutes","useCustomDate","dateToInform","toggleSelection","isAnyFilterPresent","setSelected","deselectAll","selectAll","customValidFrom","storePricesToInform","filterByPriceType","showLoadingOverlay","itemSensivilities","devolverTextual","dias","sensivilities","surveyFrequencies","cleanInputs","monday","tuesday","wednesday","thursday","friday","saturday","sunday","selectCheckbox","surveyFrequency","rowNodeDataComparative","editableColWidth","setColumnDefinitions","colIndex","emptyRenderer","headerCellRenderer","columnApi","getRowGroupColumns","desc","lastChat","chatsQuantity","newLabel","sensitivityLabel","tooltipField","hidePricesCopiedFromOthers","copiedFromPriceId","backgroundNumberClass","moneyEditor","getClassForImpactCell","IsVariationOutOfGuidelines","eIcon","IsVariationAmountOutOfGuidelines","hideCurrentPrices","currentPriceValidFrom","getClassForImpactCellInverse","integerRenderer","moneyRendererNoDecimals","getClassForMarginCell","IsMarginOutOfGuidelines","IsMarginAmountOutOfGuidelines","cellClicked","navigateToPriceMap","showSuggestionModal","externalFilterChanged","containsAllTags","splittedText","rowSelected","originalNewPrice","selectedFilterForPriceList","selectedFilterForSensitivities","selectedFilterForIssues","selectedFilterForAction","filter1","filter4","filter7","filter2","filter3","filter5","filter6","rowNode","readyToEndorse","priceSuggestionStatus","childNode","showParentBecauseOfChildStatus","rowNodeData","simulateSuggestionAcceptance","revert","isRevert","refreshRows","showAverageCost","PriceDecisions","ShowAverageCost","setColumnVisible","HidePricesCopiedFromOthers","HideCurrentPrices","isNewFilter","new","toggleToolPanel","showing","isToolPanelShowing","Cancelar","getSelectedNodes","newPricesToIgnore","tg","selectedTags","existingTagIds","saveTags","modifyMarginProductGroup","isPrice","totalGrossMarginAbs","currentGrossMargin","toMoneyNoDecimals","toPercentage","modifyMargin","filterText","filterByIssue","filterByAction","filterByPricelist","filterByItemSensitivity","searchGridInputKeyPressed","showCurrentPriceLoader","openCurrentPriceModal","currentPrices","openRegularPrice","onRowSelected","onCellClicked","calculatedCost","orderUnitOfMeasureId","orderUnitOfMeasureCode","itemChanged","isDisabled","distributionCenter","vendorSelected","masiveUpdate","out","externalCode","noGroups","noGroup","competitorGroupIndexOf","groupOfCompetitorsLst","filterNodes","nodePassFilter","selectedCompetitorGrp","competitorsWithoutGroup","competitorsLst","lstPlaces","lstMarkets","showMarkets","onlyNews","singlePriceLists","SinglePriceLists","onlyNewsChange","onlyWithoutGroup","onlyWithoutGroupChange","showGroupEditor","groupData","getParent","isNewFn","showCompetitorEditor","competitorData","competitorIndexOf","len1","i1","len2","i2","competitorGroupChild","len3","i3","saveCompetitorGroup","idx2","competitorGroupChildrenIndexOf","saveCompetitorTreeRelations","groupOfCompetitorsLstOriginal","loadCompetitorsWithoutGroups","itemDroppedInCompetitorsList","itemDroppedInCompetitorGroupList","subgroup","root","subgroupOriginal","removeCompetitorFromGroup","filterCompetitors","competitorsLstOriginal","getCompetitorCount","nodes","onNewCompetitorText","lists","A","B","goToDecisions","endorseLink","newCompetitive","transactionYear","transactionMonth","transactionDay","salesChartData","salesChart","marginChartData","marginChart","newTest","deleteSelection","notSelected","$resource","selectedStoreBase","storeZoning","expectedActionsArray","selectedAction","selectedActionType","selectedStoreMirror","selectedCategory2","selectedCategory3","selectedCategory4","expectedAction","actionTypesArray","hyphotesisText","itemText","hypothesis","formHyphotesis","actionValue","expectedValue","categoryChange","filterCategory5","filterCategory4","filterCategory3","canSaveTesting","saveTesting","oldPrice","changeAmount","changeAction","storeBaseId","storeBaseCode","storeMirrorId","storeMirrorCode","itemUomId","itemUomCode","changeInPriceAction","changeInPriceType","changeInPrice","expectedChangeInDemand","expectedChangeInDemandAction","storeBaseChange","isMirror","actionsArray","categories4","categories3","categories2","markdownService","getTypologyByLevel","typologies","maxOrder","minOrder","orders","insert","substr","planTypes","paretoSectionLevels","useDistributionCenterStock","isDiscountTypeColumn","isObjectiveColumn","rendererFunction","greaterThanNoDecimals","fields","setField","deleteClicked","loadGridData","validationErrors","maxAgingLevel","priorizeBy","areChanges","nodesCount","canGenerateSuggestions","errors","auxNode","getRowStyle","isEnabled","GetNewRule","selectedTypologies","selectedPriorizeBy","priorizeBys","selectedPlans","selectedPlanNotIncluded","minUnits","getDefaultDate","getPlanTypes","planTypesNotIncluded","plans","planNotIncluded","planTypeNotIncluded","hasChildrenEnabled","fieldId","onChangeCallback","hName","categoryParentName","onlyPlanRow","isOptionalColumn","editor","onlyCategory4","appliesOnChildren","discountTypes","onDiscountTypeChange","doesColumnApply","dependencyField","discountType","onObjReduccionDeStockChange","onObjDdsChange","objectiveDds","objectiveVentasUn","chile","categoryd","categoryIid","validToUndetermined","clearColumn","getField","clearDependencyColumn","columnController","changeBrand","categories5","hasDiscountType","planType","isPlanRow","hasDetails","isOptionalRow","hasObjective","renderMarginMin","renderMoney","integerRendererWithoutZero","isLoadingQuickLoad","objectiveTypes","forecasteds","stagesCount","stages","containCategory","containCategoryStages","countStages","optionalValue","investment","selectedBrandsToSave","marginmin","marginMin","minStockLiquidable","PlanDetailDtos","BrandIds","addBrandToSave","brandClick","hasChanges","quickLoadEnabled","doQuickLoad","selectedCategories2","selectedCategories3","selectedCategories4","selectedCategories5","auxCategory","discountTypeString","forecastSellOut","quickLoad","categorySettings","applyQuickLoad","cat3","cat4","cat5","cat2","nodeDetail","updatedByQuickLoad","stageId","selectedEditedActionFilter","editedAction","canAceptar","canEndosar","canValidar","PrevCategory","expandAll","storeFilteringText","dropDrownStores","isopen","allStores","suggestionFilterText","dropdownSuggestionFilter","allSuggestionFilter","stageFilterText","dropdownStagesFilter","allStagesFilter","stockFilterText","dropdownStockFilter","allStockFilter","statusFilterText","dropdownStatusFilter","allStatusFilter","editedActionFilterText","dropdownEditedActionFilter","allEditedActionFilter","handLoad","selectedStoreId","selectedSugestionFilterId","selectedStageFilterId","selectedStockFilterId","selectedStatusFilterId","selectedStage","selectedCategoryId","showCanal","MarkdownDecisions","ShowCanal","visitedPages","filterByStore","filterBySuggestion","choise","filterByStage","filterByStock","decisionType","splitCategories","suggestionId","currentMarkdownPlanType","suggestedAction","takenAction","keepPlanStageId","currentMarkdownId","renderForExport","actualDiscount","newDiscount","originalCost","lastCost","headerClassCell","getAction","inPlan","markdownActions","suggestionsActions","cb","eHeader","eTitle","typology","percentageRenderer2Decimals","decimalRenderer4","markdownActionsExpire","containSuggestedAction","attrIdInDropDown","suggestedMarkdownPlanType","isHeader","planActive","newOption","dropDownEditor","onEditedActionChange","newMargin","categoryMinMargin","newDiscountStr","newStage","loadingMotivoSugerencia","motivoSugerencia","showMotivoSugerenciaModal","parentNode","suggestedGrossMargin","loadPageLocally","oldNode","localId","oldNodeChild","loadMarkdownSuggestions","applyingFilters","removeCategory","yes","volverSeleccionCategoria","processCellCallback","expandOrCollapseAll","onGroupExpandedOrCollapsed","markdownActionsForEdit","pageIndex","editedActionString","categoriesLv4","canIgnoreAll","canActivate","canSendToPrices","decisionsTypes","SUGGESTIONS","ENDORSE","VALIDATE","accepted","totalSuggestions","validateLink","endorsed","validated","sendToPrices","informingMarkdowns","idsToInform","markdownsToInform","getFilteredMarkdowns","loadingMarkdowns","showMarkdownGrid","canInform","markdownTypeId","inventoryService","groupColWidth","inventoryDaysGetter","inventoryTheoryGetter","vendorLeadTime","inventoryUnitsTheoryGetter","deltaInventoryGetter","deltaInventoryUnitsGetter","aggFunc","valueGetter","inventoryData","$container","filterFns","GMGreaterThan","UnitsRange","advancedFilters","PriceRange","GMRange","gm","ium","classify","articles","isotope","itemSelector","layoutMode","getSortData","itemElem","GM","isMatched","buttonGroup","$buttonGroup","sortByValue","sortBy","frequentFilter","filterValue","unitsSliderOptions","to_max","to_shadow","postfix","prettify","priceSliderOptions","gmSliderOptions","onCategoryChanged","catName","onUnitsSliderChanged","fromNumber","toNumber","onPriceSliderChanged","onGmSliderChanged","toggleAdvancedFilters","turnOn","showAdvanced","CategoryId","SubcategoryId","EAN","palette","subCat","tinycolor","toHexString","paletteCatColor","byName","newColor","lighten","lastColorName","allBrands","percentageRendererPP","salesPYDelta","marketSalesPYDelta","unsecured","roleAdmin","roleRoot","claim","userClaims","exception","province","projection","vm","xyz","pointRadius","get_xyz","bounds","w_scale","h_scale","province_clicked","us","topojson","feature","objects","departamentos","features","enter","department_mouseenter","department_mouseleave","zoomOut","province_mouseenter","select","NAM","province_mouseleave","FNA","getName","provincias","center","geo","centroid","mercator","hscale","vscale","xs","NaftaSuper","GasoilRegular","NaftaPremium","GasoilPremium","Dolar","BrentOil","NgMap","getMap","setStyle","getProvinceColor","strokeWeight","google","maps","InfoWindow","onClick","getProperty","cap","ss","provincia","capital","habitantes","totalSS","onMouseover","revertStyle","overrideStyle","onMouseout","datasets","showPrices","updateKPIs","lastDaySales","lastDaySalesChange","lastDaySalesChangeIcon","lastDayUnits","lastDayUnitsChange","lastDayUnitsChangeIcon","lastDayMargin","lastDayMarginChange","lastDayMarginChangeIcon","lastDayPrice","lastDayPriceChange","lastDayPriceChangeIcon","geojson","heatMap","control","heatType","lastProvince","layers","loadProvincia","layer","statesData","emptyData","mouseover","highlightFeature","mouseout","resetHighlight","zoomToFeature","getStyle","fillOpacity","dashArray","highlightedLayer","metadata","entityType","population","TOTAL_VARONES","TOTAL_MUJERES","houses","TOTAL_VIVIENDAS","Browser","ie","opera","bringToFront","resetStyle","isZoomAplied","fitBounds","getBounds","isDepartamentosLoaded","geoJsonData","geoJson","onEachFeature","loadDepartamento","toUpperCase","loadDepartamentos","zoomToDepartamento","long","PROVINCIA","DEPARTAMTO","onAdd","DomUtil","create","salesDelta","unitsDelta","marginDelta","oldVar","updateTime","dealWithSubCategories","sub","subItem","layerItem","cleanLayers","updateHeat","selectedCategoryGroup","bigMoneyRenderer","bigIntRenderer","hierarchyId","rowGroupOpened","filterByCategoryGroup","selectedPath","varName","varGoalName","getFilteredData","getGoals","goal","setPath","goal1","goal2","hierarchyName","goal3","goal4","goal5","setGaps","costGoalGap","costGoal","unitsGoalGap","unitsGoal","salesGoalGap","salesGoal","marginGoalGap","marginGoal","costGoalGapP","unitsGoalGapP","salesGoalGapP","marginGoalGapP","setGap","varNameP","isFirstLoad","renderGoalChart","unload","loadGoals","toTitleCase","dstRunning","dstInited","allCategoryGroups","states","Chart","destroyed","getValueText","sizeType","disableStart","that","centersBySalesDiff","dGravity","damper","dFriction","force","circles","changeTickValues","tickChangeFormat","groupby","scaleRadius","exponent","domain","range","scaleChange","linear","clamp","scaleGroup","ordinal","rangePoints","scaleFillColor","scaleStrokeColor","currentLayout","runningStory","highestSubcategoryId","lowestSubcategoryId","maxSales","allGroups","cur","createNodes","createVis","hMultiplier","radius","categorizeChange","colorType","changeCategorySize","classed","finishStory","centers","clearLayout","getCenters","vname","memo","cols","show_details","xpos","ypos","hide_details","getStrokeColor","getFillColor","makeInteractive","onLayoutChange","removeLabels","beginStoryOrig","delay","beginStory","showOverview","createBubbles","showSizeLegend","resizeBubbles","showColourLegend","colourBubbles","displayLayoutChange","highlightBest","highlightWorst","clearChangesEffects","displayLayoutCategory","showFinishDialog","gravity","defaultCharge","friction","sortForLayoutAll","alpha","buoyancy","toPrecision","showCustomTooltip","__data__","displayLayoutTotal","sortForLayoutChange","foci","sortForLayoutCategory","collide","rangeRound","targetY","targetX","sin","PI","quadtree","geom","maxRadius","nx1","nx2","ny1","ny2","visit","quad","x1","y1","x2","renderChart","selectedState","startDst","changedCategoryGroup","homeDashboard","homeDashboard2","sliderOptions","showTicksValues","stepsArray","notification","notificationPriceArrow","notificationUnitsArrow","Dashboard","HideBoxes","decisionsConfig","AssortmentDecisions","getYTDComparison","getDashboard","getNotifiactions","getPriceLabel","reason1","reason2","showR1","showR2","reason1Agreed","reason1Disagreed","reason2Agreed","reason2Disagreed","disagreeClass","grantPoints","notif","causePrice","causeUnits","isLoadingBoxes","discard","agree","disagree","feedback","reason1feedback","reason2feedback","compositionInf","icl","co2","iva","comision","flete","iibb","refineria","iclPrc","co2Prc","ivaPrc","comisionPrc","fletePrc","iibbPrc","refineriaPrc","compositionInfD","compositionSup","compositionD","selectedComposition","category20b","treemap","sticky","kx","dx","ky","dy","getComputedTextLength","getBrandTreeMap","selectedStores","selectedItems","selectedClusters","filterByItem","filterByCluster","storeIdsToCompare","categoryIdsToCompare","clusterIdsToCompare","itemIdsToCompare","itemIds","countrylabel","first_time","lastMonth","xScale","yScale","radiusScale","maxUnits","colorScale","orient","ticks","yAxis","bisect","bisector","dot","interpolateData","dragit","trajectory","clear_demo","statemachine","current_state","utils","animateTrajectory","object","activate","ease","displayYear","sliderValues","getMonthLabel","updateSlider","onUpdate","slider","minDate","utcDate","interpolateValues","demo_interval","removeAll","demoCount","play_demo","assortmentReportService","getFilterData","allBrandsCheck","formats","allFormatsCheck","allFormats","selectedFormat","customerTypes","allCustomerTypesCheck","allCustomerTypes","selectedCustomerTypes","allClustersCheck","allClusters","selectedCategorySector","allSubcategoriesCheck","allSubCategoriesFiltered","selectedSubCategorias","openByBrand","openByManufacturer","PeriodMonths","radioPeriod","subItems","filteredAllCustomerTypes","allCustomerBrands","allCategorySectors","allCategoryGroupsFiltered","allCategoriesFiltered","allTemplates","showLoaderExecute","showLoaderExport","lastExecutedReports","selectedReport","showLastExecutedReports","changeCategorySector","ar","changeCategoryGroup","subc","allBrandsChange","filterCustomerTypes","customer","customerFormatBrands","customerId","filterFormats","storeFormatId","allFormatsChange","allCustomerTypesChange","allClustersChange","allSubcategoriesChange","filterData","openSelectedTemplate","periodMonths","openTemplate","ExecuteReport","showTagError","bSubItem","activeSkus","disableTags","select3M6M","select12M","loadingReport","reportRows","isGeneralCollapsed","isScopeCollapsed","isOpeningCollapsed","isPeriodCollapsed","percentageRendererDirect","showNoRowsOverlay","angularCompileHeaders","clusterStores","gridData","exportData","cat1","dropDownDecisionEditorMonthsForCalculations","customMonths","monthsForCalculations","openCustomMonthsDialog","categoryRoleId","strategies","categoryStrategyId","targetCoverage","brandCategoryRoleStrategyCoverages","rsBrands","selectedRuleType","hideStrategy","newCustomCategoryMonths","toDelete","jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dic","newTab","allIndexes100","indexSalesWeight","indexUnitsWeight","indexMarginWeight","indexMarketSalesWeight","indexMarketUnitsWeight","loadStrategyAndRoles","changeBrandClick","categoryRole","categoryStrategy","bc","monthsValue","saveCustomMonths","indexToRemove","isLoadingReport","roleStrategyCoverages","flatten","brandIcon","AssortmentRules","CustomOrderBrands","rolesAndStrategies","rs","isRole","subtitle","maxOfCat4","maxOfCat5","WeightedIndexPercentageEditor","getClassForWeightedIndexCell","integerEditor","isEditingListingRule","isEditingDelistingRule","allClustersChecked","allTagsChecked","assortmentRuleId","brandCoverages","isCoverageRule","itemManufacturers","selectedParetoFilterItemBrands","selectedParetoFilterItemManufacturers","selectedParetoFilterItemTags","exclusters","conditions","pendingPerformanceVariable","performanceVariable","pendingDelistingPerformanceVariable","delistingPerformanceVariable","listingCondition","condition","delistingCondition","selectAllClustersForRule","selectAllTagsForRule","filterCondition","performanceVariableValue","leftSignVisible","leftSignText","rightSignVisible","rightSignText","isSpaceListingRule","sign","newListingRule","shouldShowListing","changePerformanceVariable","addListingCondition","canSaveListingRule","listingConditionsDto","conditionDto","listingParetoItemFilters","paretoFilterItemBrand","paretoFilterItemManufacturer","paretoFilterTag","assortmentRuleListingDto","assortmentRuleConditions","paretoItemFilters","savedOk","leftSignDelistingVisible","leftSignDelistingText","rightSignDelistingVisible","rightSignDelistingText","isSpaceDelistingRule","newDelistingRule","shouldShowDelisting","changeDelistingPerformanceVariable","addDelistingCondition","canSaveDelistingRule","delistingConditionsDto","delistingParetoItemFilters","assortmentRuleDelistingDto","getRuleFilter","coverages","selectedBrandId","selectedClusterIds","categoriesGroup","categoryGroupChanged","catGrpId","cgrp","categoryNielsen","totalMarketSalesActiveItems","totalMarketSales","doApplyFilters","pareto","updateClusterFilter","countParetoSections","currentCategoryId","allEndorse","newIsListed","usedSpace","space","loadPareto","onlySuggested","selectedFilters","onlyNew","onlyToEndorse","assortmentStatus","onlyInactive","storeFormat","customerTypeId","customerType","groupByBrand","groupByFormat","groupByCustomer","groupByRegion","hideColumn","totalChats","hideSpaces","canView","showParam1","clusterCode","getClassForSuggestionCell","textToShow","allIsListed","nodoHijo","suggestionText","assortmentSuggestionRule","rowType","anyChildSuggestions","isSuggestionIgnored","suggestionListed","nodeId","decision","btnIncorporar","btnQuitar","allIgnored","allNewIsListed","currentNewIsListed","finalColor","paretoSections","acumIndex","valueFrom","valueTo","colorRgb","paretoSectionIndex","salesOnColumnGroupShow","showSalesTotal","totalSalesOnColumnGroupShow","showUnitsTotal","showPresence2","presencia","showPlanogramEdition","ShowDDSextended","showWasteUnits","selectedFilterForCluster","selectedFilterForAssortmentStatus","afterFilterChanged","listingSuggestions","delistingSuggestions","impact","pendingImpact","listingNew","delistingNew","totalItemClusters","totalActiveItemClusters","actualCoverage","actualSuggested","actualNew","forEachNodeAfterFilterAndSort","absImpact","absPendingImpact","marketSales","salesTotal","categoryDetails","brandCoverage","totalMarketSalesActiveItemsBrand","containsTag","addToAssortment","listingImpact","updateParentAndRefreshScreen","revertDecision","removeFromAssortment","delistingImpact","revertImpact","acceptSuggestionsForAllChildren","updateFunc","updateSummaryBox","revertAcceptedSuggestionsForAllChildren","updateKpis","changeAssortmentUpdate","changeAssortment","getNodeById","nodeOrId","assortmentChanged","storeBrandId","forceRefresh","itemClusters","onAfterFilterChanged","storeFormats","catDet","assortmentDashboard","CollapseSalesGraph","loadGrid","itemStatus","dropDrowncluster","dropDrownstatus","onlyEndorse","matrixOfIndexes","ShowPresence2","Param1","HideSpaces","WasteUnits","PrevSubCategory","assortmentIdsToReject","assortmentId","markAsReview","showModal","updateCoverage","lastXValues","lastDateString","lastXValue","selectedClusterId","xValue","precio","ventas_Un","ventas_$","margen_$","filterByTextIfEnter","filterByAssortmentStatus","filterByStoreFormat","filterByCustomerType","filterByRegion","pendingChanges","newListedItems","newDelistedItems","totalListedItems","downloadSalesAndMarginReport","checkGroupByOption","groupByOption","openColumnViewerDialog","auxColumnIndexesToHide","filterColumnViewer","parentIdx","childrenIdx","jsonColumnIndexesToHide","tagNamesToSave","openPresenceDialog","presence","openParetoSectionsDialog","applyParetoSections","done","newSection","deleteSection","openSuggestionActionsDialog","selectedNode","openDecisionActionDialog","toggleAllSuggestions","acceptedAllSuggestions","revertAllSuggestions","acceptAllSuggestions","ignoredAll","undoIgnoreAll","undoIgnore","addToAssortmentForAllChildren","removeFromAssortmentForAllChildren","pNode","isIgnored","itemToSave","goToPlanogram","anySuggestions","isListedFn","parentIndex","childIndex","retorno","totalActiveItems","allClustersDeListedFlag","takenDecision","anyClusterListed","anyClusterNewIsListed","clusterIsListed","auxArray","changeAssortmentDecision","updateAssortmentDecision","majorId","getClassForHierarchyPCell","getClassForHierarchyCell","paretos","selectedCategoriesIds","selectedSubategoriesIds","sourceClusterId","targetClusterId","comparationTypes","comparationIdx","comparation","crossingResults","changeComparation","addRule","getResults","subcategoriesIds","isComparing","req","getClassForRevision","baseClass","revisionNeededRenderer","lastRevisionRenderer","clusterFilteringText","chartViewAll","maxBarsToDisplay","renderBarChart","buildChartData","chartChangeDimension","newDimension","dimension","flare","barCount","otherSize","orderedParetos","paretoCategoryGroup","paretoCategory","paretoSubcategory","paretoCluster","others","hierarchy","partition","down","__transition__","exit","stack","nice","enterTransition","x0","tx","exitTransition","allowCategoryNavigation","SupportAnalysisFromCategoryLevel","canNavigate","delistingPending","listingPending","missionList","frecuencies","surveyMethods","missionTypes","getProgressBar","editMission","enums","getNameMissionType","mT","getNameSurveyMethods","sM","getNameFrecuencies","isExpiredMission","daysLeft","agentPlaces","selectedRegions","selectedLocalities","suppliers","selectedGroups","selectedSubgroups","selectedItemBrands","selectedSuppliers","showRequiredFields","listAgentCompetitor","subGroupLabel","subGroupPlaceHolder","groupLabel","groupPlaceHolder","showItemFilters","MysteryShopper","HideItemFilters","itemInSelectedBrands","itemInSelectedSuppliers","itemCategoryInSelection","subgroups","isCategoryInSelection","validateRequiredFields","missionName","missionType","frecuency","actionType","dueDate","ap","competitorIds","validateCompetitors","validateUsers","validateExpiration","onChangeUsers","AgentPlace","newcompetitorsIds","getAgentCompetitor","agentCompetitor","actionTypes","subCategoriesIds","getSubcategoriesIds","confirmButtonClass","subCatIds","catIds","subGroupIds","auxCatIds","groupIds","auxSubGroup","auxSubGroupIds","agentPlace","mSMissionId","assignedTo","validateLocation","mapAgentPlaces","addAgentPlace","removeAgentPlace","isProgrammingCollapsed","isCompetitorsCollapsed","isProductsCollapsed","isResponsibleCollapsed","thisUserHasValidateLocation","buildAgentPlaces","isLaRebaja","cums","cumAdded","filterCums","isDeleted","setPrincipalCum","cum","principal","deleteCum","addCum","inUse","maximumPrice","isCumInformationCollapsed","isLoadingDetails","isLoadingDetailSummary","detailSummary","contentType","linkElement","blob","Blob","clickEvent","MouseEvent","dispatchEvent","dateChanged","selectedDate","setFilterInterface","interfaceName","txtFilterInterface","setFilterStatus","txtFilterStatus","setFilterStep","txtFilterStep","getFilteredDuration","getIcon","interfaceDto","getIconDetail","getColorDetail","selectInterface","selectDetailSummary","InterfaceLogId","importedDate","importerServiceName","mustShowCategorySwal","finished1","finished2","finished3","finished4","runStep","filteredSubcategories","saveCategories","pendingItemsWithNoCategory","selectFilteredItems","fi","clearAllSensitivities","ok","stepOne","phase","lastFileName","prevPoints","nav","isActive","changeLanguage","langKey","use","prevState","canGoBack","abstract","logout","navigateToUrl","getTaskIcon","getQueuedTasks","welcomeMessage","LoginWelcomeMessage","Local","errorLoginMsj","showLogo","hostname","error_description","authExternalProvider","redirectUri","protocol","host","externalProviderUrl","$windowScope","authCompletedCB","fragment","haslocalaccount","externalAuthData","external_user_name","external_access_token","fix_height","heightWithoutNavbar","navbarHeigh","wrapperHeigh","runBlock","toState","toStateParams","ev","toParams","fromParams","currState","goto","charAt","allDataDate","logoLogin","navigation","maxPlanType","MarkdownAging","MaxPlanType","Level","weekDayNames","MayS","d3Locale","locale","thousands","grouping","currency","dateTime","periods","shortDays","shortMonths","timeFormat","prams","isFirefox","InstallTrigger","isSafari","HTMLElement","isIE","documentMode","integerRendererWithZero","greaterThan","percentageEditor","percentageEditorWithDecimal","percentageEditorWith2Decimals","decimalEditor","trimLeft0","newArray","lookup","translationKey","dateStr","avg","stringDate","logosAndDomain","closeButton","newestOnTop","progressBar","preventDuplicates","showDuration","hideDuration","extendedTimeOut","showEasing","hideEasing","showMethod","hideMethod","constant","routerConfig","$stateProvider","$urlRouterProvider","pageTitle","UseOilDashboard","UsePriceRedesign","InformToErpWs","priceListSubsidiesId","MissionsId","otherwise","$httpProvider","defaults","interceptors"],"mappings":"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","file":"../../js/app-e551005dc8.js","sourcesContent":["angular.module('prisma').component('planogramShelfComponent', {\r\n templateUrl: 'app/spaces/planograms/components/planogramShelf.html',\r\n controller: planogramShelfComponentController,\r\n bindings: {\r\n planogram: '=',\r\n column: '=',\r\n renderpiechartsparent: '=',\r\n selecteditem: '=',\r\n filtereditems: '=',\r\n selectedlevelparent: \"=\",\r\n selectedplanogramparent: \"=\",\r\n sales: '=',\r\n showloadquantity: '=',\r\n showregularprice: '=',\r\n showexhibitiondays: '=',\r\n showdaysinstock: '=',\r\n selectedbrand: '=',\r\n selectedmanufacturer: '=',\r\n selectedtagfilter: '=',\r\n heatmapenabled: '=',\r\n groupmapenabled: '=',\r\n showdoor: '=',\r\n autostack: '=',\r\n hideitems: '=',\r\n showlevelmeasurebuttons: '=',\r\n countplanogramitems: '=',\r\n shownewticketmodal: '=',\r\n zoom: '=',\r\n }\r\n});\r\n\r\n\r\nfunction planogramShelfComponentController($scope, $state, $timeout, $element, $stateParams, $translate, authService, spaceService) {\r\n var self = this;\r\n self.search = \"\";\r\n self.categoryFilter = '!null';\r\n self.selectedStatus = 'None';\r\n self.showGlobesId = 0;\r\n self.planogramId = $stateParams.planogramId;\r\n\r\n var $firstUiView = $element.parents('[ui-view]:first');\r\n self.editPlanogramCtrl = $firstUiView.controller();\r\n\r\n var onGlobalClick = function (e) {\r\n if (angular.isDefined(e.toElement)\r\n && angular.isDefined(e.toElement.className)\r\n && e.toElement.className.indexOf('planogramLevel') > -1\r\n && e.toElement.className !== 'dropDown-button'\r\n && self.showGlobesId !== null\r\n && self.showGlobesId !== undefined\r\n && self.showGlobesId !== 0) {\r\n self.showGlobesId = 0;\r\n }\r\n };\r\n\r\n $(\"body\").on(\"click\", onGlobalClick);\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n $(\"body\").off(\"click\", onGlobalClick);\r\n\r\n });\r\n\r\n self.hasPermissionToEdit = authService.hasPermission('spaces_edit_planograms');\r\n self.selectedGlobeItem = null;\r\n self.selectedGlobeLevel = null;\r\n\r\n $scope.$watch('$ctrl.planogram', function (newVal, oldVal) {\r\n onSizeChanged();\r\n }, true);\r\n\r\n $scope.$watch('$ctrl.zoom', function (newVal, oldVal) {\r\n onSizeChanged();\r\n }, true)\r\n\r\n $scope.$watch('$ctrl.column', function (newVal, oldVal) {\r\n onSizeChanged();\r\n }, true);\r\n\r\n self.isEdit = function () {\r\n return $state.current.url.contains('edit');\r\n }\r\n\r\n self.levelClick = function (level) {\r\n }\r\n\r\n function renderSizes() {\r\n angular.forEach(self.planogram.levels, function (level) {\r\n angular.forEach(level.items, function (item) {\r\n self.calcItemSize(item, level, self.planogram);\r\n });\r\n });\r\n }\r\n self.calcItemSize = function (item, level, planogram) {\r\n item.widthPx = self.calcItemWidth(item, level, planogram);\r\n item.heightPx = self.calcItemHeight(item, level, planogram);\r\n item.depthPx = self.calcItemDepth(item, level, planogram);\r\n }\r\n\r\n self.calcItemWidth = function (item, level, planogram) {\r\n\r\n var levelWidthPx = self.calcLevelWidth(level, planogram);\r\n\r\n var widthPx = ((item.selectedUnitOfMeasure.width) * levelWidthPx) / planogram.width;\r\n\r\n return widthPx;\r\n }\r\n\r\n self.calcItemHeight = function (item, level) {\r\n\r\n var heightPx = item.selectedUnitOfMeasure.height * item.widthPx / item.selectedUnitOfMeasure.width;\r\n\r\n return heightPx;\r\n }\r\n\r\n self.calcItemDepth = function (item, level) {\r\n\r\n var depthPx = item.selectedUnitOfMeasure.depth * item.widthPx / item.selectedUnitOfMeasure.width;\r\n\r\n return depthPx;\r\n }\r\n\r\n self.calcLevelWidth = function (level, planogram) {\r\n\r\n var widthPx = 0;\r\n\r\n var leveldiv = document.getElementById('columnOrder_' + self.column.order + 'moduleOrder_' + planogram.order + 'planogramLevel_' + level.levelNumber);\r\n\r\n if (leveldiv) {\r\n widthPx = leveldiv.clientWidth;\r\n } else {\r\n documentDiv = document.getElementById('columnOrder_' + self.column.order + 'moduleOrder_' + planogram.order)\r\n if (documentDiv) widthPx.clientWidth;\r\n }\r\n\r\n return widthPx;\r\n }\r\n\r\n self.getItemColor = function (item) {\r\n if (self.heatmapenabled) {\r\n return item.fill;\r\n } else if (self.groupmapenabled) {\r\n return item.fill;\r\n }\r\n return 'none';\r\n }\r\n\r\n self.selectItem = function (item) {\r\n self.selecteditemId = null;\r\n if (item == null || (self.selecteditem && item.id == self.selecteditem.id)) {\r\n //deselect\r\n self.selecteditem = null;\r\n self.filtereditems = [];\r\n self.search = '';\r\n\r\n //Intervencion para pasar al editPlanogram\r\n self.editPlanogramCtrl.setActiveShelf(null);\r\n\r\n }\r\n else {\r\n self.selecteditem = item;\r\n self.selectedbrand = '!null';\r\n self.selectedmanufacturer = '!null';\r\n self.categoryfilter = '!null';\r\n self.selectedstatus = '!null';\r\n self.selectedtagfilter = null;\r\n\r\n self.filtereditems = [];\r\n self.filtereditems.push(item);\r\n\r\n console.log('self.selectedItem', self.selecteditem)\r\n findItem(function (planogram, level, _item) {\r\n if (_item.id == item.id) {\r\n self.selectedPlanogram = planogram;\r\n //self.selectedplanogramparent = planogram;\r\n self.selectedLevel = level;\r\n self.selectedlevelparent = level;\r\n }\r\n });\r\n\r\n \r\n\r\n\r\n //resalto el item en la lista\r\n //self.search = item.name;\r\n\r\n //renderizo los charts\r\n self.renderpiechartsparent([item]);\r\n\r\n //}\r\n\r\n //Intervencion para pasar al editPlanogram\r\n self.editPlanogramCtrl.setActiveShelf(self);\r\n }\r\n }\r\n\r\n self.getLevelJustification = function (level) {\r\n //LG: Pedido por cliente de justificar el espaciado\r\n \r\n var usedWidth = self.getUsedWidth(level, self.planogram);\r\n\r\n if (usedWidth / self.planogram.width > 0.8)\r\n return 'space-around';\r\n\r\n return 'flex-start';\r\n }\r\n\r\n function findItem(callbackFunction) {\r\n //angular.forEach(self.planograms, function (planogram) {\r\n angular.forEach(self.planogram.levels, function (level) {\r\n angular.forEach(level.items, function (item) {\r\n callbackFunction(self.planogram, level, item);\r\n });\r\n });\r\n //});\r\n\r\n }\r\n\r\n self.itemDroppedInLevel = function (index, item, UOM, external, type, level, planogram) {\r\n\r\n if (item.planogramLevelId != level.id) {\r\n //console.log('DROPPED - LEVEL CHANGE');\r\n\r\n if (!UOM.height || !UOM.width || !UOM.depth) {\r\n swal(translations.WithoutSize, translations.WithoutSizeSubtitle, 'warning');\r\n return false;\r\n }\r\n if ((UOM.height * (item.stackAbove ? item.stackAbove : 1)) > level.height) {\r\n swal(translations.InsufficientSpaceSwal, translations.InsufficientHeightSpaceSubtitleSwal, 'warning');\r\n return false;\r\n }\r\n\r\n var usedWidth = self.getUsedWidth(level, planogram);\r\n\r\n //if (usedWidth + UOM.width + (level.itemPadding * 2) > planogram.width) {\r\n if ((usedWidth + (UOM.width * (item.facings ? item.facings : 1))) > planogram.width) {\r\n swal(translations.InsufficientSpaceSwal, translations.InsufficientWidthSpaceSubtitleSwal, 'warning');\r\n return false;\r\n }\r\n //bug -> level.category is wrong\r\n //if (level.categoryId != null && item.categoryId != level.categoryId) {\r\n // swal(incorrectCategorySwal, incorrectCategorySubtitleSwal + level.categoryName + '', 'warning');\r\n // return false;\r\n //}\r\n\r\n if (level.categoryId != null && item.categoryId != level.categoryId) {\r\n swal(translations.IncorrectCategorySwal, translations.IncorrectCategorySubtitleSwal + level.categoryName + '', 'warning');\r\n return false;\r\n }\r\n\r\n self.stateChange = true;\r\n item.planogramLevelId = level.id;\r\n item.id = guid();\r\n item.uniqueId = guid();\r\n if (!item.facings) item.facings = 1;\r\n item.selectedUnitOfMeasureId = UOM.id;\r\n item.selectedUnitOfMeasure = UOM;\r\n //item.height = UOM.height;\r\n //item.width = UOM.width;\r\n //item.depth = UOM.depth;\r\n if (self.autostack) {\r\n item.stackBehind = getItemStack(item, level, planogram, 'behind');\r\n item.stackAbove = getItemStack(item, level, planogram, 'above');\r\n if (!item.stackBehind || !item.stackAbove)\r\n return false;\r\n item.stackTotal = calcLoadQuantity(item, level, planogram);\r\n \r\n } else {\r\n item.stackAbove = item.stackAbove ? item.stackAbove : 1;\r\n item.stackBehind = item.stackBehind ? item.stackBehind : 1;\r\n item.stackTotal = calcLoadQuantity(item, level, planogram);\r\n }\r\n item.order = index;\r\n\r\n } else {\r\n\r\n //console.log('DROPPED');\r\n self.stateChange = true;\r\n item.order = index;\r\n }\r\n\r\n item.textTooltipItemOrientation = translations.ShowProfileItem;\r\n\r\n //order items\r\n //angular.forEach(self.planogram, function (_planogram) {\r\n angular.forEach(self.planogram.levels, function (_level) {\r\n if (level.id == _level.id) {\r\n let _items = _level.items\r\n _items.sort(function (a, b) {\r\n if (a.order > b.order) {\r\n return 1;\r\n }\r\n if (a.order < b.order) {\r\n return -1;\r\n }\r\n // a must be equal to b\r\n return 0;\r\n });\r\n angular.forEach(_level.items, function (_item, i) {\r\n _item.order = i;\r\n console.log(_item.order, _item.name);\r\n })\r\n }\r\n\r\n });\r\n //})\r\n\r\n return item;\r\n //$scope.$apply();\r\n };\r\n\r\n self.itemInsertedInLevel = function (index, item, external, type, level, planogram) {\r\n //console.log('INSERTED');\r\n\r\n self.stateChange = true;\r\n self.calcItemSize(item, level, planogram);\r\n self.countplanogramitems();\r\n $timeout(function () {\r\n groupItem(index, item, level, planogram);\r\n }, 20)\r\n\r\n }\r\n\r\n self.itemMovedFromLevel = function (index, level, item) {\r\n //level.items.splice($index, 1)\r\n\r\n var shouldRemove = true;\r\n\r\n if (shouldRemove) {\r\n _.remove(level.items, function (i) {\r\n return i.$$hashKey === item.$$hashKey;\r\n });\r\n }\r\n\r\n }\r\n\r\n function groupItem(index, item, level, planogram) {\r\n //console.log('gropItem', level.items[index - 1], level.items[index + 1], index, item,level)\r\n var indexRemove = -1\r\n var sumFacings = 0;\r\n if (level.items[index - 1] && item.uniqueId == level.items[index - 1].uniqueId) return\r\n\r\n if (level.items[index + 1] && item.uniqueId == level.items[index + 1].uniqueId) return\r\n\r\n if (level.items[index - 1] && item.itemId == level.items[index - 1].itemId) {\r\n sumFacings = level.items[index - 1].facings + item.facings;\r\n indexRemove = index - 1;\r\n }\r\n if (level.items[index + 1] && item.itemId == level.items[index + 1].itemId) {\r\n sumFacings = level.items[index + 1].facings + item.facings;\r\n indexRemove = index + 1;\r\n }\r\n $timeout(function () {\r\n if (indexRemove >= 0 && sumFacings) {\r\n item.facings = sumFacings;\r\n //issue #92 TATA Uruguay\r\n //si recalcule facings tengo que recalcular stackTotal\r\n item.stackTotal = calcLoadQuantity(item, level, planogram);\r\n level.items.splice(indexRemove, 1);\r\n }\r\n }, 40);\r\n\r\n\r\n }\r\n\r\n self.getUsedWidth = function (level, planogram)\r\n {\r\n var usedWidth = 0;\r\n angular.forEach(level.items, function (item) {\r\n //usedWidth += ((item.selectedUnitOfMeasure.width + (level.itemPadding * 2)) * item.facings);\r\n usedWidth += (item.selectedUnitOfMeasure.width * item.facings);\r\n });\r\n\r\n //sumo el padding\r\n //usedWidth += level.items.length * level.itemPadding * 2;\r\n\r\n level.usedWidth = usedWidth;\r\n return usedWidth;\r\n }\r\n\r\n self.setUsedHeight = function (level, planogram) {\r\n level.minHeight = 0;\r\n angular.forEach(level.items,\r\n function (item) {\r\n if ((item.selectedUnitOfMeasure.height * item.stackAbove) >\r\n level.minHeight)\r\n level.minHeight = (item.selectedUnitOfMeasure.height *\r\n item.stackAbove);\r\n });\r\n }\r\n\r\n self.createNewArray = function (num) {\r\n //console.log('numero into getNumber', num)\r\n if (num) {\r\n return new Array(num);\r\n } else {\r\n return new Array(1);\r\n }\r\n }\r\n\r\n self.showBubles = function (item, level) {\r\n if (item.id == self.showGlobesId) {\r\n self.showGlobesId = 0;\r\n self.selectedGlobeItem = null;\r\n self.selectedGlobeLevel = null;\r\n } else {\r\n self.showGlobesId = item.id;\r\n self.selectedGlobeItem = item;\r\n self.selectedGlobeLevel = level;\r\n }\r\n }\r\n //self.goToTickets = function (planogram, item) {\r\n // //console.log('item', item);\r\n // $state.go('spaces.tickets', { planogramLevelItemId: item.id, layoutObjectId: 0 });\r\n //}\r\n\r\n\r\n self.showIconMinus = function (item) {\r\n return item.facings > 1 ? true : false\r\n }\r\n\r\n self.hasLayDownItem = function (item) {\r\n return angular.isDefined(item.layDownItem) && item.layDownItem > 0;\r\n }\r\n\r\n //COMENTO LAS FUNCIONES DE LAS BURBUJAS PORQUE VAN A PASAR AL EDITPLANOGRAM\r\n\r\n //self.addFrontItem = function (item, level, planogram, toAdd) {\r\n // var usedWidth = self.getUsedWidth(level, planogram);\r\n\r\n // if (toAdd) {\r\n // //if (usedWidth + item.selectedUnitOfMeasure.width + (level.itemPadding * 2) > planogram.width) {\r\n // if (usedWidth + item.selectedUnitOfMeasure.width > planogram.width) {\r\n // swal(translations.InsufficientSpaceSwal, translations.InsufficientWidthSpaceSubtitleSwal, 'warning');\r\n // return;\r\n // }\r\n // }\r\n\r\n // if (toAdd) {\r\n // item.facings += 1\r\n // } else {\r\n // if (item.facings == 1) {\r\n // return\r\n // } else {\r\n // item.facings -= 1\r\n // }\r\n\r\n // }\r\n\r\n // item.stackTotal = calcLoadQuantity(item, level, planogram);\r\n\r\n // self.stateChange = true;\r\n // //return true;\r\n //}\r\n\r\n //self.addItemBehind = function (item, level, planogram, toAdd) {\r\n\r\n // var usedDepth = item.selectedUnitOfMeasure.depth * item.stackBehind;\r\n\r\n // if (toAdd) {\r\n // if (usedDepth + item.selectedUnitOfMeasure.depth > planogram.depth) {\r\n // swal(translations.InsufficientSpaceSwal, translations.InsufficientWidthSpaceSubtitleSwal, 'warning');\r\n // return;\r\n // }\r\n // }\r\n\r\n // if (toAdd) {\r\n // item.stackBehind += 1\r\n // } else {\r\n // if (item.stackBehind == 1) {\r\n // return\r\n // } else {\r\n // item.stackBehind -= 1\r\n // }\r\n\r\n // }\r\n\r\n // item.stackTotal = calcLoadQuantity(item, level, planogram);\r\n\r\n // self.stateChange = true;\r\n // //return true;\r\n //}\r\n\r\n //self.addItemAbove = function (item, level, planogram, toAdd) {\r\n\r\n // if (toAdd) {\r\n // //agrega un item al tope de la pila\r\n\r\n // swal({\r\n // title: translations.AddLayDownItemSwal,\r\n // type: \"warning\",\r\n // showCancelButton: true,\r\n // confirmButtonColor: \"#DD6B55\",\r\n // confirmButtonText: translations.Laydown,\r\n // cancelButtonText: translations.Standup,\r\n // showLoaderOnConfirm: false,\r\n // closeOnConfirm: false,\r\n // closeOnCancel: false\r\n // },\r\n // function (isLayDown) {\r\n // //calculo la altura actual considerando acostados y parados\r\n // var layDownItemsHeight = item.layDownItem ? item.layDownItem * item.selectedUnitOfMeasure.depth : 0;\r\n // var usedHeight = (item.selectedUnitOfMeasure.height * item.stackAbove) + layDownItemsHeight;\r\n // var heightRequested = isLayDown ? usedHeight + item.selectedUnitOfMeasure.depth : usedHeight + item.selectedUnitOfMeasure.height;\r\n\r\n // if (heightRequested > level.height) {\r\n // //no hay espacio\r\n // swal(translations.InsufficientSpaceSwal, translations.InsufficientHeightSpaceSubtitleSwal, 'warning');\r\n // }\r\n // else {\r\n // swal(\"Se agrego el item\", \"Agregado\", 'success');\r\n\r\n // if (isLayDown) {\r\n // item.layDownItem = angular.isDefined(item.layDownItem) ? (item.layDownItem + 1) : 1;\r\n // $scope.$apply();\r\n // } else {\r\n // item.stackAbove += 1;\r\n // $scope.$apply();\r\n // }\r\n // }\r\n // });\r\n\r\n // } else {\r\n // //quita el ultimo item de la pila\r\n\r\n // if (item.stackAbove == 1) {\r\n // if (angular.isDefined(item.layDownItem) && item.layDownItem > 0) {\r\n // item.layDownItem -= 1;\r\n // }\r\n // } else if (item.stackAbove > 0){\r\n // item.stackAbove -= 1;\r\n // }\r\n // }\r\n\r\n // item.stackTotal = calcLoadQuantity(item, level, planogram);\r\n // self.stateChange = true;\r\n //}\r\n\r\n //self.rotateItem = function (item, level, planogram) {\r\n // if (item.rotation) {\r\n // item.rotation = undefined;\r\n // }\r\n // else {\r\n // item.rotation = 90;\r\n // }\r\n\r\n //}\r\n\r\n //self.changeFront = function (item, level, planogram) {\r\n // self.stateChange = true;\r\n // if (!item.showMode) {\r\n // item.showMode = 'S';\r\n // item.textTooltipItemOrientation = translations.ShowItemAbove;\r\n // } else if (item.showMode == 'S') {\r\n // item.showMode = 'T';\r\n // item.textTooltipItemOrientation = translations.ShowItemInfront;\r\n // } else if (item.showMode == 'T') {\r\n // item.showMode = undefined;\r\n // item.orientation = 0;\r\n // item.textTooltipItemOrientation = translations.ShowProfileItem;\r\n // }\r\n //}\r\n\r\n //self.itemToFront = function (item, level, planogram) {\r\n // self.stateChange = true;\r\n // item.showMode = undefined;\r\n // item.orientation = 0;\r\n //}\r\n\r\n //self.itemToSide = function (item, level, planogram) {\r\n // self.stateChange = true;\r\n // item.showMode = 'S';\r\n //}\r\n\r\n //self.itemToTop = function (item, level, planogram) {\r\n // self.stateChange = true;\r\n // item.showMode = 'T';\r\n //}\r\n\r\n //self.deleteItem = function (item, level) {\r\n // swal({\r\n // title: translations.SureDeleteItemSwal + ' ' + item.name + '?',\r\n // type: \"warning\",\r\n // showCancelButton: true,\r\n // confirmButtonColor: \"#DD6B55\",\r\n // confirmButtonText: translations.RemoveSwal,\r\n // cancelButtonText: translations.CancelSwal,\r\n // showLoaderOnConfirm: true,\r\n // closeOnConfirm: true,\r\n // closeOnCancel: true\r\n // },\r\n // function (isConfirm) {\r\n // if (isConfirm) {\r\n // level.items.splice(level.items.indexOf(item), 1);\r\n // self.countplanogramitems();\r\n // self.stateChange = true;\r\n // $scope.$apply();\r\n // }\r\n\r\n // });\r\n //}\r\n\r\n function calcLoadQuantity(item, level, planogram) {\r\n if (item == null) return;\r\n if (level == null) return;\r\n if (planogram == null) return\r\n\r\n return Math.round(item.stackBehind * item.stackAbove * item.facings);\r\n\r\n }\r\n\r\n function getItemStack(item, level, planogram, direction) {\r\n if (item == null) return;\r\n if (item.selectedUnitOfMeasure == null) return;\r\n if (level == null) return;\r\n if (planogram == null) return\r\n //de frente sin rot\r\n var alto = item.selectedUnitOfMeasure.height;\r\n var ancho = item.selectedUnitOfMeasure.width;\r\n var profundidad = item.selectedUnitOfMeasure.depth;\r\n // de frente rot 90\r\n if (!item.showMode && item.rotation === 90) {\r\n alto = item.selectedUnitOfMeasure.width;\r\n ancho = item.selectedUnitOfMeasure.height;\r\n profundidad = item.selectedUnitOfMeasure.depth;\r\n }\r\n //lateral sin rot\r\n if (!item.showMode === 'S' && !item.rotation) {\r\n alto = item.selectedUnitOfMeasure.selectedUnitOfMeasure.height;\r\n ancho = item.selectedUnitOfMeasure.depth;\r\n profundidad = item.selectedUnitOfMeasure.width;\r\n }\r\n //lateral rot 90\r\n if (!item.showMode === 'S' && item.rotation === 90) {\r\n alto = item.selectedUnitOfMeasure.depth;\r\n ancho = item.selectedUnitOfMeasure.heigh;\r\n profundidad = item.selectedUnitOfMeasure.width;\r\n }\r\n //superior sin rot\r\n if (!item.showMode === 'T' && !item.rotation) {\r\n alto = item.selectedUnitOfMeasure.height;\r\n ancho = item.selectedUnitOfMeasure.width;\r\n profundidad = item.selectedUnitOfMeasure.depth;\r\n }\r\n //superior rot 90\r\n if (!item.showMode === 'T' && item.rotation === 90) {\r\n alto = item.selectedUnitOfMeasure.depth;\r\n ancho = item.selectedUnitOfMeasure.width;\r\n profundidad = item.selectedUnitOfMeasure.height;\r\n }\r\n\r\n if (direction == 'behind') {\r\n if (planogram.depth < profundidad) {//issue #86 tata uruguay\r\n swal(translations.InsufficientSpaceSwal, translations.InsufficientDepthSpaceSubtitleSwal, 'warning');\r\n return;\r\n }\r\n return Math.floor(planogram.depth / profundidad);\r\n }\r\n\r\n if (direction == 'above') {\r\n return Math.floor(level.height / alto)\r\n }\r\n }\r\n\r\n\r\n function calculateSales() {\r\n angular.forEach(self.planograms, function (planogram) {\r\n angular.forEach(planogram.module.levels, function (level) {\r\n angular.forEach(level.items, function (item) {\r\n for (var i = 0; i < self.sales.length; i++) {\r\n //console.log('self.sales[i].itemId', self.sales[i].itemId, 'item.id', item.id, self.sales[i].itemId == item.itemId);\r\n //console.log('self.sales[i].storeId', self.sales[i].storeId, 'self.selectedStore.id', self.selectedStore.id, self.sales[i].storeId == self.selectedStore.id);\r\n if (self.selectedStore && self.sales[i].itemId == item.itemId\r\n && self.sales[i].storeId == self.selectedStore.id) {\r\n item.salesInStore = self.sales[i].sales;\r\n item.marginInStore = self.sales[i].margin;\r\n item.unitsInStore = self.sales[i].units;\r\n item.priceInStore = self.sales[i].price;\r\n item.gmroiInStore = self.sales[i].gmroi;\r\n item.stockBreaksInStore = self.sales[i].stockBreaks;\r\n item.stockInStore = self.sales[i].inventoryUnits;\r\n //console.log('item', item);\r\n }\r\n }\r\n\r\n item.gmros = item.margin / item.selectedUnitOfMeasure.width * item.selectedUnitOfMeasure.depth / 10000;\r\n\r\n });\r\n });\r\n });\r\n\r\n }\r\n\r\n function guid() {\r\n function s4() {\r\n return Math.floor((1 + Math.random()) * 0x10000)\r\n .toString(16)\r\n .substring(1);\r\n }\r\n return s4() + s4() + '-' + s4() + '-' + s4() + '-' +\r\n s4() + '-' + s4() + s4() + s4();\r\n }\r\n\r\n self.editHeightLevel = function (level, bool) {\r\n if (bool) {\r\n ++level.height\r\n } else {\r\n if (!level.minHeight) {\r\n self.setUsedHeight(level, self.planogram);\r\n }\r\n if (level.height - 1 < Math.ceil(level.minHeight)) {\r\n swal(translations.HeightNotAllowed, translations.HeightNotAllowedSubtitle + Math.ceil(level.minHeight), 'warning');\r\n return\r\n } else {\r\n --level.height\r\n }\r\n }\r\n var suma = 0\r\n angular.forEach(self.planogram.levels, function (level, i) {\r\n //console.log('level', level, i)\r\n level.levelNumber = i + 1;\r\n suma += level.height\r\n })\r\n self.planogram.height = suma\r\n }\r\n\r\n self.deleteLevel = function (level) {\r\n console.log('deleteLevel', level)\r\n if (level.items.length) {\r\n swal(translations.LevelWithItems, translations.LevelWithItemsSubtitle, 'warning');\r\n return\r\n }\r\n var i = -1\r\n angular.forEach(self.planogram.levels, function (levelPlanogram, index) {\r\n if (level.levelNumber == levelPlanogram.levelNumber) {\r\n i = index\r\n }\r\n })\r\n if (i != -1) {\r\n self.planogram.levels.splice(i, 1);\r\n }\r\n var suma = 0\r\n angular.forEach(self.planogram.levels, function (level, i) {\r\n //console.log('level', level, i)\r\n level.levelNumber = i + 1;\r\n suma += level.height\r\n })\r\n self.planogram.height = suma\r\n }\r\n\r\n self.getItemStyles = function (item, isHideItems) {\r\n\r\n //Analizo la coleccion de FilteredItems que viene del control padre\r\n var applyOpacity = true;\r\n if (self.filtereditems && self.filtereditems.length > 0) {\r\n angular.forEach(self.filtereditems, function (filteredItem) {\r\n if (applyOpacity && item.itemId == filteredItem.itemId) {\r\n applyOpacity = false;\r\n }\r\n });\r\n }\r\n else {\r\n if (self.selectedbrand != '!null'\r\n || self.selectedmanufacturer != '!null'\r\n || self.selectedtagfilter != null)\r\n applyOpacity = true;\r\n else\r\n applyOpacity = false;\r\n }\r\n\r\n var styles = {\r\n 'background-color': self.getItemColor(item),\r\n 'opacity': isHideItems ? '0.3' : !applyOpacity ? '1' : '.14',\r\n }\r\n\r\n return styles;\r\n }\r\n\r\n self.getItemDuplicateStyles = function (item, level, planogram) {\r\n\r\n var paddingPx = level.paddingItemsPx;\r\n\r\n var styles = {\r\n 'width': item.widthPx + 'px',\r\n 'height': item.heightPx + 'px',\r\n //'margin-left': paddingPx + 'px',\r\n //'margin-right': paddingPx + 'px'\r\n }\r\n\r\n if (item.showMode === 'T') {\r\n styles.height = item.depthPx + 'px';\r\n }\r\n\r\n if (item.showMode === 'S') {\r\n styles.width = item.depthPx + 'px';\r\n }\r\n\r\n if (item.rotation) {\r\n styles['transform'] = 'rotate(90deg)';\r\n styles['transform-origin'] = 'bottom right';\r\n //styles['margin-left'] = -item.widthPx + 'px';\r\n }\r\n\r\n if (self.heatmapenabled || self.groupmapenabled) {\r\n styles['opacity'] = item.opacity;\r\n }\r\n\r\n return styles;\r\n }\r\n\r\n self.getListItemStyles = function (item, level, planogram) {\r\n var paddingPx = level.paddingItemsPx;\r\n var styles = {\r\n //'margin-left': paddingPx + 'px',\r\n //'margin-right': paddingPx + 'px'\r\n }\r\n\r\n if (item.rotation) {\r\n styles['width'] = item.heightPx + 'px'\r\n }\r\n else {\r\n //styles['width'] = (item.widthPx + (2 * paddingPx)) * item.facings + 'px';\r\n styles['width'] = item.widthPx * item.facings + 'px';\r\n styles['background-color'] = 'transparent';\r\n styles['height'] = level.heightPx + 'px';\r\n }\r\n\r\n return styles;\r\n }\r\n\r\n function getPaddingItems(level, planogram) {\r\n var pxMax = self.calcLevelWidth(level, planogram)\r\n var paddingItemsPx = cmToPX(level.itemPadding, planogram.width, pxMax);\r\n return paddingItemsPx\r\n }\r\n\r\n function getLevelHeightPX(level, module) {\r\n //var withModuleMax = self.calcLevelWidth(level, module)\r\n //var heightPx = cmToPX(level.height, module.width, withModuleMax);\r\n var heightPx = level.height * module.heightPx / module.height;\r\n return heightPx;\r\n }\r\n\r\n function getTotalHeightPX(planogram) {\r\n\r\n var widthPx = 0;\r\n\r\n var planogramdiv = document.getElementById('columnOrder_' + self.column.order + 'moduleOrder_' + planogram.order);\r\n\r\n if (planogramdiv) {\r\n planogram.widthPx = planogramdiv.clientWidth;\r\n }\r\n var heightPx = (planogram.height * planogram.widthPx / planogram.width) + (planogram.levels.length * 7);\r\n return heightPx;\r\n }\r\n\r\n function cmToPX(cm, cmMax, PXMax) {\r\n var widthPx = ((cm) * PXMax) / cmMax;\r\n return widthPx;\r\n }\r\n\r\n function calWidthFurniture(furniture, planogram) {\r\n var percentageWidth = furniture.width / planogram.width * 100;\r\n return percentageWidth;\r\n }\r\n\r\n function onSizeChanged() {\r\n\r\n self.planogram.heightPx = getTotalHeightPX(self.planogram)\r\n\r\n angular.forEach(self.planogram.planogramFurnitures, function (_planogramFurniture) {\r\n _planogramFurniture.percentageWidth = calWidthFurniture(_planogramFurniture.furniture, self.planogram)\r\n });\r\n\r\n angular.forEach(self.planogram.levels, function (_level) {\r\n _level.heightPx = getLevelHeightPX(_level, self.planogram)\r\n _level.paddingItemsPx = getPaddingItems(_level, self.planogram)\r\n });\r\n\r\n renderSizes()\r\n\r\n }\r\n\r\n function initEvents() {\r\n\r\n angular.element(window).on(\"resize.doResize\", _.throttle(function () {\r\n\r\n $scope.$apply(function () {\r\n onSizeChanged();\r\n });\r\n }, 500));\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n angular.element(window).off(\"resize.doResize\"); //remove the handler added earlier\r\n });\r\n }\r\n\r\n self.updateItemData = function () {\r\n //Recorro cada item de cada nivel en el planograma.\r\n angular.forEach(self.planogram.levels, function (level) {\r\n angular.forEach(level.items, function (item) {\r\n\r\n //1. inicializo el valor del tooltip con la traduccion.\r\n item.textTooltipItemOrientation = translations.ShowProfileItem;\r\n });\r\n });\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n $translate([\"InsufficientSpaceSwal\", \"InsufficientHeightSpaceSubtitleSwal\", \"InsufficientWidthSpaceSubtitleSwal\", \"InsufficientDepthSpaceSubtitleSwal\", \"IncorrectCategorySwal\", \"IncorrectCategorySubtitleSwal\", \"CancelSwal\", \"SureDeleteItemSwal\", \"RemoveSwal\", \"WithoutSize\", \"WithoutSizeSubtitle\", \"AddLayDownItemSwal\", \"ShowProfileItem\", \"ShowItemInfront\", \"ShowItemAbove\", \"Accept\", \"Cancel\", \"HeightNotAllowed\", \"HeightNotAllowedSubtitle\", \"LevelWithItems\", \"LevelWithItemsSubtitle\", \"Laydown\", \"Standup\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n self.updateItemData();\r\n\r\n initEvents();\r\n\r\n onSizeChanged();\r\n\r\n if (self.countplanogramitems) self.countplanogramitems();\r\n });\r\n }\r\n\r\n $timeout(function () {\r\n init();\r\n }, 25);\r\n\r\n}\r\n\r\n\r\n// Issue 275\r\n// Link: https://stackoverflow.com/a/24963384\r\nangular.module(\"prisma\").directive('img', function ($q, $window, imageService) {\r\n function setImage(element) {\r\n var w = element.width();\r\n var h = element.height();\r\n // using 20 here because it seems even a missing image will have ~18px width \r\n // after this error function has been called\r\n if (w <= 20) { w = 150; }\r\n if (h <= 20) { h = 150; }\r\n\r\n // var url = 'https://prismablob.blob.core.windows.net/cencosudperu/no-image.gif';\r\n // var url = 'http://placehold.it/' + w + 'x' + h + '/293846/a7b1c2&text=Prisma';\r\n var url = '//placehold.it/' + w + 'x' + h + '/293846/a7b1c2&text=Prisma';\r\n\r\n // var url = 'https://via.placeholder.com/' + w + 'x' + h + '/ffffff/000000&text=ITEM';\r\n element.prop('src', url);\r\n //element.css('border', 'double 3px #cccccc');\r\n\r\n }\r\n\r\n return {\r\n restrict: 'E',\r\n link: function (scope, element, attrs) {\r\n attrs.$observe('ngSrc', function (value) {\r\n /*\r\n var deferred = $q.defer();\r\n var image = new Image();\r\n var $image = angular.element(image);\r\n $image.on('error', function () {\r\n deferred.resolve(false);\r\n setImage(element);\r\n });\r\n $image.on('load', function () {\r\n deferred.resolve(true);\r\n });\r\n $image.prop('src', value);\r\n return deferred.promise;\r\n */\r\n return imageService.load(value)\r\n .then(function () {\r\n return true;\r\n })\r\n .catch(function () {\r\n setImage(element);\r\n return false;\r\n });\r\n });\r\n angular.element($window).on('resize', function () {\r\n var src = element.prop('src');\r\n if (src.indexOf('placehold.it') > -1) {\r\n setImage(element);\r\n }\r\n });\r\n }\r\n };\r\n});\r\n","angular.module('prisma').component('planogramPegComponent', {\r\n templateUrl: 'app/spaces/planograms/components/planogramPeg.component.html',\r\n controller: planogramPegController,\r\n bindings: {\r\n module: '=',\r\n planogram: '=',\r\n isloading: '=',\r\n itemstry: '=',\r\n newitem: '=',\r\n hideitems: '=',\r\n }\r\n});\r\nfunction planogramPegController($scope, $stateParams, spaceService) {\r\n var self = this;\r\n\r\n self.calcHeightPx = function (item) {\r\n if (!item.type && !item.dndId) {\r\n return 50\r\n }\r\n var domElement = document.getElementById(item.type + '_' + item.dndId);\r\n var domElementSize = domElement.getBoundingClientRect()\r\n var height = item.height * domElementSize.width / item.width;\r\n return height;\r\n }\r\n\r\n self.calcWidthPx = function (container, item) {\r\n var domContainer = document.getElementById(container.type + '_' + container.dndId);\r\n var domContainerSize = domContainer.getBoundingClientRect()\r\n var width = item.width * domContainerSize.width / container.width\r\n return width;\r\n }\r\n\r\n self.planogramLevel = {\r\n \"id\": 1,\r\n \"width\": 4000,\r\n \"depth\": 5300.88,\r\n \"levelObjects\": [\r\n {\r\n \"items\": [\r\n {\r\n \"id\": 2,\r\n \"planogramLevelId\": 2,\r\n \"itemId\": 107,\r\n \"order\": 0,\r\n \"nFronts\": 3,\r\n \"orientation\": 0,\r\n \"ticketCount\": 0,\r\n \"status\": null,\r\n \"categoryId\": 112,\r\n \"categoryName\": \"TV LED y Smart TV\",\r\n \"name\": \"TELEVISOR 32 \\\" SMART TV 32J4300\",\r\n \"imageUrl\": \"assets/images/items/ElectroDemo/168919.png\",\r\n \"width\": 74.54,\r\n \"height\": 44.2,\r\n \"depth\": 6.9,\r\n \"tags\": [],\r\n \"brand\": \"Samsung\",\r\n \"stackNum\": null\r\n }, {\r\n \"id\": 3,\r\n \"planogramLevelId\": 2,\r\n \"itemId\": 108,\r\n \"order\": 1,\r\n \"nFronts\": 1,\r\n \"orientation\": 0,\r\n \"ticketCount\": 0,\r\n \"status\": null,\r\n \"categoryId\": 112,\r\n \"categoryName\": \"TV LED y Smart TV\",\r\n \"name\": \"TELEVISOR 32 \\\" SMART TV 32LH575B\",\r\n \"imageUrl\": \"assets/images/items/ElectroDemo/171815.png\",\r\n \"width\": 73.4,\r\n \"height\": 47.4,\r\n \"depth\": 17.2,\r\n \"tags\": [],\r\n \"brand\": \"Lg\",\r\n \"stackNum\": null\r\n }, {\r\n \"id\": 4,\r\n \"planogramLevelId\": 3,\r\n \"itemId\": 105,\r\n \"order\": 0,\r\n \"nFronts\": 1,\r\n \"orientation\": 0,\r\n \"ticketCount\": 0,\r\n \"status\": null,\r\n \"categoryId\": 112,\r\n \"categoryName\": \"TV LED y Smart TV\",\r\n \"name\": \"TELEVISOR 32 \\\" SMART TV 32PHG5102\",\r\n \"imageUrl\": \"assets/images/items/ElectroDemo/172641.png\",\r\n \"width\": 73.25,\r\n \"height\": 42.96,\r\n \"depth\": 8.68,\r\n \"tags\": [],\r\n \"brand\": \"Philips\",\r\n \"stackNum\": null\r\n }, {\r\n \"id\": 5,\r\n \"planogramLevelId\": 3,\r\n \"itemId\": 106,\r\n \"order\": 1,\r\n \"nFronts\": 3,\r\n \"orientation\": 0,\r\n \"ticketCount\": 0,\r\n \"status\": null,\r\n \"categoryId\": 112,\r\n \"categoryName\": \"TV LED y Smart TV\",\r\n \"name\": \"TELEVISOR 32 \\\" SMART TV SH3216MHIX\",\r\n \"imageUrl\": \"assets/images/items/ElectroDemo/172485.png\",\r\n \"width\": 73.2,\r\n \"height\": 43.7,\r\n \"depth\": 6.4,\r\n \"tags\": [],\r\n \"brand\":\r\n \"Sharp\",\r\n \"stackNum\": null\r\n }, {\r\n \"id\": 1,\r\n \"planogramLevelId\": 4,\r\n \"itemId\": 101,\r\n \"order\": 0,\r\n \"nFronts\": 1,\r\n \"orientation\": 0,\r\n \"ticketCount\": 0,\r\n \"status\": null,\r\n \"categoryId\": 112,\r\n \"categoryName\": \"TV LED y Smart TV\",\r\n \"name\": \"TELEVISOR 32 \\\" SMART TV KB32S2000SA\",\r\n \"imageUrl\": \"assets/images/items/ElectroDemo/172747.png\",\r\n \"width\": 73.5,\r\n \"height\": 44,\r\n \"depth\": 8,\r\n \"tags\": [],\r\n \"brand\": \"Ken Brown\",\r\n \"stackNum\": null\r\n }, {\r\n \"id\": 6,\r\n \"planogramLevelId\": 4,\r\n \"itemId\": 102,\r\n \"order\": 1,\r\n \"nFronts\": 1,\r\n \"orientation\": 0,\r\n \"ticketCount\": 0,\r\n \"status\": null,\r\n \"categoryId\": 112,\r\n \"categoryName\": \"TV LED y Smart TV\",\r\n \"name\": \"TELEVISOR 32 \\\" SMART TV PLD3226HI\",\r\n \"imageUrl\": \"assets/images/items/ElectroDemo/172490.png\",\r\n \"width\": 73.2,\r\n \"height\": 43.7,\r\n \"depth\": 6.4,\r\n \"tags\": [],\r\n \"brand\": \"Philco\",\r\n \"stackNum\": null\r\n }, {\r\n \"id\": 7,\r\n \"planogramLevelId\": 4,\r\n \"itemId\": 103,\r\n \"order\": 2,\r\n \"nFronts\": 1,\r\n \"orientation\": 0,\r\n \"ticketCount\": 0,\r\n \"status\": null,\r\n \"categoryId\": 112,\r\n \"categoryName\": \"TV LED y Smart TV\",\r\n \"name\": \"TELEVISOR 32 \\\" SMART TV HLE3216RT\",\r\n \"imageUrl\": \"assets/images/items/ElectroDemo/172118.png\",\r\n \"width\": 73.38,\r\n \"height\": 47.4,\r\n \"depth\": 16.85,\r\n \"tags\": [],\r\n \"brand\": \"Hisense\",\r\n \"stackNum\": null\r\n }],\r\n \"id\": 1,\r\n \"categoryId\": 20,\r\n \"color\": \"#AEDB9A\",\r\n \"spaceObjectId\": 1,\r\n \"name\": \"TV-Planogram\",\r\n \"points\": [[28.59, 18.37], [28.59, 20.26], [39.99, 20.26], [39.99, 18.37]],\r\n \"rotation\": 0,\r\n \"isPlanogram\": true,\r\n \"ticketCount\": 0,\r\n \"width\": 450,\r\n \"depth\": 100\r\n }],\r\n \"points\": [[0, 0], [100, 0], [100, 100], [0, 100]],\r\n \"order\": 1,\r\n \"sellingAreaSpace\": 200,\r\n \"photoUri\": \"https://prismablob.blob.core.windows.net/electrodemo/Development/Spaces/LayoutImages/9ac3880f-c5d4-44e0-b07b-613ed5971613.jpg\",\r\n \"totalSpace\": 200,\r\n \"squareMeters\": 2120.352,\r\n \"linearFeets\": \"450\"\r\n }\r\n\r\n console.log('planogramPegsAreaController', self)\r\n\r\n $scope.$watch('$ctrl.newitem', function (newVal, oldVal) {\r\n console.log('change self.itemstry', newVal, oldVal, newVal != undefined)\r\n\r\n if (newVal != undefined) {\r\n self.newitem = false;\r\n angular.forEach(self.itemstry, function (planogramObject) {\r\n planogramObject.draggable = true;\r\n planogramObject.selectable = true;\r\n drawPlanogramObject(planogramObject, self.planogram);\r\n })\r\n }\r\n\r\n });\r\n\r\n function percentageToPixels(points, planogram) {\r\n var r = [];\r\n _.each(points, function (point) {\r\n r.push([getPixelFromPercentage(point[0], planogram.planogramDiv.clientWidth), getPixelFromPercentage(point[1], planogram.planogramDiv.clientHeight)]);\r\n });\r\n return r;\r\n }\r\n\r\n function getPixelFromPercentage(perc, maxPX) {\r\n return perc * maxPX / 100;\r\n }\r\n\r\n\r\n self.calcPlanogramSize = function (planogram) {\r\n //debugger\r\n var widthPx = planogram.planogramDiv.clientWidth;\r\n\r\n var heightPx = planogram.height * widthPx / planogram.width;\r\n\r\n planogram.widthPx = widthPx;\r\n planogram.heightPx = heightPx;\r\n\r\n planogram.planogramDiv.style.height = heightPx + 'px';\r\n\r\n if (planogram.polygonContainer)\r\n drawLevelObject(planogram.polygonContainer[0], self.planogram);\r\n console.log('self.planogram', self.planogram)\r\n }\r\n\r\n function loadPlanogramPeg(planogram) {\r\n // initialize SVG.js\r\n var drawCanvas = SVG('drawing')\r\n //drawCanvas.rect(100, 100)\r\n //drawCanvas.viewbox(0, 0, 297, 210).fill('none').stroke({ width: 1 })\r\n self.planogram.canvas = drawCanvas;\r\n self.planogram.planogramDiv = document.getElementById('drawing')\r\n self.calcPlanogramSize(self.planogram);\r\n\r\n self.planogram.pointsPx = percentageToPixels(self.planogramLevel.points, self.planogram)\r\n\r\n self.planogram.polygonContainer = {\r\n svgReference: drawCanvas.polygon(self.planogram.pointsPx.join(' ')).fill('transparent').stroke({ width: 1 }),\r\n fill: 'transparent',\r\n points: self.planogram.points,\r\n pointsPx: self.planogram.pointsPx,\r\n draggable: false,\r\n selectable: false,\r\n stroke: { width: 1, color: 'black' }\r\n }\r\n\r\n console.log('self.planogramSvg', self.planogram)\r\n\r\n // draw blue square\r\n var rect = self.planogram.canvas.rect(100, 100).attr({ fill: '#8181F7' }).attr({ x: 20, y: 60 }).draggable()\r\n rect.draggable().on('beforedrag', function (e) {\r\n e.preventDefault()\r\n console.log('beforeDrag', e)\r\n // no other events are bound\r\n // drag was completely prevented\r\n })\r\n\r\n //draw square img\r\n //var image = self.planogram.canvas.image('assets/images/items/ElectroDemo/168919.png')\r\n\r\n //image.size(100, 100).move(200, 200).draggable();\r\n\r\n rect.draggable().on('dragmove', function (e) {\r\n e.preventDefault()\r\n this.move(e.detail.p.x, e.detail.p.y)\r\n console.log('dragmove', e)\r\n // events are still bound e.g. dragend will fire anyway\r\n })\r\n var point = rect.point()\r\n console.log('point', point)\r\n //self.planogram.canvas.viewbox({ x: 0, y: 0, width: 200, height: 100 }).attr({ fill: '#8181F7' })\r\n\r\n //angular.forEach(self.planogram.levels, function (level) {\r\n angular.forEach(self.itemstry, function (planogramObject) {\r\n planogramObject.draggable = true;\r\n planogramObject.selectable = true;\r\n drawPlanogramObject(planogramObject, self.planogram);\r\n })\r\n //});\r\n }\r\n\r\n function drawPlanogramObject(component, planogram) {\r\n if (component.svgReference != undefined) {\r\n component.svgReference.remove()\r\n component.svgReference = undefined;\r\n }\r\n\r\n var pxPoints = percentageToPixels(component.points, planogram);\r\n component.pointsPx = pxPoints;\r\n if (!component.imageUrl) {\r\n component.svgReference = planogram.canvas.rect(component.width, component.height)\r\n .attr({ fill: '#8181F7' })\r\n .move(component.position[0], component.position[1])\r\n .draggable()\r\n .stroke({ width: 1, opacity: '1' });\r\n\r\n } else {\r\n\r\n //Si es una imagen, tengo que tratarlo un poco diferente\r\n //Tengo que crear un grupo, y asignar una imagen y un poligono (para que le rellene el fondo)\r\n\r\n component.svgReference = planogram.canvas.image(component.imageUrl)\r\n .size(component.width, component.height)\r\n .move(component.position[0], component.position[1])\r\n .draggable();\r\n\r\n }\r\n\r\n\r\n if (component.stroke)\r\n component.svgReference.stroke(component.stroke);\r\n\r\n //if (component.selectable == undefined || component.selectable == true)\r\n // component.svgReference.click(function () { self.levelObjectClick(c) });\r\n\r\n if (component.move) {\r\n component.svgReference.dmove(getPixelFromPercentage(component.move[0], level.layoutDiv.clientWidth), getPixelFromPercentage(component.move[1], level.layoutDiv.clientHeight));\r\n }\r\n\r\n if (component.rotation) {\r\n component.svgReference.transform({ rotation: component.rotation });\r\n\r\n //component.svgReference.transform({ rotation: component.rotation, relative: true });\r\n //component.svgReference.rotate(component.rotation);\r\n }\r\n\r\n if (component.color) {\r\n //component.svgReference.fill(component.color);\r\n //component.svgReference.fill(getSectionColor(component.categoryId));\r\n }\r\n\r\n //Esto es por si quiero sobreescribir un color \r\n //component.svgReference.fill('transparent');\r\n if (component.fill) {\r\n component.svgReference.fill(component.fill);\r\n //component.svgReference.stroke({ width: 1, color: component.fill })\r\n }\r\n\r\n if (component.back) {\r\n component.svgReference.back();\r\n }\r\n\r\n if (component.front) {\r\n component.svgReference.front();\r\n }\r\n\r\n if (component.attr) {\r\n component.svgReference.attr(component.attr);\r\n }\r\n\r\n //if (component.svgReference._array)\r\n // component.pointsPx = angular.copy(component.svgReference._array.value);\r\n\r\n if (/*self.isEdit()*/false && (component.draggable == undefined || component.draggable == true)) {\r\n\r\n component.svgReference.draggable();\r\n\r\n\r\n component.svgReference.on('dragmove.namespace', function (event) {\r\n if (!isValidPosition(event.srcElement, c)) {\r\n //console.log('mal');\r\n component.svgReference.fill('#ED5666');\r\n } else {\r\n //console.log('bien');\r\n //console.log('c', c);\r\n if (component.fill) {\r\n component.svgReference.fill(component.fill);\r\n }\r\n else if (component.isPlanogram && component.color) {\r\n component.svgReference.fill(component.color);\r\n } else {\r\n component.svgReference.fill(self.getComponentColor(c));\r\n }\r\n }\r\n });\r\n\r\n component.svgReference.on('dragend.namespace', function (event) {\r\n if (!isValidPosition(event.srcElement, c)) {\r\n //console.log('mal');\r\n component.svgReference.remove();\r\n drawLevelObject(c, level);\r\n } else {\r\n //console.log('bien');\r\n if (component.image) {\r\n component.pointsPx = getDivPoints(event.srcElement);\r\n component.points = pixelsToPercentage(component.pointsPx, level);\r\n component.svgReference.remove();\r\n drawLevelObject(c, level);\r\n component.imageMove = angular.copy(component.pointsPx[0]);\r\n component.move = undefined;\r\n } else {\r\n component.pointsPx = getDivPoints(event.srcElement);\r\n component.points = pixelsToPercentage(component.pointsPx, level);\r\n component.move = undefined;\r\n component.rotation = 0;\r\n component.svgReference.remove();\r\n drawLevelObject(c, level);\r\n }\r\n }\r\n self.levelObjectClick(c);\r\n //self.toggleLabels(false);\r\n\r\n });\r\n\r\n }\r\n\r\n }\r\n\r\n\r\n function initEvents(planogram) {\r\n\r\n }\r\n\r\n function init() {\r\n self.planogram.height = 200\r\n loadPlanogramPeg();\r\n\r\n initEvents();\r\n\r\n }\r\n init();\r\n}","angular.module('prisma').component('photoAuditComponent', {\r\n templateUrl: 'app/spaces/planograms/components/photoAudit.html',\r\n controller: photoAuditController,\r\n bindings: {\r\n resolve: '<',\r\n close: '&',\r\n dismiss: '&'\r\n }\r\n});\r\nfunction photoAuditController($scope, $stateParams, spaceService, $translate, ngDialog) {\r\n var self = this;\r\n self.file\r\n self.imgWidth\r\n self.imgheight\r\n self.textContent = 'No files selected';\r\n self.selectedStore = {}\r\n self.storePhotoAudit = {\r\n planogramId: $stateParams.planogramId\r\n }\r\n\r\n\r\n $scope.noWrapSlides = false;\r\n $scope.active = 0;\r\n $scope.slides = [];\r\n var currIndex = 0;\r\n\r\n $scope.addSlide = function (newSlide) {\r\n console.log('newslide', newSlide)\r\n $scope.slides.push({\r\n image: newSlide.uriPhoto,\r\n text: newSlide.storeName,\r\n id: currIndex++,\r\n });\r\n };\r\n\r\n\r\n $scope.uploadFile = function (files) {\r\n\r\n console.log('$scope.uploadFile', files)\r\n\r\n self.file = files[0]\r\n //self.level.file = files[0]\r\n\r\n updateImageDisplay(files)\r\n\r\n\r\n };\r\n\r\n\r\n var preview = document.querySelector('.preview');\r\n\r\n\r\n function updateImageDisplay(files) {\r\n\r\n while (preview.firstChild) {\r\n preview.removeChild(preview.firstChild);\r\n }\r\n\r\n var formData = new FormData();\r\n\r\n formData.append('photo', files[0]);\r\n\r\n spaceService.planograms.savePhotoAudit(formData).then(function (uri) {\r\n console.log('saveLayoutLevel', uri)\r\n self.photoUri = uri\r\n\r\n self.storePhotoAudit.uriPhoto = uri\r\n\r\n var curFiles = files;\r\n if (curFiles.length === 0) {\r\n self.textContent = 'No files currently selected for upload';\r\n } else {\r\n var list = document.createElement('ol');\r\n preview.appendChild(list);\r\n for (var i = 0; i < curFiles.length; i++) {\r\n var listItem = document.createElement('li');\r\n var para = document.createElement('p');\r\n if (validFileType(curFiles[i])) {\r\n para.textContent = translations.FileName + curFiles[i].name + translations.FileSize + returnFileSize(curFiles[i].size) + '.';\r\n var image = document.createElement('img');\r\n image.src = window.URL.createObjectURL(curFiles[i]);\r\n image.onload = function () {\r\n self.imgWidth = image.naturalWidth\r\n self.imgheight = image.naturalHeight\r\n }\r\n\r\n image.style.height = '150px'\r\n\r\n listItem.appendChild(image);\r\n listItem.appendChild(para);\r\n\r\n } else {\r\n para.textContent = translations.FileName + curFiles[i].name + translations.NotValidFileType;\r\n listItem.appendChild(para);\r\n }\r\n\r\n list.appendChild(listItem);\r\n }\r\n }\r\n\r\n });\r\n\r\n\r\n }\r\n\r\n var fileTypes = [\r\n 'image/jpeg',\r\n 'image/pjpeg',\r\n 'image/png'\r\n ]\r\n\r\n function validFileType(file) {\r\n for (var i = 0; i < fileTypes.length; i++) {\r\n if (file.type === fileTypes[i]) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n function returnFileSize(number) {\r\n if (number < 1024) {\r\n return number + 'bytes';\r\n } else if (number > 1024 && number < 1048576) {\r\n return (number / 1024).toFixed(1) + 'KB';\r\n } else if (number > 1048576) {\r\n return (number / 1048576).toFixed(1) + 'MB';\r\n }\r\n }\r\n\r\n self.storeClicked = function (store) {\r\n self.selectedStore = store\r\n //console.log('store', store)\r\n self.storePhotoAudit.storeId = store.id\r\n }\r\n\r\n function isValidField(field) {\r\n if (field == undefined || field == null || field == '')\r\n return false;\r\n\r\n return true\r\n }\r\n\r\n function validar() {\r\n return isValidField(self.storePhotoAudit.storeId) &&\r\n isValidField(self.storePhotoAudit.planogramId) &&\r\n isValidField(self.storePhotoAudit.uriPhoto);\r\n }\r\n\r\n self.savePhotoAudit = function () {\r\n if (!validar()) {\r\n swal(translations.ValidationSwalTitle, translations.ValidationSwalSubtitle, 'error');\r\n return;\r\n }\r\n\r\n spaceService.planograms.savePlanogramStorePhotoAudi(self.storePhotoAudit).then(function (res) {\r\n\r\n self.cancel();\r\n\r\n self.photoAudits = res;\r\n $scope.slides = [];\r\n angular.forEach(self.photoAudits, function (_photoAudit) {\r\n angular.forEach(self.stores, function (_store) {\r\n if (_store.id == _photoAudit.storeId) {\r\n _photoAudit.storeName = _store.name\r\n }\r\n })\r\n $scope.addSlide(_photoAudit);\r\n })\r\n console.log('slide', $scope.slides)\r\n //self.showUploadPhotoAudit = false\r\n //self.close({ $value: self.level });\r\n });\r\n }\r\n\r\n self.confirm = function () {\r\n self.close({ $value: self.photoAudits });\r\n }\r\n\r\n\r\n self.cancel = function () {\r\n self.dismiss({ $value: 'cancel' });\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n $translate([\"FileName\", \"FileSize\", \"NotValidFileType\", \"ValidationSwalTitle\", \"ValidationSwalSubtitle\"])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n spaceService.planograms.getPlanogramInfo($stateParams.planogramId).then(function (planogram) {\r\n\r\n \r\n console.log('foto auditoria', planogram);\r\n //console.log('stores', stores);\r\n self.stores = planogram.stores;\r\n\r\n spaceService.planograms.getPhotoAudit($stateParams.planogramId).then(function (photoAudits) {\r\n self.photoAudits = photoAudits;\r\n angular.forEach(self.photoAudits, function (_photoAudit) {\r\n angular.forEach(self.stores, function (_store) {\r\n if (_store.id == _photoAudit.storeId) {\r\n _photoAudit.storeName = _store.name\r\n }\r\n })\r\n $scope.addSlide(_photoAudit);\r\n })\r\n //console.log('photoAudits', self.photoAudits);\r\n });\r\n });\r\n }\r\n\r\n init()\r\n }\r\n","angular.module('prisma').component('containerPlanogramComponent', {\r\n templateUrl: 'app/spaces/planograms/components/containerPlanogram.html',\r\n controller: containerPlanogramController,\r\n bindings: {\r\n planogram: '=',\r\n iscreate: '=',\r\n hideitems: '=',\r\n column: '=',\r\n renderpiechartsparent: '=',\r\n selecteditem: '=',\r\n filtereditems: '=',\r\n selectedlevelparent: \"=\",\r\n selectedplanogramparent: \"=\",\r\n sales: '=',\r\n showloadquantity: '=',\r\n showexhibitiondays: '=',\r\n showregularprice: '=',\r\n showdaysinstock: '=',\r\n selectedbrand: '=',\r\n selectedmanufacturer: '=',\r\n selectedtagfilter: '=',\r\n heatmapenabled: '=',\r\n groupmapenabled: '=',\r\n showdoor: '=',\r\n autostack: '=',\r\n countplanogramitems: '=',\r\n shownewticketmodal: '=',\r\n showlevelmeasurebuttons: '=',\r\n zoom: '=',\r\n moduleselected: \"=\",\r\n showelements: \"=\",\r\n showdeletebutton: \"=\"\r\n }\r\n});\r\nfunction containerPlanogramController($scope, $state, $stateParams, $translate, $timeout, spaceService, ngDialog) {\r\n var self = this;\r\n self.containerSize = 2;\r\n self.showSaveInElements = false;\r\n self.validation = false;\r\n self.isFirstInserction = true;\r\n\r\n\r\n $scope.$watch('$ctrl.moduleselected', function (model) {\r\n //console.log('watch moduleselected', model)\r\n updateSizePlanogram(self.planogram)\r\n }, true);\r\n\r\n $scope.$watch('$ctrl.showdoor', function (showdoor) {\r\n self.showDoor = self.showdoor\r\n })\r\n \r\n\r\n self.isPlanogramColumnVisible = function (currColumn) {\r\n\r\n if (self.moduleselected) {\r\n //si hay algun modulo seleccionado, solo renderiza la columna correspondiente\r\n var showColumn = false;\r\n angular.forEach(self.planogram.columns, function (column, _indexColumn) {\r\n angular.forEach(column.modules, function (module, _indexModule) {\r\n if (module.isSelected && column.id === currColumn.id) {\r\n showColumn = true;\r\n }\r\n });\r\n\r\n });\r\n\r\n return showColumn;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function generateNewModule(module) {\r\n var newModule\r\n switch (module.type) {\r\n case 'Shelf':\r\n newModule = {\r\n type: module.type,\r\n dndId: 1,\r\n width: 0,\r\n depth: 0,\r\n height: 0,\r\n numLevels: 1,\r\n order: 0,\r\n levels: [],\r\n divisions: 1,\r\n isRefrigerator: module.isRefrigerator,\r\n imageUrl: module.imageUrl,\r\n };\r\n break;\r\n case 'Peg':\r\n newModule = {\r\n type: 'Peg',\r\n dndId: 2,\r\n width: 0,\r\n depth: 0,\r\n height: 0,\r\n numLevels: 1,\r\n levels: [],\r\n divisions: 1,\r\n isRefrigerator: true,\r\n imageUrl: '/assets/images/spaces/templates/heladera.png'\r\n };\r\n break;\r\n default:\r\n newModule = {};\r\n }\r\n\r\n return newModule\r\n\r\n }\r\n\r\n self.addNewModule = function () {\r\n\r\n if (self.newModule.numLevels <= 0 || self.newModule.width <= 0 || self.newModule.height <= 0 || self.newModule.depth <= 0) {\r\n self.validation = true;\r\n }\r\n else {\r\n //Guada los cambios y blanquea los campos\r\n //self.newModule = generateNewModule();\r\n self.insertModule = true;\r\n ngDialog.close();\r\n }\r\n }\r\n\r\n self.insertInPlanogram = 1\r\n self.insertIn = function (where) {\r\n self.insertInPlanogram = where\r\n }\r\n\r\n\r\n self.templateDroppedInPlanogramColumn = function (index, newModule, external, type, column, planogram) {\r\n //self.planogram.module = module;\r\n self.insertModule = false;\r\n self.newModule = generateNewModule(newModule)\r\n ngDialog.open({\r\n template: 'modulesDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: $scope\r\n }).closePromise.then(function (data) {\r\n if (self.insertModule) {\r\n // select Item\r\n self.moduleselected = self.newModule;\r\n self.calHeightLevels(self.newModule);\r\n self.showelements = false;\r\n self.showSaveInElements = false;\r\n self.selectModule(self.newModule);\r\n self.templateInsertedInPlanogramColumn(index, self.newModule, external, type, column, planogram);\r\n\r\n }\r\n return true;\r\n });\r\n }\r\n\r\n self.templateInsertedInPlanogramColumn = function (index, module, external, type, column, planogram) {\r\n //logica donde insertar el nuevo modulo\r\n //Insert in the same Column = 1\r\n //Insert in new column on the left = 2\r\n //Insert in new column on the right = 3\r\n\r\n if (planogram.columns.length > 0)\r\n self.isFirstInserction = false;\r\n\r\n module.uniqueId = guid()\r\n\r\n var newColumn = {\r\n order: 1,\r\n width: 1,\r\n modules: []\r\n }\r\n switch (self.insertInPlanogram) {\r\n case 1:\r\n column.modules.splice(index, 0, module);\r\n self.insertInPlanogram = 3;\r\n break;\r\n case 2:\r\n planogram.columns.unshift(newColumn);\r\n newColumn.modules.push(module);\r\n break;\r\n case 3:\r\n planogram.columns.push(newColumn);\r\n newColumn.modules.push(module);\r\n break;\r\n default:\r\n //nothing\r\n }\r\n\r\n // if (!column.modules.lenght) module.order = 1;\r\n\r\n //asigno el order a column y a module\r\n angular.forEach(planogram.columns, function (_column, index) {\r\n _column.order = index + 1;\r\n angular.forEach(_column.modules, function (_module, index) {\r\n _module.order = index + 1;\r\n });\r\n })\r\n //$scope.$apply();\r\n updateSizePlanogram(planogram)\r\n }\r\n\r\n function calcWidthPercentage(planogram) {\r\n angular.forEach(planogram.columns, function (column) {\r\n //calculo el ancho de cada columna\r\n column.widthPercentage = column.width / planogram.width * 100;\r\n //calculo el ancho de cada modulo \r\n angular.forEach(column.modules, function (_module) {\r\n _module.widthPercent = _module.width / column.width * 100;\r\n })\r\n })\r\n }\r\n\r\n function updateSizePlanogram(planogram) {\r\n planogram.width = 0;\r\n planogram.height = 0;\r\n planogram.depth = 0;\r\n angular.forEach(planogram.columns, function (column) {\r\n column.width = 0;\r\n column.height = 0;\r\n column.depth = 0;\r\n angular.forEach(column.modules, function (module) {\r\n if (module.width > column.width) column.width = module.width;\r\n column.height += module.height;\r\n if (module.depth > column.depth) column.depth = module.depth;\r\n })\r\n if (!column.width) column.width = 1;\r\n planogram.width += column.width;\r\n if (column.height > planogram.height) planogram.height = column.height;\r\n if (column.depth > planogram.depth) planogram.depth = column.depth;\r\n })\r\n\r\n calcWidthPercentage(planogram);\r\n }\r\n\r\n self.calHeightLevels = function (module) {\r\n module.levels = []\r\n var calHeightForLevel = module.height / module.numLevels\r\n for (var i = 0; i < module.numLevels; i++) {\r\n module.levels.push({\r\n categoryId: null,\r\n categoryName: \"\",\r\n height: calHeightForLevel,\r\n id: 0,\r\n itemPadding: 1,\r\n items: [],\r\n levelNumber: i + 1,\r\n })\r\n }\r\n }\r\n\r\n self.selectModule = function (element) {\r\n self.showelements = false;\r\n\r\n //Reseteo el isSelected\r\n angular.forEach(self.planogram.columns, function (column) {\r\n angular.forEach(column.modules, function (module) {\r\n module.isSelected = false;\r\n });\r\n });\r\n\r\n if (element != \"\") {\r\n if (element.type == 'Shelf' || element.type == 'Peg' || element.type == 'Refrigerator') {\r\n self.showdeletebutton = true;\r\n element.isSelected = true;\r\n self.showSaveInElements = false;\r\n self.moduleselected = element\r\n }\r\n else {\r\n self.showSaveInElements = true;\r\n }\r\n }\r\n\r\n }\r\n\r\n self.resizeContainer = function () {\r\n lenght = self.containerSize;\r\n if (lenght != null && lenght != undefined && lenght > 0) {\r\n if (!self.moduleselected) {\r\n self.planogram.module.columns = [];\r\n\r\n for (var i = 0; i < lenght; i++) {\r\n self.planogram.module.columns.push({\r\n order: 1,\r\n width: 0,\r\n childrenModules: [\r\n\r\n ]\r\n });\r\n }\r\n }\r\n else {\r\n self.moduleselected.columns = [];\r\n for (var i = 0; i < lenght; i++) {\r\n self.moduleselected.columns.push({\r\n order: 1,\r\n width: 0,\r\n childrenModules: [\r\n\r\n ]\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n self.addColumnToContainer = function (add) {\r\n if (!self.moduleselected) {\r\n add ? self.planogram.module.columns.push({\r\n order: 1,\r\n width: 0,\r\n childrenModules: [\r\n\r\n ]\r\n }) : self.planogram.module.columns.pop();\r\n } else {\r\n add ? self.moduleselected.columns.push({\r\n order: 1,\r\n width: 0,\r\n childrenModules: [\r\n\r\n ]\r\n }) : self.moduleselected.columns.pop();\r\n }\r\n }\r\n\r\n self.calcPlanogramHeightPx = function (planogram) {\r\n //if (!item.type && !item.dndId) {\r\n // return 309\r\n //}\r\n var domElement = document.getElementById('planogram_' + planogram.id);\r\n var domElementSize = domElement.getBoundingClientRect()\r\n var height = planogram.height * domElementSize.width / planogram.width;\r\n\r\n return height;\r\n }\r\n\r\n self.calcWidthPx = function (container, item) {\r\n var domContainer = document.getElementById(container.type + '_' + container.dndId);\r\n var domContainerSize = domContainer.getBoundingClientRect()\r\n\r\n var width = item.width * domContainerSize.width / container.width\r\n return width;\r\n }\r\n\r\n function getWidth(component) {\r\n var totalWidth = 0;\r\n angular.forEach(component.columns, function (column) {\r\n var maxWidth = 0\r\n angular.forEach(column, function (row) {\r\n if (row.width > maxWidth) maxWidth = row.width;\r\n })\r\n totalWidth += maxWidth\r\n })\r\n component.width = totalWidth;\r\n return totalWidth\r\n }\r\n\r\n self.getClassForTemplate = function (item) {\r\n\r\n if ($scope.models != null && self.moduleselected != null && item != null && self.moduleselected.type == item.type && item.type == 'planogramPeg' || item.type == 'planogramShelf')\r\n return 'outlineSelectElement';\r\n else if ($scope.models != null && self.moduleselected != null && item != null && self.moduleselected.type == item.type && item.type == 'container') {\r\n return 'outline-selectElementContainer';\r\n }\r\n }\r\n\r\n\r\n function guid() {\r\n function s4() {\r\n return Math.floor((1 + Math.random()) * 0x10000)\r\n .toString(16)\r\n .substring(1);\r\n }\r\n return s4() + s4() + '-' + s4() + '-' + s4() + '-' +\r\n s4() + '-' + s4() + s4() + s4();\r\n }\r\n\r\n self.until = {\r\n planograms: 1,\r\n columns: 2,\r\n modules: 3,\r\n levels: 4,\r\n items: 5\r\n }\r\n\r\n function loopThroughAll(callbackFunction, until) {\r\n return new Promise(function (resolve, reject) {\r\n if (self.until[until]) reject('err - argument until is difened as: ' + until)\r\n angular.forEach(self.planogram.columns, function (column) {\r\n if (until == self.until.columns) return callbackFunction(self.planogram, column);\r\n angular.forEach(column.modules, function (module) {\r\n if (until == self.until.modules) return callbackFunction(self.planogram, column, module);\r\n angular.forEach(module.levels, function (level) {\r\n if (until == self.until.levels) return callbackFunction(self.planogram, column, module, level);\r\n angular.forEach(level.items, function (item) {\r\n if (until == self.until.items) return callbackFunction(self.planogram, column, module, level, item);\r\n });\r\n });\r\n })\r\n });\r\n resolve('success');\r\n });\r\n\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n $translate([\"InsertInTheSameColumn\", \"InsertInNewColumnOnLeft\", \"InsertInNewColumnOnRight\"])\r\n .then(function (all) {\r\n translations = all;\r\n self.modulePositionOptions = [\r\n //{ name: translations.InsertInTheSameColumn, valor: 1 },\r\n { name: translations.InsertInNewColumnOnLeft, valor: 2 },\r\n { name: translations.InsertInNewColumnOnRight, valor: 3 }\r\n ];\r\n\r\n updateSizePlanogram(self.planogram)\r\n })\r\n\r\n if (self.planogram.id != 0)\r\n self.isFirstInserction = false;\r\n\r\n }\r\n\r\n $timeout(function () {\r\n init();\r\n }, 25);\r\n\r\n \r\n}",null,"(function () {\r\n 'use strict';\r\n\r\n agGrid.initialiseAgGridWithAngular1(angular);\r\n\r\n angular.module('prisma', [\r\n 'ngAnimate',\r\n 'ngCookies',\r\n 'ngTouch',\r\n 'ui.select',\r\n 'ngSanitize',\r\n 'ngResource',\r\n 'ngMessages',\r\n 'ngAria',\r\n 'ngDialog',\r\n 'ui.router',\r\n 'ui.bootstrap',\r\n //'ui.bootstrap.datetimepicker',\r\n \"pascalprecht.translate\",\r\n \"angular-flot\",\r\n \"gantt\",\r\n 'gantt.sortable',\r\n 'gantt.movable',\r\n 'gantt.drawtask',\r\n 'gantt.tooltips',\r\n 'gantt.bounds',\r\n 'gantt.progress',\r\n 'gantt.table',\r\n 'gantt.tree',\r\n 'gantt.groups',\r\n 'gantt.dependencies',\r\n 'gantt.overlap',\r\n 'gantt.resizeSensor',\r\n \"angularMoment\",\r\n //\"jsplumb\",\r\n \"agGrid\",\r\n \"angular-ladda\",\r\n \"ngFileUpload\",\r\n \"angucomplete-alt\",\r\n \"localytics.directives\",\r\n \"angular.filter\",\r\n \"LocalStorageModule\",\r\n \"color.picker\",\r\n \"rzModule\",\r\n \"dndLists\",\r\n \"laneolson.ui.dragdrop\",\r\n //\"slick\",\r\n //\"slick-carousel\"\r\n ]);\r\n\r\n})();\r\n","'use strinct';\r\n(function () {\r\n angular.module('prisma').component('planogramPrintWayDirection', {\r\n templateUrl: '/app/spaces/planogram/print/planogram-print-way-direction.view.html',\r\n bindings: {\r\n rightToLeft: '<'\r\n },\r\n controller: 'planogramPrintWayController',\r\n controllerAs: '$ctrl',\r\n bindToController: true\r\n }).controller('planogramPrintWayController', ['$log', planogramPrintWayController]);\r\n\r\n // ReSharper disable once InconsistentNaming\r\n function planogramPrintWayController($log) {\r\n //$log.debug('planogramPrintWayController::ctor');\r\n var self = this;\r\n self.rightToLeft = false;\r\n\r\n self.$onInit = function () {\r\n //$log.debug('planogramController::$onInit');\r\n };\r\n\r\n self.$onDestroy = function () {\r\n //$log.debug('planogramController::$onDestroy');\r\n };\r\n\r\n self.$onChanges = function $onChanges(changesObj) {\r\n //$log.debug('planogramController::$onChanges %o', changesObj);\r\n if (changesObj.rightToLeft) {\r\n self.rightToLeft = Boolean(changesObj.rightToLeft.currentValue);\r\n }\r\n }\r\n }\r\n})();","'use strinct';\r\n(function () {\r\n angular.module('prisma').component('planogramPrintStores', {\r\n templateUrl: '/app/spaces/planogram/print/planogram-print-stores.view.html',\r\n bindings: {\r\n model: '<',\r\n orderBy: '<'\r\n },\r\n controller: 'planogramPrintStoresController',\r\n controllerAs: '$ctrl',\r\n bindToController: true\r\n }).controller('planogramPrintStoresController', ['$log', planogramPrintStoresController]);\r\n\r\n // ReSharper disable once InconsistentNaming\r\n function planogramPrintStoresController($log) {\r\n //$log.debug('planogramPrintStoresController::ctor');\r\n var self = this;\r\n //self.model = [];\r\n //self.orderBy = 'code';\r\n\r\n //self.$onChanges = function $onChanges(changesObj) {\r\n // $log.debug('planogramPrintStoresController::$onChanges %o', changesObj);\r\n // if (changesObj.model && angular.isArray(changesObj.model.currentValue)) {\r\n // self.model = changesObj.model.currentValue;\r\n // }\r\n //}\r\n\r\n /**\r\n * Devuelve verdadero si el modelo es un objeto, falso en caso contrario.\r\n * @public\r\n * @returns Verdadero si el modelo es un objeto, falso en caso contrario.\r\n */\r\n self.hasModel = function hasModel() {\r\n var ret = angular.isObject(self.model);\r\n return ret;\r\n }\r\n }\r\n})();","'use strinct';\r\n(function () {\r\n angular.module('prisma').component('planogramPrintPage', {\r\n bindings: {\r\n planogram: '<',\r\n showHeader: '<',\r\n showPrintWayDirection: '<',\r\n showStores: '<',\r\n stores: '<',\r\n storesOrderBy: '<',\r\n showFooter: '<',\r\n showPageInfo: '<',\r\n isLastPage: '<',\r\n columnSpaceBetween: '<',\r\n showDoor: '<',\r\n showItemSketch: '<',\r\n showGroupSketch: '<',\r\n showLabelInfo: '<',\r\n showLabel1: '<',\r\n showLabel2: '<',\r\n showOverlay: '<',\r\n showColumnId: '<',\r\n moduleSpaceBetween: '<',\r\n levelSpaceBetween: '<',\r\n itemSpaceBetween: '<',\r\n shelfHeight: '<',\r\n label1: '<',\r\n label2: '<',\r\n labelInfo: '<',\r\n labelHeight: '<',\r\n raiseOnRenderReady: '&onrenderReady',\r\n width: '<'\r\n },\r\n bindToController: true,\r\n controller: 'planogramPageController',\r\n controllerAs: '$ctrl',\r\n\r\n templateUrl: '/app/spaces/planogram/print/planogram-print-page.view.html',\r\n transclude: {\r\n 'header': '?pageHeader',\r\n 'body': '?pageBody',\r\n 'footer': '?pageFooter'\r\n }\r\n }).controller('planogramPageController', ['$log', planogramPrintPageController]);\r\n\r\n // ReSharper disable once InconsistentNaming\r\n function planogramPrintPageController($log) {\r\n //$log.debug('planogramPrintPageController::ctor');\r\n var self = this;\r\n self.rightToLeft = false;\r\n\r\n self.$onInit = function () {\r\n //$log.debug('planogramPrintPageController::$onInit');\r\n };\r\n\r\n self.$onDestroy = function () {\r\n //$log.debug('planogramPrintPageController::$onDestroy');\r\n };\r\n }\r\n})();","'use strinct';\r\n(function () {\r\n angular.module('prisma').component('planogramPrintHeader', {\r\n templateUrl: '/app/spaces/planogram/print/planogram-print-header.view.html',\r\n bindings: {\r\n model: '<'\r\n },\r\n controller: 'planogramPrintHeaderController',\r\n controllerAs: '$ctrl',\r\n bindToController: true\r\n }).controller('planogramPrintHeaderController', ['$log', planogramPrintHeaderController]);\r\n\r\n // ReSharper disable once InconsistentNaming\r\n function planogramPrintHeaderController($log) {\r\n //$log.debug('planogramPrintHeaderController::ctor');\r\n var self = this;\r\n // self.model = null;\r\n\r\n /**\r\n * Devuelve verdadero si el modelo es un objeto, falso en caso contrario.\r\n * @public\r\n * @returns Verdadero si el modelo es un objeto, falso en caso contrario.\r\n */\r\n self.hasModel = function hasModel() {\r\n var ret = angular.isObject(self.model);\r\n return ret;\r\n }\r\n }\r\n})();","'use strinct';\r\n(function () {\r\n angular.module('prisma').component('planogramPrintFooter', {\r\n templateUrl: '/app/spaces/planogram/print/planogram-print-footer.view.html',\r\n bindings: {\r\n page: '<',\r\n pageTotal: '<',\r\n showPageInfo:'<'\r\n },\r\n controller: 'planogramPrintFooterController',\r\n controllerAs: '$ctrl',\r\n bindToController: true\r\n }).controller('planogramPrintFooterController', ['$log', planogramPrintFooterController]);\r\n\r\n // ReSharper disable once InconsistentNaming\r\n function planogramPrintFooterController($log) {\r\n //$log.debug('planogramPrintFooterController::ctor');\r\n var self = this;\r\n self.page = 1;\r\n self.pageTotal = 1;\r\n self.showPageInfo = false;\r\n\r\n /**\r\n * Devuelve una cadena con la fecha y hora formateada como día/mes/año.\r\n */\r\n self.getFechaHora = function getFechaHora() {\r\n return moment().format('DD/MM/YYYY hh:mma');\r\n };\r\n }\r\n})();","'use strinct';\r\n(function () {\r\n Link: https://parkji.co.uk/2013/08/11/native-drag-and-drop-in-angularjs.html\r\n angular.module('prisma')\r\n .directive('droppable', ['$log', '$parse', '$timeout', '$rootScope', droppableDirective]);\r\n\r\n function droppableDirective($log, $parse, $timeout, $rootScope) {\r\n //$log.debug('droppableDirective::ctor');\r\n var uid = 0;\r\n\r\n return {\r\n restrict: 'A',\r\n link: function link(scope, $element, $attr) {\r\n var newId = ++uid;\r\n // $log.debug('droppableDirective::link id: %o', newId);\r\n $element.data('dropZoneId', String(newId));\r\n var raiseDragover;\r\n if ($attr.onDragover) {\r\n raiseDragover = $parse($attr.onDragover);\r\n } else {\r\n raiseDragover = angular.noop;\r\n }\r\n\r\n var raiseDragenter;\r\n if ($attr.onDragenter) {\r\n raiseDragenter = $parse($attr.onDragenter);\r\n } else {\r\n raiseDragenter = angular.noop;\r\n }\r\n\r\n var raiseDragleave;\r\n if ($attr.onDragleave) {\r\n raiseDragleave = $parse($attr.onDragleave);\r\n } else {\r\n raiseDragleave = angular.noop;\r\n }\r\n\r\n var raiseDrop;\r\n if ($attr.onDrop) {\r\n raiseDrop = $parse($attr.onDrop);\r\n } else {\r\n raiseDrop = angular.noop;\r\n }\r\n\r\n function preventAndStop($event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n }\r\n\r\n $element.off('dragenter dragover dragleave drop')\r\n .on('dragover', function dragover($event) {\r\n // $log.debug('droppableDirective::link (dragover) $event: %o', $event);\r\n preventAndStop($event);\r\n $element.addClass('over');\r\n scope.$apply(function () {\r\n raiseDragover(scope, { '$event': $event });\r\n });\r\n return false;\r\n }).on('dragenter', function dragenter($event) {\r\n // $log.debug('droppableDirective::link (dragenter) $event: %o', event);\r\n preventAndStop($event);\r\n $element.addClass('over');\r\n scope.$apply(function () {\r\n raiseDragenter(scope, { '$event': $event });\r\n });\r\n }).on('dragleave', function dragleave($event) {\r\n // $log.debug('droppableDirective::link (dragleave) $event: %o', $event);\r\n preventAndStop($event);\r\n $element.removeClass('over');\r\n scope.$apply(function () {\r\n raiseDragleave(scope, { '$event': $event });\r\n });\r\n }).on('drop', function drop($event) {\r\n // $log.debug('droppableDirective::link (drop) $event: %o', $event);\r\n preventAndStop($event);\r\n $element.removeClass('over');\r\n //scope.$apply(function () {\r\n if ($rootScope.$$phase) {\r\n $timeout(function () {\r\n raiseDrop(scope, { '$event': $event });\r\n });\r\n }\r\n else {\r\n scope.$apply(function () {\r\n raiseDrop(scope, { '$event': $event });\r\n });\r\n }\r\n\r\n return false;\r\n });\r\n scope.$on(\"$destroy\", function () {\r\n $element.off('dragenter dragover dragleave drop');\r\n });\r\n }\r\n };\r\n }\r\n})();","'use strinct';\r\n(function () {\r\n // Link: https://parkji.co.uk/2013/08/11/native-drag-and-drop-in-angularjs.html\r\n angular.module('prisma')\r\n .directive('draggable', ['$log', '$parse', '$document', '$window', '$timeout', 'DnDService', draggableDirective]);\r\n\r\n /**\r\n * Directiva draggable permite arrastrar un elemento por la pagina.\r\n * @param {any} $log Servicio de log de angular.\r\n * @param {any} $parse Servicio de parse de angular.\r\n * @param {any} $document Servicio de document de angular.\r\n * @param {any} $window Servicio de window de angular.\r\n * @param {any} dnDService Servicio de Drag and Drop.\r\n */\r\n function draggableDirective($log, $parse, $document, $window, $timeout, dnDService) {\r\n // $log.debug('draggableDirective::ctor');\r\n var uid = 0;\r\n var duid = 0;\r\n\r\n function linkFn(scope, $element, $attr) {\r\n var localUId = ++duid;\r\n var methodName = 'draggableDirective::link';\r\n var hasOnHold = false;\r\n var holdTimeoutId;\r\n // $log.debug(methodName);\r\n $element.data('duid', localUId);\r\n\r\n var dataGetter;\r\n if ($attr.draggableData) {\r\n dataGetter = $parse($attr.draggableData);\r\n } else {\r\n dataGetter = angular.noop;\r\n }\r\n\r\n // Parsea la expresion para obtener el Id del elemento que se esta arrastrando.\r\n var idGetter;\r\n if ($attr.draggableId) {\r\n idGetter = $parse($attr.draggableId);\r\n } else {\r\n idGetter = function () {\r\n var id = ++uid;\r\n var ret = 'ian-draggable-target-' + String(id);\r\n return ret;\r\n };\r\n }\r\n\r\n // Parsea la expresion para obtener el target del elemento que se esta arrastrando.\r\n var targetGetter;\r\n if ($attr.draggableTarget) {\r\n targetGetter = $parse($attr.draggableTarget);\r\n } else {\r\n targetGetter = angular.noop;\r\n }\r\n\r\n var snapToGridGetter;\r\n if ($attr.draggableSnapToGrid) {\r\n snapToGridGetter = $parse($attr.draggableSnapToGrid);\r\n } else {\r\n snapToGridGetter = function snapToGridFn() {\r\n return { x: 1, y: 1 };\r\n }\r\n }\r\n\r\n var moveAtSetter;\r\n if ($attr.draggableMoveAt) {\r\n var moveAtSetterAux = $parse($attr.draggableMoveAt);\r\n moveAtSetter = function ($event, x, y) {\r\n moveAtSetterAux(scope, { $event: $event, x: x, y: y });\r\n };\r\n } else {\r\n moveAtSetter = function wrapperMoveAt($event, x, y) {\r\n // Actualiza la posici�n de la imagen.\r\n moveAt(x, y);\r\n }\r\n }\r\n\r\n var raiseDragEnd;\r\n if ($attr.onDragend) {\r\n raiseDragEnd = $parse($attr.onDragend);\r\n } else {\r\n raiseDragEnd = angular.noop;\r\n }\r\n\r\n var enableGetter;\r\n var unWatchDraggableEnable;\r\n\r\n if ($attr.draggableEnable) {\r\n enableGetter = $parse($attr.draggableEnable);\r\n\r\n unWatchDraggableEnable = scope.$watch(function () { return enableGetter(scope); }, function (newVal, oldVal) {\r\n //$log.debug('draggableDirective::draggableEnable ($watch) newVal: %o oldVal: %o', newVal, oldVal);\r\n enableEvents(newVal);\r\n\r\n });\r\n\r\n } else {\r\n unWatchDraggableEnable = angular.noop;\r\n enableGetter = function () {\r\n return true;\r\n };\r\n }\r\n\r\n var onHold;\r\n if ($attr.onHold) {\r\n hasOnHold = true;\r\n onHold = $parse($attr.onHold);\r\n }\r\n\r\n var holdTimeoutGetter;\r\n if ($attr.draggableHoldTimeout) {\r\n holdTimeoutGetter = $parse($attr.draggableHoldTimeout);\r\n }\r\n else {\r\n holdTimeoutGetter = function () { return 500; };\r\n }\r\n\r\n // TODO: Cancelar cuando se presiona la tecla ESC.\r\n var currentDroppable = null;\r\n\r\n /**\r\n * Handler del evento global mouseup/touchend.\r\n * @event \r\n * @param {any} $event Evento capturado.\r\n */\r\n function onGlobalEndHandler($event) {\r\n //$log.debug(methodName + ' (end) $event: %o', $event);\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n\r\n $timeout.cancel(holdTimeoutId);\r\n\r\n $timeout().then(function () {\r\n angular.element('.ian-dragging').remove();\r\n angular.element('.ian-active-drag').removeClass('ian-active-drag');\r\n\r\n // Cursor\r\n //setCursor('auto');\r\n });\r\n\r\n // Cursor\r\n //setCursor('auto');\r\n $element.removeClass('drag');\r\n var $directive = dnDService.getDirective($element);\r\n if (angular.isObject($directive)) {\r\n $directive.removeClass('drag');\r\n }\r\n\r\n // Dispara el evento drop.\r\n raiseEvent(currentDroppable, 'drop', $event);\r\n\r\n var $clone = dnDService.getDraggeable();\r\n if ($clone && $clone.length) {\r\n var dndRemoveAfter = $clone.data('dragAndDropRemoveAfterUse');\r\n if (angular.isDefined(dndRemoveAfter) && dndRemoveAfter) {\r\n $clone.remove();\r\n }\r\n }\r\n\r\n // Dispara el evento darg-end\r\n raiseDragEnd(scope, { $event: $event });\r\n\r\n angular.element('.ian-dragging').remove();\r\n angular.element('.ian-active-drag').removeClass('ian-active-drag');\r\n\r\n // Libera los recursos al terminar al soltar el drag.\r\n $document\r\n .off('mousemove touchmove', onGlobalMoveHandler);\r\n angular.element($window)\r\n .off('mouseup touchend', onGlobalEndHandler);\r\n\r\n // Limpia los recursos.\r\n currentDroppable = null;\r\n dnDService.setData(null);\r\n dnDService.setDirective(null);\r\n dnDService.setOnDrag(false);\r\n dnDService.setDraggeable(null);\r\n //dnDService.setOffset(null);\r\n };\r\n\r\n /**\r\n * Handler del evento global mousemove/touchmove.\r\n * @event \r\n * @param {any} $event Evento capturado.\r\n */\r\n function onGlobalMoveHandler($event) {\r\n var isOnDrag = dnDService.isOnDrag();\r\n // $log.debug(methodName + ' (move)\\n\\t$event: %o\\n\\tisOnDrag: %o', $event, isOnDrag);\r\n if (isOnDrag) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n\r\n $timeout.cancel(holdTimeoutId);\r\n\r\n // Obtiene el elemento que se va a mover.\r\n var $clone = dnDService.getDraggeable();\r\n if (!angular.isObject($clone)) {\r\n $clone = getDragabble($event, $element);\r\n dnDService.setDraggeable($clone);\r\n\r\n // Cambia la posici�n del elemento.\r\n moveAtSetter($event, $event.pageX, $event.pageY);\r\n\r\n // Cursor\r\n //setCursor('move');\r\n $element.addClass('drag');\r\n }\r\n\r\n var cursor;\r\n\r\n // Oculta el elemtento y se fija que hay debajo.\r\n var dragging = angular.element('.ian-dragging');\r\n $event.target.hidden = true;\r\n dragging.hide();\r\n var elemBelow = document.elementFromPoint($event.clientX, $event.clientY);\r\n $event.target.hidden = false;\r\n dragging.show();\r\n\r\n var x = $event.pageX;\r\n var y = $event.pageY;\r\n\r\n // mousemove events may trigger out of the window (when the ball is dragged off-screen)\r\n // if clientX/clientY are out of the window, then elementfromPoint returns null\r\n if (elemBelow) {\r\n // Busca si el elemento es droppables.\r\n var droppableBelow = angular.element(elemBelow).closest('[droppable]');\r\n var $droppableBelow = angular.element(droppableBelow);\r\n var $currentDroppable = angular.element(currentDroppable);\r\n\r\n // Hay dropeable abajo.\r\n if (droppableBelow.length) {\r\n // Si son distintos dispara los eventos dragleave y dragenter.\r\n if ($currentDroppable.data('dropZoneId') !== $droppableBelow.data('dropZoneId')) {\r\n raiseDragLeave($event);\r\n currentDroppable = droppableBelow;\r\n raiseEvent($droppableBelow, 'dragenter', $event);\r\n } else {\r\n // Se disparava de forma recursiva el evento mousemove.\r\n raiseEvent(currentDroppable, 'dragover', $event);\r\n }\r\n\r\n // Si esta sobre el area de Drop aplica el snap to grid.\r\n var grid = snapToGridGetter(scope);\r\n if (angular.isNumber(grid)) {\r\n grid = {\r\n x: grid,\r\n y: grid\r\n };\r\n } else if (angular.isObject(grid)) {\r\n grid.x = grid.x || 1;\r\n grid.y = grid.y || 1;\r\n } else {\r\n grid = {\r\n x: 1,\r\n y: 1\r\n };\r\n }\r\n\r\n x = $event.pageX - ($event.pageX % grid.x);\r\n y = $event.pageY - ($event.pageY % grid.y);\r\n\r\n cursor = 'copy';\r\n } else {\r\n // Verifica si no esta sobre el indicador de drop.\r\n var dropIndicator = angular.element(elemBelow).closest('.drop-indicator');\r\n var $dropIndicator = angular.element(dropIndicator);\r\n if ($dropIndicator.length) {\r\n cursor = 'copy';\r\n } else {\r\n raiseDragLeave($event);\r\n cursor = 'no-drop';\r\n }\r\n }\r\n } else {\r\n raiseDragLeave($event);\r\n cursor = 'no-drop';\r\n }\r\n\r\n // Actualiza la posici�n de la imagen.\r\n moveAtSetter($event, x, y);\r\n\r\n // Cursor\r\n //setCursor(cursor);\r\n }\r\n };\r\n\r\n /**\r\n * Dispara el evento dragleave en el droppable objetivo.\r\n */\r\n function raiseDragLeave($event) {\r\n raiseEvent(currentDroppable, 'dragleave', $event);\r\n currentDroppable = null;\r\n }\r\n\r\n /**\r\n * Dispara el evento en el elemento objetivo.\r\n * @param {Element} target Droppable objetivo.\r\n * @param {string} eventName Nombre del evento.\r\n * @param {jQuery.Event} $event Evento original.\r\n */\r\n function raiseEvent(target, eventName, $event) {\r\n if (target) {\r\n var offset = $element.data('offset');\r\n var newEvent = {\r\n type: eventName,\r\n originalEvent: $event.originalEvent,\r\n toElement: $event.toElement,\r\n screenY: $event.screenY,\r\n screenX: $event.screenX,\r\n pageY: $event.pageY,\r\n pageX: $event.pageX,\r\n offsetY: $event.offsetY,\r\n offsetX: $event.offsetX,\r\n clientY: $event.clientY,\r\n clientX: $event.clientX,\r\n buttons: $event.buttons,\r\n button: $event.button,\r\n which: $event.which,\r\n view: $event.view,\r\n target: $event.target,\r\n shiftKey: $event.shiftKey,\r\n relatedTarget: $event.relatedTarget,\r\n metaKey: $event.metaKey,\r\n eventPhase: $event.eventPhase,\r\n currentTarget: $event.currentTarget,\r\n ctrlKey: $event.ctrlKey,\r\n cancelable: $event.cancelable,\r\n bubbles: $event.bubbles,\r\n altKey: $event.altKey,\r\n delegateTarget: $event.delegateTarget,\r\n handleObj: $event.handleObj,\r\n data: $event.data || offset,\r\n offset: offset\r\n };\r\n angular.element(target).trigger(newEvent);\r\n }\r\n }\r\n\r\n /**\r\n * Mueve la copia del elemento que se esta arrastrando a la posici�n solicitada.\r\n * @param {any} pageX Coordenada X.\r\n * @param {any} pageY Coordenada Y.\r\n */\r\n function moveAt(pageX, pageY) {\r\n //$log.debug('draggableDirective::moveAt\\n\\tpageX: %o\\n\\tpageY: %o', pageX, pageY);\r\n var $clone = dnDService.getDraggeable();\r\n if ($clone && $clone.length) {\r\n // Fix posici�n.\r\n var shiftXAux = $clone.data('shiftX') || 0;\r\n var shiftYAux = $clone.data('shiftY') || 0;\r\n var shiftX = parseFloat(shiftXAux);\r\n var shiftY = parseFloat(shiftYAux);\r\n $clone.css({\r\n left: String(pageX - shiftX) + 'px',\r\n top: String(pageY - shiftY) + 'px'\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Configura el cursor en el body y en el elemento que se esta arrastrando.\r\n * @param {any} value Tipo de cursor.\r\n */\r\n function setCursor(value) {\r\n // $log.debug('draggableDirective::setCursor value: %o', value);\r\n //if (value) {\r\n // angular.element('body').css('cursor', value);\r\n\r\n // var $clone = dnDService.getDraggeable();\r\n // if ($clone && $clone.length) {\r\n // $clone.css('cursor', value);\r\n // }\r\n\r\n // $element.css('cursor', value);\r\n //}\r\n };\r\n\r\n /**\r\n * Devuelve el elemento draggable.\r\n * @param {any} $event Referencia del evento.\r\n * @param {any} $refElement Referencia del elemento.\r\n * @returns El elemento draggable.\r\n */\r\n function getDragabble($event, $refElement) {\r\n var $clone = null;\r\n\r\n // Si existe el target lo resuelve.\r\n var target = targetGetter(scope, { $event: $event, $element: $refElement });\r\n if (angular.isString(target)) {\r\n // Busca el elemento.\r\n $clone = angular.element(target);\r\n } else {\r\n var id = idGetter(scope, { $event: $event });\r\n\r\n // Clona el elemento.\r\n $clone = $refElement.clone();\r\n $refElement.addClass('ian-active-drag');\r\n var rect = $refElement[0].getBoundingClientRect();\r\n\r\n // ReSharper disable once UsageOfPossiblyUnassignedValue\r\n var shiftX = $event.clientX - rect.left;\r\n var shiftY = $event.clientY - rect.top;\r\n $clone.data('id', id)\r\n .data('shiftX', shiftX)\r\n .data('shiftY', shiftY)\r\n .addClass('dragging')\r\n .addClass('ian-dragging')\r\n .css({\r\n 'zIndex': Number.MAX_SAFE_INTEGER,\r\n 'position': 'absolute',\r\n // ReSharper disable once QualifiedExpressionMaybeNull\r\n 'width': $refElement.width() + 'px',\r\n 'heigth': $refElement.height() + 'px',\r\n 'zoom': 1,\r\n 'opacity': 0.5\r\n });\r\n\r\n angular.element('body').append($clone);\r\n\r\n var offset = { x: shiftX, y: shiftY };\r\n dnDService.setOffset(offset);\r\n }\r\n\r\n return $clone;\r\n }\r\n\r\n\r\n function onGlobaDragStarHandler($event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n\r\n // $log.debug(methodName + ' (mousedown) $event: %o', $event);\r\n var enable = enableGetter(scope);\r\n\r\n // Solo click izquierdo.\r\n if (enable && $event.which === 1) {\r\n var data = dataGetter(scope, { $event: $event });\r\n dnDService.setData(data);\r\n dnDService.setDirective($element);\r\n dnDService.setOnDrag(true);\r\n\r\n $document\r\n .off('mousemove touchmove', onGlobalMoveHandler)\r\n .on('mousemove touchmove', onGlobalMoveHandler);\r\n\r\n // Libera los recursos al terminar al soltar el drag.\r\n angular.element($window)\r\n .off('mouseup touchend', onGlobalEndHandler)\r\n .on('mouseup touchend', onGlobalEndHandler);\r\n\r\n if (hasOnHold) {\r\n $timeout.cancel(holdTimeoutId);\r\n var timeout = holdTimeoutGetter(scope);\r\n if (!angular.isNumber(timeout)) {\r\n timeout = 500;\r\n }\r\n\r\n holdTimeoutId = $timeout(function () {\r\n onHold(scope, { $event: $event });\r\n }, 500);\r\n }\r\n }\r\n }\r\n\r\n function enableEvents(enable) {\r\n $element\r\n //.css('cursor', 'pointer')\r\n .off('mousedown touchstart mouseup touchend dragstart');\r\n if (enable) {\r\n $element\r\n //.css('cursor', 'move')\r\n .on('dragstart', function onDragStart($event) {\r\n return false;\r\n })\r\n .on('mousedown touchstart', onGlobaDragStarHandler);\r\n }\r\n }\r\n\r\n //$element.data('cursor', $element.css('cursor'));\r\n $element.prop('draggable', false);\r\n\r\n var enable = enableGetter(scope);\r\n enableEvents(enable);\r\n\r\n scope.$on('$destroy',\r\n function $destroy() {\r\n enableEvents(false);\r\n unWatchDraggableEnable();\r\n // $log.debug(methodName + ' ($destroy)');\r\n // var cursor = $element.data('cursor');\r\n //var cursor = $element.data('cursor');\r\n\r\n // $element.css('cursor', cursor);\r\n //$element.css('cursor', cursor);\r\n });\r\n }\r\n\r\n var ret = {\r\n restrict: 'A',\r\n link: linkFn\r\n };\r\n return ret;\r\n }\r\n})();","(function () {\r\n 'use strinct';\r\n angular.module('prisma')\r\n .directive('dragScroll', ['$log', '$parse', '$window', '$document', 'DnDService', dragScrollDirective]);\r\n\r\n /**\r\n * Directiva drag-scroll\r\n * @param {any} $log Servicio de log de angular.\r\n * @param {any} $parse Servicio de parse de angular.\r\n * @param {any} $window Servicio para acceder al objeto window de angular.\r\n * @param {any} $document Servicio para acceder al objeto document de angular.\r\n * @param {DnDService} dnDService Servicio de Drag and Drop.\r\n */\r\n function dragScrollDirective($log, $parse, $window, $document, dnDService) {\r\n //$log.debug('DragToScrollDirective::ctor');\r\n\r\n /**\r\n * Link del elemento.\r\n * @param {any} scope Referencia del contexto de la directiva.\r\n * @param {any} $element Referencia del elemento.\r\n * @param {any} attrs Referencia de los atributos del elemento.\r\n */\r\n function linkFn(scope, $element, attrs) {\r\n //$log.debug('DragToScrollDirective::link');\r\n var originalMousePositionX = 0;\r\n var originalMousePositionY = 0;\r\n var originalScrollLeft = $element.scrollLeft();\r\n var originalScrollTop = $element.scrollTop();\r\n var dragging = false;\r\n var exp = attrs.dragScroll === '' ? 'true' : attrs.dragScroll;\r\n var allowDrag = $parse(exp);\r\n\r\n /**\r\n * Evento global mouse up.\r\n * @event \r\n * @param {any} $event Referencia del evento.\r\n */\r\n function onGlobalMouseUpHandler($event) {\r\n // $element.trigger('mouseup');\r\n dragging = false;\r\n\r\n // var originalCursor = $element.data('cursor') || 'auto';\r\n // angular.element('body').css('cursor', originalCursor);\r\n // $element.css('cursor', 'grab');\r\n // angular.element($event.target).css('cursor', 'auto');\r\n angular.element($window)\r\n .off('mouseup', onGlobalMouseUpHandler);\r\n $document.off('mousemove', onGlobalMouseMoveHandler);\r\n };\r\n\r\n /**\r\n * Evento global mouse move.\r\n * @event \r\n * @param {any} $event Referencia del evento.\r\n */\r\n function onGlobalMouseMoveHandler($event) {\r\n if (dragging === true) {\r\n var left = originalScrollLeft + (originalMousePositionX - $event.pageX);\r\n var top = originalScrollTop + (originalMousePositionY - $event.pageY);\r\n $element.scrollLeft(left)\r\n .scrollTop(top);\r\n }\r\n };\r\n\r\n function onGlobalMouseDownHandler($event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n\r\n // Fuerza el mouse up si se dispara en otro copmponente del DOM.\r\n angular.element($window)\r\n .off('mouseup', onGlobalMouseUpHandler);\r\n\r\n $document.off('mousemove', onGlobalMouseMoveHandler);\r\n\r\n if (allowDrag(scope) && !dnDService.isOnDrag()) {\r\n dragging = true;\r\n originalMousePositionX = $event.pageX;\r\n originalMousePositionY = $event.pageY;\r\n originalScrollLeft = $element.scrollLeft();\r\n originalScrollTop = $element.scrollTop();\r\n\r\n // var originalCursor = angular.element('body').css('cursor') || 'auto';\r\n // $element.data('cursor', originalCursor);\r\n // angular.element('body').css('cursor', 'grabbing');\r\n // $element.css('cursor', 'grabbing');\r\n // angular.element($event.target).css('cursor', 'grabbing');\r\n\r\n // Fuerza el mouse up si se dispara en otro copmponente del DOM.\r\n angular.element($window)\r\n .on('mouseup', onGlobalMouseUpHandler);\r\n\r\n $document.on('mousemove', onGlobalMouseMoveHandler);\r\n }\r\n }\r\n\r\n scope.$on('$destroy', function () {\r\n // Desconecta los eventos.\r\n $element.off('mousedown touchstart mouseup touchend dragstart mouseleave');\r\n });\r\n\r\n // conecta los eventos.\r\n $element.css('cursor', 'grab')\r\n .on('dragstart',\r\n function onDragStart($event) {\r\n return false;\r\n })\r\n .on('mousedown', onGlobalMouseDownHandler);\r\n }\r\n\r\n return {\r\n link: linkFn\r\n }\r\n }\r\n})();","'use strinct';\r\n(function () {\r\n angular.module('prisma')\r\n .service('DnDService', ['$log', dnDService]);\r\n var id = 0;\r\n\r\n function dnDService($log) {\r\n this.$log = $log;\r\n this.id = ++id;\r\n //this.$log.debug('DnDService::ctor id: %o', this.id);\r\n }\r\n\r\n dnDService.prototype.setData = function setData(value) {\r\n //this.$log.debug('DnDService::setData id: %o, value: %o', this.id, value);\r\n this.data = value;\r\n return this;\r\n }\r\n\r\n dnDService.prototype.getData = function getData() {\r\n return this.data;\r\n }\r\n\r\n dnDService.prototype.setDirective = function setDirective(value) {\r\n //this.$log.debug('DnDService::setDirective id: %o, value: %o', this.id, value);\r\n this.directive = value;\r\n return this;\r\n }\r\n\r\n dnDService.prototype.getDirective = function setDirective() {\r\n return this.directive;\r\n }\r\n\r\n /**\r\n * Devuelve verdadero si se esta arrastrando un elemento, falso en caso contrario.\r\n * @returns Verdadero si se esta arrastrando un elemento, falso en caso contrario.\r\n */\r\n dnDService.prototype.isOnDrag = function isOnDnD() {\r\n var ret = angular.isDefined(this.onDrag) && this.onDrag;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Setea si se esta arrastrando o no un elemento.\r\n * @param {any} value Verdadero si se esta arrastrando, falso en caso contrario.\r\n * @returns La referencia del servicio DnDService.\r\n */\r\n dnDService.prototype.setOnDrag = function setOnDrag(value) {\r\n //this.$log.debug('DnDService::setOnDrag id: %o, value: %o', this.id, value);\r\n this.onDrag = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * Setea el elemento que se esta arrastrando.\r\n * @param {any} value Elemento que se esta arrastrando.\r\n * @returns La referencia del servicio DnDService.\r\n */\r\n dnDService.prototype.setDraggeable = function setDraggeable(value) {\r\n //this.$log.debug('DnDService::setDraggeable id: %o, value: %o', this.id, value);\r\n this.draggeable = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * Devuelve la referencia del elemento que se esta arrastrando.\r\n * @returns La referencia del elemento que se esta arrastrando.\r\n */\r\n dnDService.prototype.getDraggeable = function getDraggeable() {\r\n return this.draggeable;\r\n }\r\n\r\n /**\r\n * Asigna el offset al inicar el drag & drop del elemento que se esta arrastrando.\r\n * @returns La referencia del elemento que se esta arrastrando.\r\n */\r\n dnDService.prototype.setOffset = function setOffset(value) {\r\n this.offset = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * Devuelve el offset al inicar el drag & drop del elemento que se esta arrastrando.\r\n * @returns El offset al inicar el drag & drop del elemento que se esta arrastrando.\r\n */\r\n dnDService.prototype.getOffset = function getOffset() {\r\n return this.offset;\r\n }\r\n \r\n})();","'use strict';\r\nangular.module(\"prisma\")\r\n .factory('tokensManagerService', ['$http', 'ngAuthSettings', function ($http, ngAuthSettings) {\r\n\r\n var serviceBase = ngAuthSettings.apiServiceBaseUri;\r\n \r\n var tokenManagerServiceFactory = {};\r\n\r\n var _getRefreshTokens = function () {\r\n\r\n return $http.get(serviceBase + 'api/refreshtokens').then(function (results) {\r\n return results;\r\n });\r\n };\r\n\r\n var _deleteRefreshTokens = function (tokenid) {\r\n\r\n return $http.delete(serviceBase + 'api/refreshtokens/?tokenid=' + tokenid).then(function (results) {\r\n return results;\r\n });\r\n };\r\n\r\n tokenManagerServiceFactory.deleteRefreshTokens = _deleteRefreshTokens;\r\n tokenManagerServiceFactory.getRefreshTokens = _getRefreshTokens;\r\n\r\n return tokenManagerServiceFactory;\r\n\r\n}]);","angular.module(\"prisma\")\r\n.factory('ngAuthSettings', function () {\r\n var settings = {};\r\n\r\n settings.apiServiceBaseUri = \"/api/\"\r\n settings.clientId = 'ngAuthApp';\r\n\r\n return settings;\r\n});\r\n","'use strict';\r\nangular.module(\"prisma\")\r\n .factory('authService', ['$http', '$q', '$rootScope', '$cookieStore', '$location', 'localStorageService', 'ngAuthSettings', 'serverService', 'companyJson', 'ngDialog', function ($http, $q, $rootScope, $cookieStore, $location, localStorageService, ngAuthSettings, serverService, companyJson, ngDialog) {\r\n\r\n var serviceBase = serverService.getApiUrl();\r\n var authServiceFactory = {};\r\n\r\n var _authentication = {\r\n isAuth: false,\r\n userName: \"\",\r\n firstname: \"\",\r\n lastname: \"\",\r\n userId: null,\r\n companyId: null,\r\n companyCode: \"\",\r\n roles: [],\r\n permissions: [],\r\n categories: [],\r\n stores: [],\r\n useRefreshTokens: false,\r\n redirectUrl: null\r\n };\r\n\r\n var _login = function (loginData) {\r\n\r\n var data = { username: loginData.userName, password: loginData.password }\r\n\r\n if (loginData.useRefreshTokens) {\r\n data.client_id = ngAuthSettings.clientId;\r\n }\r\n\r\n var deferred = $q.defer();\r\n\r\n //$http.post(ian.urlCombine(serviceBase, 'token'), data).success(function (response) {\r\n $http.post(ian.urlCombine(serviceBase, 'account/login'), data).success(function (response) {\r\n\r\n if (response.authenticated) {\r\n\r\n var userinfo = {};\r\n\r\n localStorageService.set('authorizationData',\r\n {\r\n token: response.token,\r\n userName: loginData.userName,\r\n firstname: userinfo.firstname,\r\n lastname: userinfo.lastname,\r\n userId: userinfo.userId,\r\n companyId: userinfo.companyId,\r\n companyCode: userinfo.companyCode,\r\n roles: userinfo.roles,\r\n permissions: userinfo.permissions,\r\n categories: userinfo.categoryIds,\r\n stores: userinfo.storeIds,\r\n local: true,\r\n refreshToken: \"\",\r\n useRefreshTokens: false,\r\n redirectUrl: _authentication.redirectUrl\r\n });\r\n\r\n _fillAuthData();\r\n\r\n deferred.resolve(_authentication);\r\n\r\n\r\n }\r\n else {\r\n _logOut();\r\n\r\n if (response.reason) {\r\n switch (response.reason) {\r\n case 'Unroled': swal('Usuario Incompleto', 'Su usuario necesita terminar de configurarse. Ponganse en contacto con seguridad informatica para completar su activación.', 'warning'); break;\r\n case 'Disabled': swal('Usuario Bloqueado', 'Su usuario fue bloqueado por un administrador. Si cree que fue un error ponganse en contacto con seguridad informatica para pedir su activación.', 'warning'); break;\r\n }\r\n }\r\n\r\n\r\n deferred.reject(err);\r\n }\r\n\r\n\r\n }).error(function (err, status) {\r\n _logOut();\r\n deferred.reject(err);\r\n });\r\n\r\n return deferred.promise;\r\n\r\n };\r\n\r\n var _getUserInfo = function () {\r\n\r\n var deferred = $q.defer();\r\n\r\n if (_authentication.isAuth) {\r\n\r\n $http.post(ian.urlCombine(serviceBase, 'token/userinfo'))\r\n .success(function (userinfo) {\r\n var authData = localStorageService.get('authorizationData');\r\n localStorageService.set('authorizationData',\r\n {\r\n token: authData.token,\r\n userName: authData.userName,\r\n firstname: userinfo.firstname,\r\n lastname: userinfo.lastname,\r\n userId: userinfo.userId,\r\n companyId: userinfo.companyId,\r\n companyCode: userinfo.companyCode,\r\n roles: userinfo.roles,\r\n permissions: userinfo.permissions,\r\n categories: userinfo.categoryIds,\r\n stores: userinfo.storeIds,\r\n refreshToken: authData.refreshToken,\r\n useRefreshTokens: authData.useRefreshTokens\r\n });\r\n\r\n _fillAuthData();\r\n\r\n deferred.resolve();\r\n })\r\n .error(function (err) {\r\n deferred.reject(err);\r\n });\r\n }\r\n\r\n\r\n return deferred.promise;\r\n }\r\n\r\n var _hasPermission = function (permission) {\r\n return _authentication.permissions.indexOf(permission) != -1;\r\n }\r\n\r\n var _logOut = function (redirectUrl) {\r\n\r\n localStorageService.remove('authorizationData');\r\n\r\n _authentication.isAuth = false;\r\n _authentication.userName = \"\";\r\n _authentication.firstname = \"\";\r\n _authentication.lastname = \"\";\r\n _authentication.userId = \"\";\r\n _authentication.companyId = \"\";\r\n _authentication.companyCode = \"\";\r\n _authentication.roles = [];\r\n _authentication.permissions = [];\r\n _authentication.categories = [];\r\n _authentication.stores = [];\r\n _authentication.useRefreshTokens = false;\r\n _authentication.redirectUrl = redirectUrl || null;\r\n\r\n $rootScope.username = '';\r\n $rootScope.role = '';\r\n if (_authentication.local == false && companyJson.Security.Federated) {\r\n $http.post('/auth/logout').success(function () {\r\n if (redirectUrl) {\r\n window.location.href = redirectUrl;\r\n } else {\r\n window.location.reload();\r\n }\r\n });\r\n }\r\n };\r\n\r\n var _fillAuthData = function () {\r\n\r\n var authData = localStorageService.get('authorizationData');\r\n if (authData) {\r\n _authentication.isAuth = true;\r\n _authentication.local = authData.local;\r\n _authentication.userName = authData.userName;\r\n _authentication.firstname = authData.firstname;\r\n _authentication.lastname = authData.lastname;\r\n _authentication.userId = authData.userId;\r\n _authentication.companyId = authData.companyId;\r\n _authentication.companyCode = authData.companyCode;\r\n _authentication.roles = authData.roles;\r\n _authentication.permissions = authData.permissions;\r\n _authentication.categories = authData.categories;\r\n _authentication.stores = authData.storeIds;\r\n _authentication.useRefreshTokens = authData.useRefreshTokens;\r\n\r\n if (authData.roles && authData.roles.indexOf(\"Unroled\") >= 0) {\r\n _logOut();\r\n swal('Usuario Incompleto', 'Su usuario necesita terminar de configurarse. Ponganse en contacto con seguridad informatica para completar su activación.', 'warning');\r\n }\r\n }\r\n\r\n };\r\n\r\n var _refreshToken = function () {\r\n var deferred = $q.defer();\r\n\r\n var authData = localStorageService.get('authorizationData');\r\n\r\n if (authData) {\r\n\r\n if (authData.useRefreshTokens) {\r\n\r\n var data = \"grant_type=refresh_token&refresh_token=\" + authData.refreshToken + \"&client_id=\" + ngAuthSettings.clientId;\r\n\r\n localStorageService.remove('authorizationData');\r\n\r\n $http.post(ian.urlCombine(serviceBase, 'token'), data, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }).success(function (response) {\r\n\r\n localStorageService.set('authorizationData', { token: response.access_token, userName: response.userName, refreshToken: response.refresh_token, useRefreshTokens: true });\r\n\r\n deferred.resolve(response);\r\n\r\n }).error(function (err, status) {\r\n _logOut();\r\n deferred.reject(err);\r\n });\r\n }\r\n }\r\n\r\n return deferred.promise;\r\n };\r\n\r\n var _obtainAccessToken = function (externalData) {\r\n\r\n var deferred = $q.defer();\r\n\r\n $http.get(ian.urlCombine(serviceBase, 'account/ObtainLocalAccessToken'), { params: { provider: externalData.provider, externalAccessToken: externalData.externalAccessToken } }).success(function (response) {\r\n\r\n localStorageService.set('authorizationData', { token: response.access_token, userName: response.userName, refreshToken: \"\", useRefreshTokens: false });\r\n\r\n _authentication.isAuth = true;\r\n _authentication.userName = response.userName;\r\n _authentication.userRole = response.userRole;\r\n _authentication.useRefreshTokens = false;\r\n\r\n deferred.resolve(response);\r\n\r\n }).error(function (err, status) {\r\n _logOut();\r\n deferred.reject(err);\r\n });\r\n\r\n return deferred.promise;\r\n\r\n };\r\n\r\n var _prompSessionLimit = function () {\r\n swal({\r\n title: \"Límite de sesiones\",\r\n text: \"Su usuario ha alcanzado el limite de sesiones activas. Desear salir de su otra sesion activa?\",\r\n icon: \"warning\",\r\n showCancelButton: true,\r\n showConfirmButton: true,\r\n customClass: \"sessions-alert\"\r\n }, function (willClose) {\r\n if (willClose) {\r\n window.location.href = '/auth/login?kick=true';\r\n } else {\r\n _logOut();\r\n }\r\n });\r\n $('.sessions-alert').siblings('.sweet-overlay').css({ 'background-color': 'black', opacity: 1 });\r\n };\r\n\r\n var isOpen401 = false;\r\n var _promptSessionExpired = function () {\r\n if (isOpen401 === false) {\r\n isOpen401 = true;\r\n ngDialog.open({\r\n template: 'sessionExpiredDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-300',\r\n preCloseCallback: function () {\r\n isOpen401 = false;\r\n _logOut();\r\n $location.path('/login');\r\n }\r\n });\r\n }\r\n\r\n }\r\n\r\n authServiceFactory.login = _login;\r\n authServiceFactory.logOut = _logOut;\r\n authServiceFactory.prompSessionLimit = _prompSessionLimit;\r\n authServiceFactory.fillAuthData = _fillAuthData;\r\n authServiceFactory.authentication = _authentication;\r\n authServiceFactory.refreshToken = _refreshToken;\r\n authServiceFactory.getUserInfo = _getUserInfo;\r\n authServiceFactory.hasPermission = _hasPermission;\r\n authServiceFactory.promptSessionExpired = _promptSessionExpired;\r\n\r\n authServiceFactory.obtainAccessToken = _obtainAccessToken;\r\n\r\n return authServiceFactory;\r\n }]);","'use strict';\r\nangular.module(\"prisma\")\r\n .factory('authInterceptorService', function ($q, $injector, $location, localStorageService) {\r\n\r\n var authInterceptorServiceFactory = {};\r\n\r\n var _request = function (config) {\r\n\r\n\r\n config.timeout = 600000;\r\n\r\n config.headers = config.headers || {};\r\n\r\n var authData = localStorageService.get('authorizationData');\r\n if (authData) {\r\n config.headers.Authorization = 'Bearer ' + authData.token;\r\n }\r\n\r\n return config;\r\n }\r\n\r\n var _responseError = function (rejection) {\r\n\r\n if (rejection.status === 401) {\r\n\r\n var authService = $injector.get('authService');\r\n\r\n if (rejection.data && rejection.data.sessionLimit) {\r\n //Si es x limite de sesiones le ofreco retomar\r\n authService.prompSessionLimit();\r\n }\r\n else if (rejection.data && rejection.data.wasKicked) {\r\n authService.logOut();\r\n $location.path('/login');\r\n }\r\n else {\r\n //UNAUTHENTICATED Session Expired (go to URL)\r\n authService.promptSessionExpired();\r\n }\r\n\r\n }\r\n else if (rejection.status === 403) {\r\n console.warn(\"No tienes los suficientes permisos para realizar esta acción\");\r\n }\r\n\r\n return $q.reject(rejection);\r\n }\r\n\r\n authInterceptorServiceFactory.request = _request;\r\n authInterceptorServiceFactory.responseError = _responseError;\r\n\r\n\r\n return authInterceptorServiceFactory;\r\n });","angular.module(\"prisma\")\r\n.service('serverService', function serverService() {\r\n\r\n var self = this;\r\n\r\n \r\n\r\n self.getApiUrl = function () {\r\n\r\n return \"/api\";\r\n\r\n }\r\n\r\n self.getRootUrl = function () {\r\n\r\n return \"/\";\r\n }\r\n\r\n self.$get = function () {\r\n return self;\r\n };\r\n\r\n})","angular.module(\"prisma\")\r\n\r\n.service('httpService', function httpService($http, $q, $log, serverService, errorService) {\r\n var self = this;\r\n\r\n self.post = function (url, params) {\r\n\r\n var deferred = $q.defer();\r\n\r\n var finalUrl = ian.urlCombine(serverService.getApiUrl(), url);\r\n\r\n $http.post(finalUrl, params)\r\n .success(function (data, status, headers, config) {\r\n deferred.resolve(data);\r\n })\r\n .error(function (data, status, headers, config) {\r\n errorService.handle(data, status, headers, config, finalUrl);\r\n var rv = status == '502' ? status : data;\r\n deferred.reject(rv);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n self.testPost = function (url, params) {\r\n\r\n var deferred = $q.defer();\r\n\r\n var finalUrl = ian.urlCombine(serverService.getApiUrl(), url);\r\n\r\n $http.post(finalUrl, params, {\r\n withCredentials: true,\r\n headers: { 'Content-Type': undefined },\r\n //transformRequest: angular.identity\r\n }).success(function (data, status, headers, config) {\r\n deferred.resolve(data);\r\n }).error(function (data, status, headers, config) {\r\n errorService.handle(data, status, headers, config, finalUrl);\r\n var rv = status == '502' ? status : data;\r\n deferred.reject(rv);\r\n });\r\n\r\n\r\n return deferred.promise;\r\n }\r\n\r\n self.delete = function (url) {\r\n\r\n var deferred = $q.defer();\r\n\r\n var finalUrl = ian.urlCombine(serverService.getApiUrl(), url);\r\n\r\n $http.delete(finalUrl)\r\n .success(function (data, status, headers, config) {\r\n deferred.resolve(data);\r\n })\r\n .error(function (data, status, headers, config) {\r\n errorService.handle(data, status, headers, config, finalUrl);\r\n var rv = status == '502' ? status : data;\r\n deferred.reject(rv);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n self.get = function (url) {\r\n\r\n var deferred = $q.defer();\r\n\r\n var finalUrl = ian.urlCombine(serverService.getApiUrl(), url);\r\n\r\n $http.get(finalUrl)\r\n .success(function (data, status, headers, config) {\r\n deferred.resolve(data);\r\n })\r\n .error(function (data, status, headers, config) {\r\n errorService.handle(data, status, headers, config, finalUrl);\r\n var rv = status == '502' ? status : data;\r\n deferred.reject(rv);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n});\r\n","angular.module(\"prisma\")\r\n .service('errorService', function errorService($log, ngDialog, authService, $location) {\r\n var self = this;\r\n\r\n self.isOpen401 = false;\r\n\r\n self.handle = function (data, status, headers, config, finalUrl) {\r\n if (status && finalUrl) {\r\n $log.error(ian.format('Error {0} invocando al servicio {1}', status, finalUrl));\r\n }\r\n\r\n if (data) {\r\n $log.error(data);\r\n }\r\n\r\n switch (status) {\r\n case 401: {\r\n\r\n //AHORA SE MANEJA DESDE EL AUTHINTERCEPTOR\r\n\r\n //if (!self.isOpen401) {\r\n // self.isOpen401 = true;\r\n // ngDialog.open({\r\n // template: 'sessionExpiredDialog',\r\n // className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-300',\r\n // preCloseCallback: function () {\r\n // self.isOpen401 = false;\r\n // $location.path('/login');\r\n // }\r\n // });\r\n //}\r\n\r\n break;\r\n }\r\n case 403: {\r\n ngDialog.closeAll();\r\n ngDialog.open({\r\n template: 'unauthorizedDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-300'\r\n });\r\n break;\r\n }\r\n case 409: {\r\n ngDialog.open({\r\n template: 'validationExceptionDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-300',\r\n controller: function ($scope) {\r\n $scope.error = data;\r\n $scope.url = finalUrl;\r\n }\r\n });\r\n break;\r\n }\r\n case 500: {\r\n ngDialog.open({\r\n template: 'unhandledExceptionDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-450',\r\n controller: function ($scope) {\r\n $scope.message = data.message;\r\n $scope.stackTrace = data.stackTrace;\r\n $scope.url = finalUrl;\r\n $scope.download = function () {\r\n\r\n var element = document.createElement('a');\r\n var content = buildFileContent($scope.url, $scope.message, $scope.stackTrace)\r\n element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(content));\r\n element.setAttribute('download', getFileName());\r\n\r\n element.style.display = 'none';\r\n document.body.appendChild(element);\r\n\r\n element.click();\r\n\r\n document.body.removeChild(element);\r\n }\r\n }\r\n });\r\n break;\r\n }\r\n case 502: {\r\n ngDialog.closeAll();\r\n ngDialog.open({\r\n template: 'longProcessDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-300'\r\n });\r\n break;\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n\r\n function getFileName() {\r\n return ian.format(\"Prisma error log {0}.txt\", getDate());\r\n }\r\n\r\n function getDate() {\r\n var today = new Date();\r\n var dd = today.getDate();\r\n var mm = today.getMonth() + 1; //January is 0!\r\n\r\n var h = today.getHours();\r\n var m = today.getMinutes();\r\n var s = today.getSeconds();\r\n\r\n var yyyy = today.getFullYear();\r\n if (dd < 10) {\r\n dd = '0' + dd\r\n }\r\n if (mm < 10) {\r\n mm = '0' + mm\r\n }\r\n var today = ian.format(\"{0}.{1}.{2}-{3}.{4}.{5}\", yyyy, mm, dd, h, m, s);\r\n return today;\r\n }\r\n\r\n function buildFileContent(url, message, stackTrace) {\r\n var text = \"PRISMA ERROR LOG FILE\";\r\n\r\n text += ian.format(\"Client Timestamp: {0}\", getDate());\r\n text += \"\\n \\n\";\r\n text += ian.format(\"Prisma Url: {0}\", url);\r\n text += \"\\n \\n\";\r\n text += ian.format(\"Message: {0}\", message);\r\n text += \"\\n \\n\";\r\n text += ian.format(\"Stacktrace: {0}\", stackTrace);\r\n\r\n return text;\r\n }\r\n })\r\n\r\n\r\n","var _controller = function ($scope, $attrs, $filter, $timeout, $rootScope, priceService, homeService) {\r\n var self = this;\r\n //console.log('suggestions', self);\r\n\r\n\r\n}\r\n\r\nangular.module('prisma').component('suggestions', {\r\n templateUrl: 'app/shared_logic/components/suggestions/suggestions.component.html',\r\n bindings: {\r\n price: '<'\r\n },\r\n\r\n controller: _controller\r\n});\r\n\r\n\r\n","var _controller = function ($scope, $rootScope, $element, $timeout, $attrs, $filter, $uibModal, adminService, priceService, homeService, $translate) {\r\n var self = this;\r\n\r\n var priceMap = null;\r\n var country = '';\r\n\r\n var priceId;\r\n\r\n var priceSurveyType = [];\r\n\r\n self.companyCode = $rootScope.erp.Implementation;\r\n\r\n self.priceSurveys = [];\r\n self.allPriceList = [{}];\r\n self.selectedPriceZone = null;\r\n self.selectedPriceZoneName = '';\r\n self.itemName = \"\";\r\n self.itemCode = \"\";\r\n self.selectedCompetitorGroups = [];\r\n self.priceSurveysFiltered = [];\r\n self.stores = [];\r\n self.competitorsInit = [];\r\n self.competitorPriceList = [];\r\n self.competitorStates = [];\r\n self.competitorZones = [];\r\n self.selectedPriceLists = [];\r\n\r\n\r\n self.onlyMarkers = false;\r\n self.multizoneViewsCheckbox = false;\r\n self.isLoadingStores = false;\r\n\r\n\r\n self.getPriceSurveyType = function (id) {\r\n for (var i = 0; i < priceSurveyType.length; i++) {\r\n if (priceSurveyType[i].id == id)\r\n return priceSurveyType[i];\r\n }\r\n }\r\n\r\n var markers = [];\r\n\r\n self.$onChanges = function (changes) {\r\n if (_.isEmpty(changes) == false) {\r\n if (changes.price.currentValue && changes.price.currentValue != changes.price.previousValue) {\r\n //console.log(changes.price.currentValue.priceId);\r\n init();\r\n }\r\n }\r\n }\r\n\r\n\r\n self.getCompetitorGroupPrice = function (competitorGroup) {\r\n if (competitorGroup == undefined) return;\r\n if (competitorGroup.parentId) {\r\n var thisPrice = 0;\r\n angular.forEach(self.price.competitorsGroupPrices, function (price) {\r\n if (price.competitorGroupId == competitorGroup.id && price.onlyMarkers == self.onlyMarkers) {\r\n thisPrice = price.price;\r\n\r\n }\r\n });\r\n\r\n return thisPrice;\r\n } else {\r\n var priceAcum = 0;\r\n var count = 0;\r\n angular.forEach(self.price.competitorGroupParents, function (parent) {\r\n angular.forEach(self.price.competitorsGroupPrices, function (price) {\r\n if (parent.id == price.parentId && price.onlyMarkers == self.onlyMarkers) {\r\n priceAcum += price.price;\r\n count++;\r\n }\r\n });\r\n\r\n });\r\n\r\n return (priceAcum / count).toFixed(3);\r\n }\r\n\r\n }\r\n\r\n self.getCompetitorGroupIC = function (competitorGroup) {\r\n if (competitorGroup == undefined) return;\r\n\r\n\r\n if (competitorGroup.parentId) {\r\n\r\n\r\n var thisPrice = 0;\r\n angular.forEach(self.price.competitorsGroupPrices, function (price) {\r\n if (price.competitorGroupId == competitorGroup.id && price.onlyMarkers == self.onlyMarkers) {\r\n thisPrice = price.price;\r\n //console.log('competitorGroup', competitorGroup);\r\n //console.log('price.price', price.price);\r\n }\r\n });\r\n if (thisPrice == 0) return '';\r\n if (!self.price._Price) return ''\r\n\r\n return (self.price._Price / thisPrice - 1).toFixed(3);\r\n } else {\r\n //console.log('self.price.competitorsGroupPrices', self.price.competitorsGroupPrices);\r\n var priceAcum = 0;\r\n var count = 0;\r\n angular.forEach(self.price.competitorGroupParents, function (parent) {\r\n if (competitorGroup.id == parent.id) {\r\n angular.forEach(self.price.competitorsGroupPrices, function (price) {\r\n if (parent.id == price.parentId && price.onlyMarkers == self.onlyMarkers) {\r\n priceAcum += price.price;\r\n count++;\r\n }\r\n });\r\n }\r\n\r\n });\r\n var thisPrice = priceAcum / count;\r\n if (thisPrice == 0) return '';\r\n if (!self.price._Price) return ''\r\n\r\n return (self.price._Price / thisPrice - 1).toFixed(3);\r\n }\r\n\r\n\r\n }\r\n self.getCompetitorGroupSuggestedIC = function (competitorGroup) {\r\n if (competitorGroup == undefined) return;\r\n\r\n if (competitorGroup.parentId) {\r\n var thisPrice = 0;\r\n angular.forEach(self.price.competitorsGroupPrices, function (price) {\r\n if (price.competitorGroupId == competitorGroup.id && price.onlyMarkers == self.onlyMarkers)\r\n thisPrice = price.price;\r\n });\r\n if (thisPrice == 0) return '';\r\n if (!self.price.suggestedPrice) return '';\r\n return (self.price.suggestedPrice / thisPrice - 1).toFixed(3);\r\n } else {\r\n var priceAcum = 0;\r\n var count = 0;\r\n angular.forEach(self.price.competitorGroupParents, function (parent) {\r\n angular.forEach(self.price.competitorsGroupPrices, function (price) {\r\n if (parent.id == price.parentId && price.onlyMarkers == self.onlyMarkers) {\r\n priceAcum += price.price;\r\n count++;\r\n }\r\n });\r\n });\r\n var thisPrice = priceAcum / count;\r\n\r\n if (thisPrice == 0) return '';\r\n if (!self.price.suggestedPrice) return '';\r\n return (self.price.suggestedPrice / thisPrice - 1).toFixed(3);\r\n\r\n }\r\n\r\n }\r\n\r\n self.getCompetitorGroupNewIC = function (competitorGroup) {\r\n if (competitorGroup == undefined) return;\r\n\r\n if (competitorGroup.parentId) {\r\n var thisPrice = 0;\r\n angular.forEach(self.price.competitorsGroupPrices, function (price) {\r\n if (price.competitorGroupId == competitorGroup.id\r\n && price.onlyMarkers == self.onlyMarkers)\r\n thisPrice = price.price;\r\n });\r\n if (thisPrice == 0) return '';\r\n if (!self.price.newPrice) return '';\r\n return (self.price.newPrice / thisPrice - 1).toFixed(3);\r\n } else {\r\n var priceAcum = 0;\r\n var count = 0;\r\n angular.forEach(self.price.competitorGroupParents, function (parent) {\r\n angular.forEach(self.price.competitorsGroupPrices, function (price) {\r\n if (parent.id == price.parentId && price.onlyMarkers == self.onlyMarkers) {\r\n priceAcum += price.price;\r\n count++;\r\n }\r\n });\r\n });\r\n var thisPrice = priceAcum / count;\r\n\r\n if (thisPrice == 0) return '';\r\n if (!self.price.newPrice) return '';\r\n return (self.price.newPrice / thisPrice - 1).toFixed(3);\r\n }\r\n\r\n }\r\n\r\n\r\n self.navigateToCompetitor = function (id) {\r\n for (var m in markers) {\r\n var marker = markers[m];\r\n if (marker && marker.options && id == marker.options.id) {\r\n\r\n priceMap.setView(marker._latlng, 14);\r\n marker.openPopup();\r\n };\r\n }\r\n }\r\n\r\n self.runFilters = function () {\r\n self.priceSurveysFiltered = [];\r\n\r\n angular.forEach(markers, function (marker) {\r\n priceMap.removeLayer(marker);\r\n });\r\n markers = [];\r\n\r\n var minLat = 999;\r\n var maxLat = -999;\r\n var minLng = 999;\r\n var maxLng = -999;\r\n var latArray = [];\r\n var lngArray = [];\r\n\r\n if (!self.multizoneViewsCheckbox) {\r\n self.priceSurveys.forEach(function (priceSurvey) {\r\n var marker = addMarker(priceSurvey, 0);\r\n if (marker && marker._latlng.lat && marker._latlng.lng) {\r\n latArray.push(marker._latlng.lat);\r\n lngArray.push(marker._latlng.lng);\r\n }\r\n });\r\n }\r\n else { //vista multizona activa\r\n var auxSelectedPriceLists = [];\r\n if (self.selectedPriceLists.length === 1 && self.selectedPriceLists[0].id === 0) {//se eligio todas las zonas\r\n auxSelectedPriceLists = self.competitorZones;\r\n }\r\n else {\r\n auxSelectedPriceLists = self.selectedPriceLists;\r\n }\r\n\r\n for (var i = 0; i < auxSelectedPriceLists.length; i++) {//recorro cada priceList seleccionada\r\n var oxxoPrice = 0;\r\n for (var j = 0; j < self.prices.length; j++) {\r\n if (self.prices[j].priceListId == auxSelectedPriceLists[i].id) {\r\n if (self.prices[j]._Price) {\r\n oxxoPrice = self.prices[j]._Price;\r\n }\r\n }\r\n }\r\n var priceSurveyForCurrentPriceList = self.priceSurveys.filter(function (x) { return x.priceListId == auxSelectedPriceLists[i].id; });\r\n priceSurveyForCurrentPriceList.forEach(function (priceSurvey) {\r\n var marker = addMarker(priceSurvey, oxxoPrice);\r\n if (marker && marker._latlng.lat && marker._latlng.lng) {\r\n latArray.push(marker._latlng.lat);\r\n lngArray.push(marker._latlng.lng);\r\n }\r\n });\r\n }\r\n }\r\n\r\n\r\n var averageLng;\r\n var averageLat;\r\n var sumLat = 0;\r\n var sumLng = 0;\r\n angular.forEach(markers, function (marker) {\r\n sumLat += marker._latlng.lat;\r\n sumLng += marker._latlng.lng;\r\n });\r\n averageLat = sumLat / markers.length;\r\n averageLng = sumLng / markers.length;\r\n sumLat = 0;\r\n sumLng = 0;\r\n\r\n\r\n var deviationLat = standardDeviation(latArray).deviation;\r\n var deviationLng = standardDeviation(lngArray).deviation;\r\n\r\n var i = 0;\r\n markers.forEach(function (marker) {\r\n\r\n if ((Math.abs(marker._latlng.lat - averageLat) < (deviationLat * 1)) &&\r\n (Math.abs(marker._latlng.lng - averageLng) < (deviationLng * 1))\r\n ) {\r\n i++;\r\n\r\n sumLat += marker._latlng.lat;\r\n sumLng += marker._latlng.lng;\r\n\r\n }\r\n });\r\n\r\n if (i > 0) {\r\n averageLat = sumLat / i;\r\n averageLng = sumLng / i;\r\n }\r\n\r\n\r\n var latlng = {\r\n lat: averageLat,\r\n lng: averageLng\r\n };\r\n\r\n if (latlng.lat && latlng.lng) {\r\n //var diffLat = maxLat - minLat;\r\n //var diffLng = maxLng - minLng;\r\n //var max = Math.abs(diffLat) > Math.abs(diffLng) ? Math.abs(diffLat) : Math.abs(diffLng);\r\n priceMap.setView(latlng, 13);\r\n\r\n }\r\n\r\n\r\n }\r\n\r\n\r\n var standardDeviation = function (arr) {\r\n var n = arr.length;\r\n var sum = 0;\r\n\r\n arr.map(function (data) {\r\n sum += data;\r\n });\r\n\r\n var mean = sum / n;\r\n\r\n var variance = 0.0;\r\n var v1 = 0.0;\r\n var v2 = 0.0;\r\n\r\n if (n != 1) {\r\n for (var i = 0; i < n; i++) {\r\n v1 = v1 + (arr[i] - mean) * (arr[i] - mean);\r\n v2 = v2 + (arr[i] - mean);\r\n }\r\n\r\n v2 = v2 * v2 / n;\r\n variance = (v1 - v2) / (n - 1);\r\n if (variance < 0) { variance = 0; }\r\n stddev = Math.sqrt(variance);\r\n }\r\n\r\n return {\r\n mean: Math.round(mean * 100) / 100,\r\n variance: variance,\r\n deviation: Math.round(stddev * 100) / 100\r\n };\r\n };\r\n\r\n self.showMapAndCompetitors = true;\r\n self.isMinimized = function (isMap) {\r\n if (self.showMapAndCompetitors)\r\n return 'col-md-6';\r\n else {\r\n if (isMap) {\r\n setTimeout(function () { priceMap.invalidateSize() }, 200);\r\n return 'col-md-12';\r\n }\r\n else\r\n return 'hidden';\r\n }\r\n }\r\n //function GetZoomLevel(maxDiff) {\r\n // return 13;\r\n\r\n\r\n // if (maxDiff > 5)\r\n // return 4;\r\n // if (maxDiff > 3)\r\n // return 5;\r\n // if (maxDiff > 2)\r\n // return 6;\r\n // if (maxDiff > 1)\r\n // return 7;\r\n\r\n // if (maxDiff > 0.7)\r\n // return 9;\r\n\r\n // if (maxDiff > 0.5)\r\n // return 10;\r\n\r\n // if (maxDiff > 0.4)\r\n // return 11;\r\n\r\n // if (maxDiff > 0.3)\r\n // return 11;\r\n\r\n // if (maxDiff > 0.2)\r\n // return 12;\r\n\r\n // return 12;\r\n //}\r\n //$ctrl.selectedCompetitorGroups\r\n self.setFilterPriceZone = function (priceZone) {\r\n if (self.selectedPriceZone == priceZone) return;\r\n self.selectedPriceZone = priceZone;\r\n\r\n if (priceZone != null) {\r\n self.selectedPriceZoneName = priceZone.name;\r\n }\r\n else\r\n self.selectedPriceZoneName = '';\r\n\r\n self.selectedCompetitorGroups = [];\r\n self.competitorGroupsParents = [];\r\n\r\n changePriceUsed();\r\n\r\n loadCompetitorGroupPrices();\r\n loadCompetitorGroupsParents();\r\n loadCompetitorGroups();\r\n\r\n //console.log('removiendo', priceZone);\r\n\r\n self.runFilters();\r\n }\r\n\r\n self.setCompetitorGroupFilter = function (priceSurvey) {\r\n\r\n self.runFilters();\r\n }\r\n\r\n self.onlyMarkerChanged = function () {\r\n //console.log('change', self.onlyMarkers);\r\n self.runFilters();\r\n }\r\n\r\n self.multizoneViews = function () {\r\n if (self.multizoneViewsCheckbox) {\r\n var priceListId = 0\r\n var states = [];\r\n if (self.selectedPriceZone != undefined)\r\n priceListId = self.selectedPriceZone.id;\r\n\r\n angular.forEach(self.competitorsInit, function (c) {\r\n angular.forEach(c.priceLists, function (pl) {\r\n if (pl == priceListId) {\r\n if (self.competitorPriceList.length > 0) {\r\n states = self.competitorPriceList.map(function (cpl) { return cpl.state });\r\n if (!states.includes(c.state)) {\r\n self.competitorPriceList.push(c);\r\n }\r\n }\r\n else {\r\n self.competitorPriceList.push(c);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n else {\r\n self.competitorPriceList = [];\r\n self.competitorZones = [];\r\n self.competitorStates = [];\r\n }\r\n }\r\n\r\n function removeAccents(str) {\r\n return str.normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\");\r\n }\r\n\r\n /**\r\n * self.competitorZones son las opciones que deben alterarse segun los estados seleccionados\r\n * */\r\n self.changeStates = function () {\r\n self.competitorZones = []; \r\n\r\n angular.forEach(self.allPriceList, function (pl) {//tengo que saber si la pusheo\r\n\r\n var competitors = [];//competidores de la current priceList (pl)\r\n //recorre todos los competidores\r\n angular.forEach(self.competitorsInit, function (competitor) {\r\n if (competitor.priceLists.includes(pl.id)) {\r\n competitors.push(competitor);\r\n }\r\n });\r\n\r\n var stores = []; //stores de la current priceList (pl)\r\n //Recorre las Stores para saber cuales pertenecen a la current PriceList\r\n angular.forEach(self.stores, function (s) {\r\n if (s.priceListId == pl.id) {\r\n stores.push(s);\r\n }\r\n });\r\n\r\n //recorre los estados seleccionados y si alguno de los competidores de la pl tiene ese estado pusheo la pl\r\n var priceListIsInState = false;\r\n angular.forEach(self.competitorStates, function (state) { \r\n angular.forEach(competitors, function (c) {\r\n if (c.state == state.state) {\r\n priceListIsInState = true;\r\n }\r\n });\r\n //Recorre las Stores de la currentPriceList para checkear si esta la priceList esta en el estado!\r\n angular.forEach(stores, function (s) {\r\n if (removeAccents(s.state.toLowerCase()) == removeAccents(state.state.toLowerCase())) {\r\n priceListIsInState = true;\r\n }\r\n });\r\n });\r\n\r\n if (priceListIsInState)//esta priceList esta en al menos uno de los estados seleccionados\r\n self.competitorZones.push(pl);\r\n \r\n });\r\n if (self.competitorZones.length > 0) {\r\n var allPriceList = { id: 0, code: \"TODAS\", name: \"TODAS\" };\r\n self.competitorZones.unshift(allPriceList);\r\n }\r\n }\r\n\r\n self.changeZones = function () {\r\n var allPriceList = { id: 0, code: \"TODAS\", name: \"TODAS\" };\r\n\r\n angular.forEach(self.selectedPriceLists, function (pl) {\r\n if (pl.id == 0) {\r\n self.selectedPriceLists = [];\r\n self.selectedPriceLists.push(allPriceList);\r\n }\r\n });\r\n }\r\n\r\n self.applyStatesFilters = function () { \r\n\r\n self.selectedCompetitorGroups = [];\r\n self.competitorGroupsParents = [];\r\n\r\n changePriceUsed();\r\n\r\n loadCompetitorGroupPricesByPriceListIds();\r\n loadCompetitorGroupsParentsByPriceListIds();\r\n loadCompetitorGroupsByPriceListIds();\r\n\r\n self.runFilters();\r\n }\r\n\r\n function mustShowPriceSurvey(priceSurvey) {\r\n //console.log('priceSurvey', priceSurvey);\r\n\r\n if (priceSurvey.competitorLat == null || priceSurvey.competitorLong == null) {\r\n return false;\r\n }\r\n if (!self.multizoneViewsCheckbox) {\r\n if (priceSurvey.priceListName != self.selectedPriceZoneName && self.selectedPriceZoneName != '')\r\n return false;\r\n }\r\n else {//esta en true \"vistaMultizonas\"\r\n var rv = true;\r\n angular.forEach(self.selectedPriceLists, function (pl) {\r\n if (priceSurvey.priceListName != pl.name && self.selectedPriceLists.length == 1 && self.selectedPriceLists[0].id != 0) {\r\n rv = false;\r\n }\r\n });\r\n return rv;\r\n }\r\n if (self.selectedCompetitorGroups.length > 0) {\r\n var valid = false;\r\n if (priceSurvey.competitorGroupIdsList.length > 0 || priceSurvey.source == 'YPF') //TODO: Identificar Brand Propia\r\n angular.forEach(self.selectedCompetitorGroups, function (competitorGroupSelected) {\r\n if (priceSurvey.competitorGroupIdsList.indexOf(competitorGroupSelected.id) != -1 || priceSurvey.source == 'YPF')\r\n valid = true;\r\n });\r\n if (!valid)\r\n return false;\r\n }\r\n //console.log(self.onlyMarkers, !priceSurvey.isMarker)\r\n if (self.onlyMarkers && !priceSurvey.isMarker)\r\n return false;\r\n\r\n //if(priceSurvey.)\r\n\r\n\r\n\r\n return true\r\n }\r\n\r\n function addMarker(priceSurvey, oxxoPrice) {\r\n if (mustShowPriceSurvey(priceSurvey)) {\r\n var pos = self.priceSurveysFiltered.map(function (e) { return e.id; }).indexOf(priceSurvey.id);\r\n if (pos == -1) {\r\n self.priceSurveysFiltered.push(priceSurvey);\r\n }\r\n\r\n if (priceSurvey.competitorLogo) {\r\n //var competitorIcon = L.icon({\r\n // iconUrl: 'assets/images/competitors/' + priceSurvey.competitorLogo,\r\n\r\n // iconSize: [24, 24], // size of the icon\r\n // iconAnchor: [0, 0], // point of the icon which will correspond to marker's location\r\n // popupAnchor: [12, 6] // point from which the popup should open relative to the iconAnchor\r\n //});\r\n\r\n //console.log('self.price', priceSurvey);\r\n\r\n var imgStr = '';\r\n //console.log('imgstr', imgStr);\r\n var arrowStr = '
'\r\n var color;\r\n\r\n if (!self.multizoneViewsCheckbox) {\r\n if (self.price._Price == undefined) {\r\n color = 'blue';\r\n }\r\n else if (self.price._Price > priceSurvey.price) {\r\n color = 'green';\r\n }\r\n else if (self.price._Price < priceSurvey.price) {\r\n color = 'red';\r\n }\r\n else {\r\n color = 'gray';\r\n }\r\n }\r\n else {//vista multizona activa\r\n if (oxxoPrice == 0) {\r\n color = 'blue';\r\n }\r\n else if (oxxoPrice > priceSurvey.price) {\r\n color = 'green';\r\n }\r\n else if (oxxoPrice < priceSurvey.price) {\r\n color = 'red';\r\n }\r\n else {\r\n color = 'gray';\r\n }\r\n }\r\n\r\n var upperDiv = '
'\r\n + ian.abbreviateNumberThousand(priceSurvey.price, 2, '') + '
';\r\n\r\n var mainDivStyles = 'style=\"height:55px; width:45px; background-color:white;border-radius:5px;border-color: black;' +\r\n //'margin-top: -60px;' +\r\n //'margin-left: -24px;' +\r\n 'border-style: solid;' +\r\n 'border-width: 1px;\"';\r\n\r\n var competitorIcon = L.divIcon({\r\n html: '
' +\r\n upperDiv + ' ' +\r\n imgStr +\r\n arrowStr + '
',\r\n\r\n iconSize: [45, 55], // size of the icon\r\n className: 'transparent',\r\n iconAnchor: [24, 60], // point of the icon which will correspond to marker's location\r\n popupAnchor: [0, -54] // point from which the popup should open relative to the iconAnchor\r\n });\r\n //console.log('pricesurvey', priceSurvey);\r\n var popupStr = '' + priceSurvey.competitorCode + ' ' + priceSurvey.competitor + '' +\r\n '
' +\r\n $filter('currency')(priceSurvey.price) +\r\n '
' +\r\n $filter('date')(priceSurvey.observedDate, 'MMM d, y') +\r\n '
' +\r\n self.getPriceSurveyType(priceSurvey.priceSurveyType).name;\r\n\r\n var marker = L.marker([priceSurvey.competitorLat, priceSurvey.competitorLong], { id: priceSurvey.id, icon: competitorIcon }).addTo(priceMap)\r\n .bindPopup(popupStr);\r\n\r\n markers.push(marker);\r\n return marker;\r\n }\r\n }\r\n }\r\n\r\n function loadPriceSurveys(itemId) {\r\n self.isLoadingSurveys = true;\r\n if (!self.multizoneViewsCheckbox) {\r\n var priceListId = 0\r\n if (self.selectedPriceZone != undefined)\r\n priceListId = self.selectedPriceZone.id;\r\n\r\n //Vacio el listado para que quede el loading cuando cargo otra zona o cambio filtros\r\n self.priceSurveys = [];\r\n\r\n priceService.pricesurveys.onlyActive(itemId, priceListId, true).then(function (priceSurveys) {\r\n self.priceSurveys = priceSurveys;\r\n console.log('priceSurveys', priceSurveys);\r\n\r\n if (self.priceSurveys.length > 0) {\r\n self.itemName = self.priceSurveys[0].itemName;\r\n self.itemCode = self.priceSurveys[0].itemCode;\r\n }\r\n\r\n self.runFilters();\r\n self.isLoadingSurveys = false;\r\n });\r\n }\r\n else {\r\n self.priceSurveys = [];\r\n var priceListIds;\r\n var competitorZones = angular.copy(self.competitorZones);\r\n if (self.selectedPriceLists[0].id == 0) {\r\n competitorZones.splice(0, 1);\r\n priceListIds = competitorZones.map(function (z) { return z.id });\r\n }\r\n else {\r\n priceListIds = self.selectedPriceLists.map(function (cz) { return cz.id });\r\n }\r\n\r\n priceService.pricesurveys.onlyActiveByPriceListIds({ itemId: itemId, priceListIds: priceListIds, includeOwnPrices: true}).then(function (priceSurveys) {\r\n self.priceSurveys = priceSurveys;\r\n console.log('priceSurveys', priceSurveys);\r\n\r\n if (self.priceSurveys.length > 0) {\r\n self.itemName = self.priceSurveys[0].itemName;\r\n self.itemCode = self.priceSurveys[0].itemCode;\r\n }\r\n\r\n self.runFilters();\r\n self.isLoadingSurveys = false;\r\n });\r\n }\r\n }\r\n\r\n function loadPriceLists() {\r\n\r\n priceService.pricelists.getPriceLists().then(function (priceList) {\r\n self.allPriceList = priceList;\r\n\r\n var selected = false;\r\n for (i = 0; i < self.allPriceList.length; i++) {\r\n if (self.allPriceList[i].id == self.price.priceListId) {\r\n selected = true;\r\n self.setFilterPriceZone(self.allPriceList[i]);\r\n }\r\n }\r\n\r\n if (selected == false) {\r\n self.setFilterPriceZone(self.allPriceList[0]);\r\n }\r\n\r\n priceService.costs.getItems().then(function (items) {\r\n //console.log('items', items);\r\n self.items = items;\r\n for (var i = 0; i < items.length; i++) {\r\n if (items[i].id == self.price.itemId) {\r\n self.selectedItem = items[i];\r\n }\r\n }\r\n\r\n if (self.selectedItem == undefined) {\r\n self.selectedItem = items[0];\r\n }\r\n getPrices(self.selectedItem.categoryId, false);\r\n\r\n\r\n });\r\n });\r\n }\r\n\r\n\r\n function getPrices(categoryId, loadCompetitorGroups) {\r\n self.priceSurveys = [];\r\n self.priceSurveysFiltered = [];\r\n self.isLoadingSurveys = true;\r\n //Vacio el listado para que quede el loading cuando cargo otra zona o cambio filtros\r\n if (self.allPrices != null && self.allPrices.length > 0) {\r\n self.prices = self.allPrices;\r\n }\r\n else {\r\n priceService.decisions.getPrices(categoryId, 0).then(function (prices) {\r\n self.prices = prices;\r\n });\r\n }\r\n //console.log('prices', prices);\r\n self.isLoadingSurveys = false;\r\n changePriceUsed();\r\n if (loadCompetitorGroups) {\r\n loadCompetitorGroupPrices();\r\n }\r\n }\r\n\r\n\r\n function changePriceUsed() {\r\n if (self.canChangePriceUsed && self.prices) {\r\n\r\n\r\n var selected = false;\r\n for (var i = 0; i < self.prices.length; i++) {\r\n //console.log('prices[i].priceListId', prices[i].priceListId, ' == ', 'self.selectedPriceZone.id', self.selectedPriceZone.id);\r\n if (self.selectedPriceZone == null || self.prices[i].priceListId == self.selectedPriceZone.id) {\r\n //console.log('seleccionada', self.selectedPriceZone);\r\n //console.log('precio', self.prices[i]);\r\n selected = true;\r\n self.price = self.prices[i];\r\n self.price.priceId = 0;\r\n }\r\n }\r\n\r\n if (!selected) {\r\n self.price = {\r\n priceId: 0\r\n };\r\n }\r\n\r\n }\r\n if (self.selectedItem) {\r\n\r\n $timeout(function () {\r\n loadPriceSurveys(self.selectedItem.id);\r\n })\r\n }\r\n\r\n }\r\n\r\n function loadStorePriceListStates() {\r\n self.isLoadingStores = true;\r\n adminService.stores.getStorePriceListState().then(function (stores) {\r\n self.stores = stores;\r\n self.isLoadingStores = false;\r\n });\r\n }\r\n\r\n function loadCompetitorsInit() {\r\n priceService.competitors.competitors().then(function (competitors) {\r\n self.competitorsInit = competitors;\r\n });\r\n }\r\n\r\n\r\n function loadData() {\r\n\r\n //loadItems();\r\n //loadPriceSurveys();\r\n loadStorePriceListStates();\r\n loadCompetitorsInit();\r\n loadPriceLists();\r\n\r\n }\r\n\r\n self.displayPhoto = function (price) {\r\n\r\n if (price.priceSurveyType != 2) // solo muestro fotos en extra\r\n return;\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n component: 'displayPhoto',\r\n windowClass: 'app-modal-window',\r\n resolve: {\r\n params: function () {\r\n return {\r\n url: price.source\r\n };\r\n }\r\n }\r\n });\r\n }\r\n\r\n\r\n function loadCompetitorGroupsParents() {\r\n var priceListId = 0\r\n if (self.selectedPriceZone != undefined)\r\n priceListId = self.selectedPriceZone.id;\r\n priceService.competitors.getCompetitorGroupsParentByPriceList(priceListId).then(function (compGroupsParents) {\r\n //console.log('compGroupsParents', compGroupsParents);\r\n self.competitorGroupsParents = compGroupsParents;\r\n })\r\n }\r\n\r\n function loadCompetitorGroupsParentsByPriceListIds() {\r\n var priceListIds;\r\n var competitorZones = angular.copy(self.competitorZones);\r\n if (self.selectedPriceLists[0].id == 0) {\r\n competitorZones.splice(0, 1);\r\n priceListIds = competitorZones.map(function (z) { return z.id });\r\n }\r\n else {\r\n priceListIds = self.selectedPriceLists.map(function (cz) { return cz.id });\r\n }\r\n priceService.competitors.getCompetitorGroupsParentByPriceListIds({ priceListIds: priceListIds }).then(function (compGroupsParents) {\r\n self.competitorGroupsParents = compGroupsParents;\r\n })\r\n }\r\n\r\n function loadCompetitorGroups() {\r\n\r\n var priceListId = 0\r\n if (self.selectedPriceZone != undefined)\r\n priceListId = self.selectedPriceZone.id;\r\n\r\n priceService.competitors.getCompetitorGroupsByPriceList(priceListId).then(function (compGroups) {\r\n self.competitorGroups = angular.copy(compGroups);\r\n\r\n if (self.priceSurveysFiltered.length > 0) {\r\n self.competitorGroupsFilteredByParentAndSurveys = [];\r\n var includedIds = [];\r\n angular.forEach(self.competitorGroups, function (cg) {\r\n for (var i = 0, len = self.priceSurveysFiltered.length; i < len; i++) {\r\n angular.forEach(self.priceSurveysFiltered[i].competitorGroupIdsList, function (groupId) {\r\n if (groupId == cg.id && includedIds.indexOf(cg.id) == -1) {\r\n self.competitorGroupsFilteredByParentAndSurveys.push(cg);\r\n includedIds.push(cg.id);\r\n }\r\n });\r\n \r\n }\r\n });\r\n }\r\n else\r\n self.competitorGroupsFilteredByParent = angular.copy(compGroups);\r\n })\r\n }\r\n\r\n function loadCompetitorGroupsByPriceListIds() {\r\n var priceListIds;\r\n var competitorZones = angular.copy(self.competitorZones);\r\n if (self.selectedPriceLists[0].id == 0) {\r\n competitorZones.splice(0, 1);\r\n priceListIds = competitorZones.map(function (z) { return z.id });\r\n }\r\n else {\r\n priceListIds = self.selectedPriceLists.map(function (cz) { return cz.id });\r\n }\r\n\r\n priceService.competitors.getCompetitorGroupsByPriceListIds({ priceListIds: priceListIds }).then(function (compGroups) {\r\n self.competitorGroups = angular.copy(compGroups);\r\n\r\n if (self.priceSurveysFiltered.length > 0) {\r\n self.competitorGroupsFilteredByParentAndSurveys = [];\r\n var includedIds = [];\r\n angular.forEach(self.competitorGroups, function (cg) {\r\n for (var i = 0, len = self.priceSurveysFiltered.length; i < len; i++) {\r\n angular.forEach(self.priceSurveysFiltered[i].competitorGroupIdsList, function (groupId) {\r\n if (groupId == cg.id && includedIds.indexOf(cg.id) == -1) {\r\n self.competitorGroupsFilteredByParentAndSurveys.push(cg);\r\n includedIds.push(cg.id);\r\n }\r\n });\r\n\r\n }\r\n });\r\n }\r\n else\r\n self.competitorGroupsFilteredByParent = angular.copy(compGroups);\r\n })\r\n }\r\n\r\n function loadCompetitorGroupPrices() {\r\n\r\n var priceListId = 0\r\n //console.log('self.selectedPriceZone', self.selectedPriceZone);\r\n if (self.selectedPriceZone != undefined)\r\n priceListId = self.selectedPriceZone.id;\r\n\r\n priceService.decisions.getCompetitorsGroupPrices(self.price.itemId, priceListId).then(function (competitorPrices) {\r\n //console.log('competitorPrices', competitorPrices);\r\n self.price.competitorsGroupPrices = competitorPrices;\r\n\r\n });\r\n }\r\n\r\n function loadCompetitorGroupPricesByPriceListIds() {\r\n var priceListIds;\r\n var competitorZones = angular.copy(self.competitorZones);\r\n if (self.selectedPriceLists[0].id == 0) {\r\n competitorZones.splice(0, 1);\r\n priceListIds = competitorZones.map(function (z) { return z.id });\r\n }\r\n else {\r\n priceListIds = self.selectedPriceLists.map(function (cz) { return cz.id });\r\n }\r\n\r\n priceService.decisions.getCompetitorsGroupPricesByPriceListIds({ itemId: self.price.itemId, priceListIds: priceListIds }).then(function (competitorPrices) {\r\n self.price.competitorsGroupPrices = competitorPrices;\r\n });\r\n }\r\n\r\n\r\n function loadCompetitors(compGroupId) {\r\n priceService.competitors.getCompetitors(compGroupId).then(function (competitors) {\r\n //console.log('competitors', competitors);\r\n self.competitors = competitors;\r\n })\r\n }\r\n\r\n self.changeItemSelected = function () {\r\n //console.log('item changed', self.selectedItem);\r\n\r\n getPrices(self.selectedItem.categoryId, true);\r\n\r\n self.selectedCompetitorGroups = [];\r\n //self.competitorGroupsParents = [];\r\n //loadPriceSurveys(self.selectedItem.id);\r\n }\r\n \r\n self.validatePriceSurvey = function (price) {\r\n swal({\r\n title: 'Marcar precio como valido?',\r\n text: 'El precio relevado esta marcado como invalido. Si considera que esto es un error puede marcarlo como valido haciendo clic en \"Es Valido\"',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Es Valido\",\r\n cancelButtonText: \"Cancelar\",\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n }, function (isValid) {\r\n if (isValid) {\r\n price.isValid = true;\r\n swal('Exito', 'El precio relevado fue marcado como valido', 'success');\r\n }\r\n });\r\n }\r\n\r\n self.validatePriceSurvey = function (price) {\r\n swal({\r\n title: 'Marcar precio como valido?',\r\n text: 'El precio relevado esta marcado como invalido. Si considera que esto es un error puede marcarlo como valido haciendo clic en \"Es Valido\"',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Es Valido\",\r\n cancelButtonText: \"Cancelar\",\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n }, function (isValid) {\r\n if (isValid) {\r\n price.isValid = true;\r\n swal('Exito', 'El precio relevado fue marcado como valido', 'success');\r\n }\r\n });\r\n }\r\n\r\n self.changeCompetitorGroupParents = function () {\r\n\r\n if (self.price.competitorGroupParents != null && self.price.competitorGroupParents.length > 0) {\r\n\r\n self.competitorGroupsFilteredByParent = [];\r\n angular.forEach(self.competitorGroups, function (competitorGroup) {\r\n angular.forEach(self.price.competitorGroupParents, function (competitorGroupParent) {\r\n if (competitorGroup.parentId == competitorGroupParent.id)\r\n self.competitorGroupsFilteredByParent.push(competitorGroup);\r\n });\r\n });\r\n\r\n\r\n //self.competitorGroupsFilteredByParent = ($filter('filter')(self.competitorGroups, { parentId: self.price.competitorGroupParents.id }));\r\n }\r\n else {\r\n self.selectedCompetitorGroups = [];\r\n self.competitorGroupsFilteredByParent = self.competitorGroups;\r\n self.price.competitorGroup = null;\r\n }\r\n\r\n self.competitorGroupsFilteredByParentAndSurveys = [];\r\n var includedIds = [];\r\n\r\n angular.forEach(self.competitorGroupsFilteredByParent, function (cg) {\r\n for (var i = 0, len = self.priceSurveysFiltered.length; i < len; i++) {\r\n angular.forEach(self.priceSurveysFiltered[i].competitorGroupIdsList, function (groupId) {\r\n if (groupId == cg.id && includedIds.indexOf(cg.id) == -1) {\r\n self.competitorGroupsFilteredByParentAndSurveys.push(cg);\r\n includedIds.push(cg.id);\r\n }\r\n });\r\n }\r\n });\r\n\r\n self.competitorGroupsFilteredByParent = angular.copy(self.competitorGroupsFilteredByParentAndSurveys);\r\n }\r\n\r\n self.getICBoxes = function () {\r\n if (self.price.competitorGroupParents != undefined) {\r\n var arr = self.selectedCompetitorGroups.concat(self.price.competitorGroupParents);\r\n //console.log(arr);\r\n return arr;\r\n }\r\n else {\r\n return self.selectedCompetitorGroups;\r\n }\r\n\r\n }\r\n\r\n self.changeCompetitorGroup = function () {\r\n self.runFilters();\r\n //if (self.price.competitorGroup != null)\r\n // self.selectedCompetitorGroups.push(self.price.competitorGroup);\r\n // //loadCompetitors(self.price.competitorGroup.id);\r\n //else {\r\n // self.selectedCompetitorGroups = [];\r\n // self.price.competitor = null;\r\n // self.competitors = null;\r\n //}\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n $translate([\"Basket\", \"Extra\", \"PriceIndex\", \"Promotion\", \"Own\", \"Web\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n priceSurveyType = [\r\n { id: 1, name: translations.Basket, className: \"lazur-bg\" },\r\n { id: 2, name: translations.Extra, className: \"yellow-bg\" },\r\n { id: 3, name: translations.PriceIndex, className: \"\" },\r\n { id: 4, name: translations.Promotion, className: \"\" },\r\n { id: 5, name: translations.Own, className: \"navy-bg\" },\r\n { id: 6, name: translations.Web, className: \"gray-bg\" },\r\n ]\r\n\r\n });\r\n\r\n homeService.dashboards.getCountry()\r\n .then(function (c) {\r\n country = c;\r\n\r\n document.getElementById('priceMapid-' + self.price.priceId).innerHTML = \"
\";\r\n\r\n if (country == \"Peru\") {\r\n priceMap = L.map('map-' + self.price.priceId).setView([-8.8822898, -73.7699384], 5); //Per�\r\n self.moneySymbol = '$';\r\n }\r\n if (country == \"Colombia\") {\r\n priceMap = L.map('map-' + self.price.priceId).setView([1.8822898, -73.7699384], 5); //Colombia\r\n self.moneySymbol = '$';\r\n }\r\n else if (country == \"Argentina\") {\r\n priceMap = L.map('map-' + self.price.priceId).setView([-38.005, -61.0739], 4); //Argentina\r\n self.moneySymbol = '$';\r\n }\r\n else if (country == \"Mexico\") {\r\n priceMap = L.map('map-' + self.price.priceId).setView([21.695501, -101.666045], 5); //Mexico\r\n }\r\n else if (country == \"UK\") {\r\n priceMap = L.map('map-' + self.price.priceId).setView([51.5287718, -0.119114], 5); //UK\r\n }\r\n else if (country == \"Chile\") {\r\n priceMap = L.map('map-' + self.price.priceId).setView([-33.4718999, -70.9100212], 4); //Chile\r\n self.moneySymbol = '$';\r\n }\r\n\r\n L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\r\n attribution: '© OpenStreetMap',\r\n subdomains: ['a', 'b', 'c']\r\n }).addTo(priceMap);\r\n\r\n\r\n loadData();\r\n });\r\n }\r\n\r\n\r\n self.selectPrice = function (p) {\r\n //console.log('selecting p', p);\r\n if (self.selectedCompetitor && self.selectedCompetitor.competitorId === p.competitorId) {\r\n self.selectedCompetitor = null;\r\n }\r\n else if (!p.evolutionData) {\r\n p.evolutionData = {};\r\n self.selectedCompetitor = p;\r\n\r\n priceService.pricesurveys.getHistorical(p.competitorId, p.itemId, p.salesUnitOfMeasureId, self.price.priceType, p.priceSurveyType == 5).then(function (priceHistory) {\r\n //console.log('priceHistory', priceHistory);\r\n p.evolutionData.priceHistory = _.uniqBy(priceHistory, 'observedDate'); //el chart se rompe si hay mas de una fecha de observacion igual\r\n });\r\n\r\n priceService.competitors.getCompetitorUnitSales(p.competitorId, p.itemId, p.priceSurveyType == 5, 12).then(function (unitsData) {\r\n //console.log('unitsData', unitsData);\r\n p.evolutionData.unitsData = unitsData;\r\n });\r\n\r\n } else {\r\n self.selectedCompetitor = p;\r\n }\r\n\r\n self.navigateToCompetitor(p.id)\r\n\r\n //self.toggleTabsRow(p);\r\n }\r\n\r\n //self.toggleTabsRow = function (p) {\r\n\r\n // var speed = 100;\r\n\r\n // if (self.selectedPrice) {\r\n // $('#' + p.priceId).attr('hidden', false).show();\r\n // $('#' + p.priceId)\r\n // .children('td')\r\n // .animate({ paddingTop: 8, paddingBottom: 8 }, speed)\r\n // .children()\r\n // .slideDown(speed);\r\n // }\r\n // else {\r\n // $('#' + p.priceId)\r\n // .children('td')\r\n // .animate({ paddingTop: 0, paddingBottom: 0 }, speed)\r\n // .children()\r\n // .slideUp(speed, function () { $('#' + p.priceId).attr('hidden', true).hide(); });\r\n // }\r\n //}\r\n\r\n}\r\n\r\nangular.module('prisma').component('priceMap', {\r\n templateUrl: 'app/shared_logic/components/priceMap/priceMap.component.html', \r\n bindings: {\r\n price: '<',\r\n allPrices: '<',\r\n canChangePriceUsed: '='\r\n },\r\n\r\n controller: _controller\r\n});\r\n\r\n\r\n","var _controller = function ($scope, $attrs, $filter, $timeout, $rootScope, $translate, priceService, adminService) {\r\n var self = this;\r\n\r\n self.dateTo = new Date();\r\n self.dateFrom = new Date(); \r\n self.dateFrom.setYear(2019);\r\n\r\n\r\n self.items = [];\r\n\r\n self.updateChart = function () {\r\n c3.generate({\r\n bindto: \"#priceEvolutionChart_\" + self.priceId,\r\n\r\n padding: {\r\n top: 30,\r\n right: 50,\r\n bottom: 60,\r\n left: 50,\r\n },\r\n\r\n data: {\r\n x: 'x',\r\n xFormat: '%d-%m', // parse format\r\n \"columns\": self.data,\r\n empty: { label: { text: \"Sin datos\" } },\r\n colors: {\r\n 'YPF': '#0070b8',\r\n 'AXION': '#bb166f',\r\n 'SHELL': '#ed1b23',\r\n 'OIL': '#ffd800',\r\n 'BLANCA': '#cccccc',\r\n 'REFINOR': '#66bb69',\r\n 'PETROBRAS': '#008b5a'\r\n }\r\n },\r\n axis: {\r\n x: {\r\n type: 'category',\r\n tick: {\r\n rotate: 0,\r\n format: '%d-%m'\r\n }\r\n },\r\n y: {\r\n label: translations.PriceInS,\r\n tick: {\r\n format: d3.format(\".2f\")\r\n }\r\n }\r\n },\r\n tooltip: {\r\n format: {\r\n value: function (value, ratio, id) {\r\n var newValue = value;\r\n return newValue;\r\n }\r\n }\r\n },\r\n line: {\r\n connectNull: true\r\n }\r\n });\r\n }\r\n\r\n self.isLoadingChart = false;\r\n\r\n function getPricesEvolution(itemId, priceListId, dateFrom, dateTo) {\r\n self.isLoadingChart = true;\r\n\r\n priceService.evolutionReport.getOxxoData(itemId, priceListId, dateFrom.toISOString(), dateTo.toISOString()).then(function (items) {\r\n self.isLoadingChart = false;\r\n if (items == null || items == '') {\r\n self.data = items;\r\n self.updateChart();\r\n return;\r\n }\r\n\r\n var valueToPush = new Array();\r\n var uniqueArray = items.reduce(function (a, d) {\r\n if (a.indexOf(d.observedDateString) === -1) {\r\n a.push(\"\" + d.observedDateString + \"\");\r\n }\r\n return a;\r\n }, ['x']);\r\n\r\n var competitorsNamesObj = [];\r\n var competitorsNames = items.reduce(function (a, d) {\r\n\r\n var p = (competitorsNamesObj.find ? competitorsNamesObj.find(cd => {\r\n return cd.observedDateString == d.observedDateString && cd.tradeName == d.tradeName;\r\n }) : undefined);\r\n if (!p) {\r\n competitorsNamesObj.push({ 'observedDateString': d.observedDateString, \"tradeName\": d.tradeName, 'price': d.price });\r\n }\r\n if (a.indexOf(d.tradeName) === -1) {\r\n a.push(d.tradeName);\r\n }\r\n\r\n return a;\r\n }, []);\r\n\r\n var i = 1;\r\n var keepPrice = { competitorName: '', price: 0 };\r\n // var firstPrice = { competitorName: '', price: 0, count: 0, flag: false };\r\n var firstPrices = [];\r\n\r\n competitorsNames.forEach(function (c) {\r\n competitors = [];\r\n competitors.push(c);\r\n\r\n for (k = 1; k < uniqueArray.length; k++) {\r\n var p2 = competitorsNamesObj.find(cd => {\r\n return cd.observedDateString == uniqueArray[k] && cd.tradeName == c;\r\n })\r\n if (p2) {\r\n competitors.push(p2.price);\r\n keepPrice = { competitorName: c, price: p2.price };\r\n\r\n var index = firstPrices.findIndex(fp => fp.competitorName == c && !fp.flag);\r\n\r\n if (index != -1) {\r\n var count = firstPrices[index].count;\r\n firstPrices.splice(index, 1, { competitorName: c, price: p2.price, count: count, flag: true });\r\n }\r\n\r\n }\r\n else { //mantengo precio anterior \r\n if (keepPrice.competitorName == c)\r\n competitors.push(keepPrice.price);\r\n else {\r\n var foundNullPrice = false;\r\n for (j = 0; j < firstPrices.length; j++) {\r\n if (firstPrices[j].competitorName == c) {\r\n //sirve para hacer el fill despues\r\n firstPrices[j].count++;\r\n foundNullPrice = true;\r\n }\r\n }\r\n if (!foundNullPrice) {\r\n firstPrices.push({ competitorName: c, count: 1 });\r\n }\r\n competitors.push(null);\r\n }\r\n\r\n }\r\n }\r\n //fill nulls\r\n var fillBlankValues = firstPrices.find(cp => { return cp.competitorName == c });\r\n if (fillBlankValues)\r\n competitors.fill(fillBlankValues.price, 1, fillBlankValues.count + 1);\r\n\r\n valueToPush[i] = competitors;\r\n i++;\r\n });\r\n\r\n valueToPush[0] = uniqueArray;\r\n self.data = valueToPush;\r\n\r\n self.updateChart();\r\n\r\n });\r\n }\r\n\r\n function init() {\r\n\r\n $translate([\"GeneralInformation\", \"DateFrom\", \"DateFromTooltip\", \"StoreCode\", \"Store\", \"ChangesSent\", \"ChangesSentTooltip\"\r\n , \"NAtooltip\", \"Atooltip\", \"Limit\", \"LimitTooltip\", \"Detour\", \"PriceTypes\", \"Regular\", \"Competitive\", \"Promotion\", \"Discount\"\r\n , \"Action\", \"Decrease\", \"Increase\", \"Pr_volumeMeasurement_validationDate\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n getPricesEvolution(self.itemId, self.priceListId, self.dateFrom, self.dateTo);\r\n\r\n });\r\n }\r\n\r\n init();\r\n\r\n}\r\n\r\nangular.module('prisma').component('priceEvolutionReport', {\r\n templateUrl: 'app/shared_logic/components/priceEvolutionReport/priceEvolutionReport.component.html',\r\n bindings: {\r\n priceId: '<',\r\n itemId: '<',\r\n priceListId: '<'\r\n },\r\n\r\n controller: _controller\r\n});\r\n\r\n\r\n","var _controller = function (componentsService, $scope, $element, $attrs, $q, $timeout, $translate) {\r\n var self = this;\r\n\r\n //console.log('ctrl', self);\r\n\r\n self.updateCharts = function () {\r\n\r\n if (self.pricesChartData == null)\r\n return;\r\n\r\n //console.log('self.pricesChartData', self.pricesChartData);\r\n $timeout(function () {\r\n //self.pricesChartData[1].push(null);\r\n //self.pricesChartData[1].push(null);\r\n //self.pricesChartData[1].push(null);\r\n //self.pricesChartData[1].push(null);\r\n //self.pricesChartData[1].push(null);\r\n //self.pricesChartData[1].push(null);\r\n self.pricesChart = c3.generate(getChartConfig('#priceEvolutionChart_' + self.id, self.pricesChartData));\r\n self.unitsChart = c3.generate(getUnitsChartConfig('#unitsEvolutionChart_' + self.id, self.unitsChartData));\r\n });\r\n }\r\n\r\n\r\n\r\n\r\n function getChartConfig(chartId, data) {\r\n //console.log('chartid', chartId);\r\n return {\r\n bindto: chartId,\r\n size: {\r\n height: 210,\r\n },\r\n data: {\r\n x: 'x',\r\n columns: data,\r\n type: 'spline',\r\n axes: axes,\r\n },\r\n color: {\r\n pattern: ['#0063C2']\r\n },\r\n axis: {\r\n x: {\r\n type: 'timeseries',\r\n tick: {\r\n format: '%m-%d',\r\n }\r\n },\r\n y: {\r\n tick: {\r\n format: d3.format(\".2f\")\r\n }\r\n },\r\n //y2: {\r\n // show: false\r\n //}\r\n },\r\n tooltip: {\r\n format: {\r\n title: function (d) {\r\n var toFormat = '%e %B %Y';\r\n if (self.timerange == 'year')\r\n toFormat = '%e %B %Y';\r\n\r\n var format = d3.time.format(toFormat);\r\n return format(d);\r\n },\r\n value: function (value, ratio, id) {\r\n //console.log('value', value, 'ratio', ratio, 'id', id);\r\n //console.log('this', this);\r\n var format;\r\n if (id == translations.Price) {\r\n format = d3.format('$,.2f');\r\n\r\n } else {\r\n format = d3.format(',.2f');\r\n }\r\n return format(value);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n function getUnitsChartConfig(chartId, data) {\r\n //console.log('chartid', chartId);\r\n return {\r\n bindto: chartId,\r\n size: {\r\n height: 210,\r\n },\r\n data: {\r\n x: 'x',\r\n columns: data,\r\n type: 'spline',\r\n axes: axes2,\r\n },\r\n color: {\r\n pattern: ['#1AB394']\r\n },\r\n axis: {\r\n x: {\r\n type: 'timeseries',\r\n tick: {\r\n format: '%m-%d',\r\n }\r\n },\r\n y: {\r\n tick: {\r\n format: d3.format(\".0f\")\r\n }\r\n },\r\n },\r\n tooltip: {\r\n format: {\r\n title: function (d) {\r\n var toFormat = '%e %B %Y';\r\n if (self.timerange == 'year')\r\n toFormat = '%e %B %Y';\r\n\r\n var format = d3.time.format(toFormat);\r\n return format(d);\r\n },\r\n value: function (value, ratio, id) {\r\n //console.log('value', value, 'ratio', ratio, 'id', id);\r\n //console.log('this', this);\r\n var format = d3.format(',.2f');\r\n \r\n return format(value);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n self.updateChartType = function (type) {\r\n self.selectedType = type;\r\n self.pricesChart.transform(type);\r\n }\r\n\r\n\r\n\r\n function parseChartData(chartData, chart) {\r\n if (chartData == undefined || chartData.length == 0) return [];\r\n var data = [];\r\n var competitors = [];\r\n var dates = ['x'];\r\n var series = [];\r\n\r\n //obtengo competitors\r\n //var competitor = '';\r\n angular.forEach(chartData, function (d) {\r\n if (competitors.indexOf(d.competitor) == -1) {\r\n competitors.push(d.competitor);\r\n //competitor = d.competitor;\r\n }\r\n });\r\n\r\n\r\n //obtengo dates\r\n var date = '';\r\n angular.forEach(chartData, function (d) {\r\n var tempdate = new Date(d.observedDate);\r\n var currDate = tempdate.getFullYear() + '-' + (tempdate.getMonth() + 1) + '-' + tempdate.getDate();\r\n if (dates.indexOf(currDate) == -1) {\r\n dates.push(currDate);\r\n }\r\n });\r\n\r\n function competitorInSerie(competitor) {\r\n for (var i = 0; i < series.length; i++) {\r\n if (series[i][0] == competitor)\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n //armo las series\r\n var serie = [];\r\n angular.forEach(chartData, function (d) {\r\n if (!competitorInSerie(d.competitor)) {\r\n\r\n serie = [];\r\n serie.push(d.competitor);\r\n serie.push(d[chart]);\r\n competitor = d.competitor;\r\n series.push(serie);\r\n }\r\n else {\r\n serie.push(d[chart]);\r\n }\r\n });\r\n data.push(dates);\r\n angular.forEach(series, function (s) {\r\n data.push(s);\r\n });\r\n\r\n return data;\r\n }\r\n function parseUnitsChartData(chartData, chart) {\r\n if (chartData == undefined || chartData.length == 0) return [];\r\n var data = [];\r\n var volumes = [];\r\n var dates = ['x'];\r\n var series = [];\r\n\r\n //obtengo volumenes\r\n angular.forEach(chartData, function (d) {\r\n if (volumes.indexOf(d.volume) == -1) {\r\n volumes.push(d.volume);\r\n }\r\n });\r\n\r\n //obtengo dates\r\n var date = '';\r\n angular.forEach(chartData, function (d) {\r\n var tempdate = new Date(d.date);\r\n var currDate = tempdate.getFullYear() + '-' + (tempdate.getMonth() + 1) + '-' + tempdate.getDate();\r\n if (dates.indexOf(currDate) == -1) {\r\n dates.push(currDate);\r\n }\r\n });\r\n\r\n function volumesInSerie(volume) {\r\n for (var i = 0; i < series.length; i++) {\r\n if (series[i][0] == volume)\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n //armo las series\r\n var serie = [];\r\n serie.push(translations.UnitSales);\r\n\r\n angular.forEach(chartData, function (d) {\r\n if (!volumesInSerie(d.volume / 1000)) {\r\n serie.push(d.volume / 1000);\r\n }\r\n });\r\n series.push(serie);\r\n data.push(dates);\r\n angular.forEach(series, function (s) {\r\n data.push(s);\r\n });\r\n\r\n return data;\r\n }\r\n \r\n var translations = null;\r\n var axes = {};\r\n var axes2 = {};\r\n\r\n function init() {\r\n\r\n $translate([\"Price\", \"UnitSales\"])\r\n .then(function (all) {\r\n translations = all;\r\n \r\n axes[translations.Price] = 'y';\r\n axes2[translations.UnitSales] = 'y';\r\n\r\n var priceHistory = mix();\r\n var volumesChart = getUnitsChart();\r\n\r\n self.pricesChartData = parseChartData(priceHistory, 'price');\r\n self.unitsChartData = parseUnitsChartData(volumesChart, 'units');\r\n //console.log('dataparsed', self.pricesChartData); \r\n //self.pricesChartData = parseChartData(pricesChartData, 'price');\r\n\r\n self.updateCharts();\r\n });\r\n }\r\n\r\n\r\n //Esta funcion se encarga de mezclar los priceHistory con los unitsSales\r\n //Basicamente, todos los registros tienen que contar con TODAS las fechas de muestreo\r\n // Si una serie no tiene valor en una fecha determinada, le asigna como valor un null\r\n function mix() {\r\n var priceHistory = angular.copy(self.data.priceHistory);\r\n\r\n if (priceHistory) {\r\n\r\n for (var i = 0; i < priceHistory.length; i++) {\r\n priceHistory[i].competitor = translations.Price;\r\n priceHistory[i].price = priceHistory[i].price; //ian.abbreviateNumberThousand(priceHistory[i].price, 2, '');\r\n\r\n //var dateExists = false;\r\n //for (var j = 0; j < volumes.length; j++) {\r\n // if (volumes[j].date == priceHistory.observedDate) {\r\n // dateExists = true;\r\n // break;\r\n // }\r\n //}\r\n\r\n //if (!dateExists) {\r\n // volumes.push({\r\n // date: priceHistory[i].observedDate,\r\n // competitor: translations.UnitSales,\r\n // volume: null\r\n // })\r\n //}\r\n }\r\n\r\n //for (var i = 0; i < volumes.length; i++) {\r\n // var units = volumes[i];\r\n // var dateExists = false;\r\n\r\n // for (var j = 0; j < priceHistory.length; j++) {\r\n // if (priceHistory[j].observedDate == units.date) {\r\n // dateExists = true;\r\n // break;\r\n // }\r\n // }\r\n // if (!dateExists) {\r\n // priceHistory.push({\r\n // observedDate: volumes[i].date,\r\n // price: null,\r\n // competitor: translations.Price\r\n // })\r\n // }\r\n //}\r\n\r\n\r\n priceHistory.sort(function (a, b) {\r\n return a.observedDate < b.observedDate;\r\n });\r\n //volumes.sort(function (a, b) {\r\n // return a.date < b.date;\r\n //});\r\n\r\n //for (var i = 0; i < volumes.length; i++) {\r\n // var units = volumes[i];\r\n // priceHistory.push({\r\n // competitor: translations.UnitSales,\r\n // observedDate: units.date,\r\n // price: units.volume\r\n // });\r\n //}\r\n console.log('new price history', priceHistory);\r\n\r\n\r\n }\r\n\r\n return priceHistory;\r\n\r\n }\r\n\r\n function getUnitsChart() {\r\n var volumes = angular.copy(self.data.unitsData.volumes);\r\n //volumes[i].volume = translations.UnitSales;\r\n\r\n if (volumes) {\r\n\r\n volumes.sort(function (a, b) {\r\n return a.date < b.date;\r\n });\r\n\r\n \r\n console.log('new volumes', volumes);\r\n\r\n\r\n }\r\n\r\n return volumes;\r\n\r\n }\r\n\r\n\r\n init();\r\n\r\n}\r\n\r\nangular.module('prisma').component('priceEvolutionComponent', {\r\n templateUrl: 'app/shared_logic/components/priceEvolution/priceEvolution.component.html',\r\n bindings: {\r\n data: '=',\r\n id: '='\r\n //ngModel:'='\r\n },\r\n\r\n controller: _controller\r\n});","var _controller = function ($scope, $attrs, $filter, $timeout, $rootScope, priceService, homeService) {\r\n var self = this;\r\n //console.log('suggestions', self);\r\n\r\n\r\n}\r\n\r\nangular.module('prisma').component('notifications', {\r\n templateUrl: 'app/shared_logic/components/notifications/notifications.component.html',\r\n bindings: {\r\n price: '<'\r\n },\r\n\r\n controller: _controller\r\n});\r\n\r\n\r\n","var _controller = function ($scope, $attrs, $filter, $translate, $timeout, $rootScope, priceService, homeService) {\r\n var self = this;\r\n //console.log('suggestions', self);\r\n\r\n\r\n}\r\n\r\nangular.module('prisma').component('marginsAndCosts', {\r\n templateUrl: 'app/shared_logic/components/marginsAndCosts/marginsAndCosts.component.html',\r\n bindings: {\r\n price: '<'\r\n },\r\n\r\n controller: _controller\r\n});\r\n\r\n\r\n","angular.module('prisma').component('listStoreComponent', {\r\n templateUrl: 'app/shared_logic/components/listStoreComponent/listStore.Component.html',\r\n controller: planogramShelfController,\r\n bindings: {\r\n isExcluded: '=',\r\n seletedstores: '=',\r\n }\r\n});\r\n\r\n\r\nfunction planogramShelfController($scope, $state, $timeout, $stateParams, $translate, authService, spaceService) {\r\n var self = this;\r\n self.isFocus = false;\r\n self.focus = function () {\r\n self.isFocus = true;\r\n }\r\n console.log('planogram in listStores', self)\r\n self.blur = function () {\r\n self.isFocus = false;\r\n }\r\n\r\n function init() {\r\n spaceService.stores.getStores(false).then(function (stores) {\r\n self.stores = stores;\r\n })\r\n };\r\n\r\n init()\r\n};","var _controller = function ($scope, $attrs, $filter, $timeout, $rootScope, $translate, homeService, adminService) {\r\n var self = this;\r\n\r\n self.item = self.params.itemForModal;\r\n self.clusterId = self.params.selectedClusterForModal;\r\n\r\n self.timerange = 'week';\r\n self.hideBoxes = false;\r\n self.compareYtd = null;\r\n\r\n self.sameStores = true;\r\n self.type = '3';\r\n\r\n self.changeTimeRange = function (timerange) {\r\n self.timerange = timerange;\r\n self.updateChart();\r\n }\r\n\r\n\r\n self.sameStoreChanges = function (value) {\r\n //console.log('value', value);\r\n loadData(value);\r\n }\r\n\r\n self.timeTypeChange = function () {\r\n loadBoxData(self.sameStores, self.type);\r\n\r\n //loadData(self.sameStores);\r\n }\r\n\r\n self.getVsPrevious = function () {\r\n if (self.type == '2') {\r\n return translations.VsPrevYear;\r\n }\r\n\r\n if (self.type == '1') {\r\n var rv = 'vs ';\r\n\r\n var currentDate = new Date();\r\n var month = new Date(currentDate.setMonth(currentDate.getMonth() - 1)).getMonth();\r\n var year = new Date(currentDate.setMonth(currentDate.getMonth() - 1)).getFullYear();\r\n\r\n rv += $rootScope.monthNames[month - 1] + ' ' + year;\r\n\r\n return rv;\r\n };\r\n\r\n if (self.type == '3') {\r\n var rv = 'vs ';\r\n\r\n var currentDate = new Date();\r\n var month = new Date(currentDate.setMonth(currentDate.getMonth() - 12)).getMonth();\r\n var year = new Date(currentDate.setMonth(currentDate.getMonth() - 12)).getFullYear();\r\n\r\n rv += $rootScope.monthNames[month - 1] + ' ' + year;\r\n\r\n return rv;\r\n }\r\n }\r\n\r\n //boxes\r\n self.getMainBoxTitle = function (box) {\r\n var rv = \"\";\r\n switch (box) {\r\n case \"sales\": rv = translations.SALES; break;\r\n case \"units\": rv = translations.UNITS; break;\r\n case \"cost\": rv = translations.COST; break;\r\n case \"margin\": rv = translations.MARGIN; break;\r\n }\r\n\r\n return rv;\r\n }\r\n self.getBoxCompareValue = function (box) {\r\n if (box && self.compareYtd) {\r\n var value = $filter('percentage')(self.compareYtd[box + 'PyDelta'], 1);\r\n\r\n return self.compareYtd[box + 'PyDelta'] != 0 ? value : 'N/A';\r\n }\r\n }\r\n self.getBoxCompareTooltip = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('number') : $filter('currency');\r\n\r\n if (self.boxesCompareTo === 'Month') {\r\n value = box === 'units' ? filter(self.compareMonth[box + 'Py'], 0) : filter(self.compareMonth[box + 'Py'], '$', 0);\r\n }\r\n else {\r\n value = box === 'units' ? filter(self.compareYtd[box + 'Py'], 0) : filter(self.compareYtd[box + 'Py'], '$', 0);\r\n }\r\n\r\n return value;\r\n }\r\n }\r\n\r\n self.getMainBoxValueGoal = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('abbreviate') : $filter('abbreviate');\r\n var prefix = box === 'units' ? null : \"$\";\r\n var decimals = box === 'units' ? 0 : 2;\r\n\r\n //if (self.boxesCompareTo === 'Month') {\r\n // value = filter(self.compareMonth[box], decimals, prefix);\r\n //}\r\n //else if (self.boxesCompareTo === 'Goal') {\r\n filter = $filter('percentage');\r\n value = filter(self.compareYtd[box + 'GoalGapP'], 2);\r\n //}\r\n //else {\r\n // value = filter(self.compareYtd[box + 'Ytd'], decimals, prefix);\r\n //}\r\n\r\n return self.compareYtd[box + 'GoalGapP'] != 0 ? value : 'N/A';\r\n }\r\n }\r\n self.getMainBoxTooltip = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('number') : $filter('currency');\r\n\r\n if (self.boxesCompareTo === 'Month') {\r\n value = box === 'units' ? filter(self.compareMonth[box], 0) : filter(self.compareMonth[box], '$', 0);\r\n }\r\n else {\r\n value = box === 'units' ? filter(self.compareYtd[box + 'Ytd'], 0) : filter(self.compareYtd[box + 'Ytd'], '$', 0);\r\n }\r\n\r\n return value;\r\n }\r\n }\r\n self.isMainBoxGoalSignPositive = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n return self.compareYtd[box + 'GoalGapP'] > 0;\r\n }\r\n }\r\n\r\n self.getMainBoxValueYTD = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('abbreviate') : $filter('abbreviate');\r\n var prefix = box === 'units' ? null : \"$\";\r\n var decimals = box === 'units' ? 0 : 2;\r\n\r\n value = filter(self.compareYtd[box + 'Ytd'], decimals, prefix);\r\n }\r\n\r\n return value;\r\n }\r\n self.getMainBoxValueAnual = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('abbreviate') : $filter('abbreviate');\r\n var prefix = box === 'units' ? null : \"$\";\r\n var decimals = box === 'units' ? 0 : 2;\r\n\r\n value = filter(self.compareYtd[box + 'GoalTotal'], decimals, prefix);\r\n\r\n return self.compareYtd[box + 'GoalTotal'] != 0 ? value : 'N/A';\r\n }\r\n }\r\n self.getMainBoxAnualTooltip = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('number') : $filter('currency');\r\n\r\n if (self.boxesCompareTo === 'Month') {\r\n value = box === 'units' ? filter(self.compareMonth[box + 'GoalTotal'], 0) : filter(self.compareMonth[box + 'GoalTotal'], '$', 0);\r\n }\r\n else {\r\n value = box === 'units' ? filter(self.compareYtd[box + 'GoalTotal'], 0) : filter(self.compareYtd[box + 'GoalTotal'], '$', 0);\r\n }\r\n\r\n }\r\n return value;\r\n }\r\n\r\n self.getActualYtdValue = function (box) {\r\n if (self.compareYtd != null) {\r\n var value = null;\r\n var filter = box === 'units' ? $filter('abbreviate') : $filter('abbreviate');\r\n\r\n value = box === 'units' ? filter(self.compareYtd[box + 'Goal'], 0) : filter(self.compareYtd[box + 'Goal'], '$', 0);\r\n\r\n return value;\r\n }\r\n }\r\n self.getActualYtdTooltipValue = function (box) {\r\n if (self.compareYtd != null) {\r\n var value = null;\r\n var filter = box === 'units' ? $filter('number') : $filter('currency');\r\n\r\n value = box === 'units' ? filter(self.compareYtd[box + 'Goal'], 0) : filter(self.compareYtd[box + 'Goal'], '$', 0);\r\n\r\n return value;\r\n }\r\n }\r\n\r\n self.getProjectedYtdValue = function (box) {\r\n if (self.compareYtd != null) {\r\n var value = null;\r\n var filter = box === 'units' ? $filter('abbreviate') : $filter('abbreviate');\r\n\r\n value = box === 'units' ? filter((self.compareYtd[box + 'Projected'] + self.compareYtd[box + 'Ytd']), 0) : filter((self.compareYtd[box + 'Projected'] + self.compareYtd[box + 'Ytd']), '$', 0);\r\n\r\n return self.compareYtd[box + 'Projected'] != 0 ? value : 'N/A';\r\n }\r\n }\r\n self.getProjectedYtdTooltipValue = function (box) {\r\n if (self.compareYtd != null) {\r\n var value = null;\r\n var filter = box === 'units' ? $filter('number') : $filter('currency');\r\n\r\n value = box === 'units' ? filter((self.compareYtd[box + 'Projected'] + self.compareYtd[box + 'Ytd']), 0) : filter((self.compareYtd[box + 'Projected'] + self.compareYtd[box + 'Ytd']), '$', 0);\r\n\r\n return value;\r\n }\r\n }\r\n self.projectedPositive = function (box) {\r\n if (box && self.compareYtd) {\r\n var projected = self.compareYtd[box + 'Projected'] + self.compareYtd[box + 'Ytd'];\r\n var annual = self.compareYtd[box + 'GoalTotal'];\r\n\r\n if (box != 'cost')\r\n return projected >= annual;\r\n else\r\n return projected < annual;\r\n }\r\n }\r\n\r\n self.getBoxCompareIcon = function (box) {\r\n\r\n if (box && self.compareYtd) {\r\n\r\n var delta = null;\r\n var cls = '';\r\n\r\n delta = self.compareYtd[box + 'PyDelta'];\r\n\r\n if (box != 'cost') {\r\n if (!delta)\r\n cls = '';\r\n else if (delta > 0.005)\r\n cls = 'fa fa-level-up text-navy';\r\n else if (delta < -0.005)\r\n cls = 'fa fa-level-down text-danger';\r\n else\r\n cls = 'fa fa-anchor';\r\n }\r\n else {\r\n if (!delta)\r\n cls = '';\r\n else if (delta > 0.005)\r\n cls = 'fa fa-level-up text-danger';\r\n else if (delta < -0.005)\r\n cls = 'fa fa-level-down text-navy';\r\n else\r\n cls = 'fa fa-anchor';\r\n }\r\n\r\n\r\n return cls;\r\n }\r\n }\r\n self.isBoxSignPositive = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n\r\n value = self.compareYtd[box + 'PyDelta'];\r\n\r\n if (box == 'cost') {\r\n if (value <= 0)\r\n return true\r\n else\r\n return false;\r\n }\r\n else {\r\n if (value > 0)\r\n return true\r\n else\r\n return false;\r\n }\r\n }\r\n\r\n }\r\n\r\n self.toggleLegend = function (chart) {\r\n if (!chart.legend.visible) {\r\n chart.legend.show();\r\n chart.legend.visible = true;\r\n }\r\n else {\r\n chart.legend.hide();\r\n chart.legend.visible = false;\r\n }\r\n }\r\n self.updateBoxes = function (compareTo) {\r\n\r\n if (compareTo === 'Month') {\r\n findMonthToCompare(self.selectedMonth);\r\n }\r\n\r\n self.boxesCompareTo = compareTo;\r\n\r\n if (compareTo === 'Goal')\r\n renderGoalCharts();\r\n\r\n }\r\n\r\n\r\n function renderGoalCharts() {\r\n\r\n var boxes = ['sales', 'margin', 'units', 'cost'];\r\n\r\n angular.forEach(boxes, function (box) {\r\n\r\n var chart = c3.generate(getGoalChartTemplate(box));\r\n\r\n\r\n setTimeout(function () {\r\n chart.load({\r\n columns: [['objetivo', self.compareYtd[box + 'Goal']]],\r\n });\r\n }, 500);\r\n\r\n setTimeout(function () {\r\n chart.load({\r\n columns: [['actual', self.compareYtd[box + 'Ytd']],\r\n ['proyectado', self.compareYtd[box + 'Projected']]\r\n ],\r\n });\r\n chart.groups([['proyectado', 'actual']]);\r\n }, 1500);\r\n\r\n self[box + 'GoalChart'] = chart;\r\n });\r\n }\r\n function getGoalChartTemplate(box) {\r\n\r\n var template = {\r\n bindto: ian.format('#{0}GoalChart', box),\r\n data: {\r\n columns: [],\r\n type: 'bar',\r\n groups: [],\r\n colors: {\r\n actual: '#1f77b4',\r\n proyectado: '#aec7e8',\r\n objetivo: '#1ab394',\r\n },\r\n order: null\r\n },\r\n size: {\r\n height: 65,\r\n },\r\n bar: {\r\n width: 5\r\n },\r\n axis: {\r\n rotated: true,\r\n x: { show: false },\r\n y: { show: false }\r\n },\r\n tooltip: {\r\n show: true,\r\n format: {\r\n title: function (x) { return 'vs Plan'; },\r\n value: function (value, ratio, id) {\r\n return box === 'units' ? $filter('abbreviate')(value, 0) : $filter('abbreviate')(value, '$', 0);\r\n }\r\n }\r\n },\r\n legend: {\r\n show: false\r\n }\r\n };\r\n\r\n return template;\r\n }\r\n\r\n\r\n function findMonthToCompare(month) {\r\n\r\n var rv = null;\r\n angular.forEach(self.compareYtd.vsPriorYearByMonth, function (item) {\r\n if (item.month == month && item.year == self.compareYtd.currentYear) {\r\n rv = item;\r\n }\r\n });\r\n\r\n self.compareMonth = rv;\r\n\r\n return rv;\r\n }\r\n self.isLoadingChart = false;\r\n function loadChartData() {\r\n self.isLoadingChart = true;\r\n //Traigo data para el chart\r\n homeService.kpis.getItemDashboardItemCluster(self.item.categoryId, self.item.id, self.clusterId, self.sameStores)\r\n .then(function (prices) {\r\n self.prices = prices;\r\n self.isLoadingChart = false;\r\n\r\n self.priceDashboard = self.prices;\r\n\r\n self.updateChart();\r\n });\r\n }\r\n\r\n self.updateChart = function () {\r\n\r\n if (!self.prices || self.prices == null || self.prices == '')\r\n return;\r\n\r\n var xValues = [];\r\n\r\n if (self.timerange == 'week')\r\n xValues = self.prices.lastWeekXValues;\r\n else if (self.timerange == 'month')\r\n xValues = self.prices.lastMonthXValues;\r\n else\r\n xValues = self.prices.lastYearXValues;\r\n\r\n var series = ['sales', 'units', 'margin', 'price'];\r\n var axes = {\r\n sales: 'y',\r\n units: 'y',\r\n margin: 'y',\r\n price: 'y2'\r\n };\r\n\r\n var chartTypes = {\r\n price: 'line'\r\n };\r\n\r\n var chartColors = {\r\n sales: '#1ab394',\r\n units: '#1c84c6',\r\n margin: '#f8ac59',\r\n price: '#ED5565'\r\n };\r\n\r\n var extraColors = [];\r\n\r\n self.chart = c3.generate({\r\n bindto: '#saleschart_' + self.item.id,\r\n data: {\r\n json: xValues,\r\n keys: {\r\n x: 'dateString',\r\n value: series,\r\n },\r\n axes: axes,\r\n type: 'bar',\r\n types: chartTypes,\r\n //colors: chartColors\r\n },\r\n axis: {\r\n x: {\r\n type: 'timeseries',\r\n tick: {\r\n fit: true,\r\n format: function (x) {\r\n if (self.timerange == 'week') {\r\n return $rootScope.shortWeekDayNames[x.getDay()];\r\n } else if (self.timerange == 'month') {\r\n return x.getDate() + '-' + $rootScope.shortMonthNames[(x.getMonth())];\r\n } else if (self.timerange == 'year') {\r\n return x.getFullYear() + '-' + (x.getMonth() + 1);\r\n }\r\n }\r\n }\r\n },\r\n y: {\r\n tick: {\r\n format: d3.format(\"s\")\r\n }\r\n },\r\n y2: {\r\n show: true,\r\n label: 'Precio en $',\r\n tick: {\r\n format: d3.format('.1f')\r\n },\r\n min: 0\r\n }\r\n },\r\n tooltip: {\r\n format: {\r\n title: function (d) {\r\n var toFormat = '%B %d, %Y';\r\n if (self.timerange == 'year')\r\n toFormat = '%B %Y';\r\n\r\n var format = d3.time.format(toFormat);\r\n return format(d);\r\n },\r\n value: function (value, ratio, id) {\r\n var format = id === 'sales' || id === 'margin' || id === 'units' ? d3.format(',.0f') : d3.format(',.1f');\r\n return format(value);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function loadData() {\r\n\r\n var categoryId = 0;\r\n if (self.item && self.item.categoryId)\r\n categoryId = self.item.categoryId;\r\n\r\n loadChartData(self.sameStores, self.type);\r\n\r\n //traigo data para los boxes\r\n loadBoxData(self.sameStores, self.type);\r\n }\r\n\r\n self.isLoadingKPIs = false;\r\n function loadBoxData(withSameStores, type) {\r\n self.isLoadingKPIs = true;\r\n homeService.kpis.getKpiDashboardYTD(self.item.id, self.clusterId, withSameStores, type)\r\n .then(function (dashboardComparisonDto) {\r\n self.isLoadingKPIs = false;\r\n self.compareYtd = dashboardComparisonDto;\r\n self.updateBoxes('GoalTotal');\r\n });\r\n }\r\n\r\n var translations = null;\r\n function init() {\r\n\r\n\r\n $translate([\"SALES\", \"UNITS\", \"MARGIN\", \"COST\", \"VsPrevYear\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n loadData();\r\n });\r\n }\r\n\r\n init();\r\n\r\n\r\n}\r\n\r\nangular.module('prisma').component('kpiItemViewDefault', {\r\n templateUrl: 'app/shared_logic/components/kpiItemViewDefault/kpiItemviewdefault.component.html',\r\n bindings: {\r\n params: '='\r\n },\r\n\r\n controller: _controller\r\n});\r\n\r\n\r\n","var _controller = function ($scope, $attrs, $filter, $timeout, $rootScope, $translate, priceService, homeService, adminService) {\r\n var self = this;\r\n self.companyCode = companyJson.Erp.Implementation;\r\n self.timerange = 'week';\r\n self.hideBoxes = false;\r\n self.compareYtd = null;\r\n\r\n self.sameStores = true;\r\n self.type = '3';\r\n\r\n self.allPriceList = [{}];\r\n self.items = [{}];\r\n self.stores = [];\r\n self.brands = [];\r\n self.prices = [];\r\n self.volumes = []; \r\n self.volumesAnnual = []; \r\n self.selectedPriceZone = null;\r\n self.selectedStore = null;\r\n self.selectedPriceZoneName = '';\r\n self.itemName = \"\";\r\n self.itemCode = \"\";\r\n self.selectedCompetitorGroups = [];\r\n self.selectedBrands = [];\r\n self.competitorGroupsFilteredByParent = [];\r\n self.onlyMarkers = false;\r\n self.brandCriteria = false;\r\n self.competitorCriteria = true;\r\n\r\n self.changeItemSelected = function () {\r\n //console.log('item changed', self.selectedItem);\r\n }\r\n\r\n self.changeCompetitorGroup = function () {\r\n loadCompetitorPrices();\r\n }\r\n\r\n self.changeTimeRange = function (timerange) {\r\n self.timerange = timerange;\r\n //self.updateChart();\r\n }\r\n\r\n function loadCompetitorPrices() {\r\n //Cargo data de los competidores si es tengo algun competitor group seleccionado\r\n if (self.selectedCompetitorGroups.length > 0) {\r\n\r\n var competitorGroupIds = [];\r\n self.selectedCompetitorGroups.forEach(function (group) {\r\n competitorGroupIds.push(group.id);\r\n });\r\n\r\n var parameters = {\r\n itemId: self.price.itemId,\r\n priceListId: self.price.priceListId,\r\n type: self.timerange,\r\n onlyMarkers: self.onlyMarkers,\r\n competitorGroupIds: competitorGroupIds\r\n };\r\n\r\n priceService.decisions.getKPIDashboardCompetitorsPrices(parameters).then(function (competitorPrices) {\r\n self.competitorPrices = competitorPrices;\r\n if (competitorPrices.length > 0) {\r\n self.updateChart();\r\n }\r\n });\r\n }\r\n else {\r\n self.competitorPrices = [];\r\n self.updateChart();\r\n }\r\n\r\n }\r\n\r\n self.changeCompetitorGroupParents = function () {\r\n\r\n if (self.price.competitorGroupParents != null) {\r\n\r\n self.competitorGroupsFilteredByParent = [];\r\n angular.forEach(self.competitorGroups, function (competitorGroup) {\r\n angular.forEach(self.price.competitorGroupParents, function (competitorGroupParent) {\r\n if (competitorGroup.parentId == competitorGroupParent.id)\r\n self.competitorGroupsFilteredByParent.push(competitorGroup);\r\n })\r\n });\r\n\r\n //self.competitorGroupsFilteredByParent = ($filter('filter')(self.competitorGroups, { parentId: self.price.competitorGroupParents.id }));\r\n }\r\n else {\r\n self.selectedCompetitorGroups = [];\r\n self.competitorGroupsFilteredByParent = self.competitorGroups;\r\n self.price.competitorGroup = null;\r\n }\r\n }\r\n\r\n function loadCompetitorGroups() {\r\n\r\n var priceListId = 0\r\n if (self.selectedPriceZone != undefined)\r\n priceListId = self.selectedPriceZone.id;\r\n\r\n priceService.competitors.getCompetitorGroupsByPriceList(priceListId).then(function (compGroups) {\r\n self.competitorGroups = angular.copy(compGroups);\r\n self.competitorGroupsFilteredByParent = angular.copy(compGroups);\r\n })\r\n }\r\n\r\n function loadCompetitorGroupsParents() {\r\n var priceListId = 0\r\n if (self.selectedPriceZone != undefined)\r\n priceListId = self.selectedPriceZone.id;\r\n priceService.competitors.getCompetitorGroupsParentByPriceList(priceListId).then(function (compGroupsParents) {\r\n self.competitorGroupsParents = compGroupsParents;\r\n })\r\n }\r\n\r\n function loadItems(categoryId) {\r\n adminService.items.getItemsByCategory(categoryId).then(function (items) {\r\n self.items = items;\r\n\r\n for (var i = 0; i < items.length; i++) {\r\n if (items[i].id == self.price.itemId) {\r\n self.selectedItem = items[i];\r\n }\r\n }\r\n\r\n if (self.selectedItem == undefined) {\r\n self.selectedItem = items[0];\r\n }\r\n })\r\n }\r\n\r\n function loadStores() {\r\n adminService.stores.getStoresCombo().then(function (stores) {\r\n stores.unshift({id: -1, name: ' --- ', code: ' --- '});\r\n self.stores = stores;\r\n });\r\n }\r\n\r\n function loadBrands() {\r\n adminService.brands.getBrands().then(function (brands) {\r\n self.brands = brands;\r\n });\r\n }\r\n\r\n function loadPriceLists() {\r\n\r\n priceService.pricelists.getPriceLists().then(function (priceList) {\r\n self.allPriceList = priceList;\r\n\r\n var selected = false;\r\n for (i = 0; i < self.allPriceList.length; i++) {\r\n if (self.allPriceList[i].id == self.price.priceListId) {\r\n selected = true;\r\n self.setFilterPriceZone(self.allPriceList[i]);\r\n }\r\n }\r\n\r\n if (selected == false) {\r\n self.setFilterPriceZone(self.allPriceList[0]);\r\n }\r\n });\r\n }\r\n\r\n self.setFilterPriceZone = function (priceZone) {\r\n if (self.selectedPriceZone == priceZone) return;\r\n self.selectedPriceZone = priceZone;\r\n\r\n if (priceZone != null) {\r\n self.selectedPriceZoneName = priceZone.name;\r\n }\r\n else\r\n self.selectedPriceZoneName = '';\r\n\r\n //changePriceUsed();\r\n\r\n //loadCompetitorGroupPrices();\r\n loadCompetitorGroupsParents();\r\n loadCompetitorGroups();\r\n\r\n }\r\n\r\n self.sameStoreChanges = function (value) {\r\n //console.log('value', value);\r\n loadData(value);\r\n }\r\n\r\n self.timeTypeChange = function () {\r\n loadBoxData(self.sameStores, self.type);\r\n\r\n //loadData(self.sameStores);\r\n }\r\n\r\n self.getVsPrevious = function () {\r\n if (self.type == '2') {\r\n return translations.VsPrevYear;\r\n }\r\n\r\n if (self.type == '1') {\r\n var rv = 'vs ';\r\n\r\n var year = moment().format('YYYY');\r\n var month = moment().add(-2, 'month').format('MM');\r\n\r\n rv += $rootScope.monthNames[month - 1] + ' ' + year;\r\n\r\n return rv;\r\n };\r\n\r\n if (self.type == '3') {\r\n var rv = 'vs ';\r\n \r\n var year = moment().add(-1, 'year').format('YYYY');\r\n var month = moment().add(-1, 'month').format('MM');\r\n\r\n rv += $rootScope.monthNames[month - 1] + ' ' + year;\r\n\r\n return rv;\r\n }\r\n }\r\n\r\n //boxes\r\n self.getMainBoxTitle = function (box) {\r\n var rv = \"\";\r\n if(translations)\r\n switch (box) {\r\n case \"sales\": rv = translations.SALES; break;\r\n case \"units\": rv = translations.UNITS; break;\r\n case \"cost\": rv = translations.COST; break;\r\n case \"margin\": rv = translations.MARGIN; break;\r\n }\r\n\r\n return rv;\r\n }\r\n self.getBoxCompareValue = function (box) {\r\n if (box && self.compareYtd) {\r\n var value = $filter('percentage')(self.compareYtd[box + 'PyDelta'], 1);\r\n\r\n return self.compareYtd[box + 'PyDelta'] != 0 ? value : 'N/A';\r\n }\r\n }\r\n self.getBoxCompareTooltip = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('number') : $filter('currency');\r\n\r\n if (self.boxesCompareTo === 'Month') {\r\n value = box === 'units' ? filter(self.compareMonth[box + 'Py'], 0) : filter(self.compareMonth[box + 'Py'], '$', 0);\r\n }\r\n else {\r\n value = box === 'units' ? filter(self.compareYtd[box + 'Py'], 0) : filter(self.compareYtd[box + 'Py'], '$', 0);\r\n }\r\n\r\n return value;\r\n }\r\n }\r\n\r\n self.getMainBoxValueGoal = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('abbreviate') : $filter('abbreviate');\r\n var prefix = box === 'units' ? null : \"$\";\r\n var decimals = box === 'units' ? 0 : 2;\r\n\r\n //if (self.boxesCompareTo === 'Month') {\r\n // value = filter(self.compareMonth[box], decimals, prefix);\r\n //}\r\n //else if (self.boxesCompareTo === 'Goal') {\r\n filter = $filter('percentage');\r\n value = filter(self.compareYtd[box + 'GoalGapP'], 2);\r\n //}\r\n //else {\r\n // value = filter(self.compareYtd[box + 'Ytd'], decimals, prefix);\r\n //}\r\n\r\n return self.compareYtd[box + 'GoalGapP'] != 0 ? value : 'N/A';\r\n }\r\n }\r\n self.getMainBoxTooltip = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('number') : $filter('currency');\r\n\r\n if (self.boxesCompareTo === 'Month') {\r\n value = box === 'units' ? filter(self.compareMonth[box], 0) : filter(self.compareMonth[box], '$', 0);\r\n }\r\n else {\r\n value = box === 'units' ? filter(self.compareYtd[box + 'Ytd'], 0) : filter(self.compareYtd[box + 'Ytd'], '$', 0);\r\n }\r\n\r\n return value;\r\n }\r\n }\r\n self.isMainBoxGoalSignPositive = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n return self.compareYtd[box + 'GoalGapP'] > 0;\r\n }\r\n }\r\n\r\n self.getMainBoxValueYTD = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('abbreviate') : $filter('abbreviate');\r\n var prefix = box === 'units' ? null : \"$\";\r\n var decimals = box === 'units' ? 0 : 2;\r\n\r\n value = filter(self.compareYtd[box + 'Ytd'], decimals, prefix);\r\n }\r\n\r\n return value;\r\n }\r\n self.getMainBoxValueAnual = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('abbreviate') : $filter('abbreviate');\r\n var prefix = box === 'units' ? null : \"$\";\r\n var decimals = box === 'units' ? 0 : 2;\r\n\r\n value = filter(self.compareYtd[box + 'GoalTotal'], decimals, prefix);\r\n\r\n return self.compareYtd[box + 'GoalTotal'] != 0 ? value : 'N/A';\r\n }\r\n }\r\n self.getMainBoxAnualTooltip = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('number') : $filter('currency');\r\n\r\n if (self.boxesCompareTo === 'Month') {\r\n value = box === 'units' ? filter(self.compareMonth[box + 'GoalTotal'], 0) : filter(self.compareMonth[box + 'GoalTotal'], '$', 0);\r\n }\r\n else {\r\n value = box === 'units' ? filter(self.compareYtd[box + 'GoalTotal'], 0) : filter(self.compareYtd[box + 'GoalTotal'], '$', 0);\r\n }\r\n\r\n }\r\n return value;\r\n }\r\n\r\n self.getActualYtdValue = function (box) {\r\n if (self.compareYtd != null) {\r\n var value = null;\r\n var filter = box === 'units' ? $filter('abbreviate') : $filter('abbreviate');\r\n\r\n value = box === 'units' ? filter(self.compareYtd[box + 'Goal'], 0) : filter(self.compareYtd[box + 'Goal'], '$', 0);\r\n\r\n return value;\r\n }\r\n }\r\n self.getActualYtdTooltipValue = function (box) {\r\n if (self.compareYtd != null) {\r\n var value = null;\r\n var filter = box === 'units' ? $filter('number') : $filter('currency');\r\n\r\n value = box === 'units' ? filter(self.compareYtd[box + 'Goal'], 0) : filter(self.compareYtd[box + 'Goal'], '$', 0);\r\n\r\n return value;\r\n }\r\n }\r\n\r\n self.getProjectedYtdValue = function (box) {\r\n if (self.compareYtd != null) {\r\n var value = null;\r\n var filter = box === 'units' ? $filter('abbreviate') : $filter('abbreviate');\r\n\r\n value = box === 'units' ? filter((self.compareYtd[box + 'Projected'] + self.compareYtd[box + 'Ytd']), 0) : filter((self.compareYtd[box + 'Projected'] + self.compareYtd[box + 'Ytd']), '$', 0);\r\n\r\n return self.compareYtd[box + 'Projected'] != 0 ? value : 'N/A';\r\n }\r\n }\r\n self.getProjectedYtdTooltipValue = function (box) {\r\n if (self.compareYtd != null) {\r\n var value = null;\r\n var filter = box === 'units' ? $filter('number') : $filter('currency');\r\n\r\n value = box === 'units' ? filter((self.compareYtd[box + 'Projected'] + self.compareYtd[box + 'Ytd']), 0) : filter((self.compareYtd[box + 'Projected'] + self.compareYtd[box + 'Ytd']), '$', 0);\r\n\r\n return value;\r\n }\r\n }\r\n self.projectedPositive = function (box) {\r\n if (box && self.compareYtd) {\r\n var projected = self.compareYtd[box + 'Projected'] + self.compareYtd[box + 'Ytd'];\r\n var annual = self.compareYtd[box + 'GoalTotal'];\r\n\r\n if (box != 'cost')\r\n return projected >= annual;\r\n else\r\n return projected < annual;\r\n }\r\n }\r\n\r\n self.getBoxCompareIcon = function (box) {\r\n\r\n if (box && self.compareYtd) {\r\n\r\n var delta = null;\r\n var cls = '';\r\n\r\n delta = self.compareYtd[box + 'PyDelta'];\r\n\r\n if (box != 'cost') {\r\n if (!delta)\r\n cls = '';\r\n else if (delta > 0.005)\r\n cls = 'fa fa-level-up text-navy';\r\n else if (delta < -0.005)\r\n cls = 'fa fa-level-down text-danger';\r\n else\r\n cls = 'fa fa-anchor';\r\n }\r\n else {\r\n if (!delta)\r\n cls = '';\r\n else if (delta > 0.005)\r\n cls = 'fa fa-level-up text-danger';\r\n else if (delta < -0.005)\r\n cls = 'fa fa-level-down text-navy';\r\n else\r\n cls = 'fa fa-anchor';\r\n }\r\n\r\n\r\n return cls;\r\n }\r\n }\r\n self.isBoxSignPositive = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n\r\n value = self.compareYtd[box + 'PyDelta'];\r\n\r\n if (box == 'cost') {\r\n if (value <= 0)\r\n return true\r\n else\r\n return false;\r\n }\r\n else {\r\n if (value > 0)\r\n return true\r\n else\r\n return false;\r\n }\r\n }\r\n\r\n }\r\n\r\n self.toggleLegend = function (chart) {\r\n if (!chart.legend.visible) {\r\n chart.legend.show();\r\n chart.legend.visible = true;\r\n }\r\n else {\r\n chart.legend.hide();\r\n chart.legend.visible = false;\r\n }\r\n }\r\n self.updateBoxes = function (compareTo) {\r\n\r\n if (compareTo === 'Month') {\r\n findMonthToCompare(self.selectedMonth);\r\n }\r\n\r\n self.boxesCompareTo = compareTo;\r\n\r\n if (compareTo === 'Goal')\r\n renderGoalCharts();\r\n\r\n }\r\n\r\n\r\n function renderGoalCharts() {\r\n\r\n var boxes = ['sales', 'margin', 'units', 'cost'];\r\n\r\n angular.forEach(boxes, function (box) {\r\n\r\n var chart = c3.generate(getGoalChartTemplate(box));\r\n\r\n\r\n setTimeout(function () {\r\n chart.load({\r\n columns: [['objetivo', self.compareYtd[box + 'Goal']]],\r\n });\r\n }, 500);\r\n\r\n setTimeout(function () {\r\n chart.load({\r\n columns: [['actual', self.compareYtd[box + 'Ytd']],\r\n ['proyectado', self.compareYtd[box + 'Projected']]\r\n ],\r\n });\r\n chart.groups([['proyectado', 'actual']]);\r\n }, 1500);\r\n\r\n self[box + 'GoalChart'] = chart;\r\n });\r\n }\r\n function getGoalChartTemplate(box) {\r\n\r\n var template = {\r\n bindto: ian.format('#{0}GoalChart', box),\r\n data: {\r\n columns: [],\r\n type: 'bar',\r\n groups: [],\r\n colors: {\r\n actual: '#1f77b4',\r\n proyectado: '#aec7e8',\r\n objetivo: '#1ab394',\r\n },\r\n order: null\r\n },\r\n size: {\r\n height: 65,\r\n },\r\n bar: {\r\n width: 5\r\n },\r\n axis: {\r\n rotated: true,\r\n x: { show: false },\r\n y: { show: false }\r\n },\r\n tooltip: {\r\n show: true,\r\n format: {\r\n title: function (x) { return 'vs Plan'; },\r\n value: function (value, ratio, id) {\r\n return box === 'units' ? $filter('abbreviate')(value, 0) : $filter('abbreviate')(value, '$', 0);\r\n }\r\n }\r\n },\r\n legend: {\r\n show: false\r\n }\r\n };\r\n\r\n return template;\r\n }\r\n\r\n\r\n function findMonthToCompare(month) {\r\n\r\n var rv = null;\r\n angular.forEach(self.compareYtd.vsPriorYearByMonth, function (item) {\r\n if (item.month == month && item.year == self.compareYtd.currentYear) {\r\n rv = item;\r\n }\r\n });\r\n\r\n self.compareMonth = rv;\r\n\r\n return rv;\r\n }\r\n self.isLoadingChart = false;\r\n function loadChartData() {\r\n self.isLoadingChart = true;\r\n //Traigo data para el chart\r\n priceService.decisions.getPriceDashboardItemPriceList(self.price.subCategoryId, self.price.itemId, self.price.priceListId, self.sameStores)\r\n .then(function (prices) {\r\n self.prices = prices;\r\n self.isLoadingChart = false;\r\n\r\n self.priceDashboard = self.prices;\r\n\r\n self.updateChart();\r\n });\r\n }\r\n\r\n self.competitorPrices = [];\r\n\r\n\r\n self.updateChart = function () {\r\n\r\n if (!self.prices || self.prices == null || self.prices == '')\r\n return;\r\n\r\n var xValues = [];\r\n\r\n if (self.timerange == 'week')\r\n xValues = self.prices.lastWeekXValues;\r\n else if (self.timerange == 'month')\r\n xValues = self.prices.lastMonthXValues;\r\n else\r\n xValues = self.prices.lastYearXValues;\r\n\r\n var series = ['sales', 'units', 'margin', 'price'];\r\n var axes = {\r\n sales: 'y',\r\n units: 'y',\r\n margin: 'y',\r\n price: 'y2'\r\n };\r\n\r\n var chartTypes = {\r\n price: 'line'\r\n };\r\n\r\n var chartColors = {\r\n sales: '#1ab394',\r\n units: '#1c84c6',\r\n margin: '#f8ac59',\r\n price: '#ED5565'\r\n };\r\n\r\n var extraColors = [];\r\n\r\n if (self.competitorPrices.length > 0) {\r\n self.selectedCompetitorGroups.forEach(function (group) {\r\n series.push(group.name);\r\n axes[group.name] = 'y2';\r\n chartTypes[group.name] = 'line';\r\n\r\n self.competitorPrices.forEach(function (competitorPrice) {\r\n if (competitorPrice.competitorGroupId == group.id) {\r\n\r\n var newCompetitorPrice = {\r\n dateString: competitorPrice.dateString,\r\n dataType: 'CompetitorsPrice'\r\n };\r\n newCompetitorPrice[group.name] = competitorPrice.price;\r\n xValues.push(newCompetitorPrice);\r\n\r\n }\r\n });\r\n });\r\n }\r\n\r\n self.chart = c3.generate({\r\n bindto: '#saleschart_' + self.price.priceId,\r\n data: {\r\n json: xValues,\r\n keys: {\r\n x: 'dateString',\r\n value: series,\r\n },\r\n axes: axes,\r\n type: 'bar',\r\n types: chartTypes,\r\n //colors: chartColors\r\n },\r\n axis: {\r\n x: {\r\n type: 'timeseries',\r\n tick: {\r\n fit: true,\r\n format: function (x) {\r\n if (self.timerange == 'week') {\r\n return $rootScope.shortWeekDayNames[x.getDay()];\r\n } else if (self.timerange == 'month') {\r\n return x.getDate() + '-' + $rootScope.shortMonthNames[(x.getMonth())];\r\n } else if (self.timerange == 'year') {\r\n return x.getFullYear() + '-' + (x.getMonth() + 1);\r\n }\r\n }\r\n }\r\n },\r\n y: {\r\n tick: {\r\n format: d3.format(\"s\")\r\n }\r\n },\r\n y2: {\r\n show: true,\r\n label: 'Precio en $',\r\n tick: {\r\n format: d3.format('.1f')\r\n },\r\n min: 0\r\n }\r\n },\r\n tooltip: {\r\n format: {\r\n title: function (d) {\r\n var toFormat = '%B %d, %Y';\r\n if (self.timerange == 'year')\r\n toFormat = '%B %Y';\r\n\r\n var format = d3.time.format(toFormat);\r\n return format(d);\r\n },\r\n value: function (value, ratio, id) {\r\n var format = id === 'sales' || id === 'margin' || id === 'units' ? d3.format(',.0f') : d3.format(',.1f');\r\n return format(value);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function loadData() {\r\n\r\n var categoryId = 0;\r\n if (self.price && self.price.item && self.price.subCategoryId)\r\n categoryId = self.price.subCategoryId;\r\n\r\n loadItems(categoryId);\r\n\r\n loadStores();\r\n\r\n loadBrands();\r\n\r\n loadPriceLists();\r\n\r\n loadChartData(self.sameStores, self.type);\r\n\r\n //traigo data para los boxes\r\n loadBoxData(self.sameStores, self.type);\r\n\r\n getVolumeMeasurement(function (data) {\r\n self.volumes = data;\r\n self.updateChartVolume();\r\n });\r\n\r\n getVolumeMeasurementAnnual(function (data) {\r\n self.volumesAnnual = data;\r\n self.updateChartVolumeAnnual();\r\n });\r\n\r\n }\r\n\r\n self.isLoadingKPIs = false;\r\n function loadBoxData(withSameStores, type) {\r\n self.isLoadingKPIs = true;\r\n priceService.decisions.getKpiDashboardYTD(self.price.itemId, self.price.priceListId, withSameStores, type)\r\n .then(function (dashboardComparisonDto) {\r\n self.isLoadingKPIs = false;\r\n self.compareYtd = dashboardComparisonDto;\r\n self.updateBoxes('GoalTotal');\r\n });\r\n }\r\n\r\n var translations = null;\r\n function init() {\r\n\r\n \r\n $translate([\"SALES\", \"UNITS\", \"MARGIN\", \"COST\", \"VsPrevYear\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n loadData();\r\n });\r\n }\r\n\r\n init();\r\n\r\n self.updateChartVolume = function () {\r\n c3.generate({\r\n bindto: \"#volumeMeasurementChart_\" + self.price.priceId,\r\n data: {\r\n x: 'x',\r\n \"columns\": self.volumes,\r\n empty: { label: { text: \"Sin datos\" } },\r\n type: 'bar',\r\n colors: {\r\n 'units': '#FDC200',\r\n }\r\n },\r\n axis: {\r\n x: {\r\n type: 'category',\r\n //tick: {\r\n // rotate: 0,\r\n // multiline: false,\r\n // width: '1px',\r\n\r\n //},\r\n\r\n },\r\n \r\n },\r\n tooltip: {\r\n format: {\r\n title: function (index) {\r\n if (self.volumes[0]) {\r\n return self.volumes[0][index + 1];\r\n }\r\n },\r\n value: function (value, ratio, id) {\r\n var newValue = value ;\r\n return newValue;\r\n }\r\n }\r\n }\r\n\r\n });\r\n }\r\n self.updateChartVolumeAnnual = function () {\r\n c3.generate({\r\n bindto: \"#volumeMeasurementAnnualChart_\" + self.price.priceId,\r\n data: {\r\n x: 'x',\r\n \"columns\": self.volumesAnnual,\r\n // ['x', self.volumesAnnual],\r\n // ['units', self.volumesAnnual[1]],\r\n // ['units2', self.volumesAnnual[2]]\r\n //],\r\n empty: { label: { text: \"Sin datos\" } },\r\n type: 'bar',\r\n types: { units : 'bar', units2: 'area',},\r\n colors: {\r\n 'units': '#FDC200',\r\n 'units2': 'gray',\r\n }\r\n },\r\n axis: {\r\n x: {\r\n type: 'category',\r\n },\r\n\r\n },\r\n tooltip: {\r\n format: {\r\n title: function (index) {\r\n if (self.volumes[0]) {\r\n return self.volumes[0][index + 1];\r\n }\r\n },\r\n value: function (value, ratio, id) {\r\n var newValue = value;\r\n return newValue;\r\n }\r\n }\r\n }\r\n\r\n });\r\n }\r\n\r\n function getVolumeMeasurement(callback) {\r\n self.isLoadingChart = true;\r\n priceService.decisions.getVolumeMeasurement_OXXO(self.price.itemId,0).then(function (volumes) {\r\n self.isLoadingChart = false;\r\n if (volumes == null || volumes== '') {\r\n callback([]);\r\n }\r\n \r\n parseData(volumes, callback);\r\n \r\n });\r\n }\r\n function getVolumeMeasurementAnnual(callback) {\r\n self.isLoadingChart = true;\r\n priceService.decisions.getVolumeMeasurementAnnual_OXXO(self.price.itemId, 0).then(function (volumesAnnual) {\r\n self.isLoadingChart = false;\r\n if (volumesAnnual == null || volumesAnnual == '') {\r\n callback([]);\r\n }\r\n\r\n parseDataAnnual(volumesAnnual, callback);\r\n\r\n });\r\n }\r\n function parseData(volumes, callback) {\r\n var valueToPush = new Array();\r\n //serie para el eje x, distinct de fechas\r\n var datesArray = volumes.reduce(function (a, d) {\r\n if (a.indexOf(d.dayMonth) === -1) {\r\n a.push(d.dayMonth);\r\n }\r\n return a;\r\n }, ['x']);\r\n\r\n var units = [];\r\n units.push('units');\r\n for (i = 1; i < datesArray.length; i++) {\r\n \r\n var volumeDate = volumes.find(cd => {\r\n return cd.dayMonth == datesArray[i];\r\n })\r\n if (volumeDate) {\r\n units.push(volumeDate.totalUnits);\r\n }\r\n \r\n }\r\n valueToPush[0] = datesArray;\r\n valueToPush[1] = units;\r\n callback(valueToPush);\r\n }\r\n function parseDataAnnual(volumesAnnual, callback) {\r\n var valueToPush = new Array();\r\n //serie para el eje x, distinct de fechas\r\n var datesArray = volumesAnnual.reduce(function (a, d) {\r\n if (a.indexOf(d.monthYear) === -1) {\r\n a.push(d.monthYear);\r\n }\r\n return a;\r\n }, ['x']);\r\n\r\n var units = [];\r\n units.push('units');\r\n var units2 = [];\r\n units2.push('units2');\r\n for (i = 1; i < datesArray.length; i++) {\r\n\r\n var volumeDate = volumesAnnual.find(cd => {\r\n return cd.monthYear == datesArray[i];\r\n })\r\n if (volumeDate) {\r\n units.push(volumeDate.totalUnits);\r\n var newVal = (volumeDate.totalUnits + 5000);\r\n units2.push(newVal);\r\n }\r\n\r\n }\r\n valueToPush[0] = datesArray;\r\n valueToPush[1] = units;\r\n valueToPush[2] = units2;\r\n callback(valueToPush);\r\n }\r\n}\r\n\r\nangular.module('prisma').component('kpiItemView', {\r\n templateUrl: 'app/shared_logic/components/kpiItemview/kpiItemview.component.html',\r\n bindings: {\r\n price: '<'\r\n },\r\n\r\n controller: _controller\r\n});\r\n\r\n\r\n","var _controller = function ($scope, $attrs, $filter, $timeout, $rootScope, priceService, homeService) {\r\n var self = this;\r\n console.log('self', self);\r\n self.url = self.resolve.params.url;\r\n}\r\n\r\nangular.module('prisma').component('displayPhoto', {\r\n templateUrl: 'app/shared_logic/components/displayPhoto/displayPhoto.component.html',\r\n bindings: {\r\n resolve:'='\r\n },\r\n\r\n controller: _controller\r\n});\r\n\r\n\r\n","var _controller = function (componentsService, $scope, $translate, $element, $attrs, $q, $timeout) {\r\n var ctrl = this;\r\n ctrl.searchText = '';\r\n ctrl.noResults = true;\r\n ctrl.loadingItems = false;\r\n ctrl.onlyMarkers = false;\r\n\r\n //console.log('ctrl', ctrl);\r\n ctrl.lastSearch = undefined;\r\n\r\n\r\n ctrl.onlyMarkersChange = function () {\r\n //console.log('onlyMarkers', ctrl.onlyMarkers);\r\n\r\n ctrl.onTextChange(ctrl.searchText, ctrl.onlyMarkers)\r\n }\r\n\r\n ctrl.onKeyup = function (evt) {\r\n //console.log('evt', evt);\r\n //console.log('ctrl.searchText', ctrl.searchText);\r\n ctrl.noResults = true;\r\n\r\n if ([4,5].includes(ctrl.searchText.length) && ctrl.lastSearch != ctrl.searchText) {\r\n ctrl.loadingItems = true;\r\n\r\n componentsService.competitorsLookup.getCompetitors(ctrl.searchText)\r\n .then(function (items) {\r\n ctrl.noResults = items.length == 0;\r\n ctrl.loadingItems = false;\r\n\r\n ctrl.lastSearch = angular.copy(ctrl.searchText);\r\n ctrl.onNewItems(items);\r\n });\r\n }\r\n\r\n ctrl.onTextChange(ctrl.searchText, ctrl.onlyMarkers);\r\n\r\n\r\n //if (evt.keyCode == 13) {\r\n // if (ctrl.lastSearch != ctrl.searchText) {\r\n // ctrl.lastSearch = angular.copy(ctrl.searchText);\r\n // ctrl.getItems(ctrl.searchText);\r\n // }\r\n //}\r\n }\r\n\r\n //ctrl.getItems = function (text) {\r\n // //console.log(text);\r\n // //if (text.length < 4)\r\n // //return;\r\n // componentsService.competitorsLookup.getCompetitors(text)\r\n // .then(function (items) {\r\n // ctrl.onNewItems(items);\r\n // });\r\n //}\r\n}\r\n\r\nangular.module('prisma').component('competitorLookupComponent', {\r\n templateUrl: 'app/shared_logic/components/competitorsLookup/competitorsLookup.component.html',\r\n bindings: {\r\n //level: '=',\r\n onNewItems: '=',\r\n onTextChange: '='\r\n //ngModel:'='\r\n },\r\n\r\n controller: _controller\r\n});","var _controller = function () {\r\n var self = this;\r\n console.log('self', self);\r\n\r\n function validar() {\r\n for (var i = 0; i < self.resolve.params.categories.length; i++) {\r\n if (!self.resolve.params.categories[i].priceListId) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n self.confirm = function () {\r\n\r\n if (!validar()) {\r\n //console.log('invalido',self.level);\r\n\r\n swal('Datos incompletos', 'Debe asignar una zona de precios a cada categoria', 'error');\r\n\r\n return;\r\n }\r\n self.close({ $value: self.resolve.params.categories });\r\n }\r\n\r\n self.cancel = function () {\r\n self.dismiss({ $value: 'cancel' });\r\n }\r\n\r\n}\r\n\r\nangular.module('prisma').component('choosePriceListsForCategories', {\r\n templateUrl: 'app/shared_logic/components/choosePriceListsForCategories/choosePriceListsForCategories.component.html',\r\n bindings: {\r\n //categories: \"=\",\r\n //priceLists: \"=\",\r\n resolve: \"=\",\r\n close: '&',\r\n dismiss: '&'\r\n },\r\n\r\n controller: _controller\r\n});\r\n\r\n\r\n","var _controller = function () {\r\n var self = this;\r\n console.log('self', self);\r\n\r\n function validar() {\r\n for (var i = 0; i < self.resolve.params.categories.length; i++) {\r\n if (!self.resolve.params.categories[i].clusterId) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n self.confirm = function () {\r\n\r\n //if (!validar()) {\r\n // //console.log('invalido',self.level);\r\n\r\n // swal('Datos incompletos', 'Debe asignar un cluster a cada categoria', 'error');\r\n\r\n // return;\r\n //}\r\n self.close({ $value: self.resolve.params.categories });\r\n }\r\n\r\n self.cancel = function () {\r\n self.dismiss({ $value: 'cancel' });\r\n }\r\n\r\n}\r\n\r\nangular.module('prisma').component('chooseClustersForCategories', {\r\n templateUrl: 'app/shared_logic/components/chooseClustersForCategories/chooseClustersForCategories.component.html',\r\n bindings: {\r\n //categories: \"=\",\r\n //priceLists: \"=\",\r\n resolve: \"=\",\r\n close: '&',\r\n dismiss: '&'\r\n },\r\n\r\n controller: _controller\r\n});\r\n\r\n\r\n","var _controller = function (componentsService, $scope, $element, $attrs, $q, $timeout) {\r\n var ctrl = this;\r\n console.log('ctrl', ctrl);\r\n\r\n ctrl.lastSeries;\r\n ctrl.lastProperty;\r\n\r\n\r\n ctrl.changeProperty = function (property) {\r\n if (property == ctrl.lastProperty) return;\r\n\r\n //ctrl.lastProperty = property;\r\n ctrl.chartConfiguration.changeProperty(property);\r\n }\r\n\r\n ctrl.getChartConfig = function (chartId, data) {\r\n var template = {\r\n bindto: chartId,\r\n\r\n data: {\r\n json: data,\r\n type: ctrl.chartConfiguration.chartType,\r\n\r\n labels: {\r\n format: function (v, id, i, j) {\r\n\r\n var format = d3.format('$');\r\n return format(v)\r\n\r\n },\r\n },\r\n //onclick: function () {\r\n // if (ctrl.chartConfiguration.chartType == \"bar\")\r\n // ctrl.chartConfiguration.updateChartType('pie');\r\n // else if (ctrl.chartConfiguration.chartType == \"pie\")\r\n // ctrl.chartConfiguration.updateChartType('bar');\r\n //}\r\n },\r\n tooltip: {\r\n //format: {\r\n // /*...*/\r\n //},\r\n contents: function (d, defaultTitleFormat, defaultValueFormat, color) {\r\n //return \"\"\r\n var $$ = this, config = $$.config,\r\n titleFormat = config.tooltip_format_title || defaultTitleFormat,\r\n nameFormat = config.tooltip_format_name || function (name) { return name; },\r\n valueFormat = config.tooltip_format_value || defaultValueFormat,\r\n text, i, title, value, name, bgcolor;\r\n for (i = 0; i < d.length; i++) {\r\n if (!(d[i] && (d[i].value || d[i].value === 0))) { continue; }\r\n console.log(d[i]);\r\n\r\n if (!text) {\r\n title = titleFormat ? titleFormat(d[i].x) : d[i].x;\r\n text = \"\" + (title || title === 0 ? \"\" : \"\");\r\n }\r\n\r\n name = nameFormat(d[i].name);\r\n value = valueFormat(d[i].value, d[i].ratio, d[i].id, d[i].index);\r\n bgcolor = $$.levelColor ? $$.levelColor(d[i].value) : color(d[i].id);\r\n\r\n text += \"\";\r\n text += \"\";\r\n text += \"\";\r\n text += \"\";\r\n }\r\n return text + \"
\" + title + \"
\" + name + \"\" + value + \"
\";\r\n }\r\n }\r\n\r\n\r\n }\r\n\r\n\r\n if (ctrl.chartConfiguration.chartType == 'pie') {\r\n\r\n var jsonData = {};\r\n var names = [];\r\n data.forEach(function (e) {\r\n names.push(e.name);\r\n jsonData[e.name] = e[ctrl.chartConfiguration.defaultProperty];\r\n })\r\n console.log('jsonData', jsonData);\r\n template.data.json = [jsonData];\r\n template.data.keys = { value: names }\r\n\r\n\r\n template.pie = {\r\n label: {\r\n format: function (value, ratio, id,d) {\r\n console.log(value, ratio, id, d);\r\n return value;\r\n }\r\n }\r\n };\r\n\r\n //template.data.keys.value.push(ctrl.chartConfiguration.defaultProperty);\r\n\r\n } else {\r\n\r\n template.data.keys = {\r\n value: [],\r\n x: 'name'\r\n };\r\n\r\n\r\n template.axis = {\r\n x: {\r\n type: 'category',\r\n },\r\n y: {\r\n tick: {\r\n format: d3.format(\",.0f\")\r\n }\r\n },\r\n }\r\n }\r\n\r\n if (ctrl.chartConfiguration.multipleValues && ctrl.chartConfiguration.chartType != 'pie') {\r\n\r\n\r\n template.data.types = {};\r\n\r\n for (var i = 0; i < ctrl.chartConfiguration.properties.length; i++) {\r\n template.data.keys.value.push(ctrl.chartConfiguration.properties[i].code);\r\n if (ctrl.chartConfiguration.properties[i].code != ctrl.chartConfiguration.defaultProperty)\r\n template.data.types[ctrl.chartConfiguration.properties[i].code] = 'spline';\r\n\r\n }\r\n template.data.axes = {}\r\n template.data.axes[ctrl.chartConfiguration.defaultProperty] = 'y';\r\n if (ctrl.chartConfiguration.secondaryAxisProperty) {\r\n template.data.axes[ctrl.chartConfiguration.secondaryAxisProperty] = 'y2';\r\n template.axis.y2 = { show: true };\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n console.log('template', template);\r\n return template;\r\n\r\n\r\n\r\n }\r\n\r\n\r\n\r\n ctrl.parseChartData = function (chartData, chart) {\r\n if (chartData == undefined || chartData.length == 0) return [];\r\n\r\n console.log('chartdata', chartData);\r\n var data = [];\r\n var competitors = [];\r\n //var dates = ['x'];\r\n var series = [];\r\n\r\n //obtengo competitors\r\n //var competitor = '';\r\n //console.log('chartdata', chartData);\r\n angular.forEach(chartData, function (d) {\r\n if (competitors.indexOf(d.name) == -1) {\r\n competitors.push(d.name);\r\n //competitor = d.competitor;\r\n }\r\n });\r\n\r\n\r\n //obtengo dates\r\n //var date = '';\r\n //angular.forEach(chartData, function (d) {\r\n // var tempdate = new Date(d.observedDate);\r\n // var currDate = tempdate.getFullYear() + '-' + (tempdate.getMonth() + 1) + '-' + tempdate.getDate();\r\n // if (dates.indexOf(currDate) == -1) {\r\n // dates.push(currDate);\r\n // }\r\n //});\r\n\r\n function competitorInSerie(competitor) {\r\n for (var i = 0; i < series.length; i++) {\r\n if (series[i][0] == competitor)\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n //armo las series\r\n var serie = [];\r\n angular.forEach(chartData, function (d) {\r\n if (!competitorInSerie(d.name)) {\r\n\r\n serie = [];\r\n serie.push(d.name);\r\n serie.push(d[chart]);\r\n competitor = d.name;\r\n series.push(serie);\r\n }\r\n else {\r\n serie.push(d[chart]);\r\n }\r\n });\r\n //data.push(dates);\r\n angular.forEach(series, function (s) {\r\n data.push(s);\r\n });\r\n\r\n return data;\r\n }\r\n\r\n\r\n function fillDefaultValues() {\r\n if (ctrl.chartConfiguration.chartType == undefined) {\r\n ctrl.chartConfiguration.chartType = \"bar\";\r\n }\r\n\r\n if (ctrl.chartConfiguration.styles == undefined) {\r\n ctrl.chartConfiguration.styles = {};\r\n }\r\n\r\n if (ctrl.chartConfiguration.defaultProperty == undefined) {\r\n ctrl.chartConfiguration.defaultProperty = ctrl.chartConfiguration.properties[0].code;\r\n }\r\n }\r\n\r\n function init() {\r\n\r\n fillDefaultValues();\r\n\r\n ctrl.chartConfiguration.updateChart = function (series, property) {\r\n ctrl.lastSeries = series;\r\n ctrl.lastProperty = property;\r\n var dataParsed = parseData(ctrl.lastSeries, ctrl.lastProperty);\r\n\r\n ctrl.chartConfiguration.chartReference = c3.generate(ctrl.getChartConfig('#chartName-' + ctrl.chartConfiguration.chartName, dataParsed));\r\n //console.log('reference', ctrl.chartConfiguration.chartReference);\r\n }\r\n\r\n ctrl.chartConfiguration.updateChartType = function (_chartType) {\r\n ctrl.chartConfiguration.chartType = _chartType;\r\n var dataParsed = parseData(ctrl.lastSeries, ctrl.lastProperty);\r\n //var dataParsed = ctrl.lastSeries//; ctrl.parseChartData(ctrl.lastSeries, ctrl.lastProperty);\r\n ctrl.chartConfiguration.chartReference = c3.generate(ctrl.getChartConfig('#chartName-' + ctrl.chartConfiguration.chartName, dataParsed));\r\n }\r\n\r\n ctrl.chartConfiguration.changeProperty = function (property) {\r\n ctrl.lastProperty = property;\r\n var dataParsed = parseData(ctrl.lastSeries, ctrl.lastProperty);\r\n //var dataParsed = ctrl.lastSeries //ctrl.parseChartData(ctrl.lastSeries, ctrl.lastProperty);\r\n ctrl.chartConfiguration.chartReference = c3.generate(ctrl.getChartConfig('#chartName-' + ctrl.chartConfiguration.chartName, dataParsed));\r\n }\r\n }\r\n\r\n function parseData(series, property) {\r\n var dataParsed = [];\r\n console.log('parseando data');\r\n if (ctrl.chartConfiguration.chartType == 'pie') {\r\n for (var i = 0; i < series.length; i++) {\r\n if (series[i].label.toLowerCase() == property.toLowerCase()) {\r\n dataParsed.push(series[i]);\r\n console.log('agregando');\r\n }\r\n }\r\n } else {\r\n dataParsed = series;//ctrl.parseChartData(series, property);\r\n }\r\n return dataParsed;\r\n }\r\n\r\n init();\r\n}\r\n\r\nangular.module('prisma').component('chartComponent', {\r\n templateUrl: 'app/shared_logic/components/chartComponent/chart.component.html',\r\n bindings: {\r\n chartConfiguration: '=',\r\n },\r\n\r\n controller: _controller\r\n});","var _controller = function (componentsService, $scope, $element, $attrs, $q, $timeout) {\r\n var ctrl = this;\r\n if (ctrl.ngModel == undefined)\r\n ctrl.ngModel = '';\r\n //console.log('ctrl', ctrl);\r\n\r\n\r\n ctrl.onKeydown = function (evt) {\r\n //console.log('evt', evt);\r\n if (evt.keyCode == 13 &&\r\n ctrl.ngModel == '') {\r\n ctrl.onItemSelect({id:0});\r\n }\r\n }\r\n\r\n ctrl.getItems = function (text) {\r\n //console.log(text);\r\n if (text.length <= 3)\r\n return;\r\n\r\n return componentsService.categoryLookup.getCategories(text,ctrl.level)\r\n .then(function (items) {\r\n return items;\r\n });\r\n }\r\n\r\n ctrl.onItemSelect = function (item) {\r\n if (item == undefined) return;\r\n ctrl.ngModel = item.name;\r\n //console.log('onitemselect', item);\r\n ctrl.onSelect(item);\r\n\r\n if (ctrl.clearOnSelect)\r\n ctrl.ngModel = null;\r\n }\r\n\r\n}\r\n\r\nangular.module('prisma').component('categoryLookupComponent', {\r\n templateUrl: 'app/shared_logic/components/categoryLookup/categoryLookup.component.html',\r\n bindings: {\r\n level: '=',\r\n onSelect: '=',\r\n clearOnSelect: '=',\r\n proptabindex: '=',\r\n //ngModel:'='\r\n },\r\n\r\n controller: _controller\r\n});","angular.module(\"prisma\")\r\n .controller(\"EditPlanogramCtrl\", function ($state, $scope, $timeout, $rootScope, $window, $stateParams, $translate, $filter, $uibModal, $element, authService, priceService, spaceService, ngDialog, adminService, assortmentService, $log, $q, imageService, DnDService, $document) {\r\n var self = this;\r\n var TICKET_TYPES = {\r\n PLANOGRAM: 1,\r\n ITEM: 2\r\n }\r\n\r\n var onGlobalMouseUp = function (e) {\r\n if (angular.isDefined(e.toElement)\r\n && angular.isDefined(e.toElement.className)\r\n && e.toElement.className.toString().indexOf('filter-button') === -1\r\n && $(event.target).closest('.filter-element').length === 0) {\r\n self.closeFilters();\r\n }\r\n };\r\n\r\n $(\"body\").on(\"mouseup\", onGlobalMouseUp);\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n $(\"body\").off(\"mouseup\", onGlobalMouseUp);\r\n $document.off('keydown', onGlobalKeydown);\r\n\r\n });\r\n\r\n // Referencia del timmer para poder cancelar \r\n // la actualización de la referencia del modelo del planograma.\r\n // Para evitar el parpadedo de la pantalla por el redibujo del planograma.\r\n self.forceUpdateModelCancel = null;\r\n\r\n self.labelInfoExp = '';\r\n\r\n self.activePlanogram = null;\r\n self.selectedColumn = null;\r\n self.selectedModule = null;\r\n self.selectedLevel = null;\r\n self.selectedItem = null;\r\n self.activeShelf = null;\r\n self.setActiveShelf = function setActiveShelf(shelf) {\r\n self.activeShelf = shelf;\r\n }\r\n\r\n self.hasPermissionToEndorse = authService.hasPermission('spaces_endorse_planograms');\r\n self.hasPermissionToInform = authService.hasPermission('spaces_inform_planograms');\r\n self.hasPermissionToEdit = authService.hasPermission('spaces_edit_planograms');\r\n\r\n self.showDimensions = false;\r\n self.isLoading = false;\r\n self.isLoadingListItems = false;\r\n self.isLoadingPlanogram = false;\r\n self.showChipsFilter = false;\r\n self.itemList = [];\r\n\r\n self.model = {\r\n planograms: []\r\n };\r\n self.planogramItems = [];\r\n self.heatMapEnabled = false;\r\n self.heatMapVariable = 'Off';\r\n self.search = \"\";\r\n self.categoryFilter = '!null';\r\n self.selectedBrand = '!null';\r\n self.selectedManufacturer = '!null';\r\n self.selectedStatus = '!null';\r\n self.selectedTagFilter = null;\r\n self.filteredItems = [];\r\n self.editItem = null;\r\n self.newTicket = GenerateNewTicket();\r\n self.translationLow = \"\";\r\n self.translationMedium = \"\";\r\n self.translationHeightF = \"\";\r\n self.selectedPlanogram = null;\r\n self.typesTickets = [\r\n 'Planograma',\r\n 'Item'\r\n ];\r\n\r\n self.selectedTag = 'None';\r\n self.textSelectedTag = \"None\";\r\n self.textSelectedStatus = \"None\";\r\n self.display = 'block';\r\n self.textClusters = \"\";\r\n self.clusters = [];\r\n self.categories = null;\r\n self.subCategories = null;\r\n self.tagsSelections = [];\r\n self.subcategoriesSelections = [];\r\n self.allTags = [];\r\n\r\n self.brandsFilter = [];\r\n self.brandSelection = [];\r\n\r\n self.manufacturersFilter = [];\r\n self.manufacturerSelection = [];\r\n\r\n self.showLoadQuantity = false;\r\n self.showExhibitionDays = false;\r\n self.showDaysInStock = false;\r\n self.showRegularPrice = false;\r\n self.analyzeBy = 'cluster';\r\n\r\n self.thereIsRefrigerator = false;\r\n self.thereIsPeg = false;\r\n self.showDoor = false;\r\n self.autoAlign = false;\r\n self.autoStack = true;\r\n self.stateChange = false;\r\n self.percentageSales = 0 + '%';\r\n self.percentageSpaces = 0 + '%';\r\n self.tooltipSpaced = '';\r\n self.showlevelmeasurebuttons = false;\r\n\r\n self.editLevelMeasure = function () {\r\n self.showlevelmeasurebuttons = !self.showlevelmeasurebuttons;\r\n }\r\n\r\n\r\n // Visual tipo Nielsen por bloque.\r\n self.groupMapVariable = '';\r\n self.groupMapVariableValue = '';\r\n self.groupMapEnabled = false;\r\n self.groupMapList = [];\r\n self.groupMap = {};\r\n self.groupMapTags = [];\r\n self.groupTags = [];\r\n self.spaceModuleType = {\r\n 1: 'Shelf',\r\n 2: 'Peg',\r\n 3: 'Refrigerator'\r\n }\r\n self.logoNavbar = $rootScope.logoNavbar;\r\n self.zoom = 800;\r\n self.changeZoom = function (bool) {\r\n bool ? self.zoom += 50 : self.zoom -= 50;\r\n }\r\n\r\n self.colors = [\r\n //'e6194b', //Este color ya está en el mapa de calor\r\n //'3cb44b', //Este color ya está en el mapa de calor\r\n //'f58231', //Este color ya está en el mapa de calor\r\n\r\n '000000',\r\n '000066',\r\n '00cc00',\r\n '660000',\r\n '66ff99',\r\n 'ccff33',\r\n 'ff0000',\r\n '66ffff',\r\n 'ff0066',\r\n 'ff6600',\r\n '66ccff',\r\n 'ff6666',\r\n '660066',\r\n '336699',\r\n '99ccff',\r\n '663300',\r\n 'ff00ff',\r\n '0000cc',\r\n '99ff99',\r\n 'ff9900',\r\n 'ff9966',\r\n 'ff3399',\r\n 'ffff66',\r\n 'ffff00',\r\n 'cc9900',\r\n 'cc00cc',\r\n '3333cc',\r\n '993333',\r\n '999933',\r\n 'ccff99',\r\n '99cc66'\r\n\r\n ];\r\n var translations = null;\r\n\r\n\r\n $scope.oneAtATime = true;\r\n\r\n $scope.groups = [\r\n {\r\n title: 'Dynamic Group Header - 1',\r\n content: 'Dynamic Group Body - 1'\r\n },\r\n {\r\n title: 'Dynamic Group Header - 2',\r\n content: 'Dynamic Group Body - 2'\r\n }\r\n ];\r\n\r\n $scope.items = ['Item 1', 'Item 2', 'Item 3'];\r\n\r\n $scope.addItem = function () {\r\n var newItemNo = $scope.items.length + 1;\r\n $scope.items.push('Item ' + newItemNo);\r\n };\r\n\r\n $scope.status = {\r\n isCustomHeaderOpen: false,\r\n isFirstOpen: true,\r\n isFirstDisabled: false\r\n };\r\n\r\n //Filtro collapse\r\n self.isNavCollapsed = true;\r\n self.isCollapsedHorizontal = false;\r\n self.isCollapsed = true;\r\n self.isAnalyzeByCollapsed = false;\r\n self.isSelectedClusterCollapsed = false;\r\n self.isSelectedStoreCollapsed = false;\r\n self.isGroupByCollapsed = false;\r\n self.isBrandCollapsed = false;\r\n self.isTagsCollapsed = false;\r\n self.isHeatMapCollapsed = false;\r\n self.isStatusCollapsed = false;\r\n\r\n self.itemTry = [\r\n {\r\n \"id\": 2,\r\n \"planogramLevelId\": 2,\r\n \"itemId\": 107,\r\n \"order\": 0,\r\n \"facings\": 3,\r\n \"orientation\": 0,\r\n \"ticketCount\": 0,\r\n \"status\": null,\r\n \"categoryId\": 112,\r\n \"categoryName\": \"TV LED y Smart TV\",\r\n \"name\": \"TELEVISOR 32 \\\" SMART TV 32J4300\",\r\n \"imageUrl\": \"assets/images/items/ElectroDemo/168919.png\",\r\n \"width\": 74.54,\r\n \"height\": 44.2,\r\n \"depth\": 6.9,\r\n \"tags\": [],\r\n \"brand\": \"Samsung\",\r\n \"stackTotal\": null,\r\n \"position\": [10, 5],\r\n }, {\r\n \"id\": 3,\r\n \"planogramLevelId\": 2,\r\n \"itemId\": 108,\r\n \"order\": 1,\r\n \"facings\": 1,\r\n \"orientation\": 0,\r\n \"ticketCount\": 0,\r\n \"status\": null,\r\n \"categoryId\": 112,\r\n \"categoryName\": \"TV LED y Smart TV\",\r\n \"name\": \"TELEVISOR 32 \\\" SMART TV 32LH575B\",\r\n \"imageUrl\": \"assets/images/items/ElectroDemo/171815.png\",\r\n \"width\": 73.4,\r\n \"height\": 47.4,\r\n \"depth\": 17.2,\r\n \"tags\": [],\r\n \"brand\": \"Lg\",\r\n \"stackTotal\": null,\r\n \"position\": [50, 50]\r\n }, {\r\n \"id\": 4,\r\n \"planogramLevelId\": 3,\r\n \"itemId\": 105,\r\n \"order\": 0,\r\n \"facings\": 1,\r\n \"orientation\": 0,\r\n \"ticketCount\": 0,\r\n \"status\": null,\r\n \"categoryId\": 112,\r\n \"categoryName\": \"TV LED y Smart TV\",\r\n \"name\": \"TELEVISOR 32 \\\" SMART TV 32PHG5102\",\r\n \"imageUrl\": \"assets/images/items/ElectroDemo/172641.png\",\r\n \"width\": 73.25,\r\n \"height\": 42.96,\r\n \"depth\": 8.68,\r\n \"tags\": [],\r\n \"brand\": \"Philips\",\r\n \"stackTotal\": null,\r\n \"position\": [30, 70]\r\n }\r\n ]\r\n\r\n self.selectSpaceObject = function (spaceObject) {\r\n self.selectedSpaceObject = spaceObject;\r\n }\r\n\r\n self.newItem = false;\r\n self.planogramByColums = [];\r\n\r\n self.componentMousedown = function (item, event) {\r\n self.stateChange = true;\r\n //if (level.polygonContainer.length == 0 || level.polygonContainer[0].points == undefined) return;\r\n mouseDown = true;\r\n\r\n // create a clone of the currentTarget element\r\n cloned = event.currentTarget.cloneNode(true);\r\n //Le pongo las medidas correctas al planograma\r\n //self.calcPlanogramSize(self.selectedSpaceObject);\r\n\r\n //resize clone\r\n cloned.style.width = '50px';\r\n cloned.style.height = '50px';\r\n cloned.style.opacity = '.5';\r\n cloned.querySelector('#item_' + item.itemId).style.display = 'none'\r\n //div.innerHTML = \"Hello\";\r\n\r\n var parent = document.getElementById('auxPlanogram');\r\n parent.style.top = event.clientY + 'px';\r\n parent.style.left = event.clientX + 'px';\r\n\r\n parent.appendChild(cloned);\r\n window.addEventListener('mouseup', onMouseUp);\r\n\r\n document.onmousemove = function (oPssEvt2) {\r\n var oMsEvent2 = oPssEvt2 || /* IE */ window.event;\r\n parent.style.top = oMsEvent2.clientY + 'px';\r\n parent.style.left = oMsEvent2.clientX + 'px';\r\n //console.log('onmousemove', oMsEvent2)\r\n\r\n //if (isValidPosition(cloned)) {\r\n // cloned.className = cloned.className.replace('forbidden', '');\r\n //} else {\r\n // if (!_.includes(cloned.className, 'forbidden')) {\r\n // cloned.className += ' forbidden';\r\n // }\r\n //}\r\n };\r\n }\r\n\r\n function onMouseUp(event) {\r\n //Solo ejecuto si viene de un mouse down previo\r\n if (!mouseDown) return;\r\n //console.log('up', event);\r\n //Le saco el evento, por las dudas\r\n window.removeEventListener('mouseup', onMouseUp);\r\n //Dejo de arrastrar\r\n document.onmousemove = null;\r\n\r\n //Guardo las posicion para usarlos luego\r\n var positionPlanogram = document.getElementById('drawing').getBoundingClientRect();\r\n var positionElement = cloned.getBoundingClientRect();\r\n\r\n //valido la posicion del elemento, si se encuenta dentro del planograma!\r\n var validPosition = isValidPosition(positionPlanogram, positionElement);\r\n\r\n //Remuevo el planograma del canvas creado\r\n var parent = document.getElementById('auxPlanogram');\r\n parent.removeChild(cloned);\r\n\r\n ////Si es una ubicacion no permitida, no lo agrego\r\n ////if (_.includes(cloned.className, \"forbidden\"))\r\n //if (!validPosition) {\r\n // //console.log('no over');\r\n // return;\r\n //}\r\n\r\n\r\n var componentClone = angular.copy(self.selectedSpaceObject);\r\n componentClone.id = guid();\r\n\r\n //solo si la posicion es valida lo agrego\r\n if (validPosition) {\r\n self.itemTry.push({\r\n isNew: true,\r\n //tempId: level.levelObjects.length + 1,\r\n id: componentClone.itemId,\r\n spaceObjectId: componentClone.id,\r\n depth: componentClone.depth,\r\n width: componentClone.width,\r\n height: componentClone.height,\r\n points: componentClone.points,\r\n pointsPx: componentClone.pointsPx,\r\n rotation: componentClone.rotation ? componentClone.rotation : 0,\r\n name: componentClone.name,\r\n imageUrl: componentClone.imageUrl,\r\n categoryId: componentClone.categoryId,\r\n isPlanogram: componentClone.isPlanogram,\r\n categoryColor: componentClone.categoryColor,\r\n position: [positionElement.x - positionPlanogram.x, positionElement.y - positionPlanogram.y]\r\n });\r\n self.newItem = true;\r\n }\r\n\r\n ////console.log('clone', componentClone);\r\n $scope.$apply();\r\n\r\n }\r\n\r\n function isValidPosition(positionPlanogram, positionElement) {\r\n if (positionElement.x > positionPlanogram.x\r\n && positionElement.y > positionPlanogram.y\r\n && positionElement.x + positionElement.width < positionPlanogram.x + positionPlanogram.width\r\n && positionElement.y + positionElement.height < positionPlanogram.y + positionPlanogram.height) {\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n\r\n\r\n function mapNumber(value, inMin, inMax, outMin, outMax) {\r\n var inRange = inMax - inMin;\r\n var outRange = outMax - outMin;\r\n return (value - inMin) * outRange / inRange + outMin;\r\n }\r\n\r\n function calculateStackTotalForPlanogram(itemId) {\r\n let rv = 0;\r\n loopThroughAll(function (planogram, column, module, level, item) {\r\n if (item.itemId == itemId)\r\n rv += self.calculateLoadQuantity(item);\r\n }, self.until.items);\r\n\r\n //update stack total for planogram\r\n loopThroughAll(function (planogram, column, module, level, item) {\r\n if (item.itemId == itemId)\r\n item.stackTotal = rv;\r\n }, self.until.items);\r\n\r\n return rv;\r\n }\r\n\r\n self.setItemLabel = function (labelType) {\r\n var showInfo = false;\r\n self.labelInfoClassExp = '';\r\n if (labelType === 'loadQuantity') {\r\n showInfo = self.showLoadQuantity = !self.showLoadQuantity;\r\n self.showExhibitionDays = false;\r\n self.showDaysInStock = false;\r\n self.showRegularPrice = false;\r\n self.labelInfoExp = 'stackTotal';\r\n } else if (labelType === 'exhibitionDays') {\r\n showInfo = self.showExhibitionDays = !self.showExhibitionDays;\r\n //if (showInfo) {\r\n // loopThroughAll(function (planogram, column, module, level, item) {\r\n // self.calcExhibitionDays(item);\r\n // }, self.until.items);\r\n //}\r\n\r\n self.showLoadQuantity = false;\r\n self.showDaysInStock = false;\r\n self.showRegularPrice = false;\r\n self.labelInfoExp = 'exhibitionDays | number:1';\r\n } else if (labelType === 'daysInStock') {\r\n showInfo = self.showDaysInStock = !self.showDaysInStock;\r\n //if (showInfo) {\r\n // loopThroughAll(function (planogram, column, module, level, item) {\r\n // self.calcDaysInStock(item);\r\n // }, self.until.items);\r\n //}\r\n\r\n self.showLoadQuantity = false;\r\n self.showExhibitionDays = false;\r\n self.showRegularPrice = false;\r\n self.labelInfoExp = 'daysInStock | number: 1';\r\n self.labelInfoClassExp = '(daysInStock <= 3) ? \"label-danger\" : \"\"';\r\n } else if (labelType === 'regularPrice') {\r\n showInfo = self.showRegularPrice = !self.showRegularPrice;\r\n self.showExhibitionDays = false;\r\n self.showDaysInStock = false;\r\n self.showLoadQuantity = false;\r\n self.labelInfoExp = '\"$ \" + ( regularPrice | number:1 ) ';\r\n } else {\r\n showInfo = false;\r\n self.showExhibitionDays = false;\r\n self.showDaysInStock = false;\r\n self.showLoadQuantity = false;\r\n self.showRegularPrice = false;\r\n self.labelInfoExp = 'itemCode';\r\n }\r\n\r\n self.showInfo = showInfo;\r\n self.forceUpdateModel();\r\n }\r\n\r\n /** \r\n TATA URUGUAY\r\n dias de exhibición de un articulo = capacidad total / (ventas / 30)\r\n dias de stock de un articulo = stock actual / (ventas / 30)\r\n siendo:\r\n capacidad total = facings + apilados arriba + apilados atras\r\n ventas = la suma de las unidades vendidas en promedio mensual de los ultimos 12 meses que tiene el item en las tiendas del planograma\r\n stock actual = la suma de todo el stock actual que tiene un item en las tiendas del planograma\r\n */\r\n\r\n /**\r\n * Calcula los dias de exhibicion de un item en el planograma\r\n * @param {number} itemId Id del item\r\n */\r\n self.calcExhibitionDays = function (itemId) {\r\n loopThroughAll(function (planogram, column, module, level, item) {\r\n if (item.itemId == itemId)\r\n item.exhibitionDays = item.stackTotal / ((item.units | 0) / 30);\r\n }, self.until.items);\r\n\r\n }\r\n\r\n /**\r\n * Calcula los dias de stock de un item en el planograma\r\n * @param {number} item item\r\n */\r\n self.calcDaysInStock = function (item) {\r\n // item.daysInStock = item.storeInfo ? item.storeInfo.currentInventoryUnits / (item.storeInfo.units / 30) : 0;\r\n item.daysInStock = item.currentInventoryUnits ? item.currentInventoryUnits / (item.units / 30) : 0;\r\n return item.daysInStock\r\n }\r\n\r\n self.getTotalFacings = function getTotalFacings(item) {\r\n let rv = 0;\r\n if (item) {\r\n loopThroughAll(function (planogram, column, module, level, i) {\r\n if (item.itemId == i.itemId)\r\n rv += i.facings;\r\n }, self.until.items);\r\n }\r\n return rv;\r\n }\r\n\r\n self.memoAllItemPlanogram = {}\r\n\r\n self.filter = {\r\n\r\n }\r\n\r\n //autocomplete collapse\r\n\r\n self.isRulesCollapsed = false;\r\n self.isCompleteCollapsed = true;\r\n self.isOrderCollapsed = true;\r\n self.isRestrictionCollapsed = true;\r\n self.isApplyCollapsed = true;\r\n self.isResultsCollapsed = true;\r\n\r\n //item for autocomplete\r\n self.itemsForAutocomplete = [];\r\n self.listedItems = [];\r\n self.leftToRight = true;\r\n self.topToBottom = true;\r\n self.ordenation = [];\r\n self.selectOrder = null;\r\n self.rules = [];\r\n self.selectRule = null;\r\n self.sortBySize = null;\r\n self.asc = true;\r\n\r\n\r\n self.brandsSelections = [];\r\n\r\n self.restrictions = [];\r\n self.selectRestriction = null;\r\n self.maxFront = 0;\r\n self.minFront = 0;\r\n self.frequency = 0;\r\n\r\n self.clusterIds = []\r\n\r\n self.activeAssortmentFilter = true;\r\n\r\n\r\n //Funciones\r\n\r\n\r\n self.selectedStore = null;\r\n $scope.$watch('ct.selectedStore', function (newVal, oldVal) {\r\n\r\n if (newVal != oldVal) {\r\n resetSales();\r\n calculateSales();\r\n }\r\n });\r\n\r\n //$scope.$watch('ct.planograms.levels.items', function (newVal, oldVal) {\r\n // console.log('$scope.$watch', newVal, oldVal, newVal != oldVal)\r\n // if (newVal != oldVal) self.stateChange = true;\r\n //}, true)\r\n\r\n\r\n self.selectedCluster = {};\r\n $scope.$watch('ct.selectedCluster', function (newVal, oldVal) {\r\n if (newVal == oldVal)\r\n return;\r\n\r\n // calulate Sales in view edit\r\n if (newVal != undefined && self.itemList != null) {\r\n\r\n calculateSales();\r\n }\r\n });\r\n\r\n var onGlobalKeydown = function (e) {\r\n //si hay seleccion y no esta en foco un input\r\n if (self.selectedItem && !angular.element(e.target).is(\":input\")) {\r\n //flecha derecha\r\n if (e.keyCode === 39) {\r\n // self.addFrontItem(self.activeShelf.selecteditem, self.activeShelf.selectedLevel, self.activeShelf.planogram, true);\r\n self.wrapperAddFrontItem(true);\r\n }\r\n\r\n //flecha izquierda\r\n if (e.keyCode === 37) {\r\n // self.addFrontItem(self.activeShelf.selecteditem, self.activeShelf.selectedLevel, self.activeShelf.planogram, false);\r\n self.wrapperAddFrontItem(false);\r\n }\r\n\r\n //flecha arriba\r\n if (e.keyCode === 38) {\r\n // self.addItemAbove(self.activeShelf.selecteditem, self.activeShelf.selectedLevel, self.activeShelf.planogram, true, false);\r\n self.wrapperAddItemAbove(true);\r\n }\r\n\r\n //flecha abajo\r\n if (e.keyCode === 40) {\r\n // self.addItemAbove(self.activeShelf.selecteditem, self.activeShelf.selectedLevel, self.activeShelf.planogram, false);\r\n self.wrapperAddItemAbove(false);\r\n }\r\n\r\n //flecha delete\r\n if (e.keyCode === 46) {\r\n // self.deleteItem(self.activeShelf.selecteditem, self.activeShelf.selectedLevel);\r\n self.wrapperDeleteItem()\r\n }\r\n\r\n $scope.$apply();\r\n\r\n return false\r\n }\r\n\r\n }\r\n\r\n //acciones bindeadas del teclado\r\n $document.on('keydown', onGlobalKeydown);\r\n\r\n $scope.$on('$stateChangeStart', function (event) {\r\n if (self.isEdit() && self.hasPlanogramChanged()) {\r\n var answer = confirm(translations.AlertWillLoseChanges)\r\n if (!answer) {\r\n event.preventDefault();\r\n }\r\n }\r\n });\r\n\r\n function resetSales() {\r\n\r\n }\r\n\r\n self.until = {\r\n planograms: 1,\r\n columns: 2,\r\n modules: 3,\r\n levels: 4,\r\n items: 5\r\n }\r\n\r\n function loopThroughAll(callbackFunction, until) {\r\n return new Promise(function loopThroughAllPromise(resolve, reject) {\r\n if (self.until[until]) {\r\n reject('err - argument until is difened as: ' + until);\r\n }\r\n\r\n angular.forEach(self.model.planograms, function loopThroughAllForEachPlanograms(planogram) {\r\n if (until === self.until.planograms) {\r\n return callbackFunction(planogram);\r\n }\r\n\r\n angular.forEach(planogram.columns,\r\n function loopThroughAllForEachColumns(column) {\r\n if (until === self.until.columns) {\r\n return callbackFunction(planogram, column);\r\n }\r\n\r\n angular.forEach(column.modules,\r\n function loopThroughAllForEachModules(module) {\r\n if (until === self.until.modules) {\r\n return callbackFunction(planogram, column, module);\r\n }\r\n\r\n angular.forEach(module.levels,\r\n function loopThroughAllForEachLevels(level) {\r\n if (until === self.until.levels) {\r\n return callbackFunction(planogram, column, module, level);\r\n }\r\n\r\n angular.forEach(level.items,\r\n function loopThroughAllForEachItems(item) {\r\n if (until === self.until.items) {\r\n return callbackFunction(planogram, column, module, level, item);\r\n }\r\n\r\n });\r\n });\r\n });\r\n });\r\n });\r\n\r\n resolve('success');\r\n });\r\n }\r\n\r\n function calculateSales() {\r\n\r\n angular.forEach(self.model.planograms, function calculateSalesForEachPlanograms(planogram) {\r\n\r\n planogram.units = 0; planogram.sales = 0; planogram.margin = 0; planogram.inventoryUnits = 0;\r\n planogram.storesInfo = { units: 0, sales: 0, margin: 0, inventoryUnits: 0 }\r\n\r\n angular.forEach(planogram.columns,\r\n function calculateSalesForEachColumns(column) {\r\n angular.forEach(column.modules,\r\n function calculateSalesForEachModules(module) {\r\n angular.forEach(module.levels,\r\n function calculateSalesForEachLevels(level) {\r\n angular.forEach(level.items,\r\n function calculateSalesForEachItems(item) {\r\n // TODO: Cargar la lista de items en un objeto dicionario y acceder por clave.\r\n // TODO: Ej: _itemDict[ item.itemId ]\r\n angular.forEach(self.itemList,\r\n function (_itemList) {\r\n if (_itemList.itemId == item.itemId) {\r\n planogram.units += _itemList.units\r\n planogram.sales += _itemList.sales\r\n planogram.margin += _itemList.margin\r\n planogram.inventoryUnits += _itemList.inventoryUnits\r\n planogram.inventory += _itemList.inventory\r\n\r\n //Copio los datos del Item desde la lista de la izquierda a los items que estan en el Planograma\r\n item.units = _itemList.units\r\n item.sales = _itemList.sales\r\n item.margin = _itemList.margin\r\n item.regularPrice = _itemList.regularPrice;\r\n item.price = _itemList.regularPrice;\r\n item.name = _itemList.name;\r\n item.code = _itemList.code;\r\n item.ean = _itemList.ean;\r\n item.createdDate = _itemList.createdDate;\r\n item.brand = _itemList.brand;\r\n item.manufacturer = _itemList.manufacturer;\r\n item.width = _itemList.width;\r\n item.height = _itemList.height;\r\n item.depth = _itemList.depth;\r\n item.categoryName = _itemList.categoryName;\r\n item.tags = _itemList.tags;\r\n item.currentInventoryUnits = _itemList.currentInventoryUnits;\r\n item.currentInventory = _itemList.currentInventory;\r\n item.gmroi = item.currentInventory === 0 ? 0 : item.margin / item.currentInventory;\r\n item.gmros = item.margin / (item.width * item.facings * item.stackAbove);\r\n //item.inventoryUnits = _itemList.inventoryUnits; DB: no deberiamos tener el stock a nivel item tmb?\r\n\r\n self.calcExhibitionDays(item.itemId);\r\n self.calcDaysInStock(item);\r\n\r\n\r\n // TODO: Cargar la lista de sotres en un objeto dicionario y acceder por clave.\r\n // TODO: Ej: _itemStores[ item.itemId ].storesDict[ self.selectedStore.id ]\r\n angular.forEach(_itemList.storesInfo,\r\n function calculateSalesForEachStoreInfo(itemStore) {\r\n if (self.selectedStore &&\r\n self.selectedStore.id == itemStore.storeId) {\r\n item.storeInfo = itemStore;\r\n planogram.storesInfo.units += itemStore.units\r\n planogram.storesInfo.sales += itemStore.sales\r\n planogram.storesInfo.margin += itemStore.margin\r\n planogram.storesInfo.inventoryUnits += itemStore\r\n .inventoryUnits\r\n }\r\n });\r\n //item.gmros = item.margin / item.width * item.depth / 10000; \r\n }\r\n });\r\n });\r\n });\r\n });\r\n });\r\n });\r\n\r\n // Fuerza una nueva referencia del planograma para que se detecte el cambio en los componentes.\r\n self.forceUpdateModel();\r\n }\r\n\r\n self.goToViewMode = function () {\r\n $state.go('spaces.viewPlanogram', { planogramId: self.planogramId });\r\n\r\n }\r\n\r\n self.goToEditMode = function () {\r\n $state.go('spaces.editPlanogram', { planogramId: self.planogramId });\r\n }\r\n\r\n self.isEdit = function () {\r\n return $state.current.url.contains('edit');\r\n }\r\n\r\n self.setAnalyzeBy = function (analyzeBy) {\r\n self.analyzeBy = analyzeBy\r\n }\r\n\r\n self.itemDroppedInItemsList = function (index, item, external, type) {\r\n return false;\r\n }\r\n\r\n self.dndDragend = function (index, item, event, dropEffect) {\r\n if (dropEffect === 'none') {\r\n //self.selectSpaceObject(item)\r\n //self.componentMousedown(item, event)\r\n }\r\n\r\n if (dropEffect === 'copy') {\r\n self.FilterByAssortments(self.currentAssortmenFilter)\r\n }\r\n calculateSales();\r\n return false;\r\n }\r\n\r\n self.selectPlanogram = function (planogram) {\r\n if (self.selectedPlanogram == null || self.selectedPlanogram.id !== planogram.id) {\r\n self.selectedPlanogram = planogram;\r\n self.updateItemData(planogram);\r\n } else {\r\n self.selectedPlanogram = null;\r\n }\r\n }\r\n\r\n self.getStatusDescription = function (status) {\r\n var rv = '';\r\n\r\n switch (status) {\r\n case 0: rv = translations.Sp_editPlanogram_new; break;\r\n case 1: rv = translations.Sp_editPlanogram_pendingApproval; break;\r\n case 2: rv = translations.Sp_editPlanogram_approved; break;\r\n case 3: rv = translations.Sp_editPlanogram_informed; break;\r\n }\r\n\r\n return rv;\r\n }\r\n\r\n \r\n /**\r\n * COMPONENTE VIEJO, USAR self.getLevelUsedWidth \r\n */\r\n self.getUsedWidth = function (level, planogram) {\r\n var usedWidth = 0;\r\n var itemWidth = 0;\r\n angular.forEach(level.items, function (item) {\r\n itemWidth = item.selectedUnitOfMeasure.width;\r\n if ([2, 4].indexOf(item.orientation) != -1 ) \r\n itemWidth = item.selectedUnitOfMeasure.height;\r\n \r\n usedWidth += (itemWidth * item.facings);\r\n //usedWidth += ((item.width + (level.itemPadding * 2)) * item.facings);\r\n });\r\n\r\n //sumo el padding\r\n //usedWidth += level.items.length * level.itemPadding * 2;\r\n\r\n return usedWidth;\r\n }\r\n\r\n self.setShowDimensions = function () {\r\n self.showDimensions = !self.showDimensions;\r\n\r\n $timeout(function () {\r\n renderSizes();\r\n }, 25);\r\n\r\n\r\n }\r\n\r\n //ACA ARRANCA LO DE LAS BURBUJAS\r\n function calcLoadQuantity(item, level, planogram) {\r\n if (item == null) return;\r\n if (level == null) return;\r\n if (planogram == null) return\r\n\r\n return Math.round(item.stackBehind * item.stackAbove * item.facings);\r\n }\r\n\r\n self.showIconMinus = function (item) {\r\n if (item != null)\r\n return item.facings > 1 ? true : false\r\n else\r\n return false;\r\n }\r\n\r\n self.updateItemData = function (planogram) {\r\n //Recorro cada item de cada nivel en el planograma.\r\n angular.forEach(planogram.levels, function (level) {\r\n angular.forEach(level.items, function (item) {\r\n\r\n //1. inicializo el valor del tooltip con la traduccion.\r\n item.textTooltipItemOrientation = translations.ShowProfileItem;\r\n });\r\n });\r\n }\r\n\r\n self.addFrontItem = function (item, level, planogram, toAdd) { \r\n\r\n if (toAdd) {\r\n var usedWidth = self.getLevelUsedWidth(level);\r\n var itemWidth = self.getItemWidth(item, true);\r\n //if (usedWidth + item.selectedUnitOfMeasure.width + (level.itemPadding * 2) > planogram.width) {\r\n if (usedWidth + itemWidth > planogram.width) {\r\n swal(translations.InsufficientSpaceSwal, translations.InsufficientWidthSpaceSubtitleSwal, 'warning');\r\n return;\r\n }\r\n \r\n item.facings += 1;\r\n } else {\r\n if (item.facings === 1) {\r\n return;\r\n } else {\r\n item.facings -= 1;\r\n }\r\n\r\n }\r\n\r\n //item.stackTotal = calcLoadQuantity(item, level, planogram);\r\n\r\n self.stateChange = true;\r\n //return true;\r\n }\r\n\r\n self.addItemBehind = function (item, level, planogram, toAdd) {\r\n\r\n var usedDepth = item.selectedUnitOfMeasure.depth * item.stackBehind;\r\n\r\n if (toAdd) {\r\n if (usedDepth + item.selectedUnitOfMeasure.depth > planogram.depth) {\r\n swal(translations.InsufficientSpaceSwal, translations.InsufficientWidthSpaceSubtitleSwal, 'warning');\r\n return;\r\n }\r\n }\r\n\r\n if (toAdd) {\r\n item.stackBehind += 1\r\n } else {\r\n if (item.stackBehind == 1) {\r\n return\r\n } else {\r\n item.stackBehind -= 1\r\n }\r\n\r\n }\r\n\r\n item.stackTotal = calcLoadQuantity(item, level, planogram);\r\n\r\n self.stateChange = true;\r\n //return true;\r\n }\r\n\r\n self.addItemAbove = function (item, level, planogram, toAdd, askForLaydown) {\r\n\r\n if (toAdd) {\r\n //agrega un item al tope de la pila\r\n\r\n if (askForLaydown === undefined) {\r\n askForLaydown = true;\r\n }\r\n\r\n if (askForLaydown) {\r\n swal({\r\n title: translations.AddLayDownItemSwal,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#DD6B55\",\r\n confirmButtonText: translations.Laydown,\r\n cancelButtonText: translations.Standup,\r\n showLoaderOnConfirm: false,\r\n closeOnConfirm: false,\r\n closeOnCancel: false\r\n },\r\n function (isLayDown) {\r\n addItemAbove(item, level, isLayDown, askForLaydown);\r\n });}\r\n else {\r\n addItemAbove(item, level, false, askForLaydown);\r\n }\r\n } else {\r\n //quita el ultimo item de la pila\r\n\r\n if (item.stackAbove === 1) {\r\n if (angular.isDefined(item.layDownItem) && item.layDownItem > 0) {\r\n item.layDownItem -= 1;\r\n }\r\n } else if (item.stackAbove > 0) {\r\n item.stackAbove -= 1;\r\n }\r\n }\r\n\r\n item.stackTotal = calcLoadQuantity(item, level, planogram);\r\n self.stateChange = true;\r\n self.forceUpdateModel();\r\n }\r\n\r\n function addItemAbove(item, level, isLayDown, askForLaydown) {\r\n if (askForLaydown) {\r\n //Busca la nueva referencia al item seleccioado ya que esta funcion esta en un callback\r\n // Busca el planograma en la colección de planogramas locales.\r\n var planogram = self.findPlanogram(self.activePlanogram);\r\n\r\n // Busca la columna dentro de la colección de columnas del planograma local.\r\n var column = self.findColumn(planogram, self.selectedColumn);\r\n\r\n // Busca el módulo dentro de la colección de columnas del planograma local.\r\n module = self.findFurniture(column, self.selectedModule);\r\n\r\n level = self.findLevel(module, self.selectedLevel);\r\n\r\n // Busca el item dentro de la colección de items del estante local.\r\n item = self.findItem(level, self.selectedItem);\r\n }\r\n\r\n //calculo la altura actual considerando acostados y parados, y que orientacion tiene.\r\n var usedHeight = self.getItemHeight(item);\r\n var heightRequested = 0;\r\n if (isLayDown) {\r\n heightRequested = usedHeight + ([2, 4].indexOf(item.orientation) != -1 ? item.selectedUnitOfMeasure.width : item.selectedUnitOfMeasure.depth);\r\n }\r\n else {\r\n heightRequested = usedHeight + ([2, 4].indexOf(item.orientation) != -1 ? item.selectedUnitOfMeasure.width : item.selectedUnitOfMeasure.height);\r\n }\r\n\r\n if (heightRequested > level.height) {\r\n //no hay espacio\r\n swal(translations.InsufficientSpaceSwal, translations.InsufficientHeightSpaceSubtitleSwal, 'warning');\r\n }\r\n else {\r\n if (askForLaydown)\r\n swal(translations.TheItemWasAdded, translations.Aggregate, 'success');\r\n\r\n if (isLayDown) {\r\n item.layDownItem = angular.isDefined(item.layDownItem) ? (item.layDownItem + 1) : 1;\r\n $scope.$apply();\r\n self.forceUpdateModel();\r\n } else {\r\n item.stackAbove += 1;\r\n $scope.$apply();\r\n self.forceUpdateModel();\r\n }\r\n }\r\n }\r\n\r\n self.rotateItem = function (item, level, planogram) {\r\n if (item.rotation) {\r\n item.rotation = undefined;\r\n }\r\n else {\r\n item.rotation = 90;\r\n }\r\n }\r\n\r\n self.changeFront = function (item, level, module, column, planogram) {\r\n self.stateChange = true;\r\n\r\n var itemAux = angular.copy(item); \r\n\r\n if (!itemAux.orientation) {\r\n itemAux.orientation = 1;\r\n }\r\n\r\n itemAux.orientation += 1;\r\n\r\n if (itemAux.orientation > 4) {\r\n itemAux.orientation = 1;\r\n }\r\n\r\n var usedWidth = self.getLevelUsedWidth(level);\r\n var requiredWidth = self.getItemWidth(itemAux);\r\n var itemWidth = self.getItemWidth(item);\r\n\r\n var requiredHeight = self.getItemHeight(itemAux);\r\n\r\n if ((((usedWidth - itemWidth) + requiredWidth) > module.width)\r\n || requiredHeight > level.height) {\r\n swal(translations.InsufficientSpaceSwal,\r\n translations.InsufficientWidthSpaceSubtitleSwal,\r\n 'warning');\r\n return false;\r\n }\r\n else {\r\n item.orientation = itemAux.orientation;\r\n return true;\r\n }\r\n }\r\n\r\n self.itemToFront = function (item, level, planogram) {\r\n self.stateChange = true;\r\n item.showMode = undefined;\r\n item.orientation = 0;\r\n }\r\n\r\n self.itemToSide = function (item, level, planogram) {\r\n self.stateChange = true;\r\n item.showMode = 'S';\r\n }\r\n\r\n self.itemToTop = function (item, level, planogram) {\r\n self.stateChange = true;\r\n item.showMode = 'T';\r\n }\r\n\r\n self.deleteItem = function (item, level) {\r\n var itemLocal = item;\r\n var levelLocal = level;\r\n swal({\r\n title: translations.SureDeleteItemSwal + ' ' + item.name + '?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#DD6B55\",\r\n confirmButtonText: translations.RemoveSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: true,\r\n closeOnCancel: true\r\n },\r\n function deleteItemConfirmCallback(isConfirm) {\r\n if (isConfirm) {\r\n $scope.$apply(function deleteItemScopeApply() {\r\n var idx = levelLocal.items.indexOf(itemLocal);\r\n levelLocal.items.splice(idx, 1);\r\n\r\n self.countPlanogramItems();\r\n self.stateChange = true;\r\n\r\n // Deselecciona.\r\n self.activePlanogram = null;\r\n self.selectedColumn = null;\r\n self.selectedModule = null;\r\n self.selectedLevel = null;\r\n self.selectedItem = null;\r\n self.selectedItemId = 0;\r\n self.filtereditems =[];\r\n self.renderPieChartsParent(null);\r\n\r\n\r\n // Actualiza la carga total del item en el planograma\r\n calculateStackTotalForPlanogram(item.itemId);\r\n\r\n // Actualiza los días de exibición del item en el planograma.\r\n self.calcExhibitionDays(item.itemId);\r\n\r\n self.forceUpdateModel();\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.goToTickets = function (planogram, item) {\r\n //console.log('item', item);\r\n $state.go('spaces.tickets', { planogramLevelItemId: item.id, layoutObjectId: 0 });\r\n }\r\n\r\n //ACA TERMINA LO DE LAS BURBUJAS\r\n self.setShowProducts = function () {\r\n self.showProducts = !self.showProducts;\r\n $timeout(function () {\r\n renderSizes();\r\n }, 25);\r\n\r\n self.showProducts ? self.buttonTextProducts = translations.HideProducts : self.buttonTextProducts = translations.ShowProducts\r\n\r\n }\r\n\r\n self.setShowInformationPanel = function () {\r\n self.showInformationPanel = !self.showInformationPanel;\r\n $timeout(function () {\r\n renderSizes();\r\n }, 25);\r\n\r\n self.showInformationPanel ? self.buttonTextInformationPanel = translations.HideInformation : self.buttonTextInformationPanel = translations.ShowInformation\r\n }\r\n\r\n self.showLevelEditor = function (planogram) {\r\n\r\n self.editLevelsPlanogram = Object.assign({}, planogram);\r\n self.newLevel = {\r\n order: 'up'\r\n }\r\n\r\n var suma = 0\r\n angular.forEach(self.editLevelsPlanogram.levels, function (level, i) {\r\n level.levelNumber = i + 1;\r\n suma += level.height\r\n })\r\n self.editLevelsPlanogram.height = suma\r\n\r\n ngDialog.open({\r\n template: 'levelEditorDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-400',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.addLevelToPlanogram = function (planogram) {\r\n\r\n ngDialog.close();\r\n }\r\n\r\n self.addNewLevelToNewPlanogram = function () {\r\n if (self.newLevel.height) {\r\n if (self.newLevel.order == 'up') {\r\n self.editLevelsPlanogram.levels.push({\r\n categoryId: null,\r\n categoryName: \"\",\r\n height: self.newLevel.height,\r\n id: 0,\r\n itemPadding: 1,\r\n items: [],\r\n //levelNumber: self.newLevel.levelNumber,\r\n })\r\n } else {\r\n self.editLevelsPlanogram.levels.unshift({\r\n categoryId: null,\r\n categoryName: \"\",\r\n height: self.newLevel.height,\r\n id: 0,\r\n itemPadding: 1,\r\n items: [],\r\n //levelNumber: self.newLevel.levelNumber,\r\n })\r\n }\r\n\r\n var suma = 0\r\n angular.forEach(self.editLevelsPlanogram.levels, function (level, i) {\r\n level.levelNumber = i + 1;\r\n suma += level.height\r\n })\r\n self.editLevelsPlanogram.height = suma\r\n }\r\n }\r\n\r\n self.editHeightLevel = function (level, bool) {\r\n if (bool) {\r\n ++level.height\r\n } else {\r\n --level.height\r\n }\r\n var suma = 0\r\n angular.forEach(self.editLevelsPlanogram.levels, function (level, i) {\r\n level.levelNumber = i + 1;\r\n suma += level.height\r\n })\r\n self.editLevelsPlanogram.height = suma\r\n }\r\n\r\n self.deleteLevel = function (level) {\r\n var levels = []\r\n var i = -1\r\n angular.forEach(self.editLevelsPlanogram.levels, function (levelPlanogram, index) {\r\n if (level.levelNumber == levelPlanogram.levelNumber) {\r\n i = index\r\n }\r\n })\r\n if (i != -1) {\r\n self.editLevelsPlanogram.levels.splice(i, 1);\r\n }\r\n var suma = 0\r\n angular.forEach(self.editLevelsPlanogram.levels, function (level, i) {\r\n level.levelNumber = i + 1;\r\n suma += level.height\r\n })\r\n self.editLevelsPlanogram.height = suma\r\n }\r\n\r\n self.calHeigtLevel = function (level) {\r\n var domElement = document.getElementById(\"containerEditPlanogram\");\r\n var domElementSize = domElement.getBoundingClientRect()\r\n var height = level.height * domElementSize.width / Number(self.editLevelsPlanogram.width);\r\n\r\n return height;\r\n }\r\n\r\n self.calcItemWidth = function (item, level, planogram) {\r\n var levelWidthPx = self.calcLevelWidth(level);\r\n\r\n var widthPx = ((item.selectedUnitOfMeasure.width) * levelWidthPx) / planogram.width;\r\n\r\n return widthPx;\r\n }\r\n\r\n self.calcItemHeight = function (item, level) {\r\n\r\n var heightPx = item.selectedUnitOfMeasure.height * item.widthPx / item.selectedUnitOfMeasure.width;\r\n\r\n return heightPx;\r\n }\r\n\r\n self.calcItemDepth = function (item, level) {\r\n\r\n var depthPx = item.selectedUnitOfMeasure.depth * item.widthPx / item.selectedUnitOfMeasure.width;\r\n\r\n return depthPx;\r\n }\r\n\r\n self.calcItemSize = function (item, level, planogram) {\r\n item.widthPx = self.calcItemWidth(item, level, planogram);\r\n item.heightPx = self.calcItemHeight(item, level, planogram);\r\n item.depthPx = self.calcItemDepth(item, level, planogram);\r\n }\r\n\r\n self.calcLevelWidth = function (level) {\r\n\r\n var widthPx = 0;\r\n\r\n var leveldiv = document.getElementById('planogramLevel_' + level.id);\r\n\r\n if (leveldiv) {\r\n widthPx = leveldiv.clientWidth;\r\n }\r\n\r\n\r\n return widthPx;\r\n }\r\n\r\n self.doFilterApply = function (item) {\r\n\r\n if (self.selectedItemId && item.itemId !== self.selectedItemId) {\r\n return false;\r\n }\r\n\r\n if (self.selectedItem && item.itemId !== self.selectedItem.itemId) {\r\n return false;\r\n }\r\n\r\n if (self.search) {\r\n var searchAux = self.search.toLowerCase();\r\n if (item.name.toLowerCase().indexOf(searchAux) === -1\r\n && item.code.toLowerCase().indexOf(searchAux) === -1\r\n && item.ean.toLowerCase().indexOf(searchAux) === -1) {\r\n return false;\r\n }\r\n }\r\n\r\n // TODO: Localizar o pasar a un Enum selectedStatus.\r\n if (self.selectedStatus === 'Nuevos' && !item.isNew) {\r\n return false;\r\n }\r\n\r\n if (self.selectedStatus === 'Delistados' && !item.isListed) {\r\n return false;\r\n }\r\n\r\n if (self.selectedStatus === 'Quiebre de Stock' && !item.isOutOfStock) {\r\n return false;\r\n }\r\n\r\n if (self.selectedBrand !== \"!null\"\r\n && (!item.brand || (item.brand && item.brand.toLowerCase() !== self.selectedBrand.toLowerCase()))) {\r\n return false;\r\n }\r\n\r\n if (self.selectedManufacturer !== \"!null\"\r\n && (!item.manufacturer ||\r\n (item.manufacturer && item.manufacturer.toLowerCase() !== self.selectedManufacturer.toLowerCase()))) {\r\n return false;\r\n }\r\n\r\n if (self.categoryFilter !== '!null' && item.categoryId !== self.categoryFilter) {\r\n return false;\r\n }\r\n\r\n //Tags\r\n if (self.selectedTagFilter && self.selectedTagFilter.id) {\r\n var matchedTag = false;\r\n angular.forEach(item.tags, function (_tag) {\r\n\r\n if (_tag.id === self.selectedTagFilter.id) {\r\n matchedTag = true;\r\n }\r\n });\r\n\r\n return matchedTag;\r\n\r\n }\r\n\r\n return true;\r\n }\r\n\r\n self.setHeatMap = function (displayName, variable) {\r\n console.log('setHEatMap', displayName, variable)\r\n self.heatMapVariable = displayName;\r\n self.heatMapVariableValue = variable;\r\n\r\n self.heatMapEnabled = variable === '' ? false : true;\r\n\r\n if (self.heatMapEnabled) {\r\n // Apaga el map de bloque.\r\n self.setGroupMap('', '');\r\n\r\n // Calcula los colores.\r\n var min = 9999999999999999;\r\n var max = 0;\r\n loopThroughAll(function (planogram, column, module, level, item) {\r\n var value = item[self.heatMapVariableValue];\r\n if (value > max) {\r\n max = value;\r\n }\r\n\r\n if (value < min) {\r\n min = value;\r\n }\r\n }, self.until.items).then(function () {\r\n self.getRanking();\r\n });\r\n\r\n } else {\r\n self.resetFillColor();\r\n }\r\n\r\n self.closeFilters();\r\n\r\n // Fuerza una nueva referencia del planograma para que se detecte el cambio en los componentes.\r\n self.forceUpdateModel();\r\n }\r\n\r\n // Visual tipo Nielsen por bloque.\r\n self.setGroupMap = function (displayName, variable) {\r\n //$log.debug('setGroupMap displayName: %o variable: %o', displayName, variable);\r\n self.groupMapVariable = displayName;\r\n self.groupMapVariableValue = variable;\r\n\r\n // Determina si esta habilitado o no el filtro.\r\n self.groupMapEnabled = variable === '' ? false : true;\r\n\r\n // Calula los grupos\r\n if (self.groupMapEnabled) {\r\n // apaga el mapa de calor.\r\n self.setHeatMap('', '');\r\n self.groupMap = {};\r\n var espacioLinealTotal = 0.0;\r\n var ventasTotales = 0.0;\r\n\r\n if (self.groupMapVariableValue.indexOf('tag:') > -1) {\r\n var groupMapVariableValue = self.groupMapVariableValue.replace('tag:', '');\r\n\r\n // Filtra los tags por el grupo,\r\n self.groupMapTags = self.allTags.filter(function (tag) {\r\n return tag.group === groupMapVariableValue;\r\n });\r\n } else {\r\n self.groupMapTags = [];\r\n }\r\n\r\n // Obtiene el planograma y calcula el area.\r\n // TODO: Verificar que el planograma traiga los valores de ancho y alto.\r\n var planogram = self.selectedPlanogram;\r\n var totalLinearSpace = 0;\r\n\r\n // Recorre todos los items de todos los niveles del planograma.\r\n loopThroughAll(function (planogram, column, module, level, item) {\r\n //var itemFull = self.getItem(item.itemId);\r\n var blockKey = self.getGroupMapBlockKey(item, self.groupMapVariableValue, self.groupMapTags);\r\n\r\n if (angular.isDefined(blockKey) && !angular.isDefined(self.groupMap[blockKey])) {\r\n var name = self.getGroupMapName(item, self.groupMapVariableValue, self.groupMapTags);\r\n self.groupMap[blockKey] = {\r\n color: 'FFFFFF',\r\n name: name,\r\n shareVentas: 0.0,\r\n shareEspacios: 0.0,\r\n share: 0.0,\r\n espaciosLineal: 0.0,\r\n ventasTotales: 0.0,\r\n orden: 0\r\n };\r\n }\r\n\r\n var group = self.groupMap[blockKey];\r\n var espaciosLineal = self.getLinearSpace(item);\r\n group.espaciosLineal += espaciosLineal;\r\n totalLinearSpace += espaciosLineal;\r\n\r\n // TODO: Ver propiedad.\r\n group.ventasTotales += item.sales || 0.0;\r\n\r\n espacioLinealTotal += espaciosLineal;\r\n ventasTotales += item.sales || 0.0;\r\n }, self.until.items);\r\n\r\n var groupMapAux = [];\r\n var keys = Object.keys(self.groupMap);\r\n angular.forEach(keys, function (key, idx) {\r\n var group = self.groupMap[key];\r\n\r\n // Asigna un color al grupo.\r\n group.color = self.colors[idx];\r\n\r\n // Para calcular el share de espacio = espacio lineal del item / (ancho x alto del planograma)\r\n // Share de espacio de un grupo = suma de espacios de productos en ese grupo / suma de espacios totales\r\n group.shareEspacios = group.espaciosLineal / totalLinearSpace;\r\n\r\n // Share de venta de un grupo = suma de ventas de productos en ese grupo / suma de ventas total.\r\n group.shareVentas = group.ventasTotales / ventasTotales;\r\n\r\n // La divisi?n entre Share de venta / Share de espacio. Si da un numero > 1 entonces est? sobreespaciado. Menor a 1 est? subespaciado.\r\n group.share = group.shareVentas / group.shareEspacios;\r\n\r\n // Agrega al array auxiliar.\r\n groupMapAux.push(group);\r\n });\r\n\r\n // Ordena por shareVentas de mayor a menor y lo invierte.\r\n self.groupMapList = groupMapAux.sort(function (a, b) {\r\n var ret;\r\n if (a.shareVentas > b.shareVentas) {\r\n ret = 1;\r\n } else if (a.shareVentas < b.shareVentas) {\r\n ret = -1;\r\n } else {\r\n // a must be equal to b\r\n ret = 0;\r\n }\r\n\r\n return ret;\r\n }).reverse();\r\n\r\n // Recorre todos los items de todos los niveles del planograma.\r\n loopThroughAll(function (planogram, column, module, level, item) {\r\n var itemFull = self.getItem(item.itemId);\r\n var blockKey = self.getGroupMapBlockKey(itemFull, self.groupMapVariableValue, self.groupMapTags);\r\n var fill = '#' + self.groupMap[blockKey].color;\r\n item.fill = fill;\r\n item.opacity = 0.2;\r\n }, self.until.items);\r\n\r\n } else {\r\n self.groupMapList = [];\r\n self.groupMapTags = [];\r\n self.resetFillColor();\r\n }\r\n\r\n self.closeFilters();\r\n\r\n // Fuerza una nueva referencia del planograma para que se detecte el cambio en los componentes.\r\n self.forceUpdateModel();\r\n };\r\n\r\n self.resetFillColor = function () {\r\n loopThroughAll(function (planogram, column, module, level, item) {\r\n item.fill = 'none';\r\n item.opacity = 1;\r\n }, self.until.items);\r\n };\r\n\r\n self.getItem = function (itemId) {\r\n var idx = self.itemList.findIndex(function (item) {\r\n return item.itemId === itemId;\r\n });\r\n\r\n var ret = self.itemList[idx];\r\n return ret;\r\n }\r\n\r\n self.getGroupMapBlockKey = function (item, groupMapVariableValue, tagsValues) {\r\n var ret;\r\n if (groupMapVariableValue.indexOf('tag:') > -1) {\r\n groupMapVariableValue = groupMapVariableValue.replace('tag:', '');\r\n tagsValues = tagsValues || self.allTags.filter(function (tag) {\r\n return tag.id === groupMapVariableValue;\r\n });\r\n var idx = tagsValues.findIndex(function (tagVal) {\r\n return item.tags.findIndex(function (tag) {\r\n return tag.id === tagVal.id;\r\n }) > -1;\r\n });\r\n\r\n if (idx > -1) {\r\n ret = tagsValues[idx].id;\r\n } else {\r\n ret = translations.NotInformed;\r\n }\r\n } else {\r\n ret = String(item[groupMapVariableValue]).toLowerCase().trim();\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n self.getBlockMapStyle = function (item) {\r\n return {\r\n 'background-color': '#' + item.color\r\n };\r\n };\r\n\r\n /**\r\n * Devuelve el nombre de un grupo.\r\n * @param {any} item\r\n */\r\n self.getGroupMapName = function (item, groupMapVariableValue, tagsValues) {\r\n var ret;\r\n var idx;\r\n if (groupMapVariableValue.indexOf('tag:') > -1) {\r\n groupMapVariableValue = groupMapVariableValue.replace('tag:', '');\r\n tagsValues = tagsValues || self.allTags.filter(function (tag) {\r\n return tag.group === groupMapVariableValue;\r\n });\r\n idx = tagsValues.findIndex(function (tagVal) {\r\n return item.tags.findIndex(function (tag) {\r\n return tag.id === tagVal.id;\r\n }) > -1;\r\n });\r\n\r\n if (idx > -1) {\r\n ret = tagsValues[idx].name.trim();\r\n } else {\r\n ret = translations.NotInformed;\r\n }\r\n } else if (groupMapVariableValue === 'categoryId') {\r\n ret = item.categoryName.trim();\r\n } else {\r\n ret = String(item[groupMapVariableValue]).trim();\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve el espacio lineal de un item.\r\n * @param {any} item\r\n */\r\n self.getLinearSpace = function (item) {\r\n return item.selectedUnitOfMeasure.width * item.facings;\r\n // Calcula el espacio lineal de cada item.\r\n // - Si la orientacion del item(propiedad Orientation de SpacePlanogramLevelItems) es = 0, 1, 3 u 11 entonces espacio lineal = Width del item X los facings(numero de frentes). \r\n // - Si la orientacion del item es 2 o 4 => height del item X facings\r\n // - Si la orientacion del item es 12, 21 o 22 => depth del item x facings\r\n var ret;\r\n if ([0, 1, 3, 11].indexOf(item.orientation) > -1) {\r\n ret = item.width * item.facings;\r\n } else if ([2, 4].indexOf(item.orientation) > -1) {\r\n ret = item.height * item.facings;\r\n } else if ([12, 21, 22].indexOf(item.orientation) > -1) {\r\n ret = item.depth * item.facings;\r\n } else {\r\n ret = 0.0;\r\n }\r\n //console.log(item.name + ' = ' + ret + ' ' + item.facings, item);\r\n return ret;\r\n };\r\n\r\n\r\n self.getBlockMap = function () {\r\n return self.groupMapList;\r\n }\r\n\r\n self.openChat = function (item) {\r\n //console.log('openchat', item);\r\n self.editItem = item;\r\n\r\n if (!self.editItem.chats)\r\n self.editItem.chats = [];\r\n\r\n ngDialog.open({\r\n template: 'itemChatDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.addChatToItem = function (newChat) {\r\n self.editItem.chats.push({\r\n user: authService.authentication.userName,\r\n message: newChat,\r\n date: new Date()\r\n });\r\n\r\n self.newChat = '';\r\n }\r\n\r\n self.closeChat = function () {\r\n ngDialog.close();\r\n }\r\n\r\n self.getMaxHeight = function () {\r\n var domElement = document.getElementsByClassName(\"testClass\");\r\n var max = 0;\r\n angular.forEach(domElement, function (e) {\r\n var rect = e.getBoundingClientRect();\r\n if (max < rect.height)\r\n max = rect.height;\r\n })\r\n //console.log('max', max);\r\n return max + 30;\r\n }\r\n\r\n self.getSelectedPlanogramBorder = function (planogram) {\r\n if (self.selectedPlanogram == null || self.isEdit())\r\n return 0;\r\n\r\n if (self.selectedPlanogram.id == planogram.id)\r\n return 1;\r\n return 0;\r\n }\r\n\r\n self.setItemLayoutForPlanogram = function (planogram, justifyContent) {\r\n planogram.justifyContent = justifyContent;\r\n }\r\n\r\n self.countPlanogramItems = function () {\r\n var count = 0;\r\n if (self.selectedPlanogram != null) {\r\n\r\n loopThroughAll(function countPlanogramItemsLoopThroughAll(planogram, column, module, level, item) {\r\n count += 1;\r\n }, self.until.items).then(function () {\r\n self.selectedPlanogram.totalItem = count;\r\n });\r\n }\r\n\r\n return count;\r\n }\r\n\r\n self.getItemsTotal = function (items, variable) {\r\n var rv = 0;\r\n angular.forEach(items, function (item) {\r\n rv += item[variable];\r\n });\r\n return rv;\r\n }\r\n\r\n self.filterByStatus = function (status) {\r\n\r\n clearFilteredItems();\r\n\r\n self.selectedStatus = status;\r\n\r\n filterBy();\r\n\r\n }\r\n\r\n //Animacion cuando cierra la topbar, si no hay filtros seleccionados\r\n self.closeSelectedFilters = function () {\r\n if (self.selectedBrand == '!null' && self.selectedManufacturer == '!null' && self.selectedTagFilter == null) {\r\n return 'closeFilters';\r\n }\r\n }\r\n //Borra todos los filtros seleccionados\r\n self.cleanAllFilter = function () {\r\n self.selectedBrand = '!null';\r\n self.selectedManufacturer = '!null';\r\n self.selectedTagFilter = null;\r\n\r\n clearFilteredItems();\r\n\r\n $timeout(function () {\r\n self.showChipsFilter = false;\r\n }, 200);\r\n\r\n\r\n }\r\n\r\n self.clearSelectedFilter = function (filter) {\r\n\r\n clearFilteredItems();\r\n\r\n if (filter === 'brand') {\r\n self.selectedBrand = '!null';\r\n }\r\n\r\n if (filter === 'manufacturer') {\r\n self.selectedManufacturer = '!null';\r\n }\r\n\r\n if (filter === 'tag') {\r\n self.selectedTagFilter = null;\r\n }\r\n\r\n\r\n if (self.selectedBrand == '!null' && self.selectedManufacturer == '!null' && self.selectedTagFilter == null) {\r\n $timeout(function () {\r\n self.showChipsFilter = false;\r\n }, 200);\r\n }\r\n\r\n\r\n filterBy();\r\n }\r\n\r\n function filterBy() {\r\n\r\n //get filtered items\r\n loopThroughAll(\r\n function filterByLoopThroughAll(planogram, column, module, level, item) {\r\n if (self.doFilterApply(item)) {\r\n self.filteredItems.push(item);\r\n }\r\n },\r\n self.until.items)\r\n .then(function filterByThen() {\r\n\r\n // console.log(self.filteredItems);\r\n //$log.debug('EditPlanogramCtrl::filterBy filteredItems: %o', self.filteredItems);\r\n\r\n self.closeFilters();\r\n\r\n //render charts\r\n // renderPieCharts(null);\r\n $timeout(1).then(function () {\r\n self.renderPieChartsParent(null);\r\n self.updateModel();\r\n });\r\n });\r\n }\r\n\r\n self.filterByBrand = function (brand) {\r\n\r\n self.showChipsFilter = true;\r\n\r\n clearFilteredItems();\r\n\r\n self.selectedBrand = brand;\r\n\r\n filterBy();\r\n }\r\n\r\n self.filterByManufacturer = function (manufacturer) {\r\n\r\n self.showChipsFilter = true;\r\n\r\n clearFilteredItems();\r\n\r\n self.selectedManufacturer = manufacturer;\r\n\r\n filterBy();\r\n }\r\n\r\n self.filterByTag = function (tag) {\r\n\r\n self.showChipsFilter = true;\r\n\r\n clearFilteredItems();\r\n\r\n self.selectedTagFilter = tag;\r\n\r\n filterBy();\r\n }\r\n\r\n self.showNewTicketModal = function (item) {\r\n self.newTicket = GenerateNewTicket();\r\n\r\n self.editItem = item;\r\n\r\n if (!self.editItem.tickets)\r\n self.editItem.tickets = [];\r\n\r\n ngDialog.open({\r\n template: 'ticketNewDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-500',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.openTicketDelist = function (tipo) { // TODO: A ESTE LO LLAMAS VOS DESDE EL OTRO POPUP, TOCANDO CUALQUIERA DE LOS 2 BOTONES (PARAMETRO TIPO = 'retirar' o 'liquidar'\r\n self.newTicket = GenerateNewTicket();\r\n var ticketType = {};\r\n angular.forEach(self.ticketTypes, function (type) {\r\n\r\n if (type.id == 8 && tipo == 'liquidar')\r\n ticketType = type;\r\n if (type.id == 10 && tipo == 'retirar')\r\n ticketType = type11;\r\n })\r\n self.newTicket.title = ticketType;\r\n self.newTicket.description = \"Se pide \" + tipo + \" el item \";\r\n self.newTicket.priority = \"Alta\";\r\n\r\n\r\n ngDialog.open({\r\n template: 'ticketNewDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-500',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.showDelistPopup = function (item) { //PASO 1, CREAR EL SCRIPT DEL POPUP NUEVO, QUE TENGA 2 BOTONES QUE LLAMEN A ct.openTicketDelist('retirar') o ct.openTicketDelist('liquidar') 1: Liquidar Producto; 2: Pedir Retiro \r\n if (item.tag == 'Delistado') {\r\n\r\n if (!item.tickets)\r\n item.tickets = [];\r\n self.editItem = item;\r\n\r\n ngDialog.open({\r\n template: 'modal-tag-delistado',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-500',\r\n scope: $scope\r\n });\r\n }\r\n }\r\n\r\n self.savePlanogram = function (status) {\r\n\r\n var swaltitle = translations.SavePlanogramSwalTitle;\r\n\r\n if (!self.hasPermissionToEdit) {\r\n swal(translations.ErrorTitleSwal, translations.InsufficientPermissionsToEdit, \"error\");\r\n return;\r\n }\r\n\r\n if (status == 1) {\r\n if (!self.hasPermissionToEdit) {\r\n swal(translations.ErrorTitleSwal, translations.InsufficientPermissionsToEditPlanogram, \"error\");\r\n return;\r\n }\r\n\r\n swaltitle = translations.FinishThePlanogram;\r\n }\r\n else if (status == 2) {\r\n if (!self.hasPermissionToEndorse) {\r\n swal(translations.ErrorTitleSwal, translations.InsufficientPermitsToApprove, \"error\");\r\n return;\r\n }\r\n\r\n swaltitle = translations.YouWantToApproveThePlanogram;\r\n }\r\n else if (status == 3) {\r\n if (!self.hasPermissionToInform) {\r\n swal(translations.ErrorTitleSwal, translations.InsufficientPermissionsToReport, \"error\");\r\n return;\r\n }\r\n swaltitle = translations.CommunicateThePlanogram;\r\n }\r\n\r\n swal({\r\n title: swaltitle,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n if (!self.isSaving) {\r\n\r\n self.isSaving = true;\r\n //self.polygonContainer[0].points = pixelsToPercentage(self.polygonContainer[0].pointsPx);\r\n\r\n var planogramDto = {\r\n id: self.selectedPlanogram.id,\r\n companyId: self.selectedPlanogram.companyId,\r\n name: self.selectedPlanogram.name,\r\n code: self.selectedPlanogram.code,\r\n categoryId: self.selectedPlanogram.categoryId,\r\n categoryName: self.selectedPlanogram.categoryName,\r\n orientationRightToLeft: self.selectedPlanogram.orientationRightToLeft,\r\n width: self.selectedPlanogram.width,\r\n height: self.selectedPlanogram.height,\r\n depth: self.selectedPlanogram.depth,\r\n clusters: self.selectedPlanogram.clusters,\r\n //subCategories: self.selectedPlanogram.subCategories,\r\n columns: self.selectedPlanogram.columns,\r\n stores: self.selectedPlanogram.stores,\r\n }\r\n\r\n var data;\r\n\r\n //if (self.showPlanogramComponentSvg()) {\r\n // data = angular.copy(self.activePlanogram);\r\n //} else {\r\n // data = angular.copy(self.selectedPlanogram);\r\n //}\r\n\r\n //FIX calculo totalItems\r\n self.countPlanogramItems();\r\n\r\n //se prepara el modelo y se borran las propiedades que no estan en el modelo para enviar al servidor\r\n data = angular.copy(self.selectedPlanogram);\r\n\r\n data.inventory = data.inventory || null;\r\n\r\n delete data.subCategories;\r\n delete data.storesInfo;\r\n delete data.units;\r\n delete data.sales;\r\n delete data.margin;\r\n delete data.inventoryUnits;\r\n delete data.inventory;\r\n\r\n angular.forEach(data.columns, function (column) {\r\n delete column.selected;\r\n delete column.height;\r\n delete column.depth;\r\n delete column.widthPercentage;\r\n angular.forEach(column.modules,\r\n function (module) {\r\n delete module.selected;\r\n delete module.widthPercent;\r\n delete module.heightPx;\r\n delete module.widthPx;\r\n angular.forEach(module.levels,\r\n function (level) {\r\n delete level.selected;\r\n delete level.heightPx;\r\n delete level.paddingItemsPx;\r\n delete level.usedWidth;\r\n angular.forEach(level.items,\r\n function (item) {\r\n if (angular.isNumber(item.positionX)) {\r\n item.positionX = item.positionX.toFixed(4);\r\n }\r\n\r\n if (angular.isNumber(item.positionY)) {\r\n item.positionY = item.positionY.toFixed(4);\r\n }\r\n\r\n delete item.id;\r\n item.itemCode = item.itemCode || item.code;\r\n item.itemEan = item.itemEan || item.ean;\r\n item.ticketCount = item.ticketCount || 0;\r\n delete item.filtered;\r\n delete item.widthPx;\r\n delete item.heightPx;\r\n delete item.depthPx;\r\n delete item.textTooltipItemOrientation;\r\n delete item.isListed;\r\n delete item.isOutOfStock;\r\n delete item.isNewItem;\r\n delete item.unitOfMeasures;\r\n delete item.storesInfo;\r\n delete item.showByAssortment;\r\n delete item.code;\r\n delete item.ean;\r\n delete item.imageUrl;\r\n delete item.weight;\r\n delete item.baseUnitOfMeasureId;\r\n delete item.createdDate;\r\n delete item.monthsForNewItem;\r\n delete item.sales;\r\n delete item.units;\r\n delete item.margin;\r\n delete item.price;\r\n delete item.daysOutOfStock;\r\n delete item.inventory;\r\n delete item.inventoryUnits;\r\n delete item.currentInventory;\r\n delete item.currentInventoryUnits;\r\n delete item.inventoryDays;\r\n delete item.gmros;\r\n delete item.gmroi;\r\n delete item.regularPrice;\r\n delete item.uniqueId;\r\n delete item.exhibitionDays;\r\n delete item.selected;\r\n delete item.parentCategoryId;\r\n delete item.parentCategoryName;\r\n\r\n });\r\n });\r\n });\r\n });\r\n\r\n \r\n \r\n spaceService.planograms.editPlanogram(data, status).then(function (res) {\r\n self.stateChange = false;\r\n\r\n self.selectedPlanogram.status = status;\r\n\r\n swal(translations.SavedPlanogramSwal,\r\n translations.SavedPlanogramaSwalSubtitle,\r\n 'success');\r\n \r\n self.isSaving = false;\r\n\r\n //creo una copia fresca para la deteccion de cambios\r\n makeCopyForChangeDetection();\r\n \r\n }, function () {\r\n\r\n swal(translations.ErrorTitleSwal, translations.AnErrorHasOccurred, \"error\");\r\n self.isSaving = false;\r\n }); \r\n }\r\n }\r\n else {\r\n\r\n }\r\n });\r\n }\r\n\r\n function isValidField(field) {\r\n if (field == undefined || field == null || field == '')\r\n return false;\r\n\r\n return true;\r\n }\r\n\r\n self.saveNewTicket = function () {\r\n if (!isValidField(self.newTicket.description) && !isValidField(self.newTicket.priority)) {\r\n swal(translations.ValidationSwalTitle, translations.ValidationSwalSubtitle, 'error');\r\n return;\r\n }\r\n\r\n var dataTicket = {\r\n ticketTypeId: self.newTicket.title.id,\r\n priority: self.newTicket.priority.id,\r\n description: self.newTicket.description,\r\n planogramLevelItemId: self.editItem.id\r\n }\r\n spaceService.tickets.saveTicket(dataTicket).then(function (res) {\r\n $timeout(function () {\r\n self.editItem.ticketCount++;\r\n });\r\n ngDialog.close();\r\n swal(translations.SavedTicketSwal, translations.SavedTicketSwalSubtitle, 'success');\r\n\r\n });\r\n }\r\n\r\n self.filterBySubCategory = function (categoryId) {\r\n self.categoryFilter = categoryId;\r\n }\r\n\r\n self.selectedItemList = function (item) {\r\n self.selectedItem = null;\r\n if (item == null || (self.selectedItemId && item.id === self.selectedItemId)) {\r\n //deselect\r\n if (self.isEdit()) {\r\n self.selectedItemId = null;\r\n }\r\n }\r\n else {\r\n //select\r\n if (self.isEdit()) {\r\n self.selectedItemId = item.itemId;\r\n }\r\n }\r\n }\r\n\r\n function clearFilteredItems() {\r\n //deselect item\r\n self.activePlanogram = null;\r\n self.selectedColumn = null;\r\n self.selectedModule = null;\r\n self.selectedLevel = null;\r\n\r\n self.selectedItemId = 0;\r\n self.selectedItem = null;\r\n\r\n\r\n //Clear filtered items\r\n self.filteredItems = [];\r\n }\r\n\r\n self.selectItem = function (item) {\r\n\r\n clearFilteredItems();\r\n\r\n //Cuando selecciono un producto, saco el resto de los filtros.\r\n self.categoryFilter = '!null';\r\n self.selectedBrand = '!null';\r\n self.selectedManufacturer = '!null';\r\n self.selectedStatus = '!null';\r\n self.selectedTagFilter = null;\r\n\r\n self.selectedItemId = item.itemId;\r\n self.selectedItem = item;\r\n\r\n filterBy();\r\n }\r\n\r\n\r\n self.selectTags = function (tag) {\r\n self.selectedTag = tag;\r\n self.textSelectedTag = tag;\r\n }\r\n\r\n self.selectStatus = function (status) {\r\n self.selectedStatus = status;\r\n self.textSelectedStatus = status;\r\n\r\n //self.FilterByExhibition(status);\r\n }\r\n\r\n self.countItemActive = 0;\r\n self.countItemWithoutExhibition = 0;\r\n self.countItemDelist = 0;\r\n self.calcNumItems = function () {\r\n self.countItemActive = 0;\r\n self.countItemWithoutExhibition = 0;\r\n self.countItemWithExhibition = 0;\r\n self.countItemDelist = 0;\r\n self.countItemNew = 0;\r\n var memoItemsIdWithoutExhibition = [];\r\n //var memoItemsIdDelist = [];\r\n\r\n angular.forEach(self.itemList, function (_item) {\r\n if (_item.isNewItem) self.countItemNew++\r\n\r\n if (_item.isListed) {\r\n self.countItemActive++\r\n self.countItemWithoutExhibition++\r\n\r\n loopThroughAll(function (planogram, column, module, level, item) {\r\n if (item.itemId == _item.itemId && memoItemsIdWithoutExhibition.indexOf(item.itemId) == -1) {\r\n self.countItemWithoutExhibition--;\r\n self.countItemWithExhibition++;\r\n memoItemsIdWithoutExhibition.push(item.itemId);\r\n }\r\n }, self.until.items);\r\n\r\n } else {\r\n //LG: Antes considerabamos un Delistado cuando estaba exhibido y su status era delistado\r\n //LG: Ahora no tomamos en cuenta si está o no está exhibido.\r\n self.countItemDelist++;\r\n //memoItemsIdDelist.push(item.itemId);\r\n /*\r\n loopThroughAll(function (planogram, column, module, level, item) {\r\n if (item.itemId == _item.itemId && memoItemsIdDelist.indexOf(item.itemId) == -1) {\r\n self.countItemDelist++;\r\n memoItemsIdDelist.push(item.itemId);\r\n }\r\n }, self.until.items);\r\n */\r\n }\r\n });\r\n }\r\n\r\n self.productStatus = ''\r\n self.currentAssortmenFilter = '';\r\n\r\n self.showNoProductsImage = function () {\r\n if (translations == null\r\n || (self.productStatus == translations.Actives && self.countItemActive == 0)\r\n || (self.productStatus == translations.WithoutExhibition && self.countItemWithoutExhibition == 0)\r\n || (self.productStatus == translations.WithExhibition && self.countItemWithExhibition == 0)\r\n || (self.productStatus == translations.Delist && self.countItemDelist == 0)\r\n || (self.productStatus == translations.New && self.countItemNew == 0)\r\n )\r\n return true;\r\n else\r\n return false;\r\n\r\n }\r\n\r\n self.FilterByAssortments = function (status, accordionStatus) {\r\n if (accordionStatus != null)\r\n accordionStatus.isCustomHeaderOpen = false;\r\n\r\n self.currentAssortmenFilter = status;\r\n self.calcNumItems()\r\n if (status === translations.Actives) {\r\n angular.forEach(self.itemList, function (_item) {\r\n _item.showByAssortment = false;\r\n self.productStatus = translations.Actives;\r\n if (_item.isListed) {\r\n _item.showByAssortment = true;\r\n }\r\n });\r\n } else if (status === translations.WithoutExhibition) {\r\n angular.forEach(self.itemList, function (_item) {\r\n _item.showByAssortment = false;\r\n if (_item.isListed) {\r\n _item.showByAssortment = true;\r\n self.productStatus = translations.WithoutExhibition;\r\n loopThroughAll(function (planogram, column, module, level, item) {\r\n if (item.itemId == _item.itemId) {\r\n _item.showByAssortment = false;\r\n }\r\n }, self.until.items)\r\n }\r\n });\r\n } else if (status === translations.WithExhibition) {\r\n angular.forEach(self.itemList, function (_item) {\r\n _item.showByAssortment = false;\r\n self.productStatus = translations.WithExhibition;\r\n if (_item.isListed) {\r\n loopThroughAll(function (planogram, column, module, level, item) {\r\n if (item.itemId == _item.itemId) {\r\n _item.showByAssortment = true;\r\n }\r\n }, self.until.items)\r\n }\r\n });\r\n } else if (status === translations.Delist) {\r\n angular.forEach(self.itemList, function (_item) {\r\n _item.showByAssortment = false;\r\n self.productStatus = translations.Delist;\r\n if (!_item.isListed) {\r\n _item.showByAssortment = true;\r\n //LG: antes se mostraban como Delistados aquellos items delistados que ademas estaban en el Planograma.\r\n //LG: Comentamos la condicion de que esten en el planograma ya que la vamos a pasar a un Filtro de Estado.\r\n /*\r\n loopThroughAll(function (planogram, level, item) {\r\n if (item.itemId == _item.itemId) {\r\n _item.showByAssortment = true;\r\n }\r\n }, self.until.items);\r\n */\r\n }\r\n });\r\n }\r\n else if (status === translations.New) {\r\n angular.forEach(self.itemList, function (_item) {\r\n _item.showByAssortment = false;\r\n self.productStatus = translations.New;\r\n if (_item.isNewItem) {\r\n _item.showByAssortment = true;\r\n }\r\n });\r\n }\r\n else {\r\n self.activeAssortmentFilter = false;\r\n angular.forEach(self.itemList, function (_item) {\r\n _item.showByAssortment = false;\r\n })\r\n }\r\n\r\n // Actualiza el modelo.\r\n self.updateModel();\r\n }\r\n\r\n self.getFilterColor = function () {\r\n var tag = angular.copy(self.selectedTag);\r\n var rv = \"\"\r\n\r\n if (tag == \"Premium\")\r\n rv = \"#BB3385\";\r\n\r\n else if (tag == \"Regional\")\r\n rv = \"#CC6C4C\";\r\n\r\n else if (tag == \"Ninguno\")\r\n rv = \"#686B6D\";\r\n\r\n return rv;\r\n }\r\n\r\n self.getInfoTitle = function () {\r\n var label = '';\r\n if (self.selectedItem) {\r\n if (self.selectedItem.ean)\r\n return ((self.selectedItem.ean || self.selectedItem.itemEan) + '\\n' + self.selectedItem.name);\r\n else\r\n return ((self.selectedItem.code || self.selectedItem.itemCode) + '\\n' + self.selectedItem.name);\r\n }\r\n\r\n if (self.selectedBrand != '!null') {\r\n label += translations.Brand + ': ' + self.selectedBrand;\r\n }\r\n\r\n if (self.selectedManufacturer !== '!null') {\r\n if (label !== '') {\r\n label += ', ';\r\n }\r\n\r\n label += translations.Manufacturer + ': ' + self.selectedManufacturer;\r\n }\r\n\r\n if (self.selectedTagFilter) {\r\n if (label !== '') {\r\n label += ', ';\r\n }\r\n\r\n label += self.selectedTagFilter.group + ': ' + self.selectedTagFilter.name;\r\n }\r\n\r\n if (self.filterByTextValue) {\r\n if (label !== '')\r\n label += ', ';\r\n\r\n label += 'Busqueda: ' + self.filterByTextValue;\r\n }\r\n\r\n return label;\r\n }\r\n\r\n self.filterItemListByTextSearch = function () {\r\n return function (item) {\r\n if (item\r\n && (!self.search\r\n || item.name.toLowerCase().indexOf(self.search.toLowerCase()) !== -1\r\n || (item.code && item.code.toLowerCase().indexOf(self.search.toLowerCase()) !== -1)\r\n || (item.ean && item.ean.toLowerCase().indexOf(self.search.toLowerCase()) !== -1))\r\n && (self.categoryFilter === '!null' || item.categoryId === self.categoryFilter)\r\n && (self.selectedBrand === '!null' || item.brand === self.selectedBrand)\r\n && item.showByAssortment === self.activeAssortmentFilter)\r\n return true;\r\n\r\n return false;\r\n };\r\n }\r\n\r\n self.onSearchTextChange = function () {\r\n var filterFunc = self.filterItemListByTextSearch();\r\n\r\n self.filteredItems = [];\r\n angular.forEach(self.itemList, function (item) {\r\n if (filterFunc(item)) {\r\n self.filteredItems.push(item);\r\n }\r\n });\r\n\r\n this.updateModel();\r\n }\r\n\r\n self.filterByText = function (event) {\r\n var search = self.filterByTextValue + event.key;\r\n\r\n self.search = search;\r\n\r\n //get filtered items\r\n var filteredItems = [];\r\n loopThroughAll(function (planogram, column, module, level, item) {\r\n if (self.doFilterApply(item)) {\r\n filteredItems.push(item);\r\n }\r\n }, self.until.items);\r\n\r\n //render charts\r\n // renderPieCharts(null);\r\n $timeout(1).then(function () {\r\n self.renderPieChartsParent(null);\r\n });\r\n\r\n this.updateModel();\r\n }\r\n\r\n self.rankingHeatMap = [];\r\n self.getRanking = function () {\r\n\r\n var rv = [];\r\n\r\n if (self.heatMapEnabled) {\r\n var allItems = [];\r\n var total = 0;\r\n self.rankCount = 0;\r\n loopThroughAll(function (planogram, column, module, level, item) {\r\n allItems.push(item);\r\n total += item[self.heatMapVariableValue];\r\n },\r\n self.until.items)\r\n .then(function (response) {\r\n rv = allItems.sort(function (a, b) {\r\n if (self.heatMapVariableValue === 'price'\r\n || self.heatMapVariableValue === 'currentInventoryUnits') {\r\n return a[self.heatMapVariableValue] - b[self.heatMapVariableValue];\r\n } else {\r\n return b[self.heatMapVariableValue] - a[self.heatMapVariableValue];\r\n }\r\n });\r\n var accumulatedFrequency = 0;\r\n var accumulatedPercentage = 0;\r\n angular.forEach(rv,\r\n function (_item, i) {\r\n accumulatedFrequency += _item[self.heatMapVariableValue];\r\n _item.AccumulatedFrequency = accumulatedFrequency;\r\n _item.percentage = (_item[self.heatMapVariableValue] / total);\r\n _item.AccumulatedPercentage = accumulatedPercentage;\r\n accumulatedPercentage += _item.percentage;\r\n _item.rankCount = i + 1;\r\n\r\n var fill;\r\n if (_item.AccumulatedPercentage <= 0.50) {\r\n fill = '#009900';\r\n } else if (_item.AccumulatedPercentage <= 0.90) {\r\n fill = '#ffcc00';\r\n } else if (_item.AccumulatedPercentage <= 1) {\r\n fill = '#ff1a1a';\r\n }\r\n\r\n if (!_item[self.heatMapVariableValue]) {\r\n fill = '#ff0000';\r\n }\r\n\r\n _item.fill = fill;\r\n _item.opacity = 0.2;\r\n });\r\n\r\n self.rankingHeatMap = rv;\r\n\r\n self.updateModel();\r\n });\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Actualiza los datos filtrados en el modelo.\r\n */\r\n self.updateModel = function updateModel() {\r\n\r\n var cache = self.filteredItems.reduce(function (ret, item) {\r\n var key = String(item.itemId);\r\n ret[key] = true;\r\n return ret;\r\n }, {});\r\n // Apaga los items filtrados.\r\n angular.forEach(self.model.planograms,\r\n function updateModelForEachPlanograms(planogramLocal) {\r\n angular.forEach(planogramLocal.columns,\r\n function updateModelForEachColumns(columnLocal) {\r\n columnLocal.selected = false;\r\n angular.forEach(columnLocal.modules,\r\n function updateModelForEachModules(moduleLocal) {\r\n moduleLocal.selected = false;\r\n angular.forEach(moduleLocal.levels,\r\n function updateModelForEachLevels(levelLocal) {\r\n levelLocal.selected = false;\r\n angular.forEach(levelLocal.items,\r\n function updateModelForEachItems(itemLocal) {\r\n var key = String(itemLocal.itemId);\r\n var filtered = angular.isDefined(cache[key]);\r\n itemLocal.filtered = filtered;\r\n });\r\n });\r\n });\r\n });\r\n });\r\n\r\n self.forceUpdateModel();\r\n }\r\n\r\n self.getRankCount = function () {\r\n return ++self.rankCount;\r\n }\r\n\r\n self.renderPieChartsParent = renderPieCharts;\r\n\r\n function renderPieCharts(itemsGroup) {\r\n\r\n var espaciosLinealGroup = 0;\r\n var espacioLinealTotal = 0;\r\n var vantasGroup = 0;\r\n var ventasTotales = 0;\r\n\r\n var label = self.getInfoTitle();\r\n\r\n angular.forEach(itemsGroup, function (item) {\r\n var espaciosLineal = self.getLinearSpace(item);\r\n espaciosLinealGroup += espaciosLineal;\r\n vantasGroup += item.sales | 0;\r\n });\r\n\r\n loopThroughAll(function renderPieChartsLoopThroughAll(planogram, column, module, level, item) {\r\n var espaciosLineal = self.getLinearSpace(item);\r\n espacioLinealTotal += espaciosLineal;\r\n ventasTotales += item.sales | 0;\r\n },\r\n self.until.items);\r\n\r\n // Para calcular el share de espacio = espacio lineal del item / (ancho x alto del planograma)\r\n // Share de espacio de un grupo = suma de espacios de productos en ese grupo / suma de espacios totales\r\n var shareSpace = espaciosLinealGroup / (espacioLinealTotal | 1);\r\n\r\n // Share de venta de un grupo = suma de ventas de productos en ese grupo / suma de ventas total.\r\n var shareSales = vantasGroup / (ventasTotales | 1);\r\n\r\n // La divisi?n entre Share de venta / Share de espacio. Si da un numero > 1 entonces est? sobreespaciado. Menor a 1 est? subespaciado.\r\n self.spaceResult = shareSales > shareSpace ? translations.Subspaced : translations.Overpaced;\r\n self.spaceResultIcon = shareSales > shareSpace ? 'up' : 'down';\r\n self.spaceResultColor = shareSales > shareSpace ? 'danger' : 'primary';\r\n\r\n var itemSales = vantasGroup;\r\n var totalSales = ventasTotales | 1;\r\n var itemSpace = espaciosLinealGroup;\r\n var totalSpace = espacioLinealTotal;\r\n\r\n self.tooltipSpaced = translations.Sp_editPlanogram_spaced + (((shareSpace / shareSales) - 1) * 100).toFixed(0) + ' %';\r\n\r\n self.getPercentageSales = function () {\r\n\r\n self.percentageSales = ((itemSales / totalSales) * 100).toFixed(2) + '%';\r\n\r\n self.getAnimationSales();\r\n\r\n return {\r\n 'width': + (itemSales / totalSales) * 100 + '%'\r\n };\r\n\r\n }\r\n\r\n self.getPercentageSpace = function () {\r\n\r\n self.percentageSpaces = ((itemSpace / totalSpace) * 100).toFixed(2) + '%'\r\n\r\n self.getAnimationSpace();\r\n\r\n return {\r\n 'width': + (itemSpace / totalSpace) * 100 + '%'\r\n };\r\n }\r\n\r\n self.getAnimationSales = function () {\r\n var animationSales = document.querySelectorAll(\".percentage-graphic-sales\");\r\n\r\n var elem = 0;\r\n while (elem < animationSales.length) {\r\n animationSales[elem].style.width = '0%';\r\n animationSales[elem].style.transition = \"width 0.2s ease-in-out 0.2s\";\r\n animationSales[elem].style.width = self.percentageSales;\r\n elem++;\r\n };\r\n\r\n }\r\n\r\n self.getAnimationSpace = function () {\r\n var animationSpace = document.querySelectorAll(\".percentage-graphic-space\");\r\n\r\n var elem = 0;\r\n while (elem < animationSpace.length) {\r\n animationSpace[elem].style.width = '0%';\r\n animationSpace[elem].style.transition = \"width 0.2s ease-in-out 0.2s\";\r\n animationSpace[elem].style.width = self.percentageSpaces;\r\n elem++;\r\n };\r\n\r\n }\r\n\r\n\r\n if (self.analyzeBy == 'cluster') {\r\n //var shareSales = self.getPlanogramTotal('sales') / self.getItemsTotal(items, 'sales');\r\n //var shareSpace = self.selectedPlanogram.width / self.getItemsTotal(items, 'width');\r\n\r\n } else {\r\n //var shareSales = self.getPlanogramTotal('salesInStore') / self.getItemsTotal(items, 'salesInStore');\r\n //var shareSpace = self.selectedPlanogram.width / self.getItemsTotal(items, 'width');\r\n\r\n }\r\n\r\n //Share Ventas\r\n var chart = c3.generate({\r\n bindto: '#saleschart',\r\n size: {\r\n width: 230\r\n },\r\n title: {\r\n text: translations.SalesShare\r\n },\r\n legend: {\r\n show: false\r\n },\r\n data: {\r\n columns: [\r\n [label || (itemsGroup && itemsGroup.length > 0 ? itemsGroup[0].name : ''), itemSales],\r\n [translations.SalesRestProducts, totalSales - itemSales],\r\n ],\r\n type: 'pie'\r\n }\r\n });\r\n\r\n //Share Espacio\r\n var chart = c3.generate({\r\n bindto: '#spacechart',\r\n size: {\r\n width: 230\r\n },\r\n title: {\r\n text: translations.SpaceShare\r\n },\r\n legend: {\r\n show: false\r\n },\r\n data: {\r\n columns: [\r\n [label || (itemsGroup && itemsGroup.length > 0 ? itemsGroup[0].name : ''), itemSpace],\r\n [translations.SpaceRestProcucts, totalSpace - itemSpace],\r\n ],\r\n type: 'pie'\r\n }\r\n });\r\n\r\n\r\n }\r\n\r\n self.getPlanogramWidth = function (planogram) {\r\n var totalWidth = 0;\r\n angular.forEach(self.model.planograms,\r\n function getPlanogramWidthForEachPlanograms(p) {\r\n totalWidth += p.width;\r\n });\r\n\r\n return planogram.width * 100 / totalWidth;\r\n }\r\n\r\n function GenerateNewTicket() {\r\n return {\r\n id: 0,\r\n status: 'Nuevo',\r\n title: '',\r\n description: '',\r\n type: 'Item',\r\n priority: '',\r\n created: new Date(),\r\n update: new Date(),\r\n user: authService.authentication.userName,\r\n comments: [],\r\n watch: true\r\n };\r\n }\r\n\r\n\r\n self.storeClicked = function (store) {\r\n self.selectedStore = store;\r\n }\r\n\r\n self.clusterClicked = function (cluster) {\r\n self.selectedCluster = cluster;\r\n }\r\n\r\n self.getItemStyles = function (item, isHideItems) {\r\n var styles = {\r\n 'color': item.fill\r\n }\r\n\r\n return styles;\r\n }\r\n\r\n //autocomplete function\r\n self.clearItemPlanograma = function () {\r\n swal({\r\n title: translations.SureCleanPlanogramSwal,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#DD6B55\",\r\n confirmButtonText: translations.Yes,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: true,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n self.executeClearItemPlanograma();\r\n $scope.$apply();\r\n // Fuerza una nueva referencia del planograma para que se detecte el cambio.\r\n self.forceUpdateModel();\r\n }\r\n\r\n });\r\n }\r\n\r\n self.executeClearItemPlanograma = function () {\r\n loopThroughAll(function (planogram, column, module, level, item) {\r\n level.items = []\r\n }, self.until.levels);\r\n }\r\n\r\n self.setSelectCluster = function (cluster) {\r\n //self.filter.cluster = cluster.name;\r\n self.textClusters = cluster.name;\r\n }\r\n\r\n function filterBySubCategory(element) {\r\n return element.categoryId === subCategory.id;\r\n }\r\n\r\n self.showAddRuleModal = function () {\r\n\r\n ngDialog.open({\r\n template: 'addRuleDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-500',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.okAddRuleModal = function (typeRule) {\r\n if (typeRule === \"assignFronts\") {\r\n self.rules.push({\r\n type: typeRule,\r\n minFront: self.minFront,\r\n maxFront: self.maxFront,\r\n frequency: self.frequency\r\n });\r\n }\r\n\r\n if (typeRule === \"assignFrontsGMROI\") {\r\n self.rules.push({\r\n type: typeRule,\r\n minFront: self.minFrontGMROI,\r\n maxFront: self.maxFrontGMROI,\r\n GMROI: self.ratioGMROI\r\n });\r\n }\r\n\r\n if (typeRule === \"assignFrontsGMROS\") {\r\n self.rules.push({\r\n type: typeRule,\r\n minFront: self.minFrontGMROS,\r\n maxFront: self.maxFrontGMROS,\r\n GMROS: self.ratioGMROS\r\n });\r\n }\r\n\r\n if (typeRule === \"percentageSpace\") {\r\n\r\n var criterioValues = [];\r\n\r\n switch (self.percentageSpaceType) {\r\n case 'marcas':\r\n criterioValues.push(self.rulePercentageSpaceBrandSelection);\r\n break;\r\n case 'fabricantes':\r\n criterioValues.push(self.rulePercentageSpaceManufacturerSelection);\r\n break;\r\n case 'tags':\r\n angular.forEach(self.rulePercentageSpaceTagsSelections, function (tag) {\r\n criterioValues.push(tag);\r\n });\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n self.rules.push({\r\n type: typeRule,\r\n percentageSpaceType: self.percentageSpaceType,\r\n criterioValues: criterioValues,\r\n percentage: self.rulePercentageSpaceValue\r\n });\r\n }\r\n\r\n ngDialog.close();\r\n }\r\n self.getCriterioRuleDescription = function (rule) {\r\n switch (rule.percentageSpaceType) {\r\n case 'marcas':\r\n return 'Marca';\r\n case 'fabricantes':\r\n return 'Fabricante';\r\n case 'tags':\r\n return 'Etiquetas';\r\n default: break;\r\n }\r\n }\r\n\r\n self.getCriterioRuleValueDescriptions = function (rule) {\r\n switch (rule.percentageSpaceType) {\r\n case 'marcas':\r\n return rule.criterioValues[0];\r\n case 'fabricantes':\r\n return rule.criterioValues[0];\r\n case 'tags':\r\n var value = '';\r\n for (var i = 0, l = rule.criterioValues.length; i < l; i++) {\r\n value += rule.criterioValues[i].name + '; ';\r\n }\r\n\r\n return value;\r\n default: break;\r\n }\r\n }\r\n\r\n self.deleteRule = function (typeRule) {\r\n var foundRule = self.rules.find(function (e) {\r\n return e.type === typeRule.type;\r\n });\r\n\r\n if (!foundRule) return;\r\n\r\n if (typeRule.type === \"percentageSpace\") {\r\n angular.forEach(self.listedItems, function (item) {\r\n item.facings = null;\r\n item.facingsMax = null;\r\n item.facingsPlanogram = null;\r\n });\r\n }\r\n\r\n var index = self.rules.indexOf(foundRule);\r\n\r\n self.rules.splice(index, 1);\r\n }\r\n\r\n self.selectHorizontalDirection = function (direction) {\r\n self.leftToRight = direction;\r\n }\r\n\r\n self.selectVerticalDirection = function (direction) {\r\n self.topToBottom = direction;\r\n }\r\n\r\n self.showAddOrderModal = function () {\r\n\r\n ngDialog.open({\r\n template: 'addOrderDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-500',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.okAddOrderModal = function (typeOrder) {\r\n if (typeOrder === 'size') {\r\n self.ordenation.push({\r\n type: self.sortBySize,\r\n asc: self.asc,\r\n typeDesc: self.sortBySizeDesc\r\n });\r\n } else {\r\n self.ordenation.push({\r\n type: typeOrder,\r\n asc: self.asc,\r\n typeDesc: self.selectOrderDesc\r\n });\r\n }\r\n\r\n self.asc = true;\r\n self.sortBySize = null;\r\n self.selectOrder = null;\r\n self.selectOrderDesc = null;\r\n self.sortBySizeDesc = null;\r\n ngDialog.close();\r\n }\r\n\r\n self.deleteOrder = function (typeOrder) {\r\n var foundOrder = self.ordenation.find(function (e) {\r\n return e.type === typeOrder.type;\r\n });\r\n\r\n if (!foundOrder) return;\r\n\r\n var index = self.ordenation.indexOf(foundOrder);\r\n\r\n self.ordenation.splice(index, 1);\r\n }\r\n\r\n self.showAddRestrictionModal = function () {\r\n\r\n ngDialog.open({\r\n template: 'addRestrictionDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-500',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.okAddRestrictionModal = function (typeRestriction) {\r\n\r\n var isExists;\r\n if (typeRestriction === \"tags\") {\r\n isExists = false;\r\n angular.forEach(self.restrictions,\r\n function (restriction) {\r\n if (restriction.type === \"tags\") {\r\n restriction.tags = self.tagsSelections;\r\n isExists = true;\r\n }\r\n });\r\n if (!isExists) {\r\n self.restrictions.push({\r\n type: typeRestriction,\r\n tags: self.tagsSelections\r\n });\r\n }\r\n }\r\n\r\n if (typeRestriction === \"subcategories\") {\r\n isExists = false;\r\n angular.forEach(self.restrictions,\r\n function (restriction) {\r\n if (restriction.type === \"subcategories\") {\r\n restriction.subcategories = self.subcategoriesSelections;\r\n isExists = true;\r\n }\r\n });\r\n if (!isExists) {\r\n self.restrictions.push({\r\n type: typeRestriction,\r\n subcategories: self.subcategoriesSelections\r\n });\r\n }\r\n }\r\n\r\n if (typeRestriction === \"fabricantes\") {\r\n isExists = false;\r\n angular.forEach(self.restrictions,\r\n function (restriction) {\r\n if (restriction.type === \"fabricantes\") {\r\n restriction.manufacturers = self.manufacturerSelection;\r\n isExists = true;\r\n }\r\n });\r\n if (!isExists) {\r\n self.restrictions.push({\r\n type: typeRestriction,\r\n manufacturers: self.manufacturerSelection\r\n });\r\n }\r\n }\r\n\r\n if (typeRestriction === \"marcas\") {\r\n isExists = false;\r\n angular.forEach(self.restrictions,\r\n function (restriction) {\r\n if (restriction.type === \"marcas\") {\r\n restriction.brands = self.brandSelection;\r\n isExists = true;\r\n }\r\n });\r\n if (!isExists) {\r\n self.restrictions.push({\r\n type: typeRestriction,\r\n brands: self.brandSelection\r\n });\r\n }\r\n }\r\n\r\n angular.forEach(self.restrictions, function (restriction) {\r\n restriction.getDescription = function () {\r\n var values = null;\r\n\r\n if (restriction.brands) {\r\n values = restriction.brands;\r\n }\r\n\r\n if (restriction.manufacturers) {\r\n values = restriction.manufacturers;\r\n }\r\n\r\n if (restriction.tags) {\r\n values = restriction.tags;\r\n }\r\n\r\n if (restriction.subcategories) {\r\n values = restriction.subcategories;\r\n }\r\n\r\n // return `${restriction.type}: ${values.join(',')}`;\r\n return restriction.type + ':' + values.join(',');\r\n }\r\n });\r\n\r\n self.actualizarListadoItemsByRestrictions();\r\n\r\n ngDialog.close();\r\n }\r\n\r\n self.getRestrictionValues = function (restriction) {\r\n var values = null;\r\n\r\n if (restriction.brands)\r\n values = restriction.brands;\r\n if (restriction.manufacturers)\r\n values = restriction.manufacturers;\r\n if (restriction.tags)\r\n values = restriction.tags;\r\n if (restriction.subcategories)\r\n values = restriction.subcategories;\r\n\r\n return values.join(',');\r\n }\r\n\r\n self.deleteRestriction = function (restrictionType) {\r\n\r\n var foundRestriction = self.restrictions.find(function (e) {\r\n return e.type === restrictionType.type;\r\n });\r\n\r\n if (!foundRestriction) return;\r\n\r\n var index = self.restrictions.indexOf(foundRestriction);\r\n\r\n switch (restrictionType.type) {\r\n case \"tags\":\r\n foundRestriction.tags = [];\r\n self.tagsSelections = [];\r\n break;\r\n case \"subcategories\":\r\n foundRestriction.subcategories = [];\r\n self.subcategoriesSelections = [];\r\n break;\r\n\r\n case \"fabricantes\":\r\n foundRestriction.manufacturers = [];\r\n self.manufacturerSelection = [];\r\n break;\r\n\r\n case \"marcas\":\r\n foundRestriction.brands = [];\r\n self.brandSelection = [];\r\n break;\r\n\r\n default:\r\n break\r\n }\r\n self.restrictions.splice(index, 1);\r\n self.actualizarListadoItemsByRestrictions();\r\n }\r\n\r\n self.actualizarListadoItemsByRestrictions = function () {\r\n\r\n self.itemsForAutocomplete = self.filterItemListForAutocomplete();\r\n\r\n }\r\n\r\n function rulesPromise(_items, _rules) {\r\n return new Promise(function (resolve, reject) {\r\n if (_rules.length > 0) {\r\n\r\n angular.forEach(_rules, function (rule) {\r\n if (rule.type == \"assignFronts\") {\r\n resolve(applyRuleAssignFronts(_items, rule.minFront, rule.maxFront, rule.frequency))\r\n }\r\n\r\n if (rule.type == \"assignFrontsGMROI\") {\r\n resolve(applyRuleAssignFrontsGMROI(_items, rule.minFront, rule.maxFront, rule.GMROI))\r\n }\r\n\r\n if (rule.type == \"assignFrontsGMROS\") {\r\n resolve(applyRuleAssignFrontsGMROS(_items, rule.minFront, rule.maxFront, rule.GMROS))\r\n }\r\n\r\n if (rule.type == \"percentageSpace\") {\r\n resolve(applyRulePercentageSpace(_items, rule));\r\n }\r\n //if (rule.type == \"tags\") {\r\n //_items = _items.filter(function (element) {\r\n // console.log('into filterByTags', element, restriction.tags)\r\n // var result = false\r\n // angular.forEach(element.tags, function (tag) {\r\n // angular.forEach(restriction.tags, function (tagRestriction) {\r\n // if (tag.id == tagRestriction.id) {\r\n // result = true\r\n // }\r\n // })\r\n // })\r\n // return result\r\n //})\r\n //_item = applyRestrictionFilterTags(_items, restriction.tags)\r\n //}\r\n })\r\n //console.log('items before resolve', _items)\r\n //resolve(_items)\r\n } else {\r\n resolve(_items)\r\n //reject('error')\r\n }\r\n\r\n })\r\n }\r\n\r\n function applyRuleAssignFronts(items, minFront, maxFront, frequency) {\r\n var depthPlanogram = self.selectedPlanogram.depth\r\n angular.forEach(items, function (item) {\r\n if (item.units && self.selectedCluster.totalStoreInCluster) {\r\n item.numItems = frequency * item.units / self.selectedCluster.totalStoreInCluster;\r\n item.numItemsForClusters = frequency * item.units;\r\n item.itemPerFront = Math.floor(depthPlanogram / item.depth);\r\n item.numFrontAutocomplete = Math.round(item.numItems / item.itemPerFront);\r\n item.facings = item.numFrontAutocomplete > maxFront ? maxFront : item.numFrontAutocomplete < minFront ? minFront : item.numFrontAutocomplete;\r\n } else {\r\n item.facings = minFront;\r\n }\r\n });\r\n\r\n return items\r\n }\r\n\r\n function applyRuleAssignFrontsGMROI(items, minFront, maxFront, GMROI) {\r\n var depthPlanogram = self.selectedPlanogram.depth\r\n angular.forEach(items, function (item) {\r\n if (item.gmroi === GMROI) {\r\n item.itemPerFront = Math.floor(depthPlanogram / item.depth);\r\n item.numFrontAutocomplete = Math.round(item.numItems / item.itemPerFront);\r\n item.numFront = item.numFrontAutocomplete > maxFront ? maxFront : item.numFrontAutocomplete < minFront ? minFront : item.numFrontAutocomplete;\r\n item.facings = item.numFront;\r\n } else {\r\n item.facings = minFront;\r\n }\r\n });\r\n\r\n return items\r\n }\r\n\r\n function applyRuleAssignFrontsGMROS(items, minFront, maxFront, GMROS) {\r\n var depthPlanogram = self.selectedPlanogram.depth\r\n angular.forEach(items, function (item) {\r\n if (item.gmros === GMROS) {\r\n item.itemPerFront = Math.floor(depthPlanogram / item.depth);\r\n item.numFrontAutocomplete = Math.round(item.numItems / item.itemPerFront);\r\n item.numFront = item.numFrontAutocomplete > maxFront ? maxFront : item.numFrontAutocomplete < minFront ? minFront : item.numFrontAutocomplete;\r\n item.facings = item.numFront;\r\n } else {\r\n item.facings = minFront;\r\n }\r\n });\r\n\r\n return items\r\n }\r\n\r\n function applyRulePercentageSpace(items, rule) {\r\n\r\n\r\n var depthPlanogram = self.selectedPlanogram.depth;\r\n\r\n angular.forEach(items, function (item) {\r\n\r\n var maxNumItemsLevel = Math.floor((self.selectedPlanogram.width ? self.selectedPlanogram.width : 0) / (item.width + (self.selectedPlanogram.levels[0].itemPadding * 2))); // x frentes por nivel\r\n\r\n var maxNumItems = Math.floor(maxNumItemsLevel * self.selectedPlanogram.levels.length) //x frentes por planograha al 100%\r\n var facingsMaxPlanogram = Math.floor(maxNumItems * parseInt(self.rulePercentageSpaceValue) / 100); //X% en todo el planograma\r\n\r\n switch (rule.percentageSpaceType) {\r\n case 'marcas':\r\n if (item.brand == rule.criterioValues[0]) {\r\n //item.numFront = percentageItems;\r\n //item.facings = percentageItems;\r\n item.facingsMax = maxNumItemsLevel;\r\n item.facingsPlanogram = facingsMaxPlanogram;\r\n }\r\n break;\r\n case 'fabricantes':\r\n if (item.manufacturer == rule.criterioValues[0]) {\r\n //item.numFront = percentageItems;\r\n //item.facings = percentageItems;\r\n item.facingsMax = maxNumItemsLevel;\r\n item.facingsPlanogram = facingsMaxPlanogram;\r\n }\r\n break;\r\n case 'tags':\r\n angular.forEach(rule.criterioValues, function (tag) {\r\n if (!item.tags) return;\r\n if (item.tags.length == 0) return;\r\n\r\n var foundTag = item.tags.find(function (t) {\r\n return t.id === tag.id;\r\n });\r\n\r\n if (foundTag) {\r\n //item.numFront = percentageItems;\r\n //item.facings = percentageItems;\r\n item.facingsMax = maxNumItemsLevel;\r\n item.facingsPlanogram = facingsMaxPlanogram;\r\n }\r\n });\r\n\r\n break;\r\n default:\r\n break;\r\n }\r\n });\r\n\r\n return items\r\n }\r\n\r\n function applyRestrictionFilterTags(items, tags) {\r\n\r\n function filterByTags(element) {\r\n var result = false\r\n angular.forEach(element.tags, function (tag) {\r\n angular.forEach(tags, function (tagRestriction) {\r\n if (tag.id == tagRestriction.id) {\r\n result = true\r\n }\r\n })\r\n })\r\n return result\r\n }\r\n\r\n items = items.filter(filterByTags)\r\n return items\r\n }\r\n\r\n\r\n var arrayItemBig = []\r\n\r\n function insertItemInLevel(items, index, i_level, planogram, i_column, i_module, verticalDirection, horizontalDirection) {\r\n if (items.length === 0) {\r\n return planogram\r\n } else {\r\n //[firstItem, ...rest] = items;\r\n var rest = items.slice();\r\n var firstItem = rest.shift()\r\n var column = planogram.columns[i_column];\r\n var module = column.modules[i_module];\r\n var level = module.levels[i_level];\r\n var usedWidth = self.getLevelUsedWidth(level);\r\n var itemWidth = self.getItemWidth(firstItem);\r\n var itemHeight = self.getItemHeight(firstItem);\r\n\r\n if (itemHeight > level.height) {\r\n arrayItemBig.push(firstItem)\r\n return insertItemInLevel(rest, index, i_level, planogram, i_column, i_module, verticalDirection, horizontalDirection);\r\n\r\n } else if (usedWidth + ((itemWidth + (level.itemPadding * 2)) * firstItem.facings) > module.width) {\r\n if (verticalDirection) {\r\n if (i_level == 0) {\r\n if (i_column == planogram.columns - 1) {\r\n return planogram;\r\n } else {\r\n return insertItemInLevel(items, resetIndex = 0, i_level = module.levels.length - 1, planogram, ++i_column, i_module, verticalDirection, horizontalDirection);\r\n }\r\n } else {\r\n var resetIndex = 0\r\n return insertItemInLevel(items, resetIndex, --i_level, planogram, i_column, i_module, verticalDirection, horizontalDirection);\r\n }\r\n } else {\r\n if (i_level == module.levels.length - 1) {\r\n if (i_column == planogram.columns - 1) {\r\n return planogram;\r\n } else {\r\n return insertItemInLevel(items, resetIndex = 0, i_level = 0, planogram, ++i_column, i_module, verticalDirection, horizontalDirection);\r\n }\r\n } else {\r\n var resetIndex = 0\r\n return insertItemInLevel(items, resetIndex, ++i_level, planogram, i_column, i_module, verticalDirection, horizontalDirection);\r\n }\r\n }\r\n\r\n } else {\r\n firstItem.planogramLevelId = level.id;\r\n firstItem.id = guid();\r\n firstItem.order = index;\r\n firstItem.stackBehind = 1;\r\n firstItem.stackAbove = 1;\r\n firstItem.stackTotal = self.calculateLoadQuantity(firstItem);\r\n\r\n self.calcItemSize(firstItem, level, module);\r\n\r\n if (horizontalDirection) {\r\n level.items.unshift(firstItem)\r\n } else {\r\n level.items.push(firstItem)\r\n }\r\n\r\n return insertItemInLevel(rest, horizontalDirection ? ++index : --index, i_level, planogram, i_column, i_module, verticalDirection, horizontalDirection)\r\n\r\n }\r\n\r\n }\r\n }\r\n\r\n function MultiCriteriaSorting(items, criteria, asc, criteria1, asc1) {\r\n //console.log('into MultiCriteriaSorting', items, criteria, asc, criteria1, asc1)\r\n var conditionLeft;\r\n var conditionRight;\r\n var conditionLeft1;\r\n var conditionRight1;\r\n\r\n items.sort(function (a, b) {\r\n if (criteria === 'area') {\r\n conditionLeft = a.height * a.width\r\n conditionRight = b.height * b.width\r\n } else if (criteria) {\r\n conditionLeft = a[criteria]\r\n conditionRight = b[criteria]\r\n } else {\r\n return\r\n }\r\n\r\n if (criteria1 === 'area') {\r\n conditionLeft1 = a.height * a.width;\r\n conditionRight1 = b.height * b.width;\r\n } else if (criteria1) {\r\n conditionLeft1 = a[criteria1];\r\n conditionRight1 = b[criteria1];\r\n } else {\r\n //return\r\n }\r\n\r\n if (conditionLeft == conditionRight) {\r\n //return 0;\r\n if (asc1) {\r\n return conditionLeft1 - conditionRight1;\r\n } else {\r\n return conditionRight1 - conditionLeft1;\r\n }\r\n }\r\n\r\n if (asc) {\r\n return conditionLeft - conditionRight\r\n } else {\r\n return conditionRight - conditionLeft\r\n }\r\n\r\n })\r\n\r\n }\r\n\r\n self.selectSortBySize = function (measure) {\r\n self.sortBySize = measure;\r\n }\r\n\r\n self.hasRules = function () {\r\n return angular.isDefined(self.rules) && self.rules.length > 0;\r\n }\r\n\r\n self.generateAutocomplete = function () {\r\n swal({\r\n title: translations.SureGenerateAutocompletePlanogramSwal,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#DD6B55\",\r\n confirmButtonText: translations.Yes,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: true,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n self.runAutocompleteEngine();\r\n }\r\n\r\n });\r\n }\r\n\r\n self.executeGenerateAutocomplete = function () {\r\n\r\n var planogram = self.selectedPlanogram;\r\n var items = self.itemsForAutocomplete;\r\n var i_level = 0\r\n var index = 0\r\n var verticalDirection = self.topToBottom\r\n var horizontalDirection = self.leftToRight\r\n\r\n loopThroughAll(function (planogram, column, module, level, item) {\r\n\r\n if (module.levels.length < 1) {\r\n swal(translations.WithoutLevelsSwal, translations.WithoutLevelsSubtitleSwal, 'warning');\r\n return\r\n }\r\n\r\n if (verticalDirection) {\r\n i_level = module.levels.length - 1\r\n }\r\n }, self.until.modules);\r\n\r\n if (self.ordenation.length > 0) {\r\n\r\n MultiCriteriaSorting(items, self.ordenation[0].type, self.ordenation[0].asc, self.ordenation[1] ? self.ordenation[1].type : null, self.ordenation[1] ? self.ordenation[1].asc : null)\r\n }\r\n\r\n rulesPromise(items, self.rules)\r\n .then(function (result) {\r\n\r\n function calcLevels(items) {\r\n var copia = items.slice();\r\n\r\n for (var i = 0; i < items.length; i++) {\r\n var item = items[i];\r\n if (!item.facingsPlanogram) continue;\r\n\r\n var div = item.facingsPlanogram / item.facingsMax;\r\n var mod = item.facingsPlanogram % item.facingsMax;\r\n\r\n var found = copia.find(function (e) { return e.itemId = item.itemId; });\r\n\r\n if (!found) continue;\r\n var index = copia.indexOf(found);\r\n\r\n if (div > 1) {\r\n item.facings = item.facingsMax;\r\n }\r\n else if (div < 1) {\r\n item.facings = 1;\r\n }\r\n\r\n for (var j = 1; j < Math.floor(div); j++) {\r\n var newItem = angular.copy(item);\r\n newItem.facings = item.facingsMax;\r\n copia.splice(++index, 0, newItem);\r\n }\r\n if (mod > 0) {\r\n var newItem = angular.copy(item);\r\n newItem.facings = mod;\r\n copia.splice(++index, 0, newItem);\r\n }\r\n }\r\n\r\n return copia;\r\n }\r\n\r\n var result = calcLevels(result);\r\n\r\n insertItemInLevel(result, index, /*i_level*/ 0, planogram, 0, 0, verticalDirection, horizontalDirection)\r\n self.stateChange = true;\r\n $scope.$apply();\r\n\r\n })\r\n .catch(function (err) {\r\n console.log('catch in rulesPromise', err);\r\n })\r\n\r\n }\r\n\r\n var planogramRemainingSpace = 0;\r\n //presets (borrar luego)\r\n self.ordenation = [{ type: \"height\", asc: false, typeDesc: \"Alto\" }];\r\n //self.restrictions = [{ type: \"marcas\", brands: ['COCA COLA'] }];\r\n //end presets\r\n\r\n self.rules = [{ type: \"assignFronts\", minFront: 2, maxFront: 4, targetExhibitionDays: 1, frequency: 0 }];\r\n self.runAutocompleteEngine = function () {\r\n\r\n //limpio el planograma\r\n self.executeClearItemPlanograma();\r\n\r\n //validations for selected strategy\r\n if (self.rules[0].type == \"assignFronts\") {\r\n if (!self.rules[0].minFront) {\r\n alert('Falta completar el campo: Mínimo de Frentes');\r\n return;\r\n }\r\n if (!self.rules[0].maxFront) {\r\n alert('Falta completar el campo: Máximo de Frentes');\r\n return;\r\n }\r\n }\r\n if (self.rules[0].type == \"exhibitionDays\") {\r\n if (!self.rules[0].targetExhibitionDays) {\r\n alert('Falta completar el campo: Días de Exhibición objetivo.');\r\n return;\r\n }\r\n if (!self.rules[0].maxFront) {\r\n alert('Falta completar el campo: Máximo de Frentes');\r\n return;\r\n }\r\n }\r\n\r\n //selected setup\r\n var planogram = self.selectedPlanogram;\r\n var verticalDirection = self.topToBottom;\r\n var horizontalDirection = self.leftToRight;\r\n\r\n var minFacings = self.rules[0].minFront;\r\n var maxFacings = self.rules[0].maxFront;\r\n var targetExhibitionDays = self.rules[0].targetExhibitionDays;\r\n\r\n var ruleDefinition = {\r\n type: self.rules[0].type,\r\n facings: self.rules[0].minFront,\r\n targetExhibitionDays: self.rules[0].targetExhibitionDays\r\n }\r\n\r\n //filtering: los filtros ya se aplicaron automaticamente\r\n var items = self.filterItemListForAutocomplete();\r\n\r\n //sorting\r\n if (self.ordenation.length > 0) {\r\n MultiCriteriaSorting(items, self.ordenation[0].type, self.ordenation[0].asc, self.ordenation[1] ? self.ordenation[1].type : null, self.ordenation[1] ? self.ordenation[1].asc : null)\r\n }\r\n\r\n //espacio remanente utilizable\r\n var totalPlanogramSpace = planogram.columns.reduce((totalWidth, col) => totalWidth += (col.width * col.modules[0].levels.length), 0);\r\n planogramRemainingSpace = totalPlanogramSpace;\r\n\r\n //acumulado de ventas del planograma\r\n var totalSales = 0;\r\n\r\n var usedItems = [];\r\n var excludedItems = [];\r\n\r\n\r\n //Realiza el autocompletado segun la estrategia de días de exhibicion\r\n if (self.rules[0].type == \"exhibitionDays\") {\r\n\r\n //único round completando en el orden definido por el usuario y la cantidad de dias de exhibicion que corresponda.\r\n angular.forEach(items, function (item) {\r\n\r\n var currItemSpace = tryAddItemToPlanogram(item, ruleDefinition);\r\n\r\n //si se agregó el item descuento el espacio.\r\n if (currItemSpace > 0) {\r\n usedItems.push(item);\r\n totalSales += item.sales;\r\n planogramRemainingSpace -= currItemSpace;\r\n }\r\n else {\r\n excludedItems.push(item);\r\n }\r\n });\r\n }\r\n\r\n //Realiza el autocompletado segun la estrategia de frentes minimos y maximos \r\n if (self.rules[0].type == \"assignFronts\") {\r\n\r\n\r\n //aplano todos los levels a recorrer\r\n var orderedLevels = planogram.columns.reduce((colLevels, col) => colLevels.concat(col.modules.reduce((modLevels, mod) => modLevels.concat(mod.levels), [])), []);\r\n\r\n if (self.topToBottom)\r\n orderedLevels = orderedLevels.reverse();\r\n\r\n\r\n //primer round completando minimo de frentes\r\n angular.forEach(items, function (item) {\r\n\r\n var currItemSpace = tryAddItemToPlanogram(item, ruleDefinition);\r\n\r\n //si se agregó el item descuento el espacio.\r\n if (currItemSpace > 0) {\r\n usedItems.push(item);\r\n totalSales += item.sales;\r\n planogramRemainingSpace -= currItemSpace;\r\n }\r\n else {\r\n excludedItems.push(item);\r\n }\r\n });\r\n\r\n //distribuyo el espacio remanente asignando frentes adicionales a los mejores items segun variable seleccionada\r\n angular.forEach(usedItems, function (item) {\r\n item.planogramSalesShare = item.sales / totalSales;\r\n var extraFacings = Math.round((planogramRemainingSpace * item.planogramSalesShare) / item.selectedUnitOfMeasure.width);\r\n item.facings += extraFacings;\r\n\r\n //hago el cap con los frentes maximos\r\n if (extraFacings > maxFacings)\r\n item.facings = maxFacings;\r\n\r\n console.debug(item.facings, item.name);\r\n });\r\n\r\n console.debug(`Espacio utilizado: ${totalPlanogramSpace - planogramRemainingSpace} de ${totalPlanogramSpace}`)\r\n\r\n //libero el planograma y reseteo el espacio remanente\r\n self.executeClearItemPlanograma();\r\n planogramRemainingSpace = totalPlanogramSpace;\r\n\r\n //segundo round completando con los frentes finales\r\n angular.forEach(usedItems, function (item) {\r\n\r\n ruleDefinition.facings = item.facings;\r\n var currItemSpace = tryAddItemToPlanogram(item, ruleDefinition);\r\n\r\n //si se agregó el item descuento el espacio.\r\n if (currItemSpace > 0) {\r\n planogramRemainingSpace -= currItemSpace;\r\n }\r\n else {\r\n excludedItems.push(item);\r\n }\r\n });\r\n\r\n console.debug(`Espacio utilizado: ${totalPlanogramSpace - planogramRemainingSpace} de ${totalPlanogramSpace}`)\r\n\r\n //tercer round tratando de acomodar los excluidos\r\n angular.forEach(excludedItems, function (item) {\r\n\r\n ruleDefinition.facings = item.facings;\r\n var currItemSpace = tryAddItemToPlanogram(item, ruleDefinition);\r\n\r\n //si se agregó el item descuento el espacio.\r\n if (currItemSpace > 0) {\r\n planogramRemainingSpace -= currItemSpace;\r\n }\r\n });\r\n }\r\n\r\n\r\n console.debug(`Espacio utilizado: ${totalPlanogramSpace - planogramRemainingSpace} de ${totalPlanogramSpace}`)\r\n console.log(excludedItems);\r\n\r\n self.autocompleteTotalItems = items.length;\r\n self.autocompleteExcludedItems = excludedItems;\r\n self.autocompleteUsedItems = usedItems;\r\n\r\n $scope.$apply();\r\n\r\n // Fuerza una nueva referencia del planograma para que se detecte el cambio.\r\n self.forceUpdateModel();\r\n }\r\n\r\n\r\n function tryAddItemToPlanogram(item, ruleDef) {\r\n\r\n //si el item no entra en el planograma devuelvo -1\r\n var itemUsedSpace = -1;\r\n\r\n if (planogramRemainingSpace > 0) {\r\n\r\n angular.forEach(self.selectedPlanogram.columns, function (column) {\r\n angular.forEach(column.modules, function (module) {\r\n angular.forEach(module.levels, function (level, ix) {\r\n\r\n //si todavia no coloque el item y entra en el estante\r\n if (itemUsedSpace === -1 && tryAddItemToLevel(module, level, item, ruleDef)) {\r\n\r\n //si entro acutalizo el espacio usado por el item\r\n itemUsedSpace = item.selectedUnitOfMeasure.width * item.facings;\r\n }\r\n });\r\n })\r\n });\r\n\r\n }\r\n\r\n return itemUsedSpace;\r\n }\r\n\r\n function tryAddItemToLevel(module, level, item, rule) {\r\n var itemAdded = false;\r\n var itemHeight = self.getItemHeight(item);\r\n var itemWidth = self.getItemWidth(item, true);\r\n\r\n //primero evalúo que entra bien en el alto del estante\r\n if (level.height >= itemHeight) {\r\n\r\n var facings = rule.facings;\r\n var stackBehind = 1;\r\n\r\n if (rule.type == \"exhibitionDays\") {\r\n //Si la estrategia es dias de exhibicion\r\n\r\n //DDE = (Fronts * StackBehind) / (Units / 30)\r\n //Fronts = (DDE * (Units / 30)) / StackBehind\r\n\r\n //cuantos entran hacia atras\r\n stackBehind = Math.floor(module.depth / item.selectedUnitOfMeasure.depth);\r\n\r\n facings = Math.ceil((rule.targetExhibitionDays * (item.units / 30)) / stackBehind);\r\n }\r\n\r\n var levelRemainingSpace = module.width - self.getLevelUsedWidth(level);\r\n if (levelRemainingSpace >= itemWidth * facings) {\r\n //entra bien de ancho con la cantidad de frentes definidos\r\n itemAdded = true;\r\n\r\n //actualizo el item para agregarlo al estante\r\n item.planogramLevelId = level.id;\r\n item.id = guid();\r\n item.order = level.length + 1;\r\n item.facings = facings;\r\n item.stackBehind = stackBehind;\r\n item.stackAbove = 1;\r\n item.stackTotal = self.calculateLoadQuantity(item);\r\n\r\n //coloco el item en el estante\r\n if (!self.leftToRight) {\r\n level.items.unshift(item)\r\n } else {\r\n level.items.push(item)\r\n }\r\n }\r\n }\r\n\r\n return itemAdded;\r\n }\r\n\r\n self.filterItemListForAutocomplete = function () {\r\n\r\n return self.listedItems.filter(function (item) {\r\n\r\n var passesSubcategoriesFilter = self.restrictions.filter((x) => x.type == 'subcategories').length > 0 ? false : true;\r\n angular.forEach(self.restrictions.filter((x) => x.type == 'subcategories').map((x) => x.subcategories).flat(), function (subcategoryFilter) {\r\n if (item.categoryId == subcategoryFilter.id) {\r\n passesSubcategoriesFilter = true;\r\n }\r\n });\r\n\r\n var passesTagsFilter = self.restrictions.filter((x) => x.type == 'tags').length > 0 ? false : true;\r\n angular.forEach(self.restrictions.filter((x) => x.type == 'tags').map((x) => x.tags).flat(), function (tagFilter) {\r\n angular.forEach(item.tags, function (tag) {\r\n if (tag.id == tagFilter.id) {\r\n passesTagsFilter = true;\r\n }\r\n })\r\n });\r\n\r\n var passesBrandFilter = self.restrictions.filter((x) => x.type == 'marcas').length > 0 ? false : true;\r\n angular.forEach(self.restrictions.filter((x) => x.type == 'marcas').map((x) => x.brands).flat(), function (brandFilter) {\r\n if (item.brand && item.brand.trim() === brandFilter.trim()) {\r\n passesBrandFilter = true;\r\n }\r\n });\r\n\r\n var passesManufacturerFilter = self.restrictions.filter((x) => x.type == 'fabricantes').length > 0 ? false : true;\r\n angular.forEach(self.restrictions.filter((x) => x.type == 'fabricantes').map((x) => x.manufacturers).flat(), function (manufacturerFilter) {\r\n if (item.brand && item.brand.trim() === manufacturerFilter.trim()) {\r\n passesManufacturerFilter = true;\r\n }\r\n });\r\n\r\n\r\n return item.isListed && passesTagsFilter && passesSubcategoriesFilter && passesManufacturerFilter && passesBrandFilter;\r\n });\r\n\r\n }\r\n\r\n //end autocomplete function\r\n\r\n self.getUniqueItemsCount = function (planogram) {\r\n\r\n var allItems = [];\r\n angular.forEach(planogram.columns, function (column) {\r\n angular.forEach(column.modules, function (module) {\r\n angular.forEach(module.levels, function (level) {\r\n angular.forEach(level.items, function (item) {\r\n allItems.push(item);\r\n });\r\n });\r\n })\r\n });\r\n\r\n var groupedItems = _(allItems)\r\n .groupBy('code')\r\n .map((items, code) => ({ code, count: items.length }))\r\n .value();\r\n\r\n return groupedItems.length;\r\n }\r\n\r\n self.showPhotoAudit = function () {\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n component: 'photoAuditComponent',\r\n windowClass: 'app-modal-window',\r\n resolve: {\r\n modalInfo: function () {\r\n return {\r\n dataSource: 'dataSource'\r\n };\r\n }\r\n }\r\n });\r\n }\r\n\r\n self.goItem = function (itemId) {\r\n $state.go('admin.editItem', { itemId: itemId });\r\n }\r\n\r\n self.showKpisModal = function (itemForModal, selectedClusterForModal) {\r\n\r\n var newScope = $scope.$new();\r\n newScope.params = { itemForModal: itemForModal, selectedClusterForModal: selectedClusterForModal.id };\r\n\r\n ngDialog.open({\r\n template: 'kpisDialog',\r\n className: 'ngdialog ngdialog-theme-default custom-width-950',\r\n scope: newScope\r\n });\r\n }\r\n\r\n\r\n self.exportToExcel = function () {\r\n spaceService.planograms.buildPlanogramItemsReport($stateParams.planogramId).then(function (reportUrl) {\r\n $window.open(reportUrl, '_blank');\r\n\r\n //var downloadFrame = document.createElement(\"iframe\");\r\n //downloadFrame.setAttribute('src', reportUrl);\r\n //downloadFrame.setAttribute('class', \"screenReaderText\");\r\n //document.body.appendChild(downloadFrame);\r\n });\r\n }\r\n\r\n self.printPlanogram = function () {\r\n\r\n swal({\r\n title: translations.EnterFurnitureToPrint,\r\n text: translations.EnterFurnitureToPrintSubtitle,\r\n type: \"input\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (inputValue) {\r\n if (inputValue === false) return;\r\n\r\n var planogramToPrint = angular.copy(self.model.planograms[0]);\r\n\r\n //saco todos los espacios\r\n inputValue = inputValue.replace(/\\s/g, '');\r\n\r\n if (inputValue) {\r\n var totalColumns = self.model.planograms[0].columns.length;\r\n\r\n if (isNaN(inputValue) && inputValue.indexOf('-') != -1) {\r\n\r\n //Si ingreso un rango\r\n var from = parseInt(inputValue.split('-')[0]);\r\n var to = parseInt(inputValue.split('-')[1]);\r\n\r\n if (isNaN(from) || from <= 0 || from > totalColumns\r\n || isNaN(to) || to <= 0 || to > totalColumns\r\n || inputValue.split('-').length != 2) {\r\n swal.showInputError(translations.InvalidRank);\r\n return;\r\n }\r\n\r\n var finalColumns = [];\r\n for (var col = 1; col <= planogramToPrint.columns.length; col++) {\r\n if (col >= from && col <= to) {\r\n planogramToPrint.columns[col - 1].overwriteId = col;\r\n finalColumns.push(planogramToPrint.columns[col - 1]);\r\n }\r\n }\r\n\r\n //solo imprimo las columnas seleccionadas\r\n planogramToPrint.columns = finalColumns;\r\n\r\n }\r\n else if (parseInt(inputValue) > 0 && parseInt(inputValue) <= totalColumns) {\r\n\r\n //Si ingresa solo un numero\r\n var number = parseInt(inputValue);\r\n\r\n //solo imprimo las columnas seleccionadas \r\n planogramToPrint.columns = [self.model.planograms[0].columns[number - 1]];\r\n planogramToPrint.columns[0].overwriteId = number;\r\n }\r\n else {\r\n swal.showInputError(translations.InvalidRankSubtitle);\r\n return;\r\n }\r\n\r\n }\r\n\r\n\r\n if (planogramToPrint) {\r\n\r\n swal({\r\n title: translations.ConfigurationFinished,\r\n text: translations.AllReadyToPrintThePlanogram,\r\n type: \"success\",\r\n confirmButtonText: translations.Print,\r\n }, function () {\r\n\r\n\r\n self.exportToPdf(planogramToPrint);\r\n });\r\n\r\n }\r\n\r\n });\r\n\r\n }\r\n\r\n\r\n self.exportToPdf = function (planogram) {\r\n\r\n var currentSelectedPlanogram = self.selectedPlanogram;\r\n self.selectedPlanogram = planogram;\r\n\r\n // Recorre todos los items de todos los niveles del planograma.\r\n // var width = planogram.width;\r\n\r\n // Inicia una promesa vacia.\r\n var promises = [$q.when()];\r\n var planogramHeight = 0;\r\n var planogramWidth = 0;\r\n\r\n // TODO: Usar la url de publicación del sistema.\r\n // var imageBaseUrl = '//prisma-tatauruguay.iantech.net/';\r\n var imageBaseUrl = '';\r\n\r\n angular.forEach(planogram.columns, function (column) {\r\n planogramWidth += column.width;\r\n var columnHeight = 0;\r\n angular.forEach(column.modules, function (module) {\r\n var moduleHeight = 0;\r\n angular.forEach(module.levels, function (level) {\r\n moduleHeight += level.height;\r\n angular.forEach(level.items, function (item) {\r\n // //var itemFull = self.getItem(item.itemId);\r\n // //item.label1 = itemFull.price ? '$ ' + itemFull.price.toFixed(2) : '';\r\n // //item.label2 = itemFull.code;\r\n // item.label1 = item.storeInfo && item.storeInfo.price ? '$ ' + item.storeInfo.price.toFixed(2) : '';\r\n // item.label2 = item.selectedUnitOfMeasure.itemCode;\r\n\r\n // Se pre cargan las images del planograma.\r\n var promise;\r\n if (angular.isString(item.selectedUnitOfMeasure.imagePlanogramFront)) {\r\n promise = imageService.load(imageBaseUrl + item.selectedUnitOfMeasure.imagePlanogramFront);\r\n promises.push(promise);\r\n }\r\n\r\n if (angular.isString(item.selectedUnitOfMeasure.imagePlanogramLeft)) {\r\n promise = imageService.load(imageBaseUrl + item.selectedUnitOfMeasure.imagePlanogramLeft);\r\n promises.push(promise);\r\n }\r\n\r\n if (angular.isString(item.selectedUnitOfMeasure.imagePlanogramTop)) {\r\n promise = imageService.load(imageBaseUrl + item.selectedUnitOfMeasure.imagePlanogramTop);\r\n promises.push(promise);\r\n }\r\n });\r\n });\r\n columnHeight += moduleHeight;\r\n });\r\n planogramHeight = Math.max(planogramHeight, columnHeight);\r\n });\r\n\r\n self.isTall = planogramWidth < planogramHeight;\r\n self.planogramByColums = self.splitPlanogramByColums(self.selectedPlanogram);\r\n\r\n // Obtiene los estilos del planograma.\r\n var styles = self.getPlanogramStyles();\r\n\r\n // Espera que se precarguen las imagenes antes de activar el render del planograma.\r\n $q.all(promises).finally(function onFinally() {\r\n self.prepareExport = true;\r\n $timeout(500)\r\n .then(function () {\r\n //$q.all(promises.map(function () {\r\n // return $timeout(150);\r\n //})).finally(function onFinally() {\r\n try {\r\n /*\r\n // TODO: Verificar cross-browser.\r\n // TODO: Ver solución alternativa cargando un .css especifico.\r\n var filterFn = Array.prototype.filter;\r\n var mapFn = Array.prototype.map;\r\n var links = filterFn.call(document.styleSheets,\r\n function (style) {\r\n return style.href &&\r\n (style.href.indexOf('app/index.css') > -1 ||\r\n style.href.indexOf('dist/css/app-') > -1);\r\n });\r\n var rules = filterFn.call(links[0].cssRules,\r\n function (rule) {\r\n return rule.selectorText && /^planogram/.test(rule.selectorText);\r\n });\r\n var cssTexts = mapFn.call(rules,\r\n function (rule) {\r\n return rule.cssText;\r\n });\r\n var styles = cssTexts.join('\\n');\r\n */\r\n // var styles = self.getPlanogramStyles();\r\n\r\n var $pdf = $element.find('.pdf').clone();\r\n // var $pdf = HtmlHelper.cleanUpHtml($element.find('.pdf').clone());\r\n var title = $pdf.find('planogram-print-header:first').text();\r\n var html = $pdf.html();\r\n var w = window.open();\r\n w.document.write('' +\r\n '' +\r\n title +\r\n '' +\r\n '' +\r\n html +\r\n '' +\r\n '');\r\n w.document.close();\r\n w.focus();\r\n w.print();\r\n\r\n $timeout(function onRenderTimeout() {\r\n // Vuelve a la ventana original.\r\n window.focus();\r\n $timeout(function () {\r\n //w.close();\r\n self.prepareExport = false;\r\n\r\n //vuelvo a seleccionar el planograma original\r\n self.selectedPlanogram = currentSelectedPlanogram;\r\n self.planogramByColums = [];\r\n });\r\n });\r\n } catch (ex) {\r\n $log.error('editPlanogramController::exportToPdf ex: %o', ex);\r\n throw ex;\r\n }\r\n //});\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Devuelve una cadena con los estilos del planograma.\r\n * @private\r\n * @returns Una cadena con los estilos del planograma.\r\n */\r\n self.getPlanogramStyles = function getPlanogramStyles() {\r\n // TODO: Verificar cross-browser.\r\n // TODO: Ver solución alternativa cargando un .css especifico.\r\n // TODO: Ver performance.\r\n var rules = [];\r\n angular.forEach(document.styleSheets,\r\n function (link) {\r\n // Fix: error con las extensiones de chrome.\r\n try {\r\n if (angular.isDefined(link.cssRules)) {\r\n angular.forEach(link.cssRules,\r\n function (rule) {\r\n if (angular.isString(rule.selectorText) && /^planogram/.test(rule.selectorText)) {\r\n rules.push(rule);\r\n }\r\n });\r\n }\r\n } catch (ex) {\r\n // Nothing to do.\r\n }\r\n });\r\n\r\n var cssTexts = rules.map(function (rule) {\r\n return rule.cssText || '';\r\n });\r\n var ret = cssTexts.join('\\n');\r\n return ret;\r\n }\r\n\r\n //Filtros\r\n\r\n self.showFilters = false;\r\n\r\n self.toggleFilters = function () {\r\n\r\n self.searchInfoPlanograms();\r\n self.showFilters = !self.showFilters;\r\n\r\n //if (self.showFilters) {\r\n // $timeout(function () {\r\n\r\n // $window.onclick = function (event) {\r\n // closeFilterWhenClickingOutside(event);\r\n // }\r\n // }, 100);\r\n //} else {\r\n // $window.onclick = null;\r\n //}\r\n\r\n }\r\n\r\n self.getFilterClass = function () {\r\n if (self.showFilters == true)\r\n return 'move-right';\r\n else\r\n return '';\r\n }\r\n\r\n self.getUnitsColor = function (selectedItem) {\r\n if (selectedItem && selectedItem.storeInfo) {\r\n if ((selectedItem.facings * selectedItem.stackAbove) > selectedItem.storeInfo.units)\r\n return 'redColor';\r\n else if (selectedItem.stackTotal > selectedItem.storeInfo.units)\r\n return 'orangeColor';\r\n else\r\n return +'';\r\n }\r\n }\r\n\r\n self.getUnitsTextInfoStore = function (selectedItem) {\r\n if (selectedItem && selectedItem.storeInfo) {\r\n if ((selectedItem.facings * selectedItem.stackAbove) > selectedItem.storeInfo.units)\r\n return translations.TooltipForStoreUnits;\r\n else if (selectedItem.stackTotal > selectedItem.storeInfo.units)\r\n return translations.TooltipForStoreUnits2;\r\n else\r\n return '';\r\n }\r\n }\r\n\r\n self.getUnitsText = function (selectedItem) {\r\n if (selectedItem) {\r\n if ((selectedItem.facings * selectedItem.stackAbove) > selectedItem.units)\r\n return translations.TooltipForStoreUnits;\r\n else if (selectedItem.stackTotal > selectedItem.units)\r\n return translations.TooltipForStoreUnits2;\r\n else\r\n return '';\r\n }\r\n }\r\n\r\n function closeFilterWhenClickingOutside(event) {\r\n\r\n var clickedElement = event.target;\r\n if (!clickedElement) return;\r\n\r\n var elementClasses = clickedElement.classList;\r\n var clickedOnFilterDiv = elementClasses.contains('isFilter')\r\n || elementClasses.contains('chosen-choice')\r\n || elementClasses.contains('chosen-choices')\r\n || elementClasses.contains('search-field')\r\n || elementClasses.contains('default')\r\n || elementClasses.contains('chosen-container')\r\n || elementClasses.contains('chosen-container')\r\n if (!clickedOnFilterDiv) {\r\n self.closeFilters();\r\n }\r\n\r\n }\r\n\r\n self.closeFilters = function () {\r\n $timeout(function () {\r\n self.showFilters = false;\r\n $window.onclick = null;\r\n });\r\n\r\n }\r\n\r\n self.toggleSenseOfOrientation = function (planogram) {\r\n planogram.orientationRightToLeft = !planogram.orientationRightToLeft;\r\n }\r\n\r\n function loadData() {\r\n self.analyzeBy = self.isEdit() ? 'cluster' : 'store'\r\n\r\n /*\r\n spaceService.tags.getTags().then(function (tags) {\r\n self.allTags = tags;\r\n self.allTags.push({ id: 0, group: translations.Allf, name: '!null', displayName: translations.Allf });\r\n // Se agrupan los tags para el filtro de Grupo.\r\n var group = {};\r\n angular.forEach(tags,\r\n function (item) {\r\n if (!angular.isDefined(group[item.group])) {\r\n group[item.group] = item.group;\r\n self.groupTags.push({ name: item.group });\r\n }\r\n });\r\n });\r\n */\r\n\r\n }\r\n\r\n self.searchInfoPlanograms = function () {\r\n //console.log('searchInfoPlanograms')\r\n angular.forEach(self.model.planograms, function (planogram) {\r\n angular.forEach(planogram.clusters, function (cluster) {\r\n self.clusterIds.push(cluster.id);\r\n })\r\n angular.forEach(planogram.columns, function (column) {\r\n angular.forEach(column.modules, function (module) {\r\n angular.forEach(module.levels, function (level) {\r\n angular.forEach(level.items, function (item) {\r\n item.uniqueId = guid();\r\n var exists = false;\r\n angular.forEach(self.brands, function (brand) {\r\n if (item.brand && brand.name.toLowerCase() == item.brand.toLowerCase())\r\n exists = true;\r\n })\r\n if (item.brand && !exists)\r\n self.brands.push({ name: item.brand, displayName: item.brand });\r\n\r\n angular.forEach(item.tags, function (tagItem) {\r\n var existesTag = false\r\n angular.forEach(self.tags, function (_tag) {\r\n if (tagItem.name.toLowerCase() == _tag.name.toLowerCase()) {\r\n existesTag = true;\r\n }\r\n })\r\n if (!existesTag) {\r\n self.tags.push({ name: tagItem.name, displayName: tagItem.name })\r\n }\r\n\r\n })\r\n\r\n\r\n switch (item.orientation) {\r\n case 11: item.rotation = undefined; item.showMode = 'T'; break;\r\n case 21: item.rotation = undefined; item.showMode = 'S'; break;\r\n case 12: item.rotation = 90; item.showMode = 'T'; break;\r\n case 22: item.rotation = 90; item.showMode = 'S'; break;\r\n default: break;\r\n }\r\n })\r\n\r\n //ordenar item en level por propiedad order, \r\n\r\n //Armar memo de todos los item existentes en el planograma\r\n angular.forEach(level.items, function (item) {\r\n if (self.memoAllItemPlanogram[item.itemId]) {\r\n //console.log('existe self.memoAllItemPlanogram[item.itemId]', item.itemId)\r\n self.memoAllItemPlanogram[item.itemId].push({\r\n idCopy: item.id,\r\n order: item.order\r\n })\r\n } else {\r\n self.memoAllItemPlanogram[item.itemId] = []\r\n self.memoAllItemPlanogram[item.itemId].push({\r\n idCopy: item.id,\r\n order: item.order\r\n })\r\n }\r\n\r\n })\r\n\r\n })\r\n\r\n })\r\n })\r\n\r\n })\r\n\r\n\r\n }\r\n\r\n function isTagAdded(tag) {\r\n\r\n for (var i = 0; i < self.allTags.length; i++) {\r\n if (self.allTags[i].id === tag.id) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n function loadDataPlanograms(planogramId) {\r\n self.isLoading = true;\r\n self.isLoadingListItems = false;\r\n self.isLoadingPlanogram = false;\r\n spaceService.planograms.getPlanogramInfo(planogramId).then(function (results) {\r\n console.log('result', results)\r\n results.subCategories.unshift({ id: null, name: translations.Allf });\r\n\r\n //self.generateDataGrid(results);\r\n\r\n self.model.planograms.push(results);\r\n\r\n angular.forEach(self.model.planograms,\r\n function (planogram) {\r\n angular.forEach(planogram.columns,\r\n function (column) {\r\n angular.forEach(column.modules,\r\n function (module) {\r\n module.type = module.type;\r\n if (module.isRefrigerator) self.thereIsRefrigerator = true;\r\n if (module.type == 'Peg') self.thereIsPeg = true;\r\n });\r\n });\r\n });\r\n\r\n self.selectedPlanogram = self.model.planograms[0];\r\n\r\n //if (self.selectedPlanogram.clusters.length) self.selectedCluster = self.selectedPlanogram.clusters[0];\r\n //if (self.selectedPlanogram.stores.length) self.selectedStore = self.selectedPlanogram.stores[0];\r\n\r\n self.brands = [{ name: '!null', displayName: translations.Allf }];\r\n self.tags = [{ name: '!null', displayName: translations.Allf }];\r\n\r\n self.searchInfoPlanograms();\r\n\r\n self.isLoadingPlanogram = false;\r\n });\r\n\r\n spaceService.planograms.getSpaceItemsForPlanogram(planogramId).then(function (results) {\r\n self.itemList = [];\r\n //filtar items por subcategorias\r\n angular.forEach(self.model.planograms,\r\n function (_planogram) {\r\n if (!_planogram.subCategories.length)\r\n self.itemList = results;\r\n\r\n angular.forEach(_planogram.subCategories,\r\n function (_subCategory) {\r\n angular.forEach(results,\r\n function (_item) {\r\n if (_subCategory.id === _item.categoryId) {\r\n\r\n //Agrego la etiqueta si no existe en la coleccion de Tags\r\n if (_item.tags && _item.tags.length > 0) {\r\n for (i = 0; i < _item.tags.length; i++) {\r\n if (!isTagAdded(_item.tags[i])) {\r\n self.allTags.push({\r\n id: _item.tags[i].id,\r\n group: _item.tags[i].group,\r\n name: _item.tags[i].name\r\n });\r\n }\r\n }\r\n }\r\n\r\n self.itemList.push(_item);\r\n }\r\n });\r\n });\r\n });\r\n\r\n //mapeo propiedades de items de itemList que los items de los planogramas necesitan \r\n loopThroughAll(function (planogram, column, module, level, item) {\r\n angular.forEach(self.itemList, function (_item) {\r\n if (item.itemId == _item.itemId) {\r\n item.currentInventoryUnits = _item.currentInventoryUnits;\r\n item.units = _item.units;\r\n }\r\n })\r\n }, self.until.items)\r\n\r\n calculateSales();\r\n\r\n self.FilterByAssortments(self.currentAssortmenFilter);\r\n\r\n self.allBrandsPlanogram = [{ name: '!null', displayName: translations.Allf }];\r\n\r\n angular.forEach(self.itemList, function (item) {\r\n //item.showByAssortment = false;\r\n\r\n //agregar propiedad oritentation = 0 (Default) para todos los items de itemsList si no esta definido\r\n if (!item.orientation) item.orientation = 0;\r\n\r\n var exists = false;\r\n angular.forEach(self.allBrandsPlanogram, function (brand) {\r\n if (item.brand && brand.name.toLowerCase() == item.brand.toLowerCase())\r\n exists = true;\r\n })\r\n if (item.brand && !exists) {\r\n self.allBrandsPlanogram.push({ name: item.brand, displayName: item.brand });\r\n }\r\n\r\n if (self.brandsFilter.indexOf(item.brand) === -1) {\r\n self.brandsFilter.push(item.brand);\r\n }\r\n\r\n if (self.manufacturersFilter.indexOf(item.manufacturer) === -1) {\r\n self.manufacturersFilter.push(item.manufacturer);\r\n }\r\n })\r\n\r\n\r\n var listedItems = self.itemList.slice().filter(function (item) {\r\n return item.isListed === true;\r\n });\r\n\r\n // Se agrega el valor de la propiedad ya que es un proceso automatico y no se le indica cual es la unidad de medida.\r\n angular.forEach(listedItems, function (_item) {\r\n angular.forEach(_item.unitOfMeasures, function (_uom) {\r\n if (_uom.height && _uom.width && _uom.depth) {\r\n var newItem = angular.copy(_item);\r\n //item.planogramLevelId = level.id;\r\n newItem.selectedUnitOfMeasureId = _uom.id;\r\n newItem.selectedUnitOfMeasure = _uom;\r\n self.listedItems.push(newItem);\r\n }\r\n });\r\n });\r\n\r\n\r\n self.selectedItemId = $stateParams.itemId !== 0 ? $stateParams.itemId : null;\r\n\r\n self.isLoading = false;\r\n self.isLoadingListItems = false;\r\n //console.log('itemList', self.itemList)\r\n\r\n $timeout(makeCopyForChangeDetection, 500);\r\n });\r\n }\r\n\r\n self.planogramCopy = null;\r\n function makeCopyForChangeDetection() {\r\n self.planogramCopy = angular.copy(self.model.planograms[0]);\r\n }\r\n\r\n self.hasPlanogramChanged = function () {\r\n var original = getCopyOfSavableElements(self.model.planograms[0]);\r\n var copy = getCopyOfSavableElements(self.planogramCopy);\r\n\r\n return !angular.equals(original, copy);\r\n }\r\n\r\n function getCopyOfSavableElements(planogram) {\r\n\r\n var obj1 = {};\r\n\r\n angular.forEach(planogram.columns, function (col) {\r\n angular.forEach(col.modules, function (mod) {\r\n angular.forEach(mod.levels, function (lev) {\r\n obj1[`col${col.id}_mod${mod.id}_lev${lev.id}`] = [];\r\n angular.forEach(lev.items, function (it) {\r\n obj1[`col${col.id}_mod${mod.id}_lev${lev.id}`].push({\r\n id: it.id,\r\n selectedUnitOfMeasureId: it.selectedUnitOfMeasureId,\r\n order: it.order,\r\n facings: it.facings,\r\n orientation: it.orientation,\r\n stackAbove: it.stackAbove,\r\n stackBehind: it.stackBehind,\r\n ticketCount: it.ticketCount,\r\n positionX: it.positionX,\r\n positionY: it.positionY\r\n });\r\n });\r\n });\r\n });\r\n });\r\n\r\n return obj1;\r\n }\r\n\r\n function guid() {\r\n function s4() {\r\n return Math.floor((1 + Math.random()) * 0x10000)\r\n .toString(16)\r\n .substring(1);\r\n }\r\n return s4() + s4() + '-' + s4() + '-' + s4() + '-' +\r\n s4() + '-' + s4() + s4() + s4();\r\n }\r\n\r\n function renderSizes() {\r\n loopThroughAll(function (planogram, column, module, level, item) {\r\n self.calcItemSize(item, level, planogram);\r\n }, self.until.items);\r\n\r\n }\r\n\r\n //Filtro collapse\r\n\r\n self.isNavCollapsed = true;\r\n self.isCollapsedHorizontal = false;\r\n self.isCollapsed = true;\r\n self.isInfoPlanogramCollapsed = false;\r\n self.isInfoAveragePerformanceCollapsed = false;\r\n self.isInfoStorePerformanceCollapsed = false;\r\n self.isInfoRankingCollapsed = false;\r\n self.isInfoRankingHeatMapCollapsed = false;\r\n self.isAditionalInfoCollapsed = true;\r\n self.isInfoAveragePerformanceCollapsedProduct = true;\r\n self.isInfoStorePerformanceCollapsedProduct = true;\r\n self.isRecommendationCollapsed = false;\r\n\r\n\r\n function init() {\r\n self.isLoading = true;\r\n $translate([\"Allf\", \"All\", \"ContinueSwal\", \"CancelSwal\", \"SavePlanogramSwalTitle\", \"SavedPlanogramSwal\", \"SavedPlanogramaSwalSubtitle\", \"ValidationSwalTitle\",\r\n \"ValidationSwalSubtitle\", \"SavedTicketSwal\", \"SavedTicketSwalSubtitle\", \"SureCleanPlanogramSwal\", \"Yes\", \"SureGenerateAutocompletePlanogramSwal\", \"WithoutLevelsSwal\",\r\n \"WithoutLevelsSubtitleSwal\", \"PlanagramNotFoundSwal\", \"PlanagramNotFoundSwalSubtitle1\", \"PlanagramNotFoundSwalSubtitle2\", \"Subspaced\", \"Overpaced\", \"SalesShare\", \"SpaceShare\",\r\n \"SalesRestProducts\", \"SpaceRestProcucts\", \"AlertWillLoseChanges\", \"HideProducts\", \"ShowProducts\", \"HideInformation\", \"ShowInformation\", \"TooltipForStoreUnits\", \"TooltipForStoreUnits2\",\r\n \"ErrorTitleSwal\", \"InsufficientPermissionsToEdit\", \"InsufficientPermissionsToEditPlanogram\", \"FinishThePlanogram\", \"InsufficientPermitsToApprove\", \"YouWantToApproveThePlanogram\",\r\n \"InsufficientPermissionsToReport\", \"CommunicateThePlanogram\", \"AnErrorHasOccurred\", \"Low\", \"Medium\", \"HeightF\", \"NotInformed\", \"Manufacturer\", \"Brand\",\r\n \"InsufficientSpaceSwal\", \"InsufficientWidthSpaceSubtitleSwal\", \"AddLayDownItemSwal\", \"Laydown\", \"Standup\", \"ShowItemAbove\", \"ShowItemInfront\", \"ShowProfileItem\",\r\n \"SureDeleteItemSwal\", \"RemoveSwal\", \"CancelSwal\", \"ShowProfileItem\", \"TheItemWasAdded\", \"Aggregate\", \"Actives\", \"WithoutExhibition\", \"WithExhibition\", \"Delist\", \"New\", \"EnterFurnitureToPrint\",\r\n \"EnterFurnitureToPrintSubtitle\", \"InvalidRank\", \"InvalidRankSubtitle\", \"ConfigurationFinished\", \"AllReadyToPrintThePlanogram\", \"Print\", \"Sp_editPlanogram_spaced\", \"Sp_editPlanogram_new\",\r\n \"Sp_editPlanogram_pendingApproval\", \"Sp_editPlanogram_approved\", \"Sp_editPlanogram_informed\", \"WithoutSize\", \"WithoutSizeSubtitle\", \"IncorrectCategorySwal\", \"IncorrectCategorySubtitleSwal\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n self.translationLow = translations.Low;\r\n self.translationMedium = translations.Medium;\r\n self.translationHeightF = translations.HeightF;\r\n self.productStatus = translations.WithoutExhibition; //LG: Que diferencia hay entre productStatus y currentAssortmenFilter\r\n self.currentAssortmenFilter = translations.WithoutExhibition;\r\n\r\n\r\n self.priorityTickets = [\r\n { id: 1, name: self.translationLow },\r\n { id: 2, name: self.translationMedium },\r\n { id: 3, name: self.translationHeightF },\r\n ];\r\n\r\n }).then(function () {\r\n self.buttonTextProducts = translations.HideProducts;\r\n self.buttonTextInformationPanel = translations.HideInformation;\r\n });\r\n\r\n if (self.isEdit() && !self.hasPermissionToEdit) {\r\n $state.go('spaces.viewPlanogram', { planogramId: $stateParams.planogramId });\r\n }\r\n\r\n //Cargo los Tipos de Ticket\r\n spaceService.tickets.getTicketTypes(TICKET_TYPES.ITEM).then(function (ticketTypes) {\r\n self.ticketTypes = ticketTypes;\r\n });\r\n\r\n\r\n //loadData();\r\n\r\n if ($stateParams.planogramId != '0') {\r\n if (self.isEdit() && !self.hasPermissionToEdit) {\r\n $state.go('spaces.viewPlanogram', { planogramId: $stateParams.planogramId });\r\n }\r\n\r\n self.planogramId = $stateParams.planogramId\r\n loadDataPlanograms($stateParams.planogramId)\r\n } else if ($stateParams.itemId != '0' && $stateParams.clusterId != '0') {\r\n spaceService.planograms.getPlanogramId($stateParams.itemId, $stateParams.clusterId).then(function (planogramId) {\r\n if (!planogramId) {\r\n swal(translations.PlanagramNotFoundSwal, translations.PlanagramNotFoundSwalSubtitle1 + $stateParams.itemId + ', ' + translations.PlanagramNotFoundSwalSubtitle2 + $stateParams.clusterId, 'warning');\r\n $state.go('spaces.planograms');\r\n return;\r\n }\r\n\r\n if (self.isEdit() && !self.hasPermissionToEdit) {\r\n $state.go('spaces.viewPlanogram', { planogramId: $stateParams.planogramId });\r\n }\r\n\r\n self.planogramId = planogramId;\r\n loadDataPlanograms(planogramId);\r\n\r\n }).then(function () {\r\n var $products = angular.element('.edit-planogram-products');\r\n });\r\n }\r\n\r\n }\r\n\r\n self.getFechaHora = function () {\r\n return moment().format('DD/MM/YYYY hh:mma');\r\n }\r\n\r\n /**\r\n * Devuelve el ancho total que ocupan los productos en el estante.\r\n * @private\r\n * @param {any} level Referencia del nivel.\r\n * @returns El ancho total que ocupan los productos en el estante.\r\n */\r\n self.getLevelUsedWidth = function (level) {\r\n var ret = level.items.reduce(function (sum, item) {\r\n var width = self.getItemWidth(item);\r\n return sum + width;\r\n }, 0);\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve el ancho calculado para el grupo de items.\r\n * @private\r\n * @param {any} item Referencia del item.\r\n * @returns El ancho calculado para el grupo de items.\r\n */\r\n self.getItemWidth = function getItemWidth(item, notCountFacings) {\r\n // TODO: Verificar el cálculo con layDown.\r\n var width = [2, 4].indexOf(item.orientation) != -1 ? item.selectedUnitOfMeasure.height : item.selectedUnitOfMeasure.width;\r\n var ret = width * (notCountFacings ? 1 : item.facings);\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve el alto calculado para el grupo de items.\r\n * @private\r\n * @param {any} item Referencia del item.\r\n * @returns El alto calculado para el grupo de items.\r\n */\r\n self.getItemHeight = function getItemHeight(item) {\r\n var layDownItemsHeight = item.layDownItem ? item.layDownItem * ([2, 4].indexOf(item.orientation) != -1 ? item.selectedUnitOfMeasure.width : item.selectedUnitOfMeasure.depth) : 0;\r\n var stackAbove = item.stackAbove ? item.stackAbove : 1;\r\n var height = [2, 4].indexOf(item.orientation) != -1 ? item.selectedUnitOfMeasure.width : item.selectedUnitOfMeasure.height;\r\n var ret = (height * stackAbove) + layDownItemsHeight;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve verdadero si hay que mostrar el componente SVG del planograma, falso en caso contrario.\r\n * Verifica que no se este cargando la pagina y el nombre del estado de la aplicación.\r\n * @returns Verdadero si hay que mostrar el componente SVG del planograma, falso en caso contrario.\r\n */\r\n self.showPlanogramComponentSvg = function showPlanogramComponentSvg() {\r\n var ret = !self.isLoading\r\n && ($state.current.name === 'spaces.editPlanogram'\r\n || $state.current.name === 'spaces.viewPlanogram');\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve verdadero si hay que mostrar el componente HTML del planograma, falso en caso contrario.\r\n * Verifica que no se este cargando la pagina y el nombre del estado de la aplicación.\r\n * @returns Verdadero si hay que mostrar el componente SVG del planograma, falso en caso contrario.\r\n */\r\n self.showPlanogramComponentHtml = function showPlanogramComponentHtml() {\r\n var ret = !self.isLoading\r\n && ( $state.current.name === 'spaces.editPlanogramOld'\r\n || $state.current.name === 'spaces.viewPlanogramOld');\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve el identificador del item arrastrable.\r\n * @param {any} item Item.\r\n * @param {any} uom Unidad de medida.\r\n * @returns El identificador del item arrastrable.\r\n */\r\n self.getDraggableId = function getDraggableId(item, uom) {\r\n var ret = 'item_' + item.id + '-uom_' + uom.code;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve la imagen para mostrar al arratrar un item al planograma.\r\n * @param {any} item Item.\r\n * @param {any} uom Unidad de medida.\r\n * @returns La imagen para mostrar al arratrar un item al planograma.\r\n */\r\n self.getDraggableTarget = function getDraggableTarget(item, uom) {\r\n var id = self.getDraggableId(item, uom);\r\n\r\n // var ret = 'div:has(#' + id + '):last img';\r\n var ret = '#dnd_' + id + ' img:first';\r\n return ret;\r\n }\r\n\r\n /**\r\n * Ocurre al arrastrar y soltar un elemento sobre el planograma o al mover un elemento dentro del planograma.\r\n * @event \r\n * @param {any} $event Evento origina.\r\n * @param {any} planogram Referencia del planograma en el cual ocurrio el evento en el formato interno del planograma.\r\n * @param {any} column Referencia de la columna en la cual ocurrio el evento en el formato interno del planograma.\r\n * @param {any} module Referencia del módulo en el cual ocurrio el evento en el formato interno del planograma.\r\n * @param {any} level Referencia del estante en el cual ocurrio el evento en el formato interno del planograma.\r\n * @param {any} item Referencia del item en el cual ocurrio el evento en el formato interno del planograma.\r\n */\r\n self.planogramOnClickHandler = function planogramOnClickHandler($event, planogram, column, module, level, item) {\r\n // console.time('planogramOnClickHandler');\r\n //$log.debug('EditPlanogramCtrl::planogramOnClickHandler\\n\\t$event: %o\\n\\tplanogram: %o\\n\\tcolumn: %o\\n\\tmodule: %o\\n\\tlevel: %o\\n\\titem: %o',\r\n //$event,\r\n //planogram,\r\n //column,\r\n //module,\r\n //level,\r\n //item);\r\n\r\n // Aplica la selección.\r\n // self.planogramSelect(planogram, column, module, level, item);\r\n self.planogramSelect(self.selectedPlanogram, column, module, level, item);\r\n\r\n // Fuerza una nueva referencia del planograma para que se detecte el cambio.\r\n self.forceUpdateModel();\r\n\r\n // console.timeEnd('planogramOnClickHandler');\r\n }\r\n\r\n /**\r\n * Aplica la selección del item del planograma.\r\n * @param {any} planogram Referencia del planograma en el cual ocurrio el evento en el formato interno del planograma.\r\n * @param {any} column Referencia de la columna en la cual ocurrio el evento en el formato interno del planograma.\r\n * @param {any} module Referencia del módulo en el cual ocurrio el evento en el formato interno del planograma.\r\n * @param {any} level Referencia del estante en el cual ocurrio el evento en el formato interno del planograma.\r\n * @param {any} item Referencia del item en el cual ocurrio el evento en el formato interno del planograma.\r\n * @param {bool} keepSelected Mantiene el item seleccionado si el id es el mismo al item seleccionado, ver proceso addItemTo.\r\n */\r\n self.planogramSelect = function planogramSelect(planogram, column, module, level, item, keepSelected) {\r\n //$log.debug('EditPlanogramCtrl::planogramSelect\\n\\tplanogram: %o\\n\\tcolumn: %o\\n\\tmodule: %o\\n\\tlevel: %o\\n\\titem: %o',\r\n //planogram,\r\n //column,\r\n //module,\r\n //level,\r\n //item);\r\n\r\n // Apaga la selección.\r\n angular.forEach(self.model.planograms,\r\n function selectionOffForEachPlanograms(planogramLocal) {\r\n angular.forEach(planogramLocal.columns,\r\n function selectionOffForEachColumns(columnLocal) {\r\n columnLocal.selected = false;\r\n angular.forEach(columnLocal.modules,\r\n function selectionOffForEachModules(moduleLocal) {\r\n moduleLocal.selected = false;\r\n angular.forEach(moduleLocal.levels,\r\n function selectionOffforEachLevels(levelLocal) {\r\n levelLocal.selected = false;\r\n angular.forEach(levelLocal.items,\r\n function selectionOffForEachItems(itemLocal) {\r\n moduleLocal.selected = false;\r\n levelLocal.selected = false;\r\n columnLocal.selected = false;\r\n itemLocal.selected = false;\r\n });\r\n });\r\n });\r\n });\r\n });\r\n\r\n if (angular.isObject(item)) {\r\n if (angular.isObject(self.selectedItem)) {\r\n if (self.selectedItem.id === item.id && !keepSelected) {\r\n // Deselecciona.\r\n self.activePlanogram = null;\r\n self.selectedColumn = null;\r\n self.selectedModule = null;\r\n self.selectedLevel = null;\r\n self.selectedItem = null;\r\n self.selectedItemId = 0;\r\n } else {\r\n self.activePlanogram = planogram;\r\n self.selectedColumn = column;\r\n self.selectedModule = module;\r\n self.selectedLevel = level;\r\n self.selectedItem = item;\r\n self.selectedItemId = item.itemId;\r\n }\r\n } else {\r\n self.activePlanogram = planogram;\r\n self.selectedColumn = column;\r\n self.selectedModule = module;\r\n self.selectedLevel = level;\r\n self.selectedItem = item;\r\n self.selectedItemId = item.itemId;\r\n }\r\n } else {\r\n // Deselecciona.\r\n self.activePlanogram = null;\r\n self.selectedColumn = null;\r\n self.selectedModule = null;\r\n self.selectedLevel = null;\r\n self.selectedItem = null;\r\n self.selectedItemId = 0;\r\n }\r\n\r\n if (angular.isObject(self.selectedItem)) {\r\n angular.forEach(self.model.planograms,\r\n function selectionOnForEachPlanograms(planogramLocal) {\r\n angular.forEach(planogramLocal.columns,\r\n function selectionOnForEachColumns(columnLocal) {\r\n angular.forEach(columnLocal.modules,\r\n function selectionOnForEachModules(moduleLocal) {\r\n angular.forEach(moduleLocal.levels,\r\n function selectionOnForEachLevels(levelLocal) {\r\n angular.forEach(levelLocal.items,\r\n function selectionOnForEachItems(itemLocal) {\r\n if (self.selectedItem.itemId === itemLocal.itemId) {\r\n moduleLocal.selected = true;\r\n levelLocal.selected = true;\r\n columnLocal.selected = true;\r\n itemLocal.selected = true;\r\n }\r\n });\r\n });\r\n });\r\n });\r\n });\r\n\r\n var arr = [self.selectedItem];\r\n\r\n // $timeout(1).then(function () {\r\n self.filteredItems = arr;\r\n\r\n // self.filtereditems.push(item);\r\n self.renderPieChartsParent(arr);\r\n // });\r\n } else {\r\n // $timeout(1).then(function () {\r\n self.filtereditems = [];\r\n self.renderPieChartsParent(null);\r\n //});\r\n }\r\n }\r\n\r\n /**\r\n * Ocurre al arrastrar y soltar un elemento sobre el planograma o al mover un elemento dentro del planograma.\r\n * @event \r\n * @param {any} $event Evento original.\r\n * @param {any} point Referencia de lugar donde ocurrio el evento.\r\n * @param {any} place Referencia de lugar donde se debe ubicar el elemento.\r\n * @param {any} planogram Referencia del planograma en el cual ocurrio el evento en el formato interno del planograma.\r\n * @param {any} column Referencia de la columna en la cual ocurrio el evento en el formato interno del planograma.\r\n * @param {any} module Referencia del módulo en el cual ocurrio el evento en el formato interno del planograma.\r\n * @param {any} level Referencia del estante en el cual ocurrio el evento en el formato interno del planograma.\r\n * @param {any} item Referencia del item en el cual ocurrio el evento en el formato interno del planograma.\r\n */\r\n self.planogramOnDropHandler = function planogramOnDropHandler($event, point, place, planogram, column, module, level, item) {\r\n // Obtiene la data que se esta arrastrando del servicio DnD.\r\n var data = DnDService.getData();\r\n //$log.debug('EditPlanogramCtrl::planogramOnDropHandler\\n\\t$event: %o\\n\\tpoint: %o\\n\\tplace: %o\\n\\tplanogram: %o\\n\\tcolumn: %o\\n\\tmodule: %o\\n\\tlevel: %o\\n\\titem: %o\\n\\tdrop: %o',\r\n //$event,\r\n //point,\r\n //place,\r\n //planogram,\r\n //column,\r\n //module,\r\n //level,\r\n //item,\r\n //data);\r\n\r\n // Verifica si el elemento que se solto se esta agregando o se esta moviendo.\r\n var keys = Object.keys(data);\r\n var isNew = keys.indexOf('item') > -1 && keys.indexOf('uom') > -1;\r\n if (isNew) {\r\n var newItem = self.getNewItem(point, self.selectedPlanogram, column, module, level, data);\r\n self.addItemTo(point, place, self.selectedPlanogram, column, module, level, item, newItem);\r\n } else {\r\n // self.moveItemTo(point, place, planogram, column, module, level, item, data);\r\n self.moveItemTo(point, place, self.selectedPlanogram, column, module, level, item, data);\r\n }\r\n }\r\n\r\n self.planogramOnChangeLevelHeight = function planogramOnChangeLevelHeight($event, planogram, column, module, level, action) {\r\n //$log.debug('EditPlanogramCtrl::planogramOnChangeLevelHeight\\n\\t$event: %o\\n\\tplanogram: %o\\n\\tcolumn: %o\\n\\tmodule: %o\\n\\tlevel: %o\\n\\taction: %o',\r\n //$event,\r\n //planogram,\r\n //column,\r\n //module,\r\n //level,\r\n //action);\r\n\r\n // Busca el planograma en la colección de planogramas locales.\r\n var planogramLocal = self.findPlanogram(planogram);\r\n\r\n // Busca la columna dentro de la colección de columnas del planograma local.\r\n var columnLocal = self.findColumn(planogramLocal, column);\r\n\r\n // Busca el módulo dentro de la colección de columnas del planograma local.\r\n var moduleLocal = self.findFurniture(columnLocal, module);\r\n\r\n // Busca el estante dentro de la colección de estantes del módulo local.\r\n var levelLocal = self.findLevel(moduleLocal, level);\r\n\r\n //TODO VALIDACIONES\r\n if (action === 'increase') {\r\n levelLocal.height += 1;\r\n moduleLocal.height += 1;\r\n }\r\n else if (action === 'reduce') {\r\n var highestItemHeight = getHighestItemHeight(levelLocal);\r\n if (highestItemHeight > levelLocal.height - 1) {\r\n swal('altura no permitida'\r\n , 'altura del nivel no puede ser menor que la altura del productos mas alto del nivel, altura minimo permitido: ' + highestItemHeight\r\n , 'warning');\r\n }\r\n else {\r\n levelLocal.height -= 1;\r\n moduleLocal.height -= 1;\r\n }\r\n }\r\n //actualizo el height del planograma.\r\n planogramLocal.height = getHighestMouduleHeight();\r\n\r\n self.forceUpdateModel();\r\n }\r\n\r\n function getHighestItemHeight(level) {\r\n return level.items.reduce(function (maxHeight, item) {\r\n var currentHeight = item.height * item.stackAbove;\r\n if (currentHeight > maxHeight)\r\n return currentHeight;\r\n else return maxHeight;\r\n }, 0);\r\n } \r\n\r\n function getHighestMouduleHeight() {\r\n var maxHeight = 0;\r\n loopThroughAll(function (planogram, column, module) {\r\n if (module.height > maxHeight) {\r\n maxHeight = module.height;\r\n }\r\n }, self.until.modules);\r\n\r\n return maxHeight;\r\n } \r\n\r\n self.planogramOnDeleteLevel = function planogramOnDeleteLevel($event, planogram, column, module, level) {\r\n //$log.debug('EditPlanogramCtrl::planogramOnDeleteLevel\\n\\t$event: %o\\n\\tplanogram: %o\\n\\tcolumn: %o\\n\\tmodule: %o\\n\\tlevel: %o',\r\n //$event,\r\n //planogram,\r\n //column,\r\n //module,\r\n //level);\r\n\r\n // Busca el planograma en la colección de planogramas locales.\r\n var planogramLocal = self.findPlanogram(planogram);\r\n\r\n // Busca la columna dentro de la colección de columnas del planograma local.\r\n var columnLocal = self.findColumn(planogramLocal, column);\r\n\r\n // Busca el módulo dentro de la colección de columnas del planograma local.\r\n var moduleLocal = self.findFurniture(columnLocal, module);\r\n\r\n // Busca el estante dentro de la colección de estantes del módulo local.\r\n var levelLocal = self.findLevel(moduleLocal, level);\r\n\r\n //no puedo borrar un nivel si tiene items\r\n if (levelLocal.items.length) {\r\n swal('Nivel con Items'\r\n , 'no se puede eliminar un nivel que contiene items'\r\n , 'warning');\r\n }\r\n else {\r\n var levelIndex = moduleLocal.levels.indexOf(levelLocal);\r\n moduleLocal.levels.splice(levelIndex, 1);\r\n\r\n //el modulo decrementa la altura del nivel eliminado\r\n moduleLocal.height -= levelLocal.height;\r\n\r\n //actualizo el height del planograma.\r\n planogramLocal.height = getHighestMouduleHeight();\r\n\r\n self.forceUpdateModel();\r\n }\r\n\r\n \r\n }\r\n\r\n /**\r\n * Devuelve un nuevo item para agregar al planograma.\r\n * @param {any} point Referencia de lugar donde ocurrio el evento.\r\n * @param {any} column Referencia de la columna en la cual ocurrio el evento en el formato interno del planograma.\r\n * @param {any} module Referencia del módulo en el cual ocurrio el evento en el formato interno del planograma.\r\n * @param {any} level Referencia del estante en el cual ocurrio el evento en el formato interno del planograma.\r\n * @param {any} data Referencia del item y de la unidad de medida.\r\n */\r\n self.getNewItem = function getNewItem(point, planogram, column, module, level, data) {\r\n var isPeg = module.type === 'Peg';\r\n \r\n var ret = angular.copy(data.item);\r\n ret.planogramLevelId = level.id;\r\n //ret.id = guid();\r\n ret.uniqueId = guid();\r\n ret.facings = data.item.facings || 1;\r\n ret.selectedUnitOfMeasureId = data.uom.id;\r\n ret.selectedUnitOfMeasure = angular.copy(data.uom);\r\n ret.order = -1;\r\n\r\n if (self.autoStack && !isPeg) {\r\n ret.stackBehind = self.getItemStack(module, level, ret, 'behind');\r\n ret.stackAbove = self.getItemStack(module, level, ret, 'above');\r\n \r\n } else {\r\n ret.stackAbove = data.item.stackAbove ? data.item.stackAbove : 1;\r\n ret.stackBehind = data.item.stackBehind ? data.item.stackBehind : 1;\r\n }\r\n\r\n // Calcula los días de stock del producto.\r\n self.calcDaysInStock(ret);\r\n\r\n // Verifica si esta seleccionado.\r\n if (angular.isObject(self.selectedItem) && self.selectedItem.itemId === ret.itemId) {\r\n ret.selected = true;\r\n }\r\n\r\n if (isPeg) {\r\n if (self.autoAlign) {\r\n self.fixPostitionAligningItems(ret, point, level.items);\r\n }\r\n else {\r\n self.fixPostition(ret, point);\r\n }\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve la cantidad de maxima de items que se pueden apilar de un itema para un estante.\r\n * @param {any} module Referencia del planograma.\r\n * @param {any} level Referencia del estante.\r\n * @param {any} item Referencia del item.\r\n * @param {any} direction\r\n * @param {any} defaultValue\r\n * @returns La cantidad de maxima de items que se pueden apilar de un itema para un estante.\r\n */\r\n self.getItemStack = function getItemStack(module, level, item, direction, defaultValue) {\r\n var ret = defaultValue;\r\n\r\n if (angular.isObject(module)\r\n && angular.isObject(level)\r\n && angular.isObject(item)\r\n && angular.isObject(item.selectedUnitOfMeasure)) {\r\n\r\n // de frente sin rot\r\n var alto = item.selectedUnitOfMeasure.height;\r\n var ancho = item.selectedUnitOfMeasure.width;\r\n var profundidad = item.selectedUnitOfMeasure.depth;\r\n\r\n // de frente rot 90\r\n if (!item.showMode && item.rotation === 90) {\r\n alto = item.selectedUnitOfMeasure.width;\r\n ancho = item.selectedUnitOfMeasure.height;\r\n profundidad = item.selectedUnitOfMeasure.depth;\r\n }\r\n\r\n // lateral sin rot\r\n if (!item.showMode === 'S' && !item.rotation) {\r\n alto = item.selectedUnitOfMeasure.selectedUnitOfMeasure.height;\r\n ancho = item.selectedUnitOfMeasure.depth;\r\n profundidad = item.selectedUnitOfMeasure.width;\r\n }\r\n // lateral rot 90\r\n if (!item.showMode === 'S' && item.rotation === 90) {\r\n alto = item.selectedUnitOfMeasure.depth;\r\n ancho = item.selectedUnitOfMeasure.heigh;\r\n profundidad = item.selectedUnitOfMeasure.width;\r\n }\r\n\r\n // superior sin rot\r\n if (!item.showMode === 'T' && !item.rotation) {\r\n alto = item.selectedUnitOfMeasure.height;\r\n ancho = item.selectedUnitOfMeasure.width;\r\n profundidad = item.selectedUnitOfMeasure.depth;\r\n }\r\n\r\n // superior rot 90\r\n if (!item.showMode === 'T' && item.rotation === 90) {\r\n alto = item.selectedUnitOfMeasure.depth;\r\n ancho = item.selectedUnitOfMeasure.width;\r\n profundidad = item.selectedUnitOfMeasure.height;\r\n }\r\n\r\n if (direction === 'behind') {\r\n ret = Math.floor(module.depth / profundidad);\r\n } else if (direction === 'above') {\r\n ret = Math.floor(level.height / alto);\r\n }\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve la cantidad total de carga de items.\r\n * @private\r\n * @param {any} item\r\n * @returns La cantidad total de carga de items.\r\n */\r\n self.calculateLoadQuantity = function calculateLoadQuantity(item) {\r\n var ret = 0;\r\n if (angular.isObject(item)) {\r\n ret = Math.round((item.stackBehind * item.stackAbove * item.facings) * (item.selectedUnitOfMeasure.conversion || 1));\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Agrega un item al planograma.\r\n * Verifica si el item nuevo es igual al item sobre el cual se solto y le incrementa un frente al item actual.\r\n * Verifica si el item nuevo es igual al item item anterior al item que se solto le incrementa un frente al item anteriror.\r\n * Verifica si el item nuevo es igual al item item siguiente al item que se solto le incrementa un frente al item siguiente.\r\n * Agrega el item al estante.\r\n * @param {any} point Referencia de lugar donde ocurrio el evento.\r\n * @param {any} place Referencia de lugar donde se debe ubicar el elemento.\r\n * @param {any} planogram Referencia del planograma.\r\n * @param {any} column Referencia de la Columna del planograma.\r\n * @param {any} module Referencia del módulo de la columna.\r\n * @param {any} level Referencia del estante del módulo,\r\n * @param {any} item Referencia del item del estante.\r\n * @param {any} newItem Nuevo item.\r\n * @returns {boolean} Verdadero si el elemento a agregar es valido y se agrego al planograma.\r\n */\r\n self.addItemTo = function addItemTo(point, place, planogram, column, module, level, item, newItem) {\r\n //$log.debug('EditPlanogramCtrl::addItemTo\\n\\tpoint: %o\\n\\tplace: %o\\n\\tplanogram: %o\\n\\tcolumn: %o\\n\\tfurniture: %o\\n\\tlevel: %o\\n\\titem: %o\\n\\tnewItem: %o',\r\n //point,\r\n //place,\r\n //planogram,\r\n //column,\r\n //module,\r\n //level,\r\n //item,\r\n //newItem);\r\n self.stateChange = true;\r\n\r\n // TODO: Contemplar las distintas tipos de logicas segun el tipo de mueble.\r\n\r\n // Busca el planograma en la colección de planogramas locales.\r\n var planogramLocal = self.findPlanogram(planogram);\r\n\r\n // Busca la columna dentro de la colección de columnas del planograma local.\r\n var columnLocal = self.findColumn(planogramLocal, column);\r\n\r\n // Busca el módulo dentro de la colección de columnas del planograma local.\r\n var moduleLocal = self.findFurniture(columnLocal, module);\r\n var isPeg = moduleLocal.type === 'Peg';\r\n\r\n // Busca el estante dentro de la colección de estantes del módulo local.\r\n var levelLocal = self.findLevel(moduleLocal, level);\r\n\r\n // Busca el item dentro de la colección de items del estante local.\r\n var itemLocal = self.findItem(levelLocal, item);\r\n\r\n // Busca el item anterior dentro de la colección de items del estante local.\r\n //var itemPrevLocal = self.findPrevItem(levelLocal, itemLocal);\r\n var itemPrevLocal;\r\n\r\n // Busca el item siguiente dentro de la colección de items del estante local.\r\n //var itemNextLocal = self.findNextItem(levelLocal, itemLocal);\r\n var itemNextLocal;\r\n\r\n if (itemLocal) {\r\n itemPrevLocal = self.findPrevItem(levelLocal, itemLocal);\r\n itemNextLocal = self.findNextItem(levelLocal, itemLocal);\r\n }\r\n else if (!isPeg) {\r\n if (place === 'before') {\r\n itemPrevLocal = null;\r\n itemNextLocal = levelLocal.items.length ? levelLocal.items[0] : null;\r\n }\r\n else if (place === 'after') {\r\n var length = levelLocal.items.length;\r\n itemPrevLocal = length ? levelLocal.items[length - 1] : null;\r\n itemNextLocal = null;\r\n }\r\n }\r\n\r\n //si hay agrupacion, newItem mantiene la orientacion del grupo para calcular el espacio\r\n if (itemLocal && itemLocal.itemId === newItem.itemId && itemLocal.selectedUnitOfMeasureId === newItem.selectedUnitOfMeasureId) {\r\n newItem.orientation = itemLocal.orientation;\r\n }\r\n else if (itemPrevLocal && itemPrevLocal.itemId === newItem.itemId && itemPrevLocal.selectedUnitOfMeasureId === newItem.selectedUnitOfMeasureId) { \r\n newItem.orientation = itemPrevLocal.orientation;\r\n }\r\n else if (itemNextLocal && itemNextLocal.itemId === newItem.itemId && itemNextLocal.selectedUnitOfMeasureId === newItem.selectedUnitOfMeasureId) {\r\n newItem.orientation = itemNextLocal.orientation;\r\n }\r\n\r\n var isValid = self.validateAddOrModifyItemInLevel(planogramLocal, columnLocal, moduleLocal, levelLocal, newItem);\r\n if (isValid) {\r\n if (isPeg) {\r\n // Agrega al estante.\r\n levelLocal.items.push(newItem);\r\n } else {\r\n self.addItemToInternal(place, levelLocal, itemLocal, itemPrevLocal, itemNextLocal, newItem);\r\n }\r\n\r\n // Mantiene el orden de los items.\r\n angular.forEach(levelLocal.items,\r\n function (value, idx) {\r\n value.order = idx;\r\n });\r\n\r\n // Selecciona el item agregado.\r\n self.planogramSelect(planogramLocal, columnLocal, moduleLocal, levelLocal, newItem, true);\r\n\r\n // Actualiza la carga total del item en el planograma\r\n calculateStackTotalForPlanogram(newItem.itemId);\r\n\r\n // Actualiza los días de exibición del item en el planograma.\r\n self.calcExhibitionDays(newItem.itemId);\r\n\r\n //Actualiza el groupMap.\r\n if (self.groupMapEnabled) {\r\n self.setGroupMap(self.groupMapVariable, self.groupMapVariableValue);\r\n }\r\n\r\n // Fuerza una nueva referencia del planograma para que se detecte el cambio.\r\n self.forceUpdateModel();\r\n }\r\n\r\n return isValid;\r\n }\r\n\r\n /**\r\n * Agrega un item al planograma.\r\n * Verifica si el item nuevo es igual al item sobre el cual se solto y le incrementa un frente al item actual.\r\n * Verifica si el item nuevo es igual al item item anterior al item que se solto le incrementa un frente al item anteriror.\r\n * Verifica si el item nuevo es igual al item item siguiente al item que se solto le incrementa un frente al item siguiente.\r\n * Agrega el item al estante.\r\n * @param {any} place Referencia de lugar donde se debe ubicar el elemento.\r\n * @param {any} level Referencia del estante del módulo,\r\n * @param {any} item Referencia del item del estante.\r\n * @param {any} newItem Nuevo item.\r\n * @returns {boolean} Verdadero si el elemento a agregar es valido y se agrego al planograma.\r\n */\r\n self.addItemToInternal = function addItemToInternal(place, level, item, itemPrev, itemNext, newItem) {\r\n //$log.debug('EditPlanogramCtrl::addItemToInternal\\n\\tlevel: %o\\n\\titem: %o\\n\\tnewItem: %o\\n\\titemPrev: %o\\n\\titemNext: %o',\r\n //level,\r\n //item,\r\n //newItem,\r\n //itemPrev,\r\n //itemNext);\r\n self.stateChange = true;\r\n newItem.planogramLevelId = level.id;\r\n\r\n var idx;\r\n\r\n // Si existe el item local\r\n if (item && item.itemId === newItem.itemId && item.selectedUnitOfMeasureId === newItem.selectedUnitOfMeasureId) {\r\n //item.facings += 1;\r\n item.facings += newItem.facings;\r\n }\r\n // Verifica si el elemento anterior es el mismo que se esta agregando.\r\n else if (itemPrev && itemPrev.itemId === newItem.itemId && itemPrev.selectedUnitOfMeasureId === newItem.selectedUnitOfMeasureId) { \r\n\r\n //itemPrev.facings += 1;\r\n itemPrev.facings += newItem.facings;\r\n }\r\n // Verifica si el elemento siguiente es el mismo que se esta agregando.\r\n else if (itemNext && itemNext.itemId === newItem.itemId && itemNext.selectedUnitOfMeasureId === newItem.selectedUnitOfMeasureId) {\r\n //itemPrev.facings += 1;\r\n itemNext.facings += newItem.facings;\r\n } else if (item) {\r\n // Busca el elemento y lo agrega antes.\r\n idx = self.findIndex(level.items, item, self.compareToById);\r\n var newPosition = idx;\r\n if (place === 'after') {\r\n newPosition += 1;\r\n }\r\n\r\n level.items.splice(newPosition, 0, newItem);\r\n } else if (place === 'before') {\r\n // Agrega al principio del estante.\r\n level.items.splice(0, 0, newItem);\r\n }\r\n else if (place === 'after') {\r\n // Agrega al final del estante.\r\n level.items.push(newItem);\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Mueve un item dentro del planograma.\r\n * Verifica si el item nuevo es igual al item sobre el cual se solto y le incrementa un frente al item actual.\r\n * Verifica si el item nuevo es igual al item item anterior al item que se solto le incrementa un frente al item anteriror.\r\n * Verifica si el item nuevo es igual al item item siguiente al item que se solto le incrementa un frente al item siguiente.\r\n * Agrega el item al estante.\r\n * @param {any} point Referencia de lugar donde ocurrio el evento.\r\n * @param {any} place Referencia de lugar donde se debe ubicar el elemento.\r\n * @param {any} planogram Referencia del planograma.\r\n * @param {any} column Referencia de la Columna del planograma.\r\n * @param {any} module Referencia del módulo de la columna.\r\n * @param {any} level Referencia del estante del módulo,\r\n * @param {any} item Referencia del item del estante.\r\n * @param {any} movedItem Item a mover.\r\n */\r\n self.moveItemTo = function moveItemTo(point, place, planogram, column, module, level, item, movedItem) {\r\n //$log.debug('EditPlanogramCtrl::moveItemTo\\n\\tpoint: %o\\n\\tplace: %o\\n\\tplanogram: %o\\n\\tcolumn: %o\\n\\tmodule: %o\\n\\tlevel: %o\\n\\titem: %o\\n\\tmovedItem: %o',\r\n //point,\r\n //place,\r\n //planogram,\r\n //column,\r\n //module,\r\n //level,\r\n //item,\r\n //movedItem);\r\n self.stateChange = true;\r\n\r\n var idx;\r\n\r\n // Busca el planograma en la colección de planogramas locales.\r\n var planogramLocal = self.findPlanogram(planogram);\r\n\r\n // Busca la columna dentro de la colección de columnas del planograma local.\r\n var columnLocal = self.findColumn(planogramLocal, column);\r\n\r\n // Busca el módulo dentro de la colección de columnas del planograma local.\r\n var moduleLocal = self.findFurniture(columnLocal, module);\r\n var isPeg = moduleLocal.type === 'Peg';\r\n\r\n // Busca el estante dentro de la colección de estantes del módulo local.\r\n var levelLocal = self.findLevel(moduleLocal, level);\r\n\r\n // Busca el item dentro de la colección de items del estante local.\r\n var itemLocal = self.findItem(levelLocal, item);\r\n\r\n // Busca el item anterior dentro de la colección de items del estante local.\r\n //var itemPrevLocal = self.findPrevItem(levelLocal, itemLocal);\r\n var itemPrevLocal;\r\n\r\n // Busca el item siguiente dentro de la colección de items del estante local.\r\n //var itemNextLocal = self.findNextItem(levelLocal, itemLocal);\r\n var itemNextLocal;\r\n if (!isPeg) {\r\n if (itemLocal) {// si existe el item local busca el anterior y el siguiente.\r\n itemPrevLocal = self.findPrevItem(levelLocal, itemLocal);\r\n itemNextLocal = self.findNextItem(levelLocal, itemLocal);\r\n }\r\n else if (place === 'before') {\r\n itemPrevLocal = null;\r\n itemNextLocal = levelLocal.items.length ? levelLocal.items[0] : null;\r\n }\r\n else if (place === 'after') {\r\n var length = levelLocal.items.length;\r\n itemPrevLocal = length ? levelLocal.items[length - 1] : null;\r\n itemNextLocal = null;\r\n }\r\n\r\n if (itemPrevLocal && itemPrevLocal.id === movedItem.id && itemPrevLocal.selectedUnitOfMeasureId === movedItem.selectedUnitOfMeasureId) {\r\n itemPrevLocal = null;\r\n }\r\n\r\n if (itemNextLocal && itemNextLocal.id === movedItem.id && itemNextLocal.selectedUnitOfMeasureId === movedItem.selectedUnitOfMeasureId) {\r\n itemNextLocal = null;\r\n }\r\n }\r\n\r\n var levelOld;\r\n var moduleOld;\r\n var removeFromLevelOld = false;\r\n\r\n // Busca el nivel donde estaba el item originalmente.\r\n loopThroughAll(\r\n function (p, c, m, l, i) {\r\n if (self.compareToById(i, movedItem)) {\r\n levelOld = l;\r\n moduleOld = m;\r\n }\r\n },\r\n self.until.items);\r\n\r\n if (levelLocal.id !== movedItem.planogramLevelId) {//el estante es distinto.\r\n if (itemPrevLocal)\r\n movedItem.orientation = itemPrevLocal.orientation;\r\n else if (itemNextLocal)\r\n movedItem.orientation = itemNextLocal.orientation;\r\n\r\n var isValid = self.validateAddOrModifyItemInLevel(planogramLocal,\r\n columnLocal,\r\n moduleLocal,\r\n levelLocal,\r\n movedItem);\r\n\r\n if (isValid) {\r\n removeFromLevelOld = true;\r\n if (isPeg) {\r\n self.fixPostition(movedItem, point);\r\n levelLocal.items.push(movedItem);\r\n } else {\r\n // Agrega en el nuevo estante.\r\n self.addItemToInternal(place, levelLocal, itemLocal, itemPrevLocal, itemNextLocal, movedItem);\r\n }\r\n }\r\n\r\n if (removeFromLevelOld) {\r\n // Busca el elemento en el estante.\r\n idx = self.findIndex(levelOld.items, movedItem, self.compareToById);\r\n if (idx > -1) {\r\n // Saca el elemento del estante.\r\n levelOld.items.splice(idx, 1);\r\n\r\n // Mantiene el orden de los items.\r\n angular.forEach(levelOld.items,\r\n function (item, idx) {\r\n item.order = idx;\r\n });\r\n }\r\n }\r\n } else {\r\n if (isPeg) {\r\n idx = self.findIndex(levelLocal.items, movedItem, self.compareToByUniqueId);\r\n if (idx > -1) {\r\n // Saca el elemento del estante.\r\n levelLocal.items.splice(idx, 1);\r\n }\r\n if (self.autoAlign) {\r\n self.fixPostitionAligningItems(movedItem, point, levelLocal.items);\r\n }\r\n else {\r\n self.fixPostition(movedItem, point);\r\n }\r\n levelLocal.items.push(movedItem);\r\n } else {\r\n // Dentro del mismo estante.\r\n // Si existe el item local.\r\n if (itemLocal && itemLocal.id === movedItem.id && itemLocal.selectedUnitOfMeasureId === movedItem.selectedUnitOfMeasureId) {\r\n // No hace nada se solto en el mismo lugar.\r\n } else {\r\n // Busca la posción del item en el estante.\r\n idx = self.findIndex(levelLocal.items, movedItem, self.compareToById);\r\n var idxDrop = self.findIndex(levelLocal.items, itemLocal, self.compareToById);\r\n if (idx > -1) {\r\n // Saca el elemento del estante.\r\n levelLocal.items.splice(idx, 1);\r\n }\r\n\r\n self.addItemToInternal(place, levelLocal, itemLocal, itemPrevLocal, itemNextLocal, movedItem);\r\n\r\n // Insertar antes del elemento.\r\n //if (place === 'before') {\r\n // // Verifica si el elemento anterior es el mismo que se esta agregando.\r\n // if (itemPrevLocal && itemPrevLocal.itemId === movedItem.itemId) {\r\n // itemPrevLocal.facings += movedItem.facings;\r\n // } else if (itemLocal) {\r\n // // Busca el elemento y lo agrega antes.\r\n // levelLocal.items.splice(idxDrop, 0, movedItem);\r\n // } else {\r\n // // Agrega al principio del estante.\r\n // levelLocal.items.splice(0, 0, movedItem);\r\n // }\r\n //} else if (place === 'after') {\r\n // // Verifica si el elemento siguiente es el mismo que se esta agregando.\r\n // if (itemNextLocal && itemNextLocal.itemId === movedItem.itemId) {\r\n // // Si es el mismo elemento lo vuelve a agregar en la colección de items.\r\n // if (itemNextLocal.id === movedItem.id) {\r\n // levelLocal.items.splice(idx, 0, movedItem);\r\n // } else {\r\n // itemNextLocal.facings += movedItem.facings;\r\n // }\r\n\r\n // } else if (itemLocal) {\r\n // // Busca el elemento y lo agrega despues.\r\n // levelLocal.items.splice(idxDrop + 1, 0, movedItem);\r\n // } else {\r\n // // Agrega al final del estante.\r\n // levelLocal.items.push(movedItem);\r\n // }\r\n //}\r\n }\r\n }\r\n }\r\n\r\n // Mantiene el orden de los items.\r\n angular.forEach(levelLocal.items,\r\n function (value, idx) {\r\n value.order = idx;\r\n });\r\n\r\n // Selecciona el item agregado.\r\n self.planogramSelect(planogramLocal, columnLocal, moduleLocal, levelLocal, movedItem, true);\r\n\r\n // Fuerza una nueva referencia del planograma para que se detecte el cambio.\r\n self.forceUpdateModel();\r\n }\r\n\r\n /**\r\n * Devuelve verdadero si el valor recibido es un número mayor a 0, falso en caso contrario.\r\n * @private\r\n * @param {any} value Valor a evaluar. \r\n * @returns Verdadero si el valor recibido es un número mayor a 0, falso en caso contrario.\r\n */\r\n self.isValidSize = function isValidSize(value) {\r\n var ret = angular.isNumber(value) && value > 0;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve verdadero si se puede agregar o mover un item al estante dado.\r\n * Verifica:\r\n * - El item o grupo de items tiene suficiente espacio vertical en el estante.\r\n * - El item o grupo de items tiene suficiente espacio horizontal libre en el estante.\r\n * - El item o grupo de items tiene la misma categoria que el estante.\r\n *\r\n * @param {any} planogram Referencia del planograma.\r\n * @param {any} column Referencia de la Columna del planograma.\r\n * @param {any} module Referencia del módulo de la columna.\r\n * @param {any} level Referencia del estante del módulo,\r\n * @param {any} item Referencia del item del estante.\r\n * @returns Verdadero si el item pasa los criterios de aceptación, falso en caso contrario.\r\n */\r\n self.validateAddOrModifyItemInLevel = function validateAddOrModifyItemInLevel(planogram, column, module, level, item) {\r\n var ret = true;\r\n var isPeg = module.type === 'Peg';\r\n\r\n var uom = item.selectedUnitOfMeasure;\r\n var validSize = angular.isObject(uom)\r\n && self.isValidSize(uom.width)\r\n && self.isValidSize(uom.height)\r\n && self.isValidSize(uom.depth);\r\n\r\n // Verifica si el item tiene todas las medidas requeridas.\r\n if (!validSize) {\r\n swal(translations.WithoutSize,\r\n translations.WithoutSizeSubtitle,\r\n 'warning');\r\n ret = false;\r\n }\r\n\r\n // Si no es ganchera verifica si hay espacio en el estante.\r\n if (!isPeg) {\r\n // Verifica si hay suficiente espacio en el alto del estante.\r\n if (ret) {\r\n var requiredHeight = self.getItemHeight(item);\r\n if (requiredHeight > level.height) {\r\n swal(translations.InsufficientSpaceSwal,\r\n translations.InsufficientHeightSpaceSubtitleSwal,\r\n 'warning');\r\n ret = false;\r\n }\r\n }\r\n\r\n // Verifica si hay suficiente espacio libre en el ancho del estante.\r\n if (ret) {\r\n var usedWidth = self.getLevelUsedWidth(level);\r\n var requiredWidth = self.getItemWidth(item);\r\n if ((usedWidth + requiredWidth) > module.width) {\r\n swal(translations.InsufficientSpaceSwal,\r\n translations.InsufficientWidthSpaceSubtitleSwal,\r\n 'warning');\r\n ret = false;\r\n }\r\n }\r\n }\r\n\r\n // Valida que la categoria del estante sea la misma que la del producto.\r\n if (ret) {\r\n if (level.categoryId != null && item.categoryId !== level.categoryId) {\r\n swal(translations.IncorrectCategorySwal,\r\n translations.IncorrectCategorySubtitleSwal + level.categoryName + '',\r\n 'warning');\r\n ret = false;\r\n }\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve el indice del elemento buscado en la colección dada o -1 en caso de no encontrarlo.\r\n * @private\r\n * @param {any} collection Colección de elementos.\r\n * @param {any} value Referencia.\r\n * @param {any} compareFn Función de comparación.\r\n * @returns El indice del elemento buscado en la colección dada o -1 en caso de no encontrarlo.\r\n */\r\n self.findIndex = function findIndex(collection, value, compareFn) {\r\n var ret = -1;\r\n if (angular.isArray(collection) && angular.isObject(value) && angular.isFunction(compareFn)) {\r\n var len = collection.length;\r\n var idx = 0;\r\n while (idx < len && !compareFn(collection[idx], value)) {\r\n idx += 1;\r\n }\r\n\r\n if (idx < len && compareFn(collection[idx], value)) {\r\n ret = idx;\r\n }\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve el elemento buscado en la colección dada o null en caso de no encotrarlo.\r\n * @private\r\n * @param {any} collection Colección de elementos.\r\n * @param {any} value Referencia.\r\n * @param {any} compareFn Función de comparación.\r\n * @returns El elemento buscado en la colección dada o null en caso de no encotrarlo.\r\n */\r\n self.find = function find(collection, value, compareFn) {\r\n var ret = null;\r\n if (angular.isArray(collection) && angular.isObject(value) && angular.isFunction(compareFn)) {\r\n var len = collection.length;\r\n var idx = 0;\r\n while (idx < len && !compareFn(collection[idx], value)) {\r\n idx += 1;\r\n }\r\n\r\n if (idx < len && compareFn(collection[idx], value)) {\r\n ret = collection[idx];\r\n }\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve el planograma de la colección de planogramas buscandolo por el id del planograma de referencia o null.\r\n * @private\r\n * @param {any} value Planograma de referencia.\r\n * @returns El planograma de la colección de planogramas buscandolo por el id del planograma de referencia.\r\n */\r\n self.findPlanogram = function findPlanogram(value) {\r\n var ret = null;\r\n if (angular.isObject(value)) {\r\n ret = self.find(self.model.planograms, value, self.compareToById);\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve la columna de la colección de columnas del planograma buscandola por el id de la columnas de referencia o null.\r\n * @private \r\n * @param {any} planogram Planograma donde buscar.\r\n * @param {any} value Columna de referencia.\r\n * @returns La columna de la colección de columnas del planograma buscandola por el id de la columnas de referencia o null.\r\n */\r\n self.findColumn = function findColumn(planogram, value) {\r\n var ret = null;\r\n if (angular.isObject(planogram) && angular.isObject(value)) {\r\n ret = self.find(planogram.columns, value, self.compareToById);\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve el módulo de la colección de modulos de la columna buscandolo por el id del módulo de referencia o null.\r\n * @private \r\n * @param {any} column Columna donde buscar.\r\n * @param {any} value\r\n * @returns El módulo de la colección de modulos de la columna buscandolo por el id del módulo de referencia o null.\r\n */\r\n self.findFurniture = function findFurniture(column, value) {\r\n var ret = null;\r\n if (angular.isObject(column) && angular.isObject(value)) {\r\n ret = self.find(column.modules, value, self.compareToById);\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve el estante de la colección de estantes del módulo buscandolo por el id del módulo de referencia o null.\r\n * @private \r\n * @param {any} column Columna donde buscar.\r\n * @param {any} value\r\n * @returns El módulo de la colección de modulos de la columna buscandolo por el id del módulo de referencia o null.\r\n */\r\n self.findLevel = function findLevel(module, value) {\r\n var ret = null;\r\n if (angular.isObject(module) && angular.isObject(value)) {\r\n ret = self.find(module.levels, value, self.compareToById);\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve el item de la colección de items del estante por el id del estante de referencia o null.\r\n * @private \r\n * @param {any} shelf Estante donde buscar.\r\n * @param {any} value Referencia.\r\n * @returns El item de la colección de items del estante por el id del estante de referencia o null.\r\n */\r\n self.findItem = function findItem(shelf, value) {\r\n var ret = null;\r\n if (angular.isObject(shelf) && angular.isObject(value)) {\r\n ret = self.find(shelf.items, value, self.compareToById);\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n self.findPrevItem = function findPrevItem(shelf, value) {\r\n var ret = null;\r\n if (angular.isObject(shelf)) {\r\n // Indica que se va a tomar el ultimo elemento si hay más de 1 item en la lista.\r\n var takeFirst = shelf.items.length > 1;\r\n if (angular.isObject(value)) {\r\n // Busca el indice del elemento.\r\n var idx = self.findIndex(shelf.items, value, self.compareToById);\r\n\r\n // Si lo encontro.\r\n if (idx > -1) {\r\n var newIdx = idx - 1;\r\n\r\n // Verifica si existe el item anterior.\r\n if (newIdx > -1) {\r\n ret = shelf.items[newIdx];\r\n }\r\n\r\n takeFirst = false;\r\n }\r\n }\r\n\r\n if (takeFirst) {\r\n ret = shelf.items[0];\r\n }\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuleve el siguiente item del estante en relación al item enviado.\r\n * - Null si no se recibio la referencia del estante.\r\n * - Si existe el item de referencia.\r\n * + Busca el item siguiente al item de referencia y si existe el item siguiente lo devuelve, si no existe el item siguiente devuelve null.\r\n * - Si no existe el item de referencia \r\n * + Si el estante tiene más de un item devuelve el ultimo item. \r\n * @param {any} shelf Referencia del estante.\r\n * @param {any} value Referencia del item.\r\n * @returns El siguiente item del estante en relación al item enviado.\r\n */\r\n self.findNextItem = function findNextItem(shelf, value) {\r\n var ret = null;\r\n if (angular.isObject(shelf)) {\r\n var len = shelf.items.length;\r\n\r\n // Indica que se va a tomar el ultimo elemento si hay más de 1 item en la lista.\r\n var takeLast = len > 1;\r\n if (angular.isObject(value)) {\r\n // Busca el indice del elemento.\r\n var idx = self.findIndex(shelf.items, value, self.compareToById);\r\n\r\n // Si lo encontro.\r\n if (idx > -1) {\r\n var newIdx = idx + 1;\r\n\r\n // Verifica si existe el item siguiente.\r\n if (newIdx < len) {\r\n ret = shelf.items[newIdx];\r\n }\r\n\r\n takeLast = false;\r\n }\r\n }\r\n\r\n if (takeLast) {\r\n ret = shelf.items[len - 1];\r\n }\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve verdadero si el id del elemento a es igual al id del elemento b, falso en caso contrario.\r\n * @param {any} a Elemento a.\r\n * @param {any} b Elemento b\r\n * @returns Verdadero si el id del elemento a es igual al id del elemento b, falso en caso contrario.\r\n */\r\n self.compareToById = function (a, b) {\r\n var ret = angular.isObject(a)\r\n && angular.isDefined(a.id)\r\n && angular.isObject(b)\r\n && angular.isDefined(b.id)\r\n && a.id === b.id\r\n && a.selectedUnitOfMeasureId === b.selectedUnitOfMeasureId;\r\n return ret;\r\n };\r\n\r\n self.compareToByUniqueId = function (a, b) {\r\n var ret = angular.isObject(a)\r\n && angular.isDefined(a.id)\r\n && angular.isObject(b)\r\n && angular.isDefined(b.id)\r\n && a.uniqueId === b.uniqueId;\r\n return ret;\r\n };\r\n\r\n /**\r\n * Devuelve un array de planogramas con una unica columna.\r\n * Divide el planograma original por columnas, si el planograma recibido tiene una sola columna devuelve un array vacio.\r\n * @public\r\n * @param {any} planogram Referencia del planograma.\r\n * @returns Un array de planogramas con una unica columna.\r\n */\r\n self.splitPlanogramByColums = function splitPlanogramByColums(planogram) {\r\n var ret = [];\r\n var hasMultipleColumns = self.hasMultipleColumns(planogram);\r\n if (hasMultipleColumns) {\r\n angular.forEach(planogram.columns,\r\n function splitPlanogramByColumsForEachColumns(column, idx) {\r\n // var newColumn = angular.merge({}, column, { overwriteId: idx + 1 });\r\n //var newColumn = angular.merge({}, column);\r\n var newColumn = angular.copy(column);\r\n newColumn.overwriteId = idx + 1;\r\n // var newPlanogram = angular.merge({}, planogram, { columns: [newColumn] });\r\n //var newPlanogram = angular.merge({}, planogram);\r\n var newPlanogram = angular.copy(planogram);\r\n newPlanogram.columns = [newColumn];\r\n ret.push(newPlanogram);\r\n });\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve verdadero si el planograma tiene más de una columna, falso en caso de que tenga una sola o ninguna. \r\n * @public\r\n * @param {any} planogram Referencia del planograma.\r\n * @returns Verdadero si el planograma tiene más de una columna, falso en caso de que tenga una sola o ninguna.\r\n */\r\n self.hasMultipleColumns = function hasMultipleColumns(planogram) {\r\n var ret = planogram.columns.length > 1;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Fuerza una nueva referencia del planograma para que se detecte el cambio en los componentes.\r\n * Utiliza un delay de 10ms para las posibles multiples llamadas de distintos métodos.\r\n */\r\n self.forceUpdateModel = function forceUpdateModel() {\r\n /*\r\n $timeout.cancel(self.forceUpdateModelCancel);\r\n self.forceUpdateModelCancel = $timeout(1).then(function () {\r\n // Fuerza una nueva referencia del planograma para que se detecte el cambio en los componentes.\r\n self.model.planograms[0] = angular.merge({}, self.model.planograms[0]);\r\n });\r\n */\r\n\r\n // Fuerza una nueva referencia del planograma para que se detecte el cambio en los componentes.\r\n //self.model.planograms[0] = angular.merge({}, self.model.planograms[0]);\r\n $timeout.cancel(self.forceUpdateModelCancel);\r\n self.forceUpdateModelCancel = $timeout(function forceUpdateModelOn$timeout() {\r\n // console.time('forceUpdateModel');\r\n self.model.planograms[0] = angular.copy(self.model.planograms[0]);\r\n self.selectedPlanogram = self.model.planograms[0];\r\n // console.timeEnd('forceUpdateModel');\r\n });\r\n }\r\n\r\n /**\r\n * Devuelve verdadero si hay que mostrar las superposición de color sobre el item, falso en caso contrario.\r\n * @returns Verdadero si hay que mostrar las superposición de color sobre el item, falso en caso contrario.\r\n */\r\n self.showOverlay = function showOverlay() {\r\n var ret = self.groupMapEnabled\r\n || self.heatMapEnabled;\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve verdadero si hay que mostrar la barra de herramientas de edición de un item seleccionado en el planograma, falso en caso contrario.\r\n * @returns Verdadero si hay que mostrar la barra de herramientas de edición de un item seleccionado en el planograma, falso en caso contrario.\r\n */\r\n self.showItemActionToolbar = function showItemActionToolbar() {\r\n var ret = ((self.activeShelf && self.activeShelf.showGlobesId === self.activeShelf.selecteditem.id)\r\n || self.selectedItem !== null)\r\n && !self.showlevelmeasurebuttons;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Agrega un frente al item.\r\n * @param {any} value\r\n */\r\n self.wrapperAddFrontItem = function wrapperAddFrontItem(value) {\r\n //$log.debug('EditPlanogramCtrl::wrapperAddFrontItem value: %o', value);\r\n var module;\r\n var level;\r\n var item;\r\n\r\n if (angular.isObject(self.activeShelf)) {\r\n module = self.activeShelf.planogram;\r\n level = self.activeShelf.selectedLevel;\r\n item = self.activeShelf.selecteditem;\r\n } else {\r\n // Busca el planograma en la colección de planogramas locales.\r\n var planogram = self.findPlanogram(self.activePlanogram);\r\n\r\n // Busca la columna dentro de la colección de columnas del planograma local.\r\n var column = self.findColumn(planogram, self.selectedColumn);\r\n\r\n // Busca el módulo dentro de la colección de columnas del planograma local.\r\n module = self.findFurniture(column, self.selectedModule);\r\n\r\n level = self.findLevel(module, self.selectedLevel);\r\n\r\n // Busca el item dentro de la colección de items del estante local.\r\n item = self.findItem(level, self.selectedItem);\r\n }\r\n\r\n self.addFrontItem(item, level, module, value);\r\n self.planogramSelect(planogram, column, module, level, item, true);\r\n\r\n // Actualiza la carga total del item en el planograma\r\n calculateStackTotalForPlanogram(item.itemId);\r\n\r\n // Actualiza los días de exibición del item en el planograma.\r\n self.calcExhibitionDays(item.itemId);\r\n\r\n self.forceUpdateModel();\r\n }\r\n\r\n /**\r\n * Apila un item.\r\n * @param {any} value\r\n */\r\n self.wrapperAddItemAbove = function wrapperAddItemAbove(value) {\r\n //$log.debug('EditPlanogramCtrl::wrapperAddItemAbove value: %o', value);\r\n var module;\r\n var level;\r\n var item;\r\n\r\n if (angular.isObject(self.activeShelf)) {\r\n module = self.activeShelf.planogram;\r\n level = self.activeShelf.selectedLevel;\r\n item = self.activeShelf.selecteditem;\r\n } else {\r\n // Busca el planograma en la colección de planogramas locales.\r\n var planogram = self.findPlanogram(self.activePlanogram);\r\n\r\n // Busca la columna dentro de la colección de columnas del planograma local.\r\n var column = self.findColumn(planogram, self.selectedColumn);\r\n\r\n // Busca el módulo dentro de la colección de columnas del planograma local.\r\n module = self.findFurniture(column, self.selectedModule);\r\n\r\n level = self.findLevel(module, self.selectedLevel);\r\n\r\n // Busca el item dentro de la colección de items del estante local.\r\n item = self.findItem(level, self.selectedItem);\r\n }\r\n\r\n self.addItemAbove(item, level, module, value);\r\n self.planogramSelect(planogram, column, module, level, item, true);\r\n\r\n // Actualiza la carga total del item en el planograma\r\n calculateStackTotalForPlanogram(item.itemId);\r\n\r\n // Actualiza los días de exibición del item en el planograma.\r\n self.calcExhibitionDays(item.itemId);\r\n\r\n self.forceUpdateModel();\r\n }\r\n\r\n /**\r\n * Agrega un item detras.\r\n * @param {any} value\r\n */\r\n self.wrapperAddItemBehind = function wrapperAddItemBehind(value) {\r\n //$log.debug('EditPlanogramCtrl::wrapperAddItemBehind value: %o', value);\r\n var module;\r\n var level;\r\n var item;\r\n\r\n if (angular.isObject(self.activeShelf)) {\r\n module = self.activeShelf.planogram;\r\n level = self.activeShelf.selectedLevel;\r\n item = self.activeShelf.selecteditem;\r\n } else {\r\n // Busca el planograma en la colección de planogramas locales.\r\n var planogram = self.findPlanogram(self.activePlanogram);\r\n\r\n // Busca la columna dentro de la colección de columnas del planograma local.\r\n var column = self.findColumn(planogram, self.selectedColumn);\r\n\r\n // Busca el módulo dentro de la colección de columnas del planograma local.\r\n module = self.findFurniture(column, self.selectedModule);\r\n\r\n level = self.findLevel(module, self.selectedLevel);\r\n\r\n // Busca el item dentro de la colección de items del estante local.\r\n item = self.findItem(level, self.selectedItem);\r\n }\r\n\r\n self.addItemBehind(item, level, module, value);\r\n self.planogramSelect(planogram, column, module, level, item, true);\r\n\r\n // Actualiza la carga total del item en el planograma\r\n calculateStackTotalForPlanogram(item.itemId);\r\n\r\n // Actualiza los días de exibición del item en el planograma.\r\n self.calcExhibitionDays(item.itemId);\r\n\r\n self.forceUpdateModel();\r\n }\r\n\r\n /**\r\n * Cambia la vista del frente del item.\r\n */\r\n self.wrapperChangeFront = function wrapperChangeFront() {\r\n //$log.debug('EditPlanogramCtrl::wrapperChangeFront');\r\n var module;\r\n var level;\r\n var item;\r\n if (angular.isObject(self.activeShelf)) {\r\n module = self.activeShelf.planogram;\r\n level = self.activeShelf.selectedLevel;\r\n item = self.activeShelf.selecteditem;\r\n } else {\r\n // Busca el planograma en la colección de planogramas locales.\r\n var planogram = self.findPlanogram(self.activePlanogram);\r\n\r\n // Busca la columna dentro de la colección de columnas del planograma local.\r\n var column = self.findColumn(planogram, self.selectedColumn);\r\n\r\n // Busca el módulo dentro de la colección de columnas del planograma local.\r\n module = self.findFurniture(column, self.selectedModule);\r\n\r\n level = self.findLevel(module, self.selectedLevel);\r\n\r\n // Busca el item dentro de la colección de items del estante local.\r\n item = self.findItem(level, self.selectedItem);\r\n }\r\n\r\n self.changeFront(item, level, module, column, planogram);\r\n self.planogramSelect(planogram, column, module, level, item, true);\r\n self.forceUpdateModel();\r\n }\r\n\r\n /**\r\n * Va a los tickets.\r\n */\r\n self.wrapperGoToTickets = function wrapperGoToTickets() {\r\n //$log.debug('EditPlanogramCtrl::wrapperGoToTickets');\r\n var module;\r\n var level;\r\n\r\n if (angular.isObject(self.activeShelf)) {\r\n module = self.activeShelf.planogram;\r\n level = self.activeShelf.selectedLevel;\r\n } else {\r\n // Busca el planograma en la colección de planogramas locales.\r\n var planogram = self.findPlanogram(self.activePlanogram);\r\n\r\n // Busca la columna dentro de la colección de columnas del planograma local.\r\n var column = self.findColumn(planogram, self.selectedColumn);\r\n\r\n // Busca el módulo dentro de la colección de columnas del planograma local.\r\n module = self.findFurniture(column, self.selectedModule);\r\n\r\n level = self.findLevel(module, self.selectedLevel);\r\n }\r\n\r\n self.goToTickets(module, level);\r\n self.forceUpdateModel();\r\n }\r\n\r\n /**\r\n * Muestra los tickets.\r\n */\r\n self.wrapperShownewTicketModal = function wrapperShownewTicketModal() {\r\n //$log.debug('EditPlanogramCtrl::wrapperShownewTicketModal');\r\n var level;\r\n if (angular.isObject(self.activeShelf)) {\r\n level = self.activeShelf.selectedLevel;\r\n } else {\r\n // Busca el planograma en la colección de planogramas locales.\r\n var planogram = self.findPlanogram(self.activePlanogram);\r\n\r\n // Busca la columna dentro de la colección de columnas del planograma local.\r\n var column = self.findColumn(planogram, self.selectedColumn);\r\n\r\n // Busca el módulo dentro de la colección de columnas del planograma local.\r\n var module = self.findFurniture(column, self.selectedModule);\r\n\r\n level = self.findLevel(module, self.selectedLevel);\r\n\r\n // Busca el item dentro de la colección de items del estante local.\r\n item = self.findItem(level, self.selectedItem);\r\n }\r\n\r\n self.showNewTicketModal(item);\r\n self.forceUpdateModel();\r\n }\r\n\r\n /**\r\n * Borra el item.\r\n */\r\n self.wrapperDeleteItem = function wrapperDeleteItem() {\r\n //$log.debug('EditPlanogramCtrl::wrapperDeleteItem');\r\n var level;\r\n var item;\r\n\r\n if (angular.isObject(self.activeShelf)) {\r\n item = self.activeShelf.selecteditem;\r\n level = self.activeShelf.selectedLevel;\r\n } else {\r\n // Busca el planograma en la colección de planogramas locales.\r\n var planogram = self.findPlanogram(self.activePlanogram);\r\n\r\n // Busca la columna dentro de la colección de columnas del planograma local.\r\n var column = self.findColumn(planogram, self.selectedColumn);\r\n\r\n // Busca el módulo dentro de la colección de columnas del planograma local.\r\n var module = self.findFurniture(column, self.selectedModule);\r\n\r\n level = self.findLevel(module, self.selectedLevel);\r\n\r\n // Busca el item dentro de la colección de items del estante local.\r\n item = self.findItem(level, self.selectedItem);\r\n }\r\n\r\n self.deleteItem(item, level);\r\n\r\n //self.planogramSelect(planogram, column, module, level, item, true);\r\n\r\n //self.deleteItem tiene un swal por lo que hace el forceUpdateModel cuando se confirma\r\n }\r\n\r\n /**\r\n * Devuelve verdadero si hay que mostrar el botón para eliminar frentes, falso en caso contrario.\r\n * @returns Verdadero si hay que mostrar el botón para eliminar frentes, falso en caso contrario\r\n */\r\n self.showItemActionRemoveFront = function showItemActionRemoveFront() {\r\n var item = null;\r\n var ret = false;\r\n var isEdit = self.isEdit();\r\n if (isEdit) {\r\n if (angular.isObject(self.activeShelf)) {\r\n item = self.activeShelf.selecteditem;\r\n } else if (angular.isObject(self.selectedItem)) {\r\n // Busca el planograma en la colección de planogramas locales.\r\n var planogram = self.findPlanogram(self.activePlanogram);\r\n\r\n // Busca la columna dentro de la colección de columnas del planograma local.\r\n var column = self.findColumn(planogram, self.selectedColumn);\r\n\r\n // Busca el módulo dentro de la colección de columnas del planograma local.\r\n var module = self.findFurniture(column, self.selectedModule);\r\n\r\n var level = self.findLevel(module, self.selectedLevel);\r\n\r\n // Busca el item dentro de la colección de items del estante local.\r\n item = self.findItem(level, self.selectedItem);\r\n }\r\n\r\n if (angular.isObject(item)) {\r\n ret = self.showIconMinus(item);\r\n }\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve una cadena con el texto de ayuda para la rotación del item.\r\n * @returns Una cadena con el texto de ayuda para la rotación del item.\r\n */\r\n self.getActiveItemTextTooltipItemOrientation = function getActiveItemTextTooltipItemOrientation() {\r\n var ret = '';\r\n var item = null;\r\n if (angular.isObject(self.activeShelf)) {\r\n item = self.activeShelf.selecteditem;\r\n } else if (angular.isObject(self.selectedItem)) {\r\n // Busca el planograma en la colección de planogramas locales.\r\n var planogram = self.findPlanogram(self.activePlanogram);\r\n\r\n // Busca la columna dentro de la colección de columnas del planograma local.\r\n var column = self.findColumn(planogram, self.selectedColumn);\r\n\r\n // Busca el módulo dentro de la colección de columnas del planograma local.\r\n var module = self.findFurniture(column, self.selectedModule);\r\n\r\n var level = self.findLevel(module, self.selectedLevel);\r\n\r\n // Busca el item dentro de la colección de items del estante local.\r\n item = self.findItem(level, self.selectedItem);\r\n }\r\n\r\n if (angular.isObject(item)) {\r\n ret = item.textTooltipItemOrientation;\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve verdadero si tiene que mostrar el botón para ir a los tickets, falso en caso contrario.\r\n * @returns Verdadero si tiene que mostrar el botón para ir a los tickets, falso en caso contrario.\r\n */\r\n self.showGotoTicketsButton = function showGotoTicketsButton() {\r\n var ret = false;\r\n var level;\r\n var isEdit = self.isEdit();\r\n if (!isEdit) {\r\n if (angular.isObject(self.activeShelf)) {\r\n level = self.activeShelf.selectedLevel;\r\n } else {\r\n // Busca el planograma en la colección de planogramas locales.\r\n var planogram = self.findPlanogram(self.activePlanogram);\r\n\r\n // Busca la columna dentro de la colección de columnas del planograma local.\r\n var column = self.findColumn(planogram, self.selectedColumn);\r\n\r\n // Busca el módulo dentro de la colección de columnas del planograma local.\r\n var module = self.findFurniture(column, self.selectedModule);\r\n\r\n level = self.findLevel(module, self.selectedLevel);\r\n }\r\n\r\n ret = angular.isObject(level)\r\n && angular.isDefined(level.ticketCount)\r\n && level.ticketCount > 0;\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve verdadero si la cantidad de tikets es mayor a 0, falso en caso contrario.\r\n * @returns Verdadero si la cantidad de tikets es mayor a 0, falso en caso contrario.\r\n */\r\n self.showTicketCount = function showTicketCount() {\r\n var level;\r\n if (angular.isObject(self.activeShelf)) {\r\n level = self.activeShelf.selectedLevel;\r\n } else {\r\n // Busca el planograma en la colección de planogramas locales.\r\n var planogram = self.findPlanogram(self.activePlanogram);\r\n\r\n // Busca la columna dentro de la colección de columnas del planograma local.\r\n var column = self.findColumn(planogram, self.selectedColumn);\r\n\r\n // Busca el módulo dentro de la colección de columnas del planograma local.\r\n var module = self.findFurniture(column, self.selectedModule);\r\n\r\n level = self.findLevel(module, self.selectedLevel);\r\n }\r\n\r\n var ret = level.ticketCount > 0;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve la cantidad de tickets del nivel.\r\n * @returns Cantidad de tickets del nivel.\r\n */\r\n self.getActiveItemTicketCount = function getActiveItemTicketCount() {\r\n var level;\r\n if (angular.isObject(self.activeShelf)) {\r\n level = self.activeShelf.selectedLevel;\r\n } else {\r\n // Busca el planograma en la colección de planogramas locales.\r\n var planogram = self.findPlanogram(self.activePlanogram);\r\n\r\n // Busca la columna dentro de la colección de columnas del planograma local.\r\n var column = self.findColumn(planogram, self.selectedColumn);\r\n\r\n // Busca el módulo dentro de la colección de columnas del planograma local.\r\n var module = self.findFurniture(column, self.selectedModule);\r\n\r\n level = self.findLevel(module, self.selectedLevel);\r\n }\r\n\r\n var ret = level.ticketCount;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve verdadero si se tiene que mostrar el label de información\r\n * para cualquiera de las 3 opciones cantidad de carga, días en exibición y días en stock, falso en caso contrario.\r\n * @returns Verdadero si se tiene que mostrar el label de información, falso en caso contrario.\r\n */\r\n self.showLabelInfo = function showLabelInfo() {\r\n var ret = self.showExhibitionDays\r\n || self.showDaysInStock\r\n || self.showLoadQuantity;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve verdadero cuando hay que mostrar la etiqueta 1 del item en el planograma, falso en caso contrario.\r\n * @returns Verdadero cuando hay que mostrar la etiqueta 1 del item en el planograma, falso en caso contrario.\r\n */\r\n self.showLabel1 = function showLabel1() {\r\n var ret = self.showRegularPrice;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve verdadero si se permite el arrastrar de los ítems dentro del planograma, falso en caso contrario.\r\n * Verifica que no se haya seleccionado ningún ítem y que este en edición.\r\n * @returns Verdadero si se permite el arrastrar de los ítems dentro del planograma, falso en caso contrario.\r\n */\r\n self.allowDrag = function allowDrag() {\r\n var ret = !self.showItemActionToolbar()\r\n && self.isEdit()\r\n && !self.showlevelmeasurebuttons;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Define la posicion del item recibido por parametro segun el punto recibido por parametro y alineando \r\n * el item a la altura del item mas aledaño.\r\n */\r\n self.fixPostitionAligningItems = function fixPostition(item, point, items) {\r\n item.positionX = (point.local.x - point.initialOffset.x) / 10;\r\n if (items.length) {\r\n let originalPositionY = (point.local.y - point.initialOffset.y) / 10;\r\n let closestPositionY = items\r\n .map(function (i) { return i.positionY })\r\n .reduce(function (closestPosition, pos) {\r\n let posDiff = pos - originalPositionY;\r\n let closestPosDiff = closestPosition - originalPositionY;\r\n if (Math.abs(posDiff) < Math.abs(closestPosDiff))\r\n return pos;\r\n else return closestPosition;\r\n });\r\n\r\n item.positionY = closestPositionY;\r\n }\r\n else item.positionY = (point.local.y - point.initialOffset.y) / 10;\r\n }\r\n\r\n self.fixPostition = function fixPostition(item, point) {\r\n // El valor 10 es la constante que se utiliza\r\n // para \"ampliar\" los elementos dentro del SVG para que se vean \r\n // de forma correcta los detalles de los elementos (strokes, lineas, etc).\r\n item.positionX = (point.local.x - point.initialOffset.x) / 10;\r\n item.positionY = (point.local.y - point.initialOffset.y) / 10;\r\n }\r\n\r\n self.allowDragScroll = function allowDragScroll() {\r\n var ret = self.showPlanogramComponentSvg();\r\n //verifico que no halla gancheras\r\n if (ret) {\r\n var aux = false;\r\n loopThroughAll(function (planogram, column, module) {\r\n aux = module.type === 'Peg' || aux;\r\n }, self.until.modules);\r\n ret = !aux;\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n\r\n init();\r\n });\r\n\r\n\r\n// Issue 289\r\nangular.module(\"prisma\").factory('HtmlHelper', ['$log', HtmlHelper]);\r\n\r\nfunction HtmlHelper($log) {\r\n //$log.debug('HtmlHelper::ctor');\r\n\r\n function cleanUp(node) {\r\n var $node = $(node);\r\n $node.each(function (idx, item) {\r\n var $item = $(item);\r\n $item.contents()\r\n .filter(function (idx1, el) {\r\n return el.nodeType === 3 || el.nodeType === 8;\r\n }).remove();\r\n cleanUp($item.children());\r\n\r\n var attrs = getAngularAttributes($item);\r\n $.each(attrs, function (index, attribute) {\r\n $item.removeAttr(attribute);\r\n });\r\n var classes = getAngularClasses($item);\r\n $.each(classes, function (index, klass) {\r\n $item.removeClass(klass);\r\n });\r\n });\r\n\r\n return $node;\r\n }\r\n\r\n function getAngularAttributes($node) {\r\n var attrs = [];\r\n $.each($node[0].attributes, function (index, attribute) {\r\n if (/ng-(.*)/.test(attribute.name)) {\r\n attrs.push(attribute.name);\r\n }\r\n });\r\n\r\n return attrs;\r\n }\r\n\r\n function getAngularClasses($node) {\r\n return ($node.attr('class') || '').split(' ')\r\n .filter(function (value) {\r\n return /ng-(.*)/.test(value);\r\n });\r\n }\r\n\r\n return {\r\n cleanUpHtml: cleanUp,\r\n getNgAttributes: getAngularAttributes,\r\n getNgClasses: getAngularClasses\r\n };\r\n}\r\n","var _controller = function ($scope, $attrs, $filter, $timeout, $rootScope, priceService, homeService) {\r\n var self = this;\r\n console.log('auditTrial', self);\r\n //self.days = 7;\r\n self.trailsInDays = [];\r\n\r\n self.changeDays = function (days) {\r\n if (days == self.days) return;\r\n self.days = days;\r\n self.trailsInDays = [];\r\n\r\n var dateToCompare = new Date();\r\n //console.log('days',days);\r\n //console.log('dateToCompare', dateToCompare);\r\n dateToCompare.setDate(dateToCompare.getDate() - days);\r\n //console.log('dateToCompare', dateToCompare);\r\n\r\n angular.forEach(self.price.auditTrail, function (auditTrail) {\r\n var auditDate = new Date(auditTrail.createdDate);\r\n auditTrail.createdDate = auditDate.setHours(auditDate.getHours() + companyJson.TimeZone.Gmt);\r\n //console.log('fecha', auditDate);\r\n //console.log('dateToCompare', dateToCompare);\r\n if (auditDate > dateToCompare) {\r\n //console.log('agregando');\r\n self.trailsInDays.push(auditTrail);\r\n }\r\n })\r\n }\r\n self.changeDays(7);\r\n \r\n}\r\n\r\nangular.module('prisma').component('auditTrial', {\r\n templateUrl: 'app/shared_logic/components/auditTrial/auditTrial.component.html',\r\n bindings: {\r\n price: '<'\r\n },\r\n\r\n controller: _controller\r\n});\r\n\r\n\r\n","angular.module(\"prisma\")\r\n .filter('statusFilter', function () {\r\n return function (prices, filters) {\r\n return prices.filter(function (price) {\r\n if (!filters) return true;\r\n var rv = false;\r\n angular.forEach(filters.status, function (status) {\r\n if (status.checked && status.id == 'All')\r\n rv = true;\r\n if (status.checked && status.id == 'Suggested'\r\n && (price.isSuggested()\r\n || (price.children && price.children.length && price.children.some(x => x.isSuggested())))) {\r\n rv = true;\r\n }\r\n if (status.checked && status.id == 'Pending' && price.isPending())\r\n rv = true;\r\n if (status.checked && status.id == 'Endorsed' && price.isEndorsed())\r\n rv = true;\r\n });\r\n return rv;\r\n });\r\n\r\n };\r\n })\r\n .filter('priceListFilter', function () {\r\n return function (prices, filters) {\r\n return prices.filter(function (price) {\r\n if (!filters || filters.priceLists.length == 0) return true;\r\n var rv = false;\r\n angular.forEach(filters.priceLists, function (pl) {\r\n\r\n if (price.isChild()) {\r\n price = (price.parent ? price.parent : price);\r\n }\r\n\r\n if (pl.code == price.priceListCode)\r\n rv = true;\r\n });\r\n return rv;\r\n });\r\n\r\n };\r\n })\r\n .filter('regionFilter', function () {\r\n return function (prices, filters) {\r\n return prices.filter(function (price) {\r\n if (!filters || filters.regions.length == 0) return true;\r\n var rv = false;\r\n angular.forEach(filters.regions, function (region) {\r\n if (region.regionId == price.regionId)\r\n rv = true;\r\n });\r\n return rv;\r\n });\r\n\r\n };\r\n })\r\n .filter('brandFilter', function () {\r\n return function (prices, filters) {\r\n return prices.filter(function (price) {\r\n if (!filters || filters.brands.length == 0) return true;\r\n var rv = false;\r\n angular.forEach(filters.brands, function (brand) {\r\n if (brand.brandId == price.brandId)\r\n rv = true;\r\n });\r\n return rv;\r\n });\r\n\r\n };\r\n })\r\n .filter('marketFilter', function () {\r\n return function (prices, filters) {\r\n return prices.filter(function (price) {\r\n if (!filters || filters.markets.length == 0) return true;\r\n var rv = false;\r\n angular.forEach(filters.markets, function (market) {\r\n if (market.marketId == price.marketId)\r\n rv = true;\r\n });\r\n return rv;\r\n });\r\n\r\n };\r\n })\r\n .filter('departmentFilter', function () {\r\n return function (prices, filters) {\r\n return prices.filter(function (price) {\r\n if (!filters || filters.departments.length == 0) return true;\r\n\r\n for (var i = 0; i < filters.departments.length; i++) {\r\n var departmentWithZoning = filters.zoning.find(function (x) {\r\n return x.id == filters.departments[i].departmentId;\r\n });\r\n\r\n for (var j = 0; j < departmentWithZoning.children.length; j++) {\r\n if (departmentWithZoning.children[j].id == price.priceListId) {\r\n return true;\r\n }\r\n } \r\n }\r\n return false;\r\n });\r\n\r\n };\r\n })\r\n .filter('sectorFilter', function () {\r\n return function (prices, filters) {\r\n return prices.filter(function (price) {\r\n if (!filters || filters.sectors.length == 0) return true;\r\n\r\n for (var i = 0; i < filters.sectors.length; i++) {\r\n //busco la ciudad del sector\r\n var cityOfSector = null;\r\n angular.forEach(filters.zoning, function (department) {\r\n angular.forEach(department.children, function (city) {\r\n var someSector = city.children.some(function (sector) { return sector.id == filters.sectors[i].sectorId });\r\n if (someSector)\r\n cityOfSector = city;\r\n });\r\n if (cityOfSector && cityOfSector.id == price.priceListId)\r\n return true;\r\n });\r\n }\r\n return false;\r\n });\r\n\r\n };\r\n })\r\n .filter('storeFilter', function () {\r\n return function (prices, filters) {\r\n return prices.filter(function (price) {\r\n if (!filters || filters.stores.length == 0) return true;\r\n\r\n for (var i = 0; i < filters.stores.length; i++) {\r\n\r\n //busco el sector de la tienda\r\n var sectorOfStore = null;\r\n angular.forEach(filters.zoning, function (department) {\r\n angular.forEach(department.children, function (city) {\r\n angular.forEach(city.children, function (sector) {\r\n var someStore = sector.children.some(function (store) { return store.id == filters.stores[i].storeId });\r\n if (someStore)\r\n sectorOfStore = sector;\r\n }); \r\n });\r\n });\r\n //busco la ciudad del sector\r\n var cityOfSector = null;\r\n angular.forEach(filters.zoning, function (department) {\r\n angular.forEach(department.children, function (city) {\r\n var someSector = city.children.some(function (sector) { return sector.id == sectorOfStore.id });\r\n if (someSector)\r\n cityOfSector = city;\r\n });\r\n if (cityOfSector.id == price.priceListId)\r\n return true;\r\n });\r\n }\r\n return false;\r\n });\r\n\r\n };\r\n })\r\n .filter('priceTypeFilter', function () {\r\n return function (prices, filters) {\r\n return prices.filter(function (price) {\r\n if (!filters) return true;\r\n var rv = false;\r\n angular.forEach(filters.priceTypes, function (pt) {\r\n if (pt.checked && (pt.value == 0 /*Todos*/ || pt.value == price.priceType))\r\n rv = true;\r\n });\r\n return rv;\r\n });\r\n\r\n };\r\n })\r\n .filter('actionFilter', function () {\r\n return function (prices, filters) {\r\n return prices.filter(function (price) {\r\n if (!filters) return true;\r\n var rv = false;\r\n angular.forEach(filters.actions, function (pt) {\r\n var compareTo = price.newPrice ? price.newPrice : price.suggestedPrice || null;\r\n if (pt.checked && (pt.value == 0 /*Todos*/\r\n /*Bajas*/ || (pt.value == 1 && compareTo && compareTo < price._Price)\r\n /*Subas*/ || (pt.value == 2 && compareTo && compareTo > price._Price)))\r\n rv = true;\r\n });\r\n return rv;\r\n });\r\n\r\n };\r\n })\r\n .filter('situationFilter', function () {\r\n return function (prices, filters) {\r\n return prices.filter(function (price) {\r\n if (!filters) return true;\r\n var rv = false;\r\n angular.forEach(filters.situations, function (sit) {\r\n if (sit.checked && (sit.value == 0\r\n || (sit.value == 1 && price.priceIsFirst == true)\r\n || (sit.value == 2 && price.hasStrongDecreases()) //price.newPrice != null && price.minVariation != null && price.minVariation != 0 && price.priceDelta < price.minVariation)\r\n || (sit.value == 3 && price.hasStrongIncreases()) //price.newPrice != null && price.maxVariation != null && price.maxVariation != 0 && price.priceDelta > price.maxVariation)\r\n || (sit.value == 4 && price.hasLowMargin()) //price.newPrice != null && price.minMargin != null && price.minMargin != 0 && price.newGrossMargin < price.minMargin)\r\n || (sit.value == 5 && price.hasHighMargin()) //price.newPrice != null && price.maxMargin != null && price.maxMargin != 0 && price.newGrossMargin > price.maxMargin)\r\n || (sit.value == 6 && price.hasNotSignificantVariation()) // ((price.newPrice != null && price.significantVariation != null && price.significantVariation != 0 && Math.abs(price.priceDelta) < price.significantVariation) || (price.newPrice != null && price.significantVariationInMargin != null && price.significantVariationInMargin != 0 && Math.abs(price.newImpact) < price.significantVariationInMargin)))\r\n || (sit.value == 7 && price.hasNotFollowedSuggestion()) // price.newPrice != null && price.newPrice != 0 && price.suggestedPrice != null && price.suggestedPrice != 0 && price.suggestedPrice != price.newPrice)\r\n || (sit.value == 8 && price.hasOverlaps()) //price.overlappingPromotions && price.overlappingPromotions.length > 0)\r\n\r\n ))\r\n rv = true;\r\n });\r\n return rv;\r\n });\r\n\r\n };\r\n })\r\n .filter('search', function () {\r\n return function (prices, search) {\r\n if (search.length < 3)\r\n return prices;\r\n\r\n return prices.filter(function (price) {\r\n var rtn = false;\r\n\r\n if (price.isChild()) {\r\n price = (price.parent ? price.parent: price );\r\n }\r\n\r\n rtn = (price.code && price.code.toLowerCase().indexOf(search.toLowerCase()) > -1)\r\n || (price.ean && price.ean.toLowerCase().indexOf(search.toLowerCase()) > -1)\r\n || (price.description && price.description.toLowerCase().indexOf(search.toLowerCase()) > -1)\r\n || (price.priceList && price.priceList.toLowerCase().indexOf(search.toLowerCase()) > -1)\r\n || (price.priceListCode && price.priceListCode.toLowerCase().indexOf(search.toLowerCase()) > -1\r\n );\r\n \r\n return rtn;\r\n });\r\n\r\n };\r\n })\r\n .filter('startFrom', function () {\r\n return function (input, start) {\r\n start = +start; //parse to int\r\n return input.slice(start);\r\n }\r\n })\r\n .controller(\"PriceDecisionsCtrl\", function ($scope, $rootScope, $window, $translate, $timeout, $interval, $state, $stateParams, $filter, $q, priceService, adminService, ngDialog, authService) {\r\n\r\n var dic = {};\r\n var numberColWidth = 100;\r\n var editableColWidth = 140;\r\n var lastAdded = null;\r\n var columnDefs = null;\r\n var changePriceNewImpact = 0;\r\n var selectedFilterForText = '';\r\n var self = this;\r\n var pageLoaded = false;\r\n\r\n self.showMarginInUSDperM3 = false; //TODO: obtener del company json\r\n\r\n self.companyCode = companyJson.Erp.Implementation;\r\n\r\n self.pageNumber = 0;\r\n self.pageSize = 20;\r\n self.busy = false;\r\n self.isEndorse = null;\r\n self.allPrices = [];\r\n self.allChecked = false;\r\n self.title = null;\r\n self.pricelists = [];\r\n self.markets = [];\r\n self.brands = [];\r\n self.regions = [];\r\n self.zoning = [];//zonificacion de larebaja (dpto, cdad, sector, pdv)\r\n self.departments = [];\r\n self.sectors = [];\r\n self.stores = [];\r\n self.loadingPriceSurveys = true;\r\n self.isEndorse = $stateParams.isEndorse ? JSON.parse($stateParams.isEndorse) : false;\r\n //Abm Etiquietas\r\n self.newGroupTag = \"\";\r\n self.newTagValue = \"\";\r\n self.tags = [];\r\n self.groupTag = [];\r\n self.suggestedImpact = 0;\r\n self.suggestedImpactShare = 0; //Impacto sobre total margen de la categoria\r\n self.newImpact = 0;\r\n self.newImpactShare = 0; //Impacto sobre total margen de la categoria\r\n self.numberOfNewPrices = 0;\r\n self.numberOfSuggestions = 0;\r\n self.numberOfSuggestionsAccepted = 0;\r\n self.percentageOfAcceptedSuggestions = 0;\r\n self.categoryMargin = 0;\r\n self.salesWithCurrentPrices = 0;\r\n self.salesWithNewPrices = 0;\r\n self.salesWithSuggestedPrices = 0;\r\n self.averagePriceChanges = 0;\r\n self.averagePriceNewVsSuggestedChanges = 0;\r\n self.priceDashboard = null;\r\n self.timerange = 'week';\r\n self.showChipsFilter = false;\r\n self.exchangeRate = 1;\r\n self.manualSearch = '';\r\n\r\n $scope.$on('$stateChangeStart', function (event) {\r\n var itemsToEndorse = getItemsToEndorse();\r\n var itemsToSave = getItemsToSave();\r\n var itemsToIgnore = getItemsToIgnore();\r\n //console.log('itemsToEndorse', itemsToEndorse);\r\n //console.log('itemsToSave', itemsToSave);\r\n //console.log('itemsToIgnore', itemsToIgnore);\r\n\r\n if (itemsToEndorse.length > 0\r\n || itemsToSave.length > 0\r\n || itemsToIgnore.length > 0\r\n ) {\r\n var answer = confirm(translations.AlertWillLoseChanges)\r\n if (!answer) {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n\r\n });\r\n\r\n self.markAsReviewed = function (priceType, priceTypeName) {\r\n\r\n swal({\r\n title: translations.DoYouWishToIgnorePendingSuggestions,\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.Yes,\r\n cancelButtonText: \"No\",\r\n closeOnConfirm: true,\r\n closeOnCancel: true\r\n }, function (ignorePendingSuggestions) {\r\n\r\n var alertMessage = '';\r\n if (priceType == 0)\r\n alertMessage = ignorePendingSuggestions ? translations.PricesOfThisCategoryAsRevised : translations.PricesOfThisCategoryAsRevisedPartial;\r\n else if (priceType == 5)\r\n alertMessage = ignorePendingSuggestions ? translations.CompetitionPricesOfThisCategoryAsRevised : translations.CompetitionPricesOfThisCategoryAsRevisedPartial;\r\n else if (priceType == 6)\r\n alertMessage = ignorePendingSuggestions ? translations.NormalPricesOfThisCategoryAsRevised : translations.NormalPricesOfThisCategoryAsRevisedPartial;\r\n\r\n var swalConfig = {\r\n title: translations.DiscardConfirmTitle,\r\n text: alertMessage,\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n };\r\n $timeout(function () {\r\n\r\n swal(swalConfig, function () {\r\n //1. Save changes\r\n var result = saveNewPrices(false);\r\n\r\n if (result && typeof result.then == 'function') { //si se hace el save la respuesta es un promise\r\n\r\n result.then(function () {\r\n\r\n //2. Mark as reviewed \r\n markAsReviewed(priceType, ignorePendingSuggestions);\r\n\r\n })\r\n .catch(function (fallback) {\r\n console.log(fallback);\r\n swal(translations.ErrorTitleSwal, translations.ErrorSwalSubtitle, \"error\");\r\n });\r\n }\r\n else {\r\n\r\n //2. Mark as reviewed \r\n markAsReviewed(priceType, ignorePendingSuggestions);\r\n }\r\n });\r\n }, 500);\r\n });\r\n\r\n }\r\n\r\n self.canEndorse = function () {\r\n return authService.hasPermission('pricing_endorse');\r\n }\r\n\r\n //con esta funcion chequeo si el grupo de filtro tiene la opcion ALL y la desactivo si eligi� cualquier otro valor.\r\n self.onCheckboxFilterChanged = function (value, filters) {\r\n\r\n if (value.id == 'All' && value.checked == true) {\r\n filters.forEach(f => {\r\n if (f.id != 'All')\r\n f.checked = false;\r\n });\r\n }\r\n\r\n if (value.id != 'All' && value.checked == true) {\r\n filters.forEach(f => {\r\n if (f.id == 'All')\r\n f.checked = false;\r\n });\r\n }\r\n\r\n //self.filters.status.forEach(f => {\r\n // if (f.checked == true && (f.id == 'Suggested' || f.id == 'Pending' || f.id == 'Endorsed')) {\r\n // self.filters.actions[0].checked = false;\r\n // }\r\n //});\r\n\r\n //self.filters.priceTypes.forEach(f => {\r\n // if (f.checked == true && (f.id == 'Regular' || f.id == 'Competitive')) {\r\n // self.filters.actions[0].checked = false;\r\n // }\r\n //});\r\n\r\n //self.filters.actions.forEach(f => {\r\n // if (f.checked == true && (f.id == 'Increase' || f.id == 'Decrease')) {\r\n // self.filters.actions[0].checked = false; \r\n // }\r\n //});\r\n\r\n }\r\n\r\n function getItemsToIgnore() {\r\n\r\n var itemsToIgnore = [];\r\n\r\n angular.forEach(self.allPrices, function (price) {\r\n var item = price;\r\n \r\n if (item.ignored)\r\n itemsToIgnore.push(item);\r\n });\r\n\r\n return itemsToIgnore\r\n }\r\n\r\n self.ignore = function () {\r\n\r\n swal({\r\n title: translations.DiscardConfirmTitle,\r\n text: translations.IgnoreSelectedSuggestions,\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function () {\r\n\r\n var itemsToIgnore = getItemsToIgnore();\r\n\r\n if (itemsToIgnore.length > 0) {\r\n\r\n priceService.decisions.ignoreSuggestions(itemsToIgnore)\r\n .then(function (resp) {\r\n if (resp) {\r\n swal(translations.ConfirmedSwal, translations.ConfirmedIgnoreSelectedSuggestions, \"success\");\r\n loadData();\r\n }\r\n else\r\n swal(translations.ErrorTitleSwal, translations.ErrorSwalSubtitle, \"error\");\r\n });\r\n }\r\n else {\r\n $timeout(function () {\r\n swal(translations.Attention, translations.NoChangesWereRecorded, \"error\");\r\n }, 500);\r\n }\r\n });\r\n }\r\n\r\n function getItemsToEndorse() {\r\n var itemsToEndorse = [];\r\n //recorro los items seleccionados\r\n angular.forEach(self.allPrices, function (price) {\r\n \r\n var item = price;\r\n\r\n //si el status es current o new\r\n if ((item.status == 0 || item.status == 1) && item.selected) {\r\n //y tiene precio o fechas nuevas\r\n if ((item.newPrice && item.newPrice != 0 && item.newPrice != item._Price)\r\n || (item.newValidFrom && item.newValidFrom != item.validFrom)\r\n || (item.newValidFrom && item.newValidFrom != item.validFrom)) {\r\n itemsToEndorse.push(item);\r\n }\r\n }\r\n\r\n });\r\n return itemsToEndorse;\r\n }\r\n\r\n self.endorse = function () {\r\n swal({\r\n title: translations.DiscardConfirmTitle,\r\n text: translations.EndorseTheModifiedPrices,\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function () {\r\n var itemsToEndorse = getItemsToEndorse();\r\n\r\n var newPricesToEndorse = getNewPricesToSaveOrEndorse(itemsToEndorse, true);\r\n\r\n if (itemsToEndorse.length > 0) {\r\n priceService.decisions.endorsePrices(newPricesToEndorse).then(function () {\r\n swal(translations.ConfirmedSwal, translations.ConfirmedEndorseTheSelectedPrices, \"success\");\r\n loadData();\r\n\r\n }).catch(function (fallback) {\r\n console.log(fallback);\r\n swal(translations.ErrorTitleSwal, translations.ErrorWhenWantingEndorsePrices, \"error\");\r\n });\r\n }\r\n else {\r\n $timeout(function () {\r\n swal(translations.Attention, translations.NoChangesWereRecorded, \"error\");\r\n }, 500);\r\n }\r\n });\r\n }\r\n\r\n function getItemsToReject() {\r\n var pricesToReject = [];\r\n\r\n // rechazo solo los seleccionados.\r\n angular.forEach(self.allPrices, function (price) {\r\n \r\n var item = price;\r\n if (item.rejected)\r\n pricesToReject.push(item);\r\n });\r\n\r\n return pricesToReject;\r\n }\r\n\r\n self.reject = function () {\r\n swal({\r\n title: translations.RejectionComment,\r\n text: translations.RejectionCommentSubtitle,\r\n type: \"input\",\r\n showCancelButton: true,\r\n closeOnConfirm: false,\r\n animation: \"slide-from-top\",\r\n //inputPlaceholder: \"\"\r\n },\r\n function (inputValue) {\r\n if (inputValue === false)\r\n return false;\r\n\r\n var pricesToReject = [];\r\n\r\n // rechazo solo los seleccionados.\r\n angular.forEach(self.allPrices, function (price) {\r\n var item = price;\r\n if (item.rejected)\r\n pricesToReject.push(item);\r\n });\r\n\r\n if (pricesToReject.length > 0) {\r\n // Guardar cambios\r\n\r\n var currentUrl = window.location.href;\r\n priceService.decisions.rejectEndorse(pricesToReject, inputValue, currentUrl)\r\n .then(function (resp) {\r\n if (resp) {\r\n swal(translations.RejectedItems, translations.RejectedItemsSubtitle, \"success\");\r\n loadData();\r\n }\r\n else\r\n swal(translations.ErrorTitleSwal, translations.ErrorSwalSubtitle, \"error\");\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.openChatDialog = function (priceId) {\r\n var newScope = $scope.$new();\r\n newScope.showLoader = true;\r\n\r\n priceService.decisions.getChatForItem(priceId).then(function (data) {\r\n newScope.showLoader = false;\r\n\r\n newScope.currentDate = new Date();\r\n newScope.chats = [];\r\n newScope.isSaving = false;\r\n newScope.newChat = {\r\n id: 0,\r\n priceId: priceId,\r\n message: \"\",\r\n pictureUrl: \"defaultUser.jpg\", //TODO: Reemplazar por el current userPicture\r\n sendDate: new Date()\r\n };\r\n\r\n if (data && data.length > 0)\r\n newScope.chats = data;\r\n\r\n newScope.saveMessage = function () {\r\n newScope.isSaving = true;\r\n priceService.decisions.saveChatForItem(newScope.newChat).then(function (resp) {\r\n if (resp != null) {\r\n newScope.chats.push(resp);\r\n newScope.newChat.message = \"\";\r\n newScope.isSaving = false;\r\n }\r\n else {\r\n newScope.isSaving = true;\r\n }\r\n });\r\n }\r\n });\r\n\r\n ngDialog.open({\r\n template: 'chatDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-300',\r\n scope: newScope\r\n });\r\n }\r\n\r\n self.showNewTagModal = function () {\r\n ngDialog.open({\r\n template: 'modal-newTag',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-500',\r\n scope: $scope\r\n });\r\n }\r\n\r\n\r\n self.filterByText = function () {\r\n var eInput = document.querySelector('#searchGridInput');\r\n if (eInput) {\r\n\r\n if ((eInput.value.length > 2 && selectedFilterForText != eInput.value) || (eInput.value == '' && selectedFilterForText != '')) {\r\n selectedFilterForText = eInput.value;\r\n }\r\n }\r\n }\r\n\r\n self.dateEditor = function (params) {\r\n if (self.isEndorse) {\r\n return $rootScope.dateRenderer(params);\r\n }\r\n else {\r\n return $rootScope.dateEditor(params);\r\n }\r\n }\r\n\r\n self.updateDates = function (isValidFrom) {\r\n swal({\r\n title: translations.UpdateDates,\r\n text: isValidFrom ? translations.UpdateDatesSubtitleOp1 : translations.UpdateDatesSubtitleOp2,\r\n type: 'input',\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n closeOnConfirm: true,\r\n closeOnCancel: true\r\n },\r\n function (inputValue) {\r\n\r\n if (inputValue === false)\r\n return false;\r\n\r\n var timestamp = Date.parse(inputValue)\r\n\r\n if (isNaN(timestamp) == false) {\r\n var d = new Date(timestamp);\r\n\r\n //TODO: Ver como Ponerle un DatePicker al Sweet Alert\r\n\r\n angular.forEach(getFilteredPrices(), function (p) {\r\n\r\n if (p.newPrice != null && p.newPrice != '' && p.newPrice != 0) {\r\n if (isValidFrom)\r\n p.newValidFrom = d;\r\n else\r\n p.newValidTo = d;\r\n p.dirty = true;\r\n\r\n }\r\n });\r\n setTimeout(function () {\r\n swal(translations.Success, '', 'success');\r\n }, 1000);\r\n ngDialog.close();\r\n }\r\n\r\n\r\n });\r\n }\r\n\r\n self.showItemInDashboard = function (itemId, priceListId) {\r\n $state.go('home.itemDashboard', { 'itemId': itemId, 'priceListId': priceListId });\r\n }\r\n\r\n\r\n /***Nuevas Funciones****/\r\n\r\n self.selectPrice = function (p) {\r\n if (self.selectedPrice && self.selectedPrice.priceId === p.priceId) {\r\n self.selectedPrice = null;\r\n }\r\n else {\r\n self.selectedPrice = p;\r\n }\r\n\r\n self.toggleTabsRow(p);\r\n }\r\n \r\n\r\n self.toggleTabsRow = function (p) {\r\n\r\n var speed = 200;\r\n\r\n if (self.selectedPrice) {\r\n $('#' + p.priceId).attr('hidden', false).show();\r\n $('#' + p.priceId)\r\n .children('td')\r\n .animate({ paddingTop: 8, paddingBottom: 8 }, speed)\r\n .children()\r\n .slideDown(speed);\r\n }\r\n else {\r\n $('#' + p.priceId)\r\n .children('td')\r\n .animate({ paddingTop: 0, paddingBottom: 0 }, speed)\r\n .children()\r\n .slideUp(speed, function () { $('#' + p.priceId).attr('hidden', true).hide(); });\r\n }\r\n }\r\n\r\n self.toggleSuggestionTab = function (price) {\r\n if (price) {\r\n\r\n if (!price.priceSurveyTypes) {\r\n price.priceSurveys = [];\r\n price.priceSurveyTypes = ['', translations.Basket, 'EXTRA', 'PRICEINDEX', translations.Promotion, translations.Own];\r\n //priceService.pricesurveys.onlyActive(price.itemId, price.priceListId, false)\r\n // .then(function (priceSurveys) {\r\n // price.priceSurveys = priceSurveys;\r\n // });\r\n if (price.priceSuggestionId)\r\n priceService.pricesurveys.getByPriceSuggestionId(price.priceSuggestionId)\r\n .then(function (priceSurveys) {\r\n price.priceSurveys = priceSurveys;\r\n });\r\n }\r\n\r\n }\r\n }\r\n\r\n self.toggleMarginsAndCostsTab = function (price, active) {\r\n if (!price) return;\r\n price.marginTab = active;\r\n }\r\n\r\n\r\n self.toggleNotificationsTab = function (price, active) {\r\n if (!price) return;\r\n price.notifications = active;\r\n }\r\n\r\n self.isLoadingAuditTrails = false;\r\n self.toggleAuditTrailTab = function (price) {\r\n if (!price) return;\r\n\r\n if (!price.auditTrail) {\r\n self.isLoadingAuditTrails = true;\r\n adminService.auditTrail.getByObject(price.priceId, 'Price', 60).then(function (data) {\r\n self.isLoadingAuditTrails = false;\r\n price.auditTrail = data;\r\n });;\r\n }\r\n }\r\n\r\n self.toggleCompetitonTab = function (price, active) {\r\n if (!price) return;\r\n\r\n //No es necesario tener competitorsGroupPrices antes de mostrar el componente.\r\n\r\n //if (price.competitorsGroupPrices) {\r\n // price.viewMap = active;\r\n //} else {\r\n\r\n // //console.log('PRICESSSSS', price);\r\n // //console.log('price.priceListId', price.priceListId);\r\n\r\n // priceService.decisions.getCompetitorsGroupPrices(price.itemId, price.priceListId).then(function (competitorPrices) {\r\n // //console.log('competitorPrices', competitorPrices);\r\n // price.competitorsGroupPrices = competitorPrices;\r\n // price.viewMap = active;\r\n\r\n // });\r\n //}\r\n\r\n price.viewMap = active;\r\n }\r\n\r\n self.toggleKpiItemView = function (price, active) {\r\n if (!price) return;\r\n price.kpiItemView = active;\r\n }\r\n\r\n self.acceptAll = function () {\r\n var filteredPrices = getFilteredPrices();\r\n\r\n for (var i = 0; i < filteredPrices.length; i++) {\r\n\r\n var price = filteredPrices[i];\r\n\r\n if (price.status != 0 || price.suggestionAccepted == true) continue;\r\n\r\n if (price.suggestedPrice) {\r\n price.changePrice(price.suggestedPrice);\r\n price.suggestionAccepted = true;\r\n } else if (price.suggestedPrice) {\r\n self.numberOfSuggestionsAccepted++;\r\n self.percentageOfAcceptedSuggestions = self.numberOfSuggestionsAccepted > 0 ? Math.round((self.numberOfSuggestionsAccepted / self.numberOfSuggestions) * 10000) / 10000 : 0;\r\n }\r\n }\r\n }\r\n\r\n function getFilteredPrices() {\r\n var filteredPrices = $filter('statusFilter')(self.allPrices, self.appliedFilters);\r\n filteredPrices = $filter('priceListFilter')(filteredPrices, self.appliedFilters);\r\n filteredPrices = $filter('priceTypeFilter')(filteredPrices, self.appliedFilters);\r\n filteredPrices = $filter('situationFilter')(filteredPrices, self.appliedFilters);\r\n filteredPrices = $filter('actionFilter')(filteredPrices, self.appliedFilters);\r\n filteredPrices = $filter('regionFilter')(filteredPrices, self.appliedFilters);\r\n filteredPrices = $filter('brandFilter')(filteredPrices, self.appliedFilters);\r\n filteredPrices = $filter('marketFilter')(filteredPrices, self.appliedFilters);\r\n filteredPrices = $filter('departmentFilter')(filteredPrices, self.appliedFilters);\r\n filteredPrices = $filter('sectorFilter')(filteredPrices, self.appliedFilters);\r\n filteredPrices = $filter('storeFilter')(filteredPrices, self.appliedFilters);\r\n filteredPrices = $filter('search')(filteredPrices, self.manualSearch);\r\n\r\n return filteredPrices;\r\n }\r\n\r\n function getCheckedPrices() {\r\n return self.allPrices.filter(p => p.isChecked === true);\r\n }\r\n\r\n self.endorseAll = function () {\r\n var filteredPrices = getFilteredPrices();\r\n\r\n for (var i = 0; i < filteredPrices.length; i++) {\r\n var price = filteredPrices[i];\r\n\r\n if (price.status != 1) continue;\r\n\r\n price.selected = true;\r\n price.rejected = false;\r\n }\r\n }\r\n\r\n\r\n //var previousLookupText = '';\r\n //$scope.$watch('ct.manualSearch', function (newVal, oldVal) {\r\n // if (newVal) {\r\n\r\n // if (newVal && newVal != oldVal && newVal != previousLookupText) {\r\n // previousLookupText = newVal;\r\n // self.pageNumber = 0; //Vuelvo a la pagina 1\r\n // self.totalFilteredPrices = _.size(getFilteredPrices()); //Recalculo el total de precios que quedaron\r\n // }\r\n // }\r\n // else {\r\n // self.pageNumber = 0; //Vuelvo a la pagina 1\r\n // self.totalFilteredPrices = _.size(getFilteredPrices()); //Recalculo el total de precios que quedaron\r\n // }\r\n //}, true);\r\n\r\n self.onSearch = function () {\r\n if (self.manualSearch.length > 2) {\r\n self.pageNumber = 0; //Vuelvo a la pagina 1\r\n }\r\n self.totalFilteredPrices = _.size(getFilteredPrices()); //Recalculo el total de precios que quedaron\r\n }\r\n\r\n\r\n self.openPriceCopyDialog = function () {\r\n self.priceTypeTarget = null;\r\n self.priceTypeSource = null;\r\n self.cancel = function () {\r\n ngDialog.close();\r\n }\r\n\r\n self.onChangePriceTypeTarget = function () {\r\n self.priceTypeSource = self.priceTypeTarget == 5 ? 6 : 5;\r\n }\r\n\r\n self.copyPrices = function () {\r\n if (!self.priceTypeSource || !self.priceTypeTarget || !self.updateType || self.updateValue == null || self.updateValue == undefined) {\r\n swal(translations.ValidationSwalSubtitle, '', 'error');\r\n return;\r\n }\r\n var swalConfig = {\r\n title: translations.PriceUpdateConfirmTitle,\r\n text: translations.PriceUpdateConfirmText,\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n }\r\n\r\n swal(swalConfig, function () {\r\n\r\n angular.forEach(getFilteredPrices(), function (p) {\r\n\r\n let priceSource = self.allPrices.filter(function (x) {\r\n return x.itemId === p.itemId\r\n && x.salesUnitOfMeasureId === p.salesUnitOfMeasureId\r\n && x.priceId != p.priceId\r\n && x.priceListId === p.priceListId\r\n && x.priceType === self.priceTypeSource;\r\n })[0];\r\n\r\n\r\n let newPrice = null;\r\n if (priceSource) {\r\n if (self.updateType == '$')\r\n newPrice = priceSource._Price + self.updateValue;\r\n else\r\n newPrice = priceSource._Price + (priceSource._Price * self.updateValue / 100);\r\n\r\n\r\n p.changePrice(newPrice);\r\n }\r\n\r\n });\r\n\r\n setTimeout(function () {\r\n swal(translations.Success, '', 'success');\r\n }, 1000);\r\n ngDialog.close();\r\n });\r\n }\r\n\r\n ngDialog.open({\r\n template: 'priceCopyDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-300',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.openPriceUpdateDialog = function () {\r\n self.priceUpdateStrategy = \"1\";\r\n self.priceUpdateOperator = \"%\";\r\n self.updateValue = null;\r\n\r\n self.onChangeUpdateStrategy = function () {\r\n if (self.priceUpdateStrategy == \"1\")\r\n self.priceUpdateOperator = \"%\";\r\n //if (self.priceUpdateStrategy == \"2\")\r\n // self.priceUpdateOperator = \"USDM3\";\r\n if (self.priceUpdateStrategy == \"3\")\r\n self.priceUpdateOperator = \"$\";\r\n }\r\n\r\n\r\n self.cancel = function () {\r\n ngDialog.close();\r\n }\r\n\r\n self.update = function () {\r\n if (!self.priceUpdateStrategy || !self.updateValue) {\r\n swal(translations.ValidationSwalSubtitle, '', 'error');\r\n return;\r\n }\r\n var swalConfig = {\r\n title: translations.PriceUpdateConfirmTitle,\r\n text: translations.PriceUpdateConfirmText,\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n }\r\n\r\n swal(swalConfig, function () {\r\n\r\n getCheckedPrices().forEach(p => {\r\n\r\n //actualizacion masiva por variacion porcentual del precio\r\n if (self.priceUpdateStrategy == \"1\") {\r\n\r\n if (self.priceUpdateOperator == \"%\") {\r\n newPrice = p._Price + (p._Price * self.updateValue / 100);\r\n }\r\n\r\n if (self.priceUpdateOperator == \"$\") {\r\n newPrice = p._Price + self.updateValue;\r\n }\r\n }\r\n\r\n //actualizacion masiva por margen objetivo\r\n if (self.priceUpdateStrategy == \"2\") {\r\n\r\n var cost = p.newCost ? p.newCost : p.cost;\r\n var tax = p.newTax ? p.newTax : p.tax;\r\n var taxRate = p.newTaxRate ? p.newTaxRate : p.taxRate;\r\n var newprice = null;\r\n\r\n if (self.priceUpdateOperator == \"USDM3\") {\r\n\r\n var marginInUSDperM3 = self.updateValue;\r\n var targetMarginAmount = (marginInUSDperM3 * self.exchangeRate.fxRate) / 1000;\r\n\r\n newPrice = (cost + targetMarginAmount) * (1 + taxRate) + tax;\r\n }\r\n\r\n if (self.priceUpdateOperator == \"%\") {\r\n\r\n var targetMargin = self.updateValue / 100;\r\n\r\n if (targetMargin != 1) {\r\n newPrice = (((cost + tax) / (1 - targetMargin)) - tax) * (1 + taxRate) + tax;\r\n }\r\n else\r\n newPrice = 0;\r\n }\r\n }\r\n\r\n //actualizacion masiva a precio fijo\r\n if (self.priceUpdateStrategy == \"3\") {\r\n newPrice = self.updateValue;\r\n }\r\n\r\n\r\n //actualizo el precio\r\n if (newPrice) {\r\n p.changePrice(newPrice);\r\n }\r\n \r\n\r\n\r\n });\r\n\r\n setTimeout(function () {\r\n swal(translations.Success, '', 'success');\r\n }, 1000);\r\n ngDialog.close();\r\n });\r\n }\r\n\r\n ngDialog.open({\r\n template: 'priceUpdateDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-300',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.openPriceSimulationDialog = function () {\r\n self.priceUpdateStrategy = \"1\";\r\n self.priceUpdateOperator = \"%\";\r\n self.updateValue = null;\r\n\r\n self.onChangeUpdateStrategy = function () {\r\n if (self.priceUpdateStrategy == \"1\")\r\n self.priceUpdateOperator = \"%\";\r\n //if (self.priceUpdateStrategy == \"2\")\r\n // self.priceUpdateOperator = \"USDM3\";\r\n if (self.priceUpdateStrategy == \"3\")\r\n self.priceUpdateOperator = \"$\";\r\n }\r\n\r\n self.cancel = function () {\r\n ngDialog.close();\r\n }\r\n\r\n self.simulatePriceUpdate = function () {\r\n if (!self.priceUpdateStrategy || !self.updateValue) {\r\n swal(translations.ValidationSwalSubtitle, '', 'error');\r\n return;\r\n }\r\n\r\n getCheckedPrices().forEach(p => {\r\n\r\n //actualizacion masiva por variacion porcentual del precio\r\n if (self.priceUpdateStrategy == \"1\") {\r\n\r\n if (self.priceUpdateOperator == \"%\") {\r\n newPrice = p._Price + (p._Price * self.updateValue / 100);\r\n }\r\n\r\n if (self.priceUpdateOperator == \"$\") {\r\n newPrice = p._Price + self.updateValue;\r\n }\r\n }\r\n\r\n //actualizacion masiva por margen objetivo\r\n if (self.priceUpdateStrategy == \"2\") {\r\n\r\n var cost = p.newCost ? p.newCost : p.cost;\r\n var tax = p.newTax ? p.newTax : p.tax;\r\n var taxRate = p.newTaxRate ? p.newTaxRate : p.taxRate;\r\n var newprice = null;\r\n\r\n if (self.priceUpdateOperator == \"USDM3\") {\r\n\r\n var marginInUSDperM3 = self.updateValue;\r\n var targetMarginAmount = (marginInUSDperM3 * self.exchangeRate.fxRate) / 1000;\r\n\r\n newPrice = (cost + targetMarginAmount) * (1 + taxRate) + tax;\r\n }\r\n\r\n if (self.priceUpdateOperator == \"%\") {\r\n\r\n var targetMargin = self.updateValue / 100;\r\n\r\n if (targetMargin != 1) {\r\n newPrice = (((cost + tax) / (1 - targetMargin)) - tax) * (1 + taxRate) + tax;\r\n }\r\n else\r\n newPrice = 0;\r\n } \r\n }\r\n\r\n //actualizacion masiva a precio fijo\r\n if (self.priceUpdateStrategy == \"3\") {\r\n newPrice = self.updateValue;\r\n }\r\n\r\n\r\n //actualizo el precio\r\n if (newPrice) {\r\n p.changePrice(newPrice);\r\n p.isSimulated = true;\r\n }\r\n\r\n self.isSimulationActive = self.allPrices.filter(p => p.isSimulated).length > 0;\r\n\r\n });\r\n\r\n swal(translations.Success, '', 'success');\r\n ngDialog.close();\r\n\r\n }\r\n\r\n ngDialog.open({\r\n template: 'priceSimulationDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-300',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.cancelPriceSimulation = function () {\r\n self.allPrices.forEach(p => p.isSimulated = false);\r\n }\r\n\r\n self.setEndorsed = function (item) {\r\n item.selected = true;\r\n item.rejected = false;\r\n }\r\n\r\n self.unsetEndorsed = function (item) {\r\n item.selected = false;\r\n }\r\n\r\n self.openStateActions = function (price) {\r\n\r\n if (price.popOverIsOpen == true) {\r\n price.popOverIsOpen = false;\r\n }\r\n\r\n else {\r\n price.openTimer = $timeout(function () {\r\n closeAllPopovers();\r\n price.popOverIsOpen = true;\r\n }, 250);\r\n }\r\n }\r\n\r\n $window.document.onclick = function () {\r\n $scope.$apply(function () {\r\n closeAllPopovers();\r\n });\r\n }\r\n\r\n\r\n self.saveAll = function () {\r\n\r\n var anySimilationActive = self.allPrices.filter(p => p.isSimulated).length > 0;\r\n\r\n if (anySimilationActive) {\r\n swal(translations.Pr_Decisions_SimulationWarningOnSave_Title, translations.Pr_Decisions_SimulationWarningOnSave_Desc, 'warning');\r\n return;\r\n }\r\n\r\n angular.forEach(self.allPrices, function (price) {\r\n if (price.parent)\r\n delete price.parent;\r\n });\r\n \r\n var toSave = getItemsToSave();\r\n var toIgnore = getItemsToIgnore();\r\n var toEndorse = getItemsToEndorse();\r\n var toReject = getItemsToReject();\r\n\r\n if (toSave.length == 0 && toIgnore.length == 0 && toEndorse.length == 0 && toReject.length == 0) {\r\n swal(translations.Attention, translations.NoChangesWereRecorded, \"warning\");\r\n return;\r\n }\r\n\r\n var message = ian.format(translations.TheFollowingChangesWillBeSaved);\r\n if (toSave.length > 0)\r\n message += toSave.length + translations.PriceChangesOp;\r\n if (toIgnore.length > 0)\r\n message += toIgnore.length + translations.IgnoredSuggestionsOp;\r\n if (toEndorse.length > 0)\r\n message += toEndorse.length + translations.EndorsedPricesOp;\r\n if (toReject.length > 0)\r\n message += toReject.length + translations.RejectedPricesOp;\r\n\r\n //saco la ultima coma\r\n message = message.replace(/,\\s*$/, \"\");\r\n\r\n\r\n swal({\r\n title: translations.DiscardConfirmTitle,\r\n text: message,\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function () {\r\n\r\n var promises = [];\r\n\r\n //prices to save\r\n if (toSave.length > 0) {\r\n var newPricesToSave = getNewPricesToSaveOrEndorse(toSave, false);\r\n promises.push(priceService.decisions.saveNewPrices($stateParams.categoryId, newPricesToSave));\r\n }\r\n\r\n //prices to ignore\r\n if (toIgnore.length > 0) {\r\n promises.push(priceService.decisions.ignoreSuggestions(toIgnore));\r\n }\r\n\r\n //prices to endorse\r\n if (toEndorse.length > 0) {\r\n var newPricesToEndorse = getNewPricesToSaveOrEndorse(toEndorse, true);\r\n promises.push(priceService.decisions.endorsePrices(newPricesToEndorse));\r\n }\r\n\r\n //prices to reject\r\n if (toReject.length > 0) {\r\n var reason = toReject[0].rejectedReason;\r\n promises.push(priceService.decisions.rejectEndorse(toReject, reason, window.location.href));\r\n }\r\n\r\n\r\n $q.all(promises).then(function (data) {\r\n swal(translations.ConfirmedSwal, translations.ConfirmedSwalSubtitle, \"success\");\r\n loadData();\r\n }, function (error) {\r\n swal(translations.ErrorTitleSwal, translations.ErrorSwalSubtitle, \"error\");\r\n });\r\n\r\n\r\n\r\n });\r\n }\r\n\r\n self.onChangeItemTags = function (price) {\r\n adminService.items.saveItemTags(price.itemTags.map(x => x.id), price.itemId);\r\n }\r\n\r\n self.saveNewTag = function () {\r\n if (self.newGroupTag == \"\" || self.newTagValue == \"\") {\r\n swal(translations.ValidationSwalSubtitle, '', 'error');\r\n return;\r\n }\r\n adminService.tags.saveTag({ group: self.newGroupTag, name: self.newTagValue })\r\n .then(function (response) {\r\n if (response.id) {\r\n self.tags.push(response);\r\n swal(translations.HasBeenSuccessfullySavedSwal, '', 'success');\r\n }\r\n else swal(translations.ErrorTitleSwal, '', 'error');\r\n }, function () {\r\n swal(translations.ErrorTitleSwal, '', 'error');\r\n });\r\n ngDialog.close();\r\n }\r\n\r\n self.saveNewGroupTag = function () {\r\n swal({\r\n title: translations.NewTagGroup,\r\n type: \"input\",\r\n showCancelButton: true,\r\n closeOnConfirm: false,\r\n cancelButtonText: translations.CancelSwal,\r\n }, function (inputValue) {\r\n if (inputValue === false) return false;\r\n if (inputValue === \"\") {\r\n swal.showInputError(translations.ValidationSwalSubtitle);\r\n return false\r\n }\r\n self.newGroupTag = inputValue;\r\n self.groupTag.push(inputValue);\r\n $timeout(function () {\r\n swal(translations.HasBeenSuccessfullySavedSwal, \"\", 'success');\r\n }, 100);\r\n });\r\n }\r\n\r\n self.changeSuggestedPrice = function (price) {\r\n\r\n if (!price.allowManualChange) {\r\n price.allowManualChange = true;\r\n price.newPriceByUser = price._Price; //price.suggestedPrice ? price.suggestedPrice :\r\n }\r\n else {\r\n price.allowManualChange = false;\r\n price.newPriceByUser = 0;\r\n }\r\n\r\n }\r\n\r\n self.changePriceAndCloseEditor = function (p) {\r\n p.changePrice(p.newPriceByUser);\r\n p.allowManualChange = false;\r\n }\r\n\r\n self.saveChangedPrices = function () {\r\n\r\n var swalConfig = {\r\n title: translations.DiscardConfirmTitle,\r\n text: translations.AreYouSureSwalSubtitle,\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n }\r\n\r\n swal(swalConfig, function () {\r\n\r\n var result = saveNewPrices(true);\r\n\r\n if (result && typeof result.then == 'function') { //if response is a promise\r\n result.then(function () {\r\n swal(translations.ConfirmedSwal, translations.ConfirmedSwalSubtitle, \"success\");\r\n loadData();\r\n })\r\n .catch(function (fallback) {\r\n console.log(fallback);\r\n swal(translations.ErrorTitleSwal, translations.ErrorSwalSubtitle, \"error\");\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.orderBy = function (price) {\r\n //return Math.abs(price.suggestedImpact);\r\n return price.index;\r\n }\r\n\r\n self.toggleCheckAll = function () {\r\n getFilteredPrices().forEach(p => p.isChecked = self.allChecked);\r\n self.onCheckboxChanged();\r\n }\r\n\r\n self.clearSelectedFilter = function (type, id) {\r\n if (type == 'priceList') {\r\n var removeIndex = -1;\r\n for (var i = 0; i < self.filters.priceLists.length; i++) {\r\n if (self.filters.priceLists[i].id === id) {\r\n removeIndex = i;\r\n }\r\n }\r\n\r\n if (removeIndex > -1) {\r\n self.filters.priceLists.splice(removeIndex, 1);\r\n self.applyFilters();\r\n\r\n }\r\n }\r\n }\r\n\r\n self.closeSelectedFilters = function () {\r\n if (self.filters.priceLists.length <= 0) {\r\n return 'closeFilters';\r\n }\r\n }\r\n\r\n self.cleanAllFilter = function () {\r\n if (self.filters.priceLists.length > 0) {\r\n self.filters.priceLists = [];\r\n }\r\n\r\n self.applyFilters();\r\n }\r\n\r\n self.applyPricingZoneFilter = function (id, code, name) {\r\n self.filters.priceLists = [];\r\n self.filters.priceLists.push({ id: id, code: code, name: name });\r\n self.applyFilters();\r\n }\r\n\r\n self.applyFilters = function () {\r\n //console.log('filters', self.filters);\r\n self.appliedFilters = angular.copy(self.filters);\r\n\r\n updateFilterCounters();\r\n self.closeFilters();\r\n\r\n if (self.filters.priceLists.length > 0) {\r\n self.showChipsFilter = true;\r\n }\r\n else {\r\n $timeout(function () {\r\n self.showChipsFilter = false;\r\n }, 200);\r\n }\r\n }\r\n\r\n self.getAppliedFilters = function () {\r\n return self.appliedFilters;\r\n }\r\n\r\n self.toggleChilds = function (parentPrice) {\r\n\r\n parentPrice.showChilds = !parentPrice.showChilds;\r\n\r\n angular.forEach(self.allPrices, function (p) {\r\n if (p.parentPriceId === parentPrice.priceId)\r\n p.showMe = !p.showMe;\r\n });\r\n }\r\n\r\n\r\n function updateFilterCounters() {\r\n\r\n //dynamic filter counting\r\n var filteredPrices = getFilteredPrices();\r\n\r\n //Select All Filters\r\n self.filters.status[0].count = filteredPrices.length;\r\n self.filters.priceTypes[0].count = filteredPrices.length;\r\n self.filters.actions[0].count = filteredPrices.length;\r\n self.filters.situations[0].count = filteredPrices.length;\r\n\r\n self.filters.status[1].count = 0;\r\n self.filters.status[2].count = 0;\r\n self.filters.status[3].count = 0;\r\n\r\n self.filters.priceTypes[1].count = 0;\r\n self.filters.priceTypes[2].count = 0;\r\n\r\n self.filters.actions[1].count = 0;\r\n self.filters.actions[2].count = 0;\r\n\r\n self.filters.situations[1].count = 0;\r\n self.filters.situations[2].count = 0;\r\n self.filters.situations[3].count = 0;\r\n self.filters.situations[4].count = 0;\r\n self.filters.situations[5].count = 0;\r\n self.filters.situations[6].count = 0;\r\n self.filters.situations[7].count = 0;\r\n self.filters.situations[8].count = 0;\r\n\r\n //do counting\r\n angular.forEach(filteredPrices, function (price) {\r\n //status\r\n if (price.isSuggested())\r\n self.filters.status[1].count++;\r\n else if (price.isPending())\r\n self.filters.status[2].count++;\r\n else if (price.isEndorsed())\r\n self.filters.status[3].count++;\r\n\r\n //price type\r\n if (price.priceType == 6)\r\n self.filters.priceTypes[1].count++;\r\n else if (price.priceType == 5)\r\n self.filters.priceTypes[2].count++;\r\n\r\n //actions\r\n var compareTo = price.newPrice ? price.newPrice : price.suggestedPrice || null;\r\n if (compareTo) {\r\n if (price._Price > compareTo) //Bajas\r\n self.filters.actions[1].count++;\r\n else if (price._Price < compareTo) //Subas\r\n self.filters.actions[2].count++;\r\n }\r\n \r\n //situations\r\n if (price.priceIsFirst == true)\r\n self.filters.situations[1].count++;\r\n if (price.hasStrongDecreases())\r\n self.filters.situations[2].count++;\r\n if (price.hasStrongIncreases())\r\n self.filters.situations[3].count++;\r\n if (price.hasLowMargin())\r\n self.filters.situations[4].count++;\r\n if (price.hasHighMargin())\r\n self.filters.situations[5].count++;\r\n if (price.hasNotSignificantVariation())\r\n self.filters.situations[6].count++;\r\n if (price.hasNotFollowedSuggestion())\r\n self.filters.situations[7].count++;\r\n if (price.hasOverlaps())\r\n self.filters.situations[8].count++;\r\n\r\n });\r\n\r\n self.totalFilteredPrices = _.size(filteredPrices);\r\n }\r\n\r\n function extendPriceObjects(prices) {\r\n\r\n //agregar todas las funciones y propiedades extra que se \r\n //necesiten a este objeto para extender la funcionalidad de los dtos\r\n //entregados por la API Rest.\r\n var extendedPrice = {\r\n\r\n isChecked: false,\r\n isExperimental: false,\r\n popOverIsOpen: false,\r\n suggestionAccepted: false,\r\n priceChangeCount: 0,\r\n getPrice: function () {\r\n if (this.newPrice)\r\n return this.newPrice;\r\n\r\n return this._Price;\r\n },\r\n getMargin: function () {\r\n if (this.newGrossMargin)\r\n return this.newGrossMargin;\r\n\r\n return this.grossMargin;\r\n },\r\n getMarginAbs: function () {\r\n if (this.newGrossMarginAbs)\r\n return this.newGrossMarginAbs;\r\n\r\n return this.grossMarginAbs;\r\n },\r\n getStatusIcon: function () {\r\n if (this.status == 0) {\r\n if (this.suggestedPrice)\r\n if (this.ignored)\r\n return '/assets/images/prices/popover/iconoSugerencia-ignorada.png';\r\n else\r\n return '/assets/images/prices/popover/iconoSugerencia.png';\r\n else\r\n return '/assets/images/prices/popover/iconoActual.png';\r\n }\r\n if (this.status == 1) {\r\n if (this.rejected)\r\n return '/assets/images/prices/popover/iconoPendiente-rechazado.png';\r\n else\r\n return '/assets/images/prices/popover/iconoPendiente.png';\r\n }\r\n if (this.status == 2) {\r\n return '/assets/images/prices/popover/iconoEndosado.png';\r\n }\r\n },\r\n getPopoverIcon: function () {\r\n if (this.status == 0) {\r\n if (this.suggestedPrice)\r\n return '/assets/images/prices/popover/iconoSugerenciaPopover.png';\r\n else\r\n return '/assets/images/prices/popover/iconoActualPopover.png';\r\n }\r\n if (this.status == 1) {\r\n return '/assets/images/prices/popover/iconoPendientePopover.png';\r\n }\r\n if (this.status == 2) {\r\n return '/assets/images/prices/popover/iconoEndosadoPopover.png';\r\n }\r\n },\r\n getStatusColor: function () {\r\n if (this.status == 0) { //Si es un precio actual\r\n if (this.suggestedPrice) {\r\n if (this.suggestionAccepted || this.ignored) //Si tiene sugerencia y se acepto\r\n return '#FCD9B1';\r\n else {\r\n if (this.newPriceByUser != this._Price && this.allowManualChange == false) //Si tiene sugerencia, pero se cambio a un precio manual\r\n return '#FCD9B1';\r\n else //Si tiene sugerencia, pero aun no se acepto\r\n return '#f8ac5a';\r\n }\r\n }\r\n else //Si no tiene sugerencia, es un actual\r\n {\r\n if (this.allowManualChange == false) //Si se se cambio el precio actual a mano\r\n return '#ACD7F2';\r\n else //Si no se cambio nada, es actual\r\n return '#1d84c6';\r\n }\r\n }\r\n if (this.status == 1) { //Si es nuevo (para endosar)\r\n if (this.selected || this.rejected) //Si ya lo endose pero no guarde\r\n return '#BAECED';\r\n else\r\n return '#24c6c8';//Sigue pendiente de endoso\r\n }\r\n if (this.status == 2) { //Si ya esta endosado\r\n return '#1bb394';\r\n }\r\n },\r\n priceTypeDesc: function () {\r\n //console.log(priceService.priceTypes[this.priceType + 1]);\r\n\r\n\r\n //return priceService.priceTypes[this.priceType + 1];\r\n },\r\n getStatusTooltip: function () {\r\n if (this.status == 0) {\r\n if (this.suggestedPrice)\r\n return translations.SuggestionTooltip;\r\n else\r\n return translations.CurrentTooltip;\r\n }\r\n if (this.status == 1) {\r\n return translations.NewTooltip;\r\n }\r\n if (this.status == 2) {\r\n return translations.EndorsedTooltip;\r\n }\r\n\r\n },\r\n getStatusPopoverTitle: function () {\r\n if (this.status == 0) {\r\n if (this.suggestedPrice)\r\n return translations.Suggested;\r\n else\r\n return translations.Current;\r\n }\r\n if (this.status == 1) {\r\n return translations.Pending;\r\n }\r\n if (this.status == 2) {\r\n return translations.Endorsed;\r\n }\r\n\r\n },\r\n getStatusPopoverSubtitle: function () {\r\n if (this.status == 0) {\r\n if (this.suggestedPrice)\r\n return translations.NewPriceSuggestion;\r\n else\r\n return translations.ERPPrice;\r\n }\r\n if (this.status == 1) {\r\n return translations.PriceNeedsEndorsement;\r\n }\r\n if (this.status == 2) {\r\n return translations.ReadyToInformToERP;\r\n }\r\n\r\n },\r\n rejectPrice: function () {\r\n var thisPrice = this;\r\n if (thisPrice.status = 1)//Endosado\r\n {\r\n swal({\r\n title: translations.RejectionComment,\r\n text: translations.RejectionCommentSubtitle,\r\n type: \"input\",\r\n showCancelButton: true,\r\n closeOnConfirm: true,\r\n animation: \"slide-from-top\",\r\n inputPlaceholder: \"\"\r\n },\r\n function (inputValue) {\r\n if (inputValue === false)\r\n return false;\r\n\r\n thisPrice.rejectedReason = inputValue;\r\n thisPrice.selected = false;\r\n thisPrice.rejected = !this.rejected;\r\n\r\n });\r\n }\r\n },\r\n ignorePrice: function () {\r\n this.ignored = !this.ignored;\r\n },\r\n toggleSuggestion: function (accept) {\r\n if (accept) {\r\n //if (this.suggestedPrice && (this.newPrice == null || this.newPrice == '' || this.newPrice == 0)) {\r\n if (this.suggestedPrice) {\r\n this.changePrice(this.suggestedPrice);\r\n this.suggestionAccepted = true;\r\n } else if (this.suggestedPrice) {\r\n self.numberOfSuggestionsAccepted++;\r\n self.percentageOfAcceptedSuggestions = self.numberOfSuggestionsAccepted > 0 ? Math.round((self.numberOfSuggestionsAccepted / self.numberOfSuggestions) * 10000) / 10000 : 0;\r\n }\r\n }\r\n else {\r\n if (!this.hasNewPriceFromDb) {\r\n this.changePrice(null);\r\n this.suggestionAccepted = false;\r\n }\r\n else if (this.suggestedPrice) {\r\n self.numberOfSuggestionsAccepted--;\r\n self.percentageOfAcceptedSuggestions = self.numberOfSuggestionsAccepted > 0 ? Math.round((self.numberOfSuggestionsAccepted / self.numberOfSuggestions) * 10000) / 10000 : 0;\r\n }\r\n }\r\n },\r\n canEditPrice: function () {\r\n if (this.status == 0) {\r\n if (this.allowManualChange)\r\n return true;\r\n else\r\n return false;\r\n }\r\n if (this.status == 1) {\r\n return false;\r\n }\r\n if (this.status == 2) {\r\n return false;\r\n }\r\n },\r\n getTitle: function () {\r\n var title = this.rejectedPrice != null ? translations.NewPriceHasBeenRejected + this.rejectedPrice + translations.GoToTheAuditTab : '';\r\n return title;\r\n },\r\n changePrice: function (newPrice) {\r\n\r\n if (this._Price != null) {\r\n if (newPrice != null && newPrice != '' && newPrice != 0) {\r\n //guardo el precio anterior para no incrementar el conta=dor de cambios si es una modificacion del mismo precio\r\n var oldNewPrice = this.newPrice;\r\n //Chequeo que est� cumpliendo con los lineamientos de margen\r\n var cost = this.newCost != null ? this.newCost : this.cost;\r\n var tax = this.newTax != null ? this.newTax : this.tax;\r\n var taxRate = this.newTaxRate != null ? this.newTaxRate : this.taxRate;\r\n this.newGrossMarginAbs = (cost + tax) != 0 ? (((newPrice - tax) / (1 + taxRate)) - cost) : 0;\r\n\r\n //Actualizo variables relacionadas al nuevo precio\r\n this.newGrossMargin = (cost + tax) != 0 ? (((newPrice - tax) / (1 + taxRate)) - cost) / (((newPrice - tax) / (1 + taxRate)) + tax) : null;\r\n changePriceNewImpact = (this.newGrossMarginAbs - this.grossMarginAbs) * this.units;\r\n this.newPrice = newPrice;\r\n this.priceDelta = (newPrice / this._Price) - 1;\r\n this.competitorsPriceVsNew = this.competitorsPrice != 0 && this.competitorsPrice != null ? (newPrice / this.competitorsPrice) - 1 : 0;\r\n this.newSales = newPrice * this.units;\r\n\r\n //Si la sugerencia tiene fechas de vigencia y el campo de nuevas fechas est� en nulo, entonces seteo las fechas de la sugerencia\r\n if (this.newValidFrom == null && this.priceSuggestionValidFrom != null)\r\n this.newValidFrom = this.priceSuggestionValidFrom;\r\n\r\n if (this.newValidTo == null && this.priceSuggestionValidTo != null)\r\n this.newValidTo = this.priceSuggestionValidTo;\r\n\r\n //Chequeo si esta fuera de Guidelines\r\n var outOfGuidelines = false;\r\n if (this._Price != null) {\r\n if (newPrice != null && newPrice != '') {\r\n if (this.minMargin != 0 && this.newGrossMargin < this.minMargin) {\r\n outOfGuidelines = true;\r\n //marginGuidelinesAlert(\"El nuevo margen: \" + $rootScope.toPercentage(this.newGrossMargin) + \" es menor al margen minimo: \" + $rootScope.toPercentage(this.minMargin));\r\n }\r\n if (this.maxMargin != 0 && this.newGrossMargin > this.maxMargin) {\r\n outOfGuidelines = true;\r\n //marginGuidelinesAlert(\"El nuevo margen: \" + $rootScope.toPercentage(this.newGrossMargin) + \" es mayor al margen maximo: \" + $rootScope.toPercentage(this.maxMargin));\r\n }\r\n }\r\n }\r\n this.outOfGuidelines = true;\r\n\r\n //Hago esto para evitar sumarlo 2 veces\r\n if (this.newPrice != null && this.newPrice != '' && this.newPrice != 0) {\r\n if (oldNewPrice == null)\r\n self.numberOfNewPrices++;\r\n\r\n self.salesWithNewPrices += (newPrice - this._Price) * this.units;\r\n }\r\n else {\r\n self.salesWithNewPrices += (newPrice - this.newPrice) * this.units;\r\n }\r\n\r\n self.averagePriceChanges = Math.round((self.salesWithNewPrices / self.salesWithCurrentPrices - 1) * 10000) / 10000;\r\n self.averagePriceNewVsSuggestedChanges = Math.round((self.salesWithNewPrices / self.salesWithSuggestedPrices - 1) * 10000) / 10000;\r\n\r\n this.dirty = true;\r\n\r\n //Cambios en los KPIs del Header\r\n self.newImpact += changePriceNewImpact - this.newImpact;\r\n self.newImpactShare = self.newImpact / self.categoryMargin; //Impacto sobre total margen de la categoria\r\n\r\n self.percentageOfChanges = 0;\r\n self.percentageOfChangesVsSuggested = 0;\r\n\r\n this.newImpact = changePriceNewImpact;\r\n\r\n //if (!rowNode.selected)\r\n // rowNode.setSelected(true);\r\n }\r\n else {\r\n //Hago esto para evitar restarlo 2 veces\r\n if (this.newPrice != null && this.newPrice != '') {\r\n self.numberOfNewPrices--;\r\n\r\n self.salesWithNewPrices -= (this.newPrice - this._Price) * this.units;\r\n\r\n self.averagePriceChanges = Math.round((self.salesWithNewPrices / self.salesWithCurrentPrices - 1) * 10000) / 10000;\r\n self.averagePriceNewVsSuggestedChanges = Math.round((self.salesWithNewPrices / self.salesWithSuggestedPrices - 1) * 10000) / 10000;\r\n }\r\n\r\n //Cambios en los KPIs del Header\r\n self.newImpact -= this.newImpact;\r\n self.newImpactShare = self.newImpact / self.categoryMargin; //Impacto sobre total margen de la categoria\r\n\r\n self.percentageOfChanges = 0;\r\n self.percentageOfChangesVsSuggested = 0;\r\n\r\n this.newPrice = null;\r\n this.priceDelta = null;\r\n this.newImpact = null;\r\n this.newGrossMargin = null;\r\n this.newGrossMarginAbs = null;\r\n this.competitorsPriceVsNew = null;\r\n this.newValidFrom = null;\r\n this.newValidTo = null;\r\n }\r\n\r\n if (this.suggestedPrice != null) {\r\n if (newPrice == this.suggestedPrice) {\r\n self.numberOfSuggestionsAccepted++;\r\n }\r\n else {\r\n self.numberOfSuggestionsAccepted--;\r\n }\r\n self.percentageOfAcceptedSuggestions = self.numberOfSuggestionsAccepted > 0 ? Math.round((self.numberOfSuggestionsAccepted / self.numberOfSuggestions) * 10000) / 10000 : 0;\r\n }\r\n\r\n this.priceChangeCount++;\r\n }\r\n },\r\n suggestionDelta: function () {\r\n if (!this.suggestedPrice)\r\n return 0;\r\n\r\n return (this.suggestedPrice / this._Price) - 1;\r\n },\r\n suggestionDeltaAmount: function () {\r\n if (!this.suggestedPrice)\r\n return 0;\r\n\r\n return this.suggestedPrice - this._Price\r\n },\r\n isMarginOutOfGuidelines: function () {\r\n var outOfGuidelines = false;\r\n if (this.newPrice) {\r\n //console.log('this', this);\r\n\r\n if (this.minMargin != null && this.minMargin != 0 && this.newGrossMargin < this.minMargin) {\r\n //console.log(true);\r\n outOfGuidelines = true;\r\n }\r\n if (this.maxMargin != null && this.maxMargin != 0 && this.newGrossMargin > this.maxMargin) {\r\n //console.log(true);\r\n outOfGuidelines = true;\r\n }\r\n //if (this.minMarginAmount && Math.abs(this._Price - this.newPrice) < this.minMarginAmount) {\r\n if (this.minMarginAmount && this.newGrossMarginAbs < this.minMarginAmount) {\r\n //console.log('this._Price', this._Price);\r\n //console.log('this.newPrice', this.newPrice);\r\n\r\n //console.log('Math.abs(this._Price - this.newPrice)', Math.abs(this._Price - this.newPrice));\r\n //console.log('this.minMarginAmount', this.minMarginAmount);\r\n //console.log(true);\r\n outOfGuidelines = true;\r\n }\r\n if (this.maxMarginAmount && this.newGrossMarginAbs > this.maxMarginAmount) {\r\n //if (this.maxMarginAmount && Math.abs(this._Price - this.newPrice) > this.maxMarginAmount) {\r\n //console.log(true);\r\n outOfGuidelines = true;\r\n }\r\n }\r\n\r\n return outOfGuidelines;\r\n },\r\n isVariationOutOfGuidelines: function () {\r\n var outOfGuidelines = false;\r\n if (this.newPrice) {\r\n\r\n if (this.minVariation != null && this.minVariation != 0 && this.priceDelta < this.minVariation) {\r\n outOfGuidelines = true;\r\n }\r\n if (this.maxVariation != null && this.maxVariation != 0 && this.priceDelta > this.maxVariation) {\r\n outOfGuidelines = true;\r\n }\r\n if (this.minVariationAmount && Math.abs(this._Price - this.newPrice) < this.minVariationAmount) {\r\n outOfGuidelines = true;\r\n }\r\n if (this.maxVariationAmount && Math.abs(this._Price - this.newPrice) > this.maxVariationAmount) {\r\n outOfGuidelines = true;\r\n }\r\n }\r\n\r\n return outOfGuidelines;\r\n },\r\n isSuggested: function () {\r\n return this.status == 0 && this.suggestedPrice;\r\n },\r\n isPending: function () {\r\n return this.newPrice && this.status == 1;\r\n },\r\n isEndorsed: function () {\r\n return this.newPrice && this.status == 2;\r\n },\r\n hasStrongIncreases: function () {\r\n if (this.newPrice != null) {\r\n if (this.newPrice != null && this.maxVariation != null && this.maxVariation != 0 && this.priceDelta > this.maxVariation)\r\n return true;\r\n else if (this.newPrice != null && this.maxVariationAmount != null && this.maxVariationAmount != 0 && this.priceDeltaAmount > this.maxVariationAmount)\r\n return true;\r\n } else if (this.suggestedPrice != null) {\r\n if (this.maxVariation != null && this.maxVariation != 0 && this.suggestedPriceDelta > this.maxVariation)\r\n return true;\r\n else if (this.maxVariationAmount != null && this.maxVariationAmount != 0 && this.suggestedPriceDeltaAmount > this.maxVariationAmount)\r\n return true;\r\n }\r\n },\r\n hasStrongDecreases: function () {\r\n\r\n if (this.newPrice != null) {\r\n if (this.newPrice != null && this.minVariation != null && this.minVariation != 0 && this.priceDelta < this.minVariation)\r\n return true;\r\n else if (this.newPrice != null && this.minVariationAmount != null && this.minVariationAmount != 0 && this.priceDeltaAmount < this.minVariationAmount)\r\n return true;\r\n } else if (this.suggestedPrice != null) {\r\n if (this.maxVariation != null && this.maxVariation != 0 && this.suggestedPriceDelta < this.minVariationAmount)\r\n return true;\r\n else if (this.minVariationAmount != null && this.minVariationAmount != 0 && this.suggestedPriceDeltaAmount < this.minVariationAmount)\r\n return true;\r\n }\r\n\r\n },\r\n hasLowMargin: function () {\r\n if (this.newPrice != null && this.minMargin != null && this.minMargin != 0 && this.newGrossMargin < this.minMargin)\r\n return true;\r\n else if (this.newPrice != null && this.minMarginAmount != null && this.minMarginAmount != 0 && this.newGrossMarginAbs < this.minMarginAmount)\r\n return true;\r\n },\r\n hasHighMargin: function () {\r\n if (this.newPrice != null && this.maxMargin != null && this.maxMargin != 0 && this.newGrossMargin > this.maxMargin)\r\n return true;\r\n else if (this.newPrice != null && this.maxMarginAmount != null && this.maxMarginAmount != 0 && this.newGrossMarginAbs > this.maxMarginAmount)\r\n return true;\r\n },\r\n hasNotSignificantVariation: function () {\r\n if ((this.newPrice != null && this.significantVariation != null && this.significantVariation != 0 && Math.abs(this.priceDelta) < this.significantVariation)\r\n || (this.newPrice != null && this.significantVariation != null && this.significantVariation != 0 && Math.abs(this.priceDeltaAmount) < this.significantVariation)\r\n || (this.newPrice != null && this.significantVariationInMargin != null && this.significantVariationInMargin != 0 && Math.abs(this.newImpact) < this.significantVariationInMargin))\r\n return true;\r\n },\r\n hasNotFollowedSuggestion: function () {\r\n if (this.newPrice != null && this.newPrice != 0 && this.suggestedPrice != null && this.suggestedPrice != 0 && this.suggestedPrice != this.newPrice)\r\n return true;\r\n },\r\n hasOverlaps: function () {\r\n if (this.overlappingPromotions && this.overlappingPromotions.length > 0)\r\n return true;\r\n },\r\n isParent: function () {\r\n if (!this.mainItemId && !this.mainPriceListId && this.children.length > 0)\r\n return true\r\n\r\n return false;\r\n },\r\n isChild: function () {\r\n if (this.mainItemId || this.mainPriceListId)\r\n return true;\r\n\r\n return false;\r\n },\r\n getImpact: function () {\r\n if (price.newImpact)\r\n return Math.abs(price.newImpact);\r\n if (price.suggestedImpact)\r\n return Math.abs(price.suggestedImpact);\r\n\r\n return 0;\r\n },\r\n getMarginInUSDxM3: function () {\r\n return (this.grossMarginAbs / self.exchangeRate.fxRate) * 1000;\r\n },\r\n getSuggestedMarginInUSDxM3: function () {\r\n var rv = (this.suggestedGrossMarginAbs / self.exchangeRate.fxRate) * 1000;\r\n return rv > 0 ? rv : null;\r\n },\r\n getNewMarginInUSDxM3: function () {\r\n var rv = (this.newGrossMarginAbs / self.exchangeRate.fxRate) * 1000;\r\n return rv > 0 ? rv : null;\r\n }\r\n }\r\n\r\n for (var i = 0; i < prices.length; i++) {\r\n _.assign(prices[i], extendedPrice);\r\n }\r\n\r\n }\r\n\r\n function flattenChildren(prices) {\r\n\r\n prices = _.orderBy(prices, function (p) {\r\n if (p.newImpact)\r\n return Math.abs(p.newImpact);\r\n if (p.suggestedImpact)\r\n return Math.abs(p.suggestedImpact);\r\n\r\n return 0;\r\n }, ['desc']);\r\n\r\n var flattenPrices = [];\r\n var index = 0;\r\n\r\n for (var i = 0; i < prices.length; i++) {\r\n\r\n var price = prices[i];\r\n price.index = index++;\r\n price.showChilds = false;\r\n flattenPrices.push(price);\r\n\r\n for (var j = 0; j < prices[i].children.length; j++) {\r\n\r\n var childPrice = prices[i].children[j];\r\n childPrice.index = index++;\r\n childPrice.showMe = false;\r\n childPrice.parentPriceId = price.priceId;\r\n childPrice.parent = price;\r\n\r\n flattenPrices.push(childPrice);\r\n }\r\n\r\n }\r\n\r\n return flattenPrices;\r\n }\r\n\r\n function closeAllPopovers() {\r\n self.allPrices.forEach(function (p) {\r\n if (!p.hoveringPopover)\r\n p.popOverIsOpen = false;\r\n });\r\n }\r\n\r\n function getItemsToSave() {\r\n var itemsToSave = [];\r\n\r\n //Agregamos los items seleccionados que tengan un Nuevo Precio distinto al precio actual o un \r\n angular.forEach(self.allPrices, function (price) {\r\n \r\n if (price.dirty) {\r\n if ((price.newPrice && price.newPrice != 0 && price.newPrice != price._Price)\r\n || (price.priceListIsBase && price.priceIsFirst && price.newPrice && price.newPrice != 0) //esta condicion es para permitir aceptar sugerencias para primer registro de precio que ingresa a prisma.\r\n || (price.newValidFrom && price.newValidFrom != price.validFrom)\r\n || (price.newValidFrom && price.newValidFrom != price.validFrom)) {\r\n itemsToSave.push(price);\r\n }\r\n }\r\n });\r\n\r\n return itemsToSave;\r\n }\r\n\r\n function saveNewPrices(alertIfNochangesToSave) {\r\n\r\n \r\n\r\n var itemsToSave = getItemsToSave();\r\n\r\n var newPrices = getNewPricesToSaveOrEndorse(itemsToSave, false);\r\n\r\n if (itemsToSave.length > 0) {\r\n\r\n angular.forEach(newPrices, function (price) {\r\n if (price.parent)\r\n delete price.parent;\r\n });\r\n return priceService.decisions.saveNewPrices($stateParams.categoryId, newPrices);\r\n }\r\n else if (alertIfNochangesToSave) {\r\n $timeout(function () {\r\n swal(translations.Attention, translations.NoChangesWereRecorded, \"warning\");\r\n }, 500);\r\n }\r\n }\r\n\r\n function getNewPricesToSaveOrEndorse(itemsToSave, endorse) {\r\n\r\n var newPrices = [];\r\n\r\n if (itemsToSave.length > 0) {\r\n //Como usamos este mismo control para endosar precios tenemos que identificar que acci�n estamos llevando a cabo para pasarsela al objeto que se va a guardar\r\n //2 = Endoso, 1 = Guardado Regular\r\n var priceDecisionAction = endorse ? 2 : 1;\r\n\r\n newPrices = _.map(itemsToSave, function (x) {\r\n return {\r\n priceId: x.priceId,\r\n itemId: x.itemId,\r\n salesUnitOfMeasureId: x.salesUnitOfMeasureId,\r\n priceListId: x.priceListId,\r\n _Price: x._Price,\r\n validFrom: x.validFrom,\r\n validTo: x.validTo,\r\n newPrice: x.newPrice,\r\n newValidFrom: x.newValidFrom,\r\n newValidTo: x.newValidTo,\r\n status: x.status,\r\n suggestedPrice: x.suggestedPrice,\r\n priceSuggestionId: x.priceSuggestionId,\r\n priceDecisionAction: priceDecisionAction,\r\n minMargin: x.minMargin,\r\n maxMargin: x.maxMargin,\r\n minVariation: x.minVariation,\r\n maxVariation: x.maxVariation,\r\n significantVariation: x.significantVariation,\r\n significantVariationInMargin: x.significantVariationInMargin,\r\n parentRuleItemId: x.parentRuleItemId,\r\n parentRuleZoneId: x.parentRuleZoneId,\r\n mainItemId: x.mainItemId,\r\n priceListIsBase: x.priceListIsBase,\r\n priceIsFirst: x.priceIsFirst,\r\n mainPriceListId: x.mainPriceListId,\r\n children: _.map(x.children, function (child) {\r\n return {\r\n priceId: child.priceId,\r\n itemId: child.itemId,\r\n salesUnitOfMeasureId: child.salesUnitOfMeasureId,\r\n priceListId: child.priceListId,\r\n _Price: child._Price,\r\n validFrom: child.validFrom,\r\n validTo: child.validTo,\r\n newPrice: child.newPrice,\r\n newValidFrom: child.newValidFrom,\r\n newValidTo: child.newValidTo,\r\n status: child.status,\r\n suggestedPrice: child.suggestedPrice,\r\n priceSuggestionId: child.priceSuggestionId,\r\n priceDecisionAction: child.priceDecisionAction,\r\n minMargin: child.minMargin,\r\n maxMargin: child.maxMargin,\r\n minVariation: child.minVariation,\r\n maxVariation: child.maxVariation,\r\n significantVariation: child.significantVariation,\r\n significantVariationInMargin: child.significantVariationInMargin,\r\n parentRuleItemId: child.parentRuleItemId,\r\n parentRuleZoneId: child.parentRuleZoneId,\r\n mainItemId: child.mainItemId,\r\n priceListIsBase: child.priceListIsBase,\r\n priceIsFirst: child.priceIsFirst,\r\n mainPriceListId: child.mainPriceListId\r\n }\r\n })\r\n }\r\n });\r\n }\r\n\r\n return newPrices;\r\n }\r\n\r\n function onFilterChanged() {\r\n $timeout(function () {\r\n //$('.tab-row').hide()\r\n $('.tab-row')\r\n .children('td')\r\n .animate({ paddingTop: 0, paddingBottom: 0 }, 0)\r\n .children()\r\n .slideUp(0, function () { $('.tab-row').hide() });\r\n }, 0);\r\n }\r\n\r\n\r\n\r\n /***Fin Nuevas Funciones****/\r\n\r\n\r\n\r\n function startProgress() {\r\n self.busy = 0;\r\n return $interval(function () { self.busy += 0.05; }, 250, 16);\r\n }\r\n\r\n function stopProgress(interval) {\r\n $interval.cancel(interval);\r\n self.busy = 0.95;\r\n $timeout(function () { self.busy = false; }, 500);\r\n }\r\n\r\n function cellClicked(cell) {\r\n if (cell.colDef.field == \"competitorsPrice\") {\r\n if (cell.data != null)\r\n $state.go('prices.priceMap', { itemId: cell.data.itemId, priceListId: cell.data.priceListId });\r\n }\r\n else if (cell.colDef.field == \"overlappingPromotions\") {\r\n if (cell.data != null)\r\n self.showOverlaps(cell.data.overlappingPromotions);\r\n }\r\n }\r\n\r\n function rowSelected(event) {\r\n if (event.node.selected) {\r\n var data = event.node.data;\r\n\r\n if (data.suggestedPrice && (data.newPrice == null || data.newPrice == '' || data.newPrice == 0)) {\r\n\r\n changePrice(data.suggestedPrice, event.node);\r\n } else if (data.suggestedPrice) {\r\n self.numberOfSuggestionsAccepted++;\r\n self.percentageOfAcceptedSuggestions = self.numberOfSuggestionsAccepted > 0 ? Math.round((self.numberOfSuggestionsAccepted / self.numberOfSuggestions) * 10000) / 10000 : 0;\r\n }\r\n }\r\n else {\r\n if (!event.node.data.hasNewPriceFromDb)\r\n changePrice(null, event.node);\r\n else if (event.node.data.suggestedPrice) {\r\n self.numberOfSuggestionsAccepted--;\r\n self.percentageOfAcceptedSuggestions = self.numberOfSuggestionsAccepted > 0 ? Math.round((self.numberOfSuggestionsAccepted / self.numberOfSuggestions) * 10000) / 10000 : 0;\r\n }\r\n }\r\n }\r\n\r\n function marginGuidelinesAlert(message) {\r\n changePriceAfterGuidelineCheck(changePriceNewPrice, changePriceRowNode);\r\n\r\n //swal({\r\n // title: \"Esta seguro?\",\r\n // text: message,\r\n // type: \"warning\",\r\n // showCancelButton: true,\r\n // confirmButtonColor: \"#1AB394\",\r\n // confirmButtonText: \"Continuar\",\r\n // cancelButtonText: \"Cancelar\",\r\n // closeOnConfirm: false,\r\n // closeOnCancel: false\r\n //},\r\n // function (isConfirm) {\r\n // if (isConfirm) {\r\n // swal(\"Confirmado\", \"Se cambio el precio (requerira endoso)\", \"success\");\r\n // changePriceAfterGuidelineCheck(changePriceNewPrice, changePriceRowNode);\r\n // } else {\r\n // swal(\"Cancelado\", \"Se conservo el precio anterior\", \"error\");\r\n // self.gridOptions.api.refreshRows([changePriceRowNode]);\r\n // }\r\n // });\r\n }\r\n\r\n function markAsReviewed(priceType, ignorePendingSuggestions) {\r\n\r\n var subCategory = $stateParams.subcategory != '' ? $stateParams.subcategory : ' ';\r\n\r\n priceService.decisions.markAsReviewed($stateParams.categoryId, $stateParams.categoryGroup, $stateParams.category, subCategory, priceType, ignorePendingSuggestions)\r\n .then(function () {\r\n swal(translations.ConfirmedSwal, translations.ConfirmedSwalSubtitle, \"success\");\r\n loadData();\r\n\r\n }).catch(function (fallback) {\r\n console.log(fallback);\r\n swal(translations.ErrorTitleSwal, translations.ErrorWhenWantingToMarkThisCategoryAsRevised, \"error\");\r\n });\r\n }\r\n\r\n function resetKPIs() {\r\n changePriceNewImpact = 0;\r\n self.numberOfNewPrices = 0;\r\n self.averagePriceChanges = 0;\r\n self.averagePriceNewVsSuggestedChanges = 0;\r\n self.newImpact = 0;\r\n self.newImpactShare = 0;\r\n self.percentageOfChanges = 0;\r\n self.percentageOfChangesVsSuggested = 0;\r\n self.numberOfSuggestionsAccepted = 0;\r\n self.suggestedImpact = 0;\r\n self.categoryMargin = 0;\r\n self.salesWithCurrentPrices = 0;\r\n self.salesWithSuggestedPrices = 0;\r\n self.numberOfSuggestions = 0;\r\n\r\n self.salesWithNewPrices = 0;\r\n\r\n self.suggestedImpactShare = 0;\r\n\r\n }\r\n\r\n\r\n //$(window).scroll(function () {\r\n // if ($(window).scrollTop() + $(window).height() > ($(document).height() * 0.95)) {\r\n // if (pageLoaded) {\r\n // $timeout(function () {\r\n // self.pageNumber++;\r\n // }, 0)\r\n // }\r\n // }\r\n //});\r\n\r\n self.totalFilteredPrices = self.allPrices.length;\r\n\r\n self.next = function () {\r\n if (pageLoaded) {\r\n $timeout(function () {\r\n if (self.pageNumber + 1 < self.numberOfPages())\r\n self.pageNumber++;\r\n }, 0)\r\n }\r\n }\r\n\r\n self.previous = function () {\r\n if (pageLoaded) {\r\n $timeout(function () {\r\n if (self.pageNumber > 0)\r\n self.pageNumber--;\r\n }, 0)\r\n }\r\n }\r\n\r\n\r\n self.numberOfPages = function () {\r\n return Math.ceil(self.totalFilteredPrices / self.pageSize);\r\n }\r\n\r\n\r\n self.isLoadingPrices = false;\r\n\r\n function loadData() {\r\n\r\n self.isLoadingPrices = true;\r\n\r\n resetKPIs();\r\n\r\n priceService.exchangeRates.getCurrent().then(rate => self.exchangeRate = rate);\r\n\r\n\r\n priceService.decisions.getPrices($stateParams.categoryId, self.isEndorse, 0)\r\n .then(function (prices) {\r\n self.isLoadingPrices = false;\r\n \r\n self.allPrices = flattenChildren(prices);\r\n self.totalFilteredPrices = self.allPrices.length;\r\n\r\n //enriquese los dtos con funcionalidad\r\n extendPriceObjects(self.allPrices);\r\n\r\n //actualizo los contadores de los filters\r\n updateFilterCounters();\r\n\r\n //traigo las zonas de precios\r\n priceService.pricelists.getPriceLists()\r\n .then(function (pricelists) {\r\n self.pricelists = pricelists;\r\n\r\n var markets = pricelists.map(x => { return { marketId: x.marketId, market: x.market } })\r\n self.markets = ian.removeDuplicates(markets, 'marketId');\r\n\r\n var brands = pricelists.map(x => { return { brandId: x.brandId, brand: x.brand } })\r\n self.brands = ian.removeDuplicates(brands, 'brandId');\r\n\r\n var regions = pricelists.map(x => { return { regionId: x.regionId, region: x.region } })\r\n self.regions = ian.removeDuplicates(regions, 'regionId');\r\n\r\n //agrego datos de segmentacion de zona a cada price\r\n pricelists.forEach(priceList => {\r\n var prices = self.allPrices.filter(price => price.priceListId == priceList.id);\r\n prices.forEach(p => {\r\n p.brandId = priceList.brandId;\r\n p.regionId = priceList.regionId;\r\n p.marketId = priceList.marketId;\r\n });\r\n });\r\n });\r\n\r\n\r\n //TODO: eliminar esta linea y ver de donde salen los issues realmente.\r\n //prices[2].issues = 3;\r\n //prices[3].status = 2;\r\n //prices[3].newPrice = 2500;\r\n //prices[3].suggestedPrice = null;\r\n\r\n //self.gridOptions.api.setRowData(prices);\r\n\r\n if (prices.length > 0) {\r\n\r\n self.category = prices[0].category;\r\n\r\n //suggestedImpact\r\n angular.forEach(self.allPrices, function (price) {\r\n\r\n //agrego algunos extra al dto\r\n price.hasNewPriceFromDb = price.newPrice ? true : false;\r\n price.outOfGuidelines = false;\r\n\r\n if (price.tagIds) {\r\n let priceTagIds = price.tagIds.split(',');\r\n priceTagIds = priceTagIds.map(function (x) { return parseInt(x.trim()); });\r\n price.itemTags = self.tags.filter(function (x) { return priceTagIds.includes(x.id) });\r\n }\r\n\r\n //Sumarizo\r\n self.suggestedImpact += price.suggestedImpact;\r\n self.categoryMargin += price.grossMarginAbs * price.units;\r\n self.salesWithCurrentPrices += price._Price * price.units;\r\n\r\n if (price.newPrice > 0) {\r\n self.salesWithNewPrices += price.newPrice * price.units;\r\n self.numberOfNewPrices++;\r\n }\r\n else\r\n self.salesWithNewPrices += price._Price * price.units;\r\n\r\n if (price.suggestedPrice > 0)\r\n self.salesWithSuggestedPrices += price.suggestedPrice * price.units;\r\n else\r\n self.salesWithSuggestedPrices += price._Price * price.units;\r\n\r\n if (price.suggestedPrice > 0)\r\n self.numberOfSuggestions++;\r\n\r\n self.newImpact += price.newImpact;\r\n\r\n });\r\n\r\n self.newImpactShare = self.newImpact / self.categoryMargin; //Impacto sobre total margen de la categoria\r\n self.suggestedImpactShare = self.suggestedImpact / self.categoryMargin;\r\n\r\n self.averagePriceChanges = Math.round((self.salesWithNewPrices / self.salesWithCurrentPrices - 1) * 10000) / 10000;\r\n self.averagePriceNewVsSuggestedChanges = Math.round((self.salesWithNewPrices / self.salesWithSuggestedPrices - 1) * 100) / 100;\r\n }\r\n\r\n //loadChartData();\r\n\r\n\r\n $timeout(function () {\r\n //$('.tab-row').hide()\r\n $('.tab-row')\r\n .children('td')\r\n .animate({ paddingTop: 0, paddingBottom: 0 }, 0)\r\n .children()\r\n .slideUp(0, function () { $('.tab-row').hide() });\r\n }, 0);\r\n\r\n pageLoaded = true;\r\n });\r\n\r\n //FILTROS DE ZONA GEOGRAFICA PARA LAREBAJA\r\n if (self.companyCode == 'LaRebaja') {\r\n adminService.stores.getStoresZoning()\r\n .then(function (zoning) {\r\n self.filters.zoning = zoning;\r\n self.departments = zoning.map(x => { return { departmentId: x.id, department: x.name } })\r\n\r\n angular.forEach(zoning, function (dep) {\r\n angular.forEach(dep.children, function (city) {\r\n angular.forEach(city.children, function (sec) {\r\n self.sectors.push({ sectorId: sec.id, sector: sec.name });\r\n angular.forEach(sec.children, function (store) {\r\n self.stores.push({ storeId: store.id, store: store.name });\r\n });\r\n });\r\n });\r\n });\r\n\r\n });\r\n }\r\n }\r\n \r\n\r\n function loadTags() {\r\n adminService.tags.getTags()\r\n .then(function (tags) {\r\n self.tags = tags;\r\n });\r\n adminService.tags.getTagGroups()\r\n .then(function (tagGroups) {\r\n self.groupTag = tagGroups;\r\n })\r\n }\r\n\r\n function getDataFromCategorySummary() {\r\n //Seteo el titulo tipo Breadcrumb\r\n var categoryGroup = decodeURIComponent($stateParams.categoryGroup.replace(/-/g, \" \").replace(/_/g, \"\\/\"));\r\n var category = decodeURIComponent($stateParams.category.replace(/-/g, \" \").replace(/_/g, \"\\/\"));\r\n var subcategory = decodeURIComponent($stateParams.subcategory.replace(/-/g, \" \").replace(/_/g, \"\\/\"));\r\n\r\n self.title = categoryGroup\r\n if (category != '') {\r\n self.title += ' / ' + category;\r\n if (subcategory != '') {\r\n self.title += ' / ' + subcategory;\r\n }\r\n }\r\n }\r\n\r\n\r\n //Filtros\r\n\r\n self.showFilters = false;\r\n\r\n self.toggleFilters = function () {\r\n\r\n self.showFilters = !self.showFilters;\r\n\r\n if (self.showFilters) {\r\n $timeout(function () {\r\n\r\n $window.onclick = function (event) {\r\n closeFilterWhenClickingOutside(event);\r\n }\r\n }, 100);\r\n } else {\r\n $window.onclick = null;\r\n }\r\n\r\n }\r\n\r\n function closeFilterWhenClickingOutside(event) {\r\n\r\n var clickedElement = event.target;\r\n if (!clickedElement) return;\r\n\r\n var elementClasses = clickedElement.classList;\r\n var clickedOnFilterDiv = elementClasses.contains('isFilter')\r\n || elementClasses.contains('chosen-choice')\r\n || elementClasses.contains('chosen-choices')\r\n || elementClasses.contains('search-field')\r\n || elementClasses.contains('default')\r\n || elementClasses.contains('chosen-container')\r\n || elementClasses.contains('chosen-container')\r\n if (!clickedOnFilterDiv) {\r\n self.closeFilters();\r\n }\r\n\r\n }\r\n\r\n self.closeFilters = function () {\r\n $timeout(function () {\r\n self.showFilters = false;\r\n $window.onclick = null;\r\n });\r\n\r\n }\r\n\r\n self.getFilterClass = function () {\r\n if (self.showFilters == true)\r\n return 'move-right';\r\n else\r\n return '';\r\n }\r\n\r\n //Filtros\r\n\r\n //Barra de seleccion\r\n self.showMultipleSelectionBar = false;\r\n self.totalCheckedPrices = 0;\r\n\r\n self.onCheckboxChanged = function () {\r\n self.totalCheckedPrices = getCheckedPrices().length;\r\n self.showMultipleSelectionBar = self.totalCheckedPrices > 0;\r\n }\r\n\r\n self.showBar = function () {\r\n self.showMultipleSelectionBar = true;\r\n }\r\n\r\n var isClosingBar = false;\r\n self.closeBar = function () {\r\n if (self.showMultipleSelectionBar == true) {\r\n isClosingBar = true;\r\n\r\n getCheckedPrices().forEach(p => p.isChecked = false);\r\n\r\n $timeout(function () {\r\n isClosingBar = false;\r\n self.showMultipleSelectionBar = false;\r\n //$window.onclick = null;\r\n });\r\n }\r\n }\r\n\r\n self.animationCloseBar = function () {\r\n if (isClosingBar == true)\r\n return 'closeFilters';\r\n else\r\n return 'showBarAnimation';\r\n }\r\n //Fin Barra de seleccion\r\n\r\n self.isSimulationActive = false;\r\n\r\n self.stopSimulation = function () {\r\n self.allPrices.filter(p => p.isSimulated).forEach(p => {\r\n p.isSimulated = false;\r\n p.changePrice(null);\r\n });\r\n\r\n self.isSimulationActive = self.allPrices.filter(p => p.isSimulated).length > 0;\r\n }\r\n\r\n self.confirmSimulation = function () {\r\n self.allPrices.forEach(p => p.isSimulated = false);\r\n self.isSimulationActive = self.allPrices.filter(p => p.isSimulated).length > 0;\r\n }\r\n\r\n //Filtro collapse\r\n self.isNavCollapsed = true;\r\n self.isCollapsedHorizontal = false;\r\n self.isCollapsed = true;\r\n self.isStateCollapsed = false;\r\n self.isZoneCollapsed = true;\r\n self.isRegionsCollapsed = true;\r\n self.isMarketsCollapsed = true;\r\n self.isBrandsCollapsed = true;\r\n self.isDepartmentsCollapsed = true;\r\n self.isSectorsCollapsed = true;\r\n self.isStoresCollapsed = true;\r\n self.isPriceTypeCollapsed = true;\r\n self.isActionCollapsed = true;\r\n self.isSituationCollapsed = true;\r\n\r\n //Filtro collapse\r\n var translations = null;\r\n self.filters = {};\r\n\r\n $translate([\"All\", \"Suggested\", \"Endorsed\", \"Pending\", 'Regular', 'Competitive', 'Decrease', 'Increase', 'NewPrices', 'Current', 'Basket', 'Promotion', 'Own', \"StrongFalls\", \"StrongRises\", \"DepressedMargins\", \"HighMargins\", \"LittleSignificantChanges\", \"SuggestedNotRespected\", \"Overlaps\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n self.filters = {\r\n status: [\r\n { id: 'All', name: translations.All, checked: true, count: 0 },\r\n { id: 'Suggested', name: translations.Suggested, checked: false, count: 0 },\r\n { id: 'Pending', name: translations.Pending, checked: false, count: 0 },\r\n { id: 'Endorsed', name: translations.Endorsed, checked: false, count: 0 }\r\n ],\r\n priceLists: [],\r\n brands: [],\r\n regions: [],\r\n markets: [],\r\n departments: [],\r\n sectors: [],\r\n stores: [],\r\n zoning: [],\r\n priceTypes: [\r\n { id: 'All', name: translations.All, value: 0, checked: true, count: 0 },\r\n { id: 'Regular', name: translations.Regular, value: 6, checked: false, count: 0 },\r\n { id: 'Competitive', name: translations.Competitive, value: 5, checked: false, count: 0 },\r\n ],\r\n actions: [\r\n { id: 'All', name: translations.All, value: 0, checked: true, count: 0 },\r\n { id: 'Decrease', name: translations.Decrease, value: 1, checked: false, count: 0 },\r\n { id: 'Increase', name: translations.Increase, value: 2, checked: false, count: 0 },\r\n ],\r\n situations: [\r\n { name: translations.All, value: 0, checked: true, count: 0 },\r\n { name: translations.NewPrices, value: 1, checked: false, count: 0 },\r\n { name: translations.StrongFalls, value: 2, checked: false, count: 0 },\r\n { name: translations.StrongRises, value: 3, checked: false, count: 0 },\r\n { name: translations.DepressedMargins, value: 4, checked: false, count: 0 },\r\n { name: translations.HighMargins, value: 5, checked: false, count: 0 },\r\n { name: translations.LittleSignificantChanges, value: 6, checked: false, count: 0 },\r\n { name: translations.SuggestedNotRespected, value: 7, checked: false, count: 0 },\r\n { name: translations.Overlaps, value: 8, checked: false, count: 0 },\r\n ],\r\n countStatus: function () {\r\n var c = 0;\r\n angular.forEach(this.status, function (sf) { if (sf.checked === true) c++; });\r\n return c;\r\n },\r\n countPriceLists: function () {\r\n return this.priceLists.length;\r\n },\r\n countPriceTypes: function () {\r\n var c = 0;\r\n angular.forEach(this.priceTypes, function (pt) { if (pt.checked === true) c++; });\r\n return c;\r\n },\r\n countActions: function () {\r\n var c = 0;\r\n angular.forEach(this.actions, function (a) { if (a.checked === true) c++; });\r\n return c;\r\n },\r\n countSituations: function () {\r\n var c = 0;\r\n angular.forEach(this.situations, function (s) { if (s.checked === true) c++; });\r\n return c;\r\n }\r\n }\r\n });\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n priceService.getPriceTypes().then(\r\n function (priceTypes) {\r\n self.priceTypes = priceTypes;\r\n });\r\n\r\n $translate([\"AlertWillLoseChanges\", \"PricesOfThisCategoryAsRevised\", \"CompetitionPricesOfThisCategoryAsRevised\", \"NormalPricesOfThisCategoryAsRevised\", \"DiscardConfirmTitle\", \"ContinueSwal\", \"CancelSwal\",\r\n \"PricesOfThisCategoryAsRevisedPartial\", \"CompetitionPricesOfThisCategoryAsRevisedPartial\", \"NormalPricesOfThisCategoryAsRevisedPartial\",\r\n , \"ErrorTitleSwal\", \"ErrorSwalSubtitle\", \"IgnoreSelectedSuggestions\", \"ConfirmedSwal\", \"ConfirmedIgnoreSelectedSuggestions\", \"Attention\", \"NoChangesWereRecorded\", \"EndorseTheModifiedPrices\"\r\n , \"ConfirmedEndorseTheSelectedPrices\", \"ErrorWhenWantingEndorsePrices\", \"RejectionComment\", \"RejectionCommentSubtitle\", \"RejectedItems\", \"RejectedItemsSubtitle\", \"TheFollowingChangesWillBeSaved\"\r\n , \"PriceChangesOp\", \"IgnoredSuggestionsOp\", \"EndorsedPricesOp\", \"RejectedPricesOp\", \"ConfirmedSwalSubtitle\", \"SuggestionTooltip\", \"CurrentTooltip\", \"NewTooltip\", \"EndorsedTooltip\", \"ErrorWhenWantingToMarkThisCategoryAsRevised\", \"UpdateDates\", \"UpdateDatesSubtitleOp1\", \"UpdateDatesSubtitleOp2\"\r\n , \"NewPriceHasBeenRejected\", \"GoToTheAuditTab\", \"PriceUpdateConfirmTitle\", \"PriceUpdateConfirmText\", \"ValidationSwalSubtitle\", \"Success\", \"DoYouWishToIgnorePendingSuggestions\", \"Yes\", \"HasBeenSuccessfullySavedSwal\", \"NewTagGroup\"\r\n , \"Pr_Decisions_SimulationWarningOnSave_Title\", \"Pr_Decisions_SimulationWarningOnSave_Desc\"\r\n ])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n\r\n //Load data for title and endorsement\r\n getDataFromCategorySummary();\r\n\r\n //load data\r\n loadData();\r\n loadTags();\r\n\r\n });\r\n }\r\n\r\n\r\n init();\r\n\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"UsersCtrl\", function ($scope, adminService, authService, $translate, $timeout, $stateParams, $filter, ngDialog) {\r\n var self = this;\r\n\r\n var self = this;\r\n\r\n self.readOnly = authService.hasPermission('admin_security_readOnly');\r\n\r\n //TRADUCCIONES JS\r\n var assignedStoresSwalTitle = \"\";\r\n var assignedStoresSwalSubTitle = \"\";\r\n\r\n\r\n translate = function () {\r\n\r\n //Llamar por cada traduccion\r\n $translate(\"AssignedStoresSwalTitle\")\r\n .then(function (translation) {\r\n assignedStoresSwalTitle = translation;\r\n return translation;\r\n });\r\n $translate(\"AssignedStoresSwalSubTitle\")\r\n .then(function (translation) {\r\n assignedStoresSwalSubTitle = translation;\r\n return translation;\r\n });\r\n }\r\n\r\n translate();\r\n\r\n\r\n self.isLoading = true;\r\n self.isEdit = false;\r\n self.users = [];\r\n self.roles = [];\r\n self.stores = [];\r\n self.categories = [];\r\n self.search = '';\r\n self.searchStore = '';\r\n self.searchCategory = '';\r\n\r\n\r\n self.showChangeRoleDialog = function (user) {\r\n\r\n self.editUser = user;\r\n\r\n ngDialog.open({\r\n template: 'changeRoleDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.showChangePasswordDialog = function (user) {\r\n\r\n self.editUser = user;\r\n\r\n ngDialog.open({\r\n template: 'changePasswordDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.showAssignStoresDialog = function (user) {\r\n\r\n self.editUser = user;\r\n\r\n //marco las tiendas que el usuario ya tiene\r\n angular.forEach(self.stores, function (store) {\r\n store.selected = self.userHasStore(self.editUser, store);\r\n });\r\n\r\n self.searchStore = '';\r\n\r\n ngDialog.open({\r\n template: 'assignStoresDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.showEditUserDialog = function (user) {\r\n if (user) {\r\n self.isEdit = true;\r\n self.editUser = user;\r\n }\r\n else {\r\n self.isEdit = false;\r\n self.editUser = {\r\n email: '',\r\n firstname: '',\r\n lastname: '',\r\n password: '',\r\n passwordConfirm: ''\r\n };\r\n }\r\n\r\n ngDialog.open({\r\n template: 'editUserDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.showAssignCategoriesDialog = function (user) {\r\n\r\n self.editUser = user;\r\n\r\n //marco las categorias que el usuario ya tiene\r\n angular.forEach(self.categories, function (cat) {\r\n cat.selected = self.userHasCategory(self.editUser, cat);\r\n });\r\n\r\n self.searchCategory = '';\r\n\r\n ngDialog.open({\r\n template: 'assignCategoriesDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom ngdialog-categories',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.userHasStore = function (user, store) {\r\n\r\n var hasStore = false;\r\n\r\n angular.forEach(user.stores, function (userStoreId) {\r\n if (store.id == userStoreId)\r\n hasStore = true;\r\n });\r\n\r\n return hasStore;\r\n }\r\n\r\n self.userHasCategory = function (user, cat) {\r\n\r\n var hasCat = false;\r\n\r\n angular.forEach(user.categories, function (userCatId) {\r\n if (cat.id == userCatId)\r\n hasCat = true;\r\n });\r\n\r\n return hasCat;\r\n }\r\n\r\n self.disableUser = function (user) {\r\n swal({\r\n title: \"Ingrese una justificación\",\r\n text: \"Debe tener 10 caracteres como mínimo\",\r\n type: \"input\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (inputValue) {\r\n if (inputValue === false) return;\r\n if (inputValue.trim().length > 9) {\r\n swal({\r\n title: ian.format('Esta seguro que desea {0} a {1}? ', user.role == 'Disabled' ? 'Habilitar' : 'Deshabilitar', user.email),\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#DD6B55\",\r\n confirmButtonText: user.role == 'Disabled' ? 'Habilitar' : 'Deshabilitar',\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n var disableUserDto = {\r\n userId: user.id,\r\n username: user.email,\r\n observations: inputValue\r\n }\r\n\r\n adminService.security.disableUser(disableUserDto).then(function () {\r\n ngDialog.close();\r\n\r\n self.isLoading = true;\r\n adminService.security.getUsers().then(function (users) {\r\n self.users = users;\r\n self.isLoading = false;\r\n });\r\n\r\n swal(\r\n ian.format('Usuario {0}', user.role == 'Disabled' ? 'Habilitado' : 'Deshabilitado'),\r\n ian.format('se ha {0} correctamente a {1}', user.role == 'Disabled' ? 'habilitado' : 'deshabilitado', user.email),\r\n 'success');\r\n });\r\n\r\n }\r\n });\r\n }\r\n else swal.showInputError('Minimo 10 caracteres');\r\n\r\n });\r\n }\r\n\r\n self.changeUserRole = function (newRole) {\r\n swal({\r\n title: \"Ingrese una justificación\",\r\n text: \"Debe tener 10 caracteres como mínimo\",\r\n type: \"input\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (inputValue) {\r\n if (inputValue === false) return;\r\n if (inputValue.trim().length > 9) {\r\n swal({\r\n title: \"¿Confirma los cambios?\",\r\n text: \"Se van cambiar el Rol del usuario\",\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n var changeRoleDto = {\r\n userId: self.editUser.id,\r\n oldRole: self.editUser.role,\r\n newRole: newRole.name,\r\n Observations: inputValue\r\n }\r\n\r\n adminService.security.changeUserRole(changeRoleDto).then(function () {\r\n self.editUser.role = newRole.name;\r\n self.newRole = null;\r\n ngDialog.close();\r\n swal('Se han guardado los cambios', 'Se cambio exitosamente el rol del usuario', 'success');\r\n });\r\n\r\n }\r\n });\r\n }\r\n else swal.showInputError('Minimo 10 caracteres');\r\n\r\n });\r\n \r\n\r\n\r\n }\r\n\r\n self.resetUserPassword = function (newPassword) {\r\n\r\n swal({\r\n title: \"Ingrese una justificación\",\r\n text: \"Debe tener 10 caracteres como mínimo\",\r\n type: \"input\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (inputValue) {\r\n if (inputValue === false) return;\r\n if (inputValue.trim().length > 9) {\r\n swal({\r\n title: \"¿Confirma los cambios?\",\r\n text: \"Se van resetear el password del usuario\",\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n var resetUserPasswordDto = {\r\n userId: self.editUser.id,\r\n newPassword: newPassword,\r\n observations: inputValue\r\n }\r\n\r\n adminService.security.resetUserPassword(resetUserPasswordDto).then(function () {\r\n ngDialog.close();\r\n swal('Password Reseteado', 'Se reseteo correctamente el password del usuario', 'success');\r\n });\r\n\r\n }\r\n });\r\n }\r\n else swal.showInputError('Minimo 10 caracteres');\r\n\r\n });\r\n \r\n\r\n\r\n\r\n }\r\n\r\n self.assignStoresToUser = function () {\r\n swal({\r\n title: \"Ingrese una justificación\",\r\n text: \"Debe tener 10 caracteres como mínimo\",\r\n type: \"input\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (inputValue) {\r\n if (inputValue === false) return;\r\n if (inputValue.trim().length > 9) {\r\n swal({\r\n title: \"¿Confirma los cambios?\",\r\n text: \"Se van a guardar los cambios en las tiendas del usuario\",\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n var assignStoresToUserDto = {\r\n userId: self.editUser.id,\r\n stores: [],\r\n Observations: inputValue\r\n }\r\n\r\n angular.forEach(self.stores, function (store) {\r\n if (store.selected)\r\n assignStoresToUserDto.stores.push(store.id);\r\n });\r\n\r\n adminService.security.assignStoresToUser(assignStoresToUserDto).then(function () {\r\n ngDialog.close();\r\n\r\n self.editUser.stores = [];\r\n angular.forEach(self.stores, function (store) {\r\n if (store.selected)\r\n self.editUser.stores.push(store.id);\r\n });\r\n\r\n swal(assignedStoresSwalTitle, assignedStoresSwalSubTitle, 'success');\r\n });\r\n }\r\n });\r\n }\r\n else swal.showInputError('Minimo 10 caracteres');\r\n\r\n });\r\n \r\n\r\n }\r\n\r\n self.assignCategoriesToUser = function () {\r\n swal({\r\n title: \"Ingrese una justificación\",\r\n text: \"Debe tener 10 caracteres como mínimo\",\r\n type: \"input\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (inputValue) {\r\n if (inputValue === false) return;\r\n if (inputValue.trim().length > 9) {\r\n swal({\r\n title: \"¿Confirma los cambios?\",\r\n text: \"Se van cambiar las categorias del usuario\",\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n var assignCategoriesToUserDto = {\r\n userId: self.editUser.id,\r\n categories: [],\r\n Observations: inputValue\r\n }\r\n\r\n angular.forEach(self.categories, function (cat) {\r\n if (cat.selected)\r\n assignCategoriesToUserDto.categories.push(cat.id);\r\n });\r\n\r\n adminService.security.assignCategoriesToUser(assignCategoriesToUserDto).then(function () {\r\n ngDialog.close();\r\n\r\n self.editUser.categories = [];\r\n angular.forEach(self.categories, function (cat) {\r\n if (cat.selected)\r\n self.editUser.categories.push(cat.id);\r\n });\r\n\r\n swal('Categorias Asignadas', 'Se asignaron correctamente las categorias al usuario', 'success');\r\n });\r\n\r\n }\r\n });\r\n }\r\n else swal.showInputError('Minimo 10 caracteres');\r\n\r\n });\r\n\r\n\r\n }\r\n\r\n self.saveUser = function () {\r\n if (!self.isEdit) {\r\n if (self.editUser.password != self.editUser.passwordConfirm) {\r\n swal('Datos Invalidos', 'La contraseña no coincide con la confirmacion', 'error');\r\n return;\r\n }\r\n\r\n if (!self.editUser.email || self.editUser.email.indexOf('@') == -1) {\r\n swal('Datos Invalidos', 'El email es invalido', 'error');\r\n return;\r\n }\r\n\r\n if (!self.editUser.password.match(/[0-9]/g) || !self.editUser.password.match(/[a-zA-Z]/g)) {\r\n swal('Error', 'La contraseña debe tener al menos un numero y una letra', 'error');\r\n return;\r\n }\r\n\r\n if (self.editUser.password.length < 6) {\r\n swal('Error', 'La contraseña debe tener al menos 6 caracteres', 'error');\r\n return;\r\n }\r\n\r\n\r\n swal({\r\n title: \"Ingrese una justificación\",\r\n text: \"Debe tener 10 caracteres como mínimo\",\r\n type: \"input\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (inputValue) {\r\n if (inputValue === false) return;\r\n if (inputValue.trim().length > 9) {\r\n self.observations = inputValue;\r\n doSave();\r\n }\r\n else swal.showInputError('Minimo 10 caracteres');\r\n\r\n });\r\n } else doSave();\r\n\r\n }\r\n\r\n function doSave() {\r\n swal({\r\n title: \"¿Confirma los cambios?\",\r\n text: self.isEdit ? \"Se van los cambios al usuario\" : \"Se va a crear un nuevo usuario\",\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n self.editUser.observations = self.observations;\r\n adminService.security.saveUser(self.editUser).then(function () {\r\n ngDialog.close();\r\n\r\n if (self.isEdit)\r\n swal('Cambios Guardados', 'Se guardaron correctamente los datos del usuario', 'success');\r\n else\r\n swal('Usuario Creado', 'Se ha creado el nuevo usuario en el sistema', 'success');\r\n\r\n //reload\r\n init();\r\n\r\n });\r\n\r\n }\r\n });\r\n }\r\n\r\n self.selectAllStores = function () {\r\n var filteredStores = $filter('filter')(self.stores, self.searchStore);\r\n\r\n var doSelect = undefined;\r\n angular.forEach(filteredStores, function (store) {\r\n if (doSelect == undefined)\r\n doSelect = !store.selected;\r\n\r\n store.selected = doSelect;\r\n });\r\n }\r\n\r\n self.selectAllCategories = function () {\r\n var filteredCategories = $filter('filter')(self.categories, self.searchCategory);\r\n\r\n var doSelect = undefined;\r\n angular.forEach(filteredCategories, function (cat) {\r\n if (doSelect == undefined)\r\n doSelect = !cat.selected;\r\n\r\n cat.selected = doSelect;\r\n });\r\n }\r\n\r\n function init() {\r\n adminService.security.getRoles().then(function (roles) {\r\n self.roles = roles;\r\n\r\n adminService.security.getStores().then(function (stores) {\r\n self.stores = stores;\r\n\r\n adminService.security.getCategories().then(function (categories) {\r\n self.categories = categories;\r\n\r\n adminService.security.getUsers().then(function (users) {\r\n self.users = users;\r\n self.isLoading = false;\r\n });\r\n });\r\n\r\n\r\n });\r\n\r\n });\r\n\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"RolesCtrl\", function ($scope, adminService, authService, $timeout, $stateParams, $filter, ngDialog) {\r\n var self = this;\r\n\r\n self.isLoading = true;\r\n self.roles = [];\r\n self.permissions = [];\r\n self.searchPermission = \"\";\r\n self.readOnly = authService.hasPermission('admin_security_readOnly');\r\n\r\n self.showAssignPermissionsToRole = function (role) {\r\n\r\n self.editRole = role;\r\n\r\n //marco los permisos que el usuario ya tiene\r\n angular.forEach(self.permissions, function (permission) {\r\n permission.selected = self.roleHasPermission(role, permission);\r\n });\r\n\r\n\r\n ngDialog.open({\r\n template: 'assignPerissionsDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.newRole = function () {\r\n swal({\r\n title: \"Ingrese nombre del Rol\",\r\n text: \"Recuerde que luego debera asignarle permisos\",\r\n type: \"input\",\r\n showCancelButton: true,\r\n closeOnConfirm: false,\r\n animation: \"slide-from-top\",\r\n inputPlaceholder: \"Nombre del Rol\"\r\n },\r\n function (inputValue) {\r\n if (inputValue === false) return false;\r\n\r\n if (inputValue.length < 2) {\r\n swal.showInputError(\"El Rol debe tener al menos 2 caracteres\");\r\n return false\r\n }\r\n swal({\r\n title: \"Ingrese una justificación\",\r\n text: \"Debe tener 10 caracteres como mínimo\",\r\n type: \"input\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Guardar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (observations) {\r\n if (observations === false) return;\r\n if (observations.trim().length > 9) {\r\n adminService.security.createRole(inputValue, observations)\r\n .then(function () {\r\n swal(\"Rol Creado\", \"Recordá asignarle los permisos necesarios a: \" + inputValue, \"success\");\r\n init();\r\n }, function () {\r\n swal(\"Error\", \"Ocurrio un error al guardar el rol\", \"error\");\r\n });\r\n }\r\n else swal.showInputError('Minimo 10 caracteres');\r\n\r\n });\r\n\r\n\r\n });\r\n }\r\n\r\n self.roleHasPermission = function (role, permission) {\r\n\r\n var hasPermission = false;\r\n\r\n angular.forEach(role.permissions, function (permissionName) {\r\n if (permission.name == permissionName)\r\n hasPermission = true;\r\n });\r\n\r\n return hasPermission;\r\n }\r\n\r\n self.assignPermissionsToRole = function () {\r\n swal({\r\n title: \"Ingrese una justificación\",\r\n text: \"Debe tener 10 caracteres como mínimo\",\r\n type: \"input\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Guardar\",\r\n cancelButtonText: \"Cancelar\",\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (observations) {\r\n if (observations === false) return;\r\n if (observations.trim().length > 9) {\r\n swal({\r\n title: \"¿Confirma los cambios?\",\r\n text: \"Se van modificar los permisos del Rol\",\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n var assignPermissionsToRoleDto = {\r\n roleId: self.editRole.id,\r\n permissions: [],\r\n observations: observations\r\n }\r\n\r\n angular.forEach(self.permissions, function (permission) {\r\n if (permission.selected)\r\n assignPermissionsToRoleDto.permissions.push(permission.name);\r\n });\r\n\r\n adminService.security.assignPermissionsToRole(assignPermissionsToRoleDto).then(function () {\r\n ngDialog.close();\r\n\r\n self.editRole.permissions = [];\r\n angular.forEach(self.permissions, function (permission) {\r\n if (permission.selected)\r\n self.editRole.permissions.push(permission.name);\r\n });\r\n\r\n swal('Permisos Asignados', 'Se asignaron correctamente los permisos al rol', 'success');\r\n });\r\n\r\n }\r\n });\r\n }\r\n else swal.showInputError('Minimo 10 caracteres');\r\n\r\n });\r\n\r\n }\r\n\r\n self.selectAllPermissions = function () {\r\n var filteredPermissions = $filter('filter')(self.permissions, self.searchPermission);\r\n\r\n var doSelect = undefined;\r\n angular.forEach(filteredPermissions, function (permission) {\r\n if (doSelect == undefined)\r\n doSelect = !permission.selected;\r\n\r\n permission.selected = doSelect;\r\n });\r\n }\r\n\r\n function init() {\r\n\r\n adminService.security.getPermissions().then(function (permissions) {\r\n self.permissions = permissions;\r\n\r\n adminService.security.getRoles().then(function (roles) {\r\n self.roles = roles;\r\n self.isLoading = false;\r\n });\r\n\r\n });\r\n\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"ReportsCtrl\", function ($scope, $timeout, $stateParams, $filter, $window, ngDialog, adminService) {\r\n var self = this;\r\n self.isLoading = true;\r\n self.users = [];\r\n self.roles = [];\r\n self.selectedTable = '';\r\n\r\n self.showPermissionsToRole = function (role) {\r\n self.rolePermissions = role.permissions;\r\n ngDialog.open({\r\n template: 'perissionsDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.downloadExcel = function () {\r\n switch (self.selectedTable) {\r\n case 'users': downloadUsersReport();\r\n break;\r\n case 'roles': downloadRolesReport();\r\n break;\r\n case 'permissions':\r\n $timeout(function () {\r\n location.href = \"../../../assets/files/Permisos.xlsx\";\r\n }, 100);\r\n break;\r\n default:\r\n swal('Seleccione un reporte', '', 'warning');\r\n }\r\n }\r\n\r\n function downloadUsersReport() {\r\n var html = '';\r\n\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '>';\r\n //html += '';\r\n //html += '';\r\n html += '';\r\n html += '';\r\n \r\n angular.forEach(self.users, function (u) {\r\n\r\n html += '';\r\n\r\n });\r\n html += '
IDUsuarioNombreApellidoStatusCreaciónÚltimo AccesoID RolRol
' + u.id +\r\n '' + u.email +\r\n '' + u.firstname +\r\n '' + u.lastname +\r\n '' + (u.role == 'Disabled'? 'Bloqueado' : 'Habilitado') +\r\n '' + u.createdDate +\r\n //'' + u.lastLogin +\r\n //'' + u.rol.Id +\r\n '' + u.role +\r\n '
';\r\n\r\n var exportHref = ExportToExcel(html, 'Pagina1');\r\n $timeout(function () {\r\n location.href = exportHref;\r\n }, 100);\r\n }\r\n\r\n function downloadRolesReport() {\r\n var html = '';\r\n\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n\r\n angular.forEach(self.roles, function (row) {\r\n\r\n html +=\r\n ''+\r\n '';\r\n\r\n });\r\n html += '
IDDescripciónPermisos
' + row.id +\r\n '' + row.name +\r\n //'' + permissionsToString(row.permissions) +\r\n '' + row.permissions.join('|') +\r\n '
';\r\n\r\n var exportHref = ExportToExcel(html, 'Pagina1');\r\n $timeout(function () {\r\n location.href = exportHref;\r\n }, 100);\r\n }\r\n\r\n function permissionsToString(permissions) {\r\n return permissions.map(function (x) { return x.id + ':' + x.name }).join('|');\r\n }\r\n\r\n function ExportToExcel(tableHtml, worksheetName) {\r\n var uri = 'data:application/vnd.ms-excel;base64,',\r\n template = '{table}
',\r\n base64 = function (s) { return $window.btoa(unescape(encodeURIComponent(s))); },\r\n format = function (s, c) { return s.replace(/{(\\w+)}/g, function (m, p) { return c[p]; }) };\r\n\r\n var ctx = { worksheet: worksheetName, table: tableHtml },\r\n href = uri + base64(format(template, ctx));\r\n return href;\r\n }\r\n\r\n function loadData() {\r\n\r\n adminService.security.getUsers().then(function (response) {\r\n self.users = response;\r\n\r\n adminService.security.getRoles().then(function (response) {\r\n self.roles = response;\r\n self.isLoading = false;\r\n\r\n }, function (status) { self.isLoading = false; });\r\n }, function (status) { self.isLoading = false; });\r\n }\r\n\r\n function init() {\r\n loadData();\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"AuditCtrl\", function ($scope, $rootScope, adminService, $translate, $timeout, $stateParams, $filter, ngDialog, $window) {\r\n var self = this;\r\n\r\n self.auditTrails = [];\r\n self.events = [];\r\n self.search = '';\r\n self.eventFilter = '';\r\n self.pageNumber = 1;\r\n self.pageSize = 50;\r\n pageLoaded = false;\r\n\r\n self.toDate = new Date(moment(new Date()).add(1, 'days'));//hasta mañana\r\n\r\n self.fromDate = new Date();//desde hoy\r\n\r\n $(window).scroll(function () {\r\n if ($(window).scrollTop() + $(window).height() > ($(document).height() * 0.95)) {\r\n if (pageLoaded) {\r\n $timeout(function () {\r\n self.pageNumber++;\r\n }, 0)\r\n }\r\n }\r\n });\r\n\r\n self.getEventFormat = function (event) {\r\n var style = {\r\n 'border-radius': '7px',\r\n 'padding': '2px 11px',\r\n 'color': '#fff',\r\n 'font-size': '11px',\r\n 'background-color': '#000'\r\n }\r\n\r\n switch (event) {\r\n case 'SecurityUserPasswordReseted': style['background-color'] = '#753'; break;\r\n case 'SecurityUserCreated': style['background-color'] = '#612'; break;\r\n case 'SecurityUserModified': style['background-color'] = '#147'; break;\r\n case 'SecurityUserDisabled': style['background-color'] = '#a98'; break;\r\n case 'SecurityUserEnabled': style['background-color'] = '#b46'; break;\r\n case 'SecurityUserRoleChanged': style['background-color'] = '#888'; break;\r\n case 'SecurityUserStoresChanged': style['background-color'] = '#346'; break;\r\n case 'SecurityUserCategoriesChanged': style['background-color'] = '#283'; break;\r\n case 'SecurityRoleCreated': style['background-color'] = '#445'; break;\r\n case 'SecurityRolePermissionsChanged': style['background-color'] = '#987'; break;\r\n case 'SecurityLogin': style['background-color'] = '#123'; break;\r\n case 'SecurityLogout': style['background-color'] = '#824'; break;\r\n }\r\n\r\n return style;\r\n\r\n }\r\n\r\n function convertDate(inputFormat) {\r\n function pad(s) { return (s < 10) ? '0' + s : s; }\r\n var d = new Date(inputFormat);\r\n return [d.getFullYear(), pad(d.getMonth() + 1), pad(d.getDate())].join('-');\r\n }\r\n\r\n self.loadData = function () {\r\n\r\n if (self.fromDate && self.toDate) {\r\n\r\n var oneDay = 24 * 60 * 60 * 1000; // hours*minutes*seconds*milliseconds\r\n var diffDays = Math.round(Math.abs((self.fromDate.getTime() - self.toDate.getTime()) / (oneDay)));\r\n\r\n if (diffDays > 30) {\r\n swal('Error', 'Solo puede ver los registros de auditoria de 30 dias', 'error');\r\n return;\r\n }\r\n }\r\n else {\r\n swal('Error', 'Debe seleccionar una fecha desde y una fecha hasta', 'error');\r\n return;\r\n }\r\n\r\n self.isLoading = true;\r\n\r\n var fromDate = convertDate(self.fromDate);\r\n var toDate = convertDate(self.toDate);\r\n\r\n adminService.security.getSecurityAuditTrails(fromDate, toDate).then(function (audits) {\r\n self.auditTrails = audits;\r\n\r\n angular.forEach(self.auditTrails, function (a) {\r\n a.createdDate = $rootScope.convertUTCDateToLocalDate(a.createdDate);\r\n });\r\n\r\n self.events = audits.map(function (audit) {\r\n return audit.event\r\n }).filter(function (value, index, self) {\r\n return self.indexOf(value) === index\r\n });\r\n\r\n self.isLoading = false;\r\n pageLoaded = true;\r\n\r\n });\r\n }\r\n\r\n self.downloadExcel = function () {\r\n var html = '';\r\n\r\n //header\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n\r\n var filteredAudit = self.auditTrails;\r\n if (self.eventFilter != \"\")\r\n filteredAudit = $filter('filter')(filteredAudit, { event: self.eventFilter }, true);\r\n filteredAudit = $filter('filter')(filteredAudit, self.search, false);\r\n angular.forEach(filteredAudit, function (auditTrail) {\r\n html += buildRow(auditTrail);\r\n\r\n });\r\n\r\n html += '
IDUsuarioFechaEventoDescripciónTipoIdentificador
';\r\n\r\n var exportHref = ExportToExcel(html, 'Pagina1');\r\n $timeout(function () {\r\n location.href = exportHref;\r\n }, 100); // trigger download\r\n }\r\n\r\n function buildRow(auditTrail) {\r\n\r\n var html = '';\r\n\r\n html += '' + auditTrail.id +\r\n '' + auditTrail.username +\r\n '' + auditTrail.createdDate +\r\n '' + auditTrail.event +\r\n '' + auditTrail.observations +\r\n '' + auditTrail.objectType +\r\n '' + auditTrail.objectId +\r\n '';\r\n\r\n return html;\r\n }\r\n\r\n function ExportToExcel(tableHtml, worksheetName) {\r\n var uri = 'data:application/vnd.ms-excel;base64,',\r\n template = '{table}
',\r\n base64 = function (s) { return $window.btoa(unescape(encodeURIComponent(s))); },\r\n format = function (s, c) { return s.replace(/{(\\w+)}/g, function (m, p) { return c[p]; }) };\r\n\r\n var ctx = { worksheet: worksheetName, table: tableHtml },\r\n href = uri + base64(format(template, ctx));\r\n return href;\r\n }\r\n\r\n self.filterByEvent = function (a) {\r\n return a.event === self.eventFilter || self.eventFilter === \"\";\r\n }\r\n\r\n function init() {\r\n self.loadData();\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"ItemsToIgnoreCtrl\", function ($scope, adminService, $translate, $timeout, $stateParams, $filter, ngDialog, $window) {\r\n var self = this;\r\n\r\n //self.itemsToIgnore = [];\r\n //self.search = '';\r\n\r\n self.downloadLastReport = function () {\r\n\r\n self.isLoading = true;\r\n adminService.reports.getItemsToIgnoreLastReport().then(function (link) {\r\n self.isLoading = false;\r\n $timeout(function () {\r\n location.href = link;\r\n }, 100); // trigger download\r\n });\r\n\r\n }\r\n\r\n self.exportToExcel = function () {\r\n\r\n self.isLoading = true;\r\n adminService.reports.exportItemsToIgnore().then(function (link) {\r\n self.isLoading = false;\r\n swal({\r\n title: \"Reporte Generado!\",\r\n text: 'Haga click AQUÍ para descargar el archivo',\r\n confirmButtonText: \"Cerrar\",\r\n confirmButtonColor: \"#c2c2c2\",\r\n html: true\r\n });\r\n });\r\n }\r\n\r\n \r\n //function init() {\r\n\r\n // self.isLoading = true;\r\n // adminService.reports.getItemsToIgnore().then(function (itemsToIgnore) {\r\n // self.itemsToIgnore = itemsToIgnore;\r\n // self.isLoading = false;\r\n\r\n // });\r\n //}\r\n\r\n ////Hacer scrolleable la tabla\r\n //$('tbody').scroll(function () {\r\n // $('thead').css(\"left\", -$(\"tbody\").scrollLeft());\r\n // //$('thead th:nth-child(1)').css(\"left\", $(\"tbody\").scrollLeft());\r\n // $('tbody td:nth-child(1)').css(\"left\", $(\"tbody\").scrollLeft());\r\n //});\r\n\r\n\r\n //init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"StoresCtrl\", function ($scope, $state, $translate, adminService, $timeout) {\r\n\r\n //Variables Globales\r\n\r\n var self = this;\r\n\r\n //TRADUCCIONES JS\r\n var enableDisableSwalTitle = \"\";\r\n var updatedStores = \"\";\r\n var errorWhenSavingTheStore = \"\";\r\n \r\n\r\n translate = function () {\r\n\r\n //Llamar por cada traduccion\r\n $translate(\"EnableDisableSwalTitle\")\r\n .then(function (translation) {\r\n enableDisableSwalTitle = translation;\r\n return translation;\r\n });\r\n $translate(\"UpdatedStores\")\r\n .then(function (translation) {\r\n updatedStores = translation;\r\n return translation;\r\n });\r\n $translate(\"ErrorWhenSavingTheStore\")\r\n .then(function (translation) {\r\n errorWhenSavingTheStore = translation;\r\n return translation;\r\n });\r\n\r\n }\r\n translate();\r\n\r\n\r\n\r\n\r\n self.stores = [];\r\n\r\n self.newStore = { id: null, name: '', code: '', isExcluded: false };\r\n\r\n self.search = \"\";\r\n\r\n self.filter = \"\";\r\n\r\n //Funciones\r\n\r\n self.addNew = function () {\r\n $state.go('admin.editStores', { storeId: 0 });\r\n //self.newStore.id = 0;\r\n }\r\n\r\n self.editStore = function (store) {\r\n $state.go('admin.editStores', { storeId: store.id });\r\n //self.newStore = store;\r\n }\r\n\r\n self.disableStore = function (id, excluded, storeCode) {\r\n\r\n var excludedText = excluded ? 'Habilitar' : 'Deshabilitar';\r\n\r\n swal({\r\n title: \"Esta seguro que desea \" + excludedText + \" \" + enableDisableSwalTitle + \"?\",\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n\r\n if (isConfirm) {\r\n adminService.stores.doesStoreCodeExists(storeCode, id).then(function (exists) {\r\n if (exists == true)\r\n swal(\"Error\", \"Ya existe una tienda con el mismo codigo, primero debe deshabilitarla antes de habilitar esta otra\", \"error\");\r\n else {\r\n adminService.stores.deleteStore(id).then(function () {\r\n swal(\"\", updatedStores, \"success\");\r\n loadStores();\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\");\r\n }\r\n else {\r\n swal(\"Error\", errorWhenSavingTheStore, \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.toggleNewStore = function () {\r\n self.newStore.isExcluded = !self.newStore.isExcluded;\r\n\r\n if (self.newStore.isExcludedLiteral == \"Activa\") {\r\n self.newStore.isExcludedLiteral = \"Deshabilitada\";\r\n }\r\n else {\r\n self.newStore.isExcludedLiteral = \"Activa\";\r\n }\r\n\r\n }\r\n\r\n self.cancel = function () {\r\n self.newStore = { id: null, name: '', code: '', isExcluded: false };\r\n loadStores();\r\n }\r\n\r\n self.filterStatus = function (status) {\r\n if (status == \"Activa\") {\r\n self.filter = \"Activa\";\r\n }\r\n else if (status == \"Deshabilitada\") {\r\n self.filter = \"Deshabilitada\";\r\n }\r\n else\r\n self.filter = \"\";\r\n }\r\n\r\n\r\n //Load Data\r\n function loadStores() {\r\n self.isLoading = true;\r\n adminService.stores.getStores(true)\r\n .then(function (stores) {\r\n self.stores = stores;\r\n self.isLoading = false;\r\n });\r\n }\r\n\r\n function init() {\r\n\r\n loadStores();\r\n\r\n }\r\n\r\n init();\r\n });\r\n\r\n\r\n\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"EditStoresCtrl\", function ($scope, $stateParams, $translate, $state, $uibModal, spaceService, adminService, companyJson) {\r\n\r\n //Variables Globales\r\n var self = this;\r\n\r\n //TRADUCCIONES JS\r\n var saveSwalTitle = \"\";\r\n var storeSaved = \"\";\r\n var errorWhenSavingTheStore = \"\";\r\n var validationNameStore = \"\";\r\n var validationTypeStore = \"\";\r\n\r\n translate = function () {\r\n\r\n //Llamar por cada traduccion\r\n $translate(\"SaveSwalTitle\")\r\n .then(function (translation) {\r\n saveSwalTitle = translation;\r\n });\r\n\r\n $translate(\"StoreSaved\")\r\n .then(function (translation) {\r\n storeSaved = translation;\r\n });\r\n $translate(\"ErrorWhenSavingTheStore\")\r\n .then(function (translation) {\r\n errorWhenSavingTheStore = translation;\r\n });\r\n $translate(\"ValidationNameStore\")\r\n .then(function (translation) {\r\n validationNameStore = translation;\r\n });\r\n $translate(\"ValidationTypeStore\")\r\n .then(function (translation) {\r\n validationTypeStore = translation;\r\n });\r\n\r\n $translate(\"Store\")\r\n .then(function (translation) {\r\n var storeType1 = translation;\r\n\r\n $translate(\"StoreAndCD\")\r\n .then(function (translation) {\r\n var storeType3 = translation;\r\n\r\n self.storesTypes = [\r\n {\r\n value: 1,\r\n type: storeType1\r\n },\r\n {\r\n value: 2,\r\n type: \"Centro de distribucion\"\r\n },\r\n {\r\n value: 3,\r\n type: storeType3\r\n }\r\n ]\r\n });\r\n });\r\n\r\n\r\n\r\n }\r\n translate();\r\n\r\n self.stores = [];\r\n\r\n self.setupData = companyJson;\r\n\r\n self.store = { id: $stateParams.storeId, name: '', code: '', isExcluded: false };\r\n self.validationMessage = \"\"\r\n self.layouts = [];\r\n self.clusters = [];\r\n self.priceLists = [];\r\n self.vendors = [];\r\n self.distributionCenters = [];\r\n self.operationsTypes = [\r\n {\r\n value: 1,\r\n type: \"COCO\"\r\n },\r\n {\r\n value: 2,\r\n type: \"COFO\"\r\n },\r\n {\r\n value: 3,\r\n type: \"FOFO\"\r\n },\r\n {\r\n value: 4,\r\n type: \"FOCO\"\r\n }\r\n ];\r\n self.brands = [];\r\n\r\n //self.storesTypes = [];\r\n\r\n self.setupData = companyJson;\r\n\r\n //Funciones\r\n\r\n self.addNew = function () {\r\n self.store.id = 0;\r\n }\r\n\r\n self.editStore = function (store) {\r\n self.store = store;\r\n }\r\n\r\n self.toggleNewStore = function () {\r\n self.store.isExcluded = !self.store.isExcluded;\r\n\r\n if (self.store.isExcludedLiteral == \"Activa\") {\r\n self.store.isExcludedLiteral = \"Deshabilitada\";\r\n }\r\n else {\r\n self.store.isExcludedLiteral = \"Activa\";\r\n }\r\n\r\n }\r\n\r\n self.save = function () {\r\n\r\n var validation = validateBeforeSave();\r\n if (validation) {\r\n swal(\"Error\", validation, \"error\");\r\n return;\r\n }\r\n\r\n adminService.stores.doesStoreCodeExists(self.store.code, self.store.id).then(function (exists) {\r\n existingCodeText = \"\";\r\n if (exists && !self.store.isExcluded)\r\n existingCodeText = \"Este codigo ya existe para otra tienda, si continua se deshabilitara la tienda que posee el codigo ingresado. \";\r\n\r\n swal({\r\n title: saveSwalTitle,\r\n text: existingCodeText + \"Si realizo cambios en las zonas de precios, estos se veran reflejados mañana. Por favor vuelva a revisar las sugerencias para estas zonas.\",\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n\r\n if (!isConfirm) return;\r\n\r\n var data = self.store;\r\n\r\n data.priceLists = [];\r\n data.clusters = [];\r\n\r\n if (companyJson.Navigation.Prices && data.storeType == 1) {\r\n angular.forEach(self.categories, function (category) {\r\n data.priceLists.push({\r\n category3Id: category.id,\r\n priceListId: category.priceListId,\r\n storeId: parseInt(self.store.id)\r\n })\r\n })\r\n }\r\n\r\n if (companyJson.Navigation.Assortment && data.storeType == 1) {\r\n angular.forEach(self.categories, function (category) {\r\n data.clusters.push({\r\n category3Id: category.id,\r\n clusterId: category.clusterId,\r\n storeId: parseInt(self.store.id)\r\n })\r\n })\r\n }\r\n\r\n console.log('data', data);\r\n\r\n adminService.stores.saveStore(data).then(function () {\r\n swal(\"Confirmado\", storeSaved, \"success\");\r\n $state.go('admin.stores');\r\n }),\r\n function () {\r\n swal(\"Error\", errorWhenSavingTheStore, \"error\");\r\n };\r\n });\r\n });\r\n }\r\n\r\n self.cancel = function () {\r\n $state.go('admin.stores');\r\n }\r\n\r\n self.changeSameStore = function (value) {\r\n self.store.isSameStore = value;\r\n\r\n }\r\n\r\n self.toggleSamePriceList = function (value) {\r\n self.samePriceListForEveryCategory = value;\r\n if (value && self.store.priceListId) {\r\n angular.forEach(self.categories, function (category) {\r\n category.priceListId = self.store.priceListId;\r\n });\r\n }\r\n }\r\n\r\n self.toggleSameCluster = function (value) {\r\n self.sameClusterForEveryCategory = value;\r\n if (value && self.store.clusterId) {\r\n angular.forEach(self.categories, function (category) {\r\n category.clusterId = self.store.clusterId;\r\n });\r\n }\r\n }\r\n\r\n self.choosePriceListsForCategories = function () {\r\n\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n component: 'choosePriceListsForCategories',\r\n windowClass: 'app-modal-window',\r\n resolve: {\r\n params: function () {\r\n return {\r\n categories: angular.copy(self.categories),\r\n priceLists: self.priceLists\r\n };\r\n }\r\n }\r\n });\r\n //console.log('modalInstance', modalInstance);\r\n //return;\r\n modalInstance.result.then(function (result) {\r\n console.log('result', result)\r\n self.categories = result;\r\n });\r\n\r\n }\r\n\r\n self.chooseClustersForCategories = function () {\r\n\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n component: 'chooseClustersForCategories',\r\n windowClass: 'app-modal-window',\r\n resolve: {\r\n params: function () {\r\n return {\r\n categories: angular.copy(self.categories),\r\n clusters: self.clusters\r\n };\r\n }\r\n }\r\n });\r\n\r\n modalInstance.result.then(function (result) {\r\n console.log('result', result)\r\n self.categories = result;\r\n });\r\n\r\n }\r\n\r\n self.priceListChange = function () {\r\n console.log('new price list', self.store.priceListId);\r\n angular.forEach(self.categories, function (category) {\r\n category.priceListId = self.store.priceListId;\r\n });\r\n }\r\n\r\n self.clusterChange = function () {\r\n console.log('new cluster', self.store.clusterId);\r\n angular.forEach(self.categories, function (category) {\r\n category.clusterId = self.store.clusterId;\r\n });\r\n }\r\n\r\n function init() {\r\n //console.log('$stateParams', $stateParams); \r\n self.samePriceListForEveryCategory = true;\r\n self.sameClusterForEveryCategory = true;\r\n\r\n adminService.categories.getCategoryGroups().then(function (categories) {\r\n console.log('categories', categories);\r\n self.categories = categories;\r\n\r\n //Primero tengo que traer las categories, por eso lo nesteo aca\r\n if ($stateParams.storeId > 0) {\r\n adminService.stores.getStore($stateParams.storeId).then(function (store) {\r\n console.log('store', store);\r\n if (store.openedDate)\r\n store.openedDate = new Date(store.openedDate);\r\n\r\n var last = 0;\r\n angular.forEach(store.clusters, function (cluster) {\r\n if (cluster.clusterId != last && last != 0) {\r\n self.sameClusterForEveryCategory = false;\r\n }\r\n last = cluster.clusterId;\r\n\r\n angular.forEach(self.categories, function (category) {\r\n if (category.id == cluster.category3Id)\r\n category.clusterId = cluster.clusterId;\r\n })\r\n })\r\n\r\n\r\n last = 0;\r\n angular.forEach(store.priceLists, function (priceList) {\r\n if (priceList.priceListId != last && last != 0) {\r\n self.samePriceListForEveryCategory = false;\r\n }\r\n last = priceList.priceListId;\r\n\r\n if (self.samePriceListForEveryCategory) {\r\n angular.forEach(self.categories, function (category) {\r\n category.priceListId = priceList.priceListId;\r\n })\r\n }\r\n })\r\n\r\n if (self.samePriceListForEveryCategory && store.priceLists.length > 0)\r\n store.priceListId = store.priceLists[0].priceListId;\r\n\r\n if (self.sameClusterForEveryCategory && store.clusters.length > 0)\r\n store.clusterId = store.clusters[0].clusterId;\r\n\r\n self.store = store;\r\n });\r\n }\r\n\r\n })\r\n\r\n adminService.vendors.getVendorsCombo().then(function (vendors) {\r\n console.log('vendors', vendors);\r\n self.vendors = vendors;\r\n });\r\n\r\n adminService.stores.getDistributionCentersCombo().then(function (dc) {\r\n console.log('dc', dc);\r\n self.distributionCenters = dc;\r\n })\r\n\r\n adminService.clusters.getClusters().then(function (clusters) {\r\n console.log('clusters', clusters);\r\n self.clusters = clusters;\r\n });\r\n\r\n adminService.priceLists.getPriceLists().then(function (priceLists) {\r\n console.log('pricelists', priceLists);\r\n self.priceLists = priceLists;\r\n });\r\n\r\n adminService.brands.getBrandsCombo(true).then(function (brands) {\r\n console.log('brands', brands);\r\n self.brands = brands;\r\n\r\n if (self.brands.length == 1) {\r\n self.store.brandId = brands[0].id;\r\n }\r\n });\r\n\r\n //TODO: Mergear con el branch de espacios.\r\n //spaceService.getLayouts().then(function (layouts) {\r\n // self.layouts = layouts;\r\n //});\r\n\r\n\r\n }\r\n\r\n function validateBeforeSave() {\r\n\r\n if (!self.store.name) {\r\n return validationNameStore;\r\n }\r\n if (!self.store.openedDate) {\r\n return \"Debe elegir una fecha de apertura\"\r\n }\r\n\r\n if (companyJson.Navigation.Prices && self.store.storeType == 1) {\r\n\r\n var valid = true;\r\n angular.forEach(self.categories, function (category) {\r\n if (!category.priceListId)\r\n valid = false;\r\n })\r\n if (!valid) {\r\n return \"Seleccione zona de precios para todas las categorias\"\r\n }\r\n }\r\n\r\n if (companyJson.Navigation.Assortment && self.store.storeType == 1) {\r\n\r\n //var valid = true;\r\n //angular.forEach(self.categories, function (category) {\r\n // if (!category.clusterId)\r\n // valid = false;\r\n //})\r\n //if (!valid) {\r\n // return \"Seleccione cluster para todas las categorias\"\r\n //}\r\n }\r\n if (!self.store.operationType) {\r\n return \"Debe elegir un tipo de operacion\";\r\n }\r\n\r\n return null;\r\n }\r\n\r\n self.storeTypeChange = function () {\r\n self.store.distributionCenterId = null;\r\n }\r\n\r\n self.isValid = function () {\r\n let validations = [];\r\n if (!companyJson) return false;\r\n\r\n if (!self.store.name) {\r\n validations.push(validationNameStore);\r\n }\r\n if (!self.store.code) {\r\n validations.push(\"Debe ingresar un codigo para la tienda\");\r\n }\r\n if (!self.store.operationType) {\r\n validations.push(\"Debe elegir un tipo de operacion\");\r\n }\r\n if (!self.store.openedDate) {\r\n validations.push(\"Debe elegir una fecha de apertura\");\r\n }\r\n if (!self.store.storeType) {\r\n validations.push(validationTypeStore);\r\n }\r\n\r\n //Si es obligatorio elegir centro de distribucion, y el tipo es TIENDA... \r\n //TODO: revisar que pasa con las tiendas que a su vez son centros de distribucion\r\n if (companyJson.EditStores && companyJson.EditStores.DistributionCenterMandatory && !self.store.distributionCenterId && self.store.storeType == 1) {\r\n validations.push(\"Debe elegir un centro de distribucion\");\r\n }\r\n\r\n if (companyJson.Navigation.Prices) {\r\n if (self.store.storeType == 1) {\r\n var valid = true;\r\n angular.forEach(self.categories, function (category) {\r\n if (!category.priceListId)\r\n valid = false;\r\n })\r\n if (!valid) {\r\n validations.push(\"Seleccione zona de precios para todas las categorias\");\r\n }\r\n }\r\n }\r\n\r\n if (companyJson.Navigation.Assortment) {\r\n //var valid = true;\r\n //angular.forEach(self.categories, function (category) {\r\n // if (!category.clusterId)\r\n // valid = false;\r\n //})\r\n //if (!valid) {\r\n // validations.push(\"Seleccione cluster para todas las categorias\");\r\n //}\r\n }\r\n\r\n\r\n\r\n //if(setupData.DistributionCenterMandatory && )\r\n self.validationMessage = validations.join(', ');\r\n\r\n if (validations.length > 0)\r\n return false;\r\n\r\n return true;\r\n }\r\n\r\n self.mustHidePriceChanges = function () {\r\n if (!companyJson) return false;\r\n\r\n if (!companyJson.EditStores) return false;\r\n\r\n if (companyJson.EditStores.HidePriceChanges)\r\n return true;\r\n };\r\n\r\n self.mustHideLiquidations = function () {\r\n if (!companyJson) return false;\r\n\r\n if (!companyJson.EditStores) return false;\r\n\r\n if (companyJson.EditStores.HideActiveLiquidations)\r\n return true;\r\n };\r\n\r\n //button Collapsed\r\n $scope.isNavCollapsed = true;\r\n $scope.isCollapsed = false;\r\n $scope.isCollapsedHorizontal = false;\r\n\r\n $scope.isGeneralInformationCollapsed = false;\r\n $scope.isUbicationCollapsed = false;\r\n $scope.isOthersCollapsed = false;\r\n\r\n init();\r\n });\r\n\r\n\r\n\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"ManagementItemsCtrl\", function ($scope, $rootScope, $state, $translate, adminService, $timeout, homeService, ngDialog) {\r\n\r\n //Variables Globales\r\n\r\n var self = this;\r\n\r\n self.categories = [];\r\n self.selectedCategories = [];\r\n self.subCategories = [];\r\n self.selectedSubcategories = [];\r\n self.lstItems = [];\r\n self.search = \"\";\r\n\r\n //Nuevos valores masivos para los items\r\n self.newBrand = \"\";\r\n self.newManufacturer = \"\";\r\n self.newTags = [];\r\n\r\n //Abm Etiquietas\r\n self.newGroupTag = \"\";\r\n self.newTagValue = \"\";\r\n\r\n self.isValidCategories = true;\r\n self.isLoading = false;\r\n\r\n self.brands = [];\r\n\r\n self.manufacturers = [];\r\n\r\n self.tags = []; \r\n\r\n self.groupTag = []; \r\n\r\n\r\n self.searchItems = function () {\r\n if (self.selectedCategories.length == 0) {\r\n swal(translations.ValidationSwalTitle, translations.YouMustSelectAtLeastOneCategory, 'warning');\r\n self.isValidCategories = false;\r\n }\r\n else {\r\n self.isLoading = true;\r\n let allSubcategories = self.selectedSubcategories.map(function (x) { return x.id; });\r\n angular.forEach(self.selectedCategories, function (cat) {\r\n //meto todas las subcategories si su id no aparece en parents de selectedsubcats \r\n if (_.find(self.selectedSubcategories, function (sc) {\r\n return sc.parentId == cat.id;\r\n }) == null) {\r\n allSubcategories = allSubcategories.concat(cat.subcategories.map(function (x) { return x.id; }));\r\n }\r\n });\r\n let param = {\r\n subCategories: allSubcategories,\r\n search: self.search \r\n };\r\n\r\n adminService.items.getItemsForManagement(param)\r\n .then(function (response) {\r\n self.lstItems = response;\r\n self.lstItems.forEach(function (x) {\r\n x.selected = true;\r\n });\r\n self.isLoading = false;\r\n }, function () {\r\n self.isLoading = false;\r\n swal(translations.ErrorTitleSwal, '', 'error');\r\n });\r\n\r\n }\r\n }\r\n\r\n self.onCategorySelected = function (category) {\r\n self.subCategories = [];\r\n angular.forEach(self.selectedCategories, function (category) {\r\n angular.forEach(category.subcategories, function (subcategory) {\r\n self.subCategories.push(subcategory);\r\n });\r\n });\r\n }\r\n\r\n self.showNewTagModal = function () {\r\n ngDialog.open({\r\n template: 'modal-newTag',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-500',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.saveNewTag = function () {\r\n if (self.newGroupTag == \"\" || self.newTagValue == \"\") {\r\n swal(translations.ValidationSwalSubtitle, '', 'error');\r\n return;\r\n }\r\n adminService.tags.saveTag({ group: self.newGroupTag, name: self.newTagValue })\r\n .then(function (response) {\r\n if (response.id) {\r\n self.tags.push(response);\r\n swal(translations.HasBeenSuccessfullySavedSwal, '', 'success');\r\n }\r\n else swal(translations.ErrorTitleSwal, '', 'error');\r\n }, function () {\r\n swal(translations.ErrorTitleSwal, '', 'error');\r\n });\r\n ngDialog.close();\r\n }\r\n\r\n self.saveNewGroupTag = function () {\r\n swal({\r\n title: translations.NewTagGroup,\r\n type: \"input\",\r\n showCancelButton: true,\r\n closeOnConfirm: false,\r\n cancelButtonText: translations.CancelSwal,\r\n }, function (inputValue) {\r\n if (inputValue === false) return false;\r\n if (inputValue === \"\") {\r\n swal.showInputError(translations.ValidationSwalSubtitle);\r\n return false\r\n }\r\n self.newGroupTag = inputValue;\r\n self.groupTag.push(inputValue);\r\n $timeout(function () {\r\n swal(translations.HasBeenSuccessfullySavedSwal, \"\", 'success');\r\n }, 100);\r\n });\r\n }\r\n\r\n self.saveNewBrand = function () {\r\n swal({\r\n title: translations.NewBrand,\r\n type: \"input\",\r\n showCancelButton: true,\r\n closeOnConfirm: false,\r\n cancelButtonText: translations.CancelSwal,\r\n }, function (inputValue) {\r\n if (inputValue === false) return false;\r\n if (inputValue === \"\") {\r\n swal.showInputError(translations.ValidationSwalSubtitle);\r\n return false\r\n }\r\n self.brands.push(inputValue);\r\n $timeout(function () {\r\n swal(translations.HasBeenSuccessfullySavedSwal, translations.AsignForPersist, 'success');\r\n }, 100);\r\n });\r\n }\r\n\r\n self.saveNewManufacturer = function () {\r\n swal({\r\n title: translations.NewManufacturer,\r\n type: \"input\",\r\n showCancelButton: true,\r\n closeOnConfirm: false,\r\n cancelButtonText: translations.CancelSwal,\r\n }, function (inputValue) {\r\n if (inputValue === false) return false;\r\n if (inputValue === \"\") {\r\n swal.showInputError(translations.ValidationSwalSubtitle);\r\n return false\r\n }\r\n self.manufacturers.push(inputValue);\r\n $timeout(function () {\r\n swal(translations.HasBeenSuccessfullySavedSwal, translations.AsignForPersist, 'success');\r\n }, 100);\r\n \r\n });\r\n }\r\n\r\n self.save = function () {\r\n self.isLoading = true;\r\n let itemsToSave = self.lstItems.filter(function (x) { return x.selected; });\r\n angular.forEach(itemsToSave, function (i) {\r\n i.brand = self.newBrand ? self.newBrand : i.brand;\r\n i.manufacturer = self.newManufacturer ? self.newManufacturer : i.manufacturer;\r\n i.tags = $rootScope.removeDuplicates(i.tags.concat(self.newTags),'id');\r\n });\r\n adminService.items.saveManagementItems(itemsToSave)\r\n .then(function (response) {\r\n //ok\r\n swal(translations.HasBeenSuccessfullySavedSwal, '', 'success');\r\n self.isLoading = false;\r\n }, function (status) {\r\n if (status == 504) {\r\n //demora\r\n }\r\n else {\r\n self.isLoading = false;\r\n swal(translations.ErrorTitleSwal, '', 'error');\r\n }//error\r\n });\r\n }\r\n\r\n //button Collapsed\r\n $scope.isNavCollapsed = true;\r\n $scope.isCollapsed = false;\r\n $scope.isCollapsedHorizontal = false;\r\n\r\n $scope.isFiltersCollapsed = false; \r\n $scope.isEditItemsCollapsed = false; \r\n $scope.isTableCollapsed = false;\r\n\r\n function loadData() {\r\n self.loadingData = true;\r\n Promise.all([\r\n adminService.categories.getCategoriesWithSubcategories()\r\n .then(function (categories) {\r\n self.categories = categories;\r\n }),\r\n adminService.items.getManufacturers()\r\n .then(function (manufacturers) {\r\n self.manufacturers = manufacturers;\r\n }),\r\n adminService.items.getItemBrands()\r\n .then(function (itemBrands) {\r\n self.brands = itemBrands;\r\n }),\r\n adminService.tags.getTags()\r\n .then(function (tags) {\r\n self.tags = tags;\r\n }),\r\n adminService.tags.getTagGroups()\r\n .then(function (tagGroups) {\r\n self.groupTag = tagGroups;\r\n })\r\n \r\n ])\r\n .then(function () { self.loadingData = false; })\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n $translate([\"ValidationSwalTitle\", \"YouMustSelectAtLeastOneCategory\", \"HasBeenSuccessfullySavedSwal\", \"ErrorTitleSwal\", \"ValidationSwalSubtitle\"\r\n , \"NewBrand\", \"NewManufacturer\", \"AsignForPersist\", \"CancelSwal\",\"NewTagGroup\"])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n loadData();\r\n }\r\n\r\n init();\r\n });\r\n\r\n\r\n\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"ItemsCtrl\", function ($scope, $state, $translate, adminService, $timeout, homeService) {\r\n\r\n //Variables Globales\r\n\r\n var self = this;\r\n self.selectedItem = null;\r\n //ITEM LOOKUP\r\n self.item = null;\r\n self.itemLookupText = '';\r\n self.itemsInLookup = [];\r\n self.selectedItem = null;\r\n self.loadingLookupItems = false;\r\n self.lookupItemsNoResults = true;\r\n\r\n self.lstItems = [];\r\n\r\n self.search = \"\";\r\n\r\n self.order = \"\";\r\n\r\n var previousLookupText = '';\r\n\r\n $scope.$watch('ct.itemLookupText', function (newVal, oldVal) {\r\n if (newVal) {\r\n\r\n if (newVal.id) {\r\n self.selectedItem = self.itemLookupText;\r\n\r\n getItem(newVal.id);\r\n }\r\n\r\n if (newVal && newVal != oldVal && (newVal.length == 4 || (oldVal.length < 3 && newVal.length >= 4)) && newVal != previousLookupText) {\r\n previousLookupText = newVal;\r\n\r\n self.itemsInLookup = [{ id: 0, code: '', name: 'Cargando Items con el texto ' + newVal + '...' }];\r\n self.loadingLookupItems = true;\r\n var lookupText = { SearchTerm: newVal };\r\n\r\n homeService.lookups.abmItemsLookup(lookupText)\r\n .then(function (items) {\r\n self.itemsInLookup = items;\r\n self.loadingLookupItems = false;\r\n if (items.length > 0)\r\n self.lookupItemsNoResults = false;\r\n else\r\n self.lookupItemsNoResults = true;\r\n });\r\n }\r\n }\r\n\r\n }, true);\r\n\r\n function getItem(itemId) {\r\n self.isLoading = true;\r\n\r\n homeService.items.getItem(itemId)\r\n .then(function (item) {\r\n self.lstItems.push(item);\r\n self.isLoading = false;\r\n });\r\n }\r\n\r\n //Load Data\r\n function loadItems() {\r\n self.isLoading = true;\r\n }\r\n\r\n function init() {\r\n //loadItems();\r\n }\r\n\r\n init();\r\n });\r\n\r\n\r\n\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"EditMasterItemCtrl\", [\"$window\", \"$scope\", \"$stateParams\", \"$translate\", \"$state\", \"homeService\", \"serverService\", \"authService\", \"Upload\", \"ngDialog\", function ($window, $scope, $stateParams, $translate, $state, homeService, serverService, authService, Upload, ngDialog) {\r\n\r\n //Variables Globales\r\n var self = this;\r\n self.stateChange = false;\r\n\r\n self.hasPermissionToEdit = authService.hasPermission('item_admin');\r\n\r\n self.categories = [];\r\n self.subcategories = [];\r\n self.types = [];\r\n self.selectedCategory = null;\r\n self.selectedTypeId = -1;\r\n\r\n self.loadingVerifyItemEan = false;\r\n self.resultsVerifyEan = false;\r\n self.isVerify = false;\r\n self.unitOfMeasureSelected = null;\r\n\r\n self.item = {\r\n id: 0,\r\n code: \"\",\r\n name: \"\",\r\n ean: \"\",\r\n brand: \"\",\r\n manufacturer: \"\",\r\n distributor: \"\",\r\n height: null,\r\n width: null,\r\n depth: null,\r\n weight: null,\r\n imageUrl: \"\",\r\n imagePlanogramFront: null,\r\n imagePlanogramLeft: null,\r\n imagePlanogramTop: null,\r\n isExcluded: false,\r\n category: { id: 0, name: \"\", code: \"\" },\r\n unitOfMeasures: [{\r\n id: 0,\r\n itemId: 0,\r\n code: \"\",\r\n itemCode: 0,\r\n height: null,\r\n width: null,\r\n depth: null,\r\n weight: null,\r\n isBaseUnitOfMeasure: true,\r\n conversion: 1,\r\n imagePlanogramFront: null,\r\n imagePlanogramLeft: null,\r\n imagePlanogramTop: null\r\n }],\r\n type: { id: 0, code: \"\", name: \"\" }\r\n }\r\n\r\n function generateUnitOfMeasure() {\r\n return {\r\n id: 0,\r\n itemId: 0,\r\n code: \"\",\r\n itemCode: 0,\r\n height: null,\r\n width: null,\r\n depth: null,\r\n weight: null,\r\n isBaseUnitOfMeasure: false,\r\n conversion: 1,\r\n imagePlanogramFront: null,\r\n imagePlanogramLeft: null,\r\n imagePlanogramTop: null\r\n }\r\n }\r\n\r\n self.back = function () {\r\n $window.history.back();\r\n }\r\n\r\n self.onCategorySelected = function (category) {\r\n self.selectedCategory = category;\r\n self.loadSubcategories()\r\n }\r\n\r\n self.togleExclude = function () {\r\n self.item.isExcluded = !self.item.isExcluded;\r\n }\r\n\r\n function isValidField(field) {\r\n if (field == undefined || field == null || field == '')\r\n return false;\r\n\r\n return true;\r\n }\r\n\r\n self.save = function () {\r\n\r\n //Set Selected Type\r\n angular.forEach(self.types, function (t) {\r\n if (t.id == self.selectedTypeId)\r\n self.item.type = t;\r\n });\r\n\r\n if (!isValidField(self.item.code)\r\n || !isValidField(self.item.name)\r\n //|| !isValidField(self.item.ean)\r\n //|| !isValidField(self.item.brand)\r\n //|| !isValidField(self.item.manufacturer)\r\n //|| !isValidField(self.item.distributor)\r\n || !isValidField(self.item.category.code)\r\n || !isValidField(self.item.type.code))\r\n {\r\n swal(translations.ValidationSwalTitle, translations.ValidationSwalSubtitle, 'error');\r\n return;\r\n }\r\n var isValiddUOM = false\r\n var allItemUoms = [];\r\n self.uomRepeated = \"\";\r\n angular.forEach(self.item.unitOfMeasures, function (_uom) {\r\n\r\n if (allItemUoms.indexOf(_uom.code) == -1)\r\n allItemUoms.push(_uom.code);\r\n else {\r\n self.uomRepeated = _uom.code;\r\n }\r\n\r\n if ( !isValidField(_uom.code)\r\n || !isValidField(_uom.height)\r\n || !isValidField(_uom.width)\r\n || !isValidField(_uom.depth)\r\n //|| !isValidField(_uom.conversion)\r\n //|| !isValidField(_uom.weight)\r\n ) {\r\n swal(translations.ValidationSwalTitle, translations.ValidationSwalSubtitle, 'error');\r\n isValiddUOM = true\r\n return;\r\n }\r\n if (self.uomRepeated != \"\") {\r\n swal(translations.ErrorTitleSwal, translations.ValidationSwalUomRepeted, 'error');\r\n isValiddUOM = true\r\n return;\r\n }\r\n })\r\n\r\n if (self.item.code != null && !isValiddUOM) {\r\n\r\n swal({\r\n title: translations.SaveItemSwall,\r\n text: translations.SaveItemSwallSubtitle,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.Cancel,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n\r\n if (!isConfirm) return;\r\n\r\n //Save Item\r\n homeService.items.saveItem(self.item)\r\n .then(function () {\r\n swal(translations.ItemSavedProperly, \"\", \"success\");\r\n self.cancel();\r\n });\r\n }\r\n );\r\n }\r\n\r\n self.stateChange = false;\r\n }\r\n\r\n self.cancel = function () {\r\n $state.go('admin.items');\r\n }\r\n\r\n self.onBlur = function () {\r\n \r\n if (self.item.ean && self.item.ean.length > 4) {\r\n self.loadingVerifyItemEan = true;\r\n self.isVerify = false;\r\n homeService.items.isItemEanRepeat(self.item.ean)\r\n .then(function (result) {\r\n self.loadingVerifyItemEan = false;\r\n self.resultsVerifyEan = result;\r\n self.isVerify = true;\r\n result ? self.item.code = '' : self.item.code = self.item.ean;\r\n })\r\n }\r\n }\r\n\r\n self.loadSubcategories = function () {\r\n homeService.items.getSubcategories(self.selectedCategory.id)\r\n .then(function (subcategories) {\r\n self.subcategories = subcategories;\r\n });\r\n }\r\n\r\n self.addUnitOfMeasure = function () {\r\n self.item.unitOfMeasures.push(generateUnitOfMeasure());\r\n //self.unitOfMeasureSelected = null;\r\n }\r\n\r\n self.deleteUnitOfMeasure = function (uom, index) {\r\n self.item.unitOfMeasures.splice(index, 1)\r\n }\r\n\r\n self.togleBaseUnitOfMeasure = function (uom) {\r\n angular.forEach(self.item.unitOfMeasures, function (_uom) {\r\n _uom.isBaseUnitOfMeasure = false;\r\n })\r\n\r\n uom.isBaseUnitOfMeasure = true;\r\n }\r\n \r\n self.uploadFiles = function (files, front, errFiles) {\r\n if (errFiles && errFiles.length > 0) {\r\n var allowedSize = null;\r\n var largeFiles = '';\r\n\r\n angular.forEach(errFiles, function (file) {\r\n if (file.$error == 'maxSize') {\r\n if (allowedSize == null)\r\n allowedSize = file.$errorParam;\r\n if (largeFiles != '')\r\n largeFiles += ', ';\r\n largeFiles += ian.format(' {0} ({1}KB)', file.name, (file.size / 1024).toFixed(0));\r\n }\r\n });\r\n\r\n swal('Peso de imagenes excedido', ian.format('El peso maximo para cada imagen es {0}. Las siguientes imagenes exceden el peso permitido: {1}', allowedSize, largeFiles), 'error');\r\n }\r\n else if (files && files.length) {\r\n var filesToBig = '';\r\n for (i = 0; i < files.length; i++) {\r\n if (files[i].size > 153600) {\r\n filesToBig = 'El peso de cada imagen no debe superar los 150KB';\r\n break;\r\n };\r\n }\r\n\r\n if (filesToBig != '') {\r\n swal('Peso de imagenes excedido', filesToBig, 'error');\r\n }\r\n else {\r\n\r\n self.isBusy = true;\r\n var photoName = self.item.ean + front + self.unitOfMeasureSelected.code + Math.random();\r\n\r\n var url = ian.urlCombine(serverService.getApiUrl(), '/admin/items/uploadFile/' + photoName);\r\n Upload.upload({\r\n url: url,\r\n data: { files: files }\r\n }).then(function (response) {\r\n var uploadResults = response.data;\r\n processResults(uploadResults, front);\r\n if (!anyError(uploadResults))\r\n self.filesUploaded = true;\r\n });\r\n }\r\n }\r\n }\r\n\r\n function processResults(uploadResults, front) {\r\n self.isBusy = false;\r\n if (uploadResults.length > 0) {\r\n loadResults(uploadResults, front);\r\n }\r\n if (anyError(uploadResults)) {\r\n self.error = true;\r\n }\r\n else {\r\n self.filesUploaded = true;\r\n self.error = false;\r\n self.files = [];\r\n }\r\n }\r\n function anyError(uploadResults) {\r\n var error = false;\r\n for (var i = 0; i < uploadResults.length; i++) {\r\n if (uploadResults[i].severity === 3)\r\n error = true;\r\n }\r\n\r\n return error;\r\n }\r\n\r\n function loadResults(results, front) {\r\n if (front == 'Front') self.unitOfMeasureSelected.imagePlanogramFront = results[0]; \r\n\r\n if (front == 'Left') self.unitOfMeasureSelected.imagePlanogramLeft = results[0]; \r\n\r\n if (front == 'Top') self.unitOfMeasureSelected.imagePlanogramTop = results[0]; \r\n \r\n }\r\n\r\n\r\n\r\n //Dialog upload photos\r\n \r\n self.showUploadPhotosModal = function (unitOfMeasure) {\r\n self.unitOfMeasureSelected = unitOfMeasure;\r\n //self.unitOfMeasureSelected.imagePlanogramFront == null;\r\n ngDialog.open({\r\n template: 'modal-uploadPhotos',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-500',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.okLoadPhoto = function () {\r\n ngDialog.close();\r\n }\r\n\r\n //button Collapsed\r\n $scope.isNavCollapsed = true;\r\n $scope.isCollapsed = false;\r\n $scope.isCollapsedHorizontal = false;\r\n\r\n $scope.isBasicInformationCollapsed = false;\r\n $scope.isGeneralInformationCollapsed = false;\r\n $scope.isMeasurementsCollapsed = false;\r\n \r\n\r\n //Load Data\r\n function loadItem() {\r\n self.isLoading = true;\r\n\r\n homeService.items.getItem($stateParams.itemId)\r\n .then(function (item) {\r\n self.item = item;\r\n self.selectedTypeId = self.item.type.id;\r\n angular.forEach(self.item.unitOfMeasures, function (_uom) {\r\n self.item.baseUnitOfMeasureId == _uom.id ? _uom.isBaseUnitOfMeasure = true : _uom.isBaseUnitOfMeasure = false;\r\n })\r\n \r\n self.isLoading = false;\r\n });\r\n }\r\n\r\n function loadCategories() {\r\n homeService.items.getCategories()\r\n .then(function (categories) {\r\n self.categories = categories;\r\n });\r\n }\r\n function loadTypes() {\r\n homeService.items.getTypes()\r\n .then(function (types) {\r\n self.types = types;\r\n });\r\n }\r\n\r\n $scope.$on('$stateChangeStart', function (event) {\r\n if (self.stateChange) {\r\n var answer = confirm(translations.AlertWillLoseChanges)\r\n if (!answer) {\r\n event.preventDefault();\r\n }\r\n }\r\n });\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n $translate([\"ValidationSwalTitle\", \"ValidationSwalSubtitle\", \"SaveItemSwall\", \"SaveItemSwallSubtitle\", \"Cancel\", \"ContinueSwal\", \"ItemSavedProperly\", \"AlertWillLoseChanges\", \"ValidationSwalUomRepeted\", \"ErrorTitleSwal\" ])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n loadCategories();\r\n loadTypes();\r\n\r\n if ($stateParams.itemId != 0) {\r\n loadItem();\r\n }\r\n }\r\n\r\n init();\r\n }]);\r\n\r\n\r\n\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"ClusterCtrl\", function ($scope, adminService, $timeout) {\r\n var self = this;\r\n\r\n //Variables\r\n self.newCluster = { id: null, name: '', code: '', isExcluded: false, stores: [], regionId: 0, brandId: 0 };\r\n self.stores = [];\r\n self.clusters = [];\r\n self.regions = [];\r\n self.brands = [];\r\n self.showStores = false;\r\n self.showAllStores = false;\r\n self.isValidCode = true;\r\n\r\n\r\n //filtros\r\n self.searchCluster = \"\";\r\n self.order = \"\";\r\n self.filter = \"\";\r\n\r\n //Functions \r\n self.toggleNewCluster = function () {\r\n self.newCluster.isExcluded = !self.newCluster.isExcluded;\r\n }\r\n self.disableCluster = function (clusterId) {\r\n adminService.clusters.deleteCluster(clusterId).then(function () {\r\n loadClusters();\r\n }), function error() {\r\n console.log(\"Error al deshabilitar el cluster\");\r\n };\r\n }\r\n self.editCluster = function (cluster) {\r\n self.newCluster = cluster;\r\n if (cluster.stores.length > 0)\r\n self.showStores = true;\r\n else\r\n self.showStores = false;\r\n }\r\n self.addStores = function () {\r\n if (self.newCluster.id == 0) {\r\n //Listo todas las stores\r\n self.showStores = false;\r\n self.showAllStores = true;\r\n\r\n }\r\n else if (self.newCluster.id > 0) {\r\n //Tildo todas las stores de este cluster y listo todas\r\n self.showStores = false;\r\n self.showAllStores = true;\r\n\r\n var includedStores = [];\r\n _.forEach(self.newCluster.stores, function (s, key) {\r\n includedStores.push(s.id);\r\n });\r\n\r\n _.forEach(self.stores, function (s, key) {\r\n\r\n if (_.some(includedStores, function (o) { return o == s.id; }))\r\n s.includedInCluster = true;\r\n });\r\n }\r\n }\r\n self.search = function (item) {\r\n if (!item.isExcluded) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n self.save = function () {\r\n\r\n swal({\r\n title: \"Esta seguro?\",\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n if (!self.isValidCode) {\r\n $timeout(function () {\r\n swal('Ingrese un codigo valido', '', 'error');\r\n }, 100);\r\n \r\n return;\r\n }\r\n ////Agrego las stores asociadas si toque el boton de editar tiendas\r\n //if (self.showAllStores) {\r\n // self.newCluster.stores = [];\r\n // _.forEach(self.stores, function (s, key) {\r\n // if (s.includedInCluster)\r\n // self.newCluster.stores.push(angular.copy(s));\r\n // });\r\n //}\r\n\r\n //Llamo al servicio para guardar\r\n adminService.clusters.saveCluster(self.newCluster).then(function (response) {\r\n console.log(response);\r\n swal(\"Confirmado\", \"Se guardaron los cambios seleccionados\", \"success\");\r\n\r\n //Reseteo las variables y vuelvo a cargar los clusters\r\n self.cancel();\r\n loadClusters();\r\n }), function error(error) {\r\n console.log(error);\r\n\r\n swal(\"Error\", \"Ocurrio un error al guardar\", \"error\");\r\n };\r\n }\r\n });\r\n }\r\n self.cancel = function () {\r\n //Reset variables\r\n self.newCluster = { id: null, name: '', code: '', isExcluded: false, stores: [] };\r\n self.showStores = false;\r\n self.showAllStores = false;\r\n\r\n _.forEach(self.stores, function (s, key) { s.includedInCluster = false; });\r\n }\r\n self.addNew = function () {\r\n self.newCluster.id = 0;\r\n }\r\n\r\n self.filterStatus = function (status) {\r\n if (status == \"Activo\") {\r\n self.filter = \"Activo\";\r\n }\r\n else if (status == \"Deshabilitado\") {\r\n self.filter = \"Deshabilitado\";\r\n }\r\n else\r\n self.filter = \"\";\r\n }\r\n\r\n self.validateClusterCode = function () {\r\n self.validatingClusterCode = true;\r\n adminService.clusters.validateClusterCode(self.newCluster.code).then(function (response) {\r\n self.validatingClusterCode = false;\r\n self.isValidCode = !response;\r\n });\r\n }\r\n\r\n //Load Data\r\n function loadClusters() {\r\n\r\n adminService.clusters.getClusters().then(function (clusters) {\r\n self.clusters = clusters;\r\n });\r\n }\r\n function loadStores() {\r\n adminService.stores.getStores(false).then(function (stores) {\r\n self.stores = stores;\r\n });\r\n }\r\n\r\n function loadRegions() {\r\n adminService.clusters.getRegions()\r\n .then(function (regions) {\r\n self.regions = regions;\r\n });\r\n }\r\n\r\n function loadBrands() {\r\n adminService.clusters.getBrands()\r\n .then(function (brands) {\r\n self.brands = brands;\r\n\r\n if (self.brands.length == 1)\r\n self.newCluster.brandId = brands[0].genericId;\r\n });\r\n } \r\n\r\n function init() {\r\n\r\n loadClusters();\r\n loadStores();\r\n loadRegions();\r\n loadBrands();\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"BrandsCtrl\", function ($scope, $state, $translate, adminService, serverService, $timeout, homeService, ngDialog, Upload) {\r\n\r\n //Variables Globales\r\n\r\n var self = this;\r\n var translations = null;\r\n self.search = \"\";\r\n self.order = \"\";\r\n\r\n self.lstBrands = [];\r\n\r\n self.brand = null; \r\n \r\n self.showPopup = function (brand) { \r\n self.brand = brand; \r\n\r\n ngDialog.open({\r\n template: 'modal-editBrand',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-500',\r\n scope: $scope\r\n });\r\n }\r\n\r\n\r\n //Guardo marca nueva o editada\r\n self.saveBrand = function () {\r\n if (self.brand.name != '') {\r\n self.isLoading = true;\r\n //subo la imagen\r\n var files = $(\"#uploadImgInput\")[0].files;\r\n var file = files.length ? files[0] : null;\r\n var url = ian.urlCombine(serverService.getApiUrl(), '/admin/store/uploadNewBrandImage');\r\n var data = { file: file };\r\n Upload.upload({\r\n url: url,\r\n data: { file: file }\r\n }).then(function (response) {\r\n var isChangedIcon = false;\r\n if (response.data != '') {\r\n isChangedIcon = true;//si se eligio una img response.data es la url\r\n self.brand.icon = response.data;\r\n }\r\n\r\n adminService.brands.saveBrand(self.brand, isChangedIcon)\r\n .then(function (brand) {\r\n self.brand = brand;\r\n self.isLoading = false;\r\n ngDialog.close();\r\n loadBrands();\r\n swal(translations.Adm_brands_savedBrand, translations.Adm_brands_subtitle, 'success');\r\n }, function () {\r\n swal('Error', 'hubo un error al guardar.', 'error');\r\n });\r\n });\r\n }\r\n else {\r\n swal('Error', 'nombre incompleto', 'error');\r\n }\r\n }\r\n\r\n self.selectBrandColor = function (color) {\r\n //return 'background-color: ' + color;\r\n\r\n if (color)\r\n return color;\r\n else\r\n return \"#ffffff\";\r\n\r\n }\r\n\r\n //Load Data\r\n function loadBrands() {\r\n self.isLoading = true;\r\n adminService.brands.getBrands()\r\n .then(function (brands) {\r\n self.lstBrands = brands;\r\n self.isLoading = false;\r\n });\r\n \r\n }\r\n\r\n function init() {\r\n\r\n $translate([\"Adm_brands_savedBrand\", \"Adm_brands_subtitle\"])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n loadBrands();\r\n }\r\n\r\n init();\r\n });\r\n\r\n\r\n\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"spacesTicketsTypesCtrl\", function ($scope, $state, spaceService, $translate) {\r\n\r\n //Varibles\r\n var self = this;\r\n var pageLoaded = false;\r\n\r\n var TICKET_TYPES = {\r\n TODOS: 0,\r\n PLANOGRAM: 1,\r\n ITEM: 2\r\n }\r\n\r\n self.ticketTypes = [];\r\n self.search = \"\";\r\n self.order = \"\";\r\n\r\n\r\n //Load Data\r\n function loadTypesTickets() {\r\n\r\n spaceService.tickets.getTicketTypes()\r\n .then(function (ticketTypes) {\r\n console.log('ticketTypes', ticketTypes);\r\n self.ticketTypes = ticketTypes;\r\n pageLoaded = true;\r\n })\r\n }\r\n\r\n self.addNew = function () {\r\n $state.go('spaces.editTicketType', {\r\n ticketTypeId: 0,\r\n //name: '',\r\n //type: null,\r\n //needsDescription: false\r\n });\r\n }\r\n\r\n self.editTicketType = function (ticketType) {\r\n //console.log('ticketType', ticketType)\r\n $state.go('spaces.editTicketType', {\r\n ticketTypeId: ticketType.id,\r\n //name: ticketType.name,\r\n //type: ticketType.type,\r\n //needsDescription: ticketType.needsDescription\r\n });\r\n }\r\n\r\n self.typesValue = function (numType) {\r\n return numType ? numType == 1 ? translations.Planogram : \"Item\" : translations.All\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n $translate([\"Planogram\", \"All\"])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n loadTypesTickets();\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"EditTicketsTypesCtrl\", function ($scope, $stateParams, $state, spaceService, $translate) {\r\n\r\n //Varibles\r\n var self = this;\r\n self.stateChange = false;\r\n\r\n var TICKET_TYPES = {\r\n TODOS: 0,\r\n PLANOGRAM: 1,\r\n ITEM: 2\r\n }\r\n\r\n var saveSwalTitle = \"\";\r\n\r\n self.validationMessage = \"\";\r\n self.saveSwalTitle = \"\";\r\n self.objTypes = [];\r\n self.ticketType = {\r\n id: $stateParams.ticketTypeId,\r\n name: '',\r\n type: null,\r\n needsDescription: false\r\n };\r\n\r\n\r\n self.cancel = function () {\r\n $state.go('spaces.ticketsTypes');\r\n }\r\n\r\n self.save = function () {\r\n\r\n swal(translations.SaveEditTicketTitle, translations.SaveEditTicketTitleSubtitle, 'success');\r\n\r\n var data = self.ticketType;\r\n\r\n //console.log('data', data);\r\n\r\n spaceService.tickets.saveTicketType(data).then(function () {\r\n //console.log('then after speceService')\r\n //swal(\"Confirmado\", storeSaved, \"success\");\r\n \r\n self.cancel();\r\n })\r\n\r\n self.stateChange = false;\r\n }\r\n\r\n \r\n\r\n function validateBeforeSave() {\r\n return '';\r\n }\r\n\r\n self.isValid = function () {\r\n\r\n if (!self.ticketType.name) {\r\n self.validationMessage = translations.ValidationNameTicket;\r\n return false;\r\n } else if (!self.ticketType.type) {\r\n if(self.ticketType.type == 0){\r\n self.validationMessage = \"\";\r\n return true;\r\n }\r\n self.validationMessage = translations.ValidationTypeTicket;\r\n return false;\r\n } else {\r\n self.validationMessage = \"\";\r\n return true;\r\n }\r\n }\r\n\r\n $scope.$on('$stateChangeStart', function (event) {\r\n //console.log('$stateChangeStart', event)\r\n if (self.stateChange) {\r\n var answer = confirm(translations.AlertWillLoseChanges)\r\n if (!answer) {\r\n event.preventDefault();\r\n }\r\n }\r\n });\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n $translate([\"ValidationNameTicket\", \"ValidationTypeTicket\", \"AlertWillLoseChanges\", \"SaveEditTicketTitle\",\r\n \"SaveEditTicketTitleSubtitle\", \"All\", \"Planogram\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n self.objTypes = [\r\n { name: translations.All, value: 0 },\r\n { name: translations.Planogram, value: 1 },\r\n { name: 'Item', value: 2 }\r\n ]\r\n });\r\n\r\n\r\n if ($stateParams.ticketTypeId > 0) {\r\n spaceService.tickets.getTicketTypeById($stateParams.ticketTypeId).then(function (ticketType) {\r\n\r\n self.ticketType.id = ticketType.id;\r\n self.ticketType.name = ticketType.name;\r\n self.ticketType.type = ticketType.type;\r\n self.ticketType.needsDescription = ticketType.needsDescription;\r\n console.log('ticketType', ticketType);\r\n\r\n });\r\n }\r\n\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n\r\n .controller(\"spacesTicketsCtrl\", function ($scope, $stateParams, $translate, promotionsService, $timeout, authService, ngDialog, spaceService) {\r\n\r\n //Varibles\r\n //console.log('authService', authService.authentication.userName);\r\n var self = this;\r\n self.search = \"\";\r\n console.log('$stateParams', $stateParams);\r\n\r\n self.editedTicket = null;\r\n\r\n self.showFormPriority = true;\r\n\r\n self.commentary = { username: authService.authentication.userName, message: '', createdDate: '' };\r\n\r\n self.STATUS = {\r\n NEW: 1,\r\n RESOLVED: 2,\r\n CLOSED: 3\r\n }\r\n\r\n self.PRIORITY = {\r\n LOW: 1,\r\n MEDIUM: 2,\r\n HIGH: 3\r\n }\r\n\r\n\r\n self.filterPass = function (item) {\r\n return\r\n (self.search == '' || item.title.toLowerCase().indexOf(self.search.toLowerCase()) > -1 || item.description.toLowerCase().indexOf(self.search.toLowerCase()) > -1);\r\n\r\n }\r\n\r\n self.removeItemPlanogramFilter = function () {\r\n self.setFilterPriority('');\r\n }\r\n\r\n self.textPrioritys = \"\";\r\n\r\n self.textTypes = \"\";\r\n\r\n self.priorityChange = function (ticket) {\r\n self.showFormPriority = !self.showFormPriority\r\n self.editTicket(ticket);\r\n }\r\n\r\n self.editTicket = function (ticket) {\r\n var dataEdit = {\r\n id: ticket.id,\r\n priority: ticket.priority,\r\n status: ticket.status,\r\n layoutObjectId: ticket.layoutObjectId,\r\n planogramLevelItemId: ticket.planogramLevelItemId\r\n }\r\n\r\n console.log('dataedit', dataEdit);\r\n spaceService.tickets.editTicket(dataEdit).then(function (res) {\r\n console.log('guardado');\r\n });\r\n }\r\n\r\n //Funciones\r\n\r\n self.getColor = function (status) {\r\n rv = \"\"\r\n\r\n if (status == self.STATUS.NEW)\r\n rv = \"#1C84C6\";\r\n\r\n else if (status == self.STATUS.RESOLVED)\r\n rv = \"#F8AC59\";\r\n\r\n else if (status == self.STATUS.CLOSED)\r\n rv = \"#1AB394\";\r\n\r\n else\r\n rv = \"#f5f5f5\";\r\n\r\n return rv;\r\n }\r\n\r\n\r\n self.getPriorityText = function (priority) {\r\n for (var i = 0; i < self.priorityTickets.length; i++) {\r\n if (self.priorityTickets[i].id == priority)\r\n return self.priorityTickets[i].name;\r\n }\r\n }\r\n\r\n self.getStatusText = function (status) {\r\n if (status == 1)\r\n return translations.NEW;\r\n if (status == 2)\r\n return translations.Resolved;\r\n if (status == 3)\r\n return translations.Closed;\r\n\r\n return status;\r\n }\r\n\r\n self.showNewTicketModal = function () {\r\n self.newTicket = GenerateNewTicket();\r\n\r\n ngDialog.open({\r\n template: 'ticketNewDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-500',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.showEditTicketModal = function (ticket) {\r\n if (ticket != null)\r\n self.editedTicket = ticket;\r\n\r\n\r\n ngDialog.open({\r\n template: 'ticketEditDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: $scope\r\n });\r\n }\r\n\r\n function GenerateNewTicket() {\r\n return {\r\n id: 0,\r\n status: translations.NEW,\r\n title: '',\r\n description: '',\r\n type: '',\r\n priority: '',\r\n created: new Date(),\r\n update: new Date(),\r\n user: authService.authentication.userName,\r\n comments: [],\r\n watch: true\r\n };\r\n }\r\n\r\n self.saveNewTicket = function () {\r\n self.newTicket.id = self.tickets.length + 1;\r\n self.tickets.push(self.newTicket);\r\n ngDialog.close();\r\n }\r\n\r\n self.saveEditTicket = function () {\r\n ngDialog.close();\r\n swal(translations.SaveEditTicketTitle, translations.SaveEditTicketTitleSubtitle, 'success');\r\n }\r\n\r\n self.resolverTicket = function () {\r\n self.editedTicket.status = self.STATUS.RESOLVED;\r\n self.editTicket(self.editedTicket);\r\n }\r\n\r\n self.closeTicket = function () {\r\n self.editedTicket.status = self.STATUS.CLOSED;\r\n self.editTicket(self.editedTicket);\r\n }\r\n\r\n\r\n\r\n self.timeSince = function (date) {\r\n\r\n if (typeof date != 'object')\r\n date = new Date(date);\r\n\r\n var seconds = Math.floor((new Date() - date) / 1000);\r\n\r\n var interval = Math.floor(seconds / 31536000);\r\n\r\n if (interval >= 1) {\r\n return translations.Since + interval + translations.YearAgo + (interval > 1 ? 's' : '');\r\n }\r\n interval = Math.floor(seconds / 2592000);\r\n if (interval >= 1) {\r\n return translations.Since + interval + translations.MonthAgo + (interval > 1 ? 'es' : '');\r\n }\r\n interval = Math.floor(seconds / 86400);\r\n if (interval >= 1) {\r\n return translations.Since + interval + translations.DayAgo + (interval > 1 ? 's' : '');\r\n }\r\n interval = Math.floor(seconds / 3600);\r\n if (interval >= 1) {\r\n return translations.Since + interval + translations.HourAgo + (interval > 1 ? 's' : '');\r\n }\r\n interval = Math.floor(seconds / 60);\r\n if (interval >= 1) {\r\n return translations.Since + interval + translations.MinuteAgo + (interval > 1 ? 's' : '');\r\n }\r\n return Math.floor(seconds) + translations.Seconds;\r\n }\r\n\r\n self.commentTicket = function () {\r\n\r\n var dataComment = {\r\n ticketId: self.editedTicket.id,\r\n message: self.commentary.message\r\n }\r\n\r\n spaceService.tickets.addComment(dataComment).then(function (res) {\r\n console.log('guardado');\r\n var comment = angular.copy(self.commentary);\r\n comment.createdDate = new Date();\r\n self.editedTicket.comments.unshift(comment);\r\n self.commentary.message = '';\r\n\r\n });\r\n }\r\n\r\n self.toggleLook = function (ticket) {\r\n ticket.watch = !ticket.watch;\r\n }\r\n\r\n function loadData() {\r\n\r\n if ($stateParams.planogramLevelItemId != 0) {\r\n spaceService.tickets.getItemTickets($stateParams.planogramLevelItemId).then(function (tickets) {\r\n console.log('tickets', tickets);\r\n self.tickets = tickets;\r\n });\r\n } else if ($stateParams.layoutObjectId != 0) {\r\n spaceService.tickets.getPlanogramTickets($stateParams.layoutObjectId).then(function (tickets) {\r\n console.log('tickets', tickets);\r\n self.tickets = tickets;\r\n });\r\n } else {\r\n spaceService.tickets.getTickets().then(function (tickets) {\r\n console.log('tickets', tickets);\r\n self.tickets = tickets;\r\n });\r\n }\r\n }\r\n\r\n self.priorityTickets = [];\r\n var translations = null;\r\n self.newTicket = null;\r\n\r\n function init() {\r\n $translate([\"Low\", \"Medium\", \"High\", \"NEW\", \"Resolved\", \"Closed\", \"SaveEditTicketTitle\",\r\n \"SaveEditTicketTitleSubtitle\", \"Seconds\", \"Since\", \"YearAgo\", \"MonthAgo\", \"DayAgo\", \"HourAgo\", \"MinuteAgo\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n self.newTicket = GenerateNewTicket();\r\n\r\n self.priorityTickets = [\r\n { id: 1, name: translations.Low },\r\n { id: 2, name: translations.Medium },\r\n { id: 3, name: translations.High },\r\n ]\r\n });\r\n\r\n loadData();\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"ItemsByAssortmentCtrl\", function ($scope,spaceService, $translate, $timeout, $window) {\r\n var self = this;\r\n self.isLoading = false;\r\n\r\n self.downloadCsv = function (activesItems) {\r\n self.isLoading = true;\r\n spaceService.reports.buildItemsByAssortmentReport(activesItems)\r\n .then(function (url) {\r\n self.isLoading = false;\r\n swal({\r\n title: \"Reporte Generado!\",\r\n text: 'Haga click AQUÍ para descargar el archivo',\r\n confirmButtonText: \"Cerrar\",\r\n confirmButtonColor: \"#c2c2c2\",\r\n html: true\r\n });\r\n }).catch(function (error) {\r\n swal('Error','hubo un error','error');\r\n });; \r\n }\r\n\r\n function loadLastReports() {\r\n spaceService.reports.getLastReports()\r\n .then(function (reports) {\r\n self.generatedFiles = reports;\r\n });\r\n }\r\n\r\n self.downloadFile = function (url) {\r\n $window.open(url);\r\n }\r\n\r\n function init() {\r\n loadLastReports();\r\n }\r\n\r\n init();\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"GeneralKpisCtrl\", function ($scope, priceService, adminService, $translate, $timeout, $window) {\r\n var self = this;\r\n self.selectedName = \"\";\r\n self.lastSelectedName = \"\";\r\n self.reportTypes = [];\r\n\r\n self.isLoading = false;\r\n self.reportData = [];\r\n self.priceTypeId = 5; //Por default se usa el Tipo de Precio de Competencia\r\n\r\n $scope.oneAtATime = true;\r\n\r\n $scope.groups = [\r\n {\r\n title: 'Dynamic Group Header - 1',\r\n content: 'Dynamic Group Body - 1'\r\n },\r\n {\r\n title: 'Dynamic Group Header - 2',\r\n content: 'Dynamic Group Body - 2'\r\n }\r\n ];\r\n\r\n $scope.items = ['Item 1', 'Item 2', 'Item 3'];\r\n\r\n $scope.addItem = function () {\r\n var newItemNo = $scope.items.length + 1;\r\n $scope.items.push('Item ' + newItemNo);\r\n };\r\n\r\n $scope.status = {\r\n isCustomHeaderOpen: false,\r\n isFirstOpen: true,\r\n isFirstDisabled: false\r\n };\r\n\r\n self.filters = {\r\n priceLists: [],\r\n categories: [],\r\n competitorGroups: [],\r\n brands: []\r\n }\r\n\r\n self.applyFilters = function () {\r\n self.closeFilters();\r\n\r\n //loadReportData();\r\n }\r\n\r\n self.order = 'gmros';\r\n\r\n self.isMarker = true;\r\n\r\n \r\n self.lastDrilldownReportType = self.reportTypes[0];\r\n\r\n self.drillDownFunnelStep = 0;\r\n\r\n self.drillDown = function (itemId, itemName) {\r\n\r\n self.drillDownFunnelStep++;\r\n self.lastDrillownItemd = itemId;\r\n\r\n if (self.selectedReportType.id == 1) //Zonas\r\n {\r\n self.filters.priceLists = [];\r\n self.filters.priceLists.push({ id: itemId });\r\n\r\n\r\n if (self.drillDownFunnelStep == 1) {\r\n self.selectedReportType = self.reportTypes[1];\r\n self.lastDrilldownReportType = angular.copy(self.reportTypes[0]);\r\n }\r\n else if (self.drillDownFunnelStep == 2) {\r\n self.selectedReportType = self.reportTypes[2];\r\n self.lastDrilldownReportType = angular.copy(self.reportTypes[0]);\r\n }\r\n\r\n loadReportData();\r\n }\r\n else if (self.selectedReportType.id == 2) //Competidor\r\n {\r\n self.filters.competitorGroups = [];\r\n self.filters.competitorGroups.push({ id: itemId });\r\n\r\n if (self.drillDownFunnelStep == 1) {\r\n self.selectedReportType = self.reportTypes[0];\r\n self.lastDrilldownReportType = angular.copy(self.reportTypes[1]);\r\n }\r\n else if (self.drillDownFunnelStep == 2) {\r\n self.selectedReportType = self.reportTypes[2];\r\n self.lastDrilldownReportType = angular.copy(self.reportTypes[1]);\r\n }\r\n\r\n loadReportData();\r\n }\r\n\r\n self.lastSelectedName = angular.copy(self.selectedName);\r\n\r\n if (self.selectedName == \"\")\r\n self.selectedName = itemName;\r\n else\r\n self.selectedName = self.selectedName + \" / \" + itemName\r\n }\r\n\r\n self.drillUp = function () {\r\n\r\n if (self.selectedReportType.id == 1) //Zonas\r\n {\r\n if (self.drillDownFunnelStep == 1) {\r\n self.filters.competitorGroups = [];\r\n self.selectedReportType = self.reportTypes[1];\r\n self.lastDrilldownReportType = angular.copy(self.reportTypes[0]);\r\n self.drillDownFunnelStep--;\r\n self.selectedName = \"\";\r\n }\r\n\r\n loadReportData();\r\n }\r\n else if (self.selectedReportType.id == 2) //Competidor\r\n {\r\n if (self.drillDownFunnelStep == 1) {\r\n self.filters.priceLists = [];\r\n self.selectedReportType = self.reportTypes[0];\r\n self.lastDrilldownReportType = angular.copy(self.reportTypes[1]);\r\n self.drillDownFunnelStep--;\r\n self.selectedName = \"\";\r\n }\r\n\r\n loadReportData();\r\n }\r\n else if (self.selectedReportType.id == 3) //Categoria\r\n {\r\n if (self.lastDrilldownReportType.id == 1) { //VENGO DE ZONA\r\n self.filters.priceLists = [];\r\n self.selectedReportType = self.reportTypes[0];\r\n self.lastDrilldownReportType = angular.copy(self.reportTypes[1]);\r\n self.drillDownFunnelStep--;\r\n }\r\n else if (self.lastDrilldownReportType.id == 2) //VENGO DE COMPETIDOR\r\n {\r\n self.filters.competitorGroups = [];\r\n self.selectedReportType = self.reportTypes[1];\r\n self.lastDrilldownReportType = angular.copy(self.reportTypes[0]);\r\n self.drillDownFunnelStep--;\r\n }\r\n\r\n loadReportData();\r\n }\r\n\r\n if (self.drillDownFunnelStep == 1)\r\n self.selectedName = self.lastSelectedName;\r\n }\r\n\r\n self.getIcColor = function (ic) {\r\n if (ic != null) {\r\n if (ic < 0) //Negativo\r\n {\r\n //(243, 102, 70)\r\n var bgColor = 'rgba(243, 102, 70, ' + (ic.toFixed(2) / 5 * -1) + ')';\r\n return { \"background-color\": bgColor };\r\n }\r\n else if (ic > 0) //Positivo\r\n {\r\n var bgColor = 'rgba(103, 193, 154, ' + (ic.toFixed(2) / 5) + ')';\r\n return { \"background-color\": bgColor };\r\n }\r\n\r\n else {\r\n return { \"background-color\": '#FFC98E' }; //Igual a cero\r\n }\r\n }\r\n else {\r\n return \"\";\r\n }\r\n\r\n //ng - class=\"{'WarningNumber' : item.competitiveIndex <= -0.05, 'WarningNumber-1' : item.competitiveIndex <= -0.06}\"\r\n }\r\n\r\n\r\n self.changeReportType = function(group, acordionStatus)\r\n {\r\n self.selectedReportType = group;\r\n self.reportTypeChanged();\r\n acordionStatus.open = false;\r\n }\r\n\r\n self.reportTypeChanged = function () {\r\n if (self.selectedReportType) {\r\n\r\n self.drillDownFunnelStep = 0;\r\n\r\n self.filters.competitorGroups = [];\r\n self.filters.priceLists = [];\r\n\r\n self.selectedName = \"\";\r\n\r\n loadReportData();\r\n }\r\n }\r\n\r\n self.selectedReportType = self.reportTypes[0];\r\n self.reportTypeChanged();\r\n\r\n self.pricelists = [];\r\n function loadPricelists() {\r\n priceService.pricelists.getPriceLists()\r\n .then(function (pricelists) {\r\n self.pricelists = pricelists\r\n });\r\n }\r\n\r\n self.categories = [];\r\n function loadCategories() {\r\n adminService.categories.getCategories().then(function (categories) {\r\n self.categories = categories;\r\n })\r\n }\r\n\r\n self.tags = [];\r\n function loadTags() {\r\n adminService.tags.getTags()\r\n .then(function (tags) {\r\n self.tags = tags;\r\n });\r\n }\r\n\r\n self.brands = [];\r\n function loadBrands() {\r\n adminService.items.getItemBrands()\r\n .then(function (brands) {\r\n self.brands = brands;\r\n });\r\n }\r\n\r\n self.competitorGroups = [];\r\n function loadCompetitorGroups() {\r\n priceService.competitors.getCompetitorGroups()\r\n .then(function (groups) {\r\n self.competitorGroups = groups;\r\n });\r\n }\r\n\r\n function loadReportData() {\r\n\r\n //var filteredPriceLists = [];\r\n //angular.forEach(self.filters.priceLists, function (item) {\r\n // filteredPriceLists.push(item.id);\r\n //});\r\n\r\n //var filteredCategories = [];\r\n //angular.forEach(self.filters.categories, function (item) {\r\n // filteredCategories.push(item.id);\r\n //});\r\n\r\n //var filteredCompetitorGroups = [];\r\n //angular.forEach(self.filters.competitorGroups, function (item) {\r\n // filteredCompetitorGroups.push(item.id);\r\n //});\r\n\r\n //var params = {\r\n // reportType: self.selectedReportType.id,\r\n // priceTypeId: self.priceTypeId,\r\n // isMarker: self.isMarker,\r\n // priceSurveyTypes: [],\r\n // priceListIds: filteredPriceLists,\r\n // sensitivityIds: [],\r\n // competitorGroupIds: filteredCompetitorGroups,\r\n // categoryIds: filteredCategories,\r\n // tagIds: []\r\n //};\r\n\r\n //self.isLoading = true;\r\n //priceService.reports.getCompetitiveIndex(params).then(function (data) {\r\n // self.isLoading = false;\r\n\r\n // self.reportData = data;\r\n //});\r\n }\r\n\r\n //Filtros\r\n\r\n self.showFilters = false;\r\n\r\n self.toggleFilters = function () {\r\n\r\n self.showFilters = !self.showFilters;\r\n }\r\n\r\n self.getFilterClass = function () {\r\n if (self.showFilters == true)\r\n return 'move-right';\r\n else\r\n return '';\r\n }\r\n\r\n function closeFilterWhenClickingOutside(event) {\r\n\r\n var clickedElement = event.target;\r\n if (!clickedElement) return;\r\n\r\n var elementClasses = clickedElement.classList;\r\n var clickedOnFilterDiv = elementClasses.contains('isFilter')\r\n || elementClasses.contains('chosen-choice')\r\n || elementClasses.contains('chosen-choices')\r\n || elementClasses.contains('search-field')\r\n || elementClasses.contains('default')\r\n || elementClasses.contains('chosen-container')\r\n || elementClasses.contains('chosen-container')\r\n if (!clickedOnFilterDiv) {\r\n self.closeFilters();\r\n }\r\n\r\n }\r\n\r\n self.closeFilters = function () {\r\n $timeout(function () {\r\n self.showFilters = false;\r\n $window.onclick = null;\r\n });\r\n\r\n }\r\n\r\n //Filtro collapse\r\n\r\n self.isNavCollapsed = true;\r\n self.isCollapsedHorizontal = false;\r\n self.isCollapsed = true;\r\n self.isZoneCollapsed = true;\r\n self.isTagCollapsed = true;\r\n self.isClusterCollapsed = true;\r\n \r\n function loadData() {\r\n loadPricelists();\r\n loadTags();\r\n loadCategories();\r\n loadBrands();\r\n loadCompetitorGroups();\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n $translate([\"Sp_generalKpis_Category\", \"Sp_generalKpis_planogram\", \"Sp_generalKpis_store\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n self.reportTypes = [\r\n {\r\n id: 1,\r\n name: translation.Sp_generalKpis_Category,\r\n },\r\n {\r\n id: 2,\r\n name: translation.Sp_generalKpis_planogram,\r\n },\r\n {\r\n id: 3,\r\n name: translation.Sp_generalKpis_store,\r\n },\r\n //{\r\n // id: 4,\r\n // name: \"Subcategoria\",\r\n //}\r\n ];\r\n\r\n\r\n });\r\n\r\n //loadData();\r\n\r\n //Datos harcoded para lademo\r\n self.reportData = [\r\n { category: 'Candies', gmros: 4, gmroi: 1.63, hurdleRate: 1507, avgPrice: 587, spacing: 0.63 },\r\n { category: 'Non Alcoholic Beverages', gmros: 2.79, gmroi: 2.76, hurdleRate: 1314, avgPrice: 223, spacing: 0.71 },\r\n { category: 'Warehouse', gmros: 3.45, gmroi: 0.26, hurdleRate: 702, avgPrice: 178, spacing: 0.61 },\r\n { category: 'General Merchandise', gmros: 5, gmroi: 3.03, hurdleRate: 3172, avgPrice: 116, spacing: -0.71 },\r\n { category: 'Snacks', gmros: 1.61, gmroi: 2.69, hurdleRate: 3359, avgPrice: 337, spacing: -0.7 },\r\n ]\r\n\r\n }\r\n\r\n init();\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"spacesPlanogramsCtrl\", function ($scope, $state, $translate, ngDialog, spaceService, adminService) {\r\n\r\n //Varibles\r\n var self = this;\r\n\r\n var pageLoaded = false;\r\n\r\n self.isLoading = false;\r\n\r\n self.order = '-lastModifiedDate';\r\n\r\n self.planograms = [];\r\n self.radioOption = 'show';\r\n self.shelves = []\r\n self.count = 1;\r\n self.viewPlanogram = function (planogramId) {\r\n $state.go('spaces.editPlanogram', { planogramId: planogramId });\r\n\r\n }\r\n\r\n self.shelvesInPlanogram = [];\r\n\r\n self.shelvesInPlanogram = [];\r\n self.pageModal = 1;\r\n\r\n self.getStatusName = function (status) {\r\n if (status == 0)\r\n return translations.NewOrModified;\r\n else if (status == 1)\r\n return translations.RequestForApproval;\r\n else if (status == 2)\r\n return translations.Approved;\r\n else if (status == 3)\r\n return translations.Communicated;\r\n }\r\n\r\n self.paginationView = function (pag) {\r\n return self.pageModal == pag ? true : false;\r\n }\r\n\r\n self.nextPagination = function () {\r\n if (self.pageModal < 3) {\r\n ++self.pageModal\r\n }\r\n\r\n }\r\n\r\n self.privousPagination = function () {\r\n if (self.pageModal > 1) {\r\n --self.pageModal\r\n }\r\n }\r\n\r\n self.newPlanogram = null;\r\n\r\n function generateNewShelf() {\r\n return {\r\n id: 0,\r\n name: '',\r\n height: 0,\r\n width: 0,\r\n depth: 0,\r\n };\r\n }\r\n\r\n self.generateNewShelf = function () {\r\n self.newShelf = generateNewShelf()\r\n }\r\n\r\n self.addNewShelf = function () {\r\n spaceService.shelf.saveShelf(self.newShelf).then(function (shelves) {\r\n //console.log('shelves', shelves);\r\n self.shelves = shelves;\r\n pageLoaded = true;\r\n });\r\n\r\n self.showShelf = true\r\n self.newShelf = generateNewShelf()\r\n }\r\n\r\n self.addShelfToPlanogram = function (shelf, add) {\r\n\r\n if (add) {\r\n var copyShelf = Object.assign({}, shelf, { order: self.newPlanogram.shelves.length });\r\n\r\n self.newPlanogram.shelves.push(shelf)\r\n self.newPlanogram.planogramShelf.push({\r\n planogramId: 0,\r\n shelfId: shelf.id,\r\n order: self.newPlanogram.shelves.length,\r\n })\r\n\r\n self.newPlanogram.height = shelf.height\r\n\r\n self.newPlanogram.depth = shelf.depth\r\n }\r\n\r\n if (!add) {\r\n indexShelfDelete = -1;\r\n angular.forEach(self.newPlanogram.shelves, function (_shelf, i) {\r\n if (_shelf.id == shelf.id) {\r\n indexShelfDelete = i\r\n }\r\n });\r\n if (indexShelfDelete >= 0) {\r\n self.newPlanogram.shelves.splice(indexShelfDelete, 1)\r\n self.newPlanogram.planogramShelf.splice(indexShelfDelete, 1);\r\n }\r\n\r\n if (!self.newPlanogram.shelves.length) {\r\n self.newPlanogram.height = 0\r\n\r\n self.newPlanogram.depth = 0\r\n\r\n self.newPlanogram.width = 0\r\n\r\n }\r\n\r\n\r\n }\r\n\r\n var totalWidth = 0\r\n angular.forEach(self.newPlanogram.shelves, function (_shelf) {\r\n totalWidth += _shelf.width\r\n self.newPlanogram.width = totalWidth\r\n });\r\n\r\n self.calHeightLevels()\r\n //console.log('addShelfToPlanogram', shelf, self.newPlanogram.shelves, self.newPlanogram.planogramShelf)\r\n }\r\n\r\n function generateNewPlanogram() {\r\n return {\r\n id: 0,\r\n name: '',\r\n code: '',\r\n stores: [],\r\n subCategories: [],\r\n copyFromPlanogramId: 0,\r\n orientationRightToLeft: true,\r\n width: 1,\r\n height: 1,\r\n depth: 100,\r\n columns: [\r\n {\r\n order: 1,\r\n width: 1,\r\n modules: []\r\n }\r\n ],\r\n };\r\n }\r\n\r\n self.calHeightLevels = function () {\r\n self.newPlanogram.levels = []\r\n var calHeightForLevel = self.newPlanogram.height / self.newPlanogram.numLevels\r\n for (var i = 0; i < self.newPlanogram.numLevels; i++) {\r\n self.newPlanogram.levels.push({\r\n categoryId: null,\r\n categoryName: \"\",\r\n height: calHeightForLevel,\r\n id: 0,\r\n itemPadding: 1,\r\n items: [],\r\n levelNumber: i + 1,\r\n })\r\n }\r\n }\r\n\r\n self.addLevelToNewPlanogram = function () {\r\n if (self.newLevel.height) {\r\n if (self.newLevel.order == 'up') {\r\n self.newPlanogram.levels.push({\r\n categoryId: null,\r\n categoryName: \"\",\r\n height: self.newLevel.height,\r\n id: 0,\r\n itemPadding: 1,\r\n items: [],\r\n //levelNumber: self.newLevel.levelNumber,\r\n })\r\n } else {\r\n self.newPlanogram.levels.unshift({\r\n categoryId: null,\r\n categoryName: \"\",\r\n height: self.newLevel.height,\r\n id: 0,\r\n itemPadding: 1,\r\n items: [],\r\n //levelNumber: self.newLevel.levelNumber,\r\n })\r\n }\r\n\r\n var suma = 0\r\n angular.forEach(self.newPlanogram.levels, function (level, i) {\r\n level.levelNumber = i + 1;\r\n suma += level.height\r\n })\r\n self.newPlanogram.height = suma\r\n }\r\n }\r\n\r\n self.planogramToCloneCode = '';\r\n self.planogramToCloneName = '';\r\n\r\n self.openPlanogramCloneDialog = function (planogramId, planogramCode, planogramName) {\r\n\r\n if (planogramId) {\r\n\r\n self.planogramToCloneCode = planogramCode;\r\n self.planogramToCloneName = planogramName;\r\n\r\n self.newPlanogram = generateNewPlanogram();\r\n self.newPlanogram.copyFromPlanogramId = planogramId;\r\n\r\n\r\n ngDialog.open({\r\n template: 'planogramCloneDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-500',\r\n scope: $scope\r\n });\r\n\r\n }\r\n }\r\n\r\n self.isCloning = false;\r\n\r\n self.clonePlanogram = function () {\r\n self.isCloning = true;\r\n spaceService.planograms.savePlanogram(self.newPlanogram).then(function (res) {\r\n self.isCloning = false;\r\n\r\n loadPlanograms();\r\n\r\n ngDialog.close();\r\n\r\n swal(translations.SavedPlanogramSwal, translations.SavedPlanogramaSwalSubtitle, 'success');\r\n\r\n }).catch(function (error) {\r\n swal(translations.ErrorTitleSwal, translations.ErrorWhenSaveThePlanogram, 'error');\r\n });\r\n }\r\n\r\n self.deletePlanogram = function (planogramId, planogramCode, planogramName) { \r\n swal({\r\n title: translations.SureDeletePlanogramSwal + planogramCode + ' - ' + planogramName,\r\n text: translations.SureDeletePlanogramSwalDesc,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n spaceService.planograms.deletePlanogram(planogramId).then(function () {\r\n swal(translations.ErasedPlanogram, translations.ErasedPlanogramSubtitle, 'success');\r\n\r\n //Saco el planograma borrado del Array\r\n var indexToDelete = -1;\r\n angular.forEach(self.planograms, function (planogram, i) {\r\n if (planogram.id == planogramId) {\r\n indexToDelete = i;\r\n }\r\n });\r\n if (indexToDelete >= 0) {\r\n self.planograms.splice(indexToDelete, 1);\r\n }\r\n\r\n }).catch(function (error) {\r\n swal(translations.ErrorTitleSwal, translations.AccessDenied, 'error');\r\n });\r\n }\r\n });\r\n }\r\n\r\n function isValidField(field) {\r\n if (field == undefined || field == null || field == '')\r\n return false;\r\n\r\n return true;\r\n }\r\n\r\n self.isValid = function () {\r\n if (self.pageModal == 1) return !(isValidField(self.newPlanogram.name) && isValidField(self.newPlanogram.code) && self.newPlanogram.clusters.length && isValidField(self.newPlanogram.category))\r\n if (self.pageModal == 2) return !self.newPlanogram.planogramShelf.length\r\n }\r\n\r\n self.saveNewEditPlanogram = function () {\r\n swal({\r\n title: translations.SavePlanogramSwalTitle,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n if (!self.isSaving) {\r\n self.isSaving = true;\r\n //console.log('newPlanogram', self.newPlanogram);\r\n var data = {\r\n name: self.newPlanogram.name,\r\n code: self.newPlanogram.code,\r\n width: self.newPlanogram.width,\r\n depth: self.newPlanogram.depth,\r\n height: self.newPlanogram.height,\r\n isPlanogram: self.newPlanogram.isPlanogram,\r\n maximumNumberOfItems: self.newPlanogram.maximumNumberOfItems,\r\n planogramType: self.newPlanogram.planogramType,\r\n levels: self.newPlanogram.levels,\r\n clusters: self.newPlanogram.clusters,\r\n subCategories: self.newPlanogram.subCategories,\r\n //discriminator: self.newPlanogram.discriminator,\r\n //clusterId: self.newPlanogram.cluster ? self.newPlanogram.cluster.id : null,\r\n category: self.newPlanogram.category,\r\n categoryName: self.newPlanogram.category ? self.newPlanogram.category.name : null,\r\n categoryId: self.newPlanogram.category ? self.newPlanogram.category.id : null,\r\n //shelves: self.newPlanogram.shelves,\r\n planogramShelf: self.newPlanogram.planogramShelf\r\n }\r\n return\r\n\r\n if (!(isValidField(self.newPlanogram.name) && isValidField(self.newPlanogram.code) && self.newPlanogram.clusters.length && isValidField(self.newPlanogram.category))) {\r\n swal(translations.ValidationSwalTitle, translations.ValidationSwalSubtitle, 'error');\r\n return;\r\n }\r\n\r\n spaceService.planograms.savePlanogram(data).then(function (res) {\r\n self.planograms = res;\r\n pageLoaded = true;\r\n swal(translations.SavedPlanogramSwal, translations.SavedPlanogramaSwalSubtitle, 'success');\r\n ngDialog.close();\r\n })\r\n self.isSaving = false;\r\n\r\n }\r\n }\r\n });\r\n }\r\n\r\n $scope.$watch('ct.newPlanogram.category', function (newVal, oldVal) {\r\n if (newVal != oldVal && self.newPlanogram.category.id) self.filterSubCategories(self.newPlanogram.category.id);\r\n })\r\n\r\n self.filterSubCategories = function (categoryId) {\r\n\r\n self.subCategories = self.allSubCategories.filter(function (subCategory) {\r\n return subCategory.parentId === categoryId;\r\n });\r\n\r\n }\r\n\r\n //Load Data\r\n function loadPlanograms() {\r\n self.isLoading = true;\r\n spaceService.planograms.getPlanograms().then(function (planograms) {\r\n\r\n\r\n self.planograms = planograms;\r\n self.isLoading = false;\r\n pageLoaded = true;\r\n });\r\n\r\n }\r\n\r\n\r\n var translations = null;\r\n\r\n self.stores = [];\r\n\r\n function loadStores() {\r\n spaceService.stores.getStores(false).then(function (stores) {\r\n self.stores = stores;\r\n });\r\n }\r\n\r\n function init() {\r\n\r\n $translate([\"ModalTitleCreatePlanogram\", \"ModalTitleEditPlanogram\", \"SavePlanogramSwalTitle\", \"ValidationSwalTitle\"\r\n , \"ValidationSwalSubtitle\", \"SavedPlanogramSwal\", \"SavedPlanogramaSwalSubtitle\", \"CancelSwal\", \"ContinueSwal\", \"NewOrModified\", \"RequestForApproval\", \"Approved\", \"Communicated\", \"SureDeletePlanogramSwal\", \"SureDeletePlanogramSwalDesc\"\r\n , \"ErasedPlanogram\", \"ErasedPlanogramSubtitle\", \"ErrorTitleSwal\", \"AccessDenied\"])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n\r\n loadPlanograms();\r\n\r\n loadStores();\r\n\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"CreatePlanogramCtrl\", function ($scope, $stateParams, $state, $translate, $timeout, spaceService, adminService, authService, Upload, serverService, DnDService, ngDialog) {\r\n //Varibles\r\n var self = this;\r\n self.spaces_edit_planograms = authService.hasPermission('spaces_edit_planograms');\r\n self.planogram = null;\r\n self.oldPlanogram = null;//almacena el planograma orignial cuando se selecciona un modulo\r\n self.isLoading = true;\r\n self.isBusy = false;\r\n self.categories = [];\r\n self.selectedCategories = [];\r\n self.subCategories = [];\r\n self.stores = [];\r\n self.showElements = true;\r\n self.showDoor = true;\r\n self.selectedPlanogram = null;\r\n self.files = null;\r\n self.isEditPlanogram = true;\r\n self.showMassiveLoad = false;\r\n self.showlevelmeasurebuttons = false;\r\n\r\n /*KRC*/\r\n //Habilita o desHabilita StackedWithPrev\r\n self.__columnStackedWithPrev_enabled = true;\r\n\r\n //button Collapsed\r\n self.isNewLevelPlanogramCollapsed = false;\r\n self.isSizesPlanogramPegCollapsed = false;\r\n self.isDimensionsCollapsed = false;\r\n\r\n\r\n self.spaceModuleType = {\r\n 1: 'Shelf',\r\n 2: 'Peg',\r\n 3: 'Refrigerator'\r\n }\r\n self.stateChange = true;\r\n self.showLevelButtonAction = false;\r\n function generateNewPlanogram() {\r\n return {\r\n id: 0,\r\n name: '',\r\n code: '',\r\n stores: [],\r\n subCategories: [],\r\n orientationRightToLeft: true,\r\n width: 1,\r\n height: 1,\r\n depth: 100,\r\n columns: [\r\n {\r\n order: 1,\r\n width: 1,\r\n modules: []\r\n }\r\n ],\r\n };\r\n }\r\n\r\n self.onCategorySelected = function (category) {\r\n self.subCategories = [];\r\n angular.forEach(self.selectedCategories, function (category) {\r\n angular.forEach(category.subcategories, function (subcategory) {\r\n self.subCategories.push(subcategory);\r\n });\r\n });\r\n }\r\n\r\n self.onEnterStoreCodes = function () {\r\n var separators = [' ', '\\n'];\r\n var delimitedCodes = self.storeCodes.split(new RegExp(separators.join('|'), 'g'));\r\n var trimedCodes = delimitedCodes.map(function (s) { return s.trim(); });\r\n\r\n angular.forEach(self.stores, function (store) {\r\n if (trimedCodes.includes(store.code) && !self.planogram.stores.map(function (s) { return s.code; }).includes(store.code))\r\n self.planogram.stores.push(store);\r\n });\r\n self.showMassiveLoad = false;\r\n self.storeCodes = '';\r\n }\r\n\r\n function isValidField(field) {\r\n if (field == undefined || field == null || field == '')\r\n return false;\r\n\r\n return true;\r\n }\r\n\r\n self.saveNewEditPlanogram = function () {\r\n\r\n //Validamos que tenga todos los datos\r\n if (!isValidField(self.planogram.name)\r\n || !isValidField(self.planogram.code)\r\n || self.planogram.stores.length == 0\r\n || self.planogram.subCategories.length == 0\r\n || self.planogram.columns.length == 0\r\n || self.planogram.columns[0].modules.length == 0) {\r\n self.isSaving = false;\r\n\r\n setTimeout(function () {\r\n swal(translations.ValidationSwalTitle, translations.ValidationToSaveAplanogram, 'error');\r\n }, 20)\r\n self.isBusy = false;\r\n return;\r\n }\r\n\r\n\r\n swal({\r\n title: translations.SavePlanogramSwalTitle,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n if (!self.isSaving) {\r\n self.isSaving = true;\r\n self.isBusy = true;\r\n\r\n var data = {}\r\n if (self.isEditPlanogram) {\r\n data = self.planogram;\r\n } else {\r\n data = {\r\n id: $stateParams.planogramId,\r\n name: self.planogram.name,\r\n code: self.planogram.code,\r\n width: self.planogram.width,\r\n depth: self.planogram.depth,\r\n height: self.planogram.height,\r\n stores: self.planogram.stores,\r\n //clusters: self.planogram.clusters,\r\n subCategories: self.planogram.subCategories,\r\n //discriminator: self.planogram.discriminator,\r\n //clusterId: self.planogram.cluster ? self.planogram.cluster.id : null,\r\n category: self.planogram.category,\r\n categoryName: self.planogram.category ? self.planogram.category.name : null,\r\n categoryId: self.planogram.category ? self.planogram.category.id : null,\r\n orientationRightToLeft: self.planogram.orientationRightToLeft,\r\n columns: self.planogram.columns,\r\n }\r\n }\r\n\r\n spaceService.planograms.savePlanogram(data).then(function (res) {\r\n self.isBusy = false;\r\n pageLoaded = true;\r\n self.goBack();\r\n swal(translations.SavedPlanogramSwal, translations.SavedPlanogramaSwalSubtitle, 'success');\r\n\r\n }).catch(function (error) {\r\n swal(translations.ErrorTitleSwal, translations.ErrorWhenSaveThePlanogram, 'error');\r\n });\r\n\r\n self.isSaving = false;\r\n\r\n self.stateChange = false;\r\n }\r\n }\r\n });\r\n }\r\n\r\n self.showAssignStoresDialog = function () {\r\n\r\n //marco las tiendas que el usuario ya tiene\r\n angular.forEach(self.stores, function (store) {\r\n angular.forEach(self.layout.stores, function (layoutStore) {\r\n if (store.id == layoutStore.id)\r\n store.selected = true;\r\n //store.selected = self.layout.stores.indexOf(store.id) != -1 ? true : false;\r\n\r\n })\r\n });\r\n\r\n self.searchStore = '';\r\n }\r\n\r\n self.goBack = function () {\r\n if ($stateParams.planogramId == 0)\r\n $state.go('spaces.planograms');\r\n else $state.go('spaces.editPlanogram', {\r\n planogramId: $stateParams.planogramId,\r\n itemId: '0',\r\n clusterId: '0'\r\n });\r\n\r\n\r\n }\r\n\r\n $scope.$on('$stateChangeStart', function (event) {\r\n //console.log('$stateChangeStart', event)\r\n if (self.stateChange) {\r\n var answer = confirm(translations.AlertWillLoseChanges)\r\n if (!answer) {\r\n event.preventDefault();\r\n }\r\n }\r\n });\r\n\r\n\r\n\r\n\r\n self.changeZoom = function (increase) {\r\n if (increase)\r\n self.zoom += 20\r\n else if (self.zoom >= 105)\r\n self.zoom -= 20;\r\n }\r\n\r\n self.centerZoom = function () {\r\n self.zoom += 5;\r\n\r\n $timeout(() => self.zoom = 100, 0);\r\n\r\n }\r\n\r\n self.setZoom = function (percentage) {\r\n self.zoom = percentage;\r\n }\r\n\r\n //COMPONENTE VIEJO\r\n self.showListElements = function () {\r\n self.showElements = true;\r\n self.models.selected = null;\r\n }\r\n\r\n //COMPONENTE VIEJO\r\n self.changeWidth = 0;\r\n self.setModuleWidth = function (changeWidth) {\r\n if (changeWidth < (Math.ceil(self.models.selected.minWidth) + 2)) {\r\n self.changeWidth = (Math.ceil(self.models.selected.minWidth) + 2);\r\n swal(translations.WidthNotAllowed, translations.WidthNotAllowedSubtitle + (Math.ceil(self.models.selected.minWidth) + 2), 'warning');\r\n self.models.selected.width = (Math.ceil(self.models.selected.minWidth) + 2);\r\n } else {\r\n self.models.selected.width = changeWidth;\r\n }\r\n }\r\n\r\n self.newLevel = {\r\n order: 'up'\r\n }\r\n\r\n //CAMBIAR EL MODELS.SELECTED\r\n self.addLevelToNewPlanogram = function () {\r\n if (self.newLevel.height) {\r\n if (self.newLevel.order == 'up') {\r\n self.models.selected.levels.push({\r\n categoryId: null,\r\n categoryName: \"\",\r\n height: self.newLevel.height,\r\n id: 0,\r\n itemPadding: 1,\r\n items: [],\r\n //levelNumber: self.newLevel.levelNumber,\r\n });\r\n\r\n } else {\r\n self.models.selected.levels.unshift({\r\n categoryId: null,\r\n categoryName: \"\",\r\n height: self.newLevel.height,\r\n id: 0,\r\n itemPadding: 1,\r\n items: [],\r\n //levelNumber: self.newLevel.levelNumber,\r\n });\r\n\r\n }\r\n\r\n self.newLevel.height = \"\";\r\n var suma = 0\r\n angular.forEach(self.models.selected.levels, function (level, i) {\r\n level.levelNumber = i + 1;\r\n suma += level.height\r\n })\r\n self.models.selected.height = suma;\r\n self.planogram.columns[0].modules[0] = self.models.selected;\r\n self.viewAllModules();\r\n }\r\n };\r\n\r\n //TODO hacer version nuevo componente\r\n self.copyModule = function () {\r\n //1- Copia la columna con su modulo\r\n var newColumn = self.planogram.columns[0];\r\n self.planogram = angular.copy(self.oldPlanogram);\r\n\r\n //2- Agrega la columna nueva al final\r\n newColumn.modules[0].id = 0;\r\n newColumn.modules[0].levels.forEach(function (x) {\r\n x.items = [];\r\n x.id = 0;\r\n x.moduleId = 0;\r\n });\r\n\r\n newColumn.order = self.planogram.columns.length + 1;\r\n newColumn.id = 0;\r\n\r\n self.planogram.columns.push(newColumn);\r\n\r\n updateSizePlanogram(self.planogram);\r\n\r\n //3- Fuerza una nueva referencia del planograma para que se detecte el cambio en los componentes.\r\n self.planogram = angular.copy(self.planogram);\r\n\r\n //4- Cambia lasvariables para cambiar el modo vista\r\n self.models.selected = null;\r\n self.showElements = true;\r\n self.showlevelmeasurebuttons = false;\r\n\r\n }\r\n\r\n\r\n self.deleteModule = function () {\r\n //1- Elimina la columna con su modulo\r\n var deletedColumn = self.planogram.columns[0];\r\n\r\n if (deletedColumn.modules[0].levels.some(function (x) { return x.items.length; })) {\r\n swal('Modulo con Items'\r\n , 'no se puede eliminar un modulo que contiene items'\r\n , 'warning');\r\n return;\r\n }\r\n\r\n self.planogram = angular.copy(self.oldPlanogram);\r\n\r\n for (var i = 0; i < self.planogram.columns.length; i++) {\r\n if (self.planogram.columns[i].order === deletedColumn.order) {\r\n self.planogram.columns.splice(i, 1);\r\n }\r\n }\r\n\r\n //2- Reorganiza el orden de columnas si es que no se elimino la ultima\r\n if (self.planogram.columns.length) {\r\n\r\n var nextColumn;\r\n var i = 1;\r\n do {\r\n\r\n nextColumn = self.planogram.columns.find(function (x) {\r\n return x.order === deletedColumn.order + i;\r\n });\r\n\r\n if (nextColumn)\r\n nextColumn.order--;\r\n\r\n i++;\r\n\r\n } while (nextColumn);\r\n }\r\n else {\r\n self.planogram.columns = [\r\n {\r\n order: 1,\r\n width: 1,\r\n modules: []\r\n }\r\n ];\r\n }\r\n\r\n updateSizePlanogram(self.planogram);\r\n\r\n //3- Fuerza una nueva referencia del planograma para que se detecte el cambio en los componentes.\r\n self.planogram = angular.copy(self.planogram);\r\n\r\n //4- Cambia lasvariables para cambiar el modo vista\r\n self.models.selected = null;\r\n self.showElements = true;\r\n self.showlevelmeasurebuttons = false;\r\n\r\n\r\n }\r\n self.showModulesOrder = false;\r\n self.sortModules = function sortModules() {\r\n self.showModulesOrder = !self.showModulesOrder;\r\n self.planogram = angular.copy(self.planogram);\r\n }\r\n\r\n /**\r\n * 1- self.planogram vuelve a su origen.\r\n * 2- aplica los cambios en niveles.\r\n * 3- Fuerza una nueva referencia del planograma para que se detecte el cambio en los componentes.\r\n * 4- cambia las variables para cambiar el modo vista.\r\n */\r\n self.viewAllModules = function viewAllModules() {\r\n\r\n //1- self.planogram vuelve a su origen\r\n var changedColumn = self.planogram.columns[0];\r\n self.planogram = angular.copy(self.oldPlanogram);\r\n\r\n //2- aplica los cambios en niveles\r\n\r\n for (var i = 0; i < self.planogram.columns.length; i++) {\r\n if (self.planogram.columns[i].order === changedColumn.order) {\r\n self.planogram.columns[i] = angular.copy(changedColumn);\r\n }\r\n }\r\n\r\n //3- Fuerza una nueva referencia del planograma para que se detecte el cambio en los componentes.\r\n self.planogram = angular.copy(self.planogram);\r\n\r\n //4- cambia lasvariables para cambiar el modo vista\r\n self.models.selected = null;\r\n self.showElements = true;\r\n self.showlevelmeasurebuttons = false;\r\n }\r\n\r\n self.getSelectedColumn = function () {\r\n var selectedColumn = null;\r\n angular.forEach(self.planogram.columns, function (column, _indexColumn) {\r\n angular.forEach(column.modules, function (module, _indexModule) {\r\n if (module.isSelected) {\r\n selectedColumn = column;\r\n }\r\n });\r\n\r\n });\r\n\r\n return selectedColumn;\r\n }\r\n\r\n self.getSelectedModule = function () {\r\n var selectedModule = null;\r\n\r\n angular.forEach(self.planogram.columns, function (column, _indexColumn) {\r\n angular.forEach(column.modules, function (module, _indexModule) {\r\n if (module.isSelected) {\r\n selectedModule = module;\r\n }\r\n });\r\n\r\n });\r\n\r\n return selectedModule;\r\n }\r\n\r\n //COMPONENTE VIEJO\r\n self.showLevelMeasureButtons = function () {\r\n if (self.selectedPlanogram)\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n //Load Data\r\n function loadData() {\r\n Promise.all([\r\n spaceService.stores.getStores(false).then(function (stores) {\r\n self.stores = stores;\r\n })\r\n ,\r\n adminService.categories.getCategoriesWithSubcategories().then(function (categories) {\r\n self.categories = categories;\r\n })\r\n ]).then(function (result) {\r\n\r\n if (self.isEditPlanogram) {\r\n initEditSession();\r\n }\r\n\r\n\r\n if ($stateParams.copyFromPlanogramId !== '0' && !self.isImporting()) {\r\n spaceService.planograms.getColumnsFromPlanogram($stateParams.copyFromPlanogramId).then(function (columns) {\r\n self.planogram.columns = columns;\r\n self.isLoading = false;\r\n self.zoom = self.showPlanogramComponentSvg() ? 800 : 100;\r\n });\r\n }\r\n else {\r\n $timeout(function () {\r\n self.isLoading = false;\r\n self.zoom = self.showPlanogramComponentSvg() ? 800 : 100;\r\n }, 0);\r\n }\r\n\r\n })\r\n }\r\n\r\n var translations = null;\r\n\r\n function initEditSession() {\r\n\r\n //cargo las categorias que trae el planograma\r\n var uniqueParents = _.uniq(_.map(self.planogram.subCategories, 'parent'));\r\n angular.forEach(uniqueParents, function (scParentName) {\r\n var filteredCategories = self.categories.filter(function (x) {\r\n return x.name === scParentName;\r\n });\r\n\r\n angular.forEach(filteredCategories, function (cat) {\r\n self.selectedCategories.push(cat);\r\n self.onCategorySelected(cat);\r\n });\r\n\r\n });\r\n\r\n self.originalCategoryIds = _.uniq(_.map(self.selectedCategories, 'id'));\r\n self.originalSubcategoryIds = _.uniq(_.map(self.planogram.subCategories, 'id'));\r\n self.originalStoreIds = _.uniq(_.map(self.planogram.stores, 'id'));\r\n\r\n $scope.$watch('ct.selectedCategories', function (newVal, oldVal) {\r\n if (newVal.length < oldVal.length) {\r\n if (_.difference(self.originalCategoryIds, _.uniq(_.map(newVal, 'id'))) > 0) {\r\n swal(translations.ActionNotAllowed, translations.ActionNotAllowedSubtitle, 'error');\r\n self.selectedCategories = oldVal;\r\n self.onCategorySelected();\r\n }\r\n }\r\n });\r\n $scope.$watch('ct.planogram.subCategories', function (newVal, oldVal) {\r\n if (newVal.length < oldVal.length) {\r\n if (_.difference(self.originalSubcategoryIds, _.uniq(_.map(newVal, 'id'))) > 0) {\r\n swal(translations.ActionNotAllowed, translations.ActionNotAllowedSubtitle, 'error');\r\n self.planogram.subCategories = oldVal;\r\n }\r\n }\r\n });\r\n\r\n //$scope.$watch('ct.models.selected', function (newVal, oldVal) {\r\n // if (newVal != oldVal) {\r\n\r\n // if (newVal == null) {\r\n // self.selectedPlanogram = null;\r\n // self.centerZoom();\r\n // }\r\n // else {\r\n\r\n // self.selectedPlanogram = self.planogram;\r\n // self.setZoom(100 * self.planogram.columns.length);\r\n // }\r\n\r\n // }\r\n\r\n //});\r\n }\r\n\r\n\r\n\r\n function init() {\r\n self.isEditPlanogram = $stateParams.planogramId !== '0' && !self.isImporting();\r\n $translate([\"ModalTitleCreatePlanogram\", \"ModalTitleEditPlanogram\", \"SavePlanogramSwalTitle\", \"ValidationSwalTitle\"\r\n , \"ValidationSwalSubtitle\", \"SavedPlanogramSwal\", \"SavedPlanogramaSwalSubtitle\", \"CancelSwal\", \"ContinueSwal\", \"AlertWillLoseChanges\",\r\n \"ValidationToSaveAplanogram\", \"ErrorTitleSwal\", \"ErrorWhenSaveThePlanogram\", \"WidthNotAllowed\", \"WidthNotAllowedSubtitle\", \"ActionNotAllowed\",\r\n \"ActionNotAllowedSubtitle\", \"CanNotDeleteStores\", \"Shelf\", \"Refrigerator\", \"IndividualLoad\", \"MassiveLoad\", \"EnterCodesSeparatedByComma\", \"Apply\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n self.models = {\r\n selected: null,\r\n templates: [\r\n {\r\n type: 'Shelf',\r\n name: translations.Shelf,\r\n imageUrl: '/assets/images/spaces/templates/planogram.png',\r\n isRefrigerator: false\r\n },\r\n {\r\n type: 'Shelf',\r\n name: translations.Refrigerator,\r\n imageUrl: '/assets/images/spaces/templates/heladera.png',\r\n isRefrigerator: true\r\n },\r\n {\r\n type: 'Peg',\r\n name: 'Ganchera',\r\n imageUrl: '/assets/images/spaces/templates/gancheras.jpg',\r\n isRefrigerator: false\r\n }\r\n ],\r\n };\r\n\r\n });\r\n\r\n\r\n if (!self.isImporting()\r\n && angular.isDefined($stateParams.planogramId)\r\n && $stateParams.planogramId !== '0') {\r\n spaceService.planograms.getPlanogramInfo($stateParams.planogramId).then(function (results) {\r\n self.planogram = results;\r\n angular.forEach(self.planogram.columns,\r\n function (column) {\r\n angular.forEach(column.modules,\r\n function (module) {\r\n module.minWidth = 0;\r\n angular.forEach(module.levels,\r\n function (level) {\r\n level.minHeight = 0;\r\n level.usedWidth = 0;\r\n angular.forEach(level.items,\r\n function (item) {\r\n level.usedWidth += (item.selectedUnitOfMeasure.width * item.facings\r\n );\r\n if ((item.selectedUnitOfMeasure.height * item.stackAbove) >\r\n level.minHeight)\r\n level.minHeight = (item.selectedUnitOfMeasure.height *\r\n item.stackAbove);\r\n });\r\n if (level.usedWidth > module.minWidth) module.minWidth = level.usedWidth;\r\n\r\n });\r\n //module.type = self.spaceModuleType[module.type];\r\n });\r\n });\r\n\r\n loadData();\r\n });\r\n } else {\r\n self.planogram = generateNewPlanogram();\r\n loadData();\r\n }\r\n }\r\n\r\n /**\r\n * Devuelve verdadero si hay que mostrar el componente SVG del planograma, falso en caso contrario.\r\n * Verifica que no se este cargando la pagina y el nombre del estado de la aplicación.\r\n * @returns Verdadero si hay que mostrar el componente SVG del planograma, falso en caso contrario.\r\n */\r\n self.showPlanogramComponentSvg = function showPlanogramComponentSvg() {\r\n var ret = !self.isLoading\r\n && ($state.current.name === 'spaces.createPlanogram')\r\n && self.planogram && self.planogram.columns.length;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve verdadero si hay que mostrar el componente HTML del planograma, falso en caso contrario.\r\n * Verifica que no se este cargando la pagina y el nombre del estado de la aplicación.\r\n * @returns Verdadero si hay que mostrar el componente HTML del planograma, falso en caso contrario.\r\n */\r\n self.showPlanogramComponentHtml = function showPlanogramComponentHtml() {\r\n var ret = !self.isLoading\r\n && ($state.current.name === 'spaces.createPlanogramOld')\r\n && self.planogram && self.planogram.columns.length;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve verdadero si se esta en el proceso para importación de un planograma, falso en caso contrario.\r\n * @returns Verdadero si se esta en el proceso para importación de un planograma, falso en caso contrario.\r\n */\r\n self.isImporting = function isImporting() {\r\n var ret = $state.current.name === 'spaces.importPlanogram';\r\n return ret;\r\n }\r\n\r\n self.saveImportPlanogram = function saveImportPlanogram() {\r\n //Validamos que tenga todos los datos\r\n if (self.planogram.stores.length === 0\r\n || self.planogram.subCategories.length === 0) {\r\n self.isSaving = false;\r\n setTimeout(function () {\r\n // TODO: Crear los textos para la validación de la importación.\r\n swal(translations.ValidationSwalTitle, translations.ValidationToSaveAplanogram, 'error');\r\n },\r\n 20);\r\n self.isBusy = false;\r\n return;\r\n }\r\n swal({\r\n title: translations.SavePlanogramSwalTitle,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n if (!self.isSaving) {\r\n self.isSaving = true;\r\n self.isBusy = true;\r\n var url = ian.urlCombine(serverService.getApiUrl(), '/space/planogram/import-pln');\r\n Upload.upload({\r\n url: url,\r\n data: {\r\n files: self.files,\r\n categories: self.selectedCategories.map(function (item) {\r\n return item.id;\r\n }),\r\n subCategories: self.planogram.subCategories.map(function (item) {\r\n return item.id;\r\n }),\r\n stores: self.planogram.stores.map(function (item) {\r\n return item.id;\r\n })\r\n }\r\n }).then(function (res) {\r\n //self.planograms = res;\r\n self.planogram = generateNewPlanogram();\r\n self.isBusy = false;\r\n pageLoaded = true;\r\n // self.goBack();\r\n\r\n var type;\r\n var message = translations.SavedPlanogramaSwalSubtitle;\r\n var id = res.data.id;\r\n var warnings = res.data.warnings;\r\n var missingItems = res.data.missingItems;\r\n var missingDimensions = res.data.missingDimensions;\r\n var warningMessages = [];\r\n var saveMessageCallback = function () {\r\n $state.go('spaces.editPlanogram',\r\n {\r\n planogramId: id,\r\n itemId: 0,\r\n clusterId: 0\r\n });\r\n self.stateChange = false;\r\n }\r\n\r\n if (warnings.length) {\r\n if (missingItems.length) {\r\n missingItems = _.uniq(missingItems);\r\n warningMessages.push('Faltan ' + missingItems.length + ' productos.');\r\n }\r\n\r\n if (missingDimensions.length) {\r\n missingDimensions = _.uniq(missingDimensions);\r\n warningMessages.push('Falta configurar las dimensiones de ' + missingDimensions.length + ' productos');\r\n }\r\n\r\n swal.close();\r\n ngDialog.open({\r\n template: 'importPlnExceptionDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-450',\r\n closeByEscape: false,\r\n closeByDocument: false,\r\n closeByNavigation: false,\r\n controller: ['$scope', function ($dialogScope) {\r\n $dialogScope.title = translations.SavedPlanogramSwal;\r\n $dialogScope.message = message;\r\n $dialogScope.warningMessages = warningMessages;\r\n $dialogScope.missingItems = missingItems;\r\n $dialogScope.missingDimensions = missingDimensions;\r\n $dialogScope.closeDialog = function () {\r\n $dialogScope.closeThisDialog('');\r\n saveMessageCallback();\r\n };\r\n\r\n //$scope.download = function () {\r\n\r\n // var element = document.createElement('a');\r\n // var content = buildFileContent($scope.url, $scope.message, $scope.stackTrace)\r\n // element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(content));\r\n // element.setAttribute('download', getFileName());\r\n\r\n // element.style.display = 'none';\r\n // document.body.appendChild(element);\r\n\r\n // element.click();\r\n\r\n // document.body.removeChild(element);\r\n //}\r\n }]\r\n });\r\n\r\n } else {\r\n swal({\r\n title: translations.SavedPlanogramSwal,\r\n text: message,\r\n type: 'success'\r\n }, saveMessageCallback);\r\n }\r\n }).catch(function (err) {\r\n var message = translations.ErrorWhenSaveThePlanogram;\r\n if (err && err.data && angular.isString(err.data)) {\r\n message += '\\n' + err.data;\r\n }\r\n\r\n swal(translations.ErrorTitleSwal,\r\n message,\r\n 'error');\r\n self.isBusy = false;\r\n }).finally(function () {\r\n self.isSaving = false;\r\n });\r\n }\r\n }\r\n });\r\n }\r\n //TODO cambiar models.selected\r\n self.planogramOnClickHandler = function planogramOnClickHandler($event, planogram, column, module) {\r\n console.log('CreatePlanogramCtrl::planogramOnClickHandler\\n\\t$event: %o\\n\\tplanogram: %o\\n\\tcolumn: %o\\n\\tmodule: %o',\r\n $event,\r\n planogram,\r\n column,\r\n module);\r\n if (self.showlevelmeasurebuttons)\r\n return;\r\n\r\n var selectedPlanogram = angular.copy(planogram);;\r\n selectedPlanogram.columns = [column];\r\n selectedPlanogram.columns[0].modules = [module];\r\n\r\n self.oldPlanogram = angular.copy(self.planogram);\r\n self.planogram = angular.copy(selectedPlanogram);\r\n\r\n self.models.selected = selectedPlanogram.columns[0].modules[0];\r\n\r\n self.showElements = false;\r\n self.showlevelmeasurebuttons = true;\r\n }\r\n\r\n self.onDropHandler = function onDropHandler($event) {\r\n var data = DnDService.getData();\r\n console.log(\"CreatePlanogramCtrl::onDropHandler\\n\\t$event: %o\\n\\tdata: %o\", $event, data);\r\n self.newModule = {\r\n id: 0,\r\n type: data.type,\r\n isRefrigerator: data.isRefrigerator,\r\n width: 0,\r\n height: 0,\r\n depth: 0,\r\n order: 0,\r\n numLevels: 1,\r\n levels: []\r\n };\r\n self.saveNewModuleSuccessful = false;\r\n ngDialog.open({\r\n template: 'modulesDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: $scope\r\n }).closePromise.then(function (data) {\r\n if (!self.saveNewModuleSuccessful)\r\n return false;\r\n\r\n createLevels(self.newModule);\r\n\r\n if (self.planogram.columns\r\n && self.planogram.columns.length === 1\r\n && self.planogram.columns[0].modules.length === 0) {\r\n self.planogram.columns[0].modules.push(self.newModule);\r\n }\r\n else {\r\n var newColumn = {\r\n modules: [self.newModule],\r\n width: self.newModule.width,\r\n order: self.planogram.columns.length + 1\r\n };\r\n self.planogram.columns.push(newColumn)\r\n }\r\n updateSizePlanogram(self.planogram);\r\n self.planogram = angular.copy(self.planogram);\r\n return true;\r\n });\r\n\r\n\r\n }\r\n\r\n //TODO: esta funcion no deberia crear los niveles\r\n function updateSizePlanogram(planogram) {\r\n planogram.width = 0;\r\n planogram.height = 0;\r\n planogram.depth = 0;\r\n angular.forEach(planogram.columns, function (column) {\r\n column.width = 0;\r\n column.height = 0;\r\n column.depth = 0;\r\n angular.forEach(column.modules, function (module) {\r\n if (module.width > column.width) column.width = module.width;\r\n column.height += module.height;\r\n if (module.depth > column.depth) column.depth = module.depth;\r\n })\r\n if (!column.width) column.width = 1;\r\n planogram.width += column.width;\r\n if (column.height > planogram.height) planogram.height = column.height;\r\n if (column.depth > planogram.depth) planogram.depth = column.depth;\r\n })\r\n\r\n calcWidthPercentage(planogram);\r\n\r\n }\r\n\r\n function calcWidthPercentage(planogram) {\r\n angular.forEach(planogram.columns, function (column) {\r\n //calculo el ancho de cada columna\r\n column.widthPercentage = column.width / planogram.width * 100;\r\n //calculo el ancho de cada modulo\r\n angular.forEach(column.modules, function (_module) {\r\n _module.widthPercent = _module.width / column.width * 100;\r\n })\r\n })\r\n }\r\n\r\n self.addNewModule = function () {\r\n\r\n if (self.newModule.numLevels <= 0 || self.newModule.width <= 0 || self.newModule.height <= 0 || self.newModule.depth <= 0) {\r\n self.validation = true;\r\n }\r\n else {\r\n self.saveNewModuleSuccessful = true;\r\n ngDialog.close();\r\n }\r\n }\r\n\r\n function createLevels(module) {\r\n module.levels = [];\r\n var heightForLevel = module.height / module.numLevels;\r\n for (var i = 0; i < module.numLevels; i++) {\r\n module.levels.push({\r\n categoryId: null,\r\n categoryName: \"\",\r\n height: heightForLevel,\r\n id: 0,\r\n itemPadding: 1,\r\n items: [],\r\n levelNumber: i + 1,\r\n })\r\n }\r\n }\r\n\r\n /**\r\n * Incremente o reduce la altura de un nivel\r\n * Esta funcion es llamada solo cuando el planograma esta en modo edicion por lo que siempre tendras un unico modulo\r\n */\r\n self.planogramOnChangeLevelHeight = function planogramOnChangeLevelHeight($event, planogram, column, module, level, action) {\r\n\r\n //trae al nivel por numero ya que si es nuevo no sirve buscar por id\r\n var levelLocal = self.planogram.columns[0].modules[0].levels.find(function (l) {\r\n return l.levelNumber === level.levelNumber;\r\n });\r\n\r\n if (action === 'increase') {\r\n levelLocal.height += 1;\r\n self.planogram.columns[0].modules[0].height += 1;\r\n }\r\n else if (action === 'reduce') {\r\n var highestItemHeight = getHighestItemHeight(levelLocal);\r\n if (highestItemHeight > levelLocal.height - 1) {\r\n swal('altura no permitida'\r\n , 'altura del nivel no puede ser menor que la altura del productos mas alto del nivel, altura minimo permitido: ' + highestItemHeight\r\n , 'warning');\r\n }\r\n else {\r\n levelLocal.height -= 1;\r\n self.planogram.columns[0].modules[0].height -= 1;\r\n }\r\n }\r\n\r\n //Fuerza una nueva referencia del planograma para que se detecte el cambio en los componentes.\r\n self.planogram = angular.copy(self.planogram);\r\n }\r\n\r\n function getHighestItemHeight(level) {\r\n return level.items.reduce(function (maxHeight, item) {\r\n var currentHneight = item.height * item.stackAbove;\r\n if (currentHneight > maxHeight)\r\n return currentHneight;\r\n else return maxHeight;\r\n }, 0);\r\n }\r\n\r\n /**\r\n * Borra un nivel\r\n * Esta funcion es llamada solo cuando el planograma esta en modo edicion por lo que siempre tendras un unico modulo\r\n */\r\n self.planogramOnDeleteLevel = function planogramOnDeleteLevel($event, planogram, column, module, level) {\r\n //$log.debug('EditPlanogramCtrl::planogramOnDeleteLevel\\n\\t$event: %o\\n\\tplanogram: %o\\n\\tcolumn: %o\\n\\tmodule: %o\\n\\tlevel: %o',\r\n //$event,\r\n //planogram,\r\n //column,\r\n //module,\r\n //level);\r\n\r\n\r\n //trae al nivel por numero ya que si es nuevo no sirve buscar por id\r\n var levelLocal = self.planogram.columns[0].modules[0].levels.find(function (l) {\r\n return l.levelNumber === level.levelNumber;\r\n });\r\n\r\n //no puedo borrar un nivel si tiene items\r\n if (levelLocal.items.length) {\r\n swal('Nivel con Items'\r\n , 'no se puede eliminar un nivel que contiene items'\r\n , 'warning');\r\n }\r\n else {\r\n var levelIndex = self.planogram.columns[0].modules[0].levels.indexOf(levelLocal);\r\n self.planogram.columns[0].modules[0].levels.splice(levelIndex, 1);\r\n //Fuerza una nueva referencia del planograma para que se detecte el cambio en los componentes.\r\n self.planogram = angular.copy(self.planogram);\r\n }\r\n\r\n\r\n }\r\n\r\n self.applyPlanogramDimensionsChanges = function () {\r\n\r\n //ganchera tiene un solo nivel y es permitido modificar el alto\r\n if (self.models.selected.type != 'Shelf')\r\n self.models.selected.levels[0].height = self.models.selected.height;\r\n\r\n self.planogram.columns[0].modules[0] = self.models.selected;//se agregaron niveles, se cambiaron dimensiones\r\n\r\n // Fuerza una nueva referencia del planograma para que se detecte el cambio en los componentes.\r\n self.planogram = angular.copy(self.planogram);\r\n\r\n }\r\n\r\n /**\r\n * Devuelve la columna de la colección de columnas del planograma buscandola por el id de la columnas de referencia o null.\r\n * @private\r\n * @param {any} planogram Planograma donde buscar.\r\n * @param {any} value Columna de referencia.\r\n * @returns La columna de la colección de columnas del planograma buscandola por el id de la columnas de referencia o null.\r\n */\r\n self.findColumn = function findColumn(planogram, value) {\r\n var ret = null;\r\n if (angular.isObject(planogram) && angular.isObject(value)) {\r\n ret = self.find(planogram.columns, value, self.compareToById);\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve el módulo de la colección de modulos de la columna buscandolo por el id del módulo de referencia o null.\r\n * @private\r\n * @param {any} column Columna donde buscar.\r\n * @param {any} value\r\n * @returns El módulo de la colección de modulos de la columna buscandolo por el id del módulo de referencia o null.\r\n */\r\n self.findModule = function findModule(column, value) {\r\n var ret = null;\r\n if (angular.isObject(column) && angular.isObject(value)) {\r\n ret = self.find(column.modules, value, self.compareToById);\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve el estante de la colección de estantes del módulo buscandolo por el id del módulo de referencia o null.\r\n * @private\r\n * @param {any} column Columna donde buscar.\r\n * @param {any} value\r\n * @returns El módulo de la colección de modulos de la columna buscandolo por el id del módulo de referencia o null.\r\n */\r\n self.findLevel = function findLevel(module, value) {\r\n var ret = null;\r\n if (angular.isObject(module) && angular.isObject(value)) {\r\n ret = self.find(module.levels, value, self.compareToById);\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve verdadero si el id del elemento a es igual al id del elemento b, falso en caso contrario.\r\n * @param {any} a Elemento a.\r\n * @param {any} b Elemento b\r\n * @returns Verdadero si el id del elemento a es igual al id del elemento b, falso en caso contrario.\r\n */\r\n self.compareToById = function (a, b) {\r\n var ret = angular.isObject(a)\r\n && angular.isDefined(a.id)\r\n && angular.isObject(b)\r\n && angular.isDefined(b.id)\r\n && a.id === b.id;\r\n return ret;\r\n };\r\n\r\n /**\r\n * Devuelve el elemento buscado en la colección dada o null en caso de no encotrarlo.\r\n * @private\r\n * @param {any} collection Colección de elementos.\r\n * @param {any} value Referencia.\r\n * @param {any} compareFn Función de comparación.\r\n * @returns El elemento buscado en la colección dada o null en caso de no encotrarlo.\r\n */\r\n self.find = function find(collection, value, compareFn) {\r\n var ret = null;\r\n if (angular.isArray(collection) && angular.isObject(value) && angular.isFunction(compareFn)) {\r\n var len = collection.length;\r\n var idx = 0;\r\n while (idx < len && !compareFn(collection[idx], value)) {\r\n idx += 1;\r\n }\r\n\r\n if (idx < len && compareFn(collection[idx], value)) {\r\n ret = collection[idx];\r\n }\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n init();\r\n })","'use strinct';\r\n(function () {\r\n angular.module('prisma').factory('SvgService', ['$log', 'DnDService', svgService]);\r\n\r\n function svgService($log, dnDService) {\r\n //$log.debug('SvgService::ctor'); \r\n\r\n function newSvgMatrix() {\r\n var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n var ret = svg.createSVGMatrix();\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve una instancia de SVGMatrix con los datos cargados.\r\n * @private \r\n * @param {any} matrix Matriz SVGMatrix u objeto.\r\n * @returns Instancia de SVGMatrix con los datos cargados.\r\n */\r\n function convertToSvgMatrix(matrix) {\r\n var ret;\r\n if (matrix) {\r\n if (matrix instanceof SVGMatrix) {\r\n ret = matrix;\r\n } else {\r\n ret = newSvgMatrix();\r\n ret.a = matrix.a;\r\n ret.b = matrix.b;\r\n ret.c = matrix.c;\r\n ret.d = matrix.d;\r\n ret.e = matrix.e;\r\n ret.f = matrix.f;\r\n }\r\n } else {\r\n ret = newSvgMatrix();\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve un objeto con las coordenadas x,y de la posición del mouse/touch al ocurrir el evento en el sistema de coordenadas de l elemento svg.\r\n * @param {any} $svg Contenedor SVG.\r\n * @param {any} $element Elemento SVG.\r\n * @param {any} $event Evento.\r\n * @returns Un objeto con las coordenadas x,y del mouse/touch sobre el elemento svg.\r\n */\r\n function eventToPointFn($svg, $element, $event, matrix) {\r\n var ret = null;\r\n if ($svg.length && $element.length) {\r\n var svg = $svg[0];\r\n var element = $element[0];\r\n\r\n var point = svg.createSVGPoint();\r\n point.x = $event.clientX;\r\n point.y = $event.clientY;\r\n\r\n // Local.\r\n var localCtm = element.getScreenCTM();\r\n var localCtminvAux = matrix || localCtm.inverse();\r\n var localCtminv = convertToSvgMatrix(localCtminvAux);\r\n var localPoint = point.matrixTransform(localCtminv);\r\n\r\n // Global.\r\n var globalCtm = element.getCTM();\r\n var globalCtmInvAux = matrix || globalCtm.inverse();\r\n var globalCtmInv = convertToSvgMatrix(globalCtmInvAux);\r\n var globalPoint = point.matrixTransform(globalCtmInv);\r\n\r\n // Box\r\n var box = element.getBBox();\r\n var offset = dnDService.getOffset();\r\n ret = {\r\n local: {\r\n x: localPoint.x,\r\n y: localPoint.y,\r\n matrix: {\r\n a: localCtminv.a,\r\n b: localCtminv.b,\r\n c: localCtminv.c,\r\n d: localCtminv.d,\r\n e: localCtminv.e,\r\n f: localCtminv.f\r\n }\r\n },\r\n global: {\r\n x: globalPoint.x,\r\n y: globalPoint.y,\r\n matrix: {\r\n a: globalCtmInv.a,\r\n b: globalCtmInv.b,\r\n c: globalCtmInv.c,\r\n d: globalCtmInv.d,\r\n e: globalCtmInv.e,\r\n f: globalCtmInv.f\r\n }\r\n },\r\n box: {\r\n x: box.x,\r\n y: box.y,\r\n width: box.width,\r\n height: box.height\r\n },\r\n initialOffset: offset\r\n };\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve la constante de ubicación relativa de donde se debe ubicar\r\n * el elemento en relación a la posición del cursor y el elemento.\r\n * @private \r\n * @param {any} point Punto de referencia.\r\n * @returns Constante de ubicación relativa.\r\n */\r\n function getPlaceFn(point) {\r\n var ret = 'after';\r\n var middle = point.box.width / 2;\r\n if (point.local.x <= middle) {\r\n ret = 'before';\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n // Link: https://toddmotto.com/hacking-svg-traversing-with-ease-addclass-removeclass-toggleclass-functions/\r\n function getDom(el) {\r\n return el.length ? el[0] : el;\r\n }\r\n\r\n function get(el) {\r\n return getDom(el).getAttribute('class');\r\n }\r\n\r\n function has(elem, name) {\r\n return new RegExp('(\\\\s|^)' + name + '(\\\\s|$)').test(get(elem));\r\n }\r\n\r\n function add(elem, name) {\r\n if (!has(elem, name)) {\r\n getDom(elem).setAttribute('class', (get(elem) && get(elem) + ' ') + name);\r\n }\r\n }\r\n\r\n function remove(elem, name) {\r\n if (has(elem, name)) {\r\n var news = get(elem).replace(new RegExp('(\\\\s|^)' + name + '(\\\\s|$)', 'g'), '$2');\r\n getDom(elem).setAttribute('class', news);\r\n }\r\n }\r\n\r\n function toggle(elem, name) {\r\n (has(elem, name) ? remove : add)(elem, name);\r\n }\r\n\r\n return {\r\n hasClass: has,\r\n addClass: add,\r\n removeClass: remove,\r\n toggleClass: toggle,\r\n eventToPoint: eventToPointFn,\r\n getPlace: getPlaceFn\r\n }\r\n }\r\n})();","'use strict';\r\n\r\n/*KRC*/\r\n//Habilita o desHabilita StackedWithPrev\r\nconst __columnStackedWithPrev_enabled = true;\r\n\r\n(function () {\r\n angular.module('prisma').component('planogram', {\r\n templateUrl: '/app/spaces/planogram/planogram.view.html',\r\n bindings: {\r\n columnSpaceBetween: '<',\r\n data: ' mod.stackedWithPrev);\r\n\r\n // Agrega la columna al modelo.\r\n planogram.columns.push(newColumn);\r\n prevColumn = newColumn;\r\n }); // forEach columns\r\n\r\n // ReSharper disable once UnusedParameter\r\n\r\n var prevColumnNoAcum = null;\r\n var planogramStructure = planogram.columns.reduce(function columnsReduce(prevColumn, column, idx, array) {\r\n var ret;\r\n\r\n if (prevColumn) {\r\n ret = {\r\n width: prevColumn.width + column.width + self.columnSpaceBetween * self.scaleFactor,\r\n height: Math.max(prevColumn.height, column.height)\r\n };\r\n\r\n /* KRC NEW / Calcula el stackedWithPrev */\r\n if (prevColumnNoAcum && column.columnStackedWithPrev) {\r\n ret.width -= Math.min(prevColumnNoAcum.width, column.width) + self.columnSpaceBetween * self.scaleFactor;\r\n\r\n ret.height = Math.max(\r\n prevColumn.height,\r\n column.height + prevColumnNoAcum.height + self.columnSpaceBetween * self.scaleFactor\r\n );\r\n }\r\n } else {\r\n ret = {\r\n width: column.width,\r\n height: column.height\r\n };\r\n }\r\n\r\n prevColumnNoAcum = column;\r\n return ret;\r\n }, null);\r\n\r\n planogram.width = planogramStructure.width;\r\n planogram.height = planogramStructure.height;\r\n\r\n // Fix posición de las columnas para los casos en que tienen distintas alturas.\r\n var prevColumn = null;\r\n var prevColumn2 = null;\r\n angular.forEach(planogram.columns, function(column) {\r\n column.y = planogramStructure.height - column.height;\r\n\r\n /* KRC NEW / Calcula el stackedWithPrev */\r\n column.x = 0;\r\n if (prevColumn) {\r\n column.x = prevColumn.x + prevColumn.width + self.columnSpaceBetween * self.scaleFactor;\r\n\r\n if (column.columnStackedWithPrev) {\r\n column.x = prevColumn.x;\r\n column.y =\r\n planogramStructure.height - (column.height + prevColumn.height + self.columnSpaceBetween * self.scaleFactor);\r\n }\r\n\r\n if (prevColumn.columnStackedWithPrev) {\r\n var antColumnWidth = Math.max(prevColumn.width, prevColumn2 ? prevColumn2.width : 0);\r\n if (false) if (column.height < prevColumn2 ? prevColumn2.height : 0) antColumnWidth = prevColumn2.width;\r\n column.x = prevColumn.x + antColumnWidth + self.columnSpaceBetween * self.scaleFactor;\r\n }\r\n }\r\n\r\n prevColumn2 = prevColumn;\r\n prevColumn = column;\r\n });\r\n\r\n planogram.viewBox =\r\n '0 0 ' +\r\n String(planogram.width + self.planogramSpaceBetween * 2) +\r\n ' ' +\r\n String(planogram.height + self.planogramSpaceBetween * 2);\r\n }\r\n\r\n // console.timeEnd('calculate');\r\n\r\n /*KRC*/\r\n if (false) console.log('\\n\\n[ self.calculate]', { planogram });\r\n\r\n return planogram;\r\n };\r\n }\r\n\r\n self.calculateColumn = function calculateColumn(planogram, prevColumn, column, idx) {\r\n // Fix issue performance planograma.\r\n // $log.debug('planogramController::calculateColumn planogram: %o prevColumn: %o column: %o', planogram, prevColumn, column);\r\n var newColumn = {\r\n id: column.id,\r\n x: 0,\r\n y: 0,\r\n modules: [],\r\n $$original: column,\r\n // Toma el Id de columna que se recibio o lo asigna automaticamente,\r\n $$id: column.overwriteId || idx + 1\r\n };\r\n\r\n if (prevColumn !== null) {\r\n // ReSharper disable once QualifiedExpressionMaybeNull\r\n newColumn.x = prevColumn.x + prevColumn.width + self.columnSpaceBetween * self.scaleFactor;\r\n }\r\n\r\n // Ordena los modulos de la columna.\r\n var modules = $filter('orderBy')(column.modules || [], 'order');\r\n\r\n // Recorre todos los modulos de la columna.\r\n var prevModule = null;\r\n angular.forEach(modules, function (module) {\r\n var newModule;\r\n\r\n // Calcula el modulo\r\n switch (module.type) {\r\n case 'Shelf':\r\n case 'Peg':\r\n default:\r\n newModule = self.calculateModule(column, prevModule, module);\r\n break;\r\n }\r\n\r\n // Agrega el modulo a la columna.\r\n newColumn.modules.push(newModule);\r\n prevModule = newModule;\r\n }); // forEach modules\r\n\r\n if (newColumn.modules.length) {\r\n\r\n // ReSharper disable once UnusedParameter\r\n var newColumnStructure = newColumn.modules.reduce(function moduleReduce(prevModule, module, idx, array) {\r\n var ret;\r\n if (prevModule) {\r\n ret = {\r\n width: Math.max(prevModule.width, module.width),\r\n height: prevModule.height + module.height + self.moduleSpaceBetween\r\n }\r\n } else {\r\n ret = {\r\n width: module.width,\r\n height: module.height\r\n }\r\n }\r\n\r\n return ret;\r\n\r\n }, null);\r\n\r\n newColumn.width = newColumnStructure.width;\r\n newColumn.height = newColumnStructure.height;\r\n }\r\n else {\r\n newColumn.width = 0;\r\n newColumn.height = 0;\r\n }\r\n\r\n return newColumn;\r\n }\r\n\r\n self.calculateModule = function calculateModule(column, prevModule, module) {\r\n // Fix issue performance planograma.\r\n // $log.debug('planogramController::calculateModule column: %o prevModule: %o module: %o', column, prevModule, module);\r\n var newModule = {\r\n id: module.id,\r\n type: module.type,\r\n isRefrigerator: module.isRefrigerator,\r\n width: module.width * self.scaleFactor,\r\n height: module.height * self.scaleFactor,\r\n depth: module.depth * self.scaleFactor,\r\n order: module.order,\r\n divisions: [],\r\n x: 0,\r\n y: 0,\r\n gridWidth: (Math.abs(module.gridWidth) || 1) * self.scaleFactor,\r\n gridHeight: (Math.abs(module.gridHeight) || 1) * self.scaleFactor,\r\n levels: [],\r\n $$original: module,\r\n };\r\n\r\n /*KRC*/\r\n if (__columnStackedWithPrev_enabled){\r\n newModule.stackedWithPrev = !!module.stackedWithPrev;\r\n }\r\n\r\n if (prevModule !== null) {\r\n // ReSharper disable once QualifiedExpressionMaybeNull\r\n newModule.y = prevModule.y + prevModule.height\r\n + self.moduleSpaceBetween * self.scaleFactor;\r\n }\r\n\r\n if (module.divisions > 0) {\r\n var divisionWidth = newModule.width / module.divisions;\r\n for (var i = 1; i < module.divisions; i++) {\r\n newModule.divisions.push({ x: divisionWidth * i });\r\n }\r\n }\r\n\r\n // Ordena los estantes del modulo.\r\n var levels = $filter('orderBy')(module.levels || [], 'levelNumber', true);\r\n\r\n // Recorre todos los estantes del modulo.\r\n var prevLevel = null;\r\n angular.forEach(levels, function (level) {\r\n var newLevel = self.calculateLevel(newModule, prevLevel, level);\r\n\r\n // Agrega el nivel al modulo.\r\n newModule.levels.push(newLevel);\r\n prevLevel = newLevel;\r\n }); // forEach levels\r\n\r\n if (newModule.levels.length > 0) {\r\n var newModuleStructure = newModule.levels.reduce(function levelsReduce(preLevel, level, idx, array) {\r\n var ret;\r\n if (preLevel) {\r\n ret = {\r\n width: Math.max(preLevel.width, level.width),\r\n height: preLevel.height + level.height + self.levelSpaceBetween + self.shelfHeight\r\n }\r\n } else {\r\n ret = {\r\n width: level.width,\r\n height: level.height + self.levelSpaceBetween\r\n }\r\n }\r\n\r\n return ret;\r\n\r\n }, null);\r\n\r\n newModule.width = newModuleStructure.width + self.moduleShelfSide * 2;\r\n newModule.height = newModuleStructure.height + self.moduleShelfSide * 2;\r\n } else {\r\n newModule.width += self.moduleShelfSide * 2;\r\n newModule.height += self.moduleShelfSide * 2;\r\n }\r\n\r\n if (newModule.isRefrigerator) {\r\n newModule.height = newModule.height + self.moduleShelfRefrigeratorTop + self.moduleShelfRefrigeratorBottom;\r\n }\r\n\r\n return newModule;\r\n }\r\n\r\n self.calculateLevel = function calculateLevel(module, prevLevel, level) {\r\n // Fix issue performance planograma.\r\n // $log.debug('planogramController::calculateLevel module: %o prevLevel: %o level: %o', module, prevLevel, level);\r\n var newLevel = {\r\n height: level.height * self.scaleFactor,\r\n width: module.width,\r\n levelNumber: level.levelNumber,\r\n x: 0,\r\n y: 0,\r\n itemsGroup: [],\r\n categoryId: level.categoryId,\r\n categoryName: level.categoryName,\r\n id: level.id,\r\n moduleId: level.moduleId,\r\n itemPadding: 0,\r\n $$original: level\r\n };\r\n\r\n if (prevLevel !== null) {\r\n // ReSharper disable once QualifiedExpressionMaybeNull\r\n newLevel.y = prevLevel.y + prevLevel.height + self.levelSpaceBetween + self.shelfHeight;\r\n }\r\n\r\n var fixWidth = 0;\r\n var fixHeight = newLevel.height;\r\n\r\n // Ordena los items del nivel.\r\n var itemsGroup = $filter('orderBy')(level.items, 'order');\r\n\r\n // Calcula el espacio utilizado del estante.\r\n var usedWidth = 0;\r\n var itemsTotal = 0;\r\n angular.forEach(level.items, function (item) {\r\n var itemWidth = ([2, 4].indexOf(item.orientation) != -1 ? item.selectedUnitOfMeasure.height : item.selectedUnitOfMeasure.width) * self.scaleFactor;\r\n usedWidth += itemWidth * item.facings;\r\n itemsTotal += item.facings;\r\n });\r\n var usedWidthPercentage = usedWidth * 100 / newLevel.width;\r\n\r\n // Si el porcentaje de ocupación horizontal de los ítems\r\n // en el estante es mayor o igual al 80 % del espacio del estante.\r\n // Se distribuye el espacio restante (no utilizado) en forma equitativa entre todos los ítems.\r\n if (usedWidthPercentage >= 80 && itemsTotal > 1) {\r\n newLevel.itemPadding = (newLevel.width - usedWidth) / (itemsTotal - 1);\r\n }\r\n\r\n // Recorre todos los items del nivel.\r\n var prevItemGroup = null;\r\n angular.forEach(itemsGroup, function forEachItemGroup(itemGroup) {\r\n var newItemGroup = self.calculateItemGroup(newLevel, prevItemGroup, itemGroup);\r\n newLevel.itemsGroup.push(newItemGroup);\r\n prevItemGroup = newItemGroup;\r\n fixWidth += newItemGroup.padding.width;\r\n fixHeight = Math.max(fixHeight, newItemGroup.height);\r\n\r\n }); // forEach itemsGroup\r\n\r\n newLevel.width += fixWidth;\r\n return newLevel;\r\n };\r\n\r\n self.calculateItemGroup = function calculateItemGroup(level, prevItemGroup, itemGroup) {\r\n // Fix issue performance planograma.\r\n // $log.debug('planogramController::calculateItemGroup level: %o prevItemGroup: %o itemGroup: %o', level, prevItemGroup, itemGroup);\r\n\r\n self.hasItemsSelected = self.hasItemsSelected || itemGroup.selected;\r\n self.hasItemsFiltered = self.hasItemsFiltered || itemGroup.filtered;\r\n var w = itemGroup.selectedUnitOfMeasure.width * 10;\r\n var h = itemGroup.selectedUnitOfMeasure.height * 10;\r\n var imageUrl = itemGroup.selectedUnitOfMeasure.imagePlanogramFront;\r\n var altImageUrl = '//placehold.it/' + w + 'x' + h + '/293846/a7b1c2&text=Prisma';\r\n var newItemGroup = {\r\n $$id: ++uid,\r\n fill: itemGroup.fill || 'none',\r\n // opacity: itemGroup.opacity || 1,\r\n get opacity() {\r\n return this.$$original.opacity || 1;\r\n },\r\n facings: itemGroup.facings || 1,\r\n stackAbove: itemGroup.stackAbove || 1,\r\n itemHeight: itemGroup.selectedUnitOfMeasure.height * self.scaleFactor,\r\n itemWidth: itemGroup.selectedUnitOfMeasure.width * self.scaleFactor,\r\n itemDepth: itemGroup.selectedUnitOfMeasure.depth * self.scaleFactor,\r\n order: itemGroup.order,\r\n imageUrl: altImageUrl,\r\n height: 0,\r\n width: 0,\r\n items: [],\r\n imageResolved: false,\r\n orientation: itemGroup.orientation || 1 /* Rotación */,\r\n layDownItem: itemGroup.layDownItem || 0 /* Acostados */,\r\n padding: {\r\n width: 0,\r\n height: 0,\r\n depth: 0\r\n },\r\n // selected: itemGroup.selected || false,\r\n get selected() {\r\n return this.$$original.selected || false;\r\n },\r\n // filtered: itemGroup.filtered || false,\r\n get filtered() {\r\n return this.$$original.filtered || false;\r\n },\r\n x: (itemGroup.positionX || 0) * self.scaleFactor,\r\n y: (itemGroup.positionY || 0) * self.scaleFactor,\r\n $$original: itemGroup\r\n }\r\n\r\n /*\r\n 1 = Sin rotación\r\n 2 = Rotado 90 grados\r\n 3 = Rotado 180 grados\r\n 4 = Rotado 270 grados.\r\n */\r\n\r\n if (!self.showSketch()) {\r\n // Se conecta a los eventos de carga de imagenes.\r\n var $$id = newItemGroup.$$id;\r\n imageService.load(imageUrl)\r\n .then(function onThen() {\r\n // Fix issue performance planograma.\r\n //$log.debug('planogramController::calculateItemGroup (imageLoad:then) imageurl: %o $$id: %o', imageUrl, $$id);\r\n\r\n var idx = self.itemsGroup.findIndex((localItem) => localItem.$$id === $$id);\r\n if (idx > -1) {\r\n self.itemsGroup[idx].imageUrl = imageUrl;\r\n }\r\n\r\n })\r\n .catch(function onCatch() {\r\n // Fix issue performance planograma.\r\n //$log.debug('planogramController::calculateItemGroup (imageLoad:catch) imageurl: %o $$id: %o', imageUrl, $$id);\r\n })\r\n .finally(function onFinally() {\r\n //$log.debug('planogramController::calculateItemGroup (imageLoad:finally) imageurl: %o $$id: %o', imageUrl, $$id);\r\n\r\n var idx = self.itemsGroup.findIndex((localItem) => localItem.$$id === $$id);\r\n if (idx > -1) {\r\n self.itemsGroup[idx].imageResolved = true;\r\n }\r\n\r\n });\r\n }\r\n\r\n /*\r\n\r\n /|\\\r\n / | \\\r\n / | \\\r\n / /\\ \\\r\n | / \\ \\\r\n | / \\ |\r\n |/ \\|\r\n \\ /\r\n \\ /\r\n \\ /\r\n \\/\r\n */\r\n\r\n // Calcula los tamaños de los items según los tipos de rotaciones.\r\n\r\n // Items acostados.\r\n var layDownItem = {\r\n width: newItemGroup.itemWidth,\r\n height: newItemGroup.itemDepth,\r\n transform: 'scale( 1 )',\r\n position: {\r\n width: newItemGroup.itemWidth,\r\n height: newItemGroup.itemDepth\r\n }\r\n };\r\n\r\n // Items apilados\r\n var stackAboveItem = {\r\n width: newItemGroup.itemWidth,\r\n height: newItemGroup.itemHeight,\r\n transform: 'scale( 1 )',\r\n position: {\r\n width: newItemGroup.itemWidth,\r\n height: newItemGroup.itemHeight\r\n }\r\n };\r\n\r\n var width;\r\n var hasStack = newItemGroup.stackAbove > 1;\r\n var hasLayDown = newItemGroup.layDownItem > 0;\r\n\r\n var layDownItemAux;\r\n var stackAboveItemAux;\r\n\r\n width = stackAboveItem.width;\r\n\r\n switch (newItemGroup.orientation) {\r\n case 1 /* Sin rotación */:\r\n if (hasStack && hasLayDown) {\r\n width = Math.max(layDownItem.position.width, stackAboveItem.position.width);\r\n } else if (hasStack && !hasLayDown) {\r\n width = stackAboveItem.width;\r\n } else if (!hasStack && hasLayDown) {\r\n width = layDownItem.width;\r\n } else {\r\n width = stackAboveItem.width;\r\n }\r\n\r\n break;\r\n\r\n case 2 /* Rotado 90 grados */:\r\n // // Apilados\r\n // stackAboveItemAux = stackAboveItem.width;\r\n // stackAboveItem.width = stackAboveItem.height;\r\n // stackAboveItem.height = stackAboveItemAux;\r\n\r\n // stackAboveItem.transform = 'rotate( 90 ' + String(stackAboveItem.width / 2) + ' ' + String(stackAboveItem.height / 2) + ' ) '\r\n stackAboveItem.transform = 'rotate( 90 ) translate( 0 ' + String(- newItemGroup.itemHeight) + ' )';\r\n stackAboveItem.position = {\r\n width: stackAboveItem.height,\r\n height: stackAboveItem.width\r\n };\r\n\r\n // Acostados\r\n //layDownItemAux = layDownItem.width;\r\n // layDownItem.width = layDownItem.height;\r\n // layDownItem.height = layDownItemAux;\r\n layDownItem.position = {\r\n width: layDownItem.height,\r\n height: layDownItem.width\r\n };\r\n\r\n // layDownItem.transform = 'rotate( 90 ' + String(layDownItem.width / 2) + ' ' + String(layDownItem.height / 2) + ' ) '\r\n layDownItem.transform = 'rotate( 90 ) translate( ' + String((- newItemGroup.itemHeight + newItemGroup.itemWidth) * newItemGroup.stackAbove) + ' ' + String(- layDownItem.height) + ' ) ';\r\n\r\n break;\r\n\r\n case 3 /* Rotado 180 grados */:\r\n // Apilados\r\n stackAboveItem.transform = 'rotate( 180 ' + String(stackAboveItem.width / 2) + ' ' + String(stackAboveItem.height / 2) + ' ) ';\r\n\r\n // Acostados\r\n layDownItem.transform = 'rotate( 180 ' + String(layDownItem.width / 2) + ' ' + String(layDownItem.height / 2) + ' ) ';\r\n\r\n if (hasStack && hasLayDown) {\r\n width = Math.max(layDownItem.width, stackAboveItem.width);\r\n } else if (hasStack && !hasLayDown) {\r\n width = stackAboveItem.width;\r\n } else if (!hasStack && hasLayDown) {\r\n width = layDownItem.width;\r\n } else {\r\n width = stackAboveItem.width;\r\n }\r\n\r\n break;\r\n case 4 /* Rotado 270 grados */:\r\n // Apilados\r\n // stackAboveItemAux = stackAboveItem.width;\r\n // stackAboveItem.width = stackAboveItem.height;\r\n // stackAboveItem.height = stackAboveItemAux;\r\n stackAboveItem.transform = 'rotate( 270 ' + String(stackAboveItem.width / 2) + ' ' + String(stackAboveItem.width / 2) + ' ) ';\r\n stackAboveItem.position = {\r\n width: stackAboveItem.height,\r\n height: stackAboveItem.width\r\n };\r\n\r\n // Acostados\r\n // layDownItemAux = layDownItem.width;\r\n // layDownItem.width = layDownItem.height;\r\n // layDownItem.height = layDownItemAux;\r\n var translateLayDownItem = (layDownItem.width / 2) - (((newItemGroup.itemHeight - newItemGroup.itemWidth) * newItemGroup.stackAbove) / 2);\r\n layDownItem.transform = 'rotate( 270 ' + String(translateLayDownItem) + ' ' + String(translateLayDownItem) + ' ) ';\r\n layDownItem.position = {\r\n width: layDownItem.height,\r\n height: layDownItem.width\r\n };\r\n\r\n if (hasStack && hasLayDown) {\r\n width = Math.max(layDownItem.position.width, stackAboveItem.position.width);\r\n } else if (hasStack && !hasLayDown) {\r\n width = stackAboveItem.height;\r\n } else if (!hasStack && hasLayDown) {\r\n width = layDownItem.height;\r\n } else {\r\n width = stackAboveItem.position.width;\r\n }\r\n\r\n break;\r\n }\r\n\r\n if (hasStack && hasLayDown) {\r\n width = Math.max(layDownItem.position.width, stackAboveItem.position.width);\r\n } else if (hasStack && !hasLayDown) {\r\n width = stackAboveItem.position.width;\r\n } else if (!hasStack && hasLayDown) {\r\n width = layDownItem.position.width;\r\n } else {\r\n width = stackAboveItem.position.width;\r\n }\r\n\r\n var padding = (self.showSketch()) ? 2.5 : 0;\r\n\r\n // Calcula el tamaño del grupo de items.\r\n newItemGroup.width = width * newItemGroup.facings\r\n + padding * newItemGroup.facings\r\n + level.itemPadding * (newItemGroup.facings - 1);\r\n newItemGroup.height = stackAboveItem.position.height * newItemGroup.stackAbove\r\n + layDownItem.position.height * newItemGroup.layDownItem\r\n + padding * newItemGroup.stackAbove\r\n + padding * newItemGroup.layDownItem;\r\n\r\n newItemGroup.padding.width = padding * newItemGroup.facings;\r\n newItemGroup.padding.height = padding * newItemGroup.stackAbove\r\n + padding * newItemGroup.layDownItem;\r\n\r\n var stackHeight = stackAboveItem.height * newItemGroup.stackAbove;\r\n var paddingX = padding + level.itemPadding;\r\n\r\n // Recorre todos los frentes.\r\n for (var i = 0; i < newItemGroup.facings; i++) {\r\n // Recorre todos los items apilados.\r\n for (var j = 0; j < newItemGroup.stackAbove; j++) {\r\n var itemStack = {\r\n x: i * stackAboveItem.position.width + i * level.itemPadding + ((i > 0) ? padding : 0),\r\n y: j * stackAboveItem.position.height + ((j > 0) ? padding : 0),\r\n width: stackAboveItem.width,\r\n height: stackAboveItem.height,\r\n noLabel: false,\r\n transform: stackAboveItem.transform\r\n };\r\n newItemGroup.items.push(itemStack);\r\n }\r\n\r\n // Recorre todos los items acostados.\r\n for (var k = 0; k < newItemGroup.layDownItem; k++) {\r\n var itemLayDown = {\r\n x: i * layDownItem.position.width + i * level.itemPadding + ((i > 0) ? padding : 0),\r\n y: k * layDownItem.position.height + stackHeight + ((k > 0) ? padding : 0),\r\n width: layDownItem.width,\r\n height: layDownItem.height,\r\n noLabel: true,\r\n transform: layDownItem.transform\r\n };\r\n newItemGroup.items.push(itemLayDown);\r\n }\r\n }\r\n\r\n if (!self.hasPosition(itemGroup)) {\r\n if (prevItemGroup === null) {\r\n newItemGroup.x = 0;\r\n } else {\r\n newItemGroup.x = prevItemGroup.x + prevItemGroup.width + padding + level.itemPadding;\r\n }\r\n\r\n // Alinea el grupo de items en la base del estante,\r\n newItemGroup.y =\r\n level.height -\r\n newItemGroup.stackAbove * stackAboveItem.position.height -\r\n newItemGroup.layDownItem * layDownItem.position.height;\r\n }\r\n\r\n return newItemGroup;\r\n }\r\n\r\n self.hasPosition = function hasPosition(itemGroup) {\r\n var keys = Object.keys(itemGroup);\r\n var idxPropX = keys.indexOf('positionX');\r\n var idxPropY = keys.indexOf('positionY');\r\n var ret = idxPropX > -1 && angular.isNumber(itemGroup.positionX)\r\n && idxPropY > -1 && angular.isNumber(itemGroup.positionY);\r\n return ret;\r\n }\r\n\r\n self.showSketch = function showSketch() {\r\n var ret = self.showItemSketch\r\n || self.showGroupSketch;\r\n return ret;\r\n };\r\n\r\n self.hasModel = function hasModel() {\r\n return angular.isDefined(self.model);\r\n }\r\n\r\n self.hasSelected = function hasSelected() {\r\n var ret = self.hasItemsSelected;\r\n return ret;\r\n }\r\n\r\n self.hasFiltered = function hasFiltered() {\r\n var ret = self.hasItemsFiltered;\r\n return ret;\r\n }\r\n\r\n self.onClickHandler = function onClick($event) {\r\n // Fix issue performance planograma.\r\n // $log.debug('planogramController::onClickHandler %o', $event);\r\n if (!dnDService.isOnDrag()) {\r\n $event.stopPropagation();\r\n self.raiseOnClick({\r\n $event: $event,\r\n planogram: self.getModel()\r\n });\r\n }\r\n }\r\n\r\n self.onDblClick = function onDblClick($event) {\r\n // Zoom to element.\r\n // Link: https://makina-corpus.com/blog/metier/2015/zoom-and-pan-to-a-svg-element\r\n // the main SVG object and its current viewBox\r\n var svg = $element.find('svg')[0];\r\n\r\n // element is the element I want to zoom to\r\n var element = $event.target;\r\n var bbox = element.getBBox();\r\n var viewBox = svg.getAttribute('viewBox');\r\n var vbox = viewBox.split(' ');\r\n vbox[0] = parseFloat(vbox[0]);\r\n vbox[1] = parseFloat(vbox[1]);\r\n vbox[2] = parseFloat(vbox[2]);\r\n vbox[3] = parseFloat(vbox[3]);\r\n\r\n // the current center of the viewBox\r\n var cx = vbox[0] + vbox[2] / 2;\r\n var cy = vbox[1] + vbox[3] / 2;\r\n\r\n var matrix = element.getTransformToElement(svg);\r\n\r\n // the new center\r\n var newx = (bbox.x + bbox.width / 2) * matrix.a + matrix.e;\r\n var newy = (bbox.y + bbox.height / 2) * matrix.d + matrix.f;\r\n\r\n // the corresponding top left corner in the current scale\r\n var absoluteOffsetX = vbox[0] + newx - cx;\r\n var absoluteOffsetY = vbox[1] + newy - cy;\r\n\r\n // the new scale\r\n var scale = bbox.width * matrix.a / vbox[2] * 1.2;\r\n\r\n var scaledOffsetX = absoluteOffsetX + vbox[2] * (1 - scale) / 2;\r\n var scaledOffsetY = absoluteOffsetY + vbox[3] * (1 - scale) / 2;\r\n var scaledWidth = vbox[2] * scale;\r\n var scaledHeight = vbox[3] * scale;\r\n\r\n svg.setAttribute('viewBox', '' + scaledOffsetX + ' ' + scaledOffsetY + ' ' + scaledWidth + ' ' + scaledHeight);\r\n }\r\n\r\n self.getModel = function getModel() {\r\n // return angular.copy(self.model);\r\n return self.model.$$original;\r\n }\r\n\r\n /**\r\n * Devuelve el valor del ancho del SVG.\r\n */\r\n self.getWidth = function getWidth() {\r\n var ret;\r\n if (angular.isNumber(self.width)) {\r\n ret = self.width;\r\n } else {\r\n ret = '100%';\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n self.getDraggable = function ($target) {\r\n return $target.hasClass('draggable') ? $target : $target.parents('.draggable');\r\n }\r\n\r\n self.isDraggable = function ($target) {\r\n return $target.is('.draggable') || $target.parents('.draggable').length > 0;\r\n }\r\n\r\n self.startDrag = function startDrag($event) {\r\n // Fix issue performance planograma.\r\n // $log.debug('planogramController::startDrag %o', $event);\r\n\r\n // var $target = self.getDraggable(angular.element($event.target));\r\n var $target = angular.element($event.target);\r\n // if ($target.hasClass('draggable')) {\r\n if (self.isDraggable($target)) {\r\n self.drag.selectedElement = $target[0];\r\n self.drag.offset = self.getMousePosition($event);\r\n // self.drag.offset.x -= parseFloat(self.drag.selectedElement.getAttributeNS(null, 'x'));\r\n // self.drag.offset.y -= parseFloat(self.drag.selectedElement.getAttributeNS(null, 'y'));\r\n\r\n // Get all the transforms currently on this element\r\n var transforms = self.drag.selectedElement.transform.baseVal;\r\n\r\n // Ensure the first transform is a translate transform\r\n if (transforms.length === 0\r\n || transforms.getItem(0).type !== window.SVGTransform.SVG_TRANSFORM_TRANSLATE) {\r\n // Create an transform that translates by (0, 0)\r\n self.drag.translate = self.drag.$draggable.createSVGTransform();\r\n self.drag.translate.setTranslate(0, 0);\r\n\r\n // Add the translation to the front of the transforms list\r\n self.drag.selectedElement.transform.baseVal.insertItemBefore(translate, 0);\r\n }\r\n\r\n // Get initial translation amount\r\n self.drag.transform = transforms.getItem(0);\r\n self.drag.offset.x -= self.drag.transform.matrix.e;\r\n self.drag.offset.y -= self.drag.transform.matrix.f;\r\n }\r\n }\r\n\r\n self.drag = function drag($event) {\r\n // Fix issue performance planograma.\r\n // $log.debug('planogramController::drag %o', $event);\r\n if (self.drag.selectedElement) {\r\n $event.preventDefault();\r\n var coord = self.getMousePosition($event);\r\n // self.drag.selectedElement.setAttributeNS(null, 'x', coord.x - self.drag.offset.x);\r\n // self.drag.selectedElement.setAttributeNS(null, 'y', coord.y - self.drag.offset.y);\r\n var x = coord.x - self.drag.offset.x;\r\n var y = coord.y - self.drag.offset.y;\r\n self.drag.transform.setTranslate(x, y);\r\n }\r\n };\r\n\r\n self.endDrag = function endDrag($event) {\r\n // Fix issue performance planograma.\r\n // $log.debug('planogramController::endDrag %o', $event);\r\n self.drag.selectedElement = null;\r\n }\r\n\r\n self.getMousePosition = function getMousePosition($event) {\r\n // Fix issue performance planograma.\r\n // $log.debug('planogramController::getMousePosition %o', $event);\r\n // var svg = $element.find('svg')[0];\r\n var screenCtm = self.drag.$draggable[0].getScreenCTM();\r\n\r\n if ($event.touches) {\r\n $event = $event.touches[0];\r\n }\r\n\r\n return {\r\n x: ($event.clientX - screenCtm.e) / screenCtm.a,\r\n y: ($event.clientY - screenCtm.f) / screenCtm.d\r\n };\r\n }\r\n\r\n /**\r\n * Devuelve la referencia del tag svg del planograma.\r\n * @return Referencia del tag svg del planograma.\r\n */\r\n self.getSvg = function getSvg() {\r\n var ret = $element.find('svg:first');\r\n return ret;\r\n }\r\n\r\n self.makeDraggable = function makeDraggable() {\r\n // Fix issue performance planograma.\r\n // $log.debug('planogramController::makeDraggable');\r\n self.drag.$draggable = $element.find('svg:first');\r\n self.drag.$draggable.off('mousedown touchstart')\r\n .off('mousemove touchmove')\r\n .off('mouseup mouseleave touchend touchleave touchcancel');\r\n\r\n if (self.allowDrag) {\r\n self.drag.$draggable.on('mousedown touchstart', angular.bind(self, self.startDrag))\r\n .on('mousemove touchmove', angular.bind(self, self.drag))\r\n .on('mouseup mouseleave touchend touchleave touchcancel', angular.bind(self, self.endDrag));\r\n } else {\r\n self.drag.$draggable = null;\r\n }\r\n };\r\n\r\n /**\r\n * Devuelve el hash de toda la configuración del componente.\r\n * @private\r\n * @returns El hash de toda la configuración del componente.\r\n */\r\n self.getHashCode = function getHashCode() {\r\n var flags = self.getFlags();\r\n var auxVars = [\r\n flags,\r\n self.label1,\r\n self.label2,\r\n self.labelInfo,\r\n self.labelHeight,\r\n self.columnSpaceBetween,\r\n self.moduleSpaceBetween,\r\n self.levelSpaceBetween,\r\n self.itemSpaceBetween,\r\n self.shelfHeight,\r\n self.scaleFactor,\r\n self.width];\r\n var aux = auxVars.join('|');\r\n var ret = self.calculateHash(aux);\r\n return ret;\r\n };\r\n\r\n /**\r\n * Devuelve el calculo de los flags activos del componente.\r\n * @private\r\n * @returns El calculo de los flags activos del componente.\r\n */\r\n self.getFlags = function getFlags() {\r\n var ret = 0;\r\n if (self.showDoor) {\r\n ret |= 1;\r\n }\r\n\r\n if (self.showItemSketch) {\r\n ret |= 2;\r\n }\r\n\r\n if (self.showGroupSketch) {\r\n ret |= 4;\r\n }\r\n\r\n if (self.showLabelInfo) {\r\n ret |= 8;\r\n }\r\n\r\n if (self.showLabel1) {\r\n ret |= 16;\r\n }\r\n\r\n if (self.showLabel2) {\r\n ret |= 32;\r\n }\r\n\r\n if (self.showOverlay) {\r\n ret |= 64;\r\n }\r\n\r\n if (self.showColumnId) {\r\n ret |= 128;\r\n }\r\n\r\n return ret;\r\n };\r\n\r\n /**\r\n * Devuelve el hash de la cadena.\r\n * - 0 si no es una cadena.\r\n * - 0 si la cadena esta vacia.\r\n * - hash numerico de la cadena en los otros casos.\r\n * @private\r\n * @link Inspiración https://stackoverflow.com/a/7616484\r\n * @param {any} value Cadena.\r\n * @returns El hash de la cadena.\r\n */\r\n self.calculateHash = function calculateHash(value) {\r\n var hash = 0, i, chr;\r\n if (angular.isString(value)) {\r\n var len = value.length;\r\n if (len > 0) {\r\n for (i = 0; i < len; i++) {\r\n chr = value.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + chr;\r\n hash |= 0; // Convert to 32bit integer\r\n }\r\n }\r\n }\r\n\r\n return hash;\r\n };\r\n\r\n self.updateModel = function updateModel(model, newModel) {\r\n var ret = model;\r\n if (ret.columns.length === newModel.columns.length\r\n && ret.width === newModel.width\r\n && ret.height === newModel.height) {\r\n //var i = 0;\r\n //var cols = ret.columns.length;\r\n //while (i < cols) {\r\n // var colOri = ret.columns[i];\r\n // var colNew = newModel.columns[i];\r\n // if (colOri.x === colNew.x &&\r\n // colOri.y === colNew.y &&\r\n // colOri.modules.length === colNew.modules.length &&\r\n // colOri.$$id === colNew.$$id) {\r\n // var j = 0;\r\n // var modules = colOri.modules.length;\r\n // while (j < modules) {\r\n\r\n\r\n // j += 1;\r\n // }\r\n // } else {\r\n // ret.columns[i] = angular.copy(colNew);\r\n // }\r\n\r\n // i += 1;\r\n //}\r\n\r\n angular.forEach(ret.columns,\r\n function (column, colIdx) {\r\n var colNew = newModel.columns[colIdx];\r\n if (column.id === colNew.id\r\n && column.x === colNew.x\r\n && column.y === colNew.y\r\n && column.modules.length === colNew.modules.length\r\n && column.$$id === colNew.$$id) {\r\n angular.forEach(column.modules,\r\n function (module, modIdx) {\r\n var moduleNew = newModel.columns[colIdx].modules[modIdx];\r\n if (module.id === moduleNew.id &&\r\n module.type === moduleNew.type &&\r\n module.isRefrigerator === moduleNew.isRefrigerator &&\r\n module.width === moduleNew.width &&\r\n module.height === moduleNew.height &&\r\n module.depth === moduleNew.depth &&\r\n module.order === moduleNew.order &&\r\n module.divisions.length &&\r\n module.x === moduleNew.x &&\r\n module.y === moduleNew.y &&\r\n module.levels.length === moduleNew.levels.length) {\r\n angular.forEach(module.levels,\r\n function (level, lvlIdx) {\r\n if (true) {\r\n angular.forEach(level.items,\r\n function (item, itemIdx) {\r\n\r\n });\r\n }\r\n });\r\n\r\n } else {\r\n ret.columns[colIdx].modules[modIdx] = angular.copy(moduleNew);\r\n }\r\n });\r\n\r\n } else {\r\n ret.columns[colIdx] = angular.copy(colNew);\r\n }\r\n });\r\n } else {\r\n ret = angular.copy(newModel);\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n self.getItemsGroup = function getItemsGroup(data) {\r\n // console.time('getItemsGroup');\r\n var ret = [];\r\n angular.forEach(data.columns,\r\n function (column) {\r\n angular.forEach(column.modules,\r\n function (module) {\r\n angular.forEach(module.levels,\r\n function (level) {\r\n angular.forEach(level.itemsGroup,\r\n function (item) {\r\n //var itemExt = angular.merge({},\r\n // item,\r\n // {\r\n // column: column,\r\n // module: module,\r\n // level: level\r\n // });\r\n var itemExt = angular.copy(item);\r\n\r\n itemExt.column = column;\r\n itemExt.module = module;\r\n itemExt.level = level;\r\n\r\n itemExt.positionX = self.getItemGroupX(itemExt);\r\n itemExt.positionY = self.getItemGroupY(itemExt);\r\n ret.push(itemExt);\r\n });\r\n });\r\n });\r\n });\r\n // console.timeEnd('getItemsGroup');\r\n\r\n return ret;\r\n }\r\n\r\n self.getLevels = function getLevels(data) {\r\n // console.time('getLevels');\r\n var ret = [];\r\n angular.forEach(data.columns,\r\n function (column) {\r\n angular.forEach(column.modules,\r\n function (module) {\r\n angular.forEach(module.levels,\r\n function (level) {\r\n var levelExt = angular.copy(level);\r\n\r\n levelExt.column = column;\r\n levelExt.module = module;\r\n\r\n levelExt.positionX = self.getLevelX(levelExt);\r\n levelExt.positionY = self.getLevelY(levelExt);\r\n levelExt.buttonsX = getLevelButtonsX(levelExt);\r\n levelExt.buttonsY = getLevelButtonsY(levelExt);\r\n levelExt.measureArrowX = getLevelMeasureArrowX(levelExt);\r\n levelExt.measureArrowY = getLevelMeasureArrowY(levelExt);\r\n ret.push(levelExt);\r\n });\r\n });\r\n });\r\n return ret;\r\n }\r\n\r\n self.getModules = function getModules(data) {\r\n var ret = [];\r\n angular.forEach(data.columns,\r\n function (column) {\r\n angular.forEach(column.modules,\r\n function (module) {\r\n var moduleExt = angular.copy(module);\r\n moduleExt.column = column;\r\n\r\n moduleExt.positionX = self.getModuleX(moduleExt);\r\n moduleExt.positionY = self.getModuleY(moduleExt);\r\n\r\n ret.push(moduleExt);\r\n\r\n });\r\n });\r\n return ret;\r\n }\r\n\r\n self.getItemGroupX = function getItemGroupX(value) {\r\n try {\r\n var columnX = value.column.x;\r\n var moduleX = value.module.x;\r\n var levelX = value.level.x;\r\n var ret = self.planogramSpaceBetween\r\n + columnX\r\n + moduleX\r\n + levelX + self.moduleShelfSide\r\n + value.x;\r\n return ret;\r\n } catch (ex) {\r\n $log.error('planogramController::getItemGroupX data: %o, ex: %o', value, ex);\r\n throw ex;\r\n }\r\n }\r\n\r\n self.getItemGroupY = function getItemGroupY(value) {\r\n\r\n try {\r\n var columnY = value.column.y;\r\n var moduleY = value.module.y;\r\n var levelY = value.level.y;\r\n var ret = self.planogramSpaceBetween +\r\n columnY +\r\n moduleY +\r\n ((value.module.isRefrigerator) ? self.moduleShelfRefrigeratorTop : 0) +\r\n levelY + self.moduleShelfSide + value.y;\r\n return ret;\r\n } catch (ex) {\r\n $log.error('planogramController::getItemGroupY data: %o, ex: %o', value, ex);\r\n throw ex;\r\n }\r\n }\r\n\r\n self.getLevelX = function getLevelX(value) {\r\n try {\r\n var columnX = value.column.x;\r\n var moduleX = value.module.x;\r\n var ret = self.planogramSpaceBetween\r\n + columnX\r\n + moduleX\r\n + self.moduleShelfSide\r\n + value.x;\r\n return ret;\r\n } catch (ex) {\r\n $log.error('planogramController::getLevelX data: %o, ex: %o', value, ex);\r\n throw ex;\r\n }\r\n }\r\n\r\n self.getModuleX = function getModuleX(value) {\r\n try {\r\n var columnX = value.column.x;\r\n var ret = self.planogramSpaceBetween\r\n + columnX\r\n //+ self.moduleShelfSide\r\n + value.x;\r\n return ret;\r\n } catch (ex) {\r\n $log.error('planogramController::getModuleX data: %o, ex: %o', value, ex);\r\n throw ex;\r\n }\r\n }\r\n\r\n self.getLevelY = function getLevelY(value) {\r\n\r\n try {\r\n var columnY = value.column.y;\r\n var moduleY = value.module.y;\r\n var ret = self.planogramSpaceBetween +\r\n columnY +\r\n moduleY +\r\n self.moduleShelfSide + value.y;\r\n return ret;\r\n } catch (ex) {\r\n $log.error('planogramController::getLevelY data: %o, ex: %o', value, ex);\r\n throw ex;\r\n }\r\n }\r\n\r\n self.getModuleY = function getModuleY(value) {\r\n\r\n try {\r\n var columnY = value.column.y;\r\n var ret = self.planogramSpaceBetween +\r\n columnY\r\n //+ self.moduleShelfSide\r\n + value.y;\r\n return ret;\r\n } catch (ex) {\r\n $log.error('planogramController::getModuleY data: %o, ex: %o', value, ex);\r\n throw ex;\r\n }\r\n }\r\n\r\n /**\r\n * Calcula la posicion x de los botones de edicion de nivel\r\n * @param {any} level nivel para posicionar los botones\r\n */\r\n function getLevelButtonsX(level) {\r\n\r\n try {\r\n var buttonsWidth = (self.labelHeight * 3) + (10 * 2);//ancho de la botonera\r\n\r\n var ret = ((level.width - buttonsWidth) / 2) + level.positionX;\r\n return ret;\r\n\r\n } catch (ex) {\r\n $log.error('planogramController::getLevelButtonsX data: %o, ex: %o', level, ex);\r\n throw ex;\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Calcula la posicion y de los botones de edicion de nivel\r\n * @param {any} level nivel para posicionar los botones\r\n */\r\n function getLevelButtonsY(level) {\r\n\r\n try {\r\n var ret = ((level.height - self.labelHeight) / 2) + level.positionY\r\n + (level.module.isRefrigerator ? 186 : 0);//top de refrigerdor\r\n return ret;\r\n\r\n } catch (ex) {\r\n $log.error('planogramController::getLevelButtonsY data: %o, ex: %o', level, ex);\r\n throw ex;\r\n }\r\n }\r\n\r\n /**\r\n * Calcula la posicion x de los botones de edicion de nivel\r\n * @param {any} level nivel para posicionar los botones\r\n */\r\n function getLevelMeasureArrowX(level) {\r\n\r\n try {\r\n // var ret = ((level.width - self.labelHeight )) + level.positionX;\r\n var ret = (level.width - 130) + level.positionX;\r\n return ret;\r\n\r\n } catch (ex) {\r\n $log.error('planogramController::getLevelMeasureArrowX data: %o, ex: %o', level, ex);\r\n throw ex;\r\n }\r\n }\r\n\r\n /**\r\n * Calcula la posicion x de los botones de edicion de nivel\r\n * @param {any} level nivel para posicionar los botones\r\n */\r\n function getLevelMeasureArrowY(level) {\r\n\r\n try {\r\n var ret = ((level.height - self.labelHeight) / 2) + level.positionY;\r\n return ret;\r\n\r\n } catch (ex) {\r\n $log.error('planogramController::getLevelMeasureArrowY data: %o, ex: %o', level, ex);\r\n throw ex;\r\n }\r\n }\r\n\r\n /**\r\n * Se recive cuando se termino de cargar la imagen de un item.\r\n * @event\r\n * @param {any} itemGroup\r\n */\r\n self.onLoadImage = function onLoadImage(itemGroup) {\r\n var item = self.findItemGroup(itemGroup.$$original.id);\r\n if (item) {\r\n item.imageResolved = itemGroup.imageResolved;\r\n item.imageUrl = itemGroup.imageUrl;\r\n }\r\n }\r\n\r\n self.findItemGroup = function findItemGroup(id) {\r\n var ret = null;\r\n var idx = self.itemsGroup.findIndex(function (item) {\r\n var ret = item.$$original.id === id;\r\n return ret;\r\n });\r\n\r\n if (idx > -1) {\r\n ret = self.itemsGroup[idx];\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve verdadero si se tiene que mostrar el indicador de drop.\r\n * @public\r\n * @returns Verdadero si se tiene que mostrar el indicador de drop, falso en caso contrario.\r\n */\r\n self.showDropIndicator = function showDropIndicator() {\r\n return self.isOver;\r\n };\r\n\r\n /**\r\n * Configura el itemGroup sobre el cual se esta pasnado el mouse para mostrar el indicador de posición.\r\n * @param {any} data itemGroup\r\n */\r\n self.setOver = function setOver(data) {\r\n // $log.debug('planogramLevelShelfDirective::setOver\\n\\tdata: %o', data);\r\n self.isOver = true;\r\n if (angular.isObject(data)\r\n && angular.isObject(data.model)) {\r\n // self.dropIndicatorX = data.model.x;\r\n self.dropIndicatorX = self.getItemGroupX(data.model);\r\n self.dropIndicatorY = self.getItemGroupY(data.model);\r\n var type = data.model.module.type;\r\n if (type === 'Peg') {\r\n //self.dropIndicatorWidth = data.model.width;\r\n //self.dropIndicatorHeight = data.model.height;\r\n self.dropIndicatorWidth = 0;\r\n self.dropIndicatorHeight = 0;\r\n\r\n } else {\r\n self.dropIndicatorY -= data.model.y;\r\n self.dropIndicatorWidth = 20;\r\n self.dropIndicatorHeight = data.model.level.height;\r\n if (data.place === 'after') {\r\n self.dropIndicatorX += data.model.width;\r\n }\r\n }\r\n\r\n } else {\r\n // self.dropIndicatorX = 0;\r\n self.dropIndicatorX = self.planogramSpaceBetween;\r\n self.dropIndicatorY = self.planogramSpaceBetween;\r\n }\r\n\r\n self.overTarget = data.model;\r\n\r\n if (isNaN(self.dropIndicatorX) || isNaN(self.dropIndicatorY)) {\r\n $log.info('setOver self: %o, data: %o, x: %o, y: %o', self, data, self.dropIndicatorX, self.dropIndicatorY);\r\n }\r\n }\r\n\r\n self.removeOver = function removeOver() {\r\n // $log.debug('planogramLevelShelfDirective::removeOver');\r\n self.isOver = false;\r\n self.dropIndicatorX = 0;\r\n self.overTarget = null;\r\n }\r\n\r\n self.showSelectedItem = function showSelectedItem(item) {\r\n var ret = angular.isObject(item) && item.selected && !self.allowEditStructure;\r\n return ret;\r\n }\r\n\r\n self.itemOnClickHandler = function itemOnClickHandler($event, itemGroup) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n\r\n // Fix issue performance planograma.\r\n // $log.debug('planogramItemGroup2Controller::onClickHandler %o', $event);\r\n if (!dnDService.isOnDrag()) {\r\n var $svg = self.getSvg();\r\n var $el = angular.element($event.target);\r\n var point = svgService.eventToPoint($svg, $el, $event);\r\n var place = svgService.getPlace(point);\r\n var item = self.findItemGroup(itemGroup.$$original.id);\r\n self.raiseOnClick({\r\n $event: $event,\r\n planogram: self.getModel(),\r\n column: itemGroup.column.$$original,\r\n module: itemGroup.module.$$original,\r\n level: itemGroup.level.$$original,\r\n item: item.$$original,\r\n point: point,\r\n place: place\r\n });\r\n }\r\n }\r\n\r\n self.increaseLevel = function increaseLevel($event, level) {\r\n $log.info('increaseLevel $event: %o, level: %o', $event, level);\r\n self.raiseOnChangeLevelHeight({\r\n $event: $event,\r\n planogram: self.getModel(),\r\n column: level.column.$$original,\r\n module: level.module.$$original,\r\n level: level.$$original,\r\n action: 'increase'\r\n });\r\n }\r\n\r\n self.reduceLevel = function reduceLevel($event, level) {\r\n self.raiseOnChangeLevelHeight({\r\n $event: $event,\r\n planogram: self.getModel(),\r\n column: level.column.$$original,\r\n module: level.module.$$original,\r\n level: level.$$original,\r\n action: 'reduce'\r\n });\r\n }\r\n\r\n self.deleteLevel = function deleteLevel($event, level) {\r\n self.raiseOnDeleteLevel({\r\n $event: $event,\r\n planogram: self.getModel(),\r\n column: level.column.$$original,\r\n module: level.module.$$original,\r\n level: level.$$original\r\n });\r\n }\r\n\r\n self.getTransform = function getTransform(module) {\r\n var ret;\r\n if (module.isRefrigerator) {\r\n ret = 'translate(' + module.positionX + ' ' + (module.positionY + self.moduleShelfRefrigeratorTop) + ' )';\r\n } else {\r\n ret = 'translate( 0 0 )';\r\n }\r\n\r\n return ret;\r\n };\r\n\r\n self.getModuleHeight = function getModuleHeight(module) {\r\n var ret = module.height;\r\n if (module.isRefrigerator) {\r\n ret -= self.moduleShelfRefrigeratorTop;\r\n }\r\n\r\n return ret;\r\n };\r\n\r\n /*\r\n // Utils optimización performance.\r\n // Link: https://www.monterail.com/blog/2015/story-of-angular-watchers-toggler-directive\r\n // Link: https://github.com/kentcdodds/ng-stats/blob/master/src/index.js\r\n var scopeSelectors = '.ng-scope, .ng-isolate-scope';\r\n\r\n function getRootScope() {\r\n if ($rootScope) {\r\n return $rootScope;\r\n }\r\n var scopeEl = document.querySelector(scopeSelectors);\r\n if (!scopeEl) {\r\n return null;\r\n }\r\n $rootScope = angular.element(scopeEl).scope().$root;\r\n return $rootScope;\r\n }\r\n\r\n function iterateScopes(currentScope, fn) {\r\n if (typeof currentScope === 'function') {\r\n fn = currentScope;\r\n currentScope = null;\r\n }\r\n currentScope = currentScope || getRootScope();\r\n currentScope = _makeScopeReference(currentScope);\r\n if (!currentScope) {\r\n return;\r\n }\r\n var ret = fn(currentScope);\r\n if (ret === false) {\r\n return ret;\r\n }\r\n return iterateChildren(currentScope, fn);\r\n }\r\n\r\n function iterateSiblings(start, fn) {\r\n var ret;\r\n while (!!(start = start.$$nextSibling)) {\r\n ret = fn(start);\r\n if (ret === false) {\r\n break;\r\n }\r\n\r\n ret = iterateChildren(start, fn);\r\n if (ret === false) {\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n\r\n function iterateChildren(start, fn) {\r\n var ret;\r\n while (!!(start = start.$$childHead)) {\r\n ret = fn(start);\r\n if (ret === false) {\r\n break;\r\n }\r\n\r\n ret = iterateSiblings(start, fn);\r\n if (ret === false) {\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n\r\n\r\n function getScopeById(id) {\r\n var myScope = null;\r\n iterateScopes(function (scope) {\r\n if (scope.$id === id) {\r\n myScope = scope;\r\n return false;\r\n }\r\n });\r\n return myScope;\r\n }\r\n\r\n function _makeScopeReference(scope) {\r\n if (_isScopeId(scope)) {\r\n scope = getScopeById(scope);\r\n }\r\n return scope;\r\n }\r\n\r\n function _isScopeId(scope) {\r\n return typeof scope === 'string' || typeof scope === 'number';\r\n }\r\n\r\n function mockScopeWatch (scopeId) {\r\n return function (watchExp, listener, objectEquality, prettyPrintExpression) {\r\n }\r\n }\r\n */\r\n }\r\n})();","'use strinct';\r\n(function () {\r\n angular.module('prisma')\r\n .directive('planogramModuleShelf', ['$log', planogramModuleShelfDirective])\r\n .controller('planogramModuleShelfController', ['$log', 'DnDService', planogramModuleShelfController]);\r\n\r\n function planogramModuleShelfDirective($log) {\r\n // $log.debug('planogramModuleShelfDirective::ctor');\r\n return {\r\n restrict: 'A',\r\n selector: '[planogram-module-shelf]',\r\n templateUrl: '/app/spaces/planogram/planogram-module-shelf.view.html',\r\n scope: {\r\n model: '<'\r\n },\r\n require: {\r\n planogram: '^^planogram',\r\n column: '^^planogramColumn',\r\n },\r\n controller: 'planogramModuleShelfController',\r\n controllerAs: '$ctrl',\r\n bindToController: true\r\n }\r\n }\r\n\r\n function planogramModuleShelfController($log, dnDService) {\r\n // $log.debug('planogramModuleShelfController::ctor');\r\n var self = this;\r\n self.levels = [];\r\n\r\n self.$onInit = function () {\r\n // $log.debug('planogramModuleShelfController::$onInit');\r\n // self.unregister = self.column.register(self);\r\n }\r\n\r\n self.$onDestroy = function () {\r\n // $log.debug('planogramModuleShelfController::$onDestroy');\r\n // self.unregister();\r\n delete self.levels;\r\n }\r\n\r\n self.register = function (level) {\r\n //$log.debug('planogramModuleShelfController::register %o', level);\r\n self.levels.push(level);\r\n return function unregister() {\r\n //$log.debug('planogramModuleShelfController::unregister %o', level);\r\n var id = level.getId();\r\n self.levels = self.levels.filter(function (item) {\r\n return item.getId() !== id;\r\n });\r\n }\r\n }\r\n\r\n self.getId = function getId() {\r\n return self.model.id;\r\n };\r\n\r\n self.getModel = function getModel() {\r\n // return angular.copy(self.model);\r\n return self.model.$$original;\r\n };\r\n\r\n self.getTransform = function getTransform() {\r\n var ret;\r\n if (self.model.isRefrigerator) {\r\n ret = 'translate( 0 ' + self.planogram.moduleShelfRefrigeratorTop + ' )';\r\n } else {\r\n ret = 'translate( 0 0 )';\r\n }\r\n\r\n return ret;\r\n };\r\n\r\n self.getModuleHeight = function getModuleHeight() {\r\n var ret = self.model.height;\r\n if (self.model.isRefrigerator) {\r\n ret -= self.planogram.moduleShelfRefrigeratorTop;\r\n }\r\n\r\n return ret;\r\n };\r\n\r\n self.showDoor = function showDoor() {\r\n var ret = self.model.isRefrigerator\r\n && self.planogram.showDoor;\r\n return ret;\r\n }\r\n\r\n self.onClickHandler = function onClickHandler($event) {\r\n //$log.debug('planogramModuleShelfController::onClickHandler %o', $event);\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n\r\n if (!dnDService.isOnDrag()) {\r\n $event.stopPropagation();\r\n self.planogram.raiseOnClick({\r\n $event: $event,\r\n planogram: self.planogram.getModel(),\r\n column: self.column.getModel(),\r\n module: self.getModel()\r\n });\r\n }\r\n }\r\n }\r\n})();","'use strinct';\r\n(function () {\r\n angular.module('prisma')\r\n .directive('planogramModulePeg', ['$log', planogramModulePegDirective])\r\n .controller('planogramModulePegController', ['$log', 'DnDService', planogramModulePegController]);\r\n\r\n function planogramModulePegDirective($log) {\r\n // $log.debug('planogramModulePegDirective::ctor');\r\n return {\r\n restrict: 'A',\r\n selector: '[planogram-module-peg]',\r\n templateUrl: '/app/spaces/planogram/planogram-module-peg.view.html',\r\n scope: {\r\n model: '<'\r\n },\r\n require: {\r\n planogram: '^^planogram',\r\n column: '^^planogramColumn'\r\n },\r\n controller: 'planogramModulePegController',\r\n controllerAs: '$ctrl',\r\n bindToController: true\r\n }\r\n }\r\n\r\n function planogramModulePegController($log, dnDService) {\r\n // $log.debug('planogramModulePegController::ctor');\r\n var self = this;\r\n self.levels = [];\r\n\r\n self.$onInit = function () {\r\n // $log.debug('planogramModulePegController::$onInit');\r\n // self.unregister = self.column.register(self);\r\n }\r\n\r\n self.$onDestroy = function () {\r\n // $log.debug('planogramModulePegController::$onDestroy');\r\n // self.unregister();\r\n delete self.levels;\r\n }\r\n\r\n self.register = function (level) {\r\n //$log.debug('planogramModulePegController::register %o', level);\r\n self.levels.push(level);\r\n return function unregister() {\r\n //$log.debug('planogramModulePegController::unregister %o', level);\r\n var id = level.getId();\r\n self.levels = self.levels.filter(function (item) {\r\n return item.getId() !== id;\r\n });\r\n }\r\n }\r\n\r\n self.getId = function getId() {\r\n return self.model.id;\r\n };\r\n\r\n self.getModel = function getModel() {\r\n // return angular.copy(self.model);\r\n return self.model.$$original;\r\n };\r\n\r\n self.getTransform = function getTransform() {\r\n var ret = 'translate( 0 0 )';\r\n return ret;\r\n };\r\n\r\n self.getModuleHeight = function getModuleHeight() {\r\n var ret = self.model.height;\r\n return ret;\r\n };\r\n\r\n self.hasGrid = function hasGrid() {\r\n var ret = self.model.gridWidth > 0\r\n && self.model.gridHeight > 0;\r\n return ret;\r\n }\r\n\r\n self.onClickHandler = function onClickHandler($event) {\r\n //$log.debug('planogramModulePegController::onClickHandler %o', $event);\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n\r\n if (!dnDService.isOnDrag()) {\r\n $event.stopPropagation();\r\n self.planogram.raiseOnClick({\r\n $event: $event,\r\n planogram: self.planogram.getModel(),\r\n column: self.column.getModel(),\r\n module: self.getModel()\r\n });\r\n }\r\n }\r\n }\r\n})();","'use strinct';\r\n(function () {\r\n angular.module('prisma')\r\n .directive('planogramLevelShelf', ['$log', planogramLevelShelfDirective])\r\n .controller('planogramLevelShelfController', ['$log', '$element', 'DnDService', 'SvgService', planogramLevelShelfController]);\r\n\r\n\r\n function planogramLevelShelfDirective($log) {\r\n // $log.debug('planogramLevelShelfDirective::ctor');\r\n function planogramLevelShelfDirectiveLink($scope, $element, $attr) {\r\n $element.addClass('shelf');\r\n }\r\n\r\n return {\r\n link: planogramLevelShelfDirectiveLink,\r\n restrict: 'A',\r\n selector: '[planogram-level-shelf]',\r\n templateUrl: '/app/spaces/planogram/planogram-level-shelf.view.html',\r\n scope: {\r\n model: '<',\r\n last: '<'\r\n },\r\n require: {\r\n planogram: '^^planogram',\r\n column: '^^planogramColumn',\r\n module: '^^planogramModuleShelf'\r\n },\r\n controller: 'planogramLevelShelfController',\r\n controllerAs: '$ctrl',\r\n bindToController: true\r\n }\r\n }\r\n\r\n function planogramLevelShelfController($log, $element, dnDService, svgService) {\r\n // $log.debug('planogramLevelShelfController::ctor');\r\n var self = this;\r\n\r\n // self.itemsGroup = [];\r\n self.isOver = false;\r\n self.dropIndicatorX = 0;\r\n self.overTarget = null;\r\n\r\n self.$onInit = function $onInit() {\r\n // $log.debug('planogramLevelShelfController::$onInit');\r\n // self.unregister = self.module.register(self);\r\n };\r\n\r\n self.$onDestroy = function () {\r\n // $log.debug('planogramLevelShelfController::$onDestroy');\r\n // self.unregister();\r\n delete self.itemsGroup;\r\n };\r\n\r\n self.register = function (itemGroup) {\r\n //$log.debug('planogramLevelShelfController::register %o', itemGroup);\r\n self.itemsGroup.push(level);\r\n return function unregister() {\r\n //$log.debug('planogramLevelShelfController::unregister %o', itemGroup);\r\n var id = itemGroup.getId();\r\n self.itemsGroup = self.itemsGroup.filter(function (item) {\r\n return item.getId() !== id;\r\n });\r\n }\r\n };\r\n\r\n self.getId = function getId() {\r\n return self.model.id;\r\n };\r\n\r\n self.getModel = function getModel() {\r\n // return angular.copy(self.model);\r\n return self.model.$$original;\r\n };\r\n\r\n /**\r\n * Devuelve verdadero si se tiene que mostrar el indicador de drop.\r\n * @public\r\n * @returns Verdadero si se tiene que mostrar el indicador de drop, falso en caso contrario.\r\n */\r\n self.showDropIndicator = function showDropIndicator() {\r\n return self.isOver;\r\n // && DnDService.isOnDrag();\r\n };\r\n\r\n /**\r\n * Configura el itemGroup sobre el cual se esta pasnado el mouse para mostrar el indicador de posici�n.\r\n * @param {any} data itemGroup\r\n */\r\n self.setOver = function setOver(data) {\r\n // $log.debug('planogramLevelShelfDirective::setOver\\n\\tdata: %o', data);\r\n self.isOver = true;\r\n if (angular.isObject(data)\r\n && angular.isObject(data.model)) {\r\n self.dropIndicatorX = data.model.x;\r\n if (data.place === 'after') {\r\n self.dropIndicatorX += data.model.width;\r\n }\r\n } else {\r\n self.dropIndicatorX = 0;\r\n }\r\n\r\n self.overTarget = data.model;\r\n }\r\n\r\n self.removeOver = function removeOver() {\r\n // $log.debug('planogramLevelShelfDirective::removeOver');\r\n self.isOver = false;\r\n self.dropIndicatorX = 0;\r\n self.overTarget = null;\r\n }\r\n\r\n self.getModule = function getModule() {\r\n return self.module;\r\n }\r\n\r\n self.onClickHandler = function onClickHandler($event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n\r\n // $log.debug('planogramLevelShelfController::onClickHandler %o', $event);\r\n if (!dnDService.isOnDrag()) {\r\n var $svg = self.planogram.getSvg();\r\n var point = svgService.eventToPoint($svg, $element, $event);\r\n var place = svgService.getPlace(point);\r\n self.planogram.raiseOnClick({\r\n $event: $event,\r\n planogram: self.planogram.getModel(),\r\n column: self.column.getModel(),\r\n module: self.module.getModel(),\r\n level: self.getModel(),\r\n point: point,\r\n place: place\r\n });\r\n }\r\n };\r\n\r\n function onDragOverAndEnterHandler($event) {\r\n // $log.debug('planogramLevelShelfDirective::onDragOvenAndEnterHandler %o', $event);\r\n if (dnDService.isOnDrag()) {\r\n var $svg = self.planogram.getSvg();\r\n var point = svgService.eventToPoint($svg, $element, $event);\r\n var place = svgService.getPlace(point);\r\n var model = null;\r\n var item = null;\r\n var x = 0;\r\n var len = self.model.itemsGroup.length;\r\n if (len > 0) {\r\n model = self.model.itemsGroup[len - 1];\r\n item = model.$$original;\r\n place = 'after';\r\n x = model.x + model.width;\r\n }\r\n\r\n self.planogram.setOver({\r\n $event: $event,\r\n model: {\r\n x: x,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n column: self.column.model,\r\n module: self.module.model,\r\n level: self.model\r\n },\r\n point: point,\r\n place: place\r\n });\r\n }\r\n };\r\n\r\n self.onDragEnterHandler = onDragOverAndEnterHandler;\r\n self.onDragOverHandler = onDragOverAndEnterHandler;\r\n\r\n self.onDragLeaveHandler = function onDragLeaveHandler($event) {\r\n // $log.debug('planogramLevelShelfDirective::onDragLeaveHandler %o', $event);\r\n if (dnDService.isOnDrag()) {\r\n self.planogram.removeOver();\r\n }\r\n };\r\n\r\n self.onDropHandler = function onDropHandler($event) {\r\n //$log.debug('planogramLevelShelfController::onDropHandler %o', $event);\r\n if (dnDService.isOnDrag()) {\r\n var $svg = self.planogram.getSvg();\r\n var point = svgService.eventToPoint($svg, $element, $event);\r\n var ocupied = self.model.itemsGroup.reduce(function (acumulator, item) {\r\n return acumulator + item.width;\r\n }, 0);\r\n var place = 'after'; // svgService.getPlace(point);\r\n self.planogram.raiseOnDrop({\r\n $event: $event,\r\n planogram: self.planogram.getModel(),\r\n column: self.column.getModel(),\r\n module: self.module.getModel(),\r\n level: self.getModel(),\r\n point: point,\r\n place: place\r\n });\r\n dnDService.setData(null);\r\n dnDService.setDirective(null);\r\n dnDService.setOffset(null);\r\n self.planogram.removeOver();\r\n }\r\n };\r\n }\r\n})();","'use strinct';\r\n(function () {\r\n angular.module('prisma')\r\n .directive('planogramLevelPeg', ['$log', planogramLevelPegDirective])\r\n .controller('planogramLevelPegController', ['$log', '$element', 'DnDService', 'SvgService', planogramLevelPegController]);\r\n\r\n\r\n function planogramLevelPegDirective($log) {\r\n // $log.debug('planogramLevelPegDirective::ctor');\r\n\r\n function planogramLevelPegDirectiveLink($scope, $element, $attr) {\r\n $element.addClass('peg');\r\n }\r\n\r\n return {\r\n link: planogramLevelPegDirectiveLink,\r\n restrict: 'A',\r\n selector: '[planogram-level-peg]',\r\n templateUrl: '/app/spaces/planogram/planogram-level-peg.view.html',\r\n scope: {\r\n model: '<',\r\n last: '<'\r\n },\r\n require: {\r\n planogram: '^^planogram',\r\n column: '^^planogramColumn',\r\n module: '^^planogramModulePeg'\r\n },\r\n controller: 'planogramLevelPegController',\r\n controllerAs: '$ctrl',\r\n bindToController: true\r\n }\r\n }\r\n\r\n function planogramLevelPegController($log, $element, dnDService, svgService) {\r\n // $log.debug('planogramLevelPegController::ctor');\r\n var self = this;\r\n\r\n // self.itemsGroup = [];\r\n self.isOver = false;\r\n self.dropIndicatorX = 0;\r\n self.dropIndicatorY = 0;\r\n self.overTarget = null;\r\n\r\n self.$onInit = function $onInit() {\r\n // $log.debug('planogramLevelPegController::$onInit');\r\n // self.unregister = self.module.register(self);\r\n };\r\n\r\n self.$onDestroy = function () {\r\n // $log.debug('planogramLevelPegController::$onDestroy');\r\n // self.unregister();\r\n delete self.itemsGroup;\r\n };\r\n\r\n self.register = function (itemGroup) {\r\n //$log.debug('planogramLevelPegController::register %o', itemGroup);\r\n self.itemsGroup.push(level);\r\n return function unregister() {\r\n //$log.debug('planogramLevelPegController::unregister %o', itemGroup);\r\n var id = itemGroup.getId();\r\n self.itemsGroup = self.itemsGroup.filter(function (item) {\r\n return item.getId() !== id;\r\n });\r\n }\r\n };\r\n\r\n self.getId = function getId() {\r\n return self.model.id;\r\n };\r\n\r\n self.getModel = function getModel() {\r\n // return angular.copy(self.model);\r\n return self.model.$$original;\r\n };\r\n\r\n /**\r\n * Devuelve verdadero si se tiene que mostrar el indicador de drop.\r\n * @public\r\n * @returns Verdadero si se tiene que mostrar el indicador de drop, falso en caso contrario.\r\n */\r\n self.showDropIndicator = function showDropIndicator() {\r\n return self.isOver;\r\n // && DnDService.isOnDrag();\r\n };\r\n\r\n /**\r\n * Configura el itemGroup sobre el cual se esta pasnado el mouse para mostrar el indicador de posici�n.\r\n * @param {any} data itemGroup\r\n */\r\n self.setOver = function setOver(data) {\r\n // $log.debug('planogramLevelPegDirective::setOver\\n\\tdata: %o', data);\r\n self.isOver = true;\r\n if (angular.isObject(data)\r\n && angular.isObject(data.model)) {\r\n self.dropIndicatorX = data.model.x;\r\n if (data.place === 'after') {\r\n self.dropIndicatorX += data.model.width;\r\n }\r\n } else {\r\n self.dropIndicatorX = 0;\r\n }\r\n\r\n self.overTarget = data.model;\r\n }\r\n\r\n self.removeOver = function removeOver() {\r\n // $log.debug('planogramLevelPegDirective::removeOver');\r\n self.isOver = false;\r\n self.dropIndicatorX = 0;\r\n self.overTarget = null;\r\n }\r\n\r\n self.getModule = function getModule() {\r\n return self.module;\r\n }\r\n\r\n self.onClickHandler = function onClickHandler($event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n\r\n // $log.debug('planogramLevelPegController::onClickHandler %o', $event);\r\n if (!dnDService.isOnDrag()) {\r\n var $svg = self.planogram.getSvg();\r\n var point = svgService.eventToPoint($svg, $element, $event);\r\n var place = svgService.getPlace(point);\r\n self.planogram.raiseOnClick({\r\n $event: $event,\r\n planogram: self.planogram.getModel(),\r\n column: self.column.getModel(),\r\n module: self.module.getModel(),\r\n level: self.getModel(),\r\n point: point,\r\n place: place\r\n });\r\n }\r\n };\r\n\r\n function onDragOverAndEnterHandler($event) {\r\n // $log.debug('planogramLevelPegDirective::onDragOvenAndEnterHandler %o', $event);\r\n if (dnDService.isOnDrag()) {\r\n var $svg = self.planogram.getSvg();\r\n var point = svgService.eventToPoint($svg, $element, $event);\r\n var place = svgService.getPlace(point);\r\n var model = null;\r\n var item = null;\r\n var len = self.model.itemsGroup.length;\r\n if (len > 0) {\r\n model = self.model.itemsGroup[len - 1];\r\n item = model.$$original;\r\n place = 'after';\r\n }\r\n\r\n self.setOver({\r\n $event: $event,\r\n model: model,\r\n item: item,\r\n point: point,\r\n place: place\r\n });\r\n }\r\n };\r\n\r\n self.onDragEnterHandler = onDragOverAndEnterHandler;\r\n self.onDragOverHandler = onDragOverAndEnterHandler;\r\n\r\n self.onDragLeaveHandler = function onDragLeaveHandler($event) {\r\n // $log.debug('planogramLevelPegDirective::onDragLeaveHandler %o', $event);\r\n if (dnDService.isOnDrag()) {\r\n self.removeOver();\r\n }\r\n };\r\n\r\n self.onDropHandler = function onDropHandler($event) {\r\n //$log.debug('planogramLevelPegController::onDropHandler %o', $event);\r\n if (dnDService.isOnDrag()) {\r\n var $svg = self.planogram.getSvg();\r\n var point = svgService.eventToPoint($svg, $element, $event);\r\n var ocupied = self.model.itemsGroup.reduce(function (acumulator, item) {\r\n return acumulator + item.width;\r\n }, 0);\r\n var place = 'after'; // svgService.getPlace(point);\r\n self.planogram.raiseOnDrop({\r\n $event: $event,\r\n planogram: self.planogram.getModel(),\r\n column: self.column.getModel(),\r\n module: self.module.getModel(),\r\n level: self.getModel(),\r\n point: point,\r\n place: place\r\n });\r\n dnDService.setData(null);\r\n dnDService.setDirective(null);\r\n dnDService.setOffset(null);\r\n self.removeOver();\r\n }\r\n };\r\n }\r\n})();","'use strict';\r\n\r\n/*KRC FIX*/\r\nvar usePegFixX0y0_krc = true;\r\nvar usePegFixX0y0_krc_siblings = true;\r\n/*END KRC FIX*/\r\n\r\n(function () {\r\n // Identificador unico para las directivas draggeables.\r\n var uid = 0;\r\n\r\n angular.module('prisma')\r\n .directive('planogramItemGroup2', ['$log', planogramItemGroup2Directive])\r\n .controller('planogramItemGroup2Controller', ['$log', '$element', 'DnDService', 'SvgService', planogramItemGroup2Controller]);\r\n\r\n function planogramItemGroup2Directive($log) {\r\n // $log.debug('planogramItemGroup2Directive::ctor');\r\n return {\r\n restrict: 'A',\r\n selector: '[planogram-item-group2]',\r\n templateUrl: '/app/spaces/planogram/planogram-item-group2.view.html',\r\n scope: {\r\n model: '<'\r\n },\r\n require: {\r\n planogram: '^^planogram'\r\n },\r\n controller: 'planogramItemGroup2Controller',\r\n controllerAs: '$ctrl',\r\n bindToController: true\r\n }\r\n }\r\n\r\n function planogramItemGroup2Controller($log, $element, dnDService, svgService) {\r\n // $log.debug('planogramItemGroup2Controller::ctor');\r\n var self = this;\r\n\r\n self.$onInit = function () {\r\n // $log.debug('planogramItemGroup2Controller::$onInit');\r\n }\r\n self.$onChanges = function $onChanges(changesObj) {\r\n if (changesObj.model) {\r\n self.model = changesObj.model.currentValue;\r\n self.model.itemSketchText = self.getItemSketchText();\r\n self.model.groupSketchText = self.getGroupSketchText();\r\n self.model.groupSketchTextY = self.getGroupSketchTextY();\r\n self.model.groupSketchTextLength = self.getGroupSketchTextLength();\r\n self.model.groupSketchTextTransform = self.getGroupSketchTextTransform();\r\n self.model.hitAreaY = self.getHitAreaY();\r\n self.model.hitAreaWidth = self.getHitAreaWidth();\r\n self.model.hitAreaHeight = self.getHitAreaHeight();\r\n self.model.labelInfo = self.getLabelInfo();\r\n self.model.label1 = self.getLabel1();\r\n self.model.label2 = self.getLabel2();\r\n self.model.opacity = self.getOpacity();\r\n\r\n angular.forEach(self.model.items,\r\n function (item) {\r\n item.itemSketchTextLength = self.getItemSketchTextLength(item);\r\n item.sketchTextY = self.getItemSketchTextY(item);\r\n item.itemSketchTextTransform = self.getItemSketchTextTransform(item);\r\n });\r\n }\r\n }\r\n\r\n self.$onDestroy = function () {\r\n // $log.debug('planogramItemGroup2Controller::$onDestroy');\r\n self.planogram = null;\r\n }\r\n\r\n self.getModel = function getModel() {\r\n return self.model.$$original;\r\n };\r\n\r\n self.showSketch = function showSketch() {\r\n var ret = self.planogram.showSketch();\r\n return ret;\r\n };\r\n\r\n self.getLabelInfo = function getLabelInfo() {\r\n var aux = self.planogram.labelInfoGetter(self.model.$$original);\r\n var ret = self.fixLabel(aux);\r\n return ret;\r\n };\r\n\r\n /**\r\n * Devuelve el texto del label 1 del item group evaluando la expresi�n que se configuro.\r\n * @returns El texto del label 1 del item group.\r\n */\r\n self.getLabel1 = function getLabel1() {\r\n var aux = self.planogram.label1Getter(self.model.$$original);\r\n var ret = self.fixLabel(aux);\r\n return ret;\r\n };\r\n\r\n /**\r\n * Devuelve el texto del label 2 del item group evaluando la expresi�n que se configuro.\r\n * @returns El texto del label 2 del item group.\r\n */\r\n self.getLabel2 = function getLabel2() {\r\n var aux = self.planogram.label2Getter(self.model);\r\n var ret = self.fixLabel(aux);\r\n return ret;\r\n };\r\n\r\n self.fixLabel = function fixLabel(value) {\r\n var ret = value;\r\n // Fix precios en null.\r\n if (angular.isString(ret) && ret.trim() === '$ null') {\r\n ret = '';\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n self.getItemSketchTextTransform = function getItemSketchTextTransform(item) {\r\n var ret;\r\n if (self.model.itemWidth > self.model.itemHeight) {\r\n ret = 'translate( ' +\r\n String(self.model.itemWidth / 2) +\r\n ' ' +\r\n String(self.model.itemHeight / 2) +\r\n ' ) rotate( 360 )';\r\n } else {\r\n ret = 'rotate( 270 ) translate( -' + String(self.model.itemHeight / 2) + ' 0 )';\r\n }\r\n\r\n return ret;\r\n };\r\n\r\n self.getItemSketchTextY = function getItemSketchTextY(item) {\r\n var ret;\r\n if (self.model.itemWidth > self.model.itemHeight) {\r\n ret = 0;\r\n } else {\r\n ret = String(self.model.itemWidth / 2);\r\n }\r\n\r\n return ret;\r\n };\r\n\r\n self.getItemSketchTextLength = function getItemSketchTextLength(item) {\r\n var ret = Math.max(self.model.itemWidth, self.model.itemHeight);\r\n return ret;\r\n };\r\n\r\n self.getGroupSketchTextLength = function getGroupSketchTextLength() {\r\n var ret = Math.min(self.model.width, self.model.height);\r\n return ret;\r\n };\r\n\r\n self.getGroupSketchTextTransform = function getGroupSketchTextTransform() {\r\n var ret;\r\n if (self.model.width > self.model.height) {\r\n ret = 'translate( ' +\r\n String(self.model.width / 2) +\r\n ' ' +\r\n String(self.model.height / 2) +\r\n ' ) rotate( 360 )';\r\n } else {\r\n ret = 'rotate( 270 ) translate( -' + String(self.model.height / 2) + ' 0 )';\r\n }\r\n\r\n return ret;\r\n };\r\n\r\n self.getGroupSketchTextY = function getGroupSketchTextY() {\r\n var ret;\r\n if (self.model.width > self.model.height) {\r\n ret = 0;\r\n } else {\r\n ret = String(self.model.width / 2);\r\n }\r\n\r\n return ret;\r\n };\r\n\r\n self.getItemSketchText = function getItemSketchText() {\r\n var ret = self.getLabel1();\r\n return ret;\r\n };\r\n\r\n self.getGroupSketchText = function getGroupSketchText() {\r\n var ret = self.getLabel1();\r\n return ret;\r\n };\r\n\r\n self.getItemSketchTextWidth = function getItemSketchTextWidth() {\r\n return Math.max(self.model.itemWidth, self.model.itemHeight);\r\n }\r\n\r\n self.getGroupSketchTextWidth = function getGroupSketchTextWidth() {\r\n return Math.max(self.model.width, self.model.height);\r\n }\r\n\r\n /**\r\n * Devuelve el valor de la opacidad.\r\n */\r\n self.getOpacity = function getOpacity() {\r\n var ret;\r\n var filtered = self.planogram.hasFiltered() &&\r\n angular.isDefined(self.model.filtered) &&\r\n self.model.filtered;\r\n var selected = self.planogram.hasSelected() &&\r\n angular.isDefined(self.model.selected) &&\r\n self.model.selected;\r\n var allowEditStructure = self.planogram.allowEditStructure;\r\n if ((filtered || selected) && !allowEditStructure) {\r\n ret = 1.0;\r\n } else if (self.planogram.hasFiltered() && !allowEditStructure) {\r\n ret = 0.14;\r\n } else if (self.planogram.hasSelected() && !allowEditStructure) {\r\n ret = 0.75;\r\n } else if (allowEditStructure) {\r\n ret = 0.14;\r\n } else {\r\n ret = 1.0;\r\n }\r\n\r\n return ret;\r\n };\r\n\r\n self.getLabelInfoClass = function getLabelInfoClass() {\r\n // Workaround: queda prendida la clase para dar el color rojo.\r\n planogramItemGroup2Controller.labelInfoClasses = planogramItemGroup2Controller.labelInfoClasses || {};\r\n //var ret = angular.merge({}, planogramItemGroup2Controller.labelInfoClasses);\r\n var ret = angular.copy(planogramItemGroup2Controller.labelInfoClasses);\r\n var aux = self.planogram.labelInfoClassGetter(self.model.$$original);\r\n if (angular.isString(aux) && aux !== '') {\r\n ret[aux] = true;\r\n planogramItemGroup2Controller.labelInfoClasses[aux] = false;\r\n }\r\n\r\n return ret;\r\n };\r\n\r\n self.getHitAreaY = function getHitAreaY() {\r\n var ret;\r\n var type = self.getModuleType();\r\n if (type === 'Shelf') {\r\n ret = -Math.abs(self.model.y);\r\n } else if (type === 'Peg') {\r\n ret = 0;\r\n } else {\r\n ret = -Math.abs(self.model.y);\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve verdadero si esta habilitado el Drag and Drop en el planograma, falso en caso contrario.\r\n * @returns Verdadero si esta habilitado el Drag and Drop en el planograma, falso en caso contrario.\r\n */\r\n self.getAllowDrag = function getAllowDrag() {\r\n var ret = self.planogram.allowDrag\r\n && !self.planogram.allowEditStructure;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve el ancho para el area de hit del item.\r\n * @return El ancho para el area de hit del item.\r\n */\r\n self.getHitAreaWidth = function getHitAreaWidth() {\r\n var ret = self.model.width;\r\n return ret;\r\n }\r\n\r\n /*\r\n * Devuelve el alto para el area de hit del item seg�n el tipo de m�dulo donde se encuentre el item.\r\n * @return El alto para el area de hit del item seg�n el tipo de m�dulo donde se encuentre el item.\r\n */\r\n self.getHitAreaHeight = function getHitAreaHeight() {\r\n var ret;\r\n var type = self.getModuleType();\r\n if (type === 'Shelf') {\r\n ret = self.model.level.height;\r\n } else if (type === 'Peg') {\r\n ret = self.model.height;\r\n } else {\r\n ret = self.model.height;\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n self.onDblClickHandler = function onDblClick($event) {\r\n // Fix issue performance planograma.\r\n // $log.debug('planogramItemGroup2Controller::onDblClickHandler %o', $event);\r\n self.planogram.onDblClick($event);\r\n };\r\n\r\n self.onHoldHandler = function onHoldHandler($event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n\r\n // Fix issue performance planograma.\r\n // $log.debug('planogramItemGroup2Controller::onClickHandler %o', $event);\r\n //if (!dnDService.isOnDrag()) {\r\n var $svg = self.planogram.getSvg();\r\n var point = svgService.eventToPoint($svg, $element, $event);\r\n var place = svgService.getPlace(point);\r\n self.planogram.raiseOnClick({\r\n $event: $event,\r\n planogram: self.planogram.getModel(),\r\n column: self.model.column.$$original,\r\n module: self.model.module.$$original,\r\n level: self.model.level.$$original,\r\n item: self.getModel(),\r\n point: point,\r\n place: place\r\n });\r\n //}\r\n };\r\n\r\n self.onClickHandler = function onClickHandler($event) {\r\n\r\n // console.time('onClickHandler');\r\n\r\n // Fix issue performance planograma.\r\n // $log.debug('planogramItemGroup2Controller::onClickHandler %o', $event);\r\n\r\n //Dispara el cambio de seleccion si el item esta seleccionado o ya hay otro seleccionado.\r\n if (self.model.selected || self.planogram.hasSelected()) {\r\n var $svg = self.planogram.getSvg();\r\n var point = svgService.eventToPoint($svg, $element, $event);\r\n var place = svgService.getPlace(point);\r\n self.planogram.raiseOnClick({\r\n $event: $event,\r\n planogram: self.planogram.getModel(),\r\n column: self.model.column.$$original,\r\n module: self.model.module.$$original,\r\n level: self.model.level.$$original,\r\n item: self.getModel(),\r\n point: point,\r\n place: place\r\n });\r\n }\r\n\r\n // console.timeEnd('onClickHandler');\r\n };\r\n\r\n function onDragEnterAndOverHandler($event) {\r\n // Fix issue performance planograma.\r\n // $log.debug('planogramItemGroup2Controller::onDragEnterAndOverHandler %o', $event);\r\n if (dnDService.isOnDrag()) {\r\n var $svg = self.planogram.getSvg();\r\n var point = svgService.eventToPoint($svg, $element, $event);\r\n var place = svgService.getPlace(point);\r\n self.planogram.setOver({\r\n $event: $event,\r\n model: self.model,\r\n point: point,\r\n place: place\r\n });\r\n }\r\n };\r\n\r\n self.onDragEnterHandler = onDragEnterAndOverHandler;\r\n self.onDragOverHandler = onDragEnterAndOverHandler;\r\n\r\n self.onDragLeaveHandler = function onDragLeaveHandler($event) {\r\n // Fix issue performance planograma.\r\n // $log.debug('planogramItemGroup2Controller::onDragLeaveHandler %o', $event);\r\n if (dnDService.isOnDrag()) {\r\n self.planogram.removeOver();\r\n }\r\n };\r\n\r\n self.onDragEndHandler = function onDragEndHandler($event) {\r\n // Fix issue performance planograma.\r\n // $log.debug('planogramItemGroup2Controller::onDragLeaveHandler %o', $event);\r\n if (dnDService.isOnDrag()) {\r\n var $target = $element.find('.planogram-item-group.item.image:first');\r\n if ($target.length) {\r\n svgService.removeClass($target, 'drag');\r\n\r\n }\r\n\r\n $element.removeClass('drag').css('opacity', 1);\r\n\r\n /*KRC FIX*/\r\n if (usePegFixX0y0_krc){\r\n $('.item-prod-krc').css('pointer-events', 'unset')\r\n }\r\n /*END KRC FIX*/\r\n }\r\n };\r\n\r\n self.onDropHandler = function onDropHandler($event) {\r\n // Fix issue performance planograma.\r\n //$log.debug('planogramItemGroup2Controller::onDropHandler %o', $event);\r\n if (dnDService.isOnDrag()) {\r\n var $svg = self.planogram.getSvg();\r\n var point = svgService.eventToPoint($svg, $element, $event);\r\n var place = svgService.getPlace(point);\r\n self.planogram.raiseOnDrop({\r\n $event: $event,\r\n planogram: self.planogram.getModel(),\r\n column: self.model.column.$$original,\r\n module: self.model.module.$$original,\r\n level: self.model.level.$$original,\r\n item: self.getModel(),\r\n point: point,\r\n place: place\r\n });\r\n dnDService.setData(null);\r\n dnDService.setDirective(null);\r\n dnDService.setOffset(null);\r\n self.planogram.removeOver();\r\n }\r\n };\r\n\r\n self.getDraggableTarget = function getDraggableTarget($event) {\r\n // Link: http://www.petercollingridge.co.uk/tutorials/svg/interactive/dragging/\r\n var $svg = self.planogram.getSvg();\r\n var $target = angular.element($event.target).parent('g.planogram-item-group.draggable');\r\n var point = svgService.eventToPoint($svg, $target, $event);\r\n var $clone = $target.clone();\r\n var idAux = ++uid;\r\n var id = 'ian-draggable-target-' + String(idAux);\r\n $target.data('draggable', id);\r\n var selector = '#' + id;\r\n $target.addClass('ian-active-drag');\r\n $element.css('opacity', 0.5);\r\n var moduleType = self.getModuleType();\r\n\r\n /*KRC FIX */\r\n if (usePegFixX0y0_krc && $element && moduleType == 'Peg') {\r\n var siblingPeg = $element.siblings('.planogram-column-wrapper').find('.planogram-peg-krc')\r\n var hassiblingPeg = siblingPeg && siblingPeg.size()\r\n\r\n $element.css('pointer-events', 'none');\r\n\r\n if (hassiblingPeg && usePegFixX0y0_krc_siblings) {\r\n $($element).siblings('.item-prod-krc').css('pointer-events', 'none')\r\n }\r\n\r\n if (false) console.log('[$svg]', $svg[0]);\r\n if (false) console.log('[$$element]', $element, siblingPeg, !!hassiblingPeg);\r\n }\r\n /*END KRC FIX*/\r\n\r\n var offset = self.getMousePosition($event, $svg);\r\n $clone.prop('id', id)\r\n .data('point', point)\r\n .data('dragAndDropRemoveAfterUse', false);\r\n svgService.addClass($clone, 'ian-dragging');\r\n $svg.append($clone);\r\n var cloneDom = $clone[0];\r\n\r\n // Get all the transforms currently on this element\r\n var transforms = cloneDom.transform.baseVal;\r\n\r\n // Ensure the first transform is a translate transform\r\n if (transforms.length === 0 ||\r\n transforms.getItem(0).type !== window.SVGTransform.SVG_TRANSFORM_TRANSLATE) {\r\n\r\n // Create an transform that translates by (0, 0)\r\n var translate = svg.createSVGTransform();\r\n translate.setTranslate(0, 0);\r\n\r\n // Add the translation to the front of the transforms list\r\n cloneDom.transform.baseVal.insertItemBefore(translate, 0);\r\n }\r\n\r\n // Get initial translation amount\r\n var transform = transforms.getItem(0);\r\n offset.x -= transform.matrix.e;\r\n offset.y -= transform.matrix.f;\r\n $element.data('offset', offset);\r\n dnDService.setOffset(offset);\r\n $clone.data('offset', offset)\r\n .data('transform', transform);\r\n\r\n return selector;\r\n }\r\n\r\n self.daggableMoveAt = function daggableMoveAt($event, x, y) {\r\n // Link: http://www.petercollingridge.co.uk/tutorials/svg/interactive/dragging/\r\n var $svg = self.planogram.getSvg();\r\n var $target = angular.element('.ian-active-drag');\r\n var id = $target.data('draggable');\r\n var selector = '#' + id;\r\n\r\n // var $draggable = angular.element(selector);\r\n var $draggable = angular.element('.ian-dragging');\r\n //$log.debug('planogramItemGroup2Controller::daggableMoveAt\\n\\t$event: %o\\n\\tx: %o\\n\\ty: %o\\n\\tselector: %o\\n\\t$target: %o',\r\n // $event,\r\n // x,\r\n // y, selector,\r\n // $target);\r\n if ($draggable.length) {\r\n var coord = self.getMousePosition($event, $svg);\r\n var offset = $draggable.data('offset');\r\n var transforms = $draggable[0].transform.baseVal;\r\n var transform = transforms.getItem(0);\r\n transform.setTranslate(coord.x - offset.x, coord.y - offset.y);\r\n\r\n //$log.debug('planogramItemGroup2Controller::daggableMoveAt\\n\\t$event: %o\\n\\tx: %o\\n\\ty: %o\\n\\tcoord: %o, \\n\\toffset: %o',\r\n // $event,\r\n // x,\r\n // y,\r\n // coord,\r\n // offset);\r\n }\r\n }\r\n\r\n /**\r\n * Devuelve la configuraci�n de la grilla para el snap en el drag and drop.\r\n */\r\n self.getSnapToGridConfig = function getSnapToGridConfig() {\r\n //: (Math.abs(module.gridWidth) || 1) * self.scaleFactor,\r\n // gridHeight: (Math.abs(module.gridHeight) || 1) * self.scaleFactor,\r\n var ret;\r\n var type = self.getModuleType();\r\n\r\n if (type === 'Shelf') {\r\n ret = {\r\n x: 1,\r\n y: 1\r\n };\r\n } else if (type === 'Peg') {\r\n ret = {\r\n x: self.model.module.gridWidth,\r\n y: self.model.module.gridHeight\r\n };\r\n } else {\r\n ret = {\r\n x: 1,\r\n y: 1\r\n };\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Devuelve el tipo de m�dulo que contiene el item.\r\n */\r\n self.getModuleType = function getModuleType() {\r\n var ret = self.model.module.type;\r\n return ret;\r\n }\r\n\r\n self.getMousePosition = function getMousePosition($event, $svg) {\r\n var screenCtm = $svg[0].getScreenCTM();\r\n if ($event.touches) {\r\n $event = $event.touches[0];\r\n }\r\n\r\n return {\r\n x: ($event.clientX - screenCtm.e) / screenCtm.a,\r\n y: ($event.clientY - screenCtm.f) / screenCtm.d\r\n };\r\n }\r\n\r\n }\r\n})();","angular.module('prisma').component('addLevelComponent', {\r\n templateUrl: 'app/spaces/layouts/addLevel.html',\r\n controller: addLevelController,\r\n bindings: {\r\n resolve: '<',\r\n close: '&',\r\n dismiss: '&'\r\n }\r\n});\r\n\r\n\r\nfunction addLevelController($scope, $timeout, $translate, spaceService) {\r\n var self = this;\r\n self.level = {};\r\n self.imgWidth;\r\n self.imgheight;\r\n self.levelWidthMts;\r\n self.levelDepthMts;\r\n self.isBusy = false;\r\n\r\n if (self.resolve.modalInfo.isEdit) {\r\n \r\n var floor = self.resolve.modalInfo.floor;\r\n self.levelWidthMts = floor.width / 100;\r\n self.levelDepthMts = floor.depth / 100;\r\n self.level.width = floor.width;\r\n self.level.depth = floor.depth;\r\n self.level.totalSpace = floor.totalSpace;\r\n self.level.sellingAreaSpace = floor.sellingAreaSpace;\r\n }\r\n\r\n \r\n //self.calcDepth = function () {\r\n // self.level.width = self.levelWidthMts * 100;\r\n // self.level.depth = self.level.width * self.imgheight / self.imgWidth\r\n // self.level.depth = self.level.depth.toFixed(2);\r\n // self.levelDepthMts = self.level.depth / 100;\r\n //}\r\n\r\n // self.calcWidth = function () {\r\n // self.level.depth = self.levelDepthMts * 100;\r\n // self.level.width = self.level.depth * self.imgWidth / self.imgheight\r\n // self.level.width = self.level.width.toFixed(2);\r\n // self.levelWidthMts = self.level.width / 100;\r\n // }\r\n\r\n self.calcDepth = function () {\r\n \r\n self.level.depth = self.levelDepthMts * 100;\r\n }\r\n\r\n self.calcWidth = function () {\r\n\r\n self.level.width = self.levelWidthMts * 100;\r\n }\r\n\r\n $scope.uploadFile = function (files) {\r\n\r\n $timeout(function () {\r\n self.level.file = files[0]\r\n }, 25);\r\n\r\n\r\n //adminService.missions.uploadLayout(fromData).then(function (res) { console.log('res', res) })\r\n\r\n //spaceService.layouts.uploadLayout(dto).then(function (res) { console.log(res) })\r\n\r\n };\r\n\r\n var input = document.querySelector('#image_uploads');\r\n var preview = document.querySelector('.preview');\r\n\r\n input.style.opacity = 0;\r\n\r\n input.addEventListener('change', updateImageDisplay);\r\n\r\n function updateImageDisplay() {\r\n while (preview.firstChild) {\r\n preview.removeChild(preview.firstChild);\r\n }\r\n\r\n var curFiles = input.files;\r\n if (curFiles.length === 0) {\r\n var para = document.createElement('p');\r\n para.textContent = translations.NoFilesSelectedForUpload;\r\n preview.appendChild(para);\r\n } else {\r\n var list = document.createElement('ol');\r\n preview.appendChild(list);\r\n for (var i = 0; i < curFiles.length; i++) {\r\n var listItem = document.createElement('li');\r\n var para = document.createElement('p');\r\n if (validFileType(curFiles[i])) {\r\n para.textContent = translations.FileName + curFiles[i].name + translations.FileSize + returnFileSize(curFiles[i].size) + '.';\r\n var image = document.createElement('img');\r\n image.src = window.URL.createObjectURL(curFiles[i]);\r\n image.onload = function () {\r\n //console.log('image', image.naturalWidth, image.width, image.naturalHeight, image.height)\r\n\r\n self.imgWidth = image.naturalWidth\r\n self.imgheight = image.naturalHeight\r\n self.level.depth = self.level.width * image.naturalHeight / image.naturalWidth\r\n\r\n }\r\n\r\n image.style.height = '150px'\r\n\r\n listItem.appendChild(image);\r\n listItem.appendChild(para);\r\n\r\n } else {\r\n para.textContent = translations.FileName + curFiles[i].name + translations.NotValidFileType;\r\n listItem.appendChild(para);\r\n }\r\n\r\n list.appendChild(listItem);\r\n }\r\n }\r\n }\r\n\r\n var fileTypes = [\r\n 'image/jpeg',\r\n 'image/pjpeg',\r\n 'image/png'\r\n ]\r\n\r\n function validFileType(file) {\r\n for (var i = 0; i < fileTypes.length; i++) {\r\n if (file.type === fileTypes[i]) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n function returnFileSize(number) {\r\n if (number < 1024) {\r\n return number + 'bytes';\r\n } else if (number > 1024 && number < 1048576) {\r\n return (number / 1024).toFixed(1) + 'KB';\r\n } else if (number > 1048576) {\r\n return (number / 1048576).toFixed(1) + 'MB';\r\n }\r\n }\r\n\r\n self.loadFileLayout = function (file) {\r\n\r\n //spaceService.layouts.uploadLayout(formdata).then(function (res) {\r\n\r\n\r\n //swal('imagen del Layout guardado', 'la imagen del layout se ha guardado correctamente', 'success');\r\n\r\n //console.log(\"exito\", res);\r\n //});\r\n }\r\n\r\n\r\n\r\n\r\n function isValidField(field) {\r\n if (field == undefined || field == null || field == '')\r\n return false;\r\n\r\n return !isNaN(parseFloat(field));\r\n }\r\n\r\n function validar() {\r\n return isValidField(self.level.depth) &&\r\n isValidField(self.level.width) &&\r\n isValidField(self.level.sellingAreaSpace) &&\r\n isValidField(self.level.totalSpace);\r\n }\r\n\r\n self.confirm = function () {\r\n\r\n if (!validar()) {\r\n\r\n //console.log('invalido',self.level);\r\n\r\n swal(translations.ValidationSwalTitleAddLevel, translations.ValidationSwalSubtitleAddLevel, 'error');\r\n\r\n return;\r\n }\r\n else if (self.level.sellingAreaSpace > self.level.totalSpace) {\r\n swal('Error', '', 'error');\r\n }\r\n\r\n else if (self.level.file) {\r\n self.isBusy = true;\r\n var formData = new FormData();\r\n\r\n formData.append('photo', self.level.file);\r\n\r\n spaceService.layouts.saveLayoutLevels(formData).then(function (uri) {\r\n self.isBusy = false;\r\n console.log('saveLayoutLevel', uri);\r\n self.level.photoUri = uri;\r\n self.close({ $value: self.level });\r\n });\r\n }\r\n else {\r\n self.close({ $value: self.level });\r\n }\r\n\r\n\r\n\r\n\r\n }\r\n\r\n self.validateNumbers = function () {\r\n if (self.level.sellingAreaSpace > self.level.totalSpace)\r\n return true;\r\n else\r\n false\r\n }\r\n\r\n\r\n\r\n self.cancel = function () {\r\n self.dismiss({ $value: 'cancel' });\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n $translate([\"ValidationSwalTitleAddLevel\", \"ValidationSwalSubtitleAddLevel\", \"FileName\", \"FileSize\", \"NotValidFileType\", \"NoFilesSelectedForUpload\"])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n }\r\n init();\r\n}\r\n\r\n","'use strinct';\r\n(function () {\r\n angular.module('prisma')\r\n .service('PlanogramHelper', ['$log', PlanogramHelperService]);\r\n\r\n function PlanogramHelperService($log) {\r\n this.$log = $log;\r\n //this.$log.debug('PlanogramHelperService::ctor');\r\n }\r\n\r\n /**\r\n * Devuelve el ancho calculado para el grupo de items.\r\n * @private\r\n * @param {any} item Referencia del item.\r\n * @returns El ancho calculado para el grupo de items.\r\n */\r\n PlanogramHelperService.prototype.getItemWidth = function getItemWidth(value) {\r\n var ret;\r\n return ret;\r\n }\r\n\r\n PlanogramHelperService.prototype.getItemGeometry = function getItemGeometry(value) {\r\n // Calcula los tamaños de los items según los tipos de rotaciones.\r\n\r\n // Items acostados.\r\n var layDownItem = {\r\n width: value.width,\r\n height: value.depth,\r\n depth: value.height,\r\n position: {\r\n width: value.width,\r\n height: value.depth,\r\n depth: value.height\r\n }\r\n };\r\n\r\n // Items apilados\r\n var stackAboveItem = {\r\n width: value.width,\r\n height: value.height,\r\n depth: value.depth,\r\n position: {\r\n width: value.width,\r\n height: value.height,\r\n depth: value.depth\r\n }\r\n };\r\n\r\n var width;\r\n var depth;\r\n var stackBehind = value.stackBehind || 1;\r\n var stackAboveAux = value.stackAbove || 1;\r\n var layDownItemAux = value.layDownItem || 0;\r\n var hasStack = stackAboveAux > 1;\r\n var hasLayDown = layDownItemAux > 0;\r\n var orientation = value.orientation || 1;\r\n\r\n switch (orientation) {\r\n case 1 /* Sin rotación */:\r\n // Apilados \r\n // Sin cambios.\r\n\r\n // Acostados\r\n // Sin cambios.\r\n break;\r\n\r\n case 2 /* Rotado 90 grados */:\r\n // Apilados\r\n stackAboveItem.position = {\r\n width: stackAboveItem.height,\r\n height: stackAboveItem.width\r\n };\r\n\r\n // Acostados\r\n layDownItem.position = {\r\n width: layDownItem.height,\r\n height: layDownItem.width\r\n };\r\n break;\r\n\r\n case 3 /* Rotado 180 grados */:\r\n // Apilados \r\n // Sin cambios.\r\n\r\n // Acostados\r\n // Sin cambios.\r\n break;\r\n\r\n case 4 /* Rotado 270 grados */:\r\n // Apilados \r\n stackAboveItem.position = {\r\n width: stackAboveItem.height,\r\n height: stackAboveItem.width\r\n };\r\n\r\n // Acostados\r\n layDownItem.position = {\r\n width: layDownItem.height,\r\n height: layDownItem.width\r\n };\r\n break;\r\n }\r\n\r\n if (hasStack && hasLayDown) {\r\n width = Math.max(layDownItem.position.width, stackAboveItem.position.width) * value.facings;\r\n depth = Math.max(layDownItem.position.depth, stackAboveItem.position.depth) * stackBehind;\r\n } else if (hasStack && !hasLayDown) {\r\n width = stackAboveItem.position.width * value.facings;\r\n depth = stackAboveItem.position.depth * stackBehind;\r\n } else if (!hasStack && hasLayDown) {\r\n width = layDownItem.position.width * value.facings;\r\n depth = layDownItem.position.depth * stackBehind;\r\n } else {\r\n width = stackAboveItem.position.width * value.facings;\r\n depth = stackAboveItem.position.depth * stackBehind;\r\n }\r\n\r\n var height = stackAboveItem.position.height * value.stackAbove\r\n + layDownItem.position.height * value.layDownItem;\r\n\r\n // Calcula el tamaño del grupo de items.\r\n var ret = {\r\n width: width,\r\n height: height,\r\n depth: depth,\r\n stackAboveItem: stackAboveItem,\r\n layDownItem: layDownItem,\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n})();","'use strinct';\r\n(function () {\r\n angular.module('prisma')\r\n .directive('planogramColumn', ['$log', planogramColumnDirective])\r\n .controller('planogramColumnController', ['$log', 'DnDService', planogramColumnController]);\r\n\r\n function planogramColumnDirective($log) {\r\n // $log.debug('planogramColumnDirective::ctor');\r\n return {\r\n restrict: 'A',\r\n selector: '[planogram-column]',\r\n templateUrl: '/app/spaces/planogram/planogram-column.view.html',\r\n scope: {\r\n model: '<'\r\n },\r\n require: {\r\n planogram: '^^planogram'\r\n },\r\n controllerAs: '$ctrl',\r\n controller: 'planogramColumnController',\r\n bindToController: true\r\n };\r\n }\r\n\r\n function planogramColumnController($log, dnDService) {\r\n // $log.debug('planogramColumnController::ctor');\r\n var self = this;\r\n self.$onInit = function $onInit() {\r\n // $log.debug('planogramColumnController::$onInit');\r\n // self.unregister = self.planogram.register(self);\r\n };\r\n\r\n self.$onDestroy = function $onDestroy() {\r\n // $log.debug('planogramColumnController::$onDestroy');\r\n // self.unregister();\r\n };\r\n\r\n self.register = function registerModule(module) {\r\n $log.debug('planogramColumnController::register %o', module);\r\n self.modules.push(module);\r\n return function unregister() {\r\n $log.debug('planogramColumnController::unregister %o', module);\r\n var id = module.getId();\r\n self.modules = self.modules.filter(function (item) {\r\n return item.getId() !== id;\r\n });\r\n };\r\n };\r\n\r\n self.getId = function getId() {\r\n return self.model.id;\r\n };\r\n\r\n self.onClickHandler = function onClickHandler($event) {\r\n $log.debug('planogramColumnController::onClickHandler %o', $event);\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n if (!dnDService.isOnDrag()) {\r\n $event.stopPropagation();\r\n self.planogram.raiseOnClick({\r\n $event: $event,\r\n planogram: self.planogram.getModel(),\r\n column: self.getModel()\r\n });\r\n }\r\n }\r\n\r\n self.getModel = function getModel() {\r\n // return angular.copy(self.model);\r\n return self.model.$$original;\r\n };\r\n\r\n self.showColumnId = function showColumnId() {\r\n var ret = self.planogram.showColumnId;\r\n return ret;\r\n }\r\n\r\n self.editOrder = function () {\r\n swal({\r\n title: \"Nuevo Orden\",\r\n type: \"input\",\r\n showCancelButton: true,\r\n closeOnConfirm: false,\r\n inputPlaceholder: \"orden\"\r\n }, function (inputValue) {\r\n if (inputValue === false) return false;\r\n var planogram = self.planogram.model.$$original;\r\n if (isNaN(inputValue) || inputValue < 1 || inputValue > planogram.columns.length) {\r\n swal.showInputError(\"Invalido\");\r\n return false\r\n }\r\n if (inputValue == self.model.$$original.order)\r\n {\r\n swal.showInputError(\"ya tiene ese orden\");\r\n return false\r\n }\r\n\r\n var oldOrder = self.model.$$original.order;\r\n\r\n var thisColumn = planogram.columns.find(function (c) {\r\n return c.order == oldOrder;\r\n });\r\n\r\n var otherColumn = planogram.columns.find(function (c) {\r\n return c.order == parseInt(inputValue);\r\n });\r\n\r\n thisColumn.order = parseInt(inputValue);\r\n otherColumn.order = oldOrder;\r\n\r\n self.planogram.calculate(self.planogram.data);\r\n\r\n\r\n swal(\"Orden Cambiado\", \"Se cambio el \" + oldOrder + \" por el \" + inputValue, \"success\");\r\n });\r\n }\r\n }\r\n})();","'use strinct';\r\n(function () {\r\n angular.module('prisma').factory('imageService', ['$log', '$q', imageService]);\r\n\r\n function imageService($log, $q) {\r\n //$log.debug('imageService::ctor');\r\n var cache = {};\r\n\r\n function loadFn(imageUrl) {\r\n // Fix issue performance planograma.\r\n // $log.debug('imageService::load imageUrl: %o', imageUrl);\r\n\r\n // Si la referencia no esta almacenada intenta cargar la imagen de manera controlada.\r\n if (!cache[imageUrl]) {\r\n var deferred = $q.defer();\r\n var image = new Image();\r\n var $image = angular.element(image);\r\n $image.on('load', function imageServiceLoadOnLoad() {\r\n // Fix issue performance planograma.\r\n // $log.debug('imageService::load (image::load)');\r\n deferred.resolve();\r\n delete cache[imageUrl].img;\r\n }).on('error', function imageServiceLoadOnError() {\r\n // Fix issue performance planograma.\r\n // $log.debug('imageService::load (image::error)');\r\n deferred.reject();\r\n delete cache[imageUrl].img;\r\n });\r\n $image.prop('src', imageUrl);\r\n cache[imageUrl] = {\r\n promise: deferred.promise,\r\n img: $image\r\n };\r\n }\r\n\r\n return cache[imageUrl].promise;\r\n }\r\n\r\n return {\r\n load: loadFn\r\n }\r\n }\r\n})();","'use strinct';\r\n(function () {\r\n angular.module('prisma')\r\n .directive('ianHold', ['$log', '$parse', '$timeout', ianHoldDirective]);\r\n\r\n /**\r\n * Directiva ianHold al mantener un elemento seleccionado por X tiempo de dispara un evento.\r\n * @param {any} $log Servicio de log de angular.\r\n * @param {any} $parse Servicio de parse de angular.\r\n\t * @param {any} $timeout Servicio de timeout de angular.\t \r\n */\r\n function ianHoldDirective($log, $parse, $timeout) {\r\n // $log.debug('ianHoldDirective::ctor');\r\n var uid = 0;\r\n var duid = 0;\r\n\r\n function linkFn(scope, $element, $attr) {\r\n var localUId = ++duid;\r\n var methodName = 'ianHoldDirective::link';\r\n\r\n // $log.debug(methodName);\r\n $element.data('duid', localUId);\r\n\r\n var durationGetter;\r\n if ($attr.ianHoldDuration) {\r\n durationGetter = $parse($attr.ianHoldDuration);\r\n } else {\r\n durationGetter = function(){\r\n\t\t\t\t\tvar ret = 600;\r\n\t\t\t\t\treturn ret;\r\n\t\t\t\t};\r\n }\r\n \r\n var raiseOnHold;\r\n if ($attr.ianHold) {\r\n raiseOnHold = $parse($attr.ianHold);\r\n } else {\r\n raiseOnHold = angular.noop;\r\n }\r\n\r\n var enableGetter;\r\n if ($attr.ianHoldEnable) {\r\n enableGetter = $parse($attr.ianHoldEnable);\r\n\r\n $attr.$observe('ianHoldEnable',\r\n function () {\r\n var enable = enableGetter(scope);\r\n if (enable) {\r\n enableEvents(true);\r\n } else {\r\n enableEvents(false);\r\n }\r\n });\r\n } else {\r\n enableGetter = function () {\r\n return true;\r\n };\r\n }\r\n\t\t\t\r\n\t\t\tvar timer = null;\r\n\t\t\t\r\n\t\t\tfunction onGlobaEndHandler($event){\r\n\t\t\t\t$event.preventDefault();\r\n\t\t\t\t$event.stopPropagation();\r\n\t\t\t\t$timeout.cancel(timer);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tfunction onGlobaMousedownHandler($event){\r\n\t\t\t\tvar enable = enableGetter(scope);\r\n\t\t\t\tif(enable) {\r\n\t\t\t\t\tvar duration = durationGetter(scope);\r\n\t\t\t\t\t$element\r\n\t\t\t\t\t\t\t.on('mouseup mouseleave touchend', onGlobaEndHandler);\r\n\t\t\t\t\t$timeout.cancel(timer);\r\n\t\t\t\t\ttimer = $timeout(duration).then(function(){\r\n\t\t\t\t\t\traiseOnHold(scope, { $event : $event });\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n function enableEvents(enable) {\r\n $element\r\n .off('mousedown touchstart mouseup touchend mouseleave mousemove');\r\n if (enable) {\r\n $element\r\n .on('mousedown touchstart', onGlobaMousedownHandler);\r\n }\r\n }\r\n\r\n var enable = enableGetter(scope);\r\n enableEvents(enable);\r\n\r\n scope.$on('$destroy',\r\n function $destroy() {\r\n\t\t\t\t\tenableEvents(false);\r\n });\r\n }\r\n\r\n var ret = {\r\n restrict: 'A',\r\n link: linkFn\r\n };\r\n return ret;\r\n }\r\n})();","angular.module(\"prisma\")\r\n\r\n .controller(\"spacesLayoutsCtrl\", function ($scope, promotionsService, $timeout, authService, ngDialog, spaceService, adminService, $translate) {\r\n\r\n //Varibles\r\n var self = this;\r\n\r\n self.search = \"\";\r\n self.order = \"\";\r\n self.filter = {\r\n cluster: undefined,\r\n };\r\n self.textClusters = \"\";\r\n self.clusters = null;\r\n\r\n self.newLayout = generateNewLayout();\r\n\r\n //Funciones\r\n\r\n self.hasPermissionToEdit = authService.hasPermission('spaces_edit_layout');\r\n\r\n self.setFilterCluster = function (cluster) {\r\n self.filter.cluster = cluster.name;\r\n self.textClusters = cluster.name;\r\n }\r\n\r\n self.layoutToCloneCode = '';\r\n self.layoutToCloneName = '';\r\n\r\n self.openLayoutCloneDialog = function (layoutId, layoutCode, layoutName) {\r\n if (layoutId) {\r\n\r\n self.layoutToCloneCode = layoutCode;\r\n self.layoutToCloneName = layoutName;\r\n\r\n self.newLayout = generateNewLayout();\r\n self.newLayout.copyFromLayoutId = layoutId;\r\n\r\n ngDialog.open({\r\n template: 'layoutEditDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-500',\r\n scope: $scope\r\n });\r\n\r\n }\r\n }\r\n\r\n function generateNewLayout() {\r\n return {\r\n id: 0,\r\n name: '',\r\n code: '',\r\n clusterId: null,\r\n stores: [],\r\n copyFromLayoutId: null\r\n };\r\n }\r\n\r\n self.showEditLayoutModal = function (layout) {\r\n if (layout == null) {\r\n self.newLayout = generateNewLayout();\r\n }\r\n else {\r\n self.newLayout = angular.copy(layout);\r\n }\r\n\r\n ngDialog.open({\r\n template: 'layoutEditDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-500',\r\n scope: $scope\r\n });\r\n }\r\n\r\n function isValidFieldNum(field) {\r\n if (field == undefined || field == null || field == '')\r\n return false;\r\n\r\n return !isNaN(parseFloat(field));\r\n }\r\n\r\n function isValidField(field) {\r\n if (field == undefined || field == null || field == '')\r\n return false;\r\n\r\n return true;\r\n }\r\n\r\n self.saveNewEditLayout = function () {\r\n\r\n if (!(isValidField(self.newLayout.name) && isValidField(self.newLayout.code) && self.newLayout.stores.length > 0)) {\r\n swal(translations.ValidationSwalTitle, translations.ValidationSwalSubtitle, 'error');\r\n return;\r\n }\r\n var data = {\r\n id: self.newLayout.id,\r\n name: self.newLayout.name,\r\n code: self.newLayout.code,\r\n stores: self.newLayout.stores,\r\n copyFromLayoutId: self.newLayout.copyFromLayoutId\r\n }\r\n\r\n spaceService.layouts.saveLayout(data).then(function (res) {\r\n self.layouts = res;\r\n swal(translations.SavedLayoutSwal, translations.SavedLayoutSwalSubtitle, 'success');\r\n })\r\n\r\n ngDialog.close();\r\n }\r\n\r\n self.deleteLayout = function (indexLayout, idLayout) {\r\n self.layouts.splice(indexLayout, 1);\r\n spaceService.layouts.deleteLayout(idLayout).then(function (bool) {\r\n if (bool) {\r\n swal('Exitoso', 'Se borro correctamente', 'success');\r\n }\r\n else {\r\n swal('Error', 'No se borro correctamente', 'error');\r\n }\r\n }) \r\n }\r\n\r\n function loadData() {\r\n\r\n //LG: Por ahora comento los clusters ya que el Layout se va a asociar a un conjunto de Tiendas\r\n /*\r\n adminService.clusters.getClusters().then(function (res) {\r\n self.clusters = res;\r\n });\r\n */\r\n\r\n spaceService.layouts.getLayouts().then(function (result) {\r\n self.layouts = result;\r\n });\r\n\r\n spaceService.stores.getStores(false).then(function (stores) {\r\n self.stores = stores;\r\n });\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n $translate([\"ValidationSwalTitle\", \"ValidationSwalSubtitle\", \"SavedLayoutSwal\", \"SavedLayoutSwalSubtitle\"])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n loadData();\r\n }\r\n\r\n init();\r\n });","\r\nangular.module(\"prisma\")\r\n .controller(\"editSpacesLayoutCtrl\", function ($state, $stateParams, $scope, $timeout, $rootScope, $window, $translate, $compile, $uibModal, spaceService, adminService, ngDialog, authService) {\r\n\r\n\r\n var TICKET_TYPES = {\r\n PLANOGRAM: 1,\r\n ITEM: 2\r\n }\r\n var self = this;\r\n self.layout = { stores: [] }\r\n self.levels = [];\r\n self.currentFloor = 0;\r\n self.polygonContainer = null;\r\n self.selectedLevelItemId = null;\r\n self.showAttributes = false;\r\n self.selectedLevelItem = null;\r\n self.layout = null;\r\n self.categories = [];\r\n self.layoutCategories = [];\r\n\r\n self.ticketsCount = 3;\r\n self.selectedSvg = null;\r\n self.fileLayout = null;\r\n self.stateChange = false;\r\n self.hasPermissionToEdit = authService.hasPermission('spaces_edit_layout');\r\n self.translationUnits = \"\";\r\n self.translationSales = \"\";\r\n self.translationMargin = \"\";\r\n self.translationPrice = \"\";\r\n self.translationInventory = \"\";\r\n self.translationStockOut = \"\";\r\n self.translationLow = \"\";\r\n self.translationMedium = \"\";\r\n self.translationHeightF = \"\";\r\n self.showSubcategories = false; \r\n\r\n self.categoryColors = [\r\n '#2471A3',\r\n '#27AE60',\r\n '#F1C40F',\r\n '#D35400',\r\n '#7D3C98',\r\n '#82E0AA',\r\n '#F9E79F',\r\n '#3498DB',\r\n '#D2B4DE',\r\n '#E67E22',\r\n '#CD5C5C',\r\n '#D98880',\r\n '#27AE60',\r\n '#2471A3',\r\n '#AF7AC5',\r\n '#ABB2B9',\r\n '#E59866',\r\n '#FFA07A',\r\n '#27AE60',\r\n '#D4AC0D',\r\n '#F0B27A',\r\n '#CACFD2',\r\n '#85C1E9',\r\n '#D7BDE2',\r\n '#008080',\r\n '#e6beff',\r\n '#aa6e28',\r\n '#fffac8',\r\n '#800000',\r\n '#aaffc3',\r\n '#808000',\r\n '#ffd8b1',\r\n '#000080',\r\n '#e6194b',\r\n '#3cb44b',\r\n '#ffe119',\r\n '#0082c8',\r\n '#f58231',\r\n '#911eb4',\r\n '#46f0f0',\r\n '#f032e6',\r\n '#d2f53c',\r\n '#808080',\r\n '#ffcc00',\r\n '#ffccff',\r\n '#fabebe',\r\n ];\r\n\r\n self.zoom = 800;\r\n self.changeZoom = function (bool) {\r\n bool ? self.zoom += 50 : self.zoom -= 50;\r\n $timeout(function () {\r\n onSizeChanged();\r\n });\r\n \r\n }\r\n\r\n self.getBlockCategoryColorStyle = function (color) {\r\n return {\r\n 'background-color': color,\r\n //'width': '50px',\r\n };\r\n };\r\n\r\n self.selectedStore = null;\r\n $scope.$watch('ct.selectedStore', function (newVal, oldVal) {\r\n if (newVal != oldVal && self.sales != null && self.sales.length > 0) {\r\n calculateSales();\r\n\r\n if (self.heatMapVariable)\r\n self.setHeatMap(self.heatMapVariable, self.heatMapVariableVal, false);\r\n\r\n }\r\n });\r\n\r\n $scope.$on('$stateChangeStart', function (event) {\r\n //console.log('$stateChangeStart', event)\r\n if (self.stateChange) {\r\n var answer = confirm(translations.AlertWillLoseChanges)\r\n if (!answer) {\r\n event.preventDefault();\r\n }\r\n }\r\n });\r\n\r\n function resetSales() {\r\n\r\n //limpio listado de la izquierda\r\n self.spacePlanograms.forEach(planogram => planogram && clearSalesInfo(planogram));\r\n\r\n //limpio los planogramas del piso\r\n self.levels.forEach(level => {\r\n clearSalesInfo(level);\r\n level.floorPlanograms.forEach(planogram => {\r\n clearSalesInfo(planogram);\r\n });\r\n });\r\n\r\n //limpio las categorias\r\n self.categories.forEach(category => clearSalesInfo(category));\r\n }\r\n\r\n function clearSalesInfo(obj) {\r\n obj.sales = 0;\r\n obj.margin = 0;\r\n obj.units = 0;\r\n obj.skus = 0;\r\n obj.price = 0;\r\n obj.gmroi = 0;\r\n obj.gmros = 0;\r\n obj.daysOutOfStock = 0;\r\n obj.stockUnits = 0;\r\n obj.stock = 0;\r\n obj.floorSpace = 0;\r\n }\r\n\r\n function aggregateSalesInfo(obj, filteredSales) {\r\n\r\n filteredSales.forEach(sale => {\r\n obj.sales += sale.sales;\r\n obj.margin += sale.margin;\r\n obj.units += sale.units;\r\n obj.skus += sale.skus;\r\n obj.price += sale.price;\r\n obj.daysOutOfStock += sale.daysOutOfStock;\r\n obj.stockUnits += sale.inventoryUnits || sale.stockUnits;\r\n obj.stock += sale.inventory || sale.stock;\r\n obj.floorSpace += sale.floorSpace;\r\n });\r\n }\r\n\r\n function calcAverageByStore(obj) {\r\n\r\n //calculo promedio por tienda si no hay tienda seleccionada\r\n if (!self.selectedStore) {\r\n obj.sales /= self.layout.stores.length;\r\n obj.margin /= self.layout.stores.length;\r\n obj.units /= self.layout.stores.length;\r\n obj.skus /= self.layout.stores.length;\r\n obj.price /= self.layout.stores.length;\r\n obj.gmroi /= self.layout.stores.length;\r\n obj.daysOutOfStock /= self.layout.stores.length;\r\n obj.stockUnits /= self.layout.stores.length;\r\n obj.stock /= self.layout.stores.length;\r\n obj.floorSpace /= self.layout.stores.length;\r\n }\r\n }\r\n\r\n function calcGmrosAndGmroi(obj) {\r\n\r\n if (obj.stock)\r\n obj.gmroi = obj.margin / obj.stock;\r\n\r\n if (obj.floorSpace)\r\n obj.gmros = obj.margin / obj.floorSpace;\r\n }\r\n\r\n function calculateSales() {\r\n\r\n resetSales();\r\n\r\n //filtro la venta bajo analisis según las tiendas elegidas. \r\n // si no se elgió ninguna tienda se promedian todas las tiendas del layout.\r\n var filteredSales = self.sales.filter(sale => !self.selectedStore || sale.storeId == self.selectedStore.id);\r\n\r\n //recorro los planogramas del listado de la izquierda\r\n self.spacePlanograms.forEach(planogram => {\r\n if (planogram) {\r\n //sumarizo venta del planograma\r\n aggregateSalesInfo(planogram, filteredSales.filter(sale => sale.spacePlanogramId == planogram.id));\r\n\r\n //calculo promedios del planograma\r\n calcAverageByStore(planogram);\r\n\r\n //calculo gmros y gmroi del plangrama\r\n calcGmrosAndGmroi(planogram);\r\n }\r\n });\r\n\r\n //piso seleccionado del plano\r\n var level = self.levels[self.currentFloor];\r\n if (level) {\r\n //recorro los planogramas del piso\r\n level.floorPlanograms.forEach(planogram => {\r\n\r\n //sumarizo venta del planograma\r\n aggregateSalesInfo(planogram, filteredSales.filter(sale => sale.spacePlanogramId == planogram.spacePlanogramId));\r\n\r\n //calculo promedios del planograma\r\n calcAverageByStore(planogram);\r\n\r\n //calculo gmros y gmroi del plangrama\r\n calcGmrosAndGmroi(planogram);\r\n\r\n });\r\n\r\n //sumarizo venta para del piso\r\n //no hace falta calcular promedios porque se construye desde la data de planogramas que ya esta promediada x tienda\r\n aggregateSalesInfo(level, level.floorPlanograms);\r\n\r\n //calculo gmros y gmroi del piso\r\n calcGmrosAndGmroi(level);\r\n\r\n\r\n //agrega la info a nivel categorias respetando filtro de tienda.\r\n var layoutCategoryIds = level.floorPlanograms.map(p => p.categoryId);\r\n self.layoutCategories = self.categories.filter(cat => layoutCategoryIds.indexOf(cat.id) != -1);\r\n\r\n self.layoutCategories.forEach(category => {\r\n\r\n //sumarizo totales de la categoria desde los planogramas del piso\r\n //no hace falta calcular promedios porque se construye desde la data de planogramas que ya esta promediada x tienda\r\n aggregateSalesInfo(category, level.floorPlanograms.filter(planogram => planogram.categoryId == category.id));\r\n\r\n //calculo gmros y gmroi del plangrama\r\n calcGmrosAndGmroi(category);\r\n\r\n //Una vez que tengo la info sumarizada calculo los shares y el sub/sobre espaciado.\r\n category.salesShare = category.sales / level.sales;\r\n category.spaceShare = category.floorSpace / level.floorSpace;\r\n category.spaced = (category.spaceShare / category.salesShare) - 1;\r\n category.isOverSpaced = category.spaced >= 0 ? true : false;\r\n category.barWidth = Math.abs(category.spaced) > 1 ? 1 : Math.abs(category.spaced); //El maximo ancho de la barra es 100%\r\n });\r\n }\r\n }\r\n\r\n function calculateSales_Deprecated() {\r\n\r\n resetSales();\r\n\r\n //filtro la venta bajo analisis según las tiendas elegidas. \r\n // si no se elgió ninguna tienda se promedian todas las tiendas del layout.\r\n var filteredSales = self.sales.filter(sale => !self.selectedStore || sale.storeId == self.selectedStore.id)\r\n\r\n\r\n self.levels.forEach(level => {\r\n\r\n //calculo totales para el piso\r\n filteredSales.forEach(sale => {\r\n level.sales += sale.sales;\r\n level.margin += sale.margin;\r\n level.units += sale.units;\r\n level.skus += sale.skus;\r\n level.price += sale.price;\r\n level.gmroi += sale.gmroi;\r\n level.daysOutOfStock += sale.daysOutOfStock;\r\n level.stockUnits += sale.inventoryUnits;\r\n level.stock += sale.inventory;\r\n level.floorSpace += sale.floorSpace;\r\n });\r\n\r\n\r\n level.gmros = level.margin / level.width * level.depth / 10000;\r\n\r\n //hago el promedio por tienda si no hay tienda seleccionada\r\n if (!self.selectedStore) {\r\n level.sales /= self.layout.stores.length;\r\n level.margin /= self.layout.stores.length;\r\n level.units /= self.layout.stores.length;\r\n level.skus /= self.layout.stores.length;\r\n level.price /= self.layout.stores.length;\r\n level.gmroi /= self.layout.stores.length;\r\n level.daysOutOfStock /= self.layout.stores.length;\r\n level.stockUnits /= self.layout.stores.length;\r\n level.stock /= self.layout.stores.length;\r\n level.floorSpace /= self.layout.stores.length;\r\n }\r\n\r\n //agrego la info a nivel planograma respetando filtro de tienda.\r\n level.floorPlanograms.forEach(planogram => {\r\n\r\n filteredSales.forEach(sale => {\r\n if (sale.spacePlanogramId == planogram.spacePlanogramId) {\r\n planogram.sales += sale.sales;\r\n planogram.margin += sale.margin;\r\n planogram.units += sale.units;\r\n planogram.skus += sale.skus;\r\n planogram.price += sale.price;\r\n planogram.gmroi += sale.gmroi;\r\n planogram.daysOutOfStock += sale.daysOutOfStock;\r\n planogram.stockUnits += sale.inventoryUnits;\r\n planogram.stock += sale.inventory;\r\n planogram.floorSpace += sale.floorSpace;\r\n }\r\n });\r\n\r\n //hago el promedio por tienda si no hay tienda seleccionada\r\n if (!self.selectedStore) {\r\n planogram.sales /= self.layout.stores.length;\r\n planogram.margin /= self.layout.stores.length;\r\n planogram.units /= self.layout.stores.length;\r\n planogram.skus /= self.layout.stores.length;\r\n planogram.price /= self.layout.stores.length;\r\n planogram.gmroi /= self.layout.stores.length;\r\n planogram.daysOutOfStock /= self.layout.stores.length;\r\n planogram.stockUnits /= self.layout.stores.length;\r\n planogram.stock /= self.layout.stores.length;\r\n planogram.floorSpace /= self.layout.stores.length;\r\n }\r\n\r\n //Una vez que tengo el margen final calculo el GMROS del planograma\r\n planogram.gmros = planogram.margin / planogram.width * planogram.depth / 10000;\r\n\r\n });\r\n\r\n });\r\n\r\n //agrega la info a nivel categorias respetando filtro de tienda.\r\n var layoutCategoryIds = self.levels[self.currentFloor].floorPlanograms.map(p => p.categoryId);\r\n self.layoutCategories = self.categories.filter(cat => layoutCategoryIds.indexOf(cat.id) != -1);\r\n\r\n self.layoutCategories.forEach(category => {\r\n\r\n //En cada categoria acumulo los valores de la tienda seleccionada o de todas las tiendas si no se eligi� una.\r\n self.levels[self.currentFloor].floorPlanograms.forEach(planogram => {\r\n if (planogram.categoryId == category.id) {\r\n category.sales += planogram.sales;\r\n category.margin += planogram.margin;\r\n category.units += planogram.units;\r\n category.skus += planogram.skus;\r\n category.price += planogram.price;\r\n category.gmroi += planogram.gmroi;\r\n category.daysOutOfStock += planogram.daysOutOfStock;\r\n category.stockUnits += planogram.inventoryUnits;\r\n category.stock += planogram.inventory;\r\n category.floorSpace += planogram.floorSpace;\r\n }\r\n });\r\n\r\n //hago el promedio por tienda si no hay tienda seleccionada\r\n if (!self.selectedStore) {\r\n category.sales /= self.layout.stores.length;\r\n category.margin /= self.layout.stores.length;\r\n category.units /= self.layout.stores.length;\r\n category.skus /= self.layout.stores.length;\r\n category.price /= self.layout.stores.length;\r\n category.gmroi /= self.layout.stores.length;\r\n category.daysOutOfStock /= self.layout.stores.length;\r\n category.stockUnits /= self.layout.stores.length;\r\n category.stock /= self.layout.stores.length;\r\n category.floorSpace /= self.layout.stores.length;\r\n }\r\n });\r\n\r\n //var salesTotal = self.layoutCategories.reduce((acum, cat) => acum + cat.sales, 0);\r\n //var spaceTotal = self.layoutCategories.reduce((acum, cat) => acum + cat.floorSpace, 0);\r\n var salesTotal = self.levels[self.currentFloor].sales;\r\n var spaceTotal = self.levels[self.currentFloor].floorSpace;\r\n\r\n //Una vez que tengo la info sumarizada calculo los shares y el sub/sobre espaciado.\r\n self.layoutCategories.forEach(category => {\r\n\r\n category.salesShare = category.sales / salesTotal;\r\n category.spaceShare = category.floorSpace / spaceTotal;\r\n category.spaced = category.spaceShare / category.salesShare;\r\n category.isOverSpaced = category.spaced <= 1 ? false : true;\r\n category.barWidth = category.spaced > 2 ? 1 : Math.abs(category.spaced - 1); //El maximo ancho de la barra es 100%\r\n });\r\n }\r\n\r\n function getTotalSpace(sales) {\r\n\r\n var sortedSales = sales.sort((a, b) => a.spacePlanogramId - b.spacePlanogramId);\r\n var planogramId = 0;\r\n var spaceTotal = 0;\r\n\r\n sortedSales.forEach(sale => {\r\n if (sale.spacePlanogramId != planogramId) {\r\n planogramId = sale.spacePlanogramId;\r\n spaceTotal += sale.floorSpace\r\n }\r\n });\r\n\r\n return spaceTotal;\r\n }\r\n\r\n self.isEdit = function () {\r\n return $state.current.url.contains('edit');\r\n }\r\n\r\n self.isNew = self.isEdit() && (!$stateParams.layoutId || $stateParams.layoutId == 0);\r\n\r\n self.selectSpaceObject = function (spaceObject) {\r\n self.selectedSpaceObject = spaceObject;\r\n }\r\n\r\n self.goToTickets = function () {\r\n $state.go('spaces.tickets', { layoutObjectId: self.selectedLevelItem.id, planogramLevelItemId: 0 });\r\n\r\n }\r\n\r\n self.goToViewMode = function () {\r\n $state.go('spaces.viewLayout', { layoutId: $stateParams.layoutId });\r\n }\r\n\r\n self.goToEditMode = function () {\r\n $state.go('spaces.editLayout', { layoutId: $stateParams.layoutId });\r\n }\r\n\r\n self.setShowPlanogramsPanel = function () {\r\n self.showPlanogramsPanel = !self.showPlanogramsPanel;\r\n\r\n $timeout(function () {\r\n onSizeChanged();\r\n }, 5);\r\n\r\n self.showPlanogramsPanel ? self.buttonTextPlanogramsPanel = translations.HidePlanograms : self.buttonTextPlanogramsPanel = translations.ShowPlanograms;\r\n\r\n }\r\n\r\n self.setShowInformationPanel = function () {\r\n self.showInformationPanel = !self.showInformationPanel;\r\n $timeout(function () {\r\n onSizeChanged();\r\n }, 5);\r\n\r\n self.showInformationPanel ? self.buttonTextInformationPanel = translations.HideInformation : self.buttonTextInformationPanel = translations.ShowInformation\r\n }\r\n\r\n\r\n self.calcLayoutSize = function (level) {\r\n\r\n //angular.forEach(self.levels, function (level) {\r\n if (!level)\r\n return;\r\n\r\n var widthPx = level.levelDiv.clientWidth;\r\n\r\n var depthPx = level.depth * widthPx / level.width;\r\n\r\n level.widthPx = widthPx;\r\n level.depthPx = depthPx;\r\n\r\n level.levelDiv.style.height = depthPx + 'px';\r\n\r\n if (level.polygonContainer)\r\n drawLevelObject(level.polygonContainer[0], level);\r\n //});\r\n }\r\n\r\n self.calcPlanogramSize = function (planogram) {\r\n planogram.widthPx = planogram.width * self.levels[self.currentFloor].widthPx / self.levels[self.currentFloor].width;\r\n planogram.depthPx = planogram.depth * self.levels[self.currentFloor].depthPx / self.levels[self.currentFloor].depth;\r\n }\r\n\r\n self.storeClicked = function (store) {\r\n //console.log('storeclicked', store);\r\n self.selectedStore = store || null;\r\n }\r\n\r\n function percentagesToCM(percs) {\r\n var r = [];\r\n _.each(percs, function (perc) {\r\n r.push([percentageToCM(perc[0], self.levels[self.currentFloor].width), percentageToCM(perc[1], self.levels[self.currentFloor].depth)]);\r\n });\r\n return r;\r\n }\r\n\r\n function percentageToCM(perc, maxCM) {\r\n return perc * maxCM / 100;\r\n }\r\n\r\n self.showLabels = false;\r\n\r\n //self.newLayout = function () {\r\n // $state.go('spaces.editLayout', { layoutId: 0 }, { reload: true });\r\n //}\r\n\r\n self.addLevel = function () {\r\n\r\n if (self.levels.length > 0 && self.levels[self.levels.length - 1].polygonContainer[0].points == undefined) {\r\n\r\n swal(translations.SwalEmptyFloors, translations.SwalEmptyFloorsSubtitle, 'error');\r\n return;\r\n }\r\n\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n component: 'addLevelComponent',\r\n windowClass: 'app-modal-window',\r\n resolve: {\r\n modalInfo: function () {\r\n return {\r\n dataSource: 'new',\r\n isEdit: false\r\n };\r\n }\r\n }\r\n });\r\n\r\n //console.log('modalInstance', modalInstance, self.stateChange);\r\n //return;\r\n modalInstance.result.then(function (level) {\r\n\r\n self.stateChange = true;\r\n\r\n self.levels.push({\r\n id: 0,\r\n width: level.width,\r\n depth: level.depth,\r\n floorPlanograms: [],\r\n order: self.levels.length + 1,\r\n sellingAreaSpace: level.sellingAreaSpace,\r\n totalSpace: level.totalSpace,\r\n photoUri: level.photoUri,\r\n get squareMeters() { return this.width * this.depth / 10000 },\r\n get linearFeets() {\r\n var total = 0;\r\n angular.forEach(this.floorPlanograms, function (comp) {\r\n total += comp.depth * comp.width;\r\n });\r\n return (total / 100).toFixed(0);\r\n },\r\n });\r\n\r\n //console.log('level devuelto', level, self.levels);\r\n\r\n //})\r\n self.currentFloor = self.levels[self.levels.length - 1].order - 1;\r\n\r\n\r\n $timeout(function () {\r\n //var i = self.levels.length - 1;\r\n //var canvas = SVG('newLayoutCanvas' + self.levels[i].order).size('10000px', '10000px');\r\n\r\n //self.levels[i].canvas = canvas;\r\n //self.levels[i].levelDiv = document.getElementById('newLayoutCanvas' + self.levels[i].order),\r\n\r\n\r\n // self.calcLayoutSize(self.levels[i]);\r\n\r\n //canvas.image(self.levels[i].photoUri).loaded(function (loader) {\r\n // var imgProportion = loader.height / loader.width\r\n\r\n // this.size(self.levels[i].widthPx, self.levels[i].widthPx * imgProportion)\r\n //})\r\n\r\n //self.levels[i].pointsPx = getDivPoints(self.levels[i].levelDiv);\r\n //self.levels[i].points = [[0, 0], [100, 0], [100, 100], [0, 100]];\r\n\r\n //self.levels[i].polygonContainer = [{\r\n // svgReference: canvas.polygon(self.levels[i].pointsPx.join(' ')).fill('transparent').stroke({ width: 1 }),\r\n // fill: 'transparent',\r\n // points: self.levels[i].points,\r\n // pointsPx: self.levels[i].pointsPx, // percentageToPixels(self.levels[i].points),\r\n // draggable: false,\r\n // selectable: false,\r\n // stroke: { width: 1, color: 'black' }\r\n //}]\r\n\r\n\r\n //self.levels[i].levelDiv.style.overflow = 'hidden';\r\n\r\n ////self.changeLevel(self.levels[i]);\r\n\r\n\r\n\r\n ////$timeout(self.calcLayoutSize, 500);\r\n var idx = self.levels.length - 1;\r\n var level = self.levels[idx];\r\n self.createLevelCanvas(level, true);\r\n });\r\n\r\n\r\n }, function () {\r\n console.log('dismissed');\r\n });\r\n\r\n\r\n //$scope.gridOptions.data = result;\r\n\r\n //return;\r\n\r\n\r\n\r\n //}\r\n\r\n }\r\n\r\n self.editFloor = function () {\r\n\r\n if (self.currentFloor != null\r\n && self.currentFloor >= 0\r\n && self.levels\r\n && self.levels.length > self.currentFloor\r\n && self.levels[self.currentFloor]) {\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n component: 'addLevelComponent',\r\n windowClass: 'app-modal-window',\r\n resolve: {\r\n modalInfo: function () {\r\n return {\r\n dataSource: 'pepe',\r\n isEdit: true,\r\n floor: self.levels[self.currentFloor]\r\n };\r\n }\r\n }\r\n });\r\n }\r\n else {\r\n swal('Error', 'No se ha seleccionado un piso', 'error');\r\n }\r\n }\r\n\r\n self.changeLevel = function (level) {\r\n self.currentFloor = level.order - 1;\r\n\r\n $timeout(function () {\r\n onSizeChanged();\r\n //self.toggleLabels(true);\r\n self.highlightByType(self.highlightByTypeDisplayName);\r\n //if (!self.isEdit() && self.sales != null && self.sales.length > 0) {\r\n // calculateSales();\r\n //}\r\n //self.calcLayoutSize(level);\r\n })\r\n }\r\n\r\n self.toggleLabels = function (show) {\r\n console.log('toggleLavels')\r\n var level = self.levels[self.currentFloor];\r\n angular.forEach(level.floorPlanograms, function (c) {\r\n if (!show) {\r\n if (c.text != undefined) {\r\n c.text.clear();\r\n c.text = undefined;\r\n }\r\n return;\r\n\r\n } else if (c.text != undefined)\r\n return;\r\n //Saco el punto medio de entre todos los puntos que conforman al poligono\r\n var middlePoint = getMiddlePoint(c.pointsPx);\r\n var temp = getWidthHeight(c.pointsPx);\r\n var nodeWidth = temp[0];\r\n var nodeHeight = temp[1];\r\n\r\n //Creo el texto\r\n var text = level.canvas.text(c.name).font({\r\n size: '12px',\r\n fill: '#6A6D6F',\r\n weight: 'bold'\r\n });;\r\n //console.log(c.name, text);\r\n\r\n //Me fijo cuanto width y height ocupa el texto creado para luego acomodarlo al moverlo\r\n var rect = text.node.getBoundingClientRect();\r\n\r\n //Tengo que acomodarlo, porque si lo ubico directamente en el middlepoint, la primer leta arranca en el medio del poligono\r\n text.move(middlePoint[0] - ((rect.width) / 2), middlePoint[1] - (rect.height / 2))\r\n\r\n if (c.rotation) {\r\n text.transform({ rotation: c.rotation, relative: true });\r\n }\r\n // if (nodeWidth < nodeHeight) {\r\n // text.transform({ rotation: 90, relative: true });\r\n //}\r\n c.text = text;\r\n });\r\n\r\n //console.log(self.radioOption);\r\n if (show)\r\n self.radioOption = 'show'\r\n else\r\n self.radioOption = 'hide'\r\n\r\n self.showLabels = show;\r\n\r\n }\r\n\r\n self.levelObjectClick = function (e) {\r\n //console.log('self.levelIbjectClick - e', e, self.selectedLevelItem);\r\n //already selected - do deselect\r\n if (self.selectedLevelItem && ((e.id !== 0 && self.selectedLevelItem.id === e.id) || (self.selectedLevelItem.isNew && self.selectedLevelItem.tempId === e.tempId))) {\r\n //if (!self.isEdit()) {\r\n // if (e.isPlanogram) {\r\n\r\n self.selectedLevelItem = null;\r\n self.selectedPlanogram = null;\r\n\r\n angular.forEach(self.levels[self.currentFloor].floorPlanograms,\r\n function (c) {\r\n //console.log('object', c)\r\n c.svgReference.opacity(1);\r\n c.attr = {\r\n 'stroke-dasharray': '',\r\n 'stroke-width': 1,\r\n };\r\n c.svgReference.attr(c.attr);\r\n });\r\n\r\n // }\r\n //}\r\n }\r\n else {\r\n //console.log('false');\r\n //guardo el item seleccionado\r\n self.selectedLevelItem = e;\r\n\r\n //si estoy en view mode\r\n //if (!self.isEdit()) {\r\n //if (e.isPlanogram) {\r\n self.selectPlanogram(e);\r\n //}\r\n //}\r\n\r\n ////resaltar seleccionado\r\n angular.forEach(self.levels[self.currentFloor].floorPlanograms,\r\n function (c) {\r\n c.attr = {\r\n 'stroke-dasharray': '',\r\n 'stroke-width': 1\r\n };\r\n c.svgReference.attr(c.attr);\r\n });\r\n e.attr = {\r\n 'stroke-dasharray': '10,5',\r\n 'stroke-width': 3,\r\n };\r\n e.svgReference.attr(e.attr);\r\n }\r\n\r\n $scope.$apply();\r\n //self.toggleLabels(false)\r\n }\r\n\r\n self.rotateLayoutItem = function (grades) {\r\n\r\n if (self.selectedLevelItem) {\r\n self.selectedLevelItem.rotation = self.selectedLevelItem.rotation ? 0 : grades;\r\n if (self.selectedLevelItem.rotation === 0 && angular.isDefined(self.selectedLevelItem.oldRotation)) {\r\n delete self.selectedLevelItem.oldRotation;\r\n }\r\n\r\n self.selectedLevelItem.svgReference.transform({ rotation: self.selectedLevelItem.rotation });\r\n\r\n // TODO: Forzar redibujo.\r\n var $el = angular.element(self.selectedLevelItem.svgReference.node);\r\n var element = self.selectedLevelItem.svgReference.node;\r\n if ($el.is('g:has(polygon)')) {\r\n element = $el.find('polygon').get(0);\r\n }\r\n\r\n c.pointsPx = getDivPoints(element);\r\n c.points = pixelsToPercentage(c.pointsPx, level);\r\n c.move = undefined;\r\n c.rotation = 0;\r\n c.svgReference.remove();\r\n drawLevelObject(c, level);\r\n\r\n //self.selectedLevelItem.svgReference.transform({ rotation: grades, relative: true });\r\n //self.selectedLevelItem.rotation = self.selectedLevelItem.rotation ? (self.selectedLevelItem.rotation + grades) % 360 : grades;\r\n //self.selectedLevelItem.svgReference.transform({ rotation: self.selectedLevelItem.rotation, relative: false });\r\n //console.log('self.selectedLevelItem', self.selectedLevelItem);\r\n //console.log('floorPlanograms', self.levels[self.currentFloor].floorPlanograms);\r\n //if (self.selectedLevelItem.text) {\r\n // self.selectedLevelItem.text.transform({ rotation: grades, relative: true });\r\n //}\r\n }\r\n }\r\n\r\n self.deleteLayoutItem = function () {\r\n if (self.selectedLevelItem) {\r\n\r\n swal({\r\n title: translations.SureDeletePlanogramSwal + ' ' + self.selectedLevelItem.name + '?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#DD6B55\",\r\n confirmButtonText: translations.RemoveSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: true,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n var index = self.levels[self.currentFloor].floorPlanograms.indexOf(self.selectedLevelItem);\r\n self.levels[self.currentFloor].floorPlanograms.splice(index, 1);\r\n\r\n self.selectedLevelItem.svgReference.remove();\r\n if (self.selectedLevelItem.text) {\r\n self.selectedLevelItem.text.remove();\r\n self.selectedLevelItem.text = undefined;\r\n }\r\n\r\n self.selectedLevelItem = null;\r\n\r\n calculateSales();\r\n }\r\n });\r\n }\r\n\r\n }\r\n\r\n self.resizeLayoutItem = function () {\r\n\r\n }\r\n\r\n self.getComponentColor = function (categoryId) {\r\n var color = '';\r\n angular.forEach(self.categories, function (category) {\r\n if (categoryId === category.id && color == '') {\r\n color = category.color;\r\n }\r\n });\r\n return color;\r\n }\r\n\r\n self.getComponentImage = function (component) {\r\n if (!component.icon)\r\n return '';\r\n return 'url(' + component.icon + ')';\r\n }\r\n\r\n self.highlightByType = function (displayName) {\r\n //console.log('pepe');\r\n self.highlightByTypeDisplayName = displayName;\r\n\r\n //if (displayName != undefined && isPlanogram != undefined) {\r\n //self.highlightByTypeValue = isPlanogram;\r\n //self.highlightByTypeDisplayName = displayName;\r\n //}\r\n\r\n angular.forEach(self.levels[self.currentFloor].floorPlanograms, function (levelObject) {\r\n levelObject.svgReference.opacity(0.6);\r\n });\r\n }\r\n\r\n self.viewPlanogram = function () {\r\n if (!self.hasPermissionToEdit) {\r\n $state.go('spaces.viewPlanogram', { planogramId: self.selectedLevelItem.spacePlanogramId });\r\n }\r\n else {\r\n $state.go('spaces.editPlanogram', { planogramId: self.selectedLevelItem.spacePlanogramId });\r\n }\r\n }\r\n\r\n self.setHeatMap = function (displayName, variable, reverse) {\r\n\r\n if (!self.levels[self.currentFloor])\r\n return;\r\n\r\n self.heatMapReversed = reverse === true;\r\n\r\n self.heatMapVariable = displayName;\r\n self.heatMapVariableVal = variable;\r\n\r\n //reset opacity\r\n //$('.dropped').css('opacity', 0.7);\r\n\r\n //reset selected planogram\r\n self.selectedPlanogram = null;\r\n\r\n\r\n\r\n var min = 9999999999999999;\r\n var max = 0;\r\n angular.forEach(self.levels[self.currentFloor].floorPlanograms, function (c) {\r\n c.svgReference.opacity(0.7);\r\n //if (!c[variable]) return;\r\n if (!c[variable])\r\n c[variable] = 0;\r\n //console.log('variable', c[variable]);\r\n if (c[variable] > max)\r\n max = c[variable];\r\n if (c[variable] < min)\r\n min = c[variable];\r\n });\r\n\r\n var diff = max - min;\r\n var low = min + (diff * 0.1); //20%\r\n var mid = max - (diff * 0.4); //80%\r\n\r\n angular.forEach(self.levels[self.currentFloor].floorPlanograms, function (component) {\r\n\r\n if (variable == '') {\r\n console.log(component.categoryId);\r\n component.fill = self.getComponentColor(component.categoryId);\r\n }\r\n else {\r\n if (!reverse) {\r\n\r\n if (component[variable] <= low) {\r\n component.fill = '#ED5666';\r\n }\r\n else if (component[variable] <= mid) {\r\n component.fill = '#F8AC59';\r\n }\r\n else {\r\n component.fill = '#1AB394';\r\n }\r\n } else {\r\n if (component[variable] <= low) {\r\n component.fill = '#1AB394';\r\n }\r\n else if (component[variable] <= mid) {\r\n component.fill = '#F8AC59';\r\n }\r\n else {\r\n component.fill = '#ED5666';\r\n }\r\n }\r\n }\r\n drawLevelObject(component, self.levels[self.currentFloor]);\r\n\r\n });\r\n //self.toggleLabels(true);\r\n onSizeChanged();\r\n\r\n }\r\n\r\n self.getRanking = function () {\r\n\r\n if (self.levels[self.currentFloor]) {\r\n\r\n var planograms = self.levels[self.currentFloor].floorPlanograms;\r\n\r\n planograms.sort((a, b) => b[self.heatMapVariableVal] - a[self.heatMapVariableVal]);\r\n\r\n return self.heatMapReversed ? planograms.reverse() : planograms;\r\n }\r\n \r\n\r\n //var rv = [];\r\n\r\n //if (self.heatMapVariable) {\r\n // self.rankCount = 0;\r\n // angular.forEach(self.levels, function (level) {\r\n // rv = rv.concat(_.sortBy(_.filter(level.floorPlanograms, function (o) {\r\n // return (o);\r\n // }), self.heatMapVariableVal));\r\n // });\r\n //}\r\n //if (self.heatMapVariable === self.translationStockOut)\r\n // return rv;\r\n\r\n //return rv.reverse();\r\n }\r\n\r\n self.getRankCount = function () {\r\n return ++self.rankCount;\r\n }\r\n\r\n self.selectPlanogram = function (planogram) {\r\n //console.log('selectPlanogram Function', planogram)\r\n angular.forEach(self.levels, function (level) {\r\n angular.forEach(level.floorPlanograms, function (levelObject) {\r\n if (levelObject.id == planogram.id) {\r\n if (level.order != self.currentFloor + 1)\r\n self.changeLevel(level);\r\n\r\n $timeout(function () {\r\n angular.forEach(level.floorPlanograms, function (c) {\r\n c.svgReference.opacity(0.6);\r\n });\r\n\r\n planogram.svgReference.opacity(0.9);\r\n\r\n self.selectedPlanogram = planogram;\r\n\r\n renderPieCharts(planogram);\r\n })\r\n }\r\n });\r\n })\r\n\r\n\r\n }\r\n\r\n self.countPlanograms = function () {\r\n if (self.levels.length > 0)\r\n return _.filter(self.levels[self.currentFloor].floorPlanograms, { isPlanogram: true }).length;\r\n return 0;\r\n }\r\n\r\n self.getLayoutTotal = function (variable) {\r\n if (self.levels.length == 0)\r\n return 0;\r\n var rv = 0;\r\n angular.forEach(self.levels, function (level) {\r\n\r\n angular.forEach(level.floorPlanograms, function (planogram) {\r\n if (planogram[variable])\r\n rv += planogram[variable];\r\n })\r\n })\r\n\r\n return rv.toFixed(2);\r\n }\r\n\r\n self.showAssignStoresDialog = function () {\r\n\r\n self.searchStore = '';\r\n\r\n ngDialog.open({\r\n template: 'assignStoresDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.layoutStoresHaveChanged = false; //Si cambiaron las tiendas vuelvo a cargar los planogramas de la columna de la izquierda\r\n\r\n self.assignStoresToLayout = function () {\r\n var prevStores = self.layout.stores;\r\n\r\n self.layout.stores = [];\r\n angular.forEach(self.stores, function (store) {\r\n if (store.selected)\r\n self.layout.stores.push({ id: store.id, name: store.name });\r\n });\r\n\r\n //Veo si cambiaron las stores\r\n if (prevStores.length != self.layout.stores.length)\r\n self.layoutStoresHaveChanged = true;\r\n\r\n for (var i = 0; i < prevStores.length; i++) {\r\n if (!self.layoutStoresHaveChanged) {\r\n if (prevStores[i].id != self.layout.stores[i].id) {\r\n self.layoutStoresHaveChanged = true;\r\n }\r\n }\r\n }\r\n\r\n self.stateChange = true;\r\n //swal('Tiendas Asignadas', 'Se asignaron correctamente las tiendas al layout', 'success');\r\n ngDialog.close();\r\n\r\n }\r\n\r\n self.showNewTicketModal = function () {\r\n\r\n self.newTicket = {};\r\n\r\n\r\n ngDialog.open({\r\n template: 'ticketNewDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-500',\r\n scope: $scope\r\n });\r\n }\r\n\r\n function isValidField(field) {\r\n if (field == undefined || field == null || field == '')\r\n return false;\r\n\r\n return true;\r\n }\r\n\r\n self.saveNewTicket = function () {\r\n\r\n if (!isValidField(self.newTicket.description) && !isValidField(self.newTicket.priority)) {\r\n swal(translations.ValidationSwalTitle, translations.ValidationSwalSubtitle, 'error');\r\n return;\r\n }\r\n\r\n var dataTicket = {\r\n ticketTypeId: self.newTicket.title.id,\r\n priority: self.newTicket.priority.id,\r\n description: self.newTicket.description,\r\n layoutObjectId: self.selectedLevelItem.id\r\n }\r\n\r\n spaceService.tickets.saveTicket(dataTicket).then(function (res) {\r\n $timeout(function () {\r\n self.selectedLevelItem.ticketCount++;\r\n });\r\n ngDialog.close();\r\n swal(translations.SavedTicketSwal, translations.SavedTicketSwalSubtitle, 'success');\r\n\r\n });\r\n }\r\n\r\n self.saveLayout = function () {\r\n\r\n swal({\r\n title: translations.SaveLayoutSwalTitle,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n if (!self.isSaving) {\r\n\r\n self.isSaving = true;\r\n //self.polygonContainer[0].points = pixelsToPercentage(self.polygonContainer[0].pointsPx);\r\n\r\n var data = [];\r\n angular.forEach(self.levels, function (level) {\r\n data.push({\r\n id: level.id, //id del nivel\r\n layoutId: $stateParams.layoutId,\r\n order: level.order,\r\n width: level.width,\r\n depth: level.depth,\r\n photoUri: level.photoUri,\r\n sellingAreaSpace: level.sellingAreaSpace,\r\n totalSpace: level.totalSpace,\r\n //points: [[0, 0], [100, 0], [100, 100], [0, 100]],//level.polygonContainer[0].points,\r\n floorPlanograms: [],\r\n });\r\n angular.forEach(level.floorPlanograms, function (levelObject) {\r\n var copied = angular.copy(levelObject);\r\n delete copied.text;\r\n delete copied.svgReference;\r\n delete copied.pointsPx;\r\n data[data.length - 1].floorPlanograms.push(copied);\r\n });\r\n });\r\n\r\n var layoutData = {\r\n\r\n stores: self.layout.stores,\r\n levels: data,\r\n id: self.layout.id,\r\n companyId: self.layout.companyId\r\n }\r\n\r\n spaceService.layouts.saveLevels(layoutData).then(function (res) {\r\n if (res) {\r\n self.stateChange = false;\r\n //console.log('res.levels', res.levels);\r\n loadLevels(res.levels);\r\n swal(translations.SavedLayoutSwal, translations.SavedLayoutSwalSubtitle, 'success');\r\n //console.log(\"exito\");\r\n self.selectedLevelItem = null;\r\n self.isSaving = false;\r\n\r\n //TODO: recargo los planogramas si cambio la asignacion a tiendas.\r\n //O recargar todo despues de la edicion de tiendas\r\n if (self.layoutStoresHaveChanged) {\r\n //TODO:\r\n }\r\n }\r\n },\r\n function () {\r\n swal(translations.ErrorTitleSwal, \"error\", \"error\");\r\n self.isSaving = false;\r\n });\r\n\r\n\r\n }\r\n }\r\n });\r\n }\r\n\r\n self.selectSvg = function (element) {\r\n self.selectedSvg = element;\r\n }\r\n\r\n self.showAttributesFunc = function () {\r\n if (self.showAttributes)\r\n return translations.ViewLess;\r\n else\r\n return translations.ViewMore;\r\n }\r\n\r\n function renderPieCharts(planogram) {\r\n\r\n\r\n var shareSales = self.getLayoutTotal('sales') / planogram.sales;\r\n var shareSpace = self.levels[self.currentFloor].squareMeters / ((planogram.width * planogram.depth) / 100);\r\n\r\n self.spaceResult = shareSales < shareSpace ? translations.Overpaced : translations.Subspaced;\r\n self.spaceResultIcon = shareSales < shareSpace ? 'up' : 'down';\r\n self.spaceResultColor = shareSales < shareSpace ? 'danger' : 'primary';\r\n\r\n if (self.sales != undefined && self.sales.length > 0) {\r\n // TODO: Verificar porque no viene el dato de ventas.\r\n var sales = planogram.sales || 0.0;\r\n\r\n //Share Ventas\r\n var chart = c3.generate({\r\n bindto: '#saleschart',\r\n size: {\r\n width: 230\r\n },\r\n title: {\r\n text: translations.SalesShare\r\n },\r\n data: {\r\n columns: [\r\n // Fix: No viene el dato de ventas.\r\n //[planogram.name, planogram.sales],\r\n //[translations.SalesRestPlanograms, self.getLayoutTotal('sales') - planogram.sales],\r\n [planogram.name, sales],\r\n [translations.SalesRestPlanograms, self.getLayoutTotal('sales') - sales],\r\n ],\r\n type: 'pie'\r\n }\r\n });\r\n }\r\n\r\n var totalSpace = 0;\r\n angular.forEach(self.levels,\r\n function (level) {\r\n angular.forEach(level.floorPlanograms,\r\n function (c) {\r\n totalSpace += (c.width * c.depth) / 10000;\r\n });\r\n });\r\n console.log('totalSpace', totalSpace);\r\n //Share Espacio\r\n var chart = c3.generate({\r\n bindto: '#spacechart',\r\n size: {\r\n width: 230\r\n },\r\n title: {\r\n text: translations.SpaceShare + '(m2)'\r\n },\r\n data: {\r\n columns: [\r\n [planogram.name, (planogram.width * planogram.depth) / 10000],\r\n [translations.SpaceRestPlanograms, totalSpace - (planogram.width * planogram.depth) / 10000],\r\n ],\r\n type: 'pie'\r\n }\r\n });\r\n\r\n }\r\n\r\n function getRandomInt(min, max) {\r\n return Math.floor(Math.random() * (max - min + 1)) + min;\r\n }\r\n\r\n function onSizeChanged() {\r\n var level = self.levels[self.currentFloor];\r\n //angular.forEach(self.levels, function (level) {\r\n self.calcLayoutSize(level);\r\n //})\r\n\r\n angular.forEach(self.polygonContainer, function (container) {\r\n drawLevelObject(container, level);\r\n });\r\n\r\n if (level) {\r\n angular.forEach(level.floorPlanograms, function (planogram) {\r\n self.calcPlanogramSize(planogram);\r\n drawLevelObject(planogram, level);\r\n });\r\n\r\n //self.toggleLabels(!self.showLabels);\r\n //self.toggleLabels(self.showLabels);\r\n\r\n level.imgPlano.canvas.size(level.widthPx, level.widthPx * level.imgPlano.imgProportion)\r\n }\r\n }\r\n\r\n //function guid() {\r\n // function s4() {\r\n // return Math.floor((1 + Math.random()) * 0x10000)\r\n // .toString(16)\r\n // .substring(1);\r\n // }\r\n // return s4() + s4() + '-' + s4() + '-' + s4() + '-' +\r\n // s4() + '-' + s4() + s4() + s4();\r\n //}\r\n\r\n function loadPlanograms() {\r\n\r\n }\r\n\r\n self.planogramSales = [];\r\n self.storeSales = [];\r\n self.categorySales = [];\r\n\r\n function calculateAverageSales(sales, array) {\r\n //Ventas x Planograma. 1 Ordeno por spacePlanogramId\r\n sales.sort(function (a, b) {\r\n if (b.id > a.id)\r\n return -1;\r\n if (b.id < a.id)\r\n return 1;\r\n return 0;\r\n });\r\n\r\n //2. Agrupo por spacePlanogramId\r\n var id = 0;\r\n var saleObj = {};\r\n var totalSales = 0;\r\n var totalSpace = getTotalSpace(sales);\r\n //var totalSpace = 0;\r\n angular.forEach(sales, function (sale) {\r\n if (sale.id != id) {\r\n saleObj = {\r\n id: sale.id,\r\n sales: 0,\r\n margin: 0,\r\n units: 0,\r\n skus: 0,\r\n gmroi: 0,\r\n gmros: 0,\r\n daysOutOfStock: 0,\r\n inventoryUnits: 0,\r\n inventory: 0,\r\n floorSpace: 0,\r\n count: 0,\r\n categoryId: sale.categoryGroupId\r\n }\r\n\r\n array.push(saleObj);\r\n }\r\n\r\n saleObj.sales += sale.sales;\r\n saleObj.units += sale.units;\r\n saleObj.skus += sale.skus;\r\n saleObj.margin += sale.margin;\r\n saleObj.daysOutOfStock += sale.daysOutOfStock;\r\n saleObj.inventoryUnits += sale.inventoryUnits;\r\n saleObj.inventory += sale.inventory;\r\n saleObj.floorSpace = sale.floorSpace;\r\n saleObj.count++;\r\n\r\n id = sale.id;\r\n\r\n totalSales += sale.sales;\r\n totalSpace += sale.floorSpace;\r\n });\r\n\r\n //Calculo los promedios\r\n angular.forEach(array, function (sale) {\r\n sale.daysOutOfStock = sale.daysOutOfStock / sale.count;\r\n sale.gmroi = sale.margin / sale.inventory;\r\n sale.gmros = sale.margin / sale.floorSpace; //El Calculo del GMROS cambia si es una tienda\r\n sale.inventory = sale.inventory / sale.count;\r\n sale.inventoryUnits = sale.inventoryUnits / sale.count;\r\n sale.sales = sale.sales / sale.count;\r\n sale.units = sale.units / sale.count;\r\n sale.skus = sale.skus / sale.count;\r\n sale.margin = sale.margin / sale.count;\r\n sale.skus = sale.skus / sale.count;\r\n sale.salesShare = sale.sales / totalSales;\r\n sale.spaceShare = sale.floorSpace / totalSpace;\r\n sale.spaced = sale.spaceShare / sale.salesShare;\r\n sale.isOverSpaced = sale.spaced <= 1 ? false : true;\r\n sale.barWidth = sale.spaced > 2 ? 1 : Math.abs(sale.spaced - 1); //El maximo ancho de la barra es 100%\r\n });\r\n }\r\n\r\n\r\n function loadData() {\r\n\r\n spaceService.tickets.getTicketTypes(TICKET_TYPES.PLANOGRAM).then(function (ticketTypes) {\r\n self.ticketTypes = ticketTypes;\r\n })\r\n\r\n spaceService.layouts.getLayout($stateParams.layoutId).then(function (layout) {\r\n\r\n self.layout = layout;\r\n\r\n var storeIds = [];\r\n spaceService.stores.getStores().then(function (stores) {\r\n self.stores = stores;\r\n\r\n angular.forEach(self.stores, function (store) {\r\n if (store.layoutId == layout.id) {\r\n store.selected = true;\r\n\r\n //if (self.selectedStore == null)\r\n // self.selectedStore = store;\r\n\r\n storeIds.push(store.id);\r\n }\r\n });\r\n\r\n spaceService.spaceObjects.getSpaceObjects(storeIds).then(function (spacePlanograms) {\r\n\r\n spacePlanograms.sort(function (a, b) {\r\n if (b.categoryId > a.categoryId)\r\n return -1;\r\n if (b.categoryId < a.categoryId)\r\n return 1;\r\n return 0;\r\n });\r\n\r\n var colorIndex = -1;\r\n var planogramCategoryId = 0;\r\n angular.forEach(spacePlanograms, function (planogram) {\r\n\r\n if (planogram.categoryId != planogramCategoryId) {\r\n colorIndex++;\r\n\r\n self.categories.push({ id: planogram.categoryId, color: self.categoryColors[colorIndex], name: planogram.categoryName });\r\n }\r\n\r\n planogram.categoryColor = self.categoryColors[colorIndex];\r\n\r\n planogramCategoryId = planogram.categoryId;\r\n });\r\n\r\n self.spacePlanograms = spacePlanograms;\r\n\r\n loadLevels(layout.levels);\r\n\r\n //Cargo la info de ventas\r\n spaceService.layouts.getLayoutItemSales(layout.id).then(function (sales) {\r\n //Esto trae las ventas con el detalle de Planogramas, Tiendas y Grupo de Categorias. Luego hay que agrupar x Planograma x Tienda y x Grupo de Categorias\r\n self.sales = sales;\r\n\r\n //sales.forEach(function (s) { s.id = s.spacePlanogramId });\r\n\r\n //calculateAverageSales(sales, self.planogramSales);\r\n\r\n //angular.forEach(self.planogramSales, function (sale) {\r\n // angular.forEach(self.spacePlanograms, function (planogram) {\r\n // if (sale.id == planogram.id) {\r\n // angular.merge(planogram, sale);\r\n // }\r\n // });\r\n\r\n // angular.forEach(self.levels, function (level) {\r\n // angular.forEach(level.floorPlanograms, function (levelObject) {\r\n // if (sale.id == levelObject.id) {\r\n // angular.merge(levelObject, sale);\r\n // }\r\n // })\r\n // });\r\n //});\r\n\r\n\r\n //sales.forEach(function (s) { s.id = s.storeId });\r\n\r\n //calculateAverageSales(sales, self.storeSales);\r\n\r\n //sales.forEach(function (s) { s.id = s.categoryGroupId });\r\n\r\n //calculateAverageSales(sales, self.categorySales);\r\n\r\n ////agrega datos de venta a las categorias\r\n //angular.forEach(self.categorySales, function (sale) {\r\n // angular.forEach(self.categories, function (category) {\r\n // if (sale.id == category.id) {\r\n // angular.merge(category, sale);\r\n // }\r\n // });\r\n //});\r\n\r\n //agrega datos de venta a los planogramas del layout\r\n calculateSales();\r\n\r\n\r\n });\r\n\r\n }).then(function () {\r\n //self.spacePlanograms.push(null);\r\n\r\n });\r\n });\r\n\r\n //self.showSubCat = function (categoryId, categoryName, spaced) {\r\n // self.showSubcategories = true;\r\n\r\n // self.isInfoPlanogramCollapsed = true;\r\n // self.isInfoLayoutsCollapsed = true;\r\n // self.isInfoPerformanceCollapsed = true;\r\n\r\n // self.selectedCategory = { id: categoryId, name: categoryName, spaced: spaced };\r\n //}\r\n\r\n //self.hideSubCat = function () {\r\n // self.showSubcategories = false;\r\n // self.isInfoPlanogramCollapsed = false;\r\n // self.isInfoLayoutsCollapsed = false;\r\n // self.isInfoPerformanceCollapsed = false;\r\n //}\r\n\r\n })\r\n\r\n\r\n\r\n //$timeout(function () {\r\n .then(function () {\r\n if ($stateParams.planogramIdChange && $stateParams.planogramIdChange != 0) {\r\n angular.forEach(self.levels[self.currentFloor].floorPlanograms, function (c) {\r\n if (c.id == $stateParams.planogramIdChange)\r\n self.levelObjectClick(c);\r\n })\r\n }\r\n\r\n //self.spacePlanograms.push(null);\r\n });\r\n //}, 250);\r\n\r\n\r\n\r\n }\r\n\r\n\r\n self.showSubCat = function (categoryId, categoryName, spaced) {\r\n self.showSubcategories = true;\r\n\r\n self.isInfoPlanogramCollapsed = true;\r\n self.isInfoLayoutsCollapsed = true;\r\n self.isInfoPerformanceCollapsed = true;\r\n\r\n self.selectedCategory = { id: categoryId, name: categoryName, spaced: spaced };\r\n }\r\n\r\n self.hideSubCat = function () {\r\n self.showSubcategories = false;\r\n self.isInfoPlanogramCollapsed = false;\r\n self.isInfoLayoutsCollapsed = false;\r\n self.isInfoPerformanceCollapsed = false;\r\n }\r\n\r\n self.selectedCategory = {};\r\n\r\n function loadLevels(levels) {\r\n //console.log('loadLevels', levels)\r\n self.levels = [];\r\n for (var i = 0; i < levels.length; i++) {\r\n\r\n self.levels.push({\r\n\r\n id: levels[i].id,\r\n width: levels[i].width,\r\n depth: levels[i].depth,\r\n floorPlanograms: levels[i].floorPlanograms,\r\n points: levels[i].points,\r\n order: levels[i].order,\r\n sellingAreaSpace: levels[i].sellingAreaSpace,\r\n photoUri: levels[i].photoUri,\r\n totalSpace: levels[i].totalSpace,\r\n get squareMeters() { return this.width * this.depth / 10000 },\r\n get linearFeets() {\r\n var total = 0;\r\n angular.forEach(this.floorPlanograms, function (comp) {\r\n total += (comp.depth / 100) * (comp.width / 100);\r\n });\r\n return total.toFixed(2);\r\n }\r\n\r\n });\r\n\r\n self.levels[self.levels.length - 1].floorPlanograms = levels[i].floorPlanograms;\r\n\r\n //angular.forEach(levels[i].floorPlanograms, function (levelObject) {\r\n // self.levels[self.levels.length - 1].levelObject\r\n //});\r\n\r\n $timeout(function (i) {\r\n //var canvas = SVG('newLayoutCanvas' + self.levels[i].order).size('10000px', '10000px');\r\n\r\n //self.levels[i].canvas = canvas;\r\n\r\n //self.levels[i].levelDiv = document.getElementById('newLayoutCanvas' + self.levels[i].order);\r\n\r\n //self.calcLayoutSize(self.levels[i]);\r\n\r\n ////self.imgPlano = {}\r\n ////self.imgPlano.canvas = canvas.image(self.levels[i].photoUri).loaded(function (loader) {\r\n //// var imgProportion = loader.height / loader.width\r\n //// self.imgPlano.imgProportion = imgProportion\r\n //// this.size(self.levels[i].widthPx, self.levels[i].widthPx * imgProportion)\r\n ////})\r\n //self.imgPlano = self.createImage(self.levels[i]);\r\n\r\n //self.levels[i].points = [[0, 0], [100, 0], [100, 100], [0, 100]];\r\n\r\n //self.levels[i].pointsPx = percentageToPixels(self.levels[i].points, self.levels[i]),\r\n // self.levels[i].polygonContainer = [{\r\n // svgReference: canvas.polygon(self.levels[i].pointsPx.join(' ')).fill('transparent').stroke({ width: 1 }),\r\n // fill: 'transparent',\r\n // points: self.levels[i].points,\r\n // pointsPx: self.levels[i].pointsPx, // percentageToPixels(self.levels[i].points),\r\n // draggable: false,\r\n // selectable: false,\r\n // stroke: { width: 1, color: 'black' }\r\n // }]\r\n\r\n //angular.forEach(self.levels[i].floorPlanograms, function (levelObject) {\r\n // levelObject.draggable = true;\r\n // levelObject.selectable = true;\r\n // drawLevelObject(levelObject, self.levels[i]);\r\n //});\r\n\r\n //self.levels[i].levelDiv.style.overflow = 'hidden';\r\n var level = self.levels[i];\r\n self.createLevelCanvas(level, false);\r\n\r\n }, 0, true, i);\r\n\r\n }\r\n\r\n\r\n }\r\n\r\n /**\r\n * Agrega un nuevo elemento canvas en el DOM.\r\n * @param {any} level nivel del layout.\r\n * @param {boolean} isNew indica si el nivel del layout es nuevo.\r\n * @returns {void}\r\n */\r\n self.createLevelCanvas = function createLevelCanvas(level, isNew) {\r\n var canvas = SVG('newLayoutCanvas' + level.order).size('10000px', '10000px');\r\n\r\n level.canvas = canvas;\r\n\r\n level.levelDiv = document.getElementById('newLayoutCanvas' + level.order);\r\n\r\n self.calcLayoutSize(level);\r\n\r\n level.imgPlano = self.createImage(level);\r\n\r\n level.points = [[0, 0], [100, 0], [100, 100], [0, 100]];\r\n\r\n if (isNew) {\r\n level.pointsPx = getDivPoints(level.levelDiv);\r\n }\r\n else {\r\n level.pointsPx = percentageToPixels(level.points, level);\r\n }\r\n \r\n level.polygonContainer = [{\r\n svgReference: canvas.polygon(level.pointsPx.join(' ')).fill('transparent').stroke({ width: 1 }),\r\n fill: 'transparent',\r\n points: level.points,\r\n pointsPx: level.pointsPx, \r\n draggable: false,\r\n selectable: false,\r\n stroke: { width: 1, color: 'black' }\r\n }]\r\n\r\n if (!isNew) {\r\n angular.forEach(level.floorPlanograms, function (levelObject) {\r\n levelObject.draggable = true;\r\n levelObject.selectable = true;\r\n drawLevelObject(levelObject, level);\r\n });\r\n }\r\n\r\n level.levelDiv.style.overflow = 'hidden';\r\n\r\n\r\n }\r\n\r\n self.createImage = function createImage(level) {\r\n var imgPlano = {};\r\n imgPlano.canvas = level.canvas.image(level.photoUri).loaded(function (loader) {\r\n var imgProportion = loader.height / loader.width;\r\n imgPlano.imgProportion = imgProportion;\r\n this.size(level.widthPx, level.widthPx * imgProportion);\r\n });\r\n\r\n return imgPlano;\r\n }\r\n\r\n self.showZoomButtons = function showZoomButtons() { \r\n var level = self.levels[self.currentFloor];\r\n var ret = angular.isObject(level)\r\n && angular.isNumber(level.width)\r\n && level.width != 0;\r\n\r\n return ret;\r\n }\r\n\r\n function initEvents() {\r\n\r\n angular.element(window).on(\"resize.doResize\", _.throttle(function () {\r\n\r\n $scope.$apply(function () {\r\n onSizeChanged();\r\n });\r\n }, 500));\r\n\r\n var onGlobalMouseup = function (e) {\r\n if (e.toElement.className.toString().indexOf('filter-button') === -1\r\n && $(event.target).closest('.filter-element').length == 0) {\r\n self.closeFilters();\r\n }\r\n }\r\n\r\n $(\"body\").on(\"mouseup\", onGlobalMouseup);\r\n \r\n $scope.$on(\"$destroy\", function () {\r\n angular.element(window).off(\"resize.doResize\"); //remove the handler added earlier\r\n $(\"body\").off(\"mouseup\", onGlobalMouseup);\r\n });\r\n }\r\n\r\n function initDrag() {\r\n\r\n }\r\n\r\n var cloned;\r\n var mouseDown;\r\n\r\n function onMouseUp(event) {\r\n //Solo ejecuto si viene de un mouse down previo\r\n if (!mouseDown) return;\r\n //console.log('up', event);\r\n //Le saco el evento, por las dudas\r\n window.removeEventListener('mouseup', onMouseUp);\r\n //Dejo de arrastrar\r\n document.onmousemove = null;\r\n\r\n var level = self.levels[self.currentFloor];\r\n\r\n //Guardo los puntos para usarlos luego\r\n var pxPoints = getDivPoints(cloned);\r\n var points = pixelsToPercentage(pxPoints, level);\r\n\r\n var validPosition = isValidPosition(cloned);\r\n //Remuevo el planograma del canvas creado\r\n var parent = document.getElementById('auxPlanogram');\r\n parent.removeChild(cloned);\r\n\r\n //Si es una ubicacion no permitida, no lo agrego\r\n //if (_.includes(cloned.className, \"forbidden\"))\r\n if (!validPosition) {\r\n //console.log('no over');\r\n return;\r\n }\r\n\r\n var rect = level.levelDiv.getBoundingClientRect();\r\n\r\n //Solo si el elemento con el que estoy interactuando no existia todavia en la lista\r\n //if (!$(event.relatedTarget).attr('id')) {\r\n\r\n var componentClone = angular.copy(self.selectedSpaceObject);\r\n\r\n self.isPlanogramRepeat = false;\r\n\r\n\r\n //swal('No puede repetir planogramas', 'El planograma arrastrado ya existe en el layout, no puede duplicar el planograma.', 'warning');\r\n //return;\r\n \r\n\r\n //componentClone.id = guid();\r\n componentClone.points = points;\r\n\r\n level.floorPlanograms.push({\r\n isNew: true,\r\n tempId: level.floorPlanograms.length + 1,\r\n id: 0,\r\n spacePlanogramId: componentClone.id,\r\n depth: componentClone.depth,\r\n width: componentClone.width,\r\n points: componentClone.points,\r\n pointsPx: componentClone.pointsPx,\r\n rotation: componentClone.rotation ? componentClone.rotation : 0,\r\n name: componentClone.name,\r\n categoryId: componentClone.categoryId,\r\n categoryColor: componentClone.categoryColor\r\n });\r\n\r\n //vuelvo a calcular las ventas \r\n calculateSales();\r\n\r\n //console.log('level.floorPlanograms', level.floorPlanograms[level.floorPlanograms.length - 1]);\r\n //console.log('clone', componentClone);\r\n\r\n\r\n drawLevelObject(level.floorPlanograms[level.floorPlanograms.length - 1], level);\r\n\r\n self.levelObjectClick(level.floorPlanograms[level.floorPlanograms.length - 1]);\r\n //console.log('level.floorPlanograms', level.floorPlanograms);\r\n //agrego el id al html\r\n //$(event.relatedTarget).attr('id', componentClone.id);\r\n\r\n //muestro etiquetas si corresponde\r\n //self.toggleLabels(self.showLabels);\r\n\r\n\r\n //actualizo filtros\r\n //self.highlightByType();\r\n\r\n $scope.$apply();\r\n\r\n\r\n }\r\n\r\n\r\n self.notRepeatPlanogram = function (spacePlanogram) {\r\n var level = self.levels[self.currentFloor];\r\n return level && level.floorPlanograms && level.floorPlanograms.some(function (planogram) {\r\n return planogram.spacePlanogramId === spacePlanogram.id;\r\n });\r\n \r\n }\r\n\r\n function isValidPosition(div, component) {\r\n var points = getDivPoints(div);\r\n //console.log(points[0],points[1],points[2],points[3]);\r\n\r\n if (!overContainer(points)) {\r\n //console.log('not over');\r\n return false;\r\n\r\n }\r\n\r\n if (areCollisions(points, component)) {\r\n //console.log('collides');\r\n return false;\r\n\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function areCollisions(pointsToCheck, selectedSpaceObject) {\r\n var flag = false;\r\n _.each(self.levels[self.currentFloor].floorPlanograms, function (component) {\r\n _.each(pointsToCheck, function (point) {\r\n if (selectedSpaceObject != undefined) {\r\n if ((component.id != selectedSpaceObject.id && inside(point, component.pointsPx))) {\r\n flag = true;\r\n }\r\n } else {\r\n if ((inside(point, component.pointsPx))) {\r\n flag = true;\r\n }\r\n }\r\n\r\n })\r\n });\r\n\r\n return flag;\r\n }\r\n\r\n function overContainer(pointsToCheck) {\r\n var flag = true;\r\n _.each(pointsToCheck, function (item) {\r\n if (inside(item, self.levels[self.currentFloor].polygonContainer[0].pointsPx) == false) {\r\n flag = false;\r\n }\r\n })\r\n\r\n return flag;\r\n }\r\n\r\n self.componentMousedown = function (item, event) {\r\n self.stateChange = true;\r\n var level = self.levels[self.currentFloor];\r\n if (level.polygonContainer.length == 0 || level.polygonContainer[0].points == undefined) return;\r\n mouseDown = true;\r\n\r\n // create a clone of the currentTarget element\r\n cloned = event.currentTarget.cloneNode(true);\r\n\r\n //Le pongo las medidas correctas al planograma\r\n self.calcPlanogramSize(self.selectedSpaceObject);\r\n\r\n //resize clone\r\n cloned.style.width = self.selectedSpaceObject.widthPx + 'px';\r\n cloned.style.height = self.selectedSpaceObject.depthPx + 'px';\r\n cloned.style.opacity = '1';\r\n\r\n\r\n //div.innerHTML = \"Hello\";\r\n\r\n var parent = document.getElementById('auxPlanogram');\r\n parent.style.top = event.clientY + 'px';\r\n parent.style.left = event.clientX + 'px';\r\n\r\n parent.appendChild(cloned);\r\n window.addEventListener('mouseup', onMouseUp);\r\n\r\n\r\n document.onmousemove = function (oPssEvt2) {\r\n var oMsEvent2 = oPssEvt2 || /* IE */ window.event;\r\n parent.style.top = oMsEvent2.clientY + 'px';\r\n parent.style.left = oMsEvent2.clientX + 'px';\r\n\r\n if (isValidPosition(cloned)) {\r\n cloned.className = cloned.className.replace('forbidden', '');\r\n } else {\r\n if (!_.includes(cloned.className, 'forbidden')) {\r\n cloned.className += ' forbidden';\r\n }\r\n }\r\n };\r\n }\r\n\r\n function getDivPointsFromCoordenates(startX, startY, div) {\r\n var rect = self.levels[self.currentFloor].levelDiv.getBoundingClientRect();\r\n\r\n baseX = startX - rect.left;\r\n baseY = startY - rect.top;\r\n\r\n var points = [[baseX, baseY]];\r\n points.push([baseX + div.clientWidth, baseY]);\r\n points.push([baseX, baseY + div.clientHeight]);\r\n points.push([baseX + div.clientWidth, baseY + div.clientHeight]);\r\n\r\n return points;\r\n }\r\n\r\n function getDivPoints(div) {\r\n var rect = self.levels[self.currentFloor].levelDiv.getBoundingClientRect();\r\n var divRect = div.getBoundingClientRect();\r\n //console.log(divRect);\r\n\r\n baseX = divRect.left - rect.left;\r\n baseY = divRect.top - rect.top;\r\n\r\n var points = [[baseX, baseY]];\r\n points.push([baseX, baseY + divRect.height]);\r\n points.push([baseX + divRect.width, baseY + divRect.height]);\r\n points.push([baseX + divRect.width, baseY]);\r\n\r\n return points;\r\n }\r\n\r\n function inside(point, vs) {\r\n // ray-casting algorithm based on\r\n // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html\r\n var x = point[0], y = point[1];\r\n\r\n var inside = false;\r\n for (var i = 0, j = vs.length - 1; i < vs.length; j = i++) {\r\n var xi = vs[i][0], yi = vs[i][1];\r\n var xj = vs[j][0], yj = vs[j][1];\r\n\r\n var intersect = ((yi > y) != (yj > y))\r\n && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);\r\n if (intersect) inside = !inside;\r\n }\r\n\r\n return inside;\r\n };\r\n\r\n\r\n function drawLevelObject(c, level) {\r\n if (c.svgReference != undefined) {\r\n c.svgReference.remove();\r\n c.svgReference = undefined;\r\n }\r\n\r\n var pxPoints = percentageToPixels(c.points, level);\r\n c.pointsPx = pxPoints;\r\n var poly;\r\n if (!c.image) {\r\n\r\n var onlyPoly = angular.isDefined(c.fill) && c.fill === 'transparent';\r\n //c.svgReference = level.canvas.polygon(pxPoints.join(' '))\r\n // .fill(self.getComponentColor(c))\r\n // .stroke({ width: 1, opacity: '1' });\r\n ////.radius(5)\r\n\r\n // Crea los items.\r\n var fillColor = c.fill || self.getComponentColor(c.categoryId);\r\n poly /* Planograma */ = level.canvas.polygon(pxPoints.join(' '))\r\n .fill(fillColor)\r\n .stroke({\r\n width: 1,\r\n opacity: '1'\r\n });\r\n\r\n // Workaround: Se dibuja un elemento que no es un planograma y es transparente.\r\n if (onlyPoly) {\r\n c.svgReference = poly;\r\n } else {\r\n\r\n var planograms = self.spacePlanograms.filter(function (planogram) {\r\n var ret = planogram.id === c.spacePlanogramId;\r\n return ret;\r\n });\r\n\r\n\r\n\r\n var orientationRightToLeft = true;\r\n if (planograms.length) {\r\n orientationRightToLeft = planograms[0].orientationRightToLeft;\r\n }\r\n\r\n var arrowRotation = angular.isDefined(c.oldRotation) && c.oldRotation !== c.rotation;\r\n var polyBox = poly.node.getBBox();\r\n var g /* agrupa todos los elemento */ = level.canvas.group();\r\n var arrowNested /* Contenedor de la flecha para poder posicionarla */ = level.canvas.nested();\r\n var gArrow /* Para poder cambiar el tama�o de la flecha y rotarla */ = level.canvas.group();\r\n var arrow /* Flecha */;\r\n var isHorizontal = polyBox.width > polyBox.height;\r\n if (orientationRightToLeft) {\r\n if (isHorizontal) {\r\n arrow = level.canvas.path(\r\n 'm 10.975,2 2.847,2.828 -6.176,6.176 16.354,0 0,3.992 -16.354,0 6.176,6.176 L 10.975,24 0,13 Z');\r\n } else {\r\n arrow = level.canvas.path(\r\n 'm 22,10.975 -2.828,2.847 -6.176,-6.176 0,16.354 -3.992,0 0,-16.354 L 2.828,13.822 0,10.975 11,0 Z');\r\n }\r\n } else {\r\n if (isHorizontal) {\r\n arrow = level.canvas.path(\r\n 'm 13.025,2 -2.847,2.828 6.176,6.176 -16.354,0 0,3.992 16.354,0 -6.176,6.176 L 13.025,24 24,13 Z');\r\n } else {\r\n arrow = level.canvas.path(\r\n 'm 22,13.025 -2.828,-2.847 -6.176,6.176 0,-16.354 -3.992,0 0,16.354 L 2.828,10.178 0,13.025 11,24 Z');\r\n }\r\n }\r\n\r\n // Aplica los estilos a la flecha.\r\n arrow.fill('#fff')\r\n .stroke({ width: 1, color: 'black' })\r\n .attr({ 'stroke-dasharray': '' });\r\n\r\n gArrow.add(arrow);\r\n arrowNested.add(gArrow);\r\n g.add(poly);\r\n g.add(arrowNested);\r\n c.svgReference = g;\r\n var gArrorBox = gArrow.node.getBBox();\r\n\r\n // Calcula el factor de la escala.\r\n var scale = Math.min(polyBox.width, polyBox.height) / Math.max(gArrorBox.width, gArrorBox.height);\r\n\r\n if (isNaN(scale)) {\r\n scale = 1;\r\n }\r\n\r\n gArrow.translate(0, 0)\r\n .transform({\r\n scale: scale\r\n });\r\n\r\n gArrow.translate(0, 0);\r\n arrowNested.translate(0, 0);\r\n var arrowNestedBox = arrowNested.node.getBBox();\r\n var arrowNestedBoxWidth = arrowNestedBox.width;\r\n var arrowNestedBoxHeight = arrowNestedBox.height;\r\n\r\n // Centra la flecha en el planograma.\r\n // Toma la posici�n del pol�gono y centra la flecha, si la flecha esta rotada corrige la posici�n inicial.\r\n var arrowX = polyBox.x + ((polyBox.width - arrowNestedBoxWidth) / 2);\r\n var arrowY = polyBox.y + ((polyBox.height - arrowNestedBoxHeight) / 2);\r\n arrowNested.move(arrowX, arrowY);\r\n }\r\n } else {\r\n //Si es una imagen, tengo que tratarlo un poco diferente\r\n //Tengo que crear un grupo, y asignar una imagen y un poligono (para que le rellene el fondo)\r\n\r\n var width = getPixelFromPercentage(c.imageWidth, self.levels[self.currentFloor].levelDiv.clientWidth);\r\n var height = getPixelFromPercentage(c.imageHeight, self.levels[self.currentFloor].levelDiv.clientHeight);\r\n\r\n var image = level.canvas.image(c.icon, width, height);\r\n if (c.imageOpacity)\r\n image.opacity(c.imageOpacity);\r\n\r\n if (c.group) {\r\n poly = level.canvas.polygon(pxPoints.join(' '))\r\n .stroke({ width: 1, color: 'black' });\r\n\r\n if (c.fill) {\r\n poly.fill(c.fill);\r\n } else {\r\n console.log(c.categoryId);\r\n poly.fill(self.getComponentColor(c.categoryId));\r\n\r\n }\r\n\r\n poly.opacity(0.1);\r\n\r\n g = level.canvas.group();\r\n g.add(poly);\r\n g.add(image);\r\n\r\n c.svgReference = g;\r\n } else {\r\n c.svgReference = image;\r\n }\r\n\r\n if (c.imageMove) {\r\n image.move(c.imageMove[0], c.imageMove[1]);\r\n }\r\n }\r\n\r\n if (c.stroke) {\r\n c.svgReference.stroke(c.stroke);\r\n }\r\n\r\n if (c.selectable == undefined || c.selectable === true)\r\n c.svgReference.click(function () {\r\n self.levelObjectClick(c);\r\n });\r\n\r\n if (c.move) {\r\n c.svgReference.dmove(getPixelFromPercentage(c.move[0], level.layoutDiv.clientWidth),\r\n getPixelFromPercentage(c.move[1], level.layoutDiv.clientHeight));\r\n }\r\n\r\n if (c.rotation) {\r\n c.svgReference.transform({ rotation: c.rotation });\r\n\r\n //c.svgReference.transform({ rotation: c.rotation, relative: true });\r\n //c.svgReference.rotate(c.rotation);\r\n }\r\n\r\n if (c.color) {\r\n //c.svgReference.fill(c.color);\r\n //c.svgReference.fill(getSectionColor(c.categoryId));\r\n }\r\n\r\n //Esto es por si quiero sobreescribir un color \r\n //c.svgReference.fill('transparent');\r\n if (c.fill) {\r\n c.svgReference.fill(c.fill);\r\n //c.svgReference.stroke({ width: 1, color: c.fill })\r\n }\r\n\r\n if (c.back) {\r\n c.svgReference.back();\r\n }\r\n\r\n if (c.front) {\r\n c.svgReference.front();\r\n }\r\n\r\n if (c.attr) {\r\n c.svgReference.attr(c.attr);\r\n }\r\n\r\n if (c.svgReference._array) {\r\n c.pointsPx = angular.copy(c.svgReference._array.value);\r\n }\r\n\r\n if (self.isEdit() && (c.draggable == undefined || c.draggable === true)) {\r\n c.svgReference.draggable();\r\n\r\n c.svgReference.on('dragmove.namespace', function (event) {\r\n if (!isValidPosition(event.srcElement, c)) {\r\n //console.log('mal');\r\n c.svgReference.fill('#ED5666');\r\n } else {\r\n //console.log('bien');\r\n //console.log('c', c);\r\n if (c.fill) {\r\n c.svgReference.fill(c.fill);\r\n } else if (c.color) {\r\n c.svgReference.fill(c.color);\r\n } else {\r\n c.svgReference.fill(self.getComponentColor(c.categoryId));\r\n }\r\n }\r\n });\r\n\r\n c.svgReference.on('dragend.namespace', function (event) {\r\n if (!isValidPosition(event.srcElement, c)) {\r\n //console.log('mal');\r\n c.svgReference.remove();\r\n drawLevelObject(c, level);\r\n } else {\r\n //console.log('bien');\r\n if (c.image) {\r\n c.pointsPx = getDivPoints(event.srcElement);\r\n c.points = pixelsToPercentage(c.pointsPx, level);\r\n c.svgReference.remove();\r\n drawLevelObject(c, level);\r\n c.imageMove = angular.copy(c.pointsPx[0]);\r\n c.move = undefined;\r\n } else {\r\n // c.pointsPx = getDivPoints(event.srcElement);\r\n var $el = angular.element(event.srcElement);\r\n var element = event.srcElement;\r\n if ($el.is('g:has(polygon)')) {\r\n element = $el.find('polygon').get(0);\r\n }\r\n\r\n c.pointsPx = getDivPoints(element);\r\n c.points = pixelsToPercentage(c.pointsPx, level);\r\n c.move = undefined;\r\n if (c.rotation !== 0) {\r\n c.oldRotation = c.rotation;\r\n }\r\n\r\n c.rotation = 0;\r\n c.svgReference.remove();\r\n drawLevelObject(c, level);\r\n }\r\n }\r\n\r\n self.levelObjectClick(c);\r\n //self.toggleLabels(false);\r\n });\r\n }\r\n }\r\n\r\n function drawInitialData() {\r\n angular.forEach(self.levels, function (level) {\r\n angular.forEach(level.floorPlanograms, function (c) {\r\n drawLevelObject(c, level);\r\n });\r\n });\r\n }\r\n\r\n function polygonArea(points) {\r\n area = 0; // Accumulates area in the loop\r\n j = points.length - 1; // The last vertex is the 'previous' one to the first\r\n\r\n for (i = 0; i < points.length; i++) {\r\n area = area + (points[j][0] + points[i][0]) * (points[j][1] - points[i][1]);\r\n j = i; //j is previous vertex to i\r\n }\r\n return area / 2;\r\n }\r\n\r\n function getSectionColor(sectionId) {\r\n switch (sectionId) {\r\n case 24: return '#7099AB';\r\n case 2: return '#AEDB9A';\r\n case 3: return '#ABB6CC';\r\n case 4: return '#d27c59';\r\n case 5: return '#96BCA7';\r\n case 6: return 'violet';\r\n case 7: return '#E7B16B';\r\n case 8: return '#93C6B7';\r\n case 9: return '#FFBE7A';\r\n case 10: return '#AEDBff';\r\n }\r\n\r\n return '';\r\n }\r\n\r\n function percentageToPixels(points, level) {\r\n var ret = [];\r\n var clientWidth = level.levelDiv.clientWidth;\r\n var clientHeight = level.levelDiv.clientHeight;\r\n _.each(points, function (point) {\r\n // r.push([getPixelFromPercentage(point[0], level.levelDiv.clientWidth), getPixelFromPercentage(point[1], level.levelDiv.clientHeight)]);\r\n var data0 = getPixelFromPercentage(point[0], clientWidth);\r\n var data1 = getPixelFromPercentage(point[1], clientHeight);\r\n var aux = [\r\n data0,\r\n data1\r\n ];\r\n ret.push(aux);\r\n });\r\n return ret;\r\n }\r\n\r\n function getPixelFromPercentage(perc, maxPx) {\r\n return perc * maxPx / 100;\r\n }\r\n\r\n function pixelsToPercentage(pixels, level) {\r\n //console.log('pixels', pixels);\r\n var ret = [];\r\n var clientWidth = level.levelDiv.clientWidth;\r\n var clientHeight = level.levelDiv.clientHeight;\r\n _.each(pixels, function (pixel) {\r\n //console.log('pixel',pixel);\r\n // r.push([getPercentageFromPixel(pixel[0], level.levelDiv.clientWidth), getPercentageFromPixel(pixel[1], level.levelDiv.clientHeight)]);\r\n var data0 = getPercentageFromPixel(pixel[0], clientWidth);\r\n var data1 = getPercentageFromPixel(pixel[1], clientHeight);\r\n var aux = [\r\n data0,\r\n data1\r\n ];\r\n ret.push(aux);\r\n });\r\n return ret;\r\n }\r\n\r\n function getPercentageFromPixel(pixel, maxPx) {\r\n return parseFloat((pixel * 100 / maxPx).toFixed(2));\r\n }\r\n\r\n function getMiddlePoint(points) {\r\n var rMax = [-1, -1];\r\n var rMin = [99999, 99999];\r\n _.each(points,\r\n function (p) {\r\n rMin[0] = p[0] < rMin[0] ? p[0] : rMin[0];\r\n rMin[1] = p[1] < rMin[1] ? p[1] : rMin[1];\r\n\r\n rMax[0] = p[0] > rMax[0] ? p[0] : rMax[0];\r\n rMax[1] = p[1] > rMax[1] ? p[1] : rMax[1];\r\n });\r\n\r\n return [(rMax[0] + rMin[0]) / 2, (rMax[1] + rMin[1]) / 2,];\r\n }\r\n\r\n function getWidthHeight(points) {\r\n var rMax = [-1, -1];\r\n var rMin = [99999, 99999];\r\n _.each(points,\r\n function (p) {\r\n rMin[0] = p[0] < rMin[0] ? p[0] : rMin[0];\r\n rMin[1] = p[1] < rMin[1] ? p[1] : rMin[1];\r\n\r\n rMax[0] = p[0] > rMax[0] ? p[0] : rMax[0];\r\n rMax[1] = p[1] > rMax[1] ? p[1] : rMax[1];\r\n });\r\n\r\n return [rMax[0] - rMin[0], rMax[1] - rMin[1]];\r\n }\r\n\r\n\r\n\r\n //Filtros\r\n\r\n self.showFilters = false;\r\n\r\n self.toggleFilters = function () {\r\n\r\n\r\n self.showFilters = !self.showFilters;\r\n\r\n //if (self.showFilters) {\r\n // $timeout(function () {\r\n\r\n // $window.onclick = function (event) {\r\n // closeFilterWhenClickingOutside(event);\r\n // }\r\n // }, 100);\r\n //} else {\r\n // $window.onclick = null;\r\n //}\r\n\r\n }\r\n\r\n self.clearFilter = function () {\r\n //self.selectedBrand = '!null';\r\n self.filterByBrand('!null');\r\n\r\n //self.selectedTagFilter = '!null';\r\n self.filterByTag('!null')\r\n\r\n\r\n }\r\n\r\n function closeFilterWhenClickingOutside(event) {\r\n\r\n var clickedElement = event.target;\r\n if (!clickedElement) return;\r\n\r\n var elementClasses = clickedElement.classList;\r\n var clickedOnFilterDiv = elementClasses.contains('isFilter')\r\n || elementClasses.contains('chosen-choice')\r\n || elementClasses.contains('chosen-choices')\r\n || elementClasses.contains('search-field')\r\n || elementClasses.contains('default')\r\n || elementClasses.contains('chosen-container')\r\n || elementClasses.contains('chosen-container')\r\n if (!clickedOnFilterDiv) {\r\n self.closeFilters();\r\n }\r\n\r\n }\r\n\r\n self.closeFilters = function () {\r\n $timeout(function () {\r\n self.showFilters = false;\r\n $window.onclick = null;\r\n });\r\n\r\n }\r\n\r\n self.getFilterClass = function () {\r\n if (self.showFilters == true)\r\n return 'move-right';\r\n else\r\n return '';\r\n }\r\n\r\n //Filtro collapse\r\n\r\n self.isNavCollapsed = true;\r\n self.isCollapsedHorizontal = false;\r\n self.isCollapsed = true;\r\n self.isSelectedStoreCollapsed = false;\r\n self.isHeatMapCollapsed = false;\r\n self.isInfoLayoutsCollapsed = false;\r\n self.isInfoPerformanceCollapsed = false;\r\n self.isInfoRankingCollapsed = false;\r\n self.isInfoCategoriesCollapsed = false;\r\n self.isInfoPlanogramCollapsed = false;\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n $translate([\"SaveLayoutSwalTitle\", \"SavedLayoutSwal\", \"SavedLayoutSwalSubtitle\", \"SavedTicketSwal\", \"SavedTicketSwalSubtitle\", \"ValidationSwalTitle\", \"ValidationSwalSubtitle\", \"CancelSwal\", \"ContinueSwal\", \"RemoveSwal\", \"SpaceRestPlanograms\", \"SureDeletePlanogramSwal\", \"SalesRestPlanograms\", \"SpaceShare\", \"SalesShare\", \"Overpaced\", \"Subspaced\", \"ShowInformation\", \"ShowPlanograms\", \"AlertWillLoseChanges\", \"SwalEmptyFloors\", \"HidePlanograms\", \"HideInformation\", \"ViewMore\", \"ViewLess\", \"ErrorTitleSwal\", \"Units\", \"Sales\", \"Margin\", \"Price\", \"Inventory\", \"StockOut\", \"Low\", \"Medium\", \"HeightF\"])\r\n .then(function (all) {\r\n translations = all;\r\n self.translationUnits = translations.Units;\r\n self.translationSales = translations.Sales;\r\n self.translationMargin = translations.Margin;\r\n self.translationPrice = translations.Price;\r\n self.translationInventory = translations.Inventory;\r\n self.translationStockOut = translations.StockOut;\r\n self.translationLow = translations.Low;\r\n self.translationMedium = translations.Medium;\r\n self.translationHeightF = translations.HeightF;\r\n\r\n self.priorityTickets = [\r\n { id: 1, name: self.translationLow },\r\n { id: 2, name: self.translationMedium },\r\n { id: 3, name: self.translationHeightF },\r\n ]\r\n\r\n })\r\n .then(function () {\r\n self.buttonTextPlanogramsPanel = translations.HidePlanograms;\r\n self.buttonTextInformationPanel = translations.HideInformation;\r\n });\r\n\r\n if (self.isEdit() && !self.hasPermissionToEdit) {\r\n $state.go('spaces.viewLayout', { layoutId: $stateParams.layoutId });\r\n }\r\n\r\n loadData();\r\n\r\n initEvents();\r\n\r\n }\r\n init();\r\n });\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n .service(\"spaceService\", function ($rootScope, httpService) {\r\n var self = this;\r\n\r\n self.stores = {\r\n getStores: function () {\r\n return httpService.get('/space/stores/getStores');\r\n },\r\n }\r\n self.layouts = {\r\n saveLevels: function (data) {\r\n return httpService.post('/space/layout/save-levels', data);\r\n },\r\n uploadLayout: function (imgData) {\r\n return httpService.post('/space/layout/upload-layout', imgData);\r\n },\r\n saveLayoutLevels: function (data) {\r\n return httpService.testPost('/space/layout/save-layout-levels', data);\r\n },\r\n saveLayout: function (dto) {\r\n return httpService.post('/space/layout/save-layout', dto);\r\n },\r\n deleteLayout: function (idLayout) {\r\n return httpService.post('/space/layout/delete-layout', idLayout);\r\n },\r\n getLayouts: function () {\r\n return httpService.get('/space/layout/get-layouts');\r\n },\r\n getLayoutLevels: function (layoutId) {\r\n return httpService.get('/space/layout/get-layout-levels/' + layoutId);\r\n },\r\n getLayout: function (layoutId) {\r\n return httpService.get('/space/layout/get-layout/' + layoutId);\r\n },\r\n getLayoutItemSales: function (layoutId) {\r\n return httpService.get('/space/layout/get-layout-sales/' + layoutId);\r\n },\r\n getLayoutStoreSales: function (layoutId) {\r\n return httpService.get('/space/layout/get-layout-stores-sales/' + layoutId);\r\n },\r\n }\r\n\r\n self.spaceObjects = {\r\n getSpaceObjects: function (storeIds) {\r\n return httpService.post('/space/space-object/get-space-objects', storeIds);\r\n },\r\n savePlanogram: function (dto) {\r\n return httpService.post('/space/space-object/save-space-objects', dto);\r\n },\r\n }\r\n\r\n self.planograms = {\r\n getPlanogramId: function (itemId, clusterId) {\r\n return httpService.get('/space/planogram/get-planogram-id/' + itemId + '/' + clusterId);\r\n },\r\n getPlanogramInfo: function (planogramId) {\r\n return httpService.get('/space/planogram/get-planogram-info/' + planogramId);\r\n },\r\n getColumnsFromPlanogram: function (planogramId) {\r\n return httpService.get('/space/planogram/getColumnsFromPlanogram/' + planogramId);\r\n },\r\n savePlanogram: function (dto) {\r\n return httpService.post('/space/planogram/save-planogram', dto);\r\n },\r\n deletePlanogram: function (planogramId) {\r\n return httpService.post('/space/planogram/delete-planogram', planogramId);\r\n },\r\n getPlanograms: function () {\r\n return httpService.get('/space/planogram/get-planograms/');\r\n },\r\n getPlanogramsList: function () {\r\n return httpService.get('/space/planogram/get-planograms-list/');\r\n },\r\n getSpaceItemsForPlanogram: function (planogramId) {\r\n return httpService.get('/space/planogram/get-space-items-for-planogram/' + planogramId);\r\n },\r\n editPlanogram: function (dto, status) {\r\n return httpService.post('/space/planogram/edit-planogram/' + status , dto);\r\n },\r\n getChildCategories: function (categoryId) {\r\n return httpService.get('/space/planogram/get-child-categories/' + categoryId)\r\n },\r\n getPlanogramSales: function (planogramIds) {\r\n return httpService.post('/space/planogram/get-planogram-sales', planogramIds);\r\n },\r\n getStoresForPlanogram: function (planogramId) {\r\n return httpService.get('/space/planogram/get-stores-for-planogram/' + planogramId)\r\n },\r\n getItemsSalesForCluster: function (categoryId, clusterIds) {\r\n return httpService.post('/space/planogram/get-items-sales-for-cluster/' + categoryId, clusterIds)\r\n },\r\n savePhotoAudit: function (data) {\r\n return httpService.testPost('/space/planogram/save-photo-audit', data);\r\n },\r\n savePlanogramStorePhotoAudi: function (data) {\r\n return httpService.post('/space/planogram/save-planogram-store-photo-audit', data);\r\n },\r\n getPhotoAudit: function (planogramId) {\r\n return httpService.get('/space/planogram/get-photos-audit/' + planogramId)\r\n },\r\n buildPlanogramItemsReport: function (planogramId) {\r\n return httpService.get('/space/planogram/export-planogram-items/' + planogramId)\r\n },\r\n }\r\n\r\n self.reports = {\r\n buildItemsByAssortmentReport: function (activesItems) {\r\n return httpService.get('/space/reports/itemsByAssortmentReport/' + activesItems);\r\n },\r\n getLastReports: function () {\r\n return httpService.get('/space/reports/getLastReports');\r\n }\r\n }\r\n self.tickets = {\r\n getPlanogramTickets: function (layoutObjectId) {\r\n return httpService.get('/space/ticket/get-planogram-tickets/' + layoutObjectId);\r\n },\r\n getItemTickets: function (planogramLevelItemId) {\r\n return httpService.get('/space/ticket/get-item-tickets/' + planogramLevelItemId);\r\n },\r\n getTickets: function () {\r\n return httpService.get('/space/ticket/get-tickets');\r\n },\r\n getTicketTypesByType: function (type) {\r\n return httpService.get('/space/ticket/get-ticket-types-by-type/' + type);\r\n },\r\n getTicketTypes: function () {\r\n return httpService.get('/space/ticket/get-ticket-types/');\r\n },\r\n getTicketTypeById: function (id) {\r\n return httpService.get('/space/ticket/get-ticket-type/' + id);\r\n },\r\n saveTicketType: function (ticketType) {\r\n return httpService.post('/space/ticket/SaveTicketType/', ticketType);\r\n },\r\n saveTicket: function (ticket) {\r\n return httpService.post('/space/ticket/save-ticket', ticket);\r\n },\r\n editTicket: function (ticket) {\r\n return httpService.post('/space/ticket/edit-ticket', ticket);\r\n },\r\n addComment: function (comment) {\r\n return httpService.post('/space/ticket/add-comment', comment);\r\n },\r\n }\r\n\r\n self.tags = {\r\n getTags: function () {\r\n return httpService.get('/space/tags/getTags/');\r\n }\r\n }\r\n\r\n self.assortment = {\r\n getAssortment: function (categoryId, clusterIds) {\r\n return httpService.post('/space/assortment/getAssorment/' + categoryId, clusterIds);\r\n },\r\n }\r\n\r\n });","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n .service(\"queueService\", function (httpService, $window, $q) {\r\n var self = this;\r\n\r\n self.queuedTasks = {\r\n queue: [],\r\n getTop5: function () {\r\n var deferred = $q.defer();\r\n\r\n httpService.get('queuedtasks/tasks/' + 5).then(function (newTasks) {\r\n updateQueuedTasks(newTasks);\r\n deferred.resolve(newTasks);\r\n });\r\n\r\n return deferred.promise;\r\n },\r\n createDummyTask: function () {\r\n var deferred = $q.defer();\r\n\r\n httpService.post('queuedtasks/tasks/createDummy').then(function () {\r\n self.queuedTasks.getTop5().then(function () {\r\n deferred.resolve();\r\n });\r\n });\r\n\r\n return deferred.promise;\r\n },\r\n pendingTasksCount: function () {\r\n var c = 0;\r\n angular.forEach(self.queuedTasks.queue, function (task) {\r\n if (task.statusString === 'Queued' || task.statusString === 'InProgress')\r\n c++;\r\n });\r\n\r\n return c;\r\n }\r\n }\r\n\r\n var polling = false;\r\n var pollingIntervalId = null;\r\n function updateQueuedTasks(newTasks) {\r\n\r\n //OJO: esto siempre tiene que estar antes de actualizar self.queuedTasks.queue porque se compara contra las mismas para ver si cambiaron.\r\n showToastForChangedTasks(newTasks);\r\n\r\n //Actualizo las queuedTasks\r\n self.queuedTasks.queue = newTasks;\r\n\r\n //if all done then stop polling\r\n if (polling && self.queuedTasks.pendingTasksCount() === 0) {\r\n $window.clearInterval(pollingIntervalId);\r\n pollingIntervalId = null;\r\n polling = false;\r\n }\r\n\r\n //if pending work start polling\r\n if (!polling && self.queuedTasks.pendingTasksCount() > 0) {\r\n pollingIntervalId = $window.setInterval(self.queuedTasks.getTop5, 10000);\r\n polling = true;\r\n }\r\n }\r\n\r\n function showToastForChangedTasks(newTasks) {\r\n\r\n if (self.queuedTasks.queue && self.queuedTasks.queue.length > 0) {\r\n\r\n angular.forEach(self.queuedTasks.queue, function (task) {\r\n if (task.statusString === 'InProgress') {\r\n angular.forEach(newTasks, function (newTask) {\r\n if (newTask.id === task.id) {\r\n if (newTask.statusString === 'Succeeded') {\r\n toastr.success('La tarea finalizo correctamente', task.displayName, { timeOut: 5000, positionClass: \"toast-top-right\" })\r\n } else if (newTask.statusString === 'Failed') {\r\n toastr.error('Ocurrió un error ejecutando la tarea', task.displayName, { timeOut: 5000, positionClass: \"toast-top-right\" })\r\n }\r\n }\r\n })\r\n }\r\n if (task.statusString === 'Queued') {\r\n angular.forEach(newTasks, function (newTask) {\r\n if (newTask.id === task.id) {\r\n if (newTask.statusString === 'InProgress') {\r\n toastr.info('La tarea se comenzó a procesar', task.displayName, { timeOut: 5000, positionClass: \"toast-top-right\" })\r\n }\r\n else if (newTask.statusString === 'Succeeded') {\r\n toastr.success('La tarea finalizo correctamente', task.displayName, { timeOut: 5000, positionClass: \"toast-top-right\" })\r\n } else if (newTask.statusString === 'Failed') {\r\n toastr.error('Ocurrió un error ejecutando la tarea', task.displayName, { timeOut: 5000, positionClass: \"toast-top-right\" })\r\n }\r\n }\r\n })\r\n }\r\n\r\n });\r\n }\r\n\r\n }\r\n\r\n });","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n .service(\"promotionsService\", function promotionsService($rootScope, httpService, serverService, $http) {\r\n var self = this;\r\n\r\n self.stores = {\r\n getStores: function () {\r\n return httpService.get('/promotion/promotions/stores');\r\n },\r\n getStoreGroups: function () {\r\n return httpService.get('/promotion/promotions/storeGroups');\r\n },\r\n saveStoreGroup: function (storeGroup) {\r\n return httpService.post('/promotion/promotions/saveStoreGroup', storeGroup);\r\n },\r\n deleteGroup: function (storeGroupId) {\r\n return httpService.post('/promotion/promotions/deleteStoreGroup', storeGroupId);\r\n },\r\n getStore: function (storeId) {\r\n return httpService.get('/promotion/promotions/store/' + storeId);\r\n },\r\n getUserStores: function () {\r\n return httpService.get('/promotion/promotions/userStores');\r\n },\r\n getBrands: function () {\r\n return httpService.get('/promotion/promotions/brands');\r\n }\r\n }\r\n\r\n self.holidays = {\r\n getHolidays: function () {\r\n return httpService.get('/promotion/promotions/holidays');\r\n }\r\n }\r\n\r\n self.promotions = {\r\n getPromotions: function (history) {\r\n return httpService.get('/promotion/promotions/promotions/' + history);\r\n },\r\n getPromotionMediaPagesIds: function () {\r\n return httpService.get('/promotion/promotions/getPromotionMediaPagesIds/');\r\n },\r\n getPromotionsByAdvancedSearch: function (searchCriterions) {\r\n return httpService.post('/promotion/promotions/promotionsByAdvancedSearch', searchCriterions);\r\n },\r\n getPromotionsByReportFilters: function (filters) {\r\n return httpService.post('/promotion/promotions/promotionsByReportFilters', filters);\r\n },\r\n getPromotionsOverlapping: function () {\r\n return httpService.get('/promotion/promotions/promotionsOverlapping');\r\n },\r\n getRejectedPromotions: function () {\r\n return httpService.get('/promotion/promotions/rejectedPromotions');\r\n },\r\n getHistoricPromotions: function (dateRange) {\r\n return httpService.post('/promotion/promotions/historicPromotions', dateRange);\r\n },\r\n buildModifiedPromotions: function (dateRange, promotionId) {\r\n return httpService.post('/promotion/promotions/buildModifiedPromotions/' + promotionId, dateRange);\r\n },\r\n getPromotionsCalendar: function () {\r\n return httpService.get('/promotion/promotions/promotionsCalendar');\r\n },\r\n getPromotion: function (promotionId) {\r\n return httpService.get('/promotion/promotions/promotion/' + promotionId);\r\n },\r\n getPromotionForPricingClose: function (promotionId, categoryId, pageId) {\r\n return httpService.get('/promotion/promotions/promotionsPricingClose/' + promotionId + '/' + categoryId + '/' + pageId);\r\n },\r\n getPromotionDataForPricingClose: function (promotionId) {\r\n return httpService.get('/promotion/promotions/promotionDataPricingClose/' + promotionId);\r\n },\r\n savePricingClose: function (closePrices) {\r\n return httpService.post('/promotion/promotions/savePricingClose', closePrices);\r\n },\r\n deletePromotion: function (promotionId) {\r\n return httpService.post('/promotion/promotions/delete', promotionId);\r\n },\r\n rejectPromotion: function (promotionId) {\r\n return httpService.post('/promotion/promotions/reject', promotionId);\r\n },\r\n savePromotion: function (promotion) {\r\n return httpService.post('/promotion/promotions/save', promotion);\r\n },\r\n copyPromotion: function (promotion) {\r\n return httpService.post('/promotion/promotions/copy', promotion);\r\n },\r\n getPromotionPages: function (promotionId) {\r\n return httpService.get('/promotion/promotions/promotionPages/' + promotionId);\r\n },\r\n getPromotionPagesItems: function (promotionId) {\r\n return httpService.get('/promotion/promotions/promotionPagesItems/' + promotionId);\r\n },\r\n savePromotionMediaPages: function (promotion) {\r\n return httpService.post('/promotion/promotions/promotionMediaPages/save', promotion);\r\n },\r\n getPromotionMediaPage: function (promotionMediaPageId) {\r\n return httpService.get('/promotion/promotions/promotionPage/' + promotionMediaPageId);\r\n },\r\n getPromotionData: function (promotionId, promotionMediaPageId, position) {\r\n return httpService.get('/promotion/promotions/getPromotionData/' + promotionId + '/' + promotionMediaPageId + '/' + position);\r\n },\r\n informPromotion: function (promotionId, taskId) {\r\n return httpService.get('/promotion/promotions/informPromotion/' + promotionId + '/' + taskId);\r\n },\r\n comuicatePromotion: function (promotionId, taskId) {\r\n return httpService.get('/promotion/promotions/comunicatePromotion/' + promotionId + '/' + taskId);\r\n },\r\n getPromotionPageData: function (promotionId, promotionPageNumber) {\r\n return httpService.get('/promotion/promotions/getPromotionPageData/' + promotionId + '/' + promotionPageNumber);\r\n }\r\n }\r\n\r\n self.internalPromotions = {\r\n saveInternalPromotion: function (promotion) {\r\n return httpService.post('/promotion/promotions/saveInternal', promotion);\r\n },\r\n getInternalPromotion: function (promotionId) {\r\n return httpService.get('/promotion/promotions/getInternalPromotion/' + promotionId);\r\n },\r\n getRejectedPromotion: function (promotionId) {\r\n return httpService.get('/promotion/promotions/getRejectedPromotion/' + promotionId);\r\n },\r\n getPromotionItems: function (promotionMediaPageId) {\r\n return httpService.get('/promotion/promotions/promotionItems/' + promotionMediaPageId);\r\n },\r\n takeInternalPromotion: function (promotionId) {\r\n return httpService.get('/promotion/promotions/takeInternalPromotion/' + promotionId);\r\n },\r\n commentInternalPromotion: function (chat) {\r\n return httpService.post('/promotion/promotions/commentInternalPromotion', chat);\r\n },\r\n informNewInternalPromotion: function (promotionId) {\r\n return httpService.get('/promotion/promotions/informNewInternalPromotion/' + promotionId);\r\n },\r\n publishInternalPromotion: function (promotionId) {\r\n return httpService.get('/promotion/promotions/publishInternalPromotion/' + promotionId);\r\n },\r\n getOverlaps: function (promotionId) {\r\n return httpService.get('/promotion/promotions/getPromotionOverlaps/' + promotionId);\r\n },\r\n getPromotionMediaPageId: function (promotionId) {\r\n return httpService.get('/promotion/promotions/getPromotionMediaPageId/' + promotionId);\r\n }\r\n }\r\n\r\n self.rules = {\r\n\r\n getRuleParams: function () {\r\n return httpService.get('/promotion/promotions/ruleParams');\r\n },\r\n getRules: function () {\r\n return httpService.get('/promotion/promotions/rules');\r\n },\r\n getRulesFiltered: function (filters) {\r\n return httpService.post('/promotion/promotions/rules/filtered', filters);\r\n },\r\n getRule: function (ruleId) {\r\n return httpService.get('/promotion/promotions/rule/' + ruleId);\r\n },\r\n getRuleByCategory: function (categoryId) {\r\n return httpService.get('/promotion/promotions/rule/byCategory/' + categoryId);\r\n },\r\n getRulesByCategory: function (categoryId) {\r\n return httpService.get('/promotion/promotions/rules/byCategory/' + categoryId);\r\n },\r\n getExistingRules: function (rule) {\r\n return httpService.post('/promotion/promotions/rules/existingRules', rule);\r\n },\r\n saveRule: function (rule) {\r\n return httpService.post('/promotion/promotions/saveRule', rule);\r\n },\r\n deleteRule: function (ruleId) {\r\n return httpService.post('/promotion/promotions/deleteRule/' + ruleId);\r\n },\r\n extendRules: function (rules) {\r\n angular.forEach(rules, function (rule) {\r\n\r\n rule.getCompareToDescription = function () {\r\n //internas\r\n if (rule.comparesTo == 'NetworkMinimal') return 'Minimo Cadena';\r\n if (rule.comparesTo == 'Normal') return 'Normal ZB';\r\n if (rule.comparesTo == 'Active') return 'Vigente ZB';\r\n if (rule.comparesTo == 'NormalAverage') return 'Promedio Normal';\r\n if (rule.comparesTo == 'ActiveAverage') return 'Promedio Vigente';\r\n\r\n //externas\r\n if (rule.comparesTo == 'CompetitionLowest') return 'Competencia mas baja';\r\n if (rule.comparesTo == 'CompetitionAverage') return 'Competencia Promedio'; \r\n if (rule.comparesTo == 'SpecificCompetitor') return 'Competidor Especifico';\r\n if (rule.comparesTo == 'CompetitorGroup') return 'Grupo de Competidores';\r\n if (rule.comparesTo == 'CompetitionMode') return 'Moda';\r\n }\r\n\r\n rule.toString = function (htmlVersion) {\r\n var d = null;\r\n if (rule) {\r\n var mediaTypes = rule.mediaTypes.join(',');\r\n var pageTypes = rule.pageTypes.join(',');\r\n var itemTypes = rule.itemTypes.join(',');\r\n\r\n var text = 'Cuando un producto de {0} participe de {1} en {2} como {3} su precio promocional debe ser {4} {5} que {6}';\r\n var htmlText = 'Cuando un producto de {0} participe de {1} en {2} como {3} su precio promocional debe ser {4} {5} que {6}';\r\n\r\n d = ian.format(htmlVersion ? htmlText : text\r\n , rule.categoryName\r\n , rule.mediaTypes\r\n , rule.pageTypes\r\n , rule.itemTypes\r\n , rule.percentage ? rule.percentage + '%' : ''\r\n , rule.comparisonType == 'Equals' ? ' igual' : rule.comparisonType == 'Less' ? ' mas bajo' : ' mas alto'\r\n , rule.getCompareToDescription());\r\n }\r\n return d;\r\n }\r\n });\r\n }\r\n }\r\n\r\n self.campaigns = {\r\n getCampaigns: function () {\r\n return httpService.get('/promotion/campaigns/campaigns');\r\n },\r\n getCampaign: function (campaignId) {\r\n return httpService.get('/promotion/campaigns/campaign/' + campaignId);\r\n },\r\n deleteCampaign: function (campaignId) {\r\n return httpService.post('/promotion/campaigns/delete', campaignId);\r\n },\r\n saveCampaign: function (campaign) {\r\n return httpService.post('/promotion/campaigns/save', campaign);\r\n }\r\n }\r\n\r\n self.layouts = {\r\n getLayouts: function (deleted, assigned) {\r\n return httpService.get('/promotion/layouts/layouts/' + deleted + '/' + assigned);\r\n },\r\n getLayout: function (layoutId) {\r\n return httpService.get('/promotion/layouts/layout/' + layoutId);\r\n },\r\n deleteLayout: function (layoutId) {\r\n return httpService.post('/promotion/layouts/delete', layoutId);\r\n },\r\n saveLayout: function (layout) {\r\n return httpService.post('/promotion/layouts/save', layout);\r\n },\r\n uploadFile: function (file, companyId) {\r\n var fd = new FormData();\r\n fd.append(\"file\", file);\r\n\r\n return httpService.post('/promotion/layouts/uploadFile/' + companyId, fd, {\r\n headers: { 'Content-Type': undefined },\r\n transformRequest: angular.identity,\r\n data: fd,\r\n });\r\n },\r\n addPage: function (numberOfPages, promotionId) {\r\n return httpService.get('/promotion/layouts/addPage/' + numberOfPages + '/' + promotionId);\r\n },\r\n deletePage: function (mediaPageIdToDelete, promotionId) {\r\n return httpService.get('/promotion/layouts/deletePage/' + mediaPageIdToDelete + '/' + promotionId);\r\n },\r\n getCategoriesGroups: function () {\r\n return httpService.get('/promotion/layouts/getCategoriesGroups');\r\n },\r\n saveCategoriesGroup: function (group) {\r\n return httpService.post('/promotion/layouts/saveCategoriesGroup', group);\r\n },\r\n deleteCategoriesGroup: function (groupId) {\r\n return httpService.post('/promotion/layouts/deleteCategoriesGroup', groupId);\r\n },\r\n }\r\n\r\n self.items = {\r\n getItemInfo: function (promotionId, itemId, promotionItemId, saleUnitOfMeasureId) {\r\n return httpService.get('/promotion/items/getItemInfo/' + promotionId + '/' + itemId + '/' + promotionItemId + '/' + saleUnitOfMeasureId);\r\n },\r\n getItemDailyInventory: function (promotionId, itemId, promotionItemId) {\r\n return httpService.get('/promotion/items/getItemDailyInventory/' + promotionId + '/' + itemId + '/' + promotionItemId);\r\n },\r\n getItemOverlaps: function (promotionId, itemId, salesUnitOfMeasureId, promotionMediaPageId, position) {\r\n return httpService.get('/promotion/items/getItemOverlaps/' + promotionId + '/' + itemId + '/' + salesUnitOfMeasureId + '/' + promotionMediaPageId + '/' + position);\r\n },\r\n savePromotionItem: function (item) {\r\n return httpService.post('/promotion/items/save', item);\r\n },\r\n savePromotionVariantItem: function (itemId, promotionItemId, salesUnitOfMeasureId) {\r\n return httpService.get('/promotion/items/saveVariant/' + itemId + '/' + promotionItemId + '/' + salesUnitOfMeasureId);\r\n },\r\n saveReservedItem: function (promotionPageId, position, isHighlighted, description) {\r\n return httpService.get('/promotion/items/saveReservedItem/' + promotionPageId + '/' + position + '/' + isHighlighted + '/' + description);\r\n },\r\n saveReview: function (item) {\r\n return httpService.post('promotion/items/saveReview', item);\r\n },\r\n deletePromotionItem: function (promotionItemId) {\r\n return httpService.post('/promotion/items/delete', promotionItemId);\r\n },\r\n deleteItemChat: function (chatId) {\r\n return httpService.get('/promotion/items/deleteChat/' + chatId);\r\n },\r\n loadItemChats: function (promotionItemId, inPriceTask) {\r\n return httpService.get('/promotion/items/loadItemChats/' + promotionItemId + '/' + inPriceTask);\r\n },\r\n loadItemsChats: function (promotionItemIds, inPriceTask) {\r\n return httpService.post('/promotion/items/loadItemsChats/' + inPriceTask, promotionItemIds);\r\n },\r\n saveChat: function (chat) {\r\n return httpService.post('/promotion/items/saveChat', chat);\r\n },\r\n getItemsForecast: function (promotionId) {\r\n return httpService.get('/promotion/items/forecast/' + promotionId);\r\n },\r\n validateForecasts: function (promotionId) {\r\n return httpService.post('/promotion/items/validateForecast/' + promotionId);\r\n },\r\n updateForecasts: function (promotionId) {\r\n return httpService.post('/promotion/items/updateForecast/' + promotionId);\r\n },\r\n validateItemsBatchFile: function (promotionPageId) {\r\n return httpService.post('/promotion/items/validateItemsBatchFile/' + promotionPageId);\r\n },\r\n updateItemsInBatch: function (promotionPageId) {\r\n return httpService.post('/promotion/items/updateItemsInBatch/' + promotionPageId);\r\n },\r\n getVariants: function (itemId) {\r\n return httpService.get('/promotion/items/getVariantItems/' + itemId);\r\n },\r\n getPromotionVariants: function (promotionItemId) {\r\n return httpService.get('/promotion/items/getPromotionVariantItems/' + promotionItemId);\r\n },\r\n swapPositions: function (promotionMediaPageId, itemFrom, itemTo) {\r\n return httpService.get('/promotion/items/swapPositions/' + promotionMediaPageId + '/' + itemFrom + '/' + itemTo);\r\n },\r\n publishItem: function (promotionMediaPageId, itemId, positionTo, positionToIsHighlighted) {\r\n return httpService.get('/promotion/items/publishItem/' + promotionMediaPageId + '/' + itemId + '/' + positionTo + '/' + positionToIsHighlighted);\r\n },\r\n getPromotionItemStores: function (promotionId, page) {\r\n return httpService.get('/promotion/items/getPromotionItemStores/' + promotionId + '/' + page);\r\n },\r\n validateItemExhibitionsBatchFile: function (promotionPageId) {\r\n return httpService.post('/promotion/items/validateItemExhibitionsBatchFile/' + promotionPageId);\r\n },\r\n updateItemExhibitionsInBatch: function (promotionPageId) {\r\n return httpService.post('/promotion/items/updateItemExhibitionsInBatch/' + promotionPageId);\r\n },\r\n validateItemsBatchFileInternal: function (promotionPageId) {\r\n return httpService.post('/promotion/items/validateItemsBatchFileInternal/' + promotionPageId);\r\n },\r\n updateItemsInBatchInternal: function (promotionPageId) {\r\n return httpService.post('/promotion/items/updateItemsInBatchInternal/' + promotionPageId);\r\n },\r\n validateChatsBatchFile: function (guid, promotionId) {\r\n return httpService.post('/promotion/items/validateChatsBatchFile/' + guid + '/' + promotionId);\r\n },\r\n updateChatsInBatch: function (guid, promotionId) {\r\n return httpService.post('/promotion/items/updateChatsInBatch/' + guid + '/' + promotionId);\r\n },\r\n getLastPromotionItem: function (flag, itemId) {\r\n return httpService.get('/promotion/items/getLastPromotionItem/' + flag + '/' + itemId);\r\n },\r\n getCompetitivePrice: function (promotionMediaPageId, promotionItemType, itemId, saleUnitOfMeasureId) {\r\n return httpService.get('/promotion/items/getCompetitivePrice/' + promotionMediaPageId + '/' + promotionItemType + '/' + itemId + '/' + saleUnitOfMeasureId);\r\n },\r\n getForecast: function (itemId, promotionMediaPageId, isHighlighted) {\r\n return httpService.get('/promotion/items/getForecast/' + itemId + '/' + promotionMediaPageId + '/' + isHighlighted);\r\n },\r\n getCompetitivePrices: function (promotionItemsParamDto) {\r\n return httpService.post('/promotion/items/getCompetitivePrices', promotionItemsParamDto);\r\n }\r\n }\r\n\r\n self.mechanics = {\r\n getMechanicCategories: function () {\r\n return httpService.get('/promotion/mechanics/getMechanicCategories');\r\n },\r\n getMechanicVendors: function () {\r\n return httpService.get('/promotion/mechanics/getMechanicVendors');\r\n },\r\n getMechanicItems: function () {\r\n return httpService.get('/promotion/mechanics/getMechanicItems/');\r\n },\r\n getPromotionInfo: function (promotionId) {\r\n return httpService.get('/promotion/mechanics/getPromotionInfo/' + promotionId);\r\n },\r\n getPromotionStores: function (promotionId) {\r\n return httpService.get('/promotion/mechanics/getPromotionStores/' + promotionId);\r\n },\r\n saveMechanic: function (mechanic) {\r\n return httpService.post('/promotion/mechanics/savePromotionMechanic', mechanic);\r\n },\r\n savePanguiCode: function (mechanicId, panguiCode) {\r\n return httpService.get('/promotion/mechanics/savePanguiCode/' + mechanicId + '/' + panguiCode);\r\n },\r\n saveReview: function (mechanic) {\r\n return httpService.post('/promotion/mechanics/saveReview', mechanic);\r\n },\r\n getItemForMechanic: function (itemId, umvCode, promotionId) {\r\n return httpService.get('/promotion/mechanics/getItemForMechanic/' + itemId + '/' + umvCode + '/' + promotionId);\r\n },\r\n getItemsForMechanic: function (massiveLoadParam) {\r\n return httpService.post('/promotion/mechanics/getItemsForMechanic', massiveLoadParam);\r\n },\r\n getMechanicInfo: function (promotionId, promotionMechanicId) {\r\n return httpService.get('/promotion/mechanics/getMechanicInfo/' + promotionId + '/' + promotionMechanicId);\r\n },\r\n deleteMechanicItemOrCategory: function (itemOrCategoryId, isCategory, promotionId) {\r\n return httpService.get('/promotion/mechanics/deleteMechanicItemOrCategory/' + itemOrCategoryId + '/' + isCategory + '/' + promotionId);\r\n },\r\n deleteAllSelection: function (mechanicId, isExtra, promotionId) {\r\n return httpService.get('/promotion/mechanics/deleteAllSelection/' + mechanicId + '/' + isExtra + '/' + promotionId);\r\n },\r\n saveChat: function (chat) {\r\n return httpService.post('/promotion/mechanics/saveChat', chat);\r\n },\r\n validateItemsBatchFile: function (guid, pageId) {\r\n return httpService.post('/promotion/mechanics/validateItemsBatchFile/' + guid + '/' + pageId);\r\n },\r\n updateItemsInBatch: function (guid, promotionId) {\r\n return httpService.post('/promotion/mechanics/updateItemsInBatch/' + guid + '/' + promotionId);\r\n },\r\n getMechanicOverlaps: function (overlaps) {\r\n return httpService.post('/promotion/mechanics/getMechanicOverlaps', overlaps);\r\n }\r\n\r\n }\r\n\r\n self.workflows = {\r\n getWorkflows: function (loadTasks) {\r\n return httpService.get('/promotion/workflows/workflows/' + loadTasks);\r\n },\r\n getWorkflow: function (workflowId) {\r\n return httpService.get('/promotion/workflows/workflow/' + workflowId);\r\n },\r\n deleteWorkflow: function (workflowId) {\r\n return httpService.post('/promotion/workflows/delete', workflowId);\r\n },\r\n saveWorkflow: function (workflow) {\r\n return httpService.post('/promotion/workflows/save', workflow);\r\n },\r\n cloneWorkflow: function (workflow, workflowToCloneId) {\r\n return httpService.post('/promotion/workflows/clone/' + workflowToCloneId, workflow);\r\n },\r\n removeTask: function (taskToRemove) {\r\n return httpService.post('/promotion/workflows/removeTask', taskToRemove);\r\n },\r\n isWorkflowInUse: function (workflowId) {\r\n return httpService.get('/promotion/workflows/isWorkflowInUse/' + workflowId);\r\n }\r\n }\r\n\r\n self.tasks = {\r\n getTasks: function () {\r\n return httpService.get('/promotion/tasks/tasks');\r\n },\r\n getTask: function (taskId) {\r\n return httpService.get('/promotion/tasks/task/' + taskId);\r\n },\r\n getTaskName: function (taskId) {\r\n return httpService.get('/promotion/tasks/getTaskName/' + taskId);\r\n },\r\n getUserTasks: function (promotion) {\r\n return httpService.get('/promotion/tasks/userTasks');\r\n },\r\n getTasksByPromotion: function (promotionId) {\r\n return httpService.get('/promotion/tasks/getTasksByPromotion/' + promotionId);\r\n },\r\n publishTask: function (taskId, mediaPageId) {\r\n return httpService.post('/promotion/tasks/publish/' + taskId + '/' + mediaPageId);\r\n },\r\n startTask: function (taskId) {\r\n return httpService.post('/promotion/tasks/start/' + taskId);\r\n },\r\n canStartTask: function (taskId) {\r\n return httpService.post('/promotion/tasks/canStartTask/' + taskId);\r\n },\r\n takeIssuesSnapshot: function (taskId) {\r\n return httpService.post('/promotion/tasks/takeIssuesSnapshot/' + taskId);\r\n },\r\n writePromotionPrices: function (promotionId) {\r\n return httpService.get('/promotion/tasks/writePromotionPrices/' + promotionId);\r\n },\r\n canPublishActivation: function (promotionId) {\r\n return httpService.get('/promotion/tasks/canPublishActivation/' + promotionId);\r\n },\r\n getTaskIssues: function (taskId) {\r\n return httpService.post('/promotion/tasks/getTaskIssues/' + taskId);\r\n },\r\n checkTasksStartOrEnd: function () {\r\n return httpService.get('/promotion/tasks/checkTasksStartOrEnd');\r\n }\r\n }\r\n\r\n self.communications = {\r\n getCommunication: function (promotionId) {\r\n return httpService.get('/promotion/promotions/communication/' + promotionId);\r\n },\r\n getCommunications: function () {\r\n return httpService.get('/promotion/promotions/communications');\r\n },\r\n getHistoricCommunications: function (dateRange) {\r\n return httpService.post('/promotion/promotions/communications-historic', dateRange);\r\n },\r\n setCommunicationFile: function (paramsDto) {\r\n return httpService.post('/promotion/promotions/setCommunicationFile', paramsDto);\r\n },\r\n notificateAllPromotionsToStores: function () {\r\n return httpService.get('/promotion/promotions/notificateAllPromotionsToStores');\r\n },\r\n }\r\n\r\n self.controlPanel = {\r\n getPromotionsStatus: function () {\r\n return httpService.get('/promotion/promotions/promotionsStatus');\r\n }\r\n }\r\n\r\n self.reports = {\r\n buildItemTasksReport: function (promotionId) {\r\n return httpService.get('/promotion/reports/itemTasks/' + promotionId);\r\n },\r\n buildStoreItemTasksReport: function (promotionId) {\r\n return httpService.get('/promotion/reports/storeItemTasks/' + promotionId);\r\n },\r\n buildItemStoreReport: function (promotionId) {\r\n return httpService.get('/promotion/reports/itemStore/' + promotionId);\r\n },\r\n buildItemBarCodesReport: function (promotionId) {\r\n return httpService.get('/promotion/reports/itemBarCodes/' + promotionId);\r\n },\r\n buildCommentsReport: function (promotionId) {\r\n return httpService.get('/promotion/reports/comments/' + promotionId);\r\n },\r\n buildIBIReport: function (planned) {\r\n return httpService.get('/promotion/reports/BI/' + planned);\r\n },\r\n getLastBIReports: function () {\r\n return httpService.get('/promotion/reports/lastBIReports');\r\n },\r\n buildOverlappingReport: function (promotionId) {\r\n return httpService.get('/promotion/reports/overlapping/' + promotionId);\r\n },\r\n buildMarkdownItemsReport: function (markdownReportDto) {\r\n return httpService.post('/promotion/reports/markdownItems', markdownReportDto);\r\n },\r\n buildPricesReport: function (promotionId) {\r\n return httpService.get('/promotion/reports/prices/' + promotionId);\r\n },\r\n buildPriceSurveyReport: function (promotionId) {\r\n return httpService.get('/promotion/reports/priceSurvey/' + promotionId);\r\n },\r\n buildPromotionReport: function (dto) {\r\n return httpService.post('/promotion/reports/buildPromotionReport/', dto);\r\n }\r\n }\r\n\r\n self.colors = ['#1ab394', '#1c84c6', '#f8ac59', '#ED5565', '#23c6c8', '#a7acaf', '#8fe6d4', '#fbd4a9', '#c2c2c2', '#a2c1d5', '#1ab394', '#1c84c6', '#f8ac59', '#ED5565', '#23c6c8', '#676a6c', '#8fe6d4', '#fbd4a9', '#c2c2c2', '#a2c1d5', '#1ab394', '#1c84c6', '#f8ac59', '#ED5565', '#23c6c8', '#676a6c', '#8fe6d4', '#fbd4a9', '#c2c2c2', '#a2c1d5'];\r\n\r\n self.promotionMediaTypes = [\r\n {\r\n id: 1,\r\n label: 'Encarte',\r\n },\r\n {\r\n id: 2,\r\n label: 'Suplemento',\r\n },\r\n {\r\n id: 3,\r\n label: 'Desplegable',\r\n },\r\n {\r\n id: 4,\r\n label: 'Volante',\r\n },\r\n {\r\n id: 5,\r\n label: 'Televisiva',\r\n },\r\n {\r\n id: 6,\r\n label: 'Interna',\r\n },\r\n //{\r\n // id: 7,\r\n // label: 'Comunicacion',\r\n //},\r\n {\r\n id: 8,\r\n label: 'Diptico',\r\n },\r\n {\r\n id: 9,\r\n label: 'AvisoDePrensa',\r\n }\r\n //{\r\n // id: 10,\r\n // label: 'Otras',\r\n //}\r\n ];\r\n\r\n self.userRoles = ['Abastecimiento', 'Jefe de Promociones', 'Analista Pricing', 'BI', 'Category', 'Comercial', 'Control de Gestion', 'Demand Planning', 'Jefe de Pricing', 'Desarrollo', 'Gerente Tienda', 'Jefe Comercial', 'Marketing', 'Operaciones', 'Pricing', 'Promociones', 'Analista Seg. y Ctrol.', 'Analista Comercial', 'Analista de Promociones', 'Asistente Tienda', 'Banco Cencosud', 'Responsable carteler�a'];\r\n\r\n //cuando se asigna un responsable a una tarea de un Wle asignamos un area agrupadora de roles\r\n self.userAreas = ['Abastecimiento', 'Banco Cencosud', 'Category', 'Comercial', 'Comercial - Perecibles', 'Finanzas', 'Administracion de espacios', 'Desarrollo comercial', 'Visual merchandising', 'Promociones Ejecucion', 'Promociones Seguimiento', 'Promociones Reporting', 'Operaciones Centralizado', 'BI', 'E-Commerce', 'Demand Planning', 'Marketing', 'Operaciones', 'Pricing'];\r\n\r\n self.getUserRolesByArea = function (userArea) {\r\n var userRoles = [];\r\n switch (userArea) {\r\n case \"Comercial\":\r\n userRoles.push(\"Comercial\");\r\n userRoles.push(\"Jefe Comercial\");\r\n userRoles.push(\"Analista Comercial\");\r\n break;\r\n case \"Comercial - Perecibles\":\r\n userRoles.push(\"Comercial - Perecibles\");\r\n break;\r\n case \"Banco Cencosud\":\r\n userRoles.push(\"Banco Cencosud\");\r\n break;\r\n case \"Abastecimiento\":\r\n userRoles.push(\"Abastecimiento\");\r\n break;\r\n case \"Finanzas\":\r\n userRoles.push(\"Control de Gestion\");\r\n break;\r\n case \"Category\":\r\n userRoles.push(\"Category\");\r\n userRoles.push(\"Jefe Category\");\r\n break;\r\n case \"Operaciones\":\r\n userRoles.push(\"Gerente Tienda\");\r\n userRoles.push(\"Asistente Tienda\");\r\n break;\r\n case \"Administracion de espacios\":\r\n userRoles.push(\"Admin. Espacios\");\r\n break;\r\n case \"Marketing\":\r\n userRoles.push(\"Marketing\");\r\n break;\r\n case \"Desarrollo comercial\":\r\n userRoles.push(\"Desarrollo\");\r\n break;\r\n case \"Visual merchandising\":\r\n userRoles.push(\"Visual\");\r\n break;\r\n case \"Pricing\":\r\n userRoles.push(\"Jefe de pricing\");\r\n userRoles.push(\"Analista Pricing\");\r\n break;\r\n case \"Promociones\":\r\n userRoles.Add(\"Jefe de Promociones\");\r\n userRoles.Add(\"Analista de Promociones\");\r\n userRoles.Add(\"Jefe Seg. y Ctrol.\");\r\n userRoles.Add(\"Analista Seg. y Ctrol.\");\r\n userRoles.Add(\"Jefe Reporting\");\r\n userRoles.Add(\"Analista Reporting\");\r\n break;\r\n case \"Promociones Ejecucion\":\r\n userRoles.push(\"Jefe de Promociones\");\r\n userRoles.push(\"Analista de Promociones\");\r\n break;\r\n case \"Promociones Seguimiento\":\r\n userRoles.push(\"Jefe Seg. y Ctrol.\");\r\n userRoles.push(\"Analista Seg. y Ctrol.\");\r\n break;\r\n case \"Promociones Reporting\":\r\n userRoles.push(\"Jefe Reporting\");\r\n userRoles.push(\"Analista Reporting\");\r\n break;\r\n case \"Operaciones Centralizado\":\r\n userRoles.push(\"Responsable carteler�a\");\r\n break;\r\n case \"BI\":\r\n userRoles.push(\"BI\");\r\n break;\r\n case \"Demand Planning\":\r\n userRoles.push(\"Demand Planning\");\r\n break;\r\n case \"E - Commerce\":\r\n userRoles.push(\"E - Commerce\");\r\n break;\r\n }\r\n return userRoles;\r\n }\r\n\r\n self.getUserAreasByRole = function (userRole) {\r\n var userAreas = [];\r\n switch (userRole) {\r\n case \"Comercial\":\r\n userAreas.push(\"Comercial\");\r\n break;\r\n case \"Jefe Comercial\":\r\n userAreas.push(\"Comercial\");\r\n break;\r\n case \"Analista Comercial\":\r\n userAreas.push(\"Comercial\");\r\n break;\r\n case \"Comercial - Perecibles\":\r\n userAreas.push(\"Comercial - Perecibles\");\r\n break;\r\n case \"Banco Cencosud\":\r\n userAreas.push(\"Banco Cencosud\");\r\n break;\r\n case \"Abastecimiento\":\r\n userAreas.push(\"Abastecimiento\");\r\n break;\r\n case \"Control de Gestion\":\r\n userAreas.push(\"Finanzas\");\r\n break;\r\n case \"Category\":\r\n userAreas.push(\"Category\");\r\n break;\r\n case \"Jefe Category\":\r\n userAreas.push(\"Category\");\r\n break;\r\n case \"Gerente Tienda\":\r\n userAreas.push(\"Operaciones\");\r\n break;\r\n case \"Asistente Tienda\":\r\n userAreas.push(\"Operaciones\");\r\n break;\r\n case \"Admin. Espacios\":\r\n userAreas.push(\"Administracion de espacios\");\r\n break;\r\n case \"Marketing\":\r\n userAreas.push(\"Marketing\");\r\n break;\r\n case \"Desarrollo\":\r\n userAreas.push(\"Desarrollo Comercial\");\r\n break;\r\n case \"Visual\":\r\n userAreas.push(\"Visual Merchandising\");\r\n break;\r\n case \"Jefe de Pricing\":\r\n userAreas.push(\"Pricing\");\r\n break;\r\n case \"Analista Pricing\":\r\n userAreas.push(\"Pricing\");\r\n break;\r\n case \"Jefe de Promociones\":\r\n userAreas.push(\"Promociones\");\r\n userAreas.push(\"Promociones Ejecucion\");\r\n break;\r\n case \"Analista de Promociones\":\r\n userAreas.push(\"Promociones\");\r\n userAreas.push(\"Promociones Ejecucion\");\r\n break;\r\n case \"Jefe Seg. y Ctrol\":\r\n userAreas.push(\"Promociones\");\r\n userAreas.push(\"Promociones Seguimiento\");\r\n break;\r\n case \"Analista Seg. y Ctrol.\":\r\n userAreas.push(\"Promociones\");\r\n userAreas.push(\"Promociones Seguimiento\");\r\n break;\r\n case \"Jefe Reporting\":\r\n userAreas.push(\"Promociones\");\r\n userAreas.push(\"Promociones Reporting\");\r\n break;\r\n case \"Analista Reporting\":\r\n userAreas.push(\"Promociones\");\r\n userAreas.push(\"Promociones Reporting\");\r\n break;\r\n case \"Responsable carteler�a\":\r\n userAreas.push(\"Operaciones Centralizado\");\r\n break;\r\n case \"BI\":\r\n userAreas.push(\"BI\");\r\n break;\r\n case \"Demand Planning\":\r\n userAreas.push(\"Demand Planning\");\r\n break;\r\n case \"E - Commerce\":\r\n userAreas.push(\"E - Commerce\");\r\n break;\r\n default:\r\n userAreas.push(\"Todos\");\r\n break\r\n }\r\n return userAreas;\r\n }\r\n\r\n self.promotionMediaPageTypes = [\r\n {\r\n id: 1,\r\n label: 'Caratula',\r\n },\r\n {\r\n id: 2,\r\n label: 'Contracaratula',\r\n },\r\n {\r\n id: 3,\r\n label: 'Pagina',\r\n }\r\n ];\r\n\r\n self.promotionMechanicTypes = [\r\n {\r\n id: 1,\r\n label: 'AxB',\r\n },\r\n {\r\n id: 2,\r\n label: 'Coleccionable',\r\n },\r\n {\r\n id: 3,\r\n label: 'Compra A+ $ Lleva B',\r\n },\r\n {\r\n id: 4,\r\n label: 'Compra A y lleva B Gratis',\r\n },\r\n {\r\n id: 5,\r\n label: 'Compra x$ en A y lleva B Gratis',\r\n },\r\n {\r\n id: 6,\r\n label: 'Cupon de Descuento',\r\n },\r\n {\r\n id: 7,\r\n label: 'Cuponera de Descuento',\r\n },\r\n {\r\n id: 8,\r\n label: 'x de Descuento',\r\n },\r\n {\r\n id: 9,\r\n label: 'x% de Descuento por Dia',\r\n },\r\n {\r\n id: 10,\r\n label: 'Pack Virtual',\r\n },\r\n {\r\n id: 11,\r\n label: 'Mensaje',\r\n },\r\n {\r\n id: 12,\r\n label: 'x Interes a Y Cuotas',\r\n },\r\n {\r\n id: 13,\r\n label: 'Compra A y lleva B con x de descuento',\r\n },\r\n {\r\n id: 14,\r\n label: 'Electro Fans',\r\n },\r\n {\r\n id: 15,\r\n label: 'Descuento por Hora',\r\n },\r\n {\r\n id: 16,\r\n label: 'Precios Multiples',\r\n },\r\n {\r\n id: 17,\r\n label: 'Mega Promo',\r\n },\r\n {\r\n id: 18,\r\n label: 'Desc en Vales de Compra',\r\n },\r\n //{\r\n // id: 19,\r\n // label: 'Couponing',\r\n // },\r\n {\r\n id: 20,\r\n label: 'Precio-Producto Masivo',\r\n }\r\n ];\r\n\r\n self.promotionMechanicAnnouncementTypes = [\r\n //{\r\n // id: 0,\r\n // label: 'No posee',\r\n //},\r\n {\r\n id: 1,\r\n label: 'Foto precio',\r\n },\r\n {\r\n id: 2,\r\n label: 'Cuarto de pagina',\r\n },\r\n {\r\n id: 3,\r\n label: 'Tercio de pagina',\r\n },\r\n {\r\n id: 4,\r\n label: 'Media pagina',\r\n },\r\n {\r\n id: 5,\r\n label: 'Pagina',\r\n },\r\n {\r\n id: 6,\r\n label: 'Caratula',\r\n },\r\n {\r\n id: 7,\r\n label: 'Contra Caratula',\r\n }\r\n ];\r\n\r\n self.promotionMechanicPaymentTypes = [\r\n\r\n //{\r\n // id: 0,\r\n // label: 'No posee', \r\n //},\r\n {\r\n id: 1,\r\n label: 'Cobro (factura)',\r\n },\r\n {\r\n id: 2,\r\n label: 'Acuerdo comercial',\r\n },\r\n //{\r\n // id: 3,\r\n // label: 'Uso propio',\r\n //},\r\n //{\r\n // id: 4,\r\n // label: 'Importado',\r\n //},\r\n {\r\n id: 5,\r\n label: 'Cedido',\r\n }\r\n ];\r\n\r\n self.promotionExhibitionType = [\r\n { value: 1, name: ' CABECERAS ALTAS' },\r\n { value: 2, name: 'CABECERAS TOCADOR' },\r\n { value: 3, name: 'CABECERAS PASILLO' },\r\n { value: 4, name: 'CABECERAS LICORES' },\r\n { value: 5, name: 'CABECERAS DE FRIO' },\r\n { value: 6, name: 'LATERALES' },\r\n { value: 7, name: 'EXHIBIDORES DE PIE' },\r\n { value: 8, name: 'VISICOOLER GRANDES' },\r\n { value: 9, name: 'VISICOOLER CHICOS' },\r\n { value: 10, name: 'FAST LINE' },\r\n { value: 11, name: 'VENTA CRUZADA - GANCHOS' },\r\n { value: 12, name: 'VENTA CRUZADA - DISPENSADOR' },\r\n { value: 13, name: 'VENTA CRUZADA - S/COOLER' },\r\n { value: 14, name: 'MINI CABECERAS' },\r\n { value: 15, name: 'MESA DE CARGA' },\r\n { value: 16, name: 'ISLA' },\r\n { value: 17, name: 'COLUMNA' },\r\n { value: 18, name: 'FILA UNICA' },\r\n { value: 19, name: 'FILA UNICA ZONA FRONTAL' },\r\n { value: 20, name: 'BTL' }\r\n ];\r\n\r\n self.calculateTariff = function (brand, announcementType) {\r\n var tariff = 0;\r\n if (brand == \"Wong\") {\r\n switch (announcementType) {\r\n case 1: tariff = 6000;\r\n break;\r\n case 2: tariff = 10000;\r\n break;\r\n case 3: tariff = 18000;\r\n break;\r\n case 4: tariff = 20000;\r\n break;\r\n case 5: tariff = 40000;\r\n break;\r\n case 6: tariff = 50000;\r\n break;\r\n case 7: tariff = 45000;\r\n break;\r\n }\r\n }\r\n if (brand == \"Metro\") {\r\n switch (announcementType) {\r\n case 1: tariff = 5000;\r\n break;\r\n case 2: tariff = 8000;\r\n break;\r\n case 3: tariff = 10000;\r\n break;\r\n case 4: tariff = 15000;\r\n break;\r\n case 5: tariff = 30000;\r\n break;\r\n case 6: tariff = 40000;\r\n break;\r\n case 7: tariff = 35000;\r\n break;\r\n }\r\n }\r\n return tariff;\r\n }\r\n\r\n self.getIssueName = function (value) {\r\n var rv = \"\";\r\n switch (value) {\r\n case 1: rv = \"Ubicaciones sin art asignado\";\r\n break;\r\n case 2: rv = \"Ubicaciones sin foto o con foto no oficial\";\r\n break;\r\n case 3: rv = \"Art�culos con al menos 1 tienda con menos de x DDS\";\r\n break;\r\n case 4: rv = \"Pron�stico fuera de rango sugerido\";\r\n break;\r\n case 5: rv = \"Art�culos x encima del sugerido o por debajo del 15%\";\r\n break;\r\n case 6: rv = \"Art�culos no catalogados en todas las tiendas activas definidas\";\r\n break;\r\n case 7: rv = \"Art�culo sin precio promocional\";\r\n break;\r\n }\r\n return rv;\r\n }\r\n\r\n });","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n .service(\"priceService\", function categoryService( $q, $rootScope, httpService, $translate) {\r\n var self = this;\r\n\r\n self.getPricesPromise;\r\n self.getPriceDashboardPromise;\r\n self.lastCategoryId = 0;\r\n self.lastEndorse = null;\r\n\r\n self.costs = {\r\n getCurrentCosts: function () {\r\n return httpService.get('/price/costs/getCurrentCosts');\r\n },\r\n getVendors: function () {\r\n return httpService.get('/price/costs/getVendors');\r\n },\r\n getItems: function () {\r\n return httpService.get('/price/costs/getItems');\r\n },\r\n getDistributionCenters: function () {\r\n return httpService.get('/price/costs/getDistributionCenters');\r\n },\r\n save: function (cost) {\r\n return httpService.post('/price/costs/save', cost);\r\n },\r\n saveAndGenerateSuggestions: function () {\r\n return httpService.post('/price/costs/saveAndGenerateSuggestions');\r\n }\r\n }\r\n\r\n self.decisions = {\r\n getKpiDashboardYTD: function (itemId, priceListId, sameStores, type) {\r\n return httpService.get('/price/decisions/price-dashboard/kpi-ytd-comparison/' + itemId + '/' + priceListId + '/' + sameStores + '/' + type);\r\n },\r\n getKPIDashboardCompetitorsPrices: function (parameters) {\r\n return httpService.post('/price/decisions/price-dashboard/getKPIDashboardCompetitorsPrices', parameters);\r\n },\r\n getCategorySummary: function (categoryMinLevel) {\r\n return httpService.get('/price/decisions/category-summary/' + categoryMinLevel);\r\n },\r\n getPriceDashboard: function (categoryId) {\r\n var fetchDataFromServer = false;\r\n if (self.lastCategoryId != categoryId || !self.getPriceDashboardPromise) {\r\n fetchDataFromServer = true;\r\n }\r\n if (fetchDataFromServer) {\r\n self.getPriceDashboardPromise = httpService.get('/price/decisions/price-dashboard/' + $rootScope.companyId + '/' + categoryId);\r\n }\r\n\r\n return self.getPriceDashboardPromise;\r\n },\r\n\r\n getPriceDashboardItem: function (categoryId, itemId) {\r\n\r\n //if (self.lastCategoryId != categoryId || !self.getPriceDashboardPromise) {\r\n return httpService.get('/price/decisions/price-dashboard/' + $rootScope.companyId + '/' + categoryId + '/' + itemId);\r\n //}\r\n },\r\n\r\n getPriceDashboardItemPriceList: function (categoryId, itemId, priceListId, sameStores) {\r\n\r\n //if (self.lastCategoryId != categoryId || !self.getPriceDashboardPromise) {\r\n return httpService.get('/price/decisions/price-dashboard/' + $rootScope.companyId + '/' + categoryId + '/' + itemId + '/' + priceListId + '/' + sameStores);\r\n //}\r\n },\r\n getPrices: function (categoryId, isEndorse, selectedStatus) {\r\n\r\n return httpService.get('/price/decisions/' + $rootScope.companyId + '/' + categoryId + '/' + isEndorse + '/' + selectedStatus);\r\n /*\r\n var fetchDataFromServer = false;\r\n if (self.lastCategoryId != categoryId || self.lastEndorse != isEndorse || !self.getPricesPromise) {\r\n fetchDataFromServer = true;\r\n }\r\n if (fetchDataFromServer) {\r\n self.getPricesPromise = httpService.get('/price/decisions/' + $rootScope.companyId + '/' + categoryId + '/' + isEndorse);\r\n }\r\n\r\n return self.getPricesPromise;\r\n */\r\n },\r\n getCompetitorsGroupPrices: function (itemId, priceListId) {\r\n\r\n return httpService.get('/price/decisions/getCompetitorsGroupPrices/' + itemId + '/' + priceListId);\r\n },\r\n getVolumeMeasurement_OXXO: function (itemId, storeId) {\r\n\r\n return httpService.get('/price/decisions/getVolumeMeasurement_OXXO/' + itemId + '/' + storeId);\r\n },\r\n getVolumeMeasurementAnnual_OXXO: function (itemId, storeId) {\r\n\r\n return httpService.get('/price/decisions/getVolumeMeasurementAnnual_OXXO/' + itemId + '/' + storeId);\r\n },\r\n\r\n getCompetitorsGroupPricesByPriceListIds: function (data) {\r\n\r\n return httpService.post('/price/decisions/getCompetitorsGroupPricesByPriceListIds', data);\r\n },\r\n\r\n markAsReviewed: function (categoryId, categorygroup, category, subcategory, priceType, ignorePendingSuggestions) {\r\n return httpService.post('/price/decisions/markAsReviewed/' + categoryId + '/' + categorygroup + '/' + category + '/' + subcategory + '/' + priceType + '/' + ignorePendingSuggestions);\r\n },\r\n markAsEndorsed: function (categoryId, categorygroup, category) {\r\n return httpService.post('/price/decisions/markAsEndorsed/' + categoryId + '/' + categorygroup + '/' + category);\r\n },\r\n saveNewPrices: function (categoryId, newPrices) {\r\n return httpService.post('/price/decisions/new-prices/' + categoryId, newPrices);\r\n },\r\n endorsePrices: function (newPrices) {\r\n return httpService.post('/price/decisions/endorse/', newPrices);\r\n },\r\n ignoreSuggestions: function (newPrices) {\r\n return httpService.post('/price/decisions/ignore-suggestions/', newPrices);\r\n },\r\n getEndorsePrices: function (categoryId) {\r\n return httpService.get('/price/decisions/endorse/' + categoryId);\r\n },\r\n getChatForItem: function (priceId) {\r\n return httpService.get('price/decisions/getChat/' + priceId);\r\n },\r\n saveChatForItem: function (chat) {\r\n return httpService.post('price/decisions/save-chat', chat);\r\n },\r\n rejectEndorse: function (pricesToReject, comment, url) {\r\n return httpService.post('price/decisions/reject-endorse', { prices: pricesToReject, reason: comment, url: url });\r\n },\r\n getCurrentPrices: function (itemId, salesUnitOfMeasureId, priceListId) {\r\n return httpService.get('price/decisions/getCurrentPrices/' + itemId + '/' + salesUnitOfMeasureId + '/' + priceListId);\r\n },\r\n getRegularPrice: function (itemId, salesUnitOfMeasureId, priceListId) {\r\n return httpService.get('price/decisions/getRegularPrice/' + itemId + '/' + salesUnitOfMeasureId + '/' + priceListId);\r\n }\r\n }\r\n\r\n self.competitors = {\r\n getCompetitorUnitSales: function (competitorId, itemId, isOwn, months) {\r\n return httpService.get('/price/competitors/get-units-sales/' + competitorId + '/' + itemId + '/' + isOwn + '/' + months);\r\n },\r\n getCompetitorGroups: function () {\r\n return httpService.get('/price/competitors/competitor-groups/');\r\n },\r\n\r\n getCompetitorGroupsByPriceList: function (priceListId) {\r\n return httpService.get('/price/competitors/competitor-groups/' + priceListId);\r\n },\r\n getCompetitorGroupsByPriceListIds: function (data) {\r\n return httpService.post('/price/competitors/competitor-groups', data);\r\n },\r\n getCompetitorGroupsParentByPriceList: function (priceListId) {\r\n return httpService.get('/price/competitors/competitor-groups-parent/' + priceListId);\r\n },\r\n getCompetitorGroupsParentByPriceListIds: function (data) {\r\n return httpService.post('/price/competitors/competitor-groups-parent', data);\r\n },\r\n getCompetitorGroupsParent: function () {\r\n return httpService.get('/price/competitors/competitor-groups-parent/');\r\n },\r\n getCompetitors: function (compGroupId) {\r\n return httpService.get('/price/competitors/competitors/' + compGroupId);\r\n },\r\n getCompetitorsWithoutGroup: function () {\r\n return httpService.get('/price/competitors/competitors-without-group/');\r\n },\r\n getCompetitorsTree: function () {\r\n return httpService.get('/price/competitors/competitors/getCompetitorsTree');\r\n },\r\n competitors: function () {\r\n return httpService.get('/price/competitors/competitors');\r\n },\r\n saveCompetitor: function (competitor) {\r\n return httpService.post('/price/competitors/competitors/save', competitor);\r\n },\r\n saveCompetitorsTree: function (competitorsTree) {\r\n return httpService.post('/price/competitors/competitorsGroup/save', competitorsTree);\r\n },\r\n saveCompetitorsTreeRelations: function (competitorsTreeRelations) {\r\n return httpService.post('/price/competitors/competitorsGroup/save-relations', competitorsTreeRelations);\r\n },\r\n deleteCompetitor: function (competitorId) {\r\n return httpService.get('/price/competitors/competitors/delete/' + competitorId);\r\n },\r\n deleteCompetitorsTree: function (CompetitorsTreeId) {\r\n return httpService.get('/price/competitors/competitorsGroup/delete/' + CompetitorsTreeId);\r\n }\r\n\r\n }\r\n\r\n self.exchangeRates = {\r\n getCurrent: function () {\r\n return httpService.get('/price/exchange-rates/get-current');\r\n },\r\n }\r\n\r\n self.pricelists = {\r\n getPriceLists: function () {\r\n return httpService.get('/price/priceLists/pricelists');\r\n },\r\n getAllPricelists: function () {\r\n return httpService.get('/price/priceLists/pricelists/all');\r\n },\r\n getPricelist: function (id) {\r\n return httpService.get('/price/priceLists/getPriceList/' + id);\r\n },\r\n deletePricelist: function (id) {\r\n return httpService.get('/price/priceLists/deletePriceList/' + id);\r\n },\r\n savePricelist: function (priceList) {\r\n return httpService.post('/price/priceLists/save', priceList);\r\n }\r\n }\r\n\r\n self.pricelistsSubsidies = {\r\n getPricelistsSubsidies: function () {\r\n return httpService.get('/price/pricelistsSubsidies/pricelistsSubsidies');\r\n },\r\n getAllPricelistsSubsidies: function () {\r\n return httpService.get('/price/pricelistsSubsidies/pricelistsSubsidies/all');\r\n },\r\n getPricelistSubsidy: function (id) {\r\n return httpService.get('/price/pricelistsSubsidies/getPriceListSubsidy/' + id);\r\n },\r\n deletePricelistSubsidy: function (id) {\r\n return httpService.get('/price/pricelistsSubsidies/deletePriceListSubsidy/' + id);\r\n },\r\n savePricelistSubsidy: function (priceList) {\r\n return httpService.post('/price/pricelistsSubsidies/save', priceList);\r\n }\r\n }\r\n\r\n self.regions = {\r\n getRegions: function () {\r\n return httpService.get('/price/regions/regions');\r\n },\r\n getRegion: function (id) {\r\n return httpService.get('/price/regions/getRegion/' + id);\r\n },\r\n saveRegion: function (region) {\r\n return httpService.post('/price/regions/save', region);\r\n }\r\n }\r\n\r\n self.pricesurveys = {\r\n onlyActive: function (itemId, priceListId, includeOwnPrices) {\r\n return httpService.get('/price/pricesurveys/onlyActive/' + itemId + '/' + priceListId + '/' + includeOwnPrices);\r\n },\r\n onlyActiveByPriceListIds: function (data) {\r\n return httpService.post('/price/pricesurveys/onlyActiveByPriceListIds', data);\r\n },\r\n getByPriceSuggestionId: function (id) {\r\n return httpService.get('/price/pricesurveys/getByPriceSuggestionId/' + id);\r\n },\r\n getHistorical: function (competitorId, itemId, salesUnitOfMeasurementId, priceType, isOwn) {\r\n //console.log('url', '/price/pricesurveys/getHistorical/' + competitorId + '/' + itemId + '/' + salesUnitOfMeasurementId + '/' + priceType + '/' + isOwn);\r\n return httpService.get('/price/pricesurveys/getHistorical/' + competitorId + '/' + itemId + '/' + salesUnitOfMeasurementId + '/' + priceType + '/' + isOwn);\r\n }\r\n\r\n }\r\n self.evolutionReport = {\r\n getData: function (itemId, priceListId, dateFrom, dateTo) {\r\n return httpService.get('/price/pricesurveys/GetPricesForEvolutionReport/' + itemId + '/' + priceListId + '/' + dateFrom + '/' + dateTo);\r\n },\r\n getOxxoData: function (itemId, priceListId, dateFrom, dateTo) {\r\n return httpService.get('/price/pricesurveys/GetOxxoPricesForEvolutionReport/' + itemId + '/' + priceListId + '/' + dateFrom + '/' + dateTo);\r\n },\r\n getUnitsData: function (itemId, priceListId, competitorId) {\r\n return httpService.get('/price/pricesurveys/GetUnitsForEvolutionReport/' + itemId + '/' + priceListId + '/' + competitorId);\r\n }\r\n }\r\n self.abTesting = {\r\n getCategories: function () {\r\n return httpService.get('/price/priceabtesting/categories');\r\n },\r\n getAbTestingGrid: function () {\r\n return httpService.get('/price/priceabtesting/ab-testing-grid');\r\n },\r\n itemsLookupByCategory: function (lookupParameter, categoryId) {\r\n return httpService.post('/price/rules/itemsLookup/' + categoryId, lookupParameter);\r\n },\r\n deleteTests: function (ids) {\r\n return httpService.post('/price/priceabtesting/delete-tests/', ids);\r\n },\r\n getStoresLookup: function (companyId) {\r\n return httpService.get('/price/priceabtesting/stores/' + companyId);\r\n },\r\n getDailySales: function (abTestingId) {\r\n return httpService.get('/price/priceabtesting/get-daily-sales/' + abTestingId);\r\n },\r\n getCurrentPrice: function (storeId, itemId) {\r\n return httpService.get('/price/priceabtesting/get-current-price/' + storeId + \"/\" + itemId);\r\n },\r\n saveAbTesting: function (abTesting) {\r\n return httpService.post('/price/priceabtesting/save-ab-testing', abTesting);\r\n },\r\n }\r\n\r\n self.rules = {\r\n getCategories: function (categoryMinLevel) {\r\n return httpService.get('/price/rules/category-rules/' + categoryMinLevel);\r\n },\r\n getExistingRules: function (categoryId) {\r\n return httpService.get('/price/rules/existing-rules/' + categoryId);\r\n },\r\n getItemRules: function (categoryId) {\r\n return httpService.get('/price/rules/item-rules/' + categoryId);\r\n },\r\n getParents: function (categoryId) {\r\n return httpService.get('/price/rules/parents/' + categoryId);\r\n },\r\n savePriceRuleCompetitive: function (priceRule) {\r\n return httpService.post('/price/rules/save-price-rule-competitive', priceRule);\r\n },\r\n savePriceRuleMargin: function (priceRule) {\r\n return httpService.post('/price/rules/save-price-rule-margin', priceRule);\r\n },\r\n savePriceRuleParent: function (priceRule) {\r\n return httpService.post('/price/rules/save-price-rule-parent', priceRule);\r\n },\r\n savePriceRuleZone: function (priceRule) {\r\n return httpService.post('/price/rules/save-price-rule-zone', priceRule);\r\n },\r\n saveCategoryRules: function (categories) {\r\n return httpService.post('/price/rules/save-category-rules', categories);\r\n },\r\n //getPriceRuleCategories: function (categoryId) {\r\n // return httpService.get('/price/rules/getpricerulecategories/' + categoryId);\r\n //},\r\n getArticlesGroup: function (categoryId) {\r\n return httpService.get('/price/rules/getArticlesGroup/' + categoryId);\r\n },\r\n getPriceRuleTags: function (categoryId) {\r\n return httpService.get('/price/rules/getpriceruletags/' + categoryId);\r\n },\r\n getPriceRuleItems: function (categoryId) {\r\n return httpService.get('/price/rules/getpriceruleitems/' + categoryId);\r\n },\r\n getPriceRulePriceLists: function () {\r\n return httpService.get('/price/rules/getPricelists');\r\n },\r\n getPriceRuleVendors: function (categoryId) {\r\n return httpService.get('/price/rules/getVendors/' + categoryId);\r\n },\r\n getSubCategoriesById: function (categoryId) {\r\n return httpService.get('price/rules/getSubCategories/' + categoryId);\r\n },\r\n getItemSensitivities: function () {\r\n return httpService.get('price/rules/getItemSensitivities');\r\n },\r\n getParentUmvs: function (parentId) {\r\n return httpService.get('price/rules/getParentUmvs/' + parentId);\r\n },\r\n getPriceRulesForCategory: function (categoryId) {\r\n return httpService.get('price/rules/getpricerulesforCategory/' + categoryId)\r\n },\r\n getPriceRule: function (priceRuleId, priceRuleType) {\r\n return httpService.get('price/rules/getpricerule/' + priceRuleId + '/' + priceRuleType)\r\n },\r\n deletePriceRule: function (priceRuleId) {\r\n return httpService.get('price/rules/deletePriceRule/' + priceRuleId)\r\n },\r\n getGenericItem: function (parentId) {\r\n return httpService.post('/price/rules/getGenericItem/' + parentId);\r\n },\r\n validateRulesInBatchFile: function () {\r\n return httpService.post('/price/rules/validateRulesInBatchFile');\r\n },\r\n updateRulesInBatchFile: function () {\r\n return httpService.post('/price/rules/updateRulesInBatchFile');\r\n }\r\n }\r\n\r\n self.priceRoundings = {\r\n getPriceRoundings: function () {\r\n return httpService.get('/price/priceRounding/getPriceRoundings');\r\n },\r\n getPriceRoundingById: function (priceRoundingId) {\r\n return httpService.get('/price/priceRounding/getPriceRoundingById/' + priceRoundingId);\r\n },\r\n getPriceRoundingsByType: function (priceTypeId) {\r\n return httpService.get('/price/priceRounding/getPriceRoundingsByType/' + priceTypeId);\r\n },\r\n savePriceRounding: function (priceRounding) {\r\n return httpService.post('/price/priceRounding/savePriceRounding', priceRounding);\r\n },\r\n savePriceRoundings: function (priceRoundings) {\r\n return httpService.post('/price/priceRounding/savePriceRoundings', priceRoundings);\r\n },\r\n deletePriceRounding: function (priceRoundingId) {\r\n return httpService.get('/price/priceRounding/deletePriceRounding/' + priceRoundingId);\r\n },\r\n getRoundedNumber: function (priceType, numberToRound) {\r\n return httpService.get('/price/priceRounding/getRoundedValue/' + priceType + '/' + numberToRound);\r\n }\r\n }\r\n\r\n\r\n self.suggestion = {\r\n generateSuggestions: function (categoryId) {\r\n return httpService.post('/price/suggestion/generate-suggestions/' + categoryId);\r\n },\r\n generateCostSuggestionsForAll: function () {\r\n return httpService.post('/price/suggestion/generate-costsuggestions-for-all');\r\n },\r\n reviewCategory: function (categoryId, suggestionsType) {\r\n return httpService.post('/price/suggestion/review-category/' + categoryId + '/' + suggestionsType);\r\n }\r\n }\r\n\r\n self.itemSensitivities = {\r\n getItemSensitivities: function () {\r\n return httpService.get('/price/itemSensitivities/itemSensitivities');\r\n },\r\n getItemSensitivity: function (itemSensitivityId) {\r\n return httpService.get('/price/itemSensitivities/itemSensitivity/' + itemSensitivityId);\r\n },\r\n saveItemSensitivity: function (itemSensitivity) {\r\n return httpService.post('/price/itemSensitivities/save', itemSensitivity);\r\n }\r\n }\r\n\r\n self.lookups = {\r\n itemsLookupByCategory: function (lookupParameter, categoryId) {\r\n return httpService.post('/price/rules/itemsLookup/' + categoryId, lookupParameter);\r\n },\r\n itemLookupByMainItemId: function (mainItemId, mainItemUmvId) {\r\n return httpService.get('/price/rules/itemLookup/' + mainItemId + '/' + mainItemUmvId);\r\n }\r\n }\r\n\r\n self.getRoundingDecimalNames = function () {\r\n\r\n var deferred = $q.defer();\r\n\r\n $translate(['Rounding3', 'Rounding2', 'Rounding1', 'Rounding0', 'RoundingM1', 'RoundingM2', 'RoundingM3', 'RoundingM4', 'RoundingM5', 'RoundingM6']).then(function (translations) {\r\n\r\n var decimalNames = [{\r\n decimals: 3,\r\n name: translations.Rounding3\r\n },\r\n {\r\n decimals: 2,\r\n name: translations.Rounding2\r\n },\r\n {\r\n decimals: 1,\r\n name: translations.Rounding1\r\n },\r\n {\r\n decimals: 0,\r\n name: translations.Rounding0\r\n },\r\n {\r\n decimals: -1,\r\n name: translations.RoundingM1\r\n },\r\n {\r\n decimals: -2,\r\n name: translations.RoundingM2\r\n },\r\n {\r\n decimals: -3,\r\n name: translations.RoundingM3\r\n },\r\n {\r\n decimals: -4,\r\n name: translations.RoundingM4\r\n },\r\n {\r\n decimals: -5,\r\n name: translations.RoundingM5\r\n },\r\n {\r\n decimals: -6,\r\n name: translations.RoundingM6\r\n }\r\n ];\r\n\r\n deferred.resolve(decimalNames);\r\n\r\n }, function () {\r\n deferred.reject(rv);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n self.getPriceSurveyTypes = function () {\r\n\r\n var deferred = $q.defer();\r\n\r\n $translate([\"Basket\", \"Promotion\"]).then(function (translations) {\r\n\r\n var priceSurveyTypes = [{ \"priceRuleId\": 0, \"priceSurveyType\": 1, \"priceSurveyTypeName\": translations.Basket, \"exclude\": 0 },\r\n { \"priceRuleId\": 0, \"priceSurveyType\": 2, \"priceSurveyTypeName\": \"Extra\", \"exclude\": 0 },\r\n { \"priceRuleId\": 0, \"priceSurveyType\": 3, \"priceSurveyTypeName\": \"PriceIndex\", \"exclude\": 0 },\r\n { \"priceRuleId\": 0, \"priceSurveyType\": 4, \"priceSurveyTypeName\": translations.Promotion, \"exclude\": 0 },\r\n { \"priceRuleId\": 0, \"priceSurveyType\": 6, \"priceSurveyTypeName\": \"Web\", \"exclude\": 0 }];\r\n\r\n deferred.resolve(priceSurveyTypes);\r\n\r\n }, function () {\r\n deferred.reject(rv);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n self.getPriceTypes = function () {\r\n\r\n var deferred = $q.defer();\r\n\r\n $translate([\"Regular\", \"Competitive\", \"All\", \"Current\", \"Exception\", \"Markdown\", \"Bonus\", \"Promotion\"]).then(function (translations) {\r\n\r\n var priceTypes = [translations.All, translations.Current, translations.Exception, translations.Markdown, translations.Bonus, translations.Promotion, translations.Competitive, translations.Regular];\r\n\r\n deferred.resolve(priceTypes);\r\n\r\n }, function () {\r\n deferred.reject(rv);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n self.getPriceRoundingTypes = function () {\r\n\r\n var deferred = $q.defer();\r\n\r\n $translate([\"RoundingStandard\", \"PricePoints\", \"Terminations\"]).then(function (translations) {\r\n\r\n var priceRoundingTypes = [translations.RoundingStandard, translations.PricePoints, translations.Terminations];\r\n\r\n deferred.resolve(priceRoundingTypes);\r\n\r\n }, function () {\r\n deferred.reject(rv);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n self.reports = {\r\n getWeeklyReport: function (priceListId) {\r\n return httpService.get('/price/pricereport/weekly-report/' + priceListId);\r\n },\r\n getInformedPrices: function (dateFrom, dateTo) {\r\n return httpService.get('/price/pricereport/get-informed-prices/' + dateFrom + '/' + dateTo);\r\n },\r\n getInformedPricesExcel: function (dateFrom, dateTo) {\r\n return httpService.get('/price/pricereport/get-informed-prices-excel/' + dateFrom + '/' + dateTo);\r\n },\r\n getPricesDailyMargin: function () {\r\n return httpService.get('/price/pricereport/daily-margin');\r\n },\r\n getPricesDailyMarginExcel: function () {\r\n return httpService.get('/price/pricereport/daily-margin-excel');\r\n },\r\n getCompetitorsPricesExcel: function (dateFrom, dateTo) {\r\n return httpService.get('/price/pricereport/get-competitors-prices-excel/' + dateFrom + '/' + dateTo)\r\n },\r\n getCompetitiveIndex: function (params) {\r\n return httpService.post('/price/pricereport/get-competitive-index', params)\r\n },\r\n getVolumeMeasurement: function (compare, priceListId) {\r\n return httpService.get('/price/pricereport/getVolumeMeasurement/' + compare + '/' + priceListId );\r\n },\r\n getVolumeMeasurementCompetitors: function (compare, priceListId,brands) {\r\n return httpService.get('/price/pricereport/getVolumeMeasurementCompetitors/' + compare + '/' + priceListId + '/' + brands);\r\n },\r\n getCompetitivePositionReport: function (filters) {\r\n return httpService.post('/price/pricereport/getCompetitivePositionReport', filters);\r\n },\r\n getCompetitivePositionByPriceList: function (filters) {\r\n return httpService.post('/price/pricereport/getCompetitivePositionByPriceList', filters);\r\n },\r\n getCompetitiveReport: function (selectedMarketId, selectedPriceListId, selectedItemId, selectedClculationType, validFrom, validTo) {\r\n return httpService.get('/price/pricereport/getCompetitiveReport/' + selectedMarketId + '/' + selectedPriceListId + '/' + selectedItemId + '/' + selectedClculationType + '/' + validFrom + '/' + validTo);\r\n }\r\n }\r\n\r\n self.priceOutput = {\r\n getStorePricesToInform: function () {\r\n return httpService.get('/price/priceoutput/getStorePricesToInform');\r\n },\r\n informToErp: function (filters) {\r\n return httpService.post('/price/priceoutput/informToErp', filters);\r\n },\r\n informToOxxoErp: function (pricesToInform) {\r\n return httpService.post('/price/priceoutput/informToOxxoErp', pricesToInform);\r\n },\r\n importPrices: function () {\r\n return httpService.get('/price/priceoutput/importPrices');\r\n },\r\n downloadLastOutput: function () {\r\n return httpService.get('/price/priceoutput/downloadLastOutput');\r\n },\r\n getLastOutputReports: function () {\r\n return httpService.get('/price/priceoutput/getLastOutputReports');\r\n },\r\n getPriceOutputLimits: function (isReport, fromDate, toDate) {\r\n return httpService.get('/price/priceoutput/getPriceOutputLimits/' + isReport + '/' + fromDate + '/' + toDate);\r\n },\r\n getStoresFilter: function () {\r\n return httpService.get('/price/priceoutput/getStoresFilter');\r\n },\r\n getCategoriesFilter: function () {\r\n return httpService.get('/price/priceoutput/getCategoriesFilter');\r\n },\r\n getReasonsFilter: function (priceType) {\r\n return httpService.get('/price/priceoutput/getReasonsFilter/' + priceType);\r\n },\r\n //getStorePricesToInformFiltered: function (filters) {\r\n // return httpService.post('/price/priceoutput/getStorePricesToInformFiltered', filters);\r\n //},\r\n }\r\n });","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n .service(\"markdownService\", function (httpService) {\r\n var self = this;\r\n\r\n self.rules = {\r\n getRulesCategories: function (brandId) {\r\n return httpService.get('/MarkdownRules/GetCategoryRules/' + brandId);\r\n },\r\n saveCategoryRules: function (dto) {\r\n return httpService.post('/MarkdownRules/saveCategoryRules', dto);\r\n },\r\n getBrands: function () {\r\n return httpService.get('/MarkdownRules/getBrands/');\r\n },\r\n getRules: function () {\r\n return httpService.get('/MarkdownRules/getRules/');\r\n },\r\n saveRule: function (rule) {\r\n return httpService.post('/MarkdownRules/saveRule', rule);\r\n },\r\n updateRules: function (rules) {\r\n return httpService.post('/MarkdownRules/updateRule', rules);\r\n },\r\n updateRulesAndGenerateSuggestions: function (reevaluateCurrentPlan, rules) {\r\n return httpService.post('/MarkdownRules/UpdateRulesAndGenerateSuggestions/' + reevaluateCurrentPlan, rules);\r\n },\r\n deleteRule: function (ruleId) {\r\n return httpService.post('/MarkdownRules/deleteRule', ruleId);\r\n },\r\n }\r\n\r\n self.decisions = {\r\n getStoresInMarkdown: function (categoryId, type) {\r\n return httpService.get('/MarkdownCategorySummary/GetStoresInMarkdown/' + categoryId + '/' + type);\r\n },\r\n getCategoriesForDecisions: function (categoryId) {\r\n return httpService.get('/MarkdownCategorySummary/GetCategoriesForDecisions/' + categoryId);\r\n },\r\n getCategorySummary: function () {\r\n return httpService.get('/MarkdownCategorySummary/GetCategorySummary/');\r\n },\r\n GetMarkdownSuggestions: function (categoryIds, type, pageNumber, pageSize, storeId, stage, suggestion, stock, status) {\r\n return httpService.get('/MarkdownCategorySummary/GetMarkdownSuggestions/' + categoryIds + '/' + type\r\n + '/' + pageNumber + '/' + pageSize + '/' + storeId + '/' + stage + '/' + suggestion + '/' + stock + '/' + status);\r\n },\r\n acceptSuggestions: function (suggestions) {\r\n return httpService.post('/MarkdownCategorySummary/AcceptSuggestions', suggestions);\r\n },\r\n endose: function (suggestions) {\r\n return httpService.post('/MarkdownCategorySummary/Endose', suggestions);\r\n },\r\n validate: function (suggestions) {\r\n return httpService.post('/MarkdownCategorySummary/Validate', suggestions);\r\n },\r\n ignoreSuggestions: function (suggestions) {\r\n return httpService.post('/MarkdownCategorySummary/ignoreSuggestions', suggestions);\r\n },\r\n reject: function (suggestions,reason) {\r\n return httpService.post('/MarkdownCategorySummary/reject/' + reason, suggestions);\r\n },\r\n reviewCategorySuggestions: function (categoryIds) {\r\n return httpService.post('/MarkdownCategorySummary/ReviewCategorySuggestions', categoryIds);\r\n },\r\n reviewCategoryEndorse: function (categoryIds) {\r\n return httpService.post('/MarkdownCategorySummary/reviewCategoryEndorse', categoryIds);\r\n },\r\n reviewCategoryValidate: function (categoryIds) {\r\n return httpService.post('/MarkdownCategorySummary/reviewCategoryValidate', categoryIds);\r\n },\r\n writeMarkdownPrices: function () {\r\n return httpService.get('/MarkdownCategorySummary/writeMarkdownPrices');\r\n },\r\n getMotivoSugerencia: function (markdownItemId, markdownPlanType) {\r\n return httpService.get('/MarkdownCategorySummary/getMotivoSugerencia/' + markdownItemId + '/' + markdownPlanType);\r\n },\r\n ignoreAll: function () {\r\n return httpService.get('/MarkdownCategorySummary/ignoreAll/');\r\n }\r\n }\r\n\r\n self.activation = {\r\n getLastOutputReports: function () {\r\n //return httpService.get('/price/priceoutput/getLastOutputReports');\r\n return httpService.get('/MarkdownActivation/getLastOutputReports');\r\n },\r\n\r\n getReasonsFilter: function (markdownPlanType) {\r\n //return httpService.get('/price/priceoutput/getReasonsFilter/' + priceType);\r\n return httpService.get('/MarkdownActivation/getReasonsFilter/' + markdownPlanType);\r\n },\r\n\r\n activateMarkdowns: function (mardownsToInform) {\r\n //return httpService.post('/price/priceoutput/informToErp', pricesToInform);\r\n return httpService.post('/MarkdownActivation/activateMarkdowns', mardownsToInform);\r\n },\r\n downloadLastOutput: function () {\r\n return httpService.get('/MarkdownActivation/downloadLastOutput');\r\n },\r\n getMarkdownsToInformFiltered: function (filters) {\r\n //return httpService.post('/price/priceoutput/getStorePricesToInformFiltered', filters);\r\n return httpService.post('/MarkdownActivation/getMarkdownsToInformFiltered', filters);\r\n }\r\n }\r\n\r\n });","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n .service(\"inventoryService\", function homeService($rootScope, httpService) {\r\n var self = this;\r\n\r\n self.inventory = {\r\n getStockAnalysis: function () {\r\n return httpService.get('/stockAnalysis/' + $rootScope.companyId);\r\n }\r\n }\r\n\r\n });\r\n\r\n\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n .service(\"homeService\", function homeService($rootScope, httpService) {\r\n var self = this;\r\n\r\n self.dashboards = {\r\n getItemDashboard: function (itemId, storeId, clusterId, priceListId) {\r\n return httpService.get('/home/itemDashboard/' + itemId + '/' + storeId + '/' + clusterId + '/' + priceListId);\r\n },\r\n getHomeDashboard: function (sameStores) {\r\n return httpService.get('/home/homeDashboard/'+ sameStores);\r\n },\r\n getHeatMapByState: function (timeType,categoryId,sameStores) {\r\n return httpService.get('/home/heatMapByState/' + timeType + '/' + categoryId + '/' + sameStores);\r\n },\r\n getHeatMapByStateMargin: function (categoryId) {\r\n return httpService.get('/home/heatMapByStateMargin/' + categoryId);\r\n },\r\n getYtdComparison: function (sameStores) {\r\n return httpService.get('/home/dashboard-ytd-comparison/' + sameStores);\r\n },\r\n getInventory: function (itemId, storeId, clusterId, priceListId) {\r\n return httpService.get('/home/itemInventory/' + itemId + '/' + storeId + '/' + clusterId + '/' + priceListId);\r\n },\r\n getCountry: function () {\r\n return httpService.get('home/getCountry');\r\n },\r\n getAllDataDate: function (lang) {\r\n return httpService.get('home/getAllDataDate/' + lang);\r\n },\r\n getNotification: function (sameStores) {\r\n return httpService.get('home/getNotification/' + sameStores);\r\n },\r\n getLogosAndDomain: function () {\r\n return httpService.get('home/getLogosAndDomain');\r\n }\r\n }\r\n\r\n self.company = {\r\n getCompanyConfig: function () {\r\n return httpService.get('home/getCompanyConfig');\r\n }\r\n }\r\n\r\n self.categoryTreeMap = {\r\n getCategoryTreeMap: function (categoryId) {\r\n return httpService.get('/categoryTreeMap/' + categoryId);\r\n }\r\n };\r\n\r\n self.dst = {\r\n getCategoryBubbles: function (categoryGroupId) {\r\n return httpService.get('home/dst-bubbles/' + categoryGroupId);\r\n },\r\n getStates: function () {\r\n return httpService.get('home/get-states');\r\n },\r\n getBubbles: function (filter, timeType, type,sameStores) {\r\n return httpService.get('home/dst-bubbles/' + filter + '/' + timeType + '/' + type + '/' + sameStores);\r\n },\r\n };\r\n\r\n self.categories = {\r\n getCategoryGroups: function () {\r\n return httpService.get('home/categories/categoryGroups');\r\n },\r\n getLayoutCategories: function () {\r\n return httpService.get('home/categories/layoutCategories');\r\n },\r\n getFullCategories: function () {\r\n return httpService.get('home/categories');\r\n }\r\n };\r\n\r\n self.categoryBCGMatrix = {\r\n getCategoryBCGMatrix: function () {\r\n return httpService.get('/categoryBCGMatrix');\r\n }\r\n };\r\n\r\n self.benchmark = {\r\n getBenchmark: function (parameters) {\r\n return httpService.post('home/benchmark', parameters);\r\n },\r\n getBenchmarkValues: function () {\r\n return httpService.get('home/benchmark-values');\r\n }\r\n };\r\n\r\n self.goals = {\r\n getGoalsByCategory: function (sameStores) {\r\n return httpService.get('/home/goals-by-category/' + sameStores);\r\n },\r\n getGoalsByStore: function (sameStores) {\r\n return httpService.get('/home/goals-by-store/' + sameStores);\r\n },\r\n getPriceListsByCategory: function (categoryId) {\r\n return httpService.get('/home/price-lists-by-category/' + categoryId);\r\n }\r\n };\r\n\r\n self.scorecard = {\r\n getScorecard: function (brandId, year) {\r\n return httpService.get('/home/scorecard/' + brandId + '/' + year);\r\n },\r\n getBrands: function () {\r\n return httpService.get('/home/scorecard/brands');\r\n },\r\n }\r\n\r\n self.lookups = {\r\n itemsLookup: function (lookupParameter) {\r\n return httpService.post('/home/lookups/itemsLookup', lookupParameter);\r\n },\r\n itemsLookupByCategory: function (lookupParameter, categoryId) {\r\n return httpService.post('/home/lookups/itemsLookup/' + categoryId, lookupParameter);\r\n },\r\n abmItemsLookup: function (search) {\r\n return httpService.post('/home/lookups/searchItem', search);\r\n },\r\n storesLookup: function (search) {\r\n return httpService.post('/home/lookups/searchStore', search);\r\n }\r\n }\r\n\r\n self.items = {\r\n getItem: function (itemId) {\r\n return httpService.get('/home/items/getAbmItem/' + itemId);\r\n },\r\n saveItem: function (item) {\r\n return httpService.post('/home/items/saveAbmItem', item);\r\n },\r\n getCategories: function () {\r\n return httpService.get('/home/items/getCategories');\r\n },\r\n getSubcategories: function (categoryId) {\r\n return httpService.get('/home/items/getSubCategories/' + categoryId);\r\n },\r\n getTypes: function (itemId) {\r\n return httpService.get('/home/items/getTypes');\r\n },\r\n getCums: function (itemId) {\r\n return httpService.get('/home/items/getCums/' + itemId);\r\n },\r\n isItemEanRepeat: function (ENA) {\r\n return httpService.get('home/items/isItemEanRepeat/' + ENA )\r\n }\r\n }\r\n\r\n self.kpis = {\r\n getKpiDashboardYTD: function (itemId, priceListId, sameStores, type) {\r\n return httpService.get('/home/kpi/kpi-ytd-comparison/' + itemId + '/' + priceListId + '/' + sameStores + '/' + type);\r\n },\r\n getItemDashboardItemCluster: function(categoryId, itemId, clusterId, sameStores) {\r\n\r\n return httpService.get('/home/kpi/cluster-dashboard/' + $rootScope.companyId + '/' + categoryId + '/' + itemId + '/' + clusterId + '/' + sameStores);\r\n },\r\n }\r\n });\r\n\r\n\r\n\r\n","\"use strict\";\r\n\r\nvar controller = function($rootScope,httpService) {\r\n var self = this;\r\n\r\n self.categoryLookup = {\r\n getCategories: function (companyName, level) {\r\n return httpService.get('/components/categoryLookup/get-categories/' + companyName + '/' + (level ? level : ''));\r\n }\r\n }\r\n\r\n self.competitorsLookup = {\r\n getCompetitors: function (searchText) {\r\n var all = false;\r\n if (searchText == '') {\r\n all = true;\r\n searchText = 'a'; //No le gusta cuando le mando un vacio...\r\n }\r\n return httpService.get('/components/competitorLookup/get-competitors/' + searchText + '/' + all);\r\n }\r\n }\r\n}\r\n\r\nangular.module(\"prisma\")\r\n .service(\"componentsService\", controller);","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n .service(\"assortmentReportService\", function assortmentReportService($rootScope, $q, httpService) {\r\n var self = this;\r\n\r\n self.saveTemplate = function (template) {\r\n\r\n return httpService.post('assortment/assortmentReport/saveTemplate', template);\r\n }\r\n\r\n self.getTemplates = function () {\r\n return httpService.get('assortment/assortmentReport/getTemplates');\r\n }\r\n\r\n self.deleteTemplate = function (id) {\r\n return httpService.post('assortment/assortmentReport/deleteTemplate', id);\r\n }\r\n\r\n self.loadReportData = function (template, useNewClusterizer) {\r\n return httpService.post('assortment/assortmentReport/loadReportData', template);\r\n }\r\n\r\n self.exportToExcel = function (report) {\r\n return httpService.post('assortment/assortmentReport/exportToExcel', report);\r\n }\r\n\r\n self.getLastExecutedReport = function () {\r\n return httpService.get('assortment/assortmentReport/getLastExecutedReport');\r\n }\r\n\r\n self.openReport = function (dto) {\r\n return httpService.post('assortment/assortmentReport/openReport', dto);\r\n }\r\n \r\n self.downloadRulesReport = function (ruleType) {\r\n return httpService.get('/assortment/assortmentReport/downloadRulesReport/' + ruleType);\r\n } \r\n\r\n self.downloadListingSuggestionsReport = function (dto) {\r\n return httpService.post('/assortment/assortmentReport/downloadListingSuggestionsReport/', dto);\r\n } \r\n\r\n });","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n .service(\"assortmentService\", function assortmentService($rootScope, $q, httpService) {\r\n var self = this;\r\n\r\n self.getCategorySummaryPromise;\r\n self.getParetoByCategoryPromise;\r\n self.lastParetoCategoryId = 0;\r\n\r\n self.decisions = {\r\n getAssortmentDashboard: function (clusterId) {\r\n return httpService.get('assortment/decisions/dashboard/' + $rootScope.companyId + '/' + clusterId);\r\n },\r\n getCategorySummary: function (categoryLevel) {\r\n\r\n return httpService.get('/assortment/decisions/category-summary/' + $rootScope.companyId + '/' + categoryLevel);\r\n /*\r\n if (!self.getCategorySummaryPromise) {\r\n self.getCategorySummaryPromise = httpService.get('/assortment/decisions/category-summary/' + $rootScope.companyId);\r\n }\r\n return self.getCategorySummaryPromise;\r\n */\r\n },\r\n getParetoByCategory: function (filters) {\r\n //getParetoByCategory: function (categoryId, forceRefresh) {\r\n\r\n return httpService.post('/assortment/decisions/pareto-category', filters);\r\n\r\n //var fetchDataFromServer = false;\r\n //if (self.lastParetoCategoryId != categoryId || !self.getParetoByCategoryPromise) {\r\n // fetchDataFromServer = true;\r\n //}\r\n //if (fetchDataFromServer || forceRefresh) {\r\n // self.getParetoByCategoryPromise = httpService.get('/assortment/decisions/pareto-category/' + $rootScope.companyId + '/' + categoryId);\r\n //}\r\n\r\n //return self.getParetoByCategoryPromise;\r\n },\r\n getParetoFiltersByCategory: function (categoryId) {\r\n return httpService.get('/assortment/decisions/pareto-filters-by-category/' + categoryId);\r\n },\r\n getChatForItem: function (itemId, clusterId) {\r\n return httpService.get('assortment/decisions/getChat/' + itemId + '/' + clusterId);\r\n },\r\n getCategoryDetail: function (categoryId) {\r\n return httpService.get('assortment/decisions/categoryDetail/' + categoryId + \"/\" + $rootScope.companyId);\r\n },\r\n getPresenceDetail: function (itemId, clusterId)\r\n {\r\n return httpService.get('assortment/decisions/presence-detail/' + $rootScope.companyId + \"/\" + itemId + \"/\" + clusterId);\r\n },\r\n getParetoSections: function (categoryId) {\r\n return httpService.get('assortment/decisions/pareto-sections/' + categoryId);\r\n },\r\n getHiddenColumnIndexes: function () {\r\n return httpService.get('assortment/decisions/getHiddenColumnIndexes/' );\r\n },\r\n saveDecisions: function (itemsToSave, isEndorse, categoryId) {\r\n return httpService.post('assortment/decisions/save-decisions/' + isEndorse + '/' + categoryId, itemsToSave);\r\n },\r\n ignoreSuggestions: function (itemsToIgnore) {\r\n return httpService.post('assortment/decisions/ignore-suggestions', itemsToIgnore);\r\n },\r\n rejectEndorse: function (itemIdsToReject, comment, url, categoryId) {\r\n return httpService.post('assortment/decisions/reject-endorse/' + categoryId, { assortmentIds: itemIdsToReject, reason: comment, url: url });\r\n },\r\n saveParetoSections: function (sections) {\r\n var url = 'assortment/decisions/pareto-sections/save';\r\n return httpService.post(url, sections);\r\n },\r\n saveChatForItem: function (chat) {\r\n return httpService.post('assortment/decisions/save-chat', chat);\r\n },\r\n updateLastRevisionDate: function (categoryId) {\r\n return httpService.get('assortment/decisions/update-last-revision/' + categoryId);\r\n\r\n },\r\n getClusterCrossing: function (dto) {\r\n return httpService.post('assortment/decisions/getClusterCrossing', dto);\r\n },\r\n saveClusterCrossing: function (dtos) {\r\n return httpService.post('assortment/decisions/saveClusterCrossing', dtos);\r\n },\r\n saveColumnsToHide: function (columnIndexesToHide) {\r\n return httpService.get('assortment/decisions/saveColumnsToHide/' + columnIndexesToHide);\r\n }\r\n }\r\n\r\n self.clusters = {\r\n getClusters: function () {\r\n return httpService.get('/assortment/clusters/getClusters/' );\r\n },\r\n getClustersByCategory: function (categoryId) {\r\n return httpService.get('/assortment/clusters/getClustersByCategory/' + categoryId );\r\n },\r\n getClusterCategorySpaces: function (categoryId) {\r\n return httpService.get('/assortment/clusters/getClusterCategorySpaces/' + categoryId);\r\n }\r\n }\r\n\r\n self.categoryRoleStrategyCoverages = {\r\n getCoverages: function () {\r\n return httpService.get('/assortment/categoryRoleStrategyCoverages/getCoverages/' + $rootScope.companyId);\r\n },\r\n getCoveragesForCategory: function (categoryId) {\r\n return httpService.get('/assortment/categoryRoleStrategyCoverages/getCoveragesForCategory/' + categoryId);\r\n },\r\n getStrategyAndRoles: function() {\r\n return httpService.get('/assortment/categoryRoleStrategyCoverages/getStrategyAndRoles');\r\n }\r\n }\r\n\r\n self.rules = {\r\n getCategories: function (categoryLevel) {\r\n return httpService.get('/assortment/rules/category-rules/' + categoryLevel);\r\n },\r\n getCategoriesForRules: function (categoryId) {\r\n return httpService.get('/assortment/rules/category-for-rules/' + $rootScope.companyId + '/' + categoryId);\r\n },\r\n getRules: function(categoryId){\r\n return httpService.get('/assortment/rules/existing-rules/' + $rootScope.companyId + '/' + categoryId);\r\n },\r\n getClusters: function () {\r\n return httpService.get('/assortment/rules/cluster-rules/' + $rootScope.companyId);\r\n },\r\n getClustersByCategory: function (categoryId) {\r\n return httpService.get('/assortment/rules/getClustersByCategory/' + categoryId);\r\n },\r\n getTags: function () {\r\n return httpService.get('/assortment/rules/tag-rules/' + $rootScope.companyId);\r\n },\r\n getItemBrands: function (categoryId) {\r\n return httpService.get('/assortment/rules/getItemBrands/' + categoryId);\r\n },\r\n getItemManufacturers: function (categoryId) {\r\n return httpService.get('/assortment/rules/getItemManufacturers/' + categoryId);\r\n },\r\n saveCategoryRules: function (categories, brandId) {\r\n return httpService.post('/assortment/rules/save-category-rules/' + brandId, categories);\r\n },\r\n saveListingRule: function (listingRule) {\r\n return httpService.post('/assortment/rules/save-listing-rule', listingRule);\r\n },\r\n saveDelistingRule: function (delistingRule) {\r\n return httpService.post('/assortment/rules/save-delisting-rule', delistingRule);\r\n },\r\n deleteRule: function (ruleId) {\r\n return httpService.get('/assortment/rules/deleteRule/' + ruleId);\r\n },\r\n saveCustomCategoryMonths: function (customCategoryMonths) {\r\n return httpService.post('/assortment/rules/saveCustomCategoryMonths', customCategoryMonths);\r\n }\r\n }\r\n\r\n self.suggestion = {\r\n generateSuggestions: function (isListing, categoryId) {\r\n return httpService.post('/assortment/suggestion/generate-suggestions/' + $rootScope.companyId + \"/\" + categoryId + \"/\" + isListing);\r\n }\r\n }\r\n \r\n self.output = {\r\n getEndosedData: function () {\r\n return httpService.post('/assortment/output/getData');\r\n },\r\n getEndosedDataCencosudColombia: function () {\r\n return httpService.post('/assortment/output/getColombiaData');\r\n },\r\n getEndosedDataCencosudChile: function () {\r\n return httpService.post('/assortment/output/getChileData');\r\n },\r\n changeOutputStatus: function () {\r\n return httpService.post('/assortment/output/changeOutputStatus');\r\n },\r\n getPrismaEndosedData: function (categoryId) {\r\n return httpService.post('/assortment/output/getPrismaData/' + categoryId);\r\n },\r\n }\r\n\r\n self.summaryReport = {\r\n getSummaryReport: function (categoryGroupId) {\r\n return httpService.get('/assortment/summaryReport/getSummaryReport/' + categoryGroupId);\r\n },\r\n }\r\n\r\n self.reports = {\r\n getClusterHierarchy: function (categoryLevel) {\r\n return httpService.get('/assortment/decisions/getClusterHierarchy/'+ categoryLevel);\r\n },\r\n getSalesAndMargin: function (categoryId) {\r\n return httpService.get('/assortment/assortmentReport/getSalesAndMargin/' + categoryId);\r\n }\r\n }\r\n\r\n });\r\n\r\n\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n .service(\"adminService\", function adminService($rootScope, httpService) {\r\n var self = this;\r\n\r\n self.importers = {\r\n uploadFile: function (file, importer) {\r\n\r\n var fd = new FormData();\r\n //Take the first selected file\r\n fd.append(\"file\", file);\r\n\r\n httpService.post('/admin/importer/uploadFile', fd, {\r\n headers: { 'Content-Type': undefined },\r\n transformRequest: angular.identity,\r\n data: { 'importerName': importer, 'username': '' }\r\n })\r\n },\r\n processFiles: function (companyId, importer) {\r\n return httpService.get('/admin/importer/processFiles/' + companyId + \"/\" + importer);\r\n },\r\n validateDataQuality: function (companyId, importer) {\r\n return httpService.get('/admin/importer/validateDataQuality/' + companyId + \"/\" + importer);\r\n },\r\n importData: function (companyId, importer) {\r\n return httpService.get('/admin/importer/importData/' + companyId + \"/\" + importer);\r\n },\r\n removeAllSensitivities: function () {\r\n return httpService.get('/admin/importer/removeAllSensitivities');\r\n },\r\n getLastUploadedFile: function (importerType) {\r\n return httpService.get('/admin/importer/getLastUploadedFile/' + importerType);\r\n }\r\n }\r\n\r\n self.reports = {\r\n getItemsToIgnore: function () {\r\n return httpService.get('/admin/reports/getItemsToIgnore');\r\n },\r\n getItemsToIgnoreLastReport: function () {\r\n return httpService.get('/admin/reports/getItemsToIgnoreLastReport');\r\n },\r\n exportItemsToIgnore: function () {\r\n return httpService.get('/admin/reports/exportItemsToIgnore');\r\n }\r\n }\r\n\r\n self.auditTrail = {\r\n getByObject: function (objectId, objectType, days) {\r\n return httpService.get('admin/auditTrail/getByObject/' + objectId + '/' + objectType + (days ? '/' + days : ''));\r\n },\r\n }\r\n\r\n self.items = {\r\n saveItemTags: function (tagIdsToSave, itemId) {\r\n return httpService.post('admin/items/save-tags/' + itemId, tagIdsToSave);\r\n },\r\n getNoCategoryItems: function () {\r\n return httpService.get('admin/items/getNoCategoryItems');\r\n },\r\n saveItemCategories: function (categoryId, subCategoryId, itemEansToAplyCategory) {\r\n return httpService.post('admin/items/saveItemCategories/' + subCategoryId, itemEansToAplyCategory);\r\n }, \r\n saveManagementItems: function(itemsToSave) {\r\n return httpService.post('admin/items/saveManagementItems', itemsToSave);\r\n }, \r\n getItemsByCategory: function (categoryId) {\r\n return httpService.get('admin/items/getItemsByCategory/' + categoryId);\r\n },\r\n getItemsByCategories: function (categoryIds) {\r\n return httpService.post('admin/items/getItemsByCategories', categoryIds);\r\n },\r\n getItemsForManagement: function (params) {\r\n return httpService.post('admin/items/getItemsForManagement' , params);\r\n },\r\n getManufacturers: function () {\r\n return httpService.get('admin/items/getManufacturers');\r\n },\r\n getItemBrands: function () {\r\n return httpService.get('admin/items/getItemBrands');\r\n }\r\n }\r\n\r\n self.tags = {\r\n getTags: function () {\r\n return httpService.get('admin/tags/getTags/' + $rootScope.companyId);\r\n },\r\n getTagGroups: function () {\r\n return httpService.get('admin/tags/getTagGroups/' + $rootScope.companyId);\r\n },\r\n saveTag: function (tag) {\r\n return httpService.post('admin/tags/saveTag', tag);\r\n }\r\n }\r\n\r\n self.clusters = {\r\n\r\n getBrands: function () {\r\n return httpService.get('admin/cluster/getBrands');\r\n },\r\n getRegions: function () {\r\n return httpService.get('admin/cluster/getRegions');\r\n },\r\n getClusters: function () {\r\n return httpService.get('admin/cluster/getClusters');\r\n },\r\n getClustersByCategory: function (categoryId) {\r\n return httpService.get('admin/cluster/getClustersByCategory/' + categoryId);\r\n },\r\n deleteCluster: function (clusterId) {\r\n return httpService.delete('admin/cluster/delete-cluster/' + clusterId);\r\n },\r\n saveCluster: function (cluster) {\r\n return httpService.post('admin/cluster/save-cluster', cluster);\r\n },\r\n validateClusterCode: function (code) {\r\n return httpService.get('admin/cluster/validateClusterCode/' + code);\r\n }\r\n }\r\n\r\n self.missions = {\r\n getMissions: function () {\r\n return httpService.get('admin/mission/getMissions/');\r\n },\r\n getMission: function (id) {\r\n return httpService.get('admin/mission/getMission/' + id);\r\n },\r\n getMissionEnums: function () {\r\n return httpService.get('admin/mission/getMissionEnums');\r\n },\r\n getAgentCompetitors: function () {\r\n return httpService.get('admin/mission/GetAgentCompetitors');\r\n },\r\n saveMission: function (mission) {\r\n return httpService.post('admin/mission/saveMission', mission);\r\n },\r\n deleteMission: function (missionId) {\r\n return httpService.get('admin/mission/deleteMission/' + missionId);\r\n },\r\n }\r\n\r\n self.stores = {\r\n getStores: function (excluded) {\r\n return httpService.get('admin/store/getStores/' + excluded);\r\n },\r\n getStorePriceListState: function () {\r\n return httpService.get('admin/store/getStorePriceListState/');\r\n },\r\n getDistributionCentersCombo: function () {\r\n return httpService.get('admin/store/GetDistributionCentersCombo');\r\n },\r\n getStoresCombo: function () {\r\n return httpService.get('admin/store/getStoresCombo');\r\n },\r\n getStore: function (storeId) {\r\n return httpService.get('admin/store/getStore/' + storeId);\r\n },\r\n doesStoreCodeExists: function (storeCode, storeId) {\r\n return httpService.get('admin/store/doesStoreCodeExists/' + storeCode + '/' + storeId);\r\n },\r\n deleteStore: function (storeId) {\r\n return httpService.get('admin/store/deleteStore/' + storeId);\r\n },\r\n saveStore: function (store) {\r\n return httpService.post('admin/store/saveStore', store);\r\n },\r\n getStoreFormats: function () {\r\n return httpService.get('admin/store/getStoreFormats/');\r\n },\r\n getCustomerTypes: function () {\r\n return httpService.get('admin/store/getCustomerTypes/');\r\n },\r\n getCustomerFormatBrands: function () {\r\n return httpService.get('admin/store/getCustomerFormatBrands/');\r\n },\r\n getStoreByClusters: function (clusterIds) {\r\n return httpService.post('admin/store/getStoreByClusters', clusterIds)\r\n },\r\n getStoresZoning: function () {//LaRebaja necesita ver tiendas zonificadas\r\n return httpService.get('admin/store/getStoresZoning');\r\n } \r\n }\r\n\r\n self.vendors = {\r\n getVendorsCombo: function () {\r\n return httpService.get('admin/store/GetVendorsCombo');\r\n },\r\n }\r\n\r\n self.brands = {\r\n getBrandsCombo: function (onlyOwn) {\r\n return httpService.get('admin/store/GetBrandsCombo/' + onlyOwn);\r\n },\r\n getBrands: function () {\r\n return httpService.get('admin/store/getBrands');\r\n },\r\n saveBrand: function (brand, isChangedIcon) {\r\n return httpService.post('admin/store/saveBrand/' + isChangedIcon, brand);\r\n }\r\n\r\n }\r\n\r\n self.places = {\r\n getPlacesCombo: function () {\r\n return httpService.get('admin/store/GetPlacesCombo');\r\n }\r\n }\r\n\r\n self.priceLists = {\r\n getPriceLists: function () {\r\n return httpService.get('admin/pricelist/getPriceLists');\r\n },\r\n getStorePriceLists: function () {\r\n return httpService.get('admin/pricelist/getStorePriceLists');\r\n }, \r\n getMarkets: function() {\r\n return httpService.get('admin/pricelist/getMarkets');\r\n }\r\n }\r\n\r\n self.priceListsSubsidies = {\r\n getPriceListsSubsidies: function () {\r\n return httpService.get('admin/pricelist/getPriceListsSubsidies');\r\n },\r\n getStorePriceListsSubsidies: function () {\r\n return httpService.get('admin/pricelist/getStorePriceListsSubsidies');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n self.categories = {\r\n getCategoryTree: function () {\r\n return httpService.get('admin/category/getCategoryTree');\r\n },\r\n getCategorySector: function () {\r\n return httpService.get('admin/category/getCategorySector');\r\n },\r\n getCategoryGroups: function () {\r\n return httpService.get('admin/category/getCategoryGroups');\r\n },\r\n getCategories: function () {\r\n return httpService.get('admin/category/getCategories');\r\n },\r\n getCategoriesWithSubcategories: function () {\r\n return httpService.get('admin/category/getCategoriesWithSubcategories');\r\n },\r\n getSubCategories: function () {\r\n return httpService.get('admin/category/getSubCategories');\r\n },\r\n getCategoriesWithLevels: function (levels) {\r\n return httpService.post('admin/category/getCategoriesWithLevels', levels);\r\n }\r\n }\r\n\r\n self.interfaces = {\r\n getByBatch: function (batchIdentifier) {\r\n return httpService.get('admin/interfaces/getByBatch/' + batchIdentifier);\r\n },\r\n getByDate: function (date) {\r\n return httpService.post('admin/interfaces/getByDate', date);\r\n },\r\n getLast: function (batchIdentifier) {\r\n return httpService.get('admin/interfaces/getLast');\r\n },\r\n getDetails: function (interfaceLogId) {\r\n return httpService.get('admin/interfaces/getDetails/' + interfaceLogId);\r\n },\r\n getDetailSummary: function (interfaceLogId) {\r\n return httpService.get('admin/interfaces/getDetailSummary/' + interfaceLogId);\r\n },\r\n getFile: function (importerType, filename) {\r\n return httpService.get('admin/interfaces/getFile/' + importerType + '/' + filename);\r\n }\r\n }\r\n\r\n self.security = {\r\n getRoles: function () {\r\n return httpService.get('admin/security/roles');\r\n },\r\n getUsers: function () {\r\n return httpService.get('admin/security/users');\r\n },\r\n getStores: function () {\r\n return httpService.get('admin/security/stores');\r\n },\r\n getCategories: function () {\r\n return httpService.get('admin/security/categories');\r\n },\r\n getPermissions: function () {\r\n return httpService.get('admin/security/permissions');\r\n },\r\n changeUserRole: function (changeUserRoleDto) {\r\n return httpService.post('admin/security/changeUserRole', changeUserRoleDto);\r\n },\r\n resetUserPassword: function (resetUserPasswordDto) {\r\n return httpService.post('admin/security/resetUserPassword', resetUserPasswordDto);\r\n },\r\n assignStoresToUser: function (assignStoresToUserDto) {\r\n return httpService.post('admin/security/assignStoresToUser', assignStoresToUserDto);\r\n },\r\n assignCategoriesToUser: function (assignCategoriesToUserDto) {\r\n return httpService.post('admin/security/assignCategoriesToUser', assignCategoriesToUserDto);\r\n },\r\n assignPermissionsToRole: function (assignPermissionsToRoleDto) {\r\n return httpService.post('admin/security/assignPermissionsToRole', assignPermissionsToRoleDto);\r\n },\r\n saveUser: function (userDto) {\r\n return httpService.post('admin/security/saveUser', userDto);\r\n },\r\n disableUser: function (disableUserDto) {\r\n return httpService.post('admin/security/disableUser', disableUserDto);\r\n },\r\n createRole: function (roleName, observations) {\r\n return httpService.get('admin/security/createRole/' + roleName + '/' + observations);\r\n },\r\n getSecurityAuditTrails: function (fromDate, toDate) {\r\n return httpService.get('admin/security/auditTrails/' + fromDate + '/' + toDate);\r\n },\r\n }\r\n\r\n self.notifications = {\r\n getTop5: function () {\r\n return httpService.get('admin/notifications/getTop5');\r\n }\r\n }\r\n });\r\n\r\n","\r\nangular.module(\"prisma\")\r\n .filter('percentage', ['$filter', function ($filter) {\r\n return function (input, decimals) {\r\n return $filter('number')(parseFloat(input) * 100, decimals) + '%';\r\n };\r\n }]);\r\n\r\n\r\n\r\n","\r\nangular.module(\"prisma\")\r\n .filter('abbreviate', ['$filter', function ($filter) {\r\n return function (input, p1, p2) {\r\n var precision = 2;\r\n var prefix = null;\r\n\r\n if (p1 && typeof (p1) === \"number\") {\r\n precision = p1;\r\n }\r\n else if (p2 && typeof (p2) === \"number\") {\r\n precision = p2;\r\n }\r\n\r\n if (p1 && typeof (p1) === \"string\") {\r\n prefix = p1;\r\n }\r\n else if (p2 && typeof (p2) === \"string\") {\r\n prefix = p2;\r\n }\r\n\r\n return ian.abbreviateNumber(input, precision, prefix);\r\n };\r\n }]);\r\n\r\n\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n\r\n .directive('uiSrefDisabled', ['$parse', '$rootScope',\r\n function ($parse, $rootScope) {\r\n return {\r\n // this ensure uiSrefDisabled be compiled before ngClick\r\n priority: 100,\r\n restrict: 'A',\r\n compile: function ($element, attr) {\r\n var fn = $parse(attr.uiSrefDisabled);\r\n return {\r\n pre: function link(scope, element) {\r\n var eventName = 'click';\r\n element.on(eventName, function (event) {\r\n var callback = function () {\r\n //if (fn(scope, { $event: event })) {\r\n // prevents ng-click to be executed\r\n event.stopImmediatePropagation();\r\n // prevents href \r\n event.preventDefault();\r\n return false;\r\n //}\r\n };\r\n if ($rootScope.$$phase) {\r\n scope.$evalAsync(callback);\r\n } else {\r\n scope.$apply(callback);\r\n }\r\n });\r\n },\r\n post: function () { }\r\n }\r\n }\r\n }\r\n }\r\n ]);\r\n\r\n\r\n\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n\r\n .directive('sideNavigation', function ($timeout) {\r\n return {\r\n restrict: 'A',\r\n link: function (scope, element) {\r\n // Call metsi to build when user signup\r\n scope.$watch('authentication.user', function () {\r\n $timeout(function () {\r\n element.metisMenu();\r\n });\r\n });\r\n\r\n }\r\n };\r\n });\r\n\r\n\r\n\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n\r\n .directive(\"sectionTools\", function ($timeout) {\r\n return {\r\n link: function (scope, element, args) {\r\n var s = scope;\r\n var e = element;\r\n var a = args;\r\n\r\n scope.close = args.close === \"false\" ? false : true;\r\n scope.config = args.config === \"false\" ? false : true;\r\n },\r\n controller: function ($scope, $element) {\r\n // Function for collapse ibox\r\n $scope.toggle = function (name) {\r\n var section = $element.find('section[name=\\'' + name + '\\']');\r\n var icon = section.find(\"i:first\");\r\n var content = section.find(\"div.section-content\");\r\n content.slideToggle(200);\r\n // Toggle icon from up to down\r\n icon.toggleClass(\"fa-chevron-up\").toggleClass(\"fa-chevron-down\");\r\n section.toggleClass(\"\").toggleClass(\"border-bottom\");\r\n $timeout(function () {\r\n section.resize();\r\n section.find(\"[id^=map-]\").resize();\r\n }, 50);\r\n }\r\n\r\n $scope.$watch('ct.inputVisibility', function (newVal, oldVal) {\r\n if (newVal == 1) {\r\n $element.find('.view-all').hide();\r\n $element.find('.view-fill').show();\r\n } else {\r\n $element.find('.view-all').show();\r\n }\r\n }, true);\r\n }\r\n };\r\n });","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n\r\n .directive('script', function () {\r\n return {\r\n restrict: 'E',\r\n scope: false,\r\n link: function (scope, elem, attr) {\r\n if (attr.dataLazyLoad) {\r\n var code = elem.text();\r\n var f = new Function(code);\r\n f();\r\n }\r\n }\r\n };\r\n });\r\n\r\n","\r\nangular.module('prisma').directive('myEnter', function () {\r\n return function (scope, element, attrs) {\r\n element.bind(\"keypress\", function (event) {\r\n if (event.which === 13) {\r\n scope.$apply(function () {\r\n scope.$eval(attrs.myEnter);\r\n });\r\n\r\n event.preventDefault();\r\n }\r\n });\r\n };\r\n});","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n\r\n .directive(\"myCarousel\", function ($timeout) {\r\n return {\r\n link: function (scope, element, args) {\r\n var init = function () {\r\n if (element.length > 0) {\r\n $('a[data-slide=\"prev\"]').click(function () {\r\n $(element).carousel('prev');\r\n });\r\n\r\n $('a[data-slide=\"next\"]').click(function ele() {\r\n $(element).carousel('next');\r\n });\r\n }\r\n };\r\n\r\n angular.element(document).ready(function () {\r\n //$('#myCarousel').carousel();\r\n //$(element).carousel();\r\n init();\r\n });\r\n }\r\n };\r\n });","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n\r\n .directive('minimalizaSidebar', function ($timeout) {\r\n return {\r\n restrict: 'A',\r\n template: '',\r\n controller: function ($scope) {\r\n $scope.minimalize = function () {\r\n angular.element('body').toggleClass('mini-navbar');\r\n $timeout(function () {\r\n $(window).trigger('resize');\r\n }, 250);\r\n\r\n if (!angular.element('body').hasClass('mini-navbar') || angular.element('body').hasClass('body-small')) {\r\n // Hide menu in order to smoothly turn on when maximize menu\r\n angular.element('#side-menu').hide();\r\n // For smoothly turn on menu\r\n $timeout(function () {\r\n angular.element('#side-menu').fadeIn(400);\r\n $(window).trigger('resize');\r\n }, 200);\r\n } else {\r\n // Remove all inline style from jquery fadeIn function to reset menu state\r\n angular.element('#side-menu').removeAttr('style');\r\n }\r\n };\r\n }\r\n };\r\n });\r\n\r\n\r\n\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n.directive(\"layoutPreview\", function ($compile, $filter) {\r\n return {\r\n link: function ($scope, element, attrs, controller) {\r\n console.log('Link')\r\n\r\n var showChat = false;\r\n\r\n $scope.recreateLayoutTable = function () {\r\n console.log('layoutPreview::recreateLayoutTable')\r\n drawTable(true);\r\n };\r\n\r\n $scope.$on('recreateLayoutTable', function (event, data) {\r\n console.log('layoutPreview::recreateLayoutTable')\r\n $scope.recreateLayoutTable()\r\n });\r\n\r\n $scope.refreshLayoutTable = function () {\r\n console.log('layoutPreview::refreshLayoutTable')\r\n drawTable(false);\r\n };\r\n\r\n $scope.$on('refreshLayoutTable', function (event, data) {\r\n console.log('layoutPreview::refreshLayoutTable')\r\n\r\n $scope.refreshLayoutTable()\r\n });\r\n\r\n $scope.doRowspan = function (n) {\r\n console.log('layoutPreview::doRowspan')\r\n\r\n $scope.ct.layoutPreviewGrid[n - 1].rowspan++;\r\n var box = $scope.ct.layoutPreviewGrid[n - 1];\r\n for (var i = 0; i < $scope.ct.layoutPreviewGrid.length; i++) {\r\n if ($scope.ct.layoutPreviewGrid[i].rowNumber == box.rowNumber + (box.rowspan - 1) && $scope.ct.layoutPreviewGrid[i].colNumber == box.colNumber) {\r\n $scope.ct.layoutPreviewGrid.splice(i, 1);\r\n var anyRowFound = false;\r\n for (var j = 0; j < $scope.ct.layoutPreviewGrid.length; j++) {\r\n if ($scope.ct.layoutPreviewGrid[j].rowNumber == box.rowNumber + (box.rowspan - 1))\r\n { \r\n anyRowFound = true;\r\n break;\r\n }\r\n }\r\n if (!anyRowFound)//descuento el row number y row span de las siguientes\r\n {\r\n for (var z = 0; z < $scope.ct.layoutPreviewGrid.length; z++) {\r\n if ($scope.ct.layoutPreviewGrid[z].rowNumber == box.rowNumber) {\r\n $scope.ct.layoutPreviewGrid[z].rowspan--;\r\n }\r\n }\r\n for (var z = 0; z < $scope.ct.layoutPreviewGrid.length; z++) { \r\n if ($scope.ct.layoutPreviewGrid[z].rowNumber > box.rowNumber + (box.rowspan - 1)) {\r\n $scope.ct.layoutPreviewGrid[z].rowNumber--;\r\n }\r\n }\r\n }\r\n\r\n }\r\n }\r\n _drawTable();\r\n };\r\n\r\n $scope.doColspan = function (n) {\r\n console.log('layoutPreview::doColspan')\r\n\r\n $scope.ct.layoutPreviewGrid[n - 1].colspan++;\r\n var box = $scope.ct.layoutPreviewGrid[n - 1];\r\n for (var i = 0; i < $scope.ct.layoutPreviewGrid.length; i++) {\r\n if ($scope.ct.layoutPreviewGrid[i].colNumber == box.colNumber + (box.colspan - 1) && $scope.ct.layoutPreviewGrid[i].rowNumber == box.rowNumber) {\r\n $scope.ct.layoutPreviewGrid.splice(i, 1);\r\n var anyColFound = false;\r\n for (var j = 0; j < $scope.ct.layoutPreviewGrid.length; j++) {\r\n if ($scope.ct.layoutPreviewGrid[j].colNumber == box.colNumber + (box.colspan - 1)) {\r\n anyColFound = true;\r\n break;\r\n }\r\n }\r\n if (!anyColFound)//descuento el col number y col span de las siguientes\r\n {\r\n for (var z = 0; z < $scope.ct.layoutPreviewGrid.length; z++) {\r\n if ($scope.ct.layoutPreviewGrid[z].colNumber == box.colNumber) {\r\n $scope.ct.layoutPreviewGrid[z].colspan--;\r\n }\r\n }\r\n for (var z = 0; z < $scope.ct.layoutPreviewGrid.length; z++) {\r\n if ($scope.ct.layoutPreviewGrid[z].colNumber > box.colNumber + (box.colspan - 1)) {\r\n $scope.ct.layoutPreviewGrid[z].colNumber--;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n _drawTable();\r\n };\r\n\r\n $scope.doLoadItem = function (position, isHighlighted, promotionItemId, promotionMechanicId, salesUnitOfMeasureId, isReserved) {\r\n console.log('layoutPreview::doLoadItem')\r\n if ($scope.ct.isItemEditEnabled) {\r\n $scope.ct.loadItemToPosition(position, isHighlighted, promotionItemId, promotionMechanicId, salesUnitOfMeasureId, isReserved);\r\n }\r\n\r\n }\r\n\r\n $scope.doClearPosition = function (n, promotionItemId) {\r\n console.log('layoutPreview::doClearPosition')\r\n\r\n $scope.ct.removeItem(promotionItemId);\r\n //$scope.ct.layoutPreviewGrid[n - 1].itemDescription = '';\r\n //$scope.ct.layoutPreviewGrid[n - 1].itemCode = '';\r\n\r\n _drawTable();\r\n };\r\n\r\n $scope.doHighlight = function (n) {\r\n console.log('layoutPreview::doHighlight')\r\n if ($scope.ct.layoutPreviewGrid[n - 1].isHighlighted)\r\n $scope.ct.layoutPreviewGrid[n - 1].isHighlighted = false;\r\n else\r\n $scope.ct.layoutPreviewGrid[n - 1].isHighlighted = true;\r\n\r\n _drawTable();\r\n };\r\n\r\n $scope.doBlockPosition = function (n) {\r\n console.log('layoutPreview::doBlockPosition')\r\n\r\n if ($scope.ct.layoutPreviewGrid[n - 1].position != null)\r\n $scope.ct.layoutPreviewGrid[n - 1].position = null;\r\n else\r\n $scope.ct.layoutPreviewGrid[n - 1].position = n - 1;\r\n\r\n _drawTable();\r\n };\r\n\r\n $scope.addItem = function (n, promotionItemId, isHighlighted) {\r\n console.log('layoutPreview::addItem')\r\n\r\n $scope.ct.openAddItemDialog(n, promotionItemId, isHighlighted);\r\n\r\n _drawTable();\r\n };\r\n\r\n $scope.openAlternativeItemsDialog = function (position, isMechanic) {\r\n console.log('layoutPreview::openAlternativeItemsDialog')\r\n\r\n $scope.ct.openAlternativeItemsDialog(position, isMechanic);\r\n\r\n _drawTable();\r\n };\r\n\r\n /**\r\n * \r\n * @param {int} position posicion del layout\r\n * @param {boolean} isMechanic true si es mecanica, false si es precio producto\r\n * @param {int} promotionItemType typo de promotionItem\r\n */\r\n $scope.getItemsCount = function (position, isMechanic, promotionItemType) {\r\n //console.log('layoutPreview::getItemsCount')\r\n var selectedPage = null;\r\n\r\n if (angular.isDefined(attrs.selectedPage)) {\r\n var page = $scope.$eval(attrs.selectedPage);\r\n console.log('layoutPreview::attrs.selectedPage= %o', page);\r\n selectedPage = page;\r\n } else {\r\n selectedPage = $scope.ct.selectedPage;\r\n }\r\n var filteredArray = [];\r\n if (selectedPage && selectedPage.items) {\r\n filteredArray = selectedPage.items.filter(function (i) {\r\n return i.position == position && (i.promotionMechanicId && isMechanic || !i.promotionMechanicId && !isMechanic) && i.promotionItemType == promotionItemType;\r\n });\r\n }\r\n return filteredArray.length;\r\n \r\n };\r\n\r\n $scope.$watch('ct.files', function (newVal, oldVal) {\r\n console.log('layoutPreview::$$watch')\r\n\r\n if (newVal && newVal.length > 0) {\r\n _drawTable();\r\n }\r\n }, true);\r\n\r\n /*\r\n $scope.$watch('ct.refresh', function (newVal, oldVal) {\r\n console.log($scope.layout);\r\n if (newVal && newVal != oldVal) {\r\n drawTable();\r\n }\r\n }, true);\r\n */\r\n\r\n self._drawTable = function () {\r\n element.find('.previewLayoutTable').remove();\r\n\r\n\r\n if ($scope.ct.files !== undefined) {\r\n if ($scope.ct.files.length > 0) {\r\n var backWidth = 110 * $scope.ct.layout.columns;\r\n var backHeight = 110 * $scope.ct.layout.rows;\r\n var background = '
';\r\n element.append($(background));\r\n }\r\n }\r\n var table = '
';\r\n element.append($(table));\r\n var position = 0;\r\n\r\n for (var i = 0; i < $scope.ct.layoutPreviewGrid.length; i++) {\r\n var box = $scope.ct.layoutPreviewGrid[i];\r\n\r\n var row = element.find('.row' + box.rowNumber);\r\n if (row.length == 0) {\r\n row = '';\r\n $('.previewLayoutTable').append($(row));\r\n }\r\n\r\n row = element.find('.row' + box.rowNumber);\r\n\r\n var col = '';\r\n var highlightedClass = box.isHighlighted && box.itemDescription != '' ? ' highlighted' : '';\r\n if ($scope.ct.layoutPreviewGrid[i].position != null) {//Unlocked position\r\n if ($scope.ct.isActivationTask && box.promotionMechanicId != null && box.promotionMechanicId != 0) {//Mechanic on activation, activation is defined in ctrlJS\r\n col = '';\r\n }\r\n else {\r\n col = '';\r\n }\r\n if (box.itemCode != '') {\r\n //if (ian.imageExists(box.imageUrl))\r\n col += '';\r\n }\r\n\r\n col += '
'\r\n col += '' + box.itemDescription.toLowerCase() + '';\r\n if (box.itemDescription != '' && box.itemPromotionalPrice != null && box.itemPromotionalPrice != 0)\r\n col += '$' + box.itemPromotionalPrice + '';\r\n if (box.itemDescription != '' && box.itemNormalPromotionPrice != null && box.itemNormalPromotionPrice != 0)\r\n col += '$' + box.itemNormalPromotionPrice + '';\r\n if (box.itemDescription != '' && box.itemBonusPrice != null && box.itemBonusPrice != 0 && box.itemBonusPoints != null && box.itemBonusPoints != 0) \r\n col += '$' + box.itemBonusPrice + '+' + box.itemBonusPoints + 'p' + ''; \r\n col += '
';\r\n\r\n }\r\n else//blocked position\r\n col = '';\r\n\r\n if (box.position != null) {\r\n position++;\r\n col += '' + position + '';\r\n //if ($scope.ct.issues != null && $scope.ct.issues.length > 0 && $scope.ct.issues.some(x => x.pageNumber == $scope.ct.selectedPage.pageNumber && x.position == box.position))\r\n if ($scope.ct.issues != null && $scope.ct.issues.length > 0 && $scope.ct.checkIssueInPosition(box.position))\r\n col += '';\r\n if ($scope.getItemsCount(i+1,false, 6))\r\n col += '';\r\n if ($scope.getItemsCount(i + 1, true, 6))\r\n col += '';\r\n }\r\n if (self.showChat)\r\n col += '';\r\n\r\n if (box.isHighlighted) {\r\n if ($scope.ct.isLayoutEditable) {\r\n col += '';\r\n }\r\n else {\r\n col += '';\r\n }\r\n }\r\n else {\r\n if ($scope.ct.isLayoutEditable) {\r\n col += '';\r\n }\r\n }\r\n if (box.position != null) {\r\n if ($scope.ct.isLayoutEditable) {\r\n col += '';\r\n }\r\n }\r\n else {\r\n if ($scope.ct.isLayoutEditable) {\r\n col += '';\r\n }\r\n }\r\n\r\n if (box.itemDescription != '' && !$scope.ct.isActivationTask && !$scope.ct.isLayoutForReview && !$scope.ct.isLayoutCompare && !$scope.ct.isLayoutImageUpload && !$scope.ct.isFinalValidation) {\r\n col += '';\r\n if (box.promotionMechanicId == null || box.promotionMechanicId == 0)//mechanics cannot have variant items\r\n col += '';\r\n\r\n\r\n //if ($scope.getItemsCount(i + 1, false, 6))\r\n // col += '';\r\n //col += '';\r\n\r\n //if ($scope.getItemsCount(i + 1, true, 6))\r\n // col += '';\r\n\r\n }\r\n\r\n if ($scope.ct.isLayoutEditable) {\r\n if ((box.colNumber + box.colspan - 1) < $scope.ct.layout.columns && box.rowspan == 1) {\r\n col += '';\r\n }\r\n\r\n if ((box.rowNumber + box.rowspan - 1) < $scope.ct.layout.rows && box.colspan == 1) {\r\n col += '';\r\n }\r\n }\r\n\r\n col += '';\r\n\r\n $(row).append($compile($(col))($scope));\r\n }\r\n }\r\n\r\n self.drawTable = function (recreate, individualPage) {\r\n console.log('layoutPreview:drawTable')\r\n //$scope.ct.selectedRow = null;\r\n //$scope.ct.selectedColumn = null;\r\n var position = 0;\r\n\r\n $scope.ct.layoutPreviewGrid = [];\r\n\r\n var layout = null;\r\n var id = null;\r\n\r\n // Obtiene el id dependiendo si es por cada elemento en el repeat o seleccionado individualmente.\r\n if (angular.isDefined(individualPage)) {\r\n console.log('layoutPreview::attrs.selectedPage= %o', individualPage);\r\n id = individualPage.promotionMediaPageLayoutId;\r\n } else {\r\n id = $scope.ct.layout.id;\r\n }\r\n\r\n //if ($scope.ct.layout && $scope.ct.layout.id != 0 && !recreate) {\r\n if (recreate) {\r\n layout = $scope.ct.layout;\r\n }\r\n else {\r\n for (i = 0; i < $scope.ct.layouts.length; i++) {\r\n if ($scope.ct.layouts[i].id == id) {\r\n layout = $scope.ct.layouts[i];\r\n break;\r\n }\r\n }\r\n }\r\n \r\n\r\n if (layout && layout.id != 0 && !recreate) {\r\n\r\n angular.forEach($filter('orderBy')(layout.details, ['rowNumber', 'colNumber'], false), function (detail) {\r\n var gridCell = {\r\n rowNumber: detail.rowNumber,\r\n colNumber: detail.columnNumber,\r\n rowspan: detail.rowspan,\r\n colspan: detail.colspan,\r\n position: detail.position,\r\n isHighlighted: detail.isHighlighted,\r\n //imageUrl: detail.imageUrl,\r\n promotionItemId: 0,\r\n promotionMechanicId: 0,\r\n itemCode: '',\r\n itemDescription: '',\r\n itemPromotionalPrice: 0,\r\n itemBonusPrice: 0,\r\n itemBonusPoints: 0,\r\n itemNormalPromotionPrice: 0,\r\n isReserved: false,\r\n };\r\n\r\n var selectedPage = null;\r\n\r\n if (angular.isDefined(attrs.selectedPage)) {\r\n var page = $scope.$eval(attrs.selectedPage);\r\n console.log('layoutPreview::attrs.selectedPage= %o', page);\r\n selectedPage = page;\r\n } else {\r\n selectedPage = $scope.ct.selectedPage;\r\n }\r\n\r\n console.log('layoutPreview::selectedPage= %o', selectedPage);\r\n\r\n if (selectedPage && selectedPage.items) {\r\n angular.forEach(selectedPage.items, function (item) {\r\n if (item.position == detail.position && (item.promotionItemType == 1 || item.promotionItemType == 0 || item.promotionItemType == 4)) { //Publicados, Destacados o Reservados\r\n gridCell.salesUnitOfMeasureId = item.salesUnitOfMeasureId;\r\n gridCell.promotionItemId = item.id;\r\n gridCell.itemCode = item.code;\r\n gridCell.promotionMechanicId = item.promotionMechanicId;\r\n gridCell.itemDescription = item.description;\r\n gridCell.itemPromotionalPrice = item.promotionalPrice;\r\n gridCell.itemBonusPrice = item.loyaltyPrice;\r\n gridCell.itemBonusPoints = item.loyaltyPoints;\r\n gridCell.itemNormalPromotionPrice = item.normalPromotionPrice;\r\n gridCell.imageUrl = item.imageUrl;\r\n gridCell.isReserved = item.promotionItemType == 4;\r\n }\r\n });\r\n }\r\n\r\n $scope.ct.layoutPreviewGrid.push(gridCell);\r\n\r\n });\r\n }\r\n else {\r\n for (var i = 1; i <= layout.rows; i++) {\r\n for (var j = 1; j <= layout.columns; j++) {\r\n position++;\r\n var gridCell = {\r\n rowNumber: i,\r\n colNumber: j,\r\n rowspan: 1,\r\n colspan: 1,\r\n position: position,\r\n isHighlighted: false,\r\n imageUrl: '',\r\n promotionItemId: 0,\r\n promotionMechanicId: 0,\r\n itemCode: '',\r\n itemDescription: '',\r\n itemPromotionalPrice: 0,\r\n itemBonusPrice: 0,\r\n itemBonusPoints: 0,\r\n itemNormalPromotionPrice: 0\r\n };\r\n\r\n $scope.ct.layoutPreviewGrid.push(gridCell);\r\n }\r\n }\r\n }\r\n\r\n _drawTable();\r\n }\r\n\r\n // Si posee el atributo selectedPage fuerza a dibujar la tabla por cada elemento.\r\n if (angular.isDefined(attrs.selectedPage)\r\n && angular.isDefined($scope.$eval(attrs.selectedPage))) {\r\n var individualPage = $scope.$eval(attrs.selectedPage);\r\n\r\n if (individualPage.promotionMediaPageLayoutId !== 0) {\r\n drawTable(false, individualPage);\r\n }\r\n }\r\n\r\n }\r\n }\r\n});\r\n\r\n\r\n\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n\r\n .directive(\"ionRangeSlider\", function ionRangeSlider() {\r\n return {\r\n restrict: \"A\",\r\n scope: {\r\n rangeOptions: \"=\",\r\n onChange: \"=\"\r\n },\r\n link: function (scope, elem, attrs) {\r\n\r\n scope.rangeOptions.onFinish = scope.onChange;\r\n\r\n elem.ionRangeSlider(scope.rangeOptions);\r\n\r\n }\r\n }\r\n });\r\n\r\n\r\n\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n\r\n .directive(\"iboxTools\", function ($timeout) {\r\n return {\r\n restrict: \"A\",\r\n scope: true,\r\n templateUrl: \"app/components/common/ibox_tools.html\",\r\n link: function (scope, element, args) {\r\n var s = scope;\r\n var e = element;\r\n var a = args;\r\n\r\n scope.close = args.close === \"false\" ? false : true;\r\n scope.config = args.config === \"false\" ? false : true;\r\n },\r\n controller: function ($scope, $element) {\r\n $scope.fullscreen = false;\r\n // Function for collapse ibox\r\n $scope.showhide = function () {\r\n var ibox = $element.closest(\"div.ibox\");\r\n var icon = $element.find(\"i:first\");\r\n var content = ibox.find(\"div.ibox-content\");\r\n content.slideToggle(200);\r\n // Toggle icon from up to down\r\n icon.toggleClass(\"fa-chevron-up\").toggleClass(\"fa-chevron-down\");\r\n ibox.toggleClass(\"\").toggleClass(\"border-bottom\");\r\n $timeout(function () {\r\n ibox.resize();\r\n ibox.find(\"[id^=map-]\").resize();\r\n }, 50);\r\n }\r\n // Function for close ibox\r\n $scope.closebox = function () {\r\n var ibox = $element.closest(\"div.ibox\");\r\n ibox.remove();\r\n }\r\n // Function for full screen\r\n $scope.fullscreen = function () {\r\n var ibox = $element.closest(\"div.ibox\");\r\n var button = $element.find(\"i.fa-expand\");\r\n $(\"body\").toggleClass(\"fullscreen-ibox-mode\");\r\n button.toggleClass(\"fa-expand\").toggleClass(\"fa-compress\");\r\n ibox.toggleClass(\"fullscreen\");\r\n setTimeout(function () {\r\n $(window).trigger(\"resize\");\r\n }, 100);\r\n }\r\n }\r\n };\r\n });\r\n\r\n\r\n\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n\r\n.directive('focusMe', ['$timeout', '$parse', function ($timeout, $parse) {\r\n return {\r\n \r\n link: function (scope, element, attrs) {\r\n var model = $parse(attrs.focusMe);\r\n scope.$watch(model, function (value) {\r\n if (value === true) {\r\n $timeout(function () {\r\n element[0].focus();\r\n });\r\n }\r\n });\r\n }\r\n };\r\n}]);\r\n\r\n\r\n\r\n\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n\r\n .directive(\"myEnter\", function () {\r\n return function (scope, element, attrs) {\r\n element.bind(\"keydown keypress\", function (event) {\r\n if (event.which === 13) {\r\n scope.$apply(function () {\r\n scope.$eval(attrs.myEnter);\r\n });\r\n\r\n event.preventDefault();\r\n }\r\n });\r\n };\r\n\r\n });\r\n\r\n\r\n\r\n\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n\r\n .directive(\"countTo\", function ($timeout) {\r\n return {\r\n replace: false,\r\n scope: true,\r\n link: function (scope, element, attrs) {\r\n\r\n var e = element[0];\r\n var num, refreshInterval, duration, steps, step, countTo, value, increment;\r\n\r\n var calculate = function () {\r\n refreshInterval = 30;\r\n step = 0;\r\n scope.timoutId = null;\r\n countTo = parseInt(attrs.countTo) || 0;\r\n scope.value = parseInt(attrs.value, 10) || 0;\r\n duration = (parseFloat(attrs.duration) * 1000) || 0;\r\n\r\n steps = Math.ceil(duration / refreshInterval);\r\n increment = ((countTo - scope.value) / steps);\r\n num = scope.value;\r\n }\r\n\r\n var tick = function () {\r\n scope.timoutId = $timeout(function () {\r\n num += increment;\r\n step++;\r\n if (step >= steps) {\r\n $timeout.cancel(scope.timoutId);\r\n num = countTo;\r\n e.textContent = countTo;\r\n } else {\r\n e.textContent = Math.round(num);\r\n tick();\r\n }\r\n }, refreshInterval);\r\n\r\n }\r\n\r\n var start = function () {\r\n if (scope.timoutId) {\r\n $timeout.cancel(scope.timoutId);\r\n }\r\n calculate();\r\n tick();\r\n }\r\n\r\n\r\n attrs.$observe(\"countFrom\", function (val) {\r\n attrs.value = val;\r\n });\r\n\r\n attrs.$observe(\"countTo\", function (val) {\r\n if (val) {\r\n start();\r\n }\r\n });\r\n\r\n\r\n return true;\r\n }\r\n }\r\n\r\n });\r\n\r\n\r\n\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n .directive('convertToNumber', function () {\r\n return {\r\n require: 'ngModel',\r\n link: function (scope, element, attrs, ngModel) {\r\n ngModel.$parsers.push(function (val) {\r\n return val != null ? parseInt(val, 10) : null;\r\n });\r\n ngModel.$formatters.push(function (val) {\r\n return val != null ? '' + val : null;\r\n });\r\n }\r\n };\r\n });\r\n\r\n\r\n\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n\r\n .directive(\"colored\", function ($timeout, colors) {\r\n return {\r\n link: function (scope, element, attrs) {\r\n\r\n\r\n scope.$watch(function () {\r\n return element.css(\"border-bottom-color\");\r\n }, styleChangedCallBack, true);\r\n\r\n attrs.$observe(\"subcategory\", function (val) {\r\n setBackgroundColor(attrs.catColor, val);\r\n });\r\n\r\n\r\n function styleChangedCallBack(newValue, oldValue) {\r\n if (newValue !== oldValue) {\r\n attrs.catColor = newValue;\r\n setBackgroundColor(attrs.catColor, attrs.subcategory);\r\n }\r\n }\r\n\r\n function setBackgroundColor(categoryColor, subCategory) {\r\n\r\n var colorName = colors.getSubcategoryColor(categoryColor, subCategory);\r\n\r\n element.css(\"background-color\", colorName);\r\n }\r\n }\r\n }\r\n\r\n });\r\n\r\n\r\n\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n\r\n .directive(\"bufferedScroll\", function ($parse) {\r\n return function ($scope, element, attrs) {\r\n var handler = $parse(attrs.bufferedScroll);\r\n element.scroll(function (evt) {\r\n var scrollTop = element[0].scrollTop,\r\n scrollHeight = element[0].scrollHeight,\r\n offsetHeight = element[0].offsetHeight;\r\n if (scrollTop === (scrollHeight - offsetHeight)) {\r\n $scope.$apply(function () {\r\n handler($scope);\r\n });\r\n }\r\n });\r\n };\r\n\r\n });\r\n\r\n\r\n\r\n\r\n","\r\nangular.module(\"prisma\")\r\n .config(function ($translateProvider, companyJson) {\r\n\r\n\r\n ////use preferred and fallback\r\n //$translateProvider\r\n // .fallbackLanguage(companyJson.Translations.FallbackLanguage)\r\n // .preferredLanguage(companyJson.Translations.PreferredLanguage);\r\n\r\n ////load preferred language\r\n //$.getScript(\"assets/translations/\" + companyJson.Translations.PreferredLanguage + \".js\")\r\n // .done(function (translation) {\r\n // $translateProvider.translations(companyJson.Translations.PreferredLanguage, getTranslation());\r\n // });\r\n\r\n ////load fallback language\r\n //if (companyJson.Translations.FallbackLanguage != companyJson.Translations.PreferredLanguage) {\r\n // $.getScript(\"assets/translations/\" + companyJson.Translations.FallbackLanguage + \".js\")\r\n // .done(function (translation) {\r\n // $translateProvider.translations(companyJson.Translations.FallbackLanguage, getTranslation());\r\n // });\r\n //}\r\n\r\n $translateProvider\r\n .translations(\"es\", {\r\n Points: \"Puntos\",\r\n UnitSales: \"Venta Unitaria\",\r\n Price: \"Precio\",\r\n Cost: \"Costo\",\r\n CostsByProvider: \"Costos por Proveedor\",\r\n CostsByVendors: \"Costos por Distribuidores\",\r\n Benchmark: \"Comparación\",\r\n TotalUnits: \"Unidades totales\",\r\n YesterdayPrice: \"Precio de ayer\",\r\n Inventory: \"Inventario\",\r\n Prices: \"Precios\",\r\n Range: \"Surtido\",\r\n Language: \"Idioma\",\r\n English: \"Inglés\",\r\n Spanish: \"Español\",\r\n ProductCost: \"Costo del producto\",\r\n DiffInDollars: \"Diferencia en pesos\",\r\n NotificationTitle: \"Cayo el margen bruto\",\r\n NotificationSubtitle: \"La Coca Cola 1.5L fue el producto con mayor caida en margen bruto en todo el negocio.\",\r\n TheReasons: \"Las Razones\",\r\n Reason1: \"Aumento el costo y no se actualizo el precio de venta\",\r\n Iagree: \"Estoy de acuerdo!\",\r\n Idesagree: \"No estoy de acuerdo...\",\r\n Discard: \"Descartar\",\r\n Reason2: \"Cayo el volumen de ventas\",\r\n SubReason1: \"Se detecto estacionalidad semanal, los domingos se vende mas que los lunes.\",\r\n ChartTitle: \"Gráfico de Evolución: \",\r\n ChartTitleStrong: \"Coca Cola 1.5L\",\r\n Week: \"Semana\",\r\n Month: \"Mes\",\r\n Year: \"Año\",\r\n SalesInDollars: \"Venta ($)\",\r\n MarginInDollars: \"Margen ($)\",\r\n ChartFooter: \"Indicadores Disponibles: Unidades, Precio, Venta, Margen\",\r\n PricesTableTitle: \"Precios de Competidores\",\r\n PricesTableTitleCol1: \"Competidor\",\r\n PricesTableTitleCol2: \"Fecha\",\r\n PricesTableTitleCol3: \"Precio\",\r\n PricesTableTitleCol4: \"En Promoción\",\r\n PricesTableTitleCol5: \"Dirección\",\r\n MapTitle: \"Ubicación Competidor: \",\r\n Back: \"Volver\",\r\n WeatherTitle: \"Clima de ayer\",\r\n InSales: \"En Ventas\",\r\n WeatherDesc: \"El último dia registrado con clima similar se vendieron 54 unidades más.\",\r\n InventoryTitle: \"Indicadores de Inventario\",\r\n InventoryDays: \"Dias de Inventario\",\r\n InventoryComment: \"Son los dias restantes de inventario.\",\r\n GMROI: \"GMROI\",\r\n InventoryFooter: \" de margen por cada $ invertido en inventario\",\r\n RangeTitle: \"Indicadores de Surtido\",\r\n RangeLine1: \" de la categoría Bebidas en la tienda 1\",\r\n RangeLine1Sub: \" subio 2 posiciones\",\r\n RangeLine2: \" de la categoría Bebidas en toda la red\",\r\n RangeLine2Sub: \" subio 5 posiciones\",\r\n RangeLine3: \" de la categoría Bebidas en el mercado\",\r\n RangeLine3Sub: \" bajo 1 posición\",\r\n StoreManager: \"Gerente de tienda\",\r\n Profile: \"Perfil\",\r\n Contacts: \"Contactos\",\r\n Mailbox: \"Mensajes\",\r\n Logout: \"Salir\",\r\n Home: \"Inicio\",\r\n SmartDashboard: \"Tablero Inteligente\",\r\n Maps: \"Mapas\",\r\n DeviationAnalysis: \"Análisis de desvios\",\r\n WeatherAnalysis: \"Análisis del clima\",\r\n BcgMatrix: \"Matriz BCG\",\r\n Pivot: \"Pivot\",\r\n Notifications: \"Notificaciones\",\r\n NEW: \"NUEVO\",\r\n Decisions: \"Decisiones\",\r\n Elasticities: \"Elasticidades\",\r\n PromotionAnalysis: \"Análisis de Promociones\",\r\n Sensitivity: \"Sensibilidades\",\r\n RulesAndStrategies: \"Estrategia y Reglas\",\r\n Competitors: \"Competidores\",\r\n RangeAnalysis: \"Análisis de Surtido\",\r\n Segmentation: \"Segmentación\",\r\n TicketAnalysis: \"Análisis de Tickets\",\r\n BasketAnalysis: \"Análisis de Canasta\",\r\n Spaces: \"Espacios\",\r\n Planograms: \"Planogramas\",\r\n Layouts: \"Planos\",\r\n SpaceAnalysis: \"Análisis de Espacios\",\r\n StockAnalysis: \"Análisis de Stocks\",\r\n OrderSuggestions: \"Sugerencias de Pedido\",\r\n Suppliers: \"Proveedores\",\r\n Administration: \"Administración\",\r\n GeneralSettings: \"Configuración General\",\r\n Importers: \"Importadores\",\r\n Masters: \"Maestros\",\r\n DiscardConfirmTitle: \"¿Está seguro?\",\r\n DiscardConfirmSub: \"La razón será descartada\",\r\n YesDiscard: \"Si, descartar\",\r\n DiscardMessageTitle: \"Descartada!\",\r\n DiscardMessageComment: \"No volverá a ver esta razón.\",\r\n ThanksForFeedback: \"Gracias por tu feedback!\",\r\n ThanksForFeedbackComment: \"Tus colaboración además de ayudarnos a mejorar, te permite sumar \",\r\n ThanksForFeedbackPoints: \" puntos\",\r\n ThanksForFeedbackTitle2: \"Suma puntos con tu Feedback\",\r\n DisagreeTitle: \"No estoy de acuerdo\",\r\n DisagreeSub: \"Cuentanos cual crees que fue el motivo\",\r\n Send: \"Enviar\",\r\n Costs: \"Costos\",\r\n CompetitorsPrices: \"Precios de competidores\",\r\n CompetitivePosition: \"Posicion Competitiva\",\r\n MarketAnalysis: \"Análisis de Mercado\",\r\n Clusters: \"Clusters\",\r\n StoresIncluded: \"Tiendas Incluidas\",\r\n Stores: \"Tiendas\",\r\n Store: \"Tienda\",\r\n StoresToBeIncludedByCategories: \"Seleccione Tiendas a incluir por Categoría\",\r\n TypeOfStore: \"Tipo de Tienda\",\r\n SelectTypeOfStore: \"--Selecionar tipo de Tienda--\",\r\n AddStore: \"Agregar Tienda\",\r\n StoreMasters: \"Maestro de Tiendas\",\r\n AssignStores: \"Asignar Tiendas\",\r\n Close: \"Cerrar\",\r\n AssignmentOfStores: \" Asignacion de Tiendas\",\r\n ByStore: \"Por Tienda\",\r\n ByStores: \"Por Tiendas\",\r\n TopNavbarSearch: \"Buscar Productos, Categorías, Tiendas y Clusters\",\r\n BenchmarksStepOne: \"Seleccione al menos 2 Tiendas o Categorías o Cluster para comparar\",\r\n StoresToCompare: \"Tiendas a comparar\",\r\n SelectStores: \"Seleccione Tiendas\",\r\n PerformanceByProvinceSubtitle: \"El siguiente es un resumen de densidad de Tiendas por provincia y su performance\",\r\n PerformanceByProvinceSubtitle2: \"El siguiente es un resumen de densidad de Tiendas por provincia y su performance (con drill-down por Departamento)\",\r\n TotalStores: \"Total Tiendas:\",\r\n BaseStore: \"Tienda base\",\r\n SelectStore: \"Seleccione Tienda\",\r\n MirrorStore: \"Tienda espejo\",\r\n ChooseComparableStores: \"Elegir Tiendas comparables\",\r\n MaintainThePriceOfMirrorStores: \"Mantener el precio de las Tiendas espejo igual\",\r\n PriceChangesReportSubtitle: \"El siguiente reporte muestra un resumen de los cambios de precios informados al ERP por fecha de vigencia y Tiendas\",\r\n AddPricesArea: \"Agregar Zona de Precios\",\r\n Name: \"Nombre\",\r\n National: \"Nacional\",\r\n Enabled: \"Habilitada\",\r\n Yes: \"Si\",\r\n ToDisable: \"Deshabilitar\",\r\n EnableTooltip: \"Habilitar\",\r\n Save: \"Guardar\",\r\n ItsBase: \"Es Base\",\r\n ItsNational: \"Es Nacional\",\r\n Excluded: \"Está Excluido\",\r\n ExplicationCompetitors: \"Administre aqui los Grupos de Competidores y sus Puntos de Venta para poder establecer reglas de posicionamiento competitivo\",\r\n NewGroup: \"Nuevo Grupo\",\r\n NewCompetitor: \"Nuevo Competidor\",\r\n CompetitorsGroup: \"Grupo de Competidores\",\r\n DragCompetitorsHere: \"ARRASTRE COMPETIDORES AQUÍ\",\r\n OnlyNew: \"Solo nuevos\",\r\n WithoutGroups: \"Sin Grupos\",\r\n Logo: \"Logo\",\r\n SonOf: \"Hijo de\",\r\n SelectFather: \"--Seleccionar Padre--\",\r\n SelectFamily: \"--Selecione Familia--\",\r\n ExternalCode: \"Codigo Externo\",\r\n Address: \"Dirección\",\r\n Brand: \"Marca\",\r\n CorporateName: \"Nombre Corporativo\",\r\n Latitude: \"Latitud\",\r\n Length: \"Longitud\",\r\n Marker: \"Marcador\",\r\n Observe: \"Observar\",\r\n SelectPriceZones: \"Seleccione Zonas de Precios\",\r\n CreateSensitivity: \"Crear Sensibilidad\",\r\n Order: \"Orden\",\r\n SurveyFrequency: \"Frecuencia de Relevamiento\",\r\n Expiration: \"Expiracion\",\r\n ValidityDays: \"Dias de Vigencia\",\r\n MondayAbbreviation: \"L\",\r\n TuesdayAbbreviation: \"M\",\r\n WednesdayAbbreviation: \"M\",\r\n ThursdayAbbreviation: \"J\",\r\n FridayAbbreviation: \"V\",\r\n SaturdayAbbreviation: \"S\",\r\n SundayAbbreviation: \"D\",\r\n SelectSurveyFrequency: \"Seleccionar Frecuencia de Relevamiento\",\r\n Monday: \"Lunes\",\r\n Tuesday: \"Martes\",\r\n Wednesday: \"Miércoles\",\r\n Thursday: \"Jueves\",\r\n Friday: \"Viernes\",\r\n Saturday: \"Sabado\",\r\n Sunday: \"Domingo\",\r\n CreateRoundingRule: \"Crear Regla de Redondeo\",\r\n LoadItemsToExclude: \"Cargar Items a excluir\",\r\n RoundingRules: \"Reglas de Redondeo\",\r\n EditRoundingRuleSubtitle: \"En caso de tener más de un redondeo para un mismo tipo de precio y rango, Prisma intentará cumplir con la regla más específica según su ámbito de aplicación (primero categoría y luego zona de precios)\",\r\n TypeOfPrice: \"Tipo de Precio\",\r\n RoundingType: \"Tipo de Redondeo\",\r\n Decimals: \"Decimales\",\r\n Tolerance: \"Tolerancia\",\r\n DirectionRoundingRules: \"Dir\",\r\n TestPanel: \"Panel de Pruebas\",\r\n TestPanelSubtitle: \"No toma en cuenta las reglas con ámbitos de aplicación\",\r\n PriceToRound: \"Precio a Redondear\",\r\n EnterValue: \"Ingrese Valor\",\r\n ResultWithRoundingApplied: \"Resultado con Redondeo aplicado\",\r\n TryRounding: \"Probar Redondeo\",\r\n SelectPriceType: \"Seleccionar tipo de precio\",\r\n Terminations: \"Terminaciones\",\r\n SubcategoriesToInclude: \"Subcategorías a incluir\",\r\n SubcategoriesToExclude: \"Subcategorías a excluir\",\r\n AreasToInclude: \"Zonas a incluir\",\r\n AreasToBeExcluded: \"Zonas a excluir\",\r\n Select: \"Seleccionar\",\r\n AddNewRank: \"Agregar Nuevo Rango\",\r\n SelectDecimals: \"Seleccionar Decimales\",\r\n Insert: \"Insertar\",\r\n Add: \"Agregar\",\r\n EditTerminations: \"Editar Terminaciones\",\r\n New1: \"Nueva\",\r\n Cancel: \"Cancelar\",\r\n Accept: \"Aceptar\",\r\n StrategyAndPriceRules: \"Estrategia y reglas de Precio\",\r\n ExplicationStrategyAndPriceRules: \"Cargue los lineamientos de margen bruto para cada una de las categorías / subcategorías, indicando el margen objetivo, el mínimo y el máximo.
Indique también la variación de precios mínima y máxima\\r\\nPor último ingrese el competidor principal para cada una de las categorías / subcategorías.\",\r\n DescriptionRule: \"Descripcion Regla\",\r\n Validity: \"Vigencia\",\r\n AreaOfApplication: \"Ámbito de aplicación\",\r\n Acceptance: \"Aceptación\",\r\n Description: \"Descripción\",\r\n Subcategories: \"Subcategorías\",\r\n Items: \"Items\",\r\n PlaceholderSearchItem: \"Ingrese descripción o código de artículo\",\r\n PriceTypes: \"Tipos de precio\",\r\n PriceType: \"Tipo de precio\",\r\n CompetitionAreas: \"Zonas de Competencia\",\r\n Labels: \"Etiquetas\",\r\n Properties: \"Propiedades\",\r\n RelationshipRule: \"Regla de Parentesco\",\r\n Areas: \"Zonas\",\r\n RulesOfKinshipOfZones: \"Las reglas de Parentesco de zonas son evaluadas cada vez que se cambia un precio de una Zona Padre. \\r\\nLos filtros marcados con * no afectan la seleccion de items.\",\r\n SelectParentPriceZone: \"Seleccione Zona de Precios Padre\",\r\n SelectKindOfType: \"Seleccione Tipo de Parentesco\",\r\n DifferenceIn: \"Diferencia en\",\r\n AllSubcategories: \"Todas las Sub-Categorías\",\r\n AllArticleGroups: \"Todos los Grupos de Articulos\",\r\n AllPricesZones: \"Todas las Zonas de Precios \",\r\n ExceptZoneFather: \"Excepto Zona Padre\",\r\n AllSuppliers: \"Todos los Proveedores\",\r\n ApplySKUs: \"Aplicar a SKUs que contengan la siguiente descripcion/marca\",\r\n ScopeOfExclusion: \"Ámbito de exclusión\",\r\n ExcludeSKUs: \"Excluir a SKUs que contengan la siguiente descripcion/marca\",\r\n SelectSubcategories: \"Seleccione Subcategorías\",\r\n SelectArticleGroup: \"Seleccione Grupo de articulos\",\r\n SelectSuppliers: \"Seleccione Proveedores\",\r\n SelectSensibilitiesToInclude: \"Seleccione Sensibilidades a Incluir\",\r\n SelectLabelsToInclude: \"Seleccione Etiquetas a Incluir\",\r\n SelectSubcategoriesToExclude: \"Seleccione Sub-Categorías a excluir\",\r\n SelectItemGroupsToExclude: \"Seleccione Grupos de articulos a excluir\",\r\n SelectPriceAreasToExclude: \"Seleccione Zonas de Precios a excluir\",\r\n SelectSuppliersToExclude: \"Seleccione Proveedores a excluir\",\r\n SelectSensitivityToExclude: \"Seleccione Sensibilidades a excluir\",\r\n SelectTagsToExclude: \"Seleccione Etiquetas a excluir\",\r\n Products: \"Productos\",\r\n RulesOfRelationshipOfProducts: \"Las reglas de Parentesco de productos son evaluadas cada vez que se cambia un precio de un producto Padre. \\r\\n Los filtros marcados con * no afectan la seleccion de items.\",\r\n SelectFather: \"Seleccione Padre\",\r\n Generic: \"Genérico:\",\r\n ParentProductVariant: \"Este producto padre es una variante del producto\",\r\n GenericRuleVariant: \"Es regla Genérico - Variante\",\r\n SuggestionRule: \"Regla de Sugerencia\",\r\n Margin: \"Margen\",\r\n MarginRules: \"Las reglas de margen generan sugerencias de precios en base al cambio de costos de proveedores. \\r\\n Los filtros marcados con * no afectan la seleccion de items.\",\r\n TargetMargin: \"Margen Objetivo\",\r\n KeepMargin: \"Mantener Margen\",\r\n KeepSameMarginPercentage: \"Mantener mismo margen %\",\r\n KeepSameMargin$: \"Mantener mismo margen $\",\r\n Competitive1: \"Competitiva\",\r\n CompetitiveRules: \"Las reglas de posicionamiento competitivo generan sugerencias de precios en base al cambio de un precio del mercado. \\r\\n Los filtros marcados con * no afectan la seleccion de items.\",\r\n SelectPointOfSale: \"Seleccione Punto de Venta\",\r\n SelectTypesOfObservations: \"Seleccione Fuentes de Monitoreo\",\r\n ConsiderOnlyCompetitorsSamePriceArea: \"Considerar solo competidores en la misma zona de precios\",\r\n Use: \"Usar\",\r\n MoreThanOneFashionToUse: \"Si hay más de una moda usar\",\r\n LessOfaFashionToUse: \"y si hay más de una moda con misma cantidad de repeticiones usar\",\r\n ApplyToProducts: \"Aplicar a Productos que contengan la siguiente descripcion/marca\",\r\n CancelTheChangesMade: \"Cancelar los cambios realizados\",\r\n SaveCompetitionRule: \"Guardar regla de Competencia\",\r\n SaveMargenRule: \"Guardar regla de Margen\",\r\n SaveParentageRule: \"Guardar regla de Parentesco\",\r\n SaveZoneRule: \"Guardar regla de Zonas\",\r\n GenerateSuggestions: \"Generar Sugerencias\",\r\n CategoryReview: \"Revision de Categoría\",\r\n TooltipGenerateSuggestionsButton: \"El proceso de generacion de sugerencias se ejecuta periodicamente de acuerdo a la frecuencia configurada en cada categoría y tambien cuando se incorpora nueva informacion de mercado. Desde aqui podra ser ejecutado en forma manual\",\r\n EvaluateMarginRules: \"Evaluar Reglas de Margen\",\r\n EvaluateCompetitionRules: \"Evaluar Reglas de Competencia\",\r\n EvaluateRelationshipRules: \"Evaluar Reglas de Parentesco\",\r\n ExportToAnExcel: \"Exportar a un Excel los datos de la grilla\",\r\n IncludeAllItems: \"Incluir todos los items de la grilla\",\r\n ExcludeAllItems: \"Excluir todos los items de la grilla\",\r\n SaveAllChangesPriceDecisions: \"Guardar todos los cambios realizados: sugerencias aceptadas, precios cambiados, sugerencias ignoradas, precios endosados y endosos rechazados.\",\r\n AcceptSuggestions: \"Aceptar Sugerencias\",\r\n AcceptSuggestionsTooltip: \"Aceptar todas las sugerencias según filtros aplicados\",\r\n EndorseAll: \"Endosar Todos\",\r\n EndorseAllTooltip: \"Endosa todos los precios pendientes según filtros aplicados\",\r\n MarkAsRevised: \"Marcar como Revisada\",\r\n Normal: \"Normales\",\r\n MarkAsRevisedAllNormalPricesTooltip: \"Marca como revisados todos los precios NORMALES\",\r\n MarkAsRevisedAllPricesOfCompetitionTooltip: \"Marca como revisados todos los precios de COMPETENCIA\",\r\n MarkAsRevisedAllPricesTooltip: \"Marca como revisados TODOS los precios\",\r\n Status: \"Estado\",\r\n PreviousPrice: \"Precio Anterior\",\r\n ThePriceVariationLimitHasBeenExceededTooltip: \"Se ha excedido el limite de Variacion de Precio. Los limites son: de\",\r\n To: \"a\",\r\n TheMarginLimitHasBeenExceededTooltip: \"Se ha excedido el limite de Margen. Los limites son: de\",\r\n GeneralInformation: \"Información General\",\r\n Ean: \"EAN\",\r\n BaseUm: \"UM Base\",\r\n ProductInformation: \"Informacion del Producto\",\r\n Maker: \"Fabricante\",\r\n NewLabel: \"Nueva etiqueta\",\r\n Quality: \"Calidad\",\r\n Premium: \"Premium\",\r\n Apply: \"Aplicar\",\r\n Area: \"Zona\",\r\n Action: \"Acción\",\r\n Situation: \"Situación\",\r\n ChangePriceManually: \"Cambiar Precio Manualmente\",\r\n AcceptSuggestion: \"Aceptar Sugerencia\",\r\n Reverse: \"Revertir\",\r\n Endorse: \"Endosar\",\r\n ToRefuse: \"Rechazar\",\r\n MarkAsEndosada: \"Marcar como Endosada\",\r\n ModifyMargin: \"Modificar Margen\",\r\n PercentajeMargin: \"Margen %\",\r\n UpdateDates: \"Actualizar Fechas\",\r\n DateFrom: \"Fecha Desde\",\r\n DateUntil: \"Fecha Hasta\",\r\n ForEndorsement: \"Para Endoso\",\r\n Falls: \"Bajas\",\r\n Rises: \"Subas\",\r\n StrongFalls: \"Fuertes Bajas\",\r\n StrongRises: \"Fuertes Subas\",\r\n DepressedMargins: \"Márgenes Deprimidos\",\r\n HighMargins: \"Márgenes Altos\",\r\n NegativeMargins: \"Márgenes Negativos\",\r\n LittleSignificantChanges: \"Cambios Poco Significativos\",\r\n SuggestedNotRespected: \"Sugerencia No Respetada\",\r\n Overlaps: \"Solapados\",\r\n SeeMap: \"Ver Mapa\",\r\n Page: \"Página\",\r\n Position: \"Posición\",\r\n CurrentPrices: \"Precios Vigentes\",\r\n Motive: \"Motivo\",\r\n Reasons: \"Motivos\",\r\n CompetitorsReferenceSameZone: \"Referencia de Competidores en la misma Zona\",\r\n ReasonForSuggestion: \"Motivo de la Sugerencia\",\r\n LowForts: \"Fuertes Bajas\",\r\n LastPricesInformedERP: \"Últimos Precios Informados al ERP\",\r\n GenerationDate: \"Fecha de Generación\",\r\n GenerationTime: \"Hora de Generación\",\r\n Archive: \"Archivo\",\r\n PricesPendingToInform: \"Precios Pendientes a Informar\",\r\n Un_select: \"De(seleccionar)\",\r\n PricesToInform: \"Precios a Informar\",\r\n AllTypesOfPrice: \"Todos los tipos de precio\",\r\n AllStores: \"Todas las tiendas\",\r\n AllCategories: \"Todas las categorías\",\r\n SelectAllVisiblePricesTooltip: \"Selecciona / Deselecciona todos los precios visibles (considerando filtros)\",\r\n GenerateTheFileToInformTheERPTooltip: \"Genera el archivo para informar al ERP los precios seleccionados. Dichos precios pasaran a estado Informado en Prisma.\",\r\n Delete: \"Eliminar\",\r\n NewTest: \"Nuevo Test\",\r\n RemoveTheSelectedTestsTooltip: \"Elimina los test seleccionados\",\r\n CreateAnewTestTooltip: \"Crea un nuevo test\",\r\n PriceChangesReport: \"Reporte de Cambios de Precios\",\r\n PriceMapReport: \"Reporte de mapa de precios\",\r\n ReportInformed: \"Reporte informados\",\r\n OnlyThoseNotImplemented: \"Solo los no implementados\",\r\n DailyMarginsReport: \"Reporte Márgenes Diarios\",\r\n VolumeMeasurement: \"Medición de Volumen\",\r\n MixEvolution: \"Evolución del MIX\",\r\n ImportantInformation: \"Informacion Importante\",\r\n ExplanationNewCost: \"Agregue los nuevos costos con el botón '+ Agregar Costo'. \\r\\n Estos aparecerán grisados en el listado, hasta que se haya apretado el botón de 'Guardar nuevos costos y Generar Sugerencias'. \\r\\n Una vez que se hayan guardado correctamente, volverá a ver el listado de manera normal.\",\r\n AddCost: \"Agregar Costo\",\r\n SaveNewCosts: \"Guardar Nuevos Costos y Generar Sugerencias\",\r\n BulkLoad: \"Carga Masiva\",\r\n Supplier: \"Proveedor\",\r\n CenterOfDistribution: \"Centro de Distribucion\",\r\n ProductCode: \"Codigo de Producto\",\r\n NameOfProduct: \"Nombre de Producto\",\r\n StartDate: \"Fecha de Inicio\",\r\n NetCost: \"Costo Neto\",\r\n Taxes: \"Impuestos\",\r\n SelectDistributionCenter: \"Seleccionar Centro de Distribucion\",\r\n ItemCode: \"Código de artículo\",\r\n SelectItem: \"Seleccionar Item\",\r\n Tax: \"Impuesto\",\r\n TaxRate: \"Tasa de impuesto\",\r\n Subsidy: \"Subsidio\",\r\n FreightCost: \"Costo flete\",\r\n DateEffectiveFrom: \"Fecha Vigencia Desde\",\r\n FreightCostText: \"Costo Teórico de Flete desde su centro de distribucion hacia la estacion es de\",\r\n CreatePlanogram: \"Crear Planograma\",\r\n Dimension: \"Dimensión\",\r\n ModalTitleCreatePlanogram: \"Nuevo Planograma\",\r\n NewPlanogramLegend1: \"Complete los siguientes campos\",\r\n NewPlanogramLegend2: \"Arrastre el elemento deseado hacia la 'Zona de Arrastre' y complete los campos\",\r\n NewPlanogramLegend3: \"Haga clic en mostrar elementos si desea arrastrar un nuevo módulo\",\r\n ModalTitleEditPlanogram: \"Editar Planograma\",\r\n Width: 'Ancho',\r\n Height: 'Alto',\r\n Depth: 'Profundidad',\r\n AddShelfToPlanogram: 'Agregar Mueble al Planograma',\r\n RemoveShelfFromPlanogram: 'Eliminar Mueble del Planograma',\r\n SaveShelf: 'Guardar Mueble',\r\n LevelOfPlanogram: 'Nivel del Planograma',\r\n ExplanationAddLevels: 'Agrega el número de niveles al Planograma, la altura de cada uno de los niveles será la misma , salvo especificación posterior. Se puede editar manualmente la altura de cada nivel haciendo click en los \"+\" \"-\".',\r\n Optional: 'Opcional',\r\n ExplanationAddOneLevel: 'Se puede agregar un nuevo nivel con una altura definida, al inicio o al final del planograma.',\r\n NumberOfEqualLevels: 'N° de Niveles Iguales',\r\n CompleteAllFieldsToCreateANewPlanogram: 'Complete todos los campos para crear un nuevo Planograma.',\r\n AtTheEndPressTheNextButton: 'Al finalizar presione el botón siguiente.',\r\n Fornitures: 'Muebles',\r\n Print: 'Imprimir',\r\n PrintPlanogram: 'Imprimir el Planograma',\r\n ShowDimensions: 'Ver Dimensiones',\r\n HideDimensions: 'Ocultar Dimensiones',\r\n FromThePlanogram: \"Mostrar u ocultar las dimensiones del Planograma\",\r\n Clean: 'Limpiar',\r\n CleanPlanogram: 'Eliminar todos los items acomodados en el Planograma',\r\n EditDimensionsTooltip: \"Edite las dimensiones del Planograma o agregue un nuevo Módulo\",\r\n EditPlanogramDimensions: \"Editar Dimensiones\",\r\n GoToThePlanogramViewMode: 'Ir al modo Vista del Planograma',\r\n GoToThePlanogramEditMode: 'Ir al modo Editar Planograma',\r\n GoToTheLayoutViewMode: 'Ir al modo Vista del Layout',\r\n GoToTheLayoutEditMode: 'Ir al modo Editar Layout',\r\n AssignStoresLayout: \"Asignar tiendas al Layout\",\r\n SeeAuditPicture: 'Ver fotos de Auditoría del Planograma',\r\n RequestApproval: 'Solicitar Aprobación',\r\n RequestApprovalTooltip: 'Marca el Planograma como Terminado y Solicitar Aprobación',\r\n Approve: \"Aprobar\",\r\n ApproveTooltip: \"Aprobar el Planograma\",\r\n AssingFrontsTo: 'Asignar frentes para',\r\n Maximize: 'Maximizar',\r\n MinimumFronts: 'Mínimo de frentes',\r\n MaximumFronts: 'Máximo de frentes',\r\n PercentageOfOccupiedSpace: 'Porcentaje de espacio ocupado',\r\n Percentage: 'Porcentaje',\r\n AddRule: 'Agregar Regla',\r\n TopToBottom: 'Arriba hacia abajo',\r\n BottomToTop: 'Abajo hacia arriba',\r\n LeftToRight: 'Izquierda a Derecha',\r\n RightToLeft: 'Derecha a Izquierda',\r\n Upward: 'Ascendente',\r\n Falling: 'Descendente',\r\n Measure: 'Medida',\r\n AddOrder: 'Agregar Ordenamiento',\r\n AddRestriction: 'Agregar Restricción',\r\n GENERATE: 'GENERAR',\r\n WithoutCategoryAssigned: 'Sin Categoría Asignada',\r\n Delist: 'Delistados',\r\n SeeTickets: 'ver Tickets',\r\n DeleteAnItem: 'Eliminar un Item',\r\n AddItem: 'Agregar Item',\r\n Front: 'Frente',\r\n Side: 'Lateral',\r\n Top: 'Superior',\r\n Subcategory: 'Subcategoría',\r\n Manufacturer: 'Fabricante',\r\n Sales: 'Ventas',\r\n Units: 'Unidades',\r\n SalesInStore: 'Ventas en tienda',\r\n PriceInStore: 'Precio en Tienda',\r\n UnitsInStore: 'Unidades en Tienda',\r\n StockInStore: 'Stock en tienda',\r\n SalesInCluster: 'Ventas en Cluster',\r\n AveragePriceInCluster: 'Precio Promedio en Cluster',\r\n UnitsInCluster: 'Unidades en Cluster',\r\n StockInCluster: 'Stock en cluster',\r\n ExhibitionDays: 'Días de Exhibición',\r\n ShowProductInformation: 'Mostrar Información de Productos',\r\n WithoutRule: 'Sin Regla',\r\n RepositionFrequencyInDays: 'Frecuencia de reposición en días',\r\n Tag: 'Etiqueta',\r\n OrderBy: 'Ordenar por',\r\n WithoutOrder: 'Sin Orden',\r\n MarginInCluster: 'Margen en Cluster',\r\n Weight: 'Peso',\r\n Aream2: 'Area',\r\n WithoutFilters: 'Sin Filtros',\r\n Filters: 'Filtros',\r\n SelectTag: \"Seleccionar Etiqueta\",\r\n SelectBrand: \"Seleccionar Marca\",\r\n SelectManufacturer: \"Seleccionar Fabricante\",\r\n Select: 'Seleccionar',\r\n NewSingular: 'Nuevo',\r\n Edit: 'Editar',\r\n NewTypeOfTicket: \"Nuevo Tipo de Ticket\",\r\n SelectTypeTicket: \"--Selecionar Tipo de Ticket--\",\r\n NeedDescription: \"Necesita Descripción\",\r\n NewPlanogram: \"Nuevo Planograma\",\r\n Complete: \"Completar\",\r\n From1: \"De\",\r\n ChangeSenseOrientation: \"Cambiar Sentido de Circulación\",\r\n SenseCirculation: \"Sentido de Circulación\",\r\n AutoStack: \"Apilar\",\r\n ShowDoor: \"Mostrar Puerta\",\r\n Tags: \"Etiquetas\",\r\n ProductChat: \"Chat del Producto\",\r\n NewMessage: \"Nuevo Mensaje\",\r\n Write: \"Escribir\",\r\n DelistProduct: \"Producto Delistado\",\r\n LiquidarProduct: \"LIQUIDAR PRODUCTO\",\r\n AskForWithdrawal: \"PEDIR RETIRO\",\r\n ChooseCriteria: \"Elegir criterio\",\r\n HighPriority: \"Prioridad Alta\",\r\n MediumPriority: \"Prioridad Media\",\r\n LowPriority: \"Prioridad Baja\",\r\n StopFollowingTicket: \"Dejar de seguir Ticket\",\r\n FollowTicket: \"Seguir Ticket\",\r\n Elements: \"Elementos\",\r\n EditElement: \"Editar Elementos\",\r\n Container: \"Contenedor\",\r\n Columns: \"Columnas\",\r\n AddElements: \"Agregar Elementos\",\r\n AddLevelToThePlanegram: \"Agregar Nivel al Planograma\",\r\n AddLevel: \"Agregar el Nivel indicado al Planograma\",\r\n Measurements: \"Medidas\",\r\n Dropzone: \"Zona de Arrastre\",\r\n DragItemhere: \"Arrastra un elemento aquí\",\r\n NewFurniture: \"Nuevo Mueble\",\r\n IncreaseHeightPlanogram: \"Aumentar la altura del Nivel del Planograma\",\r\n ReduceHeightPlanogram: \"Reducir la altura del Nivel del Planograma\",\r\n RemovePlanogramLevel: \"Eliminar el Nivel del Planograma\",\r\n NewModuleTitle: \"Nuevo Módulo\",\r\n NumberLevels: \"Numero de Niveles\",\r\n DivisionsOrDoors: \"Divisiones o puertas\",\r\n PositionIn: \"Posicionar en:\",\r\n ShowElements: \"Mostrar Elementos\",\r\n EditElement: \"Editar Elemento\",\r\n InsertInTheSameColumn: \"Insertar en la misma columna\",\r\n InsertInNewColumnOnLeft: \"Insertar en una nueva columna a la izquierda\",\r\n InsertInNewColumnOnRight: \"Insertar en una nueva columna a la derecha\",\r\n Refrigerator: \"Heladera\",\r\n NewTags: \"Nuevas Etiquetas\",\r\n Quantity: \"Cantidad\",\r\n UnitOfMeasureAbbreviation: \"UN de Medida\",\r\n BaseUnitOfMeasure: \"Unidad de Medida Base\",\r\n ValidationEan1: \"existe en la base de dato (campo no valido)\",\r\n ValidationEan2: \"Valido\",\r\n UploadPhotosItem: \"Subir fotos\",\r\n UploadPhotosItemTooltip: \"Subir fotos para esta Unidad de Medida\",\r\n RemoveThisUnitOfMeasure: \"Eliminar esta Unidad de Medida\",\r\n UnitOfMeasureCode: \"Código de Unidad de Medida\",\r\n AddUnitOfMeasure: \"Agregar Unidad de Medida\",\r\n UploadItemPictures: \"Cargar Fotos del Item\",\r\n ItemInFront: \"del item de frente\",\r\n ProfileItem: \"del item de perfil\",\r\n ItemAbove: \"del item de arriba\",\r\n Distributor: \"Distribuidor\",\r\n DischargeDate: \"Fecha de Alta\",\r\n Conversion: \"Conversión\",\r\n Dimensions: \"Dimensiones\",\r\n Place: \"Plaza\",\r\n HeightText: \"Representa la suma de los niveles\",\r\n NoImage: \"Sin Foto\",\r\n NoImageSubtitle: \"Agregue foto de auditoria\",\r\n EditLayout: \"Editar Layout\",\r\n EditUnitOfMeasures: \"Edición unidad de medida\",\r\n ProductHigh: \"Alta de Producto\",\r\n DeleteItem: \"Eliminar item o grupo de items\",\r\n ChangeFront: \"Cambiar el frente del item o del grupo de items\",\r\n AddItemBehind: \"Agregar item o grupo de items detrás\",\r\n DeleteItemBehind: \"Eliminar item o grupo de items detrás\",\r\n AddItemToRight: \"Agregar ítem a la derecha\",\r\n DeleteItemOnRight: \"Eliminar el ítem de la derecha\",\r\n AddItemAbove: \"Agregar Item o grupo de items arriba\",\r\n DeleteItemAbove: \"Eliminar Ítem o grupo de items de arriba\",\r\n TooltipForStoreUnits: \"No hay suficientes unidades para completar los frentes\",\r\n TooltipForStoreUnits2: \"No hay suficientes unidades para completar la carga total\",\r\n MoreInformation: \"Más Información\",\r\n TooltipRemoveElement: \"Eliminar el elemento seleccionado\",\r\n MoreZoom: \"Darle mas zoom al Planograma\",\r\n LessZoom: \"Darle menos zoom al Planograma\",\r\n AveragePerformance: \"Performance Promedio\",\r\n SelectPriceType: \"--Seleccione un tipo de precio--\",\r\n InformToERPTooltip: \"Genera el archivo para informar al ERP los precios filtrados. Dichos precios pasaran a estado Informado en Prisma.\",\r\n YouMustSelectACategory: \"Debe seleccionar una categoría\",\r\n NoResultsFor: \"Sin resultados para\",\r\n AddFreightCost: \"Agregar Costo Flete / Estímulo\",\r\n CostOfFreightAndStimulus: \"Costo de Fletes y Estímulos\",\r\n ItemCode1: \"Código de item\",\r\n FreightCost: \"Costo de flete\",\r\n Stimulus: \"Estímulo\",\r\n SelectArea: \"--Seleccionar zona--\",\r\n Article: \"Artículo\",\r\n AddRegion: \"Agregar Región\",\r\n Region: \"Región\",\r\n SubcategoriesToInclude: \"Subcategorías a incluir\",\r\n SubcategoriesToExclude: \"Subcategorías a excluir\",\r\n PricingZonesToExclude: \"Zonas de Precios a excluir\",\r\n PriceZonesToInclude: \"Zonas de Precios a incluir\",\r\n AcceptSelectedSuggestions: \"Aceptar las sugerencias seleccionadas\",\r\n IgnoreSelectedSuggestions1: \"Ignorar las sugerencias seleccionadas\",\r\n EndorseSelectedItems: \"Endosar los items seleccionados aceptando las modificaciones\",\r\n RejectSelectedChanges: \"Rechazar los cambios seleccionados (Permite ingresar un mensaje de rechazo)\",\r\n ModifyMarginInStaggeredWay: \"Modificar margen en forma escalonada indicando un Margen $ objetivo\",\r\n MassiveDatesUpdate: \"Actualización Masiva de Fechas de Vigencia para Nuevos Precios\",\r\n MassiveLoad: \"Carga Masiva\",\r\n IndividualLoad: \"Carga Individual\",\r\n SaveABTesting: \"Guardar AB Testing\",\r\n PercentageOfTheRiseOrFall: \"% de la suba o baja\",\r\n ItMustMatchExactly: \"Debe coincidir en forma exacta con las regiones informadas por la autoridad\",\r\n FreightCostTooltip: \"Ingresar aquí el costo del flete en $ por litro\",\r\n StimulusTooltip: \"Ingresar aquí el estimulo fiscal en $ por litro\",\r\n FilterApplied: \"Filtro aplicado\",\r\n LastModification: \"Ult. Modif.\",\r\n EditPlanogramStructure: \"Editar Estructura de Planograma\",\r\n CopyingThisStructure: \"Nuevo Planograma Copiando esta Estructura\", \r\n ClearPlanogram: \"Borrar Planograma\",\r\n SaveThePlanogram: \"Guardar el Planograma\",\r\n YouDoNotHavePermissionsToSave: \"No tiene permisos para Guardar\",\r\n Active: \"Activos\",\r\n ClickToFilterBy: \"Clic para filtrar por\",\r\n ClickToEdit: \"Clic para editar\",\r\n Copy: \"Copiar\",\r\n CopyTooltip: \"Copiar último módulo e insertar a la derecha\",\r\n DataImporter: \"Importador de Datos\",\r\n UploadFiles: \"Subir Archivos\",\r\n DragTheFileHere: \"Arrastrar el archivo aquí \",\r\n DragTheFileHere1: \"o hacer click para buscar en tu PC\",\r\n VerifyFormat: \"Verificar Formato\",\r\n ValidateInformation: \"Validar Información\",\r\n UpdateTables: \"Actualizar Tablas\",\r\n UploadFile: \"Subir Archivo\",\r\n ValidateData: \"Validar Datos\",\r\n AddCategories: \"Agregar Categorías\",\r\n Finalize: \"Finalizar\",\r\n SelectSubcategory: \"--Seleccione Subcategoría--\",\r\n Subcategory2: \"SubCategoria2\",\r\n GoToStep2Tooltip: \"Ir al paso 2\",\r\n GoToStep3Tooltip: \"Ir al paso 3\",\r\n GoToStep4Tooltip: \"Ir al paso 4\",\r\n RestartTheImporter: \"Reinicia el importador para subir nuevos archivos\",\r\n ManualSettlementsOverwriteSuggestedSettlements: \"Alerta: Las Liquidaciones Manuales sobreescriben las Liquidaciones Sugeridas\",\r\n LiquidationsByExpirationOverwriteSuggestedLiquidations: \"Alerta: Las Liquidaciones por Vencimiento sobreescriben las Liquidaciones Sugeridas.\",\r\n BleachSensitivities: \"Blanquear Sensibilidades\",\r\n NewHighRule: \"Nueva Regla Altas\",\r\n NewRuleLows: \"Nueva Regla Bajas\",\r\n SaveProductRegistrationRule: \"Guardar regla de Alta de Productos\",\r\n SaveProductDropRule: \"Guardar regla de Baja de Productos\",\r\n ButtonGenerateSuggestionsAssortmentTooltip: \"El proceso de generacion de sugerencias se ejecuta periodicamente de acuerdo a la frecuencia configurada en cada categoria y tambien cuando se incorpora nueva informacion de mercado. Desde aqui podra ser ejecutado en forma manual\",\r\n NewRuleTitle: \"NUEVA REGLA\",\r\n NewHighRuleIntro: \"Las reglas de altas serán utilizadas por el sistema para generar sugerencias de inclusión de nuevos artículos que esten performando bien en el mercado. Para definir este criterio pueden utilizarse diferentes variables y condicionales en cualquier combinación elegida.\",\r\n CoverageInfo: \"Tener en cuenta la cobertura objetivo de las distintas marcas al momento de crear la regla de cobertura.\",\r\n ObjectiveFor: \" objetivo para \",\r\n SelectAnOption: \"Seleccione una Opción\",\r\n AllClusters: \"Todos los Clusters\",\r\n AllTags: \"Todas las Etiquetas\",\r\n SelectSubcategoriesToInclude: \"Seleccione Subcategorías a Incluir\",\r\n SelectClustersToExclude: \"Seleccione Clusters a excluir\",\r\n NewLowRuleIntro: \"Las reglas de baja serán utilizadas por el sistema para generar sugerencias de baja de artículos existentes que no esten performando bien. Para definir este criterio pueden utilizarse diferentes variables y condicionales en cualquier combinación elegida.\",\r\n AssortmentMatrixStep1: \"Seleccionar: Bandera , Formato y Cliente.\",\r\n AssortmentMatrixStep2: \"Seleccionar Sector, Sección, Familia, Sub-Familias y Cluster. \",\r\n AssortmentMatrixStep3: \"Seleccionar si se desea apertura por Fabricante o Marca (o ambas).\",\r\n AssortmentMatrixStep4: \"Seleccionar 1 o más etiquetas.\",\r\n AssortmentMatrixStep5: \"Seleccionar periodo.\",\r\n SaveTemplate: \"Guardar Template\",\r\n OpenTemplate: \"Abrir Template\",\r\n AssortmentReport: \"Reporte de Surtido\",\r\n Flag: \"Bandera\",\r\n AllFlags: \"Todas los banderas\",\r\n Format: \"Formato\",\r\n AllFormats: \"Todos los formatos\",\r\n Client: \"Cliente\",\r\n AllClients: \"Todos los clientes\", \r\n Scope: \"Alcance\",\r\n Section: \"Sección\",\r\n Family: \"Familia\",\r\n Subfamily: \"Sub-familia\",\r\n AllSubfamily: \"Todas las Sub-Familias\",\r\n Opening: \"Apertura\",\r\n UpTo5Labels: \"Solo puede seleccionar hasta 5 etiquetas\",\r\n Months3: \"3 Meses\",\r\n Months6: \"6 Meses\",\r\n Run: \"Ejecutar\",\r\n Export: \"Exportar\",\r\n ManagementOfItems: \"Gestión de Items\",\r\n ManagementOfItemsLegend1: \"Búsqueda de productos: Elija categoría/s, subcategoría/s y filtre por texto libre, al terminar presione el boton 'Buscar'.\",\r\n ManagementOfItemsLegend2: \"Modificación de atributos: Modifica o agrega los atributos que quieres actualizar de forma masiva, al finalizar presione el boton 'Aplicar'.\",\r\n ManagementOfItemsLegend3: \"Listado de Items: En la siguiente tabla podrá visualizar los cambios aplicados.\",\r\n ManageItems: \"Gestionar Items\",\r\n SearchManageItems: \"Buscar por código, nombre, marca, fabricante\",\r\n FilterTooltip: \"Filtrar\",\r\n SelectedTags: \"Seleccionar Etiquetas\",\r\n AddNewTagTooltip: \"Agregar nueva etiqueta\",\r\n AsignForPersist: \"Ahora debes asignar el nuevo atributo al menos a un item\",\r\n Group: \"Grupo\",\r\n SelectedGroup: \"Seleccione Grupo\",\r\n YouMustSelectAtLeastOneCategory: \"Debe seleccionar al menos una Categoría\",\r\n ManagementOfItemsTitle1: \"Búsqueda de productos\",\r\n ManagementOfItemsTitle2: \"Modificación de atributos\",\r\n ManagementOfItemsTitle3: \"Listado de Items\",\r\n NewTagGroup: \"Nuevo Grupo de Etiquetas\",\r\n NewBrand: \"Nueva Marca\",\r\n NewManufacturer: \"Nuevo Fabricante\",\r\n WithoutProducts: \"Sin Productos\",\r\n FullView: \"Vista completa\",\r\n UnitsStock: \"Stock Unidades\",\r\n TheItemWasAdded: \"Se agregó el ítem\",\r\n Aggregate: \"Agregado\",\r\n Actives: \"Activos\",\r\n EnterFurnitureToPrint: \"Ingrese muebles a imprimir\",\r\n EnterFurnitureToPrintSubtitle: \"Si deja vacio se imprimirán todos los muebles. Puede usar rangos. Ej: 2-5\",\r\n InvalidRank: \"El rango ingresado es inválido\",\r\n InvalidRankSubtitle: \"Debe escribir una posición de mueble valida\",\r\n ConfigurationFinished: \"Configuración finalizada\",\r\n AllReadyToPrintThePlanogram: \"Todo listo para imprimir el planograma\",\r\n Planogram: \"Planograma\",\r\n Seconds: \" segundos\",\r\n Since: \"Hace \",\r\n YearAgo: \" año\",\r\n MonthAgo: \" mes\",\r\n DayAgo: \" día\",\r\n HourAgo: \" hora\",\r\n MinuteAgo: \" minuto\",\r\n Sp_generalKpis_Kpis: \"KPIs Generales\",\r\n Sp_generalKpis_Filters: \"Filtros\",\r\n Sp_generalKpis_Category: \"Categoría\",\r\n Sp_generalKpis_rentability: \"Rentabilidad\",\r\n Sp_generalKpis_averagePrice: \"Precio Promedio\",\r\n Sp_generalKpis_spacing: \"Espaciado\",\r\n Sp_generalKpis_tags: \"Etiquetas\",\r\n Sp_generalKpis_zones: \"Zonas\",\r\n Sp_generalKpis_applyButton: \"Aplicar\",\r\n Sp_editLayout_AddTicketTooltip: \"Agregar Ticket al Planograma Seleccionado\",\r\n Sp_editLayout_rotateTooltip: \"Rotar Planograma seleccionado\",\r\n Sp_editLayout_deleteTooltip: \"Eliminar Planograma seleccionado\",\r\n Sp_editPlanogram_Recommendation: \"Recomendación\",\r\n Pr_competitors_checkboxMarker: \"Se considera los precios relevados de este competidor para la generación de sugerencias\",\r\n Pr_competitors_checkboxObserve: \"Se van relevar los precios de este competidor\",\r\n PriceEvolution: \"Evolución de Precios\",\r\n CompetitiveIndex: \"Índice de Competitividad\",\r\n CompetitiveByZone: \"Competitividad x Zona\",\r\n CompetitiveByCompetitor: \"Competitividad x Competidor\",\r\n CompetitiveByCategory: \"Competitividad x Categoria\",\r\n SelectPricingZone: \"-- Seleccionar Zona de Precios --\",\r\n Pr_competitiveIndex_subtitle: \"Cambie el agrupador para ver de diferentes maneras el Índice de Competitividad\",\r\n Pr_competitiveIndex_GroupBy: \"Agrupar por:\",\r\n Pr_competitiveIndex_CompetitivenessFor: \"Competitividad por\",\r\n Pr_competitiveIndex_Ci: \"IC\",\r\n Pr_competitiveIndex_Cheaper: \"Más Barato\",\r\n Pr_competitiveIndex_TheSame: \"Iguales\", \r\n Pr_competitiveIndex_MoreExpensive: \"Más Caro\",\r\n Pr_competitiveIndex_TypeOfSurvey: \"Tipo de Relevamiento\",\r\n Pr_decisions_restore: \"Restablecer\",\r\n Sp_editLayout_validationArea: \"El Area de Ventas no puede ser mayor al Area total\",\r\n Pr_decisions_ExperimentalPrice: \"Precio Simulado\",\r\n Pr_decisions_Close: \"Cerrar\",\r\n Pr_decisions_CloseTooltip: \"Deseleccionar todos los items\",\r\n Pr_decisions_Experiment: \"Simulación\",\r\n Pr_decisions_ChangePrice: \"Cambiar Precio\",\r\n Pr_decisions_Selected: \"Seleccionados\",\r\n Pr_volumeMeasurement_legend1: \"Seleccione un producto\",\r\n Pr_volumeMeasurement_legend2: \"Seleccione una zona de precios\",\r\n Pr_volumeMeasurement_legend3: \"Complete las fechas 'Desde' y 'Hasta' para visualizar el gráfico\",\r\n Pr_volumeMeasurement_evolutionOfTheMIX: \"Evolución del MIX\",\r\n Pr_volumeMeasurement_validationDate: \"Fecha Desde no puede ser mayor a la fecha Hasta\",\r\n Sp_planograms_editStructure: \"Editar Estructura\",\r\n Sp_planograms_editStructureTooltip: \"Editar la estructura del planograma o agregar un nuevo mueble\",\r\n Sp_planograms_copyStructure: \"Copiar Estructura\",\r\n Sp_planograms_copyStructureAndProducts: \"Copiar Estructura y Productos\",\r\n Sp_editPlanogram_editLevelsTooltip: \"Edite las dimensiones de los niveles del Planograma\",\r\n Sp_createPlanogram_loadStoresIndividually: \"Cargar tiendas de manera individual\",\r\n Sp_createPlanogram_loadStoresMassively: \"Cargar tiendas de manera masiva\",\r\n Sp_editPlanogram_space: \"Espacio\",\r\n Sp_editPlanogram_spaced: \"Espaciado: \",\r\n Sp_editPlanogram_new: \"Nuevo\",\r\n Sp_editPlanogram_pendingApproval: \"Aprobación pendiente\",\r\n Sp_editPlanogram_approved: \"Aprobado\",\r\n Sp_editPlanogram_informed: \"Informado\",\r\n Sp_editLayout_moreZoomTooltip: \"Darle más zoom al Layout\",\r\n Sp_editLayout_lessZoomTooltip: \"Darle menos zoom al Layout\",\r\n SP_editPlanogram_Autocomplete_Strategy: \"Definir Estrategia\",\r\n SP_editPlanogram_Autocomplete_ExhibitionDays: \"Días de Exhibición Objetivo\",\r\n SP_editPlanogram_Autocomplete_Results: \"Resultado\",\r\n SP_editPlanogram_Autocomplete_ResultsSummary: \"Resumen\",\r\n SP_editPlanogram_Autocomplete_ResultsSummary_Part1: \"Se incluyeron \",\r\n SP_editPlanogram_Autocomplete_ResultsSummary_Part2: \" items en el planograma\",\r\n SP_editPlanogram_Autocomplete_ResultsSummary_Part3: \"de un total de \",\r\n SP_editPlanogram_Autocomplete_ResultsSummary_Part4: \" items \",\r\n SP_editPlanogram_Autocomplete_ResultsSummary_Part5: \"y no fueron incluidos \",\r\n SP_editPlanogram_Autocomplete_ResultsSummary_Part6: \" items del surtido activo.\",\r\n SP_editPlanogram_Autocomplete_ResultsSummary: \"Detalle de items no incluidos\",\r\n SP_editPlanogram_Autocomplete_ResultsTableCode: \"Código\",\r\n SP_editPlanogram_Autocomplete_ResultsTableDesc: \"Descripción\",\r\n Pr_competitors_selectBrand: \"--Seleccionar Bandera--\",\r\n Ad_missions_newMissions: \"Nueva Misión\",\r\n Ad_missions_mission: \"Misión\",\r\n Ad_missions_missionType: \"Tipo de Misión\",\r\n Ad_missions_finishDate: \"Fecha de Finalización\",\r\n Ad_missions_users: \"#Usuarios\",\r\n Ad_missions_advance: \"Avance\",\r\n Ad_missions_daysToExpire: \"Días por vencer\",\r\n Ad_missions_programming: \"Programación\",\r\n Ad_missions_surveyMethod: \"Método de relevamiento\", \r\n Ad_missions_selectMissionType: \"--Seleccione tipo de misión--\", \r\n Ad_missions_selectsMethod: \"--Seleccione Metodo--\",\r\n Ad_missions_selectFrecuency: \"--Seleccione Frecuencia--\",\r\n Ad_missions_selectActionType: \"--Seleccione Tipo de Accion--\",\r\n Ad_missions_timeToCompleteIt: \"Plazo para completarla\",\r\n Ad_missions_inDays: \"En días\",\r\n Ad_missions_startsOn: \"Empieza el:\",\r\n Ad_missions_endsThe: \"Finaliza el:\",\r\n Ad_missions_brand: \"Bandera / Marca\",\r\n Ad_missions_selectBrand: \"--Seleccione Marcas--\",\r\n Ad_missions_region: \"Estado / Región\",\r\n Ad_missions_selectRegion: \"--Seleccione Regiones--\",\r\n Ad_missions_location: \"Distrito / Localidad\",\r\n Ad_missions_selectLocation: \"--Seleccione Localidad--\",\r\n Ad_missions_priceZone: \"Zona de Precios\",\r\n Ad_missions_selectpriceZone: \"--Seleccione zona de precios--\",\r\n Ad_missions_specificStores: \"Tiendas Especificas\",\r\n Ad_missions_selectSpecificStores: \"--Seleccione tiendas--\",\r\n Ad_missions_products: \"Productos\",\r\n Ad_missions_group: \"Grupo\",\r\n Ad_missions_selectGroup: \"--Seleccione Grupos--\",\r\n Ad_missions_subGroup: \"Subgrupos\",\r\n Ad_missions_selectSubGroup: \"--Seleccione Subgrupos--\",\r\n Ad_missions_Items: \"Artículos\",\r\n Ad_missions_selectItems: \"--Seleccione Artículos--\",\r\n Ad_missions_responsible: \"Responsables\",\r\n Ad_missions_selectShopper: \"Seleccione Shopper\",\r\n Ad_missions_shopper: \"Shopper\",\r\n Ad_missions_addShopper: \"Agregar un nuevo responsable\",\r\n Ad_missions_legendResponsable: \"Asigne tiendas a un responsable específico para hacer el relevamiento\",\r\n Pr_competitors_selectPlace: \"--Seleccionar Plaza--\",\r\n Adm_brands_brands: \"Banderas\",\r\n Adm_brands_addBrand: \"Agregar Bandera\",\r\n Adm_brands_brandName: \"Nombre de la Marca\",\r\n Adm_brands_searchBrand: \"Buscar Bandera...\",\r\n Adm_brands_newBrand: \"Nueva Bandera\",\r\n Adm_brands_editBrand: \"Editar Bandera\",\r\n\r\n\r\n //JS\r\n SaveSwalTitle: \"Esta seguro que desea guardar la Tienda?\",\r\n StoreSaved: \"Tienda guardada\",\r\n ErrorWhenSavingTheStore: \"Ocurrio un error al guardar la Tienda\",\r\n ValidationNameStore: \"Debe elegir un nombre para la Tienda\",\r\n ValidationTypeStore: \"Debe elegir un tipo de Tienda\",\r\n EnableDisableSwalTitle: \"la Tienda\",\r\n UpdatedStores: \"Tiendas Actualizadas\",\r\n AssignedStoresSwalTitle: \"Tiendas Asignadas\",\r\n AssignedStoresSwalSubTitle: \"Se asignaron correctamente las Tiendas al usuario\",\r\n ValidationMirrorStoreAndBaseStore: \"La Tienda espejo debe ser diferente de la Tienda base\",\r\n ValidationSelectedStoreNotHaveAPrice: \"La Tienda seleccionada no tiene un precio para el item elegido\",\r\n DstPopUpInformativeGraphic: \"mas $ de venta\",\r\n StoreAndCD: \"Tienda y Centro de Distribución\",\r\n StoreDescendant: \"Desc. Tienda\",\r\n CategoryTreeMap: \"Arbol de Categorías\",\r\n ByCategory: \"Por categoría\",\r\n Setup: \"Configuración\",\r\n PriceZones: \"Zonas de Precios\",\r\n Rounding: \"Redondeo\",\r\n Goals: \"Objetivos\",\r\n Reports: \"Reportes\",\r\n Welcome: \"Bienvenido a Prisma!\",\r\n InformToERP: \"Informar al ERP\",\r\n PriceElasticity: \"Elasticidad de precios\",\r\n Reports: \"Reportes\",\r\n PriceChanges: \"Cambios de Precios\",\r\n PriceMap: \"Mapa de precios\",\r\n InformedPrices: \"Precios informados\",\r\n DailyMargins: \"Margenes Diarios\",\r\n ReplenishmentCosts: \"Costos de Reposicion\",\r\n Promotions: \"Promociones\",\r\n Campaigns: \"Campañas\",\r\n Workflows: \"Procesos\",\r\n Rules: \"Reglas\",\r\n PromotionalActions: \"Acciones Promocionales\",\r\n Calendar: \"Calendario\",\r\n ControlPanel: \"Tablero de Control\",\r\n MyTasks: \"Mis Tareas\",\r\n Communicate: \"Comunicación\",\r\n BIReports: \"Reportes BI\",\r\n Markdowns: \"Liquidaciones\",\r\n SelectionRules: \"Reglas de seleccion\",\r\n Missions: \"Misiones\",\r\n MarketData: \"Inf. de Mercado\",\r\n NewPrices: \"Nuevos Precios\",\r\n Sensitivities: \"Sensibilidades\",\r\n Security: \"Seguridad\",\r\n Users: \"Usuarios\",\r\n PrismaDevelopedBy: \"Prisma fue desarrollado por\",\r\n InformationUpdatedUpTo: \"Informacion actualizada a\",\r\n SALES: \"VENTAS\",\r\n SalesYTD: \"Ventas YTD\",\r\n VsPlan: \"vs Plan\",\r\n PlanProgress: \"Avance del plan anual\",\r\n AnnualPlan: \"Plan Anual\",\r\n Forecasted: \"Proyectado\",\r\n VsPrevYear: \"vs Año anterior\",\r\n MARGIN: \"MARGEN $\",\r\n COST: \"COSTO\",\r\n UNITS: \"UNIDADES\",\r\n MarginYTD: \"Margen YTD\",\r\n UnitsYTD: \"Unidades YTD\",\r\n CostYTD: \"Costo YTD\",\r\n MarginDecreased: \"Cayo el margen\",\r\n PriceInS: 'Precio en $',\r\n HeatMap: 'Mapa de Calor',\r\n HeatMapSubtitle: \"En este mapa podrá observar su performance por Pais, Estado, Ciudad o Tienda.\",\r\n PreviousMonth: \"Mes Anterior\",\r\n SameMonthPrevYear: \"Mismo mes año ant.\",\r\n SelectCategory: \"-- Seleccione Categoría --\",\r\n SalesIn: \"Venta en\",\r\n Population: \"Poblacion\",\r\n Households: \"Viviendas\",\r\n GreaterThan: \"mayor a\",\r\n Between: \"entre\",\r\n And: \" y \",\r\n LessThan: \"menor a\",\r\n SelectSector: \"--Selecione Sector--\",\r\n SelectState: \"--Selecione Estado/Provincia--\",\r\n Colors: \"Colores\",\r\n Size: \"Tamaño\",\r\n Period: \"Periodo\",\r\n START: \"INICIAR\",\r\n Analysis: \"Análisis\",\r\n SelectedPeriod: \"Periodo seleccionado\",\r\n DifferenceSamePeriodPrevYear: \"Diferencia con mismo periodo, año anterior\",\r\n State: \"Estado/Provincia\",\r\n ShowSalesDistributionBetween: \"Muestra la distribucion de la venta entre las\",\r\n Categories: \"Categorías\",\r\n Stores: \"Tiendas\",\r\n TheSizeOfTheCirclesCorresponds: \"El tamaño de los círculos corresponde a las\",\r\n Category: \"Categoría\",\r\n Store: \"Tienda\",\r\n Place: \"Plaza\",\r\n TheColorShowsTheVariation: \"El color muestra la variacion entre el periodo actual y el periodo anterior.\",\r\n DTSLegend1: \"Aqui se puede ver como cada categoría o tienda performo versus el periodo anterior. El color de la burbuja indica la magnitud del cambio que tambien es referenciado en el eje Y.\",\r\n PriceDecisionsCategory: \"Decisiones de precios por categoría\",\r\n PriceDecisionsCategorySubtitle1: \"El siguiente es un resumen de las sugerencias y precios nuevos por categoría.\",\r\n PriceDecisionsCategorySubtitle2: \"Elija la categoría o subcategoría sobre la que desea trabajar haciendo un click sobre la misma.\",\r\n Search: \"Buscar...\",\r\n ClickToEnterCategory: \"Clic para ingresar a la categoría\",\r\n RegularSuggestions: \"Sugerencias Regulares\",\r\n Suggestions: \"Sugerencias\",\r\n SuggestionsQuantity: \"Cantidad de sugerencias\",\r\n NumberCompetitiveSuggestions: \"Cantidad de sugerencias competitivas\",\r\n Impact: \"Impacto\",\r\n ShowsImpactInMargin: \"Muestra el impacto en margen si se aceptan las sugerencias.\",\r\n ShowsImpactInPesos: \"Muestra el impacto en pesos de la sugerencia\",\r\n CompetitiveSuggestions: \"Sugerencias Competencia\",\r\n NewRegular: \"Nuevos Regulares\",\r\n New: \"Nuevos\",\r\n BigDrop: \"Fuerte Baja\",\r\n BigDropToolTip: \"Precios nuevos que bajaron mas de lo permitido para esta categoría.\",\r\n BigIncrease: \"Fuerte Suba\",\r\n BigIncreaseToolTip: \"Precios nuevos que subieron mas de lo permitido para esta categoría.\",\r\n MarginMin: \"< Margen min\",\r\n MarginMintTooltip: \"Precios nuevos que estan por debajo del margen minimo para esta categoría\",\r\n MarginMax: \"> Margen max\",\r\n MarginMaxTooltip: \"Precios nuevos que estan por arriba del margen maximo para esta categoría.\",\r\n NewCompetitive: \"Nuevos Competitivos\",\r\n OverCategoryTotal: \"sobre el total de la categoría\",\r\n MarginDifPerMonth: \"dif. margen x mes\",\r\n Decisions: \"Decisiones\",\r\n NumberOfChanges: \"# Cambios\",\r\n OverTotalSuggestedChanges: \"del total de cambios sugeridos\",\r\n AcceptedSuggestions: \"sug. aceptadas\",\r\n PercentageChange: \"Cambio %\",\r\n VsSuggestedPrices: \"vs. precios sugeridos\",\r\n VsCurrentPrices: \"vs. precios actuales\",\r\n WeightedByUnitSales: \"ponderado por venta\",\r\n AssumingSameUnitSales: \"asumiendo misma venta unitaria\",\r\n Performance: \"Evolución de Performance\",\r\n Suggestion: \"Sugerencia\",\r\n Product: \"Producto\",\r\n ValidFromDate: \"Fecha de Inicio de Vigencia\",\r\n ValidFrom: \"Fecha Desde\",\r\n ValidTo: \"Fecha Hasta\",\r\n ValidFromUpdateTooltip: \"Actualiza de forma masiva la fecha DESDE de los precios filtrados\",\r\n ValidToUpdateTooltip: \"Actualiza de forma masiva la fecha HASTA de los precios filtrados\",\r\n CompetitorsMap: \"Mapa de Competidores\",\r\n CostsAndMargins: \"Costos y Margenes\",\r\n AuditTrails: \"Auditoria\",\r\n All: \"Todos\",\r\n Current: \"Vigente\",\r\n Exception: \"Excepcion\",\r\n Markdown: \"Rebaja\",\r\n Promotion: \"Promoción\",\r\n Bonus: \"Bonus\",\r\n Competitive: \"Competencia\",\r\n Regular: \"Normal\",\r\n PriceZone: \"Zona de Precios\",\r\n CompetitorType: \"Tipo de Competidor\",\r\n Competitor: \"Competidor\",\r\n OnlyMarkers: \"Solo marcadores\",\r\n MultizoneViews: \"Vista multizonas\",\r\n Allf: \"Todas\",\r\n Any:\"Ninguna\",\r\n SelectProduct: \"-- Seleccione producto --\",\r\n SelectCompetitorType: \"-- Seleccione Tipo de Competidor --\",\r\n SelectCompetitor: \"-- Seleccione competidor --\",\r\n Observed: \"Observado\",\r\n Type: \"Tipo\",\r\n Basket: \"Canasta\",\r\n Own: \"Propio\",\r\n PriceIndex: \"Indice de Precios\",\r\n Web: \"Web\",\r\n Extra: \"Extra\",\r\n Rule: \"Regla\",\r\n PricesEvaluatedByCompetitiveRule: \"Precios evaluados por la Regla de Competencia\",\r\n CurrentPrice: \"Precio Actual\",\r\n SuggestedPriceBasedOnTargetMargin: \"Precio sugerido segun Margen Objetivo\",\r\n Date: \"Fecha\",\r\n AssortmentStrategyAndRules: \"Estrategia y reglas de Surtido\",\r\n AssortmentStrategyAndRulesSubtitle: \"Cargue los roles y estrategias para cada marca en cada una de las categorías / subcategorías,\\r\\nindicando la cobertura objetivo manualmente o utilizando la que propone el sistema.\\r\\n Indique también que peso le asignará a cada variable para la construccion del indice ponderado \\r\\n Por último ingrese las fechas y frecuencia de análisis para cada una de las categorías / subcategorías.\",\r\n GoalsSelectCategory: \"Seleccione una categoría, zona de precios o tienda en la tabla de abajo para ver los datos graficados.\",\r\n BenchmarksStepOne1: \"Utilice los filtros habilitados para refinar su busqueda\",\r\n BenchmarksStepOne2: \"Explore el gráfico para ver los valores mes a mes\",\r\n BenchmarksStepOne3: \"Utilice la botonera azul para cambiar la visualizacion del gráfico.\",\r\n Compare: \"Comparar\",\r\n SectorsToCompare: \"Sectores/Categorías a comparar\",\r\n SelectCategories: \"Seleccione Categorías\",\r\n ClustersToCompare: \"Clusters a comparar\",\r\n SelectClusters: \"Seleccione Clusters\",\r\n Filter: \"Filtrar\",\r\n SectorsCategories: \"Sectores/Categorías\",\r\n From: \"Desde\",\r\n To: \"Hasta\",\r\n Bars: \"Barras\",\r\n Spline: \"Lineas\",\r\n SalesComparison: \"Comparativo de Ventas\",\r\n Accumulated: \"acumulado\",\r\n MarginComparison: \"Comparativo de Margen $\",\r\n UnitsComparison: \"Comparativo de Unidades\",\r\n ComparePerformance: \"Análisis de performance comparativo\",\r\n AreYouSureSwalTitle: \"Esta seguro que desea \",\r\n EnableSwal: \"habilitar\",\r\n ToDisableSwal: \"deshabilitar\",\r\n TheZoneSwal: \" la zona\",\r\n WarningStoresSwal: \"ADVERTENCIA! las tiendas \",\r\n BelongZoneSwall: \" pertenecen a la zona\",\r\n CancelSwal: \"Cancelar\",\r\n ContinueSwal: \"Continuar\",\r\n UpdatedZonesSwal: \"Zonas Actualizadas\",\r\n TheProcessContinuesSwal: \"El proceso Continúa…\",\r\n ErrorTitleSwal: \"Error!\",\r\n ErrorWhenDisablingTheZoneSwal: \"Hubo un error al deshabilitar la zona de precios.\",\r\n SavePriceZoneSwalTitle: \"Esta seguro que desea Guardar esta Zona de Precios?\",\r\n SaveSwal: \"Guardar\",\r\n SavedZoneSwal: \"Zona Guardada!\",\r\n SavedZoneSwalSubtitle: \"se ha guardado la zona de precios exitosamente\",\r\n ErrorOccurredWhileSavingZoneSwal: \"Ha ocurrido un error tratando de guardar la zona\",\r\n ValidationSwalTitle: \"Campos incompletos\",\r\n ValidationSwalSubtitle: \"Debe completar todos los campos\",\r\n SaveCompetitorValidationSwalSubtitle: \"Debe completar codigo y nombre\",\r\n SaveCompetitorTreeRelationsSwal: \"Relaciones guardadas!\",\r\n TheProcessOfContinuousStorageSwal: \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\",\r\n ThereWasAnErrorInSavingRelationshipsSwal: \"Hubo un error al guardar las relaciones\",\r\n DisableCompetitorSwalTitle: \"Esta seguro que desea deshabilitar el competidor?\",\r\n CompetitorDisabledSwalTitle: \"Competidor Deshabilitado!\",\r\n CompetitorDisabledSwalSubtitle: \"se ha deshabilitado correctamente\",\r\n TheProcessOfDisablingContinuesSwal: \"El proceso de deshabilitar continua. Puede revisar el estado en unos minutos.\",\r\n ThereWasAnErrorDisablingCompetitorSwal: \"Hubo un error al deshabilitar el competidor\",\r\n EditCompetitor: \"Editar Competidor\",\r\n TheCompetitorExistsInTheGroupSwalTitle: \"El competidor ya existe en el grupo\",\r\n TheCompetitorExistsInTheGroupSwalSubtitle: \"No se ha agregado el competidor porque ya existia en el grupo\",\r\n YouAreSureToRemoveTheCompetitorSwal: \"Está seguro de quitar al competidor \",\r\n FromTheGroupSwal: \" del grupo \",\r\n RemoveSwal: \"Quitar\",\r\n EditSensitivityTitle: \"EDITAR SENSIBILIDAD\",\r\n NewSensitivityTitle: \"NUEVA SENSIBILIDAD\",\r\n SaveSensitivitySwal: \"Esta seguro que desea guardar la Sensibilidad?\",\r\n SavedSensitivitySwal: \"Sensibilidad Guardada!\",\r\n TheSensibilitySwal: \"La sensibilidad \",\r\n HasBeenSuccessfullySavedSwal: \" se ha guardado exitosamente\",\r\n ErrorSavingSensitivitySwal: \"Hubo un error al guardar esta Sensibilidad\",\r\n EditRoundingRuleTitle: \"EDITAR REGLA DE REDONDEO\",\r\n NewRoundingRuleTitle: \"NUEVA REGLA DE REDONDEO\",\r\n DeleteTheRuleSwal: \"Esta seguro que desea eliminar la regla ?\",\r\n ErasedRuleSwal: \"Regla Borrada!\",\r\n HasBeenErasedCorrectlySwal: \"se ha borrado correctamente\",\r\n TheProcessOfContinuousDeletionSwal: \"El proceso de borrado continua. Puede revisar el estado en unos minutos.\",\r\n ErrorWhenDeletingTheRule: \"Hubo un error al borrar la regla\",\r\n DeleteSwal: \"Eliminar\",\r\n ValidationNumberToRound: \"Debe ingresar un numero valido\",\r\n SaveTheRoundingRulesSwal: \"Esta seguro que desea guardar las Reglas de Redondeo?\",\r\n SavedRoundingRulesSwal: \"Reglas de Redondeo Guardadas!\",\r\n ErrorWhenSavingTheseRoundingRules: \"Hubo un error al guardar estas Reglas de Redondeo\",\r\n ValidationRangesSwal: \"la lista de rangos debe comenzar en 0 y terminar en infinito (vacio)\",\r\n ValidationRangesSwal1: \"verifique que el 'hasta' de un rango coincida con el 'desde' del siguiente\",\r\n AreYouSureSwal: \"Está seguro?\",\r\n AreYouSureSwalSubtitle: \"Esta seguro que desea guardar los cambios?\",\r\n WarningSwal: \"Aviso\",\r\n YouMustSaveSwal: \"Debe guardar antes de agregar un nuevo rango.\",\r\n NoChangeWasDetectedSwal: \"No se detectó ningún cambio\",\r\n ConfirmedSwal: \"Confirmado\",\r\n ConfirmedSwalSubtitle: \"Se guardaron los cambios seleccionados\",\r\n ErrorSwalSubtitle: \"Hubo un error al querer guardar los cambios\",\r\n AreYouSureYouWantToReviewTheCategorySwal: \"Esta seguro que desea revisar la categoría?\",\r\n RevisionOfCategorySwal: \"Revisión de Categoría!\",\r\n RevisionOfCategorySwalSubtitle: \"Ha terminado el proceso de revision de categoría exitosamente. Se generaron \",\r\n RevisionOfCategorySwalSubtitle2: \" sugerencias para esta categoría\",\r\n TheContinuousCategoryReviewProcessSwal: \"El proceso de revision de categoría continua. Puede revisar las sugerencias generadas dentro de unos momentos desde la pantalla de decision de precios.\",\r\n ErrorWhenReviewingThisCategory: \"Hubo un error al revisar esta categoría\",\r\n GenerateSuggestionsSwal: \"Esta seguro que desea generar las sugerencias?\",\r\n GenerationOfSuggestionsSwal: \"Generación de Sugerencias!\",\r\n TheProcessEndedSuccessfullySwal: \"El proceso termino exitosamente. Se generaron \",\r\n TheProcessEndedSuccessfullySwal2: \" sugerencias para esta categoría\",\r\n TheSuggestionsContinueToBeGeneratedSwal: \"Las sugerencias siguen generandose. Puede revisar el estado de las mismas dentro de unos momentos desde la pantalla de decision de precios.\",\r\n ErrorWhenGeneratingSuggestionsForThisCategorySwal: \"Hubo un error al generar las sugerencias para esta categoría\",\r\n RemoveRuleSwal: \"Está seguro que desea Eliminar la regla y sus sugerencias asociadas?\",\r\n RuleEliminatedSwal: \"Regla eliminada!\",\r\n TheRuleHasBeenSuccessfullyRemovedSwal: \"La regla se ha eliminado exitosamente\",\r\n ErrorWhenDeletingTheRule: \"Hubo un error al eliminar la regla\",\r\n TheRuleSwal: \"La Regla \",\r\n AssociatedWithGenericSwal: \" ya está asociada al Genérico \",\r\n ThereCanOnlyBe1RulePerGenericSwal: \" Solo puede haber 1 regla por Generico\",\r\n NoApplicationScopeOrItemsWereAddedSwal: \"No se agregaron Ambitos de Aplicacion ni Items\",\r\n NoApplicationScopeOrItemsWereAddedSwalSubtitle: \"Para las reglas de Parentesco de Items, debe seleccionar al menos una sensibilidad, etiqueta, atributo o item.\",\r\n AssortmentMatrix: \"Matriz de Surtido\",\r\n ExportDecisions: \"Exportar Decisiones\",\r\n ExportDecisionsPrisma: \"Exportar Decisiones Prisma\",\r\n TextTooShort: \"Texto demasiado corto\",\r\n Never: \"Nunca\",\r\n Daily: \"Diario\",\r\n Weekly: \"Semanal\",\r\n Biweekly: \"Quincenal\",\r\n Monthly: \"Mensual\",\r\n Bimonthly: \"Bimestral\",\r\n Quarterly: \"Trimestral\",\r\n Days1: \" Días\",\r\n PricePoints: \"Puntas de Precio\",\r\n StandardRounding: \"Redondeo Tradicional\",\r\n ToNearest: \"hacia el mas cercano\",\r\n ToUp: \"hacia arriba\",\r\n ToDown: \"hacia abajo\",\r\n RoundingEndingValidation1: \"La terminacion debe estar entre 0 y 1. \",\r\n RoundingEndingValidation2: \"La terminacion debe estar entre 0 y 100. \",\r\n RoundingEndingValidation3: \"La terminacion debe estar entre 0 y 1000. \",\r\n RoundingEndingValidation4: \"La terminacion debe estar entre 0 y 10000. \",\r\n RoundingEndingValidation5: \"La terminacion debe estar entre 0 y 100000. \",\r\n RoundingEndingValidation6: \"La terminacion debe tener igual cantidad de decimales o menos que los decimales indicados para este redondeo.\",\r\n RoundingEndingValidation7: \"La terminacion debe ser menor a\",\r\n RoundingEndingValidation8: \"Ya existe una terminacion para este valor.\",\r\n RoundingEndingValidation9: \"El valor de la terminacion es invalido\",\r\n Direction: \"Direccion\",\r\n EditEndings: \"Editar Terminaciones\",\r\n Rounding3: \"milesimas (56.36105 = 56.361)\",\r\n Rounding2: \"centesimas (56.36105 = 56.36)\",\r\n Rounding1: \"decimas (56.36105 = 56.4)\",\r\n Rounding0: \"enteros (56.36105 = 56)\",\r\n RoundingM1: \"decenas (56.36105 = 60)\",\r\n RoundingM2: \"centenas (56.36105 = 100)\",\r\n RoundingM3: \"miles (5.600 = 6.000)\",\r\n RoundingM4: \"diez miles (5.600 = 10.000)\",\r\n RoundingM5: \"cien miles (56.000 = 100.000)\",\r\n RoundingM6: \"millones (560.000 = 1.000.000)\",\r\n NewSuggestionRule: \"Nueva Regla de Sugerencia\",\r\n NewParentRule: \"Nuevo Regla de Parentesco\",\r\n Minimum: \"Minimo\",\r\n Average: \"Promedio\",\r\n Maximum: \"Maximo\",\r\n Mode: \"Moda\",\r\n LowestModePrice: \"La de Precio mas bajo\",\r\n AverageModePrice: \"El Precio promedio de las modas\",\r\n HighestModePrice: \"La de Precio mas alto\",\r\n HighestRepetitions: \"La que mas se repite\",\r\n PriceVariation: \"Variacion de precios\",\r\n RULE: \"REGLA: \",\r\n of: \"de\",\r\n CI: \"IC\",\r\n SuggestedCI: \"IC Sugerido\",\r\n NewCI: \"Nuevo IC\",\r\n PriceHistoryAndEstimatedUnitSales: \"Historico de precios y Volumen Estimado\",\r\n PriceHistory: \"Historico de precios\",\r\n UnitSalesHistory: \"Historico de venta en unidades\",\r\n Costs: \"Costos\",\r\n CurrentWOTaxes: \"Neto Actual\",\r\n NewWOTaxes: \"Neto Nuevo\",\r\n CurrentTaxes: \"Impuesto Actual\",\r\n NewTaxes: \"Impuesto Nuevo\",\r\n CurrentTotalCostWOVat: \"Costo Total S/IVA Actual\",\r\n NewTotalCostWOVat: \"Costo Total S/IVA Nuevo\",\r\n TotalCostVariation: \"Variacion % Costo Total S/IVA\",\r\n Margins: \"Margenes\",\r\n MarginHasChanged: \"El margen ha cambiado\",\r\n CostHasChanged: \"El costo ha cambiado\",\r\n TicketTypes: \"Tipos de Tickets\",\r\n Planograms: \"Planogramas\",\r\n CreatePlanogram: \"Crear Planograma\",\r\n AnErrorHasOccurred: \"Ha ocurrido un error\",\r\n AnErrorHasOccurredInfo: \"Ha ocurrido un error inesperado.\\r\\n Si el problema persiste utilice el botón Descargar Info para bajar el error a un archivo txt y luego adjuntelo en un mail dirigido al equipo de soporte de Prisma.\\r\\n Muchas gracias.\",\r\n ViewAdditionalInfo: \"Ver información adicional\",\r\n DownloadInfo: \"Descargar Info\",\r\n RequestedActivityProcessing: \"El proceso solicitado esta demorando\",\r\n SalesLegend: \"ventas_$\",\r\n UnitsLegend: \"unidades\",\r\n MarginLegend: \"margen_$\",\r\n PriceLegend: \"precio\",\r\n SundayS: \"Dom\",\r\n MondayS: \"Lun\",\r\n TuesdayS: \"Mar\",\r\n WednesdayS: \"Mie\",\r\n ThursdayS: \"Jue\",\r\n FridayS: \"Vie\",\r\n SaturdayS: \"Sab\",\r\n JanuaryS: \"Ene\",\r\n FebruaryS: \"Feb\",\r\n MarchS: \"Mar\",\r\n AprilS: \"Abr\",\r\n Mays: \"May\",\r\n JuneS: \"Jun\",\r\n JulyS: \"Jul\",\r\n AugustS: \"Ago\",\r\n SeptemberS: \"Sep\",\r\n OctoberS: \"Oct\",\r\n NovemberS: \"Nov\",\r\n DecemberS: \"Dic\",\r\n Sunday: \"Domingo\",\r\n Monday: \"Lunes\",\r\n Tuesday: \"Martes\",\r\n Wednesday: \"Miércoles\",\r\n Thursday: \"Jueves\",\r\n Friday: \"Viernes\",\r\n Saturday: \"Sábado\",\r\n January: \"Enero\",\r\n February: \"Febrero\",\r\n March: \"Marzo\",\r\n April: \"Abril\",\r\n May: \"Mayo\",\r\n June: \"Juni\",\r\n July: \"Julio\",\r\n August: \"Agosto\",\r\n September: \"Septiembre\",\r\n October: \"Octubre\",\r\n November: \"Noviembre\",\r\n December: \"Diciembre\",\r\n IsThe: \" es la \",\r\n WithGreatestIncrease: \" de mayor crecimiento \",\r\n WithGreatestDecrease: \" con la mayor caída \",\r\n DTSLegend3: \"Aqui se pueden ver las SubCategorías agrupadas en Categorías, el tamaño total de cada categoría y la variación contra el mismo período del año anterior.\",\r\n DSTFinalMessage: \"Explore el Grafico\",\r\n DSTFinalMessageInfo: \"Puede navegar haciendo un click en los botones de arriba. Si se posiciona sobre una burbuja podra obtener mayor informacion de la\",\r\n OfThe: \" de la \",\r\n DstPopUpInformativeGraphicLess: \"menos $ de venta\",\r\n RequestedActivityProcessingInfo: \"Prisma continua procesando el pedido solicitado.\\r\\nLa información estará lista cuando el sistema termine de procesarla.\\r\\nPresione aceptar para cerrar este mensaje\",\r\n SessionExpired: \"La sesión ha expirado\",\r\n SessionExpiredInfo: \"La sesión actual ha superado el tiempo limite y ha expirado.\\r\\nPresione aceptar para cerrar este mensaje y vuelva a ingresar sus credenciales.\",\r\n AccessDenied: \"Permisos Insuficientes\",\r\n AccessDeniedInfo: \"El usuario no tiene los permisos necesarios para realizar la acción requerida.\\r\\n Para obtener los permisos puede solicitarlos a un administrador.\",\r\n Suggested: \"Sugeridos\",\r\n Endorsed: \"Endosados\",\r\n Pending: \"Pendientes\",\r\n NewPriceSuggestion: \"Hay una nueva sugerencia de precio.\",\r\n ERPPrice: \"Es el precio del ERP.\",\r\n PriceNeedsEndorsement: \"Este precio fue actualizado y esta pendiente de endoso.\",\r\n ReadyToInformToERP: \"Este precio fue actualizado y endosado. Esta listo para ser informado al ERP.\",\r\n Ignored: \"Ignorado\",\r\n Ignore: \"Ignorar\",\r\n Days: \"días\",\r\n Event: \"Evento\",\r\n Observations: \"Observaciones\",\r\n Date: \"Fecha\",\r\n User: \"Usuario\",\r\n AddNewFloor: \"Agregar nuevo piso\",\r\n ChoosePicture: \"Elegir una foto\",\r\n NoSelectedFiles: \"No hay archivos seleccionados\",\r\n Width: \"Ancho\",\r\n Height: \"Alto\",\r\n HeightF: \"Alta\",\r\n SellingArea: \"Area de ventas\",\r\n TotalArea: \"Area total\",\r\n LayoutEdition: \"Edición de Layout\",\r\n LayoutEditionSubTitle: \"Cree nuevos layouts o modifique los existentes\",\r\n LayoutEditionLegend1: \"Agregue uno o más pisos al Layout\",\r\n LayoutEditionLegend2: \"Arrastre los planogramas que desea ubicar en el Layout\",\r\n LayoutEditionLegend3: \"Haga clic en el Planograma que desee para accionar sobre el, o bien para ver su propia información\",\r\n LayoutView: \"Vista de Layout\",\r\n AnalyzeLayoutPerformance: \"Analice la performance de sus layouts\",\r\n ViewMode: \"Modo Vista\",\r\n EditMode: \"Modo Edición\",\r\n Rotate: \"Rotar\",\r\n ViewPlanogram: \"Ver Planograma\",\r\n View: \"Ver\",\r\n AddTicket: \"Agregar Ticket\",\r\n SelectedStore: \"Tienda Seleccionada\",\r\n Off: \"Apagado\",\r\n StockOut: \"Quiebre de Stock\",\r\n Floor: \"Piso\",\r\n NewFloor: \"Nuevo Piso\",\r\n ShowInfo: \"Mostrar información\",\r\n HideInfo: \"Ocultar información\",\r\n ShowInformationPlanograms: \"Mostrar Información de los Planogramas\",\r\n HideInformationPlanograms: \"Ocultar Información de los Planogramas\",\r\n AddFloorToLayout: \"Agregue un piso al Layout\",\r\n LayoutWOFloor: \"Layout sin piso\",\r\n AddFloorToLayoutEditMode: \"Agregue desde el modo de edición de Layout un piso\",\r\n NoPlanograms: \"Sin Planogramas\",\r\n NoPlanogramsSubtitle: \"No hay Planogramas asociados a este Cluster\",\r\n InformationPanel: \"Panel de Información\",\r\n Facings: \"Frentes\",\r\n SquareMeters: \"Metros Cuadrados\",\r\n LinearMeters: \"Metros Lineales\",\r\n Legend: \"Leyenda\",\r\n AdditionalInformation: \"Información Adicional\",\r\n NewTicket: \"Nuevo Ticket\",\r\n SelectTicket: \"--Seleccionar Ticket--\",\r\n SelectPriority: \"--Seleccionar Prioridad--\",\r\n Code: \"Código\",\r\n CreateLayout: \"Crear Layout\",\r\n SelectCluster: \"--Seleccionar Cluster--\",\r\n PressNextWhenDone: \"Al finalizar presione el botón siguiente.\",\r\n UseCreatedFurniture: \"Utilice los muebles ya creados haciendo click en el +, o crea un nuevo mueble.\",\r\n First: \"Primero\",\r\n Last: \"Último\",\r\n EditPlanogram: \"Edición de Planograma\",\r\n PlanogramView: \"Vista de Planograma\",\r\n AnalyzePlanogramPerformance: \"Analice la performance del planograma\",\r\n Communicate1: \"Comunicar\",\r\n ExportToExcel: \"Exportar a Excel\",\r\n ExportToExcelInfoPlanogram: \"Exportar a Excel la información del Planograma\",\r\n AuditPicture: \"Foto de Auditoría\",\r\n CreateFurniture: \"Crear Mueble\",\r\n ViewDimensions: \"Ver Dimensiones\",\r\n ActiveInCluster: \"Activos Cluster\",\r\n WithoutExhibition: \"Sin Exhibición\",\r\n WithExhibition: \"Con Exhibición\",\r\n Autocomplete: \"Autocompletar\",\r\n PriceElasticity: \"Elasticidad de precios\",\r\n Hypothesis: \"Hipótesis\",\r\n Action: \"Acción\",\r\n SelectAction: \"--Seleccionar Acción--\",\r\n Value: \"Valor\",\r\n SelectValueType: \"--Seleccionar Tipo de Valor--\",\r\n Forecast: \"Pronóstico\",\r\n ExpectVolumeSales: \"Se espera que el volumen\",\r\n ExpectedValue: \"Valor Esperado\",\r\n AvoidChangingOtherThanPrice: \"Evitar modificar otras variables que no sean el precio\",\r\n AssumptionsAndObservations: \"Supuestos y Observaciones\",\r\n EditLevels: \"Editar Niveles\",\r\n Load: \"Carga\",\r\n DaysInDisplay: \"Días de Exhibición\",\r\n DaysInStock: \"Días de Stock\",\r\n ClusterPerformance: \"Performance x Cluster\",\r\n StorePerformance: \"Performance x Tienda\",\r\n LoadBehind: \"Apilables detrás\",\r\n LoadAbove: \"Apilables arriba\",\r\n ClearFilters: \"Borrar Filtros\",\r\n SelectedCluster: \"Cluster Seleccionado\",\r\n GroupBy: \"Agrupar por\",\r\n SavePlanogramSwalTitle: \"Esta seguro que desea guardar el Planograma?\",\r\n SavedPlanogramSwal: \"Planograma Guardado!\",\r\n SavedPlanogramaSwalSubtitle: \"se ha guardado el planograma exitosamente\",\r\n ClickHereViewCategory: \"click para ingresar a la categoría\",\r\n MarginGuidelines: \"Lineamientos de Margen\",\r\n GenerateSuggestionsVarTooltipMin: \"Generar sugerencias con una variacion menor a la minima\",\r\n AllowMin: \"Perm. Min\",\r\n AllowMax: \"Perm. Max\",\r\n GenerateSuggestionsVarTooltipMax: \"Generar sugerencias con una variacion mayor a la maxima\",\r\n SignVar: \"Var. Sign.\",\r\n SignVarTooltip: \"Generar sugerencias y precios nuevos cuya variacion sea mayor al porcentaje indicado en esta columna (Regla de Significatividad). La cifra colocada aplicara tanto positiva como negativamente\",\r\n SignVarMargin: \"Var. Sign. en Margen\",\r\n SignVarMarginTooltip: \"Generar sugerencias y precios nuevos cuya variacion en margen (var. margen * venta en unidades) sea mayor al monto indicado en esta columna (Regla de Significatividad). La cifra colocada aplicara tanto positiva como negativamente\",\r\n MainCompetitor: \"Comp. Principal\",\r\n TargetMarginP: \"Objetivo %\",\r\n TargetMargin: \"Objetivo\",\r\n AllowMinTooltip: \"Generar sugerencias por debajo del margen minimo\",\r\n AllowMaxTooltip: \"Generar sugerencias por arriba del margen maximo\",\r\n GoToTarget: \"Ir a Obj.\",\r\n GoToTargetTooltip: \"Si se selecciona esta opcion, ante un cambio de costos en cualquier SKU de la categoría se va a generar una sugerencia tomando el margen objetivo de la categoría\",\r\n KeepMargin: \"Mant.\",\r\n KeepMarginTooltip: \"Si se selecciona esta opcion, entonces ante un cambio de costos en cualquier SKU de la categoría se va a generar una sugerencia para mantener el margen actual del SKU\",\r\n PriceVariation: \"Variación de Precios\",\r\n LowestPrice: \"Precio más bajo\",\r\n AveragePrice: \"Precio Promedio\",\r\n HighestPrice: \"Precio más alto\",\r\n SwalReviewCategoryPriceRules: \"Esta seguro que desea revisar la categoría?\",\r\n RequestQueued: \"Su pedido para Revision de Categoría ha sido encolado!\",\r\n RequestQueuedInfo: \"Puede realizar el seguimiento del mismo mediante el listado de tareas pendientes ubicado en la barra superior.\",\r\n TheProcessContinues: \"El proceso continua...\",\r\n TheProcessContinuesReviewCategoryInfo: \"El proceso de revision de categoría continua. Puede revisar las sugerencias generadas dentro de unos momentos desde la pantalla de decision de precios.\",\r\n AnErrorOccurredReviewingCategory: \"Hubo un error al revisar esta categoría\",\r\n AreYouSureGeneratePriceSuggestions: \"Esta seguro que desea generar las sugerencias?\",\r\n TheProcessContinuesGeneratePriceSuggestionsInfo: \"El proceso de generación de sugerencias continua. Puede revisar las sugerencias generadas dentro de unos momentos desde la pantalla de decision de precios.\",\r\n AnErrorOccurredGeneratingSuggestions: \"Hubo un error al generar las sugerencias para esta categoría\",\r\n AreYouSureDeletePriceRule: \"Está seguro que desea Eliminar la regla y sus sugerencias asociadas?\",\r\n DeletedRule: \"Regla eliminada\",\r\n DeletedRuleInfo: \"La regla se ha eliminado exitosamente\",\r\n TheProcessContinuesInfo: \"El proceso continua. Puede revisar el estado en unos minutos.\",\r\n AnErrorDeletingRule: \"Hubo un error al eliminar la regla\",\r\n CompetitiveWrittenRule1: \"REGLA: Precio\",\r\n IfMoreThanOneMode: \"Si hay mas de una moda usar: \",\r\n IfMoreThanOneModeWithSameReps: \"y si hay mas de una moda con misma cantidad de repeticiones usar:\",\r\n OnlyCompetitorsInSamePriceZone: \"(solo competidores en la misma zona de precios)\",\r\n SamePrice: \"Mismo Precio\",\r\n DifferenceOf: \"Diferencia de\",\r\n SubsidiesFreights: \"Subsidios y Fletes\",\r\n InsufficientSpaceSwal: 'Espacio insuficiente',\r\n InsufficientHeightSpaceSubtitleSwal: 'La altura del item supera la altura disponible',\r\n InsufficientWidthSpaceSubtitleSwal: 'El ancho del item supera lugar disponible',\r\n InsufficientDepthSpaceSubtitleSwal: 'La profundidad del item supera lugar disponible',\r\n IncorrectCategorySwal: 'Categoría incorrecta',\r\n IncorrectCategorySubtitleSwal: 'No puede agregar este item en un nivel de subcategoría',\r\n SureDeleteItemSwal: 'Esta seguro que quiere eliminar el producto',\r\n AddLayDownItemSwal: 'Desea agregar el producto posicion acostada al final del nivel?',\r\n Fields: 'Campos',\r\n SavedTicketSwal: \"Ticket Guardado!\",\r\n SavedTicketSwalSubtitle: \"Se ha guardado el ticket exitosamente\",\r\n SureCleanPlanogramSwal: 'Esta seguro que que desea limpiar el planograma?',\r\n SureGenerateAutocompletePlanogramSwal: 'Esta seguro que que desea generar el autocompletado?',\r\n WithoutLevelsSwal: 'Sin niveles',\r\n WithoutLevelsSubtitleSwal: 'El panograma no tiene niveles creados',\r\n PlanagramNotFoundSwal: 'No se encontro el planograma',\r\n PlanagramNotFoundSwalSubtitle1: 'No se encontro panograma que contenga con itemID: ',\r\n PlanagramNotFoundSwalSubtitle2: 'en el cluster con ID: ',\r\n HideProducts: 'Ocultar Panel de Productos',\r\n ShowProducts: 'Ver Panel Productos',\r\n HideInformation: 'Ocultar Panel de Informacion',\r\n ShowInformation: 'Ver Panel de Información',\r\n HidePlanograms: 'Ocultar Panel de Planogramas',\r\n ShowPlanograms: 'Ver Panel Planogramas',\r\n Subspaced: 'Subespaciado',\r\n Overpaced: 'Sobreespaciado',\r\n SalesShare: 'Share de Ventas',\r\n SpaceShare: 'Share de Espacio',\r\n SalesRestProducts: 'Venta - Resto de los Productos',\r\n SpaceRestProcucts: 'Espacio - Resto de los Productos',\r\n SalesRestPlanograms: 'Venta - Resto de los Planogramas',\r\n SpaceRestPlanograms: 'Espacio - Resto de los Planogramas',\r\n SureDeletePlanogramSwal: 'Esta seguro que quiere eliminar el Planograma ',\r\n SureDeletePlanogramSwalDesc: 'Al eliminar el planograma será removido automaticamente de todos los planos donde se encuentre actualmente.',\r\n SaveLayoutSwalTitle: \"Esta seguro que desea guardar el Layout?\",\r\n SavedLayoutSwal: \"Layout Guardado!\",\r\n SavedLayoutSwalSubtitle: \"Se ha guardado el Layout exitosamente\",\r\n ViewMore: \"Ver Más\",\r\n ViewLess: \"Ver Menos\",\r\n PlanogramCreatedIn: \"Planograma creado el\",\r\n In: \"en\",\r\n UploadPicture: \"Subir Foto\",\r\n TicketsSubtitle: \"Puede cambiar la prioridad y el estado de los Tickets existentes o dejar comentarios haciendo clic en el nombre del Ticket\",\r\n SaveEditTicketTitle: \"Cambios guardados\",\r\n SaveEditTicketTitleSubtitle: \"Los cambios fueron guardados correctamente\",\r\n ResolveTicket: \"RESOLVER TICKET\",\r\n CloseTicket: \"CERRAR TICKET\",\r\n CreatedTicketIn: \"creo el ticket el\",\r\n TicketType: \"Tipo de Ticket\",\r\n Priority: \"Prioridad\",\r\n Comments: \"Comentarios\",\r\n Comment: \"Comentar\",\r\n WriteComment: \"Escribe un comentario...\",\r\n Low: \"Baja\",\r\n LowPercentage: \"Baja %\",\r\n RisePercentage: \"Suba %\",\r\n Medium: \"Media\",\r\n High: \"Alto\",\r\n Resolved: \"Resuelto\",\r\n Closed: \"Cerrado\",\r\n AlertWillLoseChanges: \"Si abandona esta página perdera los cambios pendientes de confirmar. Está seguro que desea salir de la página?\",\r\n SwalEmptyFloors: \"Pisos vacíos\",\r\n SwalEmptyFloorsSubtitle: \"El último piso agregado aún se encuentra vacío\",\r\n ValidationSwalTitleAddLevel: \"Datos incompletos\",\r\n ValidationSwalSubtitleAddLevel: \"Debe completar todos los campos con valores numéricos\",\r\n FileName: \"Nombre del archivo: \",\r\n FileSize: \", Tamaño del archivo:\",\r\n NotValidFileType: \": No es un tipo de archivo válido. Actualiza tu selección.\",\r\n ValidationNameTicket: \"Debe ingresar un nombre\",\r\n ValidationTypeTicket: \"Debe seleccionar un tipo de ticket\",\r\n WithoutSize: \"Sin tamaño\",\r\n WithoutSizeSubtitle: \"sin tamaño alto o ancho o profundidad\",\r\n BasicInformation: \"Información Básica\",\r\n UnitOfMeasure: \"Unidad de Medida\",\r\n SaveItemSwall: \"Guardar Item\",\r\n SaveItemSwallSubtitle: \"Está seguro que desea guardar el item?\",\r\n ItemSavedProperly: \"Ítem guardado Correctamente\",\r\n ShowProfileItem: \"Cambiar Frente: Mostrar el item de perfil\",\r\n ShowItemInfront: \"Cambiar Frente: Mostrar el item de frente\",\r\n ShowItemAbove: \"Cambiar Frente: Mostrar el item de arriba\",\r\n ValidationSwalUomRepeted: \"No puede repetirse el código de Unidad de Medida\",\r\n Regions: \"Regiones\",\r\n Target: \"Objetivo\",\r\n YouMustEnterValidNumber: \"Debe ingresar un número válido\",\r\n ActionsAgGrid: \"Acciones\",\r\n PricesOfThisCategoryAsRevised: \"Esta seguro que desea Marcar todos los precios de esta Categoría como revisados (se ignoraran las sugerencias pendientes)?\",\r\n CompetitionPricesOfThisCategoryAsRevised: \"Esta seguro que desea Marcar todos los precios de Competencia de esta Categoria como revisados (se ignoraran las sugerencias pendientes)?\",\r\n NormalPricesOfThisCategoryAsRevised: \"Esta seguro que desea Marcar todos los precios Normales de esta Categoria como revisados (se ignoraran las sugerencias pendientes)?\",\r\n PricesOfThisCategoryAsRevisedPartial: \"Esta seguro que desea Marcar todos los precios de esta Categoría como revisados (No se ignoraran las sugerencias pendientes)?\",\r\n CompetitionPricesOfThisCategoryAsRevisedPartial: \"Esta seguro que desea Marcar todos los precios de Competencia de esta Categoria como revisados (No se ignoraran las sugerencias pendientes)?\",\r\n NormalPricesOfThisCategoryAsRevisedPartial: \"Esta seguro que desea Marcar todos los precios Normales de esta Categoria como revisados (No se ignoraran las sugerencias pendientes)?\",\r\n WantToNotifyEndorsement: \"Está seguro que desea notificar endoso?\",\r\n TheEndorsementWasNotified: \"Se notificó el endoso\",\r\n ErrorWhenWantingNotifyEndorsement: \"Hubo un error al querer notificar el endoso en esta categoría\",\r\n IgnoreSelectedSuggestions: \"Está seguro que desea ignorar las sugerencias seleccionadas y blanquear los nuevos precios?\",\r\n ConfirmedIgnoreSelectedSuggestions: \"Se ignoraron las sugerencias seleccionadas y se blanquearon los nuevos precios\",\r\n ErrorWhenWantingIgnoreSuggestions: \"Hubo un error al querer ignorar las sugerencias\",\r\n Attention: \"Atención\",\r\n NoChangesWereRecorded: \"No se registraron cambios\",\r\n EndorseTheSelectedPrices: \"Está seguro que desea endosar los precios seleccionados?\",\r\n EndorseTheModifiedPrices: \"Está seguro que desea endosar los precios modificados?\",\r\n ConfirmedEndorseTheSelectedPrices: \"Se endosaron los precios seleccionados\",\r\n ErrorWhenWantingEndorsePrices: \"Hubo un error al querer endosar los precios\",\r\n RejectionComment: \"Comentario de rechazo\",\r\n RejectionCommentSubtitle: \"Ingrese un comentario por el cual se rechazaron los valores sugeridos:\",\r\n RejectedItems: \"Items Rechazados\",\r\n RejectedItemsSubtitle: \"Se han rechazado los items seleccionados\",\r\n ModifyMarginIn: \"Modificar Margen en \",\r\n ModifyMarginSubtitle: \"El margen actual de los items seleccionados es de \",\r\n EnterNewMarginValue: \" Ingrese el nuevo valor de margen:\",\r\n YouMustEnterValue: \"Debes ingresar un valor\",\r\n YouMustEnterNumericValue: \"Debe ingresar un valor numérico\",\r\n MarginUpdated: \"Margen Actualizado\",\r\n TheMarginWasUpdatedCorrectly1: \"Se actualizo correctamente el margen objetivo a \",\r\n TheMarginWasUpdatedCorrectly2: \" para los items seleccionados\",\r\n SelectAtLeastOnePriceToContinue: \"Debe seleccionar al menos un precio para continuar\",\r\n EnterNewMarginValueforSelectedProducts: \"Ingrese el nuevo valor de margen para cada uno de los productos seleccionados:\",\r\n NewPrice: \"Precio Nuevo\",\r\n Present: \"Actual\",\r\n SuggestedS: \"Sugerido\",\r\n CurrentPrice1: \"Precio Vigente\",\r\n Original: \"Original\",\r\n OriginalAverage: \"Original Promedio\",\r\n LastCost: \"Último Costo\",\r\n CompetitivenessIndex: \"Índice de Competitividad\",\r\n Sale: \"Venta\",\r\n Volume: \"Volumen\",\r\n NewSale: \"Venta Nueva ($)\",\r\n CurrentAverage: \"Actual Promedio\",\r\n SuggestedAverage: \"Sugerido Promedio\",\r\n PercentajeNew: \"Nuevo %\",\r\n DolarNew: \"Nuevo $\",\r\n ValidityDates: \"Fechas de Vigencia\",\r\n FromN: \"Desde N\",\r\n ToN: \"Hasta N\",\r\n OverlapsAbbreviation: \"Solap.\",\r\n ErrorWhenWantingToMarkThisCategoryAsRevised: \"Hubo un error al querer marcar esta categoria como revisada\",\r\n TheFollowingChangesWillBeSaved: \"Se van a guardar los siguientes cambios: \",\r\n PriceChangesOp: \" cambios de precios, \",\r\n IgnoredSuggestionsOp: \" sugerencias ignoradas, \",\r\n EndorsedPricesOp: \" precios endosados, \",\r\n RejectedPricesOp: \" precios rechazados, \",\r\n SuggestionTooltip: \"SUGERENCIA: Hay una nueva sugerencia de precio del sistema.\",\r\n CurrentTooltip: \"ACTUAL: Es el precio del ERP.\",\r\n NewTooltip: \"NUEVO: Este precio fue actualizado y esta pendiente de endoso.\",\r\n EndorsedTooltip: \"ENDOSADO: Este precio fue actualizado y endosado. Esta listo para ser informado al ERP.\",\r\n ReportFilteredPricesToTheERP: \"Está seguro que desea Informar los precios filtrados al ERP?\",\r\n YouMustSelectAPriceType: \"Debe seleccionar un tipo de precio\",\r\n YouMustSelectAPriceTypeSubtitle: \" No se ha seleccionado ningun tipo de precio\",\r\n YouMustSelectAReason: \"Debe seleccionar un motivo para estos tipos de precio\",\r\n YouMustSelectAReasonSubtitle: \" En el caso de que no aparezca ninguno, no existen precios a informar del tipo seleccionado\",\r\n GeneratedPriceReport: \"Reporte de Precios Generado!\",\r\n GeneratedPriceReportSubtitle: \"Se generó el reporte de precios exitosamente para informar los cambios al ERP\",\r\n DeleteSelectedTests: \"Está seguro que desea eliminar los test seleccionados?\",\r\n TestsWereDeleted: \"Los tests fueron borrados\",\r\n TestsWereDeletedSuccessfully: \"Los tests fueron borrados exitosamente\",\r\n ErrorInWantingToEraseTests: \"Hubo un error al querer borrar los tests\",\r\n Data: \"Datos\",\r\n VariationInPrices: \"Variación en los precios\",\r\n Change: \"Cambio\",\r\n Expected: \"Esperado\",\r\n SelectFieldsToElaborateAnHypothesis: \"Seleccione los campos para elaborar una hipótesis\",\r\n IncorrectData: \"Datos incorrectos\",\r\n InvalidDateRange: \"Intervalo de fechas inválido\",\r\n Priceless: \"Sin precio\",\r\n DateFrom: \"Fecha de\",\r\n DateFromTooltip: \"Nueva fecha de vigencia de\",\r\n StoreCode: \"Código de tienda\",\r\n ChangesSent: \"Cambios enviados\",\r\n ChangesSentTooltip: \"Todos los cambios, incluidos los productos que no están activos en la tienda\",\r\n NAtooltip: \"Cambios que no producirán una impresión de etiqueta\",\r\n Atooltip: \"Solo los cambios que producirán una impresión de etiqueta\",\r\n Limit: \"Límite\",\r\n LimitTooltip: \"Límite de cambios por día permitido para la tienda\",\r\n Detour: \"Desvío %\",\r\n Discount: \"Descuento\",\r\n Decrease: \"Bajas\",\r\n Increase: \"Subas\",\r\n SuggestionsGenerated: \"Sugerencias Generadas!\",\r\n SuggestionsGeneratedSubtitle: \"Se han generado nuevas sugerencias\",\r\n ValidationOfDates: \"La fecha de inicio debe ser posterior a la fecha actual\",\r\n YouWantToSaveThisNewCost: \"Está seguro que desea Guardar este Nuevo costo?\",\r\n YouWantToSaveThisNewCostSubtitle: \"Está seguro que desea Guardar este Nuevo costo y Generar Sugerencias de Precios?\",\r\n TheSubsidyCanNotBeGreaterThan100: \"El subsidio no puede ser mayor al 100%\",\r\n SavedCost: \"Costo Guardado\",\r\n SavedCostSubtitle: \"se ha guardado el costo exitosamente \",\r\n SavedCostSubtitle1: \"y se generaron \",\r\n SavedCostSubtitle2: \"sugerencias \",\r\n TheSubsidy: \" el subsidio\",\r\n UpdatedSubsidies: \"Subsidios Actualizados\",\r\n ErrorDisablingSubsidy: \"Hubo un error al deshabilitar el subsidio.\",\r\n SaveSubsidy: \"Está seguro que desea guardar el subsidio?\",\r\n SavedSubsidy: \"Subsidio guardado!\",\r\n SavedSubsidySubtitle: \"se ha guardado el subsidio exitosamente\",\r\n ErrorToSaveSubsidy: \"Ha ocurrido un error tratando de guardar el subsidio\",\r\n SaveRegion: \"¿Está seguro que desea guardar la Region?\",\r\n SavedRegion: \"Región guardada\",\r\n SavedRegionSubtitle: \"se ha guardado la region exitosamente\",\r\n ErrorToSaveTheRegion: \"Ha ocurrido un error tratando de guardar la region\",\r\n NoFilesSelectedForUpload: \"No hay archivos actualmente seleccionados para cargar\",\r\n NewOrModified: \"Nuevo o Modificado\",\r\n RequestForApproval: \"Solicitó Aprobación\",\r\n Approved: \"Aprobado\",\r\n Communicated: \"Comunicado\",\r\n ErasedPlanogram: \"Planograma Borrado\",\r\n ErasedPlanogramSubtitle: \"Se ha borrado el planograma con éxito\",\r\n InsufficientPermissionsToEdit: \"Permisos Insuficientes para Editar\",\r\n InsufficientPermissionsToEditPlanogram: \"Permisos Insuficientes para Editar el Planograma y Solicitar su Aprobación\",\r\n FinishThePlanogram: \"Está seguro que desea Terminar el Planograma y Solicitar su Aprobación?\",\r\n InsufficientPermitsToApprove: \"Permisos Insuficientes para Aprobar\",\r\n YouWantToApproveThePlanogram: \"Está seguro que desea Aprobar el Planograma?\",\r\n InsufficientPermissionsToReport: \"Permisos Insuficientes para Informar\",\r\n CommunicateThePlanogram: \"Está seguro que desea Comunicar el Planograma a las Tiendas?\",\r\n NotInformed: \"NO INFORMADO\",\r\n ValidationToSaveAplanogram: \"Debe indicar un codigo, un nombre y al menos 1 subcategoria, 1 tienda y 1 modulo\",\r\n ErrorWhenSaveThePlanogram: \"Ocurrió un error al querer guardar el planograma\",\r\n WidthNotAllowed: \"ancho no permitido\",\r\n WidthNotAllowedSubtitle: \"ancho menor al espacio ocupado por los productos, ancho minimo permitido: \",\r\n ActionNotAllowed: \"Acción no permitida\",\r\n ActionNotAllowedSubtitle: \"No se pueden eliminar Categorías que ya fueron asignadas al planograma\",\r\n CanNotDeleteStores: \"No se pueden eliminar Tiendas que ya fueron asignadas al planograma.\",\r\n Shelf: \"Estante\",\r\n HeightNotAllowed: \"altura no permitida\",\r\n HeightNotAllowedSubtitle: \"altura del nivel no puede ser menor que la altura del productos mas alto del nivel, altura minimo permitido: \",\r\n LevelWithItems: \"Nivel con Items\",\r\n LevelWithItemsSubtitle: \"no se puede eliminar un nivel que contiene items\",\r\n RoundingStandard: \"Redondeo Estándar\",\r\n Include: \"Incluir\",\r\n Exclude: \"Excluir\",\r\n GroupOfArticles: \"Grupo de Artículos\",\r\n PricesAndCosts: \"Precios y costos\",\r\n CurrentCost: \"Costo Actual\",\r\n SalesUn: \"Venta Un\",\r\n CompetitiveF: \"Competitivas\",\r\n RelationshipItems: \"Parentesco Items\",\r\n KinshipZones: \"Parentesco Zonas\",\r\n StepOneOp1Importers: \" Se sube el archivo a importar desde la PC del usuario.
El archivo debe ser tipo xlsx y constar de las columnas 'Zona|Articulo | UMV | Sensibilidad' en la primera linea.
No pasara la validación si encuentra un registro repetido por articulo-umv-zona, o si no existe algún dato ingresado.
La columna 'Sensibilidad' debe llevar el código y si se encuentra vacia se eliminara el registro de sensibilidad si es que existe.\",\r\n StepOneOp2Importers: \" Se sube el archivo a importar desde la PC del usuario\",\r\n IntroductionToTheStepsImporters: \"A través de este asistente de 4 pasos se puede incorporar nueva información a Prisma.
Paso 1:\",\r\n RemainingStepsImporters: \"
Paso 2: Se verifica el formato y la extensión del archivo subido al servidor.
Paso 3: Se validan los datos del archivo en busqueda de inconsistencias.
Paso 4: Por último se incorpora definitivamente la información procesada y depurada al sistema.\",\r\n NoCategoriesFoundForAllSKUs: \"No se encontraron categorias para todos los SKUs\",\r\n YouWantToAddThem: \"Desea agregarlos ?\",\r\n ValidationWillRunAgain: \"Se volverá a correr la validación\",\r\n Severity: \"Severidad\",\r\n Phase: \"Fase\",\r\n File: \"Fila\",\r\n WarningM: \"ADVERTENCIA\",\r\n AllSensitivityRecordsWillBeDeleted: \"Se eliminará todo registro de sensibilidad!\",\r\n Success: \"Éxito\",\r\n NoArticleInAnyAreaHasSensitivity: \"Ningún artículo en ninguna zona tiene sensibilidad\",\r\n ItHasPendingFiles: \"Posee archivos pendientes, presione aceptar para volver al paso numero 3.\",\r\n TheImporterTypeParameterHasNotBeenReceived: \"No se ha recibido el parametro de tipo de importador. Se redireccionará a la home.\",\r\n UnitOfMeasureOfSale: \"Unidad de Medida de Venta\",\r\n TypeOfPriceForce: \"Tipo de Precio Vigente\",\r\n CompetitivePricesSurvey: \"Encuesta de Precios Competidores\",\r\n MassiveLoadOfCosts: \"Carga Masiva de Costos\",\r\n BulkLoadingOfLabels: \"Carga masiva de etiquetas\",\r\n ManualLiquidations: \"Liquidaciones Manuales\",\r\n LiquidationsByMaturity: \"Liquidaciones por Vencimiento\",\r\n CancelLiquidations: \"Cancelar Liquidaciones\",\r\n UpdateFieldsOfMeasurementUnits: \"Actualizar campos de unidades de medidas\",\r\n Liquidation: \"Liquidación\",\r\n SelectReason: \"Seleccione Motivo/s\",\r\n LowerPrice: \"Bajar Precio\",\r\n IncreasePrice: \"Subir Precio\",\r\n LowM: \"bajo\",\r\n Rise: \"subo\",\r\n RiseA: \"aumente\",\r\n StaysTheSame: \"se mantenga igual\",\r\n Drops: \"disminuya\",\r\n IfHyphotesis: \"Si \",\r\n ThePriceOfHyphotesis: \" el precio de \",\r\n InHyphotesis: \" en \",\r\n TheDemandIsExpectedHyphotesis: \", se espera que la demanda \",\r\n AHyphotesis: \" un \",\r\n ValueIn: \"Valor en \",\r\n UpdateDates: \"Actualización de Fechas\",\r\n UpdateDatesSubtitleOp1: \"Indique la nueva fecha de inicio de los nuevos precios. Formato: AAAA-MM-DD\",\r\n UpdateDatesSubtitleOp2: \"Indique la nueva fecha de fin de los nuevos precios\",\r\n Overlaps1: \"Solapamientos\",\r\n TypeCP: \"Tipo PV\",\r\n Laydown: \"Acostado\",\r\n Standup: \"Parado\",\r\n NewPriceHasBeenRejected: \"Se ha rechazado el nuevo precio de $\",\r\n GoToTheAuditTab: \". Vaya a la solapa de Auditoría para más detalles. \",\r\n Rejected: \"Rechazado\",\r\n PendingPrice: \"Precio Pendiente\",\r\n EndorsedPrice: \"Precio Endosado\",\r\n ClickHereToLoadTags: \"Clic aquí para cargar tags asociados a este producto\",\r\n ThePriceVariationLimitHasBeenExceeded: \"Se ha excedido el límite de Variación de Precio. Los limites son: {0} a {1}\",\r\n TheMarginsLimitHasBeenExceeded: \"Se ha excedido el limite de Margenes. Los limites son: {0} a {1}\",\r\n ThisPriceHasAnOverlapWithAPromotion: \"Este precio tiene un Solapamiento con una Promocion. Clic aqui para ver mas\",\r\n SumErrorOfWeightedIndexes: \"La suma de los índices ponderados debe ser igual a 100%\",\r\n PendingChangesWithoutSaving: \"Tiene cambios pendientes sin guardar\",\r\n TheChangesYouHaveMadeInRoleWillBeLost: \"Si cambia de Marca, se perderan los cambios que haya hecho en Rol, Estrategia y Cobertura para \",\r\n RoleAndStrategy: \"Rol y Estrategia\",\r\n Role: \"Rol\",\r\n Strategy: \"Estrategia\",\r\n Coverage: \"Cobertura\",\r\n WeightedIndex: \"índice Ponderado (Pesos)\",\r\n MarketSales: \"Ventas Mercado\",\r\n MarketUnits: \"Unidades Mercado\",\r\n AnalysisSchedule: \"Calendario del Análisis\",\r\n Frequency: \"Frecuencia\",\r\n ActionType: \"Tipo de Acción\",\r\n LastRevision: \"Última Revisión\",\r\n InDays: \"(En Días)\",\r\n PriceUpdateConfirmTitle: \"Se actualizarán los precios en pantalla\",\r\n PriceUpdateConfirmText: \"Recuerde GUARDAR luego para aplicar estos cambios\",\r\n DoYouWishToIgnorePendingSuggestions: \"Desea ignorar las sugerencias pendientes?\",\r\n CopyingThisStructureAndItems: \"Nuevo Planograma copiando Estructura y Productos de este Planograma\",\r\n ClonePlanogram: \"Clonar Planograma\",\r\n YourRequestToGenerateSuggestionsHasBeenPasted: \"Su pedido para generar sugerencias ha sido encolado!\",\r\n TheSuggestionsContinueToBeGeneratedAssortment: \"Las sugerencias siguen generandose. Recibira un mail cuando haya finalizado. Puede revisar el estado de las mismas dentro de unos minutos desde la pantalla de inicial de analisis de surtido.\",\r\n ConfirmationCreateThisRule: \"Está seguro que desea crear esta regla?\",\r\n SavedRule: \"Regla Guardada\",\r\n SavedRuleSubtitle: \"Se ha guardado la regla exitosamente\",\r\n ErrorWhenSavingTheRule: \"Hubo un error al guardar la regla\",\r\n Associations: \"Asociaciones\",\r\n Values: \"Valores\",\r\n MarketPrice: \"Precio Mercado\",\r\n SalesRankingMarket: \"Ranking de Ventas Mercado\",\r\n ShareOfSalesMarket: \"Share de Ventas Mercado\",\r\n ShareOfUnitsMarket: \"Share de Unidades Mercado\",\r\n AccumulatedSalesMarket: \"Acumulado Ventas Mercado\",\r\n Margin2: \"Margen 2\",\r\n WeightedIndex2: \"Índice Ponderado\",\r\n SalesRanking: \"Ranking de Ventas\",\r\n UnitsRanking: \"Ranking de Unidades\",\r\n MarginRanking: \"Ranking de Margen\",\r\n ShareOfUnits: \"Share de Unidades\",\r\n ShareOfMargen: \"Share de Margen\",\r\n Margin2Percentage: \"Margen 2 %\",\r\n ShareOfMargen2: \"Share de Margen 2\",\r\n Presence: \"Presencia\",\r\n AccumulatedSales: \"Acumulado Ventas\",\r\n AccumulatedUnits: \"Acumulado Unidades\",\r\n AccumulatedMargin: \"Acumulado Margen\",\r\n AccumulatedWeightedIndex: \"Acumulado Índice Ponderado\",\r\n NameRole: \"Nombre del Rol\",\r\n NameValidation: \"El nombre del Template debe tener al menos 2 caracteres\",\r\n SelectAtLeastOneFilter: \"Seleccione al menos un filtro\",\r\n SelectAtLeastOneCategory: \"Seleccione al menos una categoría\",\r\n TheTemplate: \"El Template: \",\r\n HasBeenCreatedSuccessfully: \" se ha creado satisfactoriamente\",\r\n ErrorSavingTemplate: \"Ocurrió un error al guardar el Template: \",\r\n Confirm: \"Confirmar\",\r\n ConfirmPeriod: \"Al seleccionar un periodo de 12 meses, no es posible utilizar el filtro por etiquetas. Desea Continuar?\",\r\n GenerateTheReport: \"Está seguro que desea generar el reporte?\",\r\n GeneratedReport: \"Reporte Generado\",\r\n GeneratedReportSubtitle: \"Ya puede visualizar el reporte generado.\",\r\n GeneratingReport: \"Generando Reporte\",\r\n GeneratingReportSubtitle: \"Puede realizar el seguimiento del mismo mediante el listado de tareas pendientes ubicado en la barra superior.\",\r\n SKUsTooltip: \"Cantidad de SKUs activos\",\r\n SKUsTooltip1: \"Porcentaje de SKUs activos\",\r\n SalesDolar: \"Ventas ($)\",\r\n AmountOfSales: \"Cantidad de ventas\",\r\n SalesQty: \"Ventas (Qty)\",\r\n Dds: \"DDS\",\r\n CategoryCluster: \"Categoría / Cluster\",\r\n AmountSuggestions: \"Cantidad de sugerencias de baja\",\r\n HighF: \"Altas\",\r\n NumberHighSuggestions: \"Cantidad de sugerencias de alta\",\r\n ImpactInDolar: \"Impacto en $ por Sugerencias por Cluster\",\r\n PendindFalls: \"Cantidad de bajas pendientes de validación\",\r\n HighSlopes: \"Cantidad de altas pendientes de validación\",\r\n ImpactByDecisionsByCluster: \"Impacto en $ por Decisiones por Cluster\",\r\n InternalPerformance: \"Performance Interna\",\r\n InternalPerformanceTooltip: \"Venta en $ (promedio por mes por tienda Same Store)\",\r\n SalePercentage: \"% Venta\",\r\n SaleUnTooltip: \"Venta en Unidades (promedio por mes por tienda Same Store)\",\r\n UnitsPercentage: \"% Unidades\",\r\n ShareOfSalesInUnits: \"Share de Ventas en Unidades\",\r\n PercentageMargin: \"% Margen $\",\r\n MarginShare: \"Share de Margen $\",\r\n PercentageMargin2: \"% Margen\",\r\n SaleXsku: \"Venta x Sku\",\r\n Rotation: \"Rotación\",\r\n PerformanceMarket: \"Performance Mercado\",\r\n AssortmentCoverage: \"Cobertura de surtido sobre todos los productos de mercado\",\r\n MarketSalePercentage: \"% Venta M\",\r\n ShareOfSalesInTheMarket: \"Share de Ventas en el Mercado\",\r\n GAPSale: \"GAP Venta\",\r\n GAPSaleTooltip: \"GAP Share de Venta en $ propia vs Mercado\",\r\n SaleInUnitsTooltip2: \"Venta en Unidades\",\r\n MarketUnitsPercentage: \"% Unidades M\",\r\n MarketUnitsPercentageTooltip: \"Share de Ventas en Unidades Mercado\",\r\n GAPUnits: \"GAP Unidades\",\r\n GAPUnitsTooltip: \"GAP Share de Unidades propio vs Mercado\",\r\n InventoryInDolar: \"Inventario en $\",\r\n ShareOfInventoryValue: \"Share de valor del inventario\",\r\n InventoryInUnits: \"Inventario en Unidades\",\r\n GMROITooltip: \"Margen $ / valor del inventario (cuantos $ de Margen por cada $ invertido en inventario)\",\r\n Mlinear: \"M lineales\",\r\n MlinearTooltip: \"Metros lineales (frentes x ancho del producto)\",\r\n ProductFronts: \"Frentes del Producto\",\r\n GMROSTooltip: \"Margen $ / Metros lineales (rentabilidad por espacio)\",\r\n PercentageSpace: \"% Espacio\",\r\n PercentageSpaceTooltip: \"Share de Espacios\",\r\n Reviews: \"Revisiones\",\r\n Revised: \"Revisada\",\r\n ClonePlanogramWarning: 'La Estructura y los Productos de este Planograma serán clonados en un Nuevo Planograma',\r\n ClonePlanogramSubtitle: 'Agregar un nuevo Planograma, copiando la estructura y productos de este Planograma',\r\n ImportFromSpaceman: 'Importar de Spaceman',\r\n MonthsForCalculation: \"Meses para Calculo\",\r\n ClickHereFilterByPriceList: \"Click aquí para filtrar por esta Zona de Precios\",\r\n CloneLayout: \"Agrega un nuevo Layout, copiando este Layout\",\r\n CloneLayout: 'Clonar Layout',\r\n CloneLayoutWarning: 'Este Layout va a ser clonado en un Nuevo Layout',\r\n Sp_generalKpis_planogram: \"Planograma\",\r\n Sp_generalKpis_store: \"Tienda\",\r\n Sp_editLayout_editFloorActionButton: \"Editar Piso\",\r\n Sp_addLevel_EditTitle: \"Editar datos del piso\",\r\n SP_editPlanogram_Autocomplete_AssingFronts: \"Asignación de Frentes\",\r\n MapsMargin: \"Mapa de Margen\",\r\n Pr_Decisions_PriceUpdate:\"Modificar Precios\",\r\n Pr_Decisions_PriceUpdateTooltip: \"Permite realizar una actualización masiva de los precios seleccionados\",\r\n Pr_Decisions_PriceUpdate_StrategySelection: \"Estrategia\",\r\n Pr_Decisions_PriceUpdate_Value: \"Valor\",\r\n Pr_Decisions_PriceUpdate_Variation:\"Aplicar variación de precio\",\r\n Pr_Decisions_PriceUpdate_GoToPrice:\"Llevar a un precio fijo\",\r\n Pr_Decisions_PriceUpdate_GoToMargin: \"Llevar a margen objetivo\",\r\n Pr_Decisions_ExperimentalPriceUpdate: \"Simulación de Precios\",\r\n Pr_Decisions_ExperimentalPriceUpdateTooltip: \"Permite realizar una prueba experimental de que sucederia si se cambiasen los precios\",\r\n Pr_Decisions_PriceCopy: \"Copiar Precios\",\r\n Pr_Decisions_PriceCopyTooltip: \"Permite realizar una copia masiva entre distintos tipos de precio\",\r\n Pr_Decisions_PriceCopy_Source: \"Precio Origen\",\r\n Pr_Decisions_PriceCopy_Target: \"Precio Destino\",\r\n Pr_Decisions_Filters_Markets: \"Mercados\",\r\n Pr_Decisions_Filters_MarketsPlaceholder: \"Seleccione Mercados\",\r\n Pr_Decisions_Filters_Brands: \"Banderas\",\r\n Pr_Decisions_Filters_BrandsPlaceholder: \"Seleccione Banderas\",\r\n Pr_Decisions_Filters_Regions: \"Regiones\",\r\n Pr_Decisions_Filters_RegionsPlaceholder: \"Seleccione Regiones\",\r\n Pr_Decisions_SimulationStop: \"Detener Simulación\",\r\n Pr_Decisions_SimulationApply: \"Confirmar Simulación\",\r\n Pr_Decisions_SimulationWarningOnSave_Title: \"Hay una simulación en curso\",\r\n Pr_Decisions_SimulationWarningOnSave_Desc: \"No se pueden guardar los cambios hasta que confirme o detenga la simulación activa\",\r\n Hm_marketBoard_marketBoard: \"Tablero de Mercado\",\r\n EnterCodesSeparatedByComma: \"Ingrese Codigos Separados por Coma\",\r\n Adm_brands_savedBrand: \"Bandera Guardada\",\r\n Adm_brands_subtitle: \"La Bandera se guardó correctamente\",\r\n EnterCodesSeparatedBySpaces: \"Ingrese Codigos Separados por espacios\",\r\n EnterCodesSeparatedBySpacesDetail: \"Ingrese Codigos Separados por espacios, luego presione 'enter'\",\r\n Strip:\"Fleje\",\r\n Catalog: \"Catálogo\",\r\n OneTime: \"Una Vez\",\r\n Biannual: \"Semestral\",\r\n Annual: \"Anual\",\r\n PriceSurvey: \"Encuesta de Precios\",\r\n ExhibitionSurvey: \"Encuesta de Exhibición\",\r\n PriceLabelScan: \"Escaneo de Precios\",\r\n VoiceCommand: \"Comando de Voz\",\r\n ManualEntry: \"Entrada Manual\",\r\n Sort: \"Ordenar\",\r\n TooltipSortModules: \"Ordenar Modulares\",\r\n Ready: \"Listo\",\r\n CompetitionCriteria: \"Criterio de Competencia\",\r\n RegulatedPrices: \"Precios Regulados\",\r\n })\r\n .translations(\"en\", {\r\n Points: \"Points\",\r\n UnitSales: \"Unit Sales\",\r\n Price: \"Price\",\r\n Cost: \"Cost\",\r\n CostsByProvider: \"Costs by Proveedor\",\r\n CostsByVendors: \"Costs by Vendors\",\r\n Benchmark: \"Benchmark\",\r\n TotalUnits: \"Total Units\",\r\n YesterdayPrice: \"Yesterday Price\",\r\n Inventory: \"Inventory\",\r\n Prices: \"Price\",\r\n Range: \"Range\",\r\n Language: \"Language\",\r\n English: \"English\",\r\n Spanish: \"Spanish\",\r\n ProductCost: \"Product cost\",\r\n DiffInDollars: \"Difference in dollars\",\r\n NotificationTitle: \"Gross Margin decreased\",\r\n NotificationSubtitle: \"Coca Cola 1.5L was the product with the biggest decline in gross margin across the store.\",\r\n TheReasons: \"The Reasons\",\r\n Reason1: 'Cost has incresed but sale price was not updated.',\r\n Iagree: \"I Agree!\",\r\n Idesagree: \"I Disagree...\",\r\n Discard: \"Discard\",\r\n Reason2: \"Sales Volume has decreased\",\r\n SubReason1: \"Weekly seasonality was detected Sunday outsells Monday.\",\r\n ChartTitle: \"Evolution Chart: \",\r\n ChartTitleStrong: \"Coca Cola 1.5L\",\r\n Week: \"Week\",\r\n Month: \"Month\",\r\n Year: \"Year\",\r\n SalesInDollars: \"Sales ($)\",\r\n MarginInDollars: \"Margin ($)\",\r\n ChartFooter: \"Available indicators: UnitSales, Price, Sales, Margin\",\r\n PricesTableTitle: \"Competitors Prices\",\r\n PricesTableTitleCol1: \"Competitor\",\r\n PricesTableTitleCol2: \"Date\",\r\n PricesTableTitleCol3: \"Price\",\r\n PricesTableTitleCol4: \"In Promotion\",\r\n PricesTableTitleCol5: \"Address\",\r\n MapTitle: \"Competitor Location: \",\r\n Back: \"Back\",\r\n WeatherTitle: \"Yesterday Weather\",\r\n InSales: \"In Sales\",\r\n WeatherDesc: \"Last day with same weather 54 more units were sold\",\r\n InventoryTitle: \"Inventory Indicators\",\r\n InventoryDays: \"Inventory Days\",\r\n InventoryComment: \"The remaining days of inventory.\",\r\n GMROI: \"GMROI\",\r\n InventoryFooter: \" of margin per each $ invested in inventory\",\r\n RangeTitle: \"Range Indicators\",\r\n RangeLine1: \" in beverages category in store 1\",\r\n RangeLine1Sub: \" raised 2 positions\",\r\n RangeLine2: \" in beverages category in all the network\",\r\n RangeLine2Sub: \" raised 5 positions\",\r\n RangeLine3: \" in beverages category in the market\",\r\n RangeLine3Sub: \" dropped 1 position\",\r\n StoreManager: \"Store Manager\",\r\n Profile: \"Profile\",\r\n Contacts: \"Contacts\",\r\n Mailbox: \"Mailbox\",\r\n Logout: \"Logout\",\r\n Home: \"Home\",\r\n Place: \"Place\",\r\n SmartDashboard: \"Smart Dashboard\",\r\n Maps: \"Maps\",\r\n DeviationAnalysis: \"Deviation Analysis\",\r\n WeatherAnalysis: \"Weather Analysis\",\r\n BcgMatrix: \"BCG Matrix\",\r\n Pivot: \"Pivot\",\r\n Notifications: \"Notifications\",\r\n NEW: \"NEW\",\r\n Decisions: \"Decisions\",\r\n Elasticities: \"Elasticities\",\r\n PromotionAnalysis: \"Promotion Analysis\",\r\n Sensitivity: \"Sensitivity\",\r\n RulesAndStrategies: \"Rules and Strategies\",\r\n Competitors: \"Competitors\",\r\n RangeAnalysis: \"Range Analysis\",\r\n Segmentation: \"Segmentation\",\r\n TicketAnalysis: \"Ticket Analysis\",\r\n BasketAnalysis: \"Basket Analysis\",\r\n Spaces: \"Spaces\",\r\n Planograms: \"Planograms\",\r\n Layouts: \"Layouts\",\r\n SpaceAnalysis: \"Space Analysis\",\r\n StockAnalysis: \"Stock Analysis\",\r\n OrderSuggestions: \"Order Suggestions\",\r\n Suppliers: \"Suppliers\",\r\n Administration: \"Administration\",\r\n GeneralSettings: \"General Settings\",\r\n Importers: \"Importers\",\r\n Masters: \"Masters\",\r\n DiscardConfirmTitle: \"¿Are you sure?\",\r\n DiscardConfirmSub: \"The reason will be discarded\",\r\n YesDiscard: \"Yes, discard\",\r\n DiscardMessageTitle: \"Succesfully Discarded!\",\r\n DiscardMessageComment: \"You will not see this reason again.\",\r\n ThanksForFeedback: \"Thanks for your feedback!\",\r\n ThanksForFeedbackComment: \"Your feedback help us to improve reasons and get's you some point \",\r\n ThanksForFeedbackPoints: \" points\",\r\n ThanksForFeedbackTitle2: \"Earn points giving Feedback\",\r\n DisagreeTitle: \"I disagree\",\r\n DisagreeSub: \"Tell us what do you think could be the motive\",\r\n Send: \"Send\",\r\n Costs: \"Costs\",\r\n CompetitorsPrices: \"Competitors Prices\",\r\n CompetitivePosition: \"Competitive Position\",\r\n MarketAnalysis: \"Market Analysis\",\r\n Clusters: \"Clusters\",\r\n StoresIncluded: \"Stores Included\",\r\n Stores: \"Stores\",\r\n Store: \"Store\",\r\n StoresToBeIncludedByCategories: \"Select stores to be included by Category\",\r\n TypeOfStore: \"Type of store\",\r\n SelectTypeOfStore: \"--Select type of store--\",\r\n AddStore: \"Add Store\",\r\n StoreMasters: \"Store Masters\",\r\n AssignStores: \"Assign Stores\",\r\n Close: \"Close\",\r\n AssignmentOfStores: \" Store Assignment\",\r\n ByStore: \"By Store\",\r\n ByStores: \"By Stores\",\r\n TopNavbarSearch: \"Search Products, Categories, Stores and Clusters\",\r\n BenchmarksStepOne: \"Select at least 2 Stores or Categories or Clusters to compare\",\r\n StoresToCompare: \"Stores to compare\",\r\n SelectStores: \"Select Stores\",\r\n PerformanceByProvinceSubtitle: \"The following is a summary of density of stations by province and its performance\",\r\n PerformanceByProvinceSubtitle2: \"The following is a summary of density of stations by province and its performance (with drill-down by Department)\",\r\n TotalStores: \"Total Stores:\",\r\n BaseStore: \"Base Stores\",\r\n SelectStore: \"Select Store\",\r\n MirrorStore: \"Mirror Store\",\r\n ChooseComparableStores: \"Choose a comparable store\",\r\n MaintainThePriceOfMirrorStores: \"Do not change the price of the mirror store\",\r\n PriceChangesReportSubtitle: \"The following report shows a summary of the price changes reported to the ERP by effective date and store\",\r\n AddPricesArea: \"Add price zones\",\r\n Name: \"Name\",\r\n National: \"National\",\r\n Enabled: \"Enabled\",\r\n Yes: \"Yes\",\r\n ToDisable: \"Disable\",\r\n EnableTooltip: \"Enable\",\r\n Save: \"Save\",\r\n ItsBase: \"It's Base\",\r\n ItsNational: \"It's National\",\r\n Excluded: \"Excluded\",\r\n ExplicationCompetitors: \"Manage the Groups of Competitors and their Points of Sale here to be able to establish competitive positioning rules\",\r\n NewGroup: \"New Group\",\r\n NewCompetitor: \"New Competitor\",\r\n CompetitorsGroup: \"Competitors Group\",\r\n DragCompetitorsHere: \"Drag Competitors Here\",\r\n OnlyNew: \"Only New\",\r\n WithoutGroups: \"Without Groups\",\r\n Logo: \"Logo\",\r\n SonOf: \"Son of\",\r\n SelectFather: \"Select Father\",\r\n SelectFamily: \"--SelectFamily--\",\r\n ExternalCode: \"External Code\",\r\n Address: \"Address\",\r\n Brand: \"Brand\",\r\n CorporateName: \"Corporate Name\",\r\n Latitude: \"Latitude\",\r\n Length: \"Length\",\r\n Marker: \"Marker\",\r\n Observe: \"Observe\",\r\n SelectPriceZones: \"Select Price Zones\",\r\n CreateSensitivity: \"Create Sensitivity\",\r\n Order: \"Order\",\r\n SurveyFrequency: \"Survey Frequency\",\r\n Expiration: \"Expiration\",\r\n ValidityDays: \"Validity Days\",\r\n MondayAbbreviation: \"M\",\r\n TuesdayAbbreviation: \"T\",\r\n WednesdayAbbreviation: \"W\",\r\n ThursdayAbbreviation: \"T\",\r\n FridayAbbreviation: \"F\",\r\n SaturdayAbbreviation: \"S\",\r\n SundayAbbreviation: \"S\",\r\n SelectSurveyFrequency: \"Select Survey Frequency\",\r\n Monday: \"Monday\",\r\n Tuesday: \"Tuesday\",\r\n Wednesday: \"Wednesday\",\r\n Thursday: \"Thursday\",\r\n Friday: \"Friday\",\r\n Saturday: \"Saturday\",\r\n Sunday: \"Sunday\",\r\n CreateRoundingRule: \"Create Rounding Rule\",\r\n LoadItemsToExclude: \"Load Items To Exclude\",\r\n RoundingRules: \"Rounding Rules\",\r\n EditRoundingRuleSubtitle: \"In case of having more than one rounding for the same type of price and range, Prism will try to comply with the most specific rule according to its scope of application (first category and then price area)\",\r\n TypeOfPrice: \"Price Type\",\r\n RoundingType: \"Rounding Type\",\r\n Decimals: \"Decimals\",\r\n Tolerance: \"Tolerance\",\r\n DirectionRoundingRules: \"Dir\",\r\n TestPanel: \"Test Panel\",\r\n TestPanelSubtitle: \"Does not take into account the rules with areas of application\",\r\n PriceToRound: \"Price To Round\",\r\n EnterValue: \"Enter Value\",\r\n ResultWithRoundingApplied: \"Result with rounding applied\",\r\n TryRounding: \"Try rounding\",\r\n SelectPriceType: \"Select price type\",\r\n Terminations: \"Terminations\",\r\n SubcategoriesToInclude: \"Subcategories to Include\",\r\n SubcategoriesToExclude: \"Subcategories to Exclude\",\r\n AreasToInclude: \"Areas to Include\",\r\n AreasToBeExcluded: \"Areas to be Excluded\",\r\n Select: \"Select\",\r\n AddNewRank: \"Add New Rank\",\r\n SelectDecimals: \"Select Decimals\",\r\n Insert: \"Insert\",\r\n Add: \"Add\",\r\n EditTerminations: \"Edit Terminations\",\r\n New1: \"New\",\r\n Cancel: \"Cancel\",\r\n Accept: \"Accept\",\r\n StrategyAndPriceRules: \"Strategy and price rules\",\r\n ExplicationStrategyAndPriceRules: \"Load the gross margin guidelines for each of the categories / subcategories, indicating the target margin, the minimum and the maximum. \\r\\n Also indicate the minimum and maximum price variation \\r\\n Finally enter the main competitor for each of the categories / subcategories.\",\r\n DescriptionRule: \"Description Rule\",\r\n Validity: \"Validity\",\r\n AreaOfApplication: \"Inclusion Scope\",\r\n Acceptance: \"Acceptance\",\r\n Description: \"Description\",\r\n Subcategories: \"Subcategories\",\r\n Items: \"Items\",\r\n PlaceholderSearchItem: \"Enter description or article code\",\r\n PriceTypes: \"Price Types\",\r\n PriceType: \"Price Type\",\r\n CompetitionAreas: \"Competition Areas\",\r\n Labels: \"Labels\",\r\n Properties: \"Properties\",\r\n RelationshipRule: \"Relationship Rule\",\r\n Areas: \"Areas\",\r\n RulesOfKinshipOfZones: \"The Kinship rules of zones are evaluated each time a price of a Parent Zone is changed.\\r\\nFilters marked with * do not affect the selection of items.\",\r\n SelectParentPriceZone: \"Select Parent Price Zone\",\r\n SelectKindOfType: \"Select Kind of Type\",\r\n DifferenceIn: \"Difference in\",\r\n AllSubcategories: \"All Subcategories\",\r\n AllArticleGroups: \"All Article Groups\",\r\n AllPricesZones: \"All Prices Zones\",\r\n ExceptZoneFather: \"Except Zone Father\",\r\n AllSuppliers: \"All Suppliers\",\r\n ApplySKUs: \"Apply to SKUs that contain the following description / brand\",\r\n ScopeOfExclusion: \"Exclusion Scope\",\r\n ExcludeSKUs: \"Exclude SKUs that contain the following description / brand\",\r\n SelectSubcategories: \"Select Subcategories\",\r\n SelectArticleGroup: \"Select Article Group\",\r\n SelectSuppliers: \"Select Suppliers\",\r\n SelectSensibilitiesToInclude: \"Select Sensitivities to Include\",\r\n SelectLabelsToInclude: \"Select Labels To Include\",\r\n SelectSubcategoriesToExclude: \"Select Subcategories to Exclude\",\r\n SelectItemGroupsToExclude: \"Select Item Groups to Exclude\",\r\n SelectPriceAreasToExclude: \"Select Price Areas to Exclude\",\r\n SelectSuppliersToExclude: \"Select Suppliers to Exclude\",\r\n SelectSensitivityToExclude: \"Select Sensitivities to Exclude\",\r\n SelectTagsToExclude: \"Select Tags to Exclude\",\r\n Products: \"Products\",\r\n RulesOfRelationshipOfProducts: \"The Kinship product rules are evaluated each time a price of a Parent product is changed.\\r\\nFilters marked with * do not affect the selection of items.\",\r\n SelectFather: \"--Select Father--\",\r\n Generic: \"Generic\",\r\n ParentProductVariant: \"This parent product is a variant of the product\",\r\n GenericRuleVariant: \"It's a Generic rule - Variant\",\r\n SuggestionRule: \"Suggestion Rule\",\r\n Margin: \"Margin\",\r\n MarginRules: \"The margin rules generate price suggestions based on the change in supplier costs.\\r\\nFilters marked with * do not affect the selection of items.\",\r\n TargetMargin: \"Target Margin\",\r\n KeepMargin: \"Keep Margin\",\r\n KeepSameMarginPercentage: \"Keep SameMargin %\",\r\n KeepSameMargin$: \"Keep Same Margin $\",\r\n Competitive1: \"Competitive\",\r\n CompetitiveRules: \"Competitive rules generate price suggestions based on market price changes.\\r\\nFilters marked with * do not affect the selection of items.\",\r\n SelectPointOfSale: \"Select Point of Sale\",\r\n SelectTypesOfObservations: \"Select Sources of Information\",\r\n ConsiderOnlyCompetitorsSamePriceArea: \"Consider only competitors in the same price zone\",\r\n Use: \"Use\",\r\n MoreThanOneFashionToUse: \"If there is more than one fashion to use\",\r\n LessOfaFashionToUse: \"And if there is less of a fashion with the same number of repetitions, use\",\r\n ApplyToProducts: \"Apply to Products that contain the following description / brand\",\r\n CancelTheChangesMade: \"Cancel the changes made\",\r\n SaveCompetitionRule: \"Save Competition Rule\",\r\n SaveMargenRule: \"Save Margen Rule\",\r\n SaveParentageRule: \"Save Parentage Rule\",\r\n SaveZoneRule: \"Save Zone Rule\",\r\n GenerateSuggestions: \"Generate Suggestions\",\r\n CategoryReview: \"Category Review\",\r\n TooltipGenerateSuggestionsButton: \"The process of generation of suggestions is executed periodically according to the frequency set in each category and also when new market information is incorporated. From here it could be executed manually\",\r\n EvaluateMarginRules: \"Evaluate Margin Rules\",\r\n EvaluateCompetitionRules: \"Evaluate Competition Rules\",\r\n EvaluateRelationshipRules: \"Evaluate Relationship Rules\",\r\n ExportToAnExcel: \"Export the grid data to an Excel\",\r\n IncludeAllItems: \"Include all the items in the grid\",\r\n ExcludeAllItems: \"Exclude all items in the grid\",\r\n SaveAllChangesPriceDecisions: \"Save all changes made: accepted suggestions, changed prices, ignored suggestions, endorsed prices and rejected endorsements.\",\r\n AcceptSuggestions: \"Accept Suggestions\",\r\n AcceptSuggestionsTooltip: \"Accept all suggestions according to applied filters\",\r\n EndorseAll: \"Endorse All\",\r\n EndorseAllTooltip: \"Endorses all pending prices according to applied filters\",\r\n MarkAsRevised: \"Mark as reviewed\",\r\n Normal: \"Normal\",\r\n MarkAsRevisedAllNormalPricesTooltip: \"Mark as reviewd all regular prices\",\r\n MarkAsRevisedAllPricesOfCompetitionTooltip: \"Mark as reviewed all competitive prices\",\r\n MarkAsRevisedAllPricesTooltip: \"Mark as reviewed ALL prices\",\r\n Status: \"Status\",\r\n PreviousPrice: \"Previous Price\",\r\n ThePriceVariationLimitHasBeenExceededTooltip: \"The Price Variation limit has been exceeded. The limits are:\",\r\n To: \"to\",\r\n TheMarginLimitHasBeenExceededTooltip: \"The Margin limit has been exceeded. The limits are:\",\r\n GeneralInformation: \"General Information\",\r\n Ean: \"EAN\",\r\n BaseUm: \"Base UM\",\r\n ProductInformation: \"Product Information\",\r\n Maker: \"Maker\",\r\n NewLabel: \"New Label\",\r\n Quality: \"Quality\",\r\n Premium: \"Premium\",\r\n Apply: \"Apply\",\r\n Area: \"Area\",\r\n Action: \"Action\",\r\n Situation: \"Situation\",\r\n ChangePriceManually: \"Change Price Manually\",\r\n AcceptSuggestion: \"Accept Suggestion\",\r\n Reverse: \"Reverse\",\r\n Endorse: \"Endorse\",\r\n ToRefuse: \"To Refuse\",\r\n MarkAsEndosada: \"Mark As Endorse\",\r\n ModifyMargin: \"Modify Margin\",\r\n PercentajeMargin: \"Margin %\",\r\n UpdateDates: \"Update Dates\",\r\n DateFrom: \"Date From\",\r\n DateUntil: \"Date Until\",\r\n ForEndorsement: \"For Endorsement\",\r\n Falls: \"Falls\",\r\n Rises: \"Rises\",\r\n StrongFalls: \"Strong Falls\",\r\n StrongRises: \"Strong Rises\",\r\n DepressedMargins: \"Depressed Margins\",\r\n HighMargins: \"High Margins\",\r\n NegativeMargins: \"Negative Margins\",\r\n LittleSignificantChanges: \"Little Significant Changes\",\r\n SuggestedNotRespected: \"Suggested Not Respected\",\r\n Overlaps: \"Overlaps\",\r\n SeeMap: \"See Map\",\r\n Page: \"Page\",\r\n Position: \"Position\",\r\n CurrentPrices: \"Current Prices\",\r\n Motive: \"Motive\",\r\n Reasons: \"Reasons\",\r\n CompetitorsReferenceSameZone: \"Competitors Reference in the same Zone\",\r\n ReasonForSuggestion: \"Reason for the suggestion\",\r\n LowForts: \"Low Forts\",\r\n LastPricesInformedERP: \"Last Prices Informed to the ERP\",\r\n GenerationDate: \"Generation Date\",\r\n GenerationTime: \"Generation Time\",\r\n Archive: \"Archive\",\r\n PricesPendingToInform: \"Prices Pending To Inform\",\r\n Un_select: \"Un(select)\",\r\n PricesToInform: \"Prices to Inform\",\r\n AllTypesOfPrice: \"All types of price\",\r\n AllStores: \"All stores\",\r\n AllCategories: \"All categories\",\r\n SelectAllVisiblePricesTooltip: \"Select / Deselect all visible prices (considering filters)\",\r\n GenerateTheFileToInformTheERPTooltip: \"Generates the file to inform the ERP of the selected prices. These prices will go to Informed status in Prisma.\",\r\n Delete: \"Delete\",\r\n NewTest: \"New Test\",\r\n RemoveTheSelectedTestsTooltip: \"Remove the selected tests\",\r\n CreateAnewTestTooltip: \"Create a new test\",\r\n PriceChangesReport: \"Price Changes Report\",\r\n PriceMapReport: \"Price Map Report\",\r\n ReportInformed: \"Report Informed\",\r\n OnlyThoseNotImplemented: \"Only those not implemented\",\r\n DailyMarginsReport: \"Daily Margins Report\",\r\n ImportantInformation: \"Important Information\",\r\n ExplanationNewCost: \"Add the new costs with the '+ Add Cost' button.\\r\\nThese will appear gray in the list, until the 'Save new costs and Generate Suggestions' button has been pressed.\\r\\nOnce they have been saved correctly, you will see the list again in the normal way.\",\r\n AddCost: \"Add Cost\",\r\n SaveNewCosts: \"Save New Costs and Generate Suggestions\",\r\n BulkLoad: \"Bulk Load\",\r\n Supplier: \"Supplier\",\r\n CenterOfDistribution: \"Center of Distribution\",\r\n ProductCode: \"Product Code\",\r\n NameOfProduct: \"Name of Product\",\r\n StartDate: \"Start Date\",\r\n NetCost: \"Net Cost\",\r\n Taxes: \"Taxes\",\r\n SelectDistributionCenter: \"Select Distribution Center\",\r\n ItemCode: \"Item Code\",\r\n SelectItem: \"Select Item\",\r\n Tax: \"Tax\",\r\n TaxRate: \"Tax Rate\",\r\n Subsidy: \"Subsidy\",\r\n FreightCost: \"Freight Cost\",\r\n DateEffectiveFrom: \"Date Effective From\",\r\n FreightCostText: \"Theoretical Freight Cost from its distribution center to the station is\",\r\n CreatePlanogram: \"Create Planogram\",\r\n Dimension: \"Dimension\",\r\n ModalTitleCreatePlanogram: \"New Planogram\",\r\n NewPlanogramLegend1: \"Complete the following fields\",\r\n NewPlanogramLegend2: \"Drag the desired element to the 'Dropzone' and fill in the fields\",\r\n NewPlanogramLegend3: \"Click on show items if you want to drag a new module\",\r\n ModalTitleEditPlanogram: \"Edit Planogram\",\r\n Width: 'Width',\r\n Height: 'Height',\r\n Depth: 'Depth',\r\n AddShelfToPlanogram: 'Add forniture to planogram',\r\n RemoveShelfFromPlanogram: 'Remove forniture from planogram',\r\n SaveShelf: 'Save forniture',\r\n LevelOfPlanogram: 'Level of the planogram',\r\n ExplanationAddLevels: 'Add the number of levels to the Planogram, the height of each of the levels will be the same, unless later specification. You can manually edit the height of each level by clicking on the \"+\" \"-\". ',\r\n Optional: 'Optional',\r\n ExplanationAddOneLevel: 'You can add a new level with a defined height, at the start or at the end of the planogram',\r\n NumberOfEqualLevels: 'Number of Equal Levels',\r\n CompleteAllFieldsToCreateANewPlanogram: 'Complete all the fields to create a new Planogram.',\r\n AtTheEndPressTheNextButton: 'At the end press the next button.',\r\n Fornitures: 'Furnitures',\r\n Print: 'Print',\r\n PrintPlanogram: 'Print the Planogram',\r\n ShowDimensions: 'Show Dimensions',\r\n HideDimensions: 'Hide Dimensions',\r\n FromThePlanogram: \"Show or hide the dimensions of the Planogram\",\r\n Clean: 'Clean',\r\n CleanPlanogram: 'Delete all the items arranged in the Planogram',\r\n EditDimensionsTooltip: \"Edit the dimensions of the Planogram or add a new Module\",\r\n EditPlanogramDimensions: \"Edit Dimensions\",\r\n GoToThePlanogramViewMode: 'Go to the Planogram View Mode',\r\n GoToThePlanogramEditMode: 'Go to the Planogram Edit Mode',\r\n GoToTheLayoutViewMode: 'Go to the Layout View Mode',\r\n GoToTheLayoutEditMode: 'Go to the Layout Edit Mode',\r\n AssignStoresLayout: \"Assign stores to Layout\",\r\n SeeAuditPicture: 'See pictures of the Planogram Audit',\r\n RequestApproval: 'Request Approval',\r\n RequestApprovalTooltip: 'Mark the Plan as Completed and Request Approval',\r\n Approve: \"Approve\",\r\n ApproveTooltip: \"Approve the Planogram\",\r\n AssingFrontsTo: 'Assing fronts to',\r\n Maximize: 'Maximize',\r\n MinimumFronts: 'Minimum Fronts',\r\n MaximumFronts: 'Maximum Fronts',\r\n PercentageOfOccupiedSpace: 'percentage of occupied space',\r\n Percentage: 'Percentage',\r\n AddRule: 'Add Rule',\r\n TopToBottom: 'Top to bottom',\r\n BottomToTop: 'Bottom to top',\r\n LeftToRight: 'Left to right',\r\n RightToLeft: 'Right to left',\r\n Upward: 'Upward',\r\n Falling: 'Falling',\r\n Measure: 'Measure',\r\n AddOrder: 'Add order',\r\n AddRestriction: 'Add Restriction',\r\n GENERATE: 'GENERATE',\r\n WithoutCategoryAssigned: 'Without category assigned',\r\n Delist: 'Delists',\r\n SeeTickets: 'See Tickets',\r\n DeleteAnItem: 'Delete an Item',\r\n AddItem: 'Add Item',\r\n Front: 'Front',\r\n Side: 'Side',\r\n Top: 'Top',\r\n Subcategory: 'Subcategory',\r\n Manufacturer: 'Manufacturer',\r\n Sales: 'Sales',\r\n Units: 'Units',\r\n SalesInStore: 'Sales in Store',\r\n PriceInStore: 'Price in Store',\r\n UnitsInStore: 'Units in Store',\r\n StockInStore: 'Stock in Store',\r\n SalesInCluster: 'Sales in Cluster',\r\n AveragePriceInCluster: 'Average Price in Cluster',\r\n UnitsInCluster: 'Units in Cluster',\r\n StockInCluster: 'Stock in Cluster',\r\n ExhibitionDays: 'Exhibition Days',\r\n ShowProductInformation: 'Show Product Information',\r\n WithoutRule: 'Without rule',\r\n RepositionFrequencyInDays: 'Reposition frequency in days',\r\n Tag: 'Tag',\r\n OrderBy: 'Order By',\r\n WithoutOrder: 'Without Order',\r\n MarginInCluster: 'Margin in Cluster',\r\n Weight: 'Weight',\r\n Aream2: 'Area',\r\n WithoutFilters: 'Without filters',\r\n Filters: 'Filters',\r\n SelectTag: \"Select Tag\",\r\n SelectBrand: \"Select Brand\",\r\n SelectManufacturer: \"Select Manufacturer\",\r\n Select: 'Select',\r\n NewSingular: 'New',\r\n Edit: 'Edit',\r\n NewTypeOfTicket: \"New Type of Ticket\",\r\n SelectTypeTicket: \"--Select Type Ticket--\",\r\n NeedDescription: \"Need Description\",\r\n NewPlanogram: \"New Planogram\",\r\n Complete: \"Complete\",\r\n From1: \"From\",\r\n ChangeSenseOrientation: \"Change Traffic flow\",\r\n SenseCirculation: \"Traffic flow\",\r\n AutoStack: \"Stack\",\r\n ShowDoor: \"Show Door\",\r\n Tags: \"Tags\",\r\n ProductChat: \"Product Chat\",\r\n NewMessage: \"New Message\",\r\n Write: \"Write\",\r\n DelistProduct: \"Delist Product\",\r\n LiquidarProduct: \"LIQUIDAR PRODUCT\",\r\n AskForWithdrawal: \"ASK FOR WITHDRAWAL\",\r\n ChooseCriteria: \"Choose Criteria\",\r\n HighPriority: \"High Priority\",\r\n MediumPriority: \"Medium Priority\",\r\n LowPriority: \"Low Priority\",\r\n StopFollowingTicket: \"Stop Following Ticket\",\r\n FollowTicket: \"Follow Ticket\",\r\n Elements: \"Elements\",\r\n EditElement: \"Edit Element\",\r\n Container: \"Container\",\r\n Columns: \"Columns\",\r\n AddElements: \"Add Elements\",\r\n AddLevelToThePlanegram: \"Add Level to the Planegram\",\r\n AddLevel: \"Add the indicated Level to the Planogram\",\r\n Measurements: \"Measurements\",\r\n Dropzone: \"Dropzone\",\r\n DragItemhere: \"Drag an item here\",\r\n NewFurniture: \"New Furniture\",\r\n IncreaseHeightPlanogram: \"Increase the height of the Planogram Level\",\r\n ReduceHeightPlanogram: \"Reduce the height of the Planogram Level\",\r\n RemovePlanogramLevel: \"Remove the Planogram Level\",\r\n NewModuleTitle: \"New Module\",\r\n NumberLevels: \"Number of Levels\",\r\n DivisionsOrDoors: \"Divisions or doors\",\r\n PositionIn: \"Position in:\",\r\n ShowElements: \"Show Elements\",\r\n EditElement: \"Edit Element\",\r\n InsertInTheSameColumn: \"Insert in the same Column\",\r\n InsertInNewColumnOnLeft: \"Insert in new column on the left\",\r\n InsertInNewColumnOnRight: \"Insert in new column on the right\",\r\n Refrigerator: \"Refrigerator\",\r\n NewTags: \"New Tags\",\r\n Quantity: \"Quantity\",\r\n UnitOfMeasureAbbreviation: \"Unit of Measure\",\r\n BaseUnitOfMeasure: \"Base Unit Of Measure\",\r\n ValidationEan1: \"exists in the data base (field not valid)\",\r\n ValidationEan2: \"Valid\",\r\n UploadPhotosItem: \"Upload photos\",\r\n UploadPhotosItemTooltip: \"Upload photos for this Unit of Measure\",\r\n RemoveThisUnitOfMeasure: \"Remove this Unit of Measure\",\r\n UnitOfMeasureCode: \"Unit Of Measure Code\",\r\n AddUnitOfMeasure: \"Add Unit Of Measure\",\r\n UploadItemPictures: \"Upload Item Pictures\",\r\n ItemInFront: \"from the front item\",\r\n ProfileItem: \"of the profile item\",\r\n ItemAbove: \"of the item above\",\r\n Distributor: \"Distributor\",\r\n DischargeDate: \"Discharge date\",\r\n Conversion: \"Conversion\",\r\n Dimensions: \"Dimensions\",\r\n HeightText: \"Represents the sum of the levels\",\r\n NoImage: \"Without picture\",\r\n NoImageSubtitle: \"Add audit photo\",\r\n EditLayout: \"Edit Layout\",\r\n EditUnitOfMeasures: \"Measurement unit edition\",\r\n ProductHigh: \"Product High\",\r\n DeleteItem: \"Delete item or group of items\",\r\n ChangeFront: \"Change the front of the item or group of items\",\r\n AddItemBehind: \"Add item or group of items behind\",\r\n DeleteItemBehind: \"Remove item or group of items behind\",\r\n AddItemToRight: \"Add item to the right\",\r\n DeleteItemOnRight: \"Delete the item on the right\",\r\n AddItemAbove: \"Add Item or group of items above\",\r\n DeleteItemAbove: \"Delete Item or group of items above\",\r\n TooltipForStoreUnits: \"There are not enough units to complete the fronts\",\r\n TooltipForStoreUnits2: \"There are not enough units to complete the total load\",\r\n MoreInformation: \"More Information\",\r\n TooltipRemoveElement: \"Delete the selected item\",\r\n MoreZoom: \"Zoom in on the Planogram\",\r\n LessZoom: \"Give less zoom to the Planogram\",\r\n AveragePerformance: \"Average Performance\",\r\n SelectPriceType: \"--Select a price type--\",\r\n InformToERPTooltip: \"Generates the file to inform the ERP of the filtered prices. These prices will go to Informed status in Prisma.\",\r\n YouMustSelectACategory: \"You must select a category\",\r\n NoResultsFor: \"No results for\",\r\n AddFreightCost: \"Add Freight / Stimulus Cost\",\r\n CostOfFreightAndStimulus: \"Cost of Freight and Stimulus\",\r\n ItemCode1: \"Item Code\",\r\n FreightCost: \"Freight cost\",\r\n Stimulus: \"Stimulus\",\r\n SelectArea: \"--Select area--\",\r\n Article: \"Article\",\r\n AddRegion: \"Add Region\",\r\n Region: \"Region\",\r\n SubcategoriesToInclude: \"Subcategories to include\",\r\n SubcategoriesToExclude: \"Subcategories to exclude\",\r\n PricingZonesToExclude: \"Pricing zones to exclude\",\r\n PriceZonesToInclude: \"Pricing zones to include\",\r\n AcceptSelectedSuggestions: \"Accept the selected suggestions\",\r\n IgnoreSelectedSuggestions1: \"Save the changes made and ignore the selected suggestions\",\r\n EndorseSelectedItems: \"Endorse the selected items accepting the modifications\",\r\n RejectSelectedChanges: \"Reject selected changes (Enter a rejection message)\",\r\n ModifyMarginInStaggeredWay: \"Modify margin in a staggered way indicating a Margin $ objective\",\r\n MassiveDatesUpdate: \"Massive Update of Validity Dates for New Prices\",\r\n MassiveLoad: \"Massive Load\",\r\n IndividualLoad: \"Individual Load\",\r\n SaveABTesting: \"Save AB Testing\",\r\n PercentageOfTheRiseOrFall: \"% of the rise or fall\",\r\n ItMustMatchExactly: \"It must coincide exactly with the regions informed by the authority\",\r\n FreightCostTooltip: \"Enter here the freight cost in $ per liter\",\r\n StimulusTooltip: \"Enter here the fiscal stimulus in $ per liter\",\r\n FilterApplied: \"Filter applied\",\r\n LastModification: \"Last Modification\",\r\n EditPlanogramStructure: \"Edit Planogram Structure\",\r\n CopyingThisStructure: \"New Planogram Copying this Structure\",\r\n ClearPlanogram: \"Clear Planogram\",\r\n SaveThePlanogram: \"Save the Planogram\",\r\n YouDoNotHavePermissionsToSave: \"You do not have permissions to Save\",\r\n Active: \"Active\",\r\n ClickToFilterBy: \"Click to filter by\",\r\n ClickToEdit: \"Click to edit\",\r\n Copy: \"Copy\",\r\n CopyTooltip: \"Copy last module and insert to the right\",\r\n DataImporter: \"Data Importer\",\r\n UploadFiles: \"Upload Files\",\r\n DragTheFileHere: \"Drag the file here\",\r\n DragTheFileHere1: \"or click to search on your PC\",\r\n VerifyFormat: \"Verify Format\",\r\n ValidateInformation: \"Validate Information\",\r\n UpdateTables: \"Update Tables\",\r\n UploadFile: \"Upload file\",\r\n ValidateData: \"Validate Data\",\r\n AddCategories: \"Add Categories\",\r\n Finalize: \"Finalize\",\r\n SelectSubcategory: \"--Select Subcategory--\",\r\n Subcategory2: \"Subcategory2\",\r\n GoToStep2Tooltip: \"Go to step 2\",\r\n GoToStep3Tooltip: \"Go to step 3\",\r\n GoToStep4Tooltip: \"Go to step 4\",\r\n RestartTheImporter: \"Restart the importer to upload new files\",\r\n ManualSettlementsOverwriteSuggestedSettlements: \"Alert: Manual Settlements overwrite Suggested Settlements\",\r\n LiquidationsByExpirationOverwriteSuggestedLiquidations: \"Alert: The Settlements by Expiration overwrite the Suggested Liquidations.\",\r\n BleachSensitivities: \"Bleach Sensitivities\",\r\n NewHighRule: \"New High Rule\",\r\n NewRuleLows: \"New Rule Lows\",\r\n SaveProductRegistrationRule: \"Save product registration rule\",\r\n SaveProductDropRule: \"Save product drop rule\",\r\n ButtonGenerateSuggestionsAssortmentTooltip: \"The process of generation of suggestions is executed periodically according to the frequency set in each category and also when new market information is incorporated. From here it could be executed manually\",\r\n NewRuleTitle: \"NEW RULE\",\r\n NewHighRuleIntro: \"The rules of registration will be used by the system to generate suggestions for the inclusion of new articles that are performing well in the market. To define this criterion, different variables and conditionals can be used in any combination chosen.\",\r\n CoverageInfo: \"Take into account the objective coverage of the different brands when creating the coverage rule.\",\r\n ObjectiveFor: \" objective for \",\r\n SelectAnOption: \"Select an Option\",\r\n AllClusters: \"All Clusters\",\r\n AllTags: \"All Tags\",\r\n SelectSubcategoriesToInclude: \"Select Subcategories to Include\",\r\n SelectClustersToExclude: \"Select Clusters to exclude\",\r\n NewLowRuleIntro: \"The deregistration rules will be used by the system to generate suggestions for low of existing articles that are not performing well. To define this criterion, different variables and conditionals can be used in any combination chosen.\",\r\n AssortmentMatrixStep1: \"Select: Flag, Format and Client.\",\r\n AssortmentMatrixStep2: \"Select Sector, Section, Family, Subfamily and Cluster. \",\r\n AssortmentMatrixStep3: \"Select if opening is desired by Manufacturer or Brand (or both).\",\r\n AssortmentMatrixStep4: \"Select 1 or more labels.\",\r\n AssortmentMatrixStep5: \"Select period.\",\r\n SaveTemplate: \"Save Template\",\r\n OpenTemplate: \"Open Template\",\r\n AssortmentReport: \"Assortment Report\",\r\n Flag: \"Flag\",\r\n AllFlags: \"All Flags\",\r\n Format: \"Format\",\r\n AllFormats: \"All Formats\",\r\n Client: \"Customer\",\r\n AllClients: \"All Customer\", \r\n Scope: \"Scope\",\r\n Section: \"Section\",\r\n Family: \"Family\",\r\n Subfamily: \"Subfamily\",\r\n AllSubfamily: \"All Subfamilies\",\r\n Opening: \"Opening\",\r\n UpTo5Labels: \"You can only select up to 5 labels.\",\r\n Months3: \"3 Months\",\r\n Months6: \"6 Months\",\r\n Run: \"Run\",\r\n Export: \"Export\",\r\n ManagementOfItems: \"Management of Items\",\r\n ManagementOfItemsLegend1: \"Search for products: Choose category / s, subcategory / s and filter by free text, when finished press the button 'Search'.\",\r\n ManagementOfItemsLegend2: \"Modification of attributes: Modify or add the attributes that you want to update in a massive way, when finished press the 'Apply' button.\",\r\n ManagementOfItemsLegend3: \"List of Items: In the following table you can see the changes applied.\",\r\n ManageItems: \"Manage Items\",\r\n SearchManageItems: \"Search by code, name, brand, manufacturer\",\r\n FilterTooltip: \"Filter\",\r\n SelectedTags: \"Selected Tags\",\r\n AddNewTagTooltip: \"Add new Tag\",\r\n AsignForPersist: \"Now you must assign the new attribute to at least one item\",\r\n Group: \"Group\",\r\n SelectedGroup: \"Selected Group\",\r\n YouMustSelectAtLeastOneCategory: \"You must select at least one Category\",\r\n ManagementOfItemsTitle1: \"Product Search\",\r\n ManagementOfItemsTitle2: \"Modification of attributes\",\r\n ManagementOfItemsTitle3: \"List of Items\",\r\n NewTagGroup: \"New Tag Group\",\r\n NewBrand: \"New Brand\",\r\n NewManufacturer: \"New Manufacturer\",\r\n WithoutProducts: \"Without Products\",\r\n FullView: \"Full View\",\r\n UnitsStock: \"Stock Units\",\r\n TheItemWasAdded: \"The item was added\",\r\n Aggregate: \"Aggregate\",\r\n Actives: \"Actives\",\r\n EnterFurnitureToPrint: \"Enter furniture to print\",\r\n EnterFurnitureToPrintSubtitle: \"If it leaves empty, all the furniture will be printed. You can use ranges. Ex: 2-5\",\r\n InvalidRank: \"The entered range is invalid\",\r\n InvalidRankSubtitle: \"You must write a valid furniture position\",\r\n ConfigurationFinished: \"Configuration finished\",\r\n AllReadyToPrintThePlanogram: \"All ready to print the planogram\",\r\n Planogram: \"Planogram\",\r\n Seconds: \" seconds\", \r\n Since: \"Since \",\r\n YearAgo: \" year ago\",\r\n MonthAgo: \" month ago\",\r\n DayAgo: \" day ago\",\r\n HourAgo: \" hour ago\",\r\n MinuteAgo: \" minute ago\",\r\n Sp_generalKpis_Kpis: \"General KPIs\",\r\n Sp_generalKpis_Filters: \"Filters\",\r\n Sp_generalKpis_Category: \"Category\",\r\n Sp_generalKpis_rentability: \"Rentability\",\r\n Sp_generalKpis_averagePrice: \"Average Price\",\r\n Sp_generalKpis_spacing: \"Spacing\",\r\n Sp_generalKpis_tags: \"Tags\",\r\n Sp_generalKpis_zones: \"Zones\",\r\n Sp_generalKpis_applyButton: \"Apply\",\r\n Sp_editLayout_AddTicketTooltip: \"Add Ticket to the Selected Planogram\",\r\n Sp_editLayout_rotateTooltip: \"Rotate selected Planogram\",\r\n Sp_editLayout_deleteTooltip: \"Delete selected Planogram\",\r\n Pr_competitors_checkboxMarker: \"Relative prices of this competitor will be agreed for the generation of suggestions\",\r\n Pr_competitors_checkboxObserve: \"The prices of this competitor will be relieved\",\r\n Sp_editPlanogram_Recommendation: \"Recommendation\",\r\n\r\n \r\n CompetitiveIndex: \"Competitiveness Index\",\r\n PriceEvolution: \"Price Evolution\",\r\n CompetitiveByZone: \"Competitiveness By Zone\",\r\n CompetitiveByCompetitor: \"Competitiveness by Competitor\",\r\n CompetitiveByCategory: \"Competitiveness by Category\",\r\n SelectPricingZone: \"-- Select Pricing Zone --\",\r\n Pr_competitiveIndex_subtitle: \"Change the grouper to see in different ways the Competitiveness Index\",\r\n Pr_competitiveIndex_GroupBy: \"Group by:\",\r\n Pr_competitiveIndex_CompetitivenessFor: \"Competitiveness for\",\r\n Pr_competitiveIndex_Ci: \"CI\",\r\n Pr_competitiveIndex_Cheaper: \"Cheaper\",\r\n Pr_competitiveIndex_TheSame: \"The Same\",\r\n Pr_competitiveIndex_MoreExpensive: \"More expensive\",\r\n Pr_competitiveIndex_TypeOfSurvey: \"Type of Survey\",\r\n Pr_decisions_restore: \"Restore\",\r\n Sp_editLayout_validationArea: \"The Sales Area can not be greater than the Total Area\",\r\n Pr_decisions_ExperimentalPrice: \"Simulated Price\",\r\n Pr_decisions_Close: \"Close\",\r\n Pr_decisions_CloseTooltip: \"Deselect all items\",\r\n Pr_decisions_Experiment: \"Simulation\",\r\n Pr_decisions_ChangePrice: \"Change Price\",\r\n Pr_decisions_Selected: \"Selected\",\r\n Pr_volumeMeasurement_legend1: \"Select a product\",\r\n Pr_volumeMeasurement_legend2: \"Select a price zone\",\r\n Pr_volumeMeasurement_legend3: \"Fill in the dates 'From' and 'To' to visualize the graph\",\r\n Pr_volumeMeasurement_evolutionOfTheMIX: \"Evolution of the MIX\",\r\n Pr_volumeMeasurement_validationDate: \"Date Since can not be greater than date Until\",\r\n Sp_planograms_editStructure: \"Edit Structure\",\r\n Sp_planograms_editStructureTooltip: \"Edit the planogram structure or add a new piece of furniture\",\r\n Sp_planograms_copyStructure: \"Copy Structure\",\r\n Sp_planograms_copyStructureAndProducts: \"Copy Structure and Products\",\r\n Sp_editPlanogram_editLevelsTooltip: \"Edit the dimensions of the Planogram levels\",\r\n Adm_brands_brands: \"Brands\",\r\n Adm_brands_addBrand: \"Add Brand\",\r\n Adm_brands_brandName: \"Brand Name\",\r\n Adm_brands_searchBrand: \"Search Brand...\",\r\n Adm_brands_newBrand: \"New Brand\",\r\n Adm_brands_editBrand: \"Edit Brand\",\r\n Sp_createPlanogram_loadStoresIndividually: \"Load stores individually\",\r\n Sp_createPlanogram_loadStoresMassively: \"Load stores massively\",\r\n Sp_editPlanogram_space: \"Space\",\r\n Sp_editPlanogram_spaced: \"Spaced: \",\r\n Sp_editPlanogram_new: \"New\",\r\n Sp_editPlanogram_pendingApproval: \"Pending Approval\",\r\n Sp_editPlanogram_approved: \"Approved\",\r\n Sp_editPlanogram_informed: \"Informed\",\r\n Sp_editLayout_moreZoomTooltip: \"Zoom in on Layout\",\r\n Sp_editLayout_lessZoomTooltip: \"Give less zoom to the Layout\",\r\n SP_editPlanogram_Autocomplete_Strategy: \"Define Strategy\",\r\n SP_editPlanogram_Autocomplete_ExhibitionDays: \"Target Exhibition Days\",\r\n SP_editPlanogram_Autocomplete_Results: \"Results\",\r\n SP_editPlanogram_Autocomplete_ResultsSummary: \"Summary\",\r\n SP_editPlanogram_Autocomplete_ResultsSummary_Part1: \"There are \",\r\n SP_editPlanogram_Autocomplete_ResultsSummary_Part2: \" items included in the planogram\",\r\n SP_editPlanogram_Autocomplete_ResultsSummary_Part3: \"of a total of \",\r\n SP_editPlanogram_Autocomplete_ResultsSummary_Part4: \" items \",\r\n SP_editPlanogram_Autocomplete_ResultsSummary_Part5: \"and we could not include \",\r\n SP_editPlanogram_Autocomplete_ResultsSummary_Part6: \" items of the current assortment.\",\r\n SP_editPlanogram_Autocomplete_ResultsSummary: \"Not included items detail\",\r\n SP_editPlanogram_Autocomplete_ResultsTableCode: \"Code\",\r\n SP_editPlanogram_Autocomplete_ResultsTableDesc: \"Description\",\r\n Pr_competitors_selectBrand: \"--Select Brand--\",\r\n Ad_missions_newMissions: \"New Mission\",\r\n Ad_missions_mission: \"Mission\",\r\n Ad_missions_missionType: \"Mission type\",\r\n Ad_missions_finishDate: \"Finish Date\",\r\n Ad_missions_users: \"#Users\",\r\n Ad_missions_advance: \"Advance\",\r\n Ad_missions_daysToExpire: \"Days to Expire\",\r\n Ad_missions_programming: \"Programming\",\r\n Ad_missions_surveyMethod: \"Survey Method\",\r\n Ad_missions_selectMissionType: \"--Select mission type--\",\r\n Ad_missions_selectsMethod: \"--Select method--\",\r\n Ad_missions_selectFrecuency: \"--Select Frecuency--\", \r\n Ad_missions_selectActionType: \"--Select Action Type--\", \r\n Ad_missions_timeToCompleteIt: \"Time to complete it\",\r\n Ad_missions_inDays: \"In days\",\r\n Ad_missions_startsOn: \"Start on:\",\r\n Ad_missions_endsThe: \"Ends the:\",\r\n Ad_missions_brand: \"Brand\",\r\n Ad_missions_selectBrand: \"--Select Brands--\",\r\n Ad_missions_region: \"Region\",\r\n Ad_missions_selectRegion: \"--Select Regions--\",\r\n Ad_missions_location: \"Location\",\r\n Ad_missions_selectLocation: \"--Select localities--\",\r\n Ad_missions_priceZone: \"Price Zone\",\r\n Ad_missions_selectpriceZone: \"--Select price zone--\",\r\n Ad_missions_specificStores: \"Specific Stores\",\r\n Ad_missions_selectSpecificStores: \"--Select specific stores--\",\r\n Ad_missions_products: \"Products\",\r\n Ad_missions_group: \"Group\",\r\n Ad_missions_selectGroup: \"--Select group--\",\r\n Ad_missions_subGroup: \"Subgroup\",\r\n Ad_missions_selectGroup: \"--Select Subgroup--\",\r\n Ad_missions_Items: \"Items\",\r\n Ad_missions_selectItems: \"--Select Items--\",\r\n Ad_missions_responsible: \"Responsible\",\r\n Ad_missions_selectShopper: \"Select Shopper\",\r\n Ad_missions_shopper: \"Shopper\",\r\n Ad_missions_addShopper: \"Add a new responsable\",\r\n Ad_missions_legendResponsable: \"Assign tents to a specific manager to do this survey\",\r\n Pr_competitors_selectPlace: \"--Select Place--\",\r\n\r\n //JS\r\n SaveSwalTitle: \"Are you sure you want to save the store?\",\r\n StoreSaved: \"Saved store\",\r\n ErrorWhenSavingTheStore: \"An error occurred while saving the store\",\r\n ValidationNameStore: \"You must choose a store name\",\r\n ValidationTypeStore: \"You must choose a store type\",\r\n EnableDisableSwalTitle: \"the store\",\r\n UpdatedStores: \"Updated stores\",\r\n AssignedStoresSwalTitle: \"Assigned stores\",\r\n AssignedStoresSwalSubTitle: \"The stores were correctly assigned to the user\",\r\n ValidationMirrorStoreAndBaseStore: \"The mirror station must be different from the base station\",\r\n ValidationSelectedStoreNotHaveAPrice: \"The selected station does not have a price for the chosen item\",\r\n DstPopUpInformativeGraphic: \"more sales in $\",\r\n StoreAndCD: \"Stores and Distribution Centers\",\r\n StoreDescendant: \"Store Desc.\",\r\n CategoryTreeMap: \"Category Treemap\",\r\n ByCategory: \"By Category\",\r\n Setup: \"Setup\",\r\n PriceZones: \"Price Zones\",\r\n Rounding: \"Rounding\",\r\n Goals: \"Goals\",\r\n Reports: \"Reports\",\r\n Welcome: \"Welcome to Prisma!\",\r\n InformToERP: \"Inform to ERP\",\r\n PriceElasticity: \"Price Elasticity\",\r\n Reports: \"Reports\",\r\n PriceChanges: \"Price Changes\",\r\n PriceMap: \"Price Map\",\r\n InformedPrices: \"Informed Prices\",\r\n DailyMargins: \"Daily Margins\",\r\n ReplenishmentCosts: \"Replenishment Costs\",\r\n Promotions: \"Promotions\",\r\n Campaigns: \"Campaigns\",\r\n Workflows: \"Workflows\",\r\n Rules: \"Rules\",\r\n PromotionalActions: \"Promotions\",\r\n Calendar: \"Calendar\",\r\n ControlPanel: \"Control Panel\",\r\n MyTasks: \"My Tasks\",\r\n Communicate: \"Communicate\",\r\n BIReports: \"BI Reports\",\r\n Markdowns: \"Markdowns\",\r\n SelectionRules: \"Selection Rules\",\r\n Missions: \"Missions\",\r\n MarketData: \"Market Data\",\r\n NewPrices: \"New Prices\",\r\n Spaces: \"Spaces\",\r\n Sensitivities: \"Sensitivities\",\r\n Security: \"Security\",\r\n Users: \"Users\",\r\n PrismaDevelopedBy: \"Prisma has been developed by\",\r\n InformationUpdatedUpTo: \"Information Updated up to\",\r\n SALES: \"SALES\",\r\n SalesYTD: \"Sales YTD\",\r\n VsPlan: \"vs Plan\",\r\n PlanProgress: \"Plan Progress\",\r\n AnnualPlan: \"Annual Plan\",\r\n Forecasted: \"Forecasted\",\r\n VsPrevYear: \"vs Previous Year\",\r\n MARGIN: \"MARGIN $\",\r\n COST: \"COST\",\r\n UNITS: \"UNITS\",\r\n MarginYTD: \"Margin YTD\",\r\n UnitsYTD: \"Units YTD\",\r\n CostYTD: \"Cost YTD\",\r\n MarginDecreased: \"Margin has decreased\",\r\n PriceInS: 'Price in $',\r\n HeatMap: 'Heat Map',\r\n HeatMapSubtitle: \"In this map you can review your performance per Country, State, City and Store\",\r\n PreviousMonth: \"Previous Month\",\r\n SameMonthPrevYear: \"Same month prev year\",\r\n SelectCategory: \"-- Select Category --\",\r\n SalesIn: \"Sales in\",\r\n Population: \"Population\",\r\n Households: \"Households\",\r\n GreaterThan: \"greater than\",\r\n Between: \"between\",\r\n And: \" and \",\r\n LessThan: \"less than\",\r\n SelectSector: \"--Select Sector--\",\r\n SelectState: \"--Select State--\",\r\n Colors: \"Colors\",\r\n Size: \"Size\",\r\n Period: \"Period\",\r\n START: \"START\",\r\n Analysis: \"Analysis\",\r\n SelectedPeriod: \"Selected period\",\r\n DifferenceSamePeriodPrevYear: \"Difference with same period prev. Year\",\r\n State: \"State\",\r\n ShowSalesDistributionBetween: \"Show sales distribution between\",\r\n Categories: \"Categories\",\r\n Stores: \"Stores\",\r\n TheSizeOfTheCirclesCorresponds: \"The size of the bubbles correspond to\",\r\n Category: \"Category\",\r\n Store: \"Store\",\r\n TheColorShowsTheVariation: \"The color shows the variation between the current period and the previous period\",\r\n DTSLegend1: \"Here you can see how each category or store performed vs the previous period. The color of the bubble reflects the magnitude of the variation that can also be seen in the Y Axis\",\r\n PriceDecisionsCategory: \"Price Decisions by Category\",\r\n PriceDecisionsCategorySubtitle1: \"The following is a summary of the Price Suggestions and Decisions per category\",\r\n PriceDecisionsCategorySubtitle2: \"Click over the category or subcategory that you want to review\",\r\n Search: \"Search...\",\r\n ClickToEnterCategory: \"Click here to review this category\",\r\n RegularSuggestions: \"Regular Suggestions\",\r\n Suggestions: \"Suggestions\",\r\n SuggestionsQuantity: \"Suggestions Quantity\",\r\n NumberCompetitiveSuggestions: \"Number of competitive suggestions\",\r\n Impact: \"Impact\",\r\n ShowsImpactInMargin: \"Shows the impact in margin if suggestions are accepted\",\r\n ShowsImpactInPesos: \"Shows the impact in pesos of the suggestion\",\r\n CompetitiveSuggestions: \"Competitive Suggestions\",\r\n NewRegular: \"New Regular\",\r\n New: \"New\",\r\n BigDrop: \"Big Drop\",\r\n BigDropToolTip: \"New Prices that dropped more than what is allowed for this category\",\r\n BigIncrease: \"Big Increase\",\r\n BigIncreaseToolTip: \"New Prices that increased more than what is allowed for this category\",\r\n MarginMin: \"< Margin min\",\r\n MarginMintTooltip: \"New prices that are below the minimum margin for this category\",\r\n MarginMax: \"> Margin max\",\r\n MarginMaxTooltip: \"New prices that are above the maximum margin for this category.\",\r\n NewCompetitive: \"New Competitive\",\r\n OverCategoryTotal: \"over category total\",\r\n MarginDifPerMonth: \"margin dif. x month\",\r\n Decisions: \"Decisions\",\r\n NumberOfChanges: \"# Changes\",\r\n OverTotalSuggestedChanges: \"over total suggested changes\",\r\n AcceptedSuggestions: \"accepted sug.\",\r\n PercentageChange: \"% Change\",\r\n VsSuggestedPrices: \"vs. suggested prices\",\r\n VsCurrentPrices: \"vs. current prices\",\r\n WeightedByUnitSales: \"weighted by unit sales\",\r\n AssumingSameUnitSales: \"assuming same unit sales\",\r\n Performance: \"Performance\",\r\n Suggestion: \"Suggestion\",\r\n Product: \"Product\",\r\n ValidFromDate: \"Valid From Date\",\r\n ValidFrom: \"Valid From\",\r\n ValidTo: \"Valid To\",\r\n ValidFromUpdateTooltip: \"Massively update the date FROM the filtered prices\",\r\n ValidToUpdateTooltip: \"Massively update the date TO the filtered prices\",\r\n CompetitorsMap: \"Competitors Map\",\r\n CostsAndMargins: \"Costs & Margins\",\r\n AuditTrails: \"Audit Trails\",\r\n All: \"All\",\r\n Current: \"Current\",\r\n Exception: \"Exception\",\r\n Markdown: \"Markdown\",\r\n Promotion: \"Promotion\",\r\n Bonus: \"Bonus\",\r\n Competitive: \"Competitive\",\r\n Regular: \"Regular\",\r\n PriceZone: \"Price Zone\",\r\n CompetitorType: \"Competitor Type\",\r\n Competitor: \"Competitor\",\r\n OnlyMarkers: \"Only markers\",\r\n MultizoneViews: \"Multizone Views\",\r\n Allf: \"All\",\r\n Any: \"Any\",\r\n SelectProduct: \"-- Select product --\",\r\n SelectCompetitorType: \"-- Select Competitor Type --\",\r\n SelectCompetitor: \"-- Select competitor --\",\r\n Observed: \"Observed\",\r\n Type: \"Type\",\r\n Basket: \"Basket\",\r\n Own: \"Own\",\r\n PriceIndex: \"Price Index\",\r\n Web: \"Web\",\r\n Extra: \"Extra\",\r\n Rule: \"Rule\",\r\n PricesEvaluatedByCompetitiveRule: \"Prices evaluated by Competitive Rule\",\r\n CurrentPrice: \"Current Price\",\r\n SuggestedPriceBasedOnTargetMargin: \"Suggested Price based on Target Margin\",\r\n Date: \"Date\",\r\n AssortmentStrategyAndRules: \"Assortment Strategy and Rules\",\r\n AssortmentStrategyAndRulesSubtitle: \"Setup the Roles and Strategies for each Product Category, indicating the target coverage.\\r\\nSetup the weight of each variable to build the weighted index for each Pareto\\r\\nComplete the review frequency for each Product Category\",\r\n GoalsSelectCategory: \"Select a category, pricing zone or store to in the table below to generate the chart\",\r\n BenchmarksStepOne1: \"Use the available filters to refine your benchmark\",\r\n BenchmarksStepOne2: \"Explore the charts to compare sales, units and margins over the last months\",\r\n BenchmarksStepOne3: \"Use the blue buttons to change the chart type\",\r\n Compare: \"Compare\",\r\n SectorsToCompare: \"Sectors/Categories to compare\",\r\n SelectCategories: \"Select Categories\",\r\n ClustersToCompare: \"Clusters to compare\",\r\n SelectClusters: \"Select Clusters\",\r\n Filter: \"Filter\",\r\n SectorsCategories: \"Sectors/Categories\",\r\n From: \"From\",\r\n To: \"To\",\r\n Bars: \"Bars\",\r\n Spline: \"Spline\",\r\n SalesComparison: \"Sales Comparison\",\r\n Accumulated: \"accumulated\",\r\n MarginComparison: \"Margin Comparison\",\r\n UnitsComparison: \"Units Comparison\",\r\n ComparePerformance: \"Comparative performance analysis\",\r\n AreYouSureSwalTitle: \"Are you sure you want to \",\r\n EnableSwal: \"enable\",\r\n ToDisableSwal: \"disable\",\r\n TheZoneSwal: \" the zone\",\r\n WarningStoresSwal: \"WARNING! the stores \",\r\n BelongZoneSwall: \" belong to the zone\",\r\n CancelSwal: \"Cancel\",\r\n ContinueSwal: \"Continue\",\r\n UpdatedZonesSwal: \"Updated Zones\",\r\n TheProcessContinuesSwal: \"The process continues…\",\r\n ErrorTitleSwal: \"Error!\",\r\n ErrorWhenDisablingTheZoneSwal: \"There was an error disabling the price zone.\",\r\n SavePriceZoneSwalTitle: \"Are you sure you want to Save this Price Zone?\",\r\n SaveSwal: \"Save\",\r\n SavedZoneSwal: \"Saved Zone!\",\r\n SavedZoneSwalSubtitle: \"the price zone has been saved successfully\",\r\n ErrorOccurredWhileSavingZoneSwal: \"An error has occurred trying to save the zone\",\r\n ValidationSwalTitle: \"Incomplete fields\",\r\n ValidationSwalSubtitle: \"You must complete all the fields\",\r\n SaveCompetitorValidationSwalSubtitle: \"You must complete code and name\",\r\n SaveCompetitorTreeRelationsSwal: \"Saved relationships!\",\r\n TheProcessOfContinuousStorageSwal: \"The storage process continues. You can check the status in a few minutes.\",\r\n ThereWasAnErrorInSavingRelationshipsSwal: \"There was an error in saving relationships\",\r\n DisableCompetitorSwalTitle: \"Are you sure you want to disable the competitor?\",\r\n CompetitorDisabledSwalTitle: \"Competitor Disabled!\",\r\n CompetitorDisabledSwalSubtitle: \"it has been disabled correctly\",\r\n TheProcessOfDisablingContinuesSwal: \"The process of disabling continues. You can check the status in a few minutes.\",\r\n ThereWasAnErrorDisablingCompetitorSwal: \"There was an error disabling the competitor\",\r\n EditCompetitor: \"Edit Competitor\",\r\n TheCompetitorExistsInTheGroupSwalTitle: \"The competitor already exists in the group\",\r\n TheCompetitorExistsInTheGroupSwalSubtitle: \"The competitor has not been added because it already existed in the group\",\r\n YouAreSureToRemoveTheCompetitorSwal: \"You are sure to remove the competitor \",\r\n FromTheGroupSwal: \" from the group \",\r\n RemoveSwal: \"Remove\",\r\n EditSensitivityTitle: \"EDIT SENSITIVITY\",\r\n NewSensitivityTitle: \"NEW SENSITIVITY\",\r\n SaveSensitivitySwal: \"Are you sure you want to save the Sensitivity?\",\r\n SavedSensitivitySwal: \"Saved Sensitivity!\",\r\n TheSensibilitySwal: \"The sensibility \",\r\n HasBeenSuccessfullySavedSwal: \" has been successfully saved\",\r\n ErrorSavingSensitivitySwal: \"There was an error saving this sensitivity\",\r\n EditRoundingRuleTitle: \"EDIT ROUNDING RULE\",\r\n NewRoundingRuleTitle: \"NEW ROUNDING RULE\",\r\n DeleteTheRuleSwal: \"Are you sure you want to delete the rule?\",\r\n ErasedRuleSwal: \"Erased Rule!\",\r\n HasBeenErasedCorrectlySwal: \"has been erased correctly\",\r\n TheProcessOfContinuousDeletionSwal: \"The process of continuous deletion. You can check the status in a few minutes.\",\r\n ErrorWhenDeletingTheRule: \"There was an error deleting the rule\",\r\n DeleteSwal: \"Delete\",\r\n ValidationNumberToRound: \"You must enter a valid number\",\r\n SaveTheRoundingRulesSwal: \"Are you sure you want to save the Rounding Rules?\",\r\n SavedRoundingRulesSwal: \"Saved Rounding Rules!\",\r\n ErrorWhenSavingTheseRoundingRules: \"There was an error saving these Rounding Rules\",\r\n ValidationRangesSwal: \"the list of ranges should start at 0 and end at infinity (empty)\",\r\n ValidationRangesSwal1: \"verify that the 'up' of a range matches the 'from' of the next\",\r\n AreYouSureSwal: \"Are you sure?\",\r\n AreYouSureSwalSubtitle: \"Are you sure you want to save the changes?\",\r\n WarningSwal: \"Warning\",\r\n YouMustSaveSwal: \"You must save before adding a new range.\",\r\n NoChangeWasDetectedSwal: \"No change was detected\",\r\n ConfirmedSwal: \"Confirmed\",\r\n ConfirmedSwalSubtitle: \"The selected changes were saved\",\r\n ErrorSwalSubtitle: \"There was an error wanting to save the changes\",\r\n AreYouSureYouWantToReviewTheCategorySwal: \"Are you sure you want to review the category?\",\r\n RevisionOfCategorySwal: \"Category Review!\",\r\n RevisionOfCategorySwalSubtitle: \"The category review process has been successfully completed. They were generated \",\r\n RevisionOfCategorySwalSubtitle2: \" suggestions for this category\",\r\n TheContinuousCategoryReviewProcessSwal: \"The revision process of continuous category. You can review the suggestions generated within a few moments from the price decision screen.\",\r\n ErrorWhenReviewingThisCategory: \"There was an error reviewing this category\",\r\n GenerateSuggestionsSwal: \"You are sure you want to generate the suggestions?\",\r\n GenerationOfSuggestionsSwal: \"Generation of Suggestions!\",\r\n TheProcessEndedSuccessfullySwal: \"The process ended successfully. They were generated \",\r\n TheProcessEndedSuccessfullySwal2: \" suggestions for this category\",\r\n TheSuggestionsContinueToBeGeneratedSwal: \"The suggestions continue to be generated. You can check the status of them within a few moments from the price decision screen.\",\r\n ErrorWhenGeneratingSuggestionsForThisCategorySwal: \"There was an error generating the suggestions for this category\",\r\n RemoveRuleSwal: \"Are you sure you want to Delete the rule and its associated suggestions?\",\r\n RuleEliminatedSwal: \"Rule eliminated!\",\r\n TheRuleHasBeenSuccessfullyRemovedSwal: \"The rule has been successfully removed\",\r\n ErrorWhenDeletingTheRule: \"There was an error removing the rule\",\r\n TheRuleSwal: \"The Rule \",\r\n AssociatedWithGenericSwal: \" is already associated with the Generic \",\r\n ThereCanOnlyBe1RulePerGenericSwal: \" There can only be 1 rule per Generic\",\r\n NoApplicationScopeOrItemsWereAddedSwal: \"No Application Scope or Items were added\",\r\n NoApplicationScopeOrItemsWereAddedSwalSubtitle: \"For Item Relationship rules, you must select at least one sensitivity, label, attribute or item.\",\r\n AssortmentMatrix: \"Assortment Matrix\",\r\n ExportDecisions: \"Export Decisions\",\r\n ExportDecisionsPrisma: \"Export Decisions Prisma\",\r\n TextTooShort: \"Text too short\",\r\n Never: \"Never\",\r\n Daily: \"Daily\",\r\n Weekly: \"Weekly\",\r\n Biweekly: \"Biweekly\",\r\n Monthly: \"Monthly\",\r\n Bimonthly: \"Bimonthly\",\r\n Quarterly: \"Quarterly\",\r\n Days1: \" Days\",\r\n PricePoints: \"Price Points\",\r\n StandardRounding: \"Standard Rounding\",\r\n ToNearest: \"to nearest\",\r\n ToUp: \"to up\",\r\n ToDown: \"to down\",\r\n RoundingEndingValidation1: \"Ending should be between 0 and 1. \",\r\n RoundingEndingValidation2: \"Ending should be between 0 and 100. \",\r\n RoundingEndingValidation3: \"Ending should be between 0 and 1000. \",\r\n RoundingEndingValidation4: \"Ending should be between 0 and 10000. \",\r\n RoundingEndingValidation5: \"Ending should be between 0 and 100000. \",\r\n RoundingEndingValidation6: \"Ending should have the same or less number of decimals than this rounding\",\r\n RoundingEndingValidation7: \"Ending should be smaller than\",\r\n RoundingEndingValidation8: \"There is already an ending for this value. \",\r\n RoundingEndingValidation9: \"The value for this ending is invalid. \",\r\n Direction: \"Direction\",\r\n EditEndings: \"Edit Endings\",\r\n Rounding3: \"thousandths (56.36105 = 56.361)\",\r\n Rounding2: \"hundredths (56.36105 = 56.36)\",\r\n Rounding1: \"tenths (56.36105 = 56.4)\",\r\n Rounding0: \"integers (56.36105 = 56)\",\r\n RoundingM1: \"tens (56.36105 = 60)\",\r\n RoundingM2: \"hundreds (56.36105 = 100)\",\r\n RoundingM3: \"thousands (5.600 = 6.000)\",\r\n RoundingM4: \"ten thousands (5.600 = 10.000)\",\r\n RoundingM5: \"hundred thousands (56.000 = 100.000)\",\r\n RoundingM6: \"millions (560.000 = 1.000.000)\",\r\n NewSuggestionRule: \"New Suggestion Rule\",\r\n NewParentRule: \"New Parent Rule\",\r\n Minimum: \"Minimum\",\r\n Average: \"Average\",\r\n Maximum: \"Maximum\",\r\n Mode: \"Mode\",\r\n LowestModePrice: \"Lowest Mode Price\",\r\n AverageModePrice: \"Average Mode Price\",\r\n HighestModePrice: \"Highest Mode Price\",\r\n HighestRepetitions: \"Highest Repetitions\",\r\n PriceVariation: \"Price Variation\",\r\n RULE: \"RULE: \",\r\n of: \"of\",\r\n CI: \"CI\",\r\n SuggestedCI: \"Suggested CI\",\r\n NewCI: \"New CI\",\r\n PriceHistoryAndEstimatedUnitSales: \"Price History and Estimated Unit Sales\",\r\n PriceHistory: \"Price History\",\r\n UnitSalesHistory: \"Unit Sales History\",\r\n Costs: \"Costs\",\r\n CurrentWOTaxes: \"Current wo Taxes\",\r\n NewWOTaxes: \"New wo Taxes\",\r\n CurrentTaxes: \"Current Taxes\",\r\n NewTaxes: \"New Taxes\",\r\n CurrentTotalCostWOVat: \"Current Total Cost wo VAT\",\r\n NewTotalCostWOVat: \"New Total Cost wo VAT\",\r\n TotalCostVariation: \"Total Cost % Variation wo VAT\",\r\n Margins: \"Margins\",\r\n MarginHasChanged: \"The margin has changed\",\r\n CostHasChanged: \"The cost has changed\",\r\n TicketTypes: \"Ticket Types\",\r\n Planograms: \"Planograms\",\r\n CreatePlanogram: \"Create Planogram\",\r\n AnErrorHasOccurred: \"An error has occurred\",\r\n AnErrorHasOccurredInfo: \"An unexpected error has occurred.\\r\\nIf the problem persists, press the Download Info button to download a text file.Send an email to the Prisma support team with the text file attached.\\r\\nThanks and sorry for the inconvenience.\",\r\n ViewAdditionalInfo: \"View additional information\",\r\n DownloadInfo: \"Download Info\",\r\n RequestedActivityProcessing: \"The requested activity is still processing\",\r\n SalesLegend: \"sales_$\",\r\n UnitsLegend: \"units\",\r\n MarginLegend: \"margin_$\",\r\n PriceLegend: \"price\",\r\n SundayS: \"Sun\",\r\n MondayS: \"Mon\",\r\n TuesdayS: \"Tue\",\r\n WednesdayS: \"Wed\",\r\n ThursdayS: \"Thu\",\r\n FridayS: \"Fri\",\r\n SaturdayS: \"Sat\",\r\n JanuaryS: \"Jan\",\r\n FebruaryS: \"Feb\",\r\n MarchS: \"Mar\",\r\n AprilS: \"Apr\",\r\n Mays: \"May\",\r\n JuneS: \"Jun\",\r\n JulyS: \"Jul\",\r\n AugustS: \"Aug\",\r\n SeptemberS: \"Sep\",\r\n OctoberS: \"Oct\",\r\n NovemberS: \"Nov\",\r\n DecemberS: \"Dec\",\r\n Sunday: \"Sunday\",\r\n Monday: \"Monday\",\r\n Tuesday: \"Tuesday\",\r\n Wednesday: \"Wednesday\",\r\n Thursday: \"Thursday\",\r\n Friday: \"Friday\",\r\n Saturday: \"Saturday\",\r\n January: \"January\",\r\n February: \"February\",\r\n March: \"March\",\r\n April: \"April\",\r\n May: \"May\",\r\n June: \"June\",\r\n July: \"July\",\r\n August: \"August\",\r\n September: \"September\",\r\n October: \"October\",\r\n November: \"November\",\r\n December: \"December\",\r\n IsThe: \" is the \",\r\n WithGreatestIncrease: \" with the greatest increase \",\r\n WithGreatestDecrease: \" with the greatest drop \",\r\n DTSLegend3: \"Here you can see the subcategories grouped by category, the total size of each category and the variation versus the previous period.\",\r\n DSTFinalMessage: \"Explore the report\",\r\n DSTFinalMessageInfo: \"You can navigate the report by clicking the buttons above. If you hover your mouse over a bubble you will get more info of the \",\r\n OfThe: \" of the \",\r\n DstPopUpInformativeGraphicLess: \"less sales $\",\r\n RequestedActivityProcessingInfo: \"The requested activity is still processing.\\r\\nThe results will be ready when this process ends.\\r\\nPress OK to close this message.\",\r\n SessionExpired: \"The current session has expired\",\r\n SessionExpiredInfo: \"The current session has expired\\r\\n Press OK to close this message and login again with your credentials.\",\r\n AccessDenied: \"Access Denied\",\r\n AccessDeniedInfo: \"You do not have access to complete the requested action.\\r\\n You can request additional permissions to the system administrator.\",\r\n Suggested: \"Suggested\",\r\n Endorsed: \"Endorsed\",\r\n Pending: \"Pending\",\r\n NewPriceSuggestion: \"There is a new price suggestion\",\r\n ERPPrice: \"It's the ERP Price\",\r\n PriceNeedsEndorsement: \"This price was changed and needs endorsement\",\r\n ReadyToInformToERP: \"This price was changed and endorsed. It's ready to be informed to the ERP\",\r\n Ignored: \"Ignored\",\r\n Ignore: \"Ignore\",\r\n Days: \"days\",\r\n Event: \"Event\",\r\n Observations: \"Observations\",\r\n Date: \"Date\",\r\n User: \"User\",\r\n AddNewFloor: \"Add new floor\",\r\n ChoosePicture: \"Choose Picture\",\r\n NoSelectedFiles: \"No selected files\",\r\n Width: \"Width\",\r\n Height: \"Height\",\r\n HeightF: \"High\",\r\n SellingArea: \"Selling Area\",\r\n TotalArea: \"Total area\",\r\n LayoutEdition: \"Layout Edition\",\r\n LayoutEditionSubTitle: \"Create new layouts or modify existing ones\",\r\n LayoutEditionLegend1: \"Add one or more floors to the Layout\",\r\n LayoutEditionLegend2: \"Drag the planograms that you want to place in the Layout\",\r\n LayoutEditionLegend3: \"Click on the Planogram you want to click on, or to see your own information\",\r\n LayoutView: \"Layout View\",\r\n AnalyzeLayoutPerformance: \"Analyze your Layouts Performance\",\r\n ViewMode: \"View Mode\",\r\n EditMode: \"Edit Mode\",\r\n Rotate: \"Rotate\",\r\n ViewPlanogram: \"View Planogram\",\r\n View: \"View\",\r\n AddTicket: \"Add Ticket\",\r\n SelectedStore: \"Selected Store\",\r\n Off: \"Off\",\r\n StockOut: \"Out of Stock\",\r\n Floor: \"Floor\",\r\n NewFloor: \"New Floor\",\r\n ShowInfo: \"Show Information\",\r\n HideInfo: \"Hide Information\",\r\n ShowInformationPlanograms: \"Show Information of the Planograms\",\r\n HideInformationPlanograms: \"Hide Information of the Planograms\",\r\n AddFloorToLayout: \"Add a floor to this Layout\",\r\n LayoutWOFloor: \"Layout without floor\",\r\n AddFloorToLayoutEditMode: \"Add a new floor to the Layout from the Edit Mode\",\r\n NoPlanograms: \"No Planograms\",\r\n NoPlanogramsSubtitle: \"No Planograms associated with this Cluster\",\r\n InformationPanel: \"Information Panel\",\r\n Facings: \"Facings\",\r\n SquareMeters: \"Square Meters\",\r\n LinearMeters: \"Linear Meters\",\r\n Legend: \"Legend\",\r\n AdditionalInformation: \"Additional Information\",\r\n NewTicket: \"New Ticket\",\r\n SelectTicket: \"--Select Ticket--\",\r\n SelectPriority: \"--Select Priority--\",\r\n Code: \"Code\",\r\n CreateLayout: \"Create Layout\",\r\n SelectCluster: \"--Select Cluster--\",\r\n PressNextWhenDone: \"Press the Next Button when you are done\",\r\n UseCreatedFurniture: \"Use the created furnitures or click + to create a new one\",\r\n First: \"First\",\r\n Last: \"Last\",\r\n EditPlanogram: \"Edit Planogram\",\r\n PlanogramView: \"Planogram View\",\r\n AnalyzePlanogramPerformance: \"Analyze your Planogram Performance\",\r\n ExportToExcel: \"Export to Excel\",\r\n ExportToExcelInfoPlanogram: \"Export the Planogram information to Excel\",\r\n AuditPicture: \"Audit Picture\",\r\n CreateFurniture: \"Create Furniture\",\r\n ViewDimensions: \"View Dimensions\",\r\n ActiveInCluster: \"Active in Cluster\",\r\n WithoutExhibition: \"Without Exhibition\",\r\n WithExhibition: \"With Exhibition\",\r\n Autocomplete: \"Autocomplete\",\r\n PriceElasticity: \"Price Elasticity\",\r\n Hypothesis: \"Hypothesis\",\r\n Action: \"Action\",\r\n SelectAction: \"--Select Action--\",\r\n Value: \"Value\",\r\n SelectValueType: \"--Select Value Type--\",\r\n Forecast: \"Forecast\",\r\n ExpectVolumeSales: \"I expect volume sales\",\r\n ExpectedValue: \"Expected Value\",\r\n AvoidChangingOtherThanPrice: \"Avoid changing other variables besides price during the test\",\r\n AssumptionsAndObservations: \"Assumptions and Observations\",\r\n EditLevels: \"Edit Levels\",\r\n Load: \"Load\",\r\n DaysInDisplay: \"Days in Display\",\r\n DaysInStock: \"Days in Stock\",\r\n ClusterPerformance: \"Cluster Performance\",\r\n StorePerformance: \"Store Performance\",\r\n LoadBehind: \"Load behind\",\r\n LoadAbove: \"Load above\",\r\n ClearFilters: \"Clear Filters\",\r\n SelectedCluster: \"Selected Cluster\",\r\n GroupBy: \"Group by\",\r\n SavePlanogramSwalTitle: \"Are you sure you want to Save the Planogram?\",\r\n SavedPlanogramSwal: \"Planogram Saved!\",\r\n SavedPlanogramaSwalSubtitle: \"the planogram has been saved successfully\",\r\n ClickHereViewCategory: \"click here to view this category\",\r\n MarginGuidelines: \"Margin Guidelines\",\r\n GenerateSuggestionsVarTooltipMin: \"Generate suggestions with a greater variation than the minimum allowed\",\r\n AllowMin: \"Allow Min\",\r\n AllowMax: \"Allow Max\",\r\n GenerateSuggestionsVarTooltipMax: \"Generate suggestions with a greater variation than the maximum allowed\",\r\n SignVar: \"Sign. Var.\",\r\n SignVarTooltip: \"Generate suggestions and new prices which variation is greater than the percentage specified in this column (Significance Rule)\",\r\n SignVarMargin: \"Sign Var. in Margin\",\r\n SignVarMarginTooltip: \"Generate suggestions and new prices which variation in margin is greater than the amount specified in this column (Significance Rule)\",\r\n MainCompetitor: \"Main Competitor\",\r\n TargetMarginP: \"Target %\",\r\n TargetMargin: \"Target $\",\r\n AllowMinTooltip: \"Generate suggestions below minimum margin\",\r\n AllowMaxTooltip: \"Generate suggestions above maximum margin\",\r\n GoToTarget: \"Go Target\",\r\n GoToTargetTooltip: \"If you select this option, the suggestion will try to reach the target margin after a change in costs\",\r\n KeepMargin: \"Keep\",\r\n KeepMarginTooltip: \"If you select this option, the suggestion will try to keep the current margin after a change in costs\",\r\n PriceVariation: \"Price Variation\",\r\n LowestPrice: \"Lowest Price\",\r\n AveragePrice: \"Average Price\",\r\n HighestPrice: \"Highest Price\",\r\n SwalReviewCategoryPriceRules: \"Are you sure you want to review this Category?\",\r\n RequestQueued: \"Your request has been queued\",\r\n RequestQueuedInfo: \"You can track your request in the list of pending tasks that you can find in the right header\",\r\n TheProcessContinues: \"The process continues...\",\r\n TheProcessContinuesReviewCategoryInfo: \"The review category task is stil processing. You can review the generated suggestions in a few moments in the Prices Decisions screen.\",\r\n AnErrorOccurredReviewingCategory: \"An error occurred while reviewing this category\",\r\n AreYouSureGeneratePriceSuggestions: \"Are you sure you want to generate suggestions?\",\r\n TheProcessContinuesGeneratePriceSuggestionsInfo: \"The generate suggestions task is stil processing. You can review the generated suggestions in a few moments in the Prices Decisions screen.\",\r\n AnErrorOccurredGeneratingSuggestions: \"An error occurred while generating suggestions for this category\",\r\n AreYouSureDeletePriceRule: \"Are you sure you want to delete this rule and the related suggestions?\",\r\n DeletedRule: \"Rule Deleted\",\r\n DeletedRuleInfo: \"The rule was successfully deleted\",\r\n TheProcessContinuesInfo: \"The task is stil processing. You can refresh this screen in a few moments.\",\r\n AnErrorDeletingRule: \"There was an error while trying to delete the rule\",\r\n CompetitiveWrittenRule1: \"RULE: Price \",\r\n IfMoreThanOneMode: \"If there is more than one mode use: \",\r\n IfMoreThanOneModeWithSameReps: \"and if there is more than one mode with same amount of repetitions use: \",\r\n OnlyCompetitorsInSamePriceZone: \"(only competitors in same price zone)\",\r\n SamePrice: \"Same Price\",\r\n DifferenceOf: \"Difference of\",\r\n SubsidiesFreights: \"Subsidies & Freights\",\r\n InsufficientSpaceSwal: 'Insufficient Space',\r\n InsufficientHeightSpaceSubtitleSwal: 'The height of the item exceeds the available height',\r\n InsufficientWidthSpaceSubtitleSwal: 'The width of the item exceeds available place',\r\n InsufficientDepthSpaceSubtitleSwal: 'The depth of the item exceeds available place',\r\n IncorrectCategorySwal: 'Incorrect category',\r\n IncorrectCategorySubtitleSwal: 'You can not add this item at a subcategory level',\r\n SureDeleteItemSwal: 'Are you sure you want to delete the product',\r\n AddLayDownItemSwal: 'Do you want to add the product lying position at the end of the level?',\r\n Fields: 'fields',\r\n SavedTicketSwal: \"ticket Saved!\",\r\n SavedTicketSwalSubtitle: \"The ticket has been saved successfully\",\r\n SureCleanPlanogramSwal: 'Are you sure you want to clean the planogram?',\r\n SureGenerateAutocompletePlanogramSwal: 'Are you sure you want to generate the autocomplete?',\r\n WithoutLevelsSwal: 'Without Levels',\r\n WithoutLevelsSubtitleSwal: 'the planogram does not have levels created',\r\n PlanagramNotFoundSwal: 'Planagram not found',\r\n PlanagramNotFoundSwalSubtitle1: 'was not found panogram that containing itemID: ',\r\n PlanagramNotFoundSwalSubtitle2: 'in the cluster with ID: ',\r\n HideProducts: 'Hide Products',\r\n ShowProducts: 'Show Products',\r\n HideInformation: 'Hide Information',\r\n ShowInformation: 'Show Information',\r\n HidePlanograms: 'Hide Planograms',\r\n ShowPlanograms: 'Show Planograms',\r\n Subspaced: 'Under Spaced',\r\n Overpaced: 'Over Spaced',\r\n SalesShare: 'Sales Share',\r\n SpaceShare: 'Spaces Share',\r\n SalesRestProducts: 'Sale - Rest of the Products',\r\n SpaceRestProcucts: 'Space - Rest of the Products',\r\n SalesRestPlanograms: 'Sale - Rest of the Planograms',\r\n SpaceRestPlanograms: 'Space - Rest of the Planograms',\r\n SureDeletePlanogramSwal: 'Are you sure you want to delete the planogram ',\r\n SureDeletePlanogramSwalDesc: 'Deleting this planogram will cause it to be automatically removed from all layouts.',\r\n SaveLayoutSwalTitle: \"Are you sure you want to Save the Layout?\",\r\n SavedLayoutSwal: \"Layout Saved!\",\r\n SavedLayoutSwalSubtitle: \"The Layout has been saved successfully\",\r\n ViewMore: \"Show More\",\r\n ViewLess: \"Show Less\",\r\n PlanogramCreatedIn: \"Planogram created in\",\r\n In: \"in\",\r\n UploadPicture: \"Upload Picture\",\r\n TicketsSubtitle: \"You can change the priority and status of existing Tickets or leave comments by clicking on the name of the Ticket\",\r\n SaveEditTicketTitle: \"Changes saved\",\r\n SaveEditTicketTitleSubtitle: \"The changes were saved correctly\",\r\n ResolveTicket: \"RESOLVE TICKET\",\r\n CloseTicket: \"CLOSE TICKET\",\r\n CreatedTicketIn: \"created the ticket in\",\r\n TicketType: \"Ticket Type\",\r\n Priority: \"Priority\",\r\n Comments: \"Comments\",\r\n Comment: \"Comment\",\r\n WriteComment: \"Write a comment...\",\r\n Low: \"Low\",\r\n LowPercentage: \"Low %\",\r\n RisePercentage: \"Rise %\",\r\n Medium: \"Medium\",\r\n High: \"High\",\r\n Resolved: \"Resolved\",\r\n Closed: \"Closed\",\r\n AlertWillLoseChanges: \"If you leave this page you will lose the pending changes to confirm. Are you sure you want to leave the page?\",\r\n SwalEmptyFloors: \"Empty Floors\",\r\n SwalEmptyFloorsSubtitle: \"The last floor added is still empty\",\r\n ValidationSwalTitleAddLevel: \"Incomplete data\",\r\n ValidationSwalSubtitleAddLevel: \"You must complete all fields with numeric values\",\r\n FileName: \"File name: \",\r\n FileSize: \", File size: \",\r\n NotValidFileType: \": Not a valid file type. Update your selection.\",\r\n ValidationNameTicket: \"You must enter a name\",\r\n ValidationTypeTicket: \"You must select a ticket type\",\r\n WithoutSize: \"Without size\",\r\n WithoutSizeSubtitle: \"without size height or width or depth\",\r\n BasicInformation: \"Basic Information\",\r\n UnitOfMeasure: \"Unit of Measure\",\r\n SaveItemSwall: \"Save Item\",\r\n SaveItemSwallSubtitle: \"Are you sure you want to save the item?\",\r\n ItemSavedProperly: \"Item Saved Properly\",\r\n ShowProfileItem: \"Change Front: Show the profile item\",\r\n ShowItemInfront: \"Change Front: Show item in front\",\r\n ShowItemAbove: \"Change Front: Show the item above\",\r\n ValidationSwalUomRepeted: \"The Unit of Measure code can not be repeated\",\r\n Regions: \"Regions\",\r\n Target: \"Target\",\r\n YouMustEnterValidNumber: \"You must enter a valid number\",\r\n ActionsAgGrid: \"Actions\",\r\n PricesOfThisCategoryAsRevised: \"Are you sure you want to Mark all prices in this Category as revised (pending suggestions will be ignored)?\",\r\n CompetitionPricesOfThisCategoryAsRevised: \"Are you sure you want to Mark all the Competition prices in this Category as revised (pending suggestions will be ignored)?\",\r\n NormalPricesOfThisCategoryAsRevised: \"Are you sure you want to Mark all the Normal prices of this Category as revised (pending suggestions will be ignored)?\",\r\n PricesOfThisCategoryAsRevisedPartial: \"Are you sure you want to Mark all prices in this Category as revised (pending suggestions will not be ignored)?\",\r\n CompetitionPricesOfThisCategoryAsRevisedPartial: \"Are you sure you want to Mark all the Competition prices in this Category as revised (pending suggestions will not be ignored)?\",\r\n NormalPricesOfThisCategoryAsRevisedPartial: \"Are you sure you want to Mark all the Normal prices of this Category as revised (pending suggestions will not be ignored)?\",\r\n WantToNotifyEndorsement: \"You are sure you want to notify endorsement\",\r\n TheEndorsementWasNotified: \"The endorsement was notified\",\r\n ErrorWhenWantingNotifyEndorsement: \"There was an error in wanting to notify the endorsement in this category\",\r\n IgnoreSelectedSuggestions: \"Are you sure you want to ignore the selected suggestions and bleach the new prices?\",\r\n ConfirmedIgnoreSelectedSuggestions: \"The selected suggestions were ignored and the new prices were bleached\",\r\n ErrorWhenWantingIgnoreSuggestions: \"There was an error wanting to ignore the suggestions\",\r\n Attention: \"Attention\",\r\n NoChangesWereRecorded: \"No changes were recorded\",\r\n EndorseTheSelectedPrices: \"Are you sure you want to endorse the selected prices?\",\r\n EndorseTheModifiedPrices: \"You are sure you want to endorse the modified prices\",\r\n ConfirmedEndorseTheSelectedPrices: \"The selected prices were endorsed\",\r\n ErrorWhenWantingEndorsePrices: \"There was an error in wanting to endorse prices\",\r\n RejectionComment: \"Rejection comment\",\r\n RejectionCommentSubtitle: \"Enter a comment for which the suggested values were rejected:\",\r\n RejectedItems: \"Rejected Items\",\r\n RejectedItemsSubtitle: \"Selected items have been rejected\",\r\n ModifyMarginIn: \"Modify Margin in \",\r\n ModifyMarginSubtitle: \"The current margin of the selected items is \",\r\n EnterNewMarginValue: \" Enter the new margin value:\",\r\n YouMustEnterValue: \"You must enter a value\",\r\n YouMustEnterNumericValue: \"You must enter a numeric value\",\r\n MarginUpdated: \"Margin Updated\",\r\n TheMarginWasUpdatedCorrectly1: \"The target margin was updated correctly \",\r\n TheMarginWasUpdatedCorrectly2: \" for the selected items\",\r\n SelectAtLeastOnePriceToContinue: \"You must select at least one price to continue\",\r\n EnterNewMarginValueforSelectedProducts: \"Enter the new margin value for each of the selected products:\",\r\n NewPrice: \"New Price\",\r\n Present: \"Current\",\r\n SuggestedS: \"Suggested\",\r\n CurrentPrice1: \"Current Price\",\r\n Original: \"Original\",\r\n OriginalAverage: \"Original Average\",\r\n LastCost: \"Last Cost\",\r\n CompetitivenessIndex: \"Competitiveness Index\",\r\n Sale: \"Sale\",\r\n Volume: \"Volume\",\r\n NewSale: \"New Sale ($)\",\r\n CurrentAverage: \"Current Average\",\r\n SuggestedAverage: \"Suggested Average\",\r\n PercentajeNew: \"New %\",\r\n DolarNew: \"New $\",\r\n ValidityDates: \"Validity Dates\",\r\n FromN: \"From N\",\r\n ToN: \"To N\",\r\n OverlapsAbbreviation: \"Overlaps\",\r\n ErrorWhenWantingToMarkThisCategoryAsRevised: \"There was an error in wanting to mark this category as revised\",\r\n TheFollowingChangesWillBeSaved: \"The following changes will be saved: \",\r\n PriceChangesOp: \" price changes, \",\r\n IgnoredSuggestionsOp: \" ignored suggestions, \",\r\n EndorsedPricesOp: \" endorsed prices, \",\r\n RejectedPricesOp: \" rejected prices, \",\r\n SuggestionTooltip: \"SUGGESTION: There is a new suggestion for the price of the system.\",\r\n CurrentTooltip: \"CURRENT: It is the price of the ERP.\",\r\n NewTooltip: \"NEW: This price was updated and pending endorsement.\",\r\n EndorsedTooltip: \"ENDORSED: This price was updated and endorsed. It is ready to be informed to the ERP.\",\r\n ReportFilteredPricesToTheERP: \"Are you sure you want to report the filtered prices to the ERP?\",\r\n YouMustSelectAPriceType: \"You must select a price type\",\r\n YouMustSelectAPriceTypeSubtitle: \" No type of price has been selected\",\r\n YouMustSelectAReason: \"You must select a reason for these price types\",\r\n YouMustSelectAReasonSubtitle: \" You must select a reason for these price types\",\r\n GeneratedPriceReport: \"Generated Price Report!\",\r\n GeneratedPriceReportSubtitle: \"The price report was successfully generated to inform changes to the ERP\",\r\n DeleteSelectedTests: \"Are you sure you want to delete the selected tests?\",\r\n TestsWereDeleted: \"The tests were deleted\",\r\n TestsWereDeletedSuccessfully: \"The tests were successfully deleted\",\r\n ErrorInWantingToEraseTests: \"There was an error in wanting to erase the tests\",\r\n Data: \"Data\",\r\n VariationInPrices: \"Variation in Prices\",\r\n Change: \"Change\",\r\n Expected: \"Expected\",\r\n SelectFieldsToElaborateAnHypothesis: \"Select the fields to elaborate an hypothesis\",\r\n IncorrectData: \"Incorrect Data\",\r\n InvalidDateRange: \"Invalid date range\",\r\n Priceless: \"Priceless\",\r\n DateFromTooltip: \"New Effective Date From\",\r\n StoreCode: \"Store Code\",\r\n ChangesSent: \"Changes sent\",\r\n ChangesSentTooltip: \"All changes, including products that are not active in the store\",\r\n NAtooltip: \"Changes that will not produce a label impression\",\r\n Atooltip: \"Only the changes that will produce a label impression\",\r\n Limit: \"Limit\",\r\n LimitTooltip: \"Limit of changes per day allowed for the Store\",\r\n Detour: \"Detour %\",\r\n Discount: \"Discount\",\r\n Decrease: \"Decrease\",\r\n Increase: \"Increase\",\r\n SuggestionsGenerated: \"Suggestions Generated!\",\r\n SuggestionsGeneratedSubtitle: \"New suggestions have been generated\",\r\n ValidationOfDates: \"The start date must be after the current date\",\r\n YouWantToSaveThisNewCost: \"You are sure you want to Save this New cost?\",\r\n YouWantToSaveThisNewCostSubtitle: \"Are you sure you want to Save this New Cost and Generate Price Suggestions?\",\r\n TheSubsidyCanNotBeGreaterThan100: \"The subsidy can not be greater than 100%\",\r\n SavedCost: \"Saved Cost\",\r\n SavedCostSubtitle: \"the cost has been saved successfully \",\r\n SavedCostSubtitle1: \"and they were generated \",\r\n SavedCostSubtitle2: \"suggestions \",\r\n TheSubsidy: \" the subsidy\",\r\n UpdatedSubsidies: \"Updated Subsidies\",\r\n ErrorDisablingSubsidy: \"There was an error disabling the subsidy.\",\r\n SaveSubsidy: \"You are sure you want to save the subsidy?\",\r\n SavedSubsidy: \"Saved Subsidy !\",\r\n SavedSubsidySubtitle: \"the subsidy has been saved successfully\",\r\n ErrorToSaveSubsidy: \"An error has occurred trying to save the subsidy\",\r\n SaveRegion: \"Are you sure you want to save the Region?\",\r\n SavedRegion: \"Saved Region\",\r\n SavedRegionSubtitle: \"the region has been saved successfully\",\r\n ErrorToSaveTheRegion: \"An error has occurred trying to save the region\",\r\n RoundingStandard: \"Rounding Standard\",\r\n Include: \"Include\",\r\n Exclude: \"Exclude\",\r\n GroupOfArticles: \"Group of Articles\",\r\n PricesAndCosts: \"Prices and costs\",\r\n CurrentCost: \"Current Cost\",\r\n SalesUn: \"Sales Un\",\r\n CompetitiveF: \"Competitive\",\r\n RelationshipItems: \"Relationship Items\",\r\n KinshipZones: \"Kinship Zones\",\r\n StepOneOp1Importers: \" The file to be imported is uploaded from the user's PC.
The file must be type xlsx and consist of the columns' Zone | Article | UMV | Sensibility 'on the first line.
Validation will not happen if it finds a repeated record by article-umv-zone, or if there is no data entered.
The column 'Sensitivity' should carry the code and if it is empty the sensitivity record will be deleted if it exists.\",\r\n StepOneOp2Importers: \" The file to be imported is uploaded from the user's PC.\",\r\n IntroductionToTheStepsImporters: \"Through this 4 steps wizard you can add new information to Prisma.
Step 1: \",\r\n RemainingStepsImporters: \"
Step 2: The format and extension of the file uploaded to the server is verified.
Step 3: File data is validated in search of inconsistencies.
Step 4: Finally, the processed and purified information is definitively incorporated into the system.\",\r\n NoCategoriesFoundForAllSKUs: \"No categories found for all SKUs\",\r\n YouWantToAddThem: \"You want to add them\",\r\n ValidationWillRunAgain: \"Validation will run again\",\r\n Severity: \"Severity\",\r\n Phase: \"Phase\",\r\n File: \"File\",\r\n WarningM: \"WARNING\",\r\n AllSensitivityRecordsWillBeDeleted: \"All sensitivity records will be deleted\",\r\n Success: \"Success\",\r\n NoArticleInAnyAreaHasSensitivity: \"No article in any area has sensitivity\",\r\n ItHasPendingFiles: \"Have pending files, press accept to return to step number 3.\",\r\n TheImporterTypeParameterHasNotBeenReceived: \"The importer type parameter has not been received. It will be redirected to the home.\",\r\n UnitOfMeasureOfSale: \"Unit of Measure of Sale\",\r\n TypeOfPriceForce: \"Type of Price in force\",\r\n CompetitivePricesSurvey: \"Competitive Prices Survey\",\r\n MassiveLoadOfCosts: \"Massive Load of Costs\",\r\n BulkLoadingOfLabels: \"Bulk loading of labels\",\r\n ManualLiquidations: \"Manual Liquidations\",\r\n LiquidationsByMaturity: \"Cancel Liquidations\",\r\n CancelLiquidations: \"Cancelar Liquidaciones\",\r\n UpdateFieldsOfMeasurementUnits: \"Update fields of measurement units\",\r\n Liquidation: \"Liquidation\",\r\n SelectReason: \"Select Reason / s\",\r\n LowerPrice: \"Lower Price\",\r\n IncreasePrice: \"Increase Price\",\r\n LowM: \"low\",\r\n Rise: \"rise\",\r\n RiseA: \"Rise\",\r\n StaysTheSame: \"Stays the same\",\r\n Drops: \"drops\",\r\n IfHyphotesis: \"If \",\r\n ThePriceOfHyphotesis: \" the price of \",\r\n InHyphotesis: \" in \",\r\n TheDemandIsExpectedHyphotesis: \", the demand is expected \",\r\n AHyphotesis: \" a \",\r\n ValueIn: \"Value in \",\r\n UpdateDatesSubtitleOp1: \"Indicate the new start date of the new prices. Format: YYYY-MM-DD\",\r\n UpdateDatesSubtitleOp2: \"Indicate the new end date of the new prices\",\r\n Overlaps1: \"Overlaps\",\r\n TypeCP: \"Type CP\",\r\n NoFilesSelectedForUpload: \"No files currently selected for upload\",\r\n NewOrModified: \"New or Modified\",\r\n RequestForApproval: \"Request for approval\",\r\n Approved: \"Approved\",\r\n Communicated: \"Communicated\",\r\n ErasedPlanogram: \"Erased Planogram\",\r\n ErasedPlanogramSubtitle: \"The planogram has been erased successfully\",\r\n InsufficientPermissionsToEdit: \"Insufficient Permissions to Edit\",\r\n InsufficientPermissionsToEditPlanogram: \"Insufficient Permissions to Edit the Planogram and Request Approval\",\r\n FinishThePlanogram: \"Are you sure you want to Complete the Planogram and Request Your Approval?\",\r\n InsufficientPermitsToApprove: \"Insufficient Permits to Approve\",\r\n YouWantToApproveThePlanogram: \"Are you sure you want to approve the Planogram?\",\r\n InsufficientPermissionsToReport: \"Insufficient Permissions to Report\",\r\n CommunicateThePlanogram: \"Are you sure you want to communicate the planogram to the stores?\",\r\n NotInformed: \"NOT INFORMED\",\r\n ValidationToSaveAplanogram: \"It must indicate a code, a name and at least 1 subcategory, 1 store and 1 module\",\r\n ErrorWhenSaveThePlanogram: \"An error occurred when wanting to save the planogram\",\r\n WidthNotAllowed: \"width not allowed\",\r\n WidthNotAllowedSubtitle: \"smaller width to the space occupied by the products, minimum width allowed: \",\r\n ActionNotAllowed: \"Action not allowed\",\r\n ActionNotAllowedSubtitle: \"You can not delete Categories that were already assigned to the planogram\",\r\n CanNotDeleteStores: \"You can not delete Stores that were already assigned to the planogram.\",\r\n Shelf: \"Shelf\",\r\n HeightNotAllowed: \"height not allowed\",\r\n HeightNotAllowedSubtitle: \"Height of the level can not be less than the height of the products higher than the level, minimum height allowed: \",\r\n LevelWithItems: \"Level with Items\",\r\n LevelWithItemsSubtitle: \"you can not delete a level that contains items\",\r\n Laydown: \"Laydown\",\r\n Standup: \"Standup\",\r\n NewPriceHasBeenRejected: \"The new price of $ has been rejected\",\r\n GoToTheAuditTab: \". Go to the Audit tab for more details. \",\r\n Rejected: \"Rejected\",\r\n PendingPrice: \"Pending Price\",\r\n EndorsedPrice: \"Endorsed Price\",\r\n ClickHereToLoadTags: \"Click here to load tags associated with this product\",\r\n ThePriceVariationLimitHasBeenExceeded: \"The Price Variation limit has been exceeded. The limits are: {0} to {1}\",\r\n TheMarginsLimitHasBeenExceeded: \"The Margenes limit has been exceeded. The limits are: {0} to {1}\",\r\n ThisPriceHasAnOverlapWithAPromotion: \"This price has an Overlap with a Promotion. Click here to see more\",\r\n SumErrorOfWeightedIndexes: \"The sum of the weighted indexes must be equal to 100%\",\r\n PendingChangesWithoutSaving: \"You have pending changes without saving\",\r\n TheChangesYouHaveMadeInRoleWillBeLost: \"If you change the Brand, you will lose the changes you have made in Role, Strategy and Coverage for \",\r\n RoleAndStrategy: \"Role and Strategy\",\r\n Role: \"Role\",\r\n Strategy: \"Strategy\",\r\n Coverage: \"Coverage\",\r\n WeightedIndex: \"Weighted Index (Dolar)\",\r\n MarketSales: \"Market Sales\",\r\n MarketUnits: \"Market Units\",\r\n AnalysisSchedule: \"Analysis Schedule\",\r\n Frequency: \"Frequency\",\r\n ActionType: \"Action Type\",\r\n LastRevision: \"Last Revision\",\r\n InDays: \"(In Days)\",\r\n PriceUpdateConfirmTitle: \"The prices on the screen will be updated\",\r\n PriceUpdateConfirmText: \"Remember to SAVE later to apply these changes\",\r\n DoYouWishToIgnorePendingSuggestions: \"Do you wish to ignore pending suggestions?\",\r\n YourRequestToGenerateSuggestionsHasBeenPasted: \"Your request to generate suggestions has been pasted!\",\r\n TheSuggestionsContinueToBeGeneratedAssortment: \"The suggestions continue to be generated. You will be notified on your email when complete. You can check the status of them within a few moments from the initial assortment analysis screen.\",\r\n ConfirmationCreateThisRule: \"Are you sure you want to create this rule?\",\r\n SavedRule: \"Saved Rule\",\r\n SavedRuleSubtitle: \"The rule has been saved successfully\",\r\n ErrorWhenSavingTheRule: \"There was an error saving the rule\",\r\n Associations: \"Associations\",\r\n Values: \"Values\",\r\n MarketPrice: \"Market Price\",\r\n SalesRankingMarket: \"Sales Ranking Market\",\r\n ShareOfSalesMarket: \"Share of Sales Market\",\r\n ShareOfUnitsMarket: \"Share of Units Market\",\r\n AccumulatedSalesMarket: \"Accumulated Sales Market\",\r\n Margin2: \"Margin 2\",\r\n WeightedIndex2: \"Weighted Index\",\r\n SalesRanking: \"Sales Ranking\",\r\n UnitsRanking: \"Units Ranking\",\r\n MarginRanking: \"Margin Ranking\",\r\n ShareOfUnits: \"Share of Units\",\r\n ShareOfMargen: \"Share of Margin\",\r\n Margin2Percentage: \"Margin 2 %\",\r\n ShareOfMargen2: \"Share of Margin 2\",\r\n Presence: \"Presence\",\r\n AccumulatedSales: \"Accumulated Sales\",\r\n AccumulatedUnits: \"Accumulated Units\",\r\n AccumulatedMargin: \"Accumulated Margin\",\r\n AccumulatedWeightedIndex: \"Accumulated Weighted Index\",\r\n NameRole: \"Name of the Role\",\r\n NameValidation: \"The name of the Template must have at least 2 characters\",\r\n SelectAtLeastOneFilter: \"Select at least one filter\",\r\n SelectAtLeastOneCategory: \"Select at least one category\",\r\n TheTemplate: \"The Template: \",\r\n HasBeenCreatedSuccessfully: \" has been created successfully\",\r\n ErrorSavingTemplate: \"An error occurred while saving the Template: \",\r\n Confirm: \"Confirm\",\r\n ConfirmPeriod: \"When selecting a period of 12 months, it is not possible to use the filter by labels. Do you wish to continue?\",\r\n GenerateTheReport: \"Are you sure you want to generate the report?\",\r\n GeneratedReport: \"Generated Report\",\r\n GeneratedReportSubtitle: \"You can now view the generated report.\",\r\n GeneratingReport: \"Generating Report\",\r\n GeneratingReportSubtitle: \"You can track it through the list of pending tasks located in the top bar.\",\r\n SKUsTooltip: \"Number of active SKUs\",\r\n SKUsTooltip1: \"Percentage of active SKUs\",\r\n SalesDolar: \"Sales ($)\",\r\n AmountOfSales: \"Amount of sales\",\r\n SalesQty: \"Sales (Qty)\",\r\n Dds: \"SD\",\r\n CategoryCluster: \"Category / Cluster\",\r\n AmountSuggestions: \"Number of low suggestions\",\r\n HighF: \"High\",\r\n NumberHighSuggestions: \"Number of high suggestions\",\r\n ImpactInDolar: \"Impact on $ by Cluster Suggestions\",\r\n PendindFalls: \"Number of pending cancellations of validation\",\r\n highSlopes: \"Number of pending validation pending\",\r\n ImpactByDecisionsByCluster: \"Impact on $ by Decisions by Cluster\",\r\n InternalPerformance: \"Internal Performance\",\r\n InternalPerformanceTooltip: \"Sale in $ (average per month per Same Store)\",\r\n SalePercentage: \"% Sale\",\r\n SaleUnTooltip: \"Sale in Units (average per month per Same Store)\",\r\n UnitsPercentage: \"% Units\",\r\n ShareOfSalesInUnits: \"Share of Sales in Units\",\r\n PercentageMargin: \"% Margin $\",\r\n MarginShare: \"Share of Margin $\",\r\n PercentageMargin2: \"% Margin\",\r\n SaleXsku: \"Sale x Sku\",\r\n Rotation: \"Rotation\",\r\n Place: \"Place\",\r\n PerformanceMarket: \"Performance Market\",\r\n AssortmentCoverage: \"Assortment coverage on all market products\",\r\n MarketSalePercentage: \"% Sale M\",\r\n ShareOfSalesInTheMarket: \"Share of Sales in the Market\",\r\n GAPSale: \"GAP Sale\",\r\n GAPSaleTooltip: \"GAP Share of Sale in $ own vs Market\",\r\n SaleInUnitsTooltip2: \"Sale in Units\",\r\n MarketUnitsPercentage: \"% Units M\",\r\n MarketUnitsPercentageTooltip: \"Share of Sales in Units Market\",\r\n GAPUnits: \"GAP Units\",\r\n GAPUnitsTooltip: \"GAP Share of Own Units vs Market\",\r\n InventoryInDolar: \"Inventory in $\",\r\n ShareOfInventoryValue: \"Share of inventory value\",\r\n InventoryInUnits: \"Inventory in Units\",\r\n GMROITooltip: \"Margin $ / inventory value (how many $ of Margin for each $ invested in inventory)\",\r\n Mlinear: \"M linear\",\r\n MlinearTooltip: \"Linear meters (facings x width of the product)\",\r\n ProductFronts: \"Product Fronts\",\r\n GMROSTooltip: \"Margin $ / Linear meters (profitability per space)\",\r\n PercentageSpace: \"% Space\",\r\n PercentageSpaceTooltip: \"Share of Spaces\",\r\n Reviews: \"Reviews\",\r\n Revised: \"Revised\",\r\n MonthsForCalculation: \"Months For Calculation\",\r\n ClickHereFilterByPriceList: \"Click here to filter by this PricingZone\",\r\n CloneLayout: \"Add a new Layout, copying this Layout\",\r\n CopyingThisStructureAndItems: \"New Planogram copying Structure and Products from this Planogram\",\r\n ImportFromSpaceman: 'Import from Spaceman',\r\n ClonePlanogram: 'Clone Planogram',\r\n ClonePlanogramSubtitle: 'Add a new Planogram, copying the structure and products of this Planogram',\r\n ClonePlanogramWarning: 'Structure and Products of this Planogram will be cloned into a New Planogram',\r\n Sp_generalKpis_planogram: \"Planogram\",\r\n Sp_generalKpis_store: \"Store\",\r\n Sp_editLayout_editFloorActionButton: \"Edit Floor\",\r\n Sp_addLevel_EditTitle: \"Edit current floor data\",\r\n Communicate1: \"Communicate\",\r\n SP_editPlanogram_Autocomplete_AssingFronts: \"Asignación de Frentes\",\r\n MapsMargin: \"Margin Map\",\r\n Pr_Decisions_PriceUpdate: \"Price Update\",\r\n Pr_Decisions_PriceUpdateTooltip: \"Perform a massive price update for the selected prices\",\r\n Pr_Decisions_PriceUpdate_StrategySelection: \"Strategy\",\r\n Pr_Decisions_PriceUpdate_Value: \"Value\",\r\n Pr_Decisions_PriceUpdate_Variation: \"Apply price variation\",\r\n Pr_Decisions_PriceUpdate_GoToPrice: \"Go to fixed price\",\r\n Pr_Decisions_PriceUpdate_GoToMargin: \"Go to margin\",\r\n Pr_Decisions_ExperimentalPriceUpdate: \"Price Simulation\",\r\n Pr_Decisions_ExperimentalPriceUpdateTooltip: \"Performs an experimental non permanent price change that allows to get an idea of how the price change would affect margin and impact\",\r\n Pr_Decisions_PriceCopy: \"Price Copy\",\r\n Pr_Decisions_PriceCopyTooltip: \"Perform a massive price copy from one price type to another\",\r\n Pr_Decisions_PriceCopy_Source: \"Source Price\",\r\n Pr_Decisions_PriceCopy_Target: \"Target Price\",\r\n Pr_Decisions_Filters_Markets: \"Markets\",\r\n Pr_Decisions_Filters_MarketsPlaceholder: \"Select Markets\",\r\n Pr_Decisions_Filters_Brands: \"Flags\",\r\n Pr_Decisions_Filters_BrandsPlaceholder: \"Select Flags\",\r\n Pr_Decisions_Filters_Regions: \"Regions\",\r\n Pr_Decisions_Filters_RegionsPlaceholder: \"Select Regions\",\r\n Pr_Decisions_SimulationStop: \"Stop Simulation\",\r\n Pr_Decisions_SimulationApply: \"Apply Simulation\",\r\n Pr_Decisions_SimulationWarningOnSave_Title: \"There is an active Simulation\",\r\n Pr_Decisions_SimulationWarningOnSave_Desc: \"In order to save pending changes you must first stop or confirm the current active simulation\",\r\n Hm_marketBoard_marketBoard: \"Market Board\",\r\n EnterCodesSeparatedByComma: \" Enter Codes Separated By Comma\",\r\n Adm_brands_savedBrand: \"Saved Brand\",\r\n Adm_brands_subtitle: \"The Brand was saved correctly\",\r\n SP_editPlanogram_Autocomplete_AssingFronts: \"Facings assignment\",\r\n EnterCodesSeparatedBySpaces: \" Enter Codes Separated By Spaces\",\r\n EnterCodesSeparatedBySpacesDetail: \"Enter Codes Separated By Spaces, then press 'enter'\",\r\n Strip: \"Strip\",\r\n Catalog: \"Catalog\",\r\n OneTime: \"One Time\",\r\n Biannual: \"Biannual\",\r\n Annual: \"Annual\",\r\n PriceSurvey: \"Price Survey\",\r\n ExhibitionSurvey: \"Exhibition Survey\",\r\n PriceLabelScan: \"Price Label Scan\",\r\n VoiceCommand: \"Voice Command\",\r\n ManualEntry: \"Manual Entry\",\r\n CompetitionCriteria: \"Competition Criteria\",\r\n RegulatedPrices: \"Regulated Prices\"\r\n })\r\n .translations(\"oxxogas\", {\r\n StoresIncluded: \"Estaciones Incluidas\",\r\n Stores: \"Estaciones\",\r\n Store: \"Estación\",\r\n StoresToBeIncludedByCategories: \"Seleccione estaciones a incluir por Categoría\",\r\n TypeOfStore: \"Tipo de estación\",\r\n SelectTypeOfStore: \"--Selecionar tipo de estación--\",\r\n AddStore: \"Agregar Estación\",\r\n StoreMasters: \"Maestro de Estaciones\",\r\n AssignStores: \"Asignar Estaciones\",\r\n AssignmentOfStores: \" Asignacion de Estaciones\",\r\n ByStores: \"Por estaciones\",\r\n TopNavbarSearch: \"Buscar Productos, Categorías, Estaciones y Clusters\",\r\n BenchmarksStepOne: \"Seleccione al menos 2 Estaciones o Categorías o Cluster para comparar\",\r\n StoresToCompare: \"Estaciones a comparar\",\r\n SelectStores: \"Seleccione Estaciones\",\r\n PerformanceByProvinceSubtitle: \"El siguiente es un resumen de densidad de Estaciones por provincia y su performance\",\r\n PerformanceByProvinceSubtitle2: \"El siguiente es un resumen de densidad de Estaciones por provincia y su performance (con drill-down por Departamento)\",\r\n TotalStores: \"Total Estaciones:\",\r\n BaseStore: \"Estación base\",\r\n SelectStore: \"Seleccione Estación\",\r\n MirrorStore: \"Estación espejo\",\r\n ChooseComparableStores: \"Elegir estaciones comparables\",\r\n MaintainThePriceOfMirrorStores: \"Mantener el precio de las estaciones espejo igual\",\r\n PriceChangesReportSubtitle: \"El siguiente reporte muestra un resumen de los cambios de precios informados al ERP por fecha de vigencia y estación\",\r\n SaveSwalTitle: \"Esta seguro que desea guardar la estación?\",\r\n StoreSaved: \"Estación guardada\",\r\n ErrorWhenSavingTheStore: \"Ocurrio un error al guardar la estación\",\r\n ValidationNameStore: \"Debe elegir un nombre para la estación\",\r\n ValidationTypeStore: \"Debe elegir un tipo de estación\",\r\n EnableDisableSwalTitle: \"la estación\",\r\n UpdatedStores: \"Estaciones Actualizadas\",\r\n AssignedStoresSwalTitle: \"Estaciones Asignadas\",\r\n AssignedStoresSwalSubTitle: \"Se asignaron correctamente las estaciones al usuario\",\r\n ValidationMirrorStoreAndBaseStore: \"La estación espejo debe ser diferente de la estación base\",\r\n ValidationSelectedStoreNotHaveAPrice: \"La estación seleccionada no tiene un precio para el item elegido\",\r\n DstPopUpInformativeGraphic: \"mas $ de venta mensual por estación\",\r\n StoreAndCD: \"Estación y Centro de Distribución\",\r\n StoreDescendant: \"Desc. Estación\", \r\n CloneLayout: 'Clone Layout',\r\n CloneLayoutWarning: 'This Layout will be cloned into a New Layout',\r\n Sort: \"Sort\",\r\n TooltipSortModules: \"Sort Modules\",\r\n Ready: \"Ready\",\r\n CompetitionCriteria: \"Criterio de Competencia\"\r\n\r\n })\r\n\r\n $translateProvider.preferredLanguage(\"es\");\r\n\r\n });\r\n","angular.module(\"prisma\")\r\n.config(['$provide', function ($provide) {\r\n $provide.decorator('$state', ['$delegate', '$window',\r\n function ($delegate, $window) {\r\n var extended = {\r\n goNewTab: function (stateName, params) {\r\n $window.open(\r\n $delegate.href(stateName, params, { absolute: true }), '_blank');\r\n }\r\n };\r\n angular.extend($delegate, extended);\r\n return $delegate;\r\n }]);\r\n}]);","/***********************************************\r\n******** Iantech Javascript Framework **********\r\n***********************************************/\r\n\r\nvar ian = ian || {};\r\n\r\nvar defaultDiacriticsRemovalMap = [\r\n { 'base': \"A\", 'letters': /[\\u0041\\u24B6\\uFF21\\u00C0\\u00C1\\u00C2\\u1EA6\\u1EA4\\u1EAA\\u1EA8\\u00C3\\u0100\\u0102\\u1EB0\\u1EAE\\u1EB4\\u1EB2\\u0226\\u01E0\\u00C4\\u01DE\\u1EA2\\u00C5\\u01FA\\u01CD\\u0200\\u0202\\u1EA0\\u1EAC\\u1EB6\\u1E00\\u0104\\u023A\\u2C6F]/g },\r\n { 'base': \"AA\", 'letters': /[\\uA732]/g },\r\n { 'base': \"AE\", 'letters': /[\\u00C6\\u01FC\\u01E2]/g },\r\n { 'base': \"AO\", 'letters': /[\\uA734]/g },\r\n { 'base': \"AU\", 'letters': /[\\uA736]/g },\r\n { 'base': \"AV\", 'letters': /[\\uA738\\uA73A]/g },\r\n { 'base': \"AY\", 'letters': /[\\uA73C]/g },\r\n { 'base': \"B\", 'letters': /[\\u0042\\u24B7\\uFF22\\u1E02\\u1E04\\u1E06\\u0243\\u0182\\u0181]/g },\r\n { 'base': \"C\", 'letters': /[\\u0043\\u24B8\\uFF23\\u0106\\u0108\\u010A\\u010C\\u00C7\\u1E08\\u0187\\u023B\\uA73E]/g },\r\n { 'base': \"D\", 'letters': /[\\u0044\\u24B9\\uFF24\\u1E0A\\u010E\\u1E0C\\u1E10\\u1E12\\u1E0E\\u0110\\u018B\\u018A\\u0189\\uA779]/g },\r\n { 'base': \"DZ\", 'letters': /[\\u01F1\\u01C4]/g },\r\n { 'base': \"Dz\", 'letters': /[\\u01F2\\u01C5]/g },\r\n { 'base': \"E\", 'letters': /[\\u0045\\u24BA\\uFF25\\u00C8\\u00C9\\u00CA\\u1EC0\\u1EBE\\u1EC4\\u1EC2\\u1EBC\\u0112\\u1E14\\u1E16\\u0114\\u0116\\u00CB\\u1EBA\\u011A\\u0204\\u0206\\u1EB8\\u1EC6\\u0228\\u1E1C\\u0118\\u1E18\\u1E1A\\u0190\\u018E]/g },\r\n { 'base': \"F\", 'letters': /[\\u0046\\u24BB\\uFF26\\u1E1E\\u0191\\uA77B]/g },\r\n { 'base': \"G\", 'letters': /[\\u0047\\u24BC\\uFF27\\u01F4\\u011C\\u1E20\\u011E\\u0120\\u01E6\\u0122\\u01E4\\u0193\\uA7A0\\uA77D\\uA77E]/g },\r\n { 'base': \"H\", 'letters': /[\\u0048\\u24BD\\uFF28\\u0124\\u1E22\\u1E26\\u021E\\u1E24\\u1E28\\u1E2A\\u0126\\u2C67\\u2C75\\uA78D]/g },\r\n { 'base': \"I\", 'letters': /[\\u0049\\u24BE\\uFF29\\u00CC\\u00CD\\u00CE\\u0128\\u012A\\u012C\\u0130\\u00CF\\u1E2E\\u1EC8\\u01CF\\u0208\\u020A\\u1ECA\\u012E\\u1E2C\\u0197]/g },\r\n { 'base': \"J\", 'letters': /[\\u004A\\u24BF\\uFF2A\\u0134\\u0248]/g },\r\n { 'base': \"K\", 'letters': /[\\u004B\\u24C0\\uFF2B\\u1E30\\u01E8\\u1E32\\u0136\\u1E34\\u0198\\u2C69\\uA740\\uA742\\uA744\\uA7A2]/g },\r\n { 'base': \"L\", 'letters': /[\\u004C\\u24C1\\uFF2C\\u013F\\u0139\\u013D\\u1E36\\u1E38\\u013B\\u1E3C\\u1E3A\\u0141\\u023D\\u2C62\\u2C60\\uA748\\uA746\\uA780]/g },\r\n { 'base': \"LJ\", 'letters': /[\\u01C7]/g },\r\n { 'base': \"Lj\", 'letters': /[\\u01C8]/g },\r\n { 'base': \"M\", 'letters': /[\\u004D\\u24C2\\uFF2D\\u1E3E\\u1E40\\u1E42\\u2C6E\\u019C]/g },\r\n { 'base': \"N\", 'letters': /[\\u004E\\u24C3\\uFF2E\\u01F8\\u0143\\u00D1\\u1E44\\u0147\\u1E46\\u0145\\u1E4A\\u1E48\\u0220\\u019D\\uA790\\uA7A4]/g },\r\n { 'base': \"NJ\", 'letters': /[\\u01CA]/g },\r\n { 'base': \"Nj\", 'letters': /[\\u01CB]/g },\r\n { 'base': \"O\", 'letters': /[\\u004F\\u24C4\\uFF2F\\u00D2\\u00D3\\u00D4\\u1ED2\\u1ED0\\u1ED6\\u1ED4\\u00D5\\u1E4C\\u022C\\u1E4E\\u014C\\u1E50\\u1E52\\u014E\\u022E\\u0230\\u00D6\\u022A\\u1ECE\\u0150\\u01D1\\u020C\\u020E\\u01A0\\u1EDC\\u1EDA\\u1EE0\\u1EDE\\u1EE2\\u1ECC\\u1ED8\\u01EA\\u01EC\\u00D8\\u01FE\\u0186\\u019F\\uA74A\\uA74C]/g },\r\n { 'base': \"OI\", 'letters': /[\\u01A2]/g },\r\n { 'base': \"OO\", 'letters': /[\\uA74E]/g },\r\n { 'base': \"OU\", 'letters': /[\\u0222]/g },\r\n { 'base': \"P\", 'letters': /[\\u0050\\u24C5\\uFF30\\u1E54\\u1E56\\u01A4\\u2C63\\uA750\\uA752\\uA754]/g },\r\n { 'base': \"Q\", 'letters': /[\\u0051\\u24C6\\uFF31\\uA756\\uA758\\u024A]/g },\r\n { 'base': \"R\", 'letters': /[\\u0052\\u24C7\\uFF32\\u0154\\u1E58\\u0158\\u0210\\u0212\\u1E5A\\u1E5C\\u0156\\u1E5E\\u024C\\u2C64\\uA75A\\uA7A6\\uA782]/g },\r\n { 'base': \"S\", 'letters': /[\\u0053\\u24C8\\uFF33\\u1E9E\\u015A\\u1E64\\u015C\\u1E60\\u0160\\u1E66\\u1E62\\u1E68\\u0218\\u015E\\u2C7E\\uA7A8\\uA784]/g },\r\n { 'base': \"T\", 'letters': /[\\u0054\\u24C9\\uFF34\\u1E6A\\u0164\\u1E6C\\u021A\\u0162\\u1E70\\u1E6E\\u0166\\u01AC\\u01AE\\u023E\\uA786]/g },\r\n { 'base': \"TZ\", 'letters': /[\\uA728]/g },\r\n { 'base': \"U\", 'letters': /[\\u0055\\u24CA\\uFF35\\u00D9\\u00DA\\u00DB\\u0168\\u1E78\\u016A\\u1E7A\\u016C\\u00DC\\u01DB\\u01D7\\u01D5\\u01D9\\u1EE6\\u016E\\u0170\\u01D3\\u0214\\u0216\\u01AF\\u1EEA\\u1EE8\\u1EEE\\u1EEC\\u1EF0\\u1EE4\\u1E72\\u0172\\u1E76\\u1E74\\u0244]/g },\r\n { 'base': \"V\", 'letters': /[\\u0056\\u24CB\\uFF36\\u1E7C\\u1E7E\\u01B2\\uA75E\\u0245]/g },\r\n { 'base': \"VY\", 'letters': /[\\uA760]/g },\r\n { 'base': \"W\", 'letters': /[\\u0057\\u24CC\\uFF37\\u1E80\\u1E82\\u0174\\u1E86\\u1E84\\u1E88\\u2C72]/g },\r\n { 'base': \"X\", 'letters': /[\\u0058\\u24CD\\uFF38\\u1E8A\\u1E8C]/g },\r\n { 'base': \"Y\", 'letters': /[\\u0059\\u24CE\\uFF39\\u1EF2\\u00DD\\u0176\\u1EF8\\u0232\\u1E8E\\u0178\\u1EF6\\u1EF4\\u01B3\\u024E\\u1EFE]/g },\r\n { 'base': \"Z\", 'letters': /[\\u005A\\u24CF\\uFF3A\\u0179\\u1E90\\u017B\\u017D\\u1E92\\u1E94\\u01B5\\u0224\\u2C7F\\u2C6B\\uA762]/g },\r\n { 'base': \"a\", 'letters': /[\\u0061\\u24D0\\uFF41\\u1E9A\\u00E0\\u00E1\\u00E2\\u1EA7\\u1EA5\\u1EAB\\u1EA9\\u00E3\\u0101\\u0103\\u1EB1\\u1EAF\\u1EB5\\u1EB3\\u0227\\u01E1\\u00E4\\u01DF\\u1EA3\\u00E5\\u01FB\\u01CE\\u0201\\u0203\\u1EA1\\u1EAD\\u1EB7\\u1E01\\u0105\\u2C65\\u0250]/g },\r\n { 'base': \"aa\", 'letters': /[\\uA733]/g },\r\n { 'base': \"ae\", 'letters': /[\\u00E6\\u01FD\\u01E3]/g },\r\n { 'base': \"ao\", 'letters': /[\\uA735]/g },\r\n { 'base': \"au\", 'letters': /[\\uA737]/g },\r\n { 'base': \"av\", 'letters': /[\\uA739\\uA73B]/g },\r\n { 'base': \"ay\", 'letters': /[\\uA73D]/g },\r\n { 'base': \"b\", 'letters': /[\\u0062\\u24D1\\uFF42\\u1E03\\u1E05\\u1E07\\u0180\\u0183\\u0253]/g },\r\n { 'base': \"c\", 'letters': /[\\u0063\\u24D2\\uFF43\\u0107\\u0109\\u010B\\u010D\\u00E7\\u1E09\\u0188\\u023C\\uA73F\\u2184]/g },\r\n { 'base': \"d\", 'letters': /[\\u0064\\u24D3\\uFF44\\u1E0B\\u010F\\u1E0D\\u1E11\\u1E13\\u1E0F\\u0111\\u018C\\u0256\\u0257\\uA77A]/g },\r\n { 'base': \"dz\", 'letters': /[\\u01F3\\u01C6]/g },\r\n { 'base': \"e\", 'letters': /[\\u0065\\u24D4\\uFF45\\u00E8\\u00E9\\u00EA\\u1EC1\\u1EBF\\u1EC5\\u1EC3\\u1EBD\\u0113\\u1E15\\u1E17\\u0115\\u0117\\u00EB\\u1EBB\\u011B\\u0205\\u0207\\u1EB9\\u1EC7\\u0229\\u1E1D\\u0119\\u1E19\\u1E1B\\u0247\\u025B\\u01DD]/g },\r\n { 'base': \"f\", 'letters': /[\\u0066\\u24D5\\uFF46\\u1E1F\\u0192\\uA77C]/g },\r\n { 'base': \"g\", 'letters': /[\\u0067\\u24D6\\uFF47\\u01F5\\u011D\\u1E21\\u011F\\u0121\\u01E7\\u0123\\u01E5\\u0260\\uA7A1\\u1D79\\uA77F]/g },\r\n { 'base': \"h\", 'letters': /[\\u0068\\u24D7\\uFF48\\u0125\\u1E23\\u1E27\\u021F\\u1E25\\u1E29\\u1E2B\\u1E96\\u0127\\u2C68\\u2C76\\u0265]/g },\r\n { 'base': \"hv\", 'letters': /[\\u0195]/g },\r\n { 'base': \"i\", 'letters': /[\\u0069\\u24D8\\uFF49\\u00EC\\u00ED\\u00EE\\u0129\\u012B\\u012D\\u00EF\\u1E2F\\u1EC9\\u01D0\\u0209\\u020B\\u1ECB\\u012F\\u1E2D\\u0268\\u0131]/g },\r\n { 'base': \"j\", 'letters': /[\\u006A\\u24D9\\uFF4A\\u0135\\u01F0\\u0249]/g },\r\n { 'base': \"k\", 'letters': /[\\u006B\\u24DA\\uFF4B\\u1E31\\u01E9\\u1E33\\u0137\\u1E35\\u0199\\u2C6A\\uA741\\uA743\\uA745\\uA7A3]/g },\r\n { 'base': \"l\", 'letters': /[\\u006C\\u24DB\\uFF4C\\u0140\\u013A\\u013E\\u1E37\\u1E39\\u013C\\u1E3D\\u1E3B\\u017F\\u0142\\u019A\\u026B\\u2C61\\uA749\\uA781\\uA747]/g },\r\n { 'base': \"lj\", 'letters': /[\\u01C9]/g },\r\n { 'base': \"m\", 'letters': /[\\u006D\\u24DC\\uFF4D\\u1E3F\\u1E41\\u1E43\\u0271\\u026F]/g },\r\n { 'base': \"n\", 'letters': /[\\u006E\\u24DD\\uFF4E\\u01F9\\u0144\\u00F1\\u1E45\\u0148\\u1E47\\u0146\\u1E4B\\u1E49\\u019E\\u0272\\u0149\\uA791\\uA7A5]/g },\r\n { 'base': \"nj\", 'letters': /[\\u01CC]/g },\r\n { 'base': \"o\", 'letters': /[\\u006F\\u24DE\\uFF4F\\u00F2\\u00F3\\u00F4\\u1ED3\\u1ED1\\u1ED7\\u1ED5\\u00F5\\u1E4D\\u022D\\u1E4F\\u014D\\u1E51\\u1E53\\u014F\\u022F\\u0231\\u00F6\\u022B\\u1ECF\\u0151\\u01D2\\u020D\\u020F\\u01A1\\u1EDD\\u1EDB\\u1EE1\\u1EDF\\u1EE3\\u1ECD\\u1ED9\\u01EB\\u01ED\\u00F8\\u01FF\\u0254\\uA74B\\uA74D\\u0275]/g },\r\n { 'base': \"oi\", 'letters': /[\\u01A3]/g },\r\n { 'base': \"ou\", 'letters': /[\\u0223]/g },\r\n { 'base': \"oo\", 'letters': /[\\uA74F]/g },\r\n { 'base': \"p\", 'letters': /[\\u0070\\u24DF\\uFF50\\u1E55\\u1E57\\u01A5\\u1D7D\\uA751\\uA753\\uA755]/g },\r\n { 'base': \"q\", 'letters': /[\\u0071\\u24E0\\uFF51\\u024B\\uA757\\uA759]/g },\r\n { 'base': \"r\", 'letters': /[\\u0072\\u24E1\\uFF52\\u0155\\u1E59\\u0159\\u0211\\u0213\\u1E5B\\u1E5D\\u0157\\u1E5F\\u024D\\u027D\\uA75B\\uA7A7\\uA783]/g },\r\n { 'base': \"s\", 'letters': /[\\u0073\\u24E2\\uFF53\\u00DF\\u015B\\u1E65\\u015D\\u1E61\\u0161\\u1E67\\u1E63\\u1E69\\u0219\\u015F\\u023F\\uA7A9\\uA785\\u1E9B]/g },\r\n { 'base': \"t\", 'letters': /[\\u0074\\u24E3\\uFF54\\u1E6B\\u1E97\\u0165\\u1E6D\\u021B\\u0163\\u1E71\\u1E6F\\u0167\\u01AD\\u0288\\u2C66\\uA787]/g },\r\n { 'base': \"tz\", 'letters': /[\\uA729]/g },\r\n { 'base': \"u\", 'letters': /[\\u0075\\u24E4\\uFF55\\u00F9\\u00FA\\u00FB\\u0169\\u1E79\\u016B\\u1E7B\\u016D\\u00FC\\u01DC\\u01D8\\u01D6\\u01DA\\u1EE7\\u016F\\u0171\\u01D4\\u0215\\u0217\\u01B0\\u1EEB\\u1EE9\\u1EEF\\u1EED\\u1EF1\\u1EE5\\u1E73\\u0173\\u1E77\\u1E75\\u0289]/g },\r\n { 'base': \"v\", 'letters': /[\\u0076\\u24E5\\uFF56\\u1E7D\\u1E7F\\u028B\\uA75F\\u028C]/g },\r\n { 'base': \"vy\", 'letters': /[\\uA761]/g },\r\n { 'base': \"w\", 'letters': /[\\u0077\\u24E6\\uFF57\\u1E81\\u1E83\\u0175\\u1E87\\u1E85\\u1E98\\u1E89\\u2C73]/g },\r\n { 'base': \"x\", 'letters': /[\\u0078\\u24E7\\uFF58\\u1E8B\\u1E8D]/g },\r\n { 'base': \"y\", 'letters': /[\\u0079\\u24E8\\uFF59\\u1EF3\\u00FD\\u0177\\u1EF9\\u0233\\u1E8F\\u00FF\\u1EF7\\u1E99\\u1EF5\\u01B4\\u024F\\u1EFF]/g },\r\n { 'base': \"z\", 'letters': /[\\u007A\\u24E9\\uFF5A\\u017A\\u1E91\\u017C\\u017E\\u1E93\\u1E95\\u01B6\\u0225\\u0240\\u2C6C\\uA763]/g }\r\n];\r\n\r\n//string formating accepting any param quantity\r\n//usage: ian.format('Just use {0} in the {1}', 'placeholders', 'string');\r\nian.format = function (format) {\r\n var args = Array.prototype.slice.call(arguments, 1);\r\n return format.replace(/{(\\d+)}/g, function (match, number) {\r\n return typeof args[number] != \"undefined\" ? args[number] : match;\r\n });\r\n};\r\n\r\nian.getCookie = function getCookie(name) {\r\n if (document.cookie.length > 0) {\r\n c_start = document.cookie.indexOf(name + \"=\");\r\n if (c_start != -1) {\r\n c_start = c_start + name.length + 1;\r\n c_end = document.cookie.indexOf(\";\", c_start);\r\n if (c_end == -1) {\r\n c_end = document.cookie.length;\r\n }\r\n return unescape(document.cookie.substring(c_start, c_end));\r\n }\r\n }\r\n return \"\";\r\n}\r\n\r\nian.setCookie = function (name, value, days) {\r\n var expires;\r\n if (days) {\r\n var date = new Date();\r\n date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\r\n expires = \"; expires=\" + date.toGMTString();\r\n }\r\n else {\r\n expires = \"\";\r\n }\r\n document.cookie = name + \"=\" + value + expires + \"; path=/\";\r\n}\r\n\r\nian.escapeRegex = function (str) {\r\n return str.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, \"\\\\$1\");\r\n}\r\n\r\nian.replaceAll = function (find, replace, str) {\r\n return str.replace(new RegExp(ian.escapeRegex(find), \"g\"), replace);\r\n}\r\n\r\nian.combine = function (separator) {\r\n //combine\r\n var args = Array.prototype.slice.call(arguments, 1);\r\n var argArray = [];\r\n for (var i = 0; i < args.length; i++) {\r\n argArray.push(args[i]);\r\n }\r\n\r\n return argArray.join(separator);\r\n}\r\n\r\nian.urlCombine = function () {\r\n var separator = \"/\";\r\n\r\n //fix arguments\r\n for (var i = 0; i < arguments.length; i++) {\r\n var arg = arguments[i];\r\n if (arg.startsWith(separator)) {\r\n arg = arg.replace(separator, \"\"); //remove starting slash\r\n }\r\n if (arg.endsWith(separator)) {\r\n arg = arg.replace(new RegExp(separator + \"$\"), \"\"); //remove ending slash\r\n }\r\n arguments[i] = arg;\r\n }\r\n\r\n Array.prototype.unshift.call(arguments, separator);\r\n return ian.combine.apply(null, arguments);\r\n}\r\n\r\nian.pathCombine = function () {\r\n var separator = \"\\\\\";\r\n\r\n //fix arguments\r\n for (var i = 0; i < arguments.length; i++) {\r\n var arg = arguments[i];\r\n if (arg.startsWith(separator)) {\r\n arg = arg.replace(separator, \"\"); //remove starting slash\r\n }\r\n if (arg.endsWith(separator)) {\r\n arg = arg.replace(new RegExp(separator + \"$\"), \"\"); //remove ending slash\r\n }\r\n arguments[i] = arg;\r\n }\r\n\r\n Array.prototype.unshift.call(arguments, separator);\r\n return ian.combine.apply(null, arguments);\r\n}\r\n\r\n/**\r\n * Returns a random number between min (inclusive) and max (exclusive)\r\n */\r\nian.getRandomArbitrary = function (min, max) {\r\n return Math.random() * (max - min) + min;\r\n}\r\n\r\n/**\r\n * Returns a random integer between min (inclusive) and max (inclusive)\r\n * Using Math.round() will give you a non-uniform distribution!\r\n */\r\nian.getRandomInt = function (min, max) {\r\n return Math.floor(Math.random() * (max - min + 1)) + min;\r\n}\r\n\r\nian.abbreviateNumber = function (num, precision, prefix) {\r\n var str,\r\n suffix = '';\r\n var rv = 0;\r\n num = parseFloat(num);\r\n precision = precision || 2;\r\n var isNegative = num < 0;\r\n num = Math.abs(num);\r\n\r\n var factor = Math.pow(10, precision);\r\n\r\n if (num < 1000) {\r\n str = num;\r\n } else if (num < 1000000) {\r\n str = Math.floor(num / (1000 / factor)) / factor;\r\n suffix = 'K';\r\n } else if (num < 1000000000) {\r\n str = Math.floor(num / (1000000 / factor)) / factor;\r\n suffix = 'M';\r\n } else if (num < 1000000000000) {\r\n str = Math.floor(num / (1000000000 / factor)) / factor;\r\n suffix = 'B';\r\n } else if (num < 1000000000000000) {\r\n str = Math.floor(num / (1000000000000 / factor)) / factor;\r\n suffix = 'T';\r\n }\r\n\r\n if (isNegative)\r\n str = parseFloat(str) * -1;\r\n\r\n if (prefix)\r\n rv = prefix + str + suffix;\r\n else\r\n rv = str + suffix;\r\n\r\n\r\n\r\n return rv;\r\n}\r\n\r\nian.abbreviateNumberThousand = function (num, precision, prefix) {\r\n var str,\r\n suffix = '';\r\n var rv = 0;\r\n\r\n precision = precision || 2;\r\n var isNegative = num < 0;\r\n num = Math.abs(num);\r\n\r\n var factor = Math.pow(10, precision);\r\n\r\n if (num < 1000) {\r\n str = num;\r\n } else {\r\n str = Math.floor(num / (1000 / factor)) / factor;\r\n\r\n suffix = 'K';\r\n } \r\n\r\n if (isNegative)\r\n str = parseFloat(str) * -1;\r\n\r\n var hasDecimals = num % 1 != 0;\r\n if (Math.abs(parseFloat(str)) > 99 && hasDecimals)\r\n str = str.toFixed(0);\r\n else\r\n str = str.toFixed(precision);\r\n\r\n if (prefix)\r\n rv = prefix + str + suffix;\r\n else\r\n rv = str + suffix;\r\n\r\n\r\n\r\n return rv;\r\n}\r\n\r\nian.imageExists = function (image_url) {\r\n\r\n var http = new XMLHttpRequest();\r\n\r\n http.open('HEAD', image_url, false);\r\n http.send();\r\n\r\n return http.status != 404;\r\n\r\n}\r\n\r\nian.ExportToExcel = function (tableHtml, worksheetName) {\r\n var uri = 'data:application/vnd.ms-excel;base64,',\r\n template = '{table}
',\r\n base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))); },\r\n format = function (s, c) { return s.replace(/{(\\w+)}/g, function (m, p) { return c[p]; }) };\r\n\r\n var ctx = { worksheet: worksheetName, table: tableHtml },\r\n href = uri + base64(format(template, ctx));\r\n return href;\r\n}\r\n\r\nian.removeDuplicates = function (myArr, prop) {\r\n return myArr.filter((obj, pos, arr) => {\r\n return arr.map(mapObj => mapObj[prop]).indexOf(obj[prop]) === pos;\r\n });\r\n}\r\n\r\n\r\n/*** Extensions and Polyfills ***/\r\n\r\nif (!String.prototype.startsWith) {\r\n Object.defineProperty(String.prototype, \"startsWith\", {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function (searchString, position) {\r\n position = position || 0;\r\n return this.lastIndexOf(searchString, position) === position;\r\n }\r\n });\r\n}\r\n\r\nif (!String.prototype.endsWith) {\r\n Object.defineProperty(String.prototype, \"endsWith\", {\r\n value: function (searchString, position) {\r\n var subjectString = this.toString();\r\n if (position === undefined || position > subjectString.length) {\r\n position = subjectString.length;\r\n }\r\n position -= searchString.length;\r\n var lastIndex = subjectString.indexOf(searchString, position);\r\n return lastIndex !== -1 && lastIndex === position;\r\n }\r\n });\r\n}\r\n\r\nif (!Array.prototype.find) {\r\n Array.prototype.find = function (predicate) {\r\n if (this == null) {\r\n throw new TypeError(\"Array.prototype.find called on null or undefined\");\r\n }\r\n if (typeof predicate !== \"function\") {\r\n throw new TypeError(\"predicate must be a function\");\r\n }\r\n var list = Object(this);\r\n var length = list.length >>> 0;\r\n var thisArg = arguments[1];\r\n var value;\r\n\r\n for (var i = 0; i < length; i++) {\r\n value = list[i];\r\n if (predicate.call(thisArg, value, i, list)) {\r\n return value;\r\n }\r\n }\r\n return undefined;\r\n };\r\n}\r\n\r\nif (!String.prototype.replaceAll) {\r\n Object.defineProperty(String.prototype, \"replaceAll\", {\r\n value: function (find, replace) {\r\n var str = this.toString();\r\n return str.replace(new RegExp(ian.escapeRegex(find), \"g\"), replace);\r\n }\r\n });\r\n}\r\n\r\nif (!String.prototype.removeDiacritics) {\r\n Object.defineProperty(String.prototype, \"removeDiacritics\", {\r\n value: function (find, replace) {\r\n var str = this.toString();\r\n for (var i = 0; i < defaultDiacriticsRemovalMap.length; i++) {\r\n str = str.replace(defaultDiacriticsRemovalMap[i].letters, defaultDiacriticsRemovalMap[i].base);\r\n }\r\n\r\n return str;\r\n }\r\n });\r\n}\r\n\r\nString.prototype.toUnicode = function () {\r\n return this.replace(/./g, function (c) { return (\"\\\\u00\" + c.charCodeAt(0).toString(16)) });\r\n};\r\n\r\nfunction toUnicode(txt) {\r\n\r\n return txt.replace(/./g, function (c) { return (\"\\u0000\" + c.charCodeAt(0).toString(16)) });\r\n};\r\n\r\nvar GSM2Unicode = {\r\n 0x00: \"\\u0040\", // COMMERCIAL AT\r\n 0x01: \"\\u00A3\", // POUND SIGN\r\n 0x02: \"\\u0024\", // DOLLAR SIGN\r\n 0x03: \"\\u00A5\", // YEN SIGN\r\n 0x04: \"\\u00E8\", // LATIN SMALL LETTER E WITH GRAVE\r\n 0x05: \"\\u00E9\", // LATIN SMALL LETTER E WITH ACUTE\r\n 0x06: \"\\u00F9\", // LATIN SMALL LETTER U WITH GRAVE\r\n 0x07: \"\\u00EC\", // LATIN SMALL LETTER I WITH GRAVE\r\n 0x08: \"\\u00F2\", // LATIN SMALL LETTER O WITH GRAVE\r\n 0x09: \"\\u00E7\", // LATIN SMALL LETTER C WITH CEDILLA\r\n 0x0A: \"\\u000A\", // LINE FEED\r\n 0x0B: \"\\u00D8\", // LATIN CAPITAL LETTER O WITH STROKE\r\n 0x0C: \"\\u00F8\", // LATIN SMALL LETTER O WITH STROKE\r\n 0x0D: \"\\u000D\", // CARRIAGE RETURN\r\n 0x0E: \"\\u00C5\", // LATIN CAPITAL LETTER A WITH RING ABOVE\r\n 0x0F: \"\\u00E5\", // LATIN SMALL LETTER A WITH RING ABOVE\r\n 0x10: \"\\u0394\", // GREEK CAPITAL LETTER DELTA\r\n 0x11: \"\\u005F\", // LOW LINE\r\n 0x12: \"\\u03A6\", // GREEK CAPITAL LETTER PHI\r\n 0x13: \"\\u0393\", // GREEK CAPITAL LETTER GAMMA\r\n 0x14: \"\\u039B\", // GREEK CAPITAL LETTER LAMDA\r\n 0x15: \"\\u03A9\", // GREEK CAPITAL LETTER OMEGA\r\n 0x16: \"\\u03A0\", // GREEK CAPITAL LETTER PI\r\n 0x17: \"\\u03A8\", // GREEK CAPITAL LETTER PSI\r\n 0x18: \"\\u03A3\", // GREEK CAPITAL LETTER SIGMA\r\n 0x19: \"\\u0398\", // GREEK CAPITAL LETTER THETA\r\n 0x1A: \"\\u039E\", // GREEK CAPITAL LETTER XI\r\n 0x1B: \"\\u00A0\", // ESCAPE TO EXTENSION TABLE\r\n 0x1C: \"\\u00C6\", // LATIN CAPITAL LETTER AE\r\n 0x1D: \"\\u00E6\", // LATIN SMALL LETTER AE\r\n 0x1E: \"\\u00DF\", // LATIN SMALL LETTER SHARP S (German)\r\n 0x1F: \"\\u00C9\", // LATIN CAPITAL LETTER E WITH ACUTE\r\n 0x20: \"\\u0020\", // SPACE\r\n 0x21: \"\\u0021\", // EXCLAMATION MARK\r\n 0x22: \"\\u0022\", // QUOTATION MARK\r\n 0x23: \"\\u0023\", // NUMBER SIGN\r\n 0x24: \"\\u00A4\", // CURRENCY SIGN\r\n 0x25: \"\\u0025\", // PERCENT SIGN\r\n 0x26: \"\\u0026\", // AMPERSAND\r\n 0x27: \"\\u0027\", // APOSTROPHE\r\n 0x28: \"\\u0028\", // LEFT PARENTHESIS\r\n 0x29: \"\\u0029\", // RIGHT PARENTHESIS\r\n 0x2A: \"\\u002A\", // ASTERISK\r\n 0x2B: \"\\u002B\", // PLUS SIGN\r\n 0x2C: \"\\u002C\", // COMMA\r\n 0x2D: \"\\u002D\", // HYPHEN-MINUS\r\n 0x2E: \"\\u002E\", // FULL STOP\r\n 0x2F: \"\\u002F\", // SOLIDUS\r\n 0x30: \"\\u0030\", // DIGIT ZERO\r\n 0x31: \"\\u0031\", // DIGIT ONE\r\n 0x32: \"\\u0032\", // DIGIT TWO\r\n 0x33: \"\\u0033\", // DIGIT THREE\r\n 0x34: \"\\u0034\", // DIGIT FOUR\r\n 0x35: \"\\u0035\", // DIGIT FIVE\r\n 0x36: \"\\u0036\", // DIGIT SIX\r\n 0x37: \"\\u0037\", // DIGIT SEVEN\r\n 0x38: \"\\u0038\", // DIGIT EIGHT\r\n 0x39: \"\\u0039\", // DIGIT NINE\r\n 0x3A: \"\\u003A\", // COLON\r\n 0x3B: \"\\u003B\", // SEMICOLON\r\n 0x3C: \"\\u003C\", // LESS-THAN SIGN\r\n 0x3D: \"\\u003D\", // EQUALS SIGN\r\n 0x3E: \"\\u003E\", // GREATER-THAN SIGN\r\n 0x3F: \"\\u003F\", // QUESTION MARK\r\n 0x40: \"\\u00A1\", // INVERTED EXCLAMATION MARK\r\n 0x41: \"\\u0041\", // LATIN CAPITAL LETTER A\r\n 0x42: \"\\u0042\", // LATIN CAPITAL LETTER B\r\n 0x43: \"\\u0043\", // LATIN CAPITAL LETTER C\r\n 0x44: \"\\u0044\", // LATIN CAPITAL LETTER D\r\n 0x45: \"\\u0045\", // LATIN CAPITAL LETTER E\r\n 0x46: \"\\u0046\", // LATIN CAPITAL LETTER F\r\n 0x47: \"\\u0047\", // LATIN CAPITAL LETTER G\r\n 0x48: \"\\u0048\", // LATIN CAPITAL LETTER H\r\n 0x49: \"\\u0049\", // LATIN CAPITAL LETTER I\r\n 0x4A: \"\\u004A\", // LATIN CAPITAL LETTER J\r\n 0x4B: \"\\u004B\", // LATIN CAPITAL LETTER K\r\n 0x4C: \"\\u004C\", // LATIN CAPITAL LETTER L\r\n 0x4D: \"\\u004D\", // LATIN CAPITAL LETTER M\r\n 0x4E: \"\\u004E\", // LATIN CAPITAL LETTER N\r\n 0x4F: \"\\u004F\", // LATIN CAPITAL LETTER O\r\n 0x50: \"\\u0050\", // LATIN CAPITAL LETTER P\r\n 0x51: \"\\u0051\", // LATIN CAPITAL LETTER Q\r\n 0x52: \"\\u0052\", // LATIN CAPITAL LETTER R\r\n 0x53: \"\\u0053\", // LATIN CAPITAL LETTER S\r\n 0x54: \"\\u0054\", // LATIN CAPITAL LETTER T\r\n 0x55: \"\\u0055\", // LATIN CAPITAL LETTER U\r\n 0x56: \"\\u0056\", // LATIN CAPITAL LETTER V\r\n 0x57: \"\\u0057\", // LATIN CAPITAL LETTER W\r\n 0x58: \"\\u0058\", // LATIN CAPITAL LETTER X\r\n 0x59: \"\\u0059\", // LATIN CAPITAL LETTER Y\r\n 0x5A: \"\\u005A\", // LATIN CAPITAL LETTER Z\r\n 0x5B: \"\\u00C4\", // LATIN CAPITAL LETTER A WITH DIAERESIS\r\n 0x5C: \"\\u00D6\", // LATIN CAPITAL LETTER O WITH DIAERESIS\r\n 0x5D: \"\\u00D1\", // LATIN CAPITAL LETTER N WITH TILDE\r\n 0x5E: \"\\u00DC\", // LATIN CAPITAL LETTER U WITH DIAERESIS\r\n 0x5F: \"\\u00A7\", // SECTION SIGN\r\n 0x60: \"\\u00BF\", // INVERTED QUESTION MARK\r\n 0x61: \"\\u0061\", // LATIN SMALL LETTER A\r\n 0x62: \"\\u0062\", // LATIN SMALL LETTER B\r\n 0x63: \"\\u0063\", // LATIN SMALL LETTER C\r\n 0x64: \"\\u0064\", // LATIN SMALL LETTER D\r\n 0x65: \"\\u0065\", // LATIN SMALL LETTER E\r\n 0x66: \"\\u0066\", // LATIN SMALL LETTER F\r\n 0x67: \"\\u0067\", // LATIN SMALL LETTER G\r\n 0x68: \"\\u0068\", // LATIN SMALL LETTER H\r\n 0x69: \"\\u0069\", // LATIN SMALL LETTER I\r\n 0x6A: \"\\u006A\", // LATIN SMALL LETTER J\r\n 0x6B: \"\\u006B\", // LATIN SMALL LETTER K\r\n 0x6C: \"\\u006C\", // LATIN SMALL LETTER L\r\n 0x6D: \"\\u006D\", // LATIN SMALL LETTER M\r\n 0x6E: \"\\u006E\", // LATIN SMALL LETTER N\r\n 0x6F: \"\\u006F\", // LATIN SMALL LETTER O\r\n 0x70: \"\\u0070\", // LATIN SMALL LETTER P\r\n 0x71: \"\\u0071\", // LATIN SMALL LETTER Q\r\n 0x72: \"\\u0072\", // LATIN SMALL LETTER R\r\n 0x73: \"\\u0073\", // LATIN SMALL LETTER S\r\n 0x74: \"\\u0074\", // LATIN SMALL LETTER T\r\n 0x75: \"\\u0075\", // LATIN SMALL LETTER U\r\n 0x76: \"\\u0076\", // LATIN SMALL LETTER V\r\n 0x77: \"\\u0077\", // LATIN SMALL LETTER W\r\n 0x78: \"\\u0078\", // LATIN SMALL LETTER X\r\n 0x79: \"\\u0079\", // LATIN SMALL LETTER Y\r\n 0x7A: \"\\u007A\", // LATIN SMALL LETTER Z\r\n 0x7B: \"\\u00E4\", // LATIN SMALL LETTER A WITH DIAERESIS\r\n 0x7C: \"\\u00F6\", // LATIN SMALL LETTER O WITH DIAERESIS\r\n 0x7D: \"\\u00F1\", // LATIN SMALL LETTER N WITH TILDE\r\n 0x7E: \"\\u00FC\", // LATIN SMALL LETTER U WITH DIAERESIS\r\n 0x7F: \"\\u00E0\" // LATIN SMALL LETTER A WITH GRAVE\r\n};\r\nvar Latinise = {};\r\nLatinise.latin_map = { \"á\": \"\\u00e1\" };\r\nString.prototype.latinise = function () { return this.replace(/./g, function (a) { return Latinise.latin_map[a] || a }) };\r\nString.prototype.latinize = String.prototype.latinise;\r\nString.prototype.isLatin = function () { return this == this.latinise() }\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"promotionalWorkflowsCtrl\", function ($scope, $timeout, promotionsService, ngDialog, $filter) {\r\n var self = this;\r\n\r\n self.workflows = [];\r\n\r\n self.isLoading = true;\r\n\r\n self.promotionMediaTypes = promotionsService.promotionMediaTypes;\r\n\r\n self.delete = function (workflowId, workflowName) {\r\n\r\n swal({\r\n title: 'Esta seguro que desea borrar el proceso ' + workflowName + ' ?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n \r\n promotionsService.workflows.deleteWorkflow(workflowId)\r\n .then(function (isOk) {\r\n swal('Proceso Borrado!', 'El proceso ' + workflowName + ' se ha borrado exitosamente', 'success');\r\n loadData();\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de borrado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al borrar este proceso\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.getMediaType = function (mediaTypeId) {\r\n var lavel = \"\";\r\n angular.forEach(self.promotionMediaTypes, function (mt) {\r\n if (mt.id == mediaTypeId)\r\n rv = mt.label;\r\n\r\n });\r\n return rv;\r\n }\r\n\r\n self.openCloningDialog = function (workflowToCloneId) {\r\n var newScope = $scope.$new();\r\n newScope.newWorkflow = { Id: 0, companyId: 0, name: '', description: '', promotionMediaType: 0, tasks: [] };\r\n newScope.promotionMediaTypes = self.promotionMediaTypes;\r\n newScope.promotionTypeChanged = function () {\r\n if (newScope.newWorkflow.promotionType == 'Otras') {\r\n newScope.promotionMediaTypes = self.promotionMediaTypes;\r\n newScope.workflow.promotionMediaType = 10;\r\n }\r\n else { //Externa, Saco la variable Interna y externa del tipo de medio.\r\n newScope.promotionMediaTypes.filter(function (mt) { return mt.id != 6 && mt.id != 10; });\r\n self.workflow.promotionMediaType = null;\r\n }\r\n }\r\n newScope.clone = function () {\r\n newScope.cloning = true;\r\n promotionsService.workflows.cloneWorkflow(newScope.newWorkflow, workflowToCloneId)\r\n .then(function (wf) {\r\n newScope.cloning = false;\r\n self.workflows.push(wf);\r\n swal('Proceso Clonado!', 'El proceso ' + wf.name + ' se ha clonado exitosamente', 'success');\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de clonado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n newScope.cloning = false;\r\n swal(\"Error\", \"Hubo un error al clonar este proceso\", \"error\");\r\n }\r\n });\r\n }\r\n\r\n ngDialog.open({\r\n template: 'cloningDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n }\r\n\r\n function loadData() {\r\n self.promotionMediaTypes = promotionsService.promotionMediaTypes;\r\n promotionsService.workflows.getWorkflows(false)\r\n .then(function (workflows) {\r\n self.workflows = workflows;\r\n\r\n self.isLoading = false;\r\n });\r\n }\r\n\r\n function init() {\r\n loadData();\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"editPromotionalWorkflowCtrl\", function ($scope, $state, $stateParams, $timeout, $filter, promotionsService, ngDialog, ganttUtils, moment) {\r\n var self = this;\r\n self.api = null;\r\n\r\n self.startPromotionDate = null;\r\n self.timespans = [];\r\n self.canEditTask = true;\r\n\r\n var startDateOffset = new Date(new Date().toDateString());\r\n startDateOffset = startDateOffset.setTime(startDateOffset.getTime() - (86400000));\r\n\r\n self.ganttOptions = {\r\n columns: [],\r\n columnsHeaders: { 'model.name': 'Tarea' },\r\n columnsClasses: { 'model.name': 'gantt-column-name' },\r\n fromDate: moment(startDateOffset),\r\n currentDate: 'line',\r\n currentDateValue: moment(startDateOffset),\r\n api: function (api) {\r\n // API Object is used to control methods and events from angular-gantt.\r\n self.api = api;\r\n },\r\n timeFrames: {\r\n 'day': {\r\n start: moment('8:00', 'HH:mm'),\r\n end: moment('20:00', 'HH:mm'),\r\n color: '#ACFFA3',\r\n working: true,\r\n default: true\r\n },\r\n 'noon': {\r\n start: moment('12:00', 'HH:mm'),\r\n end: moment('13:30', 'HH:mm'),\r\n working: false,\r\n default: true\r\n },\r\n 'closed': {\r\n working: false,\r\n default: true\r\n },\r\n 'weekend': {\r\n working: false\r\n },\r\n 'holiday': {\r\n working: false,\r\n color: 'red',\r\n classes: ['gantt-timeframe-holiday']\r\n },\r\n 'startPromotion': {\r\n working: true,\r\n color: 'green',\r\n classes: ['gantt-timeframe-holiday']\r\n }\r\n },\r\n dateFrames: {\r\n 'weekend': {\r\n evaluator: function (date) {\r\n return date.isoWeekday() === 6 || date.isoWeekday() === 7;\r\n },\r\n targets: ['weekend']\r\n },\r\n 'startPromotion': {\r\n evaluator: function (date) {\r\n return true;\r\n //return date != null && self.startPromotionDate != null ? date.getTime() === self.startPromotionDate.getTime() : false;\r\n },\r\n targets: ['startPromotion']\r\n },\r\n },\r\n timeFramesWorkingMode: 'hidden',\r\n timeFramesNonWorkingMode: 'visible',\r\n dependencies: {\r\n enabled: true,\r\n conflictChecker: true\r\n }\r\n };\r\n\r\n self.ganttdata = [];\r\n\r\n self.previousTasks = [];\r\n\r\n self.tasks = [];\r\n\r\n var colors = promotionsService.colors;\r\n\r\n self.allPromotionMediaTypes = promotionsService.promotionMediaTypes;\r\n self.promotionMediaTypes = self.allPromotionMediaTypes;\r\n\r\n self.userAreas = promotionsService.userAreas;\r\n\r\n self.promotionTypeChanged = function () {\r\n if (self.workflow.promotionType == 'Interna') {\r\n self.promotionMediaTypes = self.allPromotionMediaTypes;\r\n self.workflow.promotionMediaType = 6; //Promo Interna\r\n }\r\n else if (self.workflow.promotionType == 'Otras') {\r\n self.promotionMediaTypes = self.allPromotionMediaTypes;\r\n self.workflow.promotionMediaType = 10; //Otras Promo(se quito)\r\n }\r\n else { //Externa, Saco la variable Interna y externa del tipo de medio.\r\n var rv = [];\r\n //issue CencosudPeru #123 Pide: \"Reincorporar internas al crear un proceso promocional\"\r\n angular.forEach(self.allPromotionMediaTypes, function (mt) {\r\n if (mt.id != 10)\r\n rv.push(mt);\r\n });\r\n\r\n self.promotionMediaTypes = rv;\r\n\r\n self.workflow.promotionMediaType = null;\r\n }\r\n }\r\n\r\n //Este es el objeto para Agregar o Editar Tareas\r\n self.workflowtask = null;\r\n\r\n function loadWorkflow() {\r\n if ($stateParams.workflowId != '0') {\r\n promotionsService.workflows.getWorkflow($stateParams.workflowId)\r\n .then(function (workflow) {\r\n workflow.validFrom = new Date(workflow.validFrom);\r\n workflow.validTo = new Date(workflow.validTo);\r\n self.workflow = workflow;\r\n\r\n //set identifiers\r\n angular.forEach(self.workflow.tasks, function (task) {\r\n task.identifier = task.name;\r\n });\r\n\r\n redrawGantt();\r\n });\r\n }\r\n else {\r\n self.workflow = { Id: 0, companyId: 0, name: '', description: '', promotionMediaType: 0, tasks: [] };\r\n }\r\n }\r\n\r\n function loadTasks() {\r\n promotionsService.tasks.getTasks()\r\n .then(function (tasks) {\r\n // self.tasks = tasks;// TODO descomentar cuando todas las tareas tengan funcionalidad\r\n angular.forEach(tasks, function (t) {\r\n if (t.name != \"Reporte Impacto Preliminar\"\r\n && t.name != \"Carga de costos de publicación\"\r\n && t.name != \"Alerta de problemas de stocks\"\r\n && t.name != \"1° Control y Exhibición en tienda\"\r\n && t.name != \"2° Control y Exhibición en tienda\"\r\n && t.name != \"3° Control y Exhibición en tienda\")\r\n self.tasks.push(t);\r\n });\r\n });\r\n }\r\n\r\n function isWorkflowInUse() {\r\n if ($stateParams.workflowId != '0') {\r\n promotionsService.workflows.isWorkflowInUse($stateParams.workflowId)\r\n .then(function (isInUse) {\r\n if (isInUse)\r\n self.canEditTask = false;\r\n });\r\n }\r\n }\r\n\r\n\r\n //Esta función se llama cuando se cambia el Tipo de Tarea en el Dialog de Nueva tarea\r\n self.taskChanged = function () {\r\n angular.forEach(self.tasks, function (task) {\r\n if (self.workflowtask.promotionTaskId == task.id) {\r\n let oldTask = angular.copy(self.workflowtask);\r\n self.workflowtask.userArea = task.userArea;\r\n self.workflowtask.groupName = task.groupName;\r\n self.workflowtask.name = task.name;\r\n self.workflowtask.identifier = task.name;\r\n self.workflowtask.isRequired = task.isRequired;\r\n self.workflowtask.navigateToState = task.navigateToState;\r\n if (task.isStartMilestone)\r\n self.workflowtask.durationInDays = 1;\r\n self.workflowtask.isStartMilestone = task.isStartMilestone;\r\n if (self.workflowtask.added)\r\n updateDependencies(oldTask, self.workflowtask);\r\n }\r\n });\r\n }\r\n\r\n self.closeEditDialog = function () {\r\n ngDialog.close();\r\n }\r\n\r\n $scope.handleEditTask = function (rowModel) {\r\n angular.forEach(self.workflow.tasks, function (task) {\r\n if (task.identifier == rowModel.id) {\r\n self.editTask(task);\r\n }\r\n });\r\n };\r\n\r\n $scope.handleRemoveTask = function (rowModel) {\r\n\r\n if (self.canEditTask) {\r\n //Busco en la colección e identifico la tarea a eliminar\r\n var taskToRemove = null;\r\n var indexInWorckflowTasks = -1;\r\n\r\n angular.forEach(self.workflow.tasks, function (task, i) {\r\n if (task.name == rowModel.id) {\r\n taskToRemove = task;\r\n indexInWorckflowTasks = i;\r\n }\r\n });\r\n\r\n var hasDependencies = taskHasDependencies(taskToRemove);\r\n\r\n swal({\r\n title: 'Esta seguro que desea eliminar esta tarea del Proceso Promocional?' + (hasDependencies ? ' Tiene Dependencias que serán eliminadas' : ''),\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n if (taskToRemove != null) {\r\n if (hasDependencies) {\r\n\r\n //Elimino las dependencias\r\n deleteDependencies(taskToRemove);\r\n }\r\n //Borro de la coleccion\r\n self.workflow.tasks.splice(indexInWorckflowTasks, 1);\r\n\r\n promotionsService.workflows.removeTask(taskToRemove)\r\n .then(function (workflow) {\r\n redrawGantt();\r\n\r\n swal('Tarea Eliminada!', 'La tarea ' + rowModel.name + ' se ha eliminado exitosamente', 'success');\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al eliminar esta tarea\", \"error\");\r\n }\r\n });\r\n }\r\n else {\r\n $timeout(function () {\r\n swal('Error!', 'No se ha podido eliminar la tarea' + rowModel.name, 'error');\r\n }, 100);\r\n }\r\n }\r\n });\r\n }\r\n else {\r\n swal(\"Error\", \"No se puede eliminar una tarea, porque el workflow ya fué asignado a una promocion\", \"error\");\r\n }\r\n };\r\n\r\n function taskHasDependencies(taskToRemove) {\r\n\r\n var rv = false;\r\n if (taskToRemove != null) {\r\n angular.forEach(self.workflow.tasks, function (task, i) {\r\n if (task.promotionTaskPreviousId == taskToRemove.id || task.previousIdentifier == taskToRemove.previousIdentifier)\r\n rv = true;\r\n });\r\n }\r\n\r\n return rv;\r\n }\r\n\r\n function deleteDependencies(taskToRemove) {\r\n\r\n if (taskToRemove != null) {\r\n angular.forEach(self.workflow.tasks, function (task, i) {\r\n if (task.promotionTaskPreviousId == taskToRemove.id || task.previousIdentifier == taskToRemove.identifier) {\r\n task.promotionTaskPreviousId = null;\r\n task.previousIdentifier = null;\r\n }\r\n });\r\n }\r\n }\r\n\r\n function updateDependencies(taskWithDependences, taskUpdated) {\r\n\r\n if (taskWithDependences != null && taskUpdated != null) {\r\n angular.forEach(self.workflow.tasks, function (task, i) {\r\n if (task.promotionTaskPreviousId == taskWithDependences.id || task.previousIdentifier == taskWithDependences.identifier) {\r\n task.promotionTaskPreviousId = taskUpdated.id;\r\n task.previousIdentifier = taskUpdated.identifier;\r\n }\r\n });\r\n }\r\n }\r\n\r\n function redrawGanttOLD() {\r\n var ganttdataitems = [];\r\n\r\n var prevGroupName = '';\r\n var groupCount = 0;\r\n var groupId = 1000;\r\n var group = { id: groupId, name: '', children: [] };\r\n\r\n var startDate = moment(new Date().toDateString());\r\n var initDate = startDate;\r\n var endDate = moment(new Date().toDateString());\r\n\r\n //Paso 1: Recorro todos los tasks para crear los items de los groupnames\r\n angular.forEach($filter('orderBy')(self.workflow.tasks, 'promotionTaskId', false), function (task, i) {\r\n if (prevGroupName != '' && prevGroupName != task.groupName) {\r\n var groupCopy = {};\r\n ganttdataitems.push(angular.copy(group, groupCopy));\r\n\r\n groupCount++;\r\n group.children = [];\r\n groupId++;\r\n }\r\n\r\n group.id = groupId;\r\n group.name = task.groupName;\r\n group.children.push(task.name);\r\n\r\n if (task.promotionTaskPreviousId != null) {\r\n\r\n angular.forEach(ganttdataitems, function (ganttitem, i) {\r\n if (ganttitem.id == task.promotionTaskPreviousId && ganttitem.tasks.length > 0) {\r\n var ganttitemTask = ganttitem.tasks[0];\r\n\r\n startDate = moment(endDate).add(task.startFromDay, 'days');\r\n endDate = moment(startDate).add(task.durationInDays, 'days');\r\n }\r\n });\r\n }\r\n else {\r\n startDate = moment(initDate).add(task.startFromDay, 'days');\r\n endDate = moment(startDate).add(task.durationInDays + task.startFromDay, 'days');\r\n }\r\n\r\n if (groupCount > colors.length) {\r\n groupCount = 0;\r\n }\r\n\r\n\r\n var ganttItem = {\r\n //id: task.promotionTaskId,\r\n id: ganttdataitems.length + 1, //task.promotionTaskId,\r\n name: task.name,\r\n content: '{{row.model.name}} ',\r\n tasks: [{ name: task.name, from: startDate, to: endDate, color: colors[groupCount], progress: { percent: 0, color: '#3C8CF8' } }],\r\n };\r\n\r\n if (task.promotionTaskPreviousId != null) {\r\n //TODO: esto no está funcando\r\n ganttItem.tasks[0].dependencies = [{ from: task.promotionTaskPreviousId }];\r\n }\r\n\r\n ganttdataitems.push(ganttItem);\r\n\r\n prevGroupName = task.groupName;\r\n\r\n if (task.isStartMilestone) {\r\n self.startPromotionDate = startDate;\r\n }\r\n });\r\n\r\n ganttdataitems.push(group);\r\n //workflow.children.push(group.name);\r\n //ganttdataitems.push(workflow);\r\n\r\n self.ganttdata = ganttdataitems;\r\n\r\n /*\r\n self.ganttdata = [\r\n // Order is optional. If not specified it will be assigned automatically\r\n {\r\n name: 'Milestones', height: '3em', sortable: false, drawTask: false, classes: 'gantt-row-milestone', color: '#45607D', tasks: [\r\n // Dates can be specified as string, timestamp or javascript date object. The data attribute can be used to attach a custom object\r\n { name: 'Kickoff', color: '#93C47D', from: '2013-10-07T09:00:00', to: '2013-10-07T10:00:00', data: 'Can contain any custom data or object' },\r\n { name: 'Concept approval', color: '#93C47D', from: new Date(2013, 9, 18, 18, 0, 0), to: new Date(2013, 9, 18, 18, 0, 0), est: new Date(2013, 9, 16, 7, 0, 0), lct: new Date(2013, 9, 19, 0, 0, 0) },\r\n { name: 'Development finished', color: '#93C47D', from: new Date(2013, 10, 15, 18, 0, 0), to: new Date(2013, 10, 15, 18, 0, 0) },\r\n { name: 'Shop is running', color: '#93C47D', from: new Date(2013, 10, 22, 12, 0, 0), to: new Date(2013, 10, 22, 12, 0, 0) },\r\n { name: 'Go-live', color: '#93C47D', from: new Date(2013, 10, 29, 16, 0, 0), to: new Date(2013, 10, 29, 16, 0, 0) }\r\n ], data: 'Can contain any custom data or object'\r\n },\r\n {\r\n name: 'Status meetings', tasks: [\r\n { name: 'Demo #1', color: '#9FC5F8', from: new Date(2013, 9, 25, 15, 0, 0), to: new Date(2013, 9, 25, 18, 30, 0) },\r\n { name: 'Demo #2', color: '#9FC5F8', from: new Date(2013, 10, 1, 15, 0, 0), to: new Date(2013, 10, 1, 18, 0, 0) },\r\n { name: 'Demo #3', color: '#9FC5F8', from: new Date(2013, 10, 8, 15, 0, 0), to: new Date(2013, 10, 8, 18, 0, 0) },\r\n { name: 'Demo #4', color: '#9FC5F8', from: new Date(2013, 10, 15, 15, 0, 0), to: new Date(2013, 10, 15, 18, 0, 0) },\r\n { name: 'Demo #5', color: '#9FC5F8', from: new Date(2013, 10, 24, 9, 0, 0), to: new Date(2013, 10, 24, 10, 0, 0) }\r\n ]\r\n },\r\n {\r\n name: 'Kickoff', movable: { allowResizing: false }, tasks: [\r\n {\r\n name: 'Day 1', color: '#9FC5F8', from: new Date(2013, 9, 7, 9, 0, 0), to: new Date(2013, 9, 7, 17, 0, 0),\r\n progress: { percent: 100, color: '#3C8CF8' }, movable: false\r\n },\r\n {\r\n name: 'Day 2', color: '#9FC5F8', from: new Date(2013, 9, 8, 9, 0, 0), to: new Date(2013, 9, 8, 17, 0, 0),\r\n progress: { percent: 100, color: '#3C8CF8' }\r\n },\r\n {\r\n name: 'Day 3', color: '#9FC5F8', from: new Date(2013, 9, 9, 8, 30, 0), to: new Date(2013, 9, 9, 12, 0, 0),\r\n progress: { percent: 100, color: '#3C8CF8' }\r\n }\r\n ]\r\n },\r\n {\r\n name: 'Create concept', tasks: [\r\n {\r\n name: 'Create concept', priority: 20, content: ' {{task.model.name}}', color: '#F1C232', from: new Date(2013, 9, 10, 8, 0, 0), to: new Date(2013, 9, 16, 18, 0, 0), est: new Date(2013, 9, 8, 8, 0, 0), lct: new Date(2013, 9, 18, 20, 0, 0),\r\n progress: 100\r\n }\r\n ]\r\n },\r\n {\r\n name: 'Finalize concept', tasks: [\r\n {\r\n id: 'Finalize concept', name: 'Finalize concept', priority: 10, color: '#F1C232', from: new Date(2013, 9, 17, 8, 0, 0), to: new Date(2013, 9, 18, 18, 0, 0),\r\n progress: 100\r\n }\r\n ]\r\n },\r\n { name: 'Development', children: ['Sprint 1', 'Sprint 2', 'Sprint 3', 'Sprint 4'], content: ' {{row.model.name}}' },\r\n {\r\n name: 'Sprint 1', tooltips: false, tasks: [\r\n {\r\n id: 'Product list view', name: 'Product list view', color: '#F1C232', from: new Date(2013, 9, 21, 8, 0, 0), to: new Date(2013, 9, 25, 15, 0, 0),\r\n progress: 25, dependencies: [{ to: 'Order basket' }, { from: 'Finalize concept' }]\r\n }\r\n ]\r\n },\r\n {\r\n name: 'Sprint 2', tasks: [\r\n {\r\n id: 'Order basket', name: 'Order basket', color: '#F1C232', from: new Date(2013, 9, 28, 8, 0, 0), to: new Date(2013, 10, 1, 15, 0, 0),\r\n dependencies: { to: 'Checkout' }\r\n }\r\n ]\r\n },\r\n {\r\n name: 'Sprint 3', tasks: [\r\n {\r\n id: 'Checkout', name: 'Checkout', color: '#F1C232', from: new Date(2013, 10, 4, 8, 0, 0), to: new Date(2013, 10, 8, 15, 0, 0),\r\n dependencies: { to: 'Login & Signup & Admin Views' }\r\n }\r\n ]\r\n },\r\n {\r\n name: 'Sprint 4', tasks: [\r\n {\r\n id: 'Login & Signup & Admin Views', name: 'Login & Signup & Admin Views', color: '#F1C232', from: new Date(2013, 10, 11, 8, 0, 0), to: new Date(2013, 10, 15, 15, 0, 0),\r\n dependencies: [{ to: 'HW' }, { to: 'SW / DNS/ Backups' }]\r\n }\r\n ]\r\n },\r\n { name: 'Hosting' },\r\n {\r\n name: 'Setup', tasks: [\r\n { id: 'HW', name: 'HW', color: '#F1C232', from: new Date(2013, 10, 18, 8, 0, 0), to: new Date(2013, 10, 18, 12, 0, 0) }\r\n ]\r\n },\r\n {\r\n name: 'Config', tasks: [\r\n { id: 'SW / DNS/ Backups', name: 'SW / DNS/ Backups', color: '#F1C232', from: new Date(2013, 10, 18, 12, 0, 0), to: new Date(2013, 10, 21, 18, 0, 0) }\r\n ]\r\n },\r\n { name: 'Server', parent: 'Hosting', children: ['Setup', 'Config'] },\r\n {\r\n name: 'Deployment', parent: 'Hosting', tasks: [\r\n { name: 'Depl. & Final testing', color: '#F1C232', from: new Date(2013, 10, 21, 8, 0, 0), to: new Date(2013, 10, 22, 12, 0, 0), 'classes': 'gantt-task-deployment' }\r\n ]\r\n },\r\n {\r\n name: 'Workshop', tasks: [\r\n { name: 'On-side education', color: '#F1C232', from: new Date(2013, 10, 24, 9, 0, 0), to: new Date(2013, 10, 25, 15, 0, 0) }\r\n ]\r\n },\r\n {\r\n name: 'Content', tasks: [\r\n { name: 'Supervise content creation', color: '#F1C232', from: new Date(2013, 10, 26, 9, 0, 0), to: new Date(2013, 10, 29, 16, 0, 0) }\r\n ]\r\n },\r\n {\r\n name: 'Documentation', tasks: [\r\n { name: 'Technical/User documentation', color: '#F1C232', from: new Date(2013, 10, 26, 8, 0, 0), to: new Date(2013, 10, 28, 18, 0, 0) }\r\n ]\r\n }\r\n ];\r\n \r\n */\r\n }\r\n\r\n function redrawGantt() {\r\n var ganttdataitems = [];\r\n\r\n var prevGroupName = '';\r\n var groupId = 1000;\r\n var group = { id: groupId, name: '', children: [] };\r\n\r\n var initDate = moment(new Date().toDateString());\r\n\r\n var itemsLeft = angular.copy(self.workflow.tasks);\r\n\r\n var currentGroups = [];\r\n\r\n //recurrente hasta que complete las tareas del gantt\r\n while (self.workflow.tasks.length != countGanttTasks(ganttdataitems)) {\r\n\r\n angular.forEach(itemsLeft, function (task, i) {\r\n\r\n var currentGroup = null;\r\n angular.forEach(ganttdataitems, function (gdi) {\r\n if (gdi.name == task.groupName && gdi.children)\r\n currentGroup = gdi;\r\n });\r\n\r\n //si no existia el grupo lo creo\r\n if (currentGroup == null) {\r\n currentGroup = { id: groupId, name: task.groupName, children: [] };\r\n ganttdataitems.push(currentGroup);\r\n\r\n currentGroups.push(currentGroup.name);\r\n groupId++;\r\n }\r\n\r\n //agrego la tarea actual como hija del grupo\r\n if (currentGroup.children.indexOf(task.name) == -1)\r\n currentGroup.children.push(task.name);\r\n\r\n //defino el color para el grupo\r\n var color = currentGroups.indexOf(task.groupName);\r\n\r\n //calculo las fechas de la tarea\r\n var startDate = null;\r\n var endDate = null;\r\n\r\n if (task.previousIdentifier != null) {\r\n\r\n angular.forEach(ganttdataitems, function (ganttitem, i) {\r\n if (ganttitem.id == task.previousIdentifier && ganttitem.tasks.length > 0) {\r\n var ganttitemTask = ganttitem.tasks[0];\r\n\r\n startDate = moment(ganttitemTask.to).add(task.startFromDay, 'days');\r\n endDate = moment(startDate).add(task.durationInDays, 'days');\r\n }\r\n });\r\n }\r\n else {\r\n startDate = moment(initDate).add(task.startFromDay, 'days');\r\n endDate = moment(startDate).add(task.durationInDays + task.startFromDay, 'days');\r\n }\r\n\r\n\r\n var ganttItem = {\r\n id: task.identifier,\r\n name: task.name,\r\n content: '{{row.model.name}} ',\r\n tasks: [{ name: task.name, from: startDate, to: endDate, color: colors[color], progress: { percent: 0, color: '#3C8CF8' } }],\r\n };\r\n\r\n if (task.promotionTaskPreviousId != null) {\r\n //TODO: esto no está funcando\r\n ganttItem.tasks[0].dependencies = [{ from: task.promotionTaskPreviousId }];\r\n }\r\n\r\n if (task.isStartMilestone) {\r\n self.startPromotionDate = startDate;\r\n }\r\n\r\n if (ganttItem.tasks[0].from != null && ganttItem.tasks[0].to != null) {\r\n ganttdataitems.push(ganttItem);\r\n itemsLeft.splice(itemsLeft.indexOf(task), 1);\r\n }\r\n });\r\n }\r\n\r\n\r\n\r\n self.ganttdata = ganttdataitems;\r\n\r\n /*\r\n self.ganttdata = [\r\n // Order is optional. If not specified it will be assigned automatically\r\n {\r\n name: 'Milestones', height: '3em', sortable: false, drawTask: false, classes: 'gantt-row-milestone', color: '#45607D', tasks: [\r\n // Dates can be specified as string, timestamp or javascript date object. The data attribute can be used to attach a custom object\r\n { name: 'Kickoff', color: '#93C47D', from: '2013-10-07T09:00:00', to: '2013-10-07T10:00:00', data: 'Can contain any custom data or object' },\r\n { name: 'Concept approval', color: '#93C47D', from: new Date(2013, 9, 18, 18, 0, 0), to: new Date(2013, 9, 18, 18, 0, 0), est: new Date(2013, 9, 16, 7, 0, 0), lct: new Date(2013, 9, 19, 0, 0, 0) },\r\n { name: 'Development finished', color: '#93C47D', from: new Date(2013, 10, 15, 18, 0, 0), to: new Date(2013, 10, 15, 18, 0, 0) },\r\n { name: 'Shop is running', color: '#93C47D', from: new Date(2013, 10, 22, 12, 0, 0), to: new Date(2013, 10, 22, 12, 0, 0) },\r\n { name: 'Go-live', color: '#93C47D', from: new Date(2013, 10, 29, 16, 0, 0), to: new Date(2013, 10, 29, 16, 0, 0) }\r\n ], data: 'Can contain any custom data or object'\r\n },\r\n {\r\n name: 'Status meetings', tasks: [\r\n { name: 'Demo #1', color: '#9FC5F8', from: new Date(2013, 9, 25, 15, 0, 0), to: new Date(2013, 9, 25, 18, 30, 0) },\r\n { name: 'Demo #2', color: '#9FC5F8', from: new Date(2013, 10, 1, 15, 0, 0), to: new Date(2013, 10, 1, 18, 0, 0) },\r\n { name: 'Demo #3', color: '#9FC5F8', from: new Date(2013, 10, 8, 15, 0, 0), to: new Date(2013, 10, 8, 18, 0, 0) },\r\n { name: 'Demo #4', color: '#9FC5F8', from: new Date(2013, 10, 15, 15, 0, 0), to: new Date(2013, 10, 15, 18, 0, 0) },\r\n { name: 'Demo #5', color: '#9FC5F8', from: new Date(2013, 10, 24, 9, 0, 0), to: new Date(2013, 10, 24, 10, 0, 0) }\r\n ]\r\n },\r\n {\r\n name: 'Kickoff', movable: { allowResizing: false }, tasks: [\r\n {\r\n name: 'Day 1', color: '#9FC5F8', from: new Date(2013, 9, 7, 9, 0, 0), to: new Date(2013, 9, 7, 17, 0, 0),\r\n progress: { percent: 100, color: '#3C8CF8' }, movable: false\r\n },\r\n {\r\n name: 'Day 2', color: '#9FC5F8', from: new Date(2013, 9, 8, 9, 0, 0), to: new Date(2013, 9, 8, 17, 0, 0),\r\n progress: { percent: 100, color: '#3C8CF8' }\r\n },\r\n {\r\n name: 'Day 3', color: '#9FC5F8', from: new Date(2013, 9, 9, 8, 30, 0), to: new Date(2013, 9, 9, 12, 0, 0),\r\n progress: { percent: 100, color: '#3C8CF8' }\r\n }\r\n ]\r\n },\r\n {\r\n name: 'Create concept', tasks: [\r\n {\r\n name: 'Create concept', priority: 20, content: ' {{task.model.name}}', color: '#F1C232', from: new Date(2013, 9, 10, 8, 0, 0), to: new Date(2013, 9, 16, 18, 0, 0), est: new Date(2013, 9, 8, 8, 0, 0), lct: new Date(2013, 9, 18, 20, 0, 0),\r\n progress: 100\r\n }\r\n ]\r\n },\r\n {\r\n name: 'Finalize concept', tasks: [\r\n {\r\n id: 'Finalize concept', name: 'Finalize concept', priority: 10, color: '#F1C232', from: new Date(2013, 9, 17, 8, 0, 0), to: new Date(2013, 9, 18, 18, 0, 0),\r\n progress: 100\r\n }\r\n ]\r\n },\r\n { name: 'Development', children: ['Sprint 1', 'Sprint 2', 'Sprint 3', 'Sprint 4'], content: ' {{row.model.name}}' },\r\n {\r\n name: 'Sprint 1', tooltips: false, tasks: [\r\n {\r\n id: 'Product list view', name: 'Product list view', color: '#F1C232', from: new Date(2013, 9, 21, 8, 0, 0), to: new Date(2013, 9, 25, 15, 0, 0),\r\n progress: 25, dependencies: [{ to: 'Order basket' }, { from: 'Finalize concept' }]\r\n }\r\n ]\r\n },\r\n {\r\n name: 'Sprint 2', tasks: [\r\n {\r\n id: 'Order basket', name: 'Order basket', color: '#F1C232', from: new Date(2013, 9, 28, 8, 0, 0), to: new Date(2013, 10, 1, 15, 0, 0),\r\n dependencies: { to: 'Checkout' }\r\n }\r\n ]\r\n },\r\n {\r\n name: 'Sprint 3', tasks: [\r\n {\r\n id: 'Checkout', name: 'Checkout', color: '#F1C232', from: new Date(2013, 10, 4, 8, 0, 0), to: new Date(2013, 10, 8, 15, 0, 0),\r\n dependencies: { to: 'Login & Signup & Admin Views' }\r\n }\r\n ]\r\n },\r\n {\r\n name: 'Sprint 4', tasks: [\r\n {\r\n id: 'Login & Signup & Admin Views', name: 'Login & Signup & Admin Views', color: '#F1C232', from: new Date(2013, 10, 11, 8, 0, 0), to: new Date(2013, 10, 15, 15, 0, 0),\r\n dependencies: [{ to: 'HW' }, { to: 'SW / DNS/ Backups' }]\r\n }\r\n ]\r\n },\r\n { name: 'Hosting' },\r\n {\r\n name: 'Setup', tasks: [\r\n { id: 'HW', name: 'HW', color: '#F1C232', from: new Date(2013, 10, 18, 8, 0, 0), to: new Date(2013, 10, 18, 12, 0, 0) }\r\n ]\r\n },\r\n {\r\n name: 'Config', tasks: [\r\n { id: 'SW / DNS/ Backups', name: 'SW / DNS/ Backups', color: '#F1C232', from: new Date(2013, 10, 18, 12, 0, 0), to: new Date(2013, 10, 21, 18, 0, 0) }\r\n ]\r\n },\r\n { name: 'Server', parent: 'Hosting', children: ['Setup', 'Config'] },\r\n {\r\n name: 'Deployment', parent: 'Hosting', tasks: [\r\n { name: 'Depl. & Final testing', color: '#F1C232', from: new Date(2013, 10, 21, 8, 0, 0), to: new Date(2013, 10, 22, 12, 0, 0), 'classes': 'gantt-task-deployment' }\r\n ]\r\n },\r\n {\r\n name: 'Workshop', tasks: [\r\n { name: 'On-side education', color: '#F1C232', from: new Date(2013, 10, 24, 9, 0, 0), to: new Date(2013, 10, 25, 15, 0, 0) }\r\n ]\r\n },\r\n {\r\n name: 'Content', tasks: [\r\n { name: 'Supervise content creation', color: '#F1C232', from: new Date(2013, 10, 26, 9, 0, 0), to: new Date(2013, 10, 29, 16, 0, 0) }\r\n ]\r\n },\r\n {\r\n name: 'Documentation', tasks: [\r\n { name: 'Technical/User documentation', color: '#F1C232', from: new Date(2013, 10, 26, 8, 0, 0), to: new Date(2013, 10, 28, 18, 0, 0) }\r\n ]\r\n }\r\n ];\r\n \r\n */\r\n }\r\n\r\n function countGanttTasks(ganttdataitems) {\r\n var count = 0;\r\n angular.forEach(ganttdataitems, function (ganttitem, i) {\r\n //cuenta solo tasks sin tomar en cuenta los grupos\r\n if (ganttitem.tasks && !ganttitem.children) {\r\n count++;\r\n }\r\n });\r\n\r\n return count;\r\n }\r\n\r\n //Esta funcion revisa si ya esta cargada la tarea HITO, sino no deja guardar el proceso.\r\n self.hasStartMilestoneTask = function () {\r\n var hasStartMilestoneTask = false;\r\n\r\n if (self.workflow && self.workflow.tasks) {\r\n angular.forEach(self.workflow.tasks, function (task) {\r\n if (task.isStartMilestone)\r\n hasStartMilestoneTask = true;\r\n });\r\n }\r\n\r\n return hasStartMilestoneTask;\r\n }\r\n\r\n self.addTask = function () {\r\n if (!self.workflowtask.added) {\r\n\r\n var index = 1;\r\n angular.forEach(self.workflow.tasks, function (task) { if (task.promotionTaskId == self.workflowtask.promotionTaskId) index++; });\r\n if (index > 1) {\r\n self.workflowtask.name += ian.format(\"({0})\", index);\r\n }\r\n //setea un task.identifier para diferenciar tareas que procedan de un mismo promotionTaskId\r\n self.workflowtask.identifier = self.workflowtask.name; //ian.format(\"{0}-{1}\", self.workflowtask.promotionTaskId, index);\r\n\r\n\r\n self.workflowtask.added = true;\r\n self.workflow.tasks.push(self.workflowtask);\r\n }\r\n\r\n self.hasStartMilestoneTask();\r\n\r\n redrawGantt();\r\n\r\n //Cierro el Dialog\r\n ngDialog.close();\r\n }\r\n\r\n self.editTask = function (workflowtask) {\r\n\r\n //Limpio las tareas previas porque las vuelvo a generar.\r\n self.previousTasks = [];\r\n\r\n if (workflowtask == null) {\r\n self.workflowtask = {\r\n durationInDays: 0,\r\n userArea: '',\r\n startFromDay: 0,\r\n id: 0,\r\n promotionWorkflowId: 0,\r\n promotionTaskId: 0,\r\n name: '',\r\n groupName: '',\r\n promotionTaskPreviousId: null,\r\n isRequired: false,\r\n added: false,\r\n identifier: null,\r\n previousIdentifier: null\r\n }\r\n }\r\n else {\r\n self.workflowtask = workflowtask;\r\n }\r\n\r\n var childTasks = [];\r\n\r\n angular.forEach(self.workflow.tasks, function (task) {\r\n\r\n //Agrego a previousTasks este tipo de tarea\r\n if (self.workflowtask.identifier != task.identifier) {\r\n self.previousTasks.push({ id: task.promotionTaskId, name: task.name, identifier: task.identifier });\r\n }\r\n\r\n //Agrego a la coleccion de childtasks las tareas cuyo padre es la tarea que estoy editando para quitarlas luego del combo de previous tasks (una tarea no puede ser padre e hija de una misma tarea)\r\n if (task.previousIdentifier != null && self.workflowtask.identifier != null && self.workflowtask.identifier == task.previousIdentifier) {\r\n childTasks.push(task);\r\n }\r\n });\r\n\r\n //Quito las childtasks de las previoustasks\r\n angular.forEach(childTasks, function (childTask) {\r\n angular.forEach(self.previousTasks, function (previousTask, i) {\r\n if (childTask.identifier == previousTask.identifier)\r\n self.previousTasks.splice(i, 1);\r\n });\r\n });\r\n\r\n ngDialog.open({\r\n template: 'editTaskDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n //data: task,\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.save = function () {\r\n\r\n if (self.workflow.promotionMediaType != null && self.workflow.promotionType != null) {\r\n\r\n if (self.workflow != null) {\r\n swal({\r\n title: 'Esta seguro que desea guardar el Proceso Promocional?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n promotionsService.workflows.saveWorkflow(self.workflow)\r\n .then(function (workflow) {\r\n swal('Proceso promocional Guardado!', 'El proceso promocional ' + self.workflow.name + ' se ha guardado exitosamente', 'success');\r\n self.workflow = workflow;\r\n console.log(self.workflow.id);\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al guardar este proceso promocional\", \"error\");\r\n }\r\n });\r\n }\r\n\r\n });\r\n }\r\n }\r\n else\r\n swal(\"Error\", \"Debe completar el tipo de medio y tipo de promocion.\", \"error\");\r\n\r\n }\r\n\r\n function init() {\r\n loadWorkflow();\r\n loadTasks();\r\n isWorkflowInUse();\r\n }\r\n\r\n\r\n init();\r\n\r\n });","angular.module(\"prisma\")\r\n .controller(\"supplyingCtrl\", function ($scope, $rootScope, $state, $stateParams, promotionsService, serverService, Upload, authService, $timeout, ngDialog, $filter, $window) {\r\n\r\n var self = this;\r\n\r\n self.task = null;\r\n self.link = '';\r\n self.linkStore = '';\r\n self.linkItem = '';\r\n\r\n self.canPublishSuplying = authService.hasPermission('promotion_publish_Abastecimiento');\r\n\r\n self.publish = function () {\r\n if ($stateParams.taskId) {\r\n promotionsService.tasks.publishTask($stateParams.taskId)\r\n .then(function (isOk) {\r\n swal('Tarea Publicada!', 'La tarea se ha publicado exitosamente', 'success');\r\n\r\n $state.go('promotions.myTasks');\r\n });\r\n } else {\r\n $timeout(function () {\r\n swal(\"Error\", \"no se pudo publicar la tarea\", \"error\");\r\n }, 100);\r\n }\r\n }\r\n\r\n self.openDownloadDialog = function()\r\n {\r\n ngDialog.open({\r\n template: 'downloadDialog',\r\n className: 'ngdialog-theme-default',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.generateAndDownloadItems = function () {\r\n self.isLoading = true;\r\n var promotionId = (self.task && self.task.promotionId) ? self.task.promotionId : self.selectedPromotion.id;\r\n\r\n promotionsService.reports.buildItemTasksReport(promotionId)\r\n\r\n .then(function (link) {\r\n self.linkItem = link;\r\n self.showSwalWithLink(link);\r\n self.isLoading = false;\r\n });\r\n\r\n\r\n }\r\n\r\n self.generateAndDownloadStores = function () {\r\n self.isLoading = true;\r\n var promotionId = (self.task && self.task.promotionId) ? self.task.promotionId : self.selectedPromotion.id;\r\n promotionsService.reports.buildItemStoreReport(promotionId)\r\n .then(function (link) {\r\n self.linkStore = link;\r\n self.showSwalWithLink(link);\r\n self.isLoading = false;\r\n });\r\n }\r\n\r\n self.showSwalWithLink = function (link) {\r\n swal({\r\n title: \"Reporte Generado!\",\r\n text: 'Haga click AQUÍ para descargar el archivo',\r\n confirmButtonText: \"Cerrar\",\r\n confirmButtonColor: \"#c2c2c2\",\r\n html: true\r\n });\r\n }\r\n\r\n function ExportToExcel(tableHtml, worksheetName) {\r\n var uri = 'data:application/vnd.ms-excel;base64,',\r\n template = '{table}
',\r\n base64 = function (s) { return $window.btoa(unescape(encodeURIComponent(s))); },\r\n format = function (s, c) { return s.replace(/{(\\w+)}/g, function (m, p) { return c[p]; }) };\r\n\r\n var ctx = { worksheet: worksheetName, table: tableHtml },\r\n href = uri + base64(format(template, ctx));\r\n return href;\r\n }\r\n\r\n self.batchLoad = function () {\r\n\r\n self.currentStep = 1;\r\n self.gridOptions = {\r\n columnDefs: [\r\n {\r\n headerName: 'Severidad',\r\n width: 100,\r\n pinned: 'left',\r\n field: 'severity',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n rowGroupIndex: 0,\r\n cellRenderer: function (params) {\r\n var severityName = '';\r\n switch (params.value) {\r\n case 'Information': { severityName = ' Info'; break; }\r\n case 'Warning': { severityName = ' Warn'; break; }\r\n case 'Error': { severityName = ' Error'; break; }\r\n }\r\n return severityName;\r\n }\r\n },\r\n {\r\n headerName: 'Fila',\r\n width: 50,\r\n pinned: 'left',\r\n field: 'row',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n {\r\n headerName: 'Categoria',\r\n width: 150,\r\n rowGroupIndex: 1,\r\n pinned: 'left',\r\n field: 'category',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n {\r\n headerName: 'Descripcion',\r\n width: 350,\r\n pinned: 'left',\r\n field: 'description',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n ],\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n rowHeight: 35,\r\n suppressHorizontalScroll: false,\r\n suppressCellSelection: true,\r\n groupUseEntireRow: true,\r\n groupSuppressAutoColumn: false,\r\n groupDefaultExpanded: 0,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n angularCompileRows: true,\r\n }\r\n\r\n self.showNextStep = function () {\r\n if (self.currentStep > 0 && self.currentStep < 4) {\r\n self.currentStep++;\r\n loadResults([]);\r\n }\r\n }\r\n\r\n self.downloadExcel = function () {\r\n var html = '';\r\n\r\n //header\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n\r\n angular.forEach($filter('orderBy')(self.promotion.pages), function (page) {\r\n angular.forEach(page.items, function (item) {\r\n if (item.promotionItemType < 4) {//reservados y relacionados no\r\n var chats = \"\";\r\n angular.forEach(page.chats, function (chat) {\r\n if (item.id == chat.promotionItemId)\r\n chats += chat.message + ' |';\r\n });\r\n html += buildRow(item, page, chats);\r\n }\r\n }); \r\n \r\n });\r\n\r\n html += '
PromocionPaginaPosicionDescripcionMaterialUMComentarios AnterioresNuevos Comentarios
';\r\n\r\n var exportHref = ExportToExcel(html, 'Pagina1');\r\n $timeout(function () {\r\n location.href = exportHref;\r\n self.showNextStep();\r\n }, 100);\r\n }\r\n\r\n function buildRow(item, page, chats) {\r\n\r\n var html = '';\r\n\r\n if (item != null) {\r\n var code = item.code != null ? item.code.replace(/^0+/, '') : '';\r\n var uom = item.uom != null ? item.uom : '';\r\n html += '' + self.promotion.name +\r\n '' + page.pageNumber +\r\n '' + item.position +\r\n '' + item.description +\r\n '' + code +\r\n '' + uom +\r\n '' + chats +\r\n '' + '' + \r\n '';\r\n }\r\n return html;\r\n }\r\n\r\n self.uploadFile = function (files) {\r\n if (files && files.length > 0) {\r\n self.isBusy = true;\r\n var url = serverService.getApiUrl() + '/promotion/items/uploadChatsBatchFile';\r\n Upload.upload({\r\n url: url,\r\n data: { file: files[0] }\r\n }).then(function (response) {\r\n self.guid = response.data;\r\n self.isBusy = false;\r\n self.finishedUpload = true;\r\n });\r\n }\r\n }\r\n\r\n self.validateUploadedFile = function () {\r\n promotionsService.items.validateChatsBatchFile(self.guid, $stateParams.promotionId)\r\n .then(function (dto) {\r\n processImporterResults(dto);\r\n if (!anyError(dto)) {\r\n self.finishedValidation = true;\r\n }\r\n });\r\n\r\n }\r\n\r\n self.reUploadFile = function () {\r\n self.currentStep = 2;\r\n loadResults([]);\r\n self.files = null;\r\n self.finishedUpload = false;\r\n self.finishedValidation = false;\r\n self.finishedUpdate = false;\r\n }\r\n\r\n self.updateItems = function () {\r\n promotionsService.items.updateChatsInBatch(self.guid, $stateParams.promotionId)\r\n .then(function (dto) {\r\n processImporterResults(dto);\r\n if (!anyError(dto)) {\r\n self.finishedUpdate = true;\r\n }\r\n });\r\n\r\n }\r\n\r\n self.finish = function () {\r\n self.currentStep = 1;\r\n loadResults([]);\r\n\r\n self.finishedUpload = false;\r\n self.finishedValidation = false;\r\n self.finishedUpdate = false;\r\n\r\n ngDialog.close();\r\n\r\n loadPromotion();\r\n }\r\n\r\n function processImporterResults(importerResults) {\r\n self.isBusy = false;\r\n self.isBusy2 = false;\r\n self.isBusy3 = false;\r\n self.isBusy4 = false;\r\n\r\n if (importerResults.length > 0) {\r\n loadResults(importerResults);\r\n }\r\n if (anyError(importerResults)) {\r\n self.error = true;\r\n }\r\n else\r\n self.error = false;\r\n }\r\n\r\n function loadResults(results) {\r\n self.gridOptions.api.setRowData(results);\r\n self.gridOptions.api.refreshView();\r\n\r\n self.gridVisible = results.length > 0 ? true : false;\r\n }\r\n\r\n function anyError(importerResults) {\r\n var error = false;\r\n for (var i = 0; i < importerResults.length; i++) {\r\n if (importerResults[i].severity === 'Error')\r\n error = true;\r\n }\r\n\r\n return error;\r\n }\r\n\r\n ngDialog.open({\r\n template: 'batchLoadDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n controller: function () {\r\n return self;\r\n },\r\n controllerAs: 'ct',\r\n });\r\n }\r\n\r\n function init() {\r\n promotionsService.tasks.startTask($stateParams.taskId);\r\n promotionsService.tasks.getTask($stateParams.taskId)\r\n .then(function (task) {\r\n self.task = task;\r\n });\r\n\r\n promotionsService.promotions.getPromotionPagesItems($stateParams.promotionId)\r\n .then(function (promotion) {\r\n self.promotion = promotion;\r\n });\r\n \r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"storeControlAndExhibitionCtrl\", function ($scope, $rootScope, $state, $stateParams, promotionsService, $timeout, ngDialog) {\r\n\r\n var self = this;\r\n\r\n self.task = null;\r\n self.link = '';\r\n\r\n self.publish = function () {\r\n if ($stateParams.taskId) {\r\n promotionsService.tasks.publishTask($stateParams.taskId)\r\n .then(function (isOk) {\r\n swal('Tarea Publicada!', 'La tarea se ha publicado exitosamente', 'success');\r\n\r\n $state.go('promotions.myTasks');\r\n });\r\n } else {\r\n $timeout(function () {\r\n swal(\"Error\", \"no se pudo publicar la tarea\", \"error\");\r\n }, 100);\r\n }\r\n }\r\n\r\n self.generateAndDownload = function () {\r\n promotionsService.reports.buildItemStoreReport(self.task.promotionId)\r\n .then(function (link) {\r\n self.link = link;\r\n self.showSwalWithLink();\r\n });\r\n }\r\n\r\n self.showSwalWithLink = function () {\r\n swal({\r\n title: \"Reporte Generado!\",\r\n text: 'Haga click AQUÍ para descargar el archivo',\r\n confirmButtonText: \"Cerrar\",\r\n confirmButtonColor: \"#c2c2c2\",\r\n html: true\r\n });\r\n }\r\n\r\n function init() {\r\n promotionsService.tasks.startTask($stateParams.taskId);\r\n promotionsService.tasks.getTask($stateParams.taskId)\r\n .then(function (task) {\r\n self.task = task;\r\n });\r\n\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"promotionRulesCtrl\", function ($scope, promotionsService) {\r\n var self = this;\r\n \r\n self.rules = [];\r\n self.selectedCategories = [];\r\n self.selectedBrands = [];\r\n self.selectedMediaTypes = [];\r\n self.selectedPageTypes = [];\r\n self.selectedItemTypes = [];\r\n\r\n self.isLoading = true;\r\n \r\n self.setCategories = function () {\r\n self.categories = self.ruleParams.categories.filter(function (x) { return x.level == 4 && x.parentId == self.selectedCategoriesGroup.categoryId });\r\n } \r\n\r\n self.delete = function (rule) {\r\n\r\n swal({\r\n title: 'Esta seguro que desea borrar la Regla ' + rule.id + ' ?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n }, function (isConfirm) {\r\n if (isConfirm) {\r\n promotionsService.rules.deleteRule(rule.id).then(function () {\r\n swal('Regla Borrada!', 'La Regla ' + rule.id + ' se ha borrado exitosamente', 'success');\r\n var ix = self.rules.indexOf(rule);\r\n self.rules.splice(ix, 1);\r\n }, function () { swal('Hubo un error', 'Ocurrio un error intentando borrar la regla', 'error'); });\r\n }\r\n });\r\n \r\n }\r\n\r\n self.getRules = function () {\r\n self.isLoading = true;\r\n\r\n var categoriesIds = [];\r\n //seteo el total de categorias para filtrar\r\n if (self.selectedCategories.length > 0)\r\n categoriesIds = self.selectedCategories.map(function (x) { return x.categoryId });\r\n else\r\n categoriesIds = self.ruleParams.categories.filter(function (x) { return x.level == 4 && x.parentId == self.selectedCategoriesGroup.categoryId }).map(function (x) { return x.categoryId });\r\n\r\n if (self.selectedBrands.length == 0)\r\n self.selectedBrands = self.ruleParams.brands;\r\n if (self.selectedMediaTypes.length == 0)\r\n self.selectedMediaTypes = self.ruleParams.mediaTypes;\r\n if (self.selectedPageTypes.length == 0)\r\n self.selectedPageTypes = self.ruleParams.pageTypes;\r\n if (self.selectedItemTypes.length == 0)\r\n self.selectedItemTypes = self.ruleParams.itemTypes;\r\n\r\n var filters = {\r\n categoriesIds: categoriesIds,\r\n ruleTypes: self.selectedRuleTypes,\r\n brandsIds: self.selectedBrands.map(function (x) { return x.id }),\r\n mediaTypes: self.selectedMediaTypes,\r\n pageTypes: self.selectedPageTypes,\r\n itemTypes: self.selectedItemTypes\r\n }\r\n promotionsService.rules.getRulesFiltered(filters)\r\n .then(function (rules) {\r\n self.rules = rules;\r\n promotionsService.rules.extendRules(self.rules);\r\n self.isLoading = false;\r\n });\r\n }\r\n\r\n\r\n function init() {\r\n\r\n promotionsService.rules.getRuleParams().then(function (ruleParams) {\r\n self.ruleParams = ruleParams;\r\n\r\n self.categoriesGroups = self.ruleParams.categories.filter(function (x) { return x.level == 3 });\r\n\r\n self.isLoading = false;\r\n\r\n });\r\n }\r\n \r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"editPromotionRuleCtrl\", function ($scope, $state, $stateParams, promotionsService, ngDialog) {\r\n\r\n var self = this;\r\n\r\n self.isLoading = true;\r\n self.ruleParams = null;\r\n self.rule = null;\r\n self.selectedCategoriesGroup = null;\r\n self.selectedCategories = [];\r\n self.competitors = [];\r\n\r\n self.getSelectedCategoriesNames = function () {\r\n return self.selectedCategories.map(function (x) { return x.categoryName }).join('|');\r\n }\r\n\r\n self.openCategoriesDialog = function () {\r\n\r\n var newScope = $scope.$new();\r\n var lastCategoriesGroup = self.selectedCategoriesGroup;\r\n var lastCategories = self.selectedCategories;\r\n\r\n newScope.categoriesGroups = self.ruleParams.categories.filter(function (x) { return x.level == 3 });\r\n\r\n if (self.selectedCategoriesGroup)\r\n newScope.categories = self.ruleParams.categories.filter(function (x) { return x.level == 4 && x.parentId == self.selectedCategoriesGroup.categoryId });\r\n else\r\n newScope.categories = self.ruleParams.categories.filter(function (x) { return x.level == 4 });\r\n\r\n newScope.setCategories = function () {\r\n newScope.categories = self.ruleParams.categories.filter(function (x) { return x.level == 4 && x.parentId == self.selectedCategoriesGroup.categoryId });\r\n } \r\n\r\n newScope.accept = function () {\r\n ngDialog.close();\r\n }\r\n\r\n newScope.cancel = function () { \r\n self.selectedCategoriesGroup = lastCategoriesGroup;\r\n self.selectedCategories = lastCategories;\r\n ngDialog.close();\r\n }\r\n \r\n\r\n ngDialog.open({\r\n template: 'categoriesDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n }\r\n\r\n self.canSave = function () {\r\n var can = true;\r\n\r\n if (!self.rule) {\r\n can = false;\r\n }\r\n else {\r\n if (self.rule.id != 0)\r\n can = false;\r\n if (!self.selectedCategoriesGroup)\r\n can = false;\r\n if (!self.rule.comparesTo)\r\n can = false;\r\n if (!self.rule.comparisonType)\r\n can = false;\r\n if (!self.rule.percentage && self.rule.comparisonType != \"Equals\")\r\n can = false;\r\n if (self.rule.comparesTo == 'SpecificCompetitor' && !self.rule.competitorId)\r\n can = false;\r\n if (self.rule.isExternal && !self.rule.competitorGroupId)\r\n can = false;\r\n if (self.rule.comparesTo == 'CompetitionMode' && (!self.rule.modeRepeatTimes || !self.rule.modeType))\r\n can = false;\r\n if (!self.rule.brandId)\r\n can = false;\r\n if (self.rule.comparisonType == \"Equals\")\r\n self.rule.percentage = 0;\r\n }\r\n\r\n return can;\r\n }\r\n\r\n self.save = function () {\r\n //seteo el total de categorias al dto antes de guardar\r\n if (self.selectedCategories.length > 0)\r\n self.rule.categoriesIds = self.selectedCategories.map(function (x) { return x.categoryId });\r\n else\r\n self.rule.categoriesIds = self.ruleParams.categories.filter(function (x) { return x.level == 4 && x.parentId == self.selectedCategoriesGroup.categoryId }).map(function (x) { return x.categoryId });\r\n\r\n swal({\r\n title: 'Guardar Regla',\r\n text: 'Se generará una regla por cada categoría.',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Aceptar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: true,\r\n closeOnCancel: true\r\n }, function (isConfirm) {\r\n if (isConfirm) {\r\n //si no completo los campos significa todos\r\n if (self.rule.mediaTypes.length == 0)\r\n self.rule.mediaTypes = self.ruleParams.mediaTypes;\r\n if (self.rule.pageTypes.length == 0)\r\n self.rule.pageTypes = self.ruleParams.pageTypes;\r\n if (self.rule.itemTypes.length == 0)\r\n self.rule.itemTypes = self.ruleParams.itemTypes;\r\n\r\n promotionsService.rules.getExistingRules(self.rule).then(function (existingRules) {\r\n if (existingRules && existingRules.length > 0) {\r\n\r\n swal('No se puede crear la Regla'\r\n , ian.format('Está intentando crear una regla que ya existe.')\r\n , 'error'); \r\n\r\n }\r\n else {\r\n self.saving = true;\r\n doSave();\r\n \r\n \r\n }\r\n });\r\n }\r\n });\r\n \r\n }\r\n\r\n self.onChangeRuleType = function () {\r\n self.rule.compareTo = null;\r\n self.rule.percentage = null;\r\n self.rule.comparisonType = null;\r\n self.rule.competitor = null;\r\n self.rule.competitorId = null;\r\n self.rule.competitorGroup = null;\r\n self.rule.competitorGroupId = null;\r\n self.rule.modeRepeatTimes = null;\r\n }\r\n\r\n self.getCompareToDescription = function (compareTo) {\r\n //internas\r\n if (compareTo == 'NetworkMinimal') return 'Minimo Cadena';\r\n if (compareTo == 'Normal') return 'Normal ZB';\r\n if (compareTo == 'Active') return 'Vigente ZB';\r\n if (compareTo == 'NormalAverage') return 'Promedio Normal';\r\n if (compareTo == 'ActiveAverage') return 'Promedio Vigente';\r\n\r\n //externas\r\n if (compareTo == 'CompetitionLowest') return 'Competencia mas baja';\r\n if (compareTo == 'CompetitionAverage') return 'Competencia Promedio';\r\n if (compareTo == 'SpecificCompetitor') return 'Competidor Especifico';\r\n if (compareTo == 'CompetitionMode') return 'Moda';\r\n }\r\n \r\n self.getModeTypeDescription = function (type) {\r\n switch (type) {\r\n case 'HighestMode': return 'Precio mas Repetido';\r\n break;\r\n case 'MinimumPrice': return 'Precio mas Bajo';\r\n break;\r\n case 'AveragePrice': return 'Precio Promedio';\r\n break;\r\n case 'MaximumPrice': return 'Precio mas Alto';\r\n break;\r\n }\r\n\r\n }\r\n\r\n //$scope.$watch('ct.rule.category', function (newVal, oldVal) {\r\n // if (newVal) {\r\n // self.rule.category = newVal;\r\n // self.rule.categoryId = newVal.categoryId;\r\n // self.rule.categoryName = newVal.categoryName;\r\n // }\r\n //});\r\n\r\n $scope.$watch('ct.rule.competitor', function (newVal, oldVal) {\r\n if (newVal) {\r\n self.rule.competitor = newVal;\r\n self.rule.competitorId = newVal.id;\r\n }\r\n });\r\n $scope.$watch('ct.rule.competitorGroup', function (newVal, oldVal) {\r\n if (newVal) {\r\n self.rule.competitorGroup = newVal;\r\n self.rule.competitorGroupId = newVal.id;\r\n self.competitors = self.ruleParams.competitors.filter(function (c) {\r\n return c.competitorsGroupsIds.includes(newVal.id);\r\n });\r\n }\r\n });\r\n\r\n self.mediaTypeOnChange = function () {\r\n self.mediaTypes = self.rule.mediaTypes.join(',');\r\n }\r\n self.pageTypeOnChange = function () {\r\n self.pageTypes = self.rule.pageTypes.join(',');\r\n }\r\n self.itemTypeOnChange = function () {\r\n self.itemTypes = self.rule.itemTypes.join(',');\r\n }\r\n\r\n self.cleanInput = function (){\r\n self.rule.percentage = null;\r\n }\r\n\r\n function doSave() {\r\n promotionsService.rules.saveRule(self.rule).then(function (savedRule) {\r\n swal('Regla Guardada', 'La regla fue guardada con exito.', 'success');\r\n self.saving = false;\r\n $state.go('promotions.rules');\r\n });\r\n }\r\n\r\n function init() {\r\n promotionsService.rules.getRuleParams().then(function (ruleParams) {\r\n self.ruleParams = ruleParams;\r\n self.competitors = ruleParams.competitors;\r\n\r\n if ($stateParams.promotionRuleId > 0) {\r\n promotionsService.rules.getRule($stateParams.promotionRuleId).then(function (rule) {\r\n\r\n promotionsService.rules.extendRules([rule]);\r\n\r\n self.rule = rule;\r\n\r\n self.mediaTypes = rule.mediaTypes.join(',');\r\n self.pageTypes = rule.pageTypes.join(',');\r\n self.itemTypes = rule.itemTypes.join(',');\r\n\r\n //select category\r\n angular.forEach(self.ruleParams.categories, function (cat) {\r\n if (cat.categoryId == self.rule.categoryId)\r\n self.rule.category = cat;\r\n });\r\n\r\n //select competitor\r\n if (self.rule.competitorId) {\r\n angular.forEach(self.ruleParams.competitors, function (comp) {\r\n if (comp.id == self.rule.competitorId)\r\n self.rule.competitor = comp;\r\n });\r\n }\r\n //select competitorGroup\r\n if (self.rule.competitorGroupId) {\r\n angular.forEach(self.ruleParams.competitorGroups, function (g) {\r\n if (g.id == self.rule.competitorGroupId)\r\n self.rule.competitorGroup = g;\r\n });\r\n }\r\n\r\n //select modeType\r\n self.rule.modeType = self.rule.modeTypeDescription;\r\n \r\n\r\n self.isLoading = false;\r\n });\r\n }\r\n else {\r\n self.isLoading = false;\r\n\r\n self.rule = {\r\n id: 0,\r\n isExternal: false,\r\n mediaTypes: [],\r\n pageTypes: [],\r\n itemTypes: []\r\n };\r\n\r\n\r\n promotionsService.rules.extendRules([self.rule]);\r\n\r\n }\r\n\r\n\r\n });\r\n\r\n\r\n }\r\n\r\n init();\r\n\r\n });","angular.module(\"prisma\")\r\n .controller(\"reviewTradeAgreementsCtrl\", function ($scope, $rootScope, $state, $stateParams, promotionsService, $timeout, ngDialog, authService) {\r\n\r\n var self = this;\r\n\r\n self.task = null;\r\n self.link = '';\r\n\r\n self.canPublishTradeAgreements = authService.hasPermission('promotion_publish_RevisionAcuerdosComerciales');\r\n\r\n self.publish = function () {\r\n if ($stateParams.taskId) {\r\n promotionsService.tasks.publishTask($stateParams.taskId)\r\n .then(function (isOk) {\r\n swal('Tarea Publicada!', 'La tarea se ha publicado exitosamente', 'success');\r\n\r\n $state.go('promotions.myTasks');\r\n });\r\n } else {\r\n $timeout(function () {\r\n swal(\"Error\", \"no se pudo publicar la tarea\", \"error\");\r\n }, 100);\r\n }\r\n }\r\n\r\n self.generateAndDownload = function () {\r\n promotionsService.reports.buildItemTasksReport(self.task.promotionId)\r\n .then(function (link) {\r\n self.link = link;\r\n self.showSwalWithLink();\r\n });\r\n }\r\n\r\n self.showSwalWithLink = function () {\r\n swal({\r\n title: \"Reporte Generado!\",\r\n text: 'Haga click AQUÍ para descargar el archivo',\r\n confirmButtonText: \"Cerrar\",\r\n confirmButtonColor: \"#c2c2c2\",\r\n html: true\r\n });\r\n }\r\n\r\n function init() {\r\n promotionsService.tasks.startTask($stateParams.taskId);\r\n promotionsService.tasks.getTask($stateParams.taskId)\r\n .then(function (task) {\r\n self.task = task;\r\n });\r\n\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .filter('startFrom', function () {\r\n return function (input, start) {\r\n start = +start; //parse to int\r\n if (input != null) {\r\n return input.slice(start);\r\n }\r\n }\r\n })\r\n .controller(\"reportsCtrl\", function ($scope, $rootScope, $state, $stateParams, promotionsService, homeService, adminService, serverService, Upload, authService, $timeout, ngDialog, $filter, $window) {\r\n\r\n var self = this;\r\n\r\n self.totalFilteredPromotions = 1;\r\n self.pageSize = 200;\r\n self.pageNumber = 0;\r\n self.isLoading = false;\r\n self.fromDate = null;\r\n self.toDate = null;\r\n self.date = null;\r\n self.promotionIds = \"\";\r\n self.promotionName = \"\";\r\n self.promotionCreationUsers = \"\";\r\n self.materialCodes = \"\";\r\n self.report = 4;\r\n self.promotionType = 0;\r\n self.promotionMediaTypes = promotionsService.promotionMediaTypes;\r\n self.promotions = null;\r\n self.selectedPromotionMediaType = null;\r\n self.selectedIdsForPromotionReport = [];\r\n self.selectedBrand = null;\r\n self.allPromotionsForReport = false;\r\n\r\n //CATEGORIES\r\n self.categoryAreas = [];\r\n self.categoryDepartments = [];\r\n self.categorySections = [];\r\n self.categories = [];\r\n self.subCategories = [];\r\n self.articleGroups = [];\r\n self.selectedCategoryArea = null;\r\n self.selectedCategoryDepartment = null;\r\n self.selectedCategorySection = null;\r\n self.selectedCategory = null;\r\n self.selectedSubCategory = null;\r\n self.selectedArticleGroup = null;\r\n self.isLoadingCategoryTree = true;\r\n\r\n\r\n self.allReports = [\r\n { id: 1, name: \"Modificación\" },\r\n { id: 2, name: \"Promociones masivas\" },\r\n { id: 3, name: \"Promociones detalles\" },\r\n { id: 4, name: \"Detalle marketing\" },\r\n { id: 5, name: \"Promociones vigentes\"}\r\n ];\r\n self.promotionTypes = [\r\n { id: 0, name: \"Ambas\" },\r\n { id: 1, name: \"Externa\" },\r\n { id: 2, name: \"Interna\" },\r\n ];\r\n self.brands = [\r\n { id: 1, name: \"Wong\" },\r\n { id: 2, name: \"Metro\" },\r\n ];\r\n\r\n //STORE LOOKUP\r\n self.storeLookupText = '';\r\n self.storesInLookup = [];\r\n self.selectedStore = null;\r\n self.loadingLookupStores = false;\r\n self.lookupStoresNoResults = true;\r\n var previousLookupText = '';\r\n\r\n $scope.$watch('ct.storeLookupText', function (newVal, oldVal) {\r\n if (newVal) {\r\n\r\n if (newVal.id) {\r\n self.selectedStore = self.storeLookupText;\r\n }\r\n\r\n if (newVal && newVal != oldVal && (newVal.length >= 3 || (oldVal.length < 3 && newVal.length >= 3)) && newVal != previousLookupText) {\r\n previousLookupText = newVal;\r\n\r\n self.storesInLookup = [{ id: 0, code: '', name: 'Cargando Tiendas con el texto ' + newVal + '...' }];\r\n self.loadingLookupStores = true;\r\n var lookupText = { SearchTerm: newVal };\r\n\r\n homeService.lookups.storesLookup(lookupText)\r\n .then(function (stores) {\r\n self.storesInLookup = stores;\r\n self.loadingLookupStores = false;\r\n if (stores.length > 0)\r\n self.lookupStoresNoResults = false;\r\n else\r\n self.lookupStoresNoResults = true;\r\n });\r\n }\r\n }\r\n\r\n }, true);\r\n\r\n self.deleteAll = function (deleteReport, deletePromotions) {\r\n if (self.report == 5) {\r\n self.date = self.getNextCurrentDay();\r\n } \r\n else {\r\n self.date = null;\r\n }\r\n self.fromDate = null;\r\n self.toDate = null;\r\n self.promotionIds = \"\";\r\n self.promotionName = \"\";\r\n self.promotionCreationUsers = \"\";\r\n self.materialCodes = \"\";\r\n if (deleteReport) {\r\n self.report = null;\r\n }\r\n if (deletePromotions) {\r\n self.promotions = \"\";\r\n }\r\n self.promotionType = 0;\r\n self.selectedPromotionMediaType = null;\r\n self.allPromotionsForReport = false;\r\n self.selectedIdsForPromotionReport = [];\r\n self.storeLookupText = '';\r\n self.selectedStore = null;\r\n self.selectedBrand = null;\r\n self.selectedCategoryArea = null;\r\n self.selectedCategoryDepartment = null;\r\n self.selectedCategorySection = null;\r\n self.selectedCategory = null;\r\n self.selectedSubCategory = null;\r\n self.selectedArticleGroup = null;\r\n }\r\n\r\n self.clearResult = function () {\r\n self.promotions = null;\r\n self.allPromotionsForReport = false;\r\n self.selectedIdsForPromotionReport = [];\r\n }\r\n\r\n self.run = function () {\r\n if (self.fromDate || self.date || self.promotionIds.length) {\r\n if (self.date || self.promotionIds.length || self.maximumDateRange(self.fromDate, self.toDate, 90)) {\r\n self.clearResult();\r\n self.isLoading = true;\r\n var selectedpromotionMediaTypeId = 0;\r\n if (self.selectedPromotionMediaType != null) {\r\n selectedpromotionMediaTypeId = self.selectedPromotionMediaType.id;\r\n }\r\n var filters = {\r\n ids: self.promotionIds,\r\n name: self.promotionName,\r\n creationUsers: self.promotionCreationUsers,\r\n materialCodes: self.materialCodes,\r\n promotionType: self.promotionType,\r\n promotionMediaType: selectedpromotionMediaTypeId,\r\n validFrom: self.fromDate,\r\n validTo: self.toDate,\r\n date: self.date,\r\n brandId: self.selectedBrand ? self.selectedBrand : 0,\r\n storeCode: self.selectedStore ? self.selectedStore.code : '',\r\n subCategoryId: self.selectedSubCategory ? self.selectedSubCategory.id : null,\r\n articleGroupId: self.selectedArticleGroup ? self.selectedArticleGroup.id : null\r\n }\r\n promotionsService.promotions.getPromotionsByReportFilters(filters)\r\n .then(function (promotions) {\r\n self.promotions = promotions;\r\n self.totalFilteredPromotions = self.promotions.length;\r\n self.isLoading = false;\r\n angular.forEach(self.promotions, function (p) {\r\n p.isChecked = false;\r\n });\r\n console.log(self.promotions);\r\n });\r\n }\r\n else {\r\n swal(\"Error\", \"El rango maximo de fecha es de 90 dias\", \"error\");\r\n }\r\n }\r\n else {\r\n swal(\"Error\", \"Debe ingresar al menos una fecha desde o un id.\", \"error\");\r\n }\r\n }\r\n\r\n self.setPromotionForReport = function (promotion) {\r\n if (promotion.isChecked && !self.selectedIdsForPromotionReport.includes(promotion.id)) {\r\n self.selectedIdsForPromotionReport.push(promotion.id);\r\n }\r\n else if (!promotion.isChecked && self.selectedIdsForPromotionReport.includes(promotion.id)) {\r\n var index = self.selectedIdsForPromotionReport.indexOf(promotion.id);\r\n if (index > -1) {\r\n self.selectedIdsForPromotionReport.splice(index, 1);\r\n }\r\n }\r\n }\r\n\r\n self.maximumDateRange = function (validFrom, validTo, rangeDays) {\r\n var rv = true;\r\n var maximumDate = self.addDays(validFrom, rangeDays);\r\n if (validTo == null) {\r\n validTo = new Date();\r\n }\r\n if (validTo > maximumDate) {\r\n rv = false\r\n }\r\n return rv;\r\n }\r\n\r\n self.addDays = function (date, days) {\r\n var result = new Date(date);\r\n result.setDate(result.getDate() + days);\r\n return result;\r\n }\r\n\r\n self.subtractDays = function (date, days) {\r\n var result = new Date(date);\r\n result.setDate(result.getDate() - days);\r\n return result;\r\n }\r\n\r\n self.getNextCurrentDay = function () {\r\n var result = new Date();\r\n result.setDate(result.getDate() + 1);\r\n return result;\r\n }\r\n\r\n self.isValidDateRange = function () {\r\n var result = true;\r\n var today = new Date();\r\n var maximumDate = self.addDays(today, 7);\r\n var minimumDate = self.subtractDays(today, 7);\r\n if (self.date > maximumDate || self.date < minimumDate) {\r\n result = false\r\n }\r\n if (!result) {\r\n self.date = today;\r\n swal(\"Error\", \"El rango de fecha para este reporte es de 1 semana.\", \"error\");\r\n }\r\n }\r\n\r\n self.next = function () {\r\n if (self.allPromotionsForReport) {\r\n self.allPromotionsForReport = false;\r\n angular.forEach(self.promotions, function (p) {\r\n p.isChecked = false;\r\n });\r\n }\r\n $timeout(function () {\r\n if (self.pageNumber + 1 < self.numberOfPages())\r\n self.pageNumber++;\r\n }, 0)\r\n }\r\n\r\n self.previous = function () {\r\n if (self.allPromotionsForReport) {\r\n self.allPromotionsForReport = false;\r\n angular.forEach(self.promotions, function (p) {\r\n p.isChecked = false;\r\n });\r\n }\r\n $timeout(function () {\r\n if (self.pageNumber > 0)\r\n self.pageNumber--;\r\n }, 0)\r\n }\r\n\r\n self.numberOfPages = function () {\r\n return Math.ceil(self.totalFilteredPromotions / self.pageSize);\r\n }\r\n\r\n self.setAllPromotionsForReport = function () {\r\n var promotionIds = [];\r\n var promotions = [];\r\n var rows = document.getElementsByTagName(\"table\")[0].rows;\r\n\r\n angular.forEach(rows, function (r) {\r\n var cell = r.cells[2];\r\n var promotionId = cell.innerHTML;\r\n promotionIds.push(promotionId);\r\n });\r\n\r\n promotionIds.shift(); // Elimino el header ID\r\n\r\n angular.forEach(self.promotions, function (p) {\r\n angular.forEach(promotionIds, function (id) {\r\n if (p.id == parseInt(id)) {\r\n promotions.push(p);\r\n }\r\n });\r\n });\r\n \r\n var doSelect = undefined;\r\n if (self.allPromotionsForReport) {\r\n doSelect = true;\r\n }\r\n else {\r\n doSelect = false;\r\n }\r\n angular.forEach(promotions, function (promotion) {\r\n promotion.isChecked = doSelect;\r\n self.setPromotionForReport(promotion);\r\n });\r\n }\r\n\r\n self.generateReport = function () {\r\n var limit = companyJson.Promotions && companyJson.Promotions.PromotionReportLimit ?\r\n companyJson.Promotions.PromotionReportLimit : 1000;\r\n\r\n if (self.selectedIdsForPromotionReport.length > 0 && self.report != null) {\r\n if (self.report === 3 && self.selectedIdsForPromotionReport.length > limit) {\r\n swal(\"Error\", \"No es posible generar el reporte 'Promociones detalle' para mas de \" + limit + \" ids.\", \"error\");\r\n return;\r\n }\r\n self.isLoading = true;\r\n promotionsService.reports.buildPromotionReport({ report: self.report, promotionIds: self.selectedIdsForPromotionReport })\r\n .then(function (link) {\r\n self.isLoading = false;\r\n window.open(link);\r\n });\r\n }\r\n else {\r\n swal(\"Error\", \"Debe seleccionar al menos un id del listado de promociones y un tipo de reporte.\", \"error\");\r\n } \r\n }\r\n\r\n self.getCategoryTree = function () {\r\n adminService.categories.getCategoryTree()\r\n .then(function (categoryTree) {\r\n self.categoryTree = categoryTree;\r\n self.categoryAreas = categoryTree.filter(function (x) { return x.level == 1 });\r\n self.categoryDepartments = categoryTree.filter(function (x) { return x.level == 2 });\r\n self.categorySections = categoryTree.filter(function (x) { return x.level == 3 });\r\n self.categories = categoryTree.filter(function (x) { return x.level == 4 });\r\n self.subCategories = categoryTree.filter(function (x) { return x.level == 5 });\r\n self.articleGroups = categoryTree.filter(function (x) { return x.level == 6 });\r\n self.isLoadingCategoryTree = false;\r\n });\r\n }\r\n\r\n self.setDepartments = function () {\r\n self.categoryDepartments = self.categoryTree.filter(function (x) { return x.level == 2 && self.selectedCategoryArea && self.selectedCategoryArea.id && x.parentId == self.selectedCategoryArea.id });\r\n } \r\n self.setSections = function () {\r\n self.categorySections = self.categoryTree.filter(function (x) { return x.level == 3 && self.selectedCategoryDepartment && self.selectedCategoryDepartment.id && x.parentId == self.selectedCategoryDepartment.id });\r\n } \r\n self.setCategories = function () {\r\n self.categories = self.categoryTree.filter(function (x) { return x.level == 4 && self.selectedCategorySection && self.selectedCategorySection.id && x.parentId == self.selectedCategorySection.id });\r\n } \r\n self.setSubCategories = function () {\r\n self.subCategories = self.categoryTree.filter(function (x) { return x.level == 5 && self.selectedCategory && self.selectedCategory.id && x.parentId == self.selectedCategory.id });\r\n } \r\n self.setArticleGroups = function () {\r\n self.articleGroups = self.categoryTree.filter(function (x) { return x.level == 6 && self.selectedSubCategory && self.selectedSubCategory.id && x.parentId == self.selectedSubCategory.id });\r\n } \r\n\r\n function init() {\r\n self.getCategoryTree();\r\n }\r\n\r\n init();\r\n\r\n \r\n });","angular.module(\"prisma\")\r\n .controller(\"promotionSearchCtrl\", function ($rootScope, $scope, $timeout, $stateParams, $state, promotionsService) {\r\n var self = this;\r\n\r\n self.isLoadingPromotions = false;\r\n self.promotions = [];\r\n self.validFrom = null;\r\n self.validTo = null;\r\n\r\n self.criterions = [\r\n { name: 'PromocionIds', value: '', ph: 'Ids Promocion' }\r\n , { name: 'Promocion', value: '', ph: 'Nombre Promocion' }\r\n , { name: 'Usuario', value: '', ph: 'Nombre Usuario'}\r\n , { name: 'CodMaterial', value: '', ph: 'Codigo Material'}\r\n , { name: 'NameMaterial', value: '', ph: 'Nombre Material'}\r\n , { name: 'Tienda', value: '', ph: 'Tienda'}\r\n , { name: 'Categoria', value: '', ph: 'Categoria' }\r\n , { name: 'Marca', value: '', ph: 'Marca' }\r\n , { name: 'Fabricante', value: '', ph: 'Fabricante' }\r\n ];\r\n\r\n self.setFiltersInLocalStorage = function () {\r\n var filters = {\r\n 'criterios': self.criterions,\r\n 'validFrom': self.validFrom,\r\n 'validTo': self.validTo,\r\n };\r\n localStorage.setItem('filtros', JSON.stringify(filters));\r\n self.setSearchResultInLocalStorage();\r\n }\r\n\r\n self.setSearchResultInLocalStorage = function () {\r\n var promotions = self.promotions;\r\n localStorage.setItem('promociones', JSON.stringify(promotions));\r\n }\r\n\r\n function getFilters() {\r\n if (localStorage.getItem('filtros') != null) {\r\n var filtersAux = localStorage.getItem('filtros');\r\n var filters = JSON.parse(filtersAux);\r\n\r\n self.criterions = filters.criterios;\r\n self.validFrom = new Date(filters.validFrom);\r\n self.validTo = new Date(filters.validTo);\r\n }\r\n localStorage.removeItem(\"filtros\");\r\n }\r\n\r\n\r\n function getSearchResult() {\r\n if (localStorage.getItem('promociones') != null) {\r\n var promotionstAux = localStorage.getItem('promociones');\r\n var promotions = JSON.parse(promotionstAux);\r\n\r\n self.promotions = promotions;\r\n }\r\n localStorage.removeItem(\"promociones\");\r\n }\r\n\r\n self.advancedSearch = function () {\r\n if (!self.validFrom) { // || !self.validTo) {\r\n swal(\"Error\", \"Debe elegir una fecha Desde\", \"error\");\r\n return;\r\n }\r\n if (!validateTerms()) {\r\n swal(\"Error\", \"Los terminos de busqueda deben tener mas de dos (2) caracteres.\", \"error\");\r\n return;\r\n }\r\n\r\n self.isLoadingPromotions = true;\r\n var dto = {\r\n validFrom: self.validFrom,\r\n validTo: self.validTo,\r\n searchCriterions: self.criterions\r\n }\r\n\r\n promotionsService.promotions.getPromotionsByAdvancedSearch(dto)\r\n .then(function (promotions) {\r\n self.promotions = promotions;\r\n self.isLoadingPromotions = false;\r\n console.log(self.promotions);\r\n });\r\n }\r\n\r\n function validateTerms() {\r\n return self.criterions.some(function (x) { return x.value.length >= 3 }); \r\n }\r\n\r\n function init() {\r\n getFilters();\r\n getSearchResult();\r\n }\r\n\r\n init();\r\n\r\n });","angular.module(\"prisma\")\r\n .controller(\"promotionsCtrl\", function ($rootScope, $scope, $window, $timeout, $stateParams, $state, promotionsService, authService, ngDialog) {\r\n var self = this;\r\n\r\n self.promotions = [];\r\n self.distinctCampaigns = ['Todas'];\r\n self.distinctMediaTypes = ['Todos'];\r\n self.distinctStatus = ['Todas ', 'Activas y Planeadas', 'Activa', 'Historica', 'Planeada'];\r\n self.distinctPromotionTypes = ['Todos', 'Externa', 'Interna', 'Otras'];\r\n self.isLoading = true;\r\n self.hasPermissionOfSuperUser = authService.hasPermission('promotion_superUser');\r\n self.hasPermissionOfExternal = authService.hasPermission('promotion_edit_externalPromotion');\r\n self.hasPermissionOfOther = authService.hasPermission('promotion_edit_otherPromotion');\r\n self.hasPermissionOfInternal = authService.hasPermission('promotion_edit_internalPromotion');\r\n self.search = \"\";\r\n self.selectedFilterForCampaign = 'Todas';\r\n self.selectedFilterForMediaType = 'Todos';\r\n self.selectedFilterForPromotionType = 'Todos';\r\n self.selectedFilterForStatus = 'Activas y Planeadas';\r\n self.selectedFilterForAsigned = 'Todas';\r\n self.selectedFilterForComunicated = 'Todas';\r\n self.selectedFilterForCreated = 'Todos';\r\n self.selectedFilterForModif = 'Todos';\r\n self.searchId = '';\r\n self.hideSearchId = true;\r\n self.pageNumber = 2;\r\n self.pageSize = 50;\r\n self.optionalPromotionId;\r\n\r\n self.promotionMediaIds = [];\r\n pageLoaded = false;\r\n\r\n\r\n $(window).scroll(function () {\r\n if ($(window).scrollTop() + $(window).height() > ($(document).height() * 0.95)) {\r\n if (pageLoaded) {\r\n $timeout(function () {\r\n self.pageNumber++;\r\n }, 0)\r\n }\r\n }\r\n });\r\n\r\n\r\n self.promotionMediaTypes = promotionsService.promotionMediaTypes;\r\n\r\n self.setFiltersInLocalStorage = function () {\r\n var filters = {\r\n 'comunicada': self.selectedFilterForComunicated,\r\n 'asignada': self.selectedFilterForAsigned,\r\n 'ultimaModificacion': self.selectedFilterForModif,\r\n 'creadaPor': self.selectedFilterForCreated,\r\n 'campaña': self.selectedFilterForCampaign,\r\n 'tipoDeMedio': self.selectedFilterForMediaType,\r\n 'tipoDePromocion': self.selectedFilterForPromotionType,\r\n 'estado': self.selectedFilterForStatus,\r\n 'buscador': self.search\r\n };\r\n localStorage.setItem('filtros', JSON.stringify(filters));\r\n }\r\n\r\n self.delete = function (promotionId, promotionName) {\r\n\r\n swal({\r\n title: 'Esta seguro que desea borrar la acción promocional ' + promotionName + ' ?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n\r\n promotionsService.promotions.deletePromotion(promotionId)\r\n .then(function (isOk) {\r\n swal('Promocion Borrada!', 'La promocion ' + promotionName + ' se ha borrado exitosamente', 'success');\r\n loadData();\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de borrado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al borrar esta promocion\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n //Filters\r\n self.myFilter = function (p) {\r\n return self.searchId != ''\r\n || (\r\n (\r\n ((p.promotionCampaignName.toLowerCase().indexOf(self.selectedFilterForCampaign.toLocaleLowerCase()) > -1 || self.selectedFilterForCampaign == \"Todas\")) &&\r\n ((p.promotionMediaTypeName.toLowerCase().indexOf(self.selectedFilterForMediaType.toLocaleLowerCase()) > -1 || self.selectedFilterForMediaType == \"Todos\")) &&\r\n ((p.promotionType.toLowerCase().indexOf(self.selectedFilterForPromotionType.toLocaleLowerCase()) > -1 || self.selectedFilterForPromotionType == \"Todos\")) &&\r\n ((self.selectedFilterForStatus.toLocaleLowerCase().indexOf(p.status.toLowerCase()) > -1 || self.selectedFilterForStatus == \"Todas\")) &&\r\n (((p.createdUserName != null && ((p.createdUserName.indexOf(self.selectedFilterForCreated)) > -1)) || (self.selectedFilterForCreated == \"Todos\"))) &&\r\n (((p.lastModifiedUserName != null && ((p.lastModifiedUserName.indexOf(self.selectedFilterForModif)) > -1)) || (self.selectedFilterForModif == \"Todos\"))) &&\r\n ((((p.taken != null && p.taken) == (self.selectedFilterForAsigned)) || self.selectedFilterForAsigned == \"Todas\")) &&\r\n ((((p.publishedDate != null) == (self.selectedFilterForComunicated)) || self.selectedFilterForComunicated == \"Todas\"))\r\n )\r\n &&\r\n (self.search.length == 0 || (\r\n (p.name && p.name.toLowerCase().indexOf(self.search.toLowerCase()) > -1)\r\n || (p.promotionCampaignName && p.promotionCampaignName.toLowerCase().indexOf(self.search.toLowerCase()) > -1)\r\n || (p.promotionMediaTypeName && p.promotionMediaTypeName.toLowerCase().indexOf(self.search.toLowerCase()) > -1)\r\n || (p.promotionType && p.promotionType.toLowerCase().indexOf(self.search.toLowerCase()) > -1)\r\n || (p.status && p.status.toLowerCase().indexOf(self.search.toLowerCase()) > -1)\r\n || (p.id == self.search)\r\n ))\r\n );\r\n };\r\n\r\n self.searchById = function (p) {\r\n return (self.searchId == '' || p.id == self.searchId);\r\n };\r\n\r\n self.filterByCampaign = function (campaign) {\r\n if (campaign == 'Todas')\r\n self.selectedFilterForCampaign = 'Todas';\r\n else if (self.selectedFilterForCampaign != campaign) {\r\n self.selectedFilterForCampaign = campaign;\r\n }\r\n }\r\n self.filterByMediaType = function (type) {\r\n if (type == 'Todos')\r\n self.selectedFilterForMediaType = 'Todos';\r\n else if (self.selectedFilterForMediaType != type) {\r\n self.selectedFilterForMediaType = type;\r\n }\r\n }\r\n self.filterByPromotionType = function (type) {\r\n if (type == 'Todos')\r\n self.selectedFilterForPromotionType = 'Todos';\r\n else if (self.selectedFilterForPromotionType != type) {\r\n self.selectedFilterForPromotionType = type;\r\n }\r\n }\r\n self.filterByStatus = function (status) {\r\n if (status == 'Todas ')\r\n self.selectedFilterForStatus = 'Todas';\r\n else if (self.selectedFilterForStatus != status) {\r\n self.selectedFilterForStatus = status;\r\n }\r\n }\r\n\r\n self.filterAsigned = function (asigned) {\r\n if (asigned == 'Todas ')\r\n self.selectedFilterForAsigned= 'Todas';\r\n else if (self.selectedFilterForAsigned != asigned) {\r\n self.selectedFilterForAsigned = asigned;\r\n }\r\n }\r\n\r\n self.filterComunicated = function (comunicated) {\r\n if (comunicated == 'Todas ')\r\n self.selectedFilterForComunicated = 'Todas';\r\n else if (self.selectedFilterForComunicated != comunicated){\r\n self.selectedFilterForComunicated = comunicated;\r\n }\r\n }\r\n\r\n self.filterForCreated = function (created) {\r\n if (created == 'Todos ')\r\n self.selectedFilterForCreated = 'Todos';\r\n else if (self.selectedFilterForCreated != created) {\r\n self.selectedFilterForCreated = created;\r\n }\r\n }\r\n\r\n self.filterForModif = function (modif) {\r\n if (modif == 'Todos ')\r\n self.selectedFilterForModif = 'Todos';\r\n else if (self.selectedFilterForModif != modif) {\r\n self.selectedFilterForModif = modif;\r\n }\r\n }\r\n\r\n self.newPromotionPopup = function () {\r\n\r\n var newScope = $scope.$new();\r\n\r\n newScope.goTo = function (promotionType) {\r\n self.setFiltersInLocalStorage();\r\n\r\n if (promotionType == \"Interna\")\r\n $state.go('promotions.editInternalPromotion', { promotionId: 0, promotionMediaPageId: 0 });\r\n else\r\n $state.go('promotions.editPromotion', { promotionId: 0, promotionType: promotionType });\r\n ngDialog.close();\r\n }\r\n\r\n ngDialog.open({\r\n template: 'promotionTypeDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n }\r\n\r\n self.goToPromotionSearch = function () {\r\n $state.go('promotions.promotionSearch');\r\n }\r\n\r\n self.goToInternal = function (promotion, copy) {\r\n self.isLoading = true;\r\n promotionsService.internalPromotions.getPromotionMediaPageId(promotion.id)\r\n .then(function (pageId) {\r\n $state.go('promotions.editInternalPromotion', { promotionId: promotion.id, promotionMediaPageId: pageId, copy: copy });\r\n });\r\n }\r\n\r\n self.rejectedPromotionsPopup = function () { \r\n self.loadingRejectedPromotions = true;\r\n promotionsService.promotions.getRejectedPromotions()\r\n .then(function (promotions) {\r\n self.rejectedPromotions = promotions;\r\n self.loadingRejectedPromotions = false;\r\n });\r\n ngDialog.open({\r\n template: 'rejectedPromotionsDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.openHistoricDialog = function () {\r\n var newScope = $scope.$new();\r\n var today = new Date();\r\n self.fromDate = new Date(today.getFullYear(), today.getMonth() - 1, today.getDate() - 1);\r\n self.toDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 1);\r\n\r\n newScope.validateDateRange = function () {\r\n let rv = true;\r\n if (self.toDate >= today)\r\n rv = false;\r\n if (self.fromDate < new Date(self.toDate.getFullYear(), self.toDate.getMonth() - 1, self.toDate.getDate()))\r\n rv = false;\r\n return rv;\r\n }\r\n\r\n newScope.getHistoricPromotions = function () {\r\n if (!newScope.validateDateRange()) {\r\n swal(\"Rango invalido\", \"La fecha desde debe ser menor a hoy y a su vez el rango entre fechas no puede excederse de un mes.\", \"error\");\r\n return;\r\n }\r\n\r\n self.isLoading = true;\r\n ngDialog.close();\r\n\r\n promotionsService.promotions.getHistoricPromotions({ fromDate: self.fromDate, toDate: self.toDate })\r\n .then(function (promotions) {\r\n angular.forEach(promotions, function (x) {\r\n if (!self.promotions.find(function (y) { return x.id == y.id }))\r\n self.promotions.push(x);\r\n });\r\n self.filterByStatus('Historica');\r\n swal('Filtrado por historicas', '', 'success');\r\n self.isLoading = false;\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso está demorado...\", '')\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al buscar promociones historicas\", \"error\");\r\n }\r\n });\r\n }\r\n\r\n ngDialog.open({\r\n template: 'historicDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n }\r\n\r\n self.openChangeControl = function () {\r\n var newScope = $scope.$new();\r\n\r\n newScope.getChangeControlPromotions = function () {\r\n ngDialog.close();\r\n if ((self.fromDate != null && self.toDate != null) || self.optionalPromotionId != null) {\r\n self.isLoading = true;\r\n promotionsService.promotions.buildModifiedPromotions({ fromDateNullable: self.fromDate, toDateNullable: self.toDate }, self.optionalPromotionId)\r\n .then(function (link) {\r\n self.isLoading = false;\r\n window.open(link);\r\n });\r\n }\r\n else {\r\n swal(\"Error\", \"Debe colocar al menos un rango de fecha o el id de la promocion.\", \"error\");\r\n }\r\n \r\n }\r\n\r\n ngDialog.open({\r\n template: 'changeControlDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n }\r\n\r\n function getFilters() {\r\n if (localStorage.getItem('filtros') != null) {\r\n var filtersAux = localStorage.getItem('filtros');\r\n var filters = JSON.parse(filtersAux);\r\n\r\n self.selectedFilterForComunicated = filters.comunicada;\r\n self.selectedFilterForAsigned = filters.asignada;\r\n self.selectedFilterForModif = filters.ultimaModificacion;\r\n self.selectedFilterForCreated = filters.creadaPor;\r\n self.selectedFilterForCampaign = filters.campaña;\r\n self.selectedFilterForMediaType = filters.tipoDeMedio\r\n self.selectedFilterForPromotionType = filters.tipoDePromocion\r\n self.selectedFilterForStatus = filters.estado;\r\n self.search = filters.buscador;\r\n }\r\n localStorage.removeItem(\"filtros\");\r\n }\r\n\r\n self.downloadPrices = function (id) {\r\n promotionsService.reports.buildPricesReport(id)\r\n .then(function (link) {\r\n self.link = link;\r\n self.showSwalWithLink(self.link);\r\n });\r\n }\r\n\r\n self.showSwalWithLink = function (link) {\r\n swal({\r\n title: \"Reporte Generado!\",\r\n text: 'Haga click AQUÍ para descargar el archivo',\r\n confirmButtonText: \"Cerrar\",\r\n confirmButtonColor: \"#c2c2c2\",\r\n html: true\r\n });\r\n }\r\n\r\n function loadData() {\r\n promotionsService.promotions.getPromotions(false)\r\n .then(function (promotions) {\r\n self.promotions = promotions;\r\n console.log(promotions);\r\n\r\n self.promotions.forEach(function (p) {\r\n p.createdDate = $rootScope.convertUTCDateToLocalDate(p.createdDate);\r\n });\r\n\r\n let creators = promotions.map(function (p) {\r\n return { value: p.createdUserName };\r\n });\r\n\r\n creators = creators.filter(function (p) {\r\n return p.value != null;\r\n });\r\n\r\n self.createdUserNames = $rootScope.removeDuplicates(creators, 'value');\r\n\r\n let modif = promotions.map(function (p) {\r\n return { value: p.lastModifiedUserName };\r\n });\r\n\r\n modif = modif.filter(function (p) {\r\n return p.value != null;\r\n });\r\n\r\n self.modifUserNames = $rootScope.removeDuplicates(modif, 'value');\r\n\r\n\r\n _.forOwn(_.groupBy(promotions, \"promotionCampaignName\"), function (value, key) {\r\n self.distinctCampaigns.push(key);\r\n });\r\n\r\n _.forOwn(_.groupBy(promotions, \"promotionMediaTypeName\"), function (value, key) {\r\n self.distinctMediaTypes.push(key);\r\n });\r\n\r\n self.isLoading = false;\r\n pageLoaded = true;\r\n });\r\n\r\n }\r\n\r\n function init() {\r\n getFilters();\r\n loadData();\r\n }\r\n function afterinit() {\r\n promotionsService.promotions.getPromotionMediaPagesIds().then(function (mediaPagesIds) {\r\n self.promotionMediaIds = mediaPagesIds;\r\n })\r\n }\r\n init();\r\n afterinit();\r\n self.searchMediaPageIdByPromotionId = function (promotionId) {\r\n for (var i = 0; i < self.promotionMediaIds.length; i++) {\r\n if (self.promotionMediaIds[i].promotionId == promotionId) {\r\n return self.promotionMediaIds[i].promotionMediaPageId;\r\n }\r\n }\r\n\r\n }\r\n\r\n });","angular.module(\"prisma\")\r\n .controller(\"overlappingReportCtrl\", function ($scope, $rootScope, $state, $stateParams, promotionsService, $timeout, ngDialog, authService) {\r\n\r\n var self = this;\r\n self.isLoading = true;\r\n self.hasPermissionOfSuperUser = authService.hasPermission('promotion_superUser');\r\n self.hasPermissionToDownLoad = authService.hasPermission('promotion_overlapping_report');\r\n self.promotions = [];\r\n self.distinctStatus = ['Activa', 'Planeada'];\r\n self.distinctPromotionTypes = ['Externa', 'Interna', 'Otras'];\r\n self.distinctCampaigns = [];\r\n self.distinctMediaTypes = [];\r\n\r\n self.search = \"\";\r\n\r\n self.selectedFilterForCampaign = '';\r\n self.selectedFilterForMediaType = '';\r\n self.selectedFilterForPromotionType = '';\r\n self.selectedFilterForStatus = '';\r\n\r\n self.promotionMediaTypes = promotionsService.promotionMediaTypes;\r\n\r\n\r\n self.generateReport = function (promotionId) {\r\n self.isLoading = true;\r\n promotionsService.reports.buildOverlappingReport(promotionId)\r\n .then(function (link) {\r\n self.isLoading = false;\r\n self.showSwalWithLink(link);\r\n });\r\n\r\n ngDialog.close();\r\n }\r\n\r\n self.showSwalWithLink = function (link) {\r\n swal({\r\n\r\n title: \"Reporte Generado!\",\r\n text: 'Haga click AQUÍ para descargar el archivo',\r\n confirmButtonText: \"Cerrar\",\r\n confirmButtonColor: \"#c2c2c2\",\r\n html: true\r\n });\r\n }\r\n\r\n //Filters\r\n self.myFilter = function (p) {\r\n return (\r\n ((p.promotionCampaignName.toLowerCase().indexOf(self.selectedFilterForCampaign.toLocaleLowerCase()) > -1 || self.selectedFilterForCampaign == \"Todas\") && self.search == '') &&\r\n ((p.promotionMediaTypeName.toLowerCase().indexOf(self.selectedFilterForMediaType.toLocaleLowerCase()) > -1 || self.selectedFilterForMediaType == \"Todos\") && self.search == '') &&\r\n ((p.promotionType.toLowerCase().indexOf(self.selectedFilterForPromotionType.toLocaleLowerCase()) > -1 || self.selectedFilterForPromotionType == \"Todos\") && self.search == '') &&\r\n ((p.status.toLowerCase().indexOf(self.selectedFilterForStatus.toLocaleLowerCase()) > -1 || self.selectedFilterForStatus == \"Todas\") && self.search == '')\r\n )\r\n ||\r\n (self.search.length > 0 && (\r\n (p.name && p.name.toLowerCase().indexOf(self.search.toLowerCase()) > -1)\r\n || (p.id && p.id.toString().indexOf(self.search) > -1)\r\n ));\r\n };\r\n\r\n self.filterByCampaign = function (campaign) {\r\n if (campaign == '')\r\n self.selectedFilterForCampaign = '';\r\n else if (self.selectedFilterForCampaign != campaign) {\r\n self.selectedFilterForCampaign = campaign;\r\n }\r\n }\r\n self.filterByMediaType = function (type) {\r\n if (type == '')\r\n self.selectedFilterForMediaType = '';\r\n else if (self.selectedFilterForMediaType != type) {\r\n self.selectedFilterForMediaType = type;\r\n }\r\n }\r\n self.filterByPromotionType = function (type) {\r\n if (type == '')\r\n self.selectedFilterForPromotionType = '';\r\n else if (self.selectedFilterForPromotionType != type) {\r\n self.selectedFilterForPromotionType = type;\r\n }\r\n }\r\n self.filterByStatus = function (status) {\r\n if (status == ' ')\r\n self.selectedFilterForStatus = '';\r\n else if (self.selectedFilterForStatus != status) {\r\n self.selectedFilterForStatus = status;\r\n }\r\n }\r\n\r\n function init() {\r\n promotionsService.promotions.getPromotionsOverlapping()\r\n .then(function (promotions) {\r\n self.promotions = promotions;\r\n\r\n _.forOwn(_.groupBy(promotions, \"promotionCampaignName\"), function (value, key) {\r\n self.distinctCampaigns.push(key);\r\n });\r\n\r\n _.forOwn(_.groupBy(promotions, \"promotionMediaTypeName\"), function (value, key) {\r\n self.distinctMediaTypes.push(key);\r\n });\r\n\r\n self.isLoading = false;\r\n\r\n\r\n });\r\n\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"editPromotionCtrl\", function ($scope, $filter, $state, $rootScope, $stateParams, promotionsService, adminService, ngDialog, authService) {\r\n var self = this;\r\n self.isCopy = JSON.parse($stateParams.copy) == true;\r\n //TODO: estos parámetros se deberian usar luego para cambiar el status de la tarea\r\n //Ver si usamos $stateParams que se pierden con un refresh o incluimos los params en la Url\r\n console.log($stateParams.promotionType);\r\n console.log($stateParams.promotionId);\r\n console.log($stateParams.taskId);\r\n\r\n self.hasEditSpecialPermissions = authService.hasPermission('promotion_superUser');\r\n self.readOnly = $stateParams.readOnly == \"true\";\r\n self.promotion = null;\r\n self.workflows = [];\r\n self.campaigns = [];\r\n self.stores = [];\r\n self.storeGroups = [];\r\n self.campaign = null;\r\n self.workflow = null;\r\n self.holidays = [];\r\n self.ganttdata = [];\r\n self.storesDialogDisabled = false;\r\n self.allowCombinationGroups = false;\r\n var colors = promotionsService.colors;\r\n\r\n self.promotionType = $stateParams.promotionType;\r\n\r\n self.storeGroup = { id: 0, name: '', stores: [] };\r\n\r\n self.promotionMediaTypes = promotionsService.promotionMediaTypes;\r\n\r\n loadData();\r\n\r\n self.ganttOptions = {\r\n columns: [],\r\n columnsHeaders: { 'model.name': 'Tarea' },\r\n columnsClasses: { 'model.name': 'gantt-column-name' },\r\n columnMagnet: '1 day',\r\n currentDate: 'line',\r\n currentDateValue: moment(new Date()),\r\n timeFramesWorkingMode: 'hidden',\r\n timeFramesNonWorkingMode: 'hidden',\r\n timeFrames: {\r\n 'day': {\r\n start: moment('8:00', 'HH:mm'),\r\n end: moment('20:00', 'HH:mm'),\r\n color: '#ACFFA3',\r\n working: true,\r\n default: true\r\n },\r\n 'noon': {\r\n start: moment('12:00', 'HH:mm'),\r\n end: moment('13:30', 'HH:mm'),\r\n working: false,\r\n default: true\r\n },\r\n 'closed': {\r\n working: false,\r\n default: true\r\n },\r\n 'weekend': {\r\n working: false\r\n },\r\n 'holiday': {\r\n working: false,\r\n color: 'red',\r\n classes: ['gantt-timeframe-holiday']\r\n },\r\n 'startPromotion': {\r\n working: true,\r\n color: 'green',\r\n classes: ['gantt-timeframe-holiday']\r\n }\r\n },\r\n dateFrames: {\r\n 'weekend': {\r\n evaluator: function (date) {\r\n return date.isoWeekday() === 6 || date.isoWeekday() === 7;\r\n },\r\n targets: ['weekend']\r\n },\r\n 'startPromotion': {\r\n evaluator: function (date) {\r\n return date != null && self.promotion.validFrom != null ? moment(date).isSame(moment(self.promotion.validFrom)) : false;\r\n },\r\n targets: ['startPromotion']\r\n },\r\n },\r\n api: function (api) {\r\n // API Object is used to control methods and events from angular-gantt.\r\n self.api = api;\r\n\r\n api.core.on.ready($scope, function () {\r\n if (api.tasks.on.moveBegin) {\r\n api.tasks.on.moveEnd($scope, function (task) {\r\n taskMoved(task);\r\n });\r\n\r\n api.tasks.on.resizeEnd($scope, function (task) {\r\n taskMoved(task);\r\n });\r\n }\r\n })\r\n }\r\n };\r\n\r\n function taskMoved(movedTask) {\r\n\r\n angular.forEach(self.promotion.tasks, function (task) {\r\n\r\n if (movedTask.row.model.id == task.name) {\r\n task.plannedStartDate = movedTask.row.from;\r\n task.plannedEndDate = movedTask.row.to;\r\n }\r\n });\r\n }\r\n\r\n function loadStoreGroups() {\r\n promotionsService.stores.getStoreGroups()\r\n .then(function (storeGroups) {\r\n self.storeGroups = storeGroups;\r\n\r\n //selecciono el grupo de tiendas de la promocion, si es que tiene.\r\n if (self.promotion.promotionStoreGroupId != null) {\r\n angular.forEach(self.storeGroups, function (sg) {\r\n if (self.promotion.promotionStoreGroupId === sg.id) {\r\n self.selectStoreGroup(sg);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n function loadStores() {\r\n promotionsService.stores.getStores()\r\n .then(function (stores) {\r\n self.stores = stores;\r\n\r\n angular.forEach(self.promotion.stores, function (promotionStore) {\r\n angular.forEach(self.stores, function (store) {\r\n if (promotionStore.id == store.id)\r\n store.selected = true;\r\n });\r\n });\r\n\r\n loadStoreGroups();\r\n\r\n });\r\n }\r\n\r\n function getWorkflowsForPromotion(workflows) {\r\n //Filtro los workflows, segun el tipo de promocion.\r\n var rv = [];\r\n\r\n angular.forEach(workflows, function (wf) {\r\n if (wf.promotionType == $stateParams.promotionType)\r\n rv.push(wf);\r\n });\r\n\r\n return rv;\r\n }\r\n\r\n function loadData() {\r\n promotionsService.workflows.getWorkflows(true)\r\n .then(function (workflows) {\r\n self.workflows = getWorkflowsForPromotion(workflows);\r\n\r\n\r\n promotionsService.campaigns.getCampaigns()\r\n .then(function (campaigns) {\r\n self.campaigns = campaigns;\r\n\r\n promotionsService.holidays.getHolidays()\r\n .then(function (holidays) {\r\n self.holidays = holidays;\r\n\r\n promotionsService.stores.getBrands()\r\n .then(function (brands) {\r\n self.brands = brands;\r\n if (brands.length > 0)\r\n self.filterStores.brandName = brands[0].name;\r\n self.filterStores.brandId = brands[0].id;\r\n\r\n if ($stateParams.promotionId != '0') {\r\n promotionsService.promotions.getPromotion($stateParams.promotionId)\r\n .then(function (promotion) {\r\n promotion.validFrom = new Date(promotion.validFrom);\r\n promotion.validTo = new Date(promotion.validTo);\r\n\r\n //si la promocion ya existe actualizo los identifiers para connstruir las dependencias\r\n angular.forEach(promotion.tasks, function (task) {\r\n task.identifier = task.name;\r\n task.previousIdentifier = findPreviousIdentifier(task.promotionTaskPreviousId, promotion.tasks);\r\n });\r\n\r\n self.promotion = promotion;\r\n\r\n self.storesCount = self.promotion.stores.length;\r\n\r\n setCampaign(false);\r\n\r\n loadStores();\r\n \r\n });\r\n }\r\n else {\r\n self.promotion = { Id: 0, companyId: $rootScope.companyId, name: '', description: '', promotionCampaignId: 0, promotionWorkflowId: 0, tasks: [], stores: [], promotionType: $stateParams.promotionType };\r\n\r\n loadStores();\r\n \r\n }\r\n });\r\n });\r\n });\r\n });\r\n }\r\n\r\n function setCampaign(changeValidity) {\r\n angular.forEach(self.campaigns, function (campaign) {\r\n if (self.promotion.promotionCampaignId == campaign.id) {\r\n self.campaign = campaign;\r\n\r\n if (changeValidity) {\r\n self.promotion.validFrom = new Date(campaign.validFrom);\r\n self.promotion.validTo = new Date(campaign.validTo);\r\n }\r\n }\r\n });\r\n }\r\n\r\n self.promotionCampaignChanged = function () {\r\n setCampaign(true);\r\n }\r\n\r\n\r\n\r\n self.openStoresDialog = function () {\r\n \r\n ngDialog.open({\r\n template: 'storesDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n //data: task,\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.storesCount = 0;\r\n\r\n self.selectStore = function (store) {\r\n\r\n if (!self.storesDialogDisabled) {\r\n\r\n store.selected = !store.selected;\r\n\r\n if (store.selected)\r\n self.storesCount++;\r\n else\r\n self.storesCount--;\r\n }\r\n }\r\n\r\n self.selectStoreGroup = function (storeGroup) {\r\n\r\n self.promotion.promotionStoreGroupId = null;\r\n\r\n var brandOfStoreGroup;\r\n angular.forEach(self.brands, function (brand) {\r\n\r\n //para los inconsistentes casos en que las tiendas no tienen brand el workaround es:\r\n //matchiar el nombre de la tienda con el nombre del brand\r\n if (storeGroup.stores[0].brand == brand.name || storeGroup.stores[0].name.indexOf(brand.name) > -1) {\r\n brandOfStoreGroup = brand;\r\n }\r\n });\r\n\r\n self.changeStoresFilter(brandOfStoreGroup);\r\n\r\n if (!self.allowCombinationGroups) {//combinacion off\r\n storeGroup.isSelected = storeGroup.isSelected ? false : true;\r\n\r\n if (storeGroup.isSelected) {\r\n angular.forEach(self.storeGroups, function (sg) {\r\n if (storeGroup.id != sg.id) {\r\n sg.isSelected = false;\r\n }\r\n });\r\n\r\n self.promotion.promotionStoreGroupId = storeGroup.id;\r\n }\r\n self.unselectAll(); //deselecciono todas las tiendas.\r\n }\r\n\r\n self.storesDialogDisabled = storeGroup.isSelected; //deshabilito el pop up si quedo un grupo seleccionado\r\n\r\n //seleccion de tiendas\r\n if (storeGroup.isSelected || self.allowCombinationGroups) {\r\n angular.forEach(self.stores, function (store) {\r\n\r\n angular.forEach(storeGroup.stores, function (storeInGroup) {\r\n if (storeInGroup.id == store.id) {\r\n\r\n if (!store.selected) {\r\n self.storesCount++;\r\n }\r\n store.selected = true;\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n self.changeSwith = function () {\r\n self.showCombinationGroups = !self.showCombinationGroups;\r\n self.unselectAll();\r\n }\r\n\r\n self.unselectAll = function () {\r\n angular.forEach(self.stores, function (store) {\r\n if (store.selected) {\r\n store.selected = false;\r\n self.storesCount--;\r\n }\r\n });\r\n }\r\n\r\n self.save = function () {\r\n if (self.promotion != null) {\r\n let today = new Date(new Date().setHours(0, 0, 0, 0));\r\n if (self.promotion.validFrom < today && !self.hasEditSpecialPermissions) {\r\n swal(\"Error\", \"Debe seleccionar una campaña vigente o iniciar la promocion con fecha mayor o igual a hoy.\", \"error\");\r\n }\r\n else {\r\n var title = self.isCopy ? 'Esta seguro que desea copiar la Acción Promocional?'\r\n : 'Esta seguro que desea guardar la Acción Promocional?';\r\n var text = self.isCopy ? 'No olvide modificar la vigencia de ser necesario' : '';\r\n swal({\r\n title: title,\r\n text: text,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n //teniendo el alcance definido, seteo el brand\r\n for (var i = 0; i < self.brands.length; i++) {\r\n if (self.promotion.stores[0].name.indexOf(self.brands[i].name) > -1) {\r\n self.promotion.brandId = self.brands[i].id;\r\n self.promotion.brandName = self.brands[i].name;\r\n break;\r\n }\r\n }\r\n\r\n //Fix Enter en comentarios dentro de un TEXTAREA, para bajar los excels se rompe.\r\n self.promotion.description ? self.promotion.description.replace(/(\\r\\n|\\n|\\r)/gm, '') : '';\r\n\r\n if (!self.isCopy) {\r\n promotionsService.promotions.savePromotion(self.promotion)\r\n .then(function (promotion) {\r\n swal('Accion Promocional Guardada!', 'La accion promocional ' + self.promotion.name + ' se ha guardado exitosamente', 'success');\r\n\r\n $state.go('promotions.promotions');\r\n\r\n //promotion.validFrom = new Date(promotion.validFrom);\r\n //promotion.validTo = new Date(promotion.validTo);\r\n\r\n //self.promotion = promotion;\r\n //redrawGantt();\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al guardar esta accion promocional\", \"error\");\r\n }\r\n });\r\n }\r\n else {\r\n promotionsService.promotions.copyPromotion(self.promotion)\r\n .then(function (promotion) {\r\n swal('Accion Promocional Copiada!', 'La accion promocional ' + self.promotion.name + ' se ha copiado exitosamente', 'success');\r\n\r\n $state.go('promotions.promotions'); \r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de copiado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al copiar esta accion promocional\", \"error\");\r\n }\r\n });\r\n }\r\n }\r\n\r\n\r\n });\r\n }\r\n\r\n }\r\n }\r\n\r\n self.saveStores = function (close) {\r\n self.promotion.stores = [];\r\n\r\n angular.forEach(self.stores, function (store) {\r\n if (store.selected) {\r\n self.promotion.stores.push(store);\r\n }\r\n });\r\n\r\n self.storesCount = self.promotion.stores.length;\r\n\r\n if (close)\r\n ngDialog.close();\r\n }\r\n\r\n self.deleteGroup = function (storeGroup) {\r\n swal({\r\n title: 'Esta seguro que desea Eliminar el grupo ' + storeGroup.name + '?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n promotionsService.stores.deleteGroup(storeGroup.id)\r\n .then(function (promotion) {\r\n self.newStoreGroup();\r\n loadStoreGroups();\r\n swal('Grupo Eliminado!', 'El grupo ' + storeGroup.name + ' se ha eliminado exitosamente', 'success');\r\n },\r\n function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n loadStoreGroups();\r\n swal(\"Error\", \"Hubo un error al eliminar este grupo\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.filterStores = { brandId: 0, brandName: '' };\r\n self.changeStoresFilter = function (brand) {\r\n self.filterStores.brandName = brand.name;\r\n self.filterStores.brandId = brand.id;\r\n }\r\n\r\n self.filterStoresByBrand = function (store) {\r\n if (store.brandId) {//en Peru se detectaron stores con brandId null en el maestro de tiendas! en colombia no.\r\n return store.brandId == self.filterStores.brandId;\r\n }\r\n return store.name.indexOf(self.filterStores.brandName) > -1;\r\n }\r\n\r\n self.newStoreGroup = function () {\r\n self.storeGroup = { id: 0, name: '', stores: [] };\r\n\r\n self.unselectAll();\r\n }\r\n\r\n self.saveStoresAndGroup = function () {\r\n if (self.storeGroup.name == '' || self.storesCount == 0) {\r\n swal(\"Error\", \"Para guardar este grupo de tiendas debes completar su nombre y seleccionar al menos 1 tienda\", \"error\");\r\n }\r\n else {\r\n swal({\r\n title: 'Esta seguro que desea guardar este Grupo de Tiendas?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: true,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n //Primero asocio las tiendas a la promo\r\n self.saveStores(false);\r\n\r\n self.storeGroup.stores = [];\r\n\r\n //Despues asocio las tiendas al grupo\r\n angular.forEach(self.stores, function (store) {\r\n if (store.selected)\r\n self.storeGroup.stores.push(store);\r\n });\r\n\r\n promotionsService.stores.saveStoreGroup(self.storeGroup)\r\n .then(function (storeGroup) {\r\n swal('Grupo de Tiendas Guardado!', 'El Grupo de Tiendas ' + self.storeGroup.name + ' se ha guardado exitosamente', 'success');\r\n\r\n if (self.storeGroup.id == 0) {\r\n self.storeGroups.push(storeGroup);\r\n }\r\n\r\n self.storeGroup = storeGroup;\r\n self.newStoreGroup();\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al guardar este grupo de tiendas\", \"error\");\r\n }\r\n });\r\n }\r\n\r\n });\r\n }\r\n }\r\n\r\n self.closeStoresDialog = function () {\r\n\r\n ngDialog.close();\r\n }\r\n\r\n $scope.$watch('ct.promotion.promotionWorkflowId', function (newVal, oldVal) {\r\n if (newVal) {\r\n\r\n buildPromotionTasksFromWorkflow();\r\n\r\n redrawGantt();\r\n }\r\n }, true);\r\n\r\n function buildPromotionTasksFromWorkflow() {\r\n\r\n var promotionOverflowDate = false;\r\n\r\n angular.forEach(self.workflows, function (workflow) {\r\n if (self.promotion.promotionWorkflowId == workflow.id) {\r\n self.workflow = workflow;\r\n self.promotion.promotionMediaType = workflow.promotionMediaType;\r\n }\r\n });\r\n\r\n if (self.promotion.Id === 0 || self.isCopy) {\r\n\r\n //Limpio las tareas de la promoción.\r\n self.promotion.tasks = [];\r\n\r\n //Copio las tareas del Workflow Template a la Promocion\r\n angular.forEach(self.workflow.tasks, function (task) {\r\n\r\n var promotionTask = {\r\n promotionId: self.promotion.id,\r\n promotionWorkflowId: self.workflow.id,\r\n promotionTaskId: task.id, //DB: ahora es el workflowTaskId no es mas el taskId\r\n promotionTaskPreviousId: task.promotionTaskPreviousId,\r\n previousIdentifier: findPreviousIdentifier(task.promotionTaskPreviousId, self.workflow.tasks),\r\n identifier: task.name,\r\n name: task.name,\r\n groupName: task.groupName,\r\n durationInDays: task.durationInDays,\r\n startFromDay: task.startFromDay,\r\n userArea: task.userArea,\r\n isRequired: task.isRequired,\r\n isStartMilestone: task.isStartMilestone,\r\n plannedStartDate: null,\r\n plannedEndDate: null\r\n };\r\n\r\n if (promotionTask.promotionTaskPreviousId == null && self.promotion.validFrom.addDays(promotionTask.durationInDays) < new Date())\r\n promotionOverflowDate = true;\r\n\r\n self.promotion.tasks.push(promotionTask);\r\n });\r\n\r\n if (promotionOverflowDate)\r\n swal(\"Alerta!\", \"Hay tareas que deberían haber comenzado antes de la fecha de inicio de esta promo. Tener en cuenta que estas tareas ya apareceran vencidas.\", \"warning\");\r\n }\r\n else {\r\n var promotionOverflowDate = false;\r\n\r\n //si la promocion ya existe actualizo los identifiers para connstruir las dependencias\r\n angular.forEach(self.promotion.tasks, function (task) {\r\n task.identifier = task.name;\r\n task.previousIdentifier = findPreviousIdentifier(task.promotionTaskPreviousId, self.promotion.tasks);\r\n\r\n if (task.promotionTaskPreviousId == null && self.promotion.validFrom.addDays(task.durationInDays) < new Date())\r\n promotionOverflowDate = true;\r\n });\r\n\r\n if (promotionOverflowDate)\r\n swal(\"Alerta!\", \"Hay tareas que deberían haber comenzado antes de la fecha de inicio de esta promo. Tener en cuenta que estas tareas ya apareceran vencidas.\", \"warning\");\r\n\r\n }\r\n }\r\n\r\n //recibe el listado para poder operar sobre workflowTasks o promotionTasks indistintamente\r\n function findPreviousIdentifier(taskId, allTasks) {\r\n var rv = null;\r\n if (taskId != null) {\r\n angular.forEach(allTasks, function (task) {\r\n if (task.id == taskId) {\r\n rv = task.name;\r\n }\r\n });\r\n }\r\n\r\n return rv;\r\n }\r\n\r\n var validFromReverted = false;\r\n $scope.$watch('ct.promotion.validFrom', function (newVal, oldVal) {\r\n\r\n if (validFromReverted) {\r\n validFromReverted = false;\r\n return;\r\n }\r\n\r\n var hasError = false;\r\n\r\n\r\n if (newVal) {\r\n\r\n //Validar que el desde sea anterior al hasta\r\n if (moment(new Date(newVal.getUTCFullYear(), newVal.getUTCMonth(), newVal.getUTCDate())).isAfter(moment(self.promotion.validTo), 'day')) {\r\n swal(\"Error\", \"La fecha Desde debe ser menor a la fecha hasta\", \"error\");\r\n hasError = true;\r\n }\r\n\r\n //Validar que el desde sea mayor o igual al hasta\r\n if (moment(new Date(newVal.getUTCFullYear(), newVal.getUTCMonth(), newVal.getUTCDate())).isBefore(moment(self.campaign.validFrom), 'day')) {\r\n swal(\"Error\", \"La fecha Desde debe ser mayor o igual a la fecha de inicio de la campaña: \" + new Date(self.campaign.validFrom), \"error\");\r\n hasError = true;\r\n }\r\n\r\n }\r\n else\r\n hasError = true;\r\n\r\n if (!hasError && (self.promotion.Id === 0 || self.hasEditSpecialPermissions || self.isCopy)) {\r\n buildPromotionTasksFromWorkflow();\r\n redrawGantt();\r\n }\r\n else {\r\n validFromReverted = true;\r\n if (oldVal)\r\n self.promotion.validFrom = new Date(oldVal);\r\n }\r\n\r\n }, true);\r\n\r\n var validToReverted = false;\r\n $scope.$watch('ct.promotion.validTo', function (newVal, oldVal) {\r\n\r\n if (validToReverted) {\r\n validToReverted = false;\r\n return;\r\n }\r\n\r\n var hasError = false;\r\n\r\n if (newVal) {\r\n //Validar que el desde sea anterior al hasta\r\n if (moment(newVal).isBefore(moment(self.promotion.validFrom), 'day')) {\r\n swal(\"Error\", \"La fecha Hasta debe ser mayor a la fecha desde\", \"error\");\r\n hasError = true;\r\n }\r\n\r\n //Validar que el desde sea mayor o igual al hasta\r\n if (moment(newVal).isAfter(moment(self.campaign.validTo), 'day')) {\r\n swal(\"Error\", \"La fecha Hasta debe ser menor o igual a la fecha de fin de la campaña: \" + new Date(self.campaign.validTo), \"error\");\r\n hasError = true;\r\n }\r\n }\r\n else\r\n hasError = true;\r\n\r\n if (!hasError)\r\n redrawGantt();\r\n else {\r\n validToReverted = true;\r\n if (oldVal)\r\n self.promotion.validTo = new Date(oldVal);\r\n }\r\n\r\n }, true);\r\n\r\n\r\n function redrawGanttOLD() {\r\n var ganttdataitems = [];\r\n\r\n var prevGroupName = '';\r\n var groupCount = 0;\r\n var groupId = 1000;\r\n var group = { id: groupId, name: '', children: [] };\r\n\r\n //Empiezo detectando el hito de entrada en vigencia de la promoción para calcular el start date\r\n var promotionTaskPreviousId = 0;\r\n\r\n var startDate = moment(self.promotion.validFrom);\r\n\r\n angular.forEach(self.promotion.tasks, function (task, i) {\r\n if (task.isStartMilestone) {\r\n promotionTaskPreviousId = task.promotionTaskPreviousId;\r\n }\r\n });\r\n\r\n var durationInDays = 0;\r\n\r\n for (var i = 0; i < self.promotion.tasks.length; i++) {\r\n angular.forEach(self.promotion.tasks, function (task, i) {\r\n if (task.promotionTaskId == promotionTaskPreviousId) {\r\n\r\n durationInDays += (task.startFromDay + task.durationInDays);\r\n\r\n promotionTaskPreviousId = task.promotionTaskPreviousId;\r\n }\r\n });\r\n }\r\n\r\n //Quito Feriados\r\n var startDateOffset = 0;\r\n for (var d = 1; d < durationInDays; d++) {\r\n angular.forEach(self.holidays, function (holiday) {\r\n var holidayMoment = moment(holiday.date);\r\n if (holidayMoment.isoWeekday() < 6 && moment(startDate).subtract(d, 'days').isSame(holidayMoment)) {\r\n startDateOffset++;\r\n }\r\n });\r\n }\r\n\r\n //agrego el offset del feriado a la duracion\r\n durationInDays += startDateOffset;\r\n\r\n //agrego los findes de semana a la duracion\r\n var weeks = parseInt(durationInDays / 7);\r\n durationInDays = durationInDays + (weeks * 2);\r\n\r\n startDate = moment(startDate).subtract(durationInDays + 1, 'days');\r\n\r\n if (startDate.isoWeekday() === 6) {\r\n startDate = moment(startDate).subtract(1, 'days');\r\n }\r\n else if (startDate.isoWeekday() === 7) {\r\n startDate = moment(startDate).subtract(2, 'days');\r\n }\r\n\r\n //TODO: quitar feriados que no caigan sabado o domingo\r\n startDate = checkWeekends(startDate);\r\n var endDate = startDate;\r\n\r\n //Paso 1: Recorro todos los tasks para crear los items de los groupnames\r\n angular.forEach($filter('orderBy')(self.promotion.tasks, 'promotionTaskId', false), function (task, i) {\r\n\r\n if (prevGroupName != '' && prevGroupName != task.groupName) {\r\n var groupCopy = {};\r\n ganttdataitems.push(angular.copy(group, groupCopy));\r\n groupCount++;\r\n group.children = [];\r\n groupId++;\r\n }\r\n\r\n group.id = groupId;\r\n group.name = task.groupName;\r\n group.children.push(task.name);\r\n\r\n if (task.promotionTaskPreviousId != null) {\r\n\r\n angular.forEach(ganttdataitems, function (ganttitem, i) {\r\n if (ganttitem.id == task.promotionTaskPreviousId && ganttitem.tasks.length > 0) {\r\n var ganttitemTask = ganttitem.tasks[0];\r\n\r\n startDate = moment(endDate).add(task.startFromDay, 'days');\r\n startDate = checkWeekends(startDate);\r\n\r\n endDate = moment(startDate).add(task.durationInDays, 'days');\r\n }\r\n });\r\n }\r\n else {\r\n endDate = moment(startDate).add(task.durationInDays + task.startFromDay, 'days');\r\n }\r\n\r\n //Recorro desde el startDate al endDate para ver si hay feriados o fines de semana en el medio\r\n var endDateOffset = 0;\r\n for (var d = 1; d < task.durationInDays; d++) {\r\n angular.forEach(self.holidays, function (holiday) {\r\n var holidayMoment = moment(holiday.date);\r\n if (holidayMoment.isoWeekday() < 6 && moment(startDate).add(d, 'days').isSame(holidayMoment)) {\r\n endDateOffset++;\r\n }\r\n });\r\n }\r\n\r\n for (var d = 1; d < task.durationInDays; d++) {\r\n if (moment(startDate).add(d, 'days').isoWeekday() === 6 || moment(startDate).add(d, 'days').isoWeekday() === 7) {\r\n endDateOffset++;\r\n }\r\n }\r\n\r\n endDate = moment(endDate).add(endDateOffset, 'days');\r\n\r\n //Copio las tareas del Workflow Template a la Promocion\r\n //Si el task ya tiene una fecha de Inicio y Fin entonces no calculo nada\r\n if (task.plannedStartDate != null) {\r\n startDate = task.plannedStartDate;\r\n endDate = task.plannedEndDate;\r\n }\r\n else {\r\n task.plannedStartDate = startDate;\r\n task.plannedEndDate = endDate;\r\n }\r\n\r\n if (groupCount > colors.length) {\r\n groupCount = 0;\r\n }\r\n\r\n var taskFrom = null;\r\n var taskTo = null;\r\n\r\n var ganttItem = null;\r\n\r\n if (task.isStartMilestone) {\r\n taskFrom = moment(self.promotion.validFrom);\r\n taskTo = moment(self.promotion.validTo);\r\n }\r\n else {\r\n taskFrom = moment(startDate);\r\n taskTo = moment(endDate);\r\n }\r\n\r\n ganttItem = {\r\n id: task.promotionTaskId,\r\n name: task.name,\r\n tasks: [{ name: task.name, from: taskFrom, to: taskTo, color: colors[groupCount] }],\r\n };\r\n\r\n if (task.promotionTaskPreviousId != null) {\r\n //TODO: esto no está funcando\r\n ganttItem.tasks[0].dependencies = [{ from: task.promotionTaskPreviousId }];\r\n }\r\n\r\n ganttdataitems.push(ganttItem);\r\n\r\n prevGroupName = task.groupName;\r\n });\r\n\r\n ganttdataitems.push(group);\r\n\r\n self.ganttdata = ganttdataitems;\r\n }\r\n\r\n function weekendDays(date1, date2) {\r\n var d1 = new Date(date1);\r\n var d2 = new Date(date2);\r\n var weekendDays = 0;\r\n\r\n while (d1 < d2) {\r\n var day = d1.getDay();\r\n isWeekend = (day == 6) || (day == 0);\r\n if (isWeekend)\r\n weekendDays++;\r\n\r\n d1.setDate(d1.getDate() + 1);\r\n }\r\n return weekendDays;\r\n }\r\n\r\n\r\n function redrawGantt() {\r\n var ganttdataitems = [];\r\n\r\n var groupId = 1000;\r\n var group = { id: groupId, name: '', children: [] };\r\n\r\n //tomo como fecha de partida el validFrom de la promoción. Desde acá comienzo el retroplanning.\r\n var promotionValidFrom = moment(self.promotion.validFrom);\r\n\r\n //calculo la cantidad de dias desde la primer tarea hasta la ultima, teniendo en cuenta feriados y fines de semana. \r\n var durationInDays = calculateDurationInDays(self.promotion.tasks, promotionValidFrom);\r\n\r\n var initDate = moment(promotionValidFrom).subtract(durationInDays, 'days');\r\n\r\n //if (initDate.isoWeekday() === 6) {\r\n // initDate = moment(initDate).subtract(1, 'days');\r\n //}\r\n //else if (initDate.isoWeekday() === 7) {\r\n // initDate = moment(initDate).subtract(2, 'days');\r\n //}\r\n\r\n //Paso 1: Recorro todos los tasks para crear los items de los groupnames\r\n\r\n var itemsLeft = [];\r\n angular.forEach(self.promotion.tasks, function (task) { itemsLeft.push(task) });\r\n var currentGroups = [];\r\n while (self.promotion.tasks.length != countGanttTasks(ganttdataitems)) {\r\n\r\n //angular.forEach($filter('orderBy')(self.promotion.tasks, 'promotionTaskId', false), function (task, i) {\r\n //angular.forEach(itemsLeft, function (task, i) {\r\n angular.forEach($filter('orderBy')(itemsLeft, 'promotionTaskId', false), function (task, i) {\r\n\r\n var currentGroup = null;\r\n angular.forEach(ganttdataitems, function (gdi) {\r\n if (gdi.name == task.groupName && gdi.children)\r\n currentGroup = gdi;\r\n });\r\n\r\n //si no existia el grupo lo creo\r\n if (currentGroup == null) {\r\n currentGroup = { id: groupId, name: task.groupName, children: [] };\r\n ganttdataitems.push(currentGroup);\r\n\r\n currentGroups.push(currentGroup.name);\r\n groupId++;\r\n }\r\n\r\n //agrego la tarea actual como hija del grupo\r\n if (currentGroup.children.indexOf(task.name) == -1)\r\n currentGroup.children.push(task.name);\r\n\r\n //defino el color para el grupo\r\n var color = currentGroups.indexOf(task.groupName);\r\n\r\n //calculo las fechas de la tarea\r\n var startDate = null;\r\n var endDate = null;\r\n\r\n if (task.isStartMilestone) {//hito tal como lo seteo el usuario\r\n startDate = moment(self.promotion.validFrom);\r\n endDate = moment(self.promotion.validTo);\r\n }\r\n else if (task.plannedStartDate != null) {\r\n //Si el task ya tiene una fecha de Inicio y Fin entonces no calculo nada\r\n startDate = task.plannedStartDate;\r\n endDate = task.plannedEndDate;\r\n }\r\n else {\r\n //Sino calculo las fechas de inicio y fin para la tarea con la logica del retroplanning\r\n //Sino calculo las fechas de inicio y fin para la tarea con la logica del retroplanning\r\n if (task.promotionTaskPreviousId != null) {\r\n\r\n angular.forEach(ganttdataitems, function (ganttitem, i) {\r\n if (ganttitem.id == task.previousIdentifier && ganttitem.tasks.length > 0) {\r\n var ganttitemTask = ganttitem.tasks[0];\r\n\r\n startDate = moment(ganttitemTask.to);//comienza cuando termina la anterior\r\n\r\n //aseguro que comienze un dia habil\r\n var dateUpdated = false;\r\n var newStartDate = startDate;\r\n do {\r\n dateUpdated = false;\r\n angular.forEach(self.holidays, function (holiday) {\r\n var holidayMoment = moment(holiday.date);\r\n if (holidayMoment.isoWeekday() < 6 && moment(newStartDate).isSame(holidayMoment)) {\r\n newStartDate.add(1, 'day');\r\n dateUpdated = true;\r\n }\r\n });\r\n\r\n if (moment(startDate).isoWeekday() === 6) {\r\n newStartDate.add(2, 'day');\r\n dateUpdated = true;\r\n }\r\n if (moment(startDate).isoWeekday() === 7) {\r\n newStartDate.add(1, 'day');\r\n dateUpdated = true;\r\n }\r\n\r\n } while (dateUpdated)\r\n\r\n startDate = newStartDate;\r\n\r\n //agrego el offset\r\n startDate = startDate.add(task.startFromDay, 'days');\r\n\r\n endDate = moment(startDate).add(task.durationInDays, 'days');\r\n }\r\n });\r\n }\r\n else {\r\n startDate = moment(initDate).add(task.startFromDay, 'days');\r\n endDate = moment(startDate).add(task.durationInDays, 'days');\r\n }\r\n\r\n //Recorro la vigencia para detectar los dias no laborales y extender el endDate\r\n if (startDate != null && endDate != null) {\r\n var newEndDate = endDate;//posibles finales de la tarea\r\n var startOfOffset = moment(startDate).subtract(task.startFromDay, 'days');//fecha de inicio del rango a evaluar\r\n var remainingOffset = task.durationInDays + task.startFromDay;//dias de rango a evaluar\r\n do {\r\n var holidays = 0;\r\n for (var d = 0; d < remainingOffset; d++) {\r\n angular.forEach(self.holidays, function (holiday) {\r\n var holidayMoment = moment(holiday.date);\r\n if (holidayMoment.isoWeekday() < 6 && moment(startOfOffset).add(d, 'days').isSame(holidayMoment)) {\r\n holidays++;\r\n }\r\n });\r\n }\r\n weekendTotalDays = weekendDays(startOfOffset, newEndDate);\r\n\r\n //nuevo rango...\r\n remainingOffset = holidays + weekendTotalDays;\r\n startOfOffset = new Date(newEndDate);\r\n newEndDate = newEndDate.add(remainingOffset, 'days');\r\n\r\n } while (remainingOffset > 0);\r\n\r\n endDate = newEndDate;\r\n }\r\n }\r\n\r\n\r\n var ganttItem = null;\r\n\r\n //si logre calcular las fechas para el task en esta iteracion la agrego.\r\n if (startDate != null && endDate != null) {\r\n\r\n //uso las fechas calculadas\r\n task.plannedStartDate = startDate;\r\n task.plannedEndDate = endDate;\r\n\r\n ganttItem = {\r\n id: task.identifier,\r\n name: task.name,\r\n tasks: [{ name: task.name, from: startDate, to: endDate, color: colors[color] }],\r\n };\r\n\r\n ganttdataitems.push(ganttItem);\r\n itemsLeft.splice(itemsLeft.indexOf(task), 1);\r\n }\r\n\r\n\r\n });\r\n\r\n }\r\n\r\n //ganttdataitems.push(group);\r\n\r\n self.ganttdata = [];\r\n self.ganttdata = ganttdataitems;\r\n }\r\n\r\n function calculateDurationInDays(tasks, promotionValidFrom) {\r\n\r\n var durationInDays = 0;\r\n\r\n //Empiezo detectando el hito de entrada en vigencia para recorrer esa rama hasta la primer tarea\r\n var previousIdentifier = 0;\r\n angular.forEach(tasks, function (task, i) {\r\n if (task.isStartMilestone) {\r\n previousIdentifier = task.previousIdentifier;\r\n }\r\n });\r\n\r\n //Recorro la rama del hito hasta el final y voy acumulando los dias.\r\n var milestoneBranchFirstTask = null;\r\n for (var i = 0; i < tasks.length; i++) {\r\n angular.forEach(tasks, function (task, i) {\r\n if (task.identifier == previousIdentifier) {\r\n durationInDays += (task.startFromDay + task.durationInDays);\r\n previousIdentifier = task.previousIdentifier;\r\n if (previousIdentifier == null) {\r\n //llegue a la primer tarea de la rama del hito\r\n milestoneBranchFirstTask = task;\r\n }\r\n }\r\n });\r\n }\r\n\r\n //Busco si hay otras ramas ademas de la del hito\r\n var firstTaskOfOtherBranches = [];\r\n angular.forEach(tasks, function (task, i) {\r\n if (task.previousIdentifier == null) { //que sea tarea inicial\r\n if (task.identifier != milestoneBranchFirstTask.identifier) { //que no sea de la rama del milestone\r\n firstTaskOfOtherBranches.push(task);\r\n }\r\n }\r\n });\r\n\r\n if (firstTaskOfOtherBranches.length > 0) {\r\n\r\n //recorro las tareas iniciales delas otras ramas a ver si tienen algun offset negativo mayor a la del milestone\r\n var greatestNegativeOffset = 0;\r\n angular.forEach(tasks, function (task, i) {\r\n //solo me interesan los negativos porque pueden correrme la fecha de incio\r\n if (task.startFromDay < 0 && task.startFromDay < greatestNegativeOffset)\r\n greatestNegativeOffset = task.startFromDay;\r\n });\r\n\r\n //aplico el offset mas grande\r\n var otherBranchesNegativeOffset = 0;\r\n if (greatestNegativeOffset < 0) {\r\n otherBranchesNegativeOffset = greatestNegativeOffset;\r\n\r\n //descuento el offset del milestoneBranchFirstTask porque ya esta contabilizado.\r\n if (milestoneBranchFirstTask.startFromDay < 0)\r\n otherBranchesNegativeOffset -= milestoneBranchFirstTask;\r\n }\r\n\r\n durationInDays -= otherBranchesNegativeOffset;\r\n }\r\n\r\n //////////////////////////DIAS NO LABORALES//////////////////////////\r\n var startDate = new Date(promotionValidFrom).addDays(-(durationInDays));\r\n var startDateOffset = 0;\r\n\r\n //Feriados\r\n var holidayOffset = 0;\r\n for (var d = 1; d <= durationInDays; d++) {\r\n angular.forEach(self.holidays, function (holiday) {\r\n var holidayMoment = moment(holiday.date);\r\n if (holidayMoment.isoWeekday() < 6 && moment(promotionValidFrom).subtract(d, 'days').isSame(holidayMoment)) {\r\n holidayOffset++;\r\n }\r\n });\r\n }\r\n\r\n //agrego el offset del feriado\r\n startDateOffset += holidayOffset;\r\n\r\n //Fines de semana\r\n var weekendTotalDays = weekendDays(startDate, new Date(promotionValidFrom));//fines de semana desde el posible comienzo hasta que empieze la promo\r\n\r\n //agrego al offset los findes de semana\r\n startDateOffset += weekendTotalDays;//feriados mas fines de semanas\r\n\r\n //con startDateOffset (duracion mas feriados mas fines de semanas) ahora tengo una nueva fecha de comienzo...\r\n var newStartDate = new Date(promotionValidFrom).addDays(-(durationInDays + startDateOffset));\r\n //verifico si la extencion de dias no contiene mas dias no laborales\r\n //al agregar mas dias de duracion podemos acumular otros fines de semana/feriados!\r\n var remainingOffset = startDateOffset;\r\n do {\r\n var holidays = 0;\r\n for (var d = 1; d <= remainingOffset; d++) {\r\n angular.forEach(self.holidays, function (holiday) {\r\n var holidayMoment = moment(holiday.date);\r\n if (holidayMoment.isoWeekday() < 6 && moment(startDate).subtract(d, 'days').isSame(holidayMoment)) {\r\n holidays++;\r\n }\r\n });\r\n }\r\n weekendTotalDays = weekendDays(newStartDate, startDate);\r\n remainingOffset = holidays + weekendTotalDays;\r\n startDateOffset += remainingOffset;\r\n //nueva fecha de comienzo\r\n startDate = newStartDate;\r\n newStartDate = newStartDate.addDays(-(remainingOffset));\r\n\r\n\r\n } while (remainingOffset > 0);\r\n\r\n durationInDays += startDateOffset;\r\n\r\n return durationInDays;\r\n\r\n }\r\n\r\n function checkWeekends(date) {\r\n //Si el startDate es sábado o domingo lo muevo\r\n if (date.isoWeekday() === 6) {\r\n date = moment(date).add(2, 'days');\r\n }\r\n else if (date.isoWeekday() === 7) {\r\n date = moment(date).add(1, 'days');\r\n }\r\n\r\n return date;\r\n }\r\n\r\n function countGanttTasks(ganttdataitems) {\r\n var count = 0;\r\n angular.forEach(ganttdataitems, function (ganttitem, i) {\r\n //cuenta solo tasks sin tomar en cuenta los grupos\r\n if (ganttitem.tasks && !ganttitem.children) {\r\n count++;\r\n }\r\n });\r\n\r\n return count;\r\n }\r\n\r\n\r\n //Refactor a terminar del retroplanning\r\n var durationInDays = 0;\r\n var ganttGroups = [];\r\n\r\n function redrawGanttTBD() {\r\n\r\n currentGroups = [];\r\n\r\n //Empiezo detectando el hito de entrada en vigencia para recorrer toda la rama hacia atras\r\n var milestoneTask = getMilestoneTask(self.promotion.tasks);\r\n\r\n //Armo la rama del hito (pero sin el hito)\r\n var milestoneBranchTasks = getMilestoneBranch(self.promotion.tasks, milestoneTask);\r\n\r\n //Inserto la tarea del hito\r\n milestoneTask.plannedStartDate = moment(self.promotion.validFrom);\r\n milestoneTask.plannedEndDate = moment(self.promotion.validTo);\r\n addTaskToGantt(milestoneTask);\r\n\r\n //Comienzo el retroplanning\r\n var endDate = null;\r\n var startDate = null;\r\n var prevOffset = 0;\r\n angular.forEach(milestoneBranchTasks, function (task) {\r\n\r\n if (endDate == null) {\r\n //para el primero\r\n endDate = bypassWeekends(moment(self.promotion.validFrom).subtract(1, 'days'));\r\n }\r\n else {\r\n //para el resto\r\n endDate = bypassWeekends(startDate.subtract(1 + prevOffset, 'days'));\r\n }\r\n\r\n\r\n //calculo el startdate\r\n startDate = bypassWeekends(endDate.subtract(task.durationInDays, 'days'));\r\n\r\n //TODO: agregar offsets\r\n\r\n //setteo las fechas\r\n task.plannedStartDate = startDate;\r\n task.plannedEndDate = endDate;\r\n\r\n //acumulo la duracion\r\n durationInDays += task.durationInDays;\r\n\r\n addTaskToGantt(task);\r\n\r\n });\r\n }\r\n\r\n function getMilestoneTask(tasks) {\r\n var rv = null;\r\n angular.forEach(tasks, function (task, i) {\r\n if (task.isStartMilestone) {\r\n rv = task;\r\n }\r\n });\r\n\r\n return rv;\r\n }\r\n\r\n function getMilestoneBranch(tasks, milestoneTask) {\r\n\r\n var rv = [];\r\n\r\n var previousIdentifier = milestoneTask.previousIdentifier;\r\n while (previousIdentifier != null) {\r\n var task = getTaskByIdentifier(tasks, previousIdentifier);\r\n previousIdentifier = task.previousIdentifier;\r\n rv.push(task);\r\n }\r\n\r\n return rv;\r\n }\r\n\r\n function getTaskByIdentifier(tasks, identifier) {\r\n var rv = null;\r\n angular.forEach(tasks, function (task) {\r\n if (task.identifier == identifier)\r\n rv = task;\r\n });\r\n\r\n return rv;\r\n }\r\n\r\n function addTaskToGantt(task) {\r\n\r\n addTaskToGroup(task);\r\n\r\n if (task.plannedStartDate != null && task.plannedEndDate != null) {\r\n\r\n //defino el color para el grupo\r\n var color = ganttGroups.indexOf(task.groupName);\r\n\r\n var ganttItem = {\r\n id: task.identifier,\r\n name: task.name,\r\n tasks: [{ name: task.name, from: task.plannedStartDate, to: task.plannedEndDate, color: colors[color] }],\r\n };\r\n\r\n self.ganttdata.push(ganttItem);\r\n\r\n\r\n }\r\n }\r\n\r\n function addTaskToGroup(task) {\r\n\r\n //busco si ya existe\r\n var currentGroup = null;\r\n angular.forEach(self.ganttdata, function (gdi) {\r\n if (gdi.name == task.groupName && gdi.children)\r\n currentGroup = gdi;\r\n });\r\n\r\n //si no existia el grupo lo creo\r\n if (currentGroup == null) {\r\n currentGroup = { id: task.groupName, name: task.groupName, children: [] };\r\n self.ganttdata.push(currentGroup);\r\n ganttGroups.push(currentGroup.name);\r\n }\r\n\r\n //agrego la tarea actual como hija del grupo\r\n if (currentGroup.children.indexOf(task.name) == -1)\r\n currentGroup.children.push(task.name);\r\n\r\n }\r\n\r\n function bypassWeekends(endDate) {\r\n var rv = moment(endDate);\r\n\r\n //si el endDate es sábado o domingo lo muevo\r\n if (endDate.isoWeekday() === 7) {\r\n rv = moment(endDate).subtract(2, 'days');\r\n durationInDays += 2;\r\n }\r\n else if (endDate.isoWeekday() === 6) {\r\n rv = moment(endDate).subtract(1, 'days');\r\n durationInDays += 1;\r\n }\r\n\r\n return rv;\r\n }\r\n\r\n Date.prototype.addDays = function (days) {\r\n var dat = new Date(this.valueOf());\r\n dat.setDate(dat.getDate() + days);\r\n return dat;\r\n }\r\n\r\n });","angular.module(\"prisma\")\r\n .controller(\"editInternalPromotionCtrl\", function ($scope, $filter, $state, $window, $timeout, $rootScope, $stateParams, ngDialog, Upload, promotionsService, adminService, serverService, authService) {\r\n var self = this;\r\n\r\n self.isCopy = JSON.parse($stateParams.copy) == true;\r\n self.readOnly = $stateParams.readOnly == \"true\";\r\n self.promotion = null;\r\n self.promotionItems = [];\r\n self.promotionPriceFileUrl = null;\r\n self.campaigns = [];\r\n self.stores = [];\r\n self.storeGroups = [];\r\n self.campaign = null;\r\n self.newComment = \"\";\r\n self.filterStores = { brandId: 0, brandName: '' };\r\n self.canTakePromotion = false;\r\n //var colors = promotionsService.colors;\r\n self.hasPermissionToTakeInternalPromotion = authService.hasPermission('promotion_take_internalPromotion');\r\n self.hasPermissionToCreateInternalPromotion = authService.hasPermission('promotion_create_internalPromotion');\r\n self.hasPermissionOfSuperUser = authService.hasPermission('promotion_superUser');\r\n self.storeGroup = { id: 0, name: '', stores: [] };\r\n self.storesDialogDisabled = false;\r\n self.allowCombinationGroups = false;\r\n\r\n\r\n self.editItem = function (item) {\r\n if (item.promotionMechanicId != null)\r\n self.goToEditMechanic(item);\r\n else\r\n self.goToEditItem(item);\r\n }\r\n\r\n self.goToLoadItem = function () {\r\n $state.go('promotions.editItem', { promotionMediaPageId: $stateParams.promotionMediaPageId, position: -2, promotionId: $stateParams.promotionId, promotionItemType: 1 });\r\n }\r\n self.goToEditItem = function (item) {\r\n $state.go('promotions.editItem', { promotionMediaPageId: $stateParams.promotionMediaPageId, position: -2, promotionItemId: item.id, promotionId: $stateParams.promotionId, promotionItemType: 1, salesUnitOfMeasureId: item.saleUnitOfMeasureId });\r\n }\r\n\r\n self.goToLoadMechanic = function () {\r\n $state.go('promotions.editMechanic', { promotionMediaPageId: $stateParams.promotionMediaPageId, position: -2, promotionId: $stateParams.promotionId, promotionItemType: 1 });\r\n }\r\n self.goToEditMechanic = function (item) {\r\n $state.go('promotions.editMechanic', { promotionMediaPageId: $stateParams.promotionMediaPageId, position: -2, promotionItemId: item.id, promotionMechanicId: item.promotionMechanicId, promotionId: $stateParams.promotionId, promotionItemType: 1 });\r\n }\r\n\r\n self.deleteItem = function (item) {\r\n\r\n swal({\r\n title: 'Esta seguro que desea eliminar el item?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n promotionsService.items.deletePromotionItem(item.id)\r\n .then(function (isOk) {\r\n self.promotionItems.splice(self.promotionItems.indexOf(item), 1);\r\n updateItemList();\r\n swal('Item Eliminado!', 'El item ha sido removido con exito.', 'success');\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de borrado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al borrar este item\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n\r\n\r\n }\r\n\r\n self.takePromotion = function () {\r\n if (self.canTakePromotion) {\r\n promotionsService.internalPromotions.takeInternalPromotion($stateParams.promotionId)\r\n .then(function () {\r\n swal(\"La Promocion fue tomada con exito!\", \"\", \"success\");\r\n self.canTakePromotion = false;\r\n $timeout(function () {\r\n loadData();\r\n }, 1000);\r\n });\r\n }\r\n }\r\n\r\n self.addComment = function () {\r\n if (self.newComment != \"\") {\r\n var chatDto = { sendDate: new Date(), username: \"\", promotionMediaPageId: $stateParams.promotionMediaPageId, message: self.newComment.replace(/(\\r\\n|\\n|\\r)/gm, '') };\r\n promotionsService.internalPromotions.commentInternalPromotion(chatDto)\r\n .then(function (resp) {\r\n self.promotion.pages[0].chats.push(resp);\r\n self.newComment = \"\";\r\n });\r\n }\r\n\r\n }\r\n\r\n self.promotionCampaignChanged = function () {\r\n setCampaign(true);\r\n }\r\n\r\n self.save = function () {\r\n if (self.promotion != null) {\r\n if (self.promotion.stores.length > 0) {\r\n let today = new Date(new Date().setHours(0, 0, 0, 0));\r\n if (!self.promotion.promotionCampaignId || (self.promotion.validFrom < today && !self.hasPermissionOfSuperUser)) {\r\n swal(\"Error\", \"Debe seleccionar una campaña vigente o iniciar la promocion con fecha mayor o igual a hoy.\", \"error\");\r\n }\r\n else {\r\n var title = self.isCopy ? 'Esta seguro que desea copiar la Acción Promocional?'\r\n : 'Esta seguro que desea guardar la Acción Promocional?';\r\n swal({\r\n title: title,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n //teniendo el alcance definido, seteo el brand\r\n for (var i = 0; i < self.brands.length; i++) {\r\n if (self.promotion.stores[0].name.indexOf(self.brands[i].name) > -1) {\r\n self.promotion.brandId = self.brands[i].id;\r\n self.promotion.brandName = self.brands[i].name;\r\n break;\r\n }\r\n }\r\n\r\n //Fix Enter en comentarios dentro de un TEXTAREA, para bajar los excels se rompe.\r\n self.promotion.description ? self.promotion.description.replace(/(\\r\\n|\\n|\\r)/gm, '') : '';\r\n\r\n //Error User Alexandra \r\n var stringvalidFrom = moment(self.promotion.validFrom).toDate().toLocaleDateString('en-US');\r\n self.promotion.validFrom = moment(stringvalidFrom).toDate();\r\n\r\n var stringvalidTo = moment(self.promotion.validTo).toDate().toLocaleDateString('en-US');\r\n self.promotion.validTo = moment(stringvalidTo).toDate();\r\n\r\n if (!self.isCopy) {\r\n promotionsService.internalPromotions.saveInternalPromotion(self.promotion)\r\n .then(function (promotion) {\r\n swal('Accion Promocional Guardada!', 'La accion promocional ' + self.promotion.name + ' se ha guardado exitosamente', 'success');\r\n\r\n promotion.validFrom = moment(promotion.validFrom.split('T')[0]).toDate();\r\n promotion.validTo = moment(promotion.validTo.split('T')[0]).toDate();\r\n //promotion.validFrom = new Date(promotion.validFrom.replace(\"Z\", \"\"));\r\n //promotion.validTo = new Date(promotion.validTo.replace(\"Z\", \"\"));\r\n\r\n self.promotion = promotion;\r\n $stateParams.promotionMediaPageId = self.promotion.pages[0].id;\r\n $stateParams.promotionId = self.promotion.id;\r\n self.isNew = false;\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al guardar esta accion promocional\", \"error\");\r\n }\r\n });\r\n }\r\n else {\r\n promotionsService.promotions.copyPromotion(self.promotion)\r\n .then(function (promotion) {\r\n swal('Accion Promocional Copiada!', 'La accion promocional ' + self.promotion.name + ' se ha copiado exitosamente', 'success');\r\n\r\n $state.go('promotions.promotions');\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de copiado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al copiar esta accion promocional\", \"error\");\r\n }\r\n });\r\n }\r\n }\r\n\r\n });\r\n }\r\n\r\n }\r\n else\r\n swal(\"Error\", \"Debe seleccionar al menos una tienda para poder guardar.\", \"error\");\r\n }\r\n }\r\n\r\n self.inform = function () {\r\n if (self.isCreatorUser) {\r\n swal({\r\n title: 'Informar Promocion',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n }, function (isConfirm) {\r\n if (isConfirm) {\r\n promotionsService.internalPromotions.informNewInternalPromotion($stateParams.promotionId)\r\n .then(function (informed) {\r\n swal(\"Se ha informado con éxito a Promociones\", \"\", \"success\");\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al informar esta accion promocional\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n }\r\n\r\n self.publish = function () {\r\n if (!self.promotion.publishedDate || self.hasPermissionOfSuperUser) //Si ya se publico no podes volver a publicarla a menos que seas superUser\r\n {\r\n swal({\r\n title: 'Publicar Promocion',\r\n type: \"warning\",\r\n text: \"Esto preparara los precios promocionales para enviarlos al ERP, Si se publica mas de una vez, se sobreescribiran los precios promocionales que aun no se hayan informado.\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n }, function (isConfirm) {\r\n if (isConfirm) {\r\n promotionsService.internalPromotions.publishInternalPromotion(self.promotion.id)\r\n .then(function (lastPriceFileUrl) {\r\n self.promotionPriceFileUrl = lastPriceFileUrl;\r\n swal(\"Se ha publicado exitosamente!\", \"\", \"success\");\r\n self.canReject = false;\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al publicar esta accion promocional\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n }\r\n\r\n self.showOverlaps = function (overlaps) {\r\n\r\n self.currentOverlaps = overlaps;\r\n\r\n ngDialog.open({\r\n template: 'overlapDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: $scope\r\n });\r\n }\r\n\r\n //Masive Load\r\n self.batchLoad = function () {\r\n\r\n self.currentStep = 1;\r\n self.gridOptions = {\r\n columnDefs: [\r\n {\r\n headerName: 'Severidad',\r\n width: 100,\r\n pinned: 'left',\r\n field: 'severity',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n rowGroupIndex: 0,\r\n cellRenderer: function (params) {\r\n var severityName = '';\r\n switch (params.value) {\r\n case 'Information': { severityName = ' Info'; break; }\r\n case 'Warning': { severityName = ' Warn'; break; }\r\n case 'Error': { severityName = ' Error'; break; }\r\n }\r\n return severityName;\r\n }\r\n },\r\n {\r\n headerName: 'Fila',\r\n width: 50,\r\n pinned: 'left',\r\n field: 'row',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n {\r\n headerName: 'Categoria',\r\n width: 150,\r\n rowGroupIndex: 1,\r\n pinned: 'left',\r\n field: 'category',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n {\r\n headerName: 'Descripcion',\r\n width: 350,\r\n pinned: 'left',\r\n field: 'description',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n ],\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n rowHeight: 35,\r\n suppressHorizontalScroll: false,\r\n suppressCellSelection: true,\r\n groupUseEntireRow: true,\r\n groupSuppressAutoColumn: false,\r\n groupDefaultExpanded: 0,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n angularCompileRows: true,\r\n }\r\n\r\n self.showNextStep = function () {\r\n if (self.currentStep > 0 && self.currentStep < 4) {\r\n self.currentStep++;\r\n loadResults([]);\r\n }\r\n }\r\n\r\n self.downloadExcel = function () {\r\n var html = '';\r\n\r\n //header\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n\r\n updateItemList();\r\n\r\n angular.forEach(self.promotionItems, function (item) {\r\n html += buildRow(item);\r\n });\r\n\r\n html += '
Promocion ID (' + self.promotion.id + ')ArticuloUMVDescripcion SAPPrecioPrecio BonusPuntos BonusPrecio Normal
';\r\n\r\n var exportHref = ExportToExcel(html, 'Pagina1');\r\n $timeout(function () {\r\n location.href = exportHref;\r\n self.showNextStep();\r\n }, 100); // trigger download\r\n\r\n }\r\n\r\n function buildRow(item) {\r\n\r\n var html = '';\r\n\r\n if (item != null && item.promotionMechanicId == null) { //Solo los que son items, elimino las mecanicas del download\r\n html += '' + $stateParams.promotionId +\r\n '' + item.code.replace(/^0+/, '') +\r\n '' + (item.uom || '') +\r\n '' + (item.itemName || '') +\r\n '' + (item.promotionalPrice || '') +\r\n '' + (item.loyaltyPrice || '') +\r\n '' + (item.loyaltyPoints || '') +\r\n '' + (item.normalPromotionalPrice || '') +\r\n '';\r\n }\r\n\r\n return html;\r\n }\r\n\r\n self.uploadFile = function (files) {\r\n if (files && files.length > 0) {\r\n self.isBusy = true;\r\n var url = serverService.getApiUrl() + '/promotion/items/uploadItemsBatchFile/' + $stateParams.promotionMediaPageId;\r\n Upload.upload({\r\n url: url,\r\n data: { file: files[0] }\r\n }).then(function (response) {\r\n var importerResults = response.data;\r\n processImporterResults(importerResults);\r\n if (!anyError(importerResults)) {\r\n self.finishedUpload = true;\r\n }\r\n });\r\n }\r\n }\r\n\r\n self.validateUploadedFile = function () {\r\n self.isBusy3 = true;\r\n promotionsService.items.validateItemsBatchFileInternal($stateParams.promotionMediaPageId)\r\n .then(function (dto) {\r\n processImporterResults(dto);\r\n if (!anyError(dto)) {\r\n self.finishedValidation = true;\r\n }\r\n });\r\n\r\n }\r\n\r\n self.reUploadFile = function () {\r\n self.currentStep = 2;\r\n loadResults([]);\r\n self.files = null;\r\n self.finishedUpload = false;\r\n self.finishedValidation = false;\r\n self.finishedUpdate = false;\r\n }\r\n\r\n self.updateItems = function () {\r\n self.isBusy4 = true;\r\n promotionsService.items.updateItemsInBatchInternal($stateParams.promotionMediaPageId)\r\n .then(function (dto) {\r\n processImporterResults(dto);\r\n if (!anyError(dto)) {\r\n self.finishedUpdate = true;\r\n loadItems();\r\n }\r\n });\r\n\r\n }\r\n\r\n self.finish = function () {\r\n self.currentStep = 1;\r\n loadResults([]);\r\n\r\n self.finishedUpload = false;\r\n self.finishedValidation = false;\r\n self.finishedUpdate = false;\r\n\r\n ngDialog.close();\r\n\r\n loadPromotion();\r\n }\r\n\r\n function processImporterResults(importerResults) {\r\n self.isBusy = false;\r\n self.isBusy2 = false;\r\n self.isBusy3 = false;\r\n self.isBusy4 = false;\r\n\r\n if (importerResults.length > 0) {\r\n loadResults(importerResults);\r\n }\r\n if (anyError(importerResults)) {\r\n self.error = true;\r\n }\r\n else\r\n self.error = false;\r\n }\r\n\r\n function loadResults(results) {\r\n self.gridOptions.api.setRowData(results);\r\n self.gridOptions.api.refreshView();\r\n\r\n self.gridVisible = results.length > 0 ? true : false;\r\n }\r\n\r\n function anyError(importerResults) {\r\n var error = false;\r\n for (var i = 0; i < importerResults.length; i++) {\r\n if (importerResults[i].severity === 'Error')\r\n error = true;\r\n }\r\n\r\n return error;\r\n }\r\n\r\n ngDialog.open({\r\n template: 'batchLoadDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n controller: function () {\r\n return self;\r\n },\r\n controllerAs: 'ct',\r\n });\r\n }\r\n\r\n function ExportToExcel(tableHtml, worksheetName) {\r\n var uri = 'data:application/vnd.ms-excel;base64,',\r\n template = '{table}
',\r\n base64 = function (s) { return $window.btoa(unescape(encodeURIComponent(s))); },\r\n format = function (s, c) { return s.replace(/{(\\w+)}/g, function (m, p) { return c[p]; }) };\r\n\r\n var ctx = { worksheet: worksheetName, table: tableHtml },\r\n href = uri + base64(format(template, ctx));\r\n return href;\r\n }\r\n\r\n //Stores\r\n self.openStoresDialog = function () {\r\n ngDialog.open({\r\n template: 'storesDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n //data: task,\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.storesCount = 0;\r\n\r\n self.selectStore = function (store) {\r\n\r\n if (!self.storesDialogDisabled) {\r\n\r\n store.selected = !store.selected;\r\n\r\n if (store.selected)\r\n self.storesCount++;\r\n else\r\n self.storesCount--;\r\n }\r\n }\r\n\r\n self.selectStoreGroup = function (storeGroup) {\r\n\r\n self.promotion.promotionStoreGroupId = null;\r\n\r\n var brandOfStoreGroup;\r\n angular.forEach(self.brands, function (brand) {\r\n\r\n //para los inconsistentes casos en que las tiendas no tienen brand el workaround es:\r\n //matchiar el nombre de la tienda con el nombre del brand\r\n if (storeGroup.stores[0].brand == brand.name || storeGroup.stores[0].name.indexOf(brand.name) > -1) {\r\n brandOfStoreGroup = brand;\r\n }\r\n });\r\n\r\n self.changeStoresFilter(brandOfStoreGroup);\r\n\r\n if (!self.allowCombinationGroups) {//combinacion off\r\n storeGroup.isSelected = storeGroup.isSelected ? false : true;\r\n\r\n if (storeGroup.isSelected) {\r\n angular.forEach(self.storeGroups, function (sg) {\r\n if (storeGroup.id != sg.id) {\r\n sg.isSelected = false;\r\n }\r\n });\r\n\r\n self.promotion.promotionStoreGroupId = storeGroup.id;\r\n }\r\n self.unselectAll(); //deselecciono todas las tiendas.\r\n }\r\n\r\n self.storesDialogDisabled = storeGroup.isSelected; //deshabilito el pop up si quedo un grupo seleccionado\r\n\r\n //seleccion de tiendas\r\n if (storeGroup.isSelected || self.allowCombinationGroups) {\r\n angular.forEach(self.stores, function (store) {\r\n\r\n angular.forEach(storeGroup.stores, function (storeInGroup) {\r\n if (storeInGroup.id == store.id) {\r\n\r\n if (!store.selected) {\r\n self.storesCount++;\r\n }\r\n store.selected = true;\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n self.changeSwith = function () {\r\n self.showCombinationGroups = !self.showCombinationGroups;\r\n self.unselectAll();\r\n }\r\n\r\n self.unselectAll = function () {\r\n angular.forEach(self.stores, function (store) {\r\n if (store.selected) {\r\n store.selected = false;\r\n self.storesCount--;\r\n }\r\n });\r\n }\r\n\r\n self.saveStores = function (close) {\r\n self.promotion.stores = [];\r\n\r\n angular.forEach(self.stores, function (store) {\r\n if (store.selected) {\r\n self.promotion.stores.push(store);\r\n }\r\n });\r\n\r\n self.storesCount = self.promotion.stores.length;\r\n\r\n if (close)\r\n ngDialog.close();\r\n }\r\n\r\n self.reject = function () {\r\n\r\n swal({\r\n title: 'Accion irreversible',\r\n text: 'Rechazar esta acción promocional?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n promotionsService.promotions.rejectPromotion($stateParams.promotionId)\r\n .then(function (isOk) {\r\n swal('Promocion Rechazada!', '', 'success');\r\n $state.go('promotions.promotions');\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de rechazo continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al rechazar esta promocion\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.deleteGroup = function (storeGroup) {\r\n swal({\r\n title: 'Esta seguro que desea Eliminar el grupo ' + storeGroup.name + '?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n promotionsService.stores.deleteGroup(storeGroup.id)\r\n .then(function (promotion) {\r\n self.newStoreGroup();\r\n loadStoreGroups();\r\n swal('Grupo Eliminado!', 'El grupo ' + storeGroup.name + ' se ha eliminado exitosamente', 'success');\r\n },\r\n function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n loadStoreGroups();\r\n swal(\"Error\", \"Hubo un error al eliminar este grupo\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.changeStoresFilter = function (brand) {\r\n self.filterStores.brandId = brand.id;\r\n self.filterStores.brandName = brand.name;\r\n }\r\n\r\n self.filterStoresByBrand = function (store) {\r\n if (store.brandId) {//en Peru se detectaron stores con brandId null en el maestro de tiendas! en colombia no.\r\n return store.brandId == self.filterStores.brandId;\r\n }\r\n return store.name.indexOf(self.filterStores.brandName) > -1;\r\n }\r\n\r\n\r\n self.newStoreGroup = function () {\r\n self.storeGroup = { id: 0, name: '', stores: [] };\r\n\r\n self.unselectAll();\r\n }\r\n\r\n self.saveStoresAndGroup = function () {\r\n if (self.storeGroup.name == '' || self.storesCount == 0) {\r\n swal(\"Error\", \"Para guardar este grupo de tiendas debes completar su nombre y seleccionar al menos 1 tienda\", \"error\");\r\n }\r\n else {\r\n swal({\r\n title: 'Esta seguro que desea guardar este Grupo de Tiendas?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: true,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n //Primero asocio las tiendas a la promo\r\n self.saveStores(false);\r\n\r\n self.storeGroup.stores = [];\r\n\r\n //Despues asocio las tiendas al grupo\r\n angular.forEach(self.stores, function (store) {\r\n if (store.selected)\r\n self.storeGroup.stores.push(store);\r\n });\r\n\r\n promotionsService.stores.saveStoreGroup(self.storeGroup)\r\n .then(function (storeGroup) {\r\n swal('Grupo de Tiendas Guardado!', 'El Grupo de Tiendas ' + self.storeGroup.name + ' se ha guardado exitosamente', 'success');\r\n\r\n if (self.storeGroup.id == 0) {\r\n self.storeGroups.push(storeGroup);\r\n }\r\n self.storeGroup = storeGroup;\r\n self.newStoreGroup();\r\n \r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al guardar este grupo de tiendas\", \"error\");\r\n }\r\n });\r\n }\r\n\r\n });\r\n }\r\n }\r\n\r\n self.closeStoresDialog = function () {\r\n\r\n ngDialog.close();\r\n }\r\n\r\n\r\n var validFromReverted = false;\r\n $scope.$watch('ct.promotion.validFrom', function (newVal, oldVal) {\r\n\r\n if (validFromReverted) {\r\n validFromReverted = false;\r\n return;\r\n }\r\n\r\n var hasError = false;\r\n\r\n\r\n if (newVal) {\r\n\r\n //Validar que el desde sea anterior al hasta\r\n if (moment(new Date(newVal.getUTCFullYear(), newVal.getUTCMonth(), newVal.getUTCDate())).isAfter(moment(self.promotion.validTo), 'day')) {\r\n swal(\"Error\", \"La fecha Desde debe ser menor a la fecha hasta\", \"error\");\r\n hasError = true;\r\n }\r\n\r\n //Validar que el desde sea mayor o igual al hasta\r\n if (moment(new Date(newVal.getUTCFullYear(), newVal.getUTCMonth(), newVal.getUTCDate())).isBefore(moment(self.campaign.validFrom), 'day')) {\r\n swal(\"Error\", \"La fecha Desde debe ser mayor o igual a la fecha de inicio de la campaña: \" + new Date(self.campaign.validFrom), \"error\");\r\n hasError = true;\r\n }\r\n\r\n }\r\n\r\n }, true);\r\n\r\n var validToReverted = false;\r\n $scope.$watch('ct.promotion.validTo', function (newVal, oldVal) {\r\n\r\n if (validToReverted) {\r\n validToReverted = false;\r\n return;\r\n }\r\n\r\n var hasError = false;\r\n\r\n if (newVal) {\r\n //Validar que el desde sea anterior al hasta\r\n if (moment(newVal).isBefore(moment(self.promotion.validFrom), 'day')) {\r\n swal(\"Error\", \"La fecha Hasta debe ser mayor a la fecha desde\", \"error\");\r\n hasError = true;\r\n }\r\n\r\n //Validar que el desde sea mayor o igual al hasta\r\n if (moment(newVal).isAfter(moment(self.campaign.validTo), 'day')) {\r\n swal(\"Error\", \"La fecha Hasta debe ser menor o igual a la fecha de fin de la campaña: \" + new Date(self.campaign.validTo), \"error\");\r\n hasError = true;\r\n }\r\n }\r\n\r\n }, true);\r\n\r\n function setCampaign(changeValidity) {\r\n angular.forEach(self.campaigns, function (campaign) {\r\n if (self.promotion.promotionCampaignId == campaign.id) {\r\n self.campaign = campaign;\r\n\r\n if (changeValidity) {\r\n self.promotion.validFrom = new Date(campaign.validFrom);\r\n self.promotion.validTo = new Date(campaign.validTo);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function loadStoreGroups() {\r\n promotionsService.stores.getStoreGroups()\r\n .then(function (storeGroups) {\r\n self.storeGroups = storeGroups;\r\n\r\n //selecciono el grupo de tiendas de la promocion, si es que tiene.\r\n if (self.promotion.promotionStoreGroupId != null) {\r\n angular.forEach(self.storeGroups, function (sg) {\r\n if (self.promotion.promotionStoreGroupId === sg.id) {\r\n self.selectStoreGroup(sg);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n function loadStores() {\r\n promotionsService.stores.getStores()\r\n .then(function (stores) {\r\n self.stores = stores;\r\n\r\n angular.forEach(self.promotion.stores, function (promotionStore) {\r\n angular.forEach(self.stores, function (store) {\r\n if (promotionStore.id == store.id)\r\n store.selected = true;\r\n });\r\n });\r\n\r\n loadStoreGroups();\r\n\r\n });\r\n }\r\n\r\n function loadItems() {\r\n self.isLoadingItems = true;\r\n self.promotionItems = [];\r\n promotionsService.internalPromotions.getPromotionItems($stateParams.promotionMediaPageId)\r\n .then(function (items) {\r\n self.promotionItems = items;\r\n self.itemList = [];\r\n self.itemCounter = items.length > 50 ? 50 : items.length;\r\n updateItemList();\r\n self.isLoadingItems = false;\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"Los items de esta promocion se encuentran demorados.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Error al cargar los items de esta promocion\", \"error\");\r\n self.isLoadingItems = false;\r\n }\r\n\r\n\r\n });\r\n }\r\n\r\n //actualiza los items de la mecanica segun la lista visible\r\n function updateItemList() {\r\n angular.forEach(self.itemList, function (item) {\r\n angular.forEach(self.promotionItems, function (it) {\r\n if (item.id == it.id)\r\n it = item;\r\n });\r\n });\r\n self.itemList = self.promotionItems.slice(0, self.itemCounter);\r\n }\r\n\r\n self.getPromotionOverlaps = function () {\r\n if (self.overlaps) {\r\n if (self.overlaps.length) {\r\n self.showOverlaps(self.overlaps);\r\n }\r\n else {\r\n swal(\"No hay solapamientos.\", \"\", \"info\");\r\n }\r\n }\r\n else {\r\n self.loadingOverlaps = true;\r\n promotionsService.internalPromotions.getOverlaps($stateParams.promotionId)\r\n .then(function (overlaps) {\r\n self.overlaps = overlaps;\r\n self.loadingOverlaps = false;\r\n if (self.overlaps.length) {\r\n self.showOverlaps(self.overlaps);\r\n }\r\n else {\r\n swal(\"No hay solapamientos.\", \"\", \"info\");\r\n }\r\n });\r\n }\r\n }\r\n\r\n self.viewMore = function () {\r\n self.itemCounter += 50;\r\n updateItemList();\r\n }\r\n\r\n function loadData() {\r\n promotionsService.stores.getBrands()\r\n .then(function (brands) {\r\n self.brands = brands;\r\n if (brands.length > 0) {\r\n self.filterStores.brandName = brands[0].name;\r\n self.filterStores.brandId = brands[0].id;\r\n }\r\n });\r\n promotionsService.campaigns.getCampaigns()\r\n .then(function (campaigns) {\r\n self.campaigns = campaigns;\r\n if ($stateParams.rejected == 'true') {\r\n promotionsService.internalPromotions.getRejectedPromotion($stateParams.promotionId)\r\n .then(function (promotion) {\r\n promotion.validFrom = moment(promotion.validFrom.split('T')[0]).toDate();\r\n promotion.validTo = moment(promotion.validTo.split('T')[0]).toDate();\r\n //promotion.validFrom = new Date(promotion.validFrom.replace(\"Z\", \"\"));\r\n //promotion.validTo = new Date(promotion.validTo.replace(\"Z\", \"\"));\r\n self.promotion = promotion;\r\n self.promotionPriceFileUrl = promotion.lastPriceFileUrl;\r\n self.storesCount = self.promotion.stores.length;\r\n setCampaign(false);\r\n loadStores();\r\n });\r\n\r\n loadItems();\r\n }\r\n else if ($stateParams.promotionId != '0') {\r\n self.isNew = false;\r\n promotionsService.internalPromotions.getInternalPromotion($stateParams.promotionId)\r\n .then(function (promotion) {\r\n promotion.validFrom = moment(promotion.validFrom.split('T')[0]).toDate();\r\n promotion.validTo = moment(promotion.validTo.split('T')[0]).toDate();\r\n //promotion.validFrom = new Date(promotion.validFrom.replace(\"Z\", \"\"));\r\n //promotion.validTo = new Date(promotion.validTo.replace(\"Z\", \"\"));\r\n self.promotion = promotion;\r\n self.promotionPriceFileUrl = promotion.lastPriceFileUrl;\r\n self.isCreatorUser = authService.authentication.userName == self.promotion.createdUserName;\r\n self.canPublish = self.hasPermissionOfSuperUser || (self.hasPermissionToTakeInternalPromotion && self.promotion.informed);\r\n\r\n if (!self.promotion.taken && self.canPublish)\r\n self.canTakePromotion = true;\r\n\r\n self.canReject = self.hasPermissionToTakeInternalPromotion && self.promotion.status == 'Planeada' && self.promotion.publishedDate == null;\r\n\r\n self.storesCount = self.promotion.stores.length;\r\n\r\n setCampaign(false);\r\n\r\n loadStores();\r\n });\r\n\r\n loadItems();\r\n }\r\n else {\r\n self.isNew = true;\r\n self.promotion = { id: 0, companyId: $rootScope.companyId, name: '', description: '', promotionCampaignId: 0, stores: [], pages: [{ chats: [] }], promotionType: 2 }; //Creo promo vacia\r\n self.isCreatorUser = true;\r\n self.canPublish = false;\r\n loadStores();\r\n\r\n }\r\n });\r\n\r\n }\r\n\r\n loadData();\r\n\r\n });","angular.module(\"prisma\")\r\n .controller(\"promotionsCalendarCtrl\", function ($scope, $filter, $rootScope, $stateParams, $state, $timeout, $element, promotionsService, adminService, ngDialog) {\r\n var self = this;\r\n\r\n self.promotions = null;\r\n self.campaigns = [];\r\n self.promotionMediaTypes = promotionsService.promotionMediaTypes;\r\n self.promotionMediaTypes.splice(5, 1);\r\n self.userAreas = promotionsService.userAreas;\r\n var colors = promotionsService.colors;\r\n\r\n self.selectedCampaign = 'Todas';\r\n self.selectedMediaType = 'Todos';\r\n self.selectedUserArea = 'Todas';\r\n self.selectedCampaignId = 0;\r\n self.selectedMediaTypeId = 0;\r\n self.selectedView = 'Mensual';\r\n\r\n self.ganttdata = [];\r\n\r\n loadData();\r\n\r\n self.ganttOptions = {\r\n columns: [],\r\n columnsHeaders: { 'model.name': 'Tarea' },\r\n columnsClasses: { 'model.name': 'gantt-column-name' },\r\n columnMagnet: '1 day',\r\n currentDate: 'line',\r\n currentDateValue: moment(new Date()),\r\n timeFramesWorkingMode: 'hidden',\r\n timeFramesNonWorkingMode: 'hidden',\r\n scale: 'month',\r\n timeFrames: {\r\n 'day': {\r\n start: moment('8:00', 'HH:mm'),\r\n end: moment('20:00', 'HH:mm'),\r\n color: '#ACFFA3',\r\n working: true,\r\n default: true\r\n },\r\n 'noon': {\r\n start: moment('12:00', 'HH:mm'),\r\n end: moment('13:30', 'HH:mm'),\r\n working: false,\r\n default: true\r\n },\r\n 'closed': {\r\n working: false,\r\n default: true\r\n },\r\n 'weekend': {\r\n working: false\r\n },\r\n 'holiday': {\r\n working: false,\r\n color: 'red',\r\n classes: ['gantt-timeframe-holiday']\r\n },\r\n 'startPromotion': {\r\n working: true,\r\n color: 'green',\r\n classes: ['gantt-timeframe-holiday']\r\n }\r\n },\r\n dateFrames: {\r\n 'weekend': {\r\n evaluator: function (date) {\r\n return date.isoWeekday() === 6 || date.isoWeekday() === 7;\r\n },\r\n targets: ['weekend']\r\n },\r\n 'startPromotion': {\r\n evaluator: function (date) {\r\n return date != null && self.promotion.validFrom != null ? moment(date).isSame(moment(self.promotion.validFrom)) : false;\r\n },\r\n targets: ['startPromotion']\r\n },\r\n },\r\n api: function (api) {\r\n // API Object is used to control methods and events from angular-gantt.\r\n self.api = api;\r\n\r\n api.core.on.ready($scope, function () {\r\n if (api.tasks.on.moveBegin) {\r\n api.tasks.on.moveEnd($scope, function (task) {\r\n taskMoved(task);\r\n });\r\n\r\n api.tasks.on.resizeEnd($scope, function (task) {\r\n taskMoved(task);\r\n });\r\n }\r\n })\r\n }\r\n };\r\n\r\n function taskMoved(movedTask) {\r\n angular.forEach(self.promotions, function (promotion) {\r\n angular.forEach(promotion.tasks, function (task) {\r\n\r\n if (movedTask.row.model.id == task.id) {\r\n task.plannedStartDate = movedTask.row.from;\r\n task.plannedEndDate = movedTask.row.to;\r\n }\r\n });\r\n });\r\n }\r\n\r\n function loadData() {\r\n\r\n promotionsService.campaigns.getCampaigns()\r\n .then(function (campaigns) {\r\n self.campaigns = campaigns;\r\n\r\n promotionsService.promotions.getPromotionsCalendar()\r\n .then(function (promotions) {\r\n self.promotions = promotions;\r\n redrawGantt();\r\n });\r\n\r\n });\r\n }\r\n\r\n //self.save = function () {\r\n // if (self.promotion != null) {\r\n // swal({\r\n // title: 'Esta seguro que desea guardar los cambios realizados al Calendario?',\r\n // type: \"warning\",\r\n // showCancelButton: true,\r\n // confirmButtonColor: \"#1AB394\",\r\n // confirmButtonText: \"Continuar\",\r\n // cancelButtonText: \"Cancelar\",\r\n // showLoaderOnConfirm: true,\r\n // closeOnConfirm: false,\r\n // closeOnCancel: true\r\n // },\r\n // function (isConfirm) {\r\n // if (isConfirm) {\r\n // /*\r\n // promotionsService.promotions.savePromotion(self.promotion)\r\n // .then(function (promotion) {\r\n // swal('Accion Promocional Guardada!', 'La accion promocional ' + self.promotion.name + ' se ha guardado exitosamente', 'success');\r\n // self.promotion = promotion;\r\n // }, function (status) {\r\n // if (status == 502) {\r\n // swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n // }\r\n // else {\r\n // swal(\"Error\", \"Hubo un error al guardar esta accion promocional\", \"error\");\r\n // }\r\n // });\r\n // */\r\n // }\r\n\r\n // });\r\n // }\r\n //}\r\n\r\n self.changeView = function (scale, view) {\r\n // Fix Issue #6 Falta la apertura diaria del calendario.\r\n //if (scale == 'day') {\r\n // if (self.selectedCampaign == 'Todas')\r\n // swal(\"Error\", \"Debe filtrar por una campaña para utilizar la vista diaria del gantt.\", \"error\")\r\n // else {\r\n // self.ganttOptions.scale = scale;\r\n // self.selectedView = view;\r\n // }\r\n //}\r\n //else {\r\n // self.ganttOptions.scale = scale;\r\n // self.selectedView = view;\r\n //}\r\n self.ganttOptions.scale = scale;\r\n self.selectedView = view;\r\n \r\n $timeout(function () {\r\n // Reinicia el scroll del contenedor.\r\n $element.find('.gantt-scrollable').scrollLeft(0);\r\n });\r\n }\r\n\r\n self.filterByCampaign = function (campaignName, campaignId) {\r\n if (self.selectedView == 'Diario' && campaignId == 0)\r\n self.changeView('week', 'Semanal');\r\n\r\n self.selectedCampaign = campaignName;\r\n self.selectedCampaignId = campaignId;\r\n\r\n redrawGantt();\r\n }\r\n\r\n self.filterByMediaType = function (mediaTypeName, mediaTypeId) {\r\n\r\n self.selectedMediaType = mediaTypeName;\r\n self.selectedMediaTypeId = mediaTypeId;\r\n\r\n redrawGantt();\r\n }\r\n\r\n self.filterByUserArea = function (userArea) {\r\n\r\n self.selectedUserArea = userArea;\r\n\r\n redrawGantt();\r\n }\r\n\r\n /**\r\n * Devuelve el tamaño de las columnas segun el tipo de vista.\r\n * Fix Issue #6 Falta la apertura diaria del calendario.\r\n * Link: https://www.angular-gantt.com/configuration/attributes/#column-width\r\n */\r\n self.getColumnWidth = function () {\r\n var ret = undefined;\r\n\r\n // Si la vista es por día se fuerza un ancho de columna.\r\n // Para todas las otras vistas se deja que lo resuelve el componente gantt.\r\n if (self.ganttOptions.scale === 'day') {\r\n // TODO: Verificar el valor del ancho para distintas resoluciones. \r\n ret = 22; \r\n }\r\n\r\n return ret;\r\n };\r\n\r\n //self.publish = function () {\r\n // if ($stateParams.taskId) {\r\n // promotionsService.tasks.publishTask($stateParams.taskId)\r\n // .then(function (task) {\r\n // swal('Tarea Publicada!', 'La tarea se ha publicado exitosamente', 'success');\r\n\r\n // $state.go('promotions.myTasks');\r\n // });\r\n // }\r\n //}\r\n\r\n //self.canPublish = function () {\r\n // if ($stateParams.taskId && parseInt($stateParams.taskId) > 0)\r\n // return true;\r\n\r\n // return false;\r\n //}\r\n\r\n function redrawGantt() {\r\n var ganttdataitems = [];\r\n\r\n angular.forEach(self.promotions, function (promotion, i) {\r\n\r\n var draw = true;\r\n\r\n if (self.selectedCampaignId != 0 && promotion.promotionCampaignId != self.selectedCampaignId) {\r\n draw = false;\r\n }\r\n\r\n if (self.selectedMediaTypeId != 0 && promotion.promotionMediaTypeId != self.selectedMediaTypeId) {\r\n draw = false;\r\n }\r\n\r\n if (draw) {\r\n\r\n var promotionGroup = { id: 'promotionGroup' + i, name: promotion.name, children: [] };\r\n\r\n var prevGroupName = '';\r\n var groupCount = 0;\r\n var groupId = 1;\r\n var group = { id: '', name: '', children: [] };\r\n\r\n //Paso 1: Recorro todos los tasks para crear los items de los groupnames\r\n angular.forEach(promotion.tasks, function (task) {\r\n\r\n var drawTask = true;\r\n if (self.selectedUserArea != 'Todas' && task.userArea != self.selectedUserArea) {\r\n drawTask = false;\r\n }\r\n\r\n if (drawTask) {\r\n if (prevGroupName != '' && prevGroupName != task.groupName) {\r\n var groupCopy = {};\r\n ganttdataitems.push(angular.copy(group, groupCopy));\r\n promotionGroup.children.push(groupCopy.id);\r\n\r\n groupCount++;\r\n group.children = [];\r\n groupId++;\r\n }\r\n\r\n group.id = 'taskGroup' + promotion.id + '-' + groupId;\r\n\r\n group.name = task.groupName;\r\n group.children.push(task.id);\r\n\r\n if (groupCount > colors.length) {\r\n groupCount = 0;\r\n }\r\n\r\n var taskFrom = null;\r\n var taskTo = null;\r\n\r\n var ganttItem = null;\r\n\r\n if (task.isStartMilestone) {\r\n taskFrom = moment(promotion.validFrom);\r\n taskTo = moment(promotion.validTo);\r\n }\r\n else {\r\n taskFrom = moment(task.plannedStartDate);\r\n taskTo = moment(task.plannedEndDate).subtract(1,'second');\r\n }\r\n\r\n ganttItem = {\r\n id: task.id,\r\n name: task.name,\r\n tasks: [{ name: task.name, from: taskFrom, to: taskTo, color: colors[groupCount] }],\r\n };\r\n\r\n if (task.promotionTaskPreviousId != null) {\r\n //TODO: esto no está funcando\r\n ganttItem.tasks[0].dependencies = [{ from: task.promotionTaskPreviousId }];\r\n }\r\n\r\n ganttdataitems.push(ganttItem);\r\n\r\n prevGroupName = task.groupName;\r\n }\r\n });\r\n\r\n if (group.children.length > 0) {\r\n ganttdataitems.push(group);\r\n\r\n promotionGroup.children.push(group.id);\r\n }\r\n\r\n if (promotionGroup.children.length > 0) {\r\n ganttdataitems.push(promotionGroup);\r\n }\r\n }\r\n });\r\n\r\n self.ganttdata = ganttdataitems;\r\n }\r\n\r\n var currentGroups = [];\r\n function redrawGanttNEW() {\r\n var ganttdataitems = [];\r\n\r\n angular.forEach(self.promotions, function (promotion, i) {\r\n\r\n var draw = true;\r\n\r\n if (self.selectedCampaignId != 0 && promotion.promotionCampaignId != self.selectedCampaignId) {\r\n draw = false;\r\n }\r\n\r\n if (self.selectedMediaTypeId != 0 && promotion.promotionMediaTypeId != self.selectedMediaTypeId) {\r\n draw = false;\r\n }\r\n\r\n if (draw) {\r\n\r\n //Paso 1: Recorro todos los tasks para crear los items de los groupnames\r\n angular.forEach(promotion.tasks, function (task) {\r\n\r\n var drawTask = true;\r\n if (self.selectedUserArea != 'Todas' && task.userArea != self.selectedUserArea) {\r\n drawTask = false;\r\n }\r\n\r\n if (drawTask) {\r\n\r\n var currentGroup = null;\r\n angular.forEach(ganttdataitems, function (gdi) {\r\n if (gdi.id == (promotion.name + '-' + task.groupName) && gdi.children)\r\n currentGroup = gdi;\r\n });\r\n\r\n if (currentGroup == null) {\r\n currentGroup = {\r\n id: promotion.name + '-' + task.groupName,\r\n name: task.groupName,\r\n children: []\r\n };\r\n\r\n ganttdataitems.push(currentGroup);\r\n currentGroups.push(currentGroup.id);\r\n }\r\n\r\n //agrego la tarea actual como hija del grupo\r\n if (currentGroup.children.indexOf(task.id) == -1)\r\n currentGroup.children.push(task.id);\r\n\r\n //defino el color para el grupo\r\n var color = currentGroups.indexOf(currentGroup.id);\r\n\r\n var taskFrom = null;\r\n var taskTo = null;\r\n\r\n var ganttItem = null;\r\n\r\n if (task.isStartMilestone) {\r\n taskFrom = moment(promotion.validFrom);\r\n taskTo = moment(promotion.validTo);\r\n }\r\n else {\r\n taskFrom = moment(task.plannedStartDate);\r\n taskTo = moment(task.plannedEndDate);\r\n }\r\n\r\n ganttItem = {\r\n id: task.id,\r\n name: task.name,\r\n tasks: [{ name: task.name, from: taskFrom, to: taskTo, color: colors[color] }],\r\n };\r\n\r\n //if (task.promotionTaskPreviousId != null) {\r\n // //TODO: esto no está funcando\r\n // ganttItem.tasks[0].dependencies = [{ from: task.promotionTaskPreviousId }];\r\n //}\r\n\r\n ganttdataitems.push(ganttItem);\r\n\r\n prevGroupName = task.groupName;\r\n }\r\n });\r\n\r\n\r\n //if (promotionGroup.children.length > 0) {\r\n // ganttdataitems.push(promotionGroup);\r\n //}\r\n }\r\n });\r\n\r\n self.ganttdata = ganttdataitems;\r\n }\r\n\r\n });","angular.module(\"prisma\")\r\n .controller(\"BIReportCtrl\", function ($scope, $rootScope, $state, $stateParams, promotionsService, $timeout, ngDialog, authService) {\r\n\r\n var self = this;\r\n\r\n self.hasPermissionToDownLoad = authService.hasPermission('promotion_bi_report');\r\n\r\n self.isLoading = false;\r\n\r\n self.openStatusDialog = function () {\r\n var newScope = $scope.$new();\r\n newScope.generateReport = function (planned) {\r\n self.isLoading = true;\r\n promotionsService.reports.buildIBIReport(planned)\r\n .then(function () {\r\n init();\r\n },function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso esta demorado, no intente generar otro reporte por unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"El reporte no se generará, inténtelo nuevamente\", \"error\");\r\n }\r\n });\r\n\r\n ngDialog.close();\r\n }\r\n\r\n ngDialog.open({\r\n template: 'statusDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n }\r\n\r\n function init() {\r\n self.isLoading = true;\r\n promotionsService.reports.getLastBIReports()\r\n .then(function (reportList) {\r\n self.reportList = reportList;\r\n self.isLoading = false;\r\n });\r\n \r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"priceSurveysCtrl\", function ($scope, $rootScope, $state, $stateParams, promotionsService, authService, $timeout, ngDialog) {\r\n\r\n var self = this;\r\n\r\n self.task = null;\r\n self.link = '';\r\n self.canPublishPriceSurveys = authService.hasPermission('promotion_publish_RelevamientoPrecios');\r\n\r\n\r\n self.publish = function () {\r\n if ($stateParams.taskId) {\r\n promotionsService.tasks.publishTask($stateParams.taskId)\r\n .then(function (isOk) {\r\n swal('Tarea Publicada!', 'La tarea se ha publicado exitosamente', 'success');\r\n\r\n $state.go('promotions.myTasks');\r\n });\r\n } else {\r\n $timeout(function () {\r\n swal(\"Error\", \"no se pudo publicar la tarea\", \"error\");\r\n }, 100);\r\n }\r\n }\r\n\r\n self.generateAndDownload = function () {\r\n promotionsService.reports.buildPriceSurveyReport(self.task.promotionId)\r\n .then(function (link) {\r\n self.link = link;\r\n self.showSwalWithLink();\r\n });\r\n }\r\n\r\n self.showSwalWithLink = function () {\r\n swal({\r\n title: \"Reporte Generado!\",\r\n text: 'Haga click AQUÍ para descargar el archivo',\r\n confirmButtonText: \"Cerrar\",\r\n confirmButtonColor: \"#c2c2c2\",\r\n html: true\r\n });\r\n }\r\n\r\n function init() {\r\n promotionsService.tasks.startTask($stateParams.taskId);\r\n promotionsService.tasks.getTask($stateParams.taskId)\r\n .then(function (task) {\r\n self.task = task;\r\n });\r\n\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"pricesCtrl\", function ($window, $rootScope, $timeout, $scope, $sce, promotionsService, $stateParams, $state, $filter, ngDialog) {\r\n //var\r\n var self = this;\r\n self.items = [];\r\n self.isLoading = true;\r\n self.isLoadingCompetitivePrices = false;\r\n self.order = \"itemCode\";\r\n self.pageNumbers = [];\r\n self.categoriesInFilter = [];\r\n self.filter = {\r\n mediaPageType: \"\",\r\n pageNumber: \"\",\r\n closingStatus: \"\",\r\n categoryName: \"\",\r\n hasIssue: \"\"\r\n };\r\n\r\n //fixed header\r\n $('tbody').scroll(function () {\r\n $('thead').css(\"left\", -$(\"tbody\").scrollLeft()); \r\n $('thead th:nth-child(1)').css(\"left\", $(\"tbody\").scrollLeft()); \r\n $('tbody td:nth-child(1)').css(\"left\", $(\"tbody\").scrollLeft()); \r\n });\r\n \r\n //download\r\n\r\n self.downloadExcel = function () {\r\n //traigo chats\r\n self.downloading = true;\r\n let promotionItemIds = [];\r\n _.forOwn(_.groupBy(self.items, \"promotionItemId\"), function (value, key) {\r\n promotionItemIds.push(key);\r\n });\r\n\r\n promotionsService.items.loadItemsChats(promotionItemIds, true)\r\n .then(function (chats) {\r\n var html = '';\r\n\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n\r\n angular.forEach(self.items, function (item) {\r\n let currentChats = chats.filter(function (c) { return c.promotionItemId == item.promotionItemId; });\r\n html += '';\r\n item.hasIssue ? html += '' : html += '';\r\n html += '';\r\n\r\n });\r\n\r\n html += '
PaginaTipoArticuloDescripcion PromoCategoriaPrecio NormalPrecio Minimo AlcancePrecio VigenteTipo de PVMotivoDesdeHastaPrecio PromocionalPrecio Promo AnteriorMercado PromedioInfo. MercadoIC InternoIC ExternoIC Interno ActualIC Externo ActualPrecio SugeridoIssueAprobacionNuevo Precio PromocionalVar %Margen Promocion %Margen Promocion % 2Pronostico de Venta $Precio BonusPuntos BonusComentarios
' + item.pageNumber +\r\n '' + self.getPageName(item.mediaPageType) +\r\n '' + item.itemCode +\r\n '' + item.itemName +\r\n '' + item.categoryName +\r\n '' + item.normalPrice +\r\n '' + item.minPrice +\r\n '' + item.actualPrice +\r\n '' + item.actualPriceType +\r\n '' + item.actualPriceReason +\r\n '' + item.actualPriceValidFrom +\r\n '' + item.actualPriceValidTo +\r\n '' + item.promotionalPrice +\r\n '' + item.prevPromotionalPrice + ' ' + item.prevPromotionalAction + ' ' + item.promotionalActionValidity +\r\n '' + item.marketPrice +\r\n '' + getMarketInfo(item.priceSurveys) +\r\n '' + item.internalIc +\r\n '' + item.externalIc +\r\n '' + item.actualInternalIc +\r\n '' + item.actualExternalIc +\r\n '' + item.suggestedPrice + 'X' + self.getStatusName(item.closingStatus) +\r\n '' + item.newPromotionalPrice +\r\n '' + item.varP +\r\n '' + item.promotionMargin +\r\n '' + item.promotionMargin2 +\r\n '' + item.forecast +\r\n '' + item.bonusPrice +\r\n '' + item.bonusPoints +\r\n '' + currentChats.map(function (c) { return ian.format(\"{0}, {1}: {2}\", c.username, c.sendDate, c.message); }).join('|') +\r\n '
';\r\n\r\n var exportHref = ExportToExcel(html, 'Pagina1');\r\n $timeout(function () {\r\n location.href = exportHref;\r\n }, 100); // trigger download\r\n\r\n self.downloading = false;\r\n }, function () { self.downloading = false; });\r\n\r\n\r\n }\r\n\r\n function ExportToExcel(tableHtml, worksheetName) {\r\n var uri = 'data:application/vnd.ms-excel;base64,',\r\n template = '{table}
',\r\n base64 = function (s) { return $window.btoa(unescape(encodeURIComponent(s))); },\r\n format = function (s, c) { return s.replace(/{(\\w+)}/g, function (m, p) { return c[p]; }) };\r\n\r\n var ctx = { worksheet: worksheetName, table: tableHtml },\r\n href = uri + base64(format(template, ctx));\r\n return href;\r\n }\r\n\r\n function getMarketInfo(priceSurveys) {\r\n let rv = '';\r\n angular.forEach(priceSurveys, function (ps) {\r\n rv += ps.observedDate + '-' +\r\n ps.competitor + '-' +\r\n ps.price + '-';\r\n ps.isPromotion ? rv += 'Oferta | ' : rv += ' | ';\r\n });\r\n return rv;\r\n }\r\n\r\n //modals\r\n\r\n self.openInfo = function () {\r\n ngDialog.open({\r\n template: 'infoDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.openChat = function (promotionItemId, pageId) {\r\n var newScope = $scope.$new();\r\n newScope.isLoadingChats = true;\r\n promotionsService.items.loadItemChats(promotionItemId, true)\r\n .then(function (chats) {\r\n newScope.chats = chats;\r\n newScope.isLoadingChats = false;\r\n });\r\n\r\n newScope.send = function () {\r\n newScope.sending = true;\r\n if (self.newMessage != '') {\r\n var newChat = {\r\n id: 0,\r\n promotionItemId: promotionItemId,\r\n promotionMediaPageId: pageId,\r\n message: self.newMessage,\r\n inPriceTask: true\r\n };\r\n promotionsService.items.saveChat(newChat)\r\n .then(function (isOk) {\r\n self.newMessage = '';\r\n promotionsService.items.loadItemChats(promotionItemId, true)\r\n .then(function (chats) {\r\n newScope.chats = chats;\r\n newScope.sending = false;\r\n });\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de envio se encuentra demorado..\")\r\n }\r\n else {\r\n newScope.sending = false;\r\n swal(\"Error de envio\", \"\", \"error\");\r\n }\r\n });\r\n }\r\n\r\n\r\n }\r\n\r\n ngDialog.open({\r\n template: 'chatDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n }\r\n\r\n self.openSurveysDialog = function (priceSurveys) {\r\n if (priceSurveys && priceSurveys.length > 0) {\r\n var newScope = $scope.$new();\r\n newScope.surveys = priceSurveys;\r\n\r\n ngDialog.open({\r\n template: 'surveysDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n }\r\n\r\n }\r\n self.openSuggestionDetailsDialog = function (sugInt, sugExt) {\r\n if (sugInt || sugExt) {\r\n var newScope = $scope.$new();\r\n newScope.sugInternal = sugInt;\r\n newScope.sugExternal = sugExt;\r\n ngDialog.open({\r\n template: 'suggestionDetailsDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n }\r\n\r\n }\r\n\r\n //filters\r\n self.filterStatus = function (status) {\r\n self.filter.closingStatus = status;\r\n }\r\n\r\n self.filterPageType = function (type) {\r\n self.filter.mediaPageType = type;\r\n }\r\n\r\n self.filterPageNumber = function (num) {\r\n self.filter.pageNumber = num;\r\n }\r\n\r\n self.filterByCategory = function (cat) {\r\n self.filter.categoryName = cat;\r\n }\r\n\r\n self.filterIssue = function (hasIssue) {\r\n self.filter.hasIssue = hasIssue;\r\n }\r\n\r\n //functions\r\n self.getStatusName = function (status) {\r\n if (status == 0)\r\n return 'Sin Modificar';\r\n if (status == 1)\r\n return 'Aprobado';\r\n if (status == 2)\r\n return 'Rechazado'\r\n if (status == 3)\r\n return 'Modificado'\r\n return '';\r\n }\r\n\r\n self.changeAllStatus = function (status) {\r\n angular.forEach($filter('filter')(self.items, self.filter), function (item) {\r\n item.closingStatus = status;\r\n });\r\n }\r\n\r\n self.changePage = function () {\r\n if (self.selectedPage.id == -1)\r\n self.selectedPage = null;\r\n }\r\n\r\n //campos calculados \r\n var previous = [];\r\n\r\n var updatePrevious = function (newPrevious) {\r\n angular.copy(newPrevious, previous);\r\n };\r\n\r\n\r\n $scope.$watch('ct.items', function (newVal, oldVal) {\r\n if (newVal !== oldVal) {\r\n for (var i = 0; i < newVal.length; i++) {\r\n\r\n if (angular.equals(newVal[i], previous[i])) continue;\r\n\r\n var index = i;\r\n }\r\n\r\n calculateFields(index, true);\r\n\r\n\r\n }\r\n }, true);\r\n\r\n function calculateFields(index, update) {\r\n if (self.items[index] && (self.items[index].newPromotionalPrice || self.items[index].bonusPrice)) {\r\n var bonusOrPromotionalPrice = self.items[index].bonusPrice ? self.items[index].bonusPrice : self.items[index].newPromotionalPrice;\r\n self.items[index].forecast = self.items[index].forecastU * bonusOrPromotionalPrice;\r\n self.items[index].varP = self.items[index].actualPrice ? (bonusOrPromotionalPrice / self.items[index].actualPrice) - 1 : null;\r\n self.items[index].promotionMargin = self.items[index].internalCost ? (bonusOrPromotionalPrice / (1.18) - self.items[index].internalCost) / (bonusOrPromotionalPrice / (1.18)) : null;\r\n self.items[index].promotionMargin2 = self.items[index].newCost ? (self.items[index].forecast - (self.items[index].forecastU * (self.items[index].newCost * (1.18)))) / self.items[index].forecast : null;\r\n self.items[index].hasIssue = getIssueStatus(self.items[index].suggestedPrice, bonusOrPromotionalPrice);\r\n if (self.items[index].normalPrice) {\r\n self.items[index].actualInternalIc = (bonusOrPromotionalPrice - self.items[index].normalPrice) / self.items[index].normalPrice;\r\n self.items[index].internalIc = self.items[index].suggestedPrice? (self.items[index].suggestedPrice - self.items[index].normalPrice) / self.items[index].normalPrice : null;\r\n }\r\n if (self.items[index].marketPrice) {\r\n self.items[index].actualExternalIc = (bonusOrPromotionalPrice - self.items[index].marketPrice) / self.items[index].marketPrice;\r\n self.items[index].externalIc = self.items[index].suggestedPrice ? (self.items[index].suggestedPrice - self.items[index].marketPrice) / self.items[index].marketPrice : null;\r\n }\r\n }\r\n if (update)\r\n updatePrevious(self.items);\r\n }\r\n\r\n function getIssueStatus(suggestedPrice, bonusOrPromotionalPrice) {\r\n if (suggestedPrice) {\r\n let delta = ((bonusOrPromotionalPrice / suggestedPrice) - 1);\r\n if (delta > 0.01 || delta < -0.1) return true;\r\n }\r\n return false;\r\n }\r\n\r\n self.isBonusCoexistence = function (item) {\r\n return !((item.bonusPrice && !item.bonusPoints) || (!item.bonusPrice && item.bonusPoints));\r\n }\r\n\r\n self.validatePrices = function (item) {\r\n if (!item.newPromotionalPrice && !item.bonusPrice)\r\n return false;\r\n if (item.newPromotionalPrice && item.bonusPrice && item.bonusPrice > item.newPromotionalPrice)\r\n return false;\r\n return true;\r\n }\r\n\r\n self.getPageName = function (param) {\r\n switch (param) {\r\n case 1: return 'Carátula';\r\n case 2: return 'Contracarátula';\r\n case 3: return 'Página';\r\n }\r\n }\r\n\r\n self.getTitleForPrices = function (item) {\r\n if (!item.newPromotionalPrice && !item.bonusPrice)\r\n return 'Debe cargar precio promocional o bonus';\r\n if (item.newPromotionalPrice && item.bonusPrice && item.bonusPrice > item.newPromotionalPrice)\r\n return 'El precio bonus no puede superar al promocional';\r\n }\r\n\r\n self.onChangeStatus = function (status, item) {\r\n if (item.newPromotionalPrice != item.promotionalPrice && status == 1)\r\n status = 3;//modificado\r\n item.closingStatus = status;\r\n }\r\n\r\n self.onChangePromotionalPrice = function (i) {\r\n if (i.newPromotionalPrice != i.promotionalPrice && i.closingStatus != 2)\r\n i.closingStatus = 3;\r\n else if (i.newPromotionalPrice == i.promotionalPrice && i.closingStatus != 2)\r\n i.closingStatus = 1;\r\n }\r\n\r\n self.save = function () {\r\n self.isLoading = true;\r\n if (self.canSave()) {\r\n promotionsService.promotions.savePricingClose(self.items)\r\n .then(function (items) {\r\n self.isLoading = false;\r\n swal('Exito', 'Cambios guardados', 'success');\r\n //$state.go('promotions.myTasks');\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n self.isLoading = false;\r\n swal(\"Error\", \"Hubo un error al guardar\", \"error\");\r\n }\r\n });\r\n } else {\r\n self.isLoading = false;\r\n swal(\"No se puede guardar\", \"Por favor, revise las alertas\", \"error\");\r\n }\r\n }\r\n\r\n self.canSave = function () {\r\n var canSave = true;\r\n for (var i = 0; i < self.items.length; i++) {\r\n\r\n if (!self.isBonusCoexistence(self.items[i])) {\r\n canSave = false;\r\n break;\r\n }\r\n if (!self.validatePrices(self.items[i])) {\r\n canSave = false;\r\n break;\r\n }\r\n }\r\n\r\n return canSave;\r\n }\r\n\r\n self.publish = function () {\r\n self.isLoading = true;\r\n if (self.canSave()) {\r\n promotionsService.tasks.publishTask($stateParams.taskId)\r\n .then(function (task) {\r\n self.isLoading = false;\r\n swal('Tarea Publicada!', 'La tarea se ha publicado exitosamente', 'success');\r\n $state.go('promotions.myTasks');\r\n });\r\n }\r\n else {\r\n self.isLoading = false;\r\n swal(\"No se puede publicar\", \"Por favor, revise las alertas\", \"error\");\r\n }\r\n }\r\n\r\n self.changeCategory = function () {\r\n if (self.selectedCategory.categoryId === -1)\r\n self.selectedCategory = null;\r\n }\r\n\r\n self.getPrices = function () {\r\n self.isLoading = true;\r\n let categoryId = self.selectedCategory ? self.selectedCategory.categoryId : 0;\r\n let pageId = self.selectedPage ? self.selectedPage.id : 0;\r\n promotionsService.promotions.getPromotionForPricingClose($stateParams.promotionId, categoryId, pageId)\r\n .then(function (response) {\r\n response.forEach(function (item) { item.newPromotionalPrice = item.promotionalPrice; });\r\n self.items = response;\r\n updatePrevious(self.items);\r\n _.forOwn(_.groupBy(response, \"pageNumber\"), function (value, key) {\r\n self.pageNumbers.push(key);\r\n });\r\n _.forOwn(_.groupBy(response, \"categoryName\"), function (value, key) {\r\n self.categoriesInFilter.push(key);\r\n });\r\n self.isLoading = false;\r\n self.isLoadingCompetitivePrices = true;\r\n var promotionItemsIds = [];\r\n var promotionMechanicItemsIds = [];\r\n var promotionItems = self.items.filter(function (x) { return x.mechanicItemId == null });\r\n var promotionMechanicItems = self.items.filter(function (x) { return x.mechanicItemId != null });\r\n _.forOwn(_.groupBy(promotionItems, \"promotionItemId\"), function (value, key) {\r\n promotionItemsIds.push(key);\r\n });\r\n _.forOwn(_.groupBy(promotionMechanicItems, \"mechanicItemId\"), function (value, key) {\r\n promotionMechanicItemsIds.push(key);\r\n });\r\n var promotionItemsParamDto = {\r\n promotionId: $stateParams.promotionId,\r\n categoryId: categoryId,\r\n promotionItemsIds: promotionItemsIds,\r\n promotionMechanicItemsIds: promotionMechanicItemsIds\r\n }\r\n promotionsService.items.getCompetitivePrices(promotionItemsParamDto)\r\n .then(function (response) {\r\n angular.forEach(self.items, function (i) {\r\n angular.forEach(response, function (x) {\r\n if ((x.promotionItemId && i.promotionItemId == x.promotionItemId) || (x.promotionMechanicItemId && i.mechanicItemId == x.promotionMechanicItemId)) {\r\n i.suggestedForInternal = x.suggestedPriceForInternal;\r\n i.suggestedForExternal = x.suggestedPriceForExternal;\r\n if (i.suggestedForInternal && i.suggestedForExternal)\r\n i.suggestedPrice = Math.min(i.suggestedForInternal, i.suggestedForExternal);\r\n else i.suggestedPrice = i.suggestedForInternal ? i.suggestedForInternal : i.suggestedForExternal;\r\n\r\n if (x.priceSurveys) {\r\n let priceSurveys = x.priceSurveys.map(function (ps) { return ps.price; });\r\n i.marketPrice = $rootScope.arrayAverage(priceSurveys);\r\n i.priceSurveys = x.priceSurveys;\r\n }\r\n }\r\n });\r\n });\r\n angular.forEach(self.items, function (i, index) { calculateFields(index, false) });\r\n updatePrevious(self.items);\r\n self.isLoadingCompetitivePrices = false;\r\n });\r\n });\r\n }\r\n\r\n function init() {\r\n promotionsService.promotions.getPromotionDataForPricingClose($stateParams.promotionId)\r\n .then(function (response) {\r\n response.promotionValidFrom = new Date(response.promotionValidFrom).toISOString().slice(0, 10);\r\n response.promotionValidTo = new Date(response.promotionValidTo).toISOString().slice(0, 10);\r\n self.promotionData = response;\r\n self.categories = self.promotionData.categories;\r\n self.categories.push({ categoryId: -1, categoryName: \" - \" });\r\n self.promotionData.pages.push({ id: -1 });\r\n self.isLoading = false;\r\n });\r\n promotionsService.tasks.startTask($stateParams.taskId);\r\n\r\n\r\n }\r\n\r\n init();\r\n\r\n });","angular.module(\"prisma\")\r\n .controller(\"myTasksCtrl\", function ($rootScope, $scope, $state, promotionsService, authService, ngDialog) {\r\n var self = this;\r\n\r\n self.isSuperUser = authService.hasPermission('promotion_superUser');\r\n self.roles = authService.authentication.roles;\r\n self.userAreas = promotionsService.userAreas;\r\n\r\n self.currDate = Date.now();\r\n self.tasks = [];\r\n self.allResponsables = [];\r\n\r\n self.search = '';\r\n self.order = [\"plannedStartDate\", \"plannedEndDate\"];\r\n\r\n self.filter = {\r\n taskName: \"\",\r\n plannedStatusDesc: \"ReadyBlockedByDependency\",\r\n effectiveStatusDesc: \"\",\r\n textResponsable: \"Todos\"\r\n }\r\n\r\n self.filterTask = function (taskName) {\r\n self.filter.taskName = taskName;\r\n }\r\n\r\n self.setFilterPlannedStatus = function (status) {\r\n self.filter.plannedStatusDesc = status;\r\n }\r\n\r\n self.setFilterEffectiveStatus = function (status) {\r\n self.filter.effectiveStatusDesc = status;\r\n }\r\n\r\n self.setFilterResponsable = function (resp) {\r\n self.filter.textResponsable = resp;\r\n }\r\n\r\n self.isLoading = true;\r\n\r\n self.navigateToAction = function (task) {\r\n\r\n self.setFiltersInLocalStorage();\r\n\r\n if (!self.isSuperUser) { //Lo bloqueo si no es SuperUser\r\n if (task.plannedStatusDesc === 'Ready') {\r\n if (task.effectiveStatusDesc === 'Completed') {\r\n swal(\"La tarea ya fue publicada\", \"No se puede trabajar una tarea que ya fue publicada.\", \"error\");\r\n }\r\n else {\r\n //comenzar tarea \r\n if (task.effectiveStatusDesc == 'Pending') {\r\n promotionsService.tasks.startTask(task.taskId)\r\n .then(function (startedTask) {\r\n $state.go(task.navigateToState, { promotionId: task.promotionId, taskId: task.taskId });\r\n\r\n });\r\n }\r\n else { //(si ya comenzo se fija que sea el responsable o superUser)\r\n promotionsService.tasks.canStartTask(task.taskId)\r\n .then(function () {\r\n $state.go(task.navigateToState, { promotionId: task.promotionId, taskId: task.taskId });\r\n });\r\n }\r\n\r\n }\r\n\r\n }\r\n else if (task.plannedStatusDesc === 'BlockedByDate') {\r\n swal(\"La tarea esta bloqueada\", \"La tarea no se encuentra en el rango de fechas definido para poder iniciarse.\", \"error\");\r\n }\r\n else if (task.plannedStatusDesc === 'BlockedByDependency') {\r\n swal(\"La tarea esta bloqueada\", \"No puede iniciar esta tarea hasta que su predecesora ('\" + task.previousTaskName + \"') haya finalizado.\", \"error\");\r\n }\r\n }\r\n else {\r\n //Voy a la tarea\r\n $state.go(task.navigateToState, { promotionId: task.promotionId, taskId: task.taskId });\r\n }\r\n }\r\n\r\n self.myFilter = function (task) {\r\n\r\n return (//que pase el filtrado\r\n ((task.userArea.toLowerCase().indexOf(self.filter.textResponsable.toLocaleLowerCase()) > -1 || self.filter.textResponsable == \"Todos\"))\r\n && ((self.filter.taskName.toLowerCase().indexOf(task.taskName.toLocaleLowerCase()) > -1 || self.filter.taskName == \"\"))\r\n && ((self.filter.plannedStatusDesc.toLowerCase().indexOf(task.plannedStatusDesc.toLocaleLowerCase()) > -1 || self.filter.plannedStatusDesc == \"\"))\r\n && ((self.filter.effectiveStatusDesc.toLowerCase().indexOf(task.effectiveStatusDesc.toLocaleLowerCase()) > -1 || self.filter.effectiveStatusDesc == \"\"))\r\n )\r\n &&\r\n (//que pase la busqueda\r\n self.search == ''\r\n || (task.taskName && task.taskName.toLowerCase().indexOf(self.search.toLowerCase()) > -1)\r\n || (task.promotionName && task.promotionName.toLowerCase().indexOf(self.search.toLowerCase()) > -1)\r\n || (task.previousTaskName && task.previousTaskName.toLowerCase().indexOf(self.search.toLowerCase()) > -1)\r\n || (task.plannedStatusDesc && task.plannedStatusDesc.toLowerCase().indexOf(self.search.toLowerCase()) > -1)\r\n || (task.effectiveStatusDesc && task.effectiveStatusDesc.toLowerCase().indexOf(self.search.toLowerCase()) > -1)\r\n || (task.effectiveStartedDate && task.effectiveStartedDate.toLowerCase().indexOf(self.search.toLowerCase()) > -1)\r\n || (task.effectiveEndedDate && task.effectiveEndedDate.toLowerCase().indexOf(self.search.toLowerCase()) > -1)\r\n || (task.promotionId && task.promotionId.toString().toLowerCase().indexOf(self.search.toLowerCase()) > -1)\r\n\r\n )\r\n && \r\n (//que pase si esta en fecha\r\n self.filterDate == false\r\n || (new Date(task.plannedStartDate) >= self.fromDate && new Date(task.plannedStartDate) <= self.toDate)\r\n || (new Date(task.plannedEndDate) >= self.fromDate && new Date(task.plannedEndDate) <= self.toDate)\r\n );\r\n \r\n };\r\n\r\n function checkTasksStartOrEnd()\r\n {\r\n promotionsService.tasks.checkTasksStartOrEnd()\r\n .then(function () {\r\n //No hago nada, se llama cada vez que se entra en esta pantalla para enviar los mails de que hoy empieza una promo o que hoy finaliza si no está terminada.\r\n });\r\n }\r\n\r\n self.setFiltersInLocalStorage = function () {\r\n var filters = {\r\n 'tarea': self.filter.taskName,\r\n 'responsable': self.filter.textResponsable,\r\n 'bloqueo': self.filter.plannedStatusDesc,\r\n 'estado': self.filter.effectiveStatusDesc,\r\n 'buscador': self.search\r\n };\r\n localStorage.setItem('filtros', JSON.stringify(filters));\r\n }\r\n\r\n function getFilters() {\r\n if (localStorage.getItem('filtros') != null) {\r\n var filtersAux = localStorage.getItem('filtros');\r\n var filters = JSON.parse(filtersAux);\r\n\r\n self.filter.taskName = filters.tarea;\r\n self.filter.textResponsable = filters.responsable\r\n self.filter.plannedStatusDesc = filters.bloqueo\r\n self.filter.effectiveStatusDesc = filters.estado;\r\n self.search = filters.buscador;\r\n }\r\n localStorage.removeItem(\"filtros\");\r\n }\r\n\r\n //Filtrar por fechas\r\n\r\n self.filterDate = false;\r\n self.fromDate = null;\r\n self.toDate = null;\r\n\r\n self.filterByDate = function () {\r\n self.filterDate = !self.filterDate;\r\n }\r\n\r\n self.removeFilter = function () {\r\n self.filterDate = false;\r\n self.fromDate = null;\r\n self.toDate = null;\r\n }\r\n\r\n self.applyFilter = function () {\r\n if (self.fromDate == null || self.toDate == null) {\r\n swal(\"No se aplicaron los filtros\", \"Debe completar la fecha desde y la fecha hasta.\", \"warning\");\r\n }\r\n else if (self.fromDate > self.toDate) {\r\n swal(\"Error\", \"La fecha desde debe ser anterior a la fecha hasta.\", \"error\");\r\n }\r\n else {\r\n self.plannedStartDate = fromDate;\r\n }\r\n }\r\n\r\n self.openTasksDialog = function () {\r\n var newScope = $scope.$new();\r\n self.promotionId = null;\r\n newScope.getTasksByPromotion = function () {\r\n if (!self.promotionId) {\r\n swal(\"Ingrese un ID\", \"\", \"error\");\r\n return;\r\n }\r\n\r\n self.isLoading = true;\r\n ngDialog.close();\r\n\r\n promotionsService.tasks.getTasksByPromotion(self.promotionId)\r\n .then(function (tasks) { \r\n \r\n self.tasks = tasks;\r\n angular.forEach(tasks, function (t) {\r\n t.plannedEndDate = new Date(moment(t.plannedEndDate).subtract(1, 'days'));//evito confuciones de fin de tarea\r\n });\r\n self.searchedByPromotion = true;\r\n self.filter.plannedStatusDesc = \"\";\r\n self.isLoading = false;\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso está demorado...\", '')\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al buscar las tareas de la promocion\", \"error\");\r\n }\r\n });\r\n }\r\n\r\n ngDialog.open({\r\n template: 'tasksDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n }\r\n\r\n self.reloadTasks = function () {\r\n self.searchedByPromotion = false;\r\n self.filter.plannedStatusDesc = \"ReadyBlockedByDependency\";\r\n self.isLoading = true;\r\n init();\r\n }\r\n\r\n function init() {\r\n promotionsService.tasks.getUserTasks().then(function (tasks) {\r\n self.tasks = tasks;\r\n let arr = tasks.map(function (task) {\r\n return { value: task.taskName };\r\n });\r\n self.taskNames = $rootScope.removeDuplicates(arr, 'value');\r\n self.plannedStatusList = [\r\n 'Ready',\r\n 'BlockedByDate',\r\n 'BlockedByDependency',\r\n 'Expired'\r\n ];\r\n self.effectiveStatusList = [\r\n 'Pending',\r\n 'InProgress',\r\n 'Completed'\r\n ];\r\n angular.forEach(tasks, function (t) {\r\n t.plannedEndDate = new Date(moment(t.plannedEndDate).subtract(1, 'days'));//evito confuciones de fin de tarea\r\n\r\n var exists = _.some(self.allResponsables, function (r) {\r\n return r == t.userArea;\r\n });\r\n\r\n if (!exists) {\r\n self.allResponsables.push(t.userArea);\r\n\r\n var roles = promotionsService.getUserRolesByArea(t.userArea);\r\n\r\n if (self.filter.textResponsable == \"Todos\" && roles.indexOf(self.roles[0]) > -1) //Set Filter to Current User Role\r\n self.filter.textResponsable = t.userArea;\r\n }\r\n });\r\n\r\n self.isLoading = false;\r\n });\r\n\r\n self.setFilterResponsable(promotionsService.getUserAreasByRole(self.roles[0])[0]);\r\n\r\n checkTasksStartOrEnd();\r\n\r\n getFilters();\r\n }\r\n\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"editMechanicCtrl\", function ($scope, $rootScope, $timeout, $state, $stateParams, promotionsService, authService, homeService, ngDialog, $window, serverService, Upload) {\r\n var self = this;\r\n\r\n self.isEditPanguiCode = false;\r\n\r\n if ($stateParams.position == -2)//interna\r\n self.loadForInternalPromotion = true;\r\n\r\n self.hasPermissionToEditMechanic = authService.hasPermission('promotion_edit_promotionItem') || (self.loadForInternalPromotion && !authService.hasPermission('promotion_take_internalPromotion'));\r\n self.promoDetails = '';\r\n\r\n self.categoriesInLookup = [];\r\n self.announcementTypes = [];\r\n self.itemsInLookup = [];\r\n self.overlaps = [];\r\n self.itemsToMassiveCharge = \"\";\r\n self.extraItemsToMassiveCharge = \"\";\r\n self.storeCodes = \"\";\r\n self.itemCodes = \"\";\r\n self.paymentTypes = [];\r\n self.categoryIds = [];\r\n self.mechanics = [];\r\n self.stores = [];\r\n self.vendors = [];\r\n self.chat = '';\r\n self.validationRetailP = true;\r\n self.validationSupermarketP = true;\r\n self.totalValidation = true;\r\n self.negotiationType = 2;\r\n self.search = \"\";\r\n self.searchwithCheckbox = false;\r\n self.totalItemCounter = 0;\r\n self.mechanicItemsFiltered = [];\r\n\r\n self.inputVisibility = 2;\r\n self.itemLookupText = '';\r\n self.promotionInfo = null;\r\n self.selectedVendor = null;\r\n self.selectedItemInModal = null;\r\n self.selectionItemOrCategory = null;// 1 Category(Jerarquia), 2 Item\r\n self.selectionItemOrCategoryExtra = null;// 1 Category(Jerarquia), 2 Item\r\n self.promotionExhibitionType = promotionsService.promotionExhibitionType;\r\n self.mechanic = newMechanic();\r\n self.isCalculatingOverlap = false;\r\n\r\n self.goToLayout = function () {\r\n var state = 'promotions.addItemToLayout';\r\n if (self.isReview)\r\n state = 'promotions.2reviewTradeAgreements';\r\n else if (self.isPrintLayoutCompare)\r\n state = 'promotions.printLayoutCompare';\r\n else if (self.isLayoutImageUpload)\r\n state = 'promotions.layoutImageUpload';\r\n else if (self.isFinalValidation)\r\n state = 'promotions.finalValidation';\r\n\r\n $state.go(state, {\r\n promotionId: $stateParams.promotionId,\r\n taskId: $stateParams.taskId,\r\n promotionMediaPageId: $stateParams.promotionMediaPageId\r\n });\r\n }\r\n\r\n self.goToEditPromotion = function () {\r\n $state.go('promotions.editInternalPromotion', {\r\n promotionId: $stateParams.promotionId,\r\n promotionMediaPageId: $stateParams.promotionMediaPageId\r\n });\r\n }\r\n\r\n self.mechanicChanged = function () {\r\n var newType = angular.copy(self.mechanic.mechanicType);\r\n self.mechanic = newMechanic();\r\n self.setChargeRate();\r\n self.mechanic.mechanicType = newType;\r\n self.itemLookupText = '';\r\n promotionsService.mechanics.getMechanicCategories()\r\n .then(function (categories) {\r\n self.categoriesInLookup = categories;\r\n });\r\n }\r\n\r\n self.showOverlapping = function () {\r\n\r\n var newScope = $scope.$new();\r\n newScope.overlaps = self.overlaps;\r\n\r\n ngDialog.open({\r\n template: 'overlapDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n };\r\n\r\n function validationNegativeNumbers() {\r\n updateItemList();\r\n var message = \"success\";\r\n var camposError = \"\";\r\n\r\n for (var i = 0; i < self.mechanic.items.length; i++) {\r\n if (self.mechanic.items[i].mechanicPrice < 0) {\r\n camposError += \" Precio Mecanica, \";\r\n }\r\n if (self.mechanic.items[i].manualForecast < 0) {\r\n camposError += \" Forecast Manual, \";\r\n }\r\n if (self.mechanic.items[i].salesForecast < 0) {\r\n camposError += \" Pronostico de Venta, \";\r\n }\r\n }\r\n\r\n for (i = 0; i < self.mechanic.categories.length; i++) {\r\n if (self.mechanic.categories[i].mechanicPrice < 0) {\r\n camposError += \" Precio Mecanica, \";\r\n }\r\n if (self.mechanic.categories[i].manualForecast < 0) {\r\n camposError += \"Forecast Manual, \";\r\n }\r\n if (self.mechanic.categories[i].salesForecast < 0) {\r\n camposError += \"Pronostico de Venta, \";\r\n }\r\n }\r\n for (i = 0; i < self.mechanic.categoriesExtra.length; i++) {\r\n if (self.mechanic.categoriesExtra[i].mechanicPrice < 0) {\r\n camposError += \" Precio Mecanica, \";\r\n }\r\n if (self.mechanic.categoriesExtra[i].manualForecast < 0) {\r\n camposError += \"Forecast Manual, \";\r\n }\r\n if (self.mechanic.categoriesExtra.salesForecast < 0) {\r\n camposError += \"Pronostico de Venta, \";\r\n }\r\n }\r\n for (i = 0; i < self.mechanic.itemsExtra.length; i++) {\r\n if (self.mechanic.itemsExtra[i].mechanicPrice < 0) {\r\n camposError += \" Precio Mecanica, \";\r\n }\r\n if (self.mechanic.itemsExtra[i].manualForecast < 0) {\r\n camposError += \"Forecast Manual, \";\r\n }\r\n if (self.mechanic.itemsExtra.salesForecast < 0) {\r\n camposError += \"Pronostico de Venta, \";\r\n }\r\n }\r\n\r\n if (self.mechanic.sellOutNegotiated < 0) {\r\n camposError += \" Monto Negociado, \";\r\n }\r\n\r\n if (camposError != \"\") {\r\n message = \"Los campos \" + camposError + \"no pueden ser negativos\";\r\n }\r\n return message;\r\n\r\n }\r\n\r\n self.savePanguiCode = function () {\r\n if ($stateParams.promotionMechanicId != 0) {\r\n swal({\r\n title: 'Esta seguro que desea guardar el codigo pangui?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n promotionsService.mechanics.savePanguiCode(self.mechanic.id, self.mechanic.panguiCode)\r\n .then(function (isOk) {\r\n swal('Mecanica codigo guardado!', 'El codigo pangui ' + self.mechanic.panguiCode + ' se ha asociado correctamente', 'success');\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al guardar\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n else swal(\"Error\", \"Hubo un error al guardar\", \"error\");\r\n }\r\n\r\n\r\n self.saveComment = function () {\r\n if (self.chat != '' && $stateParams.promotionMechanicId != 0) {\r\n var newChat = {\r\n id: 0,\r\n promotionItemId: $stateParams.promotionItemId,\r\n promotionMediaPageId: self.mechanic.promotionMediaPageId,\r\n message: self.chat.replace(/(\\r\\n|\\n|\\r)/gm, '')\r\n };\r\n promotionsService.mechanics.saveChat(newChat)\r\n .then(function (isOk) {\r\n swal('Comentario guardado!', '', 'success');\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al guardar\", \"error\");\r\n }\r\n });\r\n }\r\n }\r\n\r\n self.isOnlyOneItemInList = function () {\r\n if (self.itemList.length === 1) {\r\n self.itemList[0].isItemInPhoto = true;\r\n }\r\n }\r\n\r\n self.validateCheckBoxItemInPhoto = function () {\r\n var retorno;\r\n if (self.mechanic.items && self.mechanic.items.length > 0) {\r\n retorno = self.mechanic.items.some(function (x) {\r\n return x.isItemInPhoto;\r\n })\r\n }\r\n else {\r\n retorno = true;\r\n }\r\n return retorno;\r\n }\r\n\r\n self.save = function () {\r\n if (self.mechanic != newMechanic()) {\r\n updateItemList();\r\n if (!self.isReview) {\r\n if (self.canSave()) {\r\n if (self.hasCategoryOrSubCategory() || self.mechanic.items.length > 0) {\r\n if (validationNegativeNumbers() == 'success') { //Validacion de numeros negativos\r\n\r\n if (self.totalValidation) //Validacion de que retail y supermercado sumen 100\r\n {\r\n if (!self.validateCheckBoxItemInPhoto()) {\r\n swal('Error', 'Debe seleccionar almenos un articulo en foto.', 'error');\r\n return;\r\n }\r\n if (self.mechanic.name.length <= 200) {\r\n\r\n //Fix Enter en comentarios dentro de un TEXTAREA, para bajar los excels se rompe.\r\n self.mechanic.name = self.mechanic.name.replace(/(\\r\\n|\\n|\\r)/gm, '');\r\n self.mechanic.observation ? self.mechanic.observation.replace(/(\\r\\n|\\n|\\r)/gm, '') : '';\r\n self.mechanic.ticketDescription ? self.mechanic.ticketDescription.replace(/(\\r\\n|\\n|\\r)/gm, '') : '';\r\n self.mechanic.otherDiscounts ? self.mechanic.otherDiscounts.replace(/(\\r\\n|\\n|\\r)/gm, '') : '';\r\n\r\n //SWAL CONFIRM para guardar\r\n swal({\r\n title: 'Esta seguro que desea asociar esta Mecanica a esta Página?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n if (self.chat != '') {\r\n var newChat = {\r\n promotionItemId: $stateParams.promotionItemId,\r\n promotionMediaPageId: self.mechanic.promotionMediaPageId,\r\n message: self.chat\r\n };\r\n self.mechanic.chats.push(newChat);\r\n\r\n }\r\n self.chat = '';\r\n //dates as string \r\n self.mechanic.items.forEach(function (i) {\r\n if (i.startTime)\r\n i.startTime = i.startTime.toLocaleString();\r\n if (i.endTime)\r\n i.endTime = i.endTime.toLocaleString();\r\n });\r\n self.mechanic.categories.forEach(function (c) {\r\n if (c.startTime)\r\n c.startTime = c.startTime.toLocaleString();\r\n if (c.endTime)\r\n c.endTime = c.endTime.toLocaleString();\r\n });\r\n //TODO: arreglar despues\r\n if (self.mechanic.targetUnits) self.mechanic.targetUnits = parseInt(self.mechanic.targetUnits);\r\n self.mechanic.promotionItemType = $stateParams.promotionItemType;\r\n promotionsService.mechanics.saveMechanic(self.mechanic)\r\n .then(function (mechanic) {\r\n if (mechanic.id != 0)\r\n swal('Mecanica Asociada!', 'La mecanica ' + self.mechanic.name + ' se ha asociado correctamente', 'success');\r\n else swal('Error', 'La posicion ' + self.mechanic.position + ' se encuentra actualmente ocupada', 'error');\r\n\r\n if (!self.loadForInternalPromotion)\r\n self.goToLayout();\r\n else self.goToEditPromotion();\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al guardar\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n else { swal('Error', 'El tamaño de la descripcion ha excedido los 200 caracteres. Modifiquelo y vuelva a guardar.', 'error'); }\r\n\r\n }\r\n else { swal('Error', 'La suma de Retail y de Supermercado debe ser el 100%', 'error'); }\r\n }\r\n else { swal('Error', validationNegativeNumbers(), 'error'); }\r\n }\r\n else { swal('Error', 'Debe elegir al menos una categoria o subcategoria', 'error'); }\r\n }\r\n else { swal('Error', 'Debe elegir un tipo de mecanica y asignar al menos un articulo o categoria', 'error'); }\r\n }\r\n else\r\n saveReview();\r\n }\r\n }\r\n\r\n function saveReview() {\r\n swal({\r\n title: 'Esta seguro que desea editar esta Mecanica ?',\r\n text: 'Solo se guardarán campos de titulo de la mecanica, prorrateo, restricciones y otros datos',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n if (self.chat != '') {\r\n var newChat = {\r\n promotionItemId: $stateParams.promotionItemId,\r\n promotionMediaPageId: self.mechanic.promotionMediaPageId,\r\n message: self.chat\r\n };\r\n self.mechanic.chats.push(newChat);\r\n self.chat = '';\r\n }\r\n promotionsService.mechanics.saveReview(self.mechanic)\r\n .then(function (isOk) {\r\n swal('Mecanica modificada!', 'La mecanica ' + self.mechanic.name + ' se ha modificado correctamente', 'success');\r\n self.goToLayout();\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al guardar\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.canSave = function () {\r\n if (!self.mechanic.mechanicType || !self.selectionItemOrCategory || (self.mechanic.categories.length == 0 && self.mechanic.items.length == 0)) //!self.mechanic.targetUnits || !self.mechanic.payUnits || !self.mechanic.itemOrCategory || \r\n return false;\r\n else return true;\r\n }\r\n\r\n self.hasCategoryOrSubCategory = function () {\r\n rv = false;\r\n angular.forEach(self.mechanic.categories, function (c) {\r\n if (c.shortName == \"CAT\" || c.shortName == \"SUBCAT\") {\r\n rv = true;\r\n }\r\n });\r\n return rv;\r\n }\r\n\r\n self.itemOrCategoryChanged = function () {\r\n if (self.selectionItemOrCategory == \"1\") {\r\n self.mechanic.items = [];\r\n self.itemList = [];\r\n }\r\n if (self.selectionItemOrCategory == \"2\") {\r\n self.mechanic.categories = [];\r\n }\r\n //delete from db\r\n promotionsService.mechanics.deleteAllSelection(self.mechanic.id, false, $stateParams.promotionId);\r\n }\r\n self.itemOrCategoryExtraChanged = function () {\r\n if (self.selectionItemOrCategoryExtra == \"1\") {\r\n self.mechanic.itemsExtra = [];\r\n }\r\n if (self.selectionItemOrCategoryExtra == \"2\") {\r\n self.mechanic.categoriesExtra = [];\r\n }\r\n //delete from db\r\n promotionsService.mechanics.deleteAllSelection(self.mechanic.id, true, $stateParams.promotionId);\r\n }\r\n\r\n self.setNegotiationType = function (negotiationType) {\r\n if (negotiationType == 1) {\r\n self.mechanic.sellIn = !self.mechanic.sellIn;\r\n self.mechanic.sellInNewCost = self.mechanic.sellIn ? self.mechanic.sellInNewCost : '';\r\n }\r\n else {\r\n self.mechanic.sellOut = !self.mechanic.sellOut;\r\n self.mechanic.sellOutNegotiated = self.mechanic.sellOut ? self.mechanic.sellOutNegotiated : '';\r\n }\r\n };\r\n\r\n self.setAcumPromotion = function (val) {\r\n self.mechanic.acumOtherPromotions = val;\r\n }\r\n self.setApplyOfferPrices = function (val) {\r\n self.mechanic.applyOfferPrices = val;\r\n }\r\n self.setCardRestriction = function (val) {\r\n self.mechanic.cardRestriction = val;\r\n if (val == false) {\r\n self.mechanic.bonusCard = false;\r\n self.mechanic.wongCard = false;\r\n self.mechanic.metroCard = false;\r\n self.mechanic.otherCard = false;\r\n self.mechanic.participantGoods = null;\r\n }\r\n }\r\n self.setUnitsRestriction = function (val) {\r\n self.mechanic.unitsRestriction = val;\r\n self.mechanic.moneyRestriction = !val;\r\n self.mechanic.moneyRestrictionValue = null;\r\n }\r\n self.setMoneyRestriction = function (val) {\r\n self.mechanic.moneyRestriction = val;\r\n self.mechanic.unitsRestriction = !val;\r\n self.mechanic.unitsRestrictionValue = null;\r\n }\r\n self.setAffectsClientMargin = function (val) {\r\n self.mechanic.affectsClientMargin = val;\r\n }\r\n self.setCharge = function (val) {\r\n self.mechanic.charge = val;\r\n if (val == false)\r\n self.mechanic.chargeRate = null;\r\n else self.setChargeRate();\r\n }\r\n self.setApportionment = function () {\r\n if (!self.mechanic.apportionment) {\r\n self.mechanic.retailP = null;\r\n self.mechanic.supermarketP = null;\r\n }\r\n }\r\n self.setChargeRate = function () {\r\n var storeId = self.mechanic.stores[0].storeId;\r\n promotionsService.stores.getStore(storeId).then(function (s) {\r\n self.mechanic.chargeRate = promotionsService.calculateTariff(s.brand, self.mechanic.announcementType);\r\n self.mechanic.negotiatedChargeRate = self.mechanic.chargeRate;\r\n });\r\n }\r\n\r\n var previousLookupText = '';\r\n\r\n self.addCategoryToMechanic = function () {\r\n var newScope = $scope.$new();\r\n var y = window.scrollY;\r\n\r\n newScope.saveCategory = function () {\r\n self.mechanic.categories.push({\r\n categoryId: self.selectedCategoryInModal.id\r\n , categoryCode: self.selectedCategoryInModal.code\r\n , categoryName: self.selectedCategoryInModal.name\r\n , shortName: self.selectedCategoryInModal.shortName\r\n , investmentApportionment: 0\r\n , manualForecast: null\r\n , salesForecast: null\r\n , sellOut: null\r\n , isExtra: false\r\n });\r\n\r\n self.selectedCategoryInModal = null;\r\n\r\n ngDialog.close();\r\n $timeout(function () {\r\n window.scroll(0, y);\r\n }, 550);\r\n }\r\n newScope.cancel = function () {\r\n ngDialog.close();\r\n $timeout(function () {\r\n window.scroll(0, y);\r\n }, 550);\r\n }\r\n\r\n ngDialog.open({\r\n template: 'selectCategoryDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope,\r\n overflow: 'initial !important',\r\n showClose: false,\r\n closeByEscape: false,\r\n closeByDocument: false\r\n });\r\n }\r\n self.addCategoryExtraToMechanic = function () {\r\n var newScope = $scope.$new();\r\n var y = window.scrollY;\r\n\r\n newScope.saveCategory = function () {\r\n self.mechanic.categoriesExtra.push({\r\n categoryId: self.selectedCategoryInModal.id\r\n , categoryCode: self.selectedCategoryInModal.code\r\n , categoryName: self.selectedCategoryInModal.name\r\n , unitsToTake: null\r\n , investmentApportionment: 0\r\n , isExtra: true\r\n });\r\n\r\n self.selectedCategoryInModal = null;\r\n\r\n ngDialog.close();\r\n $timeout(function () {\r\n window.scroll(0, y);\r\n }, 550);\r\n }\r\n newScope.cancel = function () {\r\n ngDialog.close();\r\n $timeout(function () {\r\n window.scroll(0, y);\r\n }, 550);\r\n }\r\n\r\n ngDialog.open({\r\n template: 'selectCategoryDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope,\r\n overflow: 'initial !important',\r\n showClose: false,\r\n closeByEscape: false,\r\n closeByDocument: false\r\n });\r\n }\r\n\r\n //control o promovsnormal es un campo que se ve en mecanicas 3, 10 y 13. \r\n //EN PACK VIRTUAL(10) se ve un campo cantidad a comprar a nivel mechanicitem, en el caso de que estos tengan un valor\r\n //multimplicaran el precio del producto(solo posible en pack virtual). Entonces promo vs normal es la DIFERENCIA entre:\r\n //la SUMA de todos los precios normales de productos y extras multiplicados por sus respectivas cantidades a comprar \r\n //VS el campo IMPORTE\r\n\r\n //EN COMPRA A LLEVA B CON X DESCUENTO(13) promo vs normal no afecta la descripcion y es la diferencia entre:\r\n //la SUMA de todos los precios normales de productos y extras\r\n //VS (SUMA de todos los precios normales de productos y extras POR %Descuento o MENOS $Descuento)\r\n\r\n //EN COMPRA A + $ LLEVA B(3) promo vs normal no afecta la descripcion y es la DIFERENCIA entre:\r\n //la SUMA de todos los precios normales de productos y extras\r\n //VS la SUMA de todos los precios normales de productos + el campo IMPORTE\r\n function calculateControl() {\r\n updateItemList();\r\n var itemsSum = 0;\r\n var extraSum = 0;\r\n angular.forEach(self.mechanic.items, function (i) {\r\n itemsSum += i.normalPrice * (i.targetUnits != null ? i.targetUnits : 1);\r\n });\r\n angular.forEach(self.mechanic.itemsExtra, function (i) {\r\n extraSum += i.normalPrice * (i.targetUnits != null ? i.targetUnits : 1);\r\n });\r\n if (self.mechanic.mechanicType == 10)\r\n self.mechanic.promoVsNormal = (itemsSum + extraSum) - self.mechanic.targetItemDiscount;\r\n else if (self.mechanic.mechanicType == 3)\r\n self.mechanic.promoVsNormal = (itemsSum + extraSum) - (itemsSum + self.mechanic.targetItemDiscount);\r\n else if (self.mechanic.mechanicType == 13) {\r\n if (self.mechanic.discount)\r\n self.mechanic.promoVsNormal = (itemsSum + extraSum) - (itemsSum + (extraSum - self.mechanic.discount));\r\n else\r\n self.mechanic.promoVsNormal = (itemsSum + extraSum) - (itemsSum + (extraSum * self.mechanic.discountP / 100));\r\n }\r\n\r\n }\r\n\r\n self.addItemToMechanic = function () {\r\n var newScope = $scope.$new();\r\n var y = window.scrollY;\r\n\r\n newScope.saveItem = function () {\r\n promotionsService.mechanics.getItemForMechanic(self.selectedItemInModal.id, self.selectedItemInModal.saleUnitOfMeasureCode, $stateParams.promotionId)\r\n .then(function (item) {\r\n self.mechanic.items.push({\r\n itemId: item.itemId\r\n , itemCode: item.itemCode\r\n , itemEan: item.itemEan\r\n , sapDescription: item.sapDescription\r\n , umvId: item.umvId\r\n , umv: item.umv\r\n , subcategoryCode: item.subcategoryCode\r\n , subcategoryName: item.subcategoryName\r\n , subcategoryId: item.subcategoryId\r\n , manufacturer: item.manufacturer\r\n , investmentApportionment: item.investmentApportionment\r\n , normalPrice: item.normalPrice\r\n , minimalPrice: item.minimalPrice\r\n , currentPrice: item.currentPrice\r\n , currentPriceType: item.currentPriceType\r\n , currentPriceReason: item.currentPriceReason\r\n , fromPrice: item.fromPrice\r\n , toPrice: item.toPrice\r\n , internalCost: item.internalCost\r\n , marginPriceP: item.marginPriceP\r\n , minRange: item.minRange\r\n , maxRange: item.maxRange\r\n , manualForecast: item.manualForecast\r\n , dailyAvgSales: item.dailyAvgSales\r\n , dailyAvgUnits: item.dailyAvgUnits\r\n , salesForecast: item.salesForecast\r\n , unitsForecast: item.unitsForecast\r\n , marginForecastP: item.marginForecastP\r\n , marginForecast: item.marginForecast\r\n , internalPromotion: item.internalPromotion\r\n , sellInNewCost: item.sellInNewCost\r\n , sellOutNegotiated: item.sellOutNegotiated\r\n , estipulatedMarginP: item.estipulatedMarginP\r\n , estipulatedMargin: item.estipulatedMargin\r\n , returnAgreement: item.returnAgreement\r\n , isExtra: false\r\n\r\n });\r\n updateItemList();\r\n });\r\n\r\n self.selectedItemInModal = null;\r\n self.itemLookupText = null;\r\n\r\n ngDialog.close();\r\n $timeout(function () {\r\n window.scroll(0, y);\r\n }, 550);\r\n }\r\n newScope.cancel = function () {\r\n ngDialog.close();\r\n $timeout(function () {\r\n window.scroll(0, y);\r\n }, 550);\r\n }\r\n\r\n ngDialog.open({\r\n template: 'selectItemDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope,\r\n overflow: 'initial !important',\r\n showClose: false,\r\n closeByEscape: false,\r\n closeByDocument: false\r\n });\r\n }\r\n self.massiveCharge = function () {\r\n //if (self.itemsToMassiveCharge.split(',').length > 10) {\r\n // swal({\r\n // title: 'Cargo mas de 10 codigos',\r\n // text: 'si carga mas de 10 codigos a la vez no se obtendra informacion de ventas',\r\n // type: \"warning\",\r\n // showCancelButton: true,\r\n // cancelButtonText: \"Cancelar\",\r\n // confirmButtonColor: \"#1AB394\",\r\n // confirmButtonText: \"Aceptar\",\r\n // showLoaderOnConfirm: true,\r\n // closeOnConfirm: true,\r\n // closeOnCancel: true\r\n // }, function (isConfirm) {\r\n // if (isConfirm) {\r\n // doMassiveLoad();\r\n // }\r\n // });\r\n //} else {\r\n doMassiveLoad();\r\n //}\r\n }\r\n\r\n self.extraMassiveCharge = function () {\r\n //if (self.extraItemsToMassiveCharge.split(',').length > 10) {\r\n // swal({\r\n // title: 'Cargo mas de 10 codigos',\r\n // text: 'si carga mas de 10 codigos a la vez no se obtendra informacion de ventas',\r\n // type: \"warning\",\r\n // showCancelButton: true,\r\n // cancelButtonText: \"Cancelar\",\r\n // confirmButtonColor: \"#1AB394\",\r\n // confirmButtonText: \"Aceptar\",\r\n // showLoaderOnConfirm: true,\r\n // closeOnConfirm: true,\r\n // closeOnCancel: true\r\n // }, function (isConfirm) {\r\n // if (isConfirm) {\r\n // doExtraMassiveLoad();\r\n // }\r\n // });\r\n //} else {\r\n doExtraMassiveLoad();\r\n //}\r\n }\r\n\r\n\r\n self.itemList = []; //lista visible en la pantalla\r\n self.itemCounter = 50;//cantidad de items visibles\r\n\r\n function doMassiveLoad() {\r\n self.isLoadingMassiveCharge = true;\r\n var filterCategories = $stateParams.position == -2 ? [] : self.categoryIds;\r\n promotionsService.mechanics.getItemsForMechanic({ itemCodes: self.itemsToMassiveCharge, categoryIds: filterCategories, promotionId: $stateParams.promotionId })\r\n .then(function (items) {\r\n if (items.length == 0) {\r\n $timeout(function () {\r\n swal('Error!', 'Ninguno de los codigos coincide, revisar el formato y solo inculir items de las categorias de esta pagina', 'error');\r\n }, 200)\r\n }\r\n\r\n var isAlreadyCharged = false;\r\n angular.forEach(items, function (item) {\r\n\r\n //verifico si ya existe\r\n isAlreadyCharged = false;\r\n angular.forEach(self.mechanic.items, function (itemCargado) {\r\n if (itemCargado.itemId == item.itemId && itemCargado.umvId == item.umvId)\r\n isAlreadyCharged = true;\r\n });\r\n\r\n if (!isAlreadyCharged) {\r\n self.mechanic.items.push({\r\n itemId: item.itemId\r\n , itemCode: item.itemCode\r\n , itemEan: item.itemEan\r\n , sapDescription: item.sapDescription\r\n , umvId: item.umvId\r\n , umv: item.umv\r\n , subcategoryCode: item.subcategoryCode\r\n , subcategoryName: item.subcategoryName\r\n , subcategoryId: item.subcategoryId\r\n , manufacturer: item.manufacturer\r\n , investmentApportionment: item.investmentApportionment\r\n , normalPrice: item.normalPrice\r\n , minimalPrice: item.minimalPrice\r\n , currentPrice: item.currentPrice\r\n , currentPriceType: item.currentPriceType\r\n , currentPriceReason: item.currentPriceReason\r\n , fromPrice: item.fromPrice\r\n , toPrice: item.toPrice\r\n , internalCost: item.internalCost\r\n , marginPriceP: item.marginPriceP\r\n , minRange: item.minRange\r\n , maxRange: item.maxRange\r\n , manualForecast: item.manualForecast\r\n , dailyAvgSales: item.dailyAvgSales\r\n , dailyAvgUnits: item.dailyAvgUnits\r\n , salesForecast: item.salesForecast\r\n , unitsForecast: item.unitsForecast\r\n , marginForecastP: item.marginForecastP\r\n , marginForecast: item.marginForecast\r\n , internalPromotion: item.internalPromotion\r\n , sellInNewCost: item.sellInNewCost\r\n , sellOutNegotiated: item.sellOutNegotiated\r\n , estipulatedMarginP: item.estipulatedMarginP\r\n , estipulatedMargin: item.estipulatedMargin\r\n , returnAgreement: item.returnAgreement\r\n , isExtra: false\r\n\r\n });\r\n }\r\n else {\r\n //No lo carga xq ya lo tenes agregado.\r\n }\r\n\r\n\r\n });\r\n\r\n updateItemList();\r\n\r\n self.itemsToMassiveCharge = \"\";\r\n self.isLoadingMassiveCharge = false;\r\n });\r\n }\r\n\r\n function doExtraMassiveLoad() {\r\n self.isLoadingMassiveCharge = true;\r\n promotionsService.mechanics.getItemsForMechanic({ itemCodes: self.extraItemsToMassiveCharge, categoryIds: [], promotionId: $stateParams.promotionId })\r\n .then(function (items) {\r\n if (items.length === 0) {\r\n $timeout(function () {\r\n swal('Error!',\r\n 'Ninguno de los codigos coincide, revisar el formato.',\r\n 'error');\r\n },\r\n 200);\r\n }\r\n\r\n var isAlreadyCharged = false;\r\n angular.forEach(items, function (item) {\r\n\r\n //verifico si ya existe\r\n isAlreadyCharged = false;\r\n angular.forEach(self.mechanic.itemsExtra, function (itemCargado) {\r\n if (itemCargado.itemId === item.itemId && itemCargado.umvId === item.umvId) {\r\n isAlreadyCharged = true;\r\n }\r\n });\r\n\r\n if (!isAlreadyCharged) {\r\n self.mechanic.itemsExtra.push({\r\n itemId: item.itemId\r\n , itemCode: item.itemCode\r\n , itemEan: item.itemEan\r\n , sapDescription: item.sapDescription\r\n , umvId: item.umvId\r\n , umv: item.umv\r\n , subcategoryCode: item.subcategoryCode\r\n , subcategoryName: item.subcategoryName\r\n , subcategoryId: item.subcategoryId\r\n , manufacturer: item.manufacturer\r\n , investmentApportionment: item.investmentApportionment\r\n , normalPrice: item.normalPrice\r\n , minimalPrice: item.minimalPrice\r\n , currentPrice: item.currentPrice\r\n , currentPriceType: item.currentPriceType\r\n , currentPriceReason: item.currentPriceReason\r\n , fromPrice: item.fromPrice\r\n , toPrice: item.toPrice\r\n , internalCost: item.internalCost\r\n , marginPriceP: item.marginPriceP\r\n , minRange: item.minRange\r\n , maxRange: item.maxRange\r\n , manualForecast: item.manualForecast\r\n , dailyAvgSales: item.dailyAvgSales\r\n , dailyAvgUnits: item.dailyAvgUnits\r\n , salesForecast: item.salesForecast\r\n , unitsForecast: item.unitsForecast\r\n , marginForecastP: item.marginForecastP\r\n , marginForecast: item.marginForecast\r\n , internalPromotion: item.internalPromotion\r\n , sellInNewCost: item.sellInNewCost\r\n , sellOutNegotiated: item.sellOutNegotiated\r\n , estipulatedMarginP: item.estipulatedMarginP\r\n , estipulatedMargin: item.estipulatedMargin\r\n , returnAgreement: item.returnAgreement\r\n , isExtra: true\r\n });\r\n }\r\n else {\r\n //No lo carga xq ya lo tenes agregado.\r\n }\r\n });\r\n\r\n updateItemList();\r\n\r\n self.extraItemsToMassiveCharge = '';\r\n self.isLoadingMassiveCharge = false;\r\n });\r\n }\r\n\r\n self.viewMore = function () {\r\n self.itemCounter += 50;\r\n updateItemList();\r\n }\r\n\r\n function ExportToExcel(tableHtml, worksheetName) {\r\n var uri = 'data:application/vnd.ms-excel;base64,',\r\n template = '{table}
',\r\n base64 = function (s) { return $window.btoa(unescape(encodeURIComponent(s))); },\r\n format = function (s, c) { return s.replace(/{(\\w+)}/g, function (m, p) { return c[p]; }) };\r\n\r\n var ctx = { worksheet: worksheetName, table: tableHtml },\r\n href = uri + base64(format(template, ctx));\r\n return href;\r\n }\r\n\r\n self.batchLoad = function () {\r\n self.currentStep = 1;\r\n self.gridOptions = {\r\n columnDefs: [\r\n {\r\n headerName: 'Severidad',\r\n width: 100,\r\n pinned: 'left',\r\n field: 'severity',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n rowGroupIndex: 0,\r\n cellRenderer: function (params) {\r\n var severityName = '';\r\n switch (params.value) {\r\n case 'Information': { severityName = ' Info'; break; }\r\n case 'Warning': { severityName = ' Warn'; break; }\r\n case 'Error': { severityName = ' Error'; break; }\r\n }\r\n return severityName;\r\n }\r\n },\r\n {\r\n headerName: 'Fila',\r\n width: 50,\r\n pinned: 'left',\r\n field: 'row',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n {\r\n headerName: 'Categoria',\r\n width: 150,\r\n rowGroupIndex: 1,\r\n pinned: 'left',\r\n field: 'category',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n {\r\n headerName: 'Descripcion',\r\n width: 350,\r\n pinned: 'left',\r\n field: 'description',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n ],\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n rowHeight: 35,\r\n suppressHorizontalScroll: false,\r\n suppressCellSelection: true,\r\n groupUseEntireRow: true,\r\n groupSuppressAutoColumn: false,\r\n groupDefaultExpanded: 0,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n angularCompileRows: true,\r\n }\r\n\r\n self.showNextStep = function () {\r\n if (self.currentStep > 0 && self.currentStep < 4) {\r\n self.currentStep++;\r\n loadResults([]);\r\n }\r\n }\r\n\r\n self.downloadExcel = function () {\r\n updateItemList();\r\n var html = '';\r\n //header\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n\r\n angular.forEach(self.mechanic.items, function (item) {\r\n html += buildRow(item);\r\n });\r\n\r\n html += '
ArticuloEanDescripcion SAPUMVPrecio MecanicaCodigo JerarquiaDescripcion JerarquiaProveedorPrecio NormalPrecio BonusPuntos BonusVenta $ Promedio DiariaVenta U Promedio DiariaPronostico Venta Unidades Articulo en Foto
';\r\n\r\n var exportHref = ExportToExcel(html, 'Pagina1');\r\n $timeout(function () {\r\n location.href = exportHref;\r\n self.showNextStep();\r\n }, 100); // trigger download\r\n }\r\n\r\n function buildRow(item) {\r\n var html = '';\r\n html +=\r\n '' + item.itemCode +\r\n '' + item.itemEan +\r\n '' + item.sapDescription +\r\n '' + item.umv +\r\n '' + item.mechanicPrice +\r\n '' + item.subcategoryCode +\r\n '' + item.subcategoryName +\r\n '' + item.manufacturer +\r\n '' + item.normalPrice +\r\n '' + item.bonusPrice +\r\n '' + item.bonusPoints +\r\n '' + item.dailyAvgSales +\r\n '' + item.dailyAvgUnits +\r\n '' + item.unitsForecast +\r\n '' + item.unitsForecast +\r\n '' + \r\n '';\r\n\r\n return html;\r\n }\r\n\r\n self.uploadFile = function (files) {\r\n if (files && files.length > 0) {\r\n self.isBusy = true;\r\n var url = serverService.getApiUrl() + '/promotion/mechanics/uploadItemsBatchFile';\r\n Upload.upload({\r\n url: url,\r\n data: { file: files[0] }\r\n }).then(function (response) {\r\n self.guid = response.data;\r\n self.finishedUpload = true;\r\n self.isBusy = false;\r\n self.gridOptions.api.refreshView();\r\n });\r\n }\r\n }\r\n\r\n self.validateUploadedFile = function () {\r\n self.isBusy3 = true;\r\n promotionsService.mechanics.validateItemsBatchFile(self.guid, $stateParams.promotionMediaPageId)\r\n .then(function (dto) {\r\n processImporterResults(dto);\r\n if (!anyError(dto)) {\r\n self.finishedValidation = true;\r\n }\r\n });\r\n\r\n }\r\n\r\n self.reUploadFile = function () {\r\n self.currentStep = 2;\r\n loadResults([]);\r\n self.files = null;\r\n self.finishedUpload = false;\r\n self.finishedValidation = false;\r\n self.finishedUpdate = false;\r\n }\r\n\r\n self.updateItems = function () {\r\n self.isBusy4 = true;\r\n promotionsService.mechanics.updateItemsInBatch(self.guid, $stateParams.promotionId)\r\n .then(function (dtos) {\r\n self.isBusy4 = false;\r\n self.mechanic.items = [];\r\n self.itemList = [];\r\n self.itemCounter = dtos.length > 50 ? 50 : dtos.length;\r\n //delete from db\r\n promotionsService.mechanics.deleteAllSelection(self.mechanic.id, false, $stateParams.promotionId);\r\n angular.forEach(dtos, function (item) {\r\n self.mechanic.items.push({\r\n itemId: item.itemId\r\n , itemCode: item.itemCode\r\n , itemEan: item.itemEan\r\n , sapDescription: item.sapDescription\r\n , umvId: item.umvId\r\n , umv: item.umv\r\n , subcategoryCode: item.subcategoryCode\r\n , subcategoryName: item.subcategoryName\r\n , subcategoryId: item.subcategoryId\r\n , manufacturer: item.manufacturer\r\n , investmentApportionment: null\r\n , normalPrice: item.normalPrice\r\n , bonusPrice: item.bonusPrice\r\n , bonusPoints: item.bonusPoints\r\n , mechanicPrice: item.mechanicPrice\r\n , minimalPrice: null\r\n , currentPrice: null\r\n , currentPriceType: null\r\n , currentPriceReason: null\r\n , fromPrice: null\r\n , toPrice: null\r\n , internalCost: null\r\n , marginPriceP: null\r\n , minRange: null\r\n , maxRange: null\r\n , manualForecast: null\r\n , dailyAvgSales: item.dailyAvgSales\r\n , dailyAvgUnits: item.dailyAvgUnits\r\n , salesForecast: null\r\n , unitsForecast: item.unitsForecast\r\n , marginForecastP: null\r\n , marginForecast: null\r\n , internalPromotion: ($stateParams.position == -2 ? true : false)\r\n , sellInNewCost: null\r\n , sellOutNegotiated: null\r\n , estipulatedMarginP: null\r\n , estipulatedMargin: null\r\n , returnAgreement: null\r\n , isExtra: false\r\n , isItemInPhoto: item.isItemInPhoto\r\n\r\n });\r\n });\r\n updateItemList();\r\n\r\n self.finish();\r\n });\r\n\r\n }\r\n\r\n self.finish = function () {\r\n self.currentStep = 1;\r\n loadResults([]);\r\n\r\n self.finishedUpload = false;\r\n self.finishedValidation = false;\r\n self.finishedUpdate = false;\r\n\r\n ngDialog.close();\r\n }\r\n\r\n function processImporterResults(importerResults) {\r\n self.isBusy = false;\r\n self.isBusy2 = false;\r\n self.isBusy3 = false;\r\n self.isBusy4 = false;\r\n\r\n if (importerResults.length > 0) {\r\n loadResults(importerResults);\r\n }\r\n if (anyError(importerResults)) {\r\n self.error = true;\r\n }\r\n else\r\n self.error = false;\r\n }\r\n\r\n function loadResults(results) {\r\n self.gridOptions.api.setRowData(results);\r\n self.gridOptions.api.refreshView();\r\n\r\n self.gridVisible = results.length > 0 ? true : false;\r\n }\r\n\r\n function anyError(importerResults) {\r\n var error = false;\r\n for (var i = 0; i < importerResults.length; i++) {\r\n if (importerResults[i].severity === 'Error')\r\n error = true;\r\n }\r\n\r\n return error;\r\n }\r\n\r\n ngDialog.open({\r\n template: 'batchLoadDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n controller: function () {\r\n return self;\r\n },\r\n controllerAs: 'ct',\r\n });\r\n }\r\n\r\n self.addItemExtraToMechanic = function () {\r\n var newScope = $scope.$new();\r\n var y = window.scrollY;\r\n\r\n newScope.saveItem = function () {\r\n promotionsService.mechanics.getItemForMechanic(self.selectedItemInModal.id, self.selectedItemInModal.saleUnitOfMeasureCode, $stateParams.promotionId)\r\n .then(function (item) {\r\n self.mechanic.itemsExtra.push({\r\n itemId: item.itemId\r\n , umvId: item.umvId\r\n , umv: item.umv\r\n , itemCode: item.itemCode\r\n , itemEan: item.itemEan\r\n , sapDescription: item.sapDescription\r\n , itemType: null\r\n , subcategoryCode: item.subcategoryCode\r\n , subcategoryName: item.subcategoryName\r\n , subcategoryId: item.subcategoryId\r\n , unitsToTake: null\r\n , investmentApportionment: item.investmentApportionment\r\n , normalPrice: item.normalPrice\r\n , isExtra: true\r\n });\r\n });\r\n\r\n\r\n self.selectedItemInModal = null;\r\n self.itemLookupText = null;\r\n\r\n\r\n ngDialog.close();\r\n $timeout(function () {\r\n window.scroll(0, y);\r\n }, 550);\r\n }\r\n newScope.cancel = function () {\r\n ngDialog.close();\r\n $timeout(function () {\r\n window.scroll(0, y);\r\n }, 550);\r\n }\r\n\r\n ngDialog.open({\r\n template: 'selectItemExtraDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope,\r\n overflow: 'initial !important',\r\n showClose: false,\r\n closeByEscape: false,\r\n closeByDocument: false\r\n });\r\n }\r\n\r\n self.deleteMechanicItem = function (item) {\r\n swal({\r\n title: 'Esta seguro que desea eliminar el articulo ?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#DD6B55\",\r\n confirmButtonText: \"Eliminar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n updateItemList();\r\n var index = self.mechanic.items.indexOf(item);\r\n self.mechanic.items.splice(index, 1);\r\n promotionsService.mechanics.deleteMechanicItemOrCategory(item.id, false, $stateParams.promotionId)//delete from db\r\n .then(function (isOk) {\r\n updateItemList();\r\n $timeout(function () {\r\n swal('Articulo Borrado!', 'se ha borrado correctamente', 'success');\r\n }, 200)\r\n });\r\n }\r\n });\r\n\r\n }\r\n\r\n self.deleteMechanicExtraItem = function (item) {\r\n swal({\r\n title: 'Esta seguro que desea eliminar el articulo ?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#DD6B55\",\r\n confirmButtonText: \"Eliminar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n var index = self.mechanic.itemsExtra.indexOf(item);\r\n self.mechanic.itemsExtra.splice(index, 1);\r\n promotionsService.mechanics.deleteMechanicItemOrCategory(item.id, false, $stateParams.promotionId)//delete from db\r\n .then(function (isOk) {\r\n $timeout(function () {\r\n swal('Articulo Borrado!', 'se ha borrado correctamente', 'success');\r\n }, 200)\r\n });\r\n\r\n }\r\n });\r\n\r\n\r\n\r\n }\r\n\r\n self.deleteMechanicCategory = function (cat) {\r\n\r\n swal({\r\n title: 'Esta seguro que desea eliminar la jerarquia ?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#DD6B55\",\r\n confirmButtonText: \"Eliminar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n var index = self.mechanic.categories.indexOf(cat);\r\n self.mechanic.categories.splice(index, 1);\r\n promotionsService.mechanics.deleteMechanicItemOrCategory(cat.id, true, $stateParams.promotionId)//delete from db\r\n .then(function (isOk) {\r\n $timeout(function () {\r\n swal('Jerarquia Borrada!', 'se ha borrado correctamente', 'success');\r\n }, 200)\r\n });\r\n\r\n }\r\n });\r\n }\r\n\r\n self.deleteMechanicExtraCategory = function (cat) {\r\n\r\n swal({\r\n title: 'Esta seguro que desea eliminar la jerarquia ?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#DD6B55\",\r\n confirmButtonText: \"Eliminar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n var index = self.mechanic.categoriesExtra.indexOf(cat);\r\n self.mechanic.categoriesExtra.splice(index, 1);\r\n promotionsService.mechanics.deleteMechanicItemOrCategory(cat.id, true, $stateParams.promotionId)//delete from db\r\n .then(function (isOk) {\r\n $timeout(function () {\r\n swal('Jerarquia Borrada!', 'se ha borrado correctamente', 'success');\r\n }, 200)\r\n });\r\n\r\n }\r\n });\r\n\r\n\r\n }\r\n\r\n self.deleteChat = function (chatId) {\r\n\r\n swal({\r\n title: 'Borrar el comentario ?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n promotionsService.items.deleteItemChat(chatId)\r\n .then(function (isOk) {\r\n for (var i = 0; i < self.mechanic.chats.length; i++) {\r\n if (self.mechanic.chats[i].id == chatId)\r\n self.mechanic.chats.splice(self.mechanic.chats.indexOf(chatId), 1);\r\n }\r\n swal('Comentario Borrado!', 'se ha borrado correctamente', 'success');\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de borrado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al borrar el comentario\", \"error\");\r\n }\r\n });\r\n\r\n\r\n }\r\n\r\n });\r\n }\r\n\r\n\r\n $scope.$watch('ct.mechanic', function (newVal, oldVal) {\r\n switch (newVal.mechanicType) {\r\n case 1: { //AxB\r\n if (newVal.targetUnits != null && newVal.payUnits != null && newVal.itemOrCategory && newVal.itemOrCategory.length > 2) {\r\n newVal.name = \"El cliente al comprar \" + newVal.targetUnits + \" artículos de \" + newVal.itemOrCategory + \" pagará \" + newVal.payUnits + \" y llevará totalmente gratis \" + (newVal.targetUnits - newVal.payUnits).toString();\r\n }\r\n else\r\n newVal.name = '';\r\n break;\r\n }\r\n case 2: { //Coleccionable\r\n break;\r\n }\r\n case 3: { //Compra A + $ lleva B\r\n calculateControl();\r\n if (newVal.targetUnits != null && newVal.sourceItem != null && newVal.targetItem && newVal.targetItemDiscount) {\r\n var takingExtra = newVal.itemsExtra.length > 0 && newVal.itemsExtra[0].unitsToTake ? newVal.itemsExtra[0].unitsToTake : \"\";\r\n newVal.name = \"El cliente al comprar \" + newVal.targetUnits + \" de \" + newVal.sourceItem + \" mas $\" + newVal.targetItemDiscount + \" llevará \" + takingExtra + \" \" + newVal.targetItem;\r\n }\r\n else\r\n newVal.name = '';\r\n break;\r\n }\r\n case 4: { //Compra A y llevate B Gratis\r\n if (newVal.targetUnits != null && newVal.sourceItem != null && newVal.targetItem) {\r\n var takingExtra = newVal.itemsExtra.length > 0 && newVal.itemsExtra[0].unitsToTake ? newVal.itemsExtra[0].unitsToTake : \"\";\r\n newVal.name = \"El cliente al comprar \" + newVal.targetUnits + \" de \" + newVal.sourceItem + \" llevará totalmente gratis \" + takingExtra + \" \" + newVal.targetItem;\r\n }\r\n break;\r\n }\r\n case 5: { //Compra X$ en A y lleva X B Gratis\r\n if (newVal.sourceItem != null && newVal.targetItem && newVal.targetItemDiscount) {\r\n var takingExtra = newVal.itemsExtra.length > 0 && newVal.itemsExtra[0].unitsToTake ? newVal.itemsExtra[0].unitsToTake : \"\";\r\n newVal.name = \"El cliente al comprar $\" + newVal.targetItemDiscount + \" en \" + newVal.sourceItem + \" llevará totalmente gratis \" + takingExtra + \" \" + newVal.targetItem;\r\n }\r\n else\r\n newVal.name = '';\r\n break;\r\n }\r\n case 6: { //Cupon de Descuento\r\n self.blockDiscountP = false;\r\n self.blockDiscount = false;\r\n\r\n if (newVal.discountP == 0 || newVal.discountP == undefined || newVal.discountP == null)\r\n self.blockDiscount = false;\r\n else\r\n self.blockDiscount = true;\r\n if (newVal.discount == 0 || newVal.discount == undefined || newVal.discount == null)\r\n self.blockDiscountP = false;\r\n else\r\n self.blockDiscountP = true;\r\n\r\n newVal.name = '';\r\n if (newVal.itemOrCategory != null && newVal.itemOrCategory != '' && ((newVal.discount != 0 && newVal.discount != null) || (newVal.discountP != 0 && newVal.discountP != null))) {\r\n var discount = newVal.discountP != 0 && newVal.discountP != null ? \"un \" + newVal.discountP + '%' : \"$\" + newVal.discount;\r\n newVal.name = \"El cliente al entregar el cupon obtendrá \" + discount + \" de descuento en \" + newVal.itemOrCategory;\r\n }\r\n\r\n break;\r\n }\r\n case 7: { //Cuponera de Descuento\r\n self.blockpunctualDiscountP = false;\r\n self.blockpunctualDiscount = false;\r\n\r\n if ((newVal.items.length > 0 && (newVal.items[0].punctualDiscount == 0 || newVal.items[0].punctualDiscount == null || newVal.items[0].punctualDiscount == undefined)) || (newVal.categories.length > 0 && (newVal.categories[0].punctualDiscount == 0 || newVal.categories[0].punctualDiscount == null || newVal.categories[0].punctualDiscount == undefined)))\r\n self.blockpunctualDiscountP = false;\r\n else\r\n self.blockpunctualDiscountP = true;\r\n\r\n if ((newVal.items.length > 0 && (newVal.items[0].punctualDiscountP == 0 || newVal.items[0].punctualDiscountP == null || newVal.items[0].punctualDiscountP == undefined)) || (newVal.categories.length > 0 && (newVal.categories[0].punctualDiscountP == 0 || newVal.categories[0].punctualDiscountP == null || newVal.categories[0].punctualDiscountP == undefined)))\r\n self.blockpunctualDiscount = false;\r\n else\r\n self.blockpunctualDiscount = true;\r\n\r\n self.blockDiscountP = false;\r\n self.blockDiscount = false;\r\n\r\n if (newVal.discountP == 0 || newVal.discountP == undefined || newVal.discountP == null)\r\n self.blockDiscount = false;\r\n else\r\n self.blockDiscount = true;\r\n if (newVal.discount == 0 || newVal.discount == undefined || newVal.discount == null)\r\n self.blockDiscountP = false;\r\n else\r\n self.blockDiscountP = true;\r\n break;\r\n }\r\n case 8: { //X de descuento\r\n self.blockDiscountP = false;\r\n self.blockDiscount = false;\r\n\r\n if (newVal.discountP == 0 || newVal.discountP == undefined || newVal.discountP == null)\r\n self.blockDiscount = false;\r\n else\r\n self.blockDiscount = true;\r\n if (newVal.discount == 0 || newVal.discount == undefined || newVal.discount == null)\r\n self.blockDiscountP = false;\r\n else\r\n self.blockDiscountP = true;\r\n\r\n if ((newVal.discount && newVal.discount != 0) || (newVal.discountP && newVal.discountP != 0)) {\r\n var discount = newVal.discountP != 0 && newVal.discountP != null ? \"un \" + newVal.discountP + '%' : \"$\" + newVal.discount;\r\n newVal.name = \"El cliente al comprar los productos indicados obtendra \" + discount + \" de descuento\";\r\n }\r\n\r\n break;\r\n }\r\n case 9: { //x% de Descuento por Dia\r\n\r\n break;\r\n }\r\n case 10: { //Pack Virtual\r\n\r\n //Solo permito seleccionar items, no jerarquias.\r\n self.selectionItemOrCategoryExtra = 2; //Item\r\n self.selectionItemOrCategory = 2; //Item\r\n calculateControl();\r\n\r\n if (newVal.itemOrCategory && newVal.itemOrCategory != '' && newVal.targetItemDiscount && newVal.targetItemDiscount != '') {\r\n var m3 = newVal.items.length > 0 ? newVal.items[0] : null;\r\n if (m3 && m3.normalPrice && m3.currentPrice) {\r\n var m3name = m3.sapDescription;\r\n var total = m3.normalPrice - m3.currentPrice;\r\n }\r\n\r\n m3Extra = newVal.itemsExtra.length > 0 ? newVal.itemsExtra[0] : null;\r\n if (m3Extra && m3Extra.normalPrice && m3Extra.currentPrice) {\r\n var totalExtra = m3Extra.normalPrice - m3Extra.currentPrice;\r\n }\r\n\r\n newVal.name = \"El cliente al comprar \" + newVal.itemOrCategory + \" pagará $\" + newVal.targetItemDiscount + \". El cliente ahorrará $\" + self.mechanic.promoVsNormal.toFixed(2);\r\n\r\n if (m3 && m3.normalPrice && m3.currentPrice && m3Extra && m3Extra.normalPrice && m3Extra.currentPrice) {\r\n var m3SubTotal = total + totalExtra;\r\n newVal.name += \" (Precio Normal del Pack \" + m3name + \"=(\" + m3SubTotal + \")), el cliente Ahorrará \" + (m3SubTotal - newVal.targetItemDiscount); // M4 = M3-M1\r\n }\r\n }\r\n\r\n break;\r\n }\r\n case 11: { // Mensaje\r\n\r\n break;\r\n }\r\n case 12: { //X interes y Cuotas\r\n\r\n if (newVal.dues && newVal.interest)\r\n newVal.name = \"El cliente comprará los articulos que se detallan en \" + newVal.dues + \" cuotas con un interes del %\" + newVal.interest;\r\n\r\n break;\r\n }\r\n case 13: { //Compra A y lleva B con X de descuento\r\n calculateControl();\r\n self.blockDiscountP = false;\r\n self.blockDiscount = false;\r\n\r\n if (newVal.discountP == 0 || newVal.discountP == undefined || newVal.discountP == null)\r\n self.blockDiscount = false;\r\n else\r\n self.blockDiscount = true;\r\n\r\n if (newVal.discount == 0 || newVal.discount == undefined || newVal.discount == null)\r\n self.blockDiscountP = false;\r\n else\r\n self.blockDiscountP = true;\r\n\r\n if (newVal.targetUnits && newVal.targetUnits > 0 && newVal.sourceItem && newVal.targetItem && ((newVal.discount && newVal.discount != 0) || (newVal.discountP && newVal.discountP != 0))) {\r\n var discount = newVal.discountP != 0 && newVal.discountP != null ? \"un \" + newVal.discountP + '%' : \"$\" + newVal.discount;\r\n var c4 = newVal.itemsExtra && newVal.itemsExtra.length > 0 ? (newVal.itemsExtra[0].unitsToTake != null ? newVal.itemsExtra[0].unitsToTake : \"\") : \"\";\r\n newVal.name = \"El cliente al comprar \" + newVal.targetUnits + \" de \" + newVal.sourceItem + \" tendra \" + discount + \" de descuento en \" + c4 + ' ' + newVal.targetItem;\r\n }\r\n\r\n break;\r\n }\r\n case 14: { //Electro Fans\r\n self.blockpunctualDiscountP = false;\r\n self.blockpunctualDiscount = false;\r\n\r\n if ((newVal.items.length > 0 && (newVal.items[0].punctualDiscount == 0 || newVal.items[0].punctualDiscount == null || newVal.items[0].punctualDiscount == undefined)) || (newVal.categories.length > 0 && (newVal.categories[0].punctualDiscount == 0 || newVal.categories[0].punctualDiscount == null || newVal.categories[0].punctualDiscount == undefined)))\r\n self.blockpunctualDiscountP = false;\r\n else\r\n self.blockpunctualDiscountP = true;\r\n\r\n if ((newVal.items.length > 0 && (newVal.items[0].punctualDiscountP == 0 || newVal.items[0].punctualDiscountP == null || newVal.items[0].punctualDiscountP == undefined)) || (newVal.categories.length > 0 && (newVal.categories[0].punctualDiscountP == 0 || newVal.categories[0].punctualDiscountP == null || newVal.categories[0].punctualDiscountP == undefined)))\r\n self.blockpunctualDiscount = false;\r\n else\r\n self.blockpunctualDiscount = true;\r\n\r\n break;\r\n }\r\n case 15: { //Descuento por Hora\r\n self.blockpunctualDiscountP = false;\r\n self.blockpunctualDiscount = false;\r\n\r\n if ((newVal.items.length > 0 && (newVal.items[0].punctualDiscount == 0 || newVal.items[0].punctualDiscount == null || newVal.items[0].punctualDiscount == undefined)) || (newVal.categories.length > 0 && (newVal.categories[0].punctualDiscount == 0 || newVal.categories[0].punctualDiscount == null || newVal.categories[0].punctualDiscount == undefined)))\r\n self.blockpunctualDiscountP = false;\r\n else\r\n self.blockpunctualDiscountP = true;\r\n\r\n if ((newVal.items.length > 0 && (newVal.items[0].punctualDiscountP == 0 || newVal.items[0].punctualDiscountP == null || newVal.items[0].punctualDiscountP == undefined)) || (newVal.categories.length > 0 && (newVal.categories[0].punctualDiscountP == 0 || newVal.categories[0].punctualDiscountP == null || newVal.categories[0].punctualDiscountP == undefined)))\r\n self.blockpunctualDiscount = false;\r\n else\r\n self.blockpunctualDiscount = true;\r\n\r\n break;\r\n }\r\n case 16: { //Precios Multiples\r\n\r\n break;\r\n }\r\n case 17: { //Mega Promo\r\n\r\n if (newVal.buyCash != null && newVal.stickers != null && newVal.buyCashSponsors != null && newVal.stickersSponsors != null)\r\n newVal.name = \"Por cada $ \" + newVal.buyCash + \" de compra, presentando tu tarjta Bonus, recibiras \" + newVal.stickers + \" stickers y por cada $ \" + newVal.buyCashSponsors + \" de compra en productos auspiciadores recibiras \" + newVal.stickersSponsors + \" stickers mas.\";\r\n\r\n break;\r\n }\r\n case 18: { //Desc en Vales de Compra\r\n //Solo permito seleccionar items, no jerarquias.\r\n self.selectionItemOrCategory = 2; //Item\r\n break;\r\n }\r\n case 20: { //Precio-Producto Masivo\r\n self.selectionItemOrCategory = 2;\r\n break;\r\n }\r\n }\r\n //APLICA A TODAS LAS MECANICAS\r\n\r\n if (newVal.apportionment == true) {\r\n self.validationRetailP = true;\r\n self.validationSupermarketP = true;\r\n self.totalValidation = true;\r\n var total = newVal.retailP + newVal.supermarketP;\r\n\r\n if (newVal.retailP > 100)\r\n self.validationRetailP = false;\r\n\r\n if (newVal.supermarketP > 100)\r\n self.validationSupermarketP = false;\r\n\r\n if (total != 100)\r\n self.totalValidation = false;\r\n }\r\n else {\r\n self.validationRetailP = true;\r\n self.validationSupermarketP = true;\r\n self.totalValidation = true;\r\n }\r\n\r\n //Solapamiento\r\n //if (newVal.items != oldVal.items || newVal.categories != oldVal.categories) {\r\n // var overlaps = {\r\n // items: newVal.items,\r\n // categories: newVal.categories,\r\n // excludedItemCodes: newVal.excludedItemCodes,\r\n // position: $stateParams.position,\r\n // promotionMediaPageId: $stateParams.promotionMediaPageId,\r\n // promotionId: $stateParams.promotionId\r\n // };\r\n\r\n // promotionsService.mechanics.getMechanicOverlaps(overlaps)\r\n // .then(function (overlaps) {\r\n // self.overlaps = overlaps;\r\n // self.distinctPromotionsOveralps = []; \r\n // _.forOwn(_.groupBy(self.overlaps, \"promotionId\"), function (value, key) {\r\n // self.distinctPromotionsOveralps.push(key);\r\n // });\r\n // });\r\n //}\r\n\r\n self.itemCodes = \"\";\r\n self.mechanic.items.forEach(function (i) { self.itemCodes += (i.itemCode.replace(/^0+/, '')) + ','; });\r\n\r\n self.extraItemCodes = '';\r\n self.mechanic.itemsExtra.forEach(function (i) {\r\n self.extraItemCodes += (i.itemCode.replace(/^0+/, '')) + ',';\r\n });\r\n }, true);\r\n\r\n $scope.$watch('ct.itemLookupText', function (newVal, oldVal) {\r\n if (newVal) {\r\n\r\n if (newVal.id) {\r\n self.selectedItemInModal = self.itemLookupText;\r\n }\r\n else if (newVal && newVal != oldVal && (newVal.length >= 4 || (oldVal.length && oldVal.length > 3)) && newVal != previousLookupText) {\r\n previousLookupText = newVal;\r\n\r\n self.itemsInLookup = [{ id: 0, code: '', name: 'Cargando Items con el texto ' + newVal + '...' }];\r\n var lookupParameter = { searchTerm: newVal, categoryIds: self.categoryIds };\r\n homeService.lookups.itemsLookup(lookupParameter)\r\n .then(function (items) {\r\n self.itemsInLookup = items;\r\n if (items.length > 0)\r\n self.lookupItemsNoResults = false;\r\n else\r\n self.lookupItemsNoResults = true;\r\n });\r\n }\r\n }\r\n\r\n }, true);\r\n\r\n $scope.$watch('ct.itemExtraLookupText', function (newVal, oldVal) {\r\n if (newVal) {\r\n\r\n if (newVal.id) {\r\n self.selectedItemInModal = self.itemExtraLookupText;\r\n }\r\n else if (newVal && newVal != oldVal && (newVal.length >= 4 || (oldVal.length && oldVal.length > 3)) && newVal != previousLookupText) {\r\n previousLookupText = newVal;\r\n\r\n self.itemsInLookup = [{ id: 0, code: '', name: 'Cargando Items con el texto ' + newVal + '...' }];\r\n var lookupParameter = { searchTerm: newVal, categoryIds: [] };\r\n homeService.lookups.itemsLookup(lookupParameter)\r\n .then(function (items) {\r\n self.itemsInLookup = items;\r\n if (items.length > 0)\r\n self.lookupItemsNoResults = false;\r\n else\r\n self.lookupItemsNoResults = true;\r\n });\r\n }\r\n }\r\n\r\n }, true);\r\n\r\n $scope.$watch('ct.selectedVendor', function (newVal, oldVal) {\r\n if (newVal && newVal.id != null) {\r\n self.mechanic.vendorId = newVal.id;\r\n }\r\n else {\r\n self.mechanic.vendorId = null;\r\n }\r\n }, true);\r\n\r\n function newMechanic() {\r\n var newMechanic = {\r\n promotionMediaPageId: parseInt($stateParams.promotionMediaPageId),\r\n taskId: parseInt($stateParams.taskId),\r\n position: parseInt($stateParams.position),\r\n isHighlighted: ($stateParams.isHighlighted == \"true\"),\r\n isSubstitute: ($stateParams.isSubstitute == \"true\"),\r\n promotionId: parseInt($stateParams.promotionId),\r\n name: '',\r\n ticketDescription: '',\r\n observation: '',\r\n chats: [],\r\n itemOrCategory: '',\r\n message: '',\r\n items: [],\r\n categories: [],\r\n categoriesExtra: [],\r\n itemsExtra: [],\r\n stores: self.stores,\r\n sourceUnits: null,\r\n buyCash: null,\r\n stickers: null,\r\n buyCashSponsors: null,\r\n stickersSponsors: null,\r\n targetUnits: null,\r\n payUnits: null,\r\n sourceItem: '',\r\n targetItem: '',\r\n targetItemDiscount: null,\r\n targetUnitsAtDiscount: null,\r\n targetUnitsDiscount: null,\r\n itemPlusMoney: null,\r\n payAmount: null,\r\n mechanicType: null,\r\n apportionment: false,\r\n retailP: null,\r\n supermarketP: null,\r\n acumOtherPromotions: false,\r\n applyOfferPrices: false,\r\n unitsRestriction: false,\r\n moneyRestriction: false,\r\n unitsRestrictionValue: null,\r\n moneyRestrictionValue: null,\r\n cardRestriction: false,\r\n bonusCard: false,\r\n wongCard: false,\r\n metroCard: false,\r\n otherCard: false,\r\n participantGoods: '',\r\n ministerPermission: '',\r\n affectsClientMargin: false,\r\n discountByCategoryP: null,\r\n otherDiscounts: '',\r\n sellIn: false,\r\n sellOut: true,\r\n vendorId: null,\r\n charge: true,\r\n chargeRate: null,\r\n negotiatedChargeRate: null,\r\n excludedItemCodes: '',\r\n announcementType: 1,\r\n paymentType: 2,\r\n returnAgreement: false,\r\n sellInNewCost: null,\r\n sellOutNegotiated: null,\r\n estipulatedMarginP: null,\r\n estipulatedMargin: null,\r\n promoVsNormal: null\r\n }\r\n\r\n return newMechanic;\r\n }\r\n\r\n function getMechanicInfo(promotionId, promotionMechanicId) {\r\n self.isLoading = true;\r\n\r\n promotionsService.mechanics.getMechanicInfo(promotionId, promotionMechanicId)\r\n .then(function (mechanic) {\r\n self.mechanic = mechanic;\r\n self.mechanic.promotionMediaPageId = $stateParams.promotionMediaPageId;\r\n self.mechanic.position = $stateParams.position;\r\n self.mechanic.isHighlighted = $stateParams.isHighlighted;\r\n self.mechanic.isSubstitute = $stateParams.isSubstitute;\r\n self.setAcumPromotion(mechanic.acumOtherPromotions);\r\n self.setApplyOfferPrices(mechanic.applyOfferPrices);\r\n self.setCardRestriction(mechanic.cardRestriction);\r\n self.setAffectsClientMargin(mechanic.affectsClientMargin);\r\n if ($stateParams.promotionMechanicId == 0) {//isNew\r\n self.setMoneyRestriction(mechanic.moneyRestriction);\r\n self.setUnitsRestriction(mechanic.unitsRestriction);\r\n self.setCharge(mechanic.charge);\r\n }\r\n else {//is not new\r\n self.mechanic.items.forEach(function (i) {\r\n if (i.activationDate)\r\n i.activationDate = new Date(i.activationDate);\r\n if (i.startTime)\r\n i.startTime = new Date(i.startTime);\r\n if (i.endTime)\r\n i.endTime = new Date(i.endTime);\r\n });\r\n self.mechanic.categories.forEach(function (c) {\r\n if (c.activationDate)\r\n c.activationDate = new Date(c.activationDate);\r\n if (c.startTime)\r\n c.startTime = new Date(c.startTime);\r\n if (c.endTime)\r\n c.endTime = new Date(c.endTime);\r\n });\r\n updateItemList();\r\n }\r\n self.isLoading = false;\r\n\r\n //Load Category Or Item Box\r\n self.selectionItemOrCategory = mechanic.categories && mechanic.categories.length > 0 ? \"1\" : mechanic.items && mechanic.items.length > 0 ? \"2\" : null;\r\n self.selectionItemOrCategoryExtra = mechanic.categoriesExtra && mechanic.categoriesExtra.length > 0 ? \"1\" : mechanic.itemsExtra && mechanic.itemsExtra.length > 0 ? \"2\" : null;\r\n\r\n angular.forEach(self.mechanic.stores, function (s) {\r\n self.storeCodes += s.storeCode + \",\";\r\n });\r\n });\r\n }\r\n\r\n //buttons Collapsed Sections\r\n $scope.isNavCollapsed = true;\r\n $scope.isCollapsed = false;\r\n $scope.isCollapsedHorizontal = false;\r\n\r\n $scope.isTitleMechanicsCollapsed = false;\r\n $scope.isApportionmentCollapsed = false;\r\n $scope.isSelectionCollapsed = false;\r\n $scope.isExtraSelectionCollapsed = false;\r\n $scope.isControlCollapsed = false;\r\n $scope.isRestrictionsCollapsed = false;\r\n $scope.isOtherDataCollapsed = false;\r\n $scope.isNegotiationCollapsed = false;\r\n $scope.isExtrasCoverageCollapsed = false;\r\n\r\n\r\n //actualiza los items de la mecanica segun la lista visible\r\n function updateItemList() {\r\n var itemList = [];\r\n if (self.search != \"\" || self.searchwithCheckbox) {\r\n itemList = self.mechanicItemsFiltered;\r\n }\r\n else {\r\n itemList = self.mechanic.items;\r\n }\r\n angular.forEach(self.itemList, function (item) {\r\n angular.forEach(itemList, function (mecIt) {\r\n if (item.itemId == mecIt.itemId && item.umvId == mecIt.umvId)\r\n mecIt = item;\r\n });\r\n });\r\n self.itemList = itemList.slice(0, self.itemCounter);\r\n self.totalItemCounter = itemList.length;\r\n self.isOnlyOneItemInList();\r\n }\r\n\r\n //calcula el solapamiento\r\n self.calculateOverlap = function () {\r\n self.isCalculatingOverlap = true;\r\n var dto = {\r\n items: self.mechanic.items,\r\n categories: self.mechanic.categories,\r\n excludedItemCodes: self.mechanic.excludedItemCodes,\r\n position: $stateParams.position,\r\n promotionMediaPageId: $stateParams.promotionMediaPageId,\r\n promotionId: $stateParams.promotionId\r\n };\r\n\r\n promotionsService.mechanics.getMechanicOverlaps(dto)\r\n .then(function (overlaps) {\r\n self.overlaps = overlaps;\r\n self.distinctPromotionsOveralps = []; \r\n _.forOwn(_.groupBy(self.overlaps, \"promotionId\"), function (value, key) {\r\n self.distinctPromotionsOveralps.push(key);\r\n });\r\n self.isCalculatingOverlap = false;\r\n if (self.overlaps.length < 1) {\r\n swal({\r\n title: \"No se encontraron Solapamientos.\",\r\n icon: \"info\"\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.filterItemList = function () {\r\n\r\n self.mechanicItemsFiltered = [];\r\n\r\n if (self.search != \"\" || self.searchwithCheckbox) {\r\n angular.forEach(self.mechanic.items, function (i) {\r\n if (((i.itemCode && i.itemCode.toLowerCase().indexOf(self.search.toLowerCase()) > -1)\r\n || (i.itemEan && i.itemEan.toLowerCase().indexOf(self.search.toLowerCase()) > -1)\r\n || (i.sapDescription && i.sapDescription.toLowerCase().indexOf(self.search.toLowerCase()) > -1))\r\n && (i.isItemInPhoto && self.searchwithCheckbox || !self.searchwithCheckbox)){ \r\n\r\n self.mechanicItemsFiltered.push(i);\r\n }\r\n });\r\n }\r\n else {\r\n self.mechanicItemsFiltered = self.mechanic.items;\r\n }\r\n\r\n self.itemList = self.mechanicItemsFiltered.slice(0, self.itemCounter);\r\n self.totalItemCounter = self.mechanicItemsFiltered.length;\r\n }\r\n\r\n function init() {\r\n self.isNew = $stateParams.promotionMechanicId == 0 ? true : false;\r\n self.mechanics = promotionsService.promotionMechanicTypes;\r\n self.announcementTypes = promotionsService.promotionMechanicAnnouncementTypes;\r\n self.paymentTypes = promotionsService.promotionMechanicPaymentTypes;\r\n\r\n promotionsService.tasks.getTaskName($stateParams.taskId)\r\n .then(function (taskName) {\r\n switch (taskName) {\r\n case \"2° Revisión Comercial\": self.isReview = true;\r\n break;\r\n case \"1° Input para armado de Pieza\": self.isPrintLayoutCompare = true;\r\n break;\r\n case \"2° Input para armado de Pieza\": self.isPrintLayoutCompare = true;\r\n break;\r\n case \"3° Input para armado de Pieza\": self.isPrintLayoutCompare = true;\r\n break;\r\n case \"1° Subida de Pieza para revisión\": self.isLayoutImageUpload = true;\r\n break;\r\n case \"2° Subida de Pieza para revisión\": self.isLayoutImageUpload = true;\r\n break;\r\n case \"3° Subida de Pieza para revisión\": self.isLayoutImageUpload = true;\r\n break;\r\n case \"Validación final\": self.isFinalValidation = true;\r\n break;\r\n }\r\n\r\n });\r\n\r\n self.isEditPanguiCode = $stateParams.isEditPanguiCode == 'true' ? true : false;\r\n\r\n if ($stateParams.promotionMechanicId != 0) {\r\n getMechanicInfo($stateParams.promotionId, $stateParams.promotionMechanicId);\r\n }\r\n\r\n promotionsService.mechanics.getMechanicVendors()\r\n .then(function (vendors) {\r\n self.vendors = vendors;\r\n vendors.forEach(function (v) { if (v.id == self.mechanic.vendorId) self.selectedVendor = v; });\r\n });\r\n\r\n //Cargo los datos de la página con sus categorias asociadas\r\n if ($stateParams.promotionMediaPageId != 0) {\r\n promotionsService.promotions.getPromotionMediaPage($stateParams.promotionMediaPageId)\r\n .then(function (promotionMediaPage) {\r\n self.promotionMediaPage = promotionMediaPage;\r\n\r\n self.categoryIds.push(promotionMediaPage.mainCategoryId);\r\n for (var i = 0; i < promotionMediaPage.secondaryCategoriesIds.length; i++) {\r\n self.categoryIds.push(promotionMediaPage.secondaryCategoriesIds[i]);\r\n }\r\n });\r\n }\r\n\r\n promotionsService.mechanics.getMechanicCategories()\r\n .then(function (categories) {\r\n self.categoriesInLookup = categories;\r\n });\r\n\r\n promotionsService.mechanics.getPromotionInfo($stateParams.promotionId)\r\n .then(function (info) {\r\n self.promotionInfo = info;\r\n });\r\n if ($stateParams.promotionMechanicId == 0) {\r\n promotionsService.mechanics.getPromotionStores($stateParams.promotionId)\r\n .then(function (stores) {\r\n self.stores = stores;\r\n self.mechanic.stores = stores;\r\n angular.forEach(stores, function (s) {\r\n s.toList = true;\r\n self.storeCodes += s.storeCode + \",\";\r\n });\r\n self.setChargeRate();\r\n });\r\n }\r\n\r\n promotionsService.promotions.getPromotionData($stateParams.promotionId, $stateParams.promotionMediaPageId, $stateParams.position)\r\n .then(function (promotionInfo) {\r\n self.promoDetails = promotionInfo;\r\n });\r\n\r\n }\r\n\r\n\r\n //TODO: Utilizar directiva, por algun motivo no le pega al controller\r\n $scope.$watch('ct.inputVisibility', function (newVal, oldVal) {\r\n if (newVal == 1) {\r\n $('.view-all').hide();\r\n $('.view-fill').show();\r\n } else {\r\n $('.view-all').show();\r\n }\r\n }, true);\r\n\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"layoutsAssignmentCtrl\", function ($scope, $rootScope, $timeout, $state, $stateParams, promotionsService, homeService, authService, adminService, serverService, Upload, ngDialog) {\r\n var self = this;\r\n\r\n self.isLayoutEditable = false;\r\n self.selectedPage = null;\r\n self.canEditPages = authService.hasPermission('promotion_edit_layout_pages');\r\n\r\n self.promotionMediaPageTypes = promotionsService.promotionMediaPageTypes;\r\n\r\n self.promotion = {\r\n id: 0,\r\n name: '',\r\n pages: []\r\n };\r\n\r\n self.categoriesCaptains = [];\r\n self.categoriesSecondaries = [];\r\n\r\n self.layouts = [];\r\n\r\n self.layout = {\r\n id: 0,\r\n companyId: 0,\r\n name: '',\r\n description: '',\r\n rows: 0,\r\n columns: 0,\r\n backgroundImageUrl: '',\r\n details: []\r\n };\r\n\r\n self.layoutPreviewGrid = [];\r\n\r\n self.isValidating = false;\r\n self.isValidated = false;\r\n\r\n var categories = [];\r\n\r\n self.selectedPages = [];\r\n\r\n self.dataForSelectedPages = {\r\n mainCategoryId: 0,\r\n secondaryCategoriesIds: [],\r\n promotionMediaPageLayoutId: null\r\n };\r\n\r\n self.categoriesGroupEditMode = false;\r\n\r\n\r\n function addToSelectedPages(page) {\r\n if (self.selectedPage)\r\n self.selectedPages.push(self.selectedPage);\r\n if (self.selectedPages.includes(page)) {\r\n var index = self.selectedPages.indexOf(page);\r\n self.selectedPages.splice(index, 1);\r\n }\r\n else\r\n self.selectedPages.push(page);\r\n self.selectedPage = null;\r\n }\r\n\r\n self.isSelected = function (page) {\r\n return (self.selectedPage && page.pageNumber == self.selectedPage.pageNumber)\r\n || self.selectedPages.includes(page);\r\n }\r\n\r\n self.selectPage = function (e, page) {\r\n if (e.ctrlKey)\r\n addToSelectedPages(page);\r\n else {\r\n self.selectedPages = [];\r\n if (self.selectedPage == null || self.selectedPage.pageNumber != page.pageNumber) {\r\n\r\n self.selectedPage = page;\r\n\r\n angular.forEach(self.selectedPage.secondaryCategories, function (cat) {\r\n self.selectedPage.secondaryCategoriesIds.push(cat.categoryId);\r\n });\r\n\r\n self.captainCategoryChanged();\r\n self.secondaryCategoryChanged();\r\n\r\n if (self.selectedPage.promotionMediaPageLayoutId != 0) {\r\n if (self.layout == null || self.layout.id != self.selectedPage.promotionMediaPageLayoutId) {\r\n self.showPreview(self.selectedPage.promotionMediaPageLayoutId);\r\n }\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n self.captainCategoryChanged = function () {\r\n var mainCategoryId = 0;\r\n\r\n if (self.selectedPage)\r\n mainCategoryId = self.selectedPage.mainCategoryId;\r\n else if (self.selectedPages.length > 0)\r\n mainCategoryId = self.dataForSelectedPages.mainCategoryId;\r\n\r\n if (!mainCategoryId) return;\r\n\r\n self.categoriesSecondaries = [];\r\n\r\n angular.forEach(categories, function (category) {\r\n\r\n if (category.categoryId != mainCategoryId)\r\n self.categoriesSecondaries.push(category);\r\n });\r\n }\r\n\r\n self.secondaryCategoryChanged = function () {\r\n var secondaryCategoriesIds = null;\r\n\r\n if (self.selectedPage)\r\n secondaryCategoriesIds = self.selectedPage.secondaryCategoriesIds;\r\n else if (self.selectedPages.length > 0)\r\n secondaryCategoriesIds = self.dataForSelectedPages.secondaryCategoriesIds;\r\n\r\n if (!secondaryCategoriesIds) return;\r\n\r\n self.categoriesCaptains = [];\r\n angular.forEach(categories, function (category) {\r\n var exist = false;\r\n angular.forEach(secondaryCategoriesIds, function (secondaryCategoryId) {\r\n if (secondaryCategoryId == category.categoryId)\r\n exist = true;\r\n\r\n });\r\n if (!exist)\r\n self.categoriesCaptains.push(category);\r\n });\r\n }\r\n\r\n self.showPreview = function (layoutId) {\r\n\r\n for (i = 0; i < self.layouts.length; i++) {\r\n if (self.layouts[i].id == layoutId) {\r\n self.layout = self.layouts[i];\r\n\r\n $rootScope.$broadcast('refreshLayoutTable', {});\r\n break;\r\n }\r\n }\r\n }\r\n\r\n self.getPageNumberAndType = function () {\r\n var rv = '';\r\n if (self.selectedPage)\r\n rv = 'Pagina ' + self.selectedPage.pageNumber + ' - ' + self.promotionMediaPageTypes[self.selectedPage.promotionMediaPageType - 1].label;\r\n else {\r\n rv = 'Paginas ';\r\n var labels = self.selectedPages.map(function (p) {\r\n return p.pageNumber + ' - ' + self.promotionMediaPageTypes[p.promotionMediaPageType - 1].label;\r\n });\r\n rv += labels.join(', ');\r\n }\r\n return rv;\r\n }\r\n\r\n self.validate = function () {\r\n var result = true;\r\n\r\n /*\r\n if (!$scope.layoutForm.layoutName.$valid || !$scope.layoutForm.layoutRows.$valid || !$scope.layoutForm.layoutColumns.$valid) {\r\n result = false;\r\n self.isValidated = false;\r\n }\r\n */\r\n return result;\r\n }\r\n\r\n self.save = function () {\r\n\r\n self.isValidating = true;\r\n var text = \"\";\r\n //self.layout.details = [];\r\n\r\n if (self.promotion != null && self.validate()) {\r\n if ($stateParams.promotionId != '0' && self.isLayoutmodified()) {\r\n text = 'Se perdera todo lo cargado en la página al modificarla.'\r\n }\r\n swal({\r\n title: 'Esta seguro que desea guardar las asignaciones y comentarios?',\r\n text: text,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n promotionsService.promotions.savePromotionMediaPages(self.promotion)\r\n .then(function (promotion) {\r\n swal('Asignaciones Guardadas!', 'Las páginas de la promoción ' + self.promotion.name + ' se han guardado exitosamente', 'success');\r\n\r\n self.promotion = promotion;\r\n createPages();\r\n self.updateChangeDetector();\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al guardar\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n }\r\n\r\n\r\n self.validateCategories = function () {\r\n for (var i = 0; i < self.promotion.pages.length; i++) {\r\n if (self.promotion.pages[i].mainCategoryId == 0)\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n self.publish = function () {\r\n var text = 'Al hacerlo cerrará la tarea \"asignar layout\"';\r\n\r\n if (!self.validateCategories())\r\n swal(\"Error\", \"Asigne una categoria capitana por pagina\", \"error\");\r\n else {\r\n if ($stateParams.promotionId != '0' && self.isLayoutmodified()) {\r\n text = 'Se perdera todo lo cargado en la página al modificarla, al hacerlo cerrará la tarea \"asignar layout\"';\r\n }\r\n swal({\r\n title: 'Está seguro que desea publicar?',\r\n text: text,\r\n type: 'warning',\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n if (self.canPublish()) {\r\n //guardo antes de publicar\r\n promotionsService.promotions.savePromotionMediaPages(self.promotion)\r\n .then(function (promotion) {\r\n self.promotion = promotion;\r\n createPages();\r\n self.updateChangeDetector();\r\n //una vez guardado publico la tarea\r\n promotionsService.tasks.publishTask($stateParams.taskId)\r\n .then(function (task) {\r\n swal('Tarea Publicada!', 'La tarea se ha publicado exitosamente', 'success');\r\n\r\n $state.go('promotions.myTasks');\r\n });\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al guardar\", \"error\");\r\n }\r\n });\r\n\r\n } else {\r\n $timeout(function () {\r\n swal(\"Error\", \"Debe asignar un layout a todas las páginas\", \"error\");\r\n }, 100);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n self.canPublish = function () {\r\n if ($stateParams.taskId && parseInt($stateParams.taskId) > 0) {\r\n for (var i = 0; i < self.promotion.pages.length; i++) {\r\n if (self.promotion.pages[i].promotionMediaPageLayoutId == 0 || self.promotion.pages[i].promotionMediaPageLayoutId == null)\r\n return false;\r\n }\r\n return true;\r\n } else return false;\r\n }\r\n\r\n self.addPage = function () {\r\n swal({\r\n title: \"Agregar paginas\",\r\n text: 'Indique la cantidad de paginas que desea agregar. Recuerde guardar los cambios previamente.',\r\n type: 'input',\r\n showCancelButton: true,\r\n closeOnConfirm: false,\r\n animation: \"slide-from-top\"\r\n }, function (numberOfPages) {\r\n if (numberOfPages > 0) {\r\n var shouldCompleteAllPages = false;\r\n angular.forEach(self.promotion.pages, function (page) {\r\n if (page.promotionMediaPageLayoutId == null)\r\n shouldCompleteAllPages = true;\r\n });\r\n\r\n if (shouldCompleteAllPages) {\r\n swal(\"Error\", \"Debe Agregar y Guardar un layout para cada pagina.\", \"error\");\r\n }\r\n else {\r\n promotionsService.layouts.addPage(numberOfPages, self.promotion.id)\r\n .then(function () {\r\n loadPromotion();\r\n swal('Paginas Agregadas!', 'Se han agregado las nuevas paginas exitosamente', 'success');\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al guardar\", \"error\");\r\n }\r\n });\r\n }\r\n }\r\n else {\r\n swal(\"Error\", \"Debe ser un numero positivo\", \"error\");\r\n }\r\n });\r\n }\r\n\r\n self.deletePage = function (mediaPageId) {\r\n swal({\r\n title: 'Esta seguro que desea eliminar esta pagina?',\r\n text: 'Se eliminaran todos los items asociados a ella.',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n promotionsService.layouts.deletePage(mediaPageId, self.promotion.id)\r\n .then(function () {\r\n loadPromotion();\r\n swal('Pagina Eliminada!', '', 'success');\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al eliminar la pagina\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.deleteCategoryGroup = function (groupId, index) {\r\n swal({\r\n title: 'Esta seguro que desea eliminar este grupo de categoria?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n promotionsService.layouts.deleteCategoriesGroup(groupId)\r\n .then(function () {\r\n swal('Grupo de categoria eliminado!', '', 'success');\r\n self.categoriesGroups.splice(index, 1);\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de borrado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al eliminar el grupo de categoria\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.openChat = function (pageId) {\r\n //busca la pagina y abre el dialog\r\n angular.forEach(self.promotion.pages, function (p, index) {\r\n if (p.id === pageId) {\r\n\r\n self.indexOfPageOnChat = index;\r\n }\r\n\r\n });\r\n\r\n\r\n ngDialog.open({ \r\n template: 'chatDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: $scope\r\n });\r\n }\r\n\r\n //Funcion que valida si hubo algun cambio en el layout por cada pagina de la promocion.\r\n self.isLayoutmodified = function () {\r\n var rv = false;\r\n for (var i = 0; i < self.promotion.pages.length; i++)\r\n {\r\n if (self.promotion.pages[i].promotionMediaPageLayoutId != self.promotion.pages[i].initPromotionMediaPageLayoutId) {\r\n rv = true;\r\n }\r\n }\r\n return rv;\r\n }\r\n\r\n //Actualiza el campo que detecta si hubo un cambio en el promotionMediaPageLayoutId.\r\n //Campo a actualizar: initPromotionMediaPageLayoutId.\r\n self.updateChangeDetector = function () {\r\n for (var i = 0; i < self.promotion.pages.length; i++)\r\n {\r\n self.promotion.pages[i].initPromotionMediaPageLayoutId = self.promotion.pages[i].promotionMediaPageLayoutId;\r\n }\r\n //Actualiza la pagina seleccionada.\r\n if (self.selectedPage != null) {\r\n self.selectedPage = self.promotion.pages.find(function (x) {\r\n return x.id == self.selectedPage.id;\r\n })\r\n }\r\n }\r\n\r\n\r\n function createPages() {\r\n for (var i = 0; i < self.promotion.numberOfPages; i++) {\r\n var exist = false;\r\n angular.forEach(self.promotion.pages, function (page) {\r\n if (page.pageNumber == i + 1)\r\n exist = true;\r\n\r\n });\r\n if (!exist) {\r\n var page = {\r\n promotionId: self.promotion.id,\r\n promotionMediaPageLayoutId: 0,\r\n pageNumber: i + 1,\r\n promotionMediaPageType: i == 0 ? 1 : (i + 1 == self.promotion.numberOfPages ? 2 : 3),\r\n mainCategoryId: 0,\r\n secondaryCategoriesIds: []\r\n };\r\n\r\n self.promotion.pages.splice(i, 0, page);\r\n }\r\n }\r\n }\r\n\r\n function loadPromotion() {\r\n if ($stateParams.promotionId != '0') {\r\n\r\n promotionsService.promotions.getPromotionPages($stateParams.promotionId)\r\n .then(function (promotion) {\r\n if (promotion != null) {\r\n self.promotion = promotion;\r\n createPages();\r\n self.updateChangeDetector();\r\n }\r\n });\r\n }\r\n }\r\n\r\n self.openCategoriesGroupDialog = function (selectionMode) {\r\n\r\n if (selectionMode == undefined || selectionMode == null)\r\n selectionMode = false;\r\n\r\n var newScope = $scope.$new();\r\n self.newGroup = {\r\n name: \"\",\r\n categories: []\r\n };\r\n\r\n newScope.isSelection = selectionMode;\r\n self.categoriesGroupEditMode = false;\r\n newScope.isLoading = true;\r\n\r\n function getCategoriesGroups() {\r\n promotionsService.layouts.getCategoriesGroups()\r\n .then(function (response) {\r\n self.categoriesGroups = response;\r\n newScope.isLoading = false;\r\n });\r\n }\r\n\r\n getCategoriesGroups();\r\n\r\n newScope.toggleMode = function () {\r\n self.categoriesGroupEditMode = !self.categoriesGroupEditMode;\r\n self.newGroup = {\r\n name: \"\",\r\n categories: []\r\n };\r\n }\r\n\r\n newScope.addNewCategoriesGroup = function () {\r\n if (self.newGroup.categories.some(function (c) { return c.isMain; })) {\r\n newScope.isLoading = true;\r\n promotionsService.layouts.saveCategoriesGroup(self.newGroup)\r\n .then(function (newGroup) {\r\n getCategoriesGroups();\r\n newScope.toggleMode();\r\n });\r\n }\r\n else swal('Alguna Categoria debe ser capitana', 'Click en una estrella para definir', 'warning');\r\n }\r\n\r\n self.onCategoriesOfGroupChanged = function () {\r\n\r\n angular.forEach(self.newGroup.categories, function (cat, index) {\r\n if (cat.level === 3) {\r\n var childs = self.allCategories.filter(function (x) {\r\n return x.parentId === cat.id && !self.newGroup.categories.find(function (y) {\r\n return y.id === x.id;\r\n });\r\n });\r\n self.newGroup.categories.splice(index, 1);\r\n childs.forEach(function (x) {\r\n self.newGroup.categories.push(x);\r\n });\r\n }\r\n\r\n });\r\n }\r\n\r\n newScope.assignCategoriesGroup = function (group) {\r\n var mainCat = group.categories.find(function (x) { return x.id === group.mainCategoryId; });\r\n group.categories.splice(group.categories.indexOf(mainCat), 1);//el resto son secundarias\r\n if (mainCat) {\r\n if (self.selectedPage) {\r\n self.selectedPage.mainCategoryId = mainCat.id;\r\n self.selectedPage.secondaryCategoriesIds = group.categories.map(function (x) { return x.id; });\r\n }\r\n else if (self.selectedPages && self.selectedPages.length > 0) {\r\n self.dataForSelectedPages.mainCategoryId = mainCat.id;\r\n self.dataForSelectedPages.secondaryCategoriesIds = group.categories.map(function (x) { return x.id; });\r\n }\r\n newScope.closeDialog();\r\n }\r\n }\r\n\r\n newScope.editCategoriesGroup = function (group) {\r\n newScope.toggleMode();\r\n self.newGroup.name = group.name;\r\n self.newGroup.id = group.id;\r\n self.newGroup.mainCategoryId = group.mainCategoryId;\r\n angular.forEach(self.allCategories, function (cat) {\r\n angular.forEach(group.categories, function (catOfGroup) {\r\n if (cat.id === self.newGroup.mainCategoryId)\r\n cat.isMain = true;\r\n if (catOfGroup.id === cat.id)\r\n self.newGroup.categories.push(cat);\r\n });\r\n });\r\n }\r\n\r\n newScope.setCategoryCaptainInGroup = function (category) {\r\n angular.forEach(self.newGroup.categories, function (c) {\r\n if (c.id === category.id) {\r\n c.isMain = !c.isMain;\r\n self.newGroup.mainCategoryId = c.id;\r\n }\r\n else\r\n c.isMain = false;\r\n });\r\n }\r\n\r\n\r\n newScope.closeDialog = function () {\r\n ngDialog.close();\r\n }\r\n\r\n ngDialog.open({\r\n template: 'categoriesGroupDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n }\r\n\r\n self.openPromotionsExplorer = function () {\r\n\r\n var newScope = $scope.$new();\r\n\r\n self.promotionId = null;\r\n self.promotionPageNumber = null;\r\n newScope.isLoading = false;\r\n\r\n newScope.getOtherPromotionData = function () {\r\n newScope.isLoading = true;\r\n promotionsService.promotions.getPromotionPageData(self.promotionId, self.promotionPageNumber)\r\n .then(function (pageData) {\r\n if (self.selectedPage) {\r\n self.selectedPage.promotionMediaPageLayoutId = pageData.promotionMediaPageLayoutId;\r\n self.selectedPage.mainCategoryId = pageData.mainCategoryId;\r\n self.selectedPage.secondaryCategoriesIds = pageData.secondaryCategoriesIds;\r\n }\r\n else {//multiples paginas\r\n self.dataForSelectedPages.promotionMediaPageLayoutId = pageData.promotionMediaPageLayoutId;\r\n self.dataForSelectedPages.mainCategoryId = pageData.mainCategoryId;\r\n self.dataForSelectedPages.secondaryCategoriesIds = pageData.secondaryCategoriesIds;\r\n }\r\n \r\n newScope.isLoading = false;\r\n ngDialog.close();\r\n });\r\n }\r\n\r\n newScope.closeDialog = function () {\r\n ngDialog.close();\r\n }\r\n\r\n ngDialog.open({\r\n template: 'promotionsExplorerDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n }\r\n\r\n self.applyForSelectedPages = function () {\r\n var page;\r\n angular.forEach(self.promotion.pages, function (p) {\r\n if (self.selectedPages.find(function (x) { return x.id === p.id; })) {\r\n p.promotionMediaPageLayoutId = self.dataForSelectedPages.promotionMediaPageLayoutId;\r\n p.mainCategoryId = self.dataForSelectedPages.mainCategoryId;\r\n p.secondaryCategoriesIds = self.dataForSelectedPages.secondaryCategoriesIds;\r\n }\r\n });\r\n self.selectedPages = [];\r\n\r\n }\r\n\r\n function init() {\r\n\r\n\r\n homeService.categories.getLayoutCategories()\r\n .then(function (response) {\r\n angular.forEach(response, function (category) {\r\n categories.push({\r\n categoryId: category.id,\r\n displayName: category.name\r\n });\r\n\r\n });\r\n\r\n self.categoriesCaptains = categories;\r\n self.categoriesSecondaries = categories;\r\n\r\n promotionsService.layouts.getLayouts(false)\r\n .then(function (layouts) {\r\n self.layouts = layouts;\r\n\r\n loadPromotion();\r\n });\r\n });\r\n\r\n adminService.categories.getCategoriesWithLevels([3, 4])\r\n .then(function (response) {\r\n self.allCategories = response;\r\n angular.forEach(self.allCategories, function (x) {\r\n x.displayName = x.level == 4 ? 'CAT | ' + x.name : x.name;\r\n });\r\n });\r\n\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"layoutsCtrl\", function ($scope, promotionsService) {\r\n var self = this;\r\n\r\n self.layouts = [];\r\n\r\n self.isLoading = true;\r\n\r\n self.delete = function (layoutId, layoutName) {\r\n\r\n swal({\r\n title: 'Esta seguro que desea borrar el layout ' + layoutName + ' ?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n \r\n promotionsService.layouts.deleteLayout(layoutId)\r\n .then(function (isOk) {\r\n swal('Layout Borrado!', 'El layout ' + layoutName + ' se ha borrado exitosamente', 'success');\r\n loadData();\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de borrado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al borrar este layout\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n function loadData() {\r\n promotionsService.layouts.getLayouts(false, true)\r\n .then(function (layouts) {\r\n self.layouts = layouts;\r\n\r\n self.isLoading = false;\r\n });\r\n }\r\n\r\n function init() {\r\n loadData();\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"EditPromotionLayoutCtrl\", function ($scope, $rootScope, $state, $timeout, $stateParams, promotionsService, homeService, authService, serverService, Upload) {\r\n var self = this;\r\n\r\n self.layoutPreviewGrid = [];\r\n self.isLayoutEditable = true;\r\n\r\n self.isLoading = true;\r\n\r\n self.isValidating = false;\r\n self.isValidated = false;\r\n self.isRecreated = false;\r\n\r\n self.showImage = 'prisma-test.jpg';\r\n\r\n self.files = [];\r\n self.filesUploaded = false;\r\n self.isBusy = false;\r\n self.error = false;\r\n\r\n self.blockedForSave = function () {\r\n return !self.isRecreated;\r\n }\r\n\r\n self.recreateTable = function () {\r\n if (self.layout.rows > 0 && self.layout.columns > 0) {\r\n swal({\r\n title: 'Está seguro que desea actualizar el Layout?',\r\n text: 'Al hacerlo perderá el Layout diseñado con anterioridad',\r\n type: 'warning',\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true, //Si no tiene esta property en true y el timeout antes del swal, no se actualiza la variable self.isRecreated\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n self.isRecreated = true;\r\n self.blockedForSave();\r\n $rootScope.$broadcast('recreateLayoutTable', {});\r\n\r\n $timeout(function () { \r\n swal('Vista Preliminar Actualizada!', 'Se ha actualizado la vista preliminar exitosamente', 'success');\r\n }, 100);\r\n }\r\n });\r\n }\r\n else {\r\n swal(\"Error!\", \"El Layout debe tener al menos 1 fila y 1 columna!\", \"error\");\r\n }\r\n }\r\n\r\n if ($stateParams.layoutId != '0') {\r\n promotionsService.layouts.getLayout($stateParams.layoutId)\r\n .then(function (layout) {\r\n\r\n self.layout = layout;\r\n\r\n self.isLoading = false;\r\n\r\n $rootScope.$broadcast('refreshLayoutTable', {});\r\n });\r\n }\r\n else {\r\n self.isLoading = false;\r\n self.layout = {\r\n id: 0,\r\n companyId: 0,\r\n name: '',\r\n description: '',\r\n rows: 0,\r\n columns: 0,\r\n backgroundImageUrl: '',\r\n details: []\r\n };\r\n self.isLoading = false;\r\n }\r\n\r\n $scope.$watch('ct.layout.rows', function (newVal, oldVal) {\r\n if (newVal != oldVal)\r\n self.isRecreated = false;\r\n }, true);\r\n\r\n $scope.$watch('ct.layout.columns', function (newVal, oldVal) {\r\n if (newVal != oldVal)\r\n self.isRecreated = false;\r\n }, true);\r\n\r\n self.uploadFiles = function () {\r\n var files = self.files;\r\n if (files && files.length) {\r\n self.isBusy = true;\r\n\r\n //var url = ian.urlCombine(serverService.getApiUrl(), '/promotion/layouts/uploadFile', authService.authentication.companyId); \r\n /*\r\n Upload.upload({\r\n url: url,\r\n data: { files: files }\r\n })\r\n */\r\n /*\r\n promotionsService.layouts.uploadFile(files[0], authService.authentication.companyId)\r\n .then(function (response) {\r\n console.log('hecho');\r\n //uploadResults(response.data);\r\n //if (!anyError(response.data))\r\n // self.filesUploaded = true;\r\n }, function (status) {\r\n console.log(status);\r\n });\r\n */\r\n }\r\n }\r\n\r\n self.loadResults = function (results) {\r\n //self.gridOptions.api.setRowData(results);\r\n //self.gridOptions.api.refreshView();\r\n\r\n //self.gridVisible = results.length > 0 ? true : false;\r\n }\r\n\r\n self.uploadResults = function (results) {\r\n /*\r\n self.isBusy = false;\r\n\r\n if (results.length > 0) {\r\n loadResults(results);\r\n }\r\n if (anyError(results)) {\r\n self.error = true;\r\n }\r\n else\r\n self.error = false;\r\n\r\n */\r\n }\r\n\r\n self.anyError = function (results) {\r\n var error = false;\r\n for (var i = 0; i < results.length; i++) {\r\n if (results[i].severity === 3)\r\n error = true;\r\n }\r\n\r\n return error;\r\n }\r\n\r\n self.validate = function () {\r\n var result = true;\r\n\r\n if (!$scope.layoutForm.layoutName.$valid || !$scope.layoutForm.layoutRows.$valid || !$scope.layoutForm.layoutColumns.$valid) {\r\n result = false;\r\n self.isValidated = false;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n self.save = function () {\r\n self.isValidating = true;\r\n var position = 0;\r\n\r\n self.layout.details = [];\r\n\r\n for (i = 0; i < self.layoutPreviewGrid.length; i++) {\r\n if (self.layoutPreviewGrid[i].position != null)\r\n position++;\r\n\r\n var detail = {\r\n id: 0,\r\n promotionMediaPageLayoutId: self.layout.id,\r\n rowspan: self.layoutPreviewGrid[i].rowspan,\r\n colspan: self.layoutPreviewGrid[i].colspan,\r\n rowNumber: self.layoutPreviewGrid[i].rowNumber,\r\n columnNumber: self.layoutPreviewGrid[i].colNumber,\r\n position: self.layoutPreviewGrid[i].position == null ? null : position,\r\n isHighlighted: self.layoutPreviewGrid[i].isHighlighted,\r\n imageUrl: self.layoutPreviewGrid[i].imageUrl\r\n };\r\n self.layout.details.push(detail);\r\n }\r\n self.layout.backgroundImageUrl = self.files.length > 0 ? self.files[0].name : '';\r\n\r\n if (self.layout != null && self.validate()) {\r\n swal({\r\n title: 'Esta seguro que desea guardar el layout?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n promotionsService.layouts.saveLayout(self.layout)\r\n .then(function (layout) {\r\n swal('Layout Guardado!', 'El layout ' + self.layout.name + ' se ha guardado exitosamente', 'success');\r\n\r\n self.layout = layout;\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al guardar este layout\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n }\r\n\r\n function init() {\r\n\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"forecastImporterCtrl\", function ($scope, $state, $stateParams, $filter, $window, $timeout, promotionsService, serverService, authService, Upload) {\r\n var self = this;\r\n\r\n self.isLoading = true;\r\n self.forecastItems = [];\r\n self.currentStep = 1;\r\n self.canPublish = true;\r\n self.canPublishForecastManual = authService.hasPermission('promotion_publish_ForecastManual');\r\n\r\n self.gridOptions = {\r\n columnDefs: [\r\n {\r\n headerName: 'Severidad',\r\n width: 100,\r\n pinned: 'left',\r\n field: 'severity',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n rowGroupIndex: 0,\r\n cellRenderer: function (params) {\r\n var severityName = '';\r\n switch (params.value) {\r\n case 1: { severityName = ' Info'; break; }\r\n case 2: { severityName = ' Warn'; break; }\r\n case 3:\r\n {\r\n if (params.node.data != null && params.node.data.errorType == 6 && !self.showCategorySwal) {\r\n self.addCategoryConfirm();\r\n self.showCategorySwal = true;\r\n }\r\n severityName = ' Error'; break;\r\n }\r\n }\r\n return severityName;\r\n }\r\n },\r\n {\r\n headerName: 'Tipo',\r\n width: 100,\r\n pinned: 'left',\r\n field: 'errorType',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n cellRenderer: function (params) {\r\n var errorName = '';\r\n switch (params.value) {\r\n case 1: { errorName = \"Campo Nulo\"; break; }\r\n case 2: { errorName = \"Sin Dato en BD\"; break; }\r\n case 3: { errorName = \"Formato Incorrecto\"; break; }\r\n case 4: { errorName = \"Sin Archivo\"; break; }\r\n case 5: { errorName = \"Error UpSert\"; break; }\r\n case 6: { errorName = \"Inconsistencia\"; break; }\r\n case 7: { errorName = \"Calidad\"; break; }\r\n case 8: { errorName = \"Subida de Archivos\"; break; }\r\n }\r\n\r\n return errorName;\r\n }\r\n },\r\n {\r\n headerName: 'Fila',\r\n width: 50,\r\n pinned: 'left',\r\n field: 'row',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n {\r\n headerName: 'Categoria',\r\n width: 300,\r\n rowGroupIndex: 1,\r\n pinned: 'left',\r\n field: 'category',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n {\r\n headerName: 'Descripcion',\r\n width: 500,\r\n pinned: 'left',\r\n field: 'description',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n ],\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n rowHeight: 35,\r\n suppressCellSelection: true,\r\n groupUseEntireRow: true,\r\n groupSuppressAutoColumn: false,\r\n groupDefaultExpanded: 0,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n angularCompileRows: true,\r\n }\r\n \r\n self.showNextStep = function () {\r\n if (self.currentStep > 0 && self.currentStep < 4) {\r\n self.currentStep++;\r\n loadResults([]);\r\n }\r\n }\r\n\r\n self.downloadExcel = function () {\r\n var html = '';\r\n\r\n angular.forEach($filter('orderBy')(self.forecastItems, ['pageNumber', 'itemId'], false), function (item) {\r\n\r\n html += '';\r\n\r\n });\r\n\r\n html += '
ID PromocionNombre PromocionPaginaPosicionPromotionItemIdCodigo SAPDescripcion SAPTipoUMVForecast
' + item.promotionId + '' + item.promotionName + '' + item.pageNumber + '' + item.itemPosition + '' + item.promotionItemId + '' + (item.itemCode != null ? item.itemCode.replace(/^0+/, '') : '') + '' + (item.itemName != null ? item.itemName : '') + '' + (item.promotionItemType) + '' + (item.salesUnitOfMeasure != null ? item.salesUnitOfMeasure : '') + '' + item.forecast + '
';\r\n\r\n var exportHref = ian.ExportToExcel(html, 'Forecasts');\r\n $timeout(function () {\r\n location.href = exportHref;\r\n self.showNextStep();\r\n }, 100); // trigger download\r\n }\r\n\r\n self.uploadFile = function (files) {\r\n if (files && files.length > 0) {\r\n self.isBusy = true;\r\n var url = ian.urlCombine(serverService.getApiUrl(), '/promotion/items/uploadForecast', $stateParams.promotionId);\r\n Upload.upload({\r\n url: url,\r\n data: { file: files[0] }\r\n }).then(function (response) {\r\n var importerResults = response.data;\r\n processImporterResults(importerResults);\r\n if (!anyError(importerResults)) {\r\n self.finishedUpload = true;\r\n }\r\n });\r\n }\r\n }\r\n\r\n self.validateUploadedFile = function () {\r\n promotionsService.items.validateForecasts($stateParams.promotionId)\r\n .then(function (results) {\r\n processImporterResults(results);\r\n if (!anyError(results)) {\r\n self.finishedValidation = true;\r\n }\r\n });\r\n\r\n }\r\n\r\n self.reUploadFile = function () {\r\n self.currentStep = 2;\r\n loadResults([]);\r\n self.files = null;\r\n self.finishedUpload = false;\r\n self.finishedValidation = false;\r\n self.finishedUpdate = false;\r\n }\r\n\r\n self.updateForecast = function () {\r\n promotionsService.items.updateForecasts($stateParams.promotionId)\r\n .then(function (results) {\r\n processImporterResults(results);\r\n if (!anyError(results)) {\r\n self.finishedUpdate = true;\r\n }\r\n });\r\n\r\n }\r\n\r\n self.finish = function () {\r\n self.currentStep = 1;\r\n loadResults([]);\r\n\r\n self.finishedUpload = false;\r\n self.finishedValidation = false;\r\n self.finishedUpdate = false;\r\n }\r\n\r\n self.publish = function () {\r\n if ($stateParams.taskId) {\r\n promotionsService.tasks.publishTask($stateParams.taskId)\r\n .then(function (isOk) {\r\n swal('Tarea Publicada!', 'La tarea se ha publicado exitosamente', 'success');\r\n\r\n $state.go('promotions.myTasks');\r\n });\r\n } else {\r\n $timeout(function () {\r\n swal(\"Error\", \"no se pudo publicar la tarea\", \"error\");\r\n }, 100);\r\n }\r\n }\r\n\r\n function processImporterResults(importerResults) {\r\n self.isBusy = false;\r\n self.isBusy2 = false;\r\n self.isBusy3 = false;\r\n self.isBusy4 = false;\r\n\r\n if (importerResults.length > 0) {\r\n loadResults(importerResults);\r\n }\r\n if (anyError(importerResults)) {\r\n self.error = true;\r\n }\r\n else\r\n self.error = false;\r\n }\r\n\r\n function loadResults(results) {\r\n self.gridOptions.api.setRowData(results);\r\n self.gridOptions.api.refreshView();\r\n\r\n self.gridVisible = results.length > 0 ? true : false;\r\n }\r\n\r\n function anyError(importerResults) {\r\n var error = false;\r\n for (var i = 0; i < importerResults.length; i++) {\r\n if (importerResults[i].severity === 3)\r\n error = true;\r\n }\r\n\r\n return error;\r\n }\r\n\r\n\r\n function init() {\r\n if (!$stateParams.promotionId || $stateParams.promotionId == \"0\") {\r\n swal('No se puede cargar la página', 'No se recibió el Id de la Promoción', 'error');\r\n }\r\n else {\r\n promotionsService.items.getItemsForecast($stateParams.promotionId)\r\n .then(function (dto) {\r\n self.forecastItems = dto.items;\r\n self.isLoading = false;\r\n\r\n }, function () { self.isLoading = false; });\r\n\r\n }\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"editItemCtrl\", function ($scope, $rootScope, $state, $timeout, $stateParams, promotionsService, homeService, authService, serverService, Upload, ngDialog) {\r\n var self = this;\r\n\r\n const TAX = 0.18;\r\n\r\n if ($stateParams.position == -2)//interna\r\n self.loadForInternalPromotion = true;\r\n\r\n self.hasPermissionToEditItem = authService.hasPermission('promotion_edit_promotionItem') || (self.loadForInternalPromotion && !authService.hasPermission('promotion_take_internalPromotion'));\r\n\r\n self.decimalFormat = function (value) {\r\n if (value) {\r\n return value.toFixed(2);\r\n }\r\n }\r\n\r\n self.integerFormat = function (value) {\r\n if (value) {\r\n return value.toFixed(0);\r\n }\r\n }\r\n\r\n self.isNew = false;\r\n self.promotionMediaPage = null;\r\n self.categoryIds = [];\r\n self.canLookupItems = false;\r\n self.isLoading = false;\r\n self.isLoadingSuggestedPrice = false;\r\n self.isLoadingMarketPrice = false;\r\n self.overlaps = [];\r\n self.variants = [];\r\n self.chat = '';\r\n self.inputVisibility = 1;\r\n self.files = [];\r\n self.savedFiles = [];\r\n self.selectedImage = {id: 0, imageUrl: \"\"};\r\n self.selectedIndex = 0;\r\n self.store = null;\r\n self.promoDetails = \"\";\r\n self.paymentTypes = [];\r\n self.viewVariantInfoReadOnly = false;//permite ver la info de un relacionado en modo solo lectura\r\n self.promotionItemForecastSales = null;\r\n\r\n //ITEM LOOKUP\r\n self.item = null;\r\n self.itemLookupText = '';\r\n self.itemsInLookup = [];\r\n self.selectedItem = null;\r\n self.loadingLookupItems = false;\r\n self.lookupItemsNoResults = true;\r\n\r\n self.isBusy = false;\r\n\r\n //campos calculados \r\n $scope.$watch('ct.item', function (newVal, oldVal) {\r\n if (newVal && (newVal.promotionalPrice || newVal.loyaltyPrice)) {\r\n let bonusOrPromotionalPrice = newVal.loyaltyPrice ? newVal.loyaltyPrice : newVal.promotionalPrice;\r\n self.item.varP = newVal.actualPrice ? (bonusOrPromotionalPrice / newVal.actualPrice) - 1 : null;\r\n if (newVal.forecast) {\r\n self.item.forecastCash = newVal.forecast * bonusOrPromotionalPrice;\r\n self.item.estimatedMarginP = newVal.newCost ? (self.item.forecastCash - (newVal.forecast * (newVal.newCost * (1 + TAX)))) / self.item.forecastCash : 0;\r\n self.item.estimatedMarginCash = newVal.newCost ? ((bonusOrPromotionalPrice / (1 + TAX)) - newVal.newCost) * newVal.forecast : 0;\r\n self.item.forecastMarginP = (self.item.forecastCash - (newVal.forecast * (newVal.newCost ? (newVal.newCost * (1 + TAX)) : (newVal.internalCost * (1 + TAX))))) / self.item.forecastCash;\r\n self.item.forecastMarginCash = ((bonusOrPromotionalPrice / (1 + TAX)) - (newVal.newCost ? newVal.newCost : newVal.internalCost)) * newVal.forecast;\r\n }\r\n if (newVal.normalPrice) {\r\n self.item.actualInternalIc = (bonusOrPromotionalPrice - newVal.normalPrice) / newVal.normalPrice;\r\n self.item.strategyInternalIc = self.item.suggestedPrice? (self.item.suggestedPrice - newVal.normalPrice) / newVal.normalPrice : null;\r\n }\r\n if (newVal.marketPrice) {\r\n self.item.actualExternalIc = (bonusOrPromotionalPrice - newVal.marketPrice) / newVal.marketPrice;\r\n self.item.strategyExternalIc = self.item.suggestedPrice ? (self.item.suggestedPrice - newVal.marketPrice) / newVal.marketPrice : null;\r\n }\r\n\r\n }\r\n }, true);\r\n\r\n\r\n var previousLookupText = '';\r\n\r\n $scope.$watch('ct.itemLookupText', function (newVal, oldVal) {\r\n if (newVal) {\r\n\r\n if (newVal.id) {\r\n self.selectedItem = self.itemLookupText;\r\n self.lastSearchedItem = newVal;\r\n getItemInfo($stateParams.promotionId, newVal.id, 0, newVal.saleUnitOfMeasureId);\r\n if (self.item)\r\n self.item.saleUnitOfMeasureId = self.selectedItem.saleUnitOfMeasureId;//aqui nunca entra self.item es null hasta que vuelva la info del servidor\r\n }\r\n\r\n\r\n if (newVal && newVal != oldVal && (newVal.length == 4 || (oldVal.length < 3 && newVal.length >= 4)) && newVal != previousLookupText) {\r\n previousLookupText = newVal;\r\n\r\n self.itemsInLookup = [{ saleUnitOfMeasureId: 0, id: 0, code: '', name: 'Cargando Items con el texto ' + newVal + '...' }];\r\n self.loadingLookupItems = true;\r\n var lookupParameter = { searchTerm: newVal, categoryIds: self.categoryIds };\r\n homeService.lookups.itemsLookup(lookupParameter)\r\n .then(function (items) {\r\n self.itemsInLookup = items;\r\n self.loadingLookupItems = false;\r\n if (items.length > 0)\r\n self.lookupItemsNoResults = false;\r\n else\r\n self.lookupItemsNoResults = true;\r\n });\r\n }\r\n }\r\n\r\n }, true);\r\n\r\n //VENDORS LOOKUP\r\n self.vendorsInLookup = [];\r\n self.loadingLookupVendors = false;\r\n self.lookupVendorsNoResults = true;\r\n\r\n $scope.$watch('ct.vendorLookup', function (newVal, oldVal) {\r\n if (newVal) {\r\n\r\n if (newVal && newVal.vendorId != null) {\r\n self.item.vendor = self.vendorLookup;\r\n }\r\n\r\n if (newVal) { // && newVal != oldVal && (newVal.length == 4 || (oldVal.length < 3 && newVal.length >= 4)) && newVal != previousLookupText\r\n previousLookupText = newVal;\r\n\r\n self.vendorsInLookup = [{ id: 0, code: '', name: 'Cargando proveedores con el texto ' + newVal + '...' }];\r\n self.loadingLookupVendors = true;\r\n self.vendorsInLookup = self.item.promotionItemVendors;\r\n self.loadingLookupVendors = false;\r\n if (self.item.promotionItemVendors.length > 0)\r\n self.lookupVendorsNoResults = false;\r\n else\r\n self.lookupVendorsNoResults = true;\r\n\r\n }\r\n }\r\n\r\n }, true);\r\n\r\n self.changeNegotiationType = function (negotiationType) {\r\n if (negotiationType == 1) {\r\n self.item.sellIn = !self.item.sellIn;\r\n self.item.newCost = self.item.sellIn ? self.item.newCost : '';\r\n }\r\n else {\r\n self.item.sellOut = !self.item.sellOut;\r\n self.item.negotiatedAmount = self.item.sellOut ? self.item.negotiatedAmount : '';\r\n }\r\n };\r\n\r\n self.changeProceedToCharge = function (proceedToCharge) {\r\n self.item.proceedToCharge = proceedToCharge;\r\n if (proceedToCharge)\r\n self.getAnnounceFee();\r\n else { self.item.announceFee = null; self.item.negotiatdAnnounceFee = null; }\r\n }\r\n \r\n self.goToVariantView = function goToVariantView(item) {\r\n if ($stateParams.promotionItemId != 0) { \r\n if (item.id && item.saleUnitOfMeasureId) {\r\n self.viewVariantInfoReadOnly = true;\r\n getItemInfo($stateParams.promotionId, 0, item.id, item.saleUnitOfMeasureId);\r\n }\r\n }\r\n else {\r\n if (item.itemId && item.baseUmvId) {\r\n self.viewVariantInfoReadOnly = true;\r\n getItemInfo($stateParams.promotionId, item.itemId, 0, item.baseUmvId);\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n self.goToPublishedView = function goToPublishedView() {\r\n if ($stateParams.promotionItemId != 0) {\r\n self.viewVariantInfoReadOnly = false;\r\n getItemInfo($stateParams.promotionId, 0, $stateParams.promotionItemId, $stateParams.salesUnitOfMeasureId);\r\n }\r\n else {\r\n self.viewVariantInfoReadOnly = false;\r\n getItemInfo($stateParams.promotionId, self.lastSearchedItem.id, 0, self.lastSearchedItem.saleUnitOfMeasureId);\r\n }\r\n }\r\n\r\n function loadOverlapping(itemId, salesUnitOfMeasureId) {\r\n //Cargo el Overlapping\r\n promotionsService.items.getItemOverlaps($stateParams.promotionId, itemId, salesUnitOfMeasureId, $stateParams.promotionMediaPageId, $stateParams.position)\r\n .then(function (overlaps) {\r\n self.overlaps = overlaps;\r\n self.distinctPromotionsOveralps = [];\r\n _.forOwn(_.groupBy(self.overlaps, \"promotionId\"), function (value, key) {\r\n self.distinctPromotionsOveralps.push(key);\r\n });\r\n });\r\n }\r\n\r\n function getItemInfo(promotionId, itemId, promotionItemId, saleUnitOfMeasureId) {\r\n self.isLoading = true;\r\n\r\n promotionsService.items.getItemInfo(promotionId, itemId, promotionItemId, saleUnitOfMeasureId)\r\n .then(function (item) {\r\n self.item = item;\r\n self.item.promotionMediaPageId = $stateParams.promotionMediaPageId;\r\n self.item.position = $stateParams.position;\r\n self.item.isHighlighted = $stateParams.isHighlighted;\r\n self.item.isSubstitute = $stateParams.isSubstitute;\r\n self.item.promotionItemType = $stateParams.promotionItemType;\r\n self.selectedImage.imageUrl = self.item.imageUrl;\r\n self.item.marginP = self.item.actualPrice > 0 ? ((self.item.actualPrice / (1 + TAX)) - self.item.internalCost) / (self.item.actualPrice / (1 + TAX)) : 0;\r\n if ($stateParams.promotionItemId == 0) {\r\n self.item.proceedToCharge = true;\r\n self.changeProceedToCharge(true);\r\n self.item.sellOut = true;\r\n self.item.chargeType = 2;\r\n self.item.announceType = 1;\r\n self.getAnnounceFee();\r\n if (self.item) {\r\n var storeId = self.item.promotionItemStores[0].storeId;\r\n promotionsService.stores.getStore(storeId).then(function (s) {\r\n promotionsService.items.getLastPromotionItem(s.brandId, self.item.itemId)\r\n .then(function (response) {\r\n self.item.promotionalAction = response.promotionName;\r\n self.item.prevPromotionPrice = response.price;\r\n self.item.promotionalActionValidity = response.validity;\r\n });\r\n });\r\n }\r\n }\r\n else if (self.item.announceFee == null) { self.getAnnounceFee(); }\r\n\r\n self.savedFiles = []; //Clear variable\r\n if (self.item.imageUrl)\r\n self.savedFiles = [{ id: 0, imageUrl: self.item.imageUrl}];\r\n\r\n angular.forEach(item.files, function (img) {\r\n if (img !== self.item.imageUrl)\r\n self.savedFiles.push({ id: self.savedFiles.length, imageUrl: img});\r\n })\r\n if (($stateParams.position != 0) || ($stateParams.isSubstitute == 'true')) {\r\n\r\n if ($stateParams.promotionItemId == 0) {//nuevo item, relaciones automaticas\r\n promotionsService.items.getVariants(item.itemId)\r\n .then(function (variants) {\r\n self.variants = variants;\r\n });\r\n }\r\n else {//traer relaciones automaticas y manuales (si es que se cargaron)\r\n promotionsService.items.getPromotionVariants(item.id)\r\n .then(function (variants) {\r\n self.variants = variants;\r\n });\r\n }\r\n }\r\n\r\n //getinventory\r\n promotionsService.items.getItemDailyInventory($stateParams.promotionId, item.itemId, $stateParams.promotionItemId)\r\n .then(function (stock) {\r\n self.item.stockCash = stock.stockCash;\r\n self.item.storeStock = stock.storeStock;\r\n self.item.cdStock = stock.cdStock;\r\n self.item.storesUnderStockDays = Object.keys(stock.storesUnderStockDays).length;\r\n self.storesUnderStockDaysDetail = \"\";\r\n Object.keys(stock.storesUnderStockDays).forEach(function (k) {\r\n self.storesUnderStockDaysDetail += stock.storesUnderStockDays[k] + \" \";\r\n });\r\n if (self.item.dailyUnits != 0)\r\n self.item.stockDays = parseInt((self.item.storeStock + self.item.cdStock)) / self.item.dailyUnits; \r\n });\r\n\r\n loadOverlapping(itemId != 0 ? itemId : item.itemId, saleUnitOfMeasureId);\r\n\r\n self.vendorLookup = self.item.vendor;\r\n\r\n self.isLoading = false;\r\n //calculo suerido y precio mercado\r\n self.isLoadingCompetitivePrices = true;\r\n promotionsService.items.getCompetitivePrice($stateParams.promotionMediaPageId, $stateParams.promotionItemType, self.item.itemId, saleUnitOfMeasureId)\r\n .then(function (response) {\r\n self.suggestedForInternal = response.suggestedPriceForInternal;\r\n self.suggestedForExternal = response.suggestedPriceForExternal;\r\n if (self.suggestedForInternal && self.suggestedForExternal)\r\n self.item.suggestedPrice = Math.min(self.suggestedForInternal, self.suggestedForExternal);\r\n else self.item.suggestedPrice = self.suggestedForInternal ? self.suggestedForInternal : self.suggestedForExternal;\r\n \r\n if (response.priceSurveys && response.priceSurveys.length > 0) {\r\n self.item.marketPrice = $rootScope.arrayAverage(response.priceSurveys.map(function (s) { return s.price; }));\r\n self.surveys = response.priceSurveys;\r\n \r\n }\r\n self.isLoadingCompetitivePrices = false;\r\n });\r\n });\r\n }\r\n\r\n self.openSurveysDialog = function () {\r\n if (self.surveys && self.surveys.length > 0) {\r\n var newScope = $scope.$new();\r\n newScope.surveys = self.surveys;\r\n\r\n ngDialog.open({\r\n template: 'surveysDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n }\r\n \r\n }\r\n\r\n self.getForecast = function () {\r\n self.isLoadingForecast = true;\r\n if (!self.item) {\r\n swal(\"Error\", \"Debe seleccionar un articulo\", \"error\");\r\n self.isLoadingForecast = false;\r\n }\r\n else {\r\n promotionsService.items.getForecast(self.item.itemId, self.item.promotionMediaPageId, self.item.isHighlighted)\r\n .then(function (response) {\r\n self.promotionItemForecastSales = response;\r\n self.isLoadingForecast = false;\r\n });\r\n }\r\n }\r\n\r\n self.openSuggestionDetailsDialog = function () {\r\n if (self.suggestedForExternal || self.suggestedForInternal) {\r\n ngDialog.open({\r\n template: 'suggestionDetailsDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: $scope\r\n });\r\n }\r\n\r\n }\r\n \r\n self.getAnnounceFee = function () {\r\n\r\n if (self.item) {\r\n var storeId = self.item.promotionItemStores[0].storeId;\r\n promotionsService.stores.getStore(storeId).then(function (s) {\r\n self.item.announceFee = promotionsService.calculateTariff(s.brand, self.item.announceType);\r\n self.item.negotiatdAnnounceFee = self.item.announceFee;\r\n });\r\n }\r\n }\r\n\r\n self.getRangeTopography = function () {\r\n var rv = \"\";\r\n if (self.promotionItemForecastSales != null && self.promotionItemForecastSales.rangeTopography != null) {\r\n if (self.promotionItemForecastSales.rangeTopography == 1) {\r\n rv = \"green\";\r\n }\r\n else if (self.promotionItemForecastSales.rangeTopography == 2) {\r\n rv = \"gold\";\r\n }\r\n else if (self.promotionItemForecastSales.rangeTopography == 3) {\r\n rv = \"red\";\r\n }\r\n }\r\n return rv;\r\n }\r\n\r\n\r\n // solution #2\r\n //$scope.$watch(function () {\r\n // for (var i = 0; i < self.savedFiles.length; i++) {\r\n // if (self.savedFiles[i].active) {\r\n // return self.savedFiles[i];\r\n // }\r\n // }\r\n //}, function (currentSlide, previousSlide) {\r\n // if (currentSlide !== previousSlide) {\r\n // self.selectedImage = currentSlide.imageUrl;\r\n // }\r\n //});\r\n // solution #3\r\n $scope.$watch('active', function (newIndex, oldIndex) {\r\n if (Number.isFinite(newIndex) && newIndex !== oldIndex) {\r\n self.selectedImage = self.savedFiles[newIndex];\r\n }\r\n });\r\n\r\n\r\n self.uploadFiles = function (files, errFiles) {\r\n if (errFiles && errFiles.length > 0) {\r\n var allowedSize = null;\r\n var largeFiles = '';\r\n\r\n angular.forEach(errFiles, function (file) {\r\n if (file.$error == 'maxSize') {\r\n if (allowedSize == null)\r\n allowedSize = file.$errorParam;\r\n if (largeFiles != '')\r\n largeFiles += ', ';\r\n largeFiles += ian.format(' {0} ({1}KB)', file.name, (file.size / 1024).toFixed(0));\r\n }\r\n });\r\n\r\n swal('Peso de imagenes excedido', ian.format('El peso maximo para cada imagen es {0}. Las siguientes imagenes exceden el peso permitido: {1}', allowedSize, largeFiles), 'error');\r\n }\r\n else if (files && files.length && self.item.code != '') {\r\n self.isBusy = true;\r\n var url = ian.urlCombine(serverService.getApiUrl(), '/promotion/items/uploadFile/' + self.item.code);\r\n Upload.upload({\r\n url: url,\r\n data: { files: files }\r\n }).then(function (response) {\r\n var uploadResults = response.data;\r\n processResults(uploadResults);\r\n if (!anyError(uploadResults))\r\n self.filesUploaded = true;\r\n });\r\n }\r\n\r\n }\r\n\r\n function loadResults(results) {\r\n if ($.isArray(results)) {\r\n angular.forEach(results, function (imageUrl) {\r\n self.savedFiles.push({id: self.savedFiles.length, imageUrl: imageUrl});\r\n });\r\n } else {\r\n self.savedFiles.push({id: self.savedFiles.length, imageUrl: results.parameter1});\r\n }\r\n }\r\n\r\n function processResults(uploadResults) {\r\n self.isBusy = false;\r\n if (uploadResults.length > 0) {\r\n loadResults(uploadResults);\r\n }\r\n if (anyError(uploadResults)) {\r\n self.error = true;\r\n }\r\n else {\r\n self.filesUploaded = true;\r\n self.error = false;\r\n self.files = [];\r\n }\r\n }\r\n\r\n function anyError(uploadResults) {\r\n var error = false;\r\n for (var i = 0; i < uploadResults.length; i++) {\r\n if (uploadResults[i].severity === 3)\r\n error = true;\r\n }\r\n\r\n return error;\r\n }\r\n\r\n self.showOverlapping = function () {\r\n\r\n var newScope = $scope.$new();\r\n newScope.overlaps = self.overlaps;\r\n\r\n ngDialog.open({\r\n template: 'overlapDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n };\r\n\r\n self.goToLayout = function () {\r\n var state = 'promotions.addItemToLayout';\r\n if (self.isReview)\r\n state = 'promotions.2reviewTradeAgreements';\r\n else if (self.isPrintLayoutCompare)\r\n state = 'promotions.printLayoutCompare';\r\n else if (self.isLayoutImageUpload)\r\n state = 'promotions.layoutImageUpload';\r\n else if (self.isFinalValidation)\r\n state = 'promotions.finalValidation';\r\n\r\n $state.go(state, {\r\n promotionId: $stateParams.promotionId,\r\n taskId: $stateParams.taskId,\r\n promotionMediaPageId: $stateParams.promotionMediaPageId\r\n });\r\n }\r\n\r\n self.goToEditPromotion = function () {\r\n $state.go('promotions.editInternalPromotion', {\r\n promotionId: $stateParams.promotionId,\r\n promotionMediaPageId: $stateParams.promotionMediaPageId\r\n });\r\n }\r\n\r\n\r\n //valida precio promocional, y precio/pts bonus\r\n function validatePrices() {\r\n if (self.item.promotionalPrice != undefined || self.item.loyaltyPrice != undefined) {\r\n if ((self.item.loyaltyPrice == undefined && self.item.loyaltyPoints == undefined) || (self.item.loyaltyPrice == 0 && self.item.loyaltyPoints == 0) || (self.item.loyaltyPrice != undefined && self.item.loyaltyPoints != undefined)) {\r\n if ((self.item.loyaltyPrice != undefined && self.item.promotionalPrice != undefined && self.item.loyaltyPrice <= self.item.promotionalPrice) || self.item.loyaltyPrice == undefined || self.item.promotionalPrice == undefined) {\r\n return true;\r\n }\r\n else {\r\n $timeout(function () {\r\n swal(\"Error\", \"Precio bonus no debe superar al promocional\", \"error\");\r\n }, 100);\r\n }\r\n }\r\n else {\r\n $timeout(function () {\r\n swal(\"Error\", \"Si existe 'precio bonus' 'puntos bonus' es obligatorio y viceversa\", \"error\");\r\n }, 100);\r\n }\r\n }\r\n else {\r\n $timeout(function () {\r\n swal(\"Error\", \"Debe cargar el precio promocional o el precio bonus\", \"error\");\r\n }, 100);\r\n }\r\n\r\n }\r\n\r\n function anyItemInPhoto() {\r\n //si no tiene variantes entonces es item en foto\r\n if (!self.variants.length)\r\n self.item.isItemInPhoto = true;\r\n\r\n var rv = self.item.isItemInPhoto ||\r\n self.variants.some(function (x) { return x.isItemInPhoto; });\r\n if (!rv) {\r\n $timeout(function () {\r\n swal(\"Error\", \"Debe seleccionar al menos un articulo en foto.\", \"error\");\r\n }, 100);\r\n }\r\n return rv;\r\n }\r\n\r\n self.saveComment = function () {\r\n if (self.chat != '' && $stateParams.promotionItemId != 0) {\r\n var newChat = {\r\n id: 0,\r\n promotionItemId: $stateParams.promotionItemId,\r\n promotionMediaPageId: $stateParams.promotionMediaPageId,\r\n message: self.chat.replace(/(\\r\\n|\\n|\\r)/gm, '')\r\n };\r\n promotionsService.mechanics.saveChat(newChat)\r\n .then(function (isOk) {\r\n swal('Comentario guardado!', '', 'success');\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al guardar\", \"error\");\r\n }\r\n });\r\n }\r\n }\r\n\r\n self.save = function () {\r\n if (self.item != null && validatePrices() && anyItemInPhoto()) {\r\n if (!self.isReview || $stateParams.position == 0) {\r\n swal({\r\n title: 'Esta seguro que desea asociar este Item a esta Página?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n self.item.imageUrl = self.selectedImage.imageUrl;\r\n if (self.chat != '') {\r\n var newChat = {\r\n promotionItemId: self.item.id,\r\n promotionMediaPageId: self.item.promotionMediaPageId,\r\n message: self.chat\r\n };\r\n self.item.chats.push(newChat);\r\n\r\n }\r\n ////si no comento nada y hay un nuevo chat se lo borro\r\n //if (self.chat == '' && self.item.chats[self.item.chats.length - 1].username === undefined) {\r\n // self.item.chats.splice(self.item.chats.length - 1, 1);\r\n //} \r\n self.chat = '';\r\n\r\n //info de relacionados (isItemInPhoto)\r\n var variantItemsInPhoto = self.variants.filter(function (x) {\r\n return x.isItemInPhoto;\r\n });\r\n\r\n self.item.variantItemsInPhoto = variantItemsInPhoto.map(function (x) {\r\n return x.itemCode || x.code;\r\n });\r\n\r\n promotionsService.items.savePromotionItem(self.item)\r\n .then(function (item) {\r\n if (item.id != 0) {\r\n swal('Item Asociado!', 'El item ' + self.item.name + ' se ha asociado correctamente', 'success');\r\n }\r\n else {\r\n swal('Error', 'La posicion ' + self.item.position + ' se encuentra actualmente ocupada', 'error');\r\n }\r\n if (!self.loadForInternalPromotion)\r\n self.goToLayout();\r\n else self.goToEditPromotion();\r\n\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al guardar\", \"error\");\r\n }\r\n });\r\n\r\n\r\n }\r\n });\r\n }\r\n else\r\n saveReview();\r\n }\r\n\r\n }\r\n\r\n function saveReview() {\r\n\r\n swal({\r\n title: 'Está seguro que desea guardar?',\r\n text: 'Solo se guardará precio promocional, precio bonus, puntos bonus, pronostico y comentarios',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n if (self.chat != '') {\r\n var newChat = {\r\n promotionItemId: self.item.id,\r\n promotionMediaPageId: self.item.promotionMediaPageId,\r\n message: self.chat\r\n };\r\n self.item.chats.push(newChat);\r\n self.chat = '';\r\n }\r\n //info de relacionados (isItemInPhoto)\r\n var variantItemsInPhoto = self.variants.filter(function (x) {\r\n return x.isItemInPhoto;\r\n });\r\n\r\n self.item.variantItemsInPhoto = variantItemsInPhoto.map(function (x) {\r\n return x.itemCode || x.code;\r\n });\r\n promotionsService.items.saveReview(self.item)\r\n .then(function (item) {\r\n swal('Edición exitosa!', 'El item ' + self.item.name + ' se ha modificado correctamente', 'success');\r\n self.goToLayout();\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al guardar\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n\r\n }\r\n\r\n\r\n self.deleteChat = function (chatId) {\r\n\r\n swal({\r\n title: 'Borrar el comentario ?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n promotionsService.items.deleteItemChat(chatId)\r\n .then(function (isOk) {\r\n swal('Comentario Borrado!', 'se ha borrado correctamente', 'success');\r\n promotionsService.items.getItemInfo($stateParams.promotionId, 0, $stateParams.promotionItemId, self.item.saleUnitOfMeasureId)\r\n .then(function (item) {\r\n self.item.chats = item.chats;\r\n });\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de borrado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al borrar el comentario\", \"error\");\r\n }\r\n });\r\n\r\n\r\n }\r\n\r\n });\r\n }\r\n\r\n\r\n function init() {\r\n self.isNew = $stateParams.promotionItemId == 0 ? true : false;\r\n self.announcementTypes = promotionsService.promotionMechanicAnnouncementTypes;\r\n self.paymentTypes = promotionsService.promotionMechanicPaymentTypes;\r\n self.promotionExhibitionType = promotionsService.promotionExhibitionType;\r\n if ($stateParams.promotionItemId != 0) {\r\n getItemInfo($stateParams.promotionId, 0, $stateParams.promotionItemId, $stateParams.salesUnitOfMeasureId);\r\n }\r\n\r\n promotionsService.tasks.getTaskName($stateParams.taskId)\r\n .then(function (taskName) {\r\n switch (taskName) {\r\n case \"2° Revisión Comercial\": self.isReview = true;\r\n break;\r\n case \"1° Input para armado de Pieza\": self.isPrintLayoutCompare = true;\r\n break;\r\n case \"2° Input para armado de Pieza\": self.isPrintLayoutCompare = true;\r\n break;\r\n case \"3° Input para armado de Pieza\": self.isPrintLayoutCompare = true;\r\n break;\r\n case \"1° Subida de Pieza para revisión\": self.isLayoutImageUpload = true;\r\n break;\r\n case \"2° Subida de Pieza para revisión\": self.isLayoutImageUpload = true;\r\n break;\r\n case \"3° Subida de Pieza para revisión\": self.isLayoutImageUpload = true;\r\n break;\r\n case \"Validación final\": self.isFinalValidation = true;\r\n break;\r\n }\r\n\r\n });\r\n\r\n //Cargo los datos de la página con sus categorias asociadas\r\n if ($stateParams.promotionMediaPageId != 0) {\r\n promotionsService.promotions.getPromotionMediaPage($stateParams.promotionMediaPageId)\r\n .then(function (promotionMediaPage) {\r\n self.promotionMediaPage = promotionMediaPage;\r\n\r\n self.categoryIds.push(promotionMediaPage.mainCategoryId);\r\n for (var i = 0; i < promotionMediaPage.secondaryCategoriesIds.length; i++) {\r\n self.categoryIds.push(promotionMediaPage.secondaryCategoriesIds[i]);\r\n }\r\n\r\n self.canLookupItems = true;\r\n });\r\n }\r\n\r\n promotionsService.promotions.getPromotionData($stateParams.promotionId, $stateParams.promotionMediaPageId, $stateParams.position)\r\n .then(function (promotionInfo) {\r\n self.promoDetails = promotionInfo;\r\n });\r\n }\r\n\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"controlPanelCtrl\", function ($scope, $sce, promotionsService) {\r\n var self = this;\r\n\r\n //Variables globales\r\n\r\n self.isLoading = true;\r\n\r\n self.textCampaign = \"\";\r\n self.textTypeOfpromotion = \"\";\r\n\r\n self.filter = {\r\n promotionCampaignId: undefined,\r\n promotionMediaTypeId: undefined,\r\n\r\n layOutsAssignmentStatus: undefined,\r\n initialChargeStatus: undefined,\r\n partUploadForReview1Status: undefined,\r\n commercialReview1Status: undefined,\r\n partUploadForReview2Status: undefined,\r\n commercialReview2Status: undefined,\r\n closingPriceStatus: undefined,\r\n partUploadForReview3Status: undefined,\r\n finalValidationStatus: undefined\r\n }\r\n\r\n self.getTemplateForPopover = function (property) {\r\n var html = document.getElementById('myPopoverTemplate.html').innerHTML;\r\n\r\n html = html.replace(\"PROPERTY\", property);\r\n\r\n return html;\r\n }\r\n\r\n self.isOpenPopover = true;\r\n\r\n self.promotionStatusList = [];\r\n\r\n self.campaignsList = [];\r\n\r\n self.typeOfPromotionList = [];\r\n\r\n //Funciones\r\n self.setFilterCampaign = function (campaign) {\r\n self.filter.promotionCampaignId = campaign.id;\r\n self.textCampaign = campaign.name;\r\n }\r\n\r\n self.setFilterPromotion = function (mediaType) {\r\n self.filter.promotionMediaTypeId = mediaType.id;\r\n self.textTypeOfpromotion = mediaType.label;\r\n }\r\n\r\n self.getColor = function (status) {\r\n rv = \"\"\r\n\r\n if (status == \"OK\")\r\n rv = \"#1AB394\";\r\n\r\n else if (status == \"Advertencia\")\r\n rv = \"#F8AC59\";\r\n\r\n else if (status == \"En falta\")\r\n rv = \"#ED5565\";\r\n else if(status == \"Pendiente\")\r\n rv = \"#FFFFFF\";\r\n\r\n else\r\n rv = \"#f5f5f5\";\r\n\r\n return rv;\r\n }\r\n\r\n self.getFilterColor = function (prop) {\r\n rv = \"\"\r\n\r\n var status = self.filter[prop];\r\n\r\n if (status == \"OK\")\r\n rv = \"#1AB394\";\r\n\r\n else if (status == \"Advertencia\")\r\n rv = \"#F8AC59\";\r\n\r\n else if (status == \"En falta\")\r\n rv = \"#ED5565\";\r\n\r\n else\r\n rv = \"inherit\";\r\n\r\n return rv;\r\n }\r\n\r\n self.popover = {\r\n template: 'myPopoverTemplate.html',\r\n\r\n isOpen: false,\r\n\r\n prop: null,\r\n\r\n open: function (prop) {\r\n self.popover.prop = prop;\r\n }\r\n };\r\n\r\n self.setFilter = function (status) {\r\n\r\n self.filter[self.popover.prop] = status;\r\n\r\n $('.popover').remove();\r\n\r\n }\r\n\r\n function init() {\r\n\r\n //self.isLoading = false;\r\n\r\n promotionsService.controlPanel.getPromotionsStatus()\r\n .then(function (responseList) {\r\n console.log('responseList', responseList);\r\n self.isLoading = false;\r\n self.promotionStatusList = responseList;\r\n });\r\n\r\n promotionsService.campaigns.getCampaigns()\r\n .then(function (responseCampaings) {\r\n console.log('responseCampaings', responseCampaings);\r\n self.campaignsList = responseCampaings;\r\n });\r\n\r\n self.typeOfPromotionList = promotionsService.promotionMediaTypes;\r\n self.typeOfPromotionList.splice(5, 1);//quito inernas del filtro\r\n }\r\n\r\n\r\n init();\r\n\r\n\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"comunicationCtrl\", function ($scope, $stateParams, $state, $sce, promotionsService, serverService, ngDialog, Upload, authService, $filter) {\r\n var self = this;\r\n\r\n //Variables Globales\r\n self.canUploadFiles = authService.hasPermission('promotion_comunication_uploadFiles');\r\n self.canDownloadBarcodes = authService.hasPermission('promotion_comunication_downloadBarcodes');\r\n self.isStore = authService.hasPermission('promotion_isStore');\r\n self.canNotifyStores = authService.hasPermission('promotion_notifyPromotionsToStore');\r\n self.storesCode = \"\";\r\n self.selectedMarkdownTitle = '';\r\n\r\n self.currDate = Date.now();\r\n\r\n self.search = \"\";\r\n\r\n self.currentPromotionalActionsList = [];\r\n self.promtoionAndMarkdownList = [];//lista visible\r\n\r\n self.campaignsList = [];\r\n\r\n self.typeOfPromotionList = [];\r\n\r\n self.filter = {\r\n id: \"\",\r\n mediaType: \"\",\r\n markdownPlanTypeStr: \"\",\r\n status: \"\",\r\n campaign: \"\",\r\n promotionType: \"\"\r\n };\r\n\r\n self.order = \"id\";\r\n\r\n self.inputId = \"\";\r\n\r\n self.inputStartDate = null;\r\n\r\n self.task = null;\r\n self.linkStore = '';\r\n self.linkItem = '';\r\n self.showItem = false;\r\n self.showStore = false;\r\n\r\n self.isLoading = true; \r\n\r\n //Funciones\r\n\r\n self.notificateAllPromotionsToStores = function () {\r\n promotionsService.communications.notificateAllPromotionsToStores()\r\n .then(function () {\r\n swal('Promociones notificadas', 'Se ha notificado a las tiendas', 'success');\r\n loadData();\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de borrado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error notificar las promociones.\", \"error\");\r\n }\r\n });\r\n }\r\n\r\n\r\n self.filterId = function (id) {\r\n self.filter.id = id;\r\n self.inputId = \"\";\r\n self.updateVisibleList();\r\n }\r\n\r\n self.filterMediaType = function (mediaType) {\r\n self.filter.mediaType = mediaType;\r\n self.filter.markdownPlanTypeStr = \"\";\r\n self.updateVisibleList();\r\n }\r\n\r\n self.filtermarkdownPlanType = function (markdownPlanType) {\r\n self.filter.markdownPlanTypeStr = markdownPlanType;\r\n self.filter.mediaType = \"\";\r\n self.updateVisibleList();\r\n }\r\n\r\n self.filterCampaign = function (campaign) {\r\n self.filter.campaign = campaign;\r\n self.updateVisibleList();\r\n }\r\n\r\n self.filterStatus = function (status) {\r\n if (status == \"planeada\") {\r\n self.filter.status = \"planeada\";\r\n }\r\n else if (status == \"historica\") {\r\n self.filter.status = \"historica\";\r\n }\r\n else if (status == \"activa\") {\r\n self.filter.status = \"activa\";\r\n }\r\n else if (status == \"Activas y Planeadas\") {\r\n self.filter.status = \"activaplaneada\";\r\n }\r\n else\r\n self.filter.status = \"\";\r\n self.updateVisibleList();\r\n }\r\n\r\n self.filterPromotionType = function (type) {\r\n if (type == \"externa\") {\r\n self.filter.promotionType = \"externa\";\r\n }\r\n else if (type == \"interna\") {\r\n self.filter.promotionType = \"interna\";\r\n }\r\n else if (type == \"otra\") {\r\n self.filter.promotionType = \"otra\";\r\n }\r\n else\r\n self.filter.promotionType = \"\";\r\n self.updateVisibleList();\r\n }\r\n self.getFilterColor = function () {\r\n var rv = \"\";\r\n\r\n if (self.filter.status == \"planeada\")\r\n rv = \"#F8AC59\";\r\n else if (self.filter.status == \"historica\")\r\n rv = \"#DD6B55\";\r\n else if (self.filter.status == \"activa\")\r\n rv = \"#1AB394\";\r\n else if (self.filter.status == \"activaplaneada\")\r\n rv = \"#ccf110\";\r\n\r\n return rv;\r\n }\r\n\r\n self.query = function (row) {\r\n return (angular.lowercase(row.currentPromotionalActionsList.campaign).indexOf(angular.lowercase(self.search) || '') !== -1 ||\r\n angular.lowercase(row.currentPromotionalActionsList.promotionName).indexOf(angular.lowercase(self.search) || '') !== -1 ||\r\n angular.lowercase(row.currentPromotionalActionsList.startDate).indexOf(angular.lowercase(self.search) || '') !== -1 ||\r\n angular.lowercase(row.currentPromotionalActionsList.finishDate).indexOf(angular.lowercase(self.search) || '') !== -1);\r\n };\r\n\r\n self.openUploadDownloadDialog = function (promotion, comType, title, icon) {\r\n\r\n self.upDownDialog = {\r\n title: title,\r\n icon: icon,\r\n promotion: promotion,\r\n comType: comType,\r\n getDownloadUrl: function () {\r\n if (this.comType == 'PromotionErratas')\r\n return self.upDownDialog.promotion.erratasUrl;\r\n else if (this.comType == 'PromotionDigitalVersion')\r\n return self.upDownDialog.promotion.digitalVersionUrl;\r\n else if (this.comType == 'PromotionExhibitionGuide')\r\n return self.upDownDialog.promotion.exhibitionGuideUrl;\r\n }\r\n }\r\n\r\n ngDialog.open({\r\n template: 'uploadDownloadDialog',\r\n className: 'ngdialog-theme-default',\r\n scope: $scope\r\n });\r\n }\r\n\r\n\r\n self.downloadComments = function (promotion) {\r\n promotion.isLoadingChats = true;\r\n promotionsService.reports.buildCommentsReport(promotion.id)\r\n .then(function (link) {\r\n self.linkStore = link;\r\n self.showSwalWithLink(link);\r\n promotion.isLoadingChats = false;\r\n });\r\n }\r\n\r\n\r\n self.closeUploadDownloadDialog = function () {\r\n ngDialog.close();\r\n }\r\n\r\n self.goToPromotionSearch = function () {\r\n $state.go('promotions.promotionSearch');\r\n }\r\n\r\n self.openHistoricDialog = function () {\r\n var newScope = $scope.$new();\r\n var today = new Date();\r\n self.fromDate = new Date(today.getFullYear(), today.getMonth() - 1, today.getDate() - 1);\r\n self.toDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 1);\r\n\r\n newScope.validateDateRange = function () {\r\n let rv = true;\r\n if (self.toDate >= today)\r\n rv = false;\r\n if (self.fromDate < new Date(self.toDate.getFullYear(), self.toDate.getMonth() - 1, self.toDate.getDate()))\r\n rv = false;\r\n return rv;\r\n }\r\n\r\n newScope.getHistoricPromotions = function () {\r\n if (!newScope.validateDateRange()) {\r\n swal(\"Rango invalido\",\"La fecha desde debe ser menor a hoy y a su vez el rango entre fechas no puede excederse de un mes.\",\"error\");\r\n return;\r\n }\r\n\r\n self.isLoading = true;\r\n ngDialog.close();\r\n promotionsService.communications.getHistoricCommunications({ fromDate: self.fromDate, toDate: self.toDate })\r\n .then(function (historics) { \r\n angular.forEach(historics, function (x) {\r\n if (!self.currentPromotionalActionsList.find(function (y) { return x.id == y.id }))\r\n self.currentPromotionalActionsList.push(x);\r\n });\r\n self.filterStatus(\"historica\");\r\n swal('Filtrado por historicas', '', 'success');\r\n self.isLoading = false;\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"\");\r\n }\r\n else {\r\n self.isLoading = false;\r\n swal(\"Error\", \"Hubo un error al consultar historicos\", \"error\");\r\n }\r\n });\r\n }\r\n\r\n ngDialog.open({\r\n template: 'historicDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n }\r\n\r\n self.uploadFile = function (file, errFiles) {\r\n\r\n if (file) {\r\n var url = ian.urlCombine(serverService.getApiUrl(), '/promotion/promotions/uploadCommunicationFile'); \r\n self.isUploading = true;\r\n ///' + self.upDownDialog.promotion.id + '/' + self.upDownDialog.promotion.promotionName + '/ ' + self.upDownDialog.comType\r\n Upload.upload({\r\n url: url,\r\n data: { file: file }\r\n }).then(function (response) {\r\n var paramsDto = {\r\n promotionId: self.upDownDialog.promotion.id,\r\n title: self.upDownDialog.promotion.promotionName,\r\n comType: self.upDownDialog.comType,\r\n url: response.data\r\n }\r\n promotionsService.communications.setCommunicationFile(paramsDto)\r\n .then(function (response) { \r\n\r\n if (self.upDownDialog.comType == 'PromotionErratas')\r\n self.upDownDialog.promotion.erratasUrl = response;\r\n else if (self.upDownDialog.comType == 'PromotionDigitalVersion')\r\n self.upDownDialog.promotion.digitalVersionUrl = response;\r\n else if (self.upDownDialog.comType == 'PromotionExhibitionGuide')\r\n self.upDownDialog.promotion.exhibitionGuideUrl = response;\r\n\r\n swal('Archivo subido con exito', 'Se ha actualizado el archivo de comunicación.', 'success');\r\n self.isUploading = false;\r\n }, function (response) {\r\n self.isUploading = false;\r\n });\r\n\r\n }, function () {\r\n self.isUploading = false;\r\n });\r\n }\r\n else if (errFiles && errFiles[0]) {\r\n var file = errFiles[0];\r\n\r\n var allowedSize = file.$errorParam;\r\n var size = (file.size / 1024).toFixed(0);\r\n\r\n swal('Archivo invalido', ian.format('El archivo {0} pesa {1}KB y el peso máximo permitido es: {2}', file.name, size, allowedSize), 'error');\r\n }\r\n }\r\n\r\n self.openDownloadDialog = function (promotion) {\r\n self.selectedPromotion = promotion;\r\n\r\n if ($stateParams.taskId && $stateParams.taskId != 0) //Si entre por un task\r\n {\r\n if (self.showItem || self.showStore) {\r\n ngDialog.open({\r\n template: 'downloadDialog',\r\n className: 'ngdialog-theme-default',\r\n scope: $scope\r\n });\r\n }\r\n }\r\n else if (promotion.id == 0)//es una liquidacion\r\n {\r\n self.showItem = true;\r\n self.selectedMarkdownTitle = promotion.promotionName;//title\r\n self.selectedMarkdownPlanType = promotion.markdownPlanType;\r\n ngDialog.open({\r\n template: 'downloadMarkdownDialog',\r\n className: 'ngdialog-theme-default',\r\n scope: $scope\r\n });\r\n }\r\n else //Si entro por el menu, le habilito ambos reportes para bajar si no es tienda. Si es de tienda, le habilito solo los que estén publicados al abrir la promo\r\n {\r\n //if (self.isStore)\r\n //{\r\n // if (self.selectedPromotion.isComPPublished)\r\n // self.showStore = true;\r\n // else\r\n // self.showStore = false;\r\n\r\n // if (self.selectedPromotion.isComunicationPublished) {\r\n // self.showItem = true;\r\n // self.showStore = true;\r\n // }\r\n // else\r\n // self.showItem = false;\r\n //}\r\n //else {\r\n // self.showStore = true;\r\n // self.showItem = true;\r\n //}\r\n\r\n if (companyJson.Promotions.AllowDownloadCommunications) {\r\n self.showStore = true;\r\n self.showItem = true;\r\n ngDialog.open({\r\n template: 'downloadDialog',\r\n className: 'ngdialog-theme-default',\r\n scope: $scope\r\n });\r\n }\r\n }\r\n\r\n }\r\n\r\n self.generateAndDownloadItems = function () {\r\n self.isLoading = true;\r\n var promotionId = (self.task && self.task.promotionId) ? self.task.promotionId : self.selectedPromotion.id;\r\n\r\n promotionsService.reports.buildItemTasksReport(promotionId)\r\n\r\n .then(function (link) {\r\n var p = self.promtoionAndMarkdownList.find(function (x) {\r\n return x.id == promotionId;\r\n })\r\n if (p) {\r\n p.communicationReportDownloaded = true;\r\n }\r\n self.linkItem = link;\r\n self.showSwalWithLink(link);\r\n self.isLoading = false;\r\n });\r\n\r\n\r\n }\r\n\r\n self.downloadMarkdownItems = function (expiredOnly, rejectedOnly) {\r\n self.isLoading = true;\r\n\r\n promotionsService.reports.buildMarkdownItemsReport({ title: self.selectedMarkdownTitle, expiredOnly: expiredOnly, rejectedOnly: rejectedOnly })\r\n\r\n .then(function (link) {\r\n self.linkItem = link;\r\n self.showSwalWithLink(link);\r\n self.isLoading = false;\r\n });\r\n\r\n\r\n }\r\n\r\n self.generateAndDownloadItemsForStores = function () {\r\n self.isLoading = true;\r\n var promotionId = (self.task && self.task.promotionId) ? self.task.promotionId : self.selectedPromotion.id;\r\n\r\n promotionsService.reports.buildStoreItemTasksReport(promotionId)\r\n\r\n .then(function (link) {\r\n\r\n self.linkItem = link;\r\n self.showSwalWithLink(link);\r\n self.isLoading = false;\r\n });\r\n\r\n\r\n }\r\n\r\n self.generateAndDownloadStores = function () {\r\n self.isLoading = true;\r\n var promotionId = (self.task && self.task.promotionId) ? self.task.promotionId : self.selectedPromotion.id;\r\n promotionsService.reports.buildItemStoreReport(promotionId)\r\n .then(function (link) {\r\n var p = self.promtoionAndMarkdownList.find(function (x) {\r\n return x.id == promotionId;\r\n })\r\n if (p) {\r\n p.communicationReportDownloaded = true;\r\n }\r\n self.linkStore = link;\r\n self.showSwalWithLink(link);\r\n self.isLoading = false;\r\n });\r\n }\r\n\r\n self.showSwalWithLink = function (link) {\r\n swal({\r\n\r\n title: \"Reporte Generado!\",\r\n text: 'Haga click AQUÍ para descargar el archivo',\r\n confirmButtonText: \"Cerrar\",\r\n confirmButtonColor: \"#c2c2c2\",\r\n html: true\r\n });\r\n }\r\n\r\n self.downloadItemBarCodes = function (promotionId) {\r\n self.isLoading = true;\r\n promotionsService.reports.buildItemBarCodesReport(promotionId)\r\n .then(function (link) {\r\n self.linkStore = link;\r\n self.showSwalWithLink(link);\r\n self.isLoading = false;\r\n });\r\n }\r\n\r\n self.informPromotion = function () {\r\n var promotionId = (self.task && self.task.promotionId) ? self.task.promotionId : 0;\r\n if (promotionId == 0)\r\n swal('Error', 'No se pudo detectar la promocion a informar.', 'error');\r\n else\r\n promotionsService.promotions.informPromotion(promotionId, self.task.id)\r\n .then(function () {\r\n swal('Promocion Informada!', '', 'success');\r\n });\r\n }\r\n\r\n self.comuicatePromotion = function () {\r\n var promotionId = (self.task && self.task.promotionId) ? self.task.promotionId : 0;\r\n if (promotionId == 0)\r\n swal('Error', 'No se pudo detectar la promocion a comunicar.', 'error');\r\n else\r\n promotionsService.promotions.comuicatePromotion(promotionId, self.task.id)\r\n .then(function () {\r\n swal('Promocion Comunicada!', '', 'success');\r\n });\r\n }\r\n\r\n //PAGINADO\r\n self.totalPages = function () {\r\n return Math.ceil(self.currentPromotionalActionsList.length / 50);\r\n }\r\n self.currentPage = 1;\r\n self.previousPage = function () {\r\n self.currentPage--;\r\n self.updateVisibleList();\r\n }\r\n\r\n self.nextPage = function () {\r\n self.currentPage++;\r\n self.updateVisibleList();\r\n }\r\n self.assistantList = [];\r\n self.updateVisibleList = function () {\r\n if (self.filter.status == 'activaplaneada')//por mal desarrollo de filtro por status me obliga a agregar este if en caso de filtro por activa y planeada a la vez\r\n {\r\n self.assistantList = self.currentPromotionalActionsList.filter(function (x) {\r\n return self.filter.status.indexOf(x.status.toLocaleLowerCase()) > -1;\r\n });\r\n }\r\n else {\r\n self.assistantList = $filter('filter')(self.currentPromotionalActionsList, self.filter);\r\n }\r\n\r\n if (self.search != '')\r\n self.assistantList = $filter('filter')(self.assistantList, self.search);\r\n let begin = (self.currentPage - 1) * 50;\r\n let end = begin + 50;\r\n self.promtoionAndMarkdownList = self.assistantList.slice(begin, end);\r\n }\r\n\r\n //FIN DE PAGINADO\r\n\r\n function init() {\r\n\r\n promotionsService.campaigns.getCampaigns()\r\n .then(function (responseCampaings) {\r\n self.campaignsList = responseCampaings;\r\n });\r\n\r\n self.typeOfPromotionList = promotionsService.promotionMediaTypes;\r\n\r\n promotionsService.stores.getUserStores()\r\n .then(function (storesCode) {\r\n self.storesCode = storesCode;\r\n });\r\n\r\n if ($stateParams.taskId && $stateParams.taskId != 0) { //Entro por la tarea de comunicacion o comunicacion preliminar\r\n promotionsService.tasks.getTask($stateParams.taskId)\r\n .then(function (task) {\r\n self.task = task;\r\n\r\n if (task.name == 'Comunicación Preliminar')\r\n self.showStore = true;\r\n else if (task.name == 'Comunicación') {\r\n self.showStore = true;\r\n self.showItem = true;\r\n }\r\n promotionsService.communications.getCommunication(task.promotionId)\r\n .then(function (promoComms) {\r\n self.currentPromotionalActionsList.push(promoComms);\r\n self.updateVisibleList();\r\n\r\n });\r\n });\r\n self.isLoading = false;\r\n }\r\n else {\r\n promotionsService.communications.getCommunications().then(function (promoComms) {\r\n //perfil de tienda no ve historicas\r\n if (promotionsService.getUserRolesByArea(\"Operaciones\").indexOf(authService.authentication.roles[0]) > -1)\r\n {\r\n self.isStoreProfile = true;\r\n promoComms = promoComms.filter(function (p) {\r\n let today = new Date(); \r\n let finishDate = new Date(p.finishDate);\r\n let toDate = new Date(finishDate.setDate(finishDate.getDate() + 2));\r\n return toDate >= today;\r\n });\r\n }\r\n\r\n self.currentPromotionalActionsList = promoComms;\r\n\r\n self.markdownPlanTypes = [];\r\n\r\n _.forOwn(_.groupBy(promoComms, \"markdownPlanTypeStr\"), function (value, key) {\r\n self.markdownPlanTypes.push(key);\r\n });\r\n\r\n self.updateVisibleList();\r\n\r\n self.isLoading = false;\r\n });\r\n }\r\n\r\n\r\n\r\n }\r\n\r\n\r\n init();\r\n\r\n });","angular.module(\"prisma\")\r\n .controller(\"editPromotionalCampaignCtrl\", function ($scope, $state, $stateParams, promotionsService) {\r\n var self = this;\r\n\r\n self.campaign = null;\r\n var allCampaigns = null;\r\n\r\n if ($stateParams.campaignId != '0') {\r\n promotionsService.campaigns.getCampaign($stateParams.campaignId)\r\n .then(function (campaign) {\r\n campaign.validFrom = new Date(campaign.validFrom);\r\n campaign.validTo = new Date(campaign.validTo);\r\n self.campaign = campaign;\r\n });\r\n }\r\n\r\n self.save = function () {\r\n if (self.campaign != null) {\r\n let today = new Date(new Date().setHours(0, 0, 0, 0));\r\n if (self.campaign.validFrom < today) {\r\n swal(\"Error\", \"La fecha de inicio debe ser igual o posterior a la fecha actual.\", \"error\");\r\n }\r\n else {\r\n if (self.campaign.validFrom < self.campaign.validTo) {\r\n if (canSaveThisName(self.campaign)) {\r\n swal({\r\n title: 'Esta seguro que desea guardar la campaña?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n\r\n promotionsService.campaigns.saveCampaign(self.campaign)\r\n .then(function (campai) {\r\n swal('Campaña Guardada!', 'La campaña ' + self.campaign.name + ' se ha guardado exitosamente', 'success');\r\n\r\n $state.go('promotions.campaigns');\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al guardar esta campaña\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n else {\r\n swal(\"Error\", \"Ya existe ese nombre de campaña.\", \"error\");\r\n }\r\n }\r\n else {\r\n swal(\"Error\", \"La fecha de inicio debe ser anterior a la de fin.\", \"error\");\r\n }\r\n }\r\n }\r\n }\r\n\r\n canSaveThisName = function (campaign) {\r\n var canSave = true;\r\n\r\n angular.forEach(allCampaigns, function (c) {\r\n if ((campaign.id == 0 || campaign.id == undefined) && c.name.toLowerCase() == campaign.name.toLowerCase())\r\n canSave = false;\r\n });\r\n\r\n return canSave;\r\n }\r\n\r\n loadCampaigns = function () {\r\n promotionsService.campaigns.getCampaigns()\r\n .then(function (campaigns) {\r\n allCampaigns = campaigns;\r\n });\r\n }\r\n\r\n loadCampaigns();\r\n\r\n });","angular.module(\"prisma\")\r\n .controller(\"promotionalCampaignsCtrl\", function ($scope, promotionsService, $timeout) {\r\n var self = this;\r\n\r\n self.campaigns = [];\r\n self.promotionsList = [];\r\n\r\n self.isLoading = true;\r\n\r\n self.delete = function (campaignId, campaignName) {\r\n\r\n swal({\r\n title: 'Esta seguro que desea borrar la campaña ' + campaignName + ' ?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n if (canDelete(campaignId)) {\r\n\r\n promotionsService.campaigns.deleteCampaign(campaignId)\r\n .then(function (isOk) {\r\n swal('Campaña Borrada!', 'La campaña ' + campaignName + ' se ha borrado exitosamente', 'success');\r\n loadData();\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de borrado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al borrar esta campaña\", \"error\");\r\n }\r\n });\r\n } else {\r\n $timeout(function () {\r\n swal(\"Error\", \"La campaña está activa\", \"error\");\r\n }, 100);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function canDelete(campaignId) {\r\n var can = true;\r\n angular.forEach(self.promotionsList, function (promotion) {\r\n if (promotion.promotionCampaignId == campaignId)\r\n can = false;\r\n });\r\n return can;\r\n }\r\n\r\n function loadData() {\r\n promotionsService.campaigns.getCampaigns()\r\n .then(function (campaigns) {\r\n self.campaigns = campaigns;\r\n self.isLoading = false;\r\n });\r\n\r\n //Cargar despues, no esperar a que carguen las promos para ver la data\r\n promotionsService.promotions.getPromotions(false) //No Traer las historicas\r\n .then(function (promotions) {\r\n self.promotionsList = promotions;\r\n });\r\n }\r\n\r\n function init() {\r\n loadData();\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"AssortmentActivationCtrl\", function ($scope, $rootScope, $state, $stateParams, promotionsService, authService, $timeout, ngDialog) {\r\n\r\n var self = this;\r\n\r\n self.task = null;\r\n self.link = '';\r\n\r\n self.canPublishAssortmentActivation = authService.hasPermission('promotion_publish_ActivacionSurtido');\r\n\r\n self.publish = function () {\r\n if ($stateParams.taskId) {\r\n promotionsService.tasks.publishTask($stateParams.taskId)\r\n .then(function (isOk) {\r\n swal('Tarea Publicada!', 'La tarea se ha publicado exitosamente', 'success');\r\n\r\n $state.go('promotions.myTasks');\r\n });\r\n } else {\r\n $timeout(function () {\r\n swal(\"Error\", \"no se pudo publicar la tarea\", \"error\");\r\n }, 100);\r\n }\r\n }\r\n\r\n self.generateAndDownload = function () {\r\n promotionsService.reports.buildItemStoreReport(self.task.promotionId)\r\n .then(function (link) {\r\n self.link = link;\r\n self.showSwalWithLink();\r\n });\r\n }\r\n\r\n self.showSwalWithLink = function () {\r\n swal({\r\n title: \"Reporte Generado!\",\r\n text: 'Haga click AQUÍ para descargar el archivo',\r\n confirmButtonText: \"Cerrar\",\r\n confirmButtonColor: \"#c2c2c2\",\r\n html: true\r\n });\r\n }\r\n\r\n function init() {\r\n promotionsService.tasks.startTask($stateParams.taskId);\r\n promotionsService.tasks.getTask($stateParams.taskId)\r\n .then(function (task) {\r\n self.task = task;\r\n });\r\n\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"addItemToLayoutCtrl\", function ($scope, $q, $filter, $window, $timeout, $rootScope, $state, $stateParams, promotionsService, homeService, authService, serverService, Upload, ngDialog) {\r\n\r\n const ART_PUBLICADO = 1;\r\n const ART_SUPLENTE = 2;\r\n const ART_SINUBICACION = 3;\r\n const ART_ALTERNATIVO = 6;\r\n\r\n var self = this;\r\n\r\n //Permissions\r\n self.canpublishValidacionFinal = authService.hasPermission('promotion_publish_validacionFinal');\r\n self.canpublishSubidaDePieza = authService.hasPermission('promotion_publish_SubidaDePiezaParaRevision');\r\n self.canpublishInputArmadoDePieza = authService.hasPermission('promotion_publish_InputArmadoPieza');\r\n self.canPublishSecondRevision = authService.hasPermission('promotion_publish_SegundaRevision');\r\n self.canPublishCargaArticulos = authService.hasPermission('promotion_publish_CargaInicialYPrimeraRevision');\r\n self.canDownloadPdfInFinalValidation = authService.hasPermission('promotion_edit_final_validation');\r\n self.isSuperUser = authService.hasPermission('promotion_superUser');\r\n self.disableMassiveCharges = false;\r\n self.userCategories = authService.authentication.categories;\r\n\r\n self.isLayoutCompare = false;\r\n self.isLayoutEditable = false;\r\n self.isItemEditEnabled = true;\r\n self.showRelatedItems = false;\r\n\r\n self.isActivationTask = false;\r\n\r\n //variants lookup\r\n self.itemLookupText = '';\r\n self.itemsInLookup = [];\r\n self.selectedItemInModal = null;\r\n var previousLookupText = '';\r\n\r\n self.variantsHaveLength = false;\r\n\r\n self.selectedPage = null;\r\n\r\n self.selectedPages = [];\r\n\r\n self.showAllitems = false;\r\n\r\n self.showIndividualItems = false;\r\n \r\n self.isLoading = true;\r\n\r\n self.promotionMediaPageTypes = promotionsService.promotionMediaPageTypes;\r\n\r\n self.promotion = {\r\n id: 0,\r\n name: '',\r\n pages: []\r\n };\r\n\r\n self.chats = [];\r\n\r\n self.showRelated = function (show) {\r\n self.showRelatedItems = show;\r\n }\r\n\r\n function ExportToExcel(tableHtml, worksheetName) {\r\n var uri = 'data:application/vnd.ms-excel;base64,',\r\n template = '{table}
',\r\n base64 = function (s) { return $window.btoa(unescape(encodeURIComponent(s))); },\r\n format = function (s, c) { return s.replace(/{(\\w+)}/g, function (m, p) { return c[p]; }) };\r\n\r\n var ctx = { worksheet: worksheetName, table: tableHtml },\r\n href = uri + base64(format(template, ctx));\r\n return href;\r\n }\r\n\r\n self.batchLoad = function () {\r\n\r\n //newScope.layout = self.layout;\r\n //newScope.selectedPage = self.selectedPage;\r\n //newScope.promotionMediaPageTypes = self.promotionMediaPageTypes;\r\n\r\n self.currentStep = 1;\r\n self.gridOptions = {\r\n columnDefs: [\r\n {\r\n headerName: 'Severidad',\r\n width: 100,\r\n pinned: 'left',\r\n field: 'severity',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n rowGroupIndex: 0,\r\n cellRenderer: function (params) {\r\n var severityName = '';\r\n switch (params.value) {\r\n case 'Information': { severityName = ' Info'; break; }\r\n case 'Warning': { severityName = ' Warn'; break; }\r\n case 'Error': { severityName = ' Error'; break; }\r\n }\r\n return severityName;\r\n }\r\n },\r\n {\r\n headerName: 'Fila',\r\n width: 50,\r\n pinned: 'left',\r\n field: 'row',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n {\r\n headerName: 'Categoria',\r\n width: 150,\r\n rowGroupIndex: 1,\r\n pinned: 'left',\r\n field: 'category',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n {\r\n headerName: 'Descripcion',\r\n width: 350,\r\n pinned: 'left',\r\n field: 'description',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n ],\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n rowHeight: 35,\r\n suppressHorizontalScroll: false,\r\n suppressCellSelection: true,\r\n groupUseEntireRow: true,\r\n groupSuppressAutoColumn: false,\r\n groupDefaultExpanded: 0,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n angularCompileRows: true,\r\n }\r\n\r\n self.showNextStep = function () {\r\n if (self.currentStep > 0 && self.currentStep < 4) {\r\n self.currentStep++;\r\n loadResults([]);\r\n }\r\n }\r\n\r\n function tildes_unicode(str) {\r\n\r\n str = str.replace(/á/g, \"á\");\r\n str = str.replace(/é/g, \"é\");\r\n str = str.replace(/í/g, \"í\");\r\n str = str.replace(/ó/g, \"ó\");\r\n str = str.replace(/ú/g, \"ú\");\r\n\r\n str = str.replace(/Á/g, \"Á\");\r\n str = str.replace(/É/g, \"É\");\r\n str = str.replace(/Í/g, \"Í\");\r\n str = str.replace(/Ó/g, \"Ó\");\r\n str = str.replace(/Ú/g, \"Ú\");\r\n\r\n str = str.replace(/ñ/g, \"ñ\");\r\n str = str.replace(/Ñ/g, \"Ñ\");\r\n return str;\r\n }\r\n\r\n self.downloadExcel = function () {\r\n var html = '';\r\n\r\n //header\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n\r\n angular.forEach($filter('orderBy')(self.layout.details, ['rowNumber', 'colNumber'], false), function (detail) {\r\n if (detail.position != null) {\r\n var existingItem = null;\r\n angular.forEach(self.selectedPage.items, function (item) {\r\n if (item.position == detail.position && item.promotionItemType < 5) {\r\n existingItem = item;\r\n }\r\n });\r\n\r\n html += buildRow(existingItem, detail);\r\n }\r\n });\r\n\r\n //agrego suplentes\r\n angular.forEach($filter('filter')(self.selectedPage.items, { promotionItemType: 2 }), function (item) {\r\n html += buildRow(item, null);\r\n });\r\n\r\n //agrego sin ubicación.\r\n angular.forEach($filter('filter')(self.selectedPage.items, { promotionItemType: 3 }), function (item) {\r\n html += buildRow(item, null);\r\n });\r\n\r\n html += '
Promocion IDArticuloUMVDescripcion SAPPaginaTipo de PaginaUbicacionTipo de UbicacionLayoutPrecioPrecio BonusPuntos BonusPrecio NormalPronostico Un.Articulos RelacionadosArticulos en FotoTipo de AnuncioTipo de Cobro
';\r\n\r\n var exportHref = ExportToExcel(html, 'Pagina1');\r\n $timeout(function () {\r\n location.href = exportHref;\r\n self.showNextStep();\r\n }, 100); // trigger download\r\n }\r\n\r\n function buildRow(existingItem, detail) {\r\n\r\n var html = '';\r\n\r\n if (existingItem != null && existingItem.promotionMechanicId == null && existingItem.promotionItemType < 4) { //Solo los que son items, elimino las mecanicas, relacionados y reservados del download\r\n var announceType = promotionsService.promotionMechanicAnnouncementTypes.find(function (x) { return x.id == existingItem.announceType; });\r\n var chargeType = promotionsService.promotionMechanicPaymentTypes.find(function (x) { return x.id == existingItem.chargeType; });\r\n var announceTypeLabel = announceType ? announceType.label : null;\r\n var chargeTypeLabel = chargeType ? chargeType.label : null;\r\n html += '' + $stateParams.promotionId +\r\n '' + existingItem.code.replace(/^0+/, '') +\r\n '' + (existingItem.uom || '') +\r\n '' + existingItem.description +\r\n '' + self.selectedPage.pageNumber +\r\n '' + self.promotionMediaPageTypes[self.selectedPage.promotionMediaPageType - 1].label +\r\n '' + (detail ? detail.position : existingItem.promotionItemType == 2 ? 0 : -1) +\r\n '' + (existingItem.promotionItemType == 2 ? 'Suplente' : existingItem.promotionItemType == 3 ? 'Sin ubicacion' : detail.isHighlighted ? 'Destacado' : 'Normal') +\r\n '' + self.layout.name +\r\n '' + (existingItem.promotionalPrice || '') +\r\n '' + (existingItem.loyaltyPrice || '') +\r\n '' + (existingItem.loyaltyPoints || '') +\r\n '' + (existingItem.normalPromotionPrice || '') +\r\n '' + (existingItem.forecast || '') +\r\n '' +//relacionados\r\n '' +//en foto\r\n '' + (announceTypeLabel || '') +\r\n '' + (chargeTypeLabel || '') +\r\n '';\r\n }\r\n else {\r\n var existingItemDescription = '';\r\n\r\n if (existingItem != null) {\r\n existingItemDescription = tildes_unicode(existingItem.description);\r\n }\r\n html += '' + $stateParams.promotionId +\r\n '' +\r\n '' +\r\n '' + '' + existingItemDescription + '' +\r\n '' + self.selectedPage.pageNumber +\r\n '' + self.promotionMediaPageTypes[self.selectedPage.promotionMediaPageType - 1].label +\r\n '' + (detail ? detail.position : 0) +\r\n '' + (detail ? (detail.isHighlighted ? 'Destacado' : 'Normal') : '') +\r\n '' + self.layout.name +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '';\r\n }\r\n\r\n return html;\r\n }\r\n\r\n self.uploadFile = function (files) {\r\n if (files && files.length > 0) {\r\n self.isBusy = true;\r\n var url = serverService.getApiUrl() + '/promotion/items/uploadItemsBatchFile/' + self.selectedPage.id;\r\n Upload.upload({\r\n url: url,\r\n data: { file: files[0] }\r\n }).then(function (response) {\r\n self.selectedPage.idloadItemToPosition\r\n var importerResults = response.data;\r\n processImporterResults(importerResults);\r\n if (!anyError(importerResults)) {\r\n self.finishedUpload = true;\r\n }\r\n });\r\n }\r\n }\r\n\r\n self.validateUploadedFile = function () {\r\n self.isBusy3 = true;\r\n promotionsService.items.validateItemsBatchFile(self.selectedPage.id)\r\n .then(function (dto) {\r\n if (dto.some(function (x) { return x.category == 'VDQ_PromotionItems_ReplaceItem'; })) {\r\n swal('ATENCIÓN', 'Se reemplazarán artículos ya cargados.', 'warning');\r\n }\r\n processImporterResults(dto);\r\n if (!anyError(dto)) {\r\n self.finishedValidation = true;\r\n }\r\n });\r\n\r\n }\r\n\r\n self.reUploadFile = function () {\r\n self.currentStep = 2;\r\n loadResults([]);\r\n self.files = null;\r\n self.finishedUpload = false;\r\n self.finishedValidation = false;\r\n self.finishedUpdate = false;\r\n }\r\n\r\n self.updateItems = function () {\r\n self.isBusy4 = true;\r\n promotionsService.items.updateItemsInBatch(self.selectedPage.id)\r\n .then(function (dto) {\r\n processImporterResults(dto);\r\n if (!anyError(dto)) {\r\n self.finishedUpdate = true;\r\n }\r\n });\r\n\r\n }\r\n\r\n self.finish = function () {\r\n self.currentStep = 1;\r\n loadResults([]);\r\n\r\n self.finishedUpload = false;\r\n self.finishedValidation = false;\r\n self.finishedUpdate = false;\r\n\r\n ngDialog.close();\r\n loadPromotion();\r\n }\r\n\r\n function processImporterResults(importerResults) {\r\n self.isBusy = false;\r\n self.isBusy2 = false;\r\n self.isBusy3 = false;\r\n self.isBusy4 = false;\r\n\r\n if (importerResults.length > 0) {\r\n loadResults(importerResults);\r\n }\r\n if (anyError(importerResults)) {\r\n self.error = true;\r\n }\r\n else\r\n self.error = false;\r\n }\r\n\r\n function loadResults(results) {\r\n self.gridOptions.api.setRowData(results);\r\n self.gridOptions.api.refreshView();\r\n\r\n self.gridVisible = results.length > 0 ? true : false;\r\n }\r\n\r\n function anyError(importerResults) {\r\n var error = false;\r\n for (var i = 0; i < importerResults.length; i++) {\r\n if (importerResults[i].severity === 'Error')\r\n error = true;\r\n }\r\n\r\n return error;\r\n }\r\n\r\n ngDialog.open({\r\n template: 'batchLoadDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n controller: function () {\r\n return self;\r\n },\r\n controllerAs: 'ct',\r\n });\r\n }\r\n\r\n self.batchLoadExhibitions = function () {\r\n\r\n self.currentStep = 1;\r\n self.gridOptions = {\r\n columnDefs: [\r\n {\r\n headerName: 'Severidad',\r\n width: 100,\r\n pinned: 'left',\r\n field: 'severity',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n rowGroupIndex: 0,\r\n cellRenderer: function (params) {\r\n var severityName = '';\r\n switch (params.value) {\r\n case 'Information': { severityName = ' Info'; break; }\r\n case 'Warning': { severityName = ' Warn'; break; }\r\n case 'Error': { severityName = ' Error'; break; }\r\n }\r\n return severityName;\r\n }\r\n },\r\n {\r\n headerName: 'Fila',\r\n width: 50,\r\n pinned: 'left',\r\n field: 'row',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n {\r\n headerName: 'Categoria',\r\n width: 150,\r\n rowGroupIndex: 1,\r\n pinned: 'left',\r\n field: 'category',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n {\r\n headerName: 'Descripcion',\r\n width: 350,\r\n pinned: 'left',\r\n field: 'description',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n ],\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n rowHeight: 35,\r\n suppressHorizontalScroll: false,\r\n suppressCellSelection: true,\r\n groupUseEntireRow: true,\r\n groupSuppressAutoColumn: false,\r\n groupDefaultExpanded: 0,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n angularCompileRows: true,\r\n }\r\n\r\n self.showNextStep = function () {\r\n if (self.currentStep > 0 && self.currentStep < 4) {\r\n self.currentStep++;\r\n loadResults([]);\r\n }\r\n }\r\n\r\n self.downloadExcelExhibitions = function () {\r\n\r\n promotionsService.items.getPromotionItemStores($stateParams.promotionId, self.selectedPage.pageNumber)\r\n .then(function (itemStores) {\r\n\r\n var html = '';\r\n\r\n //header\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n\r\n angular.forEach($filter('orderBy')(self.layout.details, ['rowNumber', 'colNumber'], false), function (detail) {\r\n if (detail.position != null) {\r\n var existingItem = null;\r\n angular.forEach(self.selectedPage.items, function (item) {\r\n if (item.position == detail.position && item.promotionItemType < 5) {\r\n existingItem = item;\r\n }\r\n });\r\n\r\n html += buildRowExhibition(existingItem, detail, itemStores);\r\n }\r\n });\r\n\r\n //agrego suplentes\r\n angular.forEach($filter('filter')(self.selectedPage.items, { promotionItemType: 2 }), function (item) {\r\n html += buildRowExhibition(item, null, itemStores);\r\n });\r\n\r\n //agrego sin ubicación.\r\n angular.forEach($filter('filter')(self.selectedPage.items, { promotionItemType: 3 }), function (item) {\r\n html += buildRowExhibition(item, null, itemStores);\r\n });\r\n\r\n html += '
Promocion IDArticuloUMVDescripcion SAPPaginaUbicacionTiendaCod ExhibicionCatalogar
';\r\n\r\n var exportHref = ExportToExcel(html, 'Pagina1');\r\n $timeout(function () {\r\n location.href = exportHref;\r\n self.showNextStep();\r\n }, 100); // trigger download\r\n\r\n });\r\n }\r\n\r\n function buildRowExhibition(existingItem, detail, itemStores) {\r\n\r\n var html = '';\r\n var storesForItem = [];\r\n\r\n if (existingItem != null && existingItem.promotionMechanicId == null && existingItem.promotionItemType < 4) { //Solo los que son items, elimino las mecanicas y reservados del download\r\n\r\n for (var i = 0; i < itemStores.length; i++) {\r\n if (itemStores[i].promotionItemId == existingItem.id) {\r\n storesForItem.push(itemStores[i]);\r\n }\r\n }\r\n\r\n for (var i = 0; i < storesForItem.length; i++) {\r\n\r\n html += '' + $stateParams.promotionId +\r\n '' + existingItem.code.replace(/^0+/, '') +\r\n '' + (existingItem.uom || '') +\r\n '' + existingItem.description +\r\n '' + self.selectedPage.pageNumber +\r\n '' + (detail ? detail.position : existingItem.promotionItemType == 2 ? 0 : -1) +\r\n '' + (storesForItem[i].storeCode || '') +\r\n '' + getExhibitionName(storesForItem[i].exhibitionTypeName) +\r\n '' + (storesForItem[i].toList ? 'SI' : 'NO' || '') +\r\n '';\r\n }\r\n\r\n }\r\n\r\n return html;\r\n }\r\n\r\n self.uploadFileExhibitions = function (files) {\r\n if (files && files.length > 0) {\r\n self.isBusy = true;\r\n var url = serverService.getApiUrl() + '/promotion/items/uploadItemExhibitionsBatchFile/' + self.selectedPage.id;\r\n Upload.upload({\r\n url: url,\r\n data: { file: files[0] }\r\n }).then(function (response) {\r\n self.selectedPage.id\r\n var importerResults = response.data;\r\n processImporterResults(importerResults);\r\n if (!anyError(importerResults)) {\r\n self.finishedUpload = true;\r\n }\r\n });\r\n }\r\n }\r\n\r\n self.validateUploadedFileExhibitions = function () {\r\n self.isBusy3 = true;\r\n promotionsService.items.validateItemExhibitionsBatchFile(self.selectedPage.id)\r\n .then(function (dto) {\r\n processImporterResults(dto);\r\n if (!anyError(dto)) {\r\n self.finishedValidation = true;\r\n }\r\n });\r\n\r\n }\r\n\r\n self.reUploadFileExhibitions = function () {\r\n self.currentStep = 2;\r\n loadResults([]);\r\n self.files = null;\r\n self.finishedUpload = false;\r\n self.finishedValidation = false;\r\n self.finishedUpdate = false;\r\n }\r\n\r\n self.updateExhibitions = function () {\r\n self.isBusy4 = true;\r\n promotionsService.items.updateItemExhibitionsInBatch(self.selectedPage.id)\r\n .then(function (dto) {\r\n processImporterResults(dto);\r\n if (!anyError(dto)) {\r\n self.finishedUpdate = true;\r\n }\r\n });\r\n\r\n }\r\n\r\n self.finishExhibitions = function () {\r\n self.currentStep = 1;\r\n loadResults([]);\r\n\r\n self.finishedUpload = false;\r\n self.finishedValidation = false;\r\n self.finishedUpdate = false;\r\n\r\n ngDialog.close();\r\n loadPromotion();\r\n }\r\n\r\n function getExhibitionName(exhibition) {\r\n if (exhibition == \"CABECERASALTAS\")\r\n return \"CABECERAS ALTAS\";\r\n if (exhibition == \"CABECERASTOCADOR\")\r\n return \"CABECERAS TOCADOR\";\r\n if (exhibition == \"CABECERASPASILLO\")\r\n return \"CABECERAS PASILLO\";\r\n if (exhibition == \"CABECERASLICORES\")\r\n return \"CABECERAS LICORES\";\r\n if (exhibition == \"CABECERASDEFRIO\")\r\n return \"CABECERAS DE FRIO\";\r\n if (exhibition == \"LATERALES\")\r\n return \"LATERALES\";\r\n if (exhibition == \"EXHIBIDORESDEPIE\")\r\n return \"EXHIBIDORES DE PIE\";\r\n if (exhibition == \"VISICOOLERGRANDES\")\r\n return \"VISICOOLER GRANDES\";\r\n if (exhibition == \"VISICOOLERCHICOS\")\r\n return \"VISICOOLER CHICOS\";\r\n if (exhibition == \"FASTLINE\")\r\n return \"FAST LINE\";\r\n if (exhibition == \"VENTACRUZADAGANCHOS\")\r\n return \"VENTA CRUZADA - GANCHOS\";\r\n if (exhibition == \"VENTACRUZADADISPENSADOR\")\r\n return \"VENTA CRUZADA - DISPENSADOR\";\r\n if (exhibition == \"VENTACRUZADASCOOLER\")\r\n return \"VENTA CRUZADA - S/COOLER\";\r\n if (exhibition == \"MINICABECERAS\")\r\n return \"MINI CABECERAS\";\r\n if (exhibition == \"MESADECARGA\")\r\n return \"MESA DE CARGA\";\r\n if (exhibition == \"ISLA\")\r\n return \"ISLA\";\r\n if (exhibition == \"COLUMNA\")\r\n return \"COLUMNA\";\r\n if (exhibition == \"FILAUNICA\")\r\n return \"FILA UNICA\";\r\n if (exhibition == \"FILAUNICAZONAFRONTAL\")\r\n return \"FILA UNICA ZONA FRONTAL\";\r\n if (exhibition == \"BTL\")\r\n return \"BTL\";\r\n else\r\n return '';\r\n }\r\n\r\n function processImporterResults(importerResults) {\r\n self.isBusy = false;\r\n self.isBusy2 = false;\r\n self.isBusy3 = false;\r\n self.isBusy4 = false;\r\n\r\n if (importerResults.length > 0) {\r\n loadResults(importerResults);\r\n }\r\n if (anyError(importerResults)) {\r\n self.error = true;\r\n }\r\n else\r\n self.error = false;\r\n }\r\n\r\n function loadResults(results) {\r\n self.gridOptions.api.setRowData(results);\r\n self.gridOptions.api.refreshView();\r\n\r\n self.gridVisible = results.length > 0 ? true : false;\r\n }\r\n\r\n function anyError(importerResults) {\r\n var error = false;\r\n for (var i = 0; i < importerResults.length; i++) {\r\n if (importerResults[i].severity === 'Error')\r\n error = true;\r\n }\r\n\r\n return error;\r\n }\r\n\r\n ngDialog.open({\r\n template: 'batchLoadDialogExhibitions',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n controller: function () {\r\n return self;\r\n },\r\n controllerAs: 'ct',\r\n });\r\n }\r\n\r\n self.openChat = function (pageId) {\r\n //busca la pagina y abre el dialog\r\n angular.forEach(self.promotion.pages, function (p, index) {\r\n if (p.id === pageId) {\r\n\r\n self.indexOfPageOnChat = index;\r\n }\r\n\r\n });\r\n\r\n\r\n ngDialog.open({\r\n template: 'chatDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: $scope\r\n });\r\n }\r\n\r\n\r\n self.swapPositions = function () {\r\n var newScope = $scope.$new();\r\n newScope.promotionMediaPageId = self.selectedPage.id;\r\n newScope.itemFrom = 0;\r\n newScope.itemTo = 0;\r\n\r\n newScope.saveSwapping = function (itemFrom, itemTo) {\r\n if (itemFrom <= 0 || itemTo <= 0 || itemFrom == null || itemTo == null || itemFrom > self.selectedPage.totalPositions || itemTo > self.selectedPage.totalPositions) {\r\n swal(\"Error\", \"Alguna de las posiciones es incorrecta\", \"error\");\r\n }\r\n else {\r\n promotionsService.items.swapPositions(newScope.promotionMediaPageId, itemFrom, itemTo)\r\n .then(function (rv) {\r\n if (rv == \"OK\") {\r\n init();\r\n swal(\"Cambiado!\", \"Se cambiaron correctamente las posiciones\", \"success\");\r\n }\r\n else\r\n swal(\"Error\", rv, \"error\");\r\n\r\n ngDialog.close();\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de borrado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al borrar este item\", \"error\");\r\n }\r\n });\r\n }\r\n }\r\n ngDialog.open({\r\n template: 'swapItemsDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n\r\n }\r\n\r\n self.publishItem = function (itemId) {\r\n console.log('addItemToLayoutController::publishItem')\r\n var newScope = $scope.$new();\r\n newScope.promotionMediaPageId = self.selectedPage.id;\r\n newScope.positionTo = 0;\r\n newScope.saveSwapping = function (positionTo) {\r\n if (positionTo <= 0 || positionTo == null || positionTo > self.selectedPage.totalPositions) {\r\n swal(\"Error\", \"La posicion destino es incorrecta\", \"error\");\r\n }\r\n else {\r\n promotionsService.items.publishItem(newScope.promotionMediaPageId, itemId, positionTo, self.layoutPreviewGrid[positionTo - 1] != null ? self.layoutPreviewGrid[positionTo - 1].isHighlighted : false)\r\n .then(function (rv) {\r\n if (rv == \"OK\") {\r\n loadPromotion();\r\n swal(\"Cambiado!\", \"Se cambiaron correctamente las posiciones\", \"success\");\r\n }\r\n else\r\n swal(\"Error\", rv, \"error\");\r\n\r\n ngDialog.close();\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de intercambio continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al intercambiar estos items\", \"error\");\r\n }\r\n });\r\n }\r\n }\r\n\r\n ngDialog.open({\r\n template: 'publishItemDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n\r\n }\r\n\r\n self.gotoEditOptionalItem = function (promotionItemType, promotionItemId) {\r\n self.setPageInLocalStorage(self.selectedPage.id);\r\n var newScope = $scope.$new();\r\n newScope.promotionMediaPageId = self.selectedPage.id;\r\n newScope.taskId = $stateParams.taskId;\r\n newScope.isSubstitute = promotionItemType == ART_SUPLENTE;\r\n newScope.isHighlighted = false;\r\n newScope.promotionId = $stateParams.promotionId;\r\n newScope.promotionItemId = promotionItemId;\r\n newScope.promotionItemType = promotionItemType;\r\n\r\n $state.go('promotions.editItem', { promotionMediaPageId: newScope.promotionMediaPageId, taskId: newScope.taskId, position: 0, isHighlighted: newScope.isHighlighted, isSubstitute: newScope.isSubstitute, promotionItemId: newScope.promotionItemId, promotionId: newScope.promotionId, promotionItemType: promotionItemType });\r\n }\r\n\r\n self.removeItem = function (itemId) {\r\n\r\n swal({\r\n title: 'Esta seguro que desea eliminar el item del layout?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n promotionsService.items.deletePromotionItem(itemId)\r\n .then(function (isOk) {\r\n swal('Item Eliminado!', 'El item ha sido removido con exito.', 'success');\r\n //posicion del layout borrada\r\n var position = 0;\r\n self.selectedPage.items.forEach(function (item) { if (item.id == itemId) { position = item.position; } });\r\n //cantidad de items a borrar\r\n var toDeleteCount = 0;\r\n self.selectedPage.items.forEach(function (item) { if (item.position == position) { toDeleteCount++; } });\r\n\r\n while (toDeleteCount > 0) {\r\n self.selectedPage.items.forEach(function (item, index) { if (item.position == position) { self.selectedPage.items.splice(index, 1); toDeleteCount--; } });\r\n }\r\n\r\n loadPromotion();\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de borrado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al borrar este item\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n\r\n\r\n }\r\n self.removeItemOfList = function (item) {\r\n\r\n swal({\r\n title: 'Esta seguro que desea eliminar el item del layout?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n promotionsService.items.deletePromotionItem(item.id)\r\n .then(function (isOk) {\r\n swal('Item Eliminado!', 'El item ha sido removido con exito.', 'success');\r\n\r\n self.selectedPage.items.splice(self.selectedPage.items.indexOf(item), 1);\r\n self.variantsHaveLength = false;\r\n self.selectedPage.items.forEach(function (i) { if (i.promotionItemType == 5) { self.variantsHaveLength = true; } });\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de borrado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al borrar este item\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.categoriesCaptains = [];\r\n self.categoriesSecondaries = [];\r\n\r\n self.layouts = [];\r\n\r\n self.layout = {\r\n id: 0,\r\n companyId: 0,\r\n name: '',\r\n description: '',\r\n rows: 0,\r\n columns: 0,\r\n backgroundImageUrl: '',\r\n details: []\r\n };\r\n\r\n self.layoutPreviewGrid = [];\r\n\r\n self.publish = function () {\r\n if ($stateParams.taskId && (AllLoaded() || self.promotion.promotionType == 'Interna')) {\r\n\r\n //1.Busco la tarea\r\n var task = null;\r\n angular.forEach(self.promotion.tasks, function (t) {\r\n if (t.id == $stateParams.taskId)\r\n task = t;\r\n });\r\n\r\n var canPublishTask = false;\r\n var taskName = task.name.split(\"(\")[0].trim();//evito comparar tareas repetidas las cuales llevan (#nroDeRepeticion)\r\n\r\n //2.Me fijo si puedo publicar esa tarea con mi perfil/permiso\r\n if (taskName == 'Validación final' && self.canpublishValidacionFinal)\r\n canPublishTask = true;\r\n if ((taskName == '1° Subida de Pieza para revisión' || taskName == '2° Subida de Pieza para revisión' || taskName == '3° Subida de Pieza para revisión') && self.canpublishSubidaDePieza)\r\n canPublishTask = true;\r\n if ((taskName == '1° Input para armado de Pieza' || taskName == '2° Input para armado de Pieza' || taskName == '3° Input para armado de Pieza') && self.canpublishInputArmadoDePieza)\r\n canPublishTask = true;\r\n if (taskName == '2° Revisión Comercial' && self.canPublishSecondRevision)\r\n canPublishTask = true;\r\n if ((taskName == 'Carga Inicial' || taskName == '1° Revisión Comercial') && self.canPublishCargaArticulos)\r\n canPublishTask = true;\r\n\r\n\r\n //3.Publico la tarea\r\n if (canPublishTask) {\r\n promotionsService.tasks.publishTask($stateParams.taskId, self.selectedPage.id)\r\n .then(function (task) {\r\n if (task.effectiveEndedDate && task.effectiveEndedDate != null)\r\n swal('Tarea Publicada!', 'La tarea se ha publicado exitosamente', 'success');\r\n else {\r\n swal('Pagina Publicada!', 'La pagina se ha publicado exitosamente', 'success');\r\n }\r\n\r\n $state.go('promotions.myTasks');\r\n });\r\n }\r\n else\r\n swal('Error!', 'No tiene el perfil o los permisos para publicar esta tarea', 'error');\r\n\r\n } else {\r\n $timeout(function () {\r\n swal(\"Error\", \"layout incompleto\", \"error\");\r\n }, 100);\r\n }\r\n }\r\n\r\n function AllLoaded() {\r\n\r\n var publishedItemsCount = 0;\r\n\r\n angular.forEach(self.selectedPage.items, function (i) {\r\n if (i.promotionItemType == 0 || i.promotionItemType == 1 || i.promotionItemType == 4) //Destacado, Publicado, Reservado\r\n publishedItemsCount++;\r\n });\r\n\r\n if (publishedItemsCount < GetLayuotLenghtAvailable(self.selectedPage.promotionMediaPageLayoutId))\r\n return false;\r\n else\r\n return true;\r\n }\r\n\r\n function GetLayuotLenghtAvailable(layoutId) {\r\n for (var i = 0; i < self.layouts.length; i++) {\r\n if (self.layouts[i].id == layoutId) {\r\n self.layout = self.layouts[i];\r\n break;\r\n }\r\n }\r\n var len = 0;\r\n for (var i = 0; i < self.layout.details.length; i++) {\r\n if (self.layout.details[i].position != null)\r\n len++;\r\n }\r\n return len;\r\n }\r\n\r\n self.canPublish = function () {\r\n if ($stateParams.taskId && parseInt($stateParams.taskId) > 0)\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n self.uploadPageImage = function (file, errFiles) {\r\n\r\n if (file) {\r\n\r\n var url = ian.urlCombine(serverService.getApiUrl(), '/promotion/promotions/uploadPageImage/' + self.selectedPage.id);\r\n\r\n self.uploadingPageImage = true;\r\n\r\n Upload.upload({\r\n url: url,\r\n data: { file: file }\r\n }).then(function (response) {\r\n $timeout(function () {\r\n self.uploadingPageImage = false;\r\n self.selectedPage.imageUrl = response.data;\r\n swal('Pieza subida con exito', 'Se ha actualizado la imagen de pieza a publicar.', 'success');\r\n });\r\n }, function (response) {\r\n self.uploadingPageImage = false;\r\n if (response.status > 0)\r\n $scope.errorMsg = response.status + ': ' + response.data;\r\n });\r\n }\r\n else if (errFiles && errFiles[0]) {\r\n var file = errFiles[0];\r\n\r\n var allowedSize = file.$errorParam;\r\n var size = (file.size / 1024).toFixed(0);\r\n\r\n swal('Imagen no valida', ian.format('El archivo {0} pesa {1}KB y el peso máximo permitido es: {2}', file.name, size, allowedSize), 'error');\r\n }\r\n }\r\n\r\n self.uploadMultiplePageImage = function (files, errFiles) {\r\n console.log('uploadMultiplePageImage:: files %o', files)\r\n if (files.length > 0) {\r\n\r\n var imgSizeMax = files.filter(function (img) {\r\n return img.size > 4194304;\r\n })\r\n\r\n var imgs = files.filter(function (img) {\r\n var limit = img.name.indexOf('.');\r\n var imgName = img.name.substring(0, limit)\r\n return self.selectedPages.find(function (page) { return page.pageNumber.toString() === imgName })\r\n })\r\n \r\n var imgNamesArr = [];\r\n imgs.forEach(function (img) {\r\n var limit = img.name.indexOf('.');\r\n var imgName = img.name.substring(0, limit)\r\n imgNamesArr.push(imgName);\r\n })\r\n\r\n var promises = [];\r\n\r\n if (files.length <= self.selectedPages.length) {\r\n for (var cont = 0; cont < imgs.length; cont++) {\r\n\r\n var page = self.selectedPages.find(function (page) { return page.pageNumber.toString() === imgNamesArr[cont] })\r\n\r\n var url = ian.urlCombine(serverService.getApiUrl(), '/promotion/promotions/uploadPageImage/' + page.id);\r\n\r\n self.uploadingPageImage = true;\r\n\r\n promises.push(\r\n Upload.upload({\r\n url: url,\r\n data: { file: imgs[cont] }\r\n }));\r\n }\r\n\r\n if (promises.length === imgs.length) {\r\n $q.all(promises)\r\n .then(function (data) {\r\n $timeout(function () {\r\n\r\n data.forEach(function (response, index) {\r\n self.uploadingPageImage = false;\r\n var fileName = response.data.substring(response.data.lastIndexOf('/') + 1);\r\n var pageNumber = fileName.split('-')[1];\r\n page = self.selectedPages.find(function (page) { return page.pageNumber.toString() === pageNumber });\r\n page.imageUrl = response.data;\r\n\r\n if (imgs.length === self.selectedPages.length && imgSizeMax.length === 0) {\r\n $timeout(function () {\r\n swal('Piezas subida con exito', 'Se han actualizado las imagenes de pieza a publicar.', 'success');\r\n });\r\n } else if (imgs.length === self.selectedPages.length && imgSizeMax.length > 0) {\r\n $timeout(function () {\r\n swal('Imagen no valida', ian.format('El archivo {0} pesa {1}KB y el peso máximo permitido es: {2}', imgSizeMax[0].name, imgSizeMax[0].size, 4194304), 'error');\r\n });\r\n } else {\r\n $timeout(function () {\r\n swal('Algunas piezas se han subido con exito', 'Existen paginas por asignacion de piezas', 'success');\r\n });\r\n }\r\n });\r\n });\r\n }, function (response) {\r\n self.uploadingPageImage = false;\r\n if (response.status > 0)\r\n $scope.errorMsg = response.status + ': ' + response.data;\r\n });\r\n }\r\n } else {\r\n swal('Esta ingresando un numero de archivos correspondientes mayor al numero de paginas existentes.', 'Por favor intente nuevamente.', 'error');\r\n }\r\n } else if (errFiles && errFiles[0]) {\r\n var file = errFiles[0];\r\n\r\n var allowedSize = file.$errorParam;\r\n var size = (file.size / 1024).toFixed(0);\r\n\r\n swal('Imagen no valida', ian.format('El archivo {0} pesa {1}KB y el peso máximo permitido es: {2}', file.name, size, allowedSize), 'error');\r\n }\r\n }\r\n\r\n self.print = function () {\r\n self.showAllitems = false;\r\n if (self.canpublishInputArmadoDePieza)\r\n $window.print();\r\n }\r\n\r\n self.printAll = function () {\r\n console.log('printAll');\r\n self.showIndividualItems = false;\r\n\r\n self.selectPage(self.selectedPages[0])\r\n self.showAllitems = true;\r\n\r\n setTimeout(function () {\r\n if (self.canpublishInputArmadoDePieza)\r\n $window.print();\r\n\r\n self.selectIndividualPage(self.selectedPages[0]);\r\n }, 2000)\r\n\r\n }\r\n\r\n self.isValidating = false;\r\n self.isValidated = false;\r\n\r\n var categories = [];\r\n\r\n self.positionInLayout = 0;\r\n\r\n self.editItemWhitoutPosition = function (promotionItemId, salesUnitOfMeasureId, isSubstitute) {\r\n if (promotionItemId && promotionItemId != 0 && !self.isActivationTask) {\r\n var itemType = isSubstitute ? ART_SUPLENTE : ART_SINUBICACION;\r\n $state.go('promotions.editItem', { promotionMediaPageId: self.selectedPage.id, taskId: $stateParams.taskId, position: 0, isHighlighted: false, isSubstitute: isSubstitute, promotionItemId: promotionItemId, promotionId: $stateParams.promotionId, promotionItemType: itemType, salesUnitOfMeasureId: salesUnitOfMeasureId });\r\n }\r\n }\r\n\r\n self.loadItemToPosition = function (position, isHighlighted, promotionItemId, promotionMechanicId, salesUnitOfMeasureId, isReserved) {\r\n\r\n self.positionInLayout = position;\r\n\r\n if (promotionMechanicId && promotionMechanicId != 0) {//es mecanica(edicion normal)\r\n if (!self.isActivationTask) {//no es activacion\r\n $state.go('promotions.editMechanic', { promotionMediaPageId: self.selectedPage.id, taskId: $stateParams.taskId, position: position, isHighlighted: isHighlighted, isSubstitute: false, promotionItemId: promotionItemId, promotionMechanicId: promotionMechanicId, promotionId: $stateParams.promotionId });\r\n }\r\n else {//es activacion (edicion de codigo pangui)\r\n $state.go('promotions.editMechanic', { promotionMediaPageId: self.selectedPage.id, taskId: $stateParams.taskId, position: position, isHighlighted: isHighlighted, isSubstitute: false, promotionItemId: promotionItemId, promotionMechanicId: promotionMechanicId, promotionId: $stateParams.promotionId, isEditPanguiCode: true });\r\n }\r\n }\r\n else\r\n if (isReserved) {\r\n //TODO: por ahora no hacer nada, luego si hay un item, agregar un comentario.\r\n }\r\n else {\r\n if (promotionItemId && promotionItemId != 0 && !self.isActivationTask) {//activacion no puede editar item\r\n $state.go('promotions.editItem', { promotionMediaPageId: self.selectedPage.id, taskId: $stateParams.taskId, position: position, isHighlighted: isHighlighted, isSubstitute: false, promotionItemId: promotionItemId, promotionId: $stateParams.promotionId, promotionItemType: ART_PUBLICADO, salesUnitOfMeasureId: salesUnitOfMeasureId });\r\n }\r\n else if (!self.isActivationTask && !self.isLayoutForReview && !self.isLayoutCompare && !self.isLayoutImageUpload && !self.isFinalValidation) {\r\n //Abro el Dialog para seleccionar Precio Producto o Mecánica\r\n //TODO: si ya tengo seleccionado un Precio Producto y quiero cambiar a una mecánica tengo que tener la posibilidad de quitar lo que hay para que me abra este dialog\r\n var newScope = $scope.$new();\r\n newScope.promotionMediaPageId = self.selectedPage.id;\r\n newScope.taskId = $stateParams.taskId;\r\n newScope.position = position;\r\n newScope.isHighlighted = isHighlighted;\r\n newScope.promotionId = $stateParams.promotionId;\r\n newScope.promotionItemId = promotionItemId;\r\n newScope.promotionMechanicId = promotionMechanicId;\r\n newScope.promotionItemType = ART_PUBLICADO;\r\n\r\n newScope.goToEditItem = function () {//nuevo item\r\n self.setPageInLocalStorage(self.selectedPage.id);\r\n $state.go('promotions.editItem', { promotionMediaPageId: newScope.promotionMediaPageId, taskId: newScope.taskId, position: newScope.position, isHighlighted: newScope.isHighlighted, isSubstitute: false, promotionItemId: newScope.promotionItemId, promotionId: newScope.promotionId, promotionItemType: ART_PUBLICADO, salesUnitOfMeasureId: salesUnitOfMeasureId });\r\n ngDialog.close();\r\n }\r\n\r\n newScope.goToEditMechanic = function () {//nueva mecanica\r\n self.setPageInLocalStorage(self.selectedPage.id);\r\n $state.go('promotions.editMechanic', { promotionMediaPageId: newScope.promotionMediaPageId, taskId: newScope.taskId, position: newScope.position, isHighlighted: newScope.isHighlighted, isSubstitute: false, promotionItemId: newScope.promotionItemId, promotionMechanicId: newScope.promotionMechanicId, promotionId: newScope.promotionId });\r\n ngDialog.close();\r\n }\r\n\r\n //Agregar items reservados.\r\n newScope.addReserved = function () {\r\n self.setPageInLocalStorage(self.selectedPage.id);\r\n var reservedScope = $scope.$new();\r\n\r\n reservedScope.itemDescription = '';\r\n reservedScope.itemChat = '';\r\n reservedScope.promotionMediaPageId = newScope.promotionMediaPageId;\r\n reservedScope.isHighlighted = newScope.isHighlighted;\r\n reservedScope.position = newScope.position;\r\n\r\n\r\n reservedScope.saveReserved = function (description) {\r\n reservedScope.adding = true;\r\n promotionsService.items.saveReservedItem(reservedScope.promotionMediaPageId, reservedScope.position, reservedScope.isHighlighted, description)\r\n .then(function (item) {\r\n if (item.id != 0)\r\n swal('Listo!', 'item agregado', 'success');\r\n else swal('Error', 'no se pudo agregar el item', 'error');\r\n\r\n loadPromotion();\r\n reservedScope.adding = false;\r\n ngDialog.close();\r\n },\r\n function () {\r\n reservedScope.adding = false;\r\n ngDialog.close();\r\n });\r\n }\r\n\r\n reservedScope.cancelReserved = function () {\r\n ngDialog.close();\r\n }\r\n\r\n ngDialog.open({\r\n template: 'loadReservedDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: reservedScope\r\n });\r\n }\r\n\r\n ngDialog.open({\r\n template: 'promotionItemTypeDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Abre un dialog con un listado de promotionItems \r\n * @param {any} position posicion del layout\r\n * @param {any} isMechanic true si es mecanica, false si es precio producto\r\n */\r\n self.openAlternativeItemsDialog = function (position, isMechanic) {\r\n var newScope = $scope.$new();\r\n\r\n newScope.position = position;\r\n newScope.isMechanic = isMechanic;\r\n\r\n newScope.filterItems = function (i) {\r\n return i.position == position && (i.promotionMechanicId && isMechanic || !i.promotionMechanicId && !isMechanic) && i.promotionItemType == 6;\r\n }\r\n\r\n newScope.edit = function (item) {\r\n if (item.itemId) {\r\n $state.go('promotions.editItem', { promotionMediaPageId: self.selectedPage.id, taskId: $stateParams.taskId, position: position, promotionItemId: item.id, promotionId: $stateParams.promotionId, promotionItemType: ART_ALTERNATIVO, salesUnitOfMeasureId: item.salesUnitOfMeasureId });\r\n }\r\n else if (item.promotionMechanicId) {\r\n if (self.isActivationTask) {\r\n $state.go('promotions.editMechanic', { promotionMediaPageId: self.selectedPage.id, taskId: $stateParams.taskId, position: position, promotionItemId: item.id, promotionMechanicId: item.promotionMechanicId, promotionId: $stateParams.promotionId, promotionItemType: ART_ALTERNATIVO, isEditPanguiCode: true });\r\n }\r\n else {\r\n $state.go('promotions.editMechanic', { promotionMediaPageId: self.selectedPage.id, taskId: $stateParams.taskId, position: position, promotionItemId: item.id, promotionMechanicId: item.promotionMechanicId, promotionId: $stateParams.promotionId, promotionItemType: ART_ALTERNATIVO });\r\n }\r\n }\r\n ngDialog.close();\r\n }\r\n\r\n ngDialog.open({\r\n template: 'alternativeItemsDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n }\r\n\r\n /**\r\n * Dialog con opcion de agregar otro item a una posicion, ya sea relacionado o alternativo*/\r\n self.openAddItemDialog = function (position, promotionItemId, isHighlighted) {\r\n if (promotionItemId && !self.isActivationTask && !self.isLayoutForReview && !self.isLayoutCompare && !self.isLayoutImageUpload && !self.isFinalValidation) {\r\n var newScope = $scope.$new();\r\n newScope.position = position;\r\n newScope.promotionItemId = promotionItemId;\r\n\r\n newScope.goToAddItem = function () {\r\n self.setPageInLocalStorage(self.selectedPage.id);\r\n $state.go('promotions.editItem', { promotionMediaPageId: self.selectedPage.id, taskId: $stateParams.taskId, position: position, isHighlighted: isHighlighted, promotionId: $stateParams.promotionId, promotionItemType: ART_ALTERNATIVO });\r\n ngDialog.close();\r\n }\r\n\r\n newScope.goToAddMechanic = function () {\r\n self.setPageInLocalStorage(self.selectedPage.id);\r\n $state.go('promotions.editMechanic', { promotionMediaPageId: self.selectedPage.id, taskId: $stateParams.taskId, position: position, isHighlighted: isHighlighted, promotionId: $stateParams.promotionId, promotionItemType: ART_ALTERNATIVO });\r\n ngDialog.close();\r\n }\r\n\r\n ngDialog.open({\r\n template: 'addItemDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n }\r\n }\r\n\r\n self.loadVariant = function (position, promotionItemId) {\r\n\r\n self.positionInLayout = position;\r\n\r\n if (promotionItemId && promotionItemId != 0 && !self.isActivationTask && !self.isLayoutForReview && !self.isLayoutCompare && !self.isLayoutImageUpload && !self.isFinalValidation) {\r\n var newScope = $scope.$new();\r\n\r\n newScope.saveItem = function () {\r\n\r\n promotionsService.items.savePromotionVariantItem(self.selectedItemInModal.id, promotionItemId, self.selectedItemInModal.saleUnitOfMeasureId)\r\n .then(function (variantItem) {//por ahora no esta siendo necesario que me devuelva este dto\r\n loadPromotion();\r\n });\r\n self.itemLookupText = null;\r\n\r\n ngDialog.close();\r\n }\r\n\r\n ngDialog.open({\r\n template: 'loadVariantDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * /Agrega un item alternativo a una posicion del layout \r\n * @param {any} position\r\n * @param {any} promotionItemId\r\n */\r\n //self.addItem = function (position, promotionItemId) {\r\n\r\n //}\r\n\r\n $scope.$watch('ct.itemLookupText', function (newVal, oldVal) {\r\n if (newVal) {\r\n\r\n if (newVal.id) {\r\n self.selectedItemInModal = self.itemLookupText;\r\n }\r\n else if (newVal && newVal != oldVal && (newVal.length >= 4 || (oldVal.length && oldVal.length > 3)) && newVal != previousLookupText) {\r\n previousLookupText = newVal;\r\n\r\n self.itemsInLookup = [{ id: 0, code: '', name: 'Cargando Items con el texto ' + newVal + '...' }];\r\n var lookupParameter = { searchTerm: newVal, categoryIds: self.selectedPage.secondaryCategoriesIds.concat(self.selectedPage.mainCategoryId) };\r\n homeService.lookups.itemsLookup(lookupParameter)\r\n .then(function (items) {\r\n self.itemsInLookup = items;\r\n if (items.length > 0)\r\n self.lookupItemsNoResults = false;\r\n else\r\n self.lookupItemsNoResults = true;\r\n });\r\n }\r\n }\r\n\r\n }, true);\r\n\r\n self.hideExcludedStoresPostion = function (item) {\r\n var rv = true;\r\n item.stores.forEach(function (s) {\r\n if (!s.isListed && !s.toList)\r\n rv = false;\r\n });\r\n return rv;\r\n }\r\n\r\n self.canEnterPage = function (page) {\r\n var rv = false;\r\n\r\n if (page.publishedDate == null) { //Solo analizo la categoria si la pagina no fue publicada. si fue publicada no la muestro para entrar.\r\n angular.forEach(self.userCategories, function (catId) {\r\n if (page.subCategoryIds.indexOf(parseInt(catId)) > -1) {\r\n rv = true;\r\n }\r\n });\r\n }\r\n\r\n //SuperUser or all categories\r\n if (self.userCategories.length == 0)\r\n rv = true;\r\n\r\n return rv;\r\n }\r\n\r\n self.checkSelectedPages = function (page) {\r\n var ret = false;\r\n if (self.selectedPages.length > 0) {\r\n self.selectedPages.forEach(function (item) {\r\n if (item.id === page.id) {\r\n ret = true\r\n }\r\n })\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n self.setPageInLocalStorage = function (id) {\r\n var pageId = { 'pageId': id }\r\n localStorage.setItem('idDeLaPagina', JSON.stringify(pageId));\r\n }\r\n\r\n function getPageId() {\r\n if (localStorage.getItem('idDeLaPagina') != null) {\r\n var objPageIdAux = localStorage.getItem('idDeLaPagina');\r\n var objPageId = JSON.parse(objPageIdAux);\r\n var pageId = objPageId.pageId;\r\n angular.forEach(self.promotion.pages, function (page) {\r\n if (page.id == pageId) {\r\n self.selectIndividualPage(page);\r\n }\r\n });\r\n }\r\n localStorage.removeItem(\"idDeLaPagina\");\r\n }\r\n\r\n self.selectIndividualPage = function (page) {\r\n self.showAllitems = false;\r\n self.showIndividualItems = true\r\n self.selectPage(page);\r\n\r\n if (!$scope.$$phase) {\r\n $scope.$apply();\r\n }\r\n }\r\n\r\n self.selectPage = function (page) {\r\n\r\n if (!self.isSuperUser && page != null && page.publishedDate != null && !self.isActivationTask) //Si la pagina fue publicada, le tiro un swal indicando que no puede ingresar, sino ingreso\r\n swal('Pagina Publicada', 'Esta pagina ya fue publicada, por lo tanto no se puede acceder a ella.', 'error');\r\n else {\r\n if (self.canEnterPage(page)) {\r\n self.showExcludedStores = false;\r\n if (self.selectedPage == null || page) {\r\n\r\n var pageToSelect = null;\r\n angular.forEach(self.promotion.pages, function (pp) {\r\n if (pp.pageNumber == page.pageNumber)\r\n pageToSelect = pp;\r\n });\r\n self.selectedPage = pageToSelect;\r\n\r\n if (self.selectedPage.items && self.selectedPage.items.length > 0) {\r\n self.selectedPage.items.forEach(function (i) {\r\n if (i.promotionItemType == 5)\r\n self.variantsHaveLength = true;\r\n\r\n if (i.promotionItemType == 0 || i.promotionItemType == 1) {\r\n angular.forEach(i.stores, function (s) {\r\n if (!s.isListed && !s.toList)\r\n self.showExcludedStores = true;\r\n });\r\n }\r\n });\r\n }\r\n\r\n if (self.selectedPage.promotionMediaPageLayoutId != 0) {\r\n\r\n self.showPreview(self.selectedPage.promotionMediaPageLayoutId);\r\n }\r\n }\r\n }\r\n }\r\n //}\r\n }\r\n\r\n self.showPreview = function (layoutId) {\r\n console.log('addItemToLayoutController::showPreview')\r\n\r\n for (i = 0; i < self.layouts.length; i++) {\r\n if (self.layouts[i].id == layoutId) {\r\n self.layout = self.layouts[i];\r\n\r\n if (self.showAllitems && $('.showAllitems').is(':visible') || self.showIndividualItems && $('.showIndividualItems').is(':visible')) {\r\n $rootScope.$broadcast('refreshLayoutTable', {});\r\n break;\r\n } else {\r\n setTimeout(function () { $rootScope.$broadcast('refreshLayoutTable', {}); }, 1)\r\n }\r\n\r\n }\r\n }\r\n }\r\n\r\n\r\n function createPages() {\r\n for (var i = 0; i < self.promotion.numberOfPages; i++) {\r\n var exist = false;\r\n angular.forEach(self.promotion.pages, function (page) {\r\n if (page.pageNumber == i + 1)\r\n exist = true;\r\n });\r\n if (!exist) {\r\n var page = {\r\n promotionId: self.promotion.id,\r\n promotionMediaPageLayoutId: 0,\r\n pageNumber: i + 1,\r\n promotionMediaPageType: i == 0 ? 1 : (i + 1 == self.promotion.numberOfPages ? 2 : 3),\r\n mainCategoryId: 0,\r\n secondaryCategoriesIds: [],\r\n items: []\r\n };\r\n\r\n self.promotion.pages.splice(i, 0, page);\r\n }\r\n }\r\n }\r\n\r\n function loadPromotion() {\r\n console.log('addItemToLayoutController::loadPromotion')\r\n if ($stateParams.promotionId != '0') {\r\n\r\n promotionsService.promotions.getPromotionPagesItems($stateParams.promotionId)\r\n .then(function (promotion) {\r\n if (promotion != null) {\r\n self.promotion = promotion;\r\n\r\n self.isLoading = false;\r\n\r\n createPages();\r\n\r\n selectWorkingPage();\r\n\r\n self.promotion.pages.forEach(function (page, index) {\r\n if (!self.checkSelectedPages(page)) {\r\n self.selectedPages.push(page)\r\n }\r\n })\r\n getPageId();\r\n\r\n if (self.selectedPage)\r\n self.selectPage(self.selectedPage);\r\n\r\n\r\n if (self.selectedPage != null && self.selectedPage.items.length > 0)\r\n self.selectedPage.items.forEach(function (i) { if (i.promotionItemType == 5) { self.variantsHaveLength = true; } });\r\n }\r\n\r\n var task = null;\r\n angular.forEach(self.promotion.tasks, function (t) {\r\n if (t.id == $stateParams.taskId)\r\n task = t;\r\n });\r\n var taskName = task.name.split(\"(\")[0].trim();//evito comparar tareas repetidas las cuales llevan (#nroDeRepeticion)\r\n if (taskName != 'Carga Inicial' && taskName != '1° Revisión Comercial') {\r\n self.disableMassiveCharges = true;\r\n }\r\n\r\n });\r\n }\r\n }\r\n\r\n function selectWorkingPage() {\r\n var pageId = self.selectedPage ? self.selectedPage.id : $stateParams.promotionMediaPageId;\r\n var currentPage = null;\r\n if (pageId && pageId > 0) {\r\n angular.forEach(self.promotion.pages, function (page) {\r\n if (page.id == pageId) {\r\n currentPage = page;\r\n }\r\n });\r\n }\r\n\r\n if (currentPage)\r\n self.selectPage(currentPage);\r\n }\r\n\r\n self.checkIssueInPosition = function (position) {\r\n var rv = false;\r\n if (self.issues != null && self.issues.length > 0)\r\n self.issues.forEach(function (issue) {\r\n if (issue.pageNumber == self.selectedPage.pageNumber && issue.position == position)\r\n rv = true;\r\n });\r\n return rv;\r\n }\r\n\r\n self.checkIssueForSubstitute = function (promotionItemId) {\r\n var rv = false;\r\n if (self.issues != null && self.issues.length > 0)\r\n self.issues.forEach(function (issue) {\r\n if (issue.itemId == promotionItemId)\r\n rv = true;\r\n });\r\n return rv;\r\n }\r\n\r\n function init() {\r\n console.log('addItemToLayoutController::init')\r\n\r\n //por ahora se esta usando solo el getTaskName para identificar tarea\r\n self.isLayoutCompare = $stateParams.isPrintLayoutCompare == 'true' ? true : false;\r\n self.isLayoutImageUpload = $stateParams.isLayoutImageUpload == 'true' ? true : false;\r\n self.isLayoutForReview = $stateParams.isLayoutForReview == 'true' ? true : false;\r\n self.isFinalValidation = self.isLayoutCompare && self.isLayoutImageUpload ? true : false;\r\n\r\n promotionsService.tasks.getTaskName($stateParams.taskId)\r\n .then(function (taskName) {\r\n switch (taskName) {\r\n case \"1° Input para armado de Pieza\": self.isLayoutCompare = true;\r\n break;\r\n case \" 2° Input para armado de Pieza\": self.isLayoutCompare = true;\r\n break;\r\n case \"3° Input para armado de Pieza\": self.isLayoutCompare = true;\r\n break;\r\n case \"1° Subida de Pieza para revisión\": self.isLayoutImageUpload = true;\r\n break;\r\n case \"2° Subida de Pieza para revisión\": self.isLayoutImageUpload = true;\r\n break;\r\n case \"3° Subida de Pieza para revisión\": self.isLayoutImageUpload = true;\r\n break;\r\n case \"2° Revisión Comercial\": self.isLayoutForReview = true;\r\n break;\r\n case \"Validación final\": self.isFinalValidation = true;\r\n break;\r\n case \"Activación\": self.isActivationTask = true;\r\n break;\r\n }\r\n\r\n });\r\n\r\n promotionsService.tasks.getTaskIssues($stateParams.taskId)\r\n .then(function (issues) {\r\n self.issues = issues;\r\n if (self.issues.length > 0)\r\n self.issueName = promotionsService.getIssueName(self.issues[0].type);\r\n });\r\n\r\n homeService.categories.getLayoutCategories()\r\n .then(function (response) {\r\n angular.forEach(response, function (category) {\r\n categories.push({\r\n categoryId: category.id,\r\n displayName: category.name\r\n });\r\n\r\n });\r\n\r\n self.categoriesCaptains = categories;\r\n self.categoriesSecondaries = categories;\r\n\r\n promotionsService.layouts.getLayouts(true)\r\n .then(function (layouts) {\r\n self.layouts = layouts;\r\n loadPromotion();\r\n });\r\n });\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"activationCtrl\", function ($scope, $rootScope, $state, $stateParams, promotionsService, $timeout, ngDialog, authService) {\r\n\r\n var self = this;\r\n\r\n self.task = null;\r\n\r\n self.showMechanicProgram = authService.hasPermission('promotion_activation_edit_panguiCode');\r\n self.showInformPrices = authService.hasPermission('promotion_activation_informPrices');\r\n self.promotionPriceFileUrl = null;\r\n\r\n self.link = '';\r\n\r\n self.canPublish = false;\r\n\r\n \r\n\r\n self.publish = function () {\r\n if ($stateParams.taskId) {\r\n if (self.canPublish) {\r\n promotionsService.tasks.publishTask($stateParams.taskId)\r\n .then(function (isOk) {\r\n swal('Tarea Publicada!', 'La tarea se ha publicado exitosamente', 'success');\r\n $state.go('promotions.myTasks');\r\n }\r\n , function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de publicacion continua. Puede revisar el estado en unos minutos.\");\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al publicar\", \"error\");\r\n }\r\n });\r\n }\r\n else {\r\n swal(\"No se puede publicar\", \"Debe cargar el número de motor pangui a todas las mecanicas y enviar informacion a precios\", \"error\");\r\n }\r\n } else {\r\n $timeout(function () {\r\n swal(\"Error\", \"no se pudo publicar la tarea\", \"error\");\r\n }, 100);\r\n }\r\n }\r\n\r\n self.goToLoadItems = function () {\r\n $state.go('promotions.addItemToLayout', { promotionId: $stateParams.promotionId, taskId: $stateParams.taskId });\r\n }\r\n self.goToOutput = function () {\r\n\r\n swal({\r\n title: 'Desea importar los precios promocionales al modulo de Precios?',\r\n text: 'Si lo hace mas de una vez, se sobreescribiran los precios promocionales que aun no se hayan informado.',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n promotionsService.tasks.writePromotionPrices($stateParams.promotionId)\r\n .then(function (lastPriceFileUrl) {\r\n if (lastPriceFileUrl != null && lastPriceFileUrl != '' && lastPriceFileUrl != undefined) {\r\n swal('Precios Publicados!', 'Los precios se han publicado exitosamente', 'success');\r\n self.promotionPriceFileUrl = lastPriceFileUrl;\r\n //$state.go('prices.toInform');\r\n promotionsService.tasks.canPublishActivation($stateParams.promotionId)\r\n .then(function (isOk) {\r\n self.canPublish = isOk;\r\n });\r\n }\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"Se enviara un e-mail a cada usuario de promociones cuando se reciba la informacion en precios.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al publicar los precios\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.generateAndDownload = function () {\r\n promotionsService.reports.buildItemTasksReport(self.task.promotionId)\r\n .then(function (link) {\r\n self.link = link;\r\n self.showSwalWithLink();\r\n });\r\n }\r\n\r\n self.showSwalWithLink = function () {\r\n swal({\r\n title: \"Reporte Generado!\",\r\n text: 'Haga click AQUÍ para descargar el archivo',\r\n confirmButtonText: \"Cerrar\",\r\n confirmButtonColor: \"#c2c2c2\",\r\n html: true\r\n });\r\n }\r\n\r\n function init() {\r\n promotionsService.tasks.startTask($stateParams.taskId);\r\n promotionsService.tasks.getTask($stateParams.taskId)\r\n .then(function (task) {\r\n self.task = task;\r\n });\r\n promotionsService.tasks.canPublishActivation($stateParams.promotionId)\r\n .then(function (isOk) {\r\n self.canPublish = isOk;\r\n });\r\n\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"PricesRulesCategoryCtrl\", function ($rootScope, $state, $timeout, $translate, $interval, $filter, priceService, companyJson, serverService, Upload, ngDialog) {\r\n\r\n var self = this;\r\n var dic = {};\r\n var numberColWidth = 100;\r\n var editableColWidth = 140;\r\n var lastAdded = null;\r\n var columnDefs = null;\r\n\r\n self.gridOptions = null;\r\n self.summary = null;\r\n self.summaryFiltered = [];\r\n self.summaryToUse = [];\r\n\r\n self.competitorGroups = [];\r\n self.categoryMinLevel = companyJson.Category.Levels;\r\n self.companyCode = companyJson.Erp.Implementation;\r\n\r\n var hideAmountParameters = true;\r\n\r\n self.copiedSummary = null;\r\n self.onSearchKeyUp = function () {\r\n //console.log('self.search', self.search);\r\n if (!self.search) {\r\n if (self.copiedSummary)\r\n copyValuesFromFilteredToComplete(self.copiedSummary, self.summary);\r\n self.gridOptions.api.setRowData(self.summary);\r\n } else {\r\n self.copiedSummary = angular.copy(self.summary);\r\n filterSummary(self.summary, self.copiedSummary, self.search.toLowerCase());\r\n self.gridOptions.api.setRowData(self.copiedSummary);\r\n\r\n }\r\n }\r\n\r\n function copyValuesFromFilteredToComplete(filtered, completed) {\r\n if (filtered.length == 0 || completed.length == 0) return;\r\n for (var j = 0; j < completed.length; j++) {\r\n for (var i = 0; i < filtered.length; i++) {\r\n if (completed[j].id == filtered[i].id) {\r\n //console.log('copying', filtered[i].name);\r\n copyValues(filtered[i], completed[j]);\r\n copyValuesFromFilteredToComplete(filtered[i].subcategories, completed[j].subcategories);\r\n }\r\n }\r\n }\r\n }\r\n\r\n function copyValues(src, dst) {\r\n dst.allowMaxVariation = src.allowMaxVariation\r\n dst.allowMaxViolation = src.allowMaxViolation\r\n dst.allowMinVariation = src.allowMinVariation\r\n dst.allowMinViolation = src.allowMinViolation\r\n dst.code = src.code\r\n dst.goToTargetMargin = src.goToTargetMargin\r\n dst.id = src.id\r\n dst.keepMargin = src.keepMargin\r\n dst.keepMarginAmount = src.keepMarginAmount\r\n dst.level = src.level\r\n dst.mainCompetitorGroup = src.mainCompetitorGroup\r\n dst.mainCompetitorGroupId =\r\n src.mainCompetitorGroupId\r\n dst.maxMargin =\r\n src.maxMargin\r\n dst.maxMarginAmount =\r\n src.maxMarginAmount\r\n dst.maxVariation =\r\n src.maxVariation\r\n dst.maxVariationAmount =\r\n src.maxVariationAmount\r\n dst.minMargin =\r\n src.minMargin\r\n dst.minMarginAmount =\r\n src.minMarginAmount\r\n dst.minVariation =\r\n src.minVariation\r\n dst.minVariationAmount =\r\n src.minVariationAmount\r\n dst.name =\r\n src.name\r\n dst.parentId =\r\n src.parentId\r\n dst.significantVariation =\r\n src.significantVariation\r\n dst.significantVariationInMargin =\r\n src.significantVariationInMargin\r\n dst.targetMargin =\r\n src.targetMargin\r\n dst.targetMarginAmount =\r\n src.targetMarginAmount\r\n }\r\n\r\n //source y dest tienen que ser copias uno del otro\r\n function filterSummary(source, dest, search) {\r\n if (!source || source.length == 0) return false;\r\n var idsToRemove = [];\r\n var anyOfThisAreValid = false;\r\n for (var i = 0; i < source.length; i++) {\r\n //if (source[i].id == 11) {\r\n // var a = 1;\r\n // debugger;\r\n //}\r\n var anyChildrenValid = false;\r\n\r\n anyChildrenValid |= filterSummary(source[i].subcategories, dest[i].subcategories, search);\r\n\r\n if (!anyChildrenValid && source[i].name.toLowerCase().indexOf(search) == -1) {\r\n //console.log('removing ', source[i].name);\r\n\r\n idsToRemove.push(source[i].id);\r\n } else if (source[i].name.toLowerCase().indexOf(search) != -1) {\r\n anyOfThisAreValid = true;\r\n } else if (anyChildrenValid) {\r\n anyOfThisAreValid = true;\r\n }\r\n }\r\n\r\n\r\n for (var i = 0; i < idsToRemove.length; i++) {\r\n for (var j = 0; j < dest.length; j++) {\r\n if (dest[j].id == idsToRemove[i]) {\r\n dest.splice(j, 1);\r\n break;\r\n }\r\n\r\n }\r\n }\r\n\r\n return anyOfThisAreValid;\r\n\r\n }\r\n\r\n\r\n self.goToRules = function (id, categoryGroup, category, subcategory) {\r\n\r\n categoryGroup = categoryGroup.replace(/ /g, \"-\").replace(/\\//g, \"_\");\r\n category = category.replace(/ /g, \"-\").replace(/\\//g, \"_\");\r\n subcategory = subcategory.replace(/ /g, \"-\").replace(/\\//g, \"_\");\r\n\r\n var encodedcategoryGroup = categoryGroup != 'null' ? encodeURIComponent(categoryGroup) : '';\r\n var encodedcategory = category != 'null' ? encodeURIComponent(category) : '';\r\n var encodedsubcategory = subcategory != 'null' ? encodeURIComponent(subcategory) : '';\r\n\r\n $state.go('prices.rules', { categoryId: id, categoryGroup: encodedcategoryGroup, category: encodedcategory, subcategory: encodedsubcategory });\r\n }\r\n\r\n self.save = function () {\r\n swal({\r\n title: translations.DiscardConfirmTitle,\r\n text: translations.AreYouSureSwalSubtitle,\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function () {\r\n var itemsToSave = [];\r\n self.gridOptions.api.forEachNode(function (node) {\r\n if (node.data.dirty) {\r\n itemsToSave.push(node.data);\r\n }\r\n });\r\n\r\n if (itemsToSave.length > 0) {\r\n var categories = JSON.stringify(itemsToSave);\r\n priceService.rules.saveCategoryRules(categories).then(function () {\r\n swal(translations.ConfirmedSwal, translations.ConfirmedSwalSubtitle, \"success\");\r\n }).catch(function (fallback) {\r\n swal(translations.ErrorTitleSwal, translations.ErrorSwalSubtitle, \"error\");\r\n });\r\n }\r\n else {\r\n setTimeout(function () {\r\n swal(translations.WarningSwal, translations.NoChangeWasDetectedSwal, \"warning\");\r\n }, 1000);\r\n }\r\n });\r\n }\r\n\r\n function iconRenderer(params) {\r\n return '';\r\n }\r\n\r\n\r\n\r\n //grid config\r\n function setColumnDefinitions() {\r\n\r\n\r\n columnDefs = [\r\n {\r\n headerName: translations.Category,\r\n width: numberColWidth + 200,\r\n pinned: 'left',\r\n field: 'name',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n cellRenderer: {\r\n renderer: 'group',\r\n checkbox: false,\r\n innerRenderer: function (params) {\r\n var name = params.value + (params.node.group && params.node.children != null ? ' (' + params.node.children.length + ')' : '');\r\n\r\n\r\n if (!params.node.parent || params.node.parent == null) {\r\n if (self.companyCode == 'LaRebaja')\r\n name = (params.node.data.parentName ? (params.node.data.parentName + ' >> ') : '') + name;\r\n\r\n return name;\r\n }\r\n\r\n var anchor = document.createElement('a');\r\n anchor.title = translations.ClickHereViewCategory;\r\n anchor.style = 'padding: 5px';\r\n anchor.innerHTML = name\r\n\r\n anchor.addEventListener('click', function () {\r\n var categoryGroup = '';\r\n var category = '';\r\n var subcategory = '';\r\n //issue 686 cp al filtrar si los hijos no coinciden con el termino de busqueda\r\n //se suprimen por lo que se interpreta como una subcategoria ya que no tiene hijos\r\n //if (!params.node.parent || params.node.parent == null) {\r\n // categoryGroup = params.value;\r\n //}\r\n //else if (params.node.parent != null && params.node.children != null) {\r\n // categoryGroup = params.node.parent.data.name;\r\n // category = params.value\r\n //}\r\n //else if (params.node.parent != null && params.node.children == null) {\r\n // categoryGroup = params.node.parent.parent.data.name;//aca pincha!\r\n // category = params.node.parent.data.name\r\n // subcategory = params.value\r\n //}\r\n if (params.node.data.level === 5) {\r\n categoryGroup = params.node.parent.parent.data.name;\r\n category = params.node.parent.data.name;\r\n subcategory = params.value;\r\n }\r\n else {\r\n categoryGroup = params.node.parent.data.name;\r\n category = params.value;\r\n }\r\n\r\n self.goToRules(params.data.id, categoryGroup, category, subcategory);\r\n });\r\n\r\n return anchor;\r\n }\r\n }\r\n },\r\n {\r\n headerName: translations.MarginGuidelines,\r\n\r\n children: [\r\n {\r\n headerName: translations.TargetMarginP,\r\n field: \"targetMargin\",\r\n headerTooltip: \"\",\r\n filter: 'number',\r\n //hide: true, //TODO: hacer que sea por company json\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 100,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: percentageEditorWithDecimalAndZero\r\n },\r\n {\r\n headerName: translations.TargetMargin,\r\n field: \"targetMarginAmount\",\r\n hide: hideAmountParameters,\r\n headerTooltip: \"\",\r\n filter: 'number',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 100,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: moneyEditorWithZeros\r\n },\r\n {\r\n headerName: \"Min %\",\r\n field: \"minMargin\",\r\n headerTooltip: \"\",\r\n filter: 'number',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 80,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: percentageEditorWithDecimalAndZero\r\n },\r\n {\r\n headerName: \"Min $\",\r\n field: \"minMarginAmount\",\r\n hide: hideAmountParameters,\r\n headerTooltip: \"\",\r\n filter: 'number',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 80,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: moneyEditorWithZeros\r\n },\r\n {\r\n headerName: \"Max %\",\r\n field: \"maxMargin\",\r\n headerTooltip: \"\",\r\n filter: 'number',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 80,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: percentageEditorWithDecimalAndZero\r\n },\r\n {\r\n headerName: \"Max $\",\r\n field: \"maxMarginAmount\",\r\n hide: hideAmountParameters,\r\n headerTooltip: \"\",\r\n filter: 'number',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 80,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: moneyEditorWithZeros\r\n },\r\n {\r\n headerName: translations.AllowMin,\r\n field: \"allowMinViolation\",\r\n headerTooltip: translations.AllowMinTooltip,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 80,\r\n cellClass: $rootScope.getClassForCell,\r\n filter: 'input',\r\n cellRenderer: $rootScope.checkboxEditor()\r\n },\r\n {\r\n headerName: translations.AllowMax,\r\n field: \"allowMaxViolation\",\r\n headerTooltip: translations.AllowMaxTooltip,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 80,\r\n cellClass: $rootScope.getClassForCell,\r\n filter: 'input',\r\n cellRenderer: $rootScope.checkboxEditor()\r\n },\r\n {\r\n headerName: translations.GoToTarget,\r\n field: \"goToTargetMargin\",\r\n headerTooltip: translations.GoToTargetTooltip,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 60,\r\n cellClass: $rootScope.getClassForCell,\r\n filter: 'input',\r\n cellRenderer: self.checkboxEditorMarginGuides\r\n },\r\n {\r\n headerName: translations.KeepMargin,\r\n field: \"keepMargin\",\r\n headerTooltip: translations.KeepMarginTooltip,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 75,\r\n cellClass: $rootScope.getClassForCell,\r\n filter: 'input',\r\n cellRenderer: self.checkboxEditorMarginGuides\r\n }]\r\n },\r\n {\r\n headerName: translations.PriceVariation,\r\n\r\n children: [\r\n {\r\n headerName: translations.LowPercentage,\r\n field: \"minVariation\",\r\n filter: 'number',\r\n headerTooltip: \"\",\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 80,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: percentageEditorWithDecimalAndZero\r\n },\r\n {\r\n headerName: \"Min $\",\r\n field: \"minVariationAmount\",\r\n hide: hideAmountParameters,\r\n headerTooltip: \"\",\r\n filter: 'number',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 80,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: moneyEditorWithZeros\r\n },\r\n {\r\n headerName: translations.RisePercentage,\r\n field: \"maxVariation\",\r\n filter: 'number',\r\n headerTooltip: \"\",\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 80,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: percentageEditorWithDecimalAndZero\r\n },\r\n {\r\n headerName: \"Max $\",\r\n field: \"maxVariationAmount\",\r\n hide: hideAmountParameters,\r\n headerTooltip: \"\",\r\n filter: 'number',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 80,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: moneyEditorWithZeros\r\n },\r\n {\r\n headerName: translations.AllowMin,\r\n field: \"allowMinVariation\",\r\n headerTooltip: translations.GenerateSuggestionsVarTooltipMin,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 80,\r\n cellClass: $rootScope.getClassForCell,\r\n filter: 'input',\r\n cellRenderer: $rootScope.checkboxEditor()\r\n },\r\n {\r\n headerName: translations.AllowMax,\r\n field: \"allowMaxVariation\",\r\n headerTooltip: translations.GenerateSuggestionsVarTooltipMax,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 80,\r\n cellClass: $rootScope.getClassForCell,\r\n filter: 'input',\r\n cellRenderer: $rootScope.checkboxEditor()\r\n },\r\n {\r\n headerName: translations.SignVar,\r\n field: \"significantVariation\",\r\n headerTooltip: translations.SignVarTooltip,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 70,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: percentageEditorWithDecimalAndZero\r\n },\r\n {\r\n headerName: translations.SignVarMargin,\r\n field: \"significantVariationInMargin\",\r\n headerTooltip: translations.SignVarMarginTooltip,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 130,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: moneyEditorWithZeros\r\n }]\r\n },\r\n {\r\n headerName: translations.Competitors,\r\n children: [\r\n {\r\n headerName: translations.MainCompetitor,\r\n field: \"mainCompetitorGroup\",\r\n headerTooltip: \"\",\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 120,\r\n cellClass: $rootScope.getClassForCell,\r\n filter: 'input',\r\n cellRenderer: dropDownDecisionEditor\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n\r\n //Grid Renderer\r\n self.checkboxEditorMarginGuides = function (params) {\r\n var eInput = document.createElement(\"input\");\r\n eInput.type = \"checkbox\";\r\n eInput.checked = params.value;\r\n\r\n eInput.addEventListener(\"change\", function (event) {\r\n params.value = eInput.checked;\r\n params.data[params.column.colId] = eInput.checked;\r\n\r\n if (params.colDef.field == 'goToTargetMargin') { //Si toque Ir a Obj, destildo Mantener\r\n params.node.data.keepMargin = false;\r\n }\r\n else if (params.colDef.field == 'keepMargin') { //Si toque Mantener, destildo Ir a Obj\r\n params.node.data.goToTargetMargin = false;\r\n }\r\n\r\n\r\n if (params.node != null && params.node.children != null) {\r\n params.node.children.forEach(function (node) {\r\n if (node.children) {\r\n node.children.forEach(function (node) {\r\n node.data[params.column.colId] = eInput.checked;\r\n\r\n if (params.colDef.field == 'goToTargetMargin') { //Si toque Ir a Obj, destildo Mantener\r\n node.data.keepMargin = false;\r\n }\r\n else if (params.colDef.field == 'keepMargin') { //Si toque Mantener, destildo Ir a Obj\r\n node.data.goToTargetMargin = false;\r\n }\r\n\r\n });\r\n }\r\n node.data[params.column.colId] = eInput.checked;\r\n\r\n if (params.colDef.field == 'goToTargetMargin') { //Si toque Ir a Obj, destildo Mantener\r\n node.data.keepMargin = false;\r\n }\r\n else if (params.colDef.field == 'keepMargin') { //Si toque Mantener, destildo Ir a Obj\r\n node.data.goToTargetMargin = false;\r\n }\r\n\r\n });\r\n }\r\n\r\n params.data.dirty = true;\r\n\r\n params.api.refreshView();\r\n });\r\n\r\n return eInput;\r\n }\r\n function dropDownDecisionEditor(params) {\r\n\r\n var editing = false;\r\n\r\n var eCell = document.createElement('div');\r\n\r\n var eLabel = null\r\n\r\n if (params.value != null && params.value != \"\")\r\n eLabel = document.createTextNode(params.value);\r\n else\r\n eLabel = document.createTextNode(\"------------\");\r\n\r\n eCell.appendChild(eLabel);\r\n\r\n var eSelect = document.createElement(\"select\");\r\n eSelect.className = \"form-control\";\r\n eSelect.style = \"margin:0px !important; border: 0px; line-height: 100%; font-size:12px !important\";\r\n\r\n for (var i = 0; i < self.competitorGroups.length; i++) {\r\n var eOption = document.createElement(\"option\");\r\n eOption.setAttribute(\"value\", self.competitorGroups[i].id);\r\n eOption.innerHTML = self.competitorGroups[i].name;\r\n eSelect.appendChild(eOption);\r\n }\r\n\r\n //agrego la opcion vacia\r\n var eOptionEmpty = document.createElement(\"option\");\r\n eOptionEmpty.setAttribute(\"value\", null);\r\n eOptionEmpty.innerHTML = \"---\"\r\n eSelect.appendChild(eOptionEmpty);\r\n\r\n eSelect.value = params.data.mainCompetitorGroupId;\r\n\r\n\r\n eCell.addEventListener('click', function () {\r\n if (!editing) {\r\n eCell.removeChild(eLabel);\r\n eCell.appendChild(eSelect);\r\n eSelect.focus();\r\n editing = true;\r\n }\r\n });\r\n\r\n eSelect.addEventListener('blur', function () {\r\n if (editing) {\r\n editing = false;\r\n eCell.removeChild(eSelect);\r\n eCell.appendChild(eLabel);\r\n }\r\n });\r\n\r\n eSelect.addEventListener('change', function () {\r\n if (editing) {\r\n\r\n var colIds = [];\r\n colIds.push(params.column.colId);\r\n var changedRows = [];\r\n changedRows.push(params.node);\r\n\r\n editing = false;\r\n var newValue = '';\r\n\r\n for (var i = 0; i < self.competitorGroups.length; i++) {\r\n if (self.competitorGroups[i].id == eSelect.value || eSelect.value == 'null') {\r\n newValue = eSelect.value == 'null' ? '' : self.competitorGroups[i].name;\r\n params.data['mainCompetitorGroup'] = newValue;\r\n params.data['mainCompetitorGroupId'] = eSelect.value == 'null' ? null : eSelect.value;\r\n //Children\r\n if (params.node != null && params.node.children != null) {\r\n params.node.children.forEach(function (node) {\r\n if (node.children) {\r\n node.children.forEach(function (node) {\r\n node.data['mainCompetitorGroup'] = newValue;\r\n node.data['mainCompetitorGroupId'] = eSelect.value == 'null' ? null : eSelect.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n }\r\n node.data['mainCompetitorGroup'] = newValue;\r\n node.data['mainCompetitorGroupId'] = eSelect.value == 'null' ? null : eSelect.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n }\r\n break;\r\n }\r\n }\r\n\r\n\r\n params.data.dirty = true;\r\n\r\n params.api.refreshCells(changedRows, colIds);\r\n\r\n eLabel.nodeValue = newValue;\r\n eCell.removeChild(eSelect);\r\n eCell.appendChild(eLabel);\r\n }\r\n });\r\n\r\n return eCell;\r\n }\r\n\r\n function setGridOptions() {\r\n\r\n\r\n self.gridOptions = {\r\n //columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: false,\r\n enableFilter: false,\r\n groupUseEntireRow: false,\r\n rowSelection: \"multiple\",\r\n suppressCellSelection: true,\r\n groupSelectsChildren: true,\r\n groupSuppressAutoColumn: false, // or undefined\r\n groupColumnDef: null, // or undefined\r\n singleClickEdit: true,\r\n rowHeight: 35,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n enableRangeSelection: false,\r\n angularCompileRows: true,\r\n getNodeChildDetails: getNodeChildDetails,\r\n }\r\n }\r\n\r\n function getNodeChildDetails(rowItem) {\r\n if (rowItem.subcategories && rowItem.subcategories.length > 0) {\r\n return {\r\n group: true,\r\n expanded: false,\r\n // provide ag-Grid with the children of this group\r\n children: rowItem.subcategories,\r\n // the key is used by the default group cellRenderer\r\n key: rowItem.id\r\n };\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n //grid filter\r\n self.onFilterChanged = function (value) {\r\n self.gridOptions.api.setQuickFilter(value);\r\n }\r\n\r\n function clearAlternativeColumn(params, colIds, changedRows, node) {\r\n if (params.value) {\r\n\r\n var column = params.column.colId;\r\n var alternativeColumn = column.indexOf('Amount') !== -1 ? column.replace('Amount', '') : (column + 'Amount');\r\n if (column == 'significantVariation') {\r\n alternativeColumn = 'significantVariationInMargin';\r\n } else if (column == 'significantVariationInMargin') {\r\n alternativeColumn = 'significantVariation';\r\n }\r\n\r\n node.data[alternativeColumn] = null;\r\n colIds.push(alternativeColumn);\r\n changedRows.push(node);\r\n }\r\n }\r\n\r\n function percentageEditorWithDecimalAndZero(params) {\r\n\r\n var editing = false;\r\n\r\n var eCell = document.createElement('div');\r\n eCell.style = \"width:100% !important;height:100% !important\";\r\n eCell.className = \"input-group\";\r\n var eLabel = params.value != null ? document.createTextNode($rootScope.percentageRendererWithZero(params)) : document.createTextNode('');\r\n eCell.appendChild(eLabel);\r\n\r\n var eInput = document.createElement(\"input\");\r\n eInput.type = \"number\";\r\n eInput.step = \"0.01\";\r\n eInput.className = \"form-control\";\r\n var eSpan = document.createElement(\"span\");\r\n eSpan.className = \"input-group-addon\";\r\n eSpan.style = \"margin:0px !important; height: 100% !important; border: 0px; line-height: 100%; font-size:12px !important\";\r\n eSpan.innerText = \"%\";\r\n\r\n\r\n eCell.addEventListener('click', function () {\r\n if (!editing) {\r\n eCell.removeChild(eLabel);\r\n eCell.appendChild(eInput);\r\n eCell.appendChild(eSpan);\r\n eInput.focus();\r\n eInput.value = params.value ? params.value * 100 : null;\r\n editing = true;\r\n }\r\n });\r\n\r\n eInput.addEventListener('blur', function () {\r\n if (editing) {\r\n editing = false;\r\n eCell.removeChild(eInput);\r\n eCell.removeChild(eSpan);\r\n eCell.appendChild(eLabel);\r\n }\r\n });\r\n\r\n eInput.addEventListener('change', function () {\r\n if (editing) {\r\n editing = false;\r\n var newValue = undefined;\r\n if (eInput.value != '')\r\n newValue = eInput.value / 100;\r\n\r\n params.value = newValue;\r\n params.data[params.column.colId] = newValue;\r\n eLabel.nodeValue = $rootScope.percentageRendererWithZero(params);\r\n eCell.removeChild(eInput);\r\n eCell.removeChild(eSpan);\r\n eCell.appendChild(eLabel);\r\n\r\n var colIds = [];\r\n var changedRows = [];\r\n\r\n clearAlternativeColumn(params, colIds, changedRows, params.node);\r\n\r\n if (params.node != null && params.node.children != null) {\r\n colIds.push(params.column.colId);\r\n params.node.children.forEach(function (node) {\r\n if (node.children) {\r\n node.children.forEach(function (node) {\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n\r\n clearAlternativeColumn(params, colIds, changedRows, node);\r\n });\r\n }\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n\r\n clearAlternativeColumn(params, colIds, changedRows, node);\r\n });\r\n }\r\n console.log('params', params);\r\n\r\n params.api.refreshCells(changedRows, colIds);\r\n params.api.recomputeAggregates();\r\n params.data.dirty = true;\r\n\r\n }\r\n });\r\n\r\n return eCell;\r\n }\r\n\r\n function moneyEditorWithZeros(params) {\r\n\r\n var editing = false;\r\n\r\n var eCell = document.createElement('div');\r\n eCell.style = \"width:100% !important;height:100% !important\";\r\n eCell.className = \"input-group\";\r\n var eLabel = params.value ? document.createTextNode($rootScope.moneyRendererWithZeros(params)) : document.createTextNode('');\r\n eCell.appendChild(eLabel);\r\n\r\n var eInput = document.createElement(\"input\");\r\n eInput.type = \"number\";\r\n eInput.step = \"0.01\";\r\n eInput.className = \"form-control\";\r\n var eSpan = document.createElement(\"span\");\r\n eSpan.className = \"input-group-addon\";\r\n eSpan.style = \"margin:0px !important; height: 100% !important; border: 0px; line-height: 100%; font-size:12px !important\";\r\n eSpan.innerText = \"$\";\r\n\r\n eCell.addEventListener('click', function () {\r\n if (!editing) {\r\n eCell.removeChild(eLabel);\r\n eCell.appendChild(eSpan);\r\n eCell.appendChild(eInput);\r\n eInput.focus();\r\n eInput.value = params.value;\r\n editing = true;\r\n }\r\n });\r\n\r\n eInput.addEventListener('blur', function () {\r\n if (editing) {\r\n editing = false;\r\n eCell.removeChild(eSpan);\r\n eCell.removeChild(eInput);\r\n eCell.appendChild(eLabel);\r\n }\r\n });\r\n\r\n eInput.addEventListener('change', function () {\r\n if (editing) {\r\n editing = false;\r\n params.value = eInput.value;\r\n params.data[params.column.colId] = eInput.value;\r\n eLabel.nodeValue = $rootScope.moneyRendererWithZeros(params);\r\n eCell.removeChild(eSpan);\r\n eCell.removeChild(eInput);\r\n eCell.appendChild(eLabel);\r\n\r\n var colIds = [];\r\n var changedRows = [];\r\n\r\n clearAlternativeColumn(params, colIds, changedRows, params.node);\r\n\r\n if (params.node != null && params.node.children != null) {\r\n\r\n colIds.push(params.column.colId);\r\n params.node.children.forEach(function (node) {\r\n if (node.children) {\r\n node.children.forEach(function (node) {\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n\r\n clearAlternativeColumn(params, colIds, changedRows, node);\r\n });\r\n }\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n\r\n clearAlternativeColumn(params, colIds, changedRows, node);\r\n });\r\n }\r\n\r\n params.api.refreshCells(changedRows, colIds);\r\n params.api.recomputeAggregates();\r\n params.data.dirty = true;\r\n }\r\n });\r\n\r\n return eCell;\r\n }\r\n\r\n function loadData() {\r\n\r\n priceService.competitors.getCompetitorGroups()\r\n .then(function (groups) {\r\n\r\n self.competitorGroups = groups;\r\n })\r\n\r\n\r\n priceService.rules.getCategories(self.categoryMinLevel)\r\n .then(function (summary) {\r\n console.log('summary', summary);\r\n self.summary = summary;\r\n self.gridOptions.api.setRowData(summary);\r\n });\r\n }\r\n\r\n //importador de reglas para cencosud peru\r\n self.openImporterDialog = function () {\r\n\r\n self.currentStep = 2;\r\n self.gridOptions2 = {\r\n columnDefs: [\r\n {\r\n headerName: 'Severidad',\r\n width: 100,\r\n pinned: 'left',\r\n field: 'severity',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n rowGroupIndex: 0,\r\n cellRenderer: function (params) {\r\n var severityName = '';\r\n switch (params.value) {\r\n case 'Information': { severityName = ' Info'; break; }\r\n case 'Warning': { severityName = ' Warn'; break; }\r\n case 'Error': { severityName = ' Error'; break; }\r\n }\r\n return severityName;\r\n }\r\n },\r\n {\r\n headerName: 'Fila',\r\n width: 50,\r\n pinned: 'left',\r\n field: 'row',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n {\r\n headerName: 'Categoria',\r\n width: 150,\r\n rowGroupIndex: 1,\r\n pinned: 'left',\r\n field: 'category',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n {\r\n headerName: 'Descripcion',\r\n width: 350,\r\n pinned: 'left',\r\n field: 'description',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n ],\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n rowHeight: 35,\r\n suppressHorizontalScroll: false,\r\n suppressCellSelection: true,\r\n groupUseEntireRow: true,\r\n groupSuppressAutoColumn: false,\r\n groupDefaultExpanded: 0,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n angularCompileRows: true,\r\n }\r\n\r\n ngDialog.open({\r\n template: 'importerDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n controller: function () {\r\n return self;\r\n },\r\n controllerAs: 'ct',\r\n });\r\n }\r\n\r\n self.showNextStep = function () {\r\n if (self.currentStep > 0 && self.currentStep < 4) {\r\n self.currentStep++;\r\n loadResults([]);\r\n }\r\n }\r\n\r\n self.uploadFile = function (files) {\r\n if (files && files.length > 0) {\r\n self.isBusy = true;\r\n var url = serverService.getApiUrl() + '/price/rules/uploadBatchFile';\r\n Upload.upload({\r\n url: url,\r\n data: { file: files[0] }\r\n }).then(function (response) {\r\n var importerResults = response.data;\r\n processImporterResults(importerResults);\r\n if (!anyError(importerResults)) {\r\n self.finishedUpload = true;\r\n }\r\n });\r\n }\r\n }\r\n\r\n self.validateUploadedFile = function () {\r\n self.isBusy3 = true;\r\n priceService.rules.validateRulesInBatchFile()\r\n .then(function (dto) {\r\n processImporterResults(dto);\r\n if (!anyError(dto)) {\r\n self.finishedValidation = true;\r\n }\r\n });\r\n\r\n }\r\n\r\n self.reUploadFile = function () {\r\n self.currentStep = 2;\r\n loadResults([]);\r\n self.files = null;\r\n self.finishedUpload = false;\r\n self.finishedValidation = false;\r\n self.finishedUpdate = false;\r\n }\r\n\r\n self.updateItems = function () {\r\n self.isBusy4 = true;\r\n priceService.rules.updateRulesInBatchFile()\r\n .then(function (dto) {\r\n processImporterResults(dto);\r\n if (!anyError(dto)) {\r\n self.finishedUpdate = true;\r\n }\r\n });\r\n\r\n }\r\n\r\n self.finish = function () {\r\n self.currentStep = 1;\r\n loadResults([]);\r\n\r\n self.finishedUpload = false;\r\n self.finishedValidation = false;\r\n self.finishedUpdate = false;\r\n\r\n ngDialog.close();\r\n }\r\n\r\n function processImporterResults(importerResults) {\r\n self.isBusy = false;\r\n self.isBusy2 = false;\r\n self.isBusy3 = false;\r\n self.isBusy4 = false;\r\n\r\n if (importerResults.length > 0) {\r\n loadResults(importerResults);\r\n }\r\n if (anyError(importerResults)) {\r\n self.error = true;\r\n }\r\n else\r\n self.error = false;\r\n }\r\n\r\n function loadResults(results) {\r\n self.gridOptions2.api.setRowData(results);\r\n self.gridOptions2.api.refreshView();\r\n\r\n self.gridVisible = results.length > 0 ? true : false;\r\n }\r\n\r\n function anyError(importerResults) {\r\n var error = false;\r\n for (var i = 0; i < importerResults.length; i++) {\r\n if (importerResults[i].severity === 'Error')\r\n error = true;\r\n }\r\n\r\n return error;\r\n }\r\n\r\n var translations = null;\r\n function init() {\r\n\r\n setGridOptions();\r\n\r\n $translate([\"Category\", \"Competitors\", \"ClickHereViewCategory\", \"MarginGuidelines\", \"GenerateSuggestionsVarTooltipMin\", \"AllowMin\", \"AllowMax\", \"GenerateSuggestionsVarTooltipMax\", \"SignVar\", \"SignVarTooltip\", \"SignVarMargin\", \"SignVarMarginTooltip\"\r\n , \"MainCompetitor\", \"TargetMarginP\", \"TargetMargin\", \"AllowMinTooltip\", \"AllowMaxTooltip\", \"GoToTarget\", \"GoToTargetTooltip\"\r\n , \"KeepMargin\", \"KeepMarginTooltip\", \"PriceChanges\", \"DiscardConfirmTitle\", \"AreYouSureSwalSubtitle\", \"ContinueSwal\", \"CancelSwal\"\r\n , \"ConfirmedSwal\", \"ConfirmedSwalSubtitle\", \"ErrorTitleSwal\", \"ErrorSwalSubtitle\", \"WarningSwal\", \"NoChangeWasDetectedSwal\", \"PriceVariation\", \"LowPercentage\", \"RisePercentage\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions.api.setColumnDefs(columnDefs);\r\n });\r\n\r\n hideAmountParameters = companyJson.PriceRulesCategory.Grid.HideAmountParameters;\r\n\r\n //console.log('gridoptions', self.gridOptions);\r\n\r\n\r\n loadData();\r\n\r\n //init columnDefs and gridOptions\r\n\r\n\r\n }\r\n\r\n init();\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"PricesRulesCtrl\", function ($rootScope, $scope, $filter, $window, $timeout, $stateParams, $translate, priceService, serverService, Upload, companyJson, queueService, ngDialog) {\r\n\r\n var self = this;\r\n\r\n //General Variables\r\n self.companyCode = $rootScope.erp.Implementation;\r\n\r\n self.itemsRule = [];\r\n self.priceRulesTable = [];\r\n self.itemsInLookup = [];\r\n self.itemLookupText = '';\r\n\r\n self.priceRuleTypeNames = [];\r\n\r\n self.filter = {\r\n priceRuleTypeName: ''\r\n };\r\n\r\n self.filterByPriceRuleTypeName = function (type) {\r\n self.filter.priceRuleTypeName = type;\r\n }\r\n\r\n self.order = \"validFrom\";\r\n\r\n self.genericItems = [];\r\n\r\n self.isItemIncludeDisabled = false;\r\n self.includeAllItems = false;\r\n self.excludeAllItems = false;\r\n var columnDefs = null;\r\n self.gridOptions = null;\r\n\r\n self.priceRuleTypeLabelColors = ['label-danger', 'label-navy', 'label-warning', 'label-primary'];\r\n\r\n var previousLookupText = '';\r\n\r\n self.defaultPriceSurveyTypes = null;\r\n\r\n self.competitorGroupsParents = null;\r\n self.competitorGroups = null;\r\n self.competitorGroupsFilteredByParent = null;\r\n self.competitors = null;\r\n self.selectedRuleId = null;\r\n self.excludedItemId = null;\r\n self.existingRules = null;\r\n self.totalConflicts = 0;\r\n self.isLoadingRules = true;\r\n\r\n self.priceTypes = [];\r\n self.pricelists = [];\r\n self.vendors = [];\r\n self.categories = [];\r\n self.articlesGroup = [];\r\n self.allArticlesGroup = [];\r\n self.tags = [];\r\n self.itemSensitivities = [];\r\n self.zonePricelist = [];\r\n\r\n self.rules = null;\r\n self.dropDrownNewSuggestionRule = false;\r\n\r\n self.allVendorsChecked = true;\r\n self.allArticlesGroupChecked = true;\r\n self.allPriceListsChecked = true;\r\n self.allCategoriesChecked = true;\r\n\r\n self.isEditingCompetitiveRule = false;\r\n self.isEditingMarginRule = false;\r\n self.isEditingParentRule = false;\r\n self.isEditingZoneRule = false;\r\n self.isEditing = false;\r\n\r\n $translate([\"NewSuggestionRule\", \"NewParentRule\", \"Competitive\", \"Margin\", \"Products\", \"PriceZone\", \"Minimum\", \"Average\", \"Maximum\", \"Mode\"\r\n , \"LowestModePrice\", \"AverageModePrice\", \"HighestModePrice\", \"HighestRepetitions\", \"LowestPrice\", \"AveragePrice\", \"HighestPrice\"\r\n , \"Promotion\", \"Basket\", \"Price\", \"PriceVariation\", \"SwalReviewCategoryPriceRules\", \"Continue\", \"Cancel\", \"Delete\"\r\n , \"RequestQueued\", \"RequestQueuedInfo\", \"TheProcessContinues\", \"TheProcessContinuesReviewCategoryInfo\", \"AnErrorOccurredReviewingCategory\"\r\n , \"AreYouSureGeneratePriceSuggestions\", \"TheProcessContinuesGeneratePriceSuggestionsInfo\", \"AnErrorOccurredGeneratingSuggestions\", \"AreYouSureDeletePriceRule\"\r\n , \"DeletedRule\", \"DeletedRuleInfo\", \"TheProcessContinuesInfo\", \"AnErrorDeletingRule\", \"CompetitiveWrittenRule1\", \"IfMoreThanOneMode\", \"IfMoreThanOneModeWithSameReps\", \"OnlyCompetitorsInSamePriceZone\", \"SamePrice\", \"DifferenceOf\"\r\n , \"AreYouSureSwal\", \"of\", \"AreYouSureSwalSubtitle\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n self.dropDrownNewSuggestionRuleText = translations.NewSuggestionRule;\r\n self.dropDrownNewParentRuleText = translations.NewParentRule;\r\n self.suggestionRuleTypes = [{ id: 1, name: translations.Competitive }, { id: 2, name: translations.Margin }];\r\n self.parentRuleTypes = [{ id: 3, name: translations.Products }, { id: 4, name: translations.PriceZone }];\r\n self.calculationTypes = [{ id: 0, name: translations.Minimum }, { id: 1, name: translations.Average }, { id: 2, name: translations.Maximum }, { id: 3, name: translations.Mode }];\r\n self.modeFallbacks = [{ id: 0, name: translations.LowestModePrice }, { id: 1, name: translations.AveragePrice }, { id: 2, name: translations.HighestPrice }];\r\n self.modeTypes = [{ id: 0, name: translations.HighestRepetitions }, { id: 1, name: translations.LowestPrice }, { id: 2, name: translations.AveragePrice }, { id: 3, name: translations.HighestPrice }];\r\n\r\n /*\r\n self.priceSurveyTypes = [{ \"priceRuleId\": 0, \"priceSurveyType\": 1, \"priceSurveyTypeName\": translations.Basket, \"exclude\": 0 },\r\n { \"priceRuleId\": 0, \"priceSurveyType\": 2, \"priceSurveyTypeName\": \"Extra\", \"exclude\": 0 },\r\n { \"priceRuleId\": 0, \"priceSurveyType\": 3, \"priceSurveyTypeName\": \"PriceIndex\", \"exclude\": 0 },\r\n { \"priceRuleId\": 0, \"priceSurveyType\": 4, \"priceSurveyTypeName\": translations.Promotion, \"exclude\": 0 },\r\n { \"priceRuleId\": 0, \"priceSurveyType\": 6, \"priceSurveyTypeName\": \"Web\", \"exclude\": 0 }];\r\n */\r\n\r\n self.relationshipTypes = [{ id: 0, name: translations.Price }, { id: 1, name: translations.Margin }, { id: 2, name: translations.PriceVariation }];\r\n });\r\n\r\n self.dropDrownNewSuggestionRuleText = '';\r\n self.dropDrownNewParentRuleText = '';\r\n self.suggestionRuleTypes = [];\r\n self.parentRuleTypes = [];\r\n self.calculationTypes = [];\r\n self.modeFallbacks = [];\r\n self.modeTypes = [];\r\n\r\n self.priceSurveyTypes = [];\r\n\r\n self.relationshipTypes = [];\r\n\r\n self.excludedSubCategoryIds = [];\r\n self.excludedTags = [];\r\n self.parents = [];\r\n self.includedItemProperties = \"\";\r\n self.excludedItemProperties = \"\";\r\n self.includedItems = [];\r\n self.excludedItems = [];\r\n self.itemproperties = { priceRuleId: 0, value: \"\", exclude: false };\r\n self.exitemproperties = { priceRuleId: 0, value: \"\", exclude: true };\r\n\r\n self.showGenericItem = false;\r\n\r\n //General Functions\r\n self.cancel = function () {\r\n self.isEditing = false;\r\n self.setAsGenericParentRule = false;\r\n self.isEditingCompetitiveRule = false;\r\n self.isEditingMarginRule = false;\r\n self.isEditingParentRule = false;\r\n self.isEditingZoneRule = false;\r\n self.dropDrownNewSuggestionRule = false;\r\n\r\n self.allVendorsChecked = true;\r\n self.allArticlesGroupChecked = true;\r\n self.allPriceListsChecked = true;\r\n self.allCategoriesChecked = true;\r\n\r\n self.totalConflicts = 0;\r\n self.itemsRule = [];\r\n\r\n setItemSensitivities(self.itemSensitivities);\r\n setItemTags(self.tags);\r\n self.excludedItemId = null;\r\n self.competitors = null;\r\n self.zonePricelist = [];\r\n self.genericItems = [];\r\n self.existingCompetitiveRules = [];\r\n self.existingParentRules = [];\r\n self.excludedSubCategoryIds = [];\r\n self.includedItems = [];\r\n self.excludedItems = [];\r\n self.itemsInLookup = [];\r\n self.itemLookupText = '';\r\n var previousLookupText = '';\r\n self.includedItemProperties = \"\";\r\n self.excludedItemProperties = \"\";\r\n self.itemproperties = { priceRuleId: 0, value: \"\", exclude: false };\r\n self.exitemproperties = { priceRuleId: 0, value: \"\", exclude: true };\r\n self.gridOptions.api.forEachNode(function (n) {\r\n n.data.includeItem = false;\r\n n.data.excludeItem = false;\r\n });\r\n\r\n newCompetitiveRule();\r\n newMarginRule();\r\n newParentRule();\r\n newZoneRule();\r\n\r\n self.gridOptions.api.refreshView();\r\n\r\n }\r\n\r\n self.newRule = function (type) {\r\n self.isEditingCompetitiveRule = false;\r\n self.isEditingMarginRule = false;\r\n self.isEditingParentRule = false;\r\n self.isEditingZoneRule = false;\r\n\r\n switch (type.id) {\r\n case 1:\r\n self.isEditingCompetitiveRule = true;\r\n loadCompetitorGroupsParents();\r\n loadCompetitorGroups();\r\n break;\r\n case 2:\r\n self.isEditingMarginRule = true;\r\n break;\r\n case 3:\r\n self.isEditingParentRule = true;\r\n break;\r\n case 4:\r\n self.isEditingZoneRule = true;\r\n break;\r\n }\r\n }\r\n\r\n self.reviewCategory = function (suggestionsType) {\r\n\r\n swal({\r\n title: translations.SwalReviewCategoryPriceRules,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.Cancel,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n priceService.suggestion.reviewCategory($stateParams.categoryId, suggestionsType)\r\n .then(function (suggestions) {\r\n //swal(\"Revision de Categoria!\", \"Ha terminado el proceso de revision de categoria exitosamente. Se generaron \" + suggestions + \" sugerencias para esta categoria\", \"success\");\r\n swal(translations.RequestQueued, translations.RequestQueuedInfo, \"success\");\r\n\r\n //actualizo las tareas pendientes.\r\n queueService.queuedTasks.getTop5();\r\n }, function (status) {\r\n if (status == 502 || status == null) {\r\n swal(translations.TheProcessContinues, translations.TheProcessContinuesReviewCategoryInfo);\r\n }\r\n else {\r\n swal(translations.ErrorTitleSwal, translations.AnErrorOccurredReviewingCategory, \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.generateSuggestions = function () {\r\n\r\n swal({\r\n title: translations.AreYouSureGeneratePriceSuggestions,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.Cancel,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n priceService.suggestion.generateSuggestions($stateParams.categoryId)\r\n .then(function (suggestions) {\r\n //swal(\"Generacion de Sugerencias!\", \"El proceso termino exitosamente. Se generaron \" + suggestions + \" sugerencias para esta categoria\", \"success\");\r\n swal(translations.RequestQueued, translations.RequestQueuedInfo, \"success\");\r\n\r\n //actualizo las tareas pendientes.\r\n queueService.queuedTasks.getTop5();\r\n\r\n }, function (status) {\r\n console.log(status);\r\n if (status == 502) {\r\n swal(translations.TheProcessContinues, translations.TheProcessContinuesGeneratePriceSuggestionsInfo);\r\n }\r\n else {\r\n swal(translations.ErrorTitleSwal, translations.AnErrorOccurredGeneratingSuggestions, \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n function getEditingRuleName() {\r\n var rv = '';\r\n if (self.isEditingCompetitiveRule)\r\n rv = replaceAccents(self.competitiveRule.writtenRule);\r\n else if (self.isEditingMarginRule)\r\n rv = replaceAccents(self.marginRule.writtenRule);\r\n else if (self.isEditingParentRule)\r\n rv = replaceAccents(self.parentRule.writtenRule);\r\n else if (self.isEditingZoneRule)\r\n rv = replaceAccents(self.zoneRule.writtenRule);\r\n\r\n return rv;\r\n }\r\n function replaceAccents(str) {\r\n str = str.replace(\"á\", \"a\");\r\n str = str.replace(\"é\", \"e\");\r\n str = str.replace(\"í\", \"i\");\r\n str = str.replace(\"ó\", \"o\");\r\n str = str.replace(\"ú\", \"u\");\r\n\r\n return str;\r\n }\r\n\r\n self.saveRule = function (rule, type) {\r\n\r\n if (type == \"Competitive\")\r\n self.createCompetitorRule();\r\n else if (type == \"Margin\")\r\n self.createMarginRule();\r\n else if (type == \"Parent\")\r\n self.createParentRule();\r\n else if (type == \"Zone\")\r\n self.createZoneRule();\r\n };\r\n self.canSaveCompetitiveRule = function () {\r\n\r\n if (self.competitiveRule.writtenRule != null && self.totalConflicts == 0 && self.rules.length > 0 &&\r\n self.competitiveRule.pricelists != null && self.competitiveRule.pricelists.length > 0 &&\r\n self.competitiveRule.categories != null && self.competitiveRule.categories.length > 0 &&\r\n self.competitiveRule.priceSurveyTypes != null && self.competitiveRule.priceSurveyTypes.length > 0 &&\r\n (self.competitiveRule.calculationType != 3 ||\r\n (self.competitiveRule.calculationType == 3 &&\r\n (self.competitiveRule.modeType != null && self.competitiveRule.modeType == 0 && self.competitiveRule.modeFallback != null) || //Si es moda que mas se repite, que tenga el fallback\r\n (self.competitiveRule.modeType != null && self.competitiveRule.modeType != 0) //Si es moda Maxima o minima o mismo precio, no necesita el fallback\r\n )) &&\r\n (self.competitiveRule.competitorGroupParent != null || self.competitiveRule.competitorGroup != null || self.competitiveRule.competitor != null))\r\n return true;\r\n\r\n return false;\r\n };\r\n self.canSaveMarginRule = function () {\r\n if (self.marginRule.writtenRule != null && self.totalConflicts == 0 && self.rules.length > 0 &&\r\n self.marginRule.pricelists != null && self.marginRule.pricelists.length > 0 &&\r\n self.marginRule.categories != null && self.marginRule.categories.length > 0)\r\n return true;\r\n\r\n return false;\r\n };\r\n self.canSaveParentRule = function () {\r\n if (self.parentRule.writtenRule != null && self.parentRule.parent != null && self.totalConflicts == 0 && self.rules.length > 0 &&\r\n self.parentRule.pricelists != null && self.parentRule.pricelists.length > 0 &&\r\n self.parentRule.categories != null && self.parentRule.categories.length > 0)\r\n return true;\r\n\r\n return false;\r\n };\r\n self.canSaveZoneRule = function () {\r\n if (self.zoneRule.writtenRule != null && self.totalConflicts == 0 && self.rules.length > 0 &&\r\n self.zoneRule.pricelists != null && self.zoneRule.pricelists.length > 0 &&\r\n self.zoneRule.categories != null && self.zoneRule.categories.length > 0)\r\n return true;\r\n\r\n return false;\r\n };\r\n\r\n self.deleteRuleFromTable = function (priceRuleId) {\r\n swal({\r\n title: translations.AreYouSureDeletePriceRule,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#DD6B55\",\r\n confirmButtonText: translations.Delete,\r\n cancelButtonText: translations.Cancel,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n priceService.rules.deletePriceRule(priceRuleId)\r\n .then(function () {\r\n swal(translations.DeletedRule, translations.DeletedRuleInfo, 'success');\r\n reload(); //Reload Grid\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(translations.TheProcessContinues, translations.TheProcessContinuesInfo)\r\n }\r\n else {\r\n swal(translations.ErrorTitleSwal, translations.AnErrorDeletingRule, \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n function checkIfIsCurrentRule(nodeData) {\r\n var rv = false;\r\n if (self.isEditingMarginRule && self.marginRule && self.marginRule.id == nodeData.marginRuleId) {\r\n rv = true;\r\n }\r\n else if (self.isEditingCompetitiveRule && self.competitiveRule && self.competitiveRule.id == nodeData.competitiveRuleId) {\r\n rv = true;\r\n }\r\n else if (self.isEditingParentRule && self.parentRule && self.parentRule.id == nodeData.parentRuleZoneId) {\r\n rv = true;\r\n }\r\n else if (self.isEditingZoneRule && self.zoneRule && self.zoneRule.id == nodeData.parentRuleZoneId) {\r\n rv = true;\r\n }\r\n return rv;\r\n }\r\n\r\n self.mapItemExcludeToGrid = function () {\r\n self.gridOptions.api.forEachNode(function (node) {\r\n angular.forEach(self.itemsRule, function (itemRule) {\r\n if (node.data.itemId == itemRule.itemId) {\r\n if (itemRule.exclude == false) {\r\n node.data.includeItem = true;\r\n node.data.excludeItem = false;\r\n self.includeItem(node.data, true);\r\n }\r\n else if (itemRule.exclude == true){\r\n node.data.excludeItem = true;\r\n node.data.includeItem = false;\r\n self.includeItem(node.data, false);\r\n }\r\n }\r\n })\r\n })\r\n }\r\n\r\n self.initRuleEdition = function (priceRule) {\r\n self.isEditing = true;\r\n self.isEditingCompetitiveRule = false;\r\n self.isEditingMarginRule = false;\r\n self.isEditingParentRule = false;\r\n self.isEditingZoneRule = false;\r\n\r\n loadCompetitorGroupsParents();\r\n loadCompetitorGroups();\r\n\r\n priceService.rules.getPriceRule(priceRule.priceRuleId, priceRule.priceRuleType)\r\n .then(function (dto) {\r\n\r\n self.itemsRule = dto.items;\r\n self.mapItemExcludeToGrid();\r\n\r\n if (dto.categories && dto.categories.length > 0) {\r\n self.allCategoriesChecked = false;\r\n }\r\n if (dto.articlesGroup && dto.articlesGroup.length > 0) {\r\n self.allArticlesGroupChecked = false;\r\n }\r\n if (dto.priceLists && dto.priceLists.length > 0) {\r\n self.allPriceListsChecked = false;\r\n }\r\n if (dto.vendors && dto.vendors.length > 0) {\r\n self.allVendorsChecked = false;\r\n }\r\n switch (priceRule.priceRuleType) {\r\n case 1:\r\n //mapeo el id\r\n self.marginRule.id = dto.id;\r\n\r\n //mapeo el writtenRule\r\n self.marginRule.name = dto.name;\r\n\r\n //mapeo select simples\r\n if (dto.keepMargin == true) {\r\n self.marginRule.keepMarginType = 1;\r\n self.marginRule.marginRuleType = 2;\r\n }\r\n else if (dto.keepMarginAmount == true) {\r\n self.marginRule.keepMarginType = 2;\r\n self.marginRule.marginRuleType = 2;\r\n }\r\n else if (dto.marginAmount) {\r\n self.marginRule.marginType = 2;\r\n self.marginRule.marginRuleType = 1;\r\n self.marginRule.marginAmount = dto.marginAmount;\r\n }\r\n else {\r\n self.marginRule.marginType = 1;\r\n self.marginRule.marginRuleType = 1;\r\n self.marginRule.margin = dto.margin * 100;\r\n }\r\n //mapeo categorias\r\n self.marginRule.categories = [];\r\n angular.forEach(dto.categories, function (dtoCat) {\r\n var cat = self.categories.find(function (c) { return c.categoryId == dtoCat.categoryId });\r\n if (cat) {\r\n self.marginRule.categories.push(cat);\r\n }\r\n });\r\n $(\"#form_fieldCategories\").trigger(\"chosen:updated\");\r\n //mapeo grupo de categorias\r\n self.marginRule.articlesGroup = [];\r\n angular.forEach(dto.articlesGroup, function (dtoArtGrp) {\r\n var artGrp = self.articlesGroup.find(function (ag) { return ag.articleGroupId == dtoArtGrp.articleGroupId && dtoArtGrp.exclude == false });\r\n if (artGrp != null) {\r\n self.marginRule.articlesGroup.push(artGrp);\r\n }\r\n });\r\n $(\"#form_fieldArticlesGroup\").trigger(\"chosen:updated\");\r\n //mapeo priceslists\r\n self.marginRule.pricelists = [];\r\n angular.forEach(dto.priceLists, function (pListDto) {\r\n var pl = self.pricelists.find(function (p) { return p.priceListId == pListDto.priceListId && pListDto.exclude == false});\r\n if (pl) {\r\n self.marginRule.pricelists.push(pl);\r\n }\r\n });\r\n $(\"#form_fieldPriceLists\").trigger(\"chosen:updated\");\r\n //mapeo vendors\r\n self.marginRule.vendors = [];\r\n angular.forEach(dto.vendors, function (vDto) {\r\n var vendor = self.vendors.find(function (v) { return v.Id == vDto.Id && vDto.exclude == false});\r\n if (vendor) {\r\n self.marginRule.vendors.push(vendor);\r\n }\r\n });\r\n $(\"#form_fieldVendors\").trigger(\"chosen:updated\");\r\n //mapeo itemSensitivities\r\n self.marginRule.itemSensitivities = [];\r\n angular.forEach(dto.itemSensitivities, function (iSDto) {\r\n var itemSensitivities = self.itemSensitivitiesToInclude.find(function (item) { return item.itemSensitivityId == iSDto.itemSensitivityId && iSDto.exclude == false });\r\n if (itemSensitivities) {\r\n self.marginRule.itemSensitivities.push(itemSensitivities);\r\n }\r\n });\r\n $(\"#form_fieldItemSensitivities\").trigger(\"chosen:updated\");\r\n //mapeo tags\r\n self.marginRule.tags = [];\r\n angular.forEach(dto.tags, function (tDto) {\r\n var tag = self.itemTagsToInclude.find(function (t) { return t.tagId == tDto.tagId && tDto.exclude == false});\r\n if (tag) {\r\n self.marginRule.tags.push(tag);\r\n }\r\n });\r\n $(\"#form_fieldTags\").trigger(\"chosen:updated\");\r\n\r\n //mapeo itemProperties\r\n angular.forEach(dto.itemProperties, function (iDto) {\r\n if (iDto && iDto.exclude == false) {\r\n self.itemproperties.value = iDto.value;\r\n self.includeItemProperty(self.marginRule);\r\n }\r\n });\r\n\r\n //mapeo exArticleGroup\r\n self.marginRule.exarticlesGroup = [];\r\n angular.forEach(dto.articlesGroup, function (dtoArtGrp) {\r\n var exArtGrp = self.articlesGroup.find(function (eAg) { return eAg.articleGroupId == dtoArtGrp.articleGroupId && dtoArtGrp.exclude == true });\r\n if (exArtGrp != null) {\r\n self.marginRule.exarticlesGroup.push(exArtGrp);\r\n self.allArticlesGroupChecked = true;\r\n }\r\n });\r\n $(\"#form_fieldExArticlesGroup\").trigger(\"chosen:updated\");\r\n \r\n //mapeo exPricesLists\r\n self.marginRule.expricelists = [];\r\n angular.forEach(dto.priceLists, function (pListDto) {\r\n var exPl = self.pricelists.find(function (p) { return p.priceListId == pListDto.priceListId && pListDto.exclude == true });\r\n if (exPl) {\r\n self.marginRule.expricelists.push(exPl);\r\n }\r\n });\r\n if (self.marginRule.expricelists.length > 0) {\r\n self.allPriceListsChecked = true;\r\n }\r\n $(\"#form_fieldExPriceLists\").trigger(\"chosen:updated\");\r\n //mapeo exVendors\r\n self.marginRule.exvendors = [];\r\n angular.forEach(dto.vendors, function (vDto) {\r\n var exVendor = self.vendors.find(function (v) { return v.Id == vDto.Id && vDto.exclude == true });\r\n if (exVendor) {\r\n self.marginRule.exvendors.push(exVendor);\r\n }\r\n });\r\n if (self.marginRule.exvendors.length > 0) {\r\n self.allVendorsChecked = true;\r\n }\r\n $(\"#form_fieldExVendors\").trigger(\"chosen:updated\");\r\n //mapeo exItemSensitivities\r\n self.marginRule.exitemSensitivities = [];\r\n angular.forEach(dto.itemSensitivities, function (eIsDto) {\r\n var exItemSensitivities = self.itemSensitivitiesToExclude.find(function (item) { return item.itemSensitivityId == eIsDto.itemSensitivityId && eIsDto.exclude == true});\r\n if (exItemSensitivities) {\r\n self.marginRule.exitemSensitivities.push(exItemSensitivities);\r\n }\r\n });\r\n $(\"#form_fieldExItemSensitivities\").trigger(\"chosen:updated\");\r\n //mapeo exTags\r\n self.marginRule.extags = [];\r\n angular.forEach(dto.tags, function (exTagDto) {\r\n var exTags = self.itemTagsToExclude.find(function (exTag) { return exTag.tagId == exTagDto.tagId && exTagDto.exclude == true });\r\n if (exTags) {\r\n self.marginRule.extags.push(exTags);\r\n }\r\n });\r\n $(\"#form_fieldExTags\").trigger(\"chosen:updated\");\r\n\r\n //mapeo exItemProperties\r\n angular.forEach(dto.itemProperties, function (iDto) {\r\n if (iDto && iDto.exclude == true) {\r\n self.exitemproperties.value = iDto.value;\r\n self.excludeItemProperty(self.marginRule);\r\n }\r\n });\r\n break;\r\n case 2:\r\n //mapeo el id\r\n self.competitiveRule.id = dto.id;\r\n\r\n //mapeo el writtenRule\r\n self.competitiveRule.writtenRule = dto.name;\r\n\r\n //mapeo select simples\r\n if (dto.competitorId) {\r\n priceService.competitors.competitors().then(function (competitors) {\r\n self.competitors = competitors;\r\n if (self.competitors) {\r\n var competitor = self.competitors.find(function (c) { return c.id == dto.competitorId });\r\n self.competitiveRule.competitor = competitor;\r\n }\r\n });\r\n }\r\n else if (dto.competitorGroupId) {\r\n if (self.competitorGroupsParents) {\r\n var competitorGroupParent = self.competitorGroupsParents.find(function (cgp) { return cgp.id == dto.competitorGroupId });\r\n }\r\n if (self.competitorGroupsFilteredByParent) {\r\n var competitorGroup = self.competitorGroupsFilteredByParent.find(function (cgfp) { return cgfp.id == dto.competitorGroupId });\r\n }\r\n if (competitorGroupParent) {\r\n self.competitiveRule.competitorGroupParent = competitorGroupParent;\r\n }\r\n if (competitorGroup) {\r\n self.competitiveRule.competitorGroupParent = self.competitorGroupsParents.find(function (cgp) { return cgp.id == competitorGroup.parentId });\r\n self.competitiveRule.competitorGroup = competitorGroup;\r\n }\r\n }\r\n //mapeo fuentes de monitoreo\r\n if (dto.priceSurveyTypes) {\r\n self.competitiveRule.priceSurveyTypes = dto.priceSurveyTypes;\r\n }\r\n\r\n //mapeo diferencia en\r\n if (dto.percentageDifference1) {\r\n self.competitiveRule.differenceType = '1';\r\n self.competitiveRule.competitiveDifference = dto.percentageDifference1 * 100;\r\n }\r\n else if (dto.priceDifference1) {\r\n self.competitiveRule.differenceType = '2';\r\n self.competitiveRule.competitiveDifference = dto.priceDifference1;\r\n }\r\n //mapeo usar y modeType\r\n if (dto.calculationType != null) {\r\n self.competitiveRule.calculationType = dto.calculationType;\r\n if (dto.calculationType == 3) {\r\n if (dto.modeType != null) {\r\n self.competitiveRule.modeType = dto.modeType;\r\n }\r\n if (dto.modeFallback != null) {\r\n self.competitiveRule.modeFallback = dto.modeFallback;\r\n }\r\n }\r\n }\r\n //mapeo Considerar solo competidores en la misma zona de precios\r\n if (dto.onlyCompetitorsWithSamePriceList != null) {\r\n self.competitiveRule.onlyCompetitorsWithSamePriceList = dto.onlyCompetitorsWithSamePriceList;\r\n }\r\n \r\n //mapeo categorias\r\n self.competitiveRule.categories = [];\r\n angular.forEach(dto.categories, function (dtoCat) {\r\n var cat = self.categories.find(function (c) { return c.categoryId == dtoCat.categoryId });\r\n if (cat) {\r\n self.competitiveRule.categories.push(cat);\r\n }\r\n });\r\n $(\"#form_fieldCategories\").trigger(\"chosen:updated\");\r\n\r\n //mapeo grupo de categorias\r\n self.competitiveRule.articlesGroup = [];\r\n angular.forEach(dto.articlesGroup, function (dtoArtGrp) {\r\n var artGrp = self.articlesGroup.find(function (ag) { return ag.articleGroupId == dtoArtGrp.articleGroupId && dtoArtGrp.exclude == false });\r\n if (artGrp != null) {\r\n self.competitiveRule.articlesGroup.push(artGrp);\r\n }\r\n });\r\n $(\"#form_fieldArticlesGroup\").trigger(\"chosen:updated\");\r\n\r\n //mapeo priceslists\r\n self.competitiveRule.pricelists = [];\r\n angular.forEach(dto.priceLists, function (pListDto) {\r\n var pl = self.pricelists.find(function (p) { return p.priceListId == pListDto.priceListId && pListDto.exclude == false });\r\n if (pl) {\r\n self.competitiveRule.pricelists.push(pl);\r\n }\r\n });\r\n $(\"#form_fieldPriceLists\").trigger(\"chosen:updated\");\r\n //mapeo vendors\r\n self.competitiveRule.vendors = [];\r\n angular.forEach(dto.vendors, function (vDto) {\r\n var vendor = self.vendors.find(function (v) { return v.Id == vDto.Id && vDto.exclude == false });\r\n if (vendor) {\r\n self.competitiveRule.vendors.push(vendor);\r\n }\r\n });\r\n $(\"#form_fieldVendors\").trigger(\"chosen:updated\");\r\n //mapeo itemSensitivities\r\n self.competitiveRule.itemSensitivities = [];\r\n angular.forEach(dto.itemSensitivities, function (iSDto) {\r\n var itemSensitivities = self.itemSensitivitiesToInclude.find(function (item) { return item.itemSensitivityId == iSDto.itemSensitivityId && iSDto.exclude == false });\r\n if (itemSensitivities) {\r\n self.competitiveRule.itemSensitivities.push(itemSensitivities);\r\n }\r\n });\r\n $(\"#form_fieldItemSensitivities\").trigger(\"chosen:updated\");\r\n //mapeo tags\r\n self.competitiveRule.tags = [];\r\n angular.forEach(dto.tags, function (tDto) {\r\n var tag = self.itemTagsToInclude.find(function (t) { return t.tagId == tDto.tagId && tDto.exclude == false });\r\n if (tag) {\r\n self.competitiveRule.tags.push(tag);\r\n }\r\n });\r\n $(\"#form_fieldTags\").trigger(\"chosen:updated\");\r\n\r\n //mapeo itemProperties\r\n angular.forEach(dto.itemProperties, function (iDto) {\r\n if (iDto && iDto.exclude == false) {\r\n self.itemproperties.value = iDto.value;\r\n self.includeItemProperty(self.competitiveRule);\r\n }\r\n });\r\n\r\n //mapeo exArticleGroup\r\n self.competitiveRule.exarticlesGroup = [];\r\n angular.forEach(dto.articlesGroup, function (dtoArtGrp) {\r\n var exArtGrp = self.articlesGroup.find(function (eAg) { return eAg.articleGroupId == dtoArtGrp.articleGroupId && dtoArtGrp.exclude == true });\r\n if (exArtGrp != null) {\r\n self.competitiveRule.exarticlesGroup.push(exArtGrp);\r\n self.allArticlesGroupChecked = true;\r\n }\r\n });\r\n $(\"#form_fieldExArticlesGroup\").trigger(\"chosen:updated\");\r\n\r\n //mapeo exPricesLists\r\n self.competitiveRule.expricelists = [];\r\n angular.forEach(dto.priceLists, function (pListDto) {\r\n var exPl = self.pricelists.find(function (p) { return p.priceListId == pListDto.priceListId && pListDto.exclude == true });\r\n if (exPl) {\r\n self.competitiveRule.expricelists.push(exPl);\r\n }\r\n });\r\n if (self.competitiveRule.expricelists.length > 0) {\r\n self.allPriceListsChecked = true;\r\n }\r\n $(\"#form_fieldExPriceLists\").trigger(\"chosen:updated\");\r\n //mapeo exVendors\r\n self.competitiveRule.exvendors = [];\r\n angular.forEach(dto.vendors, function (vDto) {\r\n var exVendor = self.vendors.find(function (v) { return v.Id == vDto.Id && vDto.exclude == true });\r\n if (exVendor) {\r\n self.competitiveRule.exvendors.push(exVendor);\r\n }\r\n });\r\n if (self.competitiveRule.exvendors.length > 0) {\r\n self.allVendorsChecked = true;\r\n }\r\n $(\"#form_fieldExVendors\").trigger(\"chosen:updated\");\r\n //mapeo exItemSensitivities\r\n self.competitiveRule.exitemSensitivities = [];\r\n angular.forEach(dto.itemSensitivities, function (eIsDto) {\r\n var exItemSensitivities = self.itemSensitivitiesToExclude.find(function (item) { return item.itemSensitivityId == eIsDto.itemSensitivityId && eIsDto.exclude == true });\r\n if (exItemSensitivities) {\r\n self.competitiveRule.exitemSensitivities.push(exItemSensitivities);\r\n }\r\n });\r\n $(\"#form_fieldExItemSensitivities\").trigger(\"chosen:updated\");\r\n //mapeo exTags\r\n self.competitiveRule.extags = [];\r\n angular.forEach(dto.tags, function (exTagDto) {\r\n var exTags = self.itemTagsToExclude.find(function (exTag) { return exTag.tagId == exTagDto.tagId && exTagDto.exclude == true });\r\n if (exTags) {\r\n self.competitiveRule.extags.push(exTags);\r\n }\r\n });\r\n $(\"#form_fieldExTags\").trigger(\"chosen:updated\");\r\n\r\n //mapeo exItemProperties\r\n angular.forEach(dto.itemProperties, function (iDto) {\r\n if (iDto && iDto.exclude == true) {\r\n self.exitemproperties.value = iDto.value;\r\n self.excludeItemProperty(self.competitiveRule);\r\n }\r\n });\r\n break;\r\n case 3:\r\n //mapeo el id\r\n self.parentRule.id = dto.id;\r\n\r\n //mapeo el writtenRule\r\n self.parentRule.writtenRule = dto.name;\r\n\r\n //mapeo select simples\r\n if (dto.mainItemId != null && dto.mainItemUmvId) {\r\n priceService.lookups.itemLookupByMainItemId(dto.mainItemId, dto.mainItemUmvId).then(function (item) {\r\n self.itemLookupOnItemSelect(item);\r\n });\r\n }\r\n\r\n if (dto.relationshipType != null) {\r\n var relationshipType = self.relationshipTypes.find(function (rst) { return rst.id == dto.relationshipType });\r\n self.parentRule.relationshipType = relationshipType;\r\n }\r\n if (dto.percentageDifference2 != null) {\r\n self.parentRule.differenceType = \"1\";\r\n self.parentRule.difference = dto.percentageDifference2 * 100;\r\n }\r\n else if (dto.priceDifference2 != null) {\r\n self.parentRule.differenceType = \"2\";\r\n self.parentRule.difference = dto.priceDifference2;\r\n }\r\n\r\n //mapeo categorias\r\n self.parentRule.categories = [];\r\n angular.forEach(dto.categories, function (dtoCat) {\r\n var cat = self.categories.find(function (c) { return c.categoryId == dtoCat.categoryId });\r\n if (cat) {\r\n self.parentRule.categories.push(cat);\r\n }\r\n });\r\n $(\"#form_fieldCategories\").trigger(\"chosen:updated\");\r\n\r\n //mapeo grupo de categorias\r\n self.parentRule.articlesGroup = [];\r\n angular.forEach(dto.articlesGroup, function (dtoArtGrp) {\r\n var artGrp = self.articlesGroup.find(function (ag) { return ag.articleGroupId == dtoArtGrp.articleGroupId && dtoArtGrp.exclude == false });\r\n if (artGrp != null) {\r\n self.parentRule.articlesGroup.push(artGrp);\r\n }\r\n });\r\n $(\"#form_fieldArticlesGroup\").trigger(\"chosen:updated\");\r\n\r\n //mapeo priceslists\r\n self.parentRule.pricelists = [];\r\n angular.forEach(dto.priceLists, function (pListDto) {\r\n var pl = self.pricelists.find(function (p) { return p.priceListId == pListDto.priceListId && pListDto.exclude == false });\r\n if (pl) {\r\n self.parentRule.pricelists.push(pl);\r\n }\r\n });\r\n $(\"#form_fieldPriceLists\").trigger(\"chosen:updated\");\r\n //mapeo vendors\r\n self.parentRule.vendors = [];\r\n angular.forEach(dto.vendors, function (vDto) {\r\n var vendor = self.vendors.find(function (v) { return v.Id == vDto.Id && vDto.exclude == false });\r\n if (vendor) {\r\n self.parentRule.vendors.push(vendor);\r\n }\r\n });\r\n $(\"#form_fieldVendors\").trigger(\"chosen:updated\");\r\n //mapeo itemSensitivities\r\n self.parentRule.itemSensitivities = [];\r\n angular.forEach(dto.itemSensitivities, function (iSDto) {\r\n var itemSensitivities = self.itemSensitivitiesToInclude.find(function (item) { return item.itemSensitivityId == iSDto.itemSensitivityId && iSDto.exclude == false });\r\n if (itemSensitivities) {\r\n self.parentRule.itemSensitivities.push(itemSensitivities);\r\n }\r\n });\r\n $(\"#form_fieldItemSensitivities\").trigger(\"chosen:updated\");\r\n //mapeo tags\r\n self.parentRule.tags = [];\r\n angular.forEach(dto.tags, function (tDto) {\r\n var tag = self.itemTagsToInclude.find(function (t) { return t.tagId == tDto.tagId && tDto.exclude == false });\r\n if (tag) {\r\n self.parentRule.tags.push(tag);\r\n }\r\n });\r\n $(\"#form_fieldTags\").trigger(\"chosen:updated\");\r\n\r\n //mapeo itemProperties\r\n angular.forEach(dto.itemProperties, function (iDto) {\r\n if (iDto && iDto.exclude == false) {\r\n self.itemproperties.value = iDto.value;\r\n self.includeItemProperty(self.parentRule);\r\n }\r\n });\r\n\r\n //mapeo exArticleGroup\r\n self.parentRule.exarticlesGroup = [];\r\n angular.forEach(dto.articlesGroup, function (dtoArtGrp) {\r\n var exArtGrp = self.articlesGroup.find(function (eAg) { return eAg.articleGroupId == dtoArtGrp.articleGroupId && dtoArtGrp.exclude == true });\r\n if (exArtGrp != null) {\r\n self.parentRule.exarticlesGroup.push(exArtGrp);\r\n self.allArticlesGroupChecked = true;\r\n }\r\n });\r\n $(\"#form_fieldExArticlesGroup\").trigger(\"chosen:updated\");\r\n\r\n //mapeo exPricesLists\r\n self.parentRule.expricelists = [];\r\n angular.forEach(dto.priceLists, function (pListDto) {\r\n var exPl = self.pricelists.find(function (p) { return p.priceListId == pListDto.priceListId && pListDto.exclude == true });\r\n if (exPl) {\r\n self.parentRule.expricelists.push(exPl);\r\n }\r\n });\r\n if (self.parentRule.expricelists.length > 0) {\r\n self.allPriceListsChecked = true;\r\n }\r\n $(\"#form_fieldExPriceLists\").trigger(\"chosen:updated\");\r\n //mapeo exVendors\r\n self.parentRule.exvendors = [];\r\n angular.forEach(dto.vendors, function (vDto) {\r\n var exVendor = self.vendors.find(function (v) { return v.Id == vDto.Id && vDto.exclude == true });\r\n if (exVendor) {\r\n self.parentRule.exvendors.push(exVendor);\r\n }\r\n });\r\n if (self.parentRule.exvendors.length > 0) {\r\n self.allVendorsChecked = true;\r\n }\r\n $(\"#form_fieldExVendors\").trigger(\"chosen:updated\");\r\n //mapeo exItemSensitivities\r\n self.parentRule.exitemSensitivities = [];\r\n angular.forEach(dto.itemSensitivities, function (eIsDto) {\r\n var exItemSensitivities = self.itemSensitivitiesToExclude.find(function (item) { return item.itemSensitivityId == eIsDto.itemSensitivityId && eIsDto.exclude == true });\r\n if (exItemSensitivities) {\r\n self.parentRule.exitemSensitivities.push(exItemSensitivities);\r\n }\r\n });\r\n $(\"#form_fieldExItemSensitivities\").trigger(\"chosen:updated\");\r\n //mapeo exTags\r\n self.parentRule.extags = [];\r\n angular.forEach(dto.tags, function (exTagDto) {\r\n var exTags = self.itemTagsToExclude.find(function (exTag) { return exTag.tagId == exTagDto.tagId && exTagDto.exclude == true });\r\n if (exTags) {\r\n self.parentRule.extags.push(exTags);\r\n }\r\n });\r\n $(\"#form_fieldExTags\").trigger(\"chosen:updated\");\r\n\r\n //mapeo exItemProperties\r\n angular.forEach(dto.itemProperties, function (iDto) {\r\n if (iDto && iDto.exclude == true) {\r\n self.exitemproperties.value = iDto.value;\r\n self.excludeItemProperty(self.parentRule);\r\n }\r\n });\r\n\r\n break;\r\n case 4:\r\n //mapeo el id\r\n self.zoneRule.id = dto.id;\r\n\r\n //mapeo el writtenRule\r\n self.zoneRule.writtenRule = dto.name;\r\n\r\n //mapeo select simples\r\n if (dto.mainPriceListId != null) {\r\n var mainPriceList = self.pricelists.find(function (pl) { return pl.priceListId == dto.mainPriceListId });\r\n self.zoneRule.zone = mainPriceList;\r\n }\r\n\r\n if (dto.relationshipType != null) {\r\n var relationshipType = self.relationshipTypes.find(function (rst) { return rst.id == dto.relationshipType });\r\n self.zoneRule.relationshipType = relationshipType;\r\n }\r\n if (dto.percentageDifference2 != null) {\r\n self.zoneRule.differenceType = \"1\";\r\n self.zoneRule.difference = dto.percentageDifference2 * 100;\r\n }\r\n else if (dto.priceDifference2 != null) {\r\n self.zoneRule.differenceType = \"2\";\r\n self.zoneRule.difference = dto.priceDifference2;\r\n }\r\n\r\n //mapeo categorias\r\n self.zoneRule.categories = [];\r\n angular.forEach(dto.categories, function (dtoCat) {\r\n var cat = self.categories.find(function (c) { return c.categoryId == dtoCat.categoryId });\r\n if (cat) {\r\n self.zoneRule.categories.push(cat);\r\n }\r\n });\r\n $(\"#form_fieldCategories\").trigger(\"chosen:updated\");\r\n\r\n //mapeo grupo de categorias\r\n self.zoneRule.articlesGroup = [];\r\n angular.forEach(dto.articlesGroup, function (dtoArtGrp) {\r\n var artGrp = self.articlesGroup.find(function (ag) { return ag.articleGroupId == dtoArtGrp.articleGroupId && dtoArtGrp.exclude == false });\r\n if (artGrp != null) {\r\n self.zoneRule.articlesGroup.push(artGrp);\r\n }\r\n });\r\n $(\"#form_fieldArticlesGroup\").trigger(\"chosen:updated\");\r\n\r\n //mapeo priceslists\r\n self.zoneRule.pricelists = [];\r\n angular.forEach(dto.priceLists, function (pListDto) {\r\n var pl = self.zonePricelist.find(function (p) { return p.priceListId == pListDto.priceListId && pListDto.exclude == false });\r\n if (pl) {\r\n self.zoneRule.pricelists.push(pl);\r\n }\r\n });\r\n $(\"#form_fieldPriceLists\").trigger(\"chosen:updated\");\r\n //mapeo vendors\r\n self.zoneRule.vendors = [];\r\n angular.forEach(dto.vendors, function (vDto) {\r\n var vendor = self.vendors.find(function (v) { return v.Id == vDto.Id && vDto.exclude == false });\r\n if (vendor) {\r\n self.zoneRule.vendors.push(vendor);\r\n }\r\n });\r\n $(\"#form_fieldVendors\").trigger(\"chosen:updated\");\r\n //mapeo itemSensitivities\r\n self.zoneRule.itemSensitivities = [];\r\n angular.forEach(dto.itemSensitivities, function (iSDto) {\r\n var itemSensitivities = self.itemSensitivitiesToInclude.find(function (item) { return item.itemSensitivityId == iSDto.itemSensitivityId && iSDto.exclude == false });\r\n if (itemSensitivities) {\r\n self.zoneRule.itemSensitivities.push(itemSensitivities);\r\n }\r\n });\r\n $(\"#form_fieldItemSensitivities\").trigger(\"chosen:updated\");\r\n //mapeo tags\r\n self.zoneRule.tags = [];\r\n angular.forEach(dto.tags, function (tDto) {\r\n var tag = self.itemTagsToInclude.find(function (t) { return t.tagId == tDto.tagId && tDto.exclude == false });\r\n if (tag) {\r\n self.zoneRule.tags.push(tag);\r\n }\r\n });\r\n $(\"#form_fieldTags\").trigger(\"chosen:updated\");\r\n\r\n //mapeo itemProperties\r\n angular.forEach(dto.itemProperties, function (iDto) {\r\n if (iDto && iDto.exclude == false) {\r\n self.itemproperties.value = iDto.value;\r\n self.includeItemProperty(self.zoneRule);\r\n }\r\n });\r\n\r\n //mapeo exArticleGroup\r\n self.zoneRule.exarticlesGroup = [];\r\n angular.forEach(dto.articlesGroup, function (dtoArtGrp) {\r\n var exArtGrp = self.articlesGroup.find(function (eAg) { return eAg.articleGroupId == dtoArtGrp.articleGroupId && dtoArtGrp.exclude == true });\r\n if (exArtGrp != null) {\r\n self.zoneRule.exarticlesGroup.push(exArtGrp);\r\n self.allArticlesGroupChecked = true;\r\n }\r\n });\r\n $(\"#form_fieldExArticlesGroup\").trigger(\"chosen:updated\");\r\n\r\n //mapeo exPricesLists\r\n self.zoneRule.expricelists = [];\r\n angular.forEach(dto.priceLists, function (pListDto) {\r\n var exPl = self.zonePricelist.find(function (p) { return p.priceListId == pListDto.priceListId && pListDto.exclude == true });\r\n if (exPl) {\r\n self.zoneRule.expricelists.push(exPl);\r\n }\r\n });\r\n if (self.zoneRule.expricelists.length > 0) {\r\n self.allPriceListsChecked = true;\r\n }\r\n $(\"#form_fieldExPriceLists\").trigger(\"chosen:updated\");\r\n //mapeo exVendors\r\n self.zoneRule.exvendors = [];\r\n angular.forEach(dto.vendors, function (vDto) {\r\n var exVendor = self.vendors.find(function (v) { return v.Id == vDto.Id && vDto.exclude == true });\r\n if (exVendor) {\r\n self.zoneRule.exvendors.push(exVendor);\r\n }\r\n });\r\n if (self.zoneRule.exvendors.length > 0) {\r\n self.allVendorsChecked = true;\r\n }\r\n $(\"#form_fieldExVendors\").trigger(\"chosen:updated\");\r\n //mapeo exItemSensitivities\r\n self.zoneRule.exitemSensitivities = [];\r\n angular.forEach(dto.itemSensitivities, function (eIsDto) {\r\n var exItemSensitivities = self.itemSensitivitiesToExclude.find(function (item) { return item.itemSensitivityId == eIsDto.itemSensitivityId && eIsDto.exclude == true });\r\n if (exItemSensitivities) {\r\n self.zoneRule.exitemSensitivities.push(exItemSensitivities);\r\n }\r\n });\r\n $(\"#form_fieldExItemSensitivities\").trigger(\"chosen:updated\");\r\n //mapeo exTags\r\n self.zoneRule.extags = [];\r\n angular.forEach(dto.tags, function (exTagDto) {\r\n var exTags = self.itemTagsToExclude.find(function (exTag) { return exTag.tagId == exTagDto.tagId && exTagDto.exclude == true });\r\n if (exTags) {\r\n self.zoneRule.extags.push(exTags);\r\n }\r\n });\r\n $(\"#form_fieldExTags\").trigger(\"chosen:updated\");\r\n\r\n //mapeo exItemProperties\r\n angular.forEach(dto.itemProperties, function (iDto) {\r\n if (iDto && iDto.exclude == true) {\r\n self.exitemproperties.value = iDto.value;\r\n self.excludeItemProperty(self.zoneRule);\r\n }\r\n });\r\n break;\r\n }\r\n });\r\n \r\n switch (priceRule.priceRuleType) {\r\n case 1:\r\n self.isEditingMarginRule = true;\r\n break;\r\n case 2:\r\n self.isEditingCompetitiveRule = true;\r\n break;\r\n case 3:\r\n self.isEditingParentRule = true;\r\n break;\r\n case 4:\r\n self.isEditingZoneRule = true;\r\n break;\r\n }\r\n }\r\n\r\n self.selectAllPriceListsForRule = function (rule) {\r\n if (self.allPriceListsChecked) {\r\n rule.pricelists = angular.copy(self.pricelists);\r\n rule.expricelists = [];\r\n }\r\n else {\r\n rule.pricelists = [];\r\n rule.expricelists = [];\r\n }\r\n }\r\n self.selectAllVendorsForRule = function (rule) {\r\n if (self.allVendorsChecked) {\r\n rule.vendors = angular.copy(self.vendors);\r\n rule.exvendors = [];\r\n }\r\n else {\r\n rule.vendors = [];\r\n rule.exvendors = [];\r\n }\r\n }\r\n self.selectAllCategoriesForRule = function (rule) {\r\n if (self.allCategoriesChecked) {\r\n rule.categories = angular.copy(self.categories);\r\n rule.excategories = [];\r\n self.selectAllArticlesGroupForRule(rule);\r\n }\r\n else {\r\n rule.categories = [];\r\n rule.excategories = [];\r\n }\r\n }\r\n self.selectAllArticlesGroupForRule = function (rule) {\r\n if (self.allArticlesGroupChecked) {\r\n rule.articlesGroup = angular.copy(self.allArticlesGroup);\r\n rule.exarticlesGroup = [];\r\n }\r\n else {\r\n rule.articlesGroup = [];\r\n rule.exarticlesGroup = [];\r\n }\r\n }\r\n self.addItemsToInclude = function (rule) {\r\n\r\n var itemsToInclude = [];\r\n if (!self.isItemIncludeDisabled) {\r\n for (var i = 0; i < self.includedItems.length; i++) { //Agrego los items a Incluir\r\n itemsToInclude.push({ itemId: self.includedItems[i].itemId, exclude: false, umvId: self.includedItems[i].umvId })\r\n }\r\n }\r\n\r\n for (var i = 0; i < self.excludedItems.length; i++) { //Agrego los items a Excluir\r\n itemsToInclude.push({ itemId: self.excludedItems[i].itemId, exclude: true, umvId: self.excludedItems[i].umvId })\r\n }\r\n\r\n rule.items = itemsToInclude;\r\n };\r\n self.addExcluded = function (rule) {\r\n //Agregar PriceLists Excluidas\r\n for (var i = 0; i < rule.expricelists.length; i++) {\r\n for (var j = 0; j < rule.pricelists.length; j++) {\r\n if (rule.expricelists[i].priceListId == rule.pricelists[j].priceListId)\r\n rule.pricelists[j].exclude = true;\r\n }\r\n }\r\n\r\n //Agregar Vendors Excluidos\r\n for (var i = 0; i < rule.exvendors.length; i++) {\r\n for (var j = 0; j < rule.vendors.length; j++) {\r\n if (rule.exvendors[i].vendorId == rule.vendors[j].vendorId)\r\n rule.vendors[j].exclude = true;\r\n }\r\n }\r\n\r\n //Agregar Grupos de articulos Excluidos\r\n for (var i = 0; i < rule.exarticlesGroup.length; i++) {\r\n for (var j = 0; j < rule.articlesGroup.length; j++) {\r\n if (rule.exarticlesGroup[i].articleGroupId == rule.articlesGroup[j].articleGroupId)\r\n rule.articlesGroup[j].exclude = true;\r\n }\r\n }\r\n\r\n //Agregar ItemSensitivities Excluidas\r\n if (rule.itemSensitivities.length == 0 && rule.exitemSensitivities.length > 0) {\r\n _.forEach(rule.exitemSensitivities, function (es, key) {\r\n rule.itemSensitivities.push(es);\r\n });\r\n }\r\n\r\n //Agregar Tags Excluidos\r\n if (rule.tags.length == 0 && rule.extags.length > 0) {\r\n _.forEach(rule.extags, function (et, key) {\r\n rule.tags.push(et);\r\n });\r\n }\r\n\r\n //Agregar ItemProperties Excluidos\r\n if (rule.exitemproperties.length > 0) {\r\n _.forEach(rule.exitemproperties, function (eip, key) {\r\n rule.itemproperties.push(eip);\r\n });\r\n }\r\n\r\n //Agregar Categorias Excluidas\r\n for (var i = 0; i < rule.excategories.length; i++) {\r\n for (var j = rule.categories.length - 1; j >= 0; j--) {\r\n if (rule.excategories[i].categoryId == rule.categories[j].categoryId)\r\n rule.categories.splice(j, 1);\r\n }\r\n }\r\n\r\n self.addItemsToInclude(rule);\r\n }\r\n self.includeItemProperty = function (rule) {\r\n if (self.itemproperties.value != '') {\r\n rule.itemproperties.push(angular.copy(self.itemproperties));\r\n if (self.includedItemProperties == \"\")\r\n self.includedItemProperties += self.itemproperties.value;\r\n else\r\n self.includedItemProperties += \", \" + self.itemproperties.value;\r\n self.itemproperties.value = \"\";\r\n }\r\n }\r\n self.excludeItemProperty = function (rule) {\r\n if (self.exitemproperties.value != '') {\r\n rule.exitemproperties.push(angular.copy(self.exitemproperties));\r\n if (self.excludedItemProperties == \"\")\r\n self.excludedItemProperties += self.exitemproperties.value;\r\n else\r\n self.excludedItemProperties += \", \" + self.exitemproperties.value;\r\n self.exitemproperties.value = \"\";\r\n }\r\n }\r\n self.deleteItemProperties = function (rule, isExclude) {\r\n if (isExclude) {\r\n self.excludedItemProperties = '';\r\n rule.exitemproperties = [];\r\n }\r\n else {\r\n self.includedItemProperties = '';\r\n rule.itemproperties = [];\r\n }\r\n }\r\n\r\n self.categoryChanged = function (rule) {\r\n self.articlesGroup = getArticleGroupsForCategories(rule.categories);\r\n rule.articlesGroup = angular.copy(self.articlesGroup);\r\n self.allArticlesGroupChecked = true;\r\n }\r\n\r\n getArticleGroupsForCategories = function (categories) {\r\n var rv = [];\r\n\r\n angular.forEach(categories, function (c) {\r\n angular.forEach(self.allArticlesGroup, function (ga) {\r\n if (ga.articleGroupParentId == c.categoryId)\r\n rv.push(ga);\r\n });\r\n });\r\n\r\n return rv;\r\n }\r\n\r\n self.existingCompetitiveRules = [];\r\n self.existingRuleSelectedCompetitive = function (rule) {\r\n if (rule != null) {\r\n self.competitiveRule.id = rule.id;\r\n self.competitiveRule.writtenRule = translations.RULE + rule.name;\r\n self.competitiveRule.competitorGroup = 0;\r\n self.competitiveRule.competitorGroupParent = 0\r\n }\r\n else {\r\n self.competitiveRule.id = null;\r\n self.competitiveRule.writtenRule = null;\r\n self.competitiveRule.competitorGroup = null;\r\n self.competitiveRule.competitorGroupParent = null;\r\n }\r\n }\r\n\r\n $scope.$watch('ct.competitiveRule', function (newVal, oldVal) {\r\n\r\n if (self.competitiveRule != null) {\r\n self.priceTypes = [];\r\n self.priceTypes.push('Competition');\r\n self.totalConflicts = 0;\r\n\r\n\r\n self.competitorGroup = newVal.competitorGroup;\r\n self.competitorGroupParent = newVal.competitorGroupParent;\r\n\r\n self.competitiveRule.writtenRule = null;\r\n\r\n if (self.competitiveRule.priceSurveyTypes.length > 0) {\r\n\r\n if (self.competitiveRule.calculationType != null || self.competitiveRule.competitor != null) {\r\n\r\n if (self.competitiveRule.competitor != null) {\r\n\r\n //Blanqueo los campos de grupo de competidores si seleccione un competidor especifico.\r\n self.competitiveRule.onlyCompetitorsWithSamePriceList = false;\r\n self.competitiveRule.calculationType = null;\r\n self.competitiveRule.modeFallback = null;\r\n self.competitiveRule.modeType = null;\r\n }\r\n\r\n if (self.competitiveRule.calculationType != 3) {\r\n self.competitiveRule.modeFallback = null;\r\n self.competitiveRule.modeType = null;\r\n }\r\n\r\n var priceSurveyTypesText = ' (';\r\n angular.forEach(self.competitiveRule.priceSurveyTypes, function (type) {\r\n if (priceSurveyTypesText.length > 2)\r\n priceSurveyTypesText += ', ';\r\n priceSurveyTypesText += type.priceSurveyTypeName;\r\n });\r\n priceSurveyTypesText += ')';\r\n\r\n self.competitiveRule.writtenRule = translations.CompetitiveWrittenRule1 + ' ';\r\n\r\n if (self.competitiveRule.competitor != null) {\r\n self.competitiveRule.writtenRule += translations.of + ' ' + self.competitiveRule.competitor.name + priceSurveyTypesText;\r\n }\r\n else {\r\n if (self.calculationTypes[self.competitiveRule.calculationType]) {\r\n self.competitiveRule.writtenRule += self.calculationTypes[self.competitiveRule.calculationType].name + ' ' + translations.of + ' ';\r\n }\r\n\r\n var compGrp = self.competitorGroup != null ? self.competitorGroup : self.competitorGroupParent;\r\n if (compGrp) {\r\n self.competitiveRule.writtenRule += ' ' + compGrp.name + priceSurveyTypesText;\r\n }\r\n\r\n if (self.competitiveRule.calculationType == 3 && self.competitiveRule.modeType != null) {\r\n self.competitiveRule.writtenRule += '. ' + translations.IfMoreThanOneMode + ' ' + self.modeTypes[self.competitiveRule.modeType].name;\r\n\r\n if (self.competitiveRule.modeType == 0 && self.competitiveRule.modeFallback != null) {\r\n self.competitiveRule.writtenRule += ', ' + translations.IfMoreThanOneModeWithSameReps + ' ' + self.modeFallbacks[self.competitiveRule.modeFallback].name;\r\n }\r\n }\r\n\r\n if (self.competitiveRule.onlyCompetitorsWithSamePriceList) {\r\n self.competitiveRule.writtenRule += ' ' + translations.OnlyCompetitorsInSamePriceZone;\r\n }\r\n }\r\n\r\n var difType = null;\r\n\r\n if (self.competitiveRule.differenceType != null) {\r\n\r\n if (self.competitiveRule.competitiveDifference && self.competitiveRule.competitiveDifference != 0) {\r\n self.competitiveRule.writtenRule += '. ' + translations.DifferenceOf + ' ';\r\n if (self.competitiveRule.differenceType == 1)\r\n self.competitiveRule.writtenRule += self.competitiveRule.competitiveDifference + ' %';\r\n else if (self.competitiveRule.differenceType == 2)\r\n self.competitiveRule.writtenRule += '$ ' + self.competitiveRule.competitiveDifference;\r\n }\r\n else {\r\n self.competitiveRule.writtenRule += '. ' + translations.SamePrice;\r\n }\r\n }\r\n else {\r\n self.competitiveRule.writtenRule += '. ' + translations.SamePrice;\r\n }\r\n }\r\n }\r\n\r\n self.isItemIncludeDisabled = false;\r\n //Se aplico un ambito de aplicacion\r\n if (self.competitiveRule.itemSensitivities.length > 0 || self.competitiveRule.tags.length > 0 || self.competitiveRule.itemproperties.length > 0 ||\r\n self.competitiveRule.exitemSensitivities.length > 0 || self.competitiveRule.extags.length > 0 || self.competitiveRule.exitemproperties.length > 0) {\r\n //TODO: Recorrer los items tildados y deschequearlos, tambien borrarlos de Items.\r\n self.isItemIncludeDisabled = true;\r\n }\r\n\r\n self.gridOptions.api.onFilterChanged();\r\n self.gridOptions.api.refreshView();\r\n }\r\n }, true);\r\n\r\n self.changeCompetitorGroupParents = function () {\r\n\r\n if (self.competitiveRule.competitorGroupParent != null) {\r\n\r\n self.competitorGroupsFilteredByParent = ($filter('filter')(self.competitorGroups, { parentId: self.competitiveRule.competitorGroupParent.id }));\r\n }\r\n else {\r\n self.competitorGroupsFilteredByParent = self.competitorGroups;\r\n self.competitiveRule.competitorGroup = null;\r\n }\r\n }\r\n self.changeCompetitorGroup = function () {\r\n if (self.competitiveRule.competitorGroup != null)\r\n loadCompetitors(self.competitiveRule.competitorGroup.id);\r\n else {\r\n self.competitiveRule.competitor = null;\r\n self.competitors = null;\r\n }\r\n }\r\n self.createCompetitorRule = function () {\r\n var text = translations.AreYouSureSwalSubtitle;\r\n if (self.isEditing) {\r\n text += \"\\n Se borraran las sugerencias asociadas. Debera generar nuevas sugerencias\";\r\n }\r\n swal({\r\n title: translations.AreYouSureSwal,\r\n text: text,\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.Cancel,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function () {\r\n var competitorId = self.competitiveRule.competitor != null ? self.competitiveRule.competitor.id : null;\r\n //var calculationType = self.competitiveRule.calculationType != null ? self.competitiveRule.calculationType.id : null;\r\n //var differenceType = self.competitiveRule.differenceType != null ? self.competitiveRule.differenceType : null;\r\n var compDiference = self.competitiveRule.differenceType != null && self.competitiveRule.differenceType == '1' ? self.competitiveRule.competitiveDifference / 100 : self.competitiveRule.competitiveDifference;\r\n\r\n self.addExcluded(self.competitiveRule);\r\n\r\n var shouldIncludeItems = (self.competitiveRule.exitemproperties.length == 0 && self.competitiveRule.itemproperties.length == 0 &&\r\n self.competitiveRule.exitemSensitivities.length == 0 && self.competitiveRule.itemSensitivities.length == 0 &&\r\n self.competitiveRule.extags.length == 0 && self.competitiveRule.tags.length == 0)\r\n self.competitiveRule.items = shouldIncludeItems ? self.competitiveRule.items : []; //Solo incluyo los items si no hay ningun ambito de aplicacion agregado\r\n\r\n var articlesGroupToExclude = [];\r\n if (self.allArticlesGroupChecked) {\r\n angular.forEach(self.competitiveRule.articlesGroup, function (ag) {\r\n if (ag.exclude)\r\n articlesGroupToExclude.push(ag);\r\n });\r\n }\r\n\r\n var vendorsToExclude = [];\r\n if (self.allVendorsChecked) {\r\n angular.forEach(self.competitiveRule.vendors, function (v) {\r\n if (v.exclude)\r\n vendorsToExclude.push(v);\r\n });\r\n }\r\n\r\n var priceRuleCompetitiveDto = {\r\n id: self.competitiveRule.id,\r\n companyId: $rootScope.companyId,\r\n name: self.competitiveRule.writtenRule,\r\n modeType: self.competitiveRule.modeType,\r\n modeFallback: self.competitiveRule.modeFallback,\r\n competitorGroupId: competitorId != null ? null : (self.competitiveRule.competitorGroup != null ? self.competitiveRule.competitorGroup.id : self.competitiveRule.competitorGroupParent.id),\r\n competitorId: competitorId,\r\n onlyCompetitorsWithSamePriceList: self.competitiveRule.onlyCompetitorsWithSamePriceList,\r\n calculationType: self.competitiveRule.calculationType,\r\n percentageDifference1: self.competitiveRule.differenceType == '1' ? compDiference : null,\r\n priceDifference1: self.competitiveRule.differenceType == '2' ? compDiference : null,\r\n considerModeCount: self.competitiveRule.considerModeCount,\r\n priceLists: self.competitiveRule.pricelists,\r\n vendors: self.allVendorsChecked ? vendorsToExclude : self.competitiveRule.vendors, //Si estan todos tildados, le mando los excluidos/vacio y el check en allVendors en true\r\n allVendorsChecked: self.allVendorsChecked,\r\n articlesGroup: self.allArticlesGroupChecked ? articlesGroupToExclude : self.competitiveRule.articlesGroup, //Si estan todos tildados, le mando los excluidos/vacio y el check en allArticlesGroup en true\r\n allArticlesGroupChecked: self.allArticlesGroupChecked,\r\n priceSurveyTypes: self.competitiveRule.priceSurveyTypes,\r\n itemSensitivities: self.competitiveRule.itemSensitivities,\r\n tags: self.competitiveRule.tags,\r\n categories: self.competitiveRule.categories,\r\n itemProperties: self.competitiveRule.itemproperties,\r\n items: self.competitiveRule.items,\r\n }\r\n\r\n priceService.rules.savePriceRuleCompetitive(priceRuleCompetitiveDto).then(function () {\r\n\r\n self.cancel();\r\n reload();\r\n swal(translations.ConfirmedSwal, translations.ConfirmedSwalSubtitle, \"success\");\r\n\r\n }).catch(function (fallback) {\r\n console.log(fallback);\r\n setTimeout(function () { swal(translations.ErrorTitleSwal, translations.ErrorSwalSubtitle, \"error\"); }, 100);\r\n });\r\n });\r\n }\r\n // End Competitive Rule\r\n\r\n $scope.$watch('ct.marginRule', function (newVal, oldVal) {\r\n if (self.marginRule && (self.marginRule.marginRuleType == 1 || self.marginRule.marginRuleType == 2)) {\r\n self.priceTypes = [];\r\n self.priceTypes.push('Regular');\r\n self.totalConflicts = 0;\r\n\r\n self.marginRule.writtenRule = null;\r\n\r\n if (self.marginRule.marginRuleType == 1) {\r\n if (self.marginRule.margin != null)\r\n self.marginRule.writtenRule = \"Margen de \" + self.marginRule.margin + \"%\";\r\n else if (self.marginRule.marginAmount != null)\r\n self.marginRule.writtenRule = \"Margen de $ \" + self.marginRule.marginAmount;\r\n }\r\n else if (self.marginRule.marginRuleType == 2) {\r\n if (self.marginRule.keepMarginType == 1)\r\n self.marginRule.writtenRule = translations.KeepSameMarginPercentage;\r\n else if (self.marginRule.keepMarginType == 2)\r\n self.marginRule.writtenRule = translations.KeepSameMargin$;\r\n }\r\n }\r\n\r\n self.isItemIncludeDisabled = false;\r\n //Se aplico un ambito de aplicacion\r\n if (self.marginRule.itemSensitivities.length > 0 || self.marginRule.tags.length > 0 || self.marginRule.itemproperties.length > 0 ||\r\n self.marginRule.exitemSensitivities.length > 0 || self.marginRule.extags.length > 0 || self.marginRule.exitemproperties.length > 0) {\r\n //TODO: Recorrer los items tildados y deschequearlos, tambien borrarlos de Items.\r\n {\r\n self.isItemIncludeDisabled = true;\r\n }\r\n }\r\n\r\n self.gridOptions.api.onFilterChanged();\r\n self.gridOptions.api.refreshView();\r\n\r\n }, true);\r\n\r\n self.createMarginRule = function () {\r\n var text = translations.AreYouSureSwalSubtitle;\r\n if (self.isEditing) {\r\n text += \"\\n Se borraran las sugerencias asociadas. Debera generar nuevas sugerencias\";\r\n }\r\n swal({\r\n title: translations.AreYouSureSwal,\r\n text: text,\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.Cancel,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function () {\r\n\r\n self.addExcluded(self.marginRule);\r\n\r\n var shouldIncludeItems = (self.marginRule.exitemproperties.length == 0 && self.marginRule.itemproperties.length == 0 &&\r\n self.marginRule.exitemSensitivities.length == 0 && self.marginRule.itemSensitivities.length == 0 &&\r\n self.marginRule.extags.length == 0 && self.marginRule.tags.length == 0)\r\n self.marginRule.items = shouldIncludeItems ? self.marginRule.items : []; //Solo incluyo los items si no hay ningun ambito de aplicacion agregado\r\n var articlesGroupToExclude = [];\r\n if (self.allArticlesGroupChecked) {\r\n angular.forEach(self.marginRule.articlesGroup, function (ag) {\r\n if (ag.exclude)\r\n articlesGroupToExclude.push(ag);\r\n });\r\n }\r\n\r\n var vendorsToExclude = [];\r\n if (self.allVendorsChecked) {\r\n angular.forEach(self.marginRule.vendors, function (v) {\r\n if (v.exclude)\r\n vendorsToExclude.push(v);\r\n });\r\n }\r\n\r\n var priceRuleMarginDto = {\r\n id: self.marginRule.id,\r\n companyId: $rootScope.companyId,\r\n name: self.marginRule.writtenRule,\r\n margin: self.marginRule.margin != null ? self.marginRule.margin / 100 : null,\r\n marginAmount: self.marginRule.marginAmount,\r\n keepMargin: self.marginRule.keepMarginType == 1 ? true : null,\r\n keepMarginAmount: self.marginRule.keepMarginType == 2 ? true : null,\r\n priceLists: self.marginRule.pricelists,\r\n vendors: self.allVendorsChecked ? vendorsToExclude : self.marginRule.vendors,\r\n allVendorsChecked: self.allVendorsChecked,\r\n articlesGroup: self.allArticlesGroupChecked ? articlesGroupToExclude : self.marginRule.articlesGroup, //Si estan todos tildados, le mando vacio y el check en allArticlesGroup en true\r\n allArticlesGroupChecked: self.allArticlesGroupChecked,\r\n itemSensitivities: self.marginRule.itemSensitivities,\r\n tags: self.marginRule.tags,\r\n categories: self.marginRule.categories,\r\n itemProperties: self.marginRule.itemproperties,\r\n items: self.marginRule.items,\r\n }\r\n\r\n priceService.rules.savePriceRuleMargin(priceRuleMarginDto).then(function () {\r\n\r\n self.cancel();\r\n reload();\r\n swal(translations.ConfirmedSwal, translations.ConfirmedSwalSubtitle, \"success\");\r\n\r\n }).catch(function (fallback) {\r\n console.log(fallback);\r\n setTimeout(function () { swal(translations.ErrorTitleSwal, translations.ErrorSwalSubtitle, \"error\"); }, 100);\r\n });\r\n\r\n });\r\n }\r\n //End Margin Rule\r\n self.existingParentRules = [];\r\n self.existingRuleSelectedParent = function (rule) {\r\n if (rule != null) {\r\n self.parentRule.id = rule.id;\r\n self.parentRule.writtenRule = rule.name;\r\n }\r\n else {\r\n self.parentRule.id = null;\r\n self.parentRule.writtenRule = null;\r\n self.parentRule.parent = null;\r\n }\r\n }\r\n $scope.$watch('ct.parentRule', function (newVal, oldVal) {\r\n\r\n if (self.parentRule.id == null) {\r\n self.priceTypes = [];\r\n self.priceTypes.push('Regular');\r\n self.priceTypes.push('Competition');\r\n\r\n if (self.parentRule.parent != null) {\r\n\r\n //Seteo el Id que tengo que ocultar de la grilla y refresco el filtro\r\n self.excludedItemId = self.parentRule.parent.id;\r\n self.totalConflicts = 0;\r\n\r\n if (self.parentRule.relationshipType != null) {\r\n\r\n self.parentRule.writtenRule = translations.RULE + self.parentRule.relationshipType.name;\r\n\r\n if (self.parentRule.difference == 0 || self.parentRule.difference == null) {\r\n self.parentRule.writtenRule += \" igual a \";\r\n }\r\n else {\r\n\r\n var difType = null;\r\n if (self.parentRule.differenceType == 1)\r\n difType = (self.parentRule.difference < 0 ? ' menos ' : ' mas ') + self.parentRule.difference + '%';\r\n else\r\n difType = (self.parentRule.difference < 0 ? ' menos ' : ' mas ') + '$ ' + self.parentRule.difference;\r\n\r\n self.parentRule.writtenRule += difType + ' que el ' + self.parentRule.relationshipType.name + ' de ';\r\n }\r\n\r\n self.parentRule.writtenRule += self.parentRule.parent.name + ' (' + self.parentRule.parent.code + ')';\r\n }\r\n }\r\n }\r\n\r\n self.isItemIncludeDisabled = false;\r\n //Se aplico un ambito de aplicacion\r\n if (self.parentRule.itemSensitivities.length > 0 || self.parentRule.tags.length > 0 || self.parentRule.itemproperties.length > 0 ||\r\n self.parentRule.exitemSensitivities.length > 0 || self.parentRule.extags.length > 0 || self.parentRule.exitemproperties.length > 0) {\r\n //TODO: Recorrer los items tildados y deschequearlos, tambien borrarlos de Items.\r\n self.isItemIncludeDisabled = true;\r\n }\r\n\r\n self.gridOptions.api.onFilterChanged();\r\n self.gridOptions.api.refreshView();\r\n\r\n }, true);\r\n\r\n self.setAsGenericParentRule = false;\r\n var existingGenericRule = null;\r\n $scope.$watch('ct.setAsGenericParentRule', function (newVal, oldVal) {\r\n\r\n if (newVal != oldVal) {\r\n\r\n if (self.itemLookupText && self.itemLookupText.genericItemId != null) {\r\n\r\n if (!newVal)\r\n self.parentRule.genericItemId = null;\r\n else {\r\n //Chequeo de que no haya otra regla con mismo generico\r\n existingGenericRule = null;\r\n\r\n self.priceRulesTable.forEach(function (rule) {\r\n\r\n if (existingGenericRule == null && rule.genericItemId != null && rule.genericItemId == self.itemLookupText.genericItemId) {\r\n existingGenericRule = rule;\r\n }\r\n });\r\n\r\n self.parentRule.genericItemId = self.itemLookupText.genericItemId;\r\n }\r\n }\r\n }\r\n });\r\n\r\n var itemLookupTextPrefix = '';\r\n self.itemLookupNoResults = false;\r\n self.itemLookupLoading = false;\r\n\r\n self.itemLookupOnKeydown = function (evt) {\r\n //console.log('evt', evt);\r\n if (evt.keyCode == 13 &&\r\n self.itemLookupText == '') {\r\n self.itemLookupOnItemSelect({ id: 0 });\r\n }\r\n else if (self.itemLookupText.length >= 3\r\n && itemLookupTextPrefix != self.itemLookupText) {\r\n itemLookupTextPrefix = self.itemLookupText;\r\n\r\n self.itemLookupLoading = true;\r\n var lookupParameter = { searchTerm: self.itemLookupText, categoryIds: self.categoryIds, onlyMainItems: true };\r\n\r\n priceService.lookups.itemsLookupByCategory(lookupParameter, $stateParams.categoryId)\r\n .then(function (items) {\r\n self.itemLookupLoading = false;\r\n self.itemsInLookup = items;\r\n });\r\n }\r\n }\r\n\r\n self.itemLookupOnItemSelect = function (item) {\r\n if (item == undefined) return;\r\n self.itemLookupText = item.name;\r\n\r\n self.parentRule.parent = item;\r\n self.parentRule.mainItemId = self.parentRule.parent.id;\r\n self.parentRule.mainItemUmvId = self.parentRule.parent.saleUnitOfMeasureId;\r\n\r\n if (item && item.genericItemId != null) {\r\n self.setAsGenericParentRule = true;\r\n }\r\n }\r\n\r\n /*\r\n $scope.$watch('ct.itemLookupText', function (newVal, oldVal) {\r\n if (newVal && oldVal) {\r\n\r\n if (newVal.id) {\r\n self.parentRule.parent = self.itemLookupText;\r\n self.parentRule.mainItemId = self.parentRule.parent.id;\r\n self.parentRule.mainItemUmvId = self.parentRule.parent.saleUnitOfMeasureId;\r\n\r\n if (self.itemLookupText && self.itemLookupText.genericItemId != null) {\r\n self.setAsGenericParentRule = true;\r\n }\r\n\r\n }\r\n else if (newVal && newVal != oldVal && (newVal.length >= 4 || oldVal.length > 3) && newVal != previousLookupText) {\r\n previousLookupText = newVal;\r\n self.parentRule.parent = null;\r\n self.itemsInLookup = [{ id: 0, code: '', name: 'Cargando Items con el texto ' + newVal + '...' }];\r\n var lookupParameter = { searchTerm: newVal, categoryIds: self.categoryIds, onlyMainItems: true };\r\n priceService.lookups.itemsLookupByCategory(lookupParameter, $stateParams.categoryId)\r\n .then(function (items) {\r\n self.itemsInLookup = items;\r\n });\r\n }\r\n }\r\n\r\n }, true);\r\n */\r\n\r\n self.createParentRule = function () {\r\n var dynamicTitle = translations.AreYouSureSwal;\r\n var dynamicText = translations.AreYouSureSwalSubtitle;\r\n var dynamicType = 'info';\r\n if (self.isEditing) {\r\n dynamicText += \"\\n Se borraran las sugerencias asociadas. Debera generar nuevas sugerencias\";\r\n }\r\n\r\n if (existingGenericRule != null && self.setAsGenericParentRule == true) { //Si ya existe una regla y es generico, no lo debe dejar guardar con el checkbox tildado.\r\n swal(translations.ErrorTitleSwal, translations.TheRuleSwal + existingGenericRule.priceRuleDescription + translations.AssociatedWithGenericSwal + self.itemLookupText.generalParentCode + translations.ThereCanOnlyBe1RulePerGenericSwal, 'error');\r\n self.itemLookupText = '';\r\n }\r\n else {\r\n\r\n if (self.includedItems.length == 0 &&\r\n self.parentRule.exitemproperties.length == 0 && self.parentRule.itemproperties.length == 0 &&\r\n self.parentRule.exitemSensitivities.length == 0 && self.parentRule.itemSensitivities.length == 0 &&\r\n self.parentRule.extags.length == 0 && self.parentRule.tags.length == 0\r\n ) {\r\n swal(translations.NoApplicationScopeOrItemsWereAddedSwal, translations.NoApplicationScopeOrItemsWereAddedSwalSubtitle, \"error\");\r\n }\r\n else {\r\n swal({\r\n title: dynamicTitle,\r\n text: dynamicText,\r\n type: dynamicType,\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function () {\r\n var parent = self.parentRule.parent != null ? self.parentRule.parent.id : null;\r\n var relationshipType = self.parentRule.relationshipType != null ? self.parentRule.relationshipType.id : null;\r\n var differenceType = self.parentRule.differenceType != null ? self.parentRule.differenceType : null;\r\n var compDiference = differenceType != null && differenceType == '1' ? self.parentRule.difference / 100 : self.parentRule.difference;\r\n\r\n self.addExcluded(self.parentRule);\r\n\r\n var shouldIncludeItems = (self.parentRule.exitemproperties.length == 0 && self.parentRule.itemproperties.length == 0 &&\r\n self.parentRule.exitemSensitivities.length == 0 && self.parentRule.itemSensitivities.length == 0 &&\r\n self.parentRule.extags.length == 0 && self.parentRule.tags.length == 0)\r\n self.parentRule.items = shouldIncludeItems ? self.parentRule.items : []; //Solo incluyo los items si no hay ningun ambito de aplicacion agregado\r\n\r\n var articlesGroupToExclude = [];\r\n if (self.allArticlesGroupChecked) {\r\n angular.forEach(self.parentRule.articlesGroup, function (ag) {\r\n if (ag.exclude)\r\n articlesGroupToExclude.push(ag);\r\n });\r\n }\r\n\r\n var vendorsToExclude = [];\r\n if (self.allVendorsChecked) {\r\n angular.forEach(self.parentRule.vendors, function (v) {\r\n if (v.exclude)\r\n vendorsToExclude.push(v);\r\n });\r\n }\r\n\r\n var priceRuleParentDto = {\r\n id: self.parentRule.id,\r\n companyId: $rootScope.companyId,\r\n name: self.parentRule.writtenRule,\r\n parent: self.parentRule.parent,\r\n genericItemId: self.parentRule.genericItemId,\r\n mainItemId: self.parentRule.parent != null ? self.parentRule.parent.id : null,\r\n mainItemUmvId: self.parentRule.parent != null ? self.parentRule.parent.saleUnitOfMeasureId : null,\r\n relationshipType: relationshipType,\r\n percentageDifference2: differenceType == '1' ? compDiference : null,\r\n priceDifference2: differenceType == '2' ? compDiference : null,\r\n competitiveDifference: compDiference,\r\n priceLists: self.parentRule.pricelists,\r\n vendors: self.allVendorsChecked ? vendorsToExclude : self.parentRule.vendors,\r\n allVendorsChecked: self.allVendorsChecked,\r\n articlesGroup: self.allArticlesGroupChecked ? articlesGroupToExclude : self.parentRule.articlesGroup, //Si estan todos tildados, le mando vacio y el check en allArticlesGroup en true\r\n allArticlesGroupChecked: self.allArticlesGroupChecked,\r\n itemSensitivities: self.parentRule.itemSensitivities,\r\n tags: self.parentRule.tags,\r\n categories: self.parentRule.categories,\r\n itemProperties: self.parentRule.itemproperties,\r\n items: self.parentRule.items,\r\n }\r\n\r\n priceService.rules.savePriceRuleParent(priceRuleParentDto).then(function () {\r\n\r\n self.cancel();\r\n reload();\r\n setTimeout(function () { swal(translations.ConfirmedSwal, translations.ConfirmedSwalSubtitle, \"success\"); }, 100);\r\n }).catch(function (fallback) {\r\n console.log(fallback);\r\n setTimeout(function () { swal(translations.ErrorTitleSwal, translations.ErrorSwalSubtitle, \"error\"); }, 100);\r\n });\r\n });\r\n }\r\n }\r\n }\r\n // End Parent Rule\r\n\r\n\r\n self.excludeSelectedPriceList = function (priceListId) {\r\n self.zonePricelist = []\r\n self.zonePricelist.length = 0;\r\n\r\n self.zonePricelist = angular.copy(self.pricelists);\r\n\r\n if (self.zoneRule.zone != null)\r\n _.remove(self.zonePricelist, { priceListId: priceListId });\r\n\r\n self.zoneRule.pricelists = self.zonePricelist;\r\n }\r\n $scope.$watch('ct.zoneRule', function (newVal, oldVal) {\r\n\r\n if (self.zoneRule.id == null) {\r\n self.priceTypes = [];\r\n self.priceTypes.push('Regular');\r\n\r\n if (self.zoneRule.zone != null) {\r\n self.totalConflicts = 0;\r\n\r\n if (oldVal.zone == null || newVal.zone.priceListId != oldVal.zone.priceListId)\r\n self.excludeSelectedPriceList(self.zoneRule.zone.priceListId);\r\n\r\n if (self.zoneRule.relationshipType != null) {\r\n self.zoneRule.writtenRule = translations.RULE + self.zoneRule.relationshipType.name;\r\n\r\n if (self.zoneRule.difference == 0) {\r\n self.zoneRule.writtenRule += \" igual a zona \";\r\n }\r\n else {\r\n\r\n var difType = null;\r\n if (self.zoneRule.differenceType == 1)\r\n difType = (self.zoneRule.difference < 0 ? ' menos ' : ' mas ') + self.zoneRule.difference + '%';\r\n else\r\n difType = (self.zoneRule.difference < 0 ? ' menos ' : ' mas ') + '$ ' + self.zoneRule.difference;\r\n\r\n self.zoneRule.writtenRule += difType + ' que el ' + self.zoneRule.relationshipType.name + ' de zona ';\r\n }\r\n\r\n self.zoneRule.writtenRule += self.zoneRule.zone.priceListName + ' (' + self.zoneRule.zone.priceListCode + ')';\r\n }\r\n }\r\n }\r\n\r\n self.isItemIncludeDisabled = false;\r\n //Se aplico un ambito de aplicacion\r\n if (self.zoneRule.itemSensitivities.length > 0 || self.zoneRule.tags.length > 0 || self.zoneRule.itemproperties.length > 0 ||\r\n self.zoneRule.exitemSensitivities.length > 0 || self.zoneRule.extags.length > 0 || self.zoneRule.exitemproperties.length > 0) {\r\n //TODO: Recorrer los items tildados y deschequearlos, tambien borrarlos de Items.\r\n self.isItemIncludeDisabled = true;\r\n }\r\n\r\n self.gridOptions.api.onFilterChanged();\r\n self.gridOptions.api.refreshView();\r\n\r\n }, true);\r\n self.createZoneRule = function () {\r\n var text = translations.AreYouSureSwalSubtitle;\r\n if (self.isEditing) {\r\n text += \"\\n Se borraran las sugerencias asociadas. Debera generar nuevas sugerencias\";\r\n }\r\n swal({\r\n title: translations.AreYouSureSwal,\r\n text: text,\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function () {\r\n var relationshipType = self.zoneRule.relationshipType != null ? self.zoneRule.relationshipType.id : null;\r\n var differenceType = self.zoneRule.differenceType != null ? self.zoneRule.differenceType : null;\r\n var compDiference = differenceType != null && differenceType == '1' ? self.zoneRule.difference / 100 : self.zoneRule.difference;\r\n\r\n self.addExcluded(self.zoneRule);\r\n\r\n var shouldIncludeItems = (self.zoneRule.exitemproperties.length == 0 && self.zoneRule.itemproperties.length == 0 &&\r\n self.zoneRule.exitemSensitivities.length == 0 && self.zoneRule.itemSensitivities.length == 0 &&\r\n self.zoneRule.extags.length == 0 && self.zoneRule.tags.length == 0)\r\n self.zoneRule.items = shouldIncludeItems ? self.zoneRule.items : []; //Solo incluyo los items si no hay ningun ambito de aplicacion agregado\r\n\r\n var articlesGroupToExclude = [];\r\n if (self.allArticlesGroupChecked) {\r\n angular.forEach(self.zoneRule.articlesGroup, function (ag) {\r\n if (ag.exclude)\r\n articlesGroupToExclude.push(ag);\r\n });\r\n }\r\n\r\n var vendorsToExclude = [];\r\n if (self.allVendorsChecked) {\r\n angular.forEach(self.zoneRule.vendors, function (v) {\r\n if (v.exclude)\r\n vendorsToExclude.push(v);\r\n });\r\n }\r\n\r\n var priceRuleZoneDto = {\r\n id: self.zoneRule.id,\r\n companyId: $rootScope.companyId,\r\n name: self.zoneRule.writtenRule,\r\n mainPriceListId: self.zoneRule.zone.priceListId,\r\n relationshipType: relationshipType,\r\n percentageDifference2: differenceType == '1' ? compDiference : null,\r\n priceDifference2: differenceType == '2' ? compDiference : null,\r\n competitiveDifference: compDiference,\r\n priceLists: self.zoneRule.pricelists,\r\n vendors: self.allVendorsChecked ? vendorsToExclude : self.zoneRule.vendors,\r\n allVendorsChecked: self.allVendorsChecked,\r\n articlesGroup: self.allArticlesGroupChecked ? articlesGroupToExclude : self.zoneRule.articlesGroup, //Si estan todos tildados, le mando vacio y el check en allArticlesGroup en true\r\n allArticlesGroupChecked: self.allArticlesGroupChecked,\r\n itemSensitivities: self.zoneRule.itemSensitivities,\r\n tags: self.zoneRule.tags,\r\n categories: self.zoneRule.categories,\r\n itemProperties: self.zoneRule.itemproperties,\r\n items: self.zoneRule.items,\r\n }\r\n\r\n priceService.rules.savePriceRuleZone(priceRuleZoneDto).then(function () {\r\n\r\n self.cancel();\r\n reload();\r\n setTimeout(function () { swal(translations.ConfirmedSwal, translations.ConfirmedSwalSubtitle, \"success\"); }, 100);\r\n }).catch(function (fallback) {\r\n console.log(fallback);\r\n setTimeout(function () { swal(translations.ErrorTitleSwal, translations.ErrorSwalSubtitle, \"error\"); }, 100);\r\n });\r\n });\r\n }\r\n // End Zone Rule\r\n\r\n\r\n //Grid\r\n self.includeItem = function (row, includeAction) {\r\n if (self.isEditingCompetitiveRule || self.isEditingMarginRule || self.isEditingParentRule || self.isEditingZoneRule) {\r\n var itemId = row.itemId;\r\n var umv = row.salesUnitOfMeasureId;\r\n var includeChk = row.includeItem;\r\n var excludeChk = row.excludeItem;\r\n\r\n var itemWithUmv = { itemId: itemId, umvId: umv };\r\n\r\n var indexInc = objectIndexOf(self.includedItems, itemWithUmv);\r\n var indexExc = objectIndexOf(self.excludedItems, itemWithUmv);\r\n\r\n if (includeAction == true) {\r\n if (includeChk) //Si lo seleccione\r\n {\r\n row.excludeItem = false; //Deselecciono el excluir\r\n\r\n //Si est�, lo saco del listado de excluidos(si esta) y lo agrego al de incluidos\r\n if (indexExc > -1)\r\n self.excludedItems.splice(indexExc, 1);\r\n if (indexInc == -1)\r\n self.includedItems.push(itemWithUmv);\r\n }\r\n else { //Si lo deseleccione\r\n if (indexInc > -1)\r\n self.includedItems.splice(indexInc, 1); //Lo saco del listado de incluidos\r\n }\r\n }\r\n else if (includeAction == false) {\r\n if (excludeChk) //Si lo seleccione\r\n {\r\n\r\n row.includeItem = false; //Deselecciono el incluir\r\n\r\n //Lo saco del listado de incluidos(si esta) y lo agrego al de excluidos\r\n if (indexInc > -1)\r\n self.includedItems.splice(indexInc, 1);\r\n if (indexExc == -1)\r\n self.excludedItems.push(itemWithUmv);\r\n }\r\n else {//Si lo deseleccione\r\n if (indexExc > -1)\r\n self.excludedItems.splice(indexExc, 1);\r\n }\r\n }\r\n }\r\n }\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: translations.ActionsAgGrid,//\"Acciones\",\r\n children: [\r\n {\r\n headerName: translations.Include,\r\n field: \"includeItem\",\r\n pinned: 'left',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: 'input',\r\n width: 50,\r\n cellClass: $rootScope.getClassForCell,\r\n checkbox: true,\r\n cellRenderer: function (params) {\r\n if (params.node.group) {\r\n if (self.isItemIncludeDisabled)\r\n return '';\r\n\r\n var eInput = document.createElement(\"input\");\r\n eInput.type = \"checkbox\";\r\n eInput.checked = params.value;\r\n\r\n eInput.addEventListener(\"change\", function (event) {\r\n var changedRows = [];\r\n params.value = eInput.checked;\r\n params.data[params.column.colId] = eInput.checked;\r\n\r\n if (params.colDef.field == 'includeItem') { //Si toque incluir\r\n self.includeItem(params.data, true);\r\n params.data.excludeItem = false;\r\n changedRows.push(params.node);\r\n\r\n\r\n //if (params.node != null && params.node.children != null) {\r\n // params.node.children.forEach(function (node) {\r\n // node.data.dirty = true;\r\n // changedRows.push(node);\r\n // });\r\n //}\r\n\r\n params.api.refreshCells(changedRows);\r\n }\r\n self.gridOptions.api.onFilterChanged();\r\n });\r\n\r\n return eInput;\r\n }\r\n else\r\n return '';\r\n },\r\n },\r\n {\r\n headerName: translations.Exclude,\r\n field: \"excludeItem\",\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: 'input',\r\n width: 55,\r\n pinned: 'left',\r\n checkbox: true,\r\n cellRenderer: function (params) {\r\n if (params.node.group) {\r\n var eInput = document.createElement(\"input\");\r\n eInput.type = \"checkbox\";\r\n eInput.checked = params.value;\r\n\r\n eInput.addEventListener(\"change\", function (event) {\r\n var changedRows = [];\r\n params.value = eInput.checked;\r\n params.data[params.column.colId] = eInput.checked;\r\n\r\n if (params.colDef.field == 'excludeItem') { //Si toque incluir\r\n self.includeItem(params.data, false);\r\n params.data.includeItem = false;\r\n changedRows.push(params.node);\r\n\r\n\r\n //if (params.node != null && params.node.children != null) {\r\n // params.node.children.forEach(function (node) {\r\n // node.data.dirty = true;\r\n // changedRows.push(node);\r\n // });\r\n //}\r\n\r\n params.api.refreshCells(changedRows);\r\n }\r\n\r\n self.totalConflicts = 0;\r\n self.gridOptions.api.onFilterChanged();\r\n });\r\n\r\n\r\n return eInput;\r\n }\r\n else\r\n return '';\r\n }\r\n },\r\n ]\r\n },\r\n {\r\n headerName: translations.GeneralInformation,\r\n children: [\r\n {\r\n headerName: translations.Subcategory,\r\n width: 150,\r\n columnGroupShow: 'open',\r\n field: \"subCategory\",\r\n },\r\n {\r\n headerName: translations.GroupOfArticles,\r\n width: 150,\r\n columnGroupShow: 'open',\r\n field: \"alternativeCategoryName\",\r\n },\r\n {\r\n headerName: translations.Code,\r\n field: \"code\",\r\n width: 160,\r\n cellRenderer: {\r\n renderer: 'group',\r\n checkbox: false,\r\n innerRenderer: function (params) {\r\n var count = '';\r\n if (params.node.group)\r\n count = \" (\" + params.node.childrenAfterFilter.length + \") \"\r\n\r\n return params.value.replace(/^0+/, '') + count;\r\n }\r\n }\r\n },\r\n {\r\n headerName: 'UM',\r\n width: 50,\r\n suppressMenu: true,\r\n field: 'salesUnitOfMeasure',\r\n },\r\n {\r\n headerName: translations.Description,\r\n width: 300,\r\n field: 'description'\r\n },\r\n {\r\n headerName: translations.PriceZone,\r\n field: \"priceList\",\r\n width: 165,\r\n },\r\n {\r\n headerName: translations.Supplier,\r\n field: \"vendorName\",\r\n width: 165,\r\n },\r\n {\r\n headerName: translations.TypeOfPrice,\r\n field: \"priceTypeName\",\r\n width: 165,\r\n cellRenderer: function (params) {\r\n if (params.node.group)\r\n return '';\r\n\r\n return params.value;\r\n }\r\n },\r\n {\r\n headerName: translations.Brand,\r\n columnGroupShow: 'open',\r\n field: \"brand\",\r\n width: 150,\r\n },\r\n {\r\n headerName: translations.Maker,\r\n columnGroupShow: 'open',\r\n field: \"manufacturer\",\r\n width: 150,\r\n },\r\n {\r\n headerName: translations.Tags,\r\n columnGroupShow: 'open',\r\n field: \"tags\",\r\n width: 200,\r\n cellRenderer: function (params) {\r\n if (params.node.group)\r\n return params.node.children[0].data.tags;\r\n\r\n return params.value;\r\n }\r\n },\r\n {\r\n headerName: translations.Sensitivities,\r\n columnGroupShow: 'open',\r\n field: \"sensitivities\",\r\n width: 200,\r\n }\r\n ]\r\n },\r\n {\r\n headerName: translations.PricesAndCosts,\r\n children: [\r\n {\r\n headerName: translations.CurrentPrice,\r\n field: \"_Price\",\r\n width: 150,\r\n filter: 'number',\r\n cellRenderer: $rootScope.decimalRenderer,\r\n },\r\n {\r\n headerName: translations.CurrentCost,\r\n field: \"cost\",\r\n columnGroupShow: 'open',\r\n width: 120,\r\n filter: 'number',\r\n cellRenderer: $rootScope.decimalRenderer,\r\n },\r\n {\r\n headerName: translations.PercentajeMargin,\r\n //field: \"grossMarginAbs\",\r\n field: \"grossMargin\",\r\n columnGroupShow: 'open',\r\n width: 100,\r\n filter: 'number',\r\n cellRenderer: $rootScope.percentageRenderer,\r\n }, \r\n {\r\n headerName: translations.SalesUn,\r\n field: \"units\",\r\n columnGroupShow: 'open',\r\n width: 100,\r\n filter: 'number',\r\n cellRenderer: $rootScope.decimalRenderer,\r\n },\r\n ]\r\n },\r\n {\r\n headerName: translations.Rules,\r\n children: [\r\n {\r\n headerName: translations.CompetitiveF,\r\n field: \"competitiveRule\",\r\n cellStyle: { 'white-space': 'normal' },\r\n cellRenderer: function (params) {\r\n\r\n var cell = params.value != undefined ? params.value : '';\r\n var conflicts = 0;\r\n\r\n var itemWithUmv = { itemId: params.data.itemId, umvId: params.data.salesUnitOfMeasureId };\r\n var indexExc = objectIndexOf(self.excludedItems, itemWithUmv);\r\n var isItemExcluded = indexExc > -1;\r\n\r\n if (!isItemExcluded) {\r\n if (params.node.group && self.isEditingCompetitiveRule) {\r\n angular.forEach(params.node.childrenAfterFilter, function (n) {\r\n if (n.data.competitiveRule != undefined && n.data.competitiveRule != null) {\r\n conflicts++;\r\n cell = ' Hay ' + conflicts + ' Conflictos ';\r\n }\r\n });\r\n }\r\n }\r\n\r\n return cell;\r\n }\r\n },\r\n {\r\n headerName: translations.Margin,\r\n field: \"marginRule\",\r\n cellStyle: { 'white-space': 'normal' },\r\n cellRenderer: function (params) {\r\n\r\n var cell = params.value != undefined ? params.value : '';\r\n var conflicts = 0;\r\n\r\n var itemWithUmv = { itemId: params.data.itemId, umvId: params.data.salesUnitOfMeasureId };\r\n var indexExc = objectIndexOf(self.excludedItems, itemWithUmv);\r\n var isItemExcluded = indexExc > -1;\r\n\r\n if (!isItemExcluded) {\r\n if (params.node.group && self.isEditingMarginRule) {\r\n angular.forEach(params.node.childrenAfterFilter, function (n) {\r\n if (n.data.marginRule != undefined && n.data.marginRule != null) {\r\n conflicts++;\r\n cell = ' Hay ' + conflicts + ' Conflictos ';\r\n }\r\n });\r\n }\r\n }\r\n\r\n return cell;\r\n }\r\n },\r\n {\r\n headerName: translations.RelationshipItems,\r\n field: \"parentRuleItem\",\r\n cellStyle: { 'white-space': 'normal' },\r\n cellRenderer: function (params) {\r\n\r\n var cell = params.value != undefined ? params.value : '';\r\n var conflicts = 0;\r\n\r\n var itemWithUmv = { itemId: params.data.itemId, umvId: params.data.salesUnitOfMeasureId };\r\n var indexExc = objectIndexOf(self.excludedItems, itemWithUmv);\r\n var isItemExcluded = indexExc > -1;\r\n\r\n if (!isItemExcluded) {\r\n if (params.node.group && self.isEditingParentRule) {\r\n angular.forEach(params.node.childrenAfterFilter, function (n) {\r\n if (n.data.parentRuleItem != undefined && n.data.parentRuleItem != null) {\r\n conflicts++;\r\n cell = ' Hay ' + conflicts + ' Conflictos ';\r\n }\r\n });\r\n }\r\n }\r\n\r\n return cell;\r\n }\r\n },\r\n {\r\n headerName: translations.KinshipZones,\r\n field: \"parentRuleZone\",\r\n cellStyle: { 'white-space': 'normal' },\r\n cellRenderer: function (params) {\r\n\r\n var cell = params.value != undefined ? params.value : '';\r\n var conflicts = 0;\r\n\r\n var itemWithUmv = { itemId: params.data.itemId, umvId: params.data.salesUnitOfMeasureId };\r\n var indexExc = objectIndexOf(self.excludedItems, itemWithUmv);\r\n var isItemExcluded = indexExc > -1;\r\n\r\n if (!isItemExcluded) {\r\n if (params.node.group && self.isEditingZoneRule) {\r\n angular.forEach(params.node.childrenAfterFilter, function (n) {\r\n if (n.data.parentRuleZone != undefined && n.data.parentRuleZone != null) {\r\n conflicts++;\r\n cell = ' Hay ' + conflicts + ' Conflictos ';\r\n }\r\n });\r\n }\r\n }\r\n\r\n return cell;\r\n }\r\n }\r\n ]\r\n }\r\n ];\r\n }\r\n function setGridOptions() {\r\n self.gridOptions = {\r\n //columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: true,\r\n //groupHeaders: true,\r\n rowHeight: 40,\r\n groupHideGroupColumns: true,\r\n groupUseEntireRow: false,\r\n groupSelectsChildren: false,\r\n rowSelection: \"multiple\", // one of ['single','multiple'], leave blank for no selection\r\n rowDeselection: true,\r\n showToolPanel: false,// window.innerWidth > 1500,\r\n suppressRowClickSelection: true,\r\n getNodeChildDetails: getNodeChildDetails,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n angularCompileRows: true,\r\n isExternalFilterPresent: isExternalFilterPresent,\r\n doesExternalFilterPass: doesExternalFilterPass,\r\n };\r\n }\r\n self.exportToExcel = function () {\r\n var params = {\r\n skipHeader: false,\r\n skipFooters: false,\r\n skipGroups: false,\r\n allColumns: false,\r\n onlySelected: false,\r\n suppressQuotes: false,\r\n fileName: getEditingRuleName() + '.xls',\r\n columnSeparator: ','\r\n };\r\n\r\n self.gridOptions.api.exportDataAsCsv(params);\r\n }\r\n\r\n self.exportPriceRulesTable = function () {\r\n\r\n console.log(self.priceRulesTable);\r\n var html = '';\r\n\r\n //header\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n html += '';\r\n\r\n angular.forEach(self.priceRulesTable, function (pr) {\r\n if (pr != null) {\r\n html += buildRow(pr);\r\n }\r\n }); \r\n\r\n html += '
AceptacionTipoDescripcionDesdeSubcategoriasItemsTipos de precioProveedoresZonas de CompetenciaSensibilidadesEtiquetasPropiedades
';\r\n\r\n var exportHref = ExportToExcel(html, 'Pagina1');\r\n $timeout(function () {\r\n location.href = exportHref;\r\n }, 100); // trigger download\r\n }\r\n\r\n function buildRow(priceRule) {\r\n\r\n var html = '';\r\n\r\n if (priceRule != null) {\r\n html += '' + removeDiacritics(priceRule.acceptance) +\r\n '' + removeDiacritics(priceRule.priceRuleTypeName) +\r\n '' + removeDiacritics(priceRule.priceRuleDescription) +\r\n '' + getDateToString(priceRule.validFrom) +\r\n '' + removeDiacritics(priceRule.categories.map(function (c) { return c.categoryName; }).join(',')) +\r\n '' + removeDiacritics(priceRule.items.map(function (i) { return i.itemCode + \" - \" + i.itemName; }).join(',')) +\r\n '' + removeDiacritics(priceRule.priceTypes.join(',')) +\r\n '' + removeDiacritics(priceRule.vendors.map(function (v) { return v.vendorName; }).join(',')) +\r\n '' + removeDiacritics(priceRule.priceLists.map(function (pl) { return pl.priceListName; }).join(',')) +\r\n '' + removeDiacritics(priceRule.itemSensitivities.map(function (i) { return i.itemSensitivityName; }).join(',')) +\r\n '' + removeDiacritics(priceRule.tags.map(function (t) { return t.tagName; }).join(',')) +\r\n '' + removeDiacritics(priceRule.itemProperties.join(',')) +\r\n '';\r\n }\r\n\r\n return html;\r\n }\r\n\r\n function ExportToExcel(tableHtml, worksheetName) {\r\n var uri = 'data:application/vnd.ms-excel;base64,',\r\n template = '{table}
',\r\n base64 = function (s) { return $window.btoa(unescape(encodeURIComponent(s))); },\r\n format = function (s, c) { return s.replace(/{(\\w+)}/g, function (m, p) { return c[p]; }) };\r\n\r\n var ctx = { worksheet: worksheetName, table: tableHtml },\r\n href = uri + base64(format(template, ctx));\r\n return href;\r\n }\r\n\r\n function getDateToString(dateOld) {\r\n if (dateOld != null && dateOld != \"\") {\r\n var aux = new Date(dateOld);\r\n var year = aux.getFullYear();\r\n var month = aux.getMonth() + 1;\r\n var day = aux.getDate();\r\n var newDate = year + \"-\" + month + \"-\" + day;\r\n return newDate;\r\n }\r\n else {\r\n return \"\";\r\n }\r\n }\r\n\r\n function removeDiacritics(str) {\r\n if (str && typeof(str) == 'string') {\r\n\r\n var defaultDiacriticsRemovalMap = [\r\n { 'base': 'A', 'letters': /[\\u0041\\u24B6\\uFF21\\u00C0\\u00C1\\u00C2\\u1EA6\\u1EA4\\u1EAA\\u1EA8\\u00C3\\u0100\\u0102\\u1EB0\\u1EAE\\u1EB4\\u1EB2\\u0226\\u01E0\\u00C4\\u01DE\\u1EA2\\u00C5\\u01FA\\u01CD\\u0200\\u0202\\u1EA0\\u1EAC\\u1EB6\\u1E00\\u0104\\u023A\\u2C6F]/g },\r\n { 'base': 'AA', 'letters': /[\\uA732]/g },\r\n { 'base': 'AE', 'letters': /[\\u00C6\\u01FC\\u01E2]/g },\r\n { 'base': 'AO', 'letters': /[\\uA734]/g },\r\n { 'base': 'AU', 'letters': /[\\uA736]/g },\r\n { 'base': 'AV', 'letters': /[\\uA738\\uA73A]/g },\r\n { 'base': 'AY', 'letters': /[\\uA73C]/g },\r\n { 'base': 'B', 'letters': /[\\u0042\\u24B7\\uFF22\\u1E02\\u1E04\\u1E06\\u0243\\u0182\\u0181]/g },\r\n { 'base': 'C', 'letters': /[\\u0043\\u24B8\\uFF23\\u0106\\u0108\\u010A\\u010C\\u00C7\\u1E08\\u0187\\u023B\\uA73E]/g },\r\n { 'base': 'D', 'letters': /[\\u0044\\u24B9\\uFF24\\u1E0A\\u010E\\u1E0C\\u1E10\\u1E12\\u1E0E\\u0110\\u018B\\u018A\\u0189\\uA779]/g },\r\n { 'base': 'DZ', 'letters': /[\\u01F1\\u01C4]/g },\r\n { 'base': 'Dz', 'letters': /[\\u01F2\\u01C5]/g },\r\n { 'base': 'E', 'letters': /[\\u0045\\u24BA\\uFF25\\u00C8\\u00C9\\u00CA\\u1EC0\\u1EBE\\u1EC4\\u1EC2\\u1EBC\\u0112\\u1E14\\u1E16\\u0114\\u0116\\u00CB\\u1EBA\\u011A\\u0204\\u0206\\u1EB8\\u1EC6\\u0228\\u1E1C\\u0118\\u1E18\\u1E1A\\u0190\\u018E]/g },\r\n { 'base': 'F', 'letters': /[\\u0046\\u24BB\\uFF26\\u1E1E\\u0191\\uA77B]/g },\r\n { 'base': 'G', 'letters': /[\\u0047\\u24BC\\uFF27\\u01F4\\u011C\\u1E20\\u011E\\u0120\\u01E6\\u0122\\u01E4\\u0193\\uA7A0\\uA77D\\uA77E]/g },\r\n { 'base': 'H', 'letters': /[\\u0048\\u24BD\\uFF28\\u0124\\u1E22\\u1E26\\u021E\\u1E24\\u1E28\\u1E2A\\u0126\\u2C67\\u2C75\\uA78D]/g },\r\n { 'base': 'I', 'letters': /[\\u0049\\u24BE\\uFF29\\u00CC\\u00CD\\u00CE\\u0128\\u012A\\u012C\\u0130\\u00CF\\u1E2E\\u1EC8\\u01CF\\u0208\\u020A\\u1ECA\\u012E\\u1E2C\\u0197]/g },\r\n { 'base': 'J', 'letters': /[\\u004A\\u24BF\\uFF2A\\u0134\\u0248]/g },\r\n { 'base': 'K', 'letters': /[\\u004B\\u24C0\\uFF2B\\u1E30\\u01E8\\u1E32\\u0136\\u1E34\\u0198\\u2C69\\uA740\\uA742\\uA744\\uA7A2]/g },\r\n { 'base': 'L', 'letters': /[\\u004C\\u24C1\\uFF2C\\u013F\\u0139\\u013D\\u1E36\\u1E38\\u013B\\u1E3C\\u1E3A\\u0141\\u023D\\u2C62\\u2C60\\uA748\\uA746\\uA780]/g },\r\n { 'base': 'LJ', 'letters': /[\\u01C7]/g },\r\n { 'base': 'Lj', 'letters': /[\\u01C8]/g },\r\n { 'base': 'M', 'letters': /[\\u004D\\u24C2\\uFF2D\\u1E3E\\u1E40\\u1E42\\u2C6E\\u019C]/g },\r\n { 'base': 'N', 'letters': /[\\u004E\\u24C3\\uFF2E\\u01F8\\u0143\\u00D1\\u1E44\\u0147\\u1E46\\u0145\\u1E4A\\u1E48\\u0220\\u019D\\uA790\\uA7A4]/g },\r\n { 'base': 'NJ', 'letters': /[\\u01CA]/g },\r\n { 'base': 'Nj', 'letters': /[\\u01CB]/g },\r\n { 'base': 'O', 'letters': /[\\u004F\\u24C4\\uFF2F\\u00D2\\u00D3\\u00D4\\u1ED2\\u1ED0\\u1ED6\\u1ED4\\u00D5\\u1E4C\\u022C\\u1E4E\\u014C\\u1E50\\u1E52\\u014E\\u022E\\u0230\\u00D6\\u022A\\u1ECE\\u0150\\u01D1\\u020C\\u020E\\u01A0\\u1EDC\\u1EDA\\u1EE0\\u1EDE\\u1EE2\\u1ECC\\u1ED8\\u01EA\\u01EC\\u00D8\\u01FE\\u0186\\u019F\\uA74A\\uA74C]/g },\r\n { 'base': 'OI', 'letters': /[\\u01A2]/g },\r\n { 'base': 'OO', 'letters': /[\\uA74E]/g },\r\n { 'base': 'OU', 'letters': /[\\u0222]/g },\r\n { 'base': 'P', 'letters': /[\\u0050\\u24C5\\uFF30\\u1E54\\u1E56\\u01A4\\u2C63\\uA750\\uA752\\uA754]/g },\r\n { 'base': 'Q', 'letters': /[\\u0051\\u24C6\\uFF31\\uA756\\uA758\\u024A]/g },\r\n { 'base': 'R', 'letters': /[\\u0052\\u24C7\\uFF32\\u0154\\u1E58\\u0158\\u0210\\u0212\\u1E5A\\u1E5C\\u0156\\u1E5E\\u024C\\u2C64\\uA75A\\uA7A6\\uA782]/g },\r\n { 'base': 'S', 'letters': /[\\u0053\\u24C8\\uFF33\\u1E9E\\u015A\\u1E64\\u015C\\u1E60\\u0160\\u1E66\\u1E62\\u1E68\\u0218\\u015E\\u2C7E\\uA7A8\\uA784]/g },\r\n { 'base': 'T', 'letters': /[\\u0054\\u24C9\\uFF34\\u1E6A\\u0164\\u1E6C\\u021A\\u0162\\u1E70\\u1E6E\\u0166\\u01AC\\u01AE\\u023E\\uA786]/g },\r\n { 'base': 'TZ', 'letters': /[\\uA728]/g },\r\n { 'base': 'U', 'letters': /[\\u0055\\u24CA\\uFF35\\u00D9\\u00DA\\u00DB\\u0168\\u1E78\\u016A\\u1E7A\\u016C\\u00DC\\u01DB\\u01D7\\u01D5\\u01D9\\u1EE6\\u016E\\u0170\\u01D3\\u0214\\u0216\\u01AF\\u1EEA\\u1EE8\\u1EEE\\u1EEC\\u1EF0\\u1EE4\\u1E72\\u0172\\u1E76\\u1E74\\u0244]/g },\r\n { 'base': 'V', 'letters': /[\\u0056\\u24CB\\uFF36\\u1E7C\\u1E7E\\u01B2\\uA75E\\u0245]/g },\r\n { 'base': 'VY', 'letters': /[\\uA760]/g },\r\n { 'base': 'W', 'letters': /[\\u0057\\u24CC\\uFF37\\u1E80\\u1E82\\u0174\\u1E86\\u1E84\\u1E88\\u2C72]/g },\r\n { 'base': 'X', 'letters': /[\\u0058\\u24CD\\uFF38\\u1E8A\\u1E8C]/g },\r\n { 'base': 'Y', 'letters': /[\\u0059\\u24CE\\uFF39\\u1EF2\\u00DD\\u0176\\u1EF8\\u0232\\u1E8E\\u0178\\u1EF6\\u1EF4\\u01B3\\u024E\\u1EFE]/g },\r\n { 'base': 'Z', 'letters': /[\\u005A\\u24CF\\uFF3A\\u0179\\u1E90\\u017B\\u017D\\u1E92\\u1E94\\u01B5\\u0224\\u2C7F\\u2C6B\\uA762]/g },\r\n { 'base': 'a', 'letters': /[\\u0061\\u24D0\\uFF41\\u1E9A\\u00E0\\u00E1\\u00E2\\u1EA7\\u1EA5\\u1EAB\\u1EA9\\u00E3\\u0101\\u0103\\u1EB1\\u1EAF\\u1EB5\\u1EB3\\u0227\\u01E1\\u00E4\\u01DF\\u1EA3\\u00E5\\u01FB\\u01CE\\u0201\\u0203\\u1EA1\\u1EAD\\u1EB7\\u1E01\\u0105\\u2C65\\u0250]/g },\r\n { 'base': 'aa', 'letters': /[\\uA733]/g },\r\n { 'base': 'ae', 'letters': /[\\u00E6\\u01FD\\u01E3]/g },\r\n { 'base': 'ao', 'letters': /[\\uA735]/g },\r\n { 'base': 'au', 'letters': /[\\uA737]/g },\r\n { 'base': 'av', 'letters': /[\\uA739\\uA73B]/g },\r\n { 'base': 'ay', 'letters': /[\\uA73D]/g },\r\n { 'base': 'b', 'letters': /[\\u0062\\u24D1\\uFF42\\u1E03\\u1E05\\u1E07\\u0180\\u0183\\u0253]/g },\r\n { 'base': 'c', 'letters': /[\\u0063\\u24D2\\uFF43\\u0107\\u0109\\u010B\\u010D\\u00E7\\u1E09\\u0188\\u023C\\uA73F\\u2184]/g },\r\n { 'base': 'd', 'letters': /[\\u0064\\u24D3\\uFF44\\u1E0B\\u010F\\u1E0D\\u1E11\\u1E13\\u1E0F\\u0111\\u018C\\u0256\\u0257\\uA77A]/g },\r\n { 'base': 'dz', 'letters': /[\\u01F3\\u01C6]/g },\r\n { 'base': 'e', 'letters': /[\\u0065\\u24D4\\uFF45\\u00E8\\u00E9\\u00EA\\u1EC1\\u1EBF\\u1EC5\\u1EC3\\u1EBD\\u0113\\u1E15\\u1E17\\u0115\\u0117\\u00EB\\u1EBB\\u011B\\u0205\\u0207\\u1EB9\\u1EC7\\u0229\\u1E1D\\u0119\\u1E19\\u1E1B\\u0247\\u025B\\u01DD]/g },\r\n { 'base': 'f', 'letters': /[\\u0066\\u24D5\\uFF46\\u1E1F\\u0192\\uA77C]/g },\r\n { 'base': 'g', 'letters': /[\\u0067\\u24D6\\uFF47\\u01F5\\u011D\\u1E21\\u011F\\u0121\\u01E7\\u0123\\u01E5\\u0260\\uA7A1\\u1D79\\uA77F]/g },\r\n { 'base': 'h', 'letters': /[\\u0068\\u24D7\\uFF48\\u0125\\u1E23\\u1E27\\u021F\\u1E25\\u1E29\\u1E2B\\u1E96\\u0127\\u2C68\\u2C76\\u0265]/g },\r\n { 'base': 'hv', 'letters': /[\\u0195]/g },\r\n { 'base': 'i', 'letters': /[\\u0069\\u24D8\\uFF49\\u00EC\\u00ED\\u00EE\\u0129\\u012B\\u012D\\u00EF\\u1E2F\\u1EC9\\u01D0\\u0209\\u020B\\u1ECB\\u012F\\u1E2D\\u0268\\u0131]/g },\r\n { 'base': 'j', 'letters': /[\\u006A\\u24D9\\uFF4A\\u0135\\u01F0\\u0249]/g },\r\n { 'base': 'k', 'letters': /[\\u006B\\u24DA\\uFF4B\\u1E31\\u01E9\\u1E33\\u0137\\u1E35\\u0199\\u2C6A\\uA741\\uA743\\uA745\\uA7A3]/g },\r\n { 'base': 'l', 'letters': /[\\u006C\\u24DB\\uFF4C\\u0140\\u013A\\u013E\\u1E37\\u1E39\\u013C\\u1E3D\\u1E3B\\u017F\\u0142\\u019A\\u026B\\u2C61\\uA749\\uA781\\uA747]/g },\r\n { 'base': 'lj', 'letters': /[\\u01C9]/g },\r\n { 'base': 'm', 'letters': /[\\u006D\\u24DC\\uFF4D\\u1E3F\\u1E41\\u1E43\\u0271\\u026F]/g },\r\n { 'base': 'n', 'letters': /[\\u006E\\u24DD\\uFF4E\\u01F9\\u0144\\u00F1\\u1E45\\u0148\\u1E47\\u0146\\u1E4B\\u1E49\\u019E\\u0272\\u0149\\uA791\\uA7A5]/g },\r\n { 'base': 'nj', 'letters': /[\\u01CC]/g },\r\n { 'base': 'o', 'letters': /[\\u006F\\u24DE\\uFF4F\\u00F2\\u00F3\\u00F4\\u1ED3\\u1ED1\\u1ED7\\u1ED5\\u00F5\\u1E4D\\u022D\\u1E4F\\u014D\\u1E51\\u1E53\\u014F\\u022F\\u0231\\u00F6\\u022B\\u1ECF\\u0151\\u01D2\\u020D\\u020F\\u01A1\\u1EDD\\u1EDB\\u1EE1\\u1EDF\\u1EE3\\u1ECD\\u1ED9\\u01EB\\u01ED\\u00F8\\u01FF\\u0254\\uA74B\\uA74D\\u0275]/g },\r\n { 'base': 'oi', 'letters': /[\\u01A3]/g },\r\n { 'base': 'ou', 'letters': /[\\u0223]/g },\r\n { 'base': 'oo', 'letters': /[\\uA74F]/g },\r\n { 'base': 'p', 'letters': /[\\u0070\\u24DF\\uFF50\\u1E55\\u1E57\\u01A5\\u1D7D\\uA751\\uA753\\uA755]/g },\r\n { 'base': 'q', 'letters': /[\\u0071\\u24E0\\uFF51\\u024B\\uA757\\uA759]/g },\r\n { 'base': 'r', 'letters': /[\\u0072\\u24E1\\uFF52\\u0155\\u1E59\\u0159\\u0211\\u0213\\u1E5B\\u1E5D\\u0157\\u1E5F\\u024D\\u027D\\uA75B\\uA7A7\\uA783]/g },\r\n { 'base': 's', 'letters': /[\\u0073\\u24E2\\uFF53\\u00DF\\u015B\\u1E65\\u015D\\u1E61\\u0161\\u1E67\\u1E63\\u1E69\\u0219\\u015F\\u023F\\uA7A9\\uA785\\u1E9B]/g },\r\n { 'base': 't', 'letters': /[\\u0074\\u24E3\\uFF54\\u1E6B\\u1E97\\u0165\\u1E6D\\u021B\\u0163\\u1E71\\u1E6F\\u0167\\u01AD\\u0288\\u2C66\\uA787]/g },\r\n { 'base': 'tz', 'letters': /[\\uA729]/g },\r\n { 'base': 'u', 'letters': /[\\u0075\\u24E4\\uFF55\\u00F9\\u00FA\\u00FB\\u0169\\u1E79\\u016B\\u1E7B\\u016D\\u00FC\\u01DC\\u01D8\\u01D6\\u01DA\\u1EE7\\u016F\\u0171\\u01D4\\u0215\\u0217\\u01B0\\u1EEB\\u1EE9\\u1EEF\\u1EED\\u1EF1\\u1EE5\\u1E73\\u0173\\u1E77\\u1E75\\u0289]/g },\r\n { 'base': 'v', 'letters': /[\\u0076\\u24E5\\uFF56\\u1E7D\\u1E7F\\u028B\\uA75F\\u028C]/g },\r\n { 'base': 'vy', 'letters': /[\\uA761]/g },\r\n { 'base': 'w', 'letters': /[\\u0077\\u24E6\\uFF57\\u1E81\\u1E83\\u0175\\u1E87\\u1E85\\u1E98\\u1E89\\u2C73]/g },\r\n { 'base': 'x', 'letters': /[\\u0078\\u24E7\\uFF58\\u1E8B\\u1E8D]/g },\r\n { 'base': 'y', 'letters': /[\\u0079\\u24E8\\uFF59\\u1EF3\\u00FD\\u0177\\u1EF9\\u0233\\u1E8F\\u00FF\\u1EF7\\u1E99\\u1EF5\\u01B4\\u024F\\u1EFF]/g },\r\n { 'base': 'z', 'letters': /[\\u007A\\u24E9\\uFF5A\\u017A\\u1E91\\u017C\\u017E\\u1E93\\u1E95\\u01B6\\u0225\\u0240\\u2C6C\\uA763]/g }\r\n ];\r\n\r\n for (var i = 0; i < defaultDiacriticsRemovalMap.length; i++) {\r\n str = str.replace(defaultDiacriticsRemovalMap[i].letters, defaultDiacriticsRemovalMap[i].base);\r\n }\r\n }\r\n else {\r\n str = \"\";\r\n }\r\n\r\n return str.trim();\r\n\r\n }\r\n\r\n self.includeSelectAll = function () {\r\n self.includeAllItems = !self.includeAllItems; //Invierto a lo que estaba.\r\n self.excludeAllItems = false; //Va siempre a false.\r\n\r\n\r\n self.gridOptions.api.forEachNodeAfterFilter(function (node) {\r\n node.data.includeItem = self.includeAllItems;\r\n self.includeItem(node.data, true);\r\n });\r\n\r\n self.gridOptions.api.refreshView();\r\n }\r\n self.excludeSelectAll = function () {\r\n self.excludeAllItems = !self.excludeAllItems; //Invierto a lo que estaba.\r\n self.includeAllItems = false; //Va siempre a false.\r\n\r\n\r\n self.gridOptions.api.forEachNodeAfterFilter(function (node) {\r\n node.data.excludeItem = self.excludeAllItems;\r\n self.includeItem(node.data, false);\r\n });\r\n\r\n self.gridOptions.api.refreshView();\r\n }\r\n\r\n //GRID FILTERS\r\n function isExternalFilterPresent() {\r\n // if excludedItem is selected or excluding SubCategory is selected, then we are filtering\r\n return self.priceTypes != [] || (self.filter && self.filter != '');\r\n }\r\n function doesExternalFilterPass(node) {\r\n var priceType = self.priceTypes.indexOf(node.data.priceTypeName) > -1;\r\n\r\n var priceList = (self.competitiveRule.writtenRule && isInSelectedPricelist(node.data.priceListCode, self.competitiveRule.pricelists, self.competitiveRule.expricelists)) ||\r\n (self.marginRule.writtenRule && isInSelectedPricelist(node.data.priceListCode, self.marginRule.pricelists, self.marginRule.expricelists)) ||\r\n (self.parentRule.writtenRule && isInSelectedPricelist(node.data.priceListCode, self.parentRule.pricelists, self.parentRule.expricelists)) ||\r\n (self.zoneRule.writtenRule && isInSelectedPricelist(node.data.priceListCode, self.zoneRule.pricelists, self.zoneRule.expricelists))\r\n\r\n var vendor = (self.competitiveRule.writtenRule && isInSelectedVendor(node.data.vendorCode, self.competitiveRule.vendors, self.competitiveRule.exvendors)) ||\r\n (self.marginRule.writtenRule && isInSelectedVendor(node.data.vendorCode, self.marginRule.vendors, self.marginRule.exvendors)) ||\r\n (self.parentRule.writtenRule && isInSelectedVendor(node.data.vendorCode, self.parentRule.vendors, self.parentRule.exvendors)) ||\r\n (self.zoneRule.writtenRule && isInSelectedVendor(node.data.vendorCode, self.zoneRule.vendors, self.zoneRule.exvendors))\r\n\r\n\r\n var subCategory = (self.competitiveRule.writtenRule && isInSelectedCategory(node.data.subCategory, self.competitiveRule.categories, self.competitiveRule.excategories)) ||\r\n (self.marginRule.writtenRule && isInSelectedCategory(node.data.subCategory, self.marginRule.categories, self.marginRule.excategories)) ||\r\n (self.parentRule.writtenRule && isInSelectedCategory(node.data.subCategory, self.parentRule.categories, self.parentRule.excategories)) ||\r\n (self.zoneRule.writtenRule && isInSelectedCategory(node.data.subCategory, self.zoneRule.categories, self.zoneRule.excategories))\r\n\r\n var articlesGroup = (self.competitiveRule.writtenRule && isInSelectedAlternativeCategory(node.data.alternativeCategoryCode, self.competitiveRule.articlesGroup, self.competitiveRule.exarticlesGroup)) ||\r\n (self.marginRule.writtenRule && isInSelectedAlternativeCategory(node.data.alternativeCategoryCode, self.marginRule.articlesGroup, self.marginRule.exarticlesGroup)) ||\r\n (self.parentRule.writtenRule && isInSelectedAlternativeCategory(node.data.alternativeCategoryCode, self.parentRule.articlesGroup, self.parentRule.exarticlesGroup)) ||\r\n (self.zoneRule.writtenRule && isInSelectedAlternativeCategory(node.data.alternativeCategoryCode, self.zoneRule.articlesGroup, self.zoneRule.exarticlesGroup))\r\n\r\n var sensitivities = (self.competitiveRule.writtenRule && isInSelectedSensitivity(node.data.sensitivities, self.competitiveRule.itemSensitivities, self.competitiveRule.exitemSensitivities)) ||\r\n (self.marginRule.writtenRule && isInSelectedSensitivity(node.data.sensitivities, self.marginRule.itemSensitivities, self.marginRule.exitemSensitivities)) ||\r\n (self.parentRule.writtenRule && isInSelectedSensitivity(node.data.sensitivities, self.parentRule.itemSensitivities, self.parentRule.exitemSensitivities)) ||\r\n (self.zoneRule.writtenRule && isInSelectedSensitivity(node.data.sensitivities, self.zoneRule.itemSensitivities, self.zoneRule.exitemSensitivities))\r\n\r\n var tags = (self.competitiveRule.writtenRule && isInSelectedTag(node.data.tags, self.competitiveRule.tags, self.competitiveRule.extags)) ||\r\n (self.marginRule.writtenRule && isInSelectedTag(node.data.tags, self.marginRule.tags, self.marginRule.extags)) ||\r\n (self.parentRule.writtenRule && isInSelectedTag(node.data.tags, self.parentRule.tags, self.parentRule.extags)) ||\r\n (self.zoneRule.writtenRule && isInSelectedTag(node.data.tags, self.zoneRule.tags, self.zoneRule.extags))\r\n\r\n var itemProperties = (self.competitiveRule.writtenRule && isInSelectedItemProperties(node.data, self.competitiveRule.itemproperties, self.competitiveRule.exitemproperties)) ||\r\n (self.marginRule.writtenRule && isInSelectedItemProperties(node.data, self.marginRule.itemproperties, self.marginRule.exitemproperties)) ||\r\n (self.parentRule.writtenRule && isInSelectedItemProperties(node.data, self.parentRule.itemproperties, self.parentRule.exitemproperties)) ||\r\n (self.zoneRule.writtenRule && isInSelectedItemProperties(node.data, self.zoneRule.itemproperties, self.zoneRule.exitemproperties))\r\n\r\n var itemWithUmv = { itemId: node.data.itemId, umvId: node.data.salesUnitOfMeasureId };\r\n var indexExc = objectIndexOf(self.excludedItems, itemWithUmv);\r\n var excludedItem = indexExc > -1;\r\n\r\n var isParentItem = !(self.parentRule.writtenRule && node.data.itemId == self.parentRule.mainItemId && node.data.salesUnitOfMeasureId == self.parentRule.mainItemUmvId);\r\n\r\n if (priceType && priceList && vendor && subCategory && articlesGroup && sensitivities && tags && itemProperties && isParentItem) {\r\n\r\n var includedItemsInRule = self.includedItems.length > 0;\r\n var isIncludedAndIncludedInOtherRule = false; //Si el item que estoy incluyendo, esta excluido\r\n angular.forEach(self.includedItems, function (i) {\r\n if (i.itemId == node.data.itemId && i.umvId == node.data.salesUnitOfMeasureId && !checkIfIsCurrentRule(node.data))\r\n isIncludedAndIncludedInOtherRule = true;\r\n });\r\n\r\n //Se suman los conflictos (Por regla editada)\r\n if (self.isEditingCompetitiveRule && node.data.competitiveRule != undefined && node.data.competitiveRule != null) {\r\n if (!excludedItem && (isIncludedAndIncludedInOtherRule || !includedItemsInRule)) //Si en la grilla, el item no esta excluido Y (el item SE INCLUYO aproposito o si hay otro item Incluido) es un conflicto\r\n self.totalConflicts++;\r\n else if (includedItemsInRule)\r\n self.totalConflicts = 0;\r\n }\r\n else if (self.isEditingMarginRule && node.data.marginRule != undefined && node.data.marginRule != null) {\r\n if (!excludedItem && (isIncludedAndIncludedInOtherRule || !includedItemsInRule)) //Si en la grilla, el item no esta excluido Y (el item SE INCLUYO aproposito o si hay otro item Incluido) es un conflicto\r\n self.totalConflicts++;\r\n else if (includedItemsInRule)\r\n self.totalConflicts = 0;\r\n }\r\n else if (self.isEditingParentRule && node.data.parentRuleItem != undefined && node.data.parentRuleItem != null) {\r\n if (!excludedItem && (isIncludedAndIncludedInOtherRule || !includedItemsInRule)) //Si en la grilla, el item no esta excluido Y (el item SE INCLUYO aproposito o si hay otro item Incluido) es un conflicto\r\n self.totalConflicts++;\r\n else if (includedItemsInRule)\r\n self.totalConflicts = 0;\r\n }\r\n else if (self.isEditingZoneRule && node.data.parentRuleZone != undefined && node.data.parentRuleZone != null) {\r\n if (!excludedItem && (isIncludedAndIncludedInOtherRule || !includedItemsInRule)) //Si en la grilla, el item no esta excluido Y (el item SE INCLUYO aproposito o si hay otro item Incluido) es un conflicto\r\n self.totalConflicts++;\r\n else if (includedItemsInRule)\r\n self.totalConflicts = 0;\r\n }\r\n\r\n return true;\r\n }\r\n else\r\n return false;\r\n\r\n return true;\r\n }\r\n\r\n function addQuickFilterListener() {\r\n var eInput = document.querySelector('#searchGridInput');\r\n eInput.addEventListener(\"input\", function () {\r\n var text = eInput.value;\r\n self.gridOptions.api.setQuickFilter(text);\r\n });\r\n }\r\n\r\n //GRID CHILDS\r\n function getNodeChildDetails(rowItem) {\r\n if (rowItem.children && rowItem.children.length > 0) {\r\n return {\r\n group: true,\r\n expanded: false,\r\n // provide ag-Grid with the children of this group\r\n children: rowItem.children,\r\n // the key is used by the default group cellRenderer\r\n //key: rowItem.subCategory\r\n };\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n //Helper\r\n function objectIndexOf(arr, obj) {\r\n for (var i = 0; i < arr.length; i++) {\r\n if (angular.equals(arr[i], obj)) {\r\n return i;\r\n }\r\n };\r\n return -1;\r\n }\r\n function isInSelectedPricelist(priceList, priceListList, expriceListList) {\r\n var rv = false;\r\n\r\n if (self.allPriceListsChecked) {\r\n if (expriceListList.length == 0) {\r\n if (self.isEditingZoneRule) //Si es regla de zonas, reviso cada una porque tengo que excluir la que seleccione\r\n {\r\n angular.forEach(priceListList, function (pl) {\r\n if (pl.priceListCode == priceList)\r\n rv = true;\r\n });\r\n }\r\n else\r\n rv = true;\r\n }\r\n else {\r\n rv = true\r\n angular.forEach(expriceListList, function (pl) {\r\n if (pl.priceListCode == priceList)\r\n rv = false;\r\n });\r\n }\r\n }\r\n else {\r\n angular.forEach(priceListList, function (pl) {\r\n if (pl.priceListCode == priceList)\r\n rv = true;\r\n });\r\n }\r\n\r\n return rv;\r\n }\r\n function isInSelectedVendor(vendor, vendorList, exvendorList) {\r\n var rv = false;\r\n\r\n if (self.allVendorsChecked) {\r\n if (exvendorList.length == 0)\r\n rv = true\r\n else {\r\n rv = true\r\n angular.forEach(exvendorList, function (v) {\r\n if (v.vendorCode == vendor)\r\n rv = false;\r\n });\r\n }\r\n }\r\n else {\r\n angular.forEach(vendorList, function (v) {\r\n if (v.vendorCode == vendor)\r\n rv = true;\r\n });\r\n }\r\n\r\n return rv;\r\n }\r\n function isInSelectedCategory(category, categoryList, excategoryList) {\r\n var rv = false;\r\n\r\n if (self.allCategoriesChecked) {\r\n if (excategoryList.length == 0)\r\n rv = true\r\n else {\r\n rv = true\r\n angular.forEach(excategoryList, function (c) {\r\n if (c.categoryName == category)\r\n rv = false;\r\n });\r\n }\r\n }\r\n else {\r\n angular.forEach(categoryList, function (c) {\r\n if (c.categoryName == category)\r\n rv = true;\r\n });\r\n }\r\n\r\n return rv;\r\n }\r\n function isInSelectedAlternativeCategory(alternativeCategoryCode, alternativeCategoryList, exalternativeCategoryList) {\r\n var rv = false;\r\n\r\n if (alternativeCategoryCode)\r\n alternativeCategoryCode = alternativeCategoryCode.trim();\r\n\r\n if (self.allArticlesGroupChecked) {\r\n if (exalternativeCategoryList.length == 0)\r\n rv = true\r\n else {\r\n rv = true\r\n angular.forEach(exalternativeCategoryList, function (c) {\r\n if (c.articleGroupCode == alternativeCategoryCode)\r\n rv = false;\r\n });\r\n }\r\n }\r\n else {\r\n angular.forEach(alternativeCategoryList, function (c) {\r\n if (c.articleGroupCode == alternativeCategoryCode)\r\n rv = true;\r\n });\r\n }\r\n\r\n return rv;\r\n }\r\n function isInSelectedSensitivity(sensitivity, sensitivities, exsensitivities) {\r\n var rv = false;\r\n\r\n if (exsensitivities.length == 0 && sensitivities.length == 0) //Sin seleccionar sensivilidades\r\n rv = true\r\n else if (exsensitivities.length == 0 && sensitivities.length != 0) { //Sensivilidades a Incluir\r\n angular.forEach(sensitivities, function (s) {\r\n if (sensitivity != null && sensitivity != undefined && sensitivity.toLowerCase().indexOf(s.itemSensitivityName.toLowerCase()) > -1)\r\n rv = true\r\n });\r\n }\r\n else if (exsensitivities.length != 0 && sensitivities.length == 0) { //Sensivilidades a Excluir\r\n rv = true\r\n angular.forEach(exsensitivities, function (s) {\r\n if (sensitivity != null && sensitivity != undefined && sensitivity.toLowerCase().indexOf(s.itemSensitivityName.toLowerCase()) > -1)\r\n rv = false\r\n });\r\n }\r\n\r\n return rv;\r\n }\r\n function isInSelectedTag(tag, tags, extags) {\r\n var rv = false;\r\n\r\n if (extags.length == 0 && tags.length == 0) //Sin filtro de Tags\r\n rv = true\r\n else if (extags.length == 0 && tags.length != 0) { //Tags a Incluir\r\n if (tag != null && tag != undefined) {\r\n angular.forEach(tags, function (t) {\r\n var splittedTags = tag.split(\",\");\r\n angular.forEach(splittedTags, function (st) {\r\n if (st.toLowerCase().trim().indexOf(t.tagName.toLowerCase()) > -1)\r\n rv = true\r\n });\r\n });\r\n }\r\n }\r\n else if (extags.length != 0 && tags.length == 0) { //Tags a Excluir\r\n rv = true\r\n if (tag != null && tag != undefined) {\r\n angular.forEach(extags, function (t) {\r\n var splittedTags = tag.split(\",\");\r\n angular.forEach(splittedTags, function (st) {\r\n if (st.toLowerCase().trim().indexOf(t.tagName.toLowerCase()) > -1)\r\n rv = false\r\n });\r\n });\r\n }\r\n }\r\n\r\n return rv;\r\n }\r\n function isInSelectedItemProperties(data, itemProperties, exitemProperties) {\r\n var rv = false;\r\n\r\n if (exitemProperties.length == 0 && itemProperties.length == 0) //Sin seleccionar ItemProperties\r\n rv = true\r\n else if (exitemProperties.length != 0 && itemProperties.length == 0) { //ItemProperties a Excluir\r\n rv = true\r\n angular.forEach(exitemProperties, function (p) {\r\n if ((data.manufacturer && data.manufacturer.toLowerCase().indexOf(p.value.toLowerCase()) > -1) || (data.brand && data.brand.toLowerCase().indexOf(p.value.toLowerCase()) > -1) || (data.description && data.description.toLowerCase().indexOf(p.value.toLowerCase()) > -1))\r\n rv = false\r\n });\r\n }\r\n else if (exitemProperties.length == 0 && itemProperties.length != 0) { //ItemProperties a Incluir\r\n angular.forEach(itemProperties, function (p) {\r\n if ((data.manufacturer && data.manufacturer.toLowerCase().indexOf(p.value.toLowerCase()) > -1) || (data.brand && data.brand.toLowerCase().indexOf(p.value.toLowerCase()) > -1) || (data.description && data.description.toLowerCase().indexOf(p.value.toLowerCase()) > -1))\r\n rv = true\r\n });\r\n }\r\n\r\n return rv;\r\n }\r\n\r\n //Ambito de Aplicacion Sensibilidades y Tags\r\n function setItemSensitivities(sensitivities) {\r\n self.itemSensitivitiesToInclude = angular.copy(sensitivities);\r\n self.itemSensitivitiesToExclude = angular.copy(sensitivities);\r\n\r\n //Seteo las sensivilidades como excluidas\r\n _.forEach(self.itemSensitivitiesToExclude, function (s, key) {\r\n s.exclude = true;\r\n });\r\n }\r\n function setItemTags(tags) {\r\n self.itemTagsToInclude = angular.copy(tags);\r\n self.itemTagsToExclude = angular.copy(tags);\r\n\r\n //Seteo los tags como excluidas\r\n _.forEach(self.itemTagsToExclude, function (t, key) {\r\n t.exclude = true;\r\n });\r\n }\r\n\r\n //Get data from services\r\n function loadRules() {\r\n priceService.rules.getItemRules($stateParams.categoryId).then(function (rules) {\r\n\r\n addQuickFilterListener();\r\n self.rules = rules;\r\n self.gridOptions.api.setRowData(self.rules);\r\n self.mapItemExcludeToGrid();\r\n self.gridOptions.api.refreshView();\r\n\r\n self.parents = [];\r\n\r\n for (var i = 0; i < rules.length; i++) {\r\n if (rules[i].itemId != 0) {\r\n var parent = { id: rules[i].itemId, name: rules[i].description, code: rules[i].code };\r\n self.parents.push(parent);\r\n }\r\n }\r\n\r\n self.excludedItemId = null;\r\n self.gridOptions.api.onFilterChanged();\r\n //self.gridOptions.api.sizeColumnsToFit();\r\n\r\n });\r\n }\r\n function loadExistingRules() {\r\n priceService.rules.getExistingRules($stateParams.categoryId).then(function (rules) {\r\n self.existingRules = rules;\r\n for (i = 0; i < rules.length; i++) {\r\n if (rules[i].type == 2)\r\n self.existingCompetitiveRules.push(rules[i]);\r\n else if (rules[i].type == 3) {\r\n self.existingParentRules.push(rules[i]);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function loadParents() {\r\n priceService.rules.getParents().then(function (parentItems) {\r\n for (var i = 0; i < parentItems.length; i++) {\r\n for (var j = 0; j < self.parents.length; j++) {\r\n if (self.parents[j].id == parentItems[i].id) {\r\n var index = self.parents.indexOf(self.parents[j]);\r\n if (index > -1)\r\n self.parents.splice(index, 1);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n self.isLoadingCompetitorGroupParents = false;\r\n function loadCompetitorGroupsParents() {\r\n self.isLoadingCompetitorGroupParents = true;\r\n priceService.competitors.getCompetitorGroupsParent().then(function (compGroupsParents) {\r\n self.competitorGroupsParents = compGroupsParents;\r\n self.isLoadingCompetitorGroupParents = false;\r\n })\r\n }\r\n\r\n self.isLoadingCompetitorGroups = false;\r\n function loadCompetitorGroups() {\r\n self.isLoadingCompetitorGroups = true;\r\n priceService.competitors.getCompetitorGroups().then(function (compGroups) {\r\n self.competitorGroups = angular.copy(compGroups);\r\n self.competitorGroupsFilteredByParent = angular.copy(compGroups);\r\n self.isLoadingCompetitorGroups = false;\r\n })\r\n }\r\n\r\n self.isLoadingCompetitors = false;\r\n function loadCompetitors(compGroupId) {\r\n self.isLoadingCompetitors = true;\r\n priceService.competitors.getCompetitors(compGroupId).then(function (competitors) {\r\n self.competitors = competitors;\r\n self.isLoadingCompetitors = false;\r\n })\r\n }\r\n\r\n function loadPriceLists() {\r\n if (self.pricelists.length == 0) {\r\n priceService.rules.getPriceRulePriceLists().then(function (priceLists) {\r\n self.pricelists = angular.copy(priceLists);\r\n self.competitiveRule.pricelists = angular.copy(priceLists);\r\n self.marginRule.pricelists = angular.copy(priceLists);\r\n self.parentRule.pricelists = angular.copy(priceLists);\r\n self.zoneRule.pricelists = angular.copy(priceLists);\r\n self.zonePricelist = angular.copy(priceLists);\r\n });\r\n }\r\n else {\r\n self.competitiveRule.pricelists = angular.copy(self.pricelists);\r\n self.marginRule.pricelists = angular.copy(self.pricelists);\r\n self.parentRule.pricelists = angular.copy(self.pricelists);\r\n self.zoneRule.pricelists = angular.copy(self.pricelists);\r\n self.zonePricelist = angular.copy(self.pricelists);\r\n }\r\n }\r\n function loadVendors() {\r\n if (self.vendors.length == 0) {\r\n priceService.rules.getPriceRuleVendors($stateParams.categoryId).then(function (vendors) {\r\n self.vendors = angular.copy(vendors);\r\n self.competitiveRule.vendors = angular.copy(vendors);\r\n self.marginRule.vendors = angular.copy(vendors);\r\n self.parentRule.vendors = angular.copy(vendors);\r\n self.zoneRule.vendors = angular.copy(vendors);\r\n });\r\n }\r\n else {\r\n self.competitiveRule.vendors = angular.copy(self.vendors);\r\n self.marginRule.vendors = angular.copy(self.vendors);\r\n self.parentRule.vendors = angular.copy(self.vendors);\r\n self.zoneRule.vendors = angular.copy(self.vendors);\r\n }\r\n }\r\n function loadCategories() {\r\n if (self.categories.length == 0) {\r\n priceService.rules.getSubCategoriesById($stateParams.categoryId).then(function (categories) {\r\n self.categories = angular.copy(categories);\r\n self.parentRule.categories = angular.copy(categories);\r\n self.competitiveRule.categories = angular.copy(categories);\r\n self.marginRule.categories = angular.copy(categories);\r\n self.zoneRule.categories = angular.copy(categories);\r\n });\r\n }\r\n else {\r\n self.parentRule.categories = angular.copy(self.categories);\r\n self.competitiveRule.categories = angular.copy(self.categories);\r\n self.marginRule.categories = angular.copy(self.categories);\r\n self.zoneRule.categories = angular.copy(self.categories);\r\n }\r\n }\r\n function loadArticlesGroup() {\r\n if (self.allArticlesGroup.length == 0) {\r\n priceService.rules.getArticlesGroup($stateParams.categoryId).then(function (articlesGroup) {\r\n self.allArticlesGroup = angular.copy(articlesGroup);\r\n self.articlesGroup = angular.copy(articlesGroup);\r\n self.parentRule.articlesGroup = angular.copy(articlesGroup);\r\n self.competitiveRule.articlesGroup = angular.copy(articlesGroup);\r\n self.marginRule.articlesGroup = angular.copy(articlesGroup);\r\n self.zoneRule.articlesGroup = angular.copy(articlesGroup);\r\n });\r\n }\r\n else {\r\n self.articlesGroup = angular.copy(self.allArticlesGroup);\r\n self.parentRule.articlesGroup = angular.copy(self.allArticlesGroup);\r\n self.competitiveRule.articlesGroup = angular.copy(self.allArticlesGroup);\r\n self.marginRule.articlesGroup = angular.copy(self.allArticlesGroup);\r\n self.zoneRule.articlesGroup = angular.copy(self.allArticlesGroup);\r\n }\r\n }\r\n function loadTags() {\r\n if (self.tags.length == 0) {\r\n priceService.rules.getPriceRuleTags(parseInt($stateParams.categoryId)).then(function (tags) {\r\n self.tags = tags;\r\n setItemTags(self.tags);\r\n });\r\n }\r\n else {\r\n setItemTags(self.tags);\r\n }\r\n }\r\n function loadItemSensitivities() {\r\n if (self.itemSensitivities.length == 0) {\r\n priceService.rules.getItemSensitivities().then(function (sensitivities) {\r\n self.itemSensitivities = sensitivities;\r\n setItemSensitivities(self.itemSensitivities);\r\n });\r\n }\r\n else {\r\n setItemSensitivities(self.itemSensitivities);\r\n }\r\n }\r\n\r\n //Seteo el titulo tipo Breadcrumb\r\n function getDataFromCategorySummary() {\r\n var categoryGroup = decodeURIComponent($stateParams.categoryGroup.replace(/-/g, \" \").replace(/_/g, \"\\/\"));\r\n var category = decodeURIComponent($stateParams.category.replace(/-/g, \" \").replace(/_/g, \"\\/\"));\r\n var subcategory = decodeURIComponent($stateParams.subcategory.replace(/-/g, \" \").replace(/_/g, \"\\/\"));\r\n\r\n self.title = categoryGroup\r\n if (category != '') {\r\n self.title += ' / ' + category;\r\n if (subcategory != '') {\r\n self.title += ' / ' + subcategory;\r\n }\r\n }\r\n }\r\n\r\n //Trae las reglas asociadas a la categoria o sub categorias con la que se entro para la primer pantalla.\r\n function getPriceRulesForCategory() {\r\n priceService.rules.getPriceRulesForCategory($stateParams.categoryId)\r\n .then(function (priceRules) {\r\n self.priceRulesTable = priceRules;\r\n self.isLoadingRules = false;\r\n });\r\n }\r\n\r\n function reload() {\r\n self.totalConflicts = 0;\r\n self.isLoadingRules = true;\r\n getPriceRulesForCategory();\r\n self.rules = [];\r\n loadExistingRules();\r\n loadRules();\r\n\r\n //Hace Update\r\n if (self.categories.length != 0) {\r\n loadCategories();\r\n loadArticlesGroup();\r\n loadPriceLists();\r\n loadVendors();\r\n }\r\n }\r\n\r\n function newCompetitiveRule() {\r\n self.competitiveRule = {\r\n id: null,\r\n competitorGroupParent: null,\r\n competitorGroup: null,\r\n competitor: null,\r\n onlyCompetitorsWithSamePriceList: true,\r\n considerModeCount: null,\r\n calculationType: null,\r\n modeType: null,\r\n modeFallback: null,\r\n differenceType: null, //1 = % 2 = $\r\n percentageDifference1: null,\r\n priceDifference1: null,\r\n writtenRule: null,\r\n pricelists: [],\r\n vendors: [],\r\n articlesGroup: [],\r\n priceSurveyTypes: [],\r\n itemSensitivities: [],\r\n categories: [],\r\n tags: [],\r\n itemproperties: [],\r\n items: [],\r\n expricelists: [],\r\n exvendors: [],\r\n exarticlesGroup: [],\r\n excategories: [],\r\n extags: [],\r\n exitemSensitivities: [],\r\n exitemproperties: [],\r\n }\r\n\r\n //Hace Update\r\n if (self.categories.length != 0) {\r\n loadCategories();\r\n loadArticlesGroup();\r\n loadPriceLists();\r\n loadVendors();\r\n }\r\n\r\n self.competitiveRule.priceSurveyTypes = companyJson.PriceRules.CompetitiveRule.DefaultPriceSurveyTypes;\r\n }\r\n\r\n self.marginRuleTypeChanged = function () {\r\n self.marginRule.margin = null;\r\n self.marginRule.marginAmount = null;\r\n self.marginRule.marginType = 1;\r\n\r\n if (self.marginRule.marginRuleType == 1) {\r\n self.marginRule.keepMarginType = null;\r\n }\r\n else {\r\n self.marginRule.keepMarginType = 1;\r\n }\r\n }\r\n\r\n self.marginTypeChanged = function () {\r\n self.marginRule.margin = null;\r\n self.marginRule.marginAmount = null;\r\n }\r\n\r\n function newMarginRule() {\r\n self.marginRule = {\r\n id: null,\r\n marginType: 1, //% o $ del Margen Objetivo\r\n margin: null, //Valor de Margen Objetivo en %\r\n marginAmount: null, //Valor de Margen Objetivo en $\r\n marginRuleType: 1,\r\n writtenRule: null,\r\n pricelists: [],\r\n vendors: [],\r\n articlesGroup: [],\r\n itemSensitivities: [],\r\n categories: [],\r\n tags: [],\r\n itemproperties: [],\r\n items: [],\r\n expricelists: [],\r\n exvendors: [],\r\n exarticlesGroup: [],\r\n excategories: [],\r\n extags: [],\r\n exitemSensitivities: [],\r\n exitemproperties: [],\r\n }\r\n\r\n //Hace Update\r\n if (self.categories.length != 0) {\r\n loadCategories();\r\n loadArticlesGroup();\r\n loadPriceLists();\r\n loadVendors();\r\n }\r\n }\r\n\r\n function newParentRule() {\r\n self.parentRule = {\r\n id: null,\r\n parent: null,\r\n mainItemId: null,\r\n mainItemUmvId: null,\r\n relationshipType: null, //Price = 0; Margin = 1; DeltaPrice = 2;\r\n differenceType: null, // Margin = 1; Price = 2;\r\n percentageDifference2: null,\r\n priceDifference2: null,\r\n difference: 0,\r\n writtenRule: null,\r\n genericItemId: null,\r\n itemId: null,\r\n pricelists: [],\r\n vendors: [],\r\n articlesGroup: [],\r\n itemSensitivities: [],\r\n categories: [],\r\n tags: [],\r\n itemproperties: [],\r\n items: [],\r\n expricelists: [],\r\n exvendors: [],\r\n exarticlesGroup: [],\r\n excategories: [],\r\n extags: [],\r\n exitemSensitivities: [],\r\n exitemproperties: [],\r\n }\r\n\r\n //Hace Update\r\n if (self.categories.length != 0) {\r\n loadCategories();\r\n loadArticlesGroup();\r\n loadPriceLists();\r\n loadVendors();\r\n }\r\n }\r\n\r\n function newZoneRule() {\r\n self.zoneRule = {\r\n id: null,\r\n zone: null,\r\n relationshipType: null, //Price = 0; Margin = 1; DeltaPrice = 2;\r\n differenceType: null,\r\n percentageDifference2: null,\r\n priceDifference2: null,\r\n difference: 0,\r\n writtenRule: null,\r\n pricelists: [],\r\n vendors: [],\r\n articlesGroup: [],\r\n itemSensitivities: [],\r\n categories: [],\r\n tags: [],\r\n itemproperties: [],\r\n items: [],\r\n expricelists: [],\r\n exvendors: [],\r\n exarticlesGroup: [],\r\n excategories: [],\r\n extags: [],\r\n exitemSensitivities: [],\r\n exitemproperties: [],\r\n }\r\n\r\n //Hace Update\r\n if (self.categories.length != 0) {\r\n loadCategories();\r\n loadArticlesGroup();\r\n loadPriceLists();\r\n loadVendors();\r\n }\r\n }\r\n\r\n self.openTagsDialog = function (include) {\r\n self.includeTagsDialog = include;\r\n self.groupTagsDialog = [];\r\n self.tagsDialog = [];\r\n self.itemTagsToIncludeDialog = [];\r\n self.distinctGroupTags = [];\r\n _.forOwn(_.groupBy(self.itemTagsToInclude, \"group\"), function (value, key) {\r\n self.distinctGroupTags.push(key);\r\n }); \r\n\r\n self.onChangeGroupTagsDialog = function () {\r\n self.itemTagsToIncludeDialog = self.itemTagsToInclude.filter(function (t) {\r\n return self.groupTagsDialog.some(function (g) {\r\n return g == t.group;\r\n });\r\n });\r\n }\r\n\r\n self.applyDialog = function () {\r\n if (include) {\r\n var anyTags = false;\r\n self.groupTagsDialog.forEach(function (g) {\r\n self.tagsDialog.forEach(function (t) {\r\n if (t.group == g) {\r\n anyTags = true;\r\n }\r\n });\r\n if (!anyTags) {\r\n self.itemTagsToIncludeDialog.forEach(function (itemTag) {\r\n if (itemTag.group == g) {\r\n self.tagsDialog.push(itemTag);\r\n }\r\n });\r\n }\r\n anyTags = false;\r\n });\r\n\r\n self.tagsDialog.forEach(function (x) {\r\n x.exclude = false;\r\n });\r\n self.marginRule.tags = self.marginRule ? self.tagsDialog : [];\r\n self.parentRule.tags = self.parentRule ? self.tagsDialog : [];\r\n self.zoneRule.tags = self.zoneRule ? self.tagsDialog : [];\r\n self.competitiveRule.tags = self.competitiveRule ? self.tagsDialog : [];\r\n }\r\n else {\r\n var anyTags = false;\r\n self.groupTagsDialog.forEach(function (g) {\r\n self.tagsDialog.forEach(function (t) {\r\n if (t.group == g) {\r\n anyTags = true;\r\n }\r\n });\r\n if (!anyTags) {\r\n self.itemTagsToIncludeDialog.forEach(function (itemTag) {\r\n if (itemTag.group == g) {\r\n self.tagsDialog.push(itemTag);\r\n }\r\n });\r\n }\r\n anyTags = false;\r\n });\r\n\r\n self.tagsDialog.forEach(function (x) {\r\n x.exclude = true;\r\n });\r\n self.marginRule.extags = self.marginRule ? self.tagsDialog : [];\r\n self.parentRule.extags = self.parentRule ? self.tagsDialog : [];\r\n self.zoneRule.extags = self.zoneRule ? self.tagsDialog : [];\r\n self.competitiveRule.extags = self.competitiveRule ? self.tagsDialog : [];\r\n\r\n }\r\n ngDialog.close();\r\n }\r\n\r\n if (include) {\r\n if (self.marginRule) {\r\n self.groupTagsDialog = self.marginRule.tags.map(function (x) {\r\n return x.group;\r\n });\r\n self.tagsDialog = self.marginRule.tags;\r\n }\r\n else if (self.parentRule) {\r\n self.groupTagsDialog = self.parentRule.tags.map(function (x) {\r\n return x.group;\r\n });\r\n self.tagsDialog = self.parentRule.tags;\r\n }\r\n else if (self.zoneRule) {\r\n self.groupTagsDialog = self.zoneRule.tags.map(function (x) {\r\n return x.group;\r\n });\r\n self.tagsDialog = self.zoneRule.tags;\r\n }\r\n else if (self.competitiveRule) {\r\n self.groupTagsDialog = self.competitiveRule.tags.map(function (x) {\r\n return x.group;\r\n });\r\n self.tagsDialog = self.competitiveRule.tags;\r\n }\r\n }\r\n else {\r\n if (self.marginRule) {\r\n self.groupTagsDialog = self.marginRule.extags.map(function (x) {\r\n return x.group;\r\n });\r\n self.tagsDialog = self.marginRule.extags;\r\n }\r\n else if (self.parentRule) {\r\n self.groupTagsDialog = self.parentRule.extags.map(function (x) {\r\n return x.group;\r\n });\r\n self.tagsDialog = self.parentRule.extags;\r\n }\r\n else if (self.zoneRule) {\r\n self.groupTagsDialog = self.zoneRule.extags.map(function (x) {\r\n return x.group;\r\n });\r\n self.tagsDialog = self.zoneRule.extags;\r\n }\r\n else if (self.competitiveRule) {\r\n self.groupTagsDialog = self.competitiveRule.extags.map(function (x) {\r\n return x.group;\r\n });\r\n self.tagsDialog = self.competitiveRule.extags;\r\n }\r\n }\r\n self.onChangeGroupTagsDialog();\r\n\r\n ngDialog.open({\r\n template: 'tagsDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-height-500 custom-width-1124',\r\n backdrop: 'static',\r\n keyboard: false,\r\n closeByDocument: false,\r\n scope: $scope\r\n });\r\n }\r\n\r\n function init() {\r\n\r\n setGridOptions();\r\n\r\n priceService.getPriceSurveyTypes().then(\r\n function (priceSurveyTypes) {\r\n self.priceSurveyTypes = priceSurveyTypes;\r\n });\r\n\r\n $translate([\"NewSuggestionRule\", \"NewParentRule\", \"Competitive\", \"Margin\", \"Products\", \"PriceZone\", \"Minimum\", \"Average\", \"Maximum\", \"Mode\"\r\n , \"LowestModePrice\", \"AverageModePrice\", \"HighestModePrice\", \"HighestRepetitions\", \"LowestPrice\", \"AveragePrice\", \"HighestPrice\"\r\n , \"Promotion\", \"Basket\", \"Price\", \"PriceVariation\", \"SwalReviewCategoryPriceRules\", \"Continue\", \"Cancel\", \"Delete\"\r\n , \"RequestQueued\", \"RequestQueuedInfo\", \"TheProcessContinues\", \"TheProcessContinuesReviewCategoryInfo\", \"AnErrorOccurredReviewingCategory\"\r\n , \"AreYouSureGeneratePriceSuggestions\", \"TheProcessContinuesGeneratePriceSuggestionsInfo\", \"AnErrorOccurredGeneratingSuggestions\", \"AreYouSureDeletePriceRule\"\r\n , \"DeletedRule\", \"DeletedRuleInfo\", \"TheProcessContinuesInfo\", \"AnErrorDeletingRule\", \"CompetitiveWrittenRule1\", \"IfMoreThanOneMode\", \"IfMoreThanOneModeWithSameReps\", \"OnlyCompetitorsInSamePriceZone\", \"SamePrice\", \"DifferenceOf\"\r\n , \"AreYouSureSwal\", \"of\", \"AreYouSureSwalSubtitle\", \"ErrorTitleSwal\", \"ConfirmedSwal\", \"ConfirmedSwalSubtitle\", \"ErrorSwalSubtitle\"\r\n , \"KeepSameMarginPercentage\", \"KeepSameMargin$\", \"TheRuleSwal\", \"AssociatedWithGenericSwal\", \"ThereCanOnlyBe1RulePerGenericSwal\"\r\n , \"NoApplicationScopeOrItemsWereAddedSwal\", \"NoApplicationScopeOrItemsWereAddedSwalSubtitle\", \"ContinueSwal\", \"ActionsAgGrid\", \"Include\", \"Exclude\"\r\n , \"GeneralInformation\", \"Subcategory\", \"GroupOfArticles\", \"Code\", \"Description\", \"PriceZone\", \"Supplier\", \"TypeOfPrice\", \"Brand\", \"Maker\", \"Tags\", \"Sensitivities\", \"PricesAndCosts\", \"CurrentPrice\", \"CurrentCost\", \"PercentajeMargin\", \"SalesUn\"\r\n , \"Rules\", \"CompetitiveF\", \"Margin\", \"RelationshipItems\", \"KinshipZones\", \"RULE\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n self.dropDrownNewSuggestionRuleText = translations.NewSuggestionRule;\r\n self.dropDrownNewParentRuleText = translations.NewParentRule;\r\n self.suggestionRuleTypes = [{ id: 1, name: translations.Competitive }, { id: 2, name: translations.Margin }];\r\n self.parentRuleTypes = [{ id: 3, name: translations.Products }, { id: 4, name: translations.PriceZone }];\r\n self.calculationTypes = [{ id: 0, name: translations.Minimum }, { id: 1, name: translations.Average }, { id: 2, name: translations.Maximum }, { id: 3, name: translations.Mode }];\r\n self.modeFallbacks = [{ id: 0, name: translations.LowestModePrice }, { id: 1, name: translations.AveragePrice }, { id: 2, name: translations.HighestPrice }];\r\n self.modeTypes = [{ id: 0, name: translations.HighestRepetitions }, { id: 1, name: translations.LowestPrice }, { id: 2, name: translations.AveragePrice }, { id: 3, name: translations.HighestPrice }];\r\n\r\n self.relationshipTypes = [{ id: 0, name: translations.Price }, { id: 1, name: translations.Margin }, { id: 2, name: translations.PriceVariation }];\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions.api.setColumnDefs(columnDefs);\r\n });\r\n\r\n //load data First Time\r\n getDataFromCategorySummary();\r\n getPriceRulesForCategory();\r\n loadRules();\r\n loadExistingRules();\r\n loadParents();\r\n\r\n //load data once\r\n loadCategories();\r\n loadPriceLists();\r\n loadVendors();\r\n loadArticlesGroup();\r\n loadItemSensitivities();\r\n loadTags();\r\n\r\n //Inicializo los Tipos de Reglas en Blanco\r\n newCompetitiveRule();\r\n newMarginRule();\r\n newParentRule();\r\n newZoneRule();\r\n\r\n self.showGenericItem = companyJson.PriceRules.ParentRuleItem.ShowGenericItem;\r\n }\r\n\r\n init();\r\n });\r\n","angular.module(\"prisma\")\r\n .controller(\"VolumeMeasurementCtrl\", function ($state, $rootScope, adminService, priceService, $translate) {\r\n\r\n \r\n var self = this;\r\n self.productGroup = [];\r\n self.dateFrom = new Date();\r\n self.months = { '1': 'Ene', '2': 'Feb', '3': 'Mar', '4': 'Abr', '5': 'May', '6': 'Jun', '7': 'Jul', '8': 'Ago', '9': 'Set', '10': 'Oct', '11': 'Nov', '12': 'Dic' };;\r\n self.unitsProductsCompetitors = [];\r\n self.unitsProducts = [];\r\n\r\n self.setDates = function () {\r\n //seteo un a�o antes\r\n var year = self.dateFrom.getFullYear();\r\n self.year = year - 1;\r\n self.dateFrom = new Date(self.year, self.month , 1);\r\n }\r\n\r\n self.items = [{}];\r\n\r\n self.openCalendar = function (e) {\r\n self.isOpen = !self.isOpen;\r\n };\r\n self.loadData = function () {\r\n\r\n if (self.selectedItem && self.selectedPriceList) {\r\n\r\n self.unitsProducts = [];\r\n getVolumeMeasurement(self.selectedItem.id, self.selectedPriceList.id, function (data) {\r\n\r\n self.data = data;\r\n self.updateChart();\r\n\r\n if (self.selectedBrands && self.selectedBrands.length > 0) {\r\n self.unitsProductsCompetitors = [];\r\n self.isLoadingChartCompetitors = true;\r\n getVolumeMeasurementCompetitors(self.selectedItem.id, self.selectedPriceList.id, self.selectedBrands, function (dataCompetitors) {\r\n\r\n self.dataCompetitors = dataCompetitors;\r\n self.updateChartCompetitors();\r\n self.isLoadingChartCompetitors = false;\r\n\r\n });\r\n\r\n } else {\r\n //actualizo sin datos para competidores\r\n self.isLoadingChartCompetitors = false;\r\n self.dataCompetitors = [];\r\n self.updateChartCompetitors();\r\n\r\n }\r\n \r\n });\r\n }\r\n }\r\n self.changeItemSelected = function () {\r\n self.isLoadingChart = false;\r\n self.isLoadingChartCompetitors = false;\r\n }\r\n\r\n self.changePriceListSelected= function () {\r\n self.isLoadingChart = false;\r\n self.isLoadingChartCompetitors = false;\r\n }\r\n self.loadItems = function (categoryId) {\r\n\r\n adminService.items.getItemsByCategory(0).then(function (items) {\r\n self.items = items;\r\n });\r\n\r\n self.selectedItem = self.items[1];\r\n\r\n adminService.priceLists.getPriceLists().then(function (markets) {\r\n self.markets = markets;\r\n });\r\n\r\n adminService.brands.getBrandsCombo(false).then(function (competitors) {\r\n //harcoded\r\n for (i = 0; i < competitors.length; i++) {\r\n if (competitors[i].name == \"OxxoGas\") {\r\n competitors.splice(i, 1);\r\n }\r\n }\r\n self.competitors = competitors;\r\n });\r\n \r\n }\r\n self.updateChart = function () {\r\n c3.generate({\r\n bindto: \"#volumeMeasurementChart\",\r\n data: {\r\n x: 'x',\r\n \"columns\": self.data,\r\n empty: { label: { text: \"Sin datos\" } },\r\n type: 'bar',\r\n groups: [\r\n self.productGroup\r\n ],\r\n types: {\r\n GAP: 'line',\r\n },\r\n axes: {\r\n 'GAP': 'y2'\r\n },\r\n colors: {\r\n 'GAP': '#3e3e3e',\r\n 'Regular': '#48c2a9',\r\n 'Premium': '#777777'\r\n },\r\n labels: {\r\n format: function (v, id, i, j) {\r\n\r\n if (id && (id == \"Premium\" || id == \"Regular\")) {\r\n v = self.unitsProducts[(id == \"Premium\" ? 1 : 0)][i + 1];\r\n } else {\r\n if (id == \"GAP\")\r\n v = \"\";\r\n }\r\n return v;\r\n\r\n }\r\n }\r\n },\r\n axis: {\r\n x: {\r\n type: 'category',\r\n tick: {\r\n rotate: 0,\r\n multiline: false\r\n },\r\n\r\n },\r\n y2: {\r\n show: true,\r\n tick: {\r\n format: d3.format('.0f%')\r\n },\r\n min: -10,\r\n max: 50\r\n }\r\n },\r\n tooltip: {\r\n format: {\r\n title: function (index) {\r\n if (self.data[0]) {\r\n return self.dataCompetitors[0][index + 1];\r\n }\r\n },\r\n\r\n value: function (value, ratio, id) {\r\n var newValue = value + '%';\r\n return newValue;\r\n }\r\n }\r\n }\r\n\r\n });\r\n }\r\n\r\n self.updateChartCompetitors = function () {\r\n c3.generate({\r\n bindto: \"#volumeMeasurementChartCompetitors\" ,\r\n data: {\r\n x: 'x',\r\n \"columns\": self.dataCompetitors,\r\n empty: { label: { text: \"Sin datos\" } },\r\n type: 'bar',\r\n groups: [\r\n self.productGroup \r\n ],\r\n types: {\r\n GAP: 'line',\r\n },\r\n axes: {\r\n 'GAP': 'y2'\r\n },\r\n colors: {\r\n 'GAP': '#3e3e3e',\r\n 'Regular': '#48c2a9',\r\n 'Premium': '#666666'\r\n },\r\n labels: {\r\n format: function (v, id, i, j) {\r\n \r\n if (id && (id == \"Premium\" || id == \"Regular\")) {\r\n v = self.unitsProductsCompetitors[(id == \"Premium\" ? 1 : 0)][i + 1];\r\n } else {\r\n if (id == \"GAP\")\r\n v = \"\";\r\n }\r\n return v;\r\n \r\n }\r\n }\r\n },\r\n axis: {\r\n x: {\r\n type: 'category',\r\n tick: {\r\n rotate: 0,\r\n multiline: false\r\n }\r\n },\r\n y2: {\r\n show: true,\r\n tick: {\r\n format: d3.format('.0f%')\r\n },\r\n min: -10,\r\n max : 60\r\n },\r\n \r\n },\r\n tooltip: {\r\n format: {\r\n title: function (index) {\r\n if (self.dataCompetitors[0]) {\r\n return self.dataCompetitors[0][index + 1];\r\n }\r\n },\r\n \r\n value: function (value, ratio, id) {\r\n var newValue = value + '%';\r\n return newValue;\r\n }\r\n }\r\n }\r\n \r\n });\r\n }\r\n\r\n self.isLoadingChart = false;\r\n self.isLoadingChartCompetitors = false;\r\n function getVolumeMeasurementCompetitors(compare, priceListId, brands, callback) {\r\n self.isLoadingChartCompetitors= true;\r\n\r\n var brandsIds = [];\r\n angular.forEach(brands, function (brand) {\r\n brandsIds.push(brand.id);\r\n });\r\n /*var s = this;\r\n s.callback = callback; */\r\n priceService.reports.getVolumeMeasurementCompetitors(compare, priceListId, brandsIds).then(function (items) {\r\n self.isLoadingChartCompetitors = false;\r\n if (items == null || items == '') {\r\n callback([]);\r\n }\r\n parseData(compare, items, true, callback);\r\n });\r\n }\r\n\r\n function getVolumeMeasurement(compare, priceListId, callback) {\r\n self.isLoadingChart = true;\r\n /*var s = this;\r\n s.callback = callback;*/\r\n priceService.reports.getVolumeMeasurement(compare, priceListId).then(function (items) {\r\n self.isLoadingChart = false;\r\n if (items == null || items == '') {\r\n callback([]);\r\n }\r\n parseData(compare,items, false, callback);\r\n });\r\n }\r\n\r\n \r\n function parseData(compare,items, competitorsChart, callback ) {\r\n var valueToPush = new Array();\r\n //serie para el eje x, distinct de fechas\r\n var datesArray = items.reduce(function (a, d) {\r\n if (a.indexOf(d.transactionDateString) === -1) {\r\n a.push(d.transactionDateString);\r\n }\r\n return a;\r\n }, ['x']);\r\n\r\n var productsNames = [{}];\r\n var productGroup = [];\r\n\r\n var prodOne = [];\r\n var prodTwo = [];\r\n //harcoded\r\n if (compare == 0) {\r\n prodOne.push('Regular');\r\n prodTwo.push('Premium');\r\n productsNames = [{ id: 1, name: \"Regular\" }, { id: 2, name: \"Infinia\" }];\r\n productGroup = ['Regular', 'Premium']\r\n }\r\n else {\r\n prodOne.push('Regular');\r\n prodTwo.push('Premium');\r\n productsNames = [{ id: 4, name: \"Regular\" }, { id: 5, name: \"Premium\" }];\r\n productGroup = ['Regular', 'Premium']\r\n }\r\n if (competitorsChart) {\r\n //para los labels sobre las barras\r\n self.unitsProductsCompetitors.push(['Regular']);\r\n self.unitsProductsCompetitors.push(['Premium']);\r\n //\r\n } else {\r\n self.unitsProducts.push(['Regular']);\r\n self.unitsProducts.push(['Premium']);\r\n }\r\n \r\n self.productGroup = productGroup;\r\n var pricesGAP = ['GAP'];\r\n for (i = 1; i < datesArray.length; i++) {\r\n\r\n var total = 0;\r\n var units = [];\r\n var auxPrices = [];\r\n var minorPrice = undefined;\r\n productsNames.forEach(function (prod) {\r\n\r\n var productDate = items.find(cd => {\r\n return cd.transactionDateString == datesArray[i] && cd.itemId == prod.id;\r\n })\r\n if (productDate) {\r\n //guardo las unidades vendidas por dia por prod para luego sacar el %\r\n units.push(productDate.units);\r\n total += productDate.units;\r\n //precios\r\n if (minorPrice && minorPrice > productDate.price) {\r\n minorPrice = productDate.price;\r\n }\r\n if (!minorPrice)\r\n minorPrice = productDate.price;\r\n\r\n auxPrices.push(productDate.price);\r\n }\r\n });\r\n var gap = Math.abs(auxPrices[0] - auxPrices[1]) * 100 / minorPrice;\r\n\r\n pricesGAP.push(gap.toFixed(2));\r\n prodOne.push((units[0] * 100 / total).toFixed(2));\r\n prodTwo.push((units[1] * 100 / total).toFixed(2));\r\n //para labels, guardo las unidades\r\n if (competitorsChart) {\r\n self.unitsProductsCompetitors[0].push(Math.floor(units[0] / 1000))\r\n self.unitsProductsCompetitors[1].push(Math.floor(units[1] / 1000));\r\n } else {\r\n self.unitsProducts[0].push(Math.floor(units[0] / 1000))\r\n self.unitsProducts[1].push(Math.floor(units[1] / 1000));\r\n }\r\n }\r\n valueToPush[0] = datesArray;\r\n valueToPush[1] = prodOne;\r\n valueToPush[2] = prodTwo;\r\n valueToPush[3] = pricesGAP;\r\n callback(valueToPush);\r\n \r\n }\r\n function init() {\r\n\r\n $translate([\"GeneralInformation\", \"DateFrom\", \"DateFromTooltip\", \"StoreCode\", \"Store\", \"ChangesSent\", \"ChangesSentTooltip\"\r\n , \"NAtooltip\", \"Atooltip\", \"Limit\", \"LimitTooltip\", \"Detour\", \"PriceTypes\", \"Regular\", \"Competitive\", \"Promotion\", \"Discount\"\r\n , \"Action\", \"Decrease\", \"Increase\", \"Pr_volumeMeasurement_validationDate\"])\r\n .then(function (all) {\r\n translations = all;\r\n self.setDates();\r\n self.loadItems(0);\r\n\r\n });\r\n\r\n }\r\n init();\r\n });\r\n","\r\nangular.module(\"prisma\")\r\n .controller(\"PriceWeeklyReportCtrl\", function ($state, $rootScope, $timeout, priceService) {\r\n var self = this;\r\n\r\n self.weeklyData = [];\r\n self.selectedPriceZone = null;\r\n self.chartConfigurations = [{\r\n chartName: 'chart11',\r\n title: 'Precio Sug PEMEX',\r\n properties: [\r\n { display: \"Precio\", code: \"price\" },\r\n { display: \"Margen\", code: \"margin\" },\r\n ],\r\n defaultProperty: \"price\",\r\n styles: {\r\n height: '220px',\r\n //width:'200px'\r\n },\r\n multipleValues: true,\r\n secondaryAxisProperty: \"margin\",\r\n },\r\n {\r\n chartName: 'chart12',\r\n title: 'Precio prom mdo',\r\n properties: [\r\n { display: \"Precio\", code: \"price\" },\r\n { display: \"Margen\", code: \"margin\" },\r\n ],\r\n defaultProperty: \"price\",\r\n styles: {\r\n height: '220px',\r\n //width:'200px'\r\n },\r\n multipleValues: true,\r\n secondaryAxisProperty: \"margin\",\r\n },\r\n {\r\n chartName: 'chart21',\r\n title: 'Precio OXXO Gas',\r\n properties: [\r\n { display: \"Precio\", code: \"price\" },\r\n { display: \"Margen\", code: \"margin\" },\r\n ],\r\n defaultProperty: \"price\",\r\n styles: {\r\n height: '220px',\r\n //width:'200px'\r\n },\r\n multipleValues: true,\r\n secondaryAxisProperty: \"margin\",\r\n },\r\n {\r\n chartName: 'chart22',\r\n title: 'Precio PETRO 7',\r\n properties: [\r\n { display: \"Precio\", code: \"price\" },\r\n { display: \"Margen\", code: \"margin\" },\r\n ],\r\n defaultProperty: \"price\",\r\n styles: {\r\n height: '220px',\r\n //width:'200px'\r\n },\r\n multipleValues: true,\r\n secondaryAxisProperty: \"margin\",\r\n },\r\n {\r\n chartName: 'chart23',\r\n title: 'Precio resto mdo',\r\n properties: [\r\n { display: \"Precio\", code: \"price\" },\r\n { display: \"Margen\", code: \"margin\" },\r\n ],\r\n defaultProperty: \"price\",\r\n styles: {\r\n height: '220px',\r\n //width:'200px'\r\n },\r\n multipleValues: true,\r\n secondaryAxisProperty: \"margin\",\r\n },\r\n {\r\n chartName: 'chart31',\r\n title: 'Evolucion margen',\r\n properties: [\r\n { display: \"Magna\", code: \"Magna\" },\r\n { display: \"Premium\", code: \"Premium\" },\r\n { display: \"Diesel\", code: \"Diesel\" },\r\n ],\r\n defaultProperty: \"margin\",\r\n styles: {\r\n height: '220px',\r\n //width:'200px'\r\n },\r\n chartType: 'pie'\r\n }]\r\n\r\n self.getChartConfiguration = function (name) {\r\n for (var i = 0; i < self.chartConfigurations.length; i++) {\r\n if (self.chartConfigurations[i].chartName == name)\r\n return self.chartConfigurations[i];\r\n }\r\n return null;\r\n }\r\n //function updateChart() {\r\n // self.chart3 = c3.generate(getChartConfig('#chart12', self.salesChartData));\r\n //}\r\n\r\n\r\n self.setFilterPriceZone = function (priceZone) {\r\n if (self.selectedPriceZone == priceZone) return;\r\n self.selectedPriceZone = priceZone;\r\n\r\n self.runFilters();\r\n }\r\n\r\n self.runFilters = function () {\r\n priceService.reports.getWeeklyReport(self.selectedPriceZone.id).then(function (weeklyData) {\r\n self.weeklyData = weeklyData;\r\n console.log('weeklydata', weeklyData);\r\n\r\n //Esto es por el jquery que usa el chart\r\n $timeout(function () {\r\n for (var i = 0; i < weeklyData.length; i++) {\r\n //console.log('weeklyData[i]', weeklyData[i]);\r\n if (weeklyData[i].series.length == 0) continue;\r\n //console.log('ssasas');\r\n\r\n var chartConfiguration = self.getChartConfiguration(weeklyData[i].code);\r\n if (chartConfiguration != null) {\r\n if (chartConfiguration.chartType == 'pie') {\r\n chartConfiguration.updateChart(weeklyData[i].series, chartConfiguration.properties[0].code);\r\n } else {\r\n chartConfiguration.updateChart(weeklyData[i].series, 'price');\r\n }\r\n }\r\n }\r\n });\r\n\r\n\r\n });\r\n }\r\n\r\n self.mustShowChart = function (chartName) {\r\n for (var i = 0; i < self.weeklyData.length; i++) {\r\n if (self.weeklyData[i].code == chartName) {\r\n //console.log(self.weeklyData[i]);\r\n return self.weeklyData[i].series != undefined && self.weeklyData[i].series.length > 0;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n\r\n self.loadData = function () {\r\n\r\n priceService.pricelists.getPriceLists().then(function (priceLists) {\r\n console.log('pricelists', priceLists)\r\n self.priceLists = priceLists;\r\n\r\n self.setFilterPriceZone(priceLists[0]);\r\n\r\n\r\n });\r\n }\r\n\r\n function init() {\r\n\r\n //load data\r\n self.loadData();\r\n }\r\n\r\n init();\r\n\r\n });\r\n\r\n","\r\nangular.module(\"prisma\")\r\n .controller(\"PriceMapReportCtrl\", function ($state, $rootScope, priceService) {\r\n var self = this;\r\n\r\n self.price = {\r\n priceId: 0\r\n };\r\n\r\n function init() {\r\n }\r\n\r\n init();\r\n\r\n });\r\n\r\n","\r\nangular.module(\"prisma\")\r\n .controller(\"PriceEvolutionReportCtrl\", function ($state, $rootScope, adminService, priceService, $translate) {\r\n var self = this;\r\n\r\n self.dateTo = new Date();\r\n\r\n self.dateFrom = new Date(); //.toLocaleDateString(\"es-ES\");\r\n\r\n var month = new Date().getMonth();\r\n month = (month - 1 == 0 ? 12 : month - 1);\r\n var dateFrom = new Date();\r\n dateFrom .setMonth(month);\r\n self.dateFrom = dateFrom ;//.toLocaleDateString(\"es-ES\");\r\n\r\n self.items = [{}];\r\n\r\n self.openCalendar = function (e) {\r\n self.isOpen = !self.isOpen;\r\n };\r\n self.loadData = function () {\r\n\r\n if (self.dateFrom && self.dateTo) {\r\n if (self.dateTo < self.dateFrom )\r\n swal(translations.Pr_volumeMeasurement_validationDate, '', \"error\");\r\n }\r\n\r\n if (self.selectedItem && self.selectedItem.id) {\r\n if (self.selectedPriceList && self.selectedPriceList.id) {\r\n getPricesEvolution(self.selectedItem.id, self.selectedPriceList.id, self.dateFrom, self.dateTo);\r\n }\r\n else\r\n getPricesEvolution(self.selectedItem.id, null, self.dateFrom, self.dateTo);\r\n\r\n }\r\n }\r\n self.changeItemSelected = function () {\r\n self.isLoadingChart = false;\r\n if (self.selectedItem && self.selectedItem.id) {\r\n\r\n if (self.selectedPriceList && self.selectedPriceList.id)\r\n getPricesEvolution(self.selectedItem.id, self.selectedPriceList.id, self.dateFrom, self.dateTo);\r\n else\r\n getPricesEvolution(self.selectedItem.id,null,self.dateFrom, self.dateTo);\r\n }\r\n\r\n // console.log(self.selectedItem);\r\n }\r\n\r\n self.changePriceListSelected= function () {\r\n self.isLoadingChart = false;\r\n if (self.selectedPriceList && self.selectedPriceList.id)\r\n if (self.selectedItem) {\r\n getPricesEvolution(self.selectedItem.id, self.selectedPriceList.id, self.dateFrom, self.dateTo);\r\n } else {\r\n\r\n }\r\n // console.log(self.selectedPriceList);\r\n }\r\n self.loadItems = function(categoryId) {\r\n adminService.items.getItemsByCategory(categoryId).then(function (items) {\r\n self.items = items;\r\n });\r\n adminService.priceLists.getPriceLists().then(function (priceLists) {\r\n self.priceLists = priceLists;\r\n });\r\n }\r\n self.updateChart = function () {\r\n c3.generate({\r\n bindto: \"#priceEvolutionChart\",\r\n\r\n padding: {\r\n top: 30,\r\n right: 50,\r\n bottom: 60,\r\n left: 50,\r\n },\r\n\r\n data: {\r\n x: 'x',\r\n xFormat: '%d-%m', // parse format\r\n \"columns\": self.data,\r\n empty: { label: { text: \"Sin datos\" } },\r\n colors: {\r\n 'YPF': '#0070b8',\r\n 'AXION': '#bb166f',\r\n 'SHELL': '#ed1b23',\r\n 'OIL': '#ffd800',\r\n 'BLANCA': '#cccccc',\r\n 'REFINOR': '#66bb69',\r\n 'PETROBRAS': '#008b5a'\r\n }\r\n },\r\n axis: {\r\n x: {\r\n type: 'category',\r\n tick: {\r\n rotate: 0,\r\n format: '%d-%m'\r\n }\r\n },\r\n y: {\r\n label: translations.PriceInS,\r\n tick: {\r\n format: d3.format(\".2f\")\r\n }\r\n }\r\n },\r\n tooltip: {\r\n format: {\r\n value: function (value, ratio, id) {\r\n var newValue = value;\r\n return newValue;\r\n }\r\n }\r\n },\r\n line: {\r\n connectNull: true\r\n }\r\n });\r\n }\r\n\r\n self.isLoadingChart = false;\r\n\r\n function getPricesEvolution(itemId, priceListId, dateFrom, dateTo) {\r\n self.isLoadingChart = true;\r\n \r\n priceService.evolutionReport.getData(itemId, priceListId, dateFrom.toISOString(), dateTo.toISOString()).then(function (items) {\r\n self.isLoadingChart = false;\r\n if (items == null || items == '') {\r\n self.data = items;\r\n self.updateChart();\r\n return;\r\n }\r\n\r\n var valueToPush = new Array();\r\n var uniqueArray = items.reduce(function (a, d) {\r\n if (a.indexOf(d.observedDateString) === -1) {\r\n a.push(\"\" + d.observedDateString + \"\");\r\n }\r\n return a;\r\n }, ['x']);\r\n\r\n var competitorsNamesObj = [];\r\n var competitorsNames = items.reduce(function (a, d) {\r\n\r\n var p = (competitorsNamesObj.find ? competitorsNamesObj.find(cd => {\r\n return cd.observedDateString == d.observedDateString && cd.tradeName == d.tradeName;\r\n }) : undefined);\r\n if (!p) {\r\n competitorsNamesObj.push({ 'observedDateString': d.observedDateString, \"tradeName\": d.tradeName,'price': d.price });\r\n }\r\n if (a.indexOf(d.tradeName) === -1) {\r\n a.push( d.tradeName);\r\n }\r\n\r\n return a;\r\n }, []);\r\n\r\n var i = 1;\r\n var keepPrice = { competitorName: '', price: 0 };\r\n // var firstPrice = { competitorName: '', price: 0, count: 0, flag: false };\r\n var firstPrices = [];\r\n\r\n competitorsNames.forEach(function (c) {\r\n competitors = [];\r\n competitors.push(c);\r\n\r\n for (k = 1; k < uniqueArray.length; k++) {\r\n var p2 = competitorsNamesObj.find(cd => {\r\n return cd.observedDateString == uniqueArray[k] && cd.tradeName == c;\r\n })\r\n if (p2) {\r\n competitors.push(p2.price);\r\n keepPrice = { competitorName: c, price: p2.price };\r\n\r\n var index = firstPrices.findIndex(fp => fp.competitorName == c && !fp.flag);\r\n\r\n if (index != -1) {\r\n var count = firstPrices[index].count;\r\n firstPrices.splice(index, 1, { competitorName: c, price: p2.price,count:count, flag: true });\r\n }\r\n \r\n }\r\n else { //mantengo precio anterior \r\n if (keepPrice.competitorName == c)\r\n competitors.push(keepPrice.price);\r\n else {\r\n var foundNullPrice = false;\r\n for (j = 0; j < firstPrices.length; j++) {\r\n if (firstPrices[j].competitorName == c) {\r\n //sirve para hacer el fill despues\r\n firstPrices[j].count++;\r\n foundNullPrice = true;\r\n }\r\n }\r\n if (!foundNullPrice) {\r\n firstPrices.push({ competitorName: c, count: 1 });\r\n }\r\n competitors.push(null);\r\n }\r\n \r\n }\r\n }\r\n //fill nulls\r\n var fillBlankValues = firstPrices.find(cp => { return cp.competitorName == c });\r\n if(fillBlankValues)\r\n competitors.fill(fillBlankValues.price, 1, fillBlankValues.count+1);\r\n\r\n valueToPush[i] = competitors;\r\n i++;\r\n });\r\n\r\n valueToPush[0] = uniqueArray;\r\n self.data = valueToPush;\r\n\r\n console.log(firstPrices);\r\n console.log(self.data);\r\n\r\n self.updateChart();\r\n \r\n });\r\n\r\n\r\n priceService.evolutionReport.getUnitsData(itemId, priceListId, competitorId).then(function (items) {\r\n //TODO: Cargar grafico y traer competitorId desde PriceMap\r\n var a = 1;\r\n });\r\n\r\n }\r\n\r\n function init() {\r\n\r\n $translate([\"GeneralInformation\", \"DateFrom\", \"DateFromTooltip\", \"StoreCode\", \"Store\", \"ChangesSent\", \"ChangesSentTooltip\"\r\n , \"NAtooltip\", \"Atooltip\", \"Limit\", \"LimitTooltip\", \"Detour\", \"PriceTypes\", \"Regular\", \"Competitive\", \"Promotion\", \"Discount\"\r\n , \"Action\", \"Decrease\", \"Increase\", \"Pr_volumeMeasurement_validationDate\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n self.loadItems(0);\r\n\r\n });\r\n\r\n }\r\n init();\r\n });\r\n","\r\nangular.module(\"prisma\")\r\n .controller(\"PriceCompetitiveReportCtrl\", function ($state, $rootScope, $timeout, $translate, priceService, adminService) {\r\n var self = this;\r\n\r\n var columnDefs = null;\r\n var numberColWidth = 100;\r\n self.dataSet = [];\r\n self.isLoading = false;\r\n\r\n self.filters = {\r\n selectedPriceListId: 0,\r\n selectedMarketId: 0,\r\n selectedItem: null,\r\n selectedCalculationType: 1,\r\n validFrom: null,\r\n validTo: null\r\n };\r\n self.prices = null;\r\n\r\n self.calculationTypes = [];\r\n self.filters.validTo = new Date();\r\n self.filters.validFrom = new Date();\r\n self.filters.validFrom.setDate(self.filters.validFrom.getDate() - 15);\r\n\r\n\r\n self.applyFilters = function () {\r\n if (self.filters.selectedItem.id == 0) {\r\n swal('Complete todos los campos', '', 'error');\r\n return;\r\n }\r\n\r\n //if (convertDate(self.filters.validFrom).addDays(32) > convertDate(self.filters.validTo)) {\r\n // swal('No puede elegir mas de un mes en el rango de fechas.', '', 'error');\r\n // return;\r\n //}\r\n\r\n self.isLoading = true;\r\n\r\n priceService.reports.getCompetitiveReport(self.filters.selectedMarketId, self.filters.selectedPriceListId, self.filters.selectedItem.id, self.filters.selectedCalculationType, convertDate(self.filters.validFrom), convertDate(self.filters.validTo))\r\n .then(function (data) {\r\n self.prices = data;\r\n self.isLoading = false;\r\n self.gridOptions.api.setRowData(self.prices);\r\n });\r\n }\r\n\r\n\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: \"Plaza\",\r\n field: \"plaza\",\r\n width: numberColWidth + 60,\r\n sort: 'asc',\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n {\r\n headerName: \"OxxoGas\",\r\n field: \"oxxoGas\",\r\n width: numberColWidth + 10,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n },\r\n {\r\n headerName: \"Petro7\",\r\n field: \"petro7\",\r\n width: numberColWidth + 10,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n },\r\n {\r\n headerName: \"BP\",\r\n field: \"bp\",\r\n width: numberColWidth + 10,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n },\r\n {\r\n headerName: \"Mobil\",\r\n field: \"mobil\",\r\n width: numberColWidth + 10,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n },\r\n {\r\n headerName: \"Rendi\",\r\n field: \"rendi\",\r\n width: numberColWidth + 10,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n },\r\n {\r\n headerName: \"Shell\",\r\n field: \"shell\",\r\n width: numberColWidth + 10,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n },\r\n {\r\n headerName: \"Chevron\",\r\n field: \"chevron\",\r\n width: numberColWidth + 10,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n },\r\n {\r\n headerName: \"Simsa\",\r\n field: \"simsa\",\r\n width: numberColWidth + 10,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n },\r\n {\r\n headerName: \"Repsol\",\r\n field: \"repsol\",\r\n width: numberColWidth + 10,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n },\r\n {\r\n headerName: \"Grupo_GR\",\r\n field: \"grupo_GR\",\r\n width: numberColWidth + 10,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n },\r\n {\r\n headerName: \"Hidrosina\",\r\n field: \"hidrosina\",\r\n width: numberColWidth + 10,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n },\r\n {\r\n headerName: \"Lodemo\",\r\n field: \"lodemo\",\r\n width: numberColWidth + 10,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n },\r\n {\r\n headerName: \"Rapiditos\",\r\n field: \"rapiditos\",\r\n width: numberColWidth + 10,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n },\r\n {\r\n headerName: \"Resto_Mercado\",\r\n field: \"resto_Mercado\",\r\n width: numberColWidth + 20,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n },\r\n ]\r\n }\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n groupHeaders: false,\r\n suppressCellSelection: true,\r\n rowHeight: 35,\r\n groupHideGroupColumns: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n angularCompileRows: true\r\n }\r\n\r\n self.exportToExcel = function () {\r\n var params = {\r\n skipHeader: false,\r\n skipFooters: false,\r\n skipGroups: false,\r\n allColumns: false,\r\n onlySelected: false,\r\n suppressQuotes: false,\r\n fileName: self.filters.selectedItem.name + '.xls',\r\n columnSeparator: ','\r\n };\r\n\r\n self.gridOptions.api.exportDataAsCsv(params);\r\n }\r\n\r\n function setGridOptions() {\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n groupHeaders: false,\r\n suppressCellSelection: true,\r\n rowHeight: 35,\r\n groupHideGroupColumns: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n }\r\n }\r\n }\r\n\r\n\r\n self.loadData = function () {\r\n\r\n adminService.items.getItemsByCategory(0).then(function (items) {\r\n self.items = items;\r\n });\r\n adminService.priceLists.getPriceLists().then(function (priceLists) {\r\n //priceLists.push({ id: 0, name: \"TODAS\", brand: \"OxxoGas\", brandId: 1, code: \"00\", isBase: false, isExcluded: false, isNational: false, listIndex: 0, market: null, marketId: null, region: null, regionId: null });\r\n self.priceLists = _.orderBy(priceLists, ['name'], ['asc']);\r\n });\r\n\r\n adminService.priceLists.getMarkets().then(function (markets) {\r\n //markets.push({ genericId: 0, genericValue: \"TODAS\" });\r\n self.markets = _.orderBy(markets, ['genericValue'], ['asc']);\r\n });\r\n\r\n }\r\n\r\n\r\n function convertDate(inputFormat) {\r\n function pad(s) { return (s < 10) ? '0' + s : s; }\r\n var d = new Date(inputFormat);\r\n return [d.getFullYear(), pad(d.getMonth() + 1), pad(d.getDate())].join('-');\r\n }\r\n\r\n function init() {\r\n\r\n setGridOptions();\r\n\r\n //load data\r\n self.loadData();\r\n\r\n $translate([\"Minimum\", \"Average\", \"Maximum\", \"Mode\"])\r\n .then(function (all) {\r\n translations = all;\r\n self.calculationTypes = [{ id: 0, name: translations.Minimum }, { id: 1, name: translations.Average }, { id: 2, name: translations.Maximum }, { id: 3, name: translations.Mode }];\r\n });\r\n }\r\n\r\n init();\r\n\r\n });\r\n\r\n","\r\nangular.module(\"prisma\")\r\n .controller(\"PriceCompetitivePositionReportCtrl\", function ($state, $rootScope, $timeout, priceService, adminService) {\r\n var self = this;\r\n const pointsGraphValue = 10;//el eje 'y' de los puntos del grafico va desde 0% a 70%, siendo cada $1 = 10%. El porcentage correspondiente a $0 es 35%\r\n self.weeklyData = [];\r\n self.selectedPriceLists = [];\r\n\r\n self.colors = ['red', 'green', 'orange', 'blue', 'black'];\r\n\r\n self.filters = {\r\n selectedPriceLists: [],\r\n selectedBrands: [],\r\n selectedItemId: null\r\n };\r\n\r\n self.showLogos = true;\r\n self.selectedPriceListChart = null;\r\n\r\n self.validTo = new Date();\r\n self.validFrom = new Date();\r\n self.validFrom.setDate(self.validFrom.getDate() - 7);\r\n\r\n self.chartData = [];\r\n\r\n //calcula la posicion en el eje 'y' del grafico en porcentaje\r\n self.getPercentageDeltaForCompetitor = function (competitorPriceLists, priceListId) {\r\n let priceList = competitorPriceLists.find(function (x) { return x.priceListId == priceListId; });\r\n if (priceList)\r\n return convertDeltaToPercentageInChart(priceList.priceDelta) + '%';\r\n\r\n }\r\n\r\n self.priceListIsInData = function (competitorPriceLists, priceListId) {\r\n return competitorPriceLists.map(function (x) { return x.priceListId; }).includes(priceListId);\r\n }\r\n\r\n self.getData = function (priceList) {\r\n return self.chartData.filter(function (item) {\r\n return self.priceListIsInData(item.competitivePriceListPrices, priceList.id);\r\n });\r\n }\r\n\r\n self.toggleInfo = function (e, priceList, competitor) {\r\n let m = competitor.competitivePriceListPrices.find(function (x) { return x.priceListId == priceList.id; });\r\n if (m) {\r\n m.showInfo = !m.showInfo;\r\n if (m.showInfo) {\r\n self.activePriceList = priceList;\r\n self.activeCompetitor = competitor;\r\n self.activeCompetitorPriceList = m;\r\n }\r\n else {\r\n self.activePriceList = null;\r\n self.activeCompetitor = null;\r\n self.activeCompetitorPriceList = null;\r\n\r\n }\r\n }\r\n else {\r\n self.activePriceList = null;\r\n self.activeCompetitor = null;\r\n self.activeCompetitorPriceList = null;\r\n\r\n }\r\n }\r\n\r\n self.isShowInfo = function () {\r\n return angular.isObject(self.activeCompetitorPriceList) && self.activeCompetitorPriceList.showInfo;\r\n }\r\n\r\n self.getCompetitorPrice = function (type) {\r\n var rv = '';\r\n switch (type) {\r\n case 'price': rv = '$' + self.activeCompetitorPriceList.priceAvg.toFixed(2);\r\n break;\r\n case 'delta': rv = '$' + self.activeCompetitorPriceList.priceDelta.toFixed(2);\r\n break;\r\n case 'deltaP': var perc = self.activeCompetitorPriceList.priceDeltaPercentage * 100;\r\n rv = perc.toFixed(2) + '%';\r\n break;\r\n }\r\n return rv;\r\n\r\n }\r\n\r\n self.getShowInfoX = function () {\r\n var rv = self.getXaxisForCompetitor(self.activePriceList.x, self.activeCompetitor.x);\r\n return rv;\r\n }\r\n self.getShowInfoY = function () {\r\n var rv = self.getPercentageDeltaForCompetitor(self.activeCompetitor.competitivePriceListPrices, self.activePriceList.id)\r\n return rv;\r\n }\r\n\r\n self.getShowInfoTextX = function () {\r\n return self.showLogos ? 25 : 0; \r\n }\r\n\r\n function convertDeltaToPercentageInChart(delta) {\r\n\r\n let chartPercentageDelta = delta * pointsGraphValue;//diferencia con el eje 'y' en $0 (este corresponde al precio de la compania)\r\n let chartPercentage = 35 - chartPercentageDelta;//resto y no sumo para cambiar el signo...en el grafico, la ubicacion de los puntos en por porcentaje es 0% top y 70% bottom\r\n return chartPercentage;\r\n }\r\n\r\n self.getXaxisForCompetitor = function (priceListXaxis, competitorXaxis) {\r\n return competitorXaxis + (priceListXaxis - 60);//60 es la mitad de lo que ocupan los 5 competidores en el grafico, asi queda centrado\r\n }\r\n\r\n self.applyFilters = function () {\r\n if (self.filters.selectedPriceLists.length === 0 || self.filters.selectedBrands.length === 0 || !self.filters.selectedItemId) {\r\n swal('Complete todos los campos', '', 'error');\r\n return;\r\n }\r\n self.isLoading = true; \r\n\r\n var selectedPriceListsIds = self.filters.selectedPriceLists.map(function (x) { return x.id; });\r\n var selectedBrandsIds = self.filters.selectedBrands.map(function (x) { return x.id; });\r\n \r\n var filters = {\r\n selectedPriceListsIds: selectedPriceListsIds,\r\n selectedBrandsIds: selectedBrandsIds,\r\n selectedItemId: self.filters.selectedItemId\r\n };\r\n\r\n priceService.reports.getCompetitivePositionReport(filters).then(function (data) {\r\n self.selectedPriceLists = self.filters.selectedPriceLists;\r\n self.chartData = data;\r\n \r\n\r\n //seteo posiciones 'x', showInfo y colores\r\n let xAxis = 0;\r\n angular.forEach(self.chartData, function (x, index) {\r\n x.color = self.colors[index];\r\n\r\n angular.forEach(x.competitivePriceListPrices, function (y) {\r\n y.showInfo = false;\r\n });\r\n\r\n x.x = xAxis;\r\n xAxis += 30;\r\n });\r\n self.isLoading = false;\r\n console.log(data);\r\n\r\n\r\n });\r\n }\r\n\r\n self.viewPriceListInfo = function (priceList) {\r\n self.isLoading = true;\r\n\r\n var selectedBrandsIds = self.filters.selectedBrands.map(function (x) { return x.id; });\r\n var selectedBrandsNames = self.filters.selectedBrands.map(function (x) { return x.name; });\r\n var filters = {\r\n selectedPriceListsIds: [priceList.id],\r\n selectedBrandsIds: selectedBrandsIds,\r\n selectedItemId: self.filters.selectedItemId\r\n };\r\n priceService.reports.getCompetitivePositionByPriceList(filters)\r\n .then(function (data) {\r\n\r\n self.selectedPriceListChart = priceList;\r\n\r\n var distinctPrices = [];\r\n _.forOwn(_.groupBy(data, \"price\"), function (value, key) {\r\n distinctPrices.push(key);\r\n });\r\n\r\n var distincBrands = [];\r\n _.forOwn(_.groupBy(data, \"brandName\"), function (value, key) {\r\n distincBrands.push(key);\r\n });\r\n\r\n var axes = ['x'];\r\n var brandsArrays = [];\r\n\r\n selectedBrandsNames.forEach(function (name) {\r\n brandsArrays.push([name]);\r\n });\r\n\r\n distinctPrices.forEach(function (price) {\r\n axes.push(price);\r\n self.filters.selectedBrands.forEach(function (brand) {\r\n var brandPrice = data.find(function (x) {\r\n return x.brandId === brand.id && x.price == price;\r\n });\r\n var brandArray = brandsArrays.find(function (brandArray) {\r\n return brandArray[0] == brand.name;\r\n });\r\n\r\n if (brandPrice) brandArray.push(brandPrice.storesCount); \r\n else brandArray.push(0); \r\n\r\n });\r\n });\r\n\r\n brandsArrays.splice(0, 0, axes);\r\n\r\n //var brandsArrays = [\r\n // ['x', 19.00, 19.10, 19.20, 19.30, 19.40, 19.50, 19.60, 19.70, 19.80, 19.90, 20.00, 20.00, 20.10, 20.20, 20.30, 20.40, 20.50, 20.60, 20.70, 20.80, 20.90, 21.00, 21.10, 21.20, 21.30, 21.40, 21.50, 21.60, 21.70, 21.80, 21.90, 22.00, 22.10, 22.20, 22.30, 22.40, 22.50, 22.60, 22.70, 22.80, 22.90, 23.00],\r\n // ['OxxoGas', 0, 0, 0, 0, 0, 29, 0, 0, 0, 6, 0, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\r\n // ['PEMEX', 1, 2, 2, 2, 3, 3, 1, 6, 6, 0, 0, 0, 4, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1],\r\n // ['SHELL', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 6, 0, 0, 0, 0, 6, 0, 12, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 1]\r\n //];\r\n\r\n var chart = c3.generate({\r\n bindto: '#chart',\r\n data: {\r\n x: 'x',\r\n columns: brandsArrays,\r\n colors: {\r\n 'OxxoGas': '#EA2129',\r\n 'Shell': '#FFD504',\r\n 'ExxonMobil': '#247EC0',\r\n 'British Pretroleum': '#96CB01',\r\n 'Chevron': '#591DB1',\r\n },\r\n bar: {\r\n width: {\r\n ratio: 0.01\r\n }\r\n },\r\n type: 'bar',\r\n groups: [\r\n distincBrands//cada elemento es un brand\r\n ]\r\n },\r\n grid: {\r\n y: {\r\n lines: [{ value: 0 }]\r\n }\r\n }\r\n });\r\n\r\n self.isLoading = false;\r\n });\r\n\r\n }\r\n\r\n self.onChangePriceListsFilter = function () {\r\n if (self.filters.selectedPriceLists.length > 8) {\r\n swal('Limite Excedido', 'Puede seleccionar un maximo de 8 zonas', 'error');\r\n $timeout(function () {\r\n self.filters.selectedPriceLists.pop();\r\n }, 100);\r\n\r\n }\r\n //seteo la posicion x de cada priceList\r\n var xOffset = 200;\r\n angular.forEach(self.filters.selectedPriceLists, function (x) {\r\n x.x = xOffset;\r\n xOffset += 300;\r\n });\r\n\r\n }\r\n\r\n self.onChangeBrandsFilter = function () {\r\n if (self.filters.selectedBrands.length > 8) {\r\n swal('Limite Excedido', 'Puede seleccionar un maximo de 8 competidores', 'error');\r\n $timeout(function () {\r\n self.filters.selectedBrands.pop();\r\n }, 100);\r\n }\r\n }\r\n\r\n self.loadData = function () {\r\n\r\n adminService.items.getItemsByCategory(0).then(function (items) {\r\n self.items = items;\r\n });\r\n adminService.priceLists.getPriceLists().then(function (priceLists) {\r\n self.priceLists = _.orderBy(priceLists, ['name'], ['asc']);\r\n });\r\n\r\n //self.competitors son los brands\r\n adminService.brands.getBrandsCombo(false).then(function (competitors) {\r\n self.competitors = _.orderBy(competitors, ['name'], ['asc']); \r\n\r\n });\r\n }\r\n\r\n function init() {\r\n\r\n //load data\r\n self.loadData();\r\n }\r\n\r\n init();\r\n\r\n });\r\n\r\n","\r\nangular.module(\"prisma\")\r\n .controller(\"PriceChangesReportCtrl\", function ($state, $rootScope, priceService, $translate) {\r\n var self = this;\r\n\r\n var numberColWidth = 100;\r\n\r\n var columnDefs = null;\r\n\r\n var toDate = new Date();\r\n toDate.setTime(toDate.getTime() + 86400000); //A partir de ma�ana\r\n self.toDate = toDate;\r\n\r\n var fromDate = new Date();\r\n fromDate.setTime(fromDate.getTime() - 3 * 86400000); //Ultimos 3 dias\r\n self.fromDate = fromDate;\r\n \r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: translations.GeneralInformation,\r\n children: [\r\n {\r\n headerName: translations.DateFrom,\r\n field: \"newValidFrom\",\r\n headerTooltip: translations.DateFromTooltip,\r\n width: numberColWidth + 10,\r\n filter: 'date',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.dateRenderer\r\n },\r\n {\r\n headerName: translations.StoreCode,\r\n field: \"storeCode\",\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: translations.Store,\r\n field: \"storeName\",\r\n width: numberColWidth + 100,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: translations.ChangesSent,\r\n field: \"totalChanges\",\r\n headerTooltip: translations.ChangesSentTooltip,\r\n width: numberColWidth + 40,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"NA\",\r\n field: \"totalNotApplicableChanges\",\r\n headerTooltip: translations.NAtooltip,\r\n width: 60,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"A\",\r\n field: \"totalApplicableChanges\",\r\n headerTooltip: translations.Atooltip,\r\n width: 60,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: function (params) {\r\n var value = params.value;\r\n\r\n return \"\" + value + \"\";\r\n }\r\n },\r\n {\r\n headerName: translations.Limit,\r\n field: \"storeLimit\",\r\n headerTooltip: translations.LimitTooltip,\r\n width: 60,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: function (params) {\r\n var value = params.value;\r\n if (value < 0)\r\n return ' ' + value + ' ' ;\r\n else\r\n return value;\r\n }\r\n },\r\n {\r\n headerName: translations.Detour,\r\n field: \"gapWithLimitPercentage\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: function (params) {\r\n var value = params.data.gapWithLimit;\r\n if(value < 0 )\r\n return \"text-danger\";\r\n else if(value <= 50)\r\n return \"text-warning\";\r\n else\r\n return \"colorGreen\";\r\n },\r\n cellRenderer: $rootScope.percentageRendererNoDecimals\r\n }\r\n ]\r\n },\r\n {\r\n headerName: translations.PriceTypes,\r\n children: [\r\n {\r\n headerName: translations.Regular,\r\n field: \"totalApplicableChangesForRegular\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: translations.Competitive,\r\n field: \"totalApplicableChangesForCompetition\",\r\n width: numberColWidth + 10,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: translations.Promotion,\r\n field: \"totalApplicableChangesForPromotion\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: translations.Discount,\r\n field: \"totalApplicableChangesForMarkdown\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n }]\r\n },\r\n {\r\n headerName: translations.Action,\r\n children: [\r\n {\r\n headerName: translations.Decrease,\r\n field: \"decreases\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: translations.Increase,\r\n field: \"increases\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n }]\r\n }\r\n];\r\n}\r\n\r\nself.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n groupHeaders: false,\r\n suppressCellSelection: true,\r\n rowHeight: 35,\r\n groupHideGroupColumns: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n angularCompileRows: true\r\n}\r\n\r\nself.exportToExcel = function () {\r\n var params = {\r\n skipHeader: false,\r\n skipFooters: false,\r\n skipGroups: false,\r\n allColumns: true,\r\n onlySelected: false,\r\n suppressQuotes: false,\r\n fileName: 'PriceChangesReport.xls',\r\n columnSeparator: ','\r\n };\r\n\r\n self.gridOptions.api.exportDataAsCsv(params);\r\n}\r\n\r\nfunction setGridOptions() {\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n groupHeaders: false,\r\n suppressCellSelection: true,\r\n rowHeight: 35,\r\n groupHideGroupColumns: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n }\r\n }\r\n}\r\n\r\nself.loadData = function () {\r\n\r\n var fromDate = convertDate(self.fromDate);\r\n var toDate = convertDate(self.toDate);\r\n\r\n priceService.priceOutput.getPriceOutputLimits(true, fromDate, toDate).then(function (rows) {\r\n self.gridOptions.api.setRowData(rows);\r\n });\r\n}\r\n\r\nfunction convertDate(inputFormat) {\r\n function pad(s) { return (s < 10) ? '0' + s : s; }\r\n var d = new Date(inputFormat);\r\n return [d.getFullYear(), pad(d.getMonth() + 1), pad(d.getDate())].join('-');\r\n}\r\n\r\nfunction init() {\r\n //init columnDefs and gridOptions\r\n setGridOptions();\r\n\r\n $translate([\"GeneralInformation\", \"DateFrom\", \"DateFromTooltip\", \"StoreCode\", \"Store\", \"ChangesSent\", \"ChangesSentTooltip\"\r\n , \"NAtooltip\", \"Atooltip\", \"Limit\", \"LimitTooltip\", \"Detour\", \"PriceTypes\", \"Regular\", \"Competitive\", \"Promotion\", \"Discount\"\r\n , \"Action\", \"Decrease\", \"Increase\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions.api.setColumnDefs(columnDefs);\r\n });\r\n\r\n //load data\r\n self.loadData();\r\n}\r\n\r\ninit();\r\n\r\n});\r\n\r\n","\r\nangular.module(\"prisma\")\r\n .controller(\"InformedPricesReportCtrl\", function ($state, $rootScope, priceService) {\r\n var self = this;\r\n\r\n var numberColWidth = 100;\r\n\r\n var columnDefs = null;\r\n\r\n var toDate = new Date();\r\n toDate.setTime(toDate.getTime() + 86400000); //A partir de ma�ana\r\n self.toDate = toDate;\r\n\r\n var fromDate = new Date();\r\n fromDate.setTime(fromDate.getTime() - 3 * 86400000); //Ultimos 3 dias\r\n self.fromDate = fromDate;\r\n\r\n self.onlyNotImplemented = false;\r\n\r\n self.data = [];\r\n\r\n self.onlyNotImplementedChange = function () {\r\n if (self.data.length > 0) {\r\n if (!self.onlyNotImplemented) {\r\n self.gridOptions.api.setRowData(self.data)\r\n } else {\r\n var temp = [];\r\n angular.forEach(self.data, function (row) {\r\n if (row.implementedDate == null)\r\n temp.push(row);\r\n });\r\n self.gridOptions.api.setRowData(temp);\r\n }\r\n }\r\n }\r\n\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: \"Informed\",\r\n field: \"informedDate\",\r\n width: numberColWidth + 60,\r\n filter: 'date',\r\n cellClass: function (params) {\r\n var cls = $rootScope.getClassForCell(params);\r\n if (params.data.implementedDate == null) {\r\n cls.push(\"invalid-implemented\")\r\n }\r\n return cls;\r\n },\r\n cellRenderer: $rootScope.dateTimeRenderer\r\n },\r\n {\r\n headerName: \"Implemented\",\r\n field: \"implementedDate\",\r\n width: numberColWidth + 60,\r\n filter: 'date',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.dateTimeRenderer\r\n },\r\n {\r\n headerName: \"Zone Code\",\r\n field: \"priceListCode\",\r\n headerTooltip: \"Price zone code\",\r\n width: numberColWidth + 10,\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n {\r\n headerName: \"Zone\",\r\n field: \"priceList\",\r\n width: numberColWidth + 100,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Station\",\r\n field: \"storeCode\",\r\n width: numberColWidth + 10,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Item\",\r\n field: \"itemCode\",\r\n width: numberColWidth + 10,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"UOM\",\r\n field: \"salesUnitOfMeasureCode\",\r\n headerTooltip: \"Sales unit code of sale\",\r\n width: numberColWidth + 40,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Previous price\",\r\n field: \"_Price\",\r\n width: numberColWidth + 20,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n },\r\n {\r\n headerName: \"New price\",\r\n field: \"newPrice\",\r\n width: numberColWidth + 20,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n },\r\n {\r\n headerName: \"Effective date\",\r\n field: \"newValidFrom\",\r\n width: numberColWidth + 60,\r\n filter: 'date',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.dateTimeRenderer\r\n },\r\n ]\r\n }\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n groupHeaders: false,\r\n suppressCellSelection: true,\r\n rowHeight: 35,\r\n groupHideGroupColumns: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n angularCompileRows: true\r\n }\r\n\r\n self.exportToExcel = function () {\r\n swal({\r\n title: 'Exportar',\r\n text: \"Desea exportar estos registros a un archivo excel?.\",\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n\r\n if (!isConfirm) return;\r\n\r\n priceService.reports.getInformedPricesExcel(self.lastFromDate, self.lastToDate).then(function (url) {\r\n //console.log('data', rows);\r\n //self.gridOptions.api.setRowData(rows);\r\n window.open(url);\r\n //console.log('excel url', rows);\r\n swal(\"Exportados correctamente\", '', \"success\");\r\n });\r\n });\r\n\r\n //priceService.reports.getInformedPricesExcel(self.lastFromDate, self.lastToDate).then(function (url) {\r\n // //console.log('data', rows);\r\n // //self.gridOptions.api.setRowData(rows);\r\n // window.open(url);\r\n // //console.log('excel url', rows);\r\n //});\r\n }\r\n\r\n function setGridOptions() {\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n groupHeaders: false,\r\n suppressCellSelection: true,\r\n rowHeight: 35,\r\n groupHideGroupColumns: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n }\r\n }\r\n }\r\n\r\n self.loadData = function () {\r\n\r\n var fromDate = convertDate(self.fromDate);\r\n var toDate = convertDate(self.toDate);\r\n\r\n self.lastFromDate = angular.copy(fromDate);\r\n self.lastToDate = angular.copy(toDate);\r\n\r\n priceService.reports.getInformedPrices(fromDate, toDate).then(function (rows) {\r\n //console.log('data', rows);\r\n self.data = rows;\r\n self.gridOptions.api.setRowData(rows);\r\n });\r\n }\r\n\r\n function convertDate(inputFormat) {\r\n function pad(s) { return (s < 10) ? '0' + s : s; }\r\n var d = new Date(inputFormat);\r\n return [d.getFullYear(), pad(d.getMonth() + 1), pad(d.getDate())].join('-');\r\n }\r\n\r\n function init() {\r\n //init columnDefs and gridOptions\r\n setGridOptions();\r\n\r\n //load data\r\n self.loadData();\r\n }\r\n\r\n init();\r\n\r\n });\r\n\r\n","\r\nangular.module(\"prisma\")\r\n .controller(\"DailyMarginReportCtrl\", function ($state, $rootScope, priceService) {\r\n var self = this;\r\n\r\n var numberColWidth = 100;\r\n\r\n var columnDefs = null;\r\n\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: \"Zone Code\",\r\n field: \"code\",\r\n width: 60,\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n {\r\n headerName: \"Zone\",\r\n field: \"name\",\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n {\r\n headerName: \"Date\",\r\n field: \"currentDate\",\r\n width: numberColWidth,\r\n filter: 'date',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.dateTimeRenderer\r\n },\r\n {\r\n headerName: \"Product\",\r\n field: \"item\",\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Station\",\r\n field: \"storeCode\",\r\n width: numberColWidth + 10,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Public price\",\r\n field: \"_Price\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Accounting Price\",\r\n field: \"priceWOTaxes\",\r\n filter: 'number',\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Total Cost without VAT\",\r\n field: \"cost\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Accounting margin\",\r\n field: \"margin\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Maximum Margin\",\r\n field: \"maxMarginAmount\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Accounting margin / Maximum Margin\",\r\n field: \"marginVsMaxMargin\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRenderer\r\n },\r\n {\r\n headerName: \"Main Competitor\",\r\n field: \"competitor\",\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n {\r\n headerName: \"Main Competitor Price\",\r\n field: \"competitorsPrice\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"IC vs Main Competitor\",\r\n field: \"competitiveIndex\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRenderer\r\n },\r\n {\r\n headerName: \"Average Market Price\",\r\n field: \"marketAveragePrice\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"IC vs Average Market Price\",\r\n field: \"marketCompetitiveIndex\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRenderer\r\n },\r\n ]\r\n }\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n groupHeaders: false,\r\n suppressCellSelection: true,\r\n rowHeight: 35,\r\n groupHideGroupColumns: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n angularCompileRows: true\r\n }\r\n\r\n self.exportToExcel = function () {\r\n swal({\r\n title: 'Exportar',\r\n text: \"Desea exportar estos registros a un archivo excel?.\",\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n\r\n if (!isConfirm) return;\r\n\r\n priceService.reports.getPricesDailyMarginExcel().then(function (url) {\r\n window.open(url);\r\n swal(\"Exportados correctamente\", '', \"success\");\r\n });\r\n });\r\n }\r\n\r\n function setGridOptions() {\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n groupHeaders: false,\r\n suppressCellSelection: true,\r\n rowHeight: 35,\r\n groupHideGroupColumns: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n }\r\n }\r\n }\r\n\r\n self.loadData = function () {\r\n\r\n priceService.reports.getPricesDailyMargin().then(function (rows) {\r\n self.gridOptions.api.setRowData(rows);\r\n });\r\n }\r\n\r\n function init() {\r\n //init columnDefs and gridOptions\r\n setGridOptions();\r\n\r\n //load data\r\n self.loadData();\r\n }\r\n\r\n init();\r\n\r\n });\r\n\r\n","\r\nangular.module(\"prisma\")\r\n .controller(\"CompetitorsPricesReportCtrl\", function ($state, $rootScope, priceService) {\r\n var self = this;\r\n\r\n var toDate = new Date();\r\n toDate.setTime(toDate.getTime() + 86400000); //A partir de ma�ana\r\n self.toDate = toDate;\r\n\r\n var fromDate = new Date();\r\n fromDate.setTime(fromDate.getTime() - 7 * 86400000); //Ultimos 7 dias\r\n self.fromDate = fromDate;\r\n\r\n self.data = [];\r\n\r\n function datediff(first, second) {\r\n // Take the difference between the dates and divide by milliseconds per day.\r\n // Round to nearest whole number to deal with DST.\r\n return Math.round((second - first) / (1000 * 60 * 60 * 24));\r\n }\r\n\r\n self.exportToExcel = function () {\r\n\r\n //No se puede exportar mas de 30 dias\r\n if (datediff(self.fromDate, self.toDate) > 31) {\r\n swal(\"No se pueden exportar mas de 31 dias\", '', \"error\");\r\n }\r\n else {\r\n swal({\r\n title: 'Exportar',\r\n text: \"Desea exportar estos registros a un archivo excel?.\",\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n\r\n if (!isConfirm) return;\r\n\r\n var fromDate = convertDate(self.fromDate);\r\n var toDate = convertDate(self.toDate);\r\n\r\n priceService.reports.getCompetitorsPricesExcel(fromDate, toDate).then(function (url) {\r\n //window.open(url);\r\n var downloadFrame = document.createElement(\"iframe\");\r\n downloadFrame.setAttribute('src', url);\r\n downloadFrame.setAttribute('class', \"screenReaderText\");\r\n document.body.appendChild(downloadFrame);\r\n\r\n swal(\"Exportados correctamente\", '', \"success\");\r\n });\r\n });\r\n }\r\n }\r\n\r\n function convertDate(inputFormat) {\r\n function pad(s) { return (s < 10) ? '0' + s : s; }\r\n var d = new Date(inputFormat);\r\n return [d.getFullYear(), pad(d.getMonth() + 1), pad(d.getDate())].join('-');\r\n }\r\n\r\n function init() {\r\n \r\n }\r\n\r\n init();\r\n\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"CompetitiveIndexCtrl\", function ($scope, priceService, adminService, $translate, $timeout, $window) {\r\n var self = this;\r\n self.selectedName = \"\";\r\n self.lastSelectedName = \"\";\r\n\r\n self.isLoading = true;\r\n self.reportData = [];\r\n self.priceTypeId = 5; //Por default se usa el Tipo de Precio de Competencia\r\n self.showChipsFilter = false;\r\n self.hideZonesFilter = false;\r\n self.hideCompetitorsFilter = false;\r\n\r\n self.changePriceType = function (priceTypeId) {\r\n self.priceTypeId = priceTypeId;\r\n\r\n self.applyFilters();\r\n }\r\n\r\n $scope.oneAtATime = true;\r\n\r\n $scope.groups = [\r\n {\r\n title: 'Dynamic Group Header - 1',\r\n content: 'Dynamic Group Body - 1'\r\n },\r\n {\r\n title: 'Dynamic Group Header - 2',\r\n content: 'Dynamic Group Body - 2'\r\n }\r\n ];\r\n\r\n $scope.items = ['Item 1', 'Item 2', 'Item 3'];\r\n\r\n $scope.addItem = function () {\r\n var newItemNo = $scope.items.length + 1;\r\n $scope.items.push('Item ' + newItemNo);\r\n };\r\n\r\n $scope.status = {\r\n isCustomHeaderOpen: false,\r\n isFirstOpen: true,\r\n isFirstDisabled: false\r\n };\r\n\r\n self.filters = {\r\n priceLists: [],\r\n categories: [],\r\n competitorGroups: [],\r\n brands: [],\r\n tags: [],\r\n priceSurveyTypes: []\r\n }\r\n\r\n self.applyFilters = function () {\r\n self.closeFilters();\r\n\r\n loadReportData();\r\n\r\n if (self.filters.priceLists.length > 0\r\n || self.filters.categories.length > 0\r\n || self.filters.brands.length > 0\r\n || self.filters.tags.length > 0\r\n || self.filters.priceSurveyTypes.length > 0\r\n || self.filters.competitorGroups.length > 0) {\r\n self.showChipsFilter = true;\r\n }\r\n else {\r\n $timeout(function () {\r\n self.showChipsFilter = false;\r\n }, 200);\r\n }\r\n\r\n }\r\n\r\n self.order = 'competitiveIndex';\r\n\r\n self.isMarker = true;\r\n\r\n self.reportTypes = [\r\n {\r\n id: 1,\r\n name: \"Zona\",\r\n },\r\n {\r\n id: 2,\r\n name: \"Competidor\",\r\n },\r\n {\r\n id: 3,\r\n name: \"Categoria\",\r\n },\r\n //{\r\n // id: 4,\r\n // name: \"Subcategoria\",\r\n //}\r\n ];\r\n\r\n self.clearSelectedFilter = function (type, id) {\r\n if (type == 'priceList') {\r\n var removeIndex = -1;\r\n for (var i = 0; i < self.filters.priceLists.length; i++) {\r\n if (self.filters.priceLists[i].id === id) {\r\n removeIndex = i;\r\n }\r\n }\r\n\r\n if (removeIndex > -1) {\r\n self.filters.priceLists.splice(removeIndex, 1);\r\n self.applyFilters();\r\n }\r\n }\r\n\r\n if (type == 'category') {\r\n var removeIndex = -1;\r\n for (var i = 0; i < self.filters.categories.length; i++) {\r\n if (self.filters.categories[i].id === id) {\r\n removeIndex = i;\r\n }\r\n }\r\n\r\n if (removeIndex > -1) {\r\n self.filters.categories.splice(removeIndex, 1);\r\n self.applyFilters();\r\n }\r\n }\r\n\r\n if (type == 'brand') {\r\n var removeIndex = -1;\r\n for (var i = 0; i < self.filters.brands.length; i++) {\r\n if (self.filters.brands[i] === id) {\r\n removeIndex = i;\r\n }\r\n }\r\n\r\n if (removeIndex > -1) {\r\n self.filters.brands.splice(removeIndex, 1);\r\n self.applyFilters();\r\n }\r\n }\r\n\r\n if (type == 'tag') {\r\n var removeIndex = -1;\r\n for (var i = 0; i < self.filters.tags.length; i++) {\r\n if (self.filters.tags[i].id === id) {\r\n removeIndex = i;\r\n }\r\n }\r\n\r\n if (removeIndex > -1) {\r\n self.filters.tags.splice(removeIndex, 1);\r\n self.applyFilters();\r\n }\r\n }\r\n\r\n if (type == 'priceSurveyType') {\r\n var removeIndex = -1;\r\n for (var i = 0; i < self.filters.priceSurveyTypes.length; i++) {\r\n if (self.filters.priceSurveyTypes[i].priceSurveyType === id) {\r\n removeIndex = i;\r\n }\r\n }\r\n\r\n if (removeIndex > -1) {\r\n self.filters.priceSurveyTypes.splice(removeIndex, 1);\r\n self.applyFilters();\r\n }\r\n }\r\n\r\n if (type == 'competitorGroups') {\r\n var removeIndex = -1;\r\n for (var i = 0; i < self.filters.competitorGroups.length; i++) {\r\n if (self.filters.competitorGroups[i].competitorGroups === id) {\r\n removeIndex = i;\r\n }\r\n }\r\n\r\n if (removeIndex > -1) {\r\n self.filters.competitorGroups.splice(removeIndex, 1);\r\n self.applyFilters();\r\n }\r\n }\r\n }\r\n\r\n self.closeSelectedFilters = function () {\r\n if (self.filters.priceLists.length <= 0\r\n || self.filters.categories.length <= 0\r\n || self.filters.brands.length <= 0\r\n || self.filters.tags.length <= 0\r\n || self.filters.priceSurveyTypes.length <= 0\r\n || self.filters.competitorGroups.length <= 0) {\r\n return 'closeFilters';\r\n }\r\n }\r\n\r\n self.cleanAllFilter = function () {\r\n self.filters.priceLists = [];\r\n self.filters.categories = [];\r\n self.filters.brands = [];\r\n self.filters.tags = [];\r\n self.filters.priceSurveyTypes = [];\r\n self.filters.competitorGroups = [];\r\n \r\n\r\n self.applyFilters();\r\n }\r\n\r\n self.lastDrilldownReportType = self.reportTypes[0];\r\n\r\n self.drillDownFunnelStep = 0;\r\n\r\n self.drillDown = function (itemId, itemName) {\r\n\r\n self.drillDownFunnelStep++;\r\n self.lastDrillownItemd = itemId;\r\n\r\n if (self.selectedReportType.id == 1) //Zonas\r\n {\r\n self.filters.priceLists = [];\r\n self.filters.priceLists.push({ id: itemId, name: itemName });\r\n self.hideZonesFilter = true;\r\n\r\n if (self.drillDownFunnelStep == 1) {\r\n self.selectedReportType = self.reportTypes[1]; //Competidores\r\n self.lastDrilldownReportType = angular.copy(self.reportTypes[0]);\r\n }\r\n else if (self.drillDownFunnelStep == 2) {\r\n self.selectedReportType = self.reportTypes[2]; //Categories\r\n self.lastDrilldownReportType = angular.copy(self.reportTypes[0]);\r\n self.hideCompetitorsFilter = true;\r\n }\r\n\r\n self.applyFilters();\r\n }\r\n else if (self.selectedReportType.id == 2) //Competidor\r\n {\r\n self.filters.competitorGroups = [];\r\n self.filters.competitorGroups.push({ id: itemId, name: itemName });\r\n self.hideCompetitorsFilter = true;\r\n\r\n if (self.drillDownFunnelStep == 1) {\r\n self.selectedReportType = self.reportTypes[0]; //Zonas\r\n self.lastDrilldownReportType = angular.copy(self.reportTypes[1]);\r\n }\r\n else if (self.drillDownFunnelStep == 2) {\r\n self.selectedReportType = self.reportTypes[2];\r\n self.lastDrilldownReportType = angular.copy(self.reportTypes[1]);\r\n self.hideZonesFilter = true;\r\n }\r\n\r\n self.applyFilters();\r\n }\r\n\r\n self.lastSelectedName = angular.copy(self.selectedName);\r\n\r\n if (self.selectedName == \"\")\r\n self.selectedName = itemName;\r\n else\r\n self.selectedName = self.selectedName + \" / \" + itemName\r\n }\r\n\r\n self.drillUp = function () {\r\n\r\n if (self.selectedReportType.id == 1) //Zonas\r\n {\r\n if (self.drillDownFunnelStep == 1) {\r\n self.filters.competitorGroups = [];\r\n self.selectedReportType = self.reportTypes[1];\r\n self.lastDrilldownReportType = angular.copy(self.reportTypes[0]);\r\n self.drillDownFunnelStep--;\r\n self.selectedName = \"\";\r\n self.hideCompetitorsFilter = false;\r\n }\r\n\r\n self.applyFilters();\r\n }\r\n else if (self.selectedReportType.id == 2) //Competidor\r\n {\r\n if (self.drillDownFunnelStep == 1) {\r\n self.filters.priceLists = [];\r\n self.selectedReportType = self.reportTypes[0];\r\n self.lastDrilldownReportType = angular.copy(self.reportTypes[1]);\r\n self.drillDownFunnelStep--;\r\n self.selectedName = \"\";\r\n self.hideZonesFilter = false;\r\n }\r\n\r\n self.applyFilters();\r\n }\r\n else if (self.selectedReportType.id == 3) //Categoria\r\n {\r\n if (self.lastDrilldownReportType.id == 1) { //VENGO DE ZONA\r\n self.filters.priceLists = [];\r\n self.selectedReportType = self.reportTypes[0];\r\n self.lastDrilldownReportType = angular.copy(self.reportTypes[1]);\r\n self.drillDownFunnelStep--;\r\n self.hideZonesFilter = false;\r\n }\r\n else if (self.lastDrilldownReportType.id == 2) //VENGO DE COMPETIDOR\r\n {\r\n self.filters.competitorGroups = [];\r\n self.selectedReportType = self.reportTypes[1];\r\n self.lastDrilldownReportType = angular.copy(self.reportTypes[0]);\r\n self.drillDownFunnelStep--;\r\n self.hideCompetitorsFilter = false;\r\n }\r\n\r\n self.applyFilters();\r\n }\r\n\r\n if (self.drillDownFunnelStep == 1)\r\n self.selectedName = self.lastSelectedName;\r\n }\r\n\r\n self.getIcColor = function (ic) {\r\n if (ic != null) {\r\n if (ic < 0) //Negativo\r\n {\r\n //(243, 102, 70)\r\n var bgColor = 'rgba(243, 102, 70, ' + (ic.toFixed(2) * 10 * -1) + ')';\r\n return { \"background-color\": bgColor };\r\n }\r\n else if (ic > 0) //Positivo\r\n {\r\n var bgColor = 'rgba(103, 193, 154, ' + (ic.toFixed(2) * 10) + ')';\r\n return { \"background-color\": bgColor };\r\n }\r\n\r\n else {\r\n return { \"background-color\": '#FFC98E' }; //Igual a cero\r\n }\r\n }\r\n else {\r\n return \"\";\r\n }\r\n\r\n //ng - class=\"{'WarningNumber' : item.competitiveIndex <= -0.05, 'WarningNumber-1' : item.competitiveIndex <= -0.06}\"\r\n }\r\n\r\n\r\n self.changeReportType = function (group, acordionStatus) {\r\n self.selectedReportType = group;\r\n self.reportTypeChanged();\r\n acordionStatus.open = false;\r\n }\r\n\r\n self.reportTypeChanged = function () {\r\n if (self.selectedReportType) {\r\n\r\n self.drillDownFunnelStep = 0;\r\n\r\n self.filters.competitorGroups = [];\r\n self.filters.priceLists = [];\r\n\r\n self.selectedName = \"\";\r\n\r\n loadReportData();\r\n }\r\n }\r\n\r\n self.selectedReportType = self.reportTypes[0];\r\n self.reportTypeChanged();\r\n\r\n self.pricelists = [];\r\n function loadPricelists() {\r\n priceService.pricelists.getPriceLists()\r\n .then(function (pricelists) {\r\n self.pricelists = pricelists\r\n });\r\n }\r\n\r\n self.categories = [];\r\n function loadCategories() {\r\n adminService.categories.getCategories().then(function (categories) {\r\n self.categories = categories;\r\n })\r\n }\r\n\r\n self.tags = [];\r\n function loadTags() {\r\n adminService.tags.getTags()\r\n .then(function (tags) {\r\n self.tags = tags;\r\n });\r\n }\r\n\r\n self.brands = [];\r\n function loadBrands() {\r\n adminService.items.getItemBrands()\r\n .then(function (brands) {\r\n self.brands = brands;\r\n });\r\n }\r\n\r\n self.competitorGroups = [];\r\n function loadCompetitorGroups() {\r\n priceService.competitors.getCompetitorGroups()\r\n .then(function (groups) {\r\n self.competitorGroups = groups;\r\n });\r\n }\r\n\r\n function loadReportData() {\r\n\r\n var filteredPriceLists = [];\r\n angular.forEach(self.filters.priceLists, function (item) {\r\n filteredPriceLists.push(item.id);\r\n });\r\n\r\n var filteredCategories = [];\r\n angular.forEach(self.filters.categories, function (item) {\r\n filteredCategories.push(item.id);\r\n });\r\n\r\n var filteredCompetitorGroups = [];\r\n angular.forEach(self.filters.competitorGroups, function (item) {\r\n filteredCompetitorGroups.push(item.id);\r\n });\r\n\r\n var filteredBrands = '';\r\n angular.forEach(self.filters.brands, function (brand) {\r\n if (filteredBrands != '')\r\n filteredBrands += ',';\r\n filteredBrands += brand;\r\n });\r\n\r\n var filteredTags = [];\r\n angular.forEach(self.filters.tags, function (item) {\r\n filteredTags.push(item.id);\r\n });\r\n\r\n var filteredPriceSurveyTypes = [];\r\n angular.forEach(self.filters.priceSurveyTypes, function (item) {\r\n filteredPriceSurveyTypes.push(item.priceSurveyType);\r\n });\r\n\r\n\r\n\r\n var params = {\r\n reportType: self.selectedReportType.id,\r\n priceTypeId: self.priceTypeId,\r\n isMarker: self.isMarker,\r\n priceSurveyTypes: filteredPriceSurveyTypes,\r\n priceListIds: filteredPriceLists,\r\n sensitivityIds: [],\r\n competitorGroupIds: filteredCompetitorGroups,\r\n categoryIds: filteredCategories,\r\n tagIds: filteredTags,\r\n brands: filteredBrands\r\n };\r\n\r\n self.isLoading = true;\r\n priceService.reports.getCompetitiveIndex(params).then(function (data) {\r\n self.isLoading = false;\r\n\r\n self.reportData = data;\r\n });\r\n }\r\n\r\n //Filtros\r\n\r\n self.showFilters = false;\r\n\r\n self.toggleFilters = function () {\r\n\r\n self.showFilters = !self.showFilters;\r\n }\r\n\r\n self.getFilterClass = function () {\r\n if (self.showFilters == true)\r\n return 'move-right';\r\n else\r\n return '';\r\n }\r\n\r\n function closeFilterWhenClickingOutside(event) {\r\n\r\n var clickedElement = event.target;\r\n if (!clickedElement) return;\r\n\r\n var elementClasses = clickedElement.classList;\r\n var clickedOnFilterDiv = elementClasses.contains('isFilter')\r\n || elementClasses.contains('chosen-choice')\r\n || elementClasses.contains('chosen-choices')\r\n || elementClasses.contains('search-field')\r\n || elementClasses.contains('default')\r\n || elementClasses.contains('chosen-container')\r\n || elementClasses.contains('chosen-container')\r\n if (!clickedOnFilterDiv) {\r\n self.closeFilters();\r\n }\r\n\r\n }\r\n\r\n self.closeFilters = function () {\r\n $timeout(function () {\r\n self.showFilters = false;\r\n $window.onclick = null;\r\n });\r\n\r\n }\r\n\r\n //Filtro collapse\r\n\r\n self.isNavCollapsed = true;\r\n self.isCollapsedHorizontal = false;\r\n self.isCollapsed = true;\r\n self.isCategoryCollapsed = true;\r\n self.isZoneCollapsed = true;\r\n self.isBrandCollapsed = true;\r\n self.isTagCollapsed = true;\r\n self.isPriceTypeCollapsed = true;\r\n self.isCompetitorsGroupCollapsed = true;\r\n self.isTypeSurveyCollapsed = true;\r\n\r\n\r\n\r\n function loadData() {\r\n loadPricelists();\r\n loadTags();\r\n loadCategories();\r\n loadBrands();\r\n loadCompetitorGroups();\r\n\r\n priceService.getPriceSurveyTypes().then(\r\n function (priceSurveyTypes) {\r\n self.priceSurveyTypes = priceSurveyTypes;\r\n });\r\n }\r\n\r\n function init() {\r\n \r\n loadData();\r\n }\r\n\r\n init();\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"PriceRegionsCtrl\", function ($scope, $state, $stateParams, priceService, $timeout) {\r\n\r\n //Variable globales\r\n\r\n var self = this;\r\n\r\n self.regions = [];\r\n\r\n function loadRegions() {\r\n priceService.regions.getRegions()\r\n .then(function (regions) {\r\n self.regions = regions;\r\n });\r\n }\r\n\r\n //Funciones\r\n self.editRegion = function (id) {\r\n $state.go('prices.editRegion', { regionId: id });\r\n }\r\n\r\n self.addNew = function () {\r\n $state.go('prices.editRegion', { regionId: 0 });\r\n }\r\n\r\n function init() {\r\n loadRegions();\r\n }\r\n\r\n if ($stateParams.reload) {\r\n loadRegions();\r\n }\r\n\r\n init();\r\n\r\n });","angular.module(\"prisma\")\r\n .controller(\"EditPriceRegionCtrl\", function ($scope, $state, $stateParams, priceService, adminService, $timeout, $translate) {\r\n\r\n //Variable globales\r\n var self = this;\r\n self.selectedPriceList = '';\r\n self.distributionCenters = [];\r\n \r\n\r\n self.region = {\r\n id: 0,\r\n storeCode : '',\r\n storeId: 0,\r\n name : ''\r\n }\r\n\r\n self.storeSelected = function () {\r\n angular.forEach(self.distributionCenters, function (store) {\r\n if (store.id == self.region.storeId) {\r\n console.log(self.region);\r\n self.region.storeId = store.id;\r\n self.region.storeCode = store.code;\r\n }\r\n });\r\n }\r\n\r\n self.save = function () {\r\n var title = translations.SaveRegion;\r\n swal({\r\n title: title,\r\n text: '',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.Save,\r\n cancelButtonText: translations.Cancel,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n priceService.regions.saveRegion(self.region)\r\n .then(function (status) {\r\n swal(translations.SavedRegion, translations.SavedRegionSubtitle, 'success');\r\n\r\n $state.go('prices.regions', {reload: true});\r\n },\r\n function () {\r\n swal(translations.ErrorTitleSwal, translations.ErrorToSaveTheRegion, 'error');\r\n\r\n });\r\n }\r\n });\r\n }\r\n\r\n function getRegion(id) {\r\n\r\n priceService.regions.getRegion(id)\r\n .then(function (region) {\r\n console.log(region);\r\n self.region = region;\r\n });\r\n }\r\n\r\n function getDistributionCenters() {\r\n adminService.stores.getDistributionCentersCombo().then(function (dc) {\r\n self.distributionCenters = dc;\r\n })\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n $translate([\"SaveRegion\", \"Save\", \"Cancel\", \"SavedRegion\", \"SavedRegionSubtitle\", \"ErrorTitleSwal\", \"ErrorToSaveTheRegion\"])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n getDistributionCenters();\r\n\r\n var regionId = $stateParams.regionId;\r\n if (regionId != 0)\r\n getRegion(regionId);\r\n }\r\n\r\n init();\r\n\r\n });\r\n\r\n\r\n\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"PriceRoundingsCtrl\", function ($scope, priceService, companyJson, $translate) {\r\n var self = this;\r\n\r\n self.setupData = companyJson;\r\n\r\n self.priceRoundings = [];\r\n\r\n self.priceTypes = [];\r\n\r\n self.priceRoundingTypes = [];\r\n\r\n self.getDecimalsName = function (decimals) {\r\n return self.decimalNames.filter(function (decimal) {\r\n return (decimal.decimals === decimals);\r\n })[0].name;\r\n }\r\n\r\n self.isLoading = true;\r\n\r\n self.roundNumber = function (numberToRound) {\r\n if (isNaN(numberToRound)) {\r\n alert(translations.YouMustEnterValidNumber);\r\n }\r\n else {\r\n priceService.priceRoundings.getRoundedNumber(self.priceTypeToTest, numberToRound).then(function (roundedNumber) {\r\n self.roundedNumber = roundedNumber;\r\n });\r\n }\r\n\r\n\r\n }\r\n\r\n self.deletePriceRounding = function (id) {\r\n\r\n swal({\r\n title: translations.DeleteTheRuleSwal,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#DD6B55\",\r\n confirmButtonText: translations.DeleteSwal,\r\n cancelButtonText: translations.Cancel,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n priceService.priceRoundings.deletePriceRounding(id)\r\n .then(function (isOk) {\r\n for (var i = 0; i < self.priceRoundings.length; i++) {\r\n if (self.priceRoundings[i].id == id) {\r\n self.priceRoundings.splice([i], 1);\r\n }\r\n }\r\n swal(translations.ErasedRuleSwal, translations.HasBeenErasedCorrectlySwal, 'success');\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(translations.TheProcessContinues, translations.TheProcessOfContinuousDeletionSwal)\r\n }\r\n else {\r\n swal(translations.ErrorTitleSwal, translations.ErrorWhenDeletingTheRule, \"error\");\r\n }\r\n });\r\n }\r\n\r\n });\r\n }\r\n\r\n function loadData() {\r\n\r\n priceService.priceRoundings.getPriceRoundings()\r\n .then(function (priceRoundings) {\r\n self.priceRoundings = priceRoundings;\r\n self.isLoading = false;\r\n });\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n priceService.getRoundingDecimalNames().then(\r\n function (decimalNames) {\r\n self.decimalNames = decimalNames;\r\n });\r\n\r\n priceService.getPriceTypes().then(\r\n function (priceTypes) {\r\n self.priceTypes = priceTypes;\r\n });\r\n\r\n priceService.getPriceRoundingTypes().then(\r\n function (priceRoundingTypes) {\r\n self.priceRoundingTypes = priceRoundingTypes;\r\n });\r\n\r\n\r\n $translate([\"YouMustEnterValidNumber\", \"DeleteTheRuleSwal\", \"DeleteSwal\", \"Cancel\", \"ErasedRuleSwal\", \"HasBeenErasedCorrectlySwal\", \"TheProcessContinues\", \"TheProcessOfContinuousDeletionSwal\", \"ErrorTitleSwal\", \"ErrorWhenDeletingTheRule\"])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n loadData();\r\n }\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"editPriceRoundingsCtrl\", function ($scope, $timeout, $stateParams, $state, priceService, adminService, ngDialog, $translate) {\r\n\r\n var self = this;\r\n self.priceRounding = {};\r\n\r\n self.priceRoundings = [];\r\n self.unmodifiedPoints = [];\r\n\r\n self.isNew = false;\r\n self.selectedPriceType = null;\r\n self.showDd = false;\r\n self.inputNewTermination = false;\r\n self.newPointValue = null;\r\n\r\n self.allArticlesGroup = [];\r\n self.newRoundingAdded = false;\r\n\r\n self.priceLists = [];\r\n\r\n self.title = \"\";\r\n\r\n //Funciones\r\n\r\n\r\n self.savePriceRoundings = function (priceRoundings) {\r\n\r\n swal({\r\n title: translations.SaveTheRoundingRulesSwal,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n //agrego la ultima regla a self.priceRoundings si no se agrego aun\r\n if (self.isNew) {\r\n self.priceRoundings.push(self.priceRounding);\r\n }\r\n if (priceRoundings.length > 0) {\r\n\r\n var canSaveResult = canSave();\r\n\r\n if (canSaveResult == \"success\") {\r\n\r\n angular.forEach(self.priceRoundings, function (pr) {\r\n //pongo en el array las categorias seleccionadas\r\n var selectedCategories = [];\r\n if (pr.categories.length > 0) {\r\n selectedCategories = _.map(pr.categories, function (x) {\r\n return {\r\n id: x,\r\n priceRoundingId: pr.id,\r\n level: 5,\r\n exclude: false\r\n }\r\n });\r\n\r\n pr.categories = selectedCategories;\r\n }\r\n //pongo en el array las categorias excluidas\r\n else if (pr.exarticlesGroup.length > 0) {\r\n selectedCategories = _.map(pr.exarticlesGroup, function (x) {\r\n return {\r\n id: x,\r\n priceRoundingId: pr.id,\r\n level: 5,\r\n exclude: true\r\n }\r\n });\r\n\r\n pr.categories = selectedCategories;\r\n }\r\n\r\n //pongo en el array las pricelists seleccionadas\r\n var selectedPriceLists = [];\r\n if (pr.priceLists.length > 0) {\r\n selectedPriceLists = _.map(pr.priceLists, function (x) {\r\n return {\r\n priceListId: x,\r\n priceRoundingId: pr.id,\r\n exclude: false\r\n }\r\n });\r\n\r\n pr.priceLists = selectedPriceLists;\r\n }\r\n //pongo en el array las priceLists excluidas\r\n else if (pr.expricelists.length > 0) {\r\n selectedPriceLists = _.map(pr.expricelists, function (x) {\r\n return {\r\n priceListId: x,\r\n priceRoundingId: pr.id,\r\n exclude: true\r\n }\r\n });\r\n\r\n pr.priceLists = selectedPriceLists;\r\n }\r\n });\r\n\r\n priceService.priceRoundings.savePriceRoundings(self.priceRoundings)\r\n .then(function (priceRoundings) {\r\n swal(translations.SavedRoundingRulesSwal, '', 'success');\r\n self.priceRoundings = priceRoundings;\r\n $state.go('prices.priceRoundings');\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(translations.TheProcessContinues, translations.TheProcessOfContinuousStorageSwal)\r\n }\r\n else {\r\n if (self.isNew)\r\n self.priceRoundings.pop();//quito la ultima porque no se guardo\r\n swal(translations.ErrorTitleSwal, translations.ErrorWhenSavingTheseRoundingRules, \"error\");\r\n }\r\n });\r\n } else {\r\n if (self.isNew)\r\n self.priceRoundings.pop();//quito la ultima porque no se guardo\r\n\r\n $timeout(function () {\r\n swal(translations.ErrorTitleSwal, canSaveResult, \"error\");\r\n }, 100);\r\n\r\n }\r\n }\r\n\r\n }\r\n });\r\n\r\n }\r\n\r\n function canSave() {\r\n /*\r\n if (self.priceRoundings[0].from != 0 || self.priceRoundings[self.priceRoundings.length - 1].to != null)\r\n return \"la lista de rangos debe comenzar en 0 y terminar en infinito (vacio)\";\r\n\r\n for (var i = 0; i < self.priceRoundings.length - 1; i++) {\r\n if (self.priceRoundings[i].to != self.priceRoundings[i + 1].from)\r\n return \"verifique que el 'hasta' de un rango coincida con el 'desde' del siguiente\";\r\n }\r\n */\r\n\r\n return \"success\";\r\n\r\n }\r\n\r\n self.addNewPriceRounding = function () {\r\n\r\n if (!self.newRoundingAdded) {\r\n\r\n self.newRoundingAdded = true;\r\n\r\n self.priceRounding = {\r\n id: 0,\r\n priceType: $stateParams.priceTypeId,\r\n from: 0,\r\n to: 10,\r\n roundingTolerance: 0,\r\n roundingToleranceP: 0,\r\n roundingDecimals: 0,\r\n pointsStr: \"\",\r\n priceRoundingType: 1,\r\n priceRoundingMidPointType: 0,\r\n points: [],\r\n allPriceListsChecked: true,\r\n priceLists: [],\r\n expricelists: [],\r\n allArticlesGroupChecked: true,\r\n articlesGroup: [],\r\n exarticlesGroup: [],\r\n categories: []\r\n };\r\n\r\n self.isNew = true;\r\n }\r\n else {\r\n swal(translations.WarningSwal, translations.YouMustSaveSwal, \"warning\");\r\n }\r\n\r\n /*\r\n self.priceRoundings.push(angular.copy(self.newPriceRounding));\r\n self.newPriceRounding.from = 0;\r\n self.newPriceRounding.to = 10;\r\n self.newPriceRounding.roundingTolerance = 0;\r\n self.newPriceRounding.roundingToleranceP = 0;\r\n self.newPriceRounding.roundingDecimals = 0;\r\n self.newPriceRounding.pointsStr = \"\";\r\n self.newPriceRounding.priceRoundingType = 1;\r\n self.newPriceRounding.priceRoundingMidPointType = 1;\r\n self.newPriceRounding.points = [];\r\n */\r\n }\r\n\r\n self.changeType = function () {\r\n if (self.selectedPriceType != null)\r\n $stateParams.priceTypeId = self.selectedPriceType.id;\r\n\r\n loadPriceRoundings();\r\n }\r\n\r\n self.showInputNewPrice = function () {\r\n self.isNew = true;\r\n }\r\n\r\n self.setRoundingTolerance = function (pr) {\r\n pr.roundingTolerance = pr.roundingToleranceP && pr.roundingToleranceP != null ? pr.roundingToleranceP / 100 : null;\r\n }\r\n\r\n //points\r\n\r\n self.showPointsEditor = function (pr) {\r\n\r\n self.priceRounding = pr;\r\n self.unmodifiedPoints = angular.copy(pr.points);\r\n\r\n ngDialog.open({\r\n template: 'points',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n data: points,\r\n width: 487,\r\n showClose: false,\r\n closeByEscape: false,\r\n closeByDocument: false,\r\n scope: $scope\r\n\r\n });\r\n }\r\n\r\n self.showInputNewTermination = function () {\r\n self.inputNewTermination = true;\r\n }\r\n\r\n self.deleteTermination = function (id, point) {\r\n for (i = 0; i < self.priceRounding.points.length; i++) {\r\n\r\n if (self.priceRounding.points[i].id == id && self.priceRounding.points[i].point == point)\r\n self.priceRounding.points.splice([i], 1);\r\n }\r\n }\r\n\r\n self.cancelDialog = function () {\r\n self.priceRounding.points = self.unmodifiedPoints;\r\n ngDialog.close();\r\n }\r\n\r\n self.addNewTermination = function () {\r\n\r\n var errorMessage = '';\r\n\r\n //Validamos que las terminaciones sean acorde a la cantidad de decimales ingresados en el redondeo\r\n if (self.newPointValue != undefined && self.newPointValue >= 0) {\r\n\r\n if (self.priceRounding.roundingDecimals > 0 && self.newPointValue >= 1) {\r\n errorMessage = translations.RoundingEndingValidation1;\r\n }\r\n else if (self.priceRounding.roundingDecimals == -1 && self.newPointValue >= 100) {\r\n errorMessage = translations.RoundingEndingValidation2;\r\n }\r\n else if (self.priceRounding.roundingDecimals == -2 && self.newPointValue >= 1000) {\r\n errorMessage = translations.RoundingEndingValidation3;\r\n }\r\n else if (self.priceRounding.roundingDecimals == -3 && self.newPointValue >= 10000) {\r\n errorMessage = translations.RoundingEndingValidation4;\r\n }\r\n else if (self.priceRounding.roundingDecimals == -4 && self.newPointValue >= 100000) {\r\n errorMessage = translations.RoundingEndingValidation5;\r\n }\r\n\r\n if (self.priceRounding.roundingDecimals >= 0 && decimalPlaces(self.newPointValue) > self.priceRounding.roundingDecimals) {\r\n errorMessage += translations.RoundingEndingValidation6;\r\n }\r\n\r\n if (errorMessage == '' && self.priceRounding.to != null && self.newPointValue > self.priceRounding.to) {\r\n errorMessage += translations.RoundingEndingValidation7 + self.priceRounding.to;\r\n }\r\n\r\n angular.forEach(self.priceRounding.points, function (p) {\r\n if (p.point == self.newPointValue && errorMessage == '') {\r\n errorMessage += translations.RoundingEndingValidation8;\r\n }\r\n });\r\n\r\n if (errorMessage == '') {\r\n self.priceRounding.points.push({ id: 0, point: self.newPointValue });\r\n self.newPointValue = null;\r\n self.inputNewTermination = false;\r\n }\r\n }\r\n else {\r\n errorMessage = translations.RoundingEndingValidation9;\r\n }\r\n\r\n if (errorMessage != '') {\r\n swal(translations.ErrorTitleSwal, errorMessage, \"error\");\r\n }\r\n }\r\n\r\n function decimalPlaces(num) {\r\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\r\n if (!match) { return 0; }\r\n return Math.max(\r\n 0,\r\n // Number of digits right of decimal point.\r\n (match[1] ? match[1].length : 0)\r\n // Adjust for scientific notation.\r\n - (match[2] ? +match[2] : 0));\r\n }\r\n\r\n self.saveTermination = function () {\r\n\r\n self.priceRounding.pointsStr = \"\";\r\n\r\n angular.forEach(self.priceRounding.points, function (p) {\r\n self.priceRounding.pointsStr += ' | ' + p.point;\r\n });\r\n\r\n ngDialog.close();\r\n }\r\n\r\n function getCategories() {\r\n adminService.categories.getSubCategories()\r\n .then(function (c) {\r\n self.articlesGroup = c;\r\n })\r\n }\r\n\r\n function getPriceLists() {\r\n priceService.rules.getPriceRulePriceLists().then(function (priceLists) {\r\n self.priceLists = angular.copy(priceLists);\r\n });\r\n }\r\n\r\n self.selectAllArticlesGroupForRule = function (priceRounding) {\r\n priceRounding.articlesGroup = [];\r\n priceRounding.exarticlesGroup = [];\r\n priceRounding.categories = [];\r\n }\r\n\r\n self.selectAllPriceListsForRule = function (priceRounding) {\r\n if (self.allPriceListsChecked) {\r\n priceRounding.priceLists = angular.copy(self.priceLists);\r\n priceRounding.expricelists = [];\r\n }\r\n else {\r\n priceRounding.priceLists = [];\r\n priceRounding.expricelists = [];\r\n }\r\n }\r\n\r\n //init\r\n loadPriceRoundings = function () {\r\n self.showDd = false;\r\n if ($stateParams.priceTypeId != -1) {//uso -1 en vez de 0 porque 0 es un tipo de precio\r\n priceService.priceRoundings.getPriceRoundingsByType($stateParams.priceTypeId)\r\n .then(function (priceRoundings) {\r\n self.priceRoundings = priceRoundings;\r\n if (self.priceRoundings.length > 0) {\r\n self.title = translations.EditRoundingRuleTitle;\r\n //self.newPriceRounding.priceType = $stateParams.priceTypeId;\r\n\r\n angular.forEach(self.priceRoundings, function (p) {\r\n //por defecto checkeado\r\n p.allArticlesGroupChecked = true;\r\n p.allPriceListsChecked = true;\r\n\r\n //si de la lista de categorias alguna es no excluida destildo el check\r\n angular.forEach(p.categories, function (c) {\r\n if (c.exclude == false) {\r\n p.allArticlesGroupChecked = false;\r\n }\r\n });\r\n\r\n var ids = [];\r\n var exids = [];\r\n p.categories.forEach(function (el) {\r\n if (el.exclude == false) {\r\n ids = ids.concat(el.id);\r\n }\r\n });\r\n\r\n p.categories.forEach(function (el) {\r\n if (el.exclude == true) {\r\n exids = exids.concat(el.id);\r\n }\r\n });\r\n\r\n p.categories = ids;\r\n p.exarticlesGroup = exids;\r\n\r\n //si de la lista de priceLists alguna es no excluida destildo el check\r\n angular.forEach(p.priceLists, function (pl) {\r\n if (pl.exclude == false) {\r\n p.allPriceListsChecked = false;\r\n }\r\n });\r\n\r\n var plids = [];\r\n var plexids = [];\r\n p.priceLists.forEach(function (el) {\r\n if (el.exclude == false) {\r\n plids = plids.concat(el.priceListId);\r\n }\r\n });\r\n\r\n p.priceLists.forEach(function (el) {\r\n if (el.exclude == true) {\r\n plexids = plexids.concat(el.priceListId);\r\n }\r\n });\r\n\r\n p.priceLists = plids;\r\n p.expricelists = plexids;\r\n });\r\n }\r\n else {\r\n self.isNew = true;\r\n self.title = translations.NewRoundingRuleTitle;\r\n self.addNewPriceRounding();\r\n //self.newPriceRounding.priceType = $stateParams.priceTypeId;\r\n }\r\n });\r\n\r\n for (var i = 0; i < self.types.length; i++) {\r\n if (self.types[i].id == $stateParams.priceTypeId)\r\n self.selectedPriceType = self.types[i];\r\n\r\n }\r\n\r\n }\r\n else {\r\n self.title = translations.NewRoundingRuleTitle;\r\n self.showDd = true;\r\n }\r\n\r\n getCategories();\r\n getPriceLists();\r\n }\r\n\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n priceService.getRoundingDecimalNames().then(\r\n function (decimalNames) {\r\n self.decimalNames = decimalNames;\r\n });\r\n\r\n\r\n $translate([\"SaveTheRoundingRulesSwal\", \"ContinueSwal\", \"CancelSwal\", \"SavedRoundingRulesSwal\", \"TheProcessContinues\", \"TheProcessOfContinuousStorageSwal\", \"ErrorTitleSwal\", \"ErrorWhenSavingTheseRoundingRules\", \"WarningSwal\", \"YouMustSaveSwal\", \"RoundingEndingValidation1\", \"RoundingEndingValidation2\", \"RoundingEndingValidation3\", \"RoundingEndingValidation4\", \"RoundingEndingValidation5\", \"RoundingEndingValidation6\", \"RoundingEndingValidation7\", \"RoundingEndingValidation8\", \"RoundingEndingValidation9\", \"EditRoundingRuleTitle\", \"NewRoundingRuleTitle\", \"Markdown\", \"Promotion\"\r\n , \"Competitive\", \"Regular\", \"RoundingStandard\", \"PricePoints\", \"Terminations\", \"ToNearest\", \"ToDown\", \"ToUp\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n self.types = [\r\n //{\r\n // id: 0,\r\n // value: \"Vigente\"\r\n //},\r\n //{\r\n // id: 1,\r\n // value: \"Excepcion\"\r\n //},\r\n {\r\n id: 2,\r\n value: translations.Markdown\r\n },\r\n //{\r\n // id: 3,\r\n // value: \"Bonus\"\r\n //},\r\n {\r\n id: 4,\r\n value: translations.Promotion\r\n },\r\n {\r\n id: 5,\r\n value: translations.Competitive\r\n },\r\n {\r\n id: 6,\r\n value: translations.Regular\r\n }\r\n ];\r\n\r\n self.priceRoundingTypes = [\r\n {\r\n id: 1,\r\n value: translations.RoundingStandard\r\n },\r\n {\r\n id: 2,\r\n value: translations.PricePoints\r\n },\r\n {\r\n id: 3,\r\n value: translations.Terminations\r\n }\r\n ];\r\n\r\n self.priceRoundingMidPointTypes = [\r\n {\r\n id: 0,\r\n value: translations.ToNearest\r\n },\r\n {\r\n id: 1,\r\n value: translations.ToDown\r\n },\r\n {\r\n id: 2,\r\n value: translations.ToUp\r\n }\r\n ];\r\n\r\n loadPriceRoundings();\r\n });\r\n\r\n\r\n }\r\n\r\n init();\r\n\r\n });","angular.module(\"prisma\")\r\n .controller(\"PriceMapCtrl\", function ($state, $stateParams, $scope, $rootScope, $filter, priceService, homeService) {\r\n var self = this;\r\n\r\n var priceMap = null;\r\n var country = '';\r\n\r\n self.priceSurveys = [];\r\n self.allPriceList = [{}];\r\n self.selectedPriceList = null;\r\n self.selectedPriceListName = '';\r\n self.itemName = \"\";\r\n self.itemCode = \"\";\r\n\r\n var markers = [];\r\n var markersLayer = new L.FeatureGroup();\r\n\r\n self.navigateToCompetitor = function (id) {\r\n for (var m in markers) {\r\n var marker = markers[m];\r\n if (marker && marker.options && id == marker.options.id) {\r\n\r\n priceMap.setView(marker._latlng, 14);\r\n marker.openPopup();\r\n };\r\n }\r\n }\r\n\r\n self.FilterByPriceList = function (priceList, reload) {\r\n self.selectedPriceList = priceList;\r\n\r\n if (priceList != null)\r\n self.selectedPriceListName = priceList.name;\r\n else\r\n self.selectedPriceListName = '';\r\n\r\n if (reload)\r\n loadData(priceList != null ? priceList.id : null);\r\n }\r\n\r\n function loadData(priceListId) {\r\n\r\n priceService.pricesurveys.onlyActive($stateParams.itemId, priceListId, true)\r\n .then(function (priceSurveys) {\r\n\r\n //Borro el Layer de los Markers\r\n priceMap.removeLayer(markersLayer);\r\n\r\n self.priceSurveys = priceSurveys;\r\n\r\n if (self.priceSurveys.length > 0) {\r\n self.itemName = self.priceSurveys[0].itemName;\r\n self.itemCode = self.priceSurveys[0].itemCode;\r\n }\r\n\r\n priceSurveys.forEach(function (priceSurvey) {\r\n\r\n if (priceSurvey.competitorLat != null && priceSurvey.competitorLong != null) {\r\n var competitorIcon = L.icon({\r\n iconUrl: 'assets/images/competitors/' + priceSurvey.competitorLogo,\r\n\r\n iconSize: [24, 24], // size of the icon\r\n iconAnchor: [0, 0], // point of the icon which will correspond to marker's location\r\n popupAnchor: [12, 6] // point from which the popup should open relative to the iconAnchor\r\n });\r\n\r\n var marker = L.marker([priceSurvey.competitorLat, priceSurvey.competitorLong], { id: priceSurvey.id, icon: competitorIcon }).addTo(priceMap)\r\n .bindPopup('' + priceSurvey.competitorCode + ' | ' + priceSurvey.competitor + '
' + $filter('currency')(priceSurvey.price) + '
' + $filter('date')(priceSurvey.observedDate, 'MMM d, y'));\r\n\r\n markersLayer.addLayer(marker);\r\n\r\n markers.push(marker);\r\n }\r\n });\r\n\r\n priceMap.addLayer(markersLayer);\r\n });\r\n }\r\n\r\n function loadPriceLists()\r\n {\r\n priceService.pricelists.getPriceLists()\r\n .then(function (priceLists) {\r\n self.priceLists = priceLists;\r\n\r\n //var priceListQuevieneDelarametro = $stateParams.priceListId;\r\n\r\n for (i = 0 ; i < self.priceLists.length ; i++) {\r\n if (self.priceLists[i].id == $stateParams.priceListId) {\r\n self.FilterByPriceList(self.priceLists[i], false);\r\n }\r\n }\r\n\r\n loadData($stateParams.priceListId);\r\n });\r\n }\r\n\r\n function init() {\r\n\r\n homeService.dashboards.getCountry()\r\n .then(function (c) {\r\n country = c;\r\n\r\n if (country == \"Peru\") {\r\n priceMap = L.map('priceMapid').setView([-8.8822898, -73.7699384], 5); //Per�\r\n self.moneySymbol = '$';\r\n }\r\n if (country == \"Colombia\") {\r\n priceMap = L.map('priceMapid').setView([1.8822898, -73.7699384], 5); //Colombia\r\n self.moneySymbol = '$';\r\n }\r\n else if (country == \"Argentina\") {\r\n priceMap = L.map('priceMapid').setView([-38.005, -61.0739], 4); //Argentina\r\n self.moneySymbol = '$';\r\n }\r\n else if (country == \"Mexico\") {\r\n priceMap = L.map('priceMapid').setView([21.695501, -101.666045], 5); //Mexico\r\n self.moneySymbol = '$';\r\n }\r\n\r\n L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\r\n attribution: '© OpenStreetMap',\r\n subdomains: ['a', 'b', 'c']\r\n }).addTo(priceMap);\r\n\r\n\r\n loadPriceLists();\r\n });\r\n }\r\n\r\n init();\r\n });\r\n\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"PricelistsSubsidiesCtrl\", function ($scope, $state, $stateParams, priceService, $timeout, $translate) {\r\n\r\n //Variable globales\r\n\r\n var self = this;\r\n\r\n self.pricelistsSubsidies = [];\r\n\r\n self.decimalFormat = function (value) {\r\n if (value) {\r\n return value.toFixed(2);\r\n }\r\n }\r\n\r\n function loadPriceListsSubsidies() {\r\n priceService.pricelistsSubsidies.getAllPricelistsSubsidies()\r\n .then(function (pricelistsSubsidies) {\r\n self.pricelistsSubsidies = pricelistsSubsidies;\r\n });\r\n }\r\n\r\n //Funciones\r\n\r\n self.generateSuggestions = function () {\r\n swal({\r\n title: translations.GenerateSuggestionsSwal,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n priceService.costs.saveAndGenerateSuggestions()\r\n .then(function (isOk) {\r\n swal(translations.SuggestionsGenerated, translations.SuggestionsGeneratedSubtitle, \"success\");\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(translations.TheProcessContinues, translations.TheSuggestionsContinueToBeGeneratedSwal)\r\n }\r\n else {\r\n swal(translations.ErrorTitleSwal, translations.ErrorWhenGeneratingSuggestionsForThisCategorySwal, \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n\r\n self.disablePriceListSubsidy = function (id, excluded) {\r\n var excludedText = excluded ? translations.EnableTooltip : translations.ToDisable;\r\n swal({\r\n title: translations.AreYouSureSwalTitle + excludedText + translations.TheSubsidy,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n\r\n if (isConfirm) {\r\n priceService.pricelistsSubsidies.deletePricelistSubsidy(id).then(function () {\r\n swal(\"\", translations.UpdatedSubsidies, \"success\");\r\n loadPriceListsSubsidies();\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(translations.TheProcessContinues);\r\n }\r\n else {\r\n swal(translations.ErrorTitleSwal, translations.ErrorDisablingSubsidy, \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.editPricelistSubsidies = function (id) {\r\n $state.go('prices.editPricelistSubsidies', { priceListSubsidyId: id });\r\n }\r\n\r\n self.addNew = function () {\r\n $state.go('prices.editPricelistSubsidy', { priceListSubsidyId: 0 });\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n $translate([\"GenerateSuggestionsSwal\", \"ContinueSwal\", \"CancelSwal\", \"SuggestionsGenerated\", \"SuggestionsGeneratedSubtitle\"\r\n , \"TheProcessContinues\", \"TheSuggestionsContinueToBeGeneratedSwal\", \"ErrorTitleSwal\", \"ErrorWhenGeneratingSuggestionsForThisCategorySwal\"\r\n , \"AreYouSureSwalTitle\", \"TheSubsidy\", \"UpdatedSubsidies\", \"ErrorDisablingSubsidy\", \"EnableTooltip\", \"ToDisable\"])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n loadPriceListsSubsidies();\r\n }\r\n\r\n if ($stateParams.reload) {\r\n loadPriceListsSubsidies();\r\n }\r\n\r\n init();\r\n\r\n });","angular.module(\"prisma\")\r\n .controller(\"EditPricelistSubsidiesCtrl\", function ($scope, $state, $stateParams, priceService, adminService, $timeout, $translate) {\r\n\r\n //Variable globales\r\n var self = this;\r\n self.selectedPriceList = '';\r\n self.priceLists = [];\r\n self.items = [];\r\n\r\n self.priceListSubsidy = {\r\n id: 0,\r\n priceListCode : '',\r\n priceListId : 0,\r\n itemId : 0,\r\n itemCode : '',\r\n truckCost : 0,\r\n subsidy: 0,\r\n isExcluded: false\r\n }\r\n\r\n self.item = {\r\n id: 0,\r\n code: '',\r\n name: ''\r\n };\r\n\r\n self.itemSelected = function () {\r\n angular.forEach(self.items, function (item) {\r\n if (item.id == self.priceListSubsidy.itemId) {\r\n console.log(item);\r\n self.priceListSubsidy.itemCode = item.code;\r\n }\r\n });\r\n }\r\n\r\n self.priceListSelected = function () {\r\n angular.forEach(self.priceLists, function (item) {\r\n if (item.id == self.priceListSubsidy.priceListId) {\r\n console.log(item);\r\n self.priceListSubsidy.priceListId = item.id;\r\n self.priceListSubsidy.priceListCode = item.code;\r\n }\r\n });\r\n }\r\n\r\n self.save = function () {\r\n var title = translations.SaveSubsidy;\r\n swal({\r\n title: title,\r\n text: '',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.Save,\r\n cancelButtonText: translations.Cancel,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n priceService.pricelistsSubsidies.savePricelistSubsidy(self.priceListSubsidy)\r\n .then(function (status) {\r\n swal(translations.SavedSubsidy, translations.SavedSubsidySubtitle, 'success');\r\n\r\n $state.go('prices.priceListsSubsidies', {reload: true});\r\n },\r\n function () {\r\n swal(translations.ErrorTitleSwal, translations.ErrorToSaveSubsidy, 'error');\r\n\r\n });\r\n }\r\n });\r\n }\r\n\r\n function getPricelistSubsidy(id) {\r\n\r\n priceService.pricelistsSubsidies.getPricelistSubsidy(id)\r\n .then(function (pl) {\r\n self.priceListSubsidy = pl;\r\n });\r\n }\r\n\r\n function getItems() {\r\n priceService.costs.getItems()\r\n .then(function (items) {\r\n self.items = items;\r\n });\r\n }\r\n\r\n function getPriceLists() {\r\n priceService.pricelists.getPriceLists()\r\n .then(function (priceLists) {\r\n self.priceLists = priceLists;\r\n })\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n $translate([\"SaveSubsidy\", \"Save\", \"Cancel\", \"SavedSubsidy\", \"SavedSubsidySubtitle\", \"ErrorTitleSwal\", \"ErrorToSaveSubsidy\"])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n\r\n getItems();\r\n getPriceLists();\r\n\r\n var priceListSubsidyId = $stateParams.priceListSubsidyId;\r\n if (priceListSubsidyId != 0)\r\n getPricelistSubsidy(priceListSubsidyId);\r\n }\r\n\r\n init();\r\n\r\n });\r\n\r\n\r\n\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"PricelistsCtrl\", function ($scope, $state, priceService, adminService, $timeout, $translate) {\r\n\r\n //Variable globales\r\n\r\n var self = this;\r\n self.companyCode = companyJson.Erp.Implementation;\r\n self.order = self.companyCode == 'LaRebaja' ? 'departament' : 'name';\r\n self.pricelists = [];\r\n\r\n function loadPriceLists() {\r\n priceService.pricelists.getAllPricelists()\r\n .then(function (pricelists) {\r\n self.pricelists = pricelists;\r\n });\r\n adminService.priceLists.getStorePriceLists()\r\n .then(function (storePricelists) {\r\n self.storePriceLists = storePricelists;\r\n });\r\n }\r\n\r\n //Funciones\r\n\r\n function getStorePriceListNames(priceListId) {\r\n let storeNames = [];\r\n self.storePriceLists.forEach(function (spl) {\r\n if (spl.priceListId == priceListId)\r\n storeNames.push(spl.storeName);\r\n });\r\n return storeNames;\r\n }\r\n\r\n self.disablePriceList = function (id, excluded) {\r\n var excludedText = excluded ? translations.EnableSwal : translations.ToDisableSwal;\r\n var storeNames = getStorePriceListNames(id);\r\n swal({\r\n title: translations.AreYouSureSwalTitle + excludedText + translations.TheZoneSwal + \"?\",\r\n text: storeNames.length > 0 ? translations.WarningStoresSwal + storeNames.join(', ') + translations.BelongZoneSwall : \"\",\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n\r\n if (isConfirm) {\r\n\r\n priceService.pricelists.deletePricelist(id).then(function () {\r\n swal(\"\", translations.UpdatedZonesSwal, \"success\");\r\n loadPriceLists();\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(translations.TheProcessContinuesSwal);\r\n }\r\n else {\r\n swal(translations.ErrorTitleSwal, translations.ErrorWhenDisablingTheZoneSwal, \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.editPricelist = function (id) {\r\n $state.go('prices.editPricelist', { priceListId: id });\r\n }\r\n\r\n self.addNew = function () {\r\n $state.go('prices.editPricelist', { priceListId: 0 });\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n $translate([\"AreYouSureSwalTitle\", \"EnableSwal\", \"ToDisableSwal\", \"TheZoneSwal\", \"WarningStoresSwal\", \"BelongZoneSwall\", \"CancelSwal\", \"ContinueSwal\", \"UpdatedZonesSwal\", \"TheProcessContinuesSwal\", \"ErrorTitleSwal\", \"ErrorWhenDisablingTheZoneSwal\"])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n loadPriceLists();\r\n }\r\n\r\n init();\r\n\r\n });\r\n\r\n\r\n\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"EditPricelistCtrl\", function ($scope, $state, $stateParams, priceService, adminService, $timeout, $translate) {\r\n\r\n //Variable globales\r\n var self = this;\r\n self.storePriceLists = [];\r\n self.priceList = {\r\n id: 0,\r\n code: '',\r\n name: '',\r\n isNational: false,\r\n isExcluded: false,\r\n isBase: false,\r\n listIndex: -1,\r\n }\r\n\r\n //Funciones\r\n\r\n function getStorePriceListNames(priceListId) {\r\n let storeNames = [];\r\n self.storePriceLists.forEach(function (spl) {\r\n if (spl.priceListId == priceListId)\r\n storeNames.push(spl.storeName);\r\n });\r\n return storeNames;\r\n }\r\n\r\n self.save = function () {\r\n var storeNames = getStorePriceListNames($stateParams.priceListId);\r\n var title = translations.SavePriceZoneSwalTitle;\r\n swal({\r\n title: title,\r\n text: self.priceList.isExcluded && storeNames.length > 0 ? translations.WarningStoresSwal + storeNames.join(', ') + translations.BelongZoneSwall : \"\",\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.SaveSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n priceService.pricelists.savePricelist(self.priceList)\r\n .then(function (status) {\r\n swal(translations.SavedZoneSwal, translations.SavedZoneSwalSubtitle, 'success');\r\n\r\n $state.go('prices.priceLists');\r\n },\r\n function () {\r\n swal(translations.ErrorTitleSwal, translations.ErrorOccurredWhileSavingZoneSwal, 'error');\r\n\r\n });\r\n }\r\n });\r\n }\r\n\r\n\r\n function getPricelist(id) {\r\n\r\n priceService.pricelists.getPricelist(id)\r\n .then(function (pl) {\r\n self.priceList = pl;\r\n });\r\n adminService.priceLists.getStorePriceLists()\r\n .then(function (storePricelists) {\r\n self.storePriceLists = storePricelists;\r\n });\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n $translate([\"SavePriceZoneSwalTitle\", \"WarningStoresSwal\", \"BelongZoneSwall\", \"CancelSwal\", \"SaveSwal\", \"SavedZoneSwal\", \"SavedZoneSwalSubtitle\", \"ErrorOccurredWhileSavingZoneSwal\", \"ErrorTitleSwal\" ])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n var priceListId = $stateParams.priceListId;\r\n if (priceListId != 0)\r\n getPricelist(priceListId);\r\n }\r\n\r\n init();\r\n\r\n });\r\n\r\n\r\n\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"priceOutputCtrl\", function ($scope, priceService, $translate, $rootScope, $window, $timeout) {\r\n var self = this;\r\n\r\n var allSelected = true;\r\n self.loadingPrices = false;\r\n self.informingPrices = false;\r\n\r\n self.pricesToInform = [];\r\n \r\n self.implementation = companyJson.Erp.Implementation;\r\n self.reasons = [];\r\n\r\n self.selectedReasons = [];\r\n self.selectedPriceType = null;\r\n\r\n self.showPriceGrid = false;\r\n\r\n //self.canInform = function () {\r\n // return self.pricesToInform.length > 0;\r\n //}\r\n\r\n\r\n self.informToErp = function () {\r\n\r\n //if (!self.canInform()) {\r\n // swal(\"No hay precios a informar\", \"Los filtros seleccionados no han devuelto ningun precio a informar.\", \"warning\");\r\n // return;\r\n //}\r\n\r\n var title = translations.ReportFilteredPricesToTheERP;\r\n var text = '';\r\n var closeOnConfirm = false;\r\n\r\n\r\n var swalOptions = {\r\n title: title,\r\n text: text,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: closeOnConfirm,\r\n closeOnCancel: true\r\n }\r\n swal(swalOptions, doInform);\r\n }\r\n\r\n function doInform(isConfirm) {\r\n\r\n if (!isConfirm)\r\n return;\r\n\r\n self.informingPrices = true;\r\n //preparo el dto reducido para el save\r\n //var idsToInform = getIdsToInform();\r\n\r\n var filters = {\r\n priceTypeId: self.selectedPriceType,\r\n reasons: (self.selectedPriceType == 4 || self.selectedPriceType == 5 || self.selectedPriceType == 6 || self.selectedPriceType == 2) ? self.selectedReasons.map(function (x) { return x.reason }) : [], //Solo lo envio si tengo precios de promocion o Competencia o Regular\r\n }\r\n\r\n if (self.implementation != 'LaRebaja' && filters.priceTypeId == null) {\r\n self.informingPrices = false;\r\n swalOptions.showLoaderOnConfirm = false; //fix queda cargando si no se elige motivo o type\r\n swal(translations.YouMustSelectAPriceType, translations.YouMustSelectAPriceTypeSubtitle, \"error\");\r\n }\r\n else if (self.implementation != 'LaRebaja' && (filters.priceTypeId == 4 || filters.priceTypeId == 5 || filters.priceTypeId == 6 || self.selectedPriceType == 2) && filters.reasons.length == 0) {\r\n self.informingPrices = false;\r\n swalOptions.showLoaderOnConfirm = false; //fix queda cargando si no se elige motivo o type\r\n swal(translations.YouMustSelectAReason, translations.YouMustSelectAReasonSubtitle, \"error\");\r\n }\r\n else {\r\n\r\n priceService.priceOutput.informToErp(filters).then(function (informResult) {\r\n\r\n ////DESCARGAR AUTOMATICAMENTE EL EXCEL\r\n //if (informResult && informResult.generatedReportUrl) {\r\n // $window.open(informResult.generatedReportUrl);\r\n //}\r\n\r\n swal(translations.GeneratedPriceReport, translations.GeneratedPriceReportSubtitle, \"success\");\r\n\r\n //Vuelvo a cargar la info\r\n //self.getFilteredPrices();\r\n loadPreviousReports();\r\n\r\n loadPreviousReports();\r\n self.informingPrices = false;\r\n },\r\n function (fallback) {\r\n console.log(fallback);\r\n self.informingPrices = false;\r\n swal(translations.ErrorTitleSwal, translations.AnErrorHasOccurred, \"error\");\r\n });\r\n\r\n }\r\n }\r\n\r\n self.downloadLastReport = function () {\r\n priceService.priceOutput.downloadLastOutput().then(function (reportUrl) {\r\n if (reportUrl) {\r\n $window.open(reportUrl);\r\n }\r\n });\r\n }\r\n\r\n self.downloadFile = function (url) {\r\n $window.open(url);\r\n }\r\n\r\n //self.getFilteredPrices = function () {\r\n\r\n // self.showPriceGrid = true;\r\n\r\n // //if (self.gridOptions.api)\r\n // // self.gridOptions.api.showLoadingOverlay();\r\n\r\n // var filters = {\r\n // priceTypeId: self.selectedPriceType,\r\n // reasons: (self.selectedPriceType == 4 || self.selectedPriceType == 5) ? self.selectedReasons.map(function (x) { return x.reason }) : [], //Solo lo envio si tengo precios de promocion o Competencia\r\n // }\r\n\r\n // if (filters.priceTypeId == null)\r\n // swal(\"Debe seleccionar un tipo de precio.\", \" No se ha seleccionado ningun tipo de precio.\", \"error\");\r\n // else if ((filters.priceTypeId == 4 || filters.priceTypeId == 5) && filters.reasons.length == 0) {\r\n // swal(\"Debe seleccionar un motivo para estos tipos de precio.\", \" En el caso de que no aparezca ninguno, no existen precios a informar del tipo seleccionado.\", \"error\");\r\n // }\r\n // else {\r\n // self.loadingPrices = true;\r\n // priceService.priceOutput.getStorePricesToInformFiltered(filters)\r\n // .then(function (pricesToInform) {\r\n // self.pricesToInform = pricesToInform;\r\n // self.loadingPrices = false;\r\n\r\n // //self.gridOptions.api.setRowData(pricesToInform);\r\n // });\r\n // }\r\n //}\r\n\r\n ////grid config\r\n \r\n\r\n //function setColumnDefinitions() {\r\n // var colWidth = 50;\r\n\r\n // columnDefs = [\r\n // {\r\n // headerName: 'Informacion Básica',\r\n // children: [\r\n // {\r\n // headerName: \"Tienda\",\r\n // field: \"storeCode\",\r\n // checkboxSelection: true,\r\n // headerCheckboxSelection: true,\r\n // headerCheckboxSelectionFilteredOnly: true,\r\n // pinned: 'left',\r\n // width: colWidth + 20,\r\n // cellClass: $rootScope.getClassForCel\r\n // },\r\n // {\r\n // headerName: \"Limite\",\r\n // field: \"storeLimit\",\r\n // pinned: 'left',\r\n // width: colWidth + 20,\r\n // },\r\n // {\r\n // headerName: \"Activo\",\r\n // field: \"isListed\",\r\n // pinned: 'left',\r\n // width: colWidth + 20,\r\n // valueGetter: 'data.isListed ? \"Sí\" : \"No\"'\r\n // },\r\n // {\r\n // headerName: \"Subcat. Cod\",\r\n // field: \"subcategoryCode\",\r\n // columnGroupShow: 'open',\r\n // pinned: 'left',\r\n // width: colWidth + 50,\r\n // cellClass: $rootScope.getClassForCell\r\n // },\r\n // {\r\n // headerName: \"Subcategoría\",\r\n // field: \"subcategory\",\r\n // pinned: 'left',\r\n // width: colWidth + 50,\r\n // cellClass: $rootScope.getClassForCell\r\n // },\r\n // {\r\n // headerName: \"Codigo\",\r\n // field: \"itemCode\",\r\n // pinned: 'left',\r\n // width: colWidth + 50,\r\n // cellClass: $rootScope.getClassForCell\r\n // },\r\n // {\r\n // headerName: \"Descripcion\",\r\n // field: \"itemName\",\r\n // pinned: 'left',\r\n // width: colWidth + 200,\r\n // cellClass: $rootScope.getClassForCell\r\n // },\r\n // {\r\n // headerName: \"UM\",\r\n // field: \"unitOfMeasureCode\",\r\n // headerTooltip: \"Unidad de Medida de Venta\",\r\n // pinned: 'left',\r\n // width: colWidth + 10,\r\n // cellClass: $rootScope.getClassForCell\r\n // }]\r\n // },\r\n // {\r\n // headerName: 'Información Adicional',\r\n // children: [{\r\n // headerName: \"Desc. Tienda\",\r\n // columnGroupShow: 'open',\r\n // field: \"storeName\",\r\n // //pinned: 'left',\r\n // width: colWidth + 200,\r\n // cellClass: $rootScope.getClassForCell\r\n // },\r\n // {\r\n // headerName: \"Sector\",\r\n // field: \"categoryGroup\",\r\n // //pinned: 'left',\r\n // width: colWidth + 50,\r\n // cellClass: $rootScope.getClassForCell\r\n // },\r\n // {\r\n // headerName: \"Categoría\",\r\n // field: \"category\",\r\n // //pinned: 'left',\r\n // width: colWidth + 50,\r\n // cellClass: $rootScope.getClassForCell\r\n // },\r\n // {\r\n // headerName: \"EAN\",\r\n // field: \"itemEan\",\r\n // columnGroupShow: 'open',\r\n // headerTooltip: \"\",\r\n // //pinned: 'left',\r\n // width: colWidth + 100,\r\n // cellClass: $rootScope.getClassForCell\r\n // }]\r\n // },\r\n // {\r\n // headerName: 'Precio',\r\n // children: [\r\n // {\r\n // headerName: \"TP\",\r\n // field: \"priceTypeDesc\",\r\n // width: 100,\r\n // filter: 'text',\r\n // cellClass: $rootScope.getClassForCell,\r\n // },\r\n // {\r\n // headerName: \"Actual\",\r\n // field: \"price\",\r\n // width: 100,\r\n // filter: 'number',\r\n // cellClass: $rootScope.getClassForCell,\r\n // cellRenderer: $rootScope.moneyRenderer\r\n // },\r\n // {\r\n // headerName: \"Nuevo\",\r\n // field: \"newPrice\",\r\n // width: 100,\r\n // filter: 'number',\r\n // cellClass: $rootScope.getClassForCell,\r\n // cellRenderer: $rootScope.moneyRenderer\r\n // },\r\n // {\r\n // headerName: \"F.Desde\",\r\n // field: \"newValidFromExtended\",\r\n // width: 90,\r\n // filter: 'text',\r\n // cellRenderer: $rootScope.dateRenderer\r\n // },\r\n // {\r\n // headerName: \"F.Hasta\",\r\n // field: \"newValidToExtended\",\r\n // width: 90,\r\n // filter: 'text',\r\n // cellRenderer: $rootScope.dateRenderer\r\n // },\r\n // {\r\n // headerName: \"Motivo\",\r\n // field: \"reason\",\r\n // width: 200,\r\n // filter: 'text',\r\n // }]\r\n // }]\r\n //}\r\n\r\n //function setGridOptions() {\r\n\r\n // setColumnDefinitions();\r\n\r\n\r\n // self.gridOptions = {\r\n // columnDefs: columnDefs,\r\n // enableColResize: true,\r\n // enableSorting: true,\r\n // enableFilter: true,\r\n // groupHeaders: true,\r\n // groupKeys: undefined, //set as string of keys eg [\"region\",\"country\"],\r\n // groupHideGroupColumns: true,\r\n // //groupUseEntireRow: false,\r\n // groupSelectsChildren: false,\r\n // rowHeight: 30,\r\n // rowSelection: \"multiple\", // one of ['single','multiple'], leave blank for no selection\r\n // suppressRowClickSelection: true,\r\n // singleClickEdit: true,\r\n // icons: {\r\n // columnRemoveFromGroup: '',\r\n // filter: '',\r\n // sortAscending: '',\r\n // sortDescending: '',\r\n // groupExpanded: '',\r\n // groupContracted: '',\r\n // columnGroupOpened: '',\r\n // columnGroupClosed: ''\r\n // },\r\n // suppressColumnMoveAnimation: $rootScope.suppressColumnMoveAnimation,\r\n // suppressCellSelection: true,\r\n // enableRangeSelection: false,\r\n // //angularCompileRows: true,\r\n // //onSelectionChanged: function () {\r\n // // $timeout(function () {\r\n // // self.selectedCount = self.gridOptions.api.getSelectedRows().length;\r\n // // }, 0);\r\n // //}\r\n // }\r\n //}\r\n\r\n //function getIdsToInform() {\r\n\r\n // var idsToInform = self.pricesToInform.map(function (p) {\r\n // return {\r\n // priceType: p.priceTypeId,\r\n // subcategoryId: p.subcategoryId,\r\n // itemId: p.itemId,\r\n // unitOfMeasureId: p.unitOfMeasureId,\r\n // storeId: p.storeId,\r\n // reason: p.reason,\r\n // }\r\n // })\r\n\r\n // return idsToInform;\r\n //}\r\n\r\n\r\n\r\n function loadData() {\r\n\r\n loadPreviousReports();\r\n\r\n }\r\n\r\n self.getReasonsFilter = function () {\r\n self.loadingReasons = true;\r\n\r\n priceService.priceOutput.getReasonsFilter(self.selectedPriceType).then(function (reasons) {\r\n self.reasons = reasons;\r\n self.loadingReasons = false;\r\n },\r\n function (fallback) {\r\n self.loadingReasons = false;\r\n console.log(fallback);\r\n });\r\n }\r\n\r\n function loadPreviousReports() {\r\n priceService.priceOutput.getLastOutputReports()\r\n .then(function (reports) {\r\n self.generatedFiles = reports;\r\n });\r\n\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n $translate([\"ReportFilteredPricesToTheERP\", \"YouMustSelectAPriceType\", \"YouMustSelectAPriceTypeSubtitle\"\r\n , \"YouMustSelectAReason\", \"YouMustSelectAReasonSubtitle\", \"GeneratedPriceReport\", \"GeneratedPriceReportSubtitle\"\r\n , \"ErrorTitleSwal\", \"AnErrorHasOccurred\", \"CancelSwal\", \"ContinueSwal\", \"Normal\", \"Competitive\", \"Liquidation\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n self.distinctPriceTypes = [\r\n { id: 6, name: translations.Normal },\r\n { id: 5, name: translations.Competitive },\r\n //{ id: 4, name: \"Promoción y Bonus\" },\r\n //{ id: 3, name: \"Bonus\" },\r\n { id: 2, name: translations.Liquidation }\r\n ];\r\n });\r\n\r\n //setGridOptions();\r\n\r\n loadData();\r\n }\r\n\r\n init();\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"priceOutputWSCtrl\", function ($scope, priceService, $rootScope, $window, $timeout) {\r\n var self = this;\r\n var allSelected = true;\r\n\r\n self.isOpen = false;\r\n var date = new Date();\r\n date.setDate(date.getDate() + 1);\r\n date.setHours(0)\r\n date.setMinutes(0);\r\n self.useCustomDate = false;\r\n self.dateToInform = date;\r\n self.pricesToInform = [];\r\n self.distinctPriceTypes = [\"Todos\", \"Regular\", \"Competition\", \"Promotion\", \"Bonus\"]\r\n\r\n self.openCalendar = function (e) {\r\n //e.preventDefault();\r\n //e.stopPropagation();\r\n\r\n //console.log('self.dateToInform', self.dateToInform);\r\n\r\n\r\n self.isOpen = !self.isOpen;\r\n };\r\n\r\n self.toggleSelection = function () {\r\n\r\n if (self.gridOptions.api.isAnyFilterPresent()) {\r\n //selecciono solo los filtrados\r\n self.gridOptions.api.forEachNodeAfterFilter(function (node) {\r\n node.setSelected(!allSelected);\r\n });\r\n }\r\n else {\r\n //selecciono todos\r\n allSelected ? self.gridOptions.api.deselectAll() : self.gridOptions.api.selectAll();\r\n }\r\n\r\n //toggle select / deselect\r\n allSelected = !allSelected;\r\n }\r\n\r\n self.importPrices = function () {\r\n\r\n swal({\r\n title: 'Esta seguro que desea importar precios manualmente para todas las estaciones?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n //seteo la propiedad isSelected segun los items seleccionados en la grilla\r\n self.gridOptions.api.forEachNode(function (node) {\r\n node.data.isSelected = node.isSelected();\r\n });\r\n\r\n //envio todo el paquete con el isSelected\r\n priceService.priceOutput.importPrices().then(function (result) {\r\n\r\n swal('Precios importados!', 'Se han importados precios para todas las estaciones desde el ERP', 'success');\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al querer Informar estos precios al ERP\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.informToErp = function () {\r\n\r\n swal({\r\n title: 'Esta seguro que desea Informar los precios seleccionados al ERP?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n if (self.useCustomDate) {\r\n console.log('usecustomDate', self.dateToInform.toISOString());\r\n angular.forEach(self.pricesToInform, function (price) {\r\n price.customValidFrom = self.dateToInform.toISOString();\r\n });\r\n }\r\n\r\n //seteo la propiedad isSelected segun los items seleccionados en la grilla\r\n self.gridOptions.api.forEachNode(function (node) {\r\n node.data.isSelected = node.isSelected();\r\n });\r\n\r\n //envio todo el paquete con el isSelected\r\n priceService.priceOutput.informToOxxoErp(self.pricesToInform).then(function (result) {\r\n //if (reportUrl) {\r\n // $window.open(reportUrl);\r\n //}\r\n\r\n console.log('result', result.storePricesToInform);\r\n var aux = [];\r\n angular.forEach(result.storePricesToInform, function (s) {\r\n if (s.itemName != '' && s.itemName != undefined)\r\n aux.push(s);\r\n });\r\n\r\n $timeout(function () {\r\n self.pricesToInform = aux;\r\n self.gridOptions.api.setRowData(aux);\r\n\r\n })\r\n\r\n\r\n //for (var i = 0; i < self.pricesToInform.length; i++) {\r\n // for (var j = 0; j < result.length; j++) {\r\n\r\n // }\r\n\r\n //}\r\n\r\n swal('Reporte de Precios Generado!', 'Se genero el reporte de precios exitosamente para informar los cambios al ERP', 'success');\r\n\r\n //Vuelvo a cargar la info\r\n //loadData();\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"El proceso de guardado continua. Puede revisar el estado en unos minutos.\")\r\n }\r\n else {\r\n console.log(status);\r\n swal(\"Error\", \"Hubo un error al querer Informar estos precios al ERP\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.filterByPriceType = function (type) {\r\n if (type == 'Todos')\r\n self.selectedFilterForPriceType = null;\r\n else if (self.selectedFilterForPriceType != type) {\r\n self.selectedFilterForPriceType = type;\r\n }\r\n\r\n self.gridOptions.api.onFilterChanged();\r\n }\r\n\r\n self.downloadLastReport = function () {\r\n priceService.priceOutput.downloadLastOutput().then(function (reportUrl) {\r\n if (reportUrl) {\r\n $window.open(reportUrl);\r\n }\r\n });\r\n }\r\n\r\n self.downloadFile = function (url) {\r\n $window.open(url);\r\n }\r\n\r\n\r\n //grid config\r\n\r\n function setColumnDefinitions() {\r\n var colWidth = 50;\r\n\r\n columnDefs = [\r\n\r\n {\r\n headerName: \"Estacion\",\r\n field: \"storeCode\",\r\n checkboxSelection: false,\r\n headerCheckboxSelection: true,\r\n headerCheckboxSelectionFilteredOnly: true,\r\n width: colWidth + 40,\r\n cellClass: $rootScope.getClassForCel\r\n },\r\n {\r\n headerName: \"Desc. Estacion\",\r\n field: \"storeName\",\r\n //pinned: 'left',\r\n width: colWidth + 200,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Zona\",\r\n field: \"priceListName\",\r\n width: 100,\r\n filter: 'text',\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n {\r\n headerName: \"Codigo\",\r\n field: \"itemCode\",\r\n width: colWidth + 50,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Descripcion\",\r\n field: \"itemName\",\r\n width: colWidth + 200,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"UM\",\r\n field: \"unitOfMeasureCode\",\r\n headerTooltip: \"Unidad de Medida de Venta\",\r\n width: colWidth + 10,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Tipo\",\r\n field: \"priceTypeDesc\",\r\n width: 100,\r\n filter: 'text',\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n {\r\n headerName: \"Actual\",\r\n field: \"price\",\r\n width: 100,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRenderer\r\n },\r\n {\r\n headerName: \"Nuevo\",\r\n field: \"newPrice\",\r\n width: 100,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRenderer\r\n },\r\n {\r\n headerName: \"F.Desde\",\r\n field: \"newValidFromExtended\",\r\n width: 90,\r\n filter: 'number',\r\n cellRenderer: $rootScope.dateRenderer\r\n },\r\n {\r\n headerName: \"Valido\",\r\n field: \"isValid\",\r\n width: 75,\r\n cellRenderer: {\r\n renderer: 'group',\r\n checkbox: false,\r\n innerRenderer: function (params) {\r\n //console.log('params', params);\r\n\r\n if (params.data.isValid == undefined) {\r\n return;\r\n }\r\n\r\n if (params.data.isValid == true) {\r\n return '';\r\n }\r\n\r\n if (params.data.isValid == false) {\r\n return '';\r\n }\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n\r\n function setGridOptions() {\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: true,\r\n groupHeaders: true,\r\n groupKeys: undefined, //set as string of keys eg [\"region\",\"country\"],\r\n groupHideGroupColumns: true,\r\n //groupUseEntireRow: false,\r\n groupSelectsChildren: false,\r\n rowHeight: 30,\r\n rowSelection: \"multiple\", // one of ['single','multiple'], leave blank for no selection\r\n singleClickEdit: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n suppressColumnMoveAnimation: $rootScope.suppressColumnMoveAnimation,\r\n suppressCellSelection: true,\r\n enableRangeSelection: false,\r\n angularCompileRows: true,\r\n isExternalFilterPresent: isExternalFilterPresent,\r\n doesExternalFilterPass: doesExternalFilterPass,\r\n onGridSizeChanged: function (params) {\r\n self.gridOptions.api.sizeColumnsToFit();\r\n }\r\n }\r\n }\r\n\r\n function isExternalFilterPresent() {\r\n return self.selectedFilterForPriceType != null;\r\n }\r\n function doesExternalFilterPass(node) {\r\n return node.data.priceTypeDesc == self.selectedFilterForPriceType;\r\n }\r\n\r\n function loadData() {\r\n\r\n if (self.gridOptions.api)\r\n self.gridOptions.api.showLoadingOverlay();\r\n\r\n priceService.priceOutput.getLastOutputReports()\r\n .then(function (reports) {\r\n self.generatedFiles = reports;\r\n\r\n\r\n });\r\n\r\n priceService.priceOutput.getStorePricesToInform()\r\n .then(function (pricesToInform) {\r\n\r\n angular.forEach(pricesToInform, function (price) {\r\n price.isValid = undefined;\r\n });\r\n\r\n self.pricesToInform = pricesToInform;\r\n self.gridOptions.api.setRowData(pricesToInform);\r\n\r\n self.gridOptions.api.forEachNode(function (node) {\r\n node.setSelected(node.data.isSelected);\r\n });\r\n\r\n self.gridOptions.api.sizeColumnsToFit();\r\n\r\n });\r\n\r\n\r\n }\r\n\r\n function init() {\r\n\r\n setGridOptions();\r\n\r\n loadData();\r\n }\r\n\r\n init();\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"ItemSensitivitiesCtrl\", function ($scope, priceService, $translate) {\r\n var self = this;\r\n\r\n self.itemSensivilities = [];\r\n\r\n self.isLoading = true;\r\n\r\n function loadData() {\r\n\r\n priceService.itemSensitivities.getItemSensitivities() //Servicio (que esta mencionado ariba en el controller), Nombre del objeto ue tiene el srv que queres usar (ItemSensivilities), Despues el Metodo que queres llamar, pasando los parametros q sean necesarios.\r\n .then(function (sensivilities) { //Entre parentesis, esta lo que devuelve el servicio (En este caso, un listado de itemSensivilities)\r\n self.itemSensivilities = sensivilities;\r\n\r\n self.isLoading = false;\r\n });\r\n }\r\n\r\n self.devolverTextual = function (dias) {\r\n if (dias == 0)\r\n return translations.Never;\r\n else if (dias == 1)\r\n return translations.Daily;\r\n else if (dias == 7)\r\n return translations.Weekly;\r\n else if (dias == 15)\r\n return translations.Biweekly;\r\n else if (dias == 30)\r\n return translations.Monthly;\r\n else if (dias == 30)\r\n return translations.Bimonthly;\r\n else if (dias == 30)\r\n return translations.Quarterly;\r\n else\r\n return dias + translations.Days1;\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n $translate([\"Never\", \"Daily\", \"Weekly\", \"Biweekly\", \"Monthly\", \"Bimonthly\", \"Quarterly\", \"Days1\"])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n loadData();\r\n }\r\n\r\n init();\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"EditItemSensitivityCtrl\", function ($scope, $state, $stateParams, priceService, $translate ) {\r\n var self = this;\r\n\r\n\r\n self.sensitivity = null;\r\n self.surveyFrequencies = [\r\n {\r\n value: 0,\r\n name: \"Never\"\r\n }, {\r\n value: 1,\r\n name: \"Daily\"\r\n }, {\r\n value: 7,\r\n name: \"Weekly\"\r\n }, {\r\n value: 15,\r\n name: \"Biweekly\"\r\n }, {\r\n value: 30,\r\n name: \"Monthly\"\r\n }, {\r\n value: 30,\r\n name:\"Bimonthly\"\r\n\r\n }, {\r\n value: 30,\r\n name:\"Quarterly\"\r\n }\r\n\r\n \r\n ];\r\n\r\n \r\n\r\n if ($stateParams.itemSensitivityId != '0') {\r\n priceService.itemSensitivities.getItemSensitivity($stateParams.itemSensitivityId)\r\n .then(function (itemSensitivity) {\r\n itemSensitivity.validFrom = new Date(itemSensitivity.validFrom);\r\n itemSensitivity.validTo = new Date(itemSensitivity.validTo);\r\n self.sensitivity = itemSensitivity;\r\n });\r\n }\r\n\r\n self.save = function () {\r\n if (self.sensitivity != null) {\r\n swal({\r\n title: translations.SaveSensitivitySwal,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n\r\n priceService.itemSensitivities.saveItemSensitivity(self.sensitivity)\r\n .then(function (itemSensitivity) {\r\n swal(translations.SavedSensitivitySwal, translations.TheSensibilitySwal + self.sensitivity.name + translations.HasBeenSuccessfullySavedSwal, 'success');\r\n\r\n $state.go('prices.itemSensitivities');\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(translations.TheProcessContinuesSwal, translations.TheProcessOfContinuousStorageSwal)\r\n }\r\n else {\r\n swal(translations.ErrorTitleSwal, translations.ErrorSavingSensitivitySwal, \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n }\r\n\r\n self.getTitle = function () {\r\n if ($stateParams.itemSensitivityId != '0')\r\n return translations.EditSensitivityTitle;\r\n else\r\n return translations.NewSensitivityTitle;\r\n }\r\n\r\n self.cleanInputs = function () {\r\n self.sensitivity.monday = false;\r\n self.sensitivity.tuesday = false;\r\n self.sensitivity.wednesday = false;\r\n self.sensitivity.thursday = false;\r\n self.sensitivity.friday = false;\r\n self.sensitivity.saturday = false;\r\n self.sensitivity.sunday = false;\r\n }\r\n\r\n\r\n\r\n self.selectCheckbox = function(day)\r\n {\r\n \r\n if (self.sensitivity.surveyFrequency > 1) {\r\n //Blanqueas todos lo campos\r\n self.cleanInputs();\r\n switch (day) {\r\n case 'MO': {\r\n if (self.sensitivity.monday == true) {\r\n self.sensitivity.monday = false;\r\n }\r\n else {\r\n self.sensitivity.monday = true;\r\n }\r\n break;\r\n }\r\n case 'TU': {\r\n self.sensitivity.tuesday = true;\r\n break;\r\n }\r\n case 'WE': {\r\n self.sensitivity.wednesday = true;\r\n break;\r\n }\r\n case 'TH': {\r\n self.sensitivity.thursday = true;\r\n break;\r\n }\r\n case 'FR': {\r\n self.sensitivity.friday = true;\r\n break;\r\n }\r\n case 'SA': {\r\n self.sensitivity.saturday = true;\r\n break;\r\n }\r\n case 'SU': {\r\n self.sensitivity.sunday = true;\r\n break;\r\n }\r\n\r\n }\r\n }\r\n\r\n \r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n $translate([\"EditSensitivityTitle\", \"NewSensitivityTitle\", \"ContinueSwal\", \"CancelSwal\", \"SaveSensitivitySwal\", \"SavedSensitivitySwal\", \"TheSensibilitySwal\", \"HasBeenSuccessfullySavedSwal\", \"TheProcessContinuesSwal\", \"TheProcessOfContinuousStorageSwal\", \"ErrorTitleSwal\", \"ErrorSavingSensitivitySwal\"])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n }\r\n\r\n init();\r\n\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"DecisionsCtrl\", function ($scope, $rootScope, $timeout, $interval, $state, $stateParams, $filter, priceService, adminService, ngDialog, companyJson, $translate) {\r\n\r\n var dic = {};\r\n var numberColWidth = 100;\r\n var editableColWidth = 140;\r\n var lastAdded = null;\r\n var columnDefs = null;\r\n var changePriceNewImpact = 0;\r\n var selectedFilterForText = '';\r\n var self = this;\r\n\r\n self.hidePricesCopiedFromOthers = false;\r\n self.hideCurrentPrices = false;\r\n showAverageCost = false;\r\n\r\n showAverageCost = companyJson.PriceDecisions.Grid.ShowAverageCost; //Mostrar u ocultar AverageCosts\r\n\r\n $timeout(function () {\r\n self.gridOptions.columnApi.setColumnVisible('averageCost', showAverageCost);\r\n self.gridOptions.columnApi.setColumnVisible('grossMarginAverage', showAverageCost);\r\n }, 0);\r\n\r\n self.hidePricesCopiedFromOthers = companyJson.PriceDecisions.Grid.HidePricesCopiedFromOthers;\r\n self.hideCurrentPrices = companyJson.PriceDecisions.Grid.HideCurrentPrices;\r\n\r\n self.busy = false;\r\n self.gridOptions = null;\r\n self.isEndorse = null;\r\n self.allPrices = null;\r\n self.title = null;\r\n self.pricelists = [{ id: 0, name: '' }];\r\n self.priceTypes = [];\r\n self.loadingPriceSurveys = true;\r\n self.selectedFilterForPriceList = \"\";\r\n self.selectedFilterForPriceType = '';\r\n self.isEndorse = $stateParams.isEndorse ? JSON.parse($stateParams.isEndorse) : false;\r\n self.isNewFilter = $stateParams.new ? JSON.parse($stateParams.new) : false;\r\n self.selectedFilterForStatus = \"\";\r\n self.selectedFilterForIssues = '';\r\n self.selectedFilterForAction = '';\r\n self.selectedFilterForSensitivities = \"\";\r\n self.tags = [];\r\n self.itemSensitivities = [];\r\n self.suggestedImpact = 0;\r\n self.suggestedImpactShare = 0; //Impacto sobre total margen de la categoria\r\n self.newImpact = 0;\r\n self.newImpactShare = 0; //Impacto sobre total margen de la categoria\r\n self.numberOfNewPrices = 0;\r\n self.numberOfSuggestions = 0;\r\n self.numberOfSuggestionsAccepted = 0;\r\n self.percentageOfAcceptedSuggestions = 0;\r\n self.categoryMargin = 0;\r\n self.salesWithCurrentPrices = 0;\r\n self.salesWithNewPrices = 0;\r\n self.salesWithSuggestedPrices = 0;\r\n self.averagePriceChanges = 0;\r\n self.averagePriceNewVsSuggestedChanges = 0;\r\n self.priceDashboard = null;\r\n self.timerange = 'week';\r\n\r\n self.toggleToolPanel = function () {\r\n var showing = self.gridOptions.api.isToolPanelShowing();\r\n self.gridOptions.api.showToolPanel(!showing);\r\n }\r\n\r\n self.markAsReviewed = function (priceType, priceTypeName) {\r\n var alertMessage = '';\r\n if (priceType == 0)\r\n alertMessage = translations.PricesOfThisCategoryAsRevised;\r\n else if (priceType == 5)\r\n alertMessage = translations.CompetitionPricesOfThisCategoryAsRevised;\r\n else if (priceType == 6)\r\n alertMessage = translations.NormalPricesOfThisCategoryAsRevised;\r\n\r\n var swalConfig = {\r\n title: translations.DiscardConfirmTitle,\r\n text: alertMessage,\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n };\r\n\r\n swal(swalConfig, function () {\r\n /* Issue 554 \r\n //1. Save changes\r\n var result = saveNewPrices(false);\r\n\r\n if (result && typeof result.then == 'function') { //si se hace el save la respuesta es un promise\r\n\r\n result.then(function () {\r\n\r\n //2. Mark as reviewed \r\n markAsReviewed(priceType);\r\n\r\n },\r\n function () {\r\n swal(translations.ErrorTitleSwal, translations.ErrorSwalSubtitle, \"error\");\r\n }).catch(function (fallback) {\r\n console.log(fallback);\r\n });\r\n }\r\n else {\r\n\r\n //2. Mark as reviewed \r\n markAsReviewed(priceType);\r\n }*/\r\n\r\n markAsReviewed(priceType);\r\n });\r\n }\r\n\r\n self.markAsEndorsed = function () {\r\n var swalConfig = {\r\n title: translations.DiscardConfirmTitle,\r\n text: translations.WantToNotifyEndorsement,\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.Cancelar,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n };\r\n\r\n swal(swalConfig, function () {\r\n\r\n priceService.decisions.markAsEndorsed($stateParams.categoryId, $stateParams.categoryGroup, $stateParams.category)\r\n .then(function () {\r\n swal(translations.ConfirmedSwal, translations.TheEndorsementWasNotified, \"success\");\r\n },\r\n function () {\r\n swal(translations.ErrorTitleSwal, translations.ErrorWhenWantingNotifyEndorsement, \"error\");\r\n })\r\n .catch(function (fallback) {\r\n console.log(fallback);\r\n });\r\n });\r\n }\r\n\r\n self.accept = function () {\r\n\r\n var swalConfig = {\r\n title: translations.DiscardConfirmTitle,\r\n text: translations.AreYouSureSwalSubtitle,\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n }\r\n\r\n if (self.gridOptions.api.getSelectedNodes().length > 0) {\r\n\r\n swal(swalConfig, function () {\r\n\r\n var result = saveNewPrices(true);\r\n\r\n if (result && typeof result.then == 'function') { //if response is a promise\r\n result.then(function () {\r\n swal(translations.ConfirmedSwal, translations.ConfirmedSwalSubtitle, \"success\");\r\n loadData();\r\n },\r\n function () {\r\n swal(translations.ErrorTitleSwal, translations.ErrorSwalSubtitle, \"error\");\r\n })\r\n .catch(function (fallback) {\r\n console.log(fallback);\r\n });\r\n }\r\n });\r\n }\r\n }\r\n\r\n self.ignore = function () {\r\n if (self.gridOptions.api.getSelectedNodes().length > 0) {\r\n\r\n swal({\r\n title: translations.AreYouSureSwal,\r\n text: translations.IgnoreSelectedSuggestions,\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function () {\r\n var itemsToIgnore = [];\r\n\r\n //recorro los items seleccionados\r\n angular.forEach(self.gridOptions.api.getSelectedNodes(), function (node, key) {\r\n var item = node.data;\r\n\r\n //si tiene sugerencia o nuevo precio lo agrego\r\n if (item.priceSuggestionId || (item.newPrice != null && item.newPrice != 0)) {\r\n itemsToIgnore.push(item);\r\n }\r\n\r\n });\r\n\r\n var newPricesToIgnore = getNewPricesToSaveOrEndorse(itemsToIgnore, true);\r\n\r\n if (itemsToIgnore.length > 0) {\r\n priceService.decisions.ignoreSuggestions(newPricesToIgnore).then(function () {\r\n swal(translations.ConfirmedSwal, translations.ConfirmedIgnoreSelectedSuggestions, \"success\");\r\n loadData();\r\n\r\n },\r\n function () {\r\n swal(translations.ErrorTitleSwal, translations.ErrorWhenWantingIgnoreSuggestions, \"error\");\r\n })\r\n .catch(function (fallback) {\r\n console.log(fallback);\r\n });\r\n }\r\n else {\r\n $timeout(function () {\r\n swal(translations.Attention, translations.NoChangesWereRecorded, \"error\");\r\n }, 500);\r\n }\r\n });\r\n }\r\n }\r\n\r\n self.endorse = function () {\r\n if (self.gridOptions.api.getSelectedNodes().length > 0) {\r\n\r\n swal({\r\n title: translations.DiscardConfirmTitle,\r\n text: translations.EndorseTheSelectedPrices,\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function () {\r\n var itemsToEndorse = [];\r\n\r\n //recorro los items seleccionados\r\n angular.forEach(self.gridOptions.api.getSelectedNodes(), function (node, key) {\r\n var item = node.data;\r\n\r\n //si el status es current o new\r\n if (item.status == 0 || item.status == 1) {\r\n //y tiene precio o fechas nuevas\r\n if ((item.newPrice && (item.newPrice != item._Price || item.priceListIsBase)) //el precio tiene que ser distinto a excepcion de la zona base donde puede ser igual pero debe guardarse el cambio. (esto es porque en la zona base se da el caso en que el precio actual es igual al sugerido y por ende al nuevo)\r\n || (item.newValidFrom && item.newValidFrom != item.validFrom)\r\n || (item.newValidFrom && item.newValidFrom != item.validFrom)) {\r\n itemsToEndorse.push(item);\r\n }\r\n }\r\n\r\n });\r\n\r\n var newPricesToEndorse = getNewPricesToSaveOrEndorse(itemsToEndorse, true);\r\n\r\n if (itemsToEndorse.length > 0) {\r\n priceService.decisions.endorsePrices(newPricesToEndorse).then(function () {\r\n swal(translations.ConfirmedSwal, translations.ConfirmedEndorseTheSelectedPrices, \"success\");\r\n loadData();\r\n\r\n },\r\n function () {\r\n swal(translations.ErrorTitleSwal, translations.ErrorWhenWantingEndorsePrices, \"error\");\r\n }).catch(function (fallback) {\r\n console.log(fallback);\r\n });\r\n }\r\n else {\r\n $timeout(function () {\r\n swal(translations.Attention, translations.NoChangesWereRecorded, \"error\");\r\n }, 500);\r\n }\r\n });\r\n }\r\n }\r\n\r\n self.reject = function () {\r\n if (self.gridOptions.api.getSelectedNodes().length > 0) {\r\n swal({\r\n title: translations.RejectionComment,\r\n text: translations.RejectionCommentSubtitle,\r\n type: \"input\",\r\n showCancelButton: true,\r\n closeOnConfirm: false,\r\n animation: \"slide-from-top\",\r\n //inputPlaceholder: \"\"\r\n },\r\n function (inputValue) {\r\n if (inputValue === false)\r\n return false;\r\n\r\n var pricesToReject = [];\r\n\r\n // rechazo solo los seleccionados.\r\n angular.forEach(self.gridOptions.api.getSelectedNodes(), function (node, key) {\r\n var item = node.data;\r\n pricesToReject.push(item);\r\n });\r\n\r\n if (pricesToReject.length > 0) {\r\n // Guardar cambios\r\n\r\n var currentUrl = window.location.href;\r\n priceService.decisions.rejectEndorse(pricesToReject, inputValue, currentUrl)\r\n .then(function (resp) {\r\n swal(translations.RejectedItems, translations.RejectedItemsSubtitle, \"success\");\r\n loadData();\r\n }, function () {\r\n swal(translations.ErrorTitleSwal, translations.ErrorSwalSubtitle, \"error\");\r\n }).catch(function (fallback) {\r\n console.log(fallback);\r\n });\r\n }\r\n });\r\n }\r\n }\r\n\r\n self.exportToExcel = function () {\r\n var params = {\r\n skipHeader: false,\r\n skipFooters: false,\r\n skipGroups: false,\r\n allColumns: true,\r\n onlySelected: false,\r\n suppressQuotes: false,\r\n fileName: self.category + '.xls',\r\n columnSeparator: ','\r\n };\r\n\r\n self.gridOptions.api.exportDataAsCsv(params);\r\n }\r\n\r\n self.openChatDialog = function (priceId) {\r\n var newScope = $scope.$new();\r\n newScope.showLoader = true;\r\n\r\n priceService.decisions.getChatForItem(priceId).then(function (data) {\r\n newScope.showLoader = false;\r\n\r\n newScope.currentDate = new Date();\r\n newScope.chats = [];\r\n newScope.isSaving = false;\r\n newScope.newChat = {\r\n id: 0,\r\n priceId: priceId,\r\n message: \"\",\r\n pictureUrl: \"defaultUser.jpg\", //TODO: Reemplazar por el current userPicture\r\n sendDate: new Date()\r\n };\r\n\r\n if (data && data.length > 0)\r\n newScope.chats = data;\r\n\r\n newScope.saveMessage = function () {\r\n newScope.isSaving = true;\r\n priceService.decisions.saveChatForItem(newScope.newChat).then(function (resp) {\r\n if (resp != null) {\r\n newScope.chats.push(resp);\r\n newScope.newChat.message = \"\";\r\n newScope.isSaving = false;\r\n }\r\n else {\r\n newScope.isSaving = true;\r\n }\r\n });\r\n }\r\n });\r\n\r\n ngDialog.open({\r\n template: 'chatDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-300',\r\n scope: newScope\r\n });\r\n }\r\n\r\n self.openTagsDialog = function (itemTags, itemId) {\r\n\r\n var tagGroups = _.groupBy(self.tags, 'group');\r\n angular.forEach(tagGroups, function (tg) {\r\n tg.selectedTags = [];\r\n tg.itemId = itemId\r\n });\r\n\r\n var newScope = $scope.$new();\r\n newScope.tagGroups = tagGroups;\r\n newScope.selectedItemId = itemId;\r\n\r\n //Load existing tags\r\n if (itemTags != null && itemTags != 'null') {\r\n var existingTagIds = itemTags.split(',');\r\n\r\n for (var i = 0; i < existingTagIds.length; i++) {\r\n angular.forEach(newScope.tagGroups, function (tg) {\r\n if (_.find(tg, function (t) {\r\n return t.id == existingTagIds[i].trim();\r\n }) != null) {\r\n tg.selectedTags.push(parseInt(existingTagIds[i]));\r\n }\r\n });\r\n }\r\n }\r\n\r\n //SaveTags\r\n newScope.saveTags = function () {\r\n var tagIdsToSave = [];\r\n\r\n angular.forEach(newScope.tagGroups, function (tg) {\r\n angular.forEach(tg.selectedTags, function (tagId) {\r\n tagIdsToSave.push(tagId);\r\n })\r\n });\r\n\r\n adminService.items.saveItemTags(tagIdsToSave, newScope.selectedItemId).then(function (resp) {\r\n if (resp) {\r\n ngDialog.close();\r\n loadData();\r\n }\r\n else {\r\n //Todo: Ocurrio un error, Pedir que se guarden nuevamnete.\r\n }\r\n });\r\n }\r\n\r\n ngDialog.open({\r\n template: 'tagDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-height-500 tagsDialog',\r\n backdrop: 'static',\r\n keyboard: false,\r\n scope: newScope\r\n });\r\n };\r\n\r\n //TODO: TERMINAR DE HACER ESTO, CALCULA EL MARGEN EN % o $ PARA TODO EL GRUPO DE PRODUCTOS SELECCIONADOS.\r\n self.modifyMarginProductGroup = function (value) {\r\n var isPrice = value == '$';\r\n\r\n var totalGrossMarginAbs = 0;\r\n var totalSales = 0;\r\n\r\n if (self.gridOptions.api.getSelectedNodes().length > 0) {\r\n\r\n //1. Calculo el total de GrossMarginAbs\r\n\r\n angular.forEach(self.gridOptions.api.getSelectedNodes(), function (node, key) {\r\n totalGrossMarginAbs += node.data.newGrossMarginAbs != null ? node.data.newGrossMarginAbs * node.data.units : node.data.grossMarginAbs * node.data.units;\r\n\r\n var cost = node.data.newCost != null ? node.data.newCost : node.data.cost;\r\n var tax = node.data.newTax != null ? node.data.newTax : node.data.tax;\r\n var taxRate = node.data.newTaxRate != null ? node.data.newTaxRate : node.data.taxRate;\r\n\r\n totalSales += ((node.data._Price - tax) / (1 + taxRate) + tax) * node.data.units;\r\n });\r\n\r\n var currentGrossMargin = totalGrossMarginAbs / totalSales;\r\n\r\n swal({\r\n title: translations.ModifyMarginIn + value,\r\n text: translations.ModifyMarginSubtitle + (isPrice ? $rootScope.toMoneyNoDecimals(totalGrossMarginAbs) : $rootScope.toPercentage(currentGrossMargin)) + translations.EnterNewMarginValue,\r\n type: \"input\",\r\n showCancelButton: true,\r\n closeOnConfirm: false,\r\n animation: \"slide-from-top\",\r\n inputPlaceholder: translations.ValueIn + value\r\n },\r\n function (inputValue) {\r\n if (inputValue === false)\r\n return false;\r\n if (inputValue === \"\") {\r\n swal.showInputError(translations.YouMustEnterValue);\r\n return false\r\n }\r\n inputValue = inputValue.replace(',', '.');\r\n if (isNaN(inputValue)) {\r\n swal.showInputError(translations.YouMustEnterNumericValue);\r\n return false\r\n }\r\n\r\n\r\n //1. Calculo el total de GrossMarginAbs\r\n if (totalGrossMarginAbs != 0 && totalSales != 0) {\r\n\r\n var newGrossMarginAbs = 0;\r\n if (!isPrice) {\r\n newGrossMarginAbs = totalSales * (inputValue / 100);\r\n }\r\n else {\r\n newGrossMarginAbs = inputValue\r\n }\r\n\r\n angular.forEach(self.gridOptions.api.getSelectedNodes(), function (node, key) {\r\n //Solo modifico los que tienen ventas\r\n if (node.data.units != null && node.data.units != 0) {\r\n var share = node.data.newGrossMarginAbs != null ? (node.data.newGrossMarginAbs * node.data.units) / totalGrossMarginAbs : (node.data.grossMarginAbs * node.data.units) / totalGrossMarginAbs;\r\n\r\n var cost = node.data.newCost != null ? node.data.newCost : node.data.cost;\r\n var tax = node.data.newTax != null ? node.data.newTax : node.data.tax;\r\n var taxRate = node.data.newTaxRate != null ? node.data.newTaxRate : node.data.taxRate;\r\n\r\n var newPrice = ((newGrossMarginAbs * share / node.data.units) + cost) * (1 + taxRate) + tax;\r\n changePrice(newPrice, node);\r\n }\r\n });\r\n }\r\n\r\n swal(translations.MarginUpdated, translations.TheMarginWasUpdatedCorrectly1 + (isPrice ? value + inputValue : inputValue + value) + translations.TheMarginWasUpdatedCorrectly2, \"success\");\r\n\r\n });\r\n }\r\n else {\r\n swal(translations.ErrorTitleSwal, translations.SelectAtLeastOnePriceToContinue, \"error\");\r\n }\r\n }\r\n\r\n self.modifyMargin = function (value) {\r\n swal({\r\n title: translations.ModifyMarginIn + value,\r\n text: translations.EnterNewMarginValueforSelectedProducts,\r\n type: \"input\",\r\n showCancelButton: true,\r\n closeOnConfirm: false,\r\n animation: \"slide-from-top\",\r\n inputPlaceholder: translations.ValueIn + value\r\n },\r\n function (inputValue) {\r\n if (inputValue === false)\r\n return false;\r\n if (inputValue === \"\") {\r\n swal.showInputError(translations.YouMustEnterValue);\r\n return false\r\n }\r\n inputValue = inputValue.replace(',', '.');\r\n if (isNaN(inputValue)) {\r\n swal.showInputError(translations.YouMustEnterNumericValue);\r\n return false\r\n }\r\n\r\n var targetMargin = inputValue / 100; //Que ingresen el valor en % y lo pasamos a decimal.\r\n\r\n angular.forEach(self.gridOptions.api.getSelectedNodes(), function (node, key) {\r\n\r\n if (targetMargin != 1) {\r\n var cost = node.data.newCost != null ? node.data.newCost : node.data.cost;\r\n var tax = node.data.newTax != null ? node.data.newTax : node.data.tax;\r\n var taxRate = node.data.newTaxRate != null ? node.data.newTaxRate : node.data.taxRate;\r\n\r\n var newPrice = (((cost + tax) / (1 - targetMargin)) - tax) * (1 + taxRate) + tax;\r\n changePrice(newPrice, node);\r\n }\r\n });\r\n\r\n swal(translations.MarginUpdated, translations.TheMarginWasUpdatedCorrectly1 + inputValue + value + translations.TheMarginWasUpdatedCorrectly2, \"success\");\r\n\r\n });\r\n }\r\n\r\n self.filterByStatus = function (status, filterText) {\r\n if (self.selectedFilterForStatus != status) {\r\n self.selectedFilterForStatus = status;\r\n loadData();\r\n //externalFilterChanged();\r\n }\r\n }\r\n\r\n self.filterByIssue = function (issue) {\r\n if (self.selectedFilterForIssues != issue) {\r\n self.selectedFilterForIssues = issue;\r\n externalFilterChanged();\r\n }\r\n }\r\n\r\n self.filterByAction = function (action) {\r\n if (self.selectedFilterForAction != action) {\r\n self.selectedFilterForAction = action;\r\n externalFilterChanged();\r\n }\r\n }\r\n\r\n self.filterByPriceType = function (priceType) {\r\n if (self.selectedFilterForPriceType != priceType) {\r\n\r\n self.selectedFilterForPriceType = priceType;\r\n\r\n //self.updateChart(self.timerange);\r\n\r\n externalFilterChanged();\r\n }\r\n }\r\n\r\n self.filterByPricelist = function (priceList) {\r\n if (self.selectedFilterForPriceList != priceList) {\r\n\r\n self.selectedFilterForPriceList = priceList;\r\n\r\n //self.updateChart(self.timerange);\r\n\r\n externalFilterChanged();\r\n }\r\n }\r\n\r\n self.filterByItemSensitivity = function (sensitivity) {\r\n if (self.selectedFilterForSensitivities != sensitivity) {\r\n\r\n self.selectedFilterForSensitivities = sensitivity;\r\n\r\n //self.updateChart(self.timerange);\r\n\r\n externalFilterChanged();\r\n }\r\n }\r\n\r\n\r\n self.filterByText = function () {\r\n var eInput = document.querySelector('#searchGridInput');\r\n if (eInput) {\r\n\r\n if ((eInput.value.length > 2 && selectedFilterForText != eInput.value) || (eInput.value == '' && selectedFilterForText != '')) {\r\n selectedFilterForText = eInput.value;\r\n externalFilterChanged();\r\n }\r\n }\r\n }\r\n\r\n self.dateEditor = function (params) {\r\n if (self.isEndorse) {\r\n return $rootScope.dateRenderer(params);\r\n }\r\n else {\r\n return $rootScope.dateEditor(params);\r\n }\r\n }\r\n\r\n self.updateDates = function (isValidFrom) {\r\n swal({\r\n title: translations.UpdateDates,\r\n text: isValidFrom ? translations.UpdateDatesSubtitleOp1 : translations.UpdateDatesSubtitleOp2,\r\n type: 'input',\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n closeOnConfirm: true,\r\n closeOnCancel: true\r\n },\r\n function (inputValue) {\r\n\r\n if (inputValue === false)\r\n return false;\r\n\r\n var timestamp = Date.parse(inputValue)\r\n\r\n if (isNaN(timestamp) == false) {\r\n var d = new Date(timestamp);\r\n\r\n //TODO: Ver como Ponerle un DatePicker al Sweet Alert\r\n\r\n angular.forEach(self.gridOptions.api.getSelectedNodes(), function (node, key) {\r\n\r\n if (node.data.newPrice != null && node.data.newPrice != '' && node.data.newPrice != 0) {\r\n if (isValidFrom)\r\n node.data.newValidFrom = d;\r\n else\r\n node.data.newValidTo = d;\r\n node.data.dirty = true;\r\n\r\n self.gridOptions.api.refreshRows([node]);\r\n }\r\n });\r\n }\r\n\r\n\r\n });\r\n }\r\n\r\n self.showItemInDashboard = function (itemId, priceListId) {\r\n $state.go('home.itemDashboard', { 'itemId': itemId, 'priceListId': priceListId });\r\n }\r\n\r\n /*\r\n self.updateChart = function (timerange) {\r\n\r\n self.timerange = timerange;\r\n\r\n if (self.priceDashboard == null || self.priceDashboard == '')\r\n return;\r\n\r\n var lastWeekXValues = [];\r\n var lastMonthXValues = [];\r\n var lastYearXValues = [];\r\n var xValues = [];\r\n var lastXValues = [];\r\n\r\n if (timerange == 'week')\r\n xValues = self.priceDashboard.lastWeekXValues;\r\n else if (timerange == 'month')\r\n xValues = self.priceDashboard.lastMonthXValues;\r\n else\r\n xValues = self.priceDashboard.lastYearXValues;\r\n\r\n var lastDateString = null;\r\n var lastXValue = null;\r\n\r\n var selectedPriceListId = 0;\r\n var priceList = _.filter(self.pricelists, function (o) {\r\n return o.name == self.selectedFilterForPriceList;\r\n });\r\n\r\n if (priceList.length > 0)\r\n selectedPriceListId = priceList[0].id;\r\n\r\n xValues.forEach(function (xValue) {\r\n\r\n if (lastDateString != xValue.dateString) {\r\n if (lastXValue != null) {\r\n lastXValue.price = lastXValue.units != 0 ? Math.round(lastXValue.sales / lastXValue.units * 100) / 100 : 0;\r\n lastXValues.push(lastXValue);\r\n }\r\n\r\n lastXValue = { dateString: xValue.dateString, sales: 0, units: 0, margin: 0, price: 0 };\r\n }\r\n\r\n if (selectedPriceListId == 0 || (xValue.priceListId == selectedPriceListId)) {\r\n lastXValue.sales += xValue.sales;\r\n lastXValue.units += xValue.units;\r\n lastXValue.margin += xValue.margin;\r\n }\r\n\r\n lastDateString = xValue.dateString;\r\n });\r\n\r\n if (lastXValue != null) {\r\n lastXValue.price = lastXValue.units != 0 ? Math.round(lastXValue.sales / lastXValue.units * 100) / 100 : 0;\r\n lastXValues.push(lastXValue);\r\n }\r\n\r\n\r\n if (timerange == 'week')\r\n lastWeekXValues = lastXValues;\r\n else if (timerange == 'month')\r\n lastMonthXValues = lastXValues;\r\n else\r\n lastYearXValues = lastXValues;\r\n\r\n self.chart = c3.generate({\r\n bindto: '#saleschart',\r\n data: {\r\n json: (timerange == 'week' ? lastWeekXValues : timerange == 'month' ? lastMonthXValues : lastYearXValues),\r\n keys: {\r\n x: 'dateString',\r\n value: ['sales', 'units', 'margin', 'price'],\r\n },\r\n axes: {\r\n sales: 'y',\r\n units: 'y',\r\n margin: 'y',\r\n price: 'y2'\r\n },\r\n type: 'bar',\r\n types: {\r\n price: 'line',\r\n },\r\n colors: {\r\n sales: '#1ab394',\r\n units: '#1c84c6',\r\n margin: '#f8ac59',\r\n price: '#ED5565'\r\n }\r\n },\r\n axis: {\r\n x: {\r\n type: 'timeseries',\r\n tick: {\r\n fit: true,\r\n format: function (x) {\r\n if (self.timerange == 'week') {\r\n return $rootScope.shortWeekDayNames[x.getDay()];\r\n } else if (self.timerange == 'month') {\r\n return x.getDate() + '-' + $rootScope.shortMonthNames[(x.getMonth())];\r\n } else if (self.timerange == 'year') {\r\n return x.getFullYear() + '-' + (x.getMonth() + 1);\r\n }\r\n }\r\n }\r\n },\r\n y: {\r\n tick: {\r\n format: d3.format(\"s\")\r\n }\r\n },\r\n y2: {\r\n show: true,\r\n label: 'Precio en $',\r\n tick: {\r\n format: d3.format('.1f')\r\n },\r\n min: 0\r\n }\r\n },\r\n tooltip: {\r\n format: {\r\n title: function (d) {\r\n var toFormat = '%B %d, %Y';\r\n if (self.timerange == 'year')\r\n toFormat = '%B %Y';\r\n\r\n var format = d3.time.format(toFormat);\r\n return format(d);\r\n },\r\n value: function (value, ratio, id) {\r\n var format = id === 'price' ? d3.format(',.1f') : d3.format(',.0f');\r\n return format(value);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n */\r\n\r\n self.searchGridInputKeyPressed = function (e) {\r\n if (e.which === 13) { //Enter keycode\r\n self.filterByText();\r\n }\r\n }\r\n\r\n self.showOverlaps = function (overlaps) {\r\n self.currentOverlaps = overlaps;\r\n\r\n if (self.currentOverlaps.length > 0) {\r\n ngDialog.open({\r\n template: 'overlapDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n //data: task,\r\n scope: $scope\r\n });\r\n }\r\n }\r\n\r\n function startProgress() {\r\n self.busy = 0;\r\n return $interval(function () { self.busy += 0.05; }, 250, 16);\r\n }\r\n\r\n function stopProgress(interval) {\r\n $interval.cancel(interval);\r\n self.busy = 0.95;\r\n $timeout(function () { self.busy = false; }, 500);\r\n }\r\n\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: translations.GeneralInformation,\r\n children: [\r\n {\r\n id: \"select\",\r\n field: \"priceId\",\r\n pinned: 'left',\r\n colIndex: 0,\r\n width: 25,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.emptyRenderer,\r\n checkboxSelection: true,\r\n headerCellRenderer: function (params) {\r\n\r\n if (self.gridOptions.columnApi.getRowGroupColumns().length > 0)\r\n return null;\r\n\r\n var eInput = document.createElement(\"input\");\r\n eInput.type = \"checkbox\";\r\n eInput.title = \"Seleccionar todos\";\r\n eInput.addEventListener(\"change\", function (event) {\r\n selectAll(this.checked);\r\n });\r\n return eInput;\r\n },\r\n },\r\n {\r\n headerName: translations.Subcategory,\r\n field: \"subCategory\",\r\n headerTooltip: \"\",\r\n pinned: 'left',\r\n width: numberColWidth + 50,\r\n columnGroupShow: 'open',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: translations.Code,\r\n field: \"code\",\r\n headerTooltip: \"\",\r\n pinned: 'left',\r\n width: 150,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"UM\",\r\n field: \"salesUnitOfMeasure\",\r\n headerTooltip: translations.UnitOfMeasureOfSale,\r\n pinned: 'left',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 40,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"EAN\",\r\n field: \"ean\",\r\n headerTooltip: \"\",\r\n columnGroupShow: 'open',\r\n pinned: 'left',\r\n width: 160,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: translations.Description,\r\n field: \"description\",\r\n headerTooltip: \"\",\r\n pinned: 'left',\r\n width: numberColWidth + 250,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: {\r\n renderer: 'group',\r\n checkbox: false,\r\n innerRenderer: function (params) {\r\n var name = params.value + (params.node.group && params.node.children != null ? ' (' + params.node.children.length + ')' : '');\r\n var desc = '';\r\n\r\n var tagIds = \"'\" + params.data.tagIds + \"'\";\r\n tags = ' ';\r\n\r\n var lastChat = params.data.observations != null && params.data.chatsQuantity != 0 ? '(' + params.data.chatsQuantity + ') ' + params.data.observations : params.data.chatsQuantity != 0 ? '(' + params.data.chatsQuantity + ') ' : '';\r\n var chat = ' ';\r\n //Click aqui para ver las conversaciones asociadas a esta decision\r\n\r\n //if (params.data.observations != null) {\r\n // desc += ' ';\r\n //}\r\n\r\n //Si tiene una regla de Zona muestro esa. Si tiene las 2 aparece la de Zona.\r\n if (params.data.parentRuleZone != null && params.data.parentRuleZone != '') {\r\n desc += ' ';\r\n }\r\n\r\n if (params.data.parentRuleItem != null && params.data.parentRuleItem != '') {\r\n desc += ' ';\r\n }\r\n\r\n desc += params.value + (params.node.group && params.node.children != null ? ' (' + params.node.children.length + ')' : '');\r\n desc = '' + desc + '';\r\n //desc = '' + desc + ''\r\n\r\n var newLabel = '';\r\n if (params.data.priceIsFirst == true)\r\n newLabel = ' NUEVO';\r\n\r\n var sensitivityLabel = '';\r\n if (params.data.sensitivities)\r\n sensitivityLabel = ' ' + params.data.sensitivities + '';\r\n\r\n return tags + chat + desc + newLabel + sensitivityLabel;\r\n }\r\n }\r\n },\r\n {\r\n headerName: translations.Area,\r\n field: \"priceListCode\",\r\n headerTooltip: \"\",\r\n tooltipField: \"priceList\",\r\n pinned: 'left',\r\n width: 150,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: function (params) {\r\n return params.data.priceListCode + \"|\" + params.data.priceList;\r\n }\r\n },\r\n {\r\n headerName: \"TP\", \r\n field: \"priceTypeName\",\r\n headerTooltip: translations.TypeOfPrice,\r\n pinned: 'left',\r\n width: 90,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer:\r\n function (params) {\r\n var rv;\r\n if (params.data.priceType == 5) {\r\n rv = '' + self.priceTypes[params.data.priceType + 1] + '';\r\n }\r\n else {\r\n rv = self.priceTypes[params.data.priceType + 1];\r\n }\r\n return rv;\r\n }\r\n },\r\n {\r\n headerName: translations.Brand,\r\n field: \"brand\",\r\n headerTooltip: \"\",\r\n pinned: 'left',\r\n width: numberColWidth,\r\n columnGroupShow: 'open',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: translations.Maker,\r\n field: \"manufacturer\",\r\n headerTooltip: \"\",\r\n pinned: 'left',\r\n width: numberColWidth,\r\n columnGroupShow: 'open',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: translations.Tags,\r\n columnGroupShow: 'open',\r\n field: \"tags\",\r\n pinned: 'left',\r\n width: 200,\r\n cellClass: $rootScope.getClassForCell\r\n }]\r\n },\r\n {\r\n headerName: translations.NewPrice,\r\n children: [\r\n {\r\n headerName: translations.Present,\r\n field: \"_Price\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: function (params) {\r\n if (params.value == null || params.value == 0 || params.value == '')\r\n return null;\r\n\r\n if (self.hidePricesCopiedFromOthers && params.data.copiedFromPriceId != null && params.data.priceType == 5)\r\n return null;\r\n\r\n return \"$ \" + $filter('number')(params.value, 2);\r\n }\r\n },\r\n {\r\n headerName: translations.SuggestedS,\r\n field: \"suggestedPrice\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.backgroundNumberClass,\r\n cellRenderer: $rootScope.moneyRenderer\r\n },\r\n {\r\n headerName: translations.NewSingular,\r\n field: \"newPrice\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: moneyEditor\r\n },\r\n {\r\n headerName: \"Var %\",\r\n field: \"priceDelta\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForImpactCell,\r\n cellRenderer: function (params) {\r\n var eCell = document.createElement('div');\r\n eCell.className = \"input-group\";\r\n eCell.style = \"width:100% !important;height:100% !important\";\r\n\r\n if (IsVariationOutOfGuidelines(params.data)) {\r\n var eIcon = document.createElement('i');\r\n eIcon.className = \"fa fa-exclamation-triangle text-danger mr10\";\r\n eIcon.title = ian.format( translations.ThePriceVariationLimitHasBeenExceeded, $filter('percentage')(params.data.minVariation), $filter('percentage')(params.data.maxVariation));\r\n eCell.appendChild(eIcon);\r\n }\r\n\r\n var eSpan = document.createElement(\"span\");\r\n eSpan.textContent = params.value != null ? $rootScope.percentageRenderer(params) : '';\r\n eCell.appendChild(eSpan);\r\n\r\n return eCell;\r\n }\r\n },\r\n {\r\n headerName: \"Var $\",\r\n field: \"priceDeltaAmount\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForImpactCell,\r\n cellRenderer: function (params) {\r\n var eCell = document.createElement('div');\r\n eCell.className = \"input-group\";\r\n eCell.style = \"width:100% !important;height:100% !important\";\r\n\r\n if (IsVariationAmountOutOfGuidelines(params.data)) {\r\n var eIcon = document.createElement('i');\r\n eIcon.className = \"fa fa-exclamation-triangle text-danger mr10\";\r\n eIcon.title = ian.format(translations.ThePriceVariationLimitHasBeenExceeded, $filter('currency')(params.data.minVariationAmount), $filter('currency')(params.data.maxVariationAmount));\r\n eCell.appendChild(eIcon);\r\n }\r\n\r\n var eSpan = document.createElement(\"span\");\r\n eSpan.textContent = params.value != null ? $rootScope.moneyRenderer(params) : '';\r\n eCell.appendChild(eSpan);\r\n\r\n return eCell;\r\n }\r\n }]\r\n },\r\n {\r\n headerName: translations.CurrentPrice1,\r\n hide: self.hideCurrentPrices,\r\n children: [\r\n {\r\n headerName: translations.Current,\r\n field: \"currentPrice\",\r\n width: numberColWidth,\r\n hide: self.hideCurrentPrices,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer:\r\n function (params) {\r\n return '' + ((params.value != null && params.value != 0 && params.value != '') ? (\"$ \" + $filter('number')(params.value, 2)) : \"\") + '   ' + '';\r\n }\r\n },\r\n {\r\n headerName: \"TP Vig.\",\r\n field: \"currentPriceType\",\r\n headerTooltip: translations.TypeOfPriceForce,\r\n width: numberColWidth,\r\n hide: self.hideCurrentPrices,\r\n width: 90,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer:\r\n function (params) {\r\n if (params.value != null)\r\n return self.priceTypes[params.value + 1];\r\n else\r\n return \"*\";\r\n }\r\n },\r\n {\r\n headerName: translations.From,\r\n field: \"currentPriceValidFrom\",\r\n width: numberColWidth,\r\n hide: self.hideCurrentPrices,\r\n filter: 'date',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer:\r\n function (params) {\r\n if (params.data.currentPriceValidFrom == null)\r\n return \"*\";\r\n\r\n if (params.value == null)\r\n return \"\";\r\n\r\n return new Date(params.value).toISOString().slice(0, 10);\r\n }\r\n },\r\n {\r\n headerName: translations.To,\r\n field: \"currentPriceValidTo\",\r\n width: numberColWidth,\r\n hide: self.hideCurrentPrices,\r\n filter: 'date',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: function (params) {\r\n if (params.data.currentPrice == null)\r\n return \"*\";\r\n\r\n if (params.value == null)\r\n return \"\";\r\n\r\n return new Date(params.value).toISOString().slice(0, 10);\r\n }\r\n }\r\n //{\r\n // headerName: \"Motivo\",\r\n // field: \"reason\",\r\n // width: numberColWidth,\r\n // hide: self.hideCurrentPrices,\r\n // filter: 'date',\r\n // cellClass: $rootScope.getClassForCell,\r\n\r\n //}\r\n ]\r\n },\r\n {\r\n headerName: translations.Cost,\r\n children: [\r\n {\r\n headerName: translations.Original,\r\n field: \"costWithTaxes\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRenderer\r\n },\r\n { //SOLO PARA \r\n headerName: translations.Average,\r\n field: \"averageCost\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRenderer\r\n },\r\n {\r\n headerName: translations.LastCost,\r\n field: \"newCostWithTaxes\",\r\n width: numberColWidth + 15,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRenderer\r\n },\r\n {\r\n headerName: \"Var %\",\r\n field: \"costDelta\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRenderer\r\n }]\r\n },\r\n {\r\n headerName: translations.CompetitivenessIndex,\r\n children: [\r\n {\r\n headerName: translations.Competitor,\r\n field: \"competitorsPrice\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRenderer\r\n },\r\n {\r\n headerName: \"IC\",\r\n field: \"competitorsPriceVsCurrent\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForImpactCellInverse,\r\n cellRenderer: $rootScope.percentageRenderer\r\n },\r\n {\r\n headerName: translations.SuggestedCI,\r\n field: \"competitorsPriceVsSuggested\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForImpactCellInverse,\r\n cellRenderer: $rootScope.percentageRenderer\r\n },\r\n {\r\n headerName: translations.NewCI,\r\n field: \"competitorsPriceVsNew\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForImpactCellInverse,\r\n cellRenderer: $rootScope.percentageRenderer\r\n }]\r\n },\r\n {\r\n headerName: translations.Sale,\r\n children: [\r\n {\r\n headerName: translations.Volume,\r\n field: \"units\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: translations.SalesInDollars,\r\n field: \"sales\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: translations.NewSale,\r\n field: \"newSales\",\r\n width: numberColWidth + 10,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n }\r\n ]\r\n },\r\n {\r\n headerName: translations.Impact,\r\n children: [\r\n {\r\n headerName: translations.SuggestedS,\r\n field: \"suggestedImpact\",\r\n width: numberColWidth,\r\n hide: self.isEndorse,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForImpactCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: translations.NewSingular,\r\n field: \"newImpact\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForImpactCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n }]\r\n },\r\n {\r\n headerName: translations.Margin,\r\n children: [\r\n {\r\n headerName: translations.Present,\r\n field: \"grossMargin\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForMarginCell,\r\n cellRenderer: $rootScope.percentageRendererWithZero\r\n },\r\n {\r\n //SOLO COLOMBIA\r\n headerName: translations.CurrentAverage,\r\n field: \"grossMarginAverage\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForMarginCell,\r\n cellRenderer: $rootScope.percentageRendererWithZero\r\n },\r\n {\r\n headerName: translations.SuggestedS,\r\n field: \"suggestedGrossMargin\",\r\n width: numberColWidth,\r\n hide: self.isEndorse,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForMarginCell,\r\n cellRenderer: $rootScope.percentageRenderer\r\n },\r\n {\r\n headerName: translations.SuggestedAverage,\r\n field: \"suggestedGrossMarginAvg\",\r\n width: numberColWidth,\r\n hide: self.isEndorse,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForMarginCell,\r\n cellRenderer: $rootScope.percentageRenderer\r\n },\r\n {\r\n headerName: translations.PercentajeNew,\r\n field: \"newGrossMargin\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForMarginCell,\r\n //cellRenderer: $rootScope.percentageRendererNoDecimals,\r\n cellRenderer: function (params) {\r\n var eCell = document.createElement('div');\r\n eCell.className = \"input-group\";\r\n eCell.style = \"width:100% !important;height:100% !important\";\r\n\r\n if (IsMarginOutOfGuidelines(params.data)) {\r\n var eIcon = document.createElement('i');\r\n eIcon.className = \"fa fa-exclamation-triangle text-danger mr10\";\r\n\r\n if (params.data.minMargin != null && (params.data.newGrossMargin < params.data.minMargin || params.data.newGrossMargin > params.data.maxMargin)) {\r\n eIcon.title = ian.format(translations.TheMarginsLimitHasBeenExceeded, $filter('percentage')(params.data.minMargin), $filter('percentage')(params.data.maxMargin));\r\n }\r\n else if (params.data.minMarginAmount != null && (params.data.newGrossMarginAbs < params.data.minMarginAmount || params.data.newGrossMarginAbs > params.data.maxMarginAmount)) {\r\n eIcon.title = ian.format(translations.TheMarginsLimitHasBeenExceeded, $filter('currency')(params.data.minMarginAmount), $filter('currency')(params.data.maxMarginAmount));\r\n }\r\n\r\n\r\n eCell.appendChild(eIcon);\r\n }\r\n\r\n var eSpan = document.createElement(\"span\");\r\n eSpan.textContent = params.value != null ? $rootScope.percentageRendererWithZero(params) : '';\r\n eCell.appendChild(eSpan);\r\n\r\n return eCell;\r\n }\r\n\r\n },\r\n {\r\n headerName: translations.DolarNew,\r\n field: \"newGrossMarginAbs\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForMarginCell,\r\n //cellRenderer: $rootScope.percentageRendererNoDecimals,\r\n cellRenderer: function (params) {\r\n var eCell = document.createElement('div');\r\n eCell.className = \"input-group\";\r\n eCell.style = \"width:100% !important;height:100% !important\";\r\n\r\n if (IsMarginAmountOutOfGuidelines(params.data)) {\r\n var eIcon = document.createElement('i');\r\n eIcon.className = \"fa fa-exclamation-triangle text-danger mr10\";\r\n\r\n if (params.data.minMargin != null && (params.data.newGrossMargin < params.data.minMargin || params.data.newGrossMargin > params.data.maxMargin)) {\r\n eIcon.title = ian.format(translations.TheMarginsLimitHasBeenExceeded, $filter('percentage')(params.data.minMargin), $filter('percentage')(params.data.maxMargin));\r\n }\r\n else if (params.data.minMarginAmount != null && (params.data.newGrossMarginAbs < params.data.minMarginAmount || params.data.newGrossMarginAbs > params.data.maxMarginAmount)) {\r\n eIcon.title = ian.format(translations.TheMarginsLimitHasBeenExceeded, $filter('currency')(params.data.minMarginAmount), $filter('currency')(params.data.maxMarginAmount));\r\n }\r\n\r\n\r\n eCell.appendChild(eIcon);\r\n }\r\n\r\n var eSpan = document.createElement(\"span\");\r\n eSpan.textContent = params.value != null ? $rootScope.moneyRenderer(params) : '';\r\n eCell.appendChild(eSpan);\r\n\r\n return eCell;\r\n }\r\n\r\n },\r\n {\r\n headerName: translations.Target,\r\n field: \"targetMargin\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererWithZero\r\n },\r\n {\r\n headerName: translations.Minimum,\r\n field: \"minMargin\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererWithZero\r\n },\r\n {\r\n headerName: translations.Maximum,\r\n field: \"maxMargin\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererWithZero\r\n }]\r\n },\r\n {\r\n headerName: translations.ValidityDates,\r\n children: [\r\n {\r\n headerName: translations.From,\r\n field: \"validFrom\",\r\n width: numberColWidth,\r\n filter: 'text',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.dateRenderer\r\n },\r\n {\r\n headerName: translations.To,\r\n field: \"validTo\",\r\n width: numberColWidth,\r\n filter: 'text',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.dateRenderer\r\n },\r\n {\r\n headerName: translations.FromN,\r\n field: \"newValidFrom\",\r\n width: editableColWidth,\r\n filter: 'text',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: self.dateEditor\r\n },\r\n {\r\n headerName: translations.ToN,\r\n field: \"newValidTo\",\r\n width: editableColWidth,\r\n filter: 'text',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: self.dateEditor\r\n },\r\n {\r\n headerName: translations.OverlapsAbbreviation,\r\n width: numberColWidth,\r\n field: \"overlappingPromotions\",\r\n cellRenderer: function (params) {\r\n\r\n if (params.data.overlappingPromotions && params.data.overlappingPromotions.length > 0) {\r\n var eCell = document.createElement('div');\r\n eCell.className = \"input-group\";\r\n eCell.style = \"width:100% !important;height:100% !important\";\r\n\r\n var eIcon = document.createElement('i');\r\n eIcon.className = \"fa fa-exclamation-triangle text-danger mr10 backgroundInput\";\r\n eIcon.title = translations.ThisPriceHasAnOverlapWithAPromotion;\r\n eCell.appendChild(eIcon);\r\n\r\n return eCell;\r\n }\r\n\r\n\r\n return '';\r\n }\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n\r\n function setGridOptions() {\r\n\r\n \r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: true,\r\n groupHeaders: true,\r\n groupKeys: undefined, //set as string of keys eg [\"region\",\"country\"],\r\n groupHideGroupColumns: true,\r\n //groupUseEntireRow: false,\r\n groupSelectsChildren: false,\r\n rowHeight: 30,\r\n rowSelection: \"multiple\", // one of ['single','multiple'], leave blank for no selection\r\n singleClickEdit: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n suppressColumnMoveAnimation: $rootScope.suppressColumnMoveAnimation,\r\n suppressCellSelection: true,\r\n suppressRowClickSelection: true,\r\n enableRangeSelection: false,\r\n onRowSelected: rowSelected,\r\n onCellClicked: cellClicked,\r\n angularCompileRows: true,\r\n isExternalFilterPresent: isExternalFilterPresent,\r\n doesExternalFilterPass: doesExternalFilterPass,\r\n getNodeChildDetails: getNodeChildDetails\r\n }\r\n }\r\n\r\n function getNodeChildDetails(rowItem) {\r\n if (rowItem.children && rowItem.children.length > 0) {\r\n return {\r\n group: true,\r\n expanded: false,\r\n // provide ag-Grid with the children of this group\r\n children: rowItem.children,\r\n // the key is used by the default group cellRenderer\r\n key: rowItem.priceId\r\n };\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n function cellClicked(cell) {\r\n if (cell.colDef.field == \"suggestedPrice\") {\r\n if (cell.data != null && cell.data.suggestedPrice != null)\r\n showSuggestionModal(cell.data);\r\n }\r\n else if (cell.colDef.field == \"competitorsPrice\") {\r\n if (cell.data != null)\r\n $state.go('prices.priceMap', { itemId: cell.data.itemId, priceListId: cell.data.priceListId });\r\n }\r\n else if (cell.colDef.field == \"overlappingPromotions\") {\r\n if (cell.data != null)\r\n self.showOverlaps(cell.data.overlappingPromotions);\r\n }\r\n }\r\n\r\n function externalFilterChanged() {\r\n self.gridOptions.api.onFilterChanged();\r\n }\r\n\r\n function containsAllTags(splittedText, tags) {\r\n if (splittedText.length == 1)\r\n return tags.toLowerCase().indexOf(selectedFilterForText.toLowerCase()) != -1;\r\n else {\r\n var rv = true;\r\n _.forEach(splittedText, function (value) {\r\n var containsTag = _.includes(tags.toLowerCase().trim(), value.toLowerCase().trim());\r\n if (!containsTag)\r\n rv = false;\r\n });\r\n\r\n return rv;\r\n }\r\n }\r\n\r\n function rowSelected(event) {\r\n if (event.node.selected) {\r\n var data = event.node.data;\r\n\r\n if (data.suggestedPrice) { //Si tengo precio sugerido\r\n if (!data.newPrice) //Y no tengo un nuevo precio, le pongo el sugerido al seleccionarlo\r\n changePrice(data.suggestedPrice, event.node);\r\n }\r\n }\r\n else {\r\n if (!event.node.data.hasNewPriceFromDb) {\r\n //si no tenia nuevo precio anterior lo blanqueo\r\n changePrice(null, event.node, true);\r\n }\r\n else if (event.node.data.originalNewPrice) {\r\n //si tenia nuevo precio anterior vuelvo a ese precio\r\n changePrice(event.node.data.originalNewPrice, event.node, true);\r\n }\r\n else if (event.node.data.suggestedPrice) {\r\n self.numberOfSuggestionsAccepted--;\r\n self.percentageOfAcceptedSuggestions = self.numberOfSuggestionsAccepted > 0 ? Math.round((self.numberOfSuggestionsAccepted / self.numberOfSuggestions) * 10000) / 10000 : 0;\r\n }\r\n }\r\n }\r\n\r\n function selectAll(checked) {\r\n self.gridOptions.api.forEachNodeAfterFilter(function (node) {\r\n node.setSelected(checked);\r\n });\r\n }\r\n\r\n function moneyEditor(params) {\r\n if (self.isEndorse) {\r\n return $rootScope.moneyRenderer(params);\r\n }\r\n else {\r\n var editing = false;\r\n\r\n var eCell = document.createElement('div');\r\n eCell.style = \"width:100% !important;height:100% !important\";\r\n eCell.className = \"input-group\";\r\n var eLabel = params.value != null ? document.createTextNode($rootScope.moneyRenderer(params)) : document.createTextNode('');\r\n eCell.appendChild(eLabel);\r\n\r\n var eInput = document.createElement(\"input\");\r\n eInput.type = \"number\";\r\n eInput.step = \"0.01\";\r\n eInput.className = \"form-control\";\r\n var eSpan = document.createElement(\"span\");\r\n eSpan.className = \"input-group-addon\";\r\n eSpan.style = \"margin:0px !important; height: 100% !important; border: 0px; line-height: 100%; font-size:12px !important\";\r\n eSpan.innerText = \"$\";\r\n\r\n\r\n eCell.addEventListener('click', function () {\r\n if (!editing) {\r\n eCell.removeChild(eLabel);\r\n eCell.appendChild(eSpan);\r\n eCell.appendChild(eInput);\r\n eInput.focus();\r\n eInput.value = params.value;\r\n editing = true;\r\n }\r\n });\r\n\r\n eInput.addEventListener('blur', function () {\r\n if (editing) {\r\n editing = false;\r\n eCell.removeChild(eSpan);\r\n eCell.removeChild(eInput);\r\n eCell.appendChild(eLabel);\r\n }\r\n });\r\n\r\n eInput.addEventListener('change', function () {\r\n if (editing) {\r\n editing = false;\r\n if (eInput.value <= 0)\r\n eInput.value = '';\r\n\r\n params.value = eInput.value;\r\n\r\n changePrice(params.value, params.node);\r\n\r\n eLabel.nodeValue = $rootScope.moneyRenderer(params);\r\n eCell.removeChild(eSpan);\r\n eCell.removeChild(eInput);\r\n eCell.appendChild(eLabel);\r\n }\r\n });\r\n\r\n return eCell;\r\n }\r\n }\r\n\r\n function marginGuidelinesAlert(message) {\r\n changePriceAfterGuidelineCheck(changePriceNewPrice, changePriceRowNode);\r\n\r\n //swal({\r\n // title: \"Esta seguro?\",\r\n // text: message,\r\n // type: \"warning\",\r\n // showCancelButton: true,\r\n // confirmButtonColor: \"#1AB394\",\r\n // confirmButtonText: \"Continuar\",\r\n // cancelButtonText: \"Cancelar\",\r\n // closeOnConfirm: false,\r\n // closeOnCancel: false\r\n //},\r\n // function (isConfirm) {\r\n // if (isConfirm) {\r\n // swal(\"Confirmado\", \"Se cambio el precio (requerira endoso)\", \"success\");\r\n // changePriceAfterGuidelineCheck(changePriceNewPrice, changePriceRowNode);\r\n // } else {\r\n // swal(\"Cancelado\", \"Se conservo el precio anterior\", \"error\");\r\n // self.gridOptions.api.refreshRows([changePriceRowNode]);\r\n // }\r\n // });\r\n }\r\n\r\n function showSuggestionModal(data) {\r\n\r\n data.priceSurveys = [];\r\n data.code = data.code.replace(/^0+/, '');\r\n\r\n data.priceSurveyTypes = ['', translations.Basket, 'EXTRA', 'PRICEINDEX', translations.Promotion, translations.Own, 'WEB'];\r\n\r\n var newScope = $scope.$new();\r\n newScope.navigateToPriceMap = function (itemId, priceListId) {\r\n $state.go('prices.priceMap', { itemId: itemId, priceListId: priceListId });\r\n ngDialog.close();\r\n }\r\n\r\n ngDialog.open({\r\n template: 'suggestionDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n data: data,\r\n scope: newScope\r\n });\r\n\r\n priceService.pricesurveys.onlyActive(data.itemId, data.priceListId, false)\r\n .then(function (priceSurveys) {\r\n loadingPriceSurveys = false;\r\n data.priceSurveys = priceSurveys;\r\n });\r\n }\r\n\r\n self.showCurrentPriceLoader = false;\r\n\r\n self.openCurrentPriceModal = function (itemId, salesUnitOfMeasureId, priceListId) {\r\n\r\n var newScope = $scope.$new();\r\n\r\n self.showCurrentPriceLoader = true;\r\n ngDialog.open({\r\n template: 'currentPriceDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-900',\r\n scope: newScope\r\n });\r\n\r\n priceService.decisions.getCurrentPrices(itemId, salesUnitOfMeasureId, priceListId)\r\n .then(function (prices) {\r\n self.currentPrices = prices;\r\n self.showCurrentPriceLoader = false;\r\n\r\n });\r\n }\r\n\r\n self.openRegularPrice = function (itemId, salesUnitOfMeasureId, priceListId) {\r\n\r\n var newScope = $scope.$new();\r\n newScope.regularPrice = 0;\r\n newScope.showRegularPrice = true;\r\n\r\n priceService.decisions.getRegularPrice(itemId, salesUnitOfMeasureId, priceListId)\r\n .then(function (price) {\r\n newScope.regularPrice = price;\r\n newScope.showRegularPrice = false;\r\n });\r\n\r\n ngDialog.open({\r\n template: 'regularPriceDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-300',\r\n scope: newScope\r\n });\r\n }\r\n\r\n function getNewPricesToSaveOrEndorse(itemsToSave, endorse) {\r\n\r\n var newPrices = [];\r\n\r\n if (itemsToSave.length > 0) {\r\n //Como usamos este mismo control para endosar precios tenemos que identificar que acci�n estamos llevando a cabo para pasarsela al objeto que se va a guardar\r\n //2 = Endoso, 1 = Guardado Regular\r\n var priceDecisionAction = endorse ? 2 : 1;\r\n\r\n newPrices = _.map(itemsToSave, function (x) {\r\n return {\r\n priceId: x.priceId,\r\n itemId: x.itemId,\r\n salesUnitOfMeasureId: x.salesUnitOfMeasureId,\r\n priceListId: x.priceListId,\r\n priceType: x.priceType,\r\n _Price: x._Price,\r\n validFrom: x.validFrom,\r\n validTo: x.validTo,\r\n newPrice: x.newPrice,\r\n newValidFrom: x.newValidFrom,\r\n newValidTo: x.newValidTo,\r\n status: x.status,\r\n suggestedPrice: x.suggestedPrice,\r\n priceSuggestionId: x.priceSuggestionId,\r\n priceDecisionAction: priceDecisionAction,\r\n minMargin: x.minMargin,\r\n maxMargin: x.maxMargin,\r\n minVariation: x.minVariation,\r\n maxVariation: x.maxVariation,\r\n significantVariation: x.significantVariation,\r\n significantVariationInMargin: x.significantVariationInMargin,\r\n parentRuleItemId: x.parentRuleItemId,\r\n parentRuleZoneId: x.parentRuleZoneId,\r\n mainItemId: x.mainItemId,\r\n priceListIsBase: x.priceListIsBase,\r\n priceIsFirst: x.priceIsFirst,\r\n mainPriceListId: x.mainPriceListId,\r\n children: _.map(x.children, function (child) {\r\n return {\r\n priceId: child.priceId,\r\n itemId: child.itemId,\r\n salesUnitOfMeasureId: child.salesUnitOfMeasureId,\r\n priceListId: child.priceListId,\r\n _Price: child._Price,\r\n validFrom: child.validFrom,\r\n validTo: child.validTo,\r\n newPrice: child.newPrice,\r\n newValidFrom: child.newValidFrom,\r\n newValidTo: child.newValidTo,\r\n status: child.status,\r\n suggestedPrice: child.suggestedPrice,\r\n priceSuggestionId: child.priceSuggestionId,\r\n priceDecisionAction: child.priceDecisionAction,\r\n minMargin: child.minMargin,\r\n maxMargin: child.maxMargin,\r\n minVariation: child.minVariation,\r\n maxVariation: child.maxVariation,\r\n significantVariation: child.significantVariation,\r\n significantVariationInMargin: child.significantVariationInMargin,\r\n parentRuleItemId: child.parentRuleItemId,\r\n parentRuleZoneId: child.parentRuleZoneId,\r\n mainItemId: child.mainItemId,\r\n priceListIsBase: child.priceListIsBase,\r\n priceIsFirst: child.priceIsFirst,\r\n mainPriceListId: child.mainPriceListId\r\n }\r\n })\r\n }\r\n });\r\n }\r\n\r\n return newPrices;\r\n }\r\n\r\n function saveNewPrices(alertIfNochangesToSave) {\r\n var itemsToSave = [];\r\n\r\n //Agregamos los items seleccionados que tengan un Nuevo Precio distinto al precio actual o un \r\n angular.forEach(self.gridOptions.api.getSelectedNodes(), function (node, key) {\r\n var item = node.data;\r\n\r\n if (item.dirty) {\r\n //tiene que haber un cambio de precio \r\n //o bien ser un precio de zona base donde la sugerencia siempre es igual al precio actual\r\n //o bien ser un precio de tipo competencia, el cual tendr� una extension de fechas al marcar la categor�a como revisada.\r\n if ((item.newPrice && (item.newPrice != item._Price || item.priceListIsBase || item.priceType == 5)) \r\n || (item.newValidFrom && item.newValidFrom != item.validFrom)\r\n || (item.newValidFrom && item.newValidFrom != item.validFrom)) {\r\n itemsToSave.push(item);\r\n }\r\n }\r\n });\r\n\r\n var newPrices = getNewPricesToSaveOrEndorse(itemsToSave, false);\r\n\r\n if (itemsToSave.length > 0) {\r\n return priceService.decisions.saveNewPrices($stateParams.categoryId, newPrices);\r\n }\r\n else if (alertIfNochangesToSave) {\r\n $timeout(function () {\r\n swal(translations.Attention, translations.NoChangesWereRecorded, \"warning\");\r\n }, 500);\r\n }\r\n }\r\n\r\n function markAsReviewed(priceType) {\r\n\r\n var subCategory = $stateParams.subcategory != '' ? $stateParams.subcategory : ' ';\r\n\r\n priceService.decisions.markAsReviewed($stateParams.categoryId, $stateParams.categoryGroup, $stateParams.category, subCategory, priceType, true)\r\n .then(function () {\r\n swal(translations.ConfirmedSwal, translations.ConfirmedSwalSubtitle, \"success\");\r\n loadData();\r\n },\r\n function () {\r\n swal(translations.ErrorTitleSwal, translations.ErrorWhenWantingToMarkThisCategoryAsRevised, \"error\");\r\n }).catch(function (fallback) {\r\n console.log(fallback);\r\n });\r\n }\r\n\r\n function isExternalFilterPresent() {\r\n return self.selectedFilterForStatus != translations.All || self.selectedFilterForPriceList != translations.Allf || self.selectedFilterForSensitivities != translations.Allf || selectedFilterForText != '' || self.selectedFilterForPriceType != translations.All || self.selectedFilterForIssues != translations.Allf || self.selectedFilterForAction != translations.Allf;\r\n }\r\n\r\n function showParentBecauseOfChildStatus(rowNode) {\r\n var filter = false;\r\n\r\n if (rowNode.data.children && rowNode.data.children.length > 0) {\r\n\r\n for (i = 0; i < rowNode.data.children.length; i++) {\r\n var childNode = rowNode.data.children[i];\r\n\r\n switch (self.selectedFilterForStatus) {\r\n case translations.ForEndorsement: filter = (childNode.status == 1); break;\r\n case translations.Endorsed: filter = (childNode.status == 2); break;\r\n case translations.New: filter = (childNode.newPrice != null); break;\r\n case translations.Suggested: filter = (childNode.suggestedPrice != null && childNode.priceSuggestionStatus == 0); break;\r\n default: filter = true; break;\r\n }\r\n\r\n //Si el resultado fue True, dejo de evaluar. Si fue false sigo evaluando el resto de los hijos\r\n if (filter)\r\n break;\r\n }\r\n }\r\n\r\n return filter;\r\n }\r\n\r\n var rowNodeDataComparative;//variable auxiliar para comparar dentro de la funcion doesExternalFilterPass\r\n\r\n function doesExternalFilterPass(node) {\r\n\r\n var filter1 = true;\r\n var filter2 = true;\r\n var filter3 = true;\r\n var filter4 = true;\r\n var filter5 = true;\r\n var filter6 = true;\r\n var filter7 = true;\r\n\r\n var rowNode = node;\r\n if (node.parent != null)\r\n rowNode = node.parent;\r\n\r\n filter1 = (rowNode.data.priceList == self.selectedFilterForPriceList || self.selectedFilterForPriceList == translations.Allf);\r\n\r\n switch (self.selectedFilterForStatus) {\r\n case translations.ForEndorsement: filter2 = (rowNode.data.status == 1 && rowNode.data.readyToEndorse); break;\r\n case translations.Endorsed: filter2 = (rowNode.data.status == 2); break;\r\n case translations.New: filter2 = (rowNode.data.newPrice != null); break;\r\n case translations.Suggested: filter2 = (rowNode.data.suggestedPrice != null && rowNode.data.priceSuggestionStatus == 0); break;\r\n default: filter2 = true; break;\r\n }\r\n\r\n //Si el padre no cumple con las condiciones de arriba, entonces chequeo si los hijos las cumplen\r\n //TODO: por ahora esto se hace con el status. Chequear si lo tenemos que hacer tambien con los otros Filtros.\r\n if (!filter2) {\r\n filter2 = showParentBecauseOfChildStatus(rowNode);\r\n }\r\n\r\n var splittedText = selectedFilterForText.split(';');\r\n filter3 = (selectedFilterForText == ''\r\n || (rowNode.data.code != null && rowNode.data.code.toLowerCase().indexOf(selectedFilterForText.toLowerCase()) != -1)\r\n || (rowNode.data.description != null && rowNode.data.description.toLowerCase().indexOf(selectedFilterForText.toLowerCase()) != -1)\r\n || (rowNode.data.brand != null && rowNode.data.brand.toLowerCase().indexOf(selectedFilterForText.toLowerCase()) != -1)\r\n || (rowNode.data.manufacturer != null && rowNode.data.manufacturer.toLowerCase().indexOf(selectedFilterForText.toLowerCase()) != -1))\r\n || (rowNode.data.tags != null && containsAllTags(splittedText, rowNode.data.tags));\r\n\r\n if (!filter3) {\r\n var children = rowNode.data.children;\r\n angular.forEach(children, function (c) {\r\n if (selectedFilterForText == ''\r\n || (c.code != null && c.code.toLowerCase().indexOf(selectedFilterForText.toLowerCase()) != -1)\r\n || (c.description != null && c.description.toLowerCase().indexOf(selectedFilterForText.toLowerCase()) != -1)\r\n || (c.brand != null && c.brand.toLowerCase().indexOf(selectedFilterForText.toLowerCase()) != -1)\r\n || (c.manufacturer != null && c.manufacturer.toLowerCase().indexOf(selectedFilterForText.toLowerCase()) != -1)\r\n || (c.tags != null && containsAllTags(splittedText, c.tags)))\r\n {\r\n filter3 = true;\r\n }\r\n });\r\n }\r\n\r\n filter4 = (self.priceTypes[rowNode.data.priceType + 1] == self.selectedFilterForPriceType || self.selectedFilterForPriceType == translations.All);\r\n\r\n /*\r\n if (rowNode.data.itemCode == '466522') {\r\n console.log(rowNode.data.significantVariation);\r\n console.log(rowNode.data.significantVariationInMargin);\r\n console.log(Math.abs(rowNode.data.newImpact));\r\n }\r\n */\r\n\r\n rowNodeDataComparative = rowNode.data;\r\n if (rowNodeDataComparative.newPrice == null && rowNodeDataComparative.suggestedPrice != null)\r\n rowNodeDataComparative = simulateSuggestionAcceptance(rowNodeDataComparative); //simula cambio de precio para calcular los datos necesarios para pasar por FilterForIssues y FilterForAction \r\n\r\n switch (self.selectedFilterForIssues) {\r\n case translations.NewPrices: filter5 = (rowNode.data.priceIsFirst == true); break;\r\n case translations.StrongFalls: filter5 = (rowNodeDataComparative.newPrice != null && rowNode.data.minVariation != null && rowNode.data.minVariation != 0 && rowNodeDataComparative.priceDelta < rowNode.data.minVariation); break;\r\n case translations.StrongRises: filter5 = (rowNodeDataComparative.newPrice != null && rowNode.data.maxVariation != null && rowNode.data.maxVariation != 0 && rowNodeDataComparative.priceDelta > rowNode.data.maxVariation); break;\r\n case translations.DepressedMargins: filter5 = (rowNodeDataComparative.newPrice != null && rowNode.data.minMargin != null && rowNode.data.minMargin != 0 && rowNodeDataComparative.newGrossMargin < rowNode.data.minMargin); break;\r\n case translations.HighMargins: filter5 = (rowNodeDataComparative.newPrice != null && rowNode.data.maxMargin != null && rowNode.data.maxMargin != 0 && rowNodeDataComparative.newGrossMargin > rowNode.data.maxMargin); break;\r\n case translations.NegativeMargins: filter5 = (rowNodeDataComparative.newGrossMargin != null && rowNodeDataComparative.newGrossMargin < 0); break;\r\n case translations.LittleSignificantChanges: filter5 = ((rowNodeDataComparative.newPrice != null && rowNode.data.significantVariation != null && rowNode.data.significantVariation != 0 && Math.abs(rowNodeDataComparative.priceDelta) < rowNode.data.significantVariation)\r\n || (rowNodeDataComparative.newPrice != null && rowNode.data.significantVariationInMargin != null && rowNode.data.significantVariationInMargin != 0 && Math.abs(rowNodeDataComparative.newImpact) < rowNode.data.significantVariationInMargin)); break;\r\n case translations.SuggestedNotRespected: filter5 = (rowNodeDataComparative.newPrice != null && rowNodeDataComparative.newPrice != 0 && rowNode.data.suggestedPrice != null && rowNode.data.suggestedPrice != 0 && rowNode.data.suggestedPrice != rowNodeDataComparative.newPrice); break;\r\n case translations.Overlaps: filter5 = (rowNode.data.overlappingPromotions && rowNode.data.overlappingPromotions.length > 0); break;\r\n\r\n default: filter5 = true; break;\r\n }\r\n\r\n switch (self.selectedFilterForAction) {\r\n case translations.Falls: filter6 = (rowNodeDataComparative.newPrice != null && rowNodeDataComparative.newPrice != 0 && rowNodeDataComparative.newPrice < rowNode.data._Price); break;\r\n case translations.Rises: filter6 = (rowNodeDataComparative.newPrice != null && rowNodeDataComparative.newPrice != 0 && rowNodeDataComparative.newPrice > rowNode.data._Price); break;\r\n default: filter6 = true; break;\r\n }\r\n\r\n //Filter by sensitivities\r\n filter7 = (rowNode.data.sensitivities && rowNode.data.sensitivities.toLowerCase() == self.selectedFilterForSensitivities.toLowerCase() || self.selectedFilterForSensitivities == translations.Allf || (self.selectedFilterForSensitivities == translations.Any && !rowNode.data.sensitivities));\r\n\r\n return filter1 && filter2 && filter3 && filter4 && filter5 && filter6 && filter7;\r\n }\r\n\r\n function externalFilterChanged() {\r\n self.gridOptions.api.onFilterChanged();\r\n }\r\n\r\n function changePrice(newPrice, rowNode, revert) {\r\n\r\n var isRevert = revert ? true : false;\r\n\r\n if (rowNode.data._Price != null) {\r\n if (newPrice != null && newPrice != '' && newPrice != 0) {\r\n //guardo el precio anterior para no incrementar el conta=dor de cambios si es una modificacion del mismo precio\r\n var oldNewPrice = rowNode.data.newPrice;\r\n\r\n //si viene con un newPrice de la BBDD y lo estoy cambiando lo guardo en originalNewPrice para poder hacer un posible revert\r\n if (rowNode.data.hasNewPriceFromDb && rowNode.data.newPrice && !rowNode.data.originalNewPrice) {\r\n rowNode.data.originalNewPrice = rowNode.data.newPrice\r\n }\r\n\r\n //Chequeo que est� cumpliendo con los lineamientos de margen\r\n var cost = rowNode.data.newCost != null ? rowNode.data.newCost : rowNode.data.cost;\r\n var tax = rowNode.data.newTax != null ? rowNode.data.newTax : rowNode.data.tax;\r\n var taxRate = rowNode.data.newTaxRate != null ? rowNode.data.newTaxRate : rowNode.data.taxRate;\r\n rowNode.data.newGrossMarginAbs = (cost + tax) != 0 ? (((newPrice - tax) / (1 + taxRate)) - cost) : 0;\r\n\r\n //Actualizo variables relacionadas al nuevo precio\r\n rowNode.data.newGrossMargin = (cost + tax) != 0 ? (((newPrice - tax) / (1 + taxRate)) - cost) / (((newPrice - tax) / (1 + taxRate)) + tax) : null;\r\n changePriceNewImpact = (rowNode.data.newGrossMarginAbs - rowNode.data.grossMarginAbs) * rowNode.data.units;\r\n rowNode.data.newPrice = newPrice;\r\n rowNode.data.priceDelta = (newPrice / rowNode.data._Price) - 1;\r\n rowNode.data.priceDeltaAmount = newPrice - rowNode.data._Price;\r\n rowNode.data.competitorsPriceVsNew = rowNode.data.competitorsPrice != 0 && rowNode.data.competitorsPrice != null ? (newPrice / rowNode.data.competitorsPrice) - 1 : 0;\r\n rowNode.data.newSales = newPrice * rowNode.data.units;\r\n\r\n //Si la sugerencia tiene fechas de vigencia y el campo de nuevas fechas est� en nulo, entonces seteo las fechas de la sugerencia\r\n if (rowNode.data.newValidFrom == null && rowNode.data.priceSuggestionValidFrom != null)\r\n rowNode.data.newValidFrom = rowNode.data.priceSuggestionValidFrom;\r\n\r\n if (rowNode.data.newValidTo == null && rowNode.data.priceSuggestionValidTo != null)\r\n rowNode.data.newValidTo = rowNode.data.priceSuggestionValidTo;\r\n\r\n //Chequeo si esta fuera de Guidelines\r\n var outOfGuidelines = false;\r\n if (rowNode.data._Price != null) {\r\n if (newPrice != null && newPrice != '') {\r\n if (rowNode.data.minMargin != 0 && rowNode.data.newGrossMargin < rowNode.data.minMargin) {\r\n outOfGuidelines = true;\r\n //marginGuidelinesAlert(\"El nuevo margen: \" + $rootScope.toPercentage(rowNode.data.newGrossMargin) + \" es menor al margen minimo: \" + $rootScope.toPercentage(rowNode.data.minMargin));\r\n }\r\n if (rowNode.data.maxMargin != 0 && rowNode.data.newGrossMargin > rowNode.data.maxMargin) {\r\n outOfGuidelines = true;\r\n //marginGuidelinesAlert(\"El nuevo margen: \" + $rootScope.toPercentage(rowNode.data.newGrossMargin) + \" es mayor al margen maximo: \" + $rootScope.toPercentage(rowNode.data.maxMargin));\r\n }\r\n }\r\n }\r\n rowNode.data.outOfGuidelines = true;\r\n\r\n //Hago esto para evitar sumarlo 2 veces\r\n if (rowNode.data.newPrice != null && rowNode.data.newPrice != '' && rowNode.data.newPrice != 0) {\r\n if (oldNewPrice == null)\r\n self.numberOfNewPrices++;\r\n\r\n self.salesWithNewPrices += (newPrice - rowNode.data._Price) * rowNode.data.units;\r\n }\r\n else {\r\n self.salesWithNewPrices += (newPrice - rowNode.data.newPrice) * rowNode.data.units;\r\n }\r\n\r\n self.averagePriceChanges = Math.round((self.salesWithNewPrices / self.salesWithCurrentPrices - 1) * 10000) / 10000;\r\n self.averagePriceNewVsSuggestedChanges = Math.round((self.salesWithNewPrices / self.salesWithSuggestedPrices - 1) * 10000) / 10000;\r\n\r\n rowNode.data.dirty = isRevert ? false : true;\r\n\r\n //Cambios en los KPIs del Header\r\n self.newImpact += changePriceNewImpact - rowNode.data.newImpact;\r\n self.newImpactShare = self.newImpact / self.categoryMargin; //Impacto sobre total margen de la categoria\r\n\r\n self.percentageOfChanges = 0;\r\n self.percentageOfChangesVsSuggested = 0;\r\n\r\n rowNode.data.newImpact = changePriceNewImpact;\r\n\r\n if (!rowNode.selected && !isRevert)\r\n rowNode.setSelected(true);\r\n }\r\n else {\r\n //Hago esto para evitar restarlo 2 veces\r\n if (rowNode.data.newPrice != null && rowNode.data.newPrice != '') {\r\n self.numberOfNewPrices--;\r\n\r\n self.salesWithNewPrices -= (rowNode.data.newPrice - rowNode.data._Price) * rowNode.data.units;\r\n\r\n self.averagePriceChanges = Math.round((self.salesWithNewPrices / self.salesWithCurrentPrices - 1) * 10000) / 10000;\r\n self.averagePriceNewVsSuggestedChanges = Math.round((self.salesWithNewPrices / self.salesWithSuggestedPrices - 1) * 10000) / 10000;\r\n }\r\n\r\n //Cambios en los KPIs del Header\r\n self.newImpact -= rowNode.data.newImpact;\r\n self.newImpactShare = self.newImpact / self.categoryMargin; //Impacto sobre total margen de la categoria\r\n\r\n self.percentageOfChanges = 0;\r\n self.percentageOfChangesVsSuggested = 0;\r\n\r\n rowNode.data.newPrice = null;\r\n rowNode.data.priceDelta = null;\r\n rowNode.data.priceDeltaAmount = null;\r\n rowNode.data.newImpact = null;\r\n rowNode.data.newGrossMargin = null;\r\n rowNode.data.competitorsPriceVsNew = null;\r\n rowNode.data.newValidFrom = null;\r\n rowNode.data.newValidTo = null;\r\n }\r\n\r\n if (rowNode.data.suggestedPrice != null) {\r\n if (newPrice == rowNode.data.suggestedPrice) {\r\n self.numberOfSuggestionsAccepted++;\r\n }\r\n else if (!rowNode.selected) {\r\n self.numberOfSuggestionsAccepted--;\r\n }\r\n self.percentageOfAcceptedSuggestions = self.numberOfSuggestionsAccepted > 0 ? Math.round((self.numberOfSuggestionsAccepted / self.numberOfSuggestions) * 10000) / 10000 : 0;\r\n }\r\n\r\n self.gridOptions.api.refreshRows([rowNode]);\r\n }\r\n }\r\n\r\n //recibe un rowNode.data y retorna un objeto con datos calculados simulando una aceptacion de sugerido. Sirve para obtener valores de campos que se calculan en la funcion changePrice\r\n function simulateSuggestionAcceptance(rowNodeData) {\r\n let rv = {};\r\n if (rowNodeData._Price != null && rowNodeData.suggestedPrice != null && rowNodeData.suggestedPrice != '' && rowNodeData.suggestedPrice != 0) {\r\n\r\n var cost = rowNodeData.newCost != null ? rowNodeData.newCost : rowNodeData.cost;\r\n var tax = rowNodeData.newTax != null ? rowNodeData.newTax : rowNodeData.tax;\r\n var taxRate = rowNodeData.newTaxRate != null ? rowNodeData.newTaxRate : rowNodeData.taxRate;\r\n\r\n rv.newGrossMarginAbs = (cost + tax) != 0 ? (((rowNodeData.suggestedPrice - tax) / (1 + taxRate)) - cost) : 0;\r\n rv.newGrossMargin = (cost + tax) != 0 ? (((rowNodeData.suggestedPrice - tax) / (1 + taxRate)) - cost) / (((rowNodeData.suggestedPrice - tax) / (1 + taxRate)) + tax) : null;\r\n rv.newImpact = (rowNodeData.newGrossMarginAbs - rowNodeData.grossMarginAbs) * rowNodeData.units;\r\n rv.newPrice = rowNodeData.suggestedPrice;\r\n rv.priceDelta = (rowNodeData.suggestedPrice / rowNodeData._Price) - 1;\r\n rv.priceDeltaAmount = rowNodeData.suggestedPrice - rowNodeData._Price;\r\n rv.newSales = rowNodeData.suggestedPrice * rowNodeData.units;\r\n\r\n }\r\n return rv;\r\n }\r\n\r\n function IsVariationOutOfGuidelines(data) {\r\n\r\n var outOfGuidelines = false;\r\n\r\n if (data.newPrice) {\r\n if (data.minVariation != null && data.priceDelta < data.minVariation) {\r\n outOfGuidelines = true;\r\n }\r\n if (data.maxVariation != null && data.priceDelta > data.maxVariation) {\r\n outOfGuidelines = true;\r\n }\r\n }\r\n\r\n return outOfGuidelines;\r\n }\r\n\r\n function IsVariationAmountOutOfGuidelines(data) {\r\n\r\n var outOfGuidelines = false;\r\n\r\n if (data.newPrice) {\r\n if (data.minVariationAmount != null && data.priceDeltaAmount < data.minVariationAmount) {\r\n outOfGuidelines = true;\r\n }\r\n\r\n if (data.maxVariationAmount != null && data.priceDeltaAmount > data.maxVariationAmount) {\r\n outOfGuidelines = true;\r\n }\r\n }\r\n\r\n return outOfGuidelines;\r\n }\r\n\r\n function IsMarginOutOfGuidelines(data) {\r\n\r\n var outOfGuidelines = false;\r\n\r\n if (data.newPrice) {\r\n if (data.minMargin != null && data.newGrossMargin < data.minMargin) {\r\n outOfGuidelines = true;\r\n }\r\n\r\n if (data.maxMargin != null && data.newGrossMargin > data.maxMargin) {\r\n outOfGuidelines = true;\r\n }\r\n }\r\n\r\n return outOfGuidelines;\r\n }\r\n\r\n function IsMarginAmountOutOfGuidelines(data) {\r\n\r\n var outOfGuidelines = false;\r\n\r\n if (data.newPrice) {\r\n\r\n if (data.minMarginAmount != null && data.newGrossMarginAbs < data.minMarginAmount) {\r\n outOfGuidelines = true;\r\n }\r\n\r\n if (data.maxMarginAmount != null && data.newGrossMarginAbs > data.maxMarginAmount) {\r\n outOfGuidelines = true;\r\n }\r\n }\r\n\r\n return outOfGuidelines;\r\n }\r\n\r\n function resetKPIs() {\r\n changePriceNewImpact = 0;\r\n self.numberOfNewPrices = 0;\r\n self.averagePriceChanges = 0;\r\n self.averagePriceNewVsSuggestedChanges = 0;\r\n self.newImpact = 0;\r\n self.newImpactShare = 0;\r\n self.percentageOfChanges = 0;\r\n self.percentageOfChangesVsSuggested = 0;\r\n self.numberOfSuggestionsAccepted = 0;\r\n self.suggestedImpact = 0;\r\n self.categoryMargin = 0;\r\n self.salesWithCurrentPrices = 0;\r\n self.salesWithSuggestedPrices = 0;\r\n self.numberOfSuggestions = 0;\r\n\r\n self.salesWithNewPrices = 0;\r\n\r\n self.suggestedImpactShare = 0;\r\n\r\n }\r\n\r\n function loadData() {\r\n\r\n if (self.gridOptions.api)\r\n self.gridOptions.api.showLoadingOverlay();\r\n\r\n resetKPIs();\r\n\r\n /*\r\n var oldSelected = [];\r\n if (self.gridOptions.api != null)\r\n oldSelected = self.gridOptions.api.getSelectedNodes();\r\n */\r\n var selectedStatus = 0; //0 = All, 1 = New / Suggested, 2 = ToEndorse / Endorsed\r\n\r\n switch (self.selectedFilterForStatus) {\r\n case translations.New: selectedStatus = 1; break; //New \r\n case translations.Suggested: selectedStatus = 2; break; //Suggested\r\n default: selectedStatus = 0; break; //All\r\n }\r\n\r\n priceService.decisions.getPrices($stateParams.categoryId, self.isEndorse, selectedStatus)\r\n .then(function (prices) {\r\n\r\n self.allPrices = prices;\r\n self.gridOptions.api.setRowData(prices);\r\n\r\n if (prices.length > 0) {\r\n\r\n externalFilterChanged();\r\n\r\n self.category = prices[0].category;\r\n\r\n //suggestedImpact\r\n self.gridOptions.api.forEachNode(function (node) {\r\n\r\n //agrego algunos extra al dto\r\n node.data.hasNewPriceFromDb = node.data.newPrice ? true : false;\r\n node.data.outOfGuidelines = false;\r\n\r\n //Sumarizo\r\n self.suggestedImpact += node.data.suggestedImpact;\r\n self.categoryMargin += node.data.grossMarginAbs * node.data.units;\r\n self.salesWithCurrentPrices += node.data._Price * node.data.units;\r\n\r\n if (node.data.newPrice > 0) {\r\n self.salesWithNewPrices += node.data.newPrice * node.data.units;\r\n self.numberOfNewPrices++;\r\n }\r\n else\r\n self.salesWithNewPrices += node.data._Price * node.data.units;\r\n\r\n if (node.data.suggestedPrice > 0)\r\n self.salesWithSuggestedPrices += node.data.suggestedPrice * node.data.units;\r\n else\r\n self.salesWithSuggestedPrices += node.data._Price * node.data.units;\r\n\r\n if (node.data.suggestedPrice > 0)\r\n self.numberOfSuggestions++;\r\n\r\n self.newImpact += node.data.newImpact;\r\n\r\n /*\r\n //TODO: Esto es para recuperar los items seleccionados si es que se vuelve a cargar la data??\r\n for (var i = 0; i < oldSelected.length; i++) {\r\n if (oldSelected[i].data.itemId == node.data.itemId && oldSelected[i].data.priceListId == node.data.priceListId) {\r\n node.setSelected(true);\r\n }\r\n }\r\n */\r\n });\r\n\r\n self.newImpactShare = self.newImpact / self.categoryMargin; //Impacto sobre total margen de la categoria\r\n self.suggestedImpactShare = self.suggestedImpact / self.categoryMargin;\r\n\r\n self.averagePriceChanges = Math.round((self.salesWithNewPrices / self.salesWithCurrentPrices - 1) * 10000) / 10000;\r\n self.averagePriceNewVsSuggestedChanges = Math.round((self.salesWithNewPrices / self.salesWithSuggestedPrices - 1) * 100) / 100;\r\n }\r\n\r\n //loadChartData();\r\n });\r\n }\r\n\r\n function loadPricelists() {\r\n priceService.pricelists.getPriceLists()\r\n .then(function (pricelists) {\r\n for (var i = 0; i < pricelists.length; i++) {\r\n self.pricelists.push(pricelists[i])\r\n }\r\n });\r\n }\r\n\r\n function loadTags() {\r\n adminService.tags.getTags()\r\n .then(function (tags) {\r\n self.tags = tags;\r\n });\r\n }\r\n function loadSensitivities() {\r\n priceService.itemSensitivities.getItemSensitivities()\r\n .then(function (sensitivities) {\r\n self.itemSensitivities = sensitivities;\r\n self.itemSensitivities.push({ code: '', name: translations.Allf });\r\n self.itemSensitivities.push({ code: '', name: translations.Any });\r\n });\r\n }\r\n\r\n function getDataFromCategorySummary() {\r\n //Seteo el titulo tipo Breadcrumb\r\n var categoryGroup = decodeURIComponent($stateParams.categoryGroup.replace(/-/g, \" \").replace(/_/g, \"\\/\"));\r\n var category = decodeURIComponent($stateParams.category.replace(/-/g, \" \").replace(/_/g, \"\\/\"));\r\n var subcategory = decodeURIComponent($stateParams.subcategory.replace(/-/g, \" \").replace(/_/g, \"\\/\"));\r\n\r\n self.title = categoryGroup\r\n if (category != '') {\r\n self.title += ' / ' + category;\r\n if (subcategory != '') {\r\n self.title += ' / ' + subcategory;\r\n }\r\n }\r\n }\r\n\r\n /*\r\n function loadChartData() {\r\n //Traigo data para el chart\r\n priceService.decisions.getPriceDashboard($stateParams.categoryId)\r\n .then(function (priceDashboard) {\r\n self.priceDashboard = priceDashboard;\r\n\r\n self.updateChart(self.timerange);\r\n });\r\n }\r\n */\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n //init columnDefs and gridOptions\r\n setGridOptions();\r\n\r\n priceService.getPriceTypes().then(\r\n function (priceTypes) {\r\n self.priceTypes = priceTypes;\r\n });\r\n\r\n\r\n $translate([\"PricesOfThisCategoryAsRevised\", \"CompetitionPricesOfThisCategoryAsRevised\", \"NormalPricesOfThisCategoryAsRevised\", \"DiscardConfirmTitle\", \"ContinueSwal \", \"CancelSwal\", \"ErrorTitleSwal\", \"ErrorSwalSubtitle\"\r\n , \"WantToNotifyEndorsement\", \"ConfirmedSwal\", \"TheEndorsementWasNotified\", \"ErrorWhenWantingNotifyEndorsement\", \"AreYouSureSwalSubtitle\", \"AreYouSureSwal\", \"ConfirmedSwalSubtitle\", \"IgnoreSelectedSuggestions\", \"ConfirmedIgnoreSelectedSuggestions\"\r\n , \"ErrorWhenWantingIgnoreSuggestions\", \"NoChangesWereRecorded\", \"EndorseTheSelectedPrices\", \"ConfirmedEndorseTheSelectedPrices\", \"ErrorWhenWantingEndorsePrices\", \"RejectionComment\", \"RejectionCommentSubtitle\", \"RejectedItems\"\r\n , \"RejectedItemsSubtitle\", \"ModifyMarginIn\", \"ModifyMarginSubtitle\", \"EnterNewMarginValue\", \"YouMustEnterValue \", \"YouMustEnterNumericValue\", \"MarginUpdated\", \"TheMarginWasUpdatedCorrectly1\", \"TheMarginWasUpdatedCorrectly2\", \"SelectAtLeastOnePriceToContinue\"\r\n , \"EnterNewMarginValueforSelectedProducts\", \"GeneralInformation\", \"Subcategory\", \"Code\", \"Description\", \"Area\", \"Brand\", \"Maker\", \"Tags\", \"NewPrice\", \"Present\", \"SuggestedS\", \"NewSingular\", \"CurrentPrice1\", \"Current\", \"From\", \"To\", \"Cost\", \"Original\", \"Average\", \"LastCost\"\r\n , \"CompetitivenessIndex\", \"Competitor\", \"SuggestedCI\", \"NewCI\", \"Sale\", \"Volume\", \"SalesInDollars\", \"NewSale\", \"Impact\", \"SuggestedS\", \"NewSingular\", \"Margin\", \"Present\", \"CurrentAverage\", \"SuggestedS\", \"PercentajeNew\", \"DolarNew\", \"Target\", \"Minimum\", \"Maximum\"\r\n , \"ValidityDates\", \"FromN\", \"ToN\", \"OverlapsAbbreviation\", \"Attention\", \"ErrorWhenWantingToMarkThisCategoryAsRevised\", \"UnitOfMeasureOfSale\", \"TypeOfPrice\", \"TypeOfPriceForce\", \"ValueIn\", \"UpdateDates\", \"UpdateDatesSubtitleOp1\", \"UpdateDatesSubtitleOp2\", \"Suggested\"\r\n , \"New\", \"Endorsed\", \"ForEndorsement\", \"All\", \"Allf\",\"Any\",\"Falls\", \"Rises\", \"NewPrices\", \"StrongFalls\", \"StrongRises\", \"DepressedMargins\", \"HighMargins\", \"NegativeMargins\", \"LittleSignificantChanges\", \"SuggestedNotRespected\", \"Overlaps\", \"ClickHereToLoadTags\", \"ThePriceVariationLimitHasBeenExceeded\"\r\n , \"TheMarginsLimitHasBeenExceeded\", \"ThisPriceHasAnOverlapWithAPromotion\", \"Basket\", \"Promotion\", \"Own\", \"SuggestedAverage\", \"Sensitivity\"])\r\n .then(function (all) {\r\n translations = all;\r\n self.pricelists = [{ id: 0, name: translations.Allf }];\r\n self.selectedFilterForPriceList = translations.Allf;\r\n self.selectedFilterForPriceType = translations.All;\r\n self.selectedFilterForIssues = translations.Allf;\r\n self.selectedFilterForAction = translations.Allf;\r\n self.selectedFilterForSensitivities = translations.Allf;\r\n self.selectedFilterForStatus = self.isEndorse ? translations.ForEndorsement : self.isNewFilter ? translations.New : translations.Suggested;\r\n setColumnDefinitions();\r\n self.gridOptions.api.setColumnDefs(columnDefs);\r\n\r\n //Load data for title and endorsement\r\n getDataFromCategorySummary();\r\n loadPricelists();\r\n loadTags();\r\n loadSensitivities();\r\n\r\n //load data\r\n loadData();\r\n });\r\n }\r\n\r\n init();\r\n\r\n });","angular.module(\"prisma\")\r\n .controller(\"EditCostCtrl\", function ($scope, $state, $stateParams, priceService, $timeout, $translate) {\r\n\r\n //Variable globales\r\n var self = this;\r\n\r\n var currentDate = new Date();\r\n\r\n self.subsidy = 0;\r\n\r\n self.calculatedCost = 0;\r\n\r\n self.item = {\r\n id: 0,\r\n tax: 0,\r\n taxRate: 0,\r\n orderUnitOfMeasureId: 0,\r\n orderUnitOfMeasureCode: '',\r\n code: '',\r\n name: ''\r\n };\r\n\r\n self.cost = {\r\n id: 0,\r\n vendorId: 0,\r\n itemId: 0,\r\n storeId: 0,\r\n itemName: '',\r\n itemCode: '',\r\n storeCode: '',\r\n vendorCode: '',\r\n orderUnitOfMeasureId: 0,\r\n orderUnitOfMeasureCode: '',\r\n subsidy: 0,\r\n cost: 0,\r\n tax: 0,\r\n validFrom: currentDate\r\n }\r\n\r\n self.itemChanged = function () {\r\n //console.log(self.item);\r\n\r\n self.cost.itemId = self.item.id;\r\n self.cost.tax = self.item.tax;\r\n self.cost.taxRate = self.item.taxRate;\r\n self.cost.orderUnitOfMeasureId = self.item.orderUnitOfMeasureId;\r\n self.cost.orderUnitOfMeasureCode = self.item.orderUnitOfMeasureCode;\r\n }\r\n\r\n self.vendors = [];\r\n\r\n self.items = [];\r\n\r\n self.distributionCenters = [];\r\n\r\n\r\n\r\n self.isDisabled = function () {\r\n //console.log('cost', self.cost);\r\n if (!self.cost.cost) {\r\n return true;\r\n }\r\n\r\n if (!self.cost.vendorId) {\r\n return true;\r\n }\r\n\r\n\r\n\r\n if (!self.cost.itemId) {\r\n return true;\r\n }\r\n\r\n if (!self.cost.storeId) {\r\n return true;\r\n }\r\n\r\n if (!self.cost.truckCost) {\r\n return true;\r\n }\r\n\r\n //if (!self.cost.subsidy) {\r\n // return true;\r\n //}\r\n return false;\r\n }\r\n\r\n $scope.$watch('ct.cost', function (newVal, oldVal) {\r\n if (newVal.cost > 0) {\r\n if (!newVal.subsidy)\r\n newVal.subsidy = 0;\r\n\r\n self.calculatedCost = newVal.cost - (newVal.cost * newVal.subsidy / 100) + newVal.truckCost;\r\n }\r\n }, true);\r\n\r\n\r\n //Funciones\r\n self.save = function (generateSuggestions) {\r\n\r\n if (self.cost.id == 0 && self.cost.validFrom < currentDate) {\r\n swal(translations.ErrorTitleSwal, translations.ValidationOfDates, \"error\");\r\n\r\n self.cost.validFrom = currentDate;\r\n }\r\n else {\r\n var title = translations.YouWantToSaveThisNewCost;\r\n if (generateSuggestions)\r\n title = translations.YouWantToSaveThisNewCostSubtitle;\r\n\r\n swal({\r\n title: title,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.Save,\r\n cancelButtonText: translations.Cancel,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n self.cost.cost = self.calculatedCost;\r\n\r\n if (self.cost.subsidy > 1)\r\n swal(translations.ErrorTitleSwal, translations.TheSubsidyCanNotBeGreaterThan100, 'error');\r\n else {\r\n if (!generateSuggestions) {\r\n priceService.costs.save(self.cost)\r\n .then(function (status) {\r\n swal(translations.SavedCost, translations.HasBeenSuccessfullySavedSwal, 'success');\r\n\r\n $state.go('prices.costs');\r\n });\r\n }\r\n else {\r\n priceService.costs.saveAndGenerateSuggestions(self.cost)\r\n .then(function (suggestions) {\r\n var message = translations.SavedCostSubtitle + (suggestions > 0 ? translations.SavedCostSubtitle1 + suggestions + translations.SavedCostSubtitle2 : '');\r\n swal(translations.SavedCost, message, 'success');\r\n\r\n $state.go('prices.costs');\r\n });\r\n }\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n\r\n\r\n self.storeSelected = function () {\r\n angular.forEach(self.distributionCenters, function (distributionCenter) {\r\n if (distributionCenter.id == self.cost.storeId) {\r\n self.cost.storeCode = distributionCenter.code;\r\n }\r\n });\r\n }\r\n\r\n self.vendorSelected = function () {\r\n angular.forEach(self.vendors, function (vendor) {\r\n if (vendor.id == self.cost.vendorId) {\r\n self.cost.vendorCode = vendor.code;\r\n }\r\n });\r\n }\r\n\r\n self.itemSelected = function () {\r\n angular.forEach(self.items, function (item) {\r\n if (item.id == self.cost.itemId) {\r\n self.cost.tax = item.tax;\r\n self.cost.taxRate = item.taxRate;\r\n self.cost.orderUnitOfMeasureId = item.orderUnitOfMeasureId;\r\n self.cost.orderUnitOfMeasureCode = item.orderUnitOfMeasureCode;\r\n }\r\n });\r\n }\r\n\r\n\r\n function getVendors() {\r\n\r\n priceService.costs.getVendors()\r\n .then(function (vendors) {\r\n self.vendors = vendors;\r\n if (vendors != null && vendors.length > 0) {\r\n self.cost.vendorCode = vendors[0].code;\r\n self.cost.vendorId = vendors[0].id;\r\n }\r\n });\r\n\r\n }\r\n\r\n function getDistributionCenters() {\r\n\r\n priceService.costs.getDistributionCenters()\r\n .then(function (distributionCenters) {\r\n self.distributionCenters = distributionCenters;\r\n });\r\n\r\n }\r\n\r\n function getItems() {\r\n\r\n priceService.costs.getItems()\r\n .then(function (items) {\r\n self.items = items;\r\n });\r\n\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n $translate([\"ErrorTitleSwal\", \"ValidationOfDates\", \"YouWantToSaveThisNewCost\", \"YouWantToSaveThisNewCostSubtitle\", \"Save\", \"Cancel\"\r\n , \"TheSubsidyCanNotBeGreaterThan100\", \"SavedCost\", \"HasBeenSuccessfullySavedSwal\", \"SavedCostSubtitle\", \"SavedCostSubtitle2\"])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n getVendors();\r\n getItems();\r\n getDistributionCenters();\r\n\r\n }\r\n\r\n init();\r\n\r\n });\r\n\r\n\r\n\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"CostsCtrl\", function ($scope, $state, priceService, $timeout, $translate) {\r\n\r\n //Variable globales\r\n\r\n var self = this;\r\n\r\n self.costs = [];\r\n\r\n //Funciones\r\n self.generateSuggestions = function () {\r\n\r\n swal({\r\n title: translations.GenerateSuggestionsSwal,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n priceService.costs.saveAndGenerateSuggestions()\r\n .then(function (isOk) {\r\n swal(translations.SuggestionsGenerated, translations.SuggestionsGeneratedSubtitle, \"success\");\r\n loadData();\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(translations.TheProcessContinues, translations.TheSuggestionsContinueToBeGeneratedSwal)\r\n }\r\n else {\r\n swal(translations.ErrorTitleSwal, translations.AnErrorOccurredGeneratingSuggestions, \"error\");\r\n loadData();\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.masiveUpdate = function()\r\n {\r\n $state.go('admin.importer', { \"importerType\": \"OxxoCosts\" });\r\n }\r\n\r\n function loadData() {\r\n priceService.costs.getCurrentCosts()\r\n .then(function (costs) {\r\n self.costs = costs;\r\n });\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n $translate([\"GenerateSuggestionsSwal\", \"ContinueSwal\", \"CancelSwal\", \"SuggestionsGenerated\", \"SuggestionsGeneratedSubtitle\", \"TheProcessContinues\"\r\n , \"TheSuggestionsContinueToBeGeneratedSwal\", \"ErrorTitleSwal\", \"AnErrorOccurredGeneratingSuggestions\"])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n loadData();\r\n }\r\n\r\n init();\r\n\r\n });\r\n\r\n\r\n\r\n\r\n","angular.module(\"prisma\")\r\n .filter('onlyNewsCompetitors', function () {\r\n return function (competitors) {\r\n var out = [];\r\n\r\n angular.forEach(competitors, function (competitor) {\r\n if (competitor.code == competitor.externalCode)\r\n out.push(competitor);\r\n });\r\n return out;\r\n };\r\n })\r\n .filter('onlyWithoutGroup', function () {\r\n return function (competitors, noGroups) {\r\n var out = [];\r\n //console.log('competitors', competitors);\r\n //console.log('self.noGroups', noGroups);\r\n angular.forEach(competitors, function (competitor) {\r\n angular.forEach(noGroups, function (noGroup) {\r\n //console.log('noGroup.id', noGroup.id, 'competitor.id', competitor.id);\r\n if (noGroup.id == competitor.id) {\r\n out.push(competitor);\r\n }\r\n });\r\n });\r\n return out;\r\n };\r\n })\r\n .controller(\"CompetitorsCtrl\", function ($state, $scope, $timeout, $rootScope, priceService, adminService, ngDialog, $filter, $translate, companyJson) {\r\n var self = this;\r\n\r\n self.selectedCompetitorGrp = null;\r\n\r\n self.groupOfCompetitorsLst = [];\r\n\r\n self.competitorGroup = {};\r\n\r\n self.competitorsWithoutGroup = [];\r\n\r\n self.competitorsLst = [];\r\n\r\n self.competitor = {};\r\n\r\n self.priceLists = [];\r\n\r\n self.lstBrands = [];\r\n\r\n self.lstPlaces = [];\r\n\r\n self.lstMarkets = [];\r\n\r\n self.showMarkets = false;\r\n\r\n self.search = \"\";\r\n\r\n self.isBusy = false;\r\n\r\n self.isLoading = true;\r\n\r\n self.onlyNews = false;\r\n\r\n self.singlePriceLists = companyJson.Competitors.SinglePriceLists == true ? true : false;\r\n\r\n self.onlyNewsChange = function () {\r\n runFilters();\r\n }\r\n\r\n self.onlyWithoutGroup = false;\r\n\r\n self.onlyWithoutGroupChange = function () {\r\n runFilters();\r\n }\r\n\r\n //Funciones\r\n self.showGroupEditor = function (groupData) {\r\n self.isNew = groupData ? false : true;\r\n\r\n // Crea una copia del grupo para desconectarlo de la vista.\r\n groupData = angular.copy(groupData || {});\r\n self.competitorGroup = groupData;\r\n\r\n if (self.competitorGroup.parentId)\r\n self.selectedCompetitorGrp = self.getParent(self.competitorGroup.parentId);\r\n else {\r\n self.selectedCompetitorGrp = null;\r\n }\r\n\r\n $scope.groupOfCompetitorsLst = self.groupOfCompetitorsLst;\r\n\r\n ngDialog.open({\r\n template: 'groupEditorDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n data: groupData,\r\n scope: $scope\r\n });\r\n }\r\n\r\n // 2018-04-28 - DAE - Se cambio el nombre a la funci�n isNew por isNewFn \r\n // para evitar la colisi�n con la propiedad isNew del controlador.\r\n self.isNewFn = function (competitor) {\r\n return competitor.code === competitor.externalCode || !competitor.code;\r\n }\r\n\r\n function loadMarkets() {\r\n adminService.priceLists.getMarkets().then(function (markets) {\r\n self.lstMarkets = markets;\r\n self.showMarkets = true;\r\n });\r\n }\r\n\r\n self.getParent = function (id) {\r\n for (var i = 0; i < self.groupOfCompetitorsLst.length; i++) {\r\n if (self.groupOfCompetitorsLst[i].id === id) {\r\n return self.groupOfCompetitorsLst[i];\r\n }\r\n }\r\n }\r\n\r\n self.showCompetitorEditor = function (competitorData) {\r\n self.isNew = competitorData ? false : true;\r\n\r\n // Crea una copia del competidor para desconectarlo de la vista.\r\n competitorData = angular.copy(competitorData || {});\r\n self.competitor = competitorData;\r\n $scope.priceLists = self.priceLists;\r\n\r\n ngDialog.open({\r\n template: 'competitor',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n data: competitorData,\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.competitorGroups = [];\r\n\r\n self.getTitle = function () {\r\n var rv;\r\n if (!self.competitor.code)\r\n rv = translations.Competitor;\r\n else\r\n rv = translations.EditCompetitor;\r\n\r\n return rv;\r\n }\r\n\r\n self.saveCompetitor = function () {\r\n\r\n if (!self.competitor.code || !self.competitor.name) { // || !self.competitor.brandId (NO TODOS TIENEN LOS BRANDS, NO DEBER�A SER OBLIGATORIO)\r\n swal(translations.ValidationSwalTitle, translations.ValidationSwalSubtitle, \"error\");\r\n }\r\n else {\r\n priceService.competitors.saveCompetitor(self.competitor)\r\n .then(function (competitor) {\r\n if (self.isNew) {\r\n self.competitorsLst.push(angular.copy(competitor));\r\n } else {\r\n // TODO: Actualizar competidores.\r\n var idx = competitorIndexOf(competitor.id);\r\n if (idx > -1) {\r\n self.competitorsLst[idx] = competitor;\r\n }\r\n\r\n // Actualiza los competidores en los grupos.\r\n var len1 = self.groupOfCompetitorsLst.length;\r\n for (var i1 = 0; i1 < len1; i1++) {\r\n var competitorGroup = self.groupOfCompetitorsLst[i1];\r\n var len2 = competitorGroup.children.length;\r\n for (var i2 = 0; i2 < len2; i2++) {\r\n var competitorGroupChild = competitorGroup.children[i2];\r\n var len3 = competitorGroupChild.children.length;\r\n for (var i3 = 0; i3 < len3; i3++) {\r\n if (competitorGroupChild.children[i3].id === competitor.id) {\r\n competitorGroupChild.children[i3] = competitor;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }).finally(function () {\r\n ngDialog.close();\r\n });\r\n }\r\n }\r\n\r\n self.saveCompetitorGroup = function () {\r\n if (self.isNew) {\r\n if (!self.competitorGroup.code || !self.competitorGroup.name) {\r\n swal(translations.ValidationSwalTitle, translations.SaveCompetitorValidationSwalSubtitle, \"error\");\r\n } else {\r\n if (self.selectedCompetitorGrp == null) {//no tiene padre , guardo normal\r\n\r\n priceService.competitors.saveCompetitorsTree(self.competitorGroup)\r\n .then(function (competitorGroup) {\r\n //inserto como un grupo\r\n self.groupOfCompetitorsLst.push(angular.copy(competitorGroup));\r\n }).finally(function () {\r\n ngDialog.close();\r\n });\r\n } else { // quiero guardar un hijo de self.selectedCompetitorGrp\r\n self.competitorGroup.parentId = self.selectedCompetitorGrp.id;\r\n priceService.competitors.saveCompetitorsTree(self.competitorGroup)\r\n .then(function(competitorGroup) {\r\n // Busca el parent.\r\n var idx = competitorGroupIndexOf(competitorGroup.parentId);\r\n if (idx > -1) {\r\n // inserto como un subgrupo\r\n self.groupOfCompetitorsLst[idx].children.push(angular.copy(competitorGroup));\r\n }\r\n }).finally(function() {\r\n ngDialog.close();\r\n });\r\n }\r\n }\r\n } else {// es edicion\r\n if (self.selectedCompetitorGrp == null) {//es padre\r\n priceService.competitors.saveCompetitorsTree(self.competitorGroup)\r\n .then(function (competitorGroup) {\r\n // Busca el elemento.\r\n var idx = competitorGroupIndexOf(competitorGroup.id);\r\n if (idx > -1) {\r\n self.groupOfCompetitorsLst[idx] = competitorGroup;\r\n }\r\n }).finally(function () {\r\n ngDialog.close();\r\n });\r\n }\r\n else {//es children\r\n self.competitorGroup.parentId = self.selectedCompetitorGrp.id;\r\n priceService.competitors.saveCompetitorsTree(self.competitorGroup)\r\n .then(function (competitorGroup) {\r\n // Busca el elemento.\r\n var idx = competitorGroupIndexOf(competitorGroup.parentId);\r\n if (idx > -1) {\r\n var parent = self.groupOfCompetitorsLst[idx];\r\n var idx2 = competitorGroupChildrenIndexOf(parent.children, competitorGroup.id);\r\n if (idx2 > -1) {\r\n parent.children[idx2] = competitorGroup;\r\n }\r\n }\r\n }).finally(function () {\r\n ngDialog.close();\r\n });\r\n }\r\n } // TODO faltaria hacer que un grupo se mueva a otro grupo sin necesidad de recargar la pagina \r\n }\r\n\r\n /**\r\n * Devuelve el indice del competidor dentro del array.\r\n * @param {int} id Identificador del competidor buscado.\r\n */\r\n function competitorIndexOf(id) {\r\n var ret;\r\n var i = 0;\r\n var len = self.competitorsLst.length;\r\n while (i < len\r\n && self.competitorsLst[i].id !== id) {\r\n i++;\r\n }\r\n\r\n if (i < len && self.competitorsLst[i].id === id) {\r\n ret = i;\r\n } else {\r\n ret = -1;\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n\r\n /**\r\n * Devuelve el indice del grupo competidor dentro del array.\r\n * @param {int} id Identificador del grupo competidor buscado.\r\n */\r\n function competitorGroupIndexOf(id) {\r\n var ret;\r\n var i = 0;\r\n var len = self.groupOfCompetitorsLst.length;\r\n while (i < len\r\n && self.groupOfCompetitorsLst[i].id !== id) {\r\n i++;\r\n }\r\n\r\n if (i < len && self.groupOfCompetitorsLst[i].id === id) {\r\n ret = i;\r\n } else {\r\n ret = -1;\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n function competitorGroupChildrenIndexOf(children, id) {\r\n var ret;\r\n var i = 0;\r\n var len = children.length;\r\n while (i < len\r\n && children[i].id !== id) {\r\n i++;\r\n }\r\n\r\n if (i < len && children[i].id === id) {\r\n ret = i;\r\n } else {\r\n ret = -1;\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n self.saveCompetitorTreeRelations = function () {\r\n self.isBusy = true;\r\n priceService.competitors.saveCompetitorsTreeRelations(self.groupOfCompetitorsLstOriginal)\r\n .then(function (isOk) {\r\n swal(translations.SaveCompetitorTreeRelationsSwal, '', 'success');\r\n loadCompetitorsWithoutGroups()\r\n self.isBusy = false;\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(translations.TheProcessContinues, translations.TheProcessOfContinuousStorageSwal);\r\n self.isBusy = false;\r\n }\r\n else {\r\n swal(translations.ErrorTitleSwal, translations.ThereWasAnErrorInSavingRelationshipsSwal, \"error\");\r\n self.isBusy = false;\r\n }\r\n });\r\n\r\n }\r\n\r\n self.deleteCompetitor = function (id) {\r\n\r\n swal({\r\n title: translations.DisableCompetitorSwalTitle,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#DD6B55\",\r\n confirmButtonText: translations.ToDisable,\r\n cancelButtonText: translations.Cancel,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n priceService.competitors.deleteCompetitor(id)\r\n .then(function (isOk) {\r\n var pos = null\r\n for (i = 0; i < self.competitorsLst.length; i++) {\r\n if (self.competitorsLst[i].id == id) {\r\n pos = i;\r\n break;\r\n }\r\n }\r\n\r\n //self.competitorsLst.splice(pos, 1);\r\n swal(translations.CompetitorDisabledSwalTitle, translations.CompetitorDisabledSwalSubtitle, 'success');\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(translations.TheProcessContinues, translations.TheProcessOfDisablingContinuesSwal)\r\n }\r\n else {\r\n swal(translations.ErrorTitleSwal, translations.ThereWasAnErrorDisablingCompetitorSwal, \"error\");\r\n }\r\n });\r\n\r\n }\r\n\r\n });\r\n }\r\n\r\n self.itemDroppedInCompetitorsList = function (index, item, external, type) {\r\n return false;\r\n }\r\n\r\n self.itemDroppedInCompetitorGroupList = function (index, item, external, type, subgroup) {\r\n console.log('index', index);\r\n console.log('item', item);\r\n console.log('external', external);\r\n console.log('type', type);\r\n console.log('subgroup', subgroup);\r\n\r\n var isValid = true;\r\n\r\n //agrego esta propiedad para el dto tree\r\n item.competitorId = item.id;\r\n\r\n //si ya existe en el grupo aborto el drop\r\n angular.forEach(subgroup.children, function (child) {\r\n if (child.competitorId == item.competitorId) {\r\n swal(translations.TheCompetitorExistsInTheGroupSwalTitle, translations.TheCompetitorExistsInTheGroupSwalSubtitle, 'warning');\r\n isValid = false;\r\n }\r\n });\r\n\r\n\r\n\r\n if (!isValid)\r\n return false;\r\n else {\r\n var added = false;\r\n for (var i = 0; i < self.groupOfCompetitorsLstOriginal.length && !added; i++) {\r\n var root = self.groupOfCompetitorsLstOriginal[i];\r\n //console.log('root', root);\r\n for (var j = 0; j < root.children.length && !added; j++) {\r\n var subgroupOriginal = root.children[j];\r\n //console.log('subgroupOriginal', subgroupOriginal);\r\n if (subgroupOriginal.competitorGroupId == subgroup.competitorGroupId) {\r\n subgroupOriginal.children.push(item);\r\n added = true;\r\n }\r\n }\r\n }\r\n\r\n return item;\r\n }\r\n };\r\n\r\n self.removeCompetitorFromGroup = function (competitorName, group, index, competitorId) {\r\n swal({\r\n title: translations.YouAreSureToRemoveTheCompetitorSwal + competitorName + translations.FromTheGroupSwal + group.name + '?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#DD6B55\",\r\n confirmButtonText: translations.RemoveSwal,\r\n cancelButtonText: translations.Cancel,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: true,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n var deleted = false;\r\n\r\n for (var i = 0; i < self.groupOfCompetitorsLstOriginal.length && !deleted; i++) {\r\n var root = self.groupOfCompetitorsLstOriginal[i];\r\n for (var j = 0; j < root.children.length && !deleted; j++) {\r\n var subgroup = root.children[j];\r\n for (var z = 0; z < subgroup.children.length && !deleted; z++) {\r\n var competitor = subgroup.children[z];\r\n if (competitor.id == competitorId && subgroup.code == group.code) {\r\n subgroup.children.splice(z, 1);\r\n deleted = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n group.children.splice(index, 1);\r\n $scope.$apply();\r\n }\r\n\r\n });\r\n }\r\n\r\n\r\n self.filterCompetitors = function (items) {\r\n self.competitorsLst = items;\r\n self.competitorsLstOriginal = angular.copy(items);\r\n //console.log('self.competitorsLst', self.competitorsLst);\r\n\r\n self.groupOfCompetitorsLst = angular.copy(self.groupOfCompetitorsLstOriginal);\r\n filterNodes(self.groupOfCompetitorsLstOriginal, self.groupOfCompetitorsLst, self.competitorsLst);\r\n }\r\n\r\n //source y dest tienen que ser copias uno del otro\r\n function filterNodes(source, dest, search) {\r\n if (!source || source.length == 0) return false;\r\n try {\r\n\r\n var idsToRemove = [];\r\n var anyOfThisAreValid = false;\r\n for (var i = 0; i < source.length; i++) {\r\n var anyChildrenValid = false;\r\n anyChildrenValid |= filterNodes(source[i].children, dest[i].children, search);\r\n\r\n\r\n\r\n var valid = nodePassFilter(source[i], search);\r\n if (!anyChildrenValid && !valid) {\r\n idsToRemove.push(source[i].competitorId);\r\n } else if (valid) {\r\n anyOfThisAreValid = true;\r\n } else if (anyChildrenValid) {\r\n anyOfThisAreValid = true;\r\n }\r\n }\r\n\r\n for (var i = 0; i < idsToRemove.length; i++) {\r\n for (var j = 0; j < dest.length; j++) {\r\n if (dest[j].competitorId == idsToRemove[i]) {\r\n dest.splice(j, 1);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n } catch (e) {\r\n console.error(e);\r\n console.log('source', source);\r\n console.log('dest', dest);\r\n }\r\n\r\n return anyOfThisAreValid;\r\n }\r\n\r\n\r\n function nodePassFilter(node, filtered) {\r\n //Si quiero ocultar las ramas vacias, remover esto\r\n if (node.competitorId == 0) return true;\r\n for (var i = 0; i < filtered.length; i++) {\r\n if (node.competitorId == filtered[i].id)\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n self.getCompetitorCount = function (group) {\r\n if (!group || group.length == 0) return 0;\r\n\r\n if (group.competitorId != 0)\r\n return 1;\r\n else {\r\n var count = 0;\r\n for (var i = 0; i < group.children.length; i++) {\r\n count += self.getCompetitorCount(group.children[i]);\r\n }\r\n return count;\r\n }\r\n\r\n }\r\n\r\n var timeout = null;\r\n self.onlyMarkers = false;\r\n self.onNewCompetitorText = function (text, onlyMarkers) {\r\n self.search = text;\r\n self.onlyMarkers = onlyMarkers;\r\n if (text.length <= 4) return;\r\n\r\n if (timeout != null)\r\n $timeout.cancel(timeout);\r\n\r\n timeout = $timeout(function () {\r\n runFilters();\r\n timeout = null;\r\n }, 1000)\r\n\r\n\r\n\r\n }\r\n\r\n function runFilters() {\r\n self.competitorsLst = $filter('filter')(self.competitorsLstOriginal, self.search);\r\n if (self.onlyMarkers) {\r\n self.competitorsLst = $filter('filter')(self.competitorsLst, { isMarker: true });\r\n }\r\n if (self.onlyNews) {\r\n self.competitorsLst = $filter('onlyNewsCompetitors')(self.competitorsLst);\r\n }\r\n if (self.onlyWithoutGroup) {\r\n self.competitorsLst = $filter('onlyWithoutGroup')(self.competitorsLst, self.competitorsWithoutGroup);\r\n\r\n }\r\n self.groupOfCompetitorsLst = angular.copy(self.groupOfCompetitorsLstOriginal);\r\n filterNodes(self.groupOfCompetitorsLstOriginal, self.groupOfCompetitorsLst, self.competitorsLst);\r\n }\r\n\r\n function loadCompetitorsWithoutGroups() {\r\n priceService.competitors.getCompetitorsWithoutGroup().then(function (competitors) {\r\n console.log('without group', competitors);\r\n self.competitorsWithoutGroup = competitors;\r\n });\r\n }\r\n\r\n function loadData() {\r\n\r\n\r\n loadCompetitorsWithoutGroups();\r\n\r\n\r\n priceService.competitors.getCompetitorsTree()\r\n .then(function (nodes) {\r\n //console.log('nodes', nodes);\r\n\r\n nodes.sort(function (a, b) {\r\n return a.name > b.name;\r\n });\r\n\r\n for (var i = 0; i < nodes.length; i++) {\r\n nodes[i].children.sort(function (a, b) {\r\n return a.name > b.name;\r\n })\r\n\r\n for (var j = 0; j < nodes[i].children.length; j++) {\r\n //console.log('nodes[i].children[j]', nodes[i].children[j]);\r\n nodes[i].children[j].children.sort(function (a, b) {\r\n return a.code > b.code;\r\n });\r\n }\r\n }\r\n\r\n //console.log('sorted', nodes);\r\n self.groupOfCompetitorsLst = nodes;\r\n self.groupOfCompetitorsLstOriginal = angular.copy(nodes);\r\n self.isLoading = false;\r\n });\r\n //priceService.competitors.competitors()\r\n // .then(function (competitors) {\r\n // self.competitorsLst = competitors;\r\n\r\n // //self.isloading = false;\r\n // });\r\n\r\n //TODO: Cargar Grupos\r\n\r\n priceService.pricelists.getPriceLists()\r\n .then(function (responseList) {\r\n self.priceLists = responseList;\r\n });\r\n\r\n //traigo los brands.\r\n adminService.brands.getBrandsCombo(false)\r\n .then(function (brands) {\r\n self.lstBrands = brands;\r\n });\r\n\r\n //traigo las Places.\r\n adminService.places.getPlacesCombo()\r\n .then(function (places) {\r\n self.lstPlaces = places;\r\n });\r\n if (companyJson.Erp && companyJson.Erp.Implementation && companyJson.Erp.Implementation == \"CencosudPeru\") {\r\n //traigo los Markets.\r\n loadMarkets();\r\n }\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n $translate([\"Competitor\", \"EditCompetitor\", \"ValidationSwalTitle\", \"ValidationSwalSubtitle\", \"ErrorTitleSwal\", \"SaveCompetitorValidationSwalSubtitle\", \"SaveCompetitorTreeRelationsSwal\", \"TheProcessContinues\", \"TheProcessOfContinuousStorageSwal\", \"ThereWasAnErrorInSavingRelationshipsSwal\", \"DisableCompetitorSwalTitle\", \"ToDisable\", \"Cancel\", \"CompetitorDisabledSwalTitle\", \"CompetitorDisabledSwalSubtitle\", \"TheProcessOfDisablingContinuesSwal\", \"ThereWasAnErrorDisablingCompetitorSwal\", \"TheCompetitorExistsInTheGroupSwalTitle\", \"TheCompetitorExistsInTheGroupSwalSubtitle\", \"YouAreSureToRemoveTheCompetitorSwal\", \"FromTheGroupSwal\", \"RemoveSwal\", \"Cancel\", \"Place\", \"Pr_competitors_selectPlace\" ])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n loadData();\r\n }\r\n\r\n init();\r\n\r\n\r\n self.models = {\r\n selected: null,\r\n lists: { \"A\": [], \"B\": [] }\r\n };\r\n\r\n // Generate initial model\r\n for (var i = 1; i <= 3; ++i) {\r\n self.models.lists.A.push({ label: \"Item A\" + i });\r\n self.models.lists.B.push({ label: \"Item B\" + i });\r\n }\r\n\r\n\r\n\r\n\r\n });\r\n","\r\nangular.module(\"prisma\")\r\n .controller(\"CategorySummaryCtrl\", function ($state, $rootScope, priceService, companyJson, $translate) {\r\n var self = this;\r\n\r\n var numberColWidth = 120;\r\n\r\n var columnDefs = null;\r\n self.categoryLevel = 3;\r\n\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: translations.Category, //'Categoria',\r\n width: numberColWidth + 250,\r\n pinned: 'left',\r\n field: 'name',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n cellRenderer: {\r\n renderer: 'group',\r\n checkbox: false,\r\n innerRenderer: function (params) {\r\n\r\n var name = params.value + (params.node.group && params.node.children != null ? ' (' + params.node.children.length + ')' : '');\r\n\r\n if (params.data.categoryId != null && params.data.categoryId != 0) {\r\n\r\n var categoryGroup = \"'\" + params.data.categoryGroup + \"'\";\r\n var category = \"'\" + params.data.category + \"'\";\r\n var subcategory = \"'\" + params.data.subcategory + \"'\";\r\n\r\n var anchor = '' + name + '';\r\n\r\n var endorseLink = '';\r\n if (params.data.new > 0 || params.data.newCompetitive > 0)\r\n endorseLink = '';\r\n\r\n return endorseLink + anchor;\r\n }\r\n else\r\n return name;\r\n }\r\n }\r\n },\r\n {\r\n headerName: translations.RegularSuggestions, //'Regular Suggestions', // ,\r\n children: [\r\n {\r\n headerName: translations.Suggestions, //'Suggestions', \r\n field: \"suggestions\",\r\n headerTooltip: translations.SuggestionsQuantity, //'Suggestions Quantity',\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n\r\n },\r\n {\r\n headerName: translations.Impact, //'Impact',\r\n field: \"impact\",\r\n headerTooltip: translations.ShowsImpactInPesos, //'Shows the impact in margin of the suggestions',\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellRenderer: $rootScope.moneyRendererNoDecimals,\r\n cellClass: $rootScope.getClassForImpactCell\r\n },\r\n /*\r\n {\r\n headerName: \"Costos\",\r\n field: \"costs\",\r\n headerTooltip: \"Cantidad de cambios de precio generados por un cambio en los costos.\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Mercado\",\r\n field: \"market\",\r\n headerTooltip: \"Cantidad de cambios de precio generados por un cambio en el mercado.\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n \r\n },\r\n */\r\n ]\r\n },\r\n {\r\n headerName: translations.CompetitiveSuggestions,//'Competitive Suggestions', \r\n children: [\r\n {\r\n headerName: translations.Suggestions, //'Suggestions', \r\n field: \"competitiveSuggestions\",\r\n headerTooltip: translations.NumberCompetitiveSuggestions, //'Suggestions Quantity', \r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n\r\n },\r\n {\r\n headerName: translations.Impact, //\"Impacto\",\r\n field: \"competitiveImpact\",\r\n headerTooltip: translations.ShowsImpactInPesos, //'Shows the impact in margin of the suggestions',\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellRenderer: $rootScope.moneyRendererNoDecimals,\r\n cellClass: $rootScope.getClassForImpactCell\r\n }]\r\n },\r\n {\r\n headerName: translations.NewRegular, //'New Regular',\r\n children: [\r\n {\r\n headerName: translations.New,//'New',\r\n field: \"new\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: translations.Impact,//'Impact',\r\n field: \"newImpact\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForImpactCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: translations.BigDrop,//'Big Drop', \r\n field: \"newPriceMinVariationViolation\",\r\n headerTooltip: translations.BigDropToolTip, //'New prices with big prices drops', \r\n width: numberColWidth,\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: translations.BigIncrease, //'Big Increase', \r\n field: \"newPriceMaxVariationViolation\",\r\n headerTooltip: translations.BigIncreaseToolTip, //'New prices with big increases',\r\n width: numberColWidth,\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: translations.MarginMin, //'< Min Margin',\r\n field: \"newPriceMinMarginViolation\",\r\n headerTooltip: translations.MarginMintTooltip, //\"Precios nuevos que estan por debajo del margen minimo para esta categoria.\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: translations.MarginMax, //\"> Margen Max\",\r\n field: \"newPriceMaxMarginViolation\",\r\n headerTooltip: translations.MarginMaxTooltip, \r\n width: numberColWidth,\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n cellClass: $rootScope.getClassForCell\r\n }]\r\n },\r\n {\r\n headerName: translations.NewCompetitive, //'New Competitive',\r\n children: [\r\n {\r\n headerName: translations.New,//'New',\r\n field: \"newCompetitive\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: translations.Impact,//'Impact', \r\n field: \"newCompetitiveImpact\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForImpactCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: translations.BigDrop, //'Big Drop',\r\n field: \"newCompetitivePriceMinVariationViolation\",\r\n headerTooltip: translations.BigDropToolTip, \r\n width: numberColWidth,\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: translations.BigIncrease, //'Big Increase',\r\n field: \"newCompetitivePriceMaxVariationViolation\",\r\n headerTooltip: translations.BigIncreaseToolTip, //\".\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: translations.MarginMin, //'< Min Margin',\r\n field: \"newCompetitivePriceMinMarginViolation\",\r\n headerTooltip: translations.MarginMintTooltip, //\".\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: translations.MarginMax, //'> Max Margin',\r\n field: \"newCompetitivePriceMaxMarginViolation\",\r\n headerTooltip: translations.MarginMaxTooltip, \r\n width: numberColWidth,\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n cellClass: $rootScope.getClassForCell\r\n }]\r\n }\r\n ];\r\n }\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n groupHeaders: false,\r\n suppressCellSelection: true,\r\n rowHeight: 35,\r\n groupHideGroupColumns: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n angularCompileRows: true,\r\n getNodeChildDetails: getNodeChildDetails\r\n }\r\n\r\n self.exportToExcel = function () {\r\n var params = {\r\n skipHeader: false,\r\n skipFooters: false,\r\n skipGroups: false,\r\n allColumns: true,\r\n onlySelected: false,\r\n suppressQuotes: false,\r\n fileName: 'ResumenPrecios.xls',\r\n columnSeparator: ','\r\n };\r\n\r\n self.gridOptions.api.exportDataAsCsv(params);\r\n }\r\n\r\n function getNodeChildDetails(rowItem) {\r\n if (rowItem.subcategories && rowItem.subcategories.length > 0) {\r\n return {\r\n group: true,\r\n expanded: false,\r\n // provide ag-Grid with the children of this group\r\n children: rowItem.subcategories,\r\n // the key is used by the default group cellRenderer\r\n key: rowItem.id\r\n };\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n self.goToDecisions = function (id, categoryGroup, category, subcategory, isEndorse) {\r\n\r\n categoryGroup = categoryGroup.replace(/ /g, \"-\").replace(/\\//g, \"_\");\r\n category = category.replace(/ /g, \"-\").replace(/\\//g, \"_\");\r\n subcategory = subcategory.replace(/ /g, \"-\").replace(/\\//g, \"_\");\r\n\r\n var encodedcategoryGroup = categoryGroup != 'null' ? encodeURIComponent(categoryGroup) : '';\r\n var encodedcategory = category != 'null' ? encodeURIComponent(category) : '';\r\n var encodedsubcategory = subcategory != 'null' ? encodeURIComponent(subcategory) : '';\r\n\r\n $state.go('prices.decisions', { categoryId: id, categoryGroup: encodedcategoryGroup, category: encodedcategory, subcategory: encodedsubcategory, isEndorse: isEndorse });\r\n }\r\n\r\n function setGridOptions() {\r\n\r\n \r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n groupHeaders: false,\r\n suppressCellSelection: true,\r\n rowHeight: 35,\r\n groupHideGroupColumns: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n angularCompileRows: true,\r\n getNodeChildDetails: getNodeChildDetails\r\n }\r\n }\r\n\r\n //Filtro Buscador\r\n self.summary = null;\r\n\r\n self.copiedSummary = null;\r\n self.onSearchKeyUp = function () {\r\n //console.log('self.search', self.search);\r\n if (!self.search) {\r\n if (self.copiedSummary)\r\n copyValuesFromFilteredToComplete(self.copiedSummary, self.summary);\r\n self.gridOptions.api.setRowData(self.summary);\r\n } else {\r\n self.copiedSummary = angular.copy(self.summary);\r\n filterSummary(self.summary, self.copiedSummary, self.search.toLowerCase());\r\n self.gridOptions.api.setRowData(self.copiedSummary);\r\n\r\n }\r\n }\r\n\r\n function copyValuesFromFilteredToComplete(filtered, completed) {\r\n if (filtered.length == 0 || completed.length == 0) return;\r\n for (var j = 0; j < completed.length; j++) {\r\n for (var i = 0; i < filtered.length; i++) {\r\n if (completed[j].id == filtered[i].id) {\r\n console.log('copying', filtered[i].name);\r\n copyValuesFromFilteredToComplete(filtered[i].subcategories, completed[j].subcategories);\r\n }\r\n }\r\n }\r\n }\r\n\r\n //source y dest tienen que ser copias uno del otro\r\n function filterSummary(source, dest, search) {\r\n if (!source || source.length == 0) return false;\r\n var idsToRemove = [];\r\n var anyOfThisAreValid = false;\r\n for (var i = 0; i < source.length; i++) {\r\n var anyChildrenValid = false;\r\n\r\n anyChildrenValid |= filterSummary(source[i].subcategories, dest[i].subcategories, search);\r\n\r\n if (!anyChildrenValid && source[i].name.toLowerCase().indexOf(search) == -1) {\r\n\r\n idsToRemove.push(source[i].id);\r\n } else if (source[i].name.toLowerCase().indexOf(search) != -1) {\r\n anyOfThisAreValid = true;\r\n } else if (anyChildrenValid) {\r\n anyOfThisAreValid = true;\r\n }\r\n }\r\n\r\n for (var i = 0; i < idsToRemove.length; i++) {\r\n for (var j = 0; j < dest.length; j++) {\r\n if (dest[j].id == idsToRemove[i]) {\r\n dest.splice(j, 1);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return anyOfThisAreValid;\r\n }\r\n\r\n function loadData() {\r\n self.categoryLevel = companyJson.Category.Levels;\r\n\r\n priceService.decisions.getCategorySummary(self.categoryLevel)\r\n .then(function (items) {\r\n self.summary = items;\r\n self.gridOptions.api.setRowData(items);\r\n self.gridOptions.api.sizeColumnsToFit();\r\n });\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n \r\n //init columnDefs and gridOptions\r\n setGridOptions();\r\n\r\n $translate([\"Category\", \"RegularSuggestions\", \"Suggestions\", \"SuggestionsQuantity\", \"Impact\", \"ShowsImpactInPesos\", \"CompetitiveSuggestions\", \"NumberCompetitiveSuggestions\", \"Impact\", \"NewRegular\", \"New\", \"BigDrop\", \"BigDropToolTip\", \"BigIncrease\", \"BigIncreaseToolTip\", \"MarginMin\", \"MarginMintTooltip\", \"MarginMax\", \"MarginMaxTooltip\", \"NewCompetitive\"])\r\n .then(function (all) {\r\n translations = all;\r\n setColumnDefinitions();\r\n self.gridOptions.api.setColumnDefs(columnDefs);\r\n });\r\n\r\n //load data\r\n loadData();\r\n }\r\n\r\n init();\r\n\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"AbTestingReportsCtrl\", function ( $stateParams, priceService) {\r\n\r\n var self = this;\r\n\r\n self.abTestingId = $stateParams.abTestingId;\r\n self.selectedType = 'spline';\r\n\r\n\r\n\r\n self.updateCharts = function () {\r\n\r\n if (self.salesChartData == null)\r\n return;\r\n self.salesChart = c3.generate(getChartConfig('#bechmarkSalesChart', self.salesChartData));\r\n\r\n if (self.marginChartData == null)\r\n return;\r\n self.marginChart = c3.generate(getChartConfig('#bechmarkMarginChart', self.marginChartData));\r\n\r\n if (self.unitsChartData == null)\r\n return;\r\n self.unitsChart = c3.generate(getChartConfig('#bechmarkUnitsChart', self.unitsChartData));\r\n }\r\n\r\n function getChartConfig(chartId, data) {\r\n\r\n return {\r\n bindto: chartId,\r\n data: {\r\n x: 'x',\r\n columns: data,\r\n type: 'spline',\r\n },\r\n axis: {\r\n x: {\r\n type: 'timeseries',\r\n tick: {\r\n format: '%Y-%m-%d',\r\n }\r\n },\r\n y: {\r\n tick: {\r\n format: d3.format(\"s\")\r\n }\r\n }\r\n },\r\n tooltip: {\r\n format: {\r\n title: function (d) {\r\n var toFormat = '%e %B %Y';\r\n if (self.timerange == 'year')\r\n toFormat = '%e %B %Y';\r\n\r\n var format = d3.time.format(toFormat);\r\n return format(d);\r\n },\r\n value: function (value, ratio, id) {\r\n var format = d3.format(',.3s');\r\n return format(value);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n function parseChartData(chartData, chart) {\r\n var data = [];\r\n var names = [];\r\n var dates = ['x'];\r\n var series = [];\r\n\r\n //obtengo names\r\n var name = '';\r\n angular.forEach(chartData, function (d) {\r\n if (d.name !== name) {\r\n names.push(d.name);\r\n name = d.name;\r\n }\r\n });\r\n\r\n\r\n //obtengo dates\r\n var date = '';\r\n name = chartData[0].name;\r\n angular.forEach(chartData, function (d) {\r\n var currDate = d.transactionYear + '-' + d.transactionMonth + '-' + d.transactionDay;\r\n if (d.name == name) {\r\n if (currDate !== date) {\r\n dates.push(currDate);\r\n date = currDate;\r\n }\r\n }\r\n });\r\n\r\n //armo las series\r\n var serie = [];\r\n name = '';\r\n angular.forEach(names, function (n) {\r\n angular.forEach(chartData, function (d) {\r\n if (d.name !== name) {\r\n if (serie.length > 0)\r\n series.push(serie);\r\n\r\n serie = [];\r\n serie.push(d.name);\r\n serie.push(d[chart]);\r\n name = d.name;\r\n }\r\n else {\r\n serie.push(d[chart]);\r\n }\r\n });\r\n });\r\n\r\n data.push(dates);\r\n angular.forEach(series, function (s) {\r\n data.push(s);\r\n });\r\n\r\n return data;\r\n }\r\n\r\n\r\n self.updateChartType = function (type) {\r\n self.selectedType = type;\r\n self.salesChart.transform(type);\r\n self.marginChart.transform(type);\r\n self.unitsChart.transform(type);\r\n }\r\n\r\n\r\n function loadData() {\r\n console.log($stateParams);\r\n\r\n priceService.abTesting.getDailySales(self.abTestingId).then(function (chartData) {\r\n console.log(chartData);\r\n\r\n if (chartData && chartData.length > 0) {\r\n self.salesChartData = parseChartData(chartData, 'sales');\r\n self.marginChartData = parseChartData(chartData, 'margin');\r\n self.unitsChartData = parseChartData(chartData, 'units');\r\n\r\n self.updateCharts();\r\n }\r\n\r\n }, function (err) {\r\n console.error(err);\r\n })\r\n }\r\n\r\n\r\n function init() {\r\n\r\n //load data\r\n loadData();\r\n }\r\n\r\n\r\n init();\r\n\r\n\r\n })","angular.module(\"prisma\")\r\n .controller(\"AbTestingIndexCtrl\", function ($rootScope, $state, priceService, $translate) {\r\n\r\n var allSelected = true;\r\n var self = this;\r\n var dic = {};\r\n var numberColWidth = 100;\r\n var editableColWidth = 140;\r\n var lastAdded = null;\r\n var columnDefs = null;\r\n\r\n self.gridOptions = null;\r\n self.summary = null;\r\n\r\n self.competitorGroups = [];\r\n\r\n //self.goToRules = function (id, categoryGroup, category, subcategory) {\r\n\r\n // categoryGroup = categoryGroup.replace(/ /g, \"-\").replace(/\\//g, \"_\");\r\n // category = category.replace(/ /g, \"-\").replace(/\\//g, \"_\");\r\n // subcategory = subcategory.replace(/ /g, \"-\").replace(/\\//g, \"_\");\r\n\r\n // var encodedcategoryGroup = categoryGroup != 'null' ? encodeURIComponent(categoryGroup) : '';\r\n // var encodedcategory = category != 'null' ? encodeURIComponent(category) : '';\r\n // var encodedsubcategory = subcategory != 'null' ? encodeURIComponent(subcategory) : '';\r\n\r\n // $state.go('prices.rules', { categoryId: id, categoryGroup: encodedcategoryGroup, category: encodedcategory, subcategory: encodedsubcategory });\r\n //}\r\n\r\n\r\n self.newTest = function () {\r\n\r\n }\r\n\r\n self.deleteSelection = function () {\r\n var notSelected = [];\r\n swal({\r\n title: translations.DeleteSelectedTests,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n }, function (isConfirm) {\r\n if (!isConfirm) return;\r\n //self.gridOptions.api.setDatasource([]);\r\n //swal('Los tests fueron borrados!', 'Los tests fueron borrados exitosamente', 'success');\r\n\r\n var ids = [];\r\n self.gridOptions.api.forEachNode(function (node) {\r\n if (node.isSelected()) {\r\n ids.push(node.data.id);\r\n } else {\r\n notSelected.push(node.data);\r\n }\r\n\r\n\r\n });\r\n\r\n priceService.abTesting.deleteTests(ids).then(function (res) {\r\n swal(translations.TestsWereDeleted, translations.TestsWereDeletedSuccessfully, 'success');\r\n self.gridOptions.api.setRowData(notSelected);\r\n\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(translations.TheProcessContinues, translations.TheProcessOfContinuousDeletionSwal)\r\n }\r\n else {\r\n swal(translations.ErrorTitleSwal, translations.ErrorInWantingToEraseTests, \"error\");\r\n }\r\n });\r\n\r\n })\r\n }\r\n\r\n self.toggleSelection = function () {\r\n\r\n if (self.gridOptions.api.isAnyFilterPresent()) {\r\n //selecciono solo los filtrados\r\n self.gridOptions.api.forEachNodeAfterFilter(function (node) {\r\n node.setSelected(!allSelected);\r\n });\r\n }\r\n else {\r\n //selecciono todos\r\n allSelected ? self.gridOptions.api.deselectAll() : self.gridOptions.api.selectAll();\r\n }\r\n\r\n //toggle select / deselect\r\n allSelected = !allSelected;\r\n }\r\n\r\n\r\n function iconRenderer(params) {\r\n return '';\r\n }\r\n\r\n self.test = function () {\r\n console.log('test');\r\n }\r\n\r\n\r\n //grid config\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: translations.Description,\r\n width: 220,\r\n field: 'description',\r\n checkboxSelection: true,\r\n headerCheckboxSelection: true,\r\n headerCheckboxSelectionFilteredOnly: true,\r\n pinned: 'left',\r\n //suppressMenu: true,\r\n //suppressSorting: true,\r\n filter: false,\r\n cellClass: $rootScope.getClassForCel,\r\n cellRenderer: {\r\n\r\n renderer: 'group',\r\n //checkbox: false,\r\n innerRenderer: function (params) {\r\n console.log('params', params);\r\n var link = '';\r\n 1\r\n return link + params.value;\r\n }\r\n }\r\n\r\n },\r\n {\r\n headerName: translations.Data,\r\n\r\n children: [\r\n {\r\n headerName: translations.Hypothesis,\r\n field: \"hypothesis\",\r\n headerTooltip: \"\",\r\n //filter: 'number',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 700,\r\n cellClass: $rootScope.getClassForCell,\r\n //cellRenderer: $rootScope.percentageEditorWithDecimal\r\n },\r\n {\r\n headerName: \"Item\",\r\n field: \"itemName\",\r\n headerTooltip: \"\",\r\n //filter: 'number',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 350,\r\n cellClass: $rootScope.getClassForCell,\r\n //cellRenderer: $rootScope.percentageEditorWithDecimal\r\n },\r\n {\r\n headerName: translations.From,\r\n field: \"validFrom\",\r\n headerTooltip: \"\",\r\n filter: 'date',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 80,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.dateRenderer\r\n }, \r\n {\r\n headerName: translations.To,\r\n field: \"validTo\",\r\n headerTooltip: \"\",\r\n filter: 'date',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 80,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.dateRenderer\r\n }]\r\n },\r\n {\r\n headerName: translations.VariationInPrices,\r\n\r\n children: [\r\n {\r\n headerName: translations.Change,\r\n field: \"changeInPrice\",\r\n filter: 'number',\r\n headerTooltip: \"\",\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 70,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.decimalRenderer\r\n },\r\n {\r\n headerName: translations.Type,\r\n field: \"changeInPriceType\",\r\n headerTooltip: \"\",\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 50,\r\n cellClass: $rootScope.getClassForCell,\r\n //filter: 'input',\r\n //cellRenderer: $rootScope.checkboxEditor\r\n },\r\n {\r\n headerName: translations.Expected,\r\n field: \"expectedChangeInDemand\",\r\n headerTooltip: \"\",\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 70,\r\n cellClass: $rootScope.getClassForCell,\r\n //filter: 'input',\r\n cellRenderer: $rootScope.decimalRenderer\r\n }]\r\n }\r\n ]\r\n }\r\n\r\n //Grid Renderer\r\n //self.checkboxEditorMarginGuides = function (params) {\r\n // var eInput = document.createElement(\"input\");\r\n // eInput.type = \"checkbox\";\r\n // eInput.checked = params.value;\r\n\r\n // eInput.addEventListener(\"change\", function (event) {\r\n // params.value = eInput.checked;\r\n // params.data[params.column.colId] = eInput.checked;\r\n\r\n // if (params.colDef.field == 'goToTargetMargin') { //Si toque Ir a Obj, destildo Mantener\r\n // params.node.data.keepMargin = false;\r\n // }\r\n // else if (params.colDef.field == 'keepMargin') { //Si toque Mantener, destildo Ir a Obj\r\n // params.node.data.goToTargetMargin = false;\r\n // }\r\n\r\n\r\n // if (params.node != null && params.node.children != null) {\r\n // params.node.children.forEach(function (node) {\r\n // if (node.children) {\r\n // node.children.forEach(function (node) {\r\n // node.data[params.column.colId] = eInput.checked;\r\n\r\n // if (params.colDef.field == 'goToTargetMargin') { //Si toque Ir a Obj, destildo Mantener\r\n // node.data.keepMargin = false;\r\n // }\r\n // else if (params.colDef.field == 'keepMargin') { //Si toque Mantener, destildo Ir a Obj\r\n // node.data.goToTargetMargin = false;\r\n // }\r\n\r\n // });\r\n // }\r\n // node.data[params.column.colId] = eInput.checked;\r\n\r\n // if (params.colDef.field == 'goToTargetMargin') { //Si toque Ir a Obj, destildo Mantener\r\n // node.data.keepMargin = false;\r\n // }\r\n // else if (params.colDef.field == 'keepMargin') { //Si toque Mantener, destildo Ir a Obj\r\n // node.data.goToTargetMargin = false;\r\n // }\r\n\r\n // });\r\n // }\r\n\r\n // params.data.dirty = true;\r\n\r\n // params.api.refreshView();\r\n // });\r\n\r\n // return eInput;\r\n //}\r\n\r\n //function dropDownDecisionEditor(params) {\r\n\r\n // var editing = false;\r\n\r\n // var eCell = document.createElement('div');\r\n\r\n // var eLabel = null\r\n\r\n // if (params.value != null && params.value != \"\")\r\n // eLabel = document.createTextNode(params.value);\r\n // else\r\n // eLabel = document.createTextNode(\"------------\");\r\n\r\n // eCell.appendChild(eLabel);\r\n\r\n // var eSelect = document.createElement(\"select\");\r\n // eSelect.className = \"form-control\";\r\n // eSelect.style = \"margin:0px !important; border: 0px; line-height: 100%; font-size:12px !important\";\r\n\r\n // for (var i = 0; i < self.competitorGroups.length; i++) {\r\n // var eOption = document.createElement(\"option\");\r\n // eOption.setAttribute(\"value\", self.competitorGroups[i].id);\r\n // eOption.innerHTML = self.competitorGroups[i].name;\r\n // eSelect.appendChild(eOption);\r\n // }\r\n\r\n // eSelect.value = params.data.mainCompetitorGroupId;\r\n\r\n\r\n // eCell.addEventListener('click', function () {\r\n // if (!editing) {\r\n // eCell.removeChild(eLabel);\r\n // eCell.appendChild(eSelect);\r\n // eSelect.focus();\r\n // editing = true;\r\n // }\r\n // });\r\n\r\n // eSelect.addEventListener('blur', function () {\r\n // if (editing) {\r\n // editing = false;\r\n // eCell.removeChild(eSelect);\r\n // eCell.appendChild(eLabel);\r\n // }\r\n // });\r\n\r\n // eSelect.addEventListener('change', function () {\r\n // if (editing) {\r\n\r\n // var colIds = [];\r\n // colIds.push(params.column.colId);\r\n // var changedRows = [];\r\n // changedRows.push(params.node);\r\n\r\n // editing = false;\r\n // var newValue = '';\r\n\r\n // for (var i = 0; i < self.competitorGroups.length; i++) {\r\n // if (self.competitorGroups[i].id == eSelect.value) {\r\n // newValue = self.competitorGroups[i].name;\r\n // params.data['mainCompetitorGroup'] = newValue;\r\n // params.data['mainCompetitorGroupId'] = eSelect.value;\r\n // //Children\r\n // if (params.node != null && params.node.children != null) {\r\n // params.node.children.forEach(function (node) {\r\n // if (node.children) {\r\n // node.children.forEach(function (node) {\r\n // node.data['mainCompetitorGroup'] = newValue;\r\n // node.data['mainCompetitorGroupId'] = eSelect.value;\r\n // node.data.dirty = true;\r\n // changedRows.push(node);\r\n // });\r\n // }\r\n // node.data['mainCompetitorGroup'] = newValue;\r\n // node.data['mainCompetitorGroupId'] = eSelect.value;\r\n // node.data.dirty = true;\r\n // changedRows.push(node);\r\n // });\r\n // }\r\n // break;\r\n // }\r\n // }\r\n\r\n\r\n // params.data.dirty = true;\r\n\r\n // params.api.refreshCells(changedRows, colIds);\r\n\r\n // eLabel.nodeValue = newValue;\r\n // eCell.removeChild(eSelect);\r\n // eCell.appendChild(eLabel);\r\n // }\r\n // });\r\n\r\n // return eCell;\r\n //}\r\n\r\n function setGridOptions() {\r\n\r\n \r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: true,\r\n groupHeaders: true,\r\n groupUseEntireRow: false,\r\n rowSelection: \"multiple\",\r\n suppressCellSelection: true,\r\n groupSelectsChildren: true,\r\n groupSuppressAutoColumn: false, // or undefined\r\n groupColumnDef: null, // or undefined\r\n singleClickEdit: true,\r\n rowHeight: 35,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n suppressCellSelection: true,\r\n enableRangeSelection: false,\r\n angularCompileRows: true,\r\n //getNodeChildDetails: getNodeChildDetails\r\n }\r\n }\r\n\r\n //function getNodeChildDetails(rowItem) {\r\n // if (rowItem.subcategories && rowItem.subcategories.length > 0) {\r\n // return {\r\n // group: true,\r\n // expanded: false,\r\n // // provide ag-Grid with the children of this group\r\n // children: rowItem.subcategories,\r\n // // the key is used by the default group cellRenderer\r\n // key: rowItem.id\r\n // };\r\n // } else {\r\n // return null;\r\n // }\r\n //}\r\n\r\n //behaviour\r\n //function changeValue(element, value) {\r\n // element.value = value;\r\n //}\r\n\r\n //grid filter\r\n //self.onFilterChanged = function (value) {\r\n // self.gridOptions.api.setQuickFilter(value);\r\n //}\r\n\r\n\r\n function loadData() {\r\n\r\n priceService.abTesting.getAbTestingGrid()\r\n .then(function (test) {\r\n\r\n self.gridOptions.api.setRowData(test);\r\n\r\n console.log('response', test);\r\n })\r\n\r\n //priceService.rules.getCategories()\r\n // .then(function (summary) {\r\n\r\n // self.summary = summary;\r\n // self.gridOptions.api.setRowData(summary);\r\n // })\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n setGridOptions();\r\n \r\n $translate([\"DeleteSelectedTests\", \"ContinueSwal\", \"CancelSwal\", \"TestsWereDeleted\", \"TestsWereDeletedSuccessfully\", \"TheProcessContinues\"\r\n , \"TheProcessOfContinuousDeletionSwal\", \"ErrorTitleSwal\", \"ErrorInWantingToEraseTests\", \"Description\", \"Data\", \"Hypothesis\"\r\n , \"From\", \"To\", \"VariationInPrices\", \"Change\", \"Type\", \"Expected\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions.api.setColumnDefs(columnDefs);\r\n });\r\n\r\n //init columnDefs and gridOptions\r\n \r\n loadData();\r\n }\r\n\r\n init();\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"AbTestingCtrl\", function ($scope, $translate, $resource, $rootScope, $window, $timeout, $state, priceService, adminService, authService) {\r\n var self = this;\r\n\r\n self.stores = [];\r\n self.storeZoning = [];\r\n //self.items = undefined;\r\n self.categories = [];\r\n self.expectedActionsArray = [];\r\n\r\n self.selectedAction;\r\n self.selectedActionType;\r\n self.selectedItem;\r\n self.selectedStoreBase;\r\n self.selectedStoreMirror;\r\n self.selectedCategory;\r\n self.selectedCategory2;\r\n self.selectedCategory3;\r\n self.selectedCategory4;\r\n self.expectedAction;\r\n self.companyName = $rootScope.erp.Implementation;\r\n\r\n self.actionTypesArray = [{\r\n id: 1, text: '$', hyphotesisText: '$'\r\n }, {\r\n id: 2, text: '%', hyphotesisText: '%'\r\n }]\r\n\r\n\r\n \r\n function calculateNewPrice(oldPrice, changeType, changeAmount, changeAction) {\r\n //console.log('oldPrice', oldPrice);\r\n //console.log('changeType', changeType);\r\n //console.log('changeAmount', changeAmount);\r\n //console.log('changeAction', changeAction);\r\n if(changeType == 1) { //$\r\n return changeAction == 1 ? oldPrice - changeAmount : oldPrice + changeAmount ;\r\n }\r\n\r\n return changeAction == 1 ? oldPrice - (oldPrice * changeAmount / 100) : oldPrice + (oldPrice * changeAmount / 100);\r\n\r\n }\r\n\r\n\r\n self.itemText = '';\r\n self.getItems = function (val) {\r\n self.itemText = val;\r\n if (self.selectedCategory == undefined) return;\r\n if (val.length < 4) return;\r\n\r\n var lookupParameter = { searchTerm: val, categoryIds: self.categoryIds };\r\n return priceService.abTesting.itemsLookupByCategory(lookupParameter, self.selectedCategory.id)\r\n .then(function (items) {\r\n return items;\r\n });\r\n };\r\n self.hypothesis = '';\r\n self.formHyphotesis = function () {\r\n try {\r\n\r\n var ret = translations.IfHyphotesis + self.selectedAction.hyphotesisText + translations.ThePriceOfHyphotesis + self.selectedItem.name + translations.InHyphotesis;\r\n\r\n if (self.selectedActionType.id === 1)\r\n ret += \"$\";\r\n\r\n ret += self.actionValue;\r\n\r\n if (self.selectedActionType.id === 2)\r\n ret += \"%\";\r\n\r\n ret += translations.TheDemandIsExpectedHyphotesis;\r\n if (self.expectedAction.id == 2)\r\n ret += self.expectedAction.hyphotesisText;\r\n else\r\n ret += self.expectedAction.hyphotesisText + translations.AHyphotesis + (self.expectedValue == undefined ? '' : self.expectedValue) + \"%\";\r\n\r\n self.hypothesis = ret;\r\n return ret;\r\n\r\n } catch (e) {\r\n return translations.SelectFieldsToElaborateAnHypothesis;\r\n }\r\n }\r\n\r\n self.categoryChange = function () {\r\n\r\n self.selectedItem = undefined;\r\n //self.items = [];\r\n }\r\n\r\n self.filterCategory5 = function (cat) {\r\n return !self.selectedCategory4 || cat.parentId == self.selectedCategory4.id;\r\n }\r\n\r\n self.filterCategory4 = function (cat) {\r\n return self.selectedCategory3 && cat.parentId == self.selectedCategory3.id;\r\n }\r\n\r\n self.filterCategory3 = function (cat) {\r\n return self.selectedCategory2 && cat.parentId == self.selectedCategory2.id;\r\n }\r\n\r\n self.canSaveTesting = function () {\r\n //console.log(\"selectedItem\", self.selectedItem);\r\n if (self.selectedItem == undefined)\r\n return false;\r\n //console.log(self.selectedItem);\r\n\r\n //console.log(\"selectedAction\", self.selectedAction);\r\n if (self.selectedAction == undefined)\r\n return false;\r\n\r\n //console.log(\"selectedActionType\", self.selectedActionType);\r\n if (self.selectedActionType == undefined)\r\n return false;\r\n\r\n //console.log(\"selectedStoreBase\", self.selectedStoreBase);\r\n if (self.selectedStoreBase == undefined)\r\n return false;\r\n\r\n //console.log(\"selectedStoreMirror\", self.selectedStoreMirror);\r\n if (self.selectedStoreMirror == undefined)\r\n return false;\r\n\r\n //console.log(\"selectedCategory\", self.selectedCategory);\r\n if (self.selectedCategory == undefined)\r\n return false;\r\n\r\n //console.log(\"validFrom\", self.validFrom);\r\n if (self.validFrom == undefined)\r\n return false;\r\n\r\n //console.log(\"validTo\", self.validTo);\r\n if (self.validTo == undefined)\r\n return false;\r\n\r\n //console.log(\"actionValue\", self.actionValue);\r\n if (self.actionValue == undefined || self.actionValue == '')\r\n return false;\r\n\r\n //console.log(\"expectedAction\", self.expectedAction);\r\n if (self.expectedAction == undefined)\r\n return false;\r\n\r\n //console.log(\"expectedValue\", self.expectedValue);\r\n if ((self.expectedValue == undefined || self.expectedValue == '') && self.expectedAction.id != 2)\r\n return false;\r\n\r\n if (self.description == undefined || self.description == '')\r\n return false;\r\n\r\n return true;\r\n }\r\n\r\n\r\n function validForm() {\r\n if (self.selectedStoreBase.id === self.selectedStoreMirror.id) {\r\n swal(translations.IncorrectData, translations.ValidationMirrorStoreAndBaseStore, \"info\");\r\n return false;\r\n }\r\n\r\n if (self.validTo < self.validFrom) {\r\n swal(translations.IncorrectData, translations.InvalidDateRange, \"info\");\r\n return false;\r\n }\r\n\r\n \r\n if (self.currentPrice == undefined) {\r\n swal(translations.Priceless, translations.ValidationSelectedStoreNotHaveAPrice, \"error\");\r\n return false;\r\n }\r\n\r\n\r\n return true;\r\n }\r\n\r\n\r\n self.saveTesting = function () {\r\n if (!validForm()) return;\r\n\r\n\r\n swal({\r\n title: translations.DiscardConfirmTitle,\r\n text: translations.AreYouSureSwalSubtitle,\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function () {\r\n //function calculateNewPrice(oldPrice,changeType,changeAmount,changeAction) {\r\n\r\n var data = {\r\n id: 0,\r\n hypothesis: self.hypothesis,\r\n description: self.description,\r\n storeBaseId: self.selectedStoreBase.id,\r\n storeBaseCode: self.selectedStoreBase.code,\r\n storeMirrorId: self.selectedStoreMirror.id,\r\n storeMirrorCode: self.selectedStoreMirror.code,\r\n itemId: self.selectedItem.id,\r\n itemCode: self.selectedItem.code,\r\n itemUomId: self.selectedItem.saleUnitOfMeasureId,\r\n itemUomCode: self.selectedItem.saleUnitOfMeasureCode,\r\n changeInPriceAction: self.selectedAction.id,\r\n changeInPriceType: self.selectedActionType.id,\r\n changeInPrice: self.actionValue,\r\n newPrice: calculateNewPrice(self.currentPrice, self.selectedActionType.id, self.actionValue, self.selectedAction),\r\n validFrom: self.validFrom,\r\n validTo: self.validTo,\r\n expectedChangeInDemand: self.expectedValue,\r\n expectedChangeInDemandAction: self.expectedAction.id,\r\n observations: self.observations\r\n }\r\n console.log(data);\r\n priceService.abTesting.saveAbTesting(data).then(function (response) {\r\n //console.log(response);\r\n swal(translations.ConfirmedSwal, translations.ConfirmedSwalSubtitle, \"success\");\r\n $state.go('prices.abTestingIndex');\r\n\r\n }).catch(function (fallback) {\r\n console.log(fallback);\r\n setTimeout(function () { swal(translations.ErrorTitleSwal, translations.ErrorSwalSubtitle, \"error\"); }, 100);\r\n });;\r\n\r\n\r\n\r\n });\r\n\r\n }\r\n\r\n function getPrice() {\r\n priceService.abTesting.getCurrentPrice(self.selectedStoreBase.id, self.selectedItem.id).then(function (res) {\r\n console.log('res', res);\r\n if (res == undefined || res == null || res == '') {\r\n swal(translations.Priceless, translations.ValidationSelectedStoreNotHaveAPrice, \"error\");\r\n self.currentPrice = undefined;\r\n } else {\r\n self.currentPrice = res;\r\n }\r\n console.log(res);\r\n }, function (err) {\r\n console.log(err);\r\n })\r\n }\r\n\r\n self.storeBaseChange = function () {\r\n console.log(\"self.selectedItem\", self.selectedItem);\r\n\r\n if (self.selectedItem === null || typeof self.selectedItem !== 'object')\r\n return;\r\n\r\n getPrice();\r\n }\r\n\r\n self.onItemSelect = function () {\r\n console.log(\"selectedStoreBase\", self.selectedStoreBase);\r\n\r\n if (self.selectedStoreBase == undefined)\r\n return;\r\n\r\n getPrice();\r\n }\r\n\r\n self.selectStore = function (store, type) {\r\n \r\n //de-seleccion de otra tienda base o espejo\r\n self.storeZoning.forEach(function (d) {//departamentos\r\n d.children.forEach(function (c) {//ciudades\r\n c.children.forEach(function (s) {//sectores\r\n s.children.forEach(function (t) {//tiendas\r\n if (t.id != store.id) {\r\n t.isBase = type == 'base' ? false : t.isBase;\r\n t.isMirror = type == 'mirror' ? false : t.isMirror;\r\n }\r\n });\r\n });\r\n });\r\n });\r\n\r\n //seleccion o de-seleccion de tienda base o espejo\r\n if (type == 'base') {\r\n self.selectedStoreBase = store.isBase ? store : null;\r\n }\r\n else if (type == 'mirror') {\r\n self.selectedStoreMirror = store.isMirror ? store : null;\r\n }\r\n\r\n self.storeBaseChange(); \r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n $translate([\"ValidationMirrorStoreAndBaseStore\", \"ValidationSelectedStoreNotHaveAPrice\", \"SelectFieldsToElaborateAnHypothesis\"\r\n , \"IncorrectData\", \"Priceless\", \"DiscardConfirmTitle\", \"AreYouSureSwalSubtitle\", \"ContinueSwal\", \"CancelSwal\", \"ConfirmedSwal\"\r\n , \"ConfirmedSwalSubtitle\", \"ErrorTitleSwal\", \"ErrorSwalSubtitle\", \"LowerPrice\", \"IncreasePrice\", \"LowM\", \"Rise\", \"RiseA\"\r\n , \"StaysTheSame\", \"Drops\", \"IfHyphotesis\", \"ThePriceOfHyphotesis\", \"InHyphotesis\", \"TheDemandIsExpectedHyphotesis\", \"AHyphotesis\"])\r\n \r\n .then(function (all) {\r\n translations = all;\r\n\r\n self.actionsArray = [{\r\n id: 1, text: translations.LowerPrice, hyphotesisText: translations.LowM\r\n }, {\r\n id: 3, text: translations.IncreasePrice, hyphotesisText: translations.Rise\r\n }];\r\n\r\n self.expectedActionsArray = [{\r\n id: 3, text: translations.RiseA, hyphotesisText: translations.RiseA\r\n }, {\r\n id: 2, text: translations.StaysTheSame, hyphotesisText: translations.StaysTheSame\r\n }, {\r\n id: 1, text: translations.Drops, hyphotesisText: translations.Drops\r\n }];\r\n\r\n });\r\n\r\n if (self.companyName == 'LaRebaja') {\r\n //arbol\r\n adminService.stores.getStoresZoning().then(function (values) {\r\n self.storeZoning = values;\r\n console.log(self.storeZoning);\r\n });\r\n }\r\n\r\n priceService.abTesting.getStoresLookup(authService.authentication.companyId).then(function (values) {\r\n self.stores = values;\r\n });\r\n \r\n var levels = self.companyName == 'LaRebaja' ? [2, 3, 4, 5] : [5];\r\n\r\n adminService.categories.getCategoriesWithLevels(levels).then(function (categories) {\r\n self.categories = categories.filter(function (x) {\r\n return x.level == 5;\r\n });\r\n self.categories4 = categories.filter(function (x) {\r\n return x.level == 4;\r\n }); \r\n self.categories3 = categories.filter(function (x) {\r\n return x.level == 3;\r\n }); \r\n self.categories2 = categories.filter(function (x) {\r\n return x.level == 2;\r\n });\r\n });\r\n }\r\n\r\n init();\r\n });\r\n","angular.module(\"prisma\")\r\n .controller(\"MarkdownRulesSelectionCtrl\", function ($rootScope, $state, $timeout, $interval, $filter, markdownService) {\r\n\r\n var self = this;\r\n var dic = {};\r\n var numberColWidth = 100;\r\n var editableColWidth = 140;\r\n var lastAdded = null;\r\n var columnDefs = null;\r\n self.validationErrors = '';\r\n self.orders = [];\r\n \r\n self.planTypes = function () {\r\n if ($rootScope.maxAgingLevel == 12) {\r\n if ($rootScope.erp.Implementation == 'CencosudChile') {\r\n return [\r\n { id: 10, name: 'Inactivos' },\r\n { id: 8, name: 'Descatalogados (sin bloqueo)' },\r\n { id: 9, name: 'Descatalogados (con bloqueo)' },\r\n { id: 12, name: 'Aging Fase 1' },\r\n { id: 13, name: 'Aging Fase 2' },\r\n { id: 14, name: 'Aging Fase 3' },\r\n { id: 15, name: 'Aging Fase 4' },\r\n { id: 16, name: 'Aging Fase 5' },\r\n { id: 17, name: 'Aging Fase 6' },\r\n { id: 18, name: 'Aging Fase 7' },\r\n { id: 25, name: 'Aging Fase 8' },\r\n { id: 26, name: 'Aging Fase 9' },\r\n { id: 27, name: 'Aging Fase 10' },\r\n { id: 19, name: 'Sobrestock' },\r\n { id: 20, name: 'Sobrestock critico' },\r\n { id: 21, name: 'Devolucion' },\r\n { id: 24, name: 'Pronostico de salida de stock' },\r\n ]\r\n }\r\n else {\r\n return [\r\n { id: 10, name: 'Inactivos' },\r\n { id: 12, name: 'Aging Fase 1' },\r\n { id: 13, name: 'Aging Fase 2' },\r\n { id: 14, name: 'Aging Fase 3' },\r\n { id: 15, name: 'Aging Fase 4' },\r\n { id: 16, name: 'Aging Fase 5' },\r\n { id: 17, name: 'Aging Fase 6' },\r\n { id: 18, name: 'Aging Fase 7' },\r\n { id: 25, name: 'Aging Fase 8' },\r\n { id: 26, name: 'Aging Fase 9' },\r\n { id: 27, name: 'Aging Fase 10' },\r\n { id: 28, name: 'Aging Fase 11' },\r\n { id: 29, name: 'Aging Fase 12' },\r\n { id: 19, name: 'Sobrestock' },\r\n { id: 20, name: 'Sobrestock critico' },\r\n { id: 21, name: 'Devolucion' },\r\n { id: 24, name: 'Pronostico de salida de stock' },\r\n ]\r\n }\r\n }\r\n else { //Para el resto es 7, sino agregar otro if.\r\n return [\r\n { id: 10, name: 'Inactivos' },\r\n { id: 12, name: 'Aging Fase 1' },\r\n { id: 13, name: 'Aging Fase 2' },\r\n { id: 14, name: 'Aging Fase 3' },\r\n { id: 15, name: 'Aging Fase 4' },\r\n { id: 16, name: 'Aging Fase 5' },\r\n { id: 17, name: 'Aging Fase 6' },\r\n { id: 18, name: 'Aging Fase 7' },\r\n { id: 19, name: 'Sobrestock' },\r\n { id: 20, name: 'Sobrestock critico' },\r\n { id: 21, name: 'Devolucion' },\r\n { id: 24, name: 'Pronostico de salida de stock' },\r\n ]\r\n }\r\n }\r\n\r\n self.typologies = [\r\n { id: 1, name: 'Tipologia 1' },\r\n { id: 2, name: 'Tipologia 2' },\r\n { id: 3, name: 'Tipologia 3' },\r\n { id: 4, name: 'Tipologia 4' },\r\n { id: 5, name: 'Tipologia 5' },\r\n ]\r\n\r\n self.priorizeBy = [\r\n { id: 1, name: 'Stock $' },\r\n { id: 2, name: 'Stock U' },\r\n { id: 3, name: 'DDS' },\r\n ]\r\n\r\n self.areChanges = function () {\r\n if (!self.gridOptions.api) return;\r\n\r\n var rv = false;\r\n\r\n self.gridOptions.api.forEachNode(function (node) {\r\n if (node.data.dirty) {\r\n rv = true;\r\n }\r\n });\r\n\r\n return rv;\r\n }\r\n\r\n\r\n self.canSave = function () {\r\n if (!self.gridOptions || !self.gridOptions.api) return false;\r\n\r\n\r\n var changes = false;\r\n\r\n var weight = 0;\r\n var nodesCount = 0;\r\n var maxOrder = 0;\r\n var minOrder = 999;\r\n var orders = [];\r\n self.gridOptions.api.forEachNode(function (node) {\r\n if (node.data.dirty) {\r\n changes = true;\r\n }\r\n\r\n /*weight += node.data.weight;\r\n weight = parseFloat(weight.toFixed(5));\r\n */\r\n nodesCount++;\r\n\r\n if (node.data.order) {\r\n var item = node.data.order;\r\n if (orders[item]) {\r\n self.validationErrors = 'No se debe repetir el orden';\r\n } else {\r\n orders.push(item);\r\n }\r\n }\r\n if (node.data.order && node.data.order > maxOrder)\r\n maxOrder = parseInt(node.data.order);\r\n if (node.data.order && node.data.order < minOrder)\r\n minOrder = parseInt(node.data.order);\r\n });\r\n if (orders.length > 0) {\r\n for (i = minOrder; i < maxOrder; i++) {\r\n if (orders[i] != minOrder + i) {\r\n self.validationErrors = 'Los ordenes deben ser consecutivos';\r\n }\r\n }\r\n }\r\n /* if (weight != 1) {\r\n self.validationErrors = 'Los pesos deben sumar 100%';\r\n return false;\r\n }*/\r\n\r\n //if (!changes) {\r\n // self.validationErrors = 'No hay cambios que guardar';\r\n // return false;\r\n //}\r\n\r\n //console.log('maxorder', maxOrder, 'minorder', minOrder);\r\n //if ((maxOrder - minOrder) != (nodesCount - 1)) {\r\n // self.validationErrors = 'Las reglas deben estar ordenadas';\r\n // return false;\r\n //}\r\n\r\n return true;\r\n\r\n }\r\n\r\n self.canGenerateSuggestions = function () {\r\n if (!self.gridOptions || !self.gridOptions.api) return false;\r\n\r\n var changes = false;\r\n\r\n var weight = 0;\r\n var nodesCount = 0;\r\n var maxOrder = 0;\r\n var minOrder = 999;\r\n \r\n\r\n self.gridOptions.api.forEachNode(function (node) {\r\n if (node.data.dirty) {\r\n changes = true;\r\n }\r\n\r\n /*weight += node.data.weight;\r\n weight = parseFloat(weight.toFixed(5));*/\r\n //if (node.data.weight == 0) {\r\n // weight += 10;\r\n //}\r\n nodesCount++;\r\n if (node.data.order && node.data.order > maxOrder)\r\n maxOrder = parseInt(node.data.order);\r\n if (node.data.order && node.data.order < minOrder)\r\n minOrder = parseInt(node.data.order);\r\n });\r\n\r\n /* if (weight != 1) {\r\n //self.validationErrors = 'Los pesos deben sumar 100%';\r\n return false;\r\n }*/\r\n //console.log('maxorder', maxOrder, 'minorder', minOrder);\r\n //if ((maxOrder - minOrder) != (nodesCount - 1)) {\r\n // //self.validationErrors = 'Las reglas deben estar ordenadas';\r\n // return false;\r\n //}\r\n\r\n\r\n if (!changes) {\r\n return true;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n\r\n\r\n function getTypologyByLevel(level) {\r\n for (var i = 0; i < self.typologies.length; i++) {\r\n if (self.typologies[i].id == level)\r\n return self.typologies[i];\r\n }\r\n }\r\n\r\n self.gridOptions = null;\r\n\r\n function validate() {\r\n var error = '';\r\n var maxOrder = 0;\r\n var minOrder = 0;\r\n \r\n self.orders = [];\r\n self.orders.min = function () {\r\n var min = 10000;\r\n if (self.orders.length > 0) {\r\n for (i = 0; i < self.orders.length; i++) {\r\n if (self.orders[i] < min) {\r\n min = self.orders[i];\r\n }\r\n }\r\n }\r\n return min;\r\n }\r\n self.orders.max = function () {\r\n var max = 0; //self.orders.length + 1;\r\n if (self.orders.length > 0) {\r\n for (i = 0; i < self.orders.length; i++) {\r\n if (self.orders[i] > max) {\r\n max = self.orders[i];\r\n }\r\n }\r\n }\r\n return max;\r\n }\r\n self.gridOptions.api.forEachNode(function (node) {\r\n // var data = node.data;\r\n if (node.data.order) {\r\n var item = parseInt(node.data.order);\r\n if (self.orders.indexOf(item) == -1) {\r\n self.orders.push(item);\r\n } else {\r\n error = 'No se debe repetir el orden';\r\n }\r\n }\r\n \r\n });\r\n maxOrder = self.orders.max();\r\n minOrder = self.orders.min();\r\n if (minOrder != 1 && self.orders.length > 0)\r\n error = 'El orden debe comenzar por uno (1)';\r\n\r\n var aux = [];\r\n if (maxOrder != minOrder) {\r\n for (y= minOrder; y <= maxOrder; y++) {\r\n aux.push(y);\r\n }\r\n }\r\n if (self.orders.length > 0) {\r\n for (i = 0; i < aux.length ; i++) {\r\n if (self.orders.indexOf(aux[i]) == -1) {\r\n error = 'Los ordenes deben ser consecutivos';\r\n }\r\n }\r\n }\r\n return error;\r\n }\r\n\r\n\r\n self.newRule = function () {\r\n console.log('newrule');\r\n $state.go('markdowns.rulesCreation');\r\n\r\n }\r\n\r\n self.generateSuggestions = function (reevaluateCurrentPlan) {\r\n var errors = validate();\r\n if (errors != '') {\r\n console.log('errors', errors);\r\n swal(\"Errores de validacion\", errors, \"warning\");\r\n return;\r\n }\r\n\r\n swal({\r\n title: \"¿Está seguro que desea generar sugerencias?\",\r\n text: 'Se eliminarán todas las sugerencias anteriores y las liquidaciones en proceso de aprobación.',\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function () {\r\n var itemsToSave = [];\r\n self.gridOptions.api.forEachNode(function (node) {\r\n if (node.data.dirty) {\r\n var auxNode = angular.copy(node.data);\r\n\r\n //issue cp #632 \r\n //el renderer me lo deja enstring empty al borrar un dato por lo que falla el parseo al dto en la api\r\n // if (auxNode.weight === null || auxNode.weight === undefined || auxNode.weight === '') auxNode.weight = 0;\r\n if (auxNode.order === null || auxNode.order === undefined || auxNode.order === '') auxNode.order = 0;\r\n \r\n\r\n //delete auxNode.stages;\r\n itemsToSave.push(auxNode);\r\n }\r\n });\r\n\r\n console.log('itemsToSave', itemsToSave);\r\n\r\n //console.log('categories', categories);\r\n markdownService.rules.updateRulesAndGenerateSuggestions(reevaluateCurrentPlan, itemsToSave).then(function () {\r\n swal(\"Confirmado\", \"Sugerencias generadas\", \"success\");\r\n self.gridOptions.api.forEachNode(function (node) {\r\n node.data.dirty = false;\r\n });\r\n }).catch(function (fallback) {\r\n swal(\"Error\", \"Hubo un error al querer guardar los cambios\", \"error\");\r\n });\r\n });\r\n }\r\n\r\n self.save = function () {\r\n\r\n var errors = validate();\r\n if (errors != '') {\r\n console.log('errors', errors);\r\n swal(\"Errores de validacion\", errors, \"warning\");\r\n return;\r\n }\r\n\r\n swal({\r\n title: \"¿Está seguro?\",\r\n text: '¿Está seguro que desea guardar los cambios?',\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function () {\r\n var itemsToSave = [];\r\n self.gridOptions.api.forEachNode(function (node) {\r\n if (node.data.dirty || true) {\r\n var auxNode = angular.copy(node.data);\r\n\r\n //issue cp #632 \r\n //el renderer me lo deja enstring empty al borrar un dato por lo que falla el parseo al dto en la api\r\n //if (auxNode.weight === null || auxNode.weight === undefined || auxNode.weight === '') auxNode.weight = 0;\r\n if (auxNode.order === null || auxNode.order === undefined || auxNode.order === '') auxNode.order = 0;\r\n\r\n itemsToSave.push(auxNode);\r\n }\r\n });\r\n\r\n if (itemsToSave.length > 0) {\r\n console.log('itemsToSave', itemsToSave);\r\n\r\n //console.log('categories', categories);\r\n markdownService.rules.updateRules(itemsToSave).then(function () {\r\n swal(\"Confirmado\", \"Se guardaron los cambios seleccionados\", \"success\");\r\n self.gridOptions.api.forEachNode(function (node) {\r\n node.data.dirty = false;\r\n });\r\n }).catch(function (fallback) {\r\n swal(\"Error\", \"Hubo un error al querer guardar los cambios\", \"error\");\r\n });\r\n }\r\n else {\r\n $timeout(function () {\r\n swal(\"Aviso\", \"No se detecto ningun cambio\", \"warning\");\r\n }, 1000);\r\n }\r\n });\r\n }\r\n\r\n function insert(str, index, value) {\r\n return str.substr(0, index) + value + str.substr(index);\r\n }\r\n\r\n //grid config\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: \"Tipo\",\r\n width: 250,\r\n pinned: 'left',\r\n field: 'asd',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n filter: 'input',\r\n cellRenderer: {\r\n renderer: 'group',\r\n checkbox: false,\r\n innerRenderer: function (params) {\r\n //TODO\r\n //console.log('params', params);\r\n var div = document.createElement('div');\r\n div.style = 'text-align:left; line-height:20px;';\r\n //console.log('div', div);\r\n var title = '';\r\n for (var i = 0; i < params.data.planTypes.length; i++) {\r\n title += params.data.planTypes[i].name + \" \";\r\n }\r\n\r\n for (var i = 0; i < params.data.paretoSectionLevels.length; i++) {\r\n title += getTypologyByLevel(params.data.paretoSectionLevels[i]).name + \" \";\r\n }\r\n\r\n var i = 40;\r\n while (i < title.length) {\r\n //console.log('name')\r\n\r\n title = insert(title, i, '
');\r\n i += 43;\r\n }\r\n\r\n div.innerHTML = '' + title + '';\r\n div.innerHTML += '
';\r\n if (params.data.useDistributionCenterStock)\r\n div.innerHTML += 'CON stock de CD';\r\n else\r\n div.innerHTML += 'SIN stock de CD';\r\n\r\n return div;\r\n }\r\n }\r\n\r\n },\r\n {\r\n headerName: 'Descripción',\r\n field: \"name\",\r\n headerTooltip: \"\",\r\n filter: 'number',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 500,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: {\r\n renderer: 'group',\r\n checkbox: false,\r\n innerRenderer: function (params) {\r\n\r\n\r\n\r\n var title = angular.copy(params.data.name);\r\n title = title.replace('REGLA DE SELECCIÓN:', '');\r\n var i = 90;\r\n while (i < title.length) {\r\n //console.log('name')\r\n\r\n title = insert(title, i, '
');\r\n i += 93;\r\n }\r\n //console.log('name', title)\r\n\r\n return '
' + title + '
';\r\n }\r\n }\r\n },\r\n {\r\n headerName: \"Desde\",\r\n field: \"validFrom\",\r\n headerTooltip: \"\",\r\n filter: 'date',\r\n isDiscountTypeColumn: true,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 100,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.dateRenderer\r\n },\r\n {\r\n headerName: \"Orden\",\r\n field: \"order\",\r\n isObjectiveColumn: true,\r\n headerTooltip: \"\",\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 120,\r\n cellClass: $rootScope.getClassForCell,\r\n filter: 'number',\r\n cellRenderer: editor('integer')\r\n },\r\n {\r\n headerName: \"\",\r\n headerTooltip: \"Eliminar\",\r\n field: \"age\",\r\n width: 50,\r\n cellRenderer: function ageCellRendererFunc(params) {\r\n params.$scope.deleteClicked = deleteClicked;\r\n return \"\";\r\n }\r\n },\r\n ]\r\n }\r\n\r\n function deleteClicked(data) {\r\n swal({\r\n title: \"Esta seguro?\",\r\n text: 'Esta seguro que desea elimiar esta regla?',\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function () {\r\n markdownService.rules.deleteRule(data.id).then(function () {\r\n swal(\"Confirmado\", \"Se eliminó la regla de liquidacion\", \"success\");\r\n loadGridData();\r\n\r\n }).catch(function (fallback) {\r\n swal(\"Error\", \"Hubo un error al querer eliminar la regla\", \"error\");\r\n });\r\n }\r\n );\r\n }\r\n\r\n //Grid Renderer\r\n function setGridOptions() {\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: false,\r\n enableFilter: false,\r\n groupUseEntireRow: false,\r\n rowSelection: \"multiple\",\r\n suppressCellSelection: true,\r\n groupSelectsChildren: true,\r\n groupSuppressAutoColumn: false, // or undefined\r\n groupColumnDef: null, // or undefined\r\n singleClickEdit: true,\r\n rowHeight: 100,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n enableRangeSelection: false,\r\n angularCompileRows: true,\r\n //getNodeChildDetails: getNodeChildDetails,\r\n getRowStyle: function (params) {\r\n //console.log('params', params);\r\n if (params.data.isEnabled == false) {\r\n return { background: 'lightgrey' }\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n //grid filter\r\n self.onFilterChanged = function (value) {\r\n self.gridOptions.api.setQuickFilter(value);\r\n }\r\n\r\n\r\n function loadGridData() {\r\n //setColumnDefinitions();\r\n\r\n\r\n markdownService.rules.getRules()\r\n .then(function (rules) {\r\n console.log('rules', rules);\r\n self.rules = rules;\r\n self.gridOptions.api.setRowData(rules);\r\n //console.log('colu', columnDefs);\r\n self.gridOptions.api.setColumnDefs(columnDefs);\r\n })\r\n }\r\n\r\n\r\n function loadData() {\r\n\r\n loadGridData();\r\n }\r\n\r\n function init() {\r\n\r\n //init columnDefs and gridOptions\r\n setGridOptions();\r\n loadData();\r\n }\r\n\r\n init();\r\n\r\n\r\n\r\n\r\n /// EDITORS\r\n\r\n function editor(type) {\r\n return function innerEditor(params) {\r\n\r\n var rendererFunction;\r\n var innerText;\r\n if (type == 'money') {\r\n rendererFunction = $rootScope.moneyRenderer;\r\n innerText = '$';\r\n }\r\n else if (type == 'greaterThanNoDecimals') {\r\n rendererFunction = $rootScope.greaterThanNoDecimals;\r\n innerText = '>';\r\n\r\n } else if (type == 'percentage') {\r\n rendererFunction = $rootScope.percentageRendererWithZero;\r\n innerText = '%';\r\n }\r\n else if (type == 'integer') {\r\n rendererFunction = $rootScope.integerRenderer;\r\n innerText = '';\r\n }\r\n else {\r\n rendererFunction = function (value) { return value.value };\r\n innerText = '';\r\n\r\n }\r\n\r\n var editing = false;\r\n\r\n var eCell = document.createElement('div');\r\n eCell.style = \"width:100% !important;height:100% !important\";\r\n eCell.className = \"input-group\";\r\n var eLabel = params.value ? document.createTextNode(rendererFunction(params)) : document.createTextNode('');\r\n eCell.appendChild(eLabel);\r\n\r\n var eSpan = document.createElement(\"span\");\r\n eSpan.className = \"input-group-addon\";\r\n eSpan.style = \"margin:0px !important; height: 100% !important; border: 0px; line-height: 100%; font-size:12px !important\";\r\n eSpan.innerText = innerText;\r\n\r\n var eInput = document.createElement(\"input\");\r\n eInput.type = \"number\";\r\n //eInput.step = \"1\";\r\n eInput.className = \"form-control\";\r\n\r\n\r\n eCell.addEventListener('click', function () {\r\n if (!editing) {\r\n eCell.removeChild(eLabel);\r\n if (type == 'greaterThanNoDecimals') {\r\n eCell.appendChild(eSpan);\r\n eCell.appendChild(eInput);\r\n } else {\r\n eCell.appendChild(eInput);\r\n eCell.appendChild(eSpan);\r\n }\r\n eInput.focus();\r\n if (type == 'percentage') {\r\n eInput.value = params.value ? params.value * 100 : null;\r\n } else {\r\n eInput.value = params.value;\r\n }\r\n editing = true;\r\n }\r\n });\r\n\r\n\r\n\r\n eInput.addEventListener('blur', function () {\r\n if (editing) {\r\n editing = false;\r\n eCell.removeChild(eSpan);\r\n eCell.removeChild(eInput);\r\n eCell.appendChild(eLabel);\r\n }\r\n });\r\n\r\n eInput.addEventListener('change', function () {\r\n if (editing) {\r\n editing = false;\r\n\r\n eCell.removeChild(eSpan);\r\n eCell.removeChild(eInput);\r\n eCell.appendChild(eLabel);\r\n\r\n if (eInput.value > 100 && type == 'percentage')\r\n return;\r\n\r\n\r\n var newValue = eInput.value;\r\n\r\n if (type == 'percentage') {\r\n var newValue = eInput.value / 100;\r\n }\r\n\r\n params.value = newValue;\r\n setField(params.data, params.column.colId, newValue);\r\n //params.data[params.column.colId] = newValue;\r\n eLabel.nodeValue = rendererFunction(params);\r\n\r\n\r\n var colIds = [];\r\n var changedRows = [];\r\n\r\n\r\n\r\n params.api.refreshCells(changedRows, colIds);\r\n params.api.recomputeAggregates();\r\n params.data.dirty = true;\r\n }\r\n });\r\n\r\n return eCell;\r\n }\r\n\r\n }\r\n\r\n function setField(data, field, value) {\r\n //debugger;\r\n if (field.indexOf('.') < 0) {\r\n data[field] = value;\r\n }\r\n else {\r\n // otherwise it is a deep value, so need to dig for it\r\n var fields = field.split('.');\r\n try {\r\n\r\n if (fields.length == 2) {\r\n data[fields[0]][fields[1]] = value;\r\n\r\n } else if (fields.length == 3) {\r\n data[fields[0]][fields[1]][fields[2]] = value;\r\n\r\n } else if (fields.length == 4) {\r\n data[fields[0]][fields[1]][fields[2][fields[3]]] = value;\r\n\r\n } else if (fields.length == 5) {\r\n data[fields[0]][fields[1]][fields[2]][fields[3]][fields[4]] = value;\r\n\r\n }\r\n\r\n } catch (e) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n //maximo, 5 campos\r\n function getField(data, field) {\r\n if (!field) return field;\r\n //debugger;\r\n if (field.indexOf('.') < 0) {\r\n return data[field];\r\n }\r\n else {\r\n // otherwise it is a deep value, so need to dig for it\r\n var fields = field.split('.');\r\n\r\n try {\r\n if (fields.length == 2) {\r\n return data[fields[0]][fields[1]];\r\n\r\n } else if (fields.length == 3) {\r\n return data[fields[0]][fields[1]][fields[2]];\r\n\r\n } else if (fields.length == 4) {\r\n return data[fields[0]][fields[1]][fields[2][fields[3]]];\r\n\r\n } else if (fields.length == 5) {\r\n return data[fields[0]][fields[1]][fields[2]][fields[3]][fields[4]];\r\n\r\n }\r\n } catch (e) {\r\n return null;\r\n }\r\n\r\n\r\n }\r\n }\r\n\r\n\r\n\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"MarkdownRulesCreationCtrl\", function ($rootScope, $state, $timeout, $scope, markdownService) {\r\n\r\n var self = this;\r\n var dic = {};\r\n var numberColWidth = 100;\r\n var editableColWidth = 140;\r\n var lastAdded = null;\r\n var columnDefs = null;\r\n\r\n self.newRule = {};\r\n\r\n self.GetNewRule = function () {\r\n return {\r\n selectedTypologies: [self.typologies[0], self.typologies[1], self.typologies[2], self.typologies[3], self.typologies[4]],\r\n selectedPriorizeBy: self.priorizeBys[0],\r\n selectedPlans: [],\r\n selectedPlanNotIncluded: {},\r\n minUnits: 1,\r\n validFrom: self.getDefaultDate()\r\n };\r\n }\r\n\r\n self.getDefaultDate = function() {\r\n var dat = new Date();\r\n dat.setDate(dat.getDate() + 1);\r\n return dat;\r\n }\r\n\r\n self.selectedBrand = null;\r\n\r\n self.writtenRule = null;\r\n\r\n self.getPlanTypes = function () {\r\n if ($rootScope.maxAgingLevel == 12 ) {\r\n if ($rootScope.erp.Implementation == 'CencosudChile') {\r\n return [\r\n { id: 10, name: 'Inactivos' },\r\n { id: 8, name: 'Descatalogados (sin bloqueo)' },\r\n { id: 9, name: 'Descatalogados (con bloqueo)' },\r\n { id: 12, name: 'Aging Fase 1' },\r\n { id: 13, name: 'Aging Fase 2' },\r\n { id: 14, name: 'Aging Fase 3' },\r\n { id: 15, name: 'Aging Fase 4' },\r\n { id: 16, name: 'Aging Fase 5' },\r\n { id: 17, name: 'Aging Fase 6' },\r\n { id: 18, name: 'Aging Fase 7' },\r\n { id: 25, name: 'Aging Fase 8' },\r\n { id: 26, name: 'Aging Fase 9' },\r\n { id: 27, name: 'Aging Fase 10' },\r\n { id: 19, name: 'Sobrestock' },\r\n { id: 20, name: 'Sobrestock critico' },\r\n { id: 21, name: 'Devolucion' },\r\n { id: 22, name: 'Carga Manual' },\r\n { id: 24, name: 'Pronostico de salida de stock' },\r\n ]\r\n }\r\n else {\r\n return [\r\n { id: 10, name: 'Inactivos' },\r\n { id: 12, name: 'Aging Fase 1' },\r\n { id: 13, name: 'Aging Fase 2' },\r\n { id: 14, name: 'Aging Fase 3' },\r\n { id: 15, name: 'Aging Fase 4' },\r\n { id: 16, name: 'Aging Fase 5' },\r\n { id: 17, name: 'Aging Fase 6' },\r\n { id: 18, name: 'Aging Fase 7' },\r\n { id: 25, name: 'Aging Fase 8' },\r\n { id: 26, name: 'Aging Fase 9' },\r\n { id: 27, name: 'Aging Fase 10' },\r\n { id: 28, name: 'Aging Fase 11' },\r\n { id: 29, name: 'Aging Fase 12' },\r\n { id: 19, name: 'Sobrestock' },\r\n { id: 20, name: 'Sobrestock critico' },\r\n { id: 21, name: 'Devolucion' },\r\n { id: 22, name: 'Carga Manual' },\r\n { id: 24, name: 'Pronostico de salida de stock' },\r\n ]\r\n }\r\n }\r\n else { //Para el resto es 7, sino agregar otro if.\r\n return [\r\n { id: 10, name: 'Inactivos' },\r\n { id: 12, name: 'Aging Fase 1' },\r\n { id: 13, name: 'Aging Fase 2' },\r\n { id: 14, name: 'Aging Fase 3' },\r\n { id: 15, name: 'Aging Fase 4' },\r\n { id: 16, name: 'Aging Fase 5' },\r\n { id: 17, name: 'Aging Fase 6' },\r\n { id: 18, name: 'Aging Fase 7' },\r\n { id: 19, name: 'Sobrestock' },\r\n { id: 20, name: 'Sobrestock critico' },\r\n { id: 21, name: 'Devolucion' },\r\n { id: 22, name: 'Carga Manual' },\r\n { id: 24, name: 'Pronostico de salida de stock' },\r\n ]\r\n }\r\n }\r\n\r\n self.planTypes = self.getPlanTypes();\r\n self.planTypesNotIncluded = self.getPlanTypes();\r\n\r\n\r\n self.typologies = [\r\n { id: 1, name: 'Tipologia 1' },\r\n { id: 2, name: 'Tipologia 2' },\r\n { id: 3, name: 'Tipologia 3' },\r\n { id: 4, name: 'Tipologia 4' },\r\n { id: 5, name: 'Tipologia 5' },\r\n ]\r\n\r\n self.priorizeBys = [\r\n { id: 1, name: 'Stock $' },\r\n { id: 2, name: 'Stock U' },\r\n { id: 3, name: 'DDS' },\r\n ]\r\n\r\n self.gridOptions = null;\r\n\r\n self.back = function () {\r\n $state.go('markdowns.rulesSelection')\r\n }\r\n\r\n function validate() {\r\n var error = '';\r\n\r\n if (!self.newRule.validFrom)\r\n error += 'La fecha ingresada no es valida\\n';\r\n\r\n if (!self.newRule.selectedPriorizeBy)\r\n error += 'Seleccione un item para priorizar\\n';\r\n\r\n if (self.newRule.selectedTypologies.length == 0 && self.newRule.selectedPlans.length == 0)\r\n error += 'Debe seleccionar al menos un plan o tipologia.\\n';\r\n\r\n\r\n return error;\r\n }\r\n\r\n $scope.$watch('ct.newRule', function (newValue, oldValue) {\r\n console.log('newValue', newValue);\r\n\r\n if (newValue.selectedTypologies.length > 0 || newValue.selectedPlans.length > 0) {\r\n\r\n var plans = '';\r\n for (var i = 0; i < newValue.selectedPlans.length; i++) {\r\n if (i == newValue.selectedPlans.length - 1) {\r\n plans += newValue.selectedPlans[i].name\r\n } else {\r\n plans += newValue.selectedPlans[i].name + ', ';\r\n }\r\n }\r\n var typologies = '';\r\n for (var i = 0; i < newValue.selectedTypologies.length; i++) {\r\n if (i == newValue.selectedTypologies.length - 1) {\r\n typologies += newValue.selectedTypologies[i].name\r\n } else {\r\n typologies += newValue.selectedTypologies[i].name + ', ';\r\n }\r\n }\r\n\r\n self.writtenRule = \"REGLA DE SELECCIÓN: \\n\";\r\n self.writtenRule += \"Cuando un producto es \";\r\n\r\n if (plans)\r\n self.writtenRule += plans + ' ';\r\n\r\n if (newValue.selectedPlanNotIncluded != null && newValue.selectedPlanNotIncluded.name) {\r\n var planNotIncluded = newValue.selectedPlanNotIncluded.name\r\n self.writtenRule += '( y no es ' + planNotIncluded + ') ';\r\n }\r\n\r\n if (plans && typologies)\r\n self.writtenRule += 'y ';\r\n\r\n if (typologies)\r\n self.writtenRule += typologies + ' ';\r\n\r\n\r\n self.writtenRule += \"ingresa al plan según su stock (\";\r\n\r\n if (newValue.useDistributionCenterStock) {\r\n self.writtenRule += \"con CD\";\r\n } else {\r\n self.writtenRule += \"sin CD\";\r\n }\r\n\r\n if (newValue.minUnits < 1 || !newValue.minUnits)\r\n newValue.minUnits = 1;\r\n\r\n self.writtenRule += ') con sus unidades mínimas (' + newValue.minUnits + ') ';\r\n\r\n if (newValue.selectedPriorizeBy)\r\n self.writtenRule += 'priorizado por su ' + newValue.selectedPriorizeBy.name;\r\n\r\n\r\n } else {\r\n self.writtenRule = null;\r\n }\r\n }, true);\r\n\r\n self.save = function () {\r\n\r\n var errors = validate();\r\n if (errors != '') {\r\n console.log('errors', errors);\r\n swal(\"Errores de validacion\", errors, \"warning\");\r\n return;\r\n }\r\n\r\n swal({\r\n title: \"Esta seguro?\",\r\n text: 'Esta seguro que desea guardar los cambios?',\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function () {\r\n\r\n var paretoSectionLevels = [];\r\n for (var i = 0; i < self.newRule.selectedTypologies.length; i++) {\r\n paretoSectionLevels.push(self.newRule.selectedTypologies[i].id)\r\n }\r\n\r\n var data = {\r\n name: self.writtenRule,\r\n priorizeBy: self.newRule.selectedPriorizeBy.id,\r\n planTypes: self.newRule.selectedPlans,\r\n planTypeNotIncluded: (self.newRule.selectedPlanNotIncluded != null && self.newRule.selectedPlanNotIncluded.id ? self.newRule.selectedPlanNotIncluded.id : null),\r\n paretoSectionLevels: paretoSectionLevels,\r\n useDistributionCenterStock: self.newRule.useDistributionCenterStock,\r\n minUnits: self.newRule.minUnits,\r\n validFrom: self.newRule.validFrom.toISOString()\r\n }\r\n \r\n\r\n console.log('newRule', self.newRule);\r\n console.log('data', data);\r\n\r\n markdownService.rules.saveRule(data).then(function () {\r\n swal(\"Confirmado\", \"Se guardo la regla de liquidacion\", \"success\");\r\n $state.go('markdowns.rulesSelection')\r\n\r\n }).catch(function (fallback) {\r\n swal(\"Error\", \"Hubo un error al querer guardar los cambios\", \"error\");\r\n });\r\n });\r\n }\r\n\r\n\r\n\r\n function loadData() {\r\n self.newRule = self.GetNewRule();\r\n }\r\n\r\n function init() {\r\n\r\n loadData();\r\n }\r\n\r\n init();\r\n\r\n\r\n\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"MarkdownRulesCategoryCtrl\", function ($rootScope, $state, $timeout, $interval, $filter, markdownService, adminService, ngDialog, $scope) {\r\n\r\n var self = this;\r\n var dic = {};\r\n var numberColWidth = 100;\r\n var editableColWidth = 140;\r\n var lastAdded = null;\r\n var columnDefs = null;\r\n self.selectedBrand = null;\r\n self.companyCode = $rootScope.erp.Implementation;\r\n self.isLoadingQuickLoad = false;\r\n\r\n self.discountTypes = [\r\n { id: 1, name: \"%\" },\r\n { id: 2, name: \"$\" },\r\n //{ id: 3, name: \"$-%\" },\r\n ]\r\n\r\n self.objectiveTypes = [\r\n { id: 1, name: \"Reduccion de stock\" },\r\n { id: 2, name: \"Dias de stock\" },\r\n\r\n ]\r\n\r\n \r\n self.goToRules = function (id, categoryGroup, category, subcategory) {\r\n\r\n categoryGroup = categoryGroup.replace(/ /g, \"-\").replace(/\\//g, \"_\");\r\n category = category.replace(/ /g, \"-\").replace(/\\//g, \"_\");\r\n subcategory = subcategory.replace(/ /g, \"-\").replace(/\\//g, \"_\");\r\n\r\n var encodedcategoryGroup = categoryGroup != 'null' ? encodeURIComponent(categoryGroup) : '';\r\n var encodedcategory = category != 'null' ? encodeURIComponent(category) : '';\r\n var encodedsubcategory = subcategory != 'null' ? encodeURIComponent(subcategory) : '';\r\n\r\n $state.go('prices.rules', { categoryId: id, categoryGroup: encodedcategoryGroup, category: encodedcategory, subcategory: encodedsubcategory });\r\n }\r\n\r\n function hasChildrenEnabled(data) {\r\n if (data.details) {\r\n for (var i = 0; i < data.details.length; i++) {\r\n if (data.details[i].isEnabled)\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n function validate() {\r\n var error = '';\r\n\r\n let forecasteds = [];\r\n self.gridOptions.api.forEachNode(function (node) {\r\n let data = node.data;\r\n\r\n if (data.details && data.details.length >= 1) {\r\n for (let i = 0; i < data.details.length; i++) {\r\n if (data.details[i].isEnabled && data.details[i].isEnabled == true && data.details[i].planType == 24) {\r\n let stagesCount = 0;\r\n data.details[i].stages.forEach(function (stage) {\r\n if (stage.discount)\r\n stagesCount++;\r\n });\r\n console.log('forecasted:');\r\n console.log(data);\r\n forecasteds.push({ categoryId: data.categoryId, stages: stagesCount });\r\n }\r\n }\r\n } \r\n });\r\n forecasteds.containCategory = function (categoryId) {\r\n for (let i = 0; i < forecasteds.length; i++) {\r\n if (forecasteds[i].categoryId == categoryId)\r\n return true;\r\n }\r\n return false;\r\n }\r\n forecasteds.containCategoryStages = function (categoryId, stages) {\r\n for (let i = 0; i < forecasteds.length; i++) {\r\n if (forecasteds[i].categoryId == categoryId && forecasteds[i].stages >= stages)\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n\r\n self.gridOptions.api.forEachNode(function (node) {\r\n var data = node.data;\r\n\r\n \r\n if (hasChildrenEnabled(data) && !forecasteds.containCategory(data.categoryId)) {\r\n error += \"\\nDebe ingresar 'Pronostico de salida de stock' en \" + data.categoryName;\r\n } else {\r\n //data.details[i].isEnabled && data.details[i].isEnabled == true && data.details[i].planType == 24\r\n if (forecasteds.containCategory(data.categoryId) && data.details && data.details.length >= 1) {\r\n for (let i = 0; i < data.details.length; i++) {\r\n if (data.details[i].isEnabled && data.details[i].isEnabled == true && data.details[i].planType != 24) {\r\n let countStages = 0;\r\n data.details[i].stages.forEach(function (stage) {\r\n if (stage.discount)\r\n countStages++;\r\n });\r\n if (!forecasteds.containCategoryStages(data.categoryId, countStages)) {\r\n error += \"\\n'Pronostico de salida de stock' debe tener las mismas etapas que \" + data.categoryName;\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (data.isEnabled && isPlanRow(data)) {\r\n\r\n //if (!data.investment) {\r\n // error += '\\nLa inversion no puede ser nula en ' + data.categoryName;\r\n //}\r\n\r\n //if (!data.marginMin) {\r\n // error += '\\nEl margen minimo no puede ser nulo en ' + data.categoryName;\r\n //}\r\n\r\n if (!data.optionalValue && isOptionalRow(data)) {\r\n error += \"\\nDebe ingresar un valor en el campo 'Mayor' en \" + data.categoryName;\r\n }\r\n\r\n if (!data.discountType && hasDiscountType(data)) {\r\n error += \"\\nDebe seleccionar un tipo de descuento en \" + data.categoryName;\r\n }\r\n\r\n if ((data.objectiveDds == null || data.objectiveDds <= 0) && (data.objectiveVentasUn == null || data.objectiveVentasUn <= 0) && data.planType != 24) {\r\n error += \"\\nDebe ingresar un valor válido para el objetivo en \" + data.categoryName;\r\n }\r\n\r\n var discount = 0;\r\n data.stages.forEach(function (stage) {\r\n if (stage.discount)\r\n discount += stage.discount\r\n });\r\n\r\n if (discount == 0) {\r\n error += \"\\nDebe ingresar un % de descuento al menos la Etapa 1 del Plan en \" + data.categoryName;\r\n }\r\n \r\n }\r\n if (hasDetails(data) && hasChildrenEnabled(data)) {\r\n\r\n if (data.investment == null || (!isNaN(data.investment) && data.investment == 0) ) { \r\n \r\n error += '\\nLa inversion no puede ser nula en ' + data.categoryName;\r\n }\r\n }\r\n\r\n });\r\n return error;\r\n }\r\n\r\n self.save = function () {\r\n\r\n var errors = validate();\r\n if (errors != '') {\r\n console.log('errors', errors);\r\n swal(\"Errores de validacion\", errors, \"warning\");\r\n return;\r\n }\r\n self.selectedBrandsToSave = [self.selectedBrand.brandId];\r\n ngDialog.open({\r\n template: 'selectBrandsDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: $scope\r\n }).closePromise.then(function (data) {\r\n swal({\r\n title: \"Esta seguro que desea guardar los cambios?\",\r\n text: 'Se eliminaran todas las sugerencias anteriores y las liquidaciones pendientes de validación en Prisma',\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function () {\r\n var itemsToSave = [];\r\n var _investment = null;\r\n var _marginmin = null;\r\n var _minStockLiquidable = null;\r\n \r\n self.gridOptions.api.forEachNode(function (node) {\r\n let data = node.data;\r\n if (data.details && data.details.length >= 1) {\r\n\r\n for (let i = 0; i < data.details.length; i++) {\r\n //ISSUE CP 934: al servicio mando TODOS los detail ya que él chequea isEnabled. \r\n //De esta manera si se destildan todos los details de una categoria estos SI van al servicio y la regla de esa categoria queda eliminada\r\n //if (data.details[i].isEnabled && data.details[i].isEnabled == true) { \r\n let auxNode = angular.copy(data.details[i]);\r\n auxNode.investment = data.investment;\r\n auxNode.marginmin = data.marginMin;\r\n auxNode.minStockLiquidable = data.minStockLiquidable;\r\n auxNode.categoryId = data.categoryId;\r\n itemsToSave.push(auxNode);\r\n //}\r\n\r\n }\r\n \r\n }\r\n /*let parentId;\r\n if (!isPlanRow(node.data)) {\r\n parentId = node.data.parentId; \r\n _investment = node.data.investment;\r\n _marginmin = node.data.marginMin;\r\n _minStockLiquidable = node.data.minStockLiquidable;\r\n }\r\n\r\n if (isPlanRow(node.data) && parentId && node.data.categoryId == parentId) {\r\n let auxNode = angular.copy(node.data);\r\n auxNode.investment = _investment;\r\n auxNode.marginMin = _marginmin;\r\n auxNode.minStockLiquidable = _minStockLiquidable;\r\n itemsToSave.push(auxNode);\r\n }\r\n */\r\n });\r\n\r\n if (itemsToSave.length > 0) {\r\n console.log('itemsToSave', itemsToSave);\r\n\r\n var dto = {\r\n PlanDetailDtos: itemsToSave,\r\n BrandIds: self.selectedBrandsToSave || [self.selectedBrand.brandId]\r\n };\r\n\r\n //markdownService.rules.saveCategoryRules(itemsToSave, self.selectedBrand.brandId).then(function () {\r\n markdownService.rules.saveCategoryRules(dto).then(function () {\r\n swal(\"Confirmado\", \"Se guardaron los cambios seleccionados\", \"success\");\r\n self.gridOptions.api.forEachNode(function (node) {\r\n node.data.dirty = false;\r\n });\r\n loadGridData(self.selectedBrand.brandId);\r\n }).catch(function (fallback) {\r\n swal(\"Error\", \"Hubo un error al querer guardar los cambios\", \"error\");\r\n });\r\n }\r\n else {\r\n $timeout(function () {\r\n swal(\"Aviso\", \"No se detecto ningun cambio\", \"warning\");\r\n }, 1000);\r\n }\r\n });\r\n });\r\n\r\n\r\n \r\n }\r\n\r\n self.addBrandToSave = function (brandId) {\r\n if (self.selectedBrandsToSave.includes(brandId))\r\n self.selectedBrandsToSave.splice(self.selectedBrandsToSave.indexOf(brandId), 1);\r\n else\r\n self.selectedBrandsToSave.push(brandId);\r\n }\r\n\r\n self.closeDialog = function () {\r\n ngDialog.close();\r\n }\r\n\r\n function iconRenderer(params) {\r\n return '';\r\n }\r\n\r\n //grid config\r\n function setColumnDefinitions() {\r\n\r\n var hName = self.companyCode != 'CencosudChile' ? \"Sección / Categoría\" : \"Gerencia Comercial / Sección\";\r\n columnDefs = [\r\n {\r\n headerName: hName,\r\n children: [\r\n {\r\n headerName: \"Activo\",\r\n width: 50,\r\n pinned: 'left',\r\n field: 'isEnabled',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n filter: 'input',\r\n cellRenderer: function (params){ \r\n //console.log('params', params);\r\n if (params.data.level == undefined) {\r\n var checkbox = document.createElement('input');\r\n checkbox.type = 'checkbox';\r\n checkbox.checked = params.data.isEnabled;\r\n\r\n checkbox.onclick = function (value) {\r\n //console.log('value', value.target.checked);\r\n\r\n //$timeout(function () {\r\n params.data.isEnabled = value.target.checked;\r\n if (params.data.id == null) {\r\n params.data.id = 0;\r\n }\r\n params.api.refreshCells([], []);\r\n params.api.recomputeAggregates();\r\n //})\r\n params.data.dirty = true;\r\n //console.log(params.data); \r\n }\r\n return checkbox;\r\n\r\n\r\n\r\n }\r\n return '';\r\n }\r\n\r\n },\r\n {\r\n headerName: hName,\r\n width: numberColWidth + 180,\r\n pinned: 'left',\r\n field: 'categoryName',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n cellRenderer: {\r\n renderer: 'group',\r\n checkbox: false,\r\n innerRenderer: function (params) {\r\n var name = params.value + (params.node.group && params.node.children != null ? ' (' + params.node.children.length + ')' : '');\r\n\r\n //Pregunto por el pais\r\n if (self.companyCode == 'CencosudChile') {\r\n if (params.data.level == 3)\r\n //name = params.data.categoryParentName + ' / ' + name;\r\n var div = document.createElement('div');\r\n\r\n var anchor = document.createElement('a');\r\n //anchor.title = 'click para ingresar a la categoria';\r\n anchor.style = 'padding: 5px';\r\n anchor.innerHTML = name\r\n\r\n\r\n return anchor;\r\n }\r\n //No es Chile\r\n else {\r\n if (params.data.level == 3) {\r\n name = params.data.categoryParentName + ' / ' + name;\r\n }\r\n var div = document.createElement('div');\r\n\r\n var anchor = document.createElement('a');\r\n //anchor.title = 'click para ingresar a la categoria';\r\n anchor.style = 'padding: 5px';\r\n anchor.innerHTML = name\r\n\r\n\r\n return anchor;\r\n }\r\n\r\n //if (params.data.level != undefined) {\r\n // return anchor;\r\n //} else {\r\n // var checkbox = '';\r\n // //checkbox.value = \"value\";\r\n\r\n // return checkbox + anchor.outerHTML;\r\n //}\r\n\r\n\r\n //anchor.addEventListener('click', function () {\r\n // var categoryGroup = '';\r\n // var category = '';\r\n // var subcategory = '';\r\n // if (!params.node.parent || params.node.parent == null) {\r\n // categoryGroup = params.value;\r\n // }\r\n // else if (params.node.parent != null && params.node.children != null) {\r\n // categoryGroup = params.node.parent.data.name;\r\n // category = params.value\r\n // }\r\n // else if (params.node.parent != null && params.node.children == null) {\r\n // categoryGroup = params.node.parent.parent.data.name;\r\n // category = params.node.parent.data.name\r\n // subcategory = params.value\r\n // }\r\n // self.goToRules(params.data.id, categoryGroup, category, subcategory);\r\n //});\r\n }\r\n }\r\n },\r\n\r\n {\r\n headerName: \"Param DDS\",\r\n width: 100,\r\n pinned: 'left',\r\n field: 'optionalValue',\r\n headerTooltip: \"Permite ingresar la cantidad de Dias de Stock a partir de la cual un producto se considera como Sobrestock o Sobrestock Critico\",\r\n onlyPlanRow: true,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n isOptionalColumn: true,\r\n filter: 'input',\r\n cellRenderer: editor('greaterThanNoDecimals')\r\n\r\n },\r\n \r\n ]\r\n\r\n },\r\n {\r\n headerName: self.selectedBrand ? self.selectedBrand.brand : '',\r\n //headerName: \"Guías de Margen\",\r\n \r\n children: [\r\n {\r\n headerName: \"Mín. Stock Liquidable\",\r\n field: \"minStockLiquidable\",\r\n headerTooltip: \"\",\r\n onlyCategory4: true,\r\n appliesOnChildren: false,\r\n filter: 'number',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 100,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: editor('percentage')\r\n },\r\n {\r\n headerName: \"Margen Min\",\r\n field: \"marginMin\",\r\n headerTooltip: \"\",\r\n onlyCategory4: true,\r\n appliesOnChildren: false,\r\n filter: 'number',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 100,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: editor('percentage')\r\n },\r\n {\r\n headerName: \"Inversión\",\r\n field: \"investment\",\r\n headerTooltip: \"\",\r\n onlyCategory4: true,\r\n appliesOnChildren: false,\r\n filter: 'number',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 100,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: editor('money')\r\n }]\r\n },\r\n {\r\n headerName: \"Etapas\",\r\n\r\n children: [\r\n {\r\n headerName: \"Precio / Dto\",\r\n field: \"discountTypeString\",\r\n headerTooltip: \"\",\r\n filter: 'number',\r\n isDiscountTypeColumn: true,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 100,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: dropDownEditor(self.discountTypes, \"discountTypeString\", \"discountType\", onDiscountTypeChange)\r\n },\r\n {\r\n headerName: \"Etapa 1\",\r\n field: \"stages.0.discount\",\r\n filter: 'number',\r\n headerTooltip: \"\",\r\n //onlyPlanRow: true,\r\n appliesOnChildren: true,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 65,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: editor('percentage')\r\n },\r\n {\r\n headerName: \"Etapa 2\",\r\n dependencyField: 'stages.0.discount',\r\n field: \"stages.1.discount\",\r\n headerTooltip: \"\",\r\n //onlyPlanRow: true,\r\n appliesOnChildren: true,\r\n filter: 'number',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 80,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: editor('percentage')\r\n },\r\n {\r\n headerName: \"Etapa 3\",\r\n dependencyField: 'stages.1.discount',\r\n field: \"stages.2.discount\",\r\n filter: 'number',\r\n headerTooltip: \"\",\r\n //onlyPlanRow: true,\r\n appliesOnChildren: true,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 80,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: editor('percentage')\r\n },\r\n {\r\n headerName: \"Etapa 4\",\r\n dependencyField: 'stages.2.discount',\r\n field: \"stages.3.discount\",\r\n headerTooltip: \"\",\r\n filter: 'number',\r\n //onlyPlanRow: true,\r\n appliesOnChildren: true,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 80,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: editor('percentage')\r\n },\r\n {\r\n headerName: \"Etapa 5\",\r\n dependencyField: 'stages.3.discount',\r\n field: \"stages.4.discount\",\r\n headerTooltip: \"\",\r\n filter: 'number',\r\n suppressMenu: true,\r\n //onlyPlanRow: true,\r\n appliesOnChildren: true,\r\n suppressSorting: true,\r\n width: 80,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: editor('percentage')\r\n },\r\n {\r\n headerName: \"Vig. Indet.\",\r\n field: \"validToUndetermined\",\r\n headerTooltip: \"\",\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 80,\r\n cellClass: $rootScope.getClassForCell,\r\n filter: 'input',\r\n cellRenderer: checkboxEditor()//$rootScope.checkboxEditor\r\n }\r\n ]\r\n },\r\n {\r\n headerName: \"Objetivos\",\r\n children: [\r\n {\r\n headerName: \"Reduccion De Stock (%)\", //ex objetivo\r\n field: \"objectiveVentasUn\",\r\n //isObjectiveColumn: true,\r\n appliesOnChildren: true,\r\n headerTooltip: \"\",\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 150,\r\n cellClass: $rootScope.getClassForCell,\r\n filter: 'number',\r\n cellRenderer: editor('percentage', onObjReduccionDeStockChange)\r\n //cellRenderer: dropDownEditor(self.objectiveTypes, \"objectiveTypeString\", \"objectiveType\")\r\n },\r\n {\r\n headerName: \"DDS\",//ex valor\r\n field: \"objectiveDds\",\r\n //isObjectiveColumn: true,\r\n appliesOnChildren: true,\r\n headerTooltip: \"\",\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: 120,\r\n cellClass: $rootScope.getClassForCell,\r\n filter: 'input',\r\n cellRenderer: editor('number', onObjDdsChange)\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n\r\n //Grid Renderer\r\n function onObjReduccionDeStockChange(params, newValue) {\r\n if (newValue)\r\n params.data.objectiveDds = null;\r\n }\r\n\r\n function onObjDdsChange(params, newValue) {\r\n if (newValue)\r\n params.data.objectiveVentasUn = null;\r\n }\r\n\r\n function setGridOptions() {\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: false,\r\n enableFilter: false,\r\n groupUseEntireRow: false,\r\n rowSelection: \"multiple\",\r\n suppressCellSelection: true,\r\n groupSelectsChildren: true,\r\n groupSuppressAutoColumn: false, // or undefined\r\n groupColumnDef: null, // or undefined\r\n singleClickEdit: true,\r\n rowHeight: 35,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n enableRangeSelection: false,\r\n angularCompileRows: true,\r\n getNodeChildDetails: getNodeChildDetails,\r\n getRowStyle: function (params) {\r\n //console.log('params', params);\r\n if (params.data.isEnabled == false) {\r\n return { background: 'lightgrey' }\r\n }\r\n },\r\n doesExternalFilterPass: doesExternalFilterPass,\r\n isExternalFilterPresent: isExternalFilterPresent\r\n }\r\n }\r\n\r\n function getNodeChildDetails(rowItem) {\r\n let chile = self.companyCode == 'CencosudChile';\r\n\r\n if (rowItem.details && rowItem.details.length > 0) {\r\n return {\r\n group: true,\r\n expanded: false,\r\n // provide ag-Grid with the children of this group\r\n children: rowItem.details,\r\n // the key is used by the default group cellRenderer\r\n key: (chile ? rowItem.categoryd : rowItem.id)\r\n };\r\n }\r\n // SI CHILE\r\n if (chile) {\r\n\r\n if (rowItem.categories && rowItem.categories.length > 0) {\r\n return {\r\n group: true,\r\n expanded: false,\r\n // provide ag-Grid with the children of this group\r\n children: rowItem.categories,\r\n // the key is used by the default group cellRenderer\r\n key: rowItem.categoryd\r\n };\r\n }\r\n if (rowItem.sections && rowItem.sections.length > 0) {\r\n return {\r\n group: true,\r\n expanded: false,\r\n // provide ag-Grid with the children of this group\r\n children: rowItem.sections,\r\n // the key is used by the default group cellRenderer\r\n key: rowItem.categoryIid\r\n };\r\n } else {\r\n return null;\r\n }\r\n\r\n } else {\r\n\r\n if (rowItem.subcategories && rowItem.subcategories.length > 0) {\r\n return {\r\n group: true,\r\n expanded: false,\r\n // provide ag-Grid with the children of this group\r\n children: rowItem.subcategories,\r\n // the key is used by the default group cellRenderer\r\n key: rowItem.id\r\n };\r\n } else {\r\n return null;\r\n }\r\n }\r\n \r\n }\r\n\r\n function onDiscountTypeChange(params, newValue) {\r\n console.log('params', params);\r\n console.log('newValue', newValue);\r\n\r\n if (newValue == '$') {\r\n\r\n } else {\r\n params.data.validToUndetermined = false;\r\n }\r\n params.api.recomputeAggregates();\r\n\r\n }\r\n\r\n //grid filter\r\n //self.onFilterChanged = function (value) {\r\n // self.gridOptions.api.setQuickFilter(value);\r\n //}\r\n\r\n //Borro todas las columnas que dependan de mi. Lo hago en cascada y recursivo para barrer todo\r\n function clearDependencyColumn(params, column) {\r\n //debugger;\r\n var columns = params.api.columnController.allColumns;\r\n for (var i = 0; i < columns.length; i++) {\r\n if (columns[i].colDef.dependencyField == column) {\r\n clearDependencyColumn(params, columns[i].colId);\r\n setField(params.data, columns[i].colId, null);\r\n }\r\n }\r\n\r\n }\r\n\r\n function clearAlternativeColumn(params, colIds, changedRows, node) {\r\n if (params.value) {\r\n\r\n if (params.colDef.field == 'objectiveVentasUn') {\r\n setField(params.data, 'objectiveDds', null);\r\n if (node.children) {\r\n node.children.forEach(function (x) {\r\n setField(x.data, 'objectiveDds', null); \r\n });\r\n }\r\n }\r\n \r\n\r\n if (params.colDef.field == 'objectiveDds') {\r\n setField(params.data, 'objectiveVentasUn', null);\r\n if (node.children) {\r\n node.children.forEach(function (x) {\r\n setField(x.data, 'objectiveVentasUn', null);\r\n });\r\n }\r\n }\r\n \r\n\r\n //var column = params.column.colId;\r\n //var alternativeColumn = column.indexOf('Amount') !== -1 ? column.replace('Amount', '') : (column + 'Amount');\r\n\r\n //node.data[alternativeColumn] = null;\r\n //colIds.push(alternativeColumn);\r\n //changedRows.push(node);\r\n }\r\n }\r\n\r\n function clearColumn(params, colIds, changedRows, node) {\r\n if (!doesColumnApply(params.column.colDef, params.data)) return;\r\n\r\n if (!getField(params.data, params.column.colId)) {\r\n clearDependencyColumn(params, params.column.colId);\r\n }\r\n clearAlternativeColumn(params, colIds, changedRows, node);\r\n }\r\n\r\n\r\n self.brandClick = function (brand) {\r\n\r\n if (self.selectedBrand == null) {\r\n changeBrand(brand);\r\n return;\r\n }\r\n\r\n if (self.selectedBrand.brandId == brand.brandId) {\r\n return;\r\n }\r\n\r\n var hasChanges = false;\r\n self.gridOptions.api.forEachNode(function (node) {\r\n if (node.data.dirty) {\r\n hasChanges = true;\r\n }\r\n });\r\n\r\n if (hasChanges) {\r\n swal({\r\n title: \"Tiene cambios pendientes sin guardar\",\r\n text: 'Si cambia de Marca, se perderan los cambios que haya hecho para ' +\r\n self.selectedBrand.brand + '.',\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#DD6B55\",\r\n confirmButtonText: \"Descartar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: true,\r\n closeOnCancel: true\r\n },\r\n function () {\r\n changeBrand(brand);\r\n });\r\n }\r\n else\r\n changeBrand(brand);\r\n }\r\n \r\n self.externalFilterChanged = function () {\r\n self.gridOptions.api.onFilterChanged();\r\n } \r\n\r\n function isExternalFilterPresent() {\r\n return self.search != null && self.search != '';\r\n }\r\n\r\n function doesExternalFilterPass(node) {\r\n if (node.parent.data &&\r\n node.parent.parent &&\r\n node.parent.parent.data &&\r\n (node.parent.data.categoryName.toLowerCase().indexOf(self.search.toLowerCase()) != -1\r\n || node.parent.data.categoryParentName.toLowerCase().indexOf(self.search.toLowerCase()) != -1\r\n || node.parent.parent.data.categoryName.toLowerCase().indexOf(self.search.toLowerCase()) != -1\r\n || node.parent.parent.data.categoryParentName.toLowerCase().indexOf(self.search.toLowerCase()) != -1))\r\n return true;\r\n\r\n return false;\r\n } \r\n\r\n function changeBrand(brand) {\r\n\r\n self.selectedBrand = brand;\r\n\r\n\r\n\r\n loadGridData(brand.brandId);\r\n\r\n }\r\n\r\n function loadGridData(brandId) {\r\n setColumnDefinitions();\r\n\r\n if (self.gridOptions.api && typeof self.gridOptions.api.showLoadingOverlay == 'function')\r\n self.gridOptions.api.showLoadingOverlay();\r\n\r\n markdownService.rules.getRulesCategories(brandId)\r\n .then(function (summary) {\r\n console.log('summary', summary);\r\n self.summary = summary;\r\n self.gridOptions.api.setRowData(summary);\r\n console.log('colu', columnDefs);\r\n self.gridOptions.api.setColumnDefs(columnDefs);\r\n })\r\n }\r\n\r\n self.quickLoadEnabled = false; \r\n\r\n\r\n self.doQuickLoad = function () {\r\n\r\n self.selectedCategories2 = [];\r\n self.selectedCategories3 = [];\r\n self.selectedCategories4 = [];\r\n self.selectedCategories5 = [];\r\n let chile = self.companyCode == 'CencosudChile';\r\n self.isLoadingQuickLoad = true;\r\n markdownService.rules.getRulesCategories(self.selectedBrand.brandId)\r\n .then(function (summary) {\r\n //asegura un summary, TO DO! implementar una manera mas optima de obtener un auxCategory\r\n self.summary = summary;\r\n\r\n var auxCategory = null;\r\n if (chile) {\r\n var auxCategory = angular.copy(self.summary.shift().sections.shift().categories.shift());\r\n } else {\r\n\r\n auxCategory = angular.copy(self.summary.shift().subcategories.shift());\r\n }\r\n\r\n auxCategory.categoryName = 'Categoria';\r\n auxCategory.investment = null;\r\n auxCategory.marginMin = null;\r\n auxCategory.minStockLiquidable = null;\r\n\r\n angular.forEach(auxCategory.details, function (d) {\r\n d.discountType = 0;\r\n d.discountTypeString = \"\";\r\n d.forecastSellOut = null;\r\n d.isEnabled = false;\r\n d.objectiveDds = null;\r\n d.objectiveVentasUn = null;\r\n d.validToUndetermined = false;\r\n d.optionalValue = null;\r\n angular.forEach(d.stages, function (s) {\r\n s.discount = null;\r\n });\r\n\r\n });\r\n\r\n self.quickLoad = {\r\n categories: [],//cat seleccionadas\r\n categorySettings: auxCategory\r\n };\r\n\r\n self.quickLoadEnabled = !self.quickLoadEnabled;\r\n\r\n self.isLoadingQuickLoad = false;\r\n });\r\n\r\n }\r\n\r\n self.applyQuickLoad = function () {\r\n self.quickLoadEnabled = false;\r\n\r\n // 1. Define el alcance de categorias de la carga al nivel mas bajo de la jerarquia del negocio \r\n if (self.companyCode == 'CencosudChile') {\r\n angular.forEach(self.selectedCategories3, function (cat3) {\r\n self.selectedCategories4 = self.selectedCategories4.concat(self.categories4.filter(function (cat4) {\r\n return cat4.parentId === cat3.id;\r\n }));\r\n });\r\n\r\n angular.forEach(self.selectedCategories4, function (cat4) {\r\n self.selectedCategories5 = self.selectedCategories5.concat(self.categories5.filter(function (cat5) {\r\n return cat5.parentId === cat4.id;\r\n }));\r\n });\r\n\r\n self.quickLoad.categories = self.selectedCategories5;\r\n }\r\n else {\r\n angular.forEach(self.selectedCategories2, function (cat2) {\r\n self.selectedCategories3 = self.selectedCategories3.concat(self.categories3.filter(function (cat3) {\r\n return cat3.parentId === cat2.id;\r\n }));\r\n });\r\n\r\n angular.forEach(self.selectedCategories3, function (cat3) {\r\n self.selectedCategories4 = self.selectedCategories4.concat(self.categories4.filter(function (cat4) {\r\n return cat4.parentId === cat3.id;\r\n }));\r\n });\r\n\r\n self.quickLoad.categories = self.selectedCategories4;\r\n }\r\n\r\n //2. Aplicacion a la grilla\r\n var changedRows = [];\r\n angular.forEach(self.quickLoad.categories, function (cat) {\r\n self.gridOptions.api.forEachNode(function (node) {\r\n if (node.data.categoryId === cat.id && node.data.details) { \r\n node.data.minStockLiquidable = self.quickLoad.categorySettings.minStockLiquidable ? self.quickLoad.categorySettings.minStockLiquidable / 100 : null;\r\n node.data.marginMin = self.quickLoad.categorySettings.marginMin ? self.quickLoad.categorySettings.marginMin / 100 : null;\r\n node.data.investment = self.quickLoad.categorySettings.investment;\r\n angular.forEach(self.quickLoad.categorySettings.details, function (detail) {\r\n var nodeDetail = node.data.details.find(function (d) {\r\n return d.planType === detail.planType;\r\n });\r\n nodeDetail.updatedByQuickLoad = true;\r\n nodeDetail.isEnabled = detail.isEnabled;\r\n nodeDetail.optionalValue = detail.optionalValue;\r\n nodeDetail.discountType = detail.discountType ? parseInt(detail.discountType) : 0;\r\n if (detail.discountType == '1')\r\n nodeDetail.discountTypeString = '%';\r\n else if (nodeDetail.discountType == '2')\r\n nodeDetail.discountTypeString = '$';\r\n else nodeDetail.discountTypeString = '';\r\n nodeDetail.validToUndetermined = detail.validToUndetermined;\r\n nodeDetail.objectiveVentasUn = detail.objectiveVentasUn ? detail.objectiveVentasUn / 100 : null;\r\n nodeDetail.objectiveDds = nodeDetail.objectiveVentasUn ? null : detail.objectiveDds;\r\n angular.forEach(detail.stages, function (stage) {\r\n var nodeDetailStage = nodeDetail.stages.find(function (s) {\r\n return s.stageId === stage.stageId;\r\n });\r\n nodeDetailStage.discount = stage.discount ? stage.discount / 100 : null;\r\n });\r\n });\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n }\r\n });\r\n });\r\n\r\n self.gridOptions.api.refreshRows(changedRows);\r\n $timeout(function () {\r\n self.gridOptions.api.refreshView();\r\n }, 100);\r\n \r\n }\r\n\r\n \r\n\r\n function loadBrands() {\r\n markdownService.rules.getBrands().then(function (brands) {\r\n self.brands = brands;\r\n\r\n changeBrand(brands[0]);\r\n })\r\n }\r\n\r\n\r\n function loadCategories() {\r\n\r\n var arr = (self.companyCode == \"CencosudChile\" ? [2, 3, 4, 5] : [2, 3, 4]);\r\n\r\n adminService.categories.getCategoriesWithLevels(arr)\r\n .then(function (categories) {\r\n \r\n self.categories2 = categories.filter(function (x) { return x.level === 2; });\r\n self.categories3 = categories.filter(function (x) { return x.level === 3; });\r\n self.categories4 = categories.filter(function (x) { return x.level === 4; });\r\n if(self.companyCode == \"CencosudChile\")\r\n self.categories5 = categories.filter(function (x) { return x.level === 5; });\r\n });\r\n }\r\n\r\n function loadData() {\r\n\r\n loadBrands();\r\n loadCategories();\r\n }\r\n\r\n function init() {\r\n\r\n self.gridOptions = null;\r\n self.summary = null;\r\n self.competitorGroups = [];\r\n\r\n //init columnDefs and gridOptions\r\n setGridOptions();\r\n loadData();\r\n }\r\n\r\n init();\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n ///////////////////////////////// START EDITORS ////////////////////////////////////////\r\n\r\n function checkboxEditor(onChangeCallback) {\r\n return function (params) {\r\n if (params.data.discountType == 1 || !params.data.isEnabled) {// para el tipo de descuento % no aplica vigencia indeterminada\r\n return '';\r\n }\r\n var eInput = document.createElement(\"input\");\r\n eInput.type = \"checkbox\";\r\n eInput.checked = params.value;\r\n\r\n eInput.addEventListener(\"change\", function (event) {\r\n var changedRows = [];\r\n var colIds = [];\r\n colIds.push(params.column.colId);\r\n params.value = eInput.checked;\r\n params.data[params.column.colId] = eInput.checked;\r\n\r\n //Excepto para la grilla de precios\r\n if (params.colDef.field != 'priceId') {\r\n if (params.node != null && params.node.children != null) {\r\n params.node.children.forEach(function (node) {\r\n if (node.children) {\r\n node.children.forEach(function (node) {\r\n node.data[params.column.colId] = eInput.checked;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n }\r\n node.data[params.column.colId] = eInput.checked;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n params.api.refreshCells(changedRows, colIds);\r\n }\r\n params.data.dirty = true;\r\n }\r\n\r\n\r\n if (onChangeCallback != undefined) {\r\n onChangeCallback(event, params);\r\n }\r\n });\r\n //console.log('eInput', eInput);\r\n return eInput;\r\n }\r\n }\r\n\r\n\r\n\r\n //maximo, 5 campos\r\n function setField(data, field, value) {\r\n //debugger;\r\n if (field.indexOf('.') < 0) {\r\n data[field] = value;\r\n }\r\n else {\r\n // otherwise it is a deep value, so need to dig for it\r\n var fields = field.split('.');\r\n console.log(fields);\r\n try {\r\n\r\n if (fields.length == 2) {\r\n data[fields[0]][fields[1]] = value;\r\n\r\n } else if (fields.length == 3) {\r\n data[fields[0]][fields[1]][fields[2]] = value;\r\n\r\n } else if (fields.length == 4) {\r\n data[fields[0]][fields[1]][fields[2][fields[3]]] = value;\r\n\r\n } else if (fields.length == 5) {\r\n data[fields[0]][fields[1]][fields[2]][fields[3]][fields[4]] = value;\r\n\r\n }\r\n\r\n } catch (e) {\r\n //?\r\n //console.error('Error parseando el setField. Error: ', e.message, data, field, value);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n //maximo, 5 campos\r\n function getField(data, field) {\r\n if (!field) return field;\r\n //debugger;\r\n if (field.indexOf('.') < 0) {\r\n return data[field];\r\n }\r\n else {\r\n // otherwise it is a deep value, so need to dig for it\r\n var fields = field.split('.');\r\n\r\n try {\r\n if (fields.length == 2) {\r\n return data[fields[0]][fields[1]];\r\n\r\n } else if (fields.length == 3) {\r\n return data[fields[0]][fields[1]][fields[2]];\r\n\r\n } else if (fields.length == 4) {\r\n return data[fields[0]][fields[1]][fields[2][fields[3]]];\r\n\r\n } else if (fields.length == 5) {\r\n return data[fields[0]][fields[1]][fields[2]][fields[3]][fields[4]];\r\n\r\n }\r\n } catch (e) {\r\n return null;\r\n }\r\n\r\n\r\n }\r\n }\r\n\r\n function hasDiscountType(data) {\r\n return data.planType != 24;\r\n }\r\n\r\n function hasObjective(data) {\r\n return data.planType != 24;\r\n }\r\n\r\n function isPlanRow(data) {\r\n return data.details == undefined;\r\n }\r\n\r\n function hasDetails(data) {\r\n return (data.details != undefined && data.details.length != 0);\r\n }\r\n\r\n function isOptionalRow(data) {\r\n return data.planType == 19 || data.planType == 20 || data.planType == 21;\r\n }\r\n\r\n function doesColumnApply(colDef, data) {\r\n\r\n if (colDef.onlyCategory4 && !hasDetails(data)) {\r\n //console.log('no puedo editar esto a este nivel');\r\n return false;\r\n }\r\n else if (colDef.onlyPlanRow && !isPlanRow(data)) {\r\n //console.log('no puedo editar esto a este nivel');\r\n return false;\r\n }\r\n\r\n else if (colDef.isOptionalColumn && !isOptionalRow(data)) {\r\n //console.log('no puedo editar esto a este nivel');\r\n return false;\r\n }\r\n else if (colDef.isDiscountTypeColumn && !hasDiscountType(data)) {\r\n //console.log('no puedo editar esto a este nivel');\r\n return false;\r\n }\r\n else if (colDef.isObjectiveColumn && !hasObjective(data)) {\r\n //console.log('no puedo editar esto a este nivel');\r\n return false;\r\n }\r\n else if (isPlanRow(data)\r\n //&& data.isEnabled\r\n && colDef.dependencyField\r\n && !getField(data, colDef.dependencyField)) {\r\n //console.log('dependencia faltante');\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n //issue_cp_586\r\n function renderMarginMin(params) {\r\n \r\n if (params.value == null || params.value === '')\r\n return '';\r\n\r\n var value = params.value * 100;\r\n\r\n return value.toFixed(0) + \" %\";\r\n \r\n }\r\n\r\n function renderMoney(params) {\r\n \r\n if (params.value == null || params.value == '')\r\n return '';\r\n\r\n return \"$ \" + $filter('number')(params.value, 2);\r\n };\r\n function integerRendererWithoutZero(params) {\r\n if (params.value == null || (!isNaN(params.value) && params.value <= 0))\r\n return '';\r\n\r\n return $filter('number')(params.value, 0);\r\n };\r\n function editor(type, onChangeCallback) {\r\n return function innerEditor(params) {\r\n\r\n if (!doesColumnApply(params.column.colDef, params.data)\r\n && params.column.colDef.field != 'marginMin' // parche para no agregar otro campo al colDef\r\n && params.column.colDef.field != 'investment' // parche para no agregar otro campo al colDef\r\n ) {\r\n return '';\r\n }\r\n\r\n var rendererFunction;\r\n var innerText;\r\n if (type == 'money') {\r\n rendererFunction = renderMoney;\r\n innerText = '$';\r\n }\r\n else if (type == 'greaterThanNoDecimals') {\r\n rendererFunction = $rootScope.greaterThanNoDecimals;\r\n innerText = '>';\r\n\r\n } else if (type == 'percentage') {\r\n if (params.column.colDef.field == 'marginMin') {\r\n rendererFunction = renderMarginMin;\r\n } else {\r\n\r\n rendererFunction = $rootScope.percentageRendererNoDecimals;\r\n }\r\n \r\n innerText = '%';\r\n } else if (type == 'number') {\r\n rendererFunction = integerRendererWithoutZero\r\n innerText = '';\r\n }\r\n else {\r\n rendererFunction = function (value) { return value };\r\n innerText = '';\r\n\r\n }\r\n\r\n\r\n\r\n var editing = false;\r\n\r\n var eCell = document.createElement('div');\r\n eCell.style = \"width:100% !important;height:100% !important\";\r\n eCell.className = \"input-group\";\r\n\r\n var eLabel = document.createTextNode(''); \r\n if (params.value != null) {\r\n eLabel = document.createTextNode(rendererFunction(params));\r\n /*if (params.column.colDef.field == 'investment' ) {\r\n eLabel = document.createTextNode(rendererFunction(params));\r\n } else {\r\n eLabel = document.createTextNode(rendererFunction(params));\r\n }*/\r\n } \r\n //var eLabel = params.value != null ? document.createTextNode(rendererFunction(params)) : document.createTextNode('');\r\n eCell.appendChild(eLabel);\r\n\r\n var eSpan = document.createElement(\"span\");\r\n eSpan.className = \"input-group-addon\";\r\n eSpan.style = \"margin:0px !important; height: 100% !important; border: 0px; line-height: 100%; font-size:12px !important\";\r\n eSpan.innerText = innerText;\r\n\r\n var eInput = document.createElement(\"input\");\r\n eInput.type = \"number\";\r\n //eInput.step = \"1\";\r\n eInput.className = \"form-control\";\r\n\r\n eCell.addEventListener('click', function () {\r\n if (!editing) {\r\n if (doesColumnApply(params.column.colDef, params.data)) {\r\n eCell.removeChild(eLabel);\r\n if (type == 'greaterThanNoDecimals') {\r\n if (params.data.isEnabled) {\r\n eCell.appendChild(eSpan);\r\n eCell.appendChild(eInput);\r\n }\r\n } else {\r\n if (params.data.isEnabled\r\n || params.column.colDef.field != 'marginMin'\r\n || params.column.colDef.field != 'investment') {\r\n eCell.appendChild(eInput);\r\n eCell.appendChild(eSpan);\r\n }\r\n }\r\n\r\n eInput.focus();\r\n\r\n if (params.data.isEnabled\r\n && params.column.colDef.field != 'marginMin'\r\n && params.column.colDef.field != 'investment') {\r\n if (type == 'percentage') {\r\n eInput.value = params.value ? params.value * 100 : null;\r\n } else {\r\n eInput.value = params.value;\r\n }\r\n }\r\n\r\n editing = true;\r\n }\r\n }\r\n });\r\n\r\n eInput.addEventListener('blur', function () {\r\n if (editing) {\r\n editing = false;\r\n eCell.removeChild(eSpan);\r\n eCell.removeChild(eInput);\r\n eCell.appendChild(eLabel);\r\n }\r\n });\r\n\r\n eInput.addEventListener('change', function () {\r\n if (editing) {\r\n editing = false;\r\n\r\n eCell.removeChild(eSpan);\r\n eCell.removeChild(eInput);\r\n eCell.appendChild(eLabel);\r\n console.log('einput.value', eInput.value);\r\n\r\n if (eInput.value > 100 && type == 'percentage')\r\n return;\r\n\r\n\r\n var newValue = eInput.value;\r\n\r\n if (type == 'percentage') {\r\n var newValue = eInput.value / 100;\r\n }\r\n var oldValue = params.value;\r\n if (!isNaN(newValue)) {\r\n params.value = newValue;\r\n } else { newValue = params.value;}\r\n \r\n setField(params.data, params.column.colId, newValue);\r\n //params.data[params.column.colId] = newValue;\r\n eLabel.nodeValue = rendererFunction(params);\r\n //console.log('params.data', params.data);\r\n\r\n var colIds = [];\r\n var changedRows = [];\r\n\r\n clearColumn(params, colIds, changedRows, params.node);\r\n\r\n if (params.node != null && params.node.children != null) {\r\n colIds.push(params.column.colId);\r\n params.node.children.forEach(function (node) {\r\n if (node.children && params.column.colDef.appliesOnChildren) {\r\n\r\n node.children.forEach(function (node) {\r\n if (doesColumnApply(params.column.colDef, node.data)) {\r\n\r\n setField(node.data, params.column.colId, params.value);\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n\r\n clearColumn(params, colIds, changedRows, node);\r\n }\r\n });\r\n }\r\n if (params.column.colDef.appliesOnChildren || doesColumnApply(params.column.colDef, node.data)) {\r\n setField(node.data, params.column.colId, params.value);\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n\r\n clearColumn(params, colIds, changedRows, node);\r\n }\r\n\r\n });\r\n }\r\n\r\n if (onChangeCallback != undefined) {\r\n onChangeCallback(params, newValue);\r\n }\r\n\r\n\r\n params.api.refreshCells(changedRows, colIds);\r\n params.api.recomputeAggregates();\r\n params.data.dirty = true;\r\n }\r\n });\r\n\r\n return eCell;\r\n }\r\n\r\n }\r\n\r\n function dropDownEditor(source, field, fieldId, onChangeCallback) {\r\n return function (params) {\r\n\r\n if (!doesColumnApply(params.column.colDef, params.data))\r\n return '';\r\n\r\n var editing = false;\r\n\r\n var eCell = document.createElement('div');\r\n\r\n var eLabel = null\r\n\r\n if (params.value != null && params.value != \"\")\r\n eLabel = document.createTextNode(params.value);\r\n else\r\n eLabel = document.createTextNode(\"------------\");\r\n\r\n eCell.appendChild(eLabel);\r\n\r\n var eSelect = document.createElement(\"select\");\r\n eSelect.className = \"form-control\";\r\n eSelect.style = \"margin:0px !important; border: 0px; line-height: 100%; font-size:12px !important\";\r\n\r\n for (var i = 0; i < source.length; i++) {\r\n var eOption = document.createElement(\"option\");\r\n eOption.setAttribute(\"value\", source[i].id);\r\n eOption.innerHTML = source[i].name;\r\n eSelect.appendChild(eOption);\r\n }\r\n\r\n eSelect.value = params.data[fieldId];\r\n\r\n\r\n eCell.addEventListener('click', function () {\r\n if (!editing) {\r\n eCell.removeChild(eLabel);\r\n eCell.appendChild(eSelect);\r\n eSelect.focus();\r\n editing = true;\r\n }\r\n });\r\n\r\n eSelect.addEventListener('blur', function () {\r\n if (editing) {\r\n editing = false;\r\n eCell.removeChild(eSelect);\r\n eCell.appendChild(eLabel);\r\n }\r\n });\r\n\r\n eSelect.addEventListener('change', function () {\r\n if (editing) {\r\n\r\n var colIds = [];\r\n colIds.push(params.column.colId);\r\n var changedRows = [];\r\n changedRows.push(params.node);\r\n\r\n editing = false;\r\n var newValue = '';\r\n\r\n for (var i = 0; i < source.length; i++) {\r\n if (source[i].id == eSelect.value) {\r\n newValue = source[i].name;\r\n params.data[field] = newValue;\r\n params.data[fieldId] = eSelect.value;\r\n //Children\r\n if (params.node != null && params.node.children != null) {\r\n params.node.children.forEach(function (node) {\r\n if (node.children) {\r\n node.children.forEach(function (node) {\r\n node.data[field] = newValue;\r\n node.data[fieldId] = eSelect.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n }\r\n node.data[field] = newValue;\r\n node.data[fieldId] = eSelect.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n }\r\n break;\r\n }\r\n }\r\n\r\n\r\n params.data.dirty = true;\r\n\r\n params.api.refreshCells(changedRows, colIds);\r\n\r\n eLabel.nodeValue = newValue;\r\n eCell.removeChild(eSelect);\r\n eCell.appendChild(eLabel);\r\n\r\n if (onChangeCallback != undefined) {\r\n onChangeCallback(params, newValue);\r\n }\r\n\r\n }\r\n });\r\n\r\n return eCell;\r\n }\r\n\r\n }\r\n\r\n ///////////////////////////////// END EDITORS //////////////////////////////////////////\r\n });\r\n\r\n","\r\nangular.module(\"prisma\")\r\n .controller(\"MarkdownDecisionsCtrl\", function ($state, $scope, $stateParams, $rootScope, markdownService, authService, ngDialog, $filter) {\r\n var self = this;\r\n\r\n self.canAceptar = authService.hasPermission('markdown_decisions_Aceptar');\r\n self.canEndosar = authService.hasPermission('markdown_decisions_Endosar');\r\n self.canValidar = authService.hasPermission('markdown_decisions_Validar');\r\n\r\n self.PrevCategory = $rootScope.erp.Implementation == 'CencosudChile';\r\n\r\n self.expandAll = true;\r\n\r\n self.storeFilteringText = \"Filtrar por tienda\";\r\n self.dropDrownStores = { isopen: false };\r\n self.allStores = [{ id: 0, code: 'Todos', name: 'Todos', companyId: 1, }];\r\n\r\n self.suggestionFilterText = \"Filtrar por Sugeridos\";\r\n self.dropdownSuggestionFilter = { isopen: false };\r\n self.allSuggestionFilter = [{ id: 0, code: 'Todos', name: 'Todos' },\r\n { id: 1, code: 'Sugeridos', name: 'Sugeridos' },\r\n { id: 22, code: 'Manuales', name: 'Manuales' },\r\n { id: 23, code: 'Vencimientos', name: 'Vencimientos' }];\r\n\r\n self.stageFilterText = \"Filtrar por Etapa\";\r\n self.dropdownStagesFilter = { isopen: false };\r\n self.allStagesFilter = [{ id: 0, code: 'Todos', name: 'Todos' },\r\n { id: 1, code: 'Etapa01', name: 'Etapa 1' },\r\n { id: 2, code: 'Etapa02', name: 'Etapa 2' },\r\n { id: 3, code: 'Etapa03', name: 'Etapa 3' },\r\n { id: 4, code: 'Etapa04', name: 'Etapa 4' },\r\n { id: 5, code: 'Etapa05', name: 'Etapa 5' }];\r\n\r\n self.stockFilterText = \"Filtrar por Stock\";\r\n self.dropdownStockFilter = { isopen: false };\r\n self.allStockFilter = [{ id: 0, code: 'Ninguno', name: 'Ninguno' },\r\n { id: 1, code: 'MayorStock', name: 'Mayor Stock $' },\r\n { id: 2, code: 'MenorStock', name: 'Menor Stock $' }];\r\n\r\n self.statusFilterText = \"Filtrar por Status\";\r\n self.dropdownStatusFilter = { isopen: false };\r\n self.allStatusFilter = [{ id: 0, code: 'Todos', name: 'Todos' },\r\n { id: 1, code: 'Activo', name: 'Activo' },\r\n { id: 2, code: 'Inactivo', name: 'Inactivo' }];\r\n\r\n self.editedActionFilterText = \"Filtrar por Accion editada\";\r\n self.dropdownEditedActionFilter = { isopen: false };\r\n self.allEditedActionFilter = [\r\n { id: 1, code: 'Continuar', name: 'Continuar', suggestion: false, handLoad: false },\r\n { id: 2, code: 'Caducar', name: 'Caducar', suggestion: false, handLoad: true},\r\n\r\n { id: 3, code: 'Nuevo', name: 'Nuevo', suggestion: true, handLoad: true},\r\n //{ id: 4, code: 'Devolver', name: 'Devolver', suggestion: null },\r\n //{ id: 5, code: 'Transferir', name: 'Transferir', suggestion: null },\r\n { id: 6, code: 'Mantener', name: 'Mantener', suggestion: false, handLoad: false}];\r\n\r\n /*self.allEditedActionFilter = [\r\n { id: 1, code: 'Continuar', name: 'Continuar', suggestion: false },\r\n { id: 2, code: 'Caducar', name: 'Caducar', suggestion: true },\r\n { id: 3, code: 'Nuevo', name: 'Nuevo', suggestion: true },\r\n { id: 4, code: 'Devolver', name: 'Devolver', suggestion: null },\r\n { id: 5, code: 'Transferir', name: 'Transferir', suggestion: null },\r\n { id: 6, code: 'Mantener', name: 'Mantener', suggestion: false }]; */\r\n self.pageNumber = 0;\r\n self.pageSize = 500;\r\n self.selectedStoreId = 0;\r\n self.selectedSugestionFilterId = 0;\r\n self.selectedStageFilterId = 0;\r\n self.selectedStockFilterId = 0;\r\n self.selectedStatusFilterId = 0; \r\n self.selectedStage = 0;\r\n self.selectedCategoryId = $stateParams.categoryId;\r\n self.selectedCategories = [{ name: $stateParams.category, id: $stateParams.categoryId }];\r\n self.selectedEditedActionFilter = null;\r\n self.showCanal = companyJson.MarkdownDecisions\r\n && companyJson.MarkdownDecisions.Grid\r\n && companyJson.MarkdownDecisions.Grid.ShowCanal;\r\n\r\n self.visitedPages = [];\r\n\r\n self.filterByStore = function (store) {\r\n\r\n if (store.name == 'Todos') {\r\n self.selectedStoreId = 0;\r\n self.storeFilteringText = \"Filtrar por tienda\";\r\n //self.gridOptions.api.setQuickFilter();\r\n }\r\n else {\r\n self.selectedStoreId = store.id;\r\n //self.gridOptions.api.setQuickFilter(store.code);\r\n self.storeFilteringText = \"Tienda: \" + store.name;\r\n }\r\n }\r\n\r\n self.filterBySuggestion = function (choise) {\r\n\r\n if (choise.name == 'Todos') {\r\n self.selectedSugestionFilterId = 0;\r\n self.suggestionFilterText = \"Filtrar por Sugeridos\";\r\n //self.gridOptions.api.setQuickFilter();\r\n }\r\n else {\r\n self.selectedSugestionFilterId = choise.id;\r\n //self.gridOptions.api.setQuickFilter(store.code);\r\n self.suggestionFilterText = choise.name;\r\n }\r\n }\r\n\r\n self.filterByStage = function (choise) {\r\n\r\n if (choise.name == 'Todos') {\r\n self.selectedStageFilterId = 0;\r\n self.stageFilterText = \"Filtrar por Etapas\";\r\n //self.gridOptions.api.setQuickFilter();\r\n }\r\n else {\r\n self.selectedStageFilterId = choise.id;\r\n //self.gridOptions.api.setQuickFilter(store.code);\r\n self.stageFilterText = choise.name;\r\n }\r\n }\r\n\r\n self.filterByStock = function (choise) {\r\n\r\n if (choise.name == 'Ninguno') {\r\n self.selectedStockFilterId = 0;\r\n self.stockFilterText = \"Filtrar por Stock\";\r\n //self.gridOptions.api.setQuickFilter();\r\n }\r\n else {\r\n self.selectedStockFilterId = choise.id;\r\n //self.gridOptions.api.setQuickFilter(store.code);\r\n self.stockFilterText = choise.name;\r\n }\r\n }\r\n\r\n self.filterByStatus = function (choise) {\r\n\r\n if (choise.name == 'Todos') {\r\n self.selectedStatusFilterId = 0;\r\n self.statusFilterText = \"Filtrar por Status\";\r\n //self.gridOptions.api.setQuickFilter();\r\n }\r\n else {\r\n self.selectedStatusFilterId = choise.id;\r\n //self.gridOptions.api.setQuickFilter(store.code);\r\n self.statusFilterText = choise.name;\r\n }\r\n }\r\n\r\n self.externalFilterChanged = function (id) {\r\n self.selectedEditedActionFilter = id;\r\n self.gridOptions.api.onFilterChanged();\r\n }\r\n\r\n function isExternalFilterPresent() {\r\n return self.selectedEditedActionFilter != null;\r\n }\r\n\r\n function doesExternalFilterPass(node) {\r\n if (node.data.editedAction == self.selectedEditedActionFilter || self.selectedEditedActionFilter == 0)\r\n return true;\r\n\r\n return false;\r\n } \r\n\r\n var decisionsTypes = {\r\n SUGGESTIONS: 0,\r\n ENDORSE: 1,\r\n VALIDATE: 2\r\n //REVALIDATE: 5\r\n }\r\n self.type = $stateParams.decisionType;\r\n console.log('stateparams', $stateParams);\r\n\r\n var numberColWidth = 120;\r\n\r\n var columnDefs = null;\r\n\r\n self.previousPage = function () {\r\n console.log(\"previous\");\r\n if (self.pageNumber == 0)\r\n return;\r\n self.pageNumber--;\r\n\r\n loadPageLocally(self.pageNumber);\r\n }\r\n self.nextPage = function () {\r\n //console.log(\"next\");\r\n if (self.pageNumber + 1 == self.totalPages)\r\n return;\r\n\r\n self.pageNumber++;\r\n console.log(\"visitedPAges\", self.visitedPages);\r\n if (self.visitedPages.indexOf(self.pageNumber) == -1) {\r\n loadMarkdownSuggestions();\r\n } else {\r\n loadPageLocally(self.pageNumber);\r\n }\r\n\r\n }\r\n\r\n self.applyingFilters = false;\r\n self.applyFilters = function () {\r\n\r\n self.pageNumber = 0;\r\n loadMarkdownSuggestions(true);\r\n }\r\n\r\n self.onCategorySelected = function (category) {\r\n console.log(\"category\", category);\r\n for (var i = 0; i < self.selectedCategories.length; i++) {\r\n if (self.selectedCategories[i].id == category.id)\r\n return;\r\n }\r\n self.selectedCategories.push(category);\r\n //self.selectedCategoryId = category.id;\r\n }\r\n\r\n function splitCategories() {\r\n var arr = [];\r\n angular.forEach(self.selectedCategories, function (category) {\r\n arr.push(category.id);\r\n });\r\n return arr;\r\n }\r\n\r\n self.removeCategory = function (index) {\r\n self.selectedCategories.splice(index, 1);\r\n }\r\n\r\n function getSelectedItems() {\r\n var selected = [];\r\n self.gridOptions.api.forEachNodeAfterFilter( function (node, key) {\r\n //console.log(node.data.suggestionId);\r\n if (node.data.suggestionId > 0)\r\n selected.push(node.data);\r\n\r\n });\r\n\r\n return selected;\r\n }\r\n\r\n function getItemsToSave() {\r\n var selected = [];\r\n var count = 0;\r\n self.gridOptions.api.forEachNodeAfterFilter( function (node, key) {\r\n //console.log(node.data.suggestionId);\r\n if (node.selected && node.data.suggestionId > 0 && node.data.currentMarkdownPlanType != 22 && node.data.currentMarkdownPlanType != 23) {\r\n selected.push({\r\n suggestionId: node.data.suggestionId,\r\n suggestedAction: node.data.suggestedAction,\r\n takenAction: node.data.editedAction ? node.data.editedAction : node.data.suggestedAction,\r\n keepPlanStageId: node.data.keepPlanStageId\r\n });\r\n count++;\r\n } else if (node.selected && node.data.currentMarkdownPlanType === 22 || node.data.currentMarkdownPlanType === 23) {\r\n selected.push({\r\n markdownItemId: node.data.currentMarkdownId,\r\n suggestedAction: node.data.suggestedAction,\r\n takenAction: node.data.editedAction ? node.data.editedAction : node.data.suggestedAction,\r\n keepPlanStageId: node.data.keepPlanStageId\r\n });\r\n count++;\r\n }\r\n \r\n \r\n });\r\n //console.log(count);\r\n return selected;\r\n }\r\n\r\n self.acceptSuggestions = function () {\r\n\r\n \r\n \r\n /* function containItemToExpireOrContinue() {\r\n for (var i = 0; i < itemsToSave.length; i++) {\r\n\r\n var keyNames = Object.keys(itemsToSave[i]);\r\n // if (itemsToSave[i].takenAction == 2 || itemsToSave[i].takenAction == 1) {\r\n //si existe un MI o se continua una sugerencia, se pueden tomar estas acciones \r\n if ((itemsToSave[i].suggestedAction != itemsToSave[i].takenAction ) && !keyNames[\"markdownItemId\"]) {\r\n return true;\r\n }\r\n //}\r\n }\r\n return false;\r\n };\r\n\r\n\r\n if (containItemToExpireOrContinue()) {\r\n swal({\r\n type: \"warning\",\r\n title: \"Alerta\",\r\n text: \"No se puede caducar ni continuar un artículo que no está en plan\",\r\n });\r\n return;\r\n }\r\n */\r\n var itemsToSave = getItemsToSave();\r\n console.log(itemsToSave);\r\n\r\n if (itemsToSave.length == 0) {\r\n swal(\"Debe seleccionar al menos una sugerencia\", null, \"warning\");\r\n return;\r\n }\r\n swal({\r\n title: \"¿Está seguro?\",\r\n text: '¿Está seguro que desea aceptar las sugerencias seleccionadas?',\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (yes) {\r\n if (yes) {\r\n \r\n markdownService.decisions.acceptSuggestions(itemsToSave)\r\n .then(function () {\r\n self.applyFilters();\r\n swal(\"Confirmado\", \"Se guardaron los cambios seleccionados\", \"success\");\r\n }, function (error) {\r\n swal(\"Error\", \"Ha ocurrido un error\", \"error\");\r\n });\r\n \r\n }\r\n });\r\n }\r\n\r\n self.endose = function () {\r\n console.log('endose');\r\n var itemsToSave = getItemsToSave();\r\n console.log(itemsToSave);\r\n\r\n if (itemsToSave.length == 0) {\r\n swal(\"Debe seleccionar al menos una sugerencia\", null, \"warning\");\r\n return;\r\n }\r\n swal({\r\n title: \"¿Está seguro?\",\r\n text: '¿Está seguro que desea endosar las sugerencias seleccionadas?',\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (yes) {\r\n if (yes) {\r\n markdownService.decisions.endose(itemsToSave)\r\n .then(function () {\r\n console.log('guardado');\r\n self.applyFilters();\r\n swal(\"Confirmado\", \"Se guardaron los cambios seleccionados\", \"success\");\r\n }, function (error) {\r\n swal(\"Error\", \"Ha ocurrido un error\", \"error\");\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.validate = function () {\r\n console.log('validate');\r\n var itemsToSave = getItemsToSave();\r\n console.log(itemsToSave);\r\n\r\n if (itemsToSave.length == 0) {\r\n swal(\"Debe seleccionar al menos una sugerencia\", null, \"warning\");\r\n return;\r\n }\r\n\r\n swal({\r\n title: \"¿Está seguro?\",\r\n text: '¿Está seguro que desea Validar las sugerencias seleccionadas?',\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (yes) {\r\n if (yes) {\r\n markdownService.decisions.validate(itemsToSave)\r\n .then(function () {\r\n console.log('guardado');\r\n self.applyFilters();\r\n swal(\"Confirmado\", \"Se guardaron los cambios seleccionados\", \"success\");\r\n }, function (error) {\r\n swal(\"Error\", \"Ha ocurrido un error\", \"error\");\r\n })\r\n }\r\n });\r\n }\r\n\r\n self.ignoreSuggestions = function () {\r\n\r\n \r\n var itemsToSave = getItemsToSave();\r\n\r\n if (itemsToSave.length == 0) {\r\n swal(\"Debe seleccionar al menos una sugerencia\", null, \"warning\");\r\n return;\r\n }\r\n\r\n swal({\r\n title: \"¿Está seguro?\",\r\n text: '¿Está seguro que desea ignorar las sugerencias seleccionadas?',\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n }, function (yes) {\r\n if (yes) {\r\n\r\n\r\n\r\n markdownService.decisions.ignoreSuggestions(itemsToSave)\r\n .then(function () {\r\n self.applyFilters();\r\n swal(\"Confirmado\", \"Se guardaron los cambios seleccionados\", \"success\");\r\n }, function (error) {\r\n swal(\"Error\", \"Ha ocurrido un error\", \"error\");\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.reject = function () {\r\n console.log(\"reject\");\r\n var itemsToSave = getItemsToSave();\r\n\r\n if (itemsToSave.length == 0) {\r\n swal(\"Debe seleccionar al menos una sugerencia\", null, \"warning\");\r\n return;\r\n }\r\n\r\n swal({\r\n title: \"¿Está seguro?\",\r\n text: '¿Esta seguro que desea rechazar las sugerencias seleccionadas?',\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n }, function (yes) {\r\n if (yes) {\r\n markdownService.decisions.reject(itemsToSave)\r\n .then(function () {\r\n self.applyFilters();\r\n swal(\"Confirmado\", \"Se guardaron los cambios seleccionados\", \"success\");\r\n console.log('rechazados');\r\n }, function (error) {\r\n swal(\"Error\", \"Ha ocurrido un error\", \"error\");\r\n });\r\n }\r\n });\r\n }\r\n\r\n\r\n\r\n \r\n\r\n self.reviewCategoryEndorse = function () {\r\n\r\n swal({\r\n title: \"¿Está seguro?\",\r\n text: '¿Está seguro que desea marcar la categoria como revisada?',\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n }, function (yes) {\r\n if (yes) {\r\n var categoryIds = splitCategories();\r\n\r\n markdownService.decisions.reviewCategoryEndorse(categoryIds)\r\n .then(function () {\r\n self.applyFilters();\r\n console.log('reviewCategoryEndorse');\r\n swal(\"Confirmado\", \"Se guardaron los cambios seleccionados\", \"success\");\r\n }, function (error) {\r\n swal(\"Error\", \"Ha ocurrido un error\", \"error\");\r\n })\r\n }\r\n });\r\n }\r\n\r\n \r\n\r\n self.volverSeleccionCategoria = function () {\r\n $state.go('markdowns.categorySummary');\r\n }\r\n\r\n self.exportToExcel = function () {\r\n var params = {\r\n skipHeader: false,\r\n skipFooters: false,\r\n skipGroups: false,\r\n allColumns: true,\r\n onlySelected: false,\r\n suppressQuotes: false,\r\n fileName: self.category + '.xls',\r\n columnSeparator: ',',\r\n processCellCallback: renderForExport\r\n \r\n };\r\n\r\n self.gridOptions.api.exportDataAsCsv(params);\r\n }\r\n\r\n\r\n function renderForExport(params) {\r\n //console.log(params);\r\n switch (params.column.colDef.headerName) {\r\n //case \"Estado Actual\":\r\n //case \"Estado sugerido\":\r\n // if (!params.value)\r\n // return '';\r\n // else {\r\n // var planType = getPlanType(params.value)\r\n // return planType.name;\r\n // }\r\n // break;\r\n\r\n //case \"Devolucion\":\r\n // if (!params.value)\r\n // return '';\r\n // else {\r\n // return params.value == 21 ? 'Si' : 'No';\r\n // }\r\n // break;\r\n //case \"Accion editada\":\r\n // params.value = params.node.data.editedAction || params.node.data.suggestedAction;\r\n // break;\r\n //case \"Accion sugerida\":\r\n // if (!params.value)\r\n // return '';\r\n // else {\r\n // return self.markdownActions.getDescription(params.value);\r\n // }\r\n // break;\r\n\r\n //case \"Precio / Dto\":\r\n // if (!params.value)\r\n // return '';\r\n // else {\r\n // var discountType = getDiscountTypes(params.value)\r\n // return discountType.name;\r\n // }\r\n // break;\r\n\r\n //case \"Descuento\":\r\n // if (!params.value)\r\n // return '';\r\n // else {\r\n // return $rootScope.percentageRendererNoDecimals(params);\r\n // }\r\n // break;\r\n\r\n //case \"Tipo Vigente\":\r\n // if (!params.value)\r\n // return '';\r\n // else {\r\n // var priceType = getPriceType(params.value)\r\n // return priceType.name;\r\n // }\r\n // break;\r\n\r\n //case \"Desde\":\r\n // if (!params.node.data.currentPriceValidFrom)\r\n // return '';\r\n // else {\r\n // return $rootScope.dateRenderer(params.node.data.currentPriceValidFrom);\r\n // }\r\n // break;\r\n //case \"Hasta\":\r\n // if (!params.node.data.currentPriceValidTo)\r\n // return '';\r\n // else {\r\n // return $rootScope.dateRenderer(params.node.data.currentPriceValidTo);\r\n // }\r\n // break;\r\n case \"Impacto Nuevo\": \r\n if (!params.node.data.newImpact || params.node.data.newImpact == '')\r\n return null;\r\n\r\n return \"$ \" + $filter('number')(params.node.data.newImpact, 2); \r\n \r\n break;\r\n case \"Impacto Sugerido\":\r\n if (!params.node.data.suggestedImpact || params.node.data.suggestedImpact == '')\r\n return null;\r\n\r\n return \"$ \" + $filter('number')(params.node.data.suggestedImpact, 2);\r\n\r\n break;\r\n\r\n //case \"Margen Actual\":\r\n //case \"Margen Sugerido\":\r\n //case \"Margen Nuevo\":\r\n //case \"Objetivo Reducción de Stock (%)\":\r\n // if (!params.value)\r\n // return '';\r\n // else {\r\n // return $rootScope.percentageRenderer2Decimals(params);\r\n // }\r\n // break;\r\n\r\n case \"Var. %\":\r\n var actualDiscount = params.node.data.actualDiscount || 0;\r\n var newDiscount = params.node.data.newDiscount || 0;\r\n var value = (newDiscount - actualDiscount) * 100;\r\n return value.toFixed(0) + \" %\";\r\n break;\r\n\r\n case \"Var %\":\r\n var originalCost = params.node.data.cost || 0;\r\n var lastCost = params.node.data.lastCost || 0;\r\n var value = (lastCost - originalCost) * 100;\r\n return value.toFixed(1) + \" %\";\r\n break;\r\n\r\n case \"Objetivo DDS\":\r\n if (!params.value)\r\n return '';\r\n else {\r\n return $rootScope.integerRenderer(params);\r\n }\r\n\r\n default:\r\n return params.value;\r\n }\r\n }\r\n\r\n self.expandOrCollapseAll = function () {\r\n\r\n if (self.expandAll) {\r\n self.gridOptions.api.forEachNode(function (node) {\r\n node.expanded = true;\r\n\r\n });\r\n }\r\n else {\r\n self.gridOptions.api.forEachNode(function (node) {\r\n node.expanded = false;\r\n });\r\n }\r\n self.expandAll = !self.expandAll;\r\n self.gridOptions.api.onGroupExpandedOrCollapsed();\r\n }\r\n\r\n function headerClassCell(params) {\r\n var cls = $rootScope.getClassForCell(params);\r\n if (params.data.children.length != 0) {\r\n cls.push(\"headerCell\")\r\n }\r\n return cls;\r\n }\r\n\r\n self.priceTypes = [\r\n { id: 0, name: 'Vigente' },\r\n { id: 1, name: 'Excepcion' },\r\n { id: 2, name: 'Liquidacion' },\r\n { id: 3, name: 'Bonus' },\r\n { id: 4, name: 'Promocion' },\r\n { id: 5, name: 'Competencia' },\r\n { id: 6, name: 'Normal' }\r\n ]\r\n\r\n function getPriceType(id) {\r\n for (var i = 0; i < self.priceTypes.length; i++)\r\n if (self.priceTypes[i].id == id)\r\n return self.priceTypes[i];\r\n }\r\n self.markdownActionsExpire = [\r\n { id: 3, name: 'Nuevo' },\r\n { id: 6, name: 'Mantener' },\r\n { id: 2, name: 'Caducar' },\r\n ];\r\n self.markdownActions = [\r\n { id: 1, name: 'Continuar' },\r\n { id: 2, name: 'Caducar' },\r\n { id: 3, name: 'Nuevo' },\r\n { id: 4, name: 'Devolver' },\r\n { id: 5, name: 'Transferir' },\r\n { id: 6, name: 'Mantener' },\r\n ];\r\n\r\n self.markdownActionsExpire.getDescription = function (id) {\r\n for (var i = 0; i < self.markdownActions.length - 1; i++) {\r\n if (self.markdownActionsExpire[i].id == id) {\r\n return self.markdownActionsExpire[i].name;\r\n }\r\n }\r\n return '';\r\n };\r\n self.markdownActions.getDescription = function (id) {\r\n for (var i = 0; i < self.markdownActions.length; i++)\r\n {\r\n if (self.markdownActions[i].id == id) {\r\n return self.markdownActions[i].name;\r\n }\r\n }\r\n return '';\r\n };\r\n self.markdownActions.getId = function (id) {\r\n\r\n };\r\n self.suggestionsActions = [\r\n //{ id: 1, name: 'Continuar' },\r\n { id: 3, name: 'Nuevo' },\r\n { id: 4, name: 'Devolver' },\r\n { id: 5, name: 'Transferir' },\r\n ];\r\n self.suggestionsActions.getDescription = function (id) {\r\n for (var i = 0; i < self.markdownActions.length - 1; i++) {\r\n if (self.markdownActions[i].id == id) {\r\n return self.markdownActions[i].name;\r\n }\r\n }\r\n return '';\r\n };\r\n \r\n self.markdownActionsForEdit = [\r\n [],\r\n [\r\n { id: 1, name: 'Continuar' },//continuar\r\n { id: 2, name: 'Caducar' },\r\n { id: 4, name: 'Devolver' },\r\n { id: 5, name: 'Transferir' }\r\n ],\r\n [\r\n { id: 1, name: 'Continuar' },\r\n { id: 2, name: 'Caducar' },//caducar\r\n { id: 4, name: 'Devolver' },\r\n { id: 5, name: 'Transferir' }\r\n ],\r\n [\r\n { id: 3, name: 'Nuevo' },//Nuevo\r\n { id: 4, name: 'Devolver' },\r\n { id: 5, name: 'Transferir' }\r\n ],\r\n [\r\n { id: 1, name: 'Continuar' },\r\n { id: 2, name: 'Caducar' },\r\n { id: 4, name: 'Devolver' },//devolver\r\n { id: 5, name: 'Transferir' }\r\n ],\r\n [\r\n { id: 1, name: 'Continuar' },\r\n { id: 2, name: 'Caducar' },\r\n { id: 4, name: 'Devolver' },\r\n { id: 5, name: 'Transferir' }//transferir\r\n ]\r\n ];\r\n\r\n function getAction(id, inPlan) {\r\n for (var i = 0; i < (inPlan ? self.markdownActions.length : self.suggestionsActions.length); i++)\r\n if ((inPlan ? self.markdownActions[i].id : self.suggestionsActions[i].id) == id)\r\n return (inPlan ? self.markdownActions[i] : self.suggestionsActions[i]);\r\n }\r\n\r\n self.discountTypes = [\r\n { id: 1, name: \"%\" },\r\n { id: 2, name: \"$\" },\r\n { id: 3, name: \"$-%\" },\r\n ]\r\n\r\n function getDiscountTypes(id) {\r\n for (var i = 0; i < self.discountTypes.length; i++)\r\n if (self.discountTypes[i].id == id)\r\n return self.discountTypes[i];\r\n }\r\n\r\n self.planTypes = function () {\r\n if ($rootScope.maxAgingLevel == 12) {\r\n if ($rootScope.erp.Implementation == 'CencosudChile') {\r\n return [\r\n { id: 10, name: 'Inactivos' },\r\n { id: 8, name: 'Descatalogados (sin bloqueo)' },\r\n { id: 9, name: 'Descatalogados (con bloqueo)' },\r\n { id: 12, name: 'Aging Fase 1' },\r\n { id: 13, name: 'Aging Fase 2' },\r\n { id: 14, name: 'Aging Fase 3' },\r\n { id: 15, name: 'Aging Fase 4' },\r\n { id: 16, name: 'Aging Fase 5' },\r\n { id: 17, name: 'Aging Fase 6' },\r\n { id: 18, name: 'Aging Fase 7' },\r\n { id: 25, name: 'Aging Fase 8' },\r\n { id: 26, name: 'Aging Fase 9' },\r\n { id: 27, name: 'Aging Fase 10' },\r\n { id: 28, name: 'Aging Fase 11' },\r\n { id: 29, name: 'Aging Fase 12' },\r\n { id: 19, name: 'Sobrestock' },\r\n { id: 20, name: 'Sobrestock critico' },\r\n { id: 21, name: 'Devolucion' },\r\n { id: 22, name: 'Carga Manual' },\r\n { id: 24, name: 'Pronostico de salida de stock' },\r\n ]\r\n } else {\r\n return [\r\n { id: 10, name: 'Inactivos' },\r\n { id: 12, name: 'Aging Fase 1' },\r\n { id: 13, name: 'Aging Fase 2' },\r\n { id: 14, name: 'Aging Fase 3' },\r\n { id: 15, name: 'Aging Fase 4' },\r\n { id: 16, name: 'Aging Fase 5' },\r\n { id: 17, name: 'Aging Fase 6' },\r\n { id: 18, name: 'Aging Fase 7' },\r\n { id: 25, name: 'Aging Fase 8' },\r\n { id: 26, name: 'Aging Fase 9' },\r\n { id: 27, name: 'Aging Fase 10' },\r\n { id: 28, name: 'Aging Fase 11' },\r\n { id: 29, name: 'Aging Fase 12' },\r\n { id: 19, name: 'Sobrestock' },\r\n { id: 20, name: 'Sobrestock critico' },\r\n { id: 21, name: 'Devolucion' },\r\n { id: 22, name: 'Carga Manual' },\r\n { id: 24, name: 'Pronostico de salida de stock' },\r\n ]\r\n }\r\n }\r\n else { //Para el resto es 7, sino agregar otro if.\r\n return [\r\n { id: 10, name: 'Inactivos' },\r\n { id: 12, name: 'Aging Fase 1' },\r\n { id: 13, name: 'Aging Fase 2' },\r\n { id: 14, name: 'Aging Fase 3' },\r\n { id: 15, name: 'Aging Fase 4' },\r\n { id: 16, name: 'Aging Fase 5' },\r\n { id: 17, name: 'Aging Fase 6' },\r\n { id: 18, name: 'Aging Fase 7' },\r\n { id: 19, name: 'Sobrestock' },\r\n { id: 20, name: 'Sobrestock critico' },\r\n { id: 21, name: 'Devolucion' },\r\n { id: 22, name: 'Carga Manual' },\r\n { id: 24, name: 'Pronostico de salida de stock' },\r\n ]\r\n }\r\n }\r\n \r\n\r\n function getPlanType(id) {\r\n var pt = self.planTypes()\r\n for (var i = 0; i < pt.length; i++)\r\n if (pt[i].id == id)\r\n return pt[i];\r\n }\r\n\r\n function selectAll(checked) {\r\n self.gridOptions.api.forEachNodeAfterFilter(function (node) {\r\n node.setSelected(checked);\r\n });\r\n }\r\n\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: 'Informacion General',\r\n children: [\r\n\r\n {\r\n headerName: 'SubCategoría',\r\n width: numberColWidth + 100,\r\n pinned: 'left',\r\n field: 'subCategory',\r\n //field: 'subCategory',\r\n //suppressMenu: true,\r\n //suppressSorting: true,\r\n //filter: false,\r\n checkboxSelection: true,\r\n suppressMenu: false,\r\n suppressSorting: true,\r\n cellClass: headerClassCell,\r\n headerCellRenderer: function selectAllRenderer(params) {\r\n var cb = document.createElement('input');\r\n cb.setAttribute('type', 'checkbox');\r\n\r\n var eHeader = document.createElement('label');\r\n var eTitle = document.createTextNode(params.colDef.headerName);\r\n eHeader.appendChild(cb);\r\n eHeader.appendChild(eTitle);\r\n\r\n cb.addEventListener('change', function (e) {\r\n if ($(this)[0].checked) {\r\n params.api.selectAll();\r\n } else {\r\n params.api.deselectAll();\r\n }\r\n });\r\n return eHeader;\r\n },\r\n\r\n\r\n cellRenderer: {\r\n renderer: 'group',\r\n checkbox: true,\r\n innerRenderer: function (params) {\r\n var name = params.value + (params.node.group && params.node.children != null ? ' (' + params.node.children.length + ')' : '');\r\n\r\n return name;\r\n }\r\n }\r\n },\r\n {\r\n headerName: \"SubRubro\",\r\n headerTooltip: \"\",\r\n hide: !self.PrevCategory, \r\n field: \"subRubro\",\r\n cellClass: headerClassCell\r\n },\r\n {\r\n headerName: \"Grupo\",\r\n headerTooltip: \"\",\r\n hide: !self.PrevCategory, \r\n field: \"grupo\",\r\n cellClass: headerClassCell\r\n },\r\n {\r\n headerName: \"Codigo\",\r\n field: \"itemCode\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell\r\n },\r\n {\r\n headerName: \"UM\",\r\n field: \"unitOfMeasureCode\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell\r\n },\r\n {\r\n headerName: \"EAN\",\r\n pinned: 'left',\r\n field: \"itemEan\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell\r\n },\r\n {\r\n headerName: \"Descripcion\",\r\n pinned: 'left',\r\n field: \"itemName\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth + 200,\r\n cellClass: headerClassCell\r\n },\r\n {\r\n headerName: \"Tienda\",\r\n pinned: 'left',\r\n field: \"storeCode\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: 70,\r\n cellClass: headerClassCell\r\n },\r\n {\r\n headerName: \"Canal\",\r\n pinned: 'left',\r\n field: \"storeCanalCode\",\r\n hide: !self.showCanal,\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: 70,\r\n cellClass: headerClassCell\r\n },\r\n {\r\n headerName: \"Status Art\",\r\n field: \"statusArt\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell\r\n },\r\n {\r\n headerName: \"Marca\",\r\n field: \"brand\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell\r\n },\r\n {\r\n headerName: \"Fabricante\",\r\n field: \"manufacturer\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell\r\n },\r\n {\r\n headerName: \"Tags\",\r\n field: \"tags\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell\r\n }\r\n ]\r\n },\r\n {\r\n headerName: 'Stock',\r\n children: [\r\n {\r\n headerName: \"Stock Q (Tienda)\",\r\n field: \"currentInventoryUnits\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n filter: 'text',\r\n width: numberColWidth,\r\n cellClass: headerClassCell\r\n },\r\n {\r\n headerName: \"Decote\",\r\n field: \"decote\",\r\n filter: 'number',\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n cellRenderer: decimalRenderer\r\n },\r\n {\r\n headerName: \"Stock $ (Tienda)\",\r\n field: \"currentInventory\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n filter: 'text',\r\n cellRenderer: $rootScope.moneyRenderer,\r\n width: numberColWidth,\r\n cellClass: headerClassCell\r\n },\r\n {\r\n headerName: \"Stock Q (CD)\",\r\n field: \"currentInventoryUnitsInDistributionCenters\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n filter: 'text',\r\n width: numberColWidth,\r\n cellClass: headerClassCell\r\n },\r\n {\r\n headerName: \"Stock $ (CD)\",\r\n field: \"currentInventoryInDistributionCenters\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n filter: 'text',\r\n cellRenderer: $rootScope.moneyRenderer,\r\n width: numberColWidth,\r\n cellClass: headerClassCell\r\n },\r\n {\r\n headerName: \"DDS\",\r\n field: \"inventoryDays\",\r\n filter: 'text',\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n cellRenderer: decimalRenderer\r\n },\r\n {\r\n headerName: \"DDS (CD)\",\r\n field: \"inventoryDaysWithDistributionCenters\",\r\n filter: 'text',\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n cellRenderer: decimalRenderer\r\n }\r\n \r\n ]\r\n },\r\n {\r\n headerName: 'Clasificacion',\r\n children: [\r\n {\r\n headerName: \"Estado Actual\",\r\n field: \"currentMarkdownPlanTypeStr\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n //cellRenderer: function (params) {\r\n\r\n // if (!params.data.currentMarkdownPlanType)\r\n // return '';\r\n\r\n // var planType = getPlanType(params.data.currentMarkdownPlanType)\r\n // return planType.name;\r\n //}\r\n },\r\n {\r\n headerName: \"Estado sugerido\",\r\n field: \"suggestedMarkdownPlanTypeStr\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n //cellRenderer: function (params) {\r\n\r\n // if (!params.data.suggestedMarkdownPlanType)\r\n // return '';\r\n\r\n // var planType = getPlanType(params.data.suggestedMarkdownPlanType)\r\n // return planType.name;\r\n //}\r\n }, {\r\n headerName: \"Tipologia\",\r\n field: \"typology\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n cellRenderer: function (params) {\r\n\r\n if (!params.data.typology)\r\n return '';\r\n\r\n return 'Tipo ' + params.data.typology;\r\n }\r\n }, \r\n {\r\n headerName: \"Devolucion\",\r\n field: \"isReturn\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n }\r\n ]\r\n },\r\n {\r\n headerName: \"Plan Actual\",\r\n children: [\r\n {\r\n headerName: \"Precio / Dto\",\r\n field: \"currentDiscountTypeStr\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n //cellRenderer: function (params) {\r\n\r\n // if (!params.data.currentDiscountType)\r\n // return '';\r\n\r\n // var discountType = getDiscountTypes(params.data.currentDiscountType)\r\n // return discountType.name;\r\n //}\r\n }, {\r\n headerName: \"Descuento\",\r\n field: \"currentDiscountStr\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n }, {\r\n headerName: \"Etapa\",\r\n field: \"currentStage\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n }, {\r\n headerName: \"Evacuado UN\",\r\n field: \"currentPlanUnitsReduction\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n filter: 'number',\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n },\r\n {\r\n headerName: \"Ajustes\",\r\n field: \"currentAdjust\",\r\n filter: 'number',\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n }, \r\n {\r\n headerName: \"Avance\",\r\n field: \"currentPlanProgress\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n filter: 'number',\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n cellRenderer: $rootScope.percentageRenderer2Decimals\r\n },\r\n {\r\n headerName: \"Recupero decote\",\r\n field: \"recoverDecote\",\r\n filter: 'number',\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n cellRenderer: decimalRenderer4\r\n }\r\n ]\r\n },\r\n {\r\n headerName: 'Plan Nuevo',\r\n children: [\r\n {\r\n headerName: \"Accion sugerida\",\r\n field: \"suggestedActionStr\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n //cellRenderer: function (params) {\r\n\r\n // if (!params.data.suggestedAction)\r\n // return '';\r\n\r\n // return self.markdownActions.getDescription(params.data.suggestedAction);\r\n // /* var action = getAction(params.data.suggestedAction, params.data.currentMarkdownId); //tiene plan si es distinto de nuevo (3)\r\n\r\n // if (action) {\r\n // return action.name;\r\n\r\n // } else {\r\n // return ''; //fix\r\n // }\r\n // */\r\n //}\r\n }, {\r\n headerName: \"Accion editada\",\r\n field: \"editedActionString\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n cellRenderer: function (params) {\r\n\r\n return dropDownEditor(self.allEditedActionFilter, \"editedActionString\", \"editedAction\", params, onEditedActionChange);\r\n }\r\n \r\n }, {\r\n headerName: \"Precio / Dto\",\r\n field: \"newDiscountTypeStr\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n //cellRenderer: function (params) {\r\n\r\n // if (!params.data.newDiscountType)\r\n // return '';\r\n\r\n // var discountType = getDiscountTypes(params.data.newDiscountType)\r\n // return discountType.name;\r\n //}\r\n }, {\r\n headerName: \"Descuento\",\r\n field: \"newDiscountStr\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n //cellRenderer: $rootScope.percentageRendererNoDecimals\r\n cellRenderer: function (params) {\r\n var eCell = document.createElement('div');\r\n eCell.className = \"input-group\";\r\n eCell.style = \"width:100% !important;height:100% !important\";\r\n\r\n if (params.data.currentMarkdownPlanType != 22 && params.data.newMargin < params.data.categoryMinMargin) {\r\n var eIcon = document.createElement('i');\r\n eIcon.className = \"fa fa-exclamation-triangle text-danger mr10\";\r\n eIcon.title = ian.format(\"Se ha excedido el limite minimo de margen de la categoria. El limite es: {0}\", $filter('percentage')(params.data.categoryMinMargin));\r\n eCell.appendChild(eIcon);\r\n }\r\n\r\n var eSpan = document.createElement(\"span\");\r\n eSpan.textContent = params.data.newDiscountStr;\r\n eCell.appendChild(eSpan);\r\n\r\n return eCell;\r\n\r\n }\r\n\r\n }, {\r\n headerName: \"Etapa\",\r\n field: \"newStage\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n cellRenderer: function (params) {\r\n if (params.data.newStage == 0) return '';\r\n return params.data.newStage;\r\n }\r\n },\r\n {\r\n headerName: \"Var. %\",\r\n field: \"newStageStr\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n //cellRenderer: function (params) {\r\n\r\n // var actualDiscount = params.data.actualDiscount ? params.data.actualDiscount : 0;\r\n // var newDiscount = params.data.newDiscount ? params.data.newDiscount : 0;\r\n // var value = (newDiscount - actualDiscount) * 100;\r\n // return value.toFixed(0) + \" %\";\r\n //}\r\n },\r\n ]\r\n },\r\n {\r\n headerName: \"Precio Vigente\",\r\n children: [\r\n {\r\n headerName: \"Normal\",\r\n field: \"normalPrice\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n filter: 'text',\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n }, {\r\n headerName: \"Vigente\",\r\n field: \"currentPrice\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n filter: 'text',\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n cellRenderer: $rootScope.moneyRenderer\r\n }, {\r\n headerName: \"Tipo Vigente\",\r\n field: \"currentPriceTypeStr\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n //cellRenderer: function (params) {\r\n // if (!params.data.currentPriceType)\r\n // return '';\r\n\r\n // var priceType = getPriceType(params.data.currentPriceType)\r\n // return priceType.name;\r\n //}\r\n }, {\r\n headerName: \"Desde\",\r\n field: \"currentPriceValidFromStr\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell\r\n }, {\r\n headerName: \"Hasta\",\r\n field: \"CurrentPriceValidToStr\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n }\r\n ]\r\n },\r\n {\r\n headerName: 'Costo',\r\n children: [\r\n {\r\n headerName: \"Original\",\r\n field: \"cost\",\r\n filter: 'text',\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n },\r\n {\r\n headerName: \"Ultimo\",\r\n field: \"lastCost\",\r\n filter: 'text',\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n },\r\n {\r\n headerName: \"Var %\",\r\n field: \"lastCostStr\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n //cellRenderer: function (params) {\r\n // var originalCost = params.data.cost ? params.data.cost : 0;\r\n // var lastCost = params.data.lastCost ? params.data.lastCost : 0;\r\n // var value = (lastCost - originalCost) * 100;\r\n // return value.toFixed(1) + \" %\";\r\n //},\r\n },\r\n ]\r\n },\r\n {\r\n headerName: 'Impacto',\r\n children: [ \r\n {\r\n headerName: \"Impacto Sugerido\",\r\n field: \"suggestedImpact\",\r\n filter: 'text',\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n },\r\n {\r\n headerName: \"Impacto Nuevo\",\r\n field: \"newImpact\",\r\n filter: 'text',\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForImpactCell,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n }\r\n ]\r\n },\r\n {\r\n headerName: 'Margen',\r\n children: [\r\n {\r\n headerName: \"Margen Actual\",\r\n field: \"grossMarginStr\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n //cellRenderer: $rootScope.percentageRenderer2Decimals,\r\n },\r\n {\r\n headerName: \"Margen Sugerido\",\r\n field: \"suggestedGrossMarginStr\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n //cellRenderer: $rootScope.percentageRenderer2Decimals,\r\n },\r\n {\r\n headerName: \"Margen Nuevo\",\r\n field: \"suggestedGrossMarginStr\", \r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n //cellRenderer: $rootScope.percentageRenderer2Decimals,\r\n }\r\n ]\r\n },\r\n {\r\n headerName: 'Objetivo',\r\n children: [\r\n {\r\n headerName: \"Objetivo Reducción de Stock (%)\",\r\n field: \"objectiveVentasUnStr\",\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n //cellRenderer: $rootScope.percentageRenderer2Decimals\r\n },\r\n {\r\n headerName: \"Objetivo DDS\",\r\n field: \"objectiveDds\",\r\n filter: 'text',\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n } \r\n ]\r\n },\r\n {\r\n headerName: 'Ventas',\r\n children: [\r\n {\r\n headerName: \"Volumen\",\r\n field: \"units\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n filter: 'text',\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n cellRenderer: function (params) {\r\n return Math.round(params.data.units);\r\n }\r\n },\r\n {\r\n headerName: \"CMV\",\r\n field: \"salesCost\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n filter: 'text',\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n cellRenderer: $rootScope.moneyRenderer\r\n },\r\n {\r\n headerName: \"Venta $\",\r\n field: \"sales\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n filter: 'text',\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n },\r\n {\r\n headerName: \"Venta Nueva $\",\r\n field: \"forecastedSales\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n filter: 'text',\r\n width: numberColWidth,\r\n cellClass: headerClassCell,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n }\r\n ]\r\n },\r\n {\r\n headerName: 'Otros Datos',\r\n children: [\r\n {\r\n headerName: \"Titulo\",\r\n field: \"title\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n //filter: 'number',\r\n width: numberColWidth,\r\n cellClass: headerClassCell\r\n },\r\n {\r\n headerName: \"Desde\",\r\n field: \"validFromStr\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n filter: 'date',\r\n width: numberColWidth,\r\n cellClass: headerClassCell\r\n }, {\r\n headerName: \"Hasta\",\r\n field: \"validToStr\",\r\n //headerTooltip: \"Cantidad de sugerencias.\",\r\n filter: 'date',\r\n width: numberColWidth,\r\n cellClass: headerClassCell\r\n },\r\n {\r\n headerName: \"Solapamiento\",\r\n width: numberColWidth,\r\n headerTooltip: \"Solapamiento con Promociones\",\r\n field: \"hasOverlappingStr\",\r\n cellRenderer: function (params) {\r\n\r\n if (params.data.overlappingPromotions && params.data.overlappingPromotions.length > 0) {\r\n var eCell = document.createElement('div');\r\n eCell.className = \"input-group\";\r\n eCell.style = \"width:100% !important;height:100% !important\";\r\n\r\n var eIcon = document.createElement('i');\r\n eIcon.className = \"fa fa-exclamation-triangle text-danger mr10 backgroundInput\";\r\n eIcon.title = \"Este item esta en promocion.\";\r\n eCell.appendChild(eIcon);\r\n\r\n return eCell;\r\n }\r\n\r\n\r\n return '';\r\n }\r\n }\r\n ]\r\n }\r\n ];\r\n }\r\n \r\n function onEditedActionChange(params, newValue) {\r\n console.log('params', params);\r\n console.log('newValue', newValue);\r\n\r\n\r\n for (i = 0; self.markdownActions.length - 1; i++) {\r\n if (self.markdownActions[i].name == newValue) {\r\n params.data.editedAction = self.markdownActions[i].id;\r\n return;\r\n }\r\n }\r\n\r\n }\r\n\r\n\r\n\r\n function cellClicked(cell) {\r\n\r\n if (cell.colDef.field == \"newDiscount\" && cell.data.children.length == 0) {\r\n if (cell.data != null) {\r\n showMotivoSugerenciaModal(cell.data);\r\n }\r\n }\r\n //if (cell.colDef.field == \"suggestedPrice\") {\r\n // if (cell.data != null && cell.data.suggestedPrice != null)\r\n // showSuggestionModal(cell.data);\r\n //}\r\n //else if (cell.colDef.field == \"competitorsPrice\") {\r\n // if (cell.data != null)\r\n // $state.go('prices.priceMap', { itemId: cell.data.itemId, priceListId: cell.data.priceListId });\r\n //}\r\n else if (cell.colDef.field == \"hasOverlappingStr\") {\r\n if (cell.data != null)\r\n self.showOverlaps(cell.data.overlappingPromotions);\r\n }\r\n }\r\n\r\n self.motivoSugerencia = {};\r\n\r\n function showMotivoSugerenciaModal(data) {\r\n\r\n \r\n\r\n self.loadingMotivoSugerencia = true;\r\n\r\n //no es vencimiento ni carga manual, entonces traigo por sugerencia\r\n if (data.currentMarkdownPlanType != 22 && data.currentMarkdownPlanType != 23) {\r\n markdownService.decisions.getMotivoSugerencia(data.suggestionId, data.suggestedMarkdownPlanType)\r\n .then(function (motivoSugerencia) {\r\n self.motivoSugerencia = motivoSugerencia;\r\n self.loadingMotivoSugerencia = false;\r\n });\r\n } else {\r\n markdownService.decisions.getMotivoSugerencia(data.currentMarkdownId, data.currentMarkdownPlanType)\r\n .then(function (motivoSugerencia) {\r\n self.motivoSugerencia = motivoSugerencia;\r\n self.loadingMotivoSugerencia = false;\r\n });\r\n }\r\n\r\n ngDialog.open({\r\n template: 'motivoSugerenciaDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: $scope\r\n });\r\n }\r\n\r\n function setSelected(parentNode, childNode) {\r\n childNode.data.selected = parentNode.selected;\r\n childNode.setSelected(parentNode.selected);\r\n }\r\n\r\n function reDrawSelected() {\r\n self.gridOptions.api.forEachNode(function (node) {\r\n angular.forEach(self.summary, function (oldNode) {\r\n if (node.data.localId == oldNode.localId) {\r\n node.setSelected(oldNode.selected);\r\n\r\n angular.forEach(node.children, function (child) {\r\n\r\n angular.forEach(oldNode.children, function (oldNodeChild) {\r\n //console.log(child.data.localId, oldNodeChild.localId);\r\n if (child.data.localId == oldNodeChild.localId) {\r\n \r\n child.setSelected(oldNodeChild.selected);\r\n }\r\n\r\n })\r\n })\r\n }\r\n })\r\n\r\n })\r\n //angular.forEach(self.gri)\r\n }\r\n\r\n function rowSelected(event) {\r\n event.node.data.selected = event.node.selected;\r\n angular.forEach(event.node.children, function (child) {\r\n setSelected(event.node, child);\r\n //child.setSelected( event.node.selected);\r\n });\r\n var data = event.node.data;\r\n if (event.node.selected && data.suggestedAction == 1) {\r\n data.newMargin = data.suggestedGrossMargin;\r\n data.newImpact = data.newImpact; \r\n }\r\n else {\r\n //data.newMargin = null;\r\n //data.newImpact = null;\r\n }\r\n self.gridOptions.api.refreshRows([event.node]);\r\n }\r\n\r\n function getNodeChildDetails(rowItem) {\r\n if (rowItem.children && rowItem.children.length > 0) {\r\n return {\r\n group: true,\r\n expanded: false,\r\n // provide ag-Grid with the children of this group\r\n children: rowItem.children,\r\n // the key is used by the default group cellRenderer\r\n key: rowItem.suggestionId\r\n };\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n function setGridOptions() {\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: true,\r\n groupHeaders: true,\r\n groupKeys: undefined, //set as string of keys eg [\"region\",\"country\"],\r\n groupHideGroupColumns: true,\r\n //groupUseEntireRow: false,\r\n groupSelectsChildren: false,\r\n rowHeight: 30,\r\n rowSelection: \"multiple\", // one of ['single','multiple'], leave blank for no selection\r\n singleClickEdit: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n suppressColumnMoveAnimation: $rootScope.suppressColumnMoveAnimation,\r\n suppressCellSelection: true,\r\n suppressRowClickSelection: true,\r\n enableRangeSelection: false,\r\n onRowSelected: rowSelected,\r\n onCellClicked: cellClicked,\r\n angularCompileRows: true,\r\n getNodeChildDetails: getNodeChildDetails,\r\n doesExternalFilterPass: doesExternalFilterPass,\r\n isExternalFilterPresent: isExternalFilterPresent\r\n }\r\n }\r\n\r\n function loadPageLocally(index) {\r\n console.log(\"self.summary\", self.summary);\r\n //console.log(\"index\", index);\r\n var pages = [];\r\n for (var i = self.pageSize * index; i < self.pageSize * (index + 1) && i < self.summary.length; i++) {\r\n pages.push(self.summary[i]);\r\n }\r\n //console.log(\"pages\", pages);\r\n\r\n self.gridOptions.api.setRowData(pages);\r\n reDrawSelected();\r\n //return page;\r\n }\r\n\r\n self.showOverlaps = function (overlaps) {\r\n self.currentOverlaps = overlaps;\r\n\r\n if (self.currentOverlaps.length > 0) {\r\n ngDialog.open({\r\n template: 'overlapDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n //data: task,\r\n scope: $scope\r\n });\r\n }\r\n }\r\n\r\n\r\n var count = 0;\r\n function loadMarkdownSuggestions(reload) {\r\n\r\n var categories = splitCategories();\r\n \r\n if (categories.length == 0) {\r\n categories = '0';\r\n swal(\"Debe seleccionar al menos una categoria\", null, \"warning\");\r\n return;\r\n }\r\n \r\n\r\n if (reload) {\r\n self.summary = [];\r\n count = 0;\r\n self.visitedPages = [];\r\n }\r\n\r\n var pageIndex = self.pageNumber;\r\n self.applyingFilters = true;\r\n markdownService.decisions.GetMarkdownSuggestions(categories, $stateParams.decisionType,\r\n self.pageNumber, self.pageSize, self.selectedStoreId, self.selectedStageFilterId,\r\n self.selectedSugestionFilterId, self.selectedStockFilterId, self.selectedStatusFilterId\r\n ).then(function (items) {\r\n //console.log('items', items);\r\n self.applyingFilters = false;\r\n angular.forEach(items, function (item) {\r\n self.totalPages = item.totalPages;\r\n if (item.editedAction) \r\n item.editedActionString = getAction(item.editedAction, true).name;\r\n //editedActionString para los hijos\r\n \r\n item.localId = count++;\r\n item.selected = false;\r\n angular.forEach(item.children, function (child) {\r\n child.localId = count++;\r\n child.selected = false;\r\n if (child.editedAction)\r\n child.editedActionString = getAction(child.editedAction, true).name;\r\n });\r\n });\r\n self.summary = self.summary.concat(items);\r\n\r\n self.gridOptions.api.setRowData(items);\r\n //ISSUE CP 807: Re-setea la data para que se actualize el filtro de la grilla\r\n self.gridOptions.api.setRowData(items);\r\n\r\n self.visitedPages.push(pageIndex);\r\n });\r\n }\r\n\r\n function loadData() {\r\n //$stateParams.categoryId puede ser una categoria nivel 3, en ese caso trae los hijos\r\n markdownService.decisions.getCategoriesForDecisions($stateParams.categoryId)\r\n .then(function (categoriesLv4) {\r\n if (categoriesLv4.length) {\r\n self.selectedCategories = [];\r\n categoriesLv4.forEach(function (c) {\r\n self.selectedCategories.push({ name: c.name, id: c.id });\r\n });\r\n }\r\n\r\n //TODO: si agrego categorias, me van a venir mas decisiones por lo tanto mas tiendas\r\n //en ese caso se deberia actualizar self.allStores\r\n markdownService.decisions.getStoresInMarkdown($stateParams.categoryId, $stateParams.decisionType).then(function (stores) {\r\n console.log('stores', stores)\r\n\r\n self.allStores = self.allStores.concat(stores);\r\n });\r\n\r\n loadMarkdownSuggestions(true);\r\n });\r\n }\r\n\r\n function init() {\r\n //init columnDefs and gridOptions\r\n setGridOptions();\r\n\r\n //load data\r\n loadData();\r\n }\r\n\r\n init();\r\n\r\n function decimalRenderer(params) {\r\n if (params.value == null)\r\n return null;\r\n\r\n if (params.value == 0)\r\n return 0;\r\n\r\n return $filter('number')(params.value, 2);\r\n }\r\n function decimalRenderer4(params) {\r\n if (params.value == null)\r\n return null;\r\n\r\n if (params.value == 0)\r\n return 0;\r\n\r\n return $filter('number')(params.value, 4);\r\n }\r\n function percentageRenderer2Decimals(params) {\r\n if (params.value == null || params.value == 0 || params.value == '')\r\n return null;\r\n\r\n var value = Math.floor(100 * params.value) / 100;\r\n\r\n return value * 100 + \" %\";\r\n }\r\n function dropDownEditor(source, field, fieldId, params, onChangeCallback) {\r\n \r\n //if (!doesColumnApply(params.column.colDef, params.data))\r\n //return '';\r\n\r\n var editing = false;\r\n\r\n var eCell = document.createElement('div');\r\n\r\n var eLabel = null\r\n \r\n if (params.value != null && params.value != \"\")\r\n eLabel = document.createTextNode(params.value);\r\n else\r\n if (fieldId == \"editedAction\" && params.data[fieldId] && source && source.length >= params.data[fieldId]) {\r\n /*var flgSuggestion = source.findIndex(x => x.id == (params.data.editedAction == null ? params.data.suggestedAction : params.data.editedAction)); //(params.data.markdownItemId ? 1 : 2);\r\n eLabel = document.createTextNode(source[flgSuggestion].name);*/\r\n var label = \"------------\";\r\n if (params.data.suggestedAction && params.data.suggestedAction != params.data.editedAction ) {\r\n label = self.markdownActions.getDescription(params.data.editedAction);\r\n } else {\r\n if (params.data.suggestedAction )\r\n label = self.markdownActions.getDescription(params.data.suggestedAction);\r\n }\r\n eLabel = document.createTextNode(label);\r\n \r\n }\r\n else\r\n if (!params.data.editedAction && params.data.suggestedAction && params.data.suggestedAction == 1) {\r\n label = self.markdownActions.getDescription(params.data.suggestedAction);\r\n eLabel = document.createTextNode(label);\r\n } else {\r\n if (!params.data.editedAction && params.data.suggestedAction) {\r\n\r\n label = self.suggestionsActions.getDescription(params.data.suggestedAction);\r\n eLabel = document.createTextNode(label);\r\n }\r\n else {\r\n //cuando la accion sugerida es Caducar pero elijo mantener, seguir con el plan actual\r\n if ((params.data.editedAction && params.data.editedAction == 6) && (params.data.suggestedAction && (params.data.suggestedAction == 2 || params.data.suggestedAction == 3))) {\r\n label = self.markdownActionsExpire.getDescription(params.data.editedAction);\r\n eLabel = document.createTextNode(label);\r\n\r\n } else {\r\n eLabel = document.createTextNode(\"------------\");\r\n }\r\n }\r\n }\r\n\r\n eCell.appendChild(eLabel);\r\n\r\n var eSelect = document.createElement(\"select\");\r\n eSelect.className = \"form-control\";\r\n eSelect.style = \"margin:0px !important; border: 0px; line-height: 100%; font-size:12px !important\";\r\n\r\n \r\n\r\n var containSuggestedAction = false;\r\n var attrIdInDropDown = null;\r\n for (var i = 0; i < source.length; i++) {\r\n\r\n if (params.data.suggestedMarkdownPlanType == 22 ) {\r\n if (source[i].handLoad == true) {\r\n var eOption = document.createElement(\"option\");\r\n eOption.setAttribute(\"value\", source[i].id);\r\n eOption.innerHTML = source[i].name;\r\n eSelect.appendChild(eOption);\r\n attrIdInDropDown = source[i].id;\r\n containSuggestedAction = true;\r\n }\r\n\r\n } else {\r\n if ((params.data.markdownItemId && params.data.suggestedAction != 3 &&\r\n !params.data.isHeader && source[i].suggestion == false)\r\n || (params.data.isHeader == true && (source[i].suggestion == !params.data.planActive))) {\r\n\r\n var eOption = document.createElement(\"option\");\r\n eOption.setAttribute(\"value\", source[i].id);\r\n eOption.innerHTML = source[i].name;\r\n eSelect.appendChild(eOption);\r\n attrIdInDropDown = source[i].id;\r\n\r\n }\r\n }\r\n //si no esta en el combo la accion sugerida la agrego\r\n if (attrIdInDropDown != null && attrIdInDropDown == params.data.suggestedAction) {\r\n containSuggestedAction = true;\r\n }\r\n }\r\n if (!containSuggestedAction && !params.data.isHeader) {\r\n \r\n var newOption = {};\r\n for (var i = 0; i < self.allEditedActionFilter.length; i++) {\r\n\r\n if (source[i].suggestion == !params.data.planActive ) {\r\n //if (self.allEditedActionFilter[i].id == params.data.suggestedAction) {\r\n newOption.id = self.allEditedActionFilter[i].id;\r\n newOption.name = self.allEditedActionFilter[i].name;\r\n\r\n var eOption = document.createElement(\"option\");\r\n eOption.setAttribute(\"value\", newOption.id);\r\n eOption.innerHTML = newOption.name;\r\n eSelect.appendChild(eOption);\r\n }\r\n\r\n }\r\n /* if (newOption.name != undefined) {\r\n var eOption = document.createElement(\"option\");\r\n eOption.setAttribute(\"value\", newOption.id);\r\n eOption.innerHTML = newOption.name;\r\n eSelect.appendChild(eOption);\r\n }*/\r\n }\r\n eSelect.value = params.data[fieldId];\r\n eCell.addEventListener('click', function () {\r\n if (!editing) {\r\n eCell.removeChild(eLabel);\r\n eCell.appendChild(eSelect);\r\n eSelect.focus();\r\n editing = true;\r\n }\r\n });\r\n\r\n eSelect.addEventListener('blur', function () {\r\n if (editing) {\r\n editing = false;\r\n eCell.removeChild(eSelect);\r\n eCell.appendChild(eLabel);\r\n }\r\n });\r\n\r\n eSelect.addEventListener('change', function () {\r\n if (editing) {\r\n\r\n var colIds = [];\r\n colIds.push(params.column.colId);\r\n var changedRows = [];\r\n changedRows.push(params.node);\r\n\r\n editing = false;\r\n var newValue = '';\r\n\r\n for (var i = 0; i < source.length; i++) {\r\n if (source[i].id == eSelect.value) {\r\n newValue = source[i].name;\r\n params.data[field] = newValue;\r\n params.data[fieldId] = eSelect.value;\r\n //Children\r\n if (params.node != null && params.node.children != null) {\r\n params.node.children.forEach(function (node) {\r\n if (node.children) {\r\n node.children.forEach(function (node) {\r\n node.data[field] = newValue;\r\n node.data[fieldId] = eSelect.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n }\r\n node.data[field] = newValue;\r\n node.data[fieldId] = eSelect.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n }\r\n break;\r\n }\r\n }\r\n\r\n\r\n params.data.dirty = true;\r\n\r\n params.api.refreshCells(changedRows, colIds);\r\n\r\n eLabel.nodeValue = newValue;\r\n eCell.removeChild(eSelect);\r\n eCell.appendChild(eLabel);\r\n\r\n if (onChangeCallback != undefined) {\r\n onChangeCallback(params, newValue);\r\n }\r\n\r\n }\r\n });\r\n\r\n return eCell;\r\n \r\n }\r\n\r\n });\r\n\r\n","\r\nangular.module(\"prisma\")\r\n .controller(\"CategorySummaryMarkdownsCtrl\", function ($state, $rootScope, markdownService, authService) {\r\n var self = this;\r\n\r\n self.canIgnoreAll = authService.hasPermission('markdown_decisions_IgnoreAll');\r\n self.canActivate = authService.hasPermission('markdown_activation_ActivateMarkdowns');\r\n self.canSendToPrices = authService.hasPermission('markdown_inform_getMarkdownsToInform');\r\n self.canValidar = authService.hasPermission('markdown_decisions_Validar');\r\n\r\n var numberColWidth = 120;\r\n\r\n var columnDefs = null;\r\n\r\n var decisionsTypes = {\r\n SUGGESTIONS: 0,\r\n ENDORSE: 1,\r\n VALIDATE: 2\r\n //REVALIDATE: 5\r\n }\r\n\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: 'Categoria',\r\n width: numberColWidth + 250,\r\n pinned: 'left',\r\n field: 'name',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n cellRenderer: {\r\n renderer: 'group',\r\n checkbox: false,\r\n innerRenderer: function (params) {\r\n\r\n var name = params.value + (params.node.group && params.node.children != null ? ' (' + params.node.children.length + ')' : '');\r\n\r\n //if (params.data.parentId != null && params.data.parentId != 0) {\r\n\r\n var categoryGroup = \"'\" + params.data.parentName + \"'\";\r\n var category = \"'\" + params.data.name + \"'\";\r\n\r\n var anchor = '' + name + '';\r\n\r\n var endorseLink = '';\r\n if (params.data.accepted && params.data.accepted.totalSuggestions > 0) {\r\n endorseLink = '';\r\n console.log('endorseLink', endorseLink);\r\n }\r\n\r\n var validateLink = '';\r\n if (params.data.endorsed && params.data.endorsed.totalSuggestions > 0)\r\n validateLink = '';\r\n\r\n if (params.data.validated && params.data.validated.totalSuggestions > 0)\r\n validateLink = '';\r\n\r\n return endorseLink + validateLink+ anchor;\r\n //}\r\n //else\r\n // return name;\r\n }\r\n }\r\n },\r\n {\r\n headerName: 'Rebajas',\r\n children: [\r\n {\r\n headerName: \"Sugerencias\",\r\n field: \"active.totalSuggestions\",\r\n headerTooltip: \"Cantidad de sugerencias.\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n\r\n },\r\n {\r\n headerName: \"Impacto\",\r\n field: \"active.impact\",\r\n headerTooltip: \"Muestra el impacto en pesos de la sugerencia.\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellRenderer: $rootScope.moneyRenderer,\r\n cellClass: $rootScope.getClassForImpactCell\r\n },\r\n {\r\n headerName: \"Stock\",\r\n field: \"active.units\",\r\n //headerTooltip: \"Cantidad de cambios de precio generados por un cambio en los costos.\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n ]\r\n },\r\n {\r\n headerName: 'Nuevos Rebajas',\r\n children: [\r\n {\r\n headerName: \"Nuevos\",\r\n field: \"accepted.totalSuggestions\",\r\n headerTooltip: \"Cantidad de sugerencias competitivas.\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n\r\n },\r\n {\r\n headerName: \"Impacto\",\r\n field: \"accepted.impact\",\r\n headerTooltip: \"Muestra el impacto en pesos de la sugerencia.\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellRenderer: $rootScope.moneyRenderer,\r\n cellClass: $rootScope.getClassForImpactCell\r\n },\r\n {\r\n headerName: \"Stock\",\r\n field: \"accepted.units\",\r\n //headerTooltip: \"Cantidad de cambios de precio generados por un cambio en los costos.\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n }]\r\n },\r\n {\r\n headerName: 'Rebajas Revisadas',\r\n children: [\r\n {\r\n headerName: \"Revisadas\",\r\n field: \"endorsed.totalSuggestions\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Impacto\",\r\n field: \"endorsed.impact\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForImpactCell,\r\n cellRenderer: $rootScope.moneyRenderer\r\n },\r\n {\r\n headerName: \"Stock\",\r\n field: \"endorsed.units\",\r\n //headerTooltip: \"Cantidad de cambios de precio generados por un cambio en los costos.\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n }, ]\r\n },\r\n {\r\n headerName: 'Rebajas Validadas',\r\n children: [\r\n {\r\n headerName: \"Validadas\",\r\n field: \"validated.totalSuggestions\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Impacto\",\r\n field: \"validated.impact\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForImpactCell,\r\n cellRenderer: $rootScope.moneyRenderer\r\n },\r\n {\r\n headerName: \"Stock\",\r\n field: \"validated.units\",\r\n //headerTooltip: \"Cantidad de cambios de precio generados por un cambio en los costos.\",\r\n width: numberColWidth,\r\n filter: 'number',\r\n cellClass: $rootScope.getClassForCell\r\n }]\r\n }\r\n ];\r\n }\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n groupHeaders: false,\r\n suppressCellSelection: true,\r\n rowHeight: 35,\r\n groupHideGroupColumns: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n angularCompileRows: true,\r\n getNodeChildDetails: getNodeChildDetails\r\n }\r\n\r\n function getNodeChildDetails(rowItem) {\r\n if (rowItem.subcategories && rowItem.subcategories.length > 0) {\r\n return {\r\n group: true,\r\n expanded: false,\r\n // provide ag-Grid with the children of this group\r\n children: rowItem.subcategories,\r\n // the key is used by the default group cellRenderer\r\n key: rowItem.id\r\n };\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n self.goToDecisions = function (id, categoryGroup, category,type) {\r\n\r\n categoryGroup = categoryGroup.replace(/ /g, \"-\").replace(/\\//g, \"_\");\r\n category = category.replace(/ /g, \"-\").replace(/\\//g, \"_\");\r\n\r\n var encodedcategoryGroup = categoryGroup != 'null' ? encodeURIComponent(categoryGroup) : '';\r\n var encodedcategory = category != 'null' ? encodeURIComponent(category) : '';\r\n\r\n\r\n $state.go('markdowns.decisions', {\r\n categoryId: id, categoryGroup: encodedcategoryGroup, category: encodedcategory,\r\n decisionType: type\r\n });\r\n }\r\n\r\n function setGridOptions() {\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n groupHeaders: false,\r\n suppressCellSelection: true,\r\n rowHeight: 35,\r\n groupHideGroupColumns: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n angularCompileRows: true,\r\n getNodeChildDetails: getNodeChildDetails\r\n }\r\n }\r\n\r\n //Filtro Buscador\r\n self.summary = null;\r\n\r\n self.copiedSummary = null;\r\n self.onSearchKeyUp = function () {\r\n //console.log('self.search', self.search);\r\n if (!self.search) {\r\n if (self.copiedSummary)\r\n copyValuesFromFilteredToComplete(self.copiedSummary, self.summary);\r\n self.gridOptions.api.setRowData(self.summary);\r\n } else {\r\n self.copiedSummary = angular.copy(self.summary);\r\n filterSummary(self.summary, self.copiedSummary, self.search.toLowerCase());\r\n self.gridOptions.api.setRowData(self.copiedSummary);\r\n\r\n }\r\n }\r\n\r\n self.activateMarkdowns = function () {\r\n $state.go('markdowns.activation');\r\n }\r\n\r\n self.sendToPrices = function () {\r\n swal({\r\n title: \"Desea enviar los precios de liquidacion validados al modulo de Precios?\",\r\n text: 'Si lo hace mas de una vez, se sobreescribiran los precios de liquidacion que aun no se hayan informado.',\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n }, function (yes) {\r\n if (yes) {\r\n markdownService.decisions.writeMarkdownPrices()\r\n .then(function () {\r\n console.log('writeMarkdownPrices');\r\n loadData();\r\n swal('Precios Publicados!', 'Los precios se han publicado exitosamente', 'success');\r\n }, function (status) {\r\n if (status == 502) {\r\n swal(\"El proceso continua...\", \"Se enviara un e-mail a cada usuario de Liquidaciones cuando se reciba la informacion en precios.\")\r\n }\r\n else {\r\n swal(\"Error\", \"Hubo un error al publicar los precios\", \"error\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.ignoreAll = function () {\r\n swal({\r\n title: \"Esta seguro?\",\r\n text: 'Esta seguro que desea ignorar todos los items pendientes?',\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (yes) {\r\n if (yes) {\r\n markdownService.decisions.ignoreAll()\r\n .then(function () {\r\n //self.applyFilters();\r\n loadData();\r\n swal(\"Confirmado\", \"Se guardaron los cambios\", \"success\");\r\n }, function (error) {\r\n swal(\"Error\", \"Ha ocurrido un error\", \"error\");\r\n });\r\n }\r\n });\r\n }\r\n function splitCategories() {\r\n var arr = [];\r\n angular.forEach(self.selectedCategories, function (category) {\r\n arr.push(category.id);\r\n });\r\n return arr;\r\n }\r\n self.applyingFilters = false;\r\n self.applyFilters = function () {\r\n\r\n self.pageNumber = 0;\r\n loadData();\r\n }\r\n self.reviewCategoryValidate = function () {\r\n swal({\r\n title: \"Esta seguro?\",\r\n text: \"Esta seguro que desea marcar la categoria como revisada?\",\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n }, function (yes) {\r\n if (yes) {\r\n \r\n markdownService.decisions.reviewCategoryValidate()\r\n .then(function () {\r\n self.applyFilters();\r\n console.log('reviewCategoryValidate');\r\n swal(\"Confirmado\", \"Se guardaron los cambios seleccionados\", \"success\");\r\n }, function (error) {\r\n swal(\"Error\", \"Ha ocurrido un error\", \"error\");\r\n });\r\n }\r\n });\r\n }\r\n\r\n function copyValuesFromFilteredToComplete(filtered, completed) {\r\n if (filtered.length == 0 || completed.length == 0) return;\r\n for (var j = 0; j < completed.length; j++) {\r\n for (var i = 0; i < filtered.length; i++) {\r\n if (completed[j].id == filtered[i].id) {\r\n //console.log('copying', filtered[i].name);\r\n copyValuesFromFilteredToComplete(filtered[i].subcategories, completed[j].subcategories);\r\n }\r\n }\r\n }\r\n }\r\n\r\n //source y dest tienen que ser copias uno del otro\r\n function filterSummary(source, dest, search) {\r\n if (!source || source.length == 0) return false;\r\n var idsToRemove = [];\r\n var anyOfThisAreValid = false;\r\n for (var i = 0; i < source.length; i++) {\r\n var anyChildrenValid = false;\r\n\r\n anyChildrenValid |= filterSummary(source[i].subcategories, dest[i].subcategories, search);\r\n\r\n if (!anyChildrenValid && source[i].name.toLowerCase().indexOf(search) == -1) {\r\n\r\n idsToRemove.push(source[i].id);\r\n } else if (source[i].name.toLowerCase().indexOf(search) != -1) {\r\n anyOfThisAreValid = true;\r\n } else if (anyChildrenValid) {\r\n anyOfThisAreValid = true;\r\n }\r\n }\r\n\r\n for (var i = 0; i < idsToRemove.length; i++) {\r\n for (var j = 0; j < dest.length; j++) {\r\n if (dest[j].id == idsToRemove[i]) {\r\n dest.splice(j, 1);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return anyOfThisAreValid;\r\n }\r\n\r\n function loadData() {\r\n markdownService.decisions.getCategorySummary().then(function (items) {\r\n console.log('items', items);\r\n\r\n\r\n self.summary = items;\r\n self.gridOptions.api.setRowData(items);\r\n self.gridOptions.api.sizeColumnsToFit();\r\n });\r\n }\r\n\r\n function init() {\r\n //init columnDefs and gridOptions\r\n setGridOptions();\r\n\r\n //load data\r\n loadData();\r\n }\r\n\r\n init();\r\n\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"MarkdownActivationCtrl\", function ($scope, markdownService, $translate, $rootScope, $window, $timeout) {\r\n var self = this;\r\n\r\n var allSelected = true;\r\n self.loadingMarkdowns = false;\r\n self.informingMarkdowns = false;\r\n\r\n self.markdownsToInform = [];\r\n\r\n self.reasons = [];\r\n\r\n self.selectedReasons = [];\r\n self.selectedMarkdownPlanType = null;\r\n\r\n self.showMarkdownGrid = false;\r\n\r\n self.canInform = function () {\r\n return self.markdownsToInform.length > 0;\r\n }\r\n\r\n self.activateMarkdowns = function () {\r\n\r\n if (!self.canInform()) {\r\n swal(\"No hay liquidaciones para activar\", \"No hay liquidaciones para activar.\", \"warning\");\r\n return;\r\n }\r\n\r\n var title = 'Esta seguro que desea activar las liquidaciones?';\r\n var text = '';\r\n var closeOnConfirm = false;\r\n\r\n var swalOptions = {\r\n title: title,\r\n text: text,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: closeOnConfirm,\r\n closeOnCancel: true\r\n }\r\n\r\n swal(swalOptions, doInform);\r\n\r\n }\r\n\r\n function doInform(isConfirm) {\r\n\r\n if (!isConfirm)\r\n return;\r\n\r\n self.informingMarkdowns = true;\r\n //preparo el dto reducido para el save\r\n var idsToInform = getIdsToInform();\r\n\r\n markdownService.activation.activateMarkdowns(idsToInform).then(function (informResult) {\r\n\r\n swal(\"Reporte de Activación Generado!\", \"Se genero el reporte de activacion exitosamente\", \"success\");\r\n\r\n //Vuelvo a cargar la info\r\n self.getFilteredMarkdowns();\r\n loadPreviousReports();\r\n\r\n loadPreviousReports();\r\n self.informingMarkdowns = false;\r\n },\r\n function (fallback) {\r\n console.log(fallback);\r\n self.informingMarkdowns = false;\r\n swal(\"Error\", \"Ha ocurrido un error\", \"error\");\r\n });\r\n\r\n }\r\n\r\n self.downloadLastReport = function () {\r\n markdownService.activation.downloadLastOutput().then(function (reportUrl) {\r\n if (reportUrl) {\r\n $window.open(reportUrl);\r\n }\r\n });\r\n }\r\n\r\n self.downloadFile = function (url) {\r\n $window.open(url);\r\n }\r\n\r\n self.getFilteredMarkdowns = function () {\r\n\r\n if (self.selectedMarkdownPlanType != null) {\r\n\r\n self.showMarkdownGrid = true;\r\n\r\n //if (self.gridOptions.api)\r\n // self.gridOptions.api.showLoadingOverlay();\r\n\r\n var filters = {\r\n markdownTypeId: self.selectedMarkdownPlanType,\r\n reasons: self.selectedReasons\r\n }\r\n\r\n //if (filters.markdownTypeId == null)\r\n // swal(\"Debe seleccionar un tipo de precio.\", \" No se ha seleccionado ningun tipo de precio.\", \"error\");\r\n //else if ((filters.markdownTypeId == 4 || filters.markdownTypeId == 5) && filters.reasons.length == 0) {\r\n // swal(\"Debe seleccionar un motivo para estos tipos de precio.\", \" En el caso de que no aparezca ninguno, no existen precios a informar del tipo seleccionado.\", \"error\");\r\n //}\r\n //else {\r\n self.loadingMarkdowns = true;\r\n markdownService.activation.getMarkdownsToInformFiltered(filters)\r\n .then(function (markdownsToInform) {\r\n self.markdownsToInform = markdownsToInform;\r\n self.loadingMarkdowns = false;\r\n });\r\n //}\r\n }\r\n }\r\n\r\n function getIdsToInform() {\r\n\r\n var idsToInform = self.markdownsToInform;\r\n //.map(function (p) {\r\n //return {\r\n // markdownType: p.markdownTypeId,\r\n // subcategoryId: p.subcategoryId,\r\n // itemId: p.itemId,\r\n // unitOfMeasureId: p.unitOfMeasureId,\r\n // storeId: p.storeId,\r\n // reason: p.reason,\r\n //}})\r\n\r\n return idsToInform;\r\n }\r\n\r\n\r\n\r\n function loadData() {\r\n\r\n loadPreviousReports();\r\n\r\n }\r\n\r\n self.getReasonsFilter = function () {\r\n if (self.selectedMarkdownPlanType != 0) {\r\n\r\n self.loadingReasons = true;\r\n\r\n markdownService.activation.getReasonsFilter(self.selectedMarkdownPlanType).then(function (reasons) {\r\n self.reasons = reasons;\r\n self.loadingReasons = false;\r\n },\r\n function (fallback) {\r\n self.loadingReasons = false;\r\n console.log(fallback);\r\n });\r\n }\r\n }\r\n\r\n function loadPreviousReports() {\r\n markdownService.activation.getLastOutputReports()\r\n .then(function (reports) {\r\n self.generatedFiles = reports;\r\n });\r\n\r\n }\r\n\r\n function init() {\r\n\r\n loadData();\r\n }\r\n\r\n init();\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"StockAnalysisCtrl\", function ($rootScope, $state, $stateParams, $timeout, $interval, $filter, inventoryService) {\r\n\r\n var self = this;\r\n var numberColWidth = 100;\r\n var groupColWidth = 30;\r\n var columnDefs = null;\r\n\r\n self.inventoryData = [];\r\n self.gridOptions = null;\r\n\r\n //grid config\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n\r\n headerName: 'Tienda',\r\n pinned: 'left',\r\n field: 'store',\r\n width: groupColWidth,\r\n rowGroupIndex: 0,\r\n hide: true\r\n },\r\n {\r\n\r\n headerName: 'Sector',\r\n pinned: 'left',\r\n field: 'categoryGroup',\r\n width: groupColWidth,\r\n rowGroupIndex: 1,\r\n hide: true\r\n },\r\n {\r\n\r\n headerName: 'Categoria',\r\n pinned: 'left',\r\n field: 'category',\r\n width: groupColWidth,\r\n rowGroupIndex: 2,\r\n hide: true\r\n },\r\n {\r\n\r\n headerName: 'SubCategoria',\r\n pinned: 'left',\r\n field: 'subcategory',\r\n width: groupColWidth,\r\n rowGroupIndex: 3,\r\n hide: true\r\n },\r\n {\r\n headerName: 'SKU',\r\n children: [\r\n {\r\n\r\n headerName: 'Codigo',\r\n field: 'itemCode',\r\n columnGroupShow: 'open',\r\n width: groupColWidth + 10,\r\n },\r\n {\r\n\r\n headerName: 'Descripcion',\r\n field: 'item',\r\n width: numberColWidth + 100,\r\n },\r\n {\r\n\r\n headerName: 'Lead Time',\r\n field: 'vendorLeadTime',\r\n columnGroupShow: 'open',\r\n aggFunc: 'max',\r\n width: numberColWidth + 30,\r\n },\r\n ]\r\n },\r\n {\r\n headerName: 'Performance',\r\n children: [\r\n {\r\n headerName: \"Venta $\",\r\n field: \"sales\",\r\n filter: 'number',\r\n headerTooltip: \"Venta en $ (promedio por mes por tienda Same Store)\",\r\n width: numberColWidth + 10,\r\n aggFunc: 'sum',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: \"Unidades\",\r\n columnGroupShow: 'open',\r\n field: \"units\",\r\n filter: 'number',\r\n aggFunc: 'sum',\r\n headerTooltip: \"Venta en Unidades (promedio por mes por tienda Same Store)\",\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.decimalRenderer\r\n },\r\n {\r\n headerName: \"Margen $\",\r\n columnGroupShow: 'open',\r\n field: \"margin\",\r\n filter: 'number',\r\n headerTooltip: \"\",\r\n aggFunc: 'sum',\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: \"CMV\",\r\n columnGroupShow: 'open',\r\n field: \"cost\",\r\n filter: 'number',\r\n headerTooltip: \"\",\r\n aggFunc: 'sum',\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n ]\r\n },\r\n {\r\n headerName: 'Inventario',\r\n children: [\r\n {\r\n headerName: \"Inventario\",\r\n field: \"inventory\",\r\n filter: 'number',\r\n headerTooltip: \"Inventario en $\",\r\n width: numberColWidth + 10,\r\n aggFunc: 'sum',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: \"Inv. Unidades\",\r\n columnGroupShow: 'open',\r\n field: \"inventoryUnits\",\r\n filter: 'number',\r\n aggFunc: 'sum',\r\n headerTooltip: \"Inventario en Unidades\",\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: \"Dias de Inventario\",\r\n field: \"inventoryDays\",\r\n filter: 'number',\r\n valueGetter: inventoryDaysGetter,\r\n headerTooltip: \"Inventario en dias\",\r\n width: numberColWidth,\r\n aggFunc: 'sum',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: \"Inv. Teorico\",\r\n field: \"inventoryTheory\",\r\n filter: 'number',\r\n valueGetter: inventoryTheoryGetter,\r\n headerTooltip: \"Inventario Teorico\",\r\n width: numberColWidth,\r\n aggFunc: 'sum',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: \"Delta Inv $\",\r\n field: \"deltaInventory\",\r\n filter: 'number',\r\n sort: 'desc',\r\n valueGetter: deltaInventoryGetter,\r\n headerTooltip: \"Diferencia entre inventario teorico e inventario real en $\",\r\n width: numberColWidth,\r\n aggFunc: 'sum',\r\n cellClass: $rootScope.getClassForImpactCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: \"Inv. Teorico Un.\",\r\n field: \"inventoryUnitsTheory\",\r\n filter: 'number',\r\n valueGetter: inventoryUnitsTheoryGetter,\r\n headerTooltip: \"Inventario Teorico en Unidades\",\r\n width: numberColWidth,\r\n aggFunc: 'sum',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: \"Delta Inv Un.\",\r\n field: \"deltaInventoryUnits\",\r\n filter: 'number',\r\n valueGetter: deltaInventoryUnitsGetter,\r\n headerTooltip: \"Diferencia entre inventario teorico e inventario real en unidades\",\r\n width: numberColWidth,\r\n aggFunc: 'sum',\r\n cellClass: $rootScope.getClassForImpactCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n\r\n {\r\n headerName: \"GMROI\",\r\n columnGroupShow: 'open',\r\n field: \"gmroi\",\r\n filter: 'number',\r\n headerTooltip: \"Margen $ / valor del inventario (cuantos $ de Margen por cada $ invertido en inventario)\",\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRenderer\r\n }\r\n ]\r\n },\r\n\r\n ]\r\n }\r\n\r\n function inventoryDaysGetter(params) {\r\n return params.data.inventoryUnits / params.data.units;\r\n }\r\n\r\n function inventoryTheoryGetter(params) {\r\n return params.data.cost * params.data.vendorLeadTime;\r\n }\r\n\r\n function inventoryUnitsTheoryGetter(params) {\r\n return params.data.units * params.data.vendorLeadTime;\r\n }\r\n\r\n function deltaInventoryGetter(params) {\r\n return params.data.inventory - inventoryTheoryGetter(params);\r\n }\r\n\r\n function deltaInventoryUnitsGetter(params) {\r\n return params.data.inventoryUnits - inventoryUnitsTheoryGetter(params);\r\n }\r\n\r\n function setGridOptions() {\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: true,\r\n groupHeaders: true,\r\n suppressCellSelection: true,\r\n rowHeight: 35,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n }\r\n }\r\n }\r\n\r\n self.exportToExcel = function () {\r\n var params = {\r\n skipHeader: false,\r\n skipFooters: false,\r\n skipGroups: false,\r\n allColumns: true,\r\n onlySelected: false,\r\n suppressQuotes: false,\r\n fileName: self.categoryGroup + '.xls',\r\n columnSeparator: ','\r\n };\r\n\r\n self.gridOptions.api.exportDataAsCsv(params);\r\n }\r\n\r\n function loadData() {\r\n inventoryService.inventory.getStockAnalysis()\r\n .then(function (items) {\r\n\r\n self.gridOptions.api.setRowData(items);\r\n self.gridOptions.api.sizeColumnsToFit();\r\n\r\n });\r\n }\r\n\r\n function init() {\r\n\r\n //init columnDefs and gridOptions\r\n setGridOptions();\r\n\r\n //load data\r\n loadData();\r\n }\r\n\r\n init();\r\n });\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n .controller(\"WeatherCtrl\", function ($scope) {\r\n var self = this;\r\n self.section = \"Inicio\";\r\n self.name = \"An�lisis del clima\";\r\n });\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n .controller(\"PivotCtrl\", function ($scope, $timeout) {\r\n var $container = null;\r\n var filters = {};\r\n\r\n var filterFns = {\r\n GMGreaterThan: function () {\r\n var number = $(this).find(\".GM\").text().replace(\"$\", \"\").replace(\",\", \"\").replace(\".\", \"\");\r\n return parseInt(number) >= 150;\r\n },\r\n UnitsRange: function () {\r\n var number = $(this).find(\".Units\").text();\r\n return (parseInt(number) >= $scope.advancedFilters.units.from && parseInt(number) <= $scope.advancedFilters.units.to);\r\n },\r\n PriceRange: function () {\r\n var number = $(this).find(\".Price\").text().replace(\"$\", \"\");\r\n return (parseFloat(number) >= $scope.advancedFilters.price.from && parseFloat(number) <= $scope.advancedFilters.price.to);\r\n },\r\n GMRange: function () {\r\n var number = $(this).find(\".GM\").text().replace(\"$\", \"\");\r\n return (parseFloat(number) >= $scope.advancedFilters.gm.from && parseFloat(number) <= $scope.advancedFilters.gm.to);\r\n },\r\n ium: function () {\r\n var name = $(this).find(\".Name\").text();\r\n return name.match(/bebidas/);\r\n }\r\n };\r\n\r\n var init = function () {\r\n //init isotope\r\n $timeout(function () {\r\n $container = $(\".isotope\").isotope({\r\n itemSelector: \".element-item\",\r\n layoutMode: \"fitRows\",\r\n getSortData: {\r\n Name: \".Name\",\r\n Manufacturer: \".Manufacturer\",\r\n Category: \"[data-category]\",\r\n Units: \".Units parseInt\",\r\n Price: function (itemElem) {\r\n var number = $(itemElem).find(\".Price\").text().replace(\"$\", \"\").replace(\",\", \"\").replace(\".\", \"\");\r\n return parseFloat(number);\r\n },\r\n Sales: function (itemElem) {\r\n var number = $(itemElem).find(\".Sales\").text().replace(\"$\", \"\").replace(\",\", \"\").replace(\".\", \"\");\r\n return parseFloat(number);\r\n },\r\n GM: function (itemElem) {\r\n var number = $(itemElem).find(\".GM\").text().replace(\"$\", \"\").replace(\",\", \"\").replace(\".\", \"\");\r\n return parseFloat(number);\r\n }\r\n },\r\n sortAscending: {\r\n Name: true,\r\n Manufacturer: true,\r\n Category: true,\r\n Units: false,\r\n Price: false,\r\n Sales: false,\r\n GM: false\r\n },\r\n filter: function () {\r\n var isMatched = true;\r\n var $this = $(this);\r\n\r\n for (var prop in filters) {\r\n var filter = filters[prop];\r\n // use function if it matches\r\n filter = filterFns[filter] || filter;\r\n // test each filter\r\n if (filter) {\r\n isMatched = isMatched && $(this).is(filter);\r\n }\r\n // break if not matched\r\n if (!isMatched) {\r\n break;\r\n }\r\n }\r\n return isMatched;\r\n }\r\n });\r\n\r\n filters[\"gm\"] = \"GMRange\";\r\n $container.isotope(\"arrange\");\r\n\r\n }, 1000);\r\n\r\n // change is-checked class on buttons\r\n $(\".button-group\").each(function (i, buttonGroup) {\r\n var $buttonGroup = $(buttonGroup);\r\n $buttonGroup.on(\"click\", \"button\", function () {\r\n $buttonGroup.find(\".is-checked\").removeClass(\"is-checked\");\r\n $(this).addClass(\"is-checked\");\r\n });\r\n });\r\n }\r\n\r\n $scope.classify = function (cat) {\r\n return cat.toLowerCase()\r\n .replaceAll(\" \", \"-\")\r\n .replaceAll(\"/\", \"\")\r\n .removeDiacritics();\r\n }\r\n $scope.$watch($scope.articles, function () {\r\n init();\r\n });\r\n\r\n //filtering and sorting\r\n $scope.sort = function (sortByValue) {\r\n\r\n $container.isotope({ sortBy: sortByValue });\r\n }\r\n $scope.frequentFilter = function (type, filterValue) {\r\n //clear filters\r\n filters = {};\r\n // set filter for group\r\n filters[type] = filterValue;\r\n // arrange, and use filter fn\r\n $container.isotope(\"arrange\");\r\n }\r\n $scope.advancedFilters = {\r\n units: { from: 0, to: 3000 },\r\n price: { from: 0, to: 110 },\r\n gm: { from: 0, to: 2600 }\r\n }\r\n $scope.unitsSliderOptions = {\r\n min: 0,\r\n max: 3000,\r\n from: 0,\r\n to: 2909,\r\n to_max: 2909,\r\n to_shadow: true,\r\n type: \"double\",\r\n postfix: \" uni\",\r\n prettify: false,\r\n };\r\n $scope.priceSliderOptions = {\r\n min: 0,\r\n max: 105,\r\n from: 0,\r\n to: 104,\r\n to_max: 104,\r\n to_shadow: true,\r\n type: \"double\",\r\n prefix: \"$\",\r\n prettify: false,\r\n }\r\n $scope.gmSliderOptions = {\r\n min: 0,\r\n max: 2504,\r\n from: 0,\r\n to: 2504,\r\n to_max: 2504,\r\n to_shadow: true,\r\n type: \"double\",\r\n prefix: \"$\",\r\n prettify: false,\r\n }\r\n $scope.onCategoryChanged = function () {\r\n var catName = \"*\";\r\n if ($scope.selectedCategory) {\r\n var cat = $scope.selectedCategory;\r\n catName = \".\" + $scope.classify(cat.Name);\r\n }\r\n filters[\"category\"] = catName;\r\n $container.isotope(\"arrange\");\r\n }\r\n $scope.onUnitsSliderChanged = function (data) {\r\n $scope.advancedFilters.units.from = data.fromNumber;\r\n $scope.advancedFilters.units.to = data.toNumber;\r\n filters[\"units\"] = \"UnitsRange\";\r\n $container.isotope(\"arrange\");\r\n }\r\n $scope.onPriceSliderChanged = function (data) {\r\n $scope.advancedFilters.price.from = data.fromNumber;\r\n $scope.advancedFilters.price.to = data.toNumber;\r\n filters[\"price\"] = \"PriceRange\";\r\n $container.isotope(\"arrange\");\r\n }\r\n $scope.onGmSliderChanged = function (data) {\r\n $scope.advancedFilters.gm.from = data.fromNumber;\r\n $scope.advancedFilters.gm.to = data.toNumber;\r\n filters[\"gm\"] = \"GMRange\";\r\n $container.isotope(\"arrange\");\r\n }\r\n $scope.toggleAdvancedFilters = function (turnOn) {\r\n $scope.showAdvanced = turnOn;\r\n\r\n $(\"#filters button\").removeClass(\"is-checked\");\r\n $(\"#filters button#all\").addClass(\"is-checked\");\r\n\r\n filters = {};\r\n filters.category = \"*\";\r\n $container.isotope(\"arrange\");\r\n }\r\n\r\n //data\r\n $scope.categories = [\r\n {\r\n \"Id\": 2,\r\n \"Name\": \"Lavado de Autos\"\r\n },\r\n {\r\n \"Id\": 7,\r\n \"Name\": \"Cigarrillos\"\r\n },\r\n {\r\n \"Id\": 13,\r\n \"Name\": \"Otro Tabaco\"\r\n },\r\n {\r\n \"Id\": 21,\r\n \"Name\": \"Cerveza\"\r\n },\r\n {\r\n \"Id\": 33,\r\n \"Name\": \"Vinos\"\r\n },\r\n {\r\n \"Id\": 39,\r\n \"Name\": \"Licor\"\r\n },\r\n {\r\n \"Id\": 44,\r\n \"Name\": \"Bebidas Embotelladas\"\r\n },\r\n {\r\n \"Id\": 55,\r\n \"Name\": \"Golosinas\"\r\n },\r\n {\r\n \"Id\": 65,\r\n \"Name\": \"Leches\"\r\n },\r\n {\r\n \"Id\": 75,\r\n \"Name\": \"Lacteos\"\r\n },\r\n {\r\n \"Id\": 86,\r\n \"Name\": \"Comida Empacada\"\r\n },\r\n {\r\n \"Id\": 92,\r\n \"Name\": \"Helados\"\r\n },\r\n {\r\n \"Id\": 98,\r\n \"Name\": \"Comida Congelada\"\r\n },\r\n {\r\n \"Id\": 103,\r\n \"Name\": \"Pan\"\r\n },\r\n {\r\n \"Id\": 106,\r\n \"Name\": \"Snacks Salados\"\r\n },\r\n {\r\n \"Id\": 115,\r\n \"Name\": \"Snacks Dulces\"\r\n },\r\n {\r\n \"Id\": 120,\r\n \"Name\": \"Cereales\"\r\n },\r\n {\r\n \"Id\": 126,\r\n \"Name\": \"Frutas y Verduras\"\r\n },\r\n {\r\n \"Id\": 134,\r\n \"Name\": \"Almacen\"\r\n },\r\n {\r\n \"Id\": 140,\r\n \"Name\": \"Limpieza\"\r\n },\r\n {\r\n \"Id\": 148,\r\n \"Name\": \"Salud y Belleza\"\r\n },\r\n {\r\n \"Id\": 162,\r\n \"Name\": \"Mercader�a General\"\r\n },\r\n {\r\n \"Id\": 178,\r\n \"Name\": \"Publicaciones\"\r\n },\r\n {\r\n \"Id\": 188,\r\n \"Name\": \"Productos para el Automotor\"\r\n },\r\n {\r\n \"Id\": 195,\r\n \"Name\": \"Hielo\"\r\n },\r\n {\r\n \"Id\": 198,\r\n \"Name\": \"Comida\"\r\n },\r\n {\r\n \"Id\": 215,\r\n \"Name\": \"Bebidas Calientes\"\r\n },\r\n {\r\n \"Id\": 224,\r\n \"Name\": \"Bebidas fr�as dispensadas\"\r\n },\r\n {\r\n \"Id\": 232,\r\n \"Name\": \"Bebidas Congeladas dispensadas\"\r\n },\r\n {\r\n \"Id\": 236,\r\n \"Name\": \"Bebidas alcoholicas dispensadas\"\r\n },\r\n {\r\n \"Id\": 243,\r\n \"Name\": \"Combustibles\"\r\n },\r\n {\r\n \"Id\": 252,\r\n \"Name\": \"Servicios para el automotor\"\r\n },\r\n {\r\n \"Id\": 257,\r\n \"Name\": \"Store Services\"\r\n },\r\n {\r\n \"Id\": 275,\r\n \"Name\": \"Loter�a\"\r\n },\r\n {\r\n \"Id\": 282,\r\n \"Name\": \"Servicios varios\"\r\n },\r\n {\r\n \"Id\": 290,\r\n \"Name\": \"Store Use / Supply\"\r\n }\r\n ];\r\n $scope.articles = [\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 216,\r\n \"Subcategory\": \"COFFEE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2023,\r\n \"Name\": \"Cafe Exp Doble/Cortado/C Leche\",\r\n \"Price\": \"4.70\",\r\n \"Units\": 768,\r\n \"Sales\": 2980.43,\r\n \"GM\": 2503.51\r\n },\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 216,\r\n \"Subcategory\": \"COFFEE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2021,\r\n \"Name\": \"Cafe Jarrito Tric Lag\",\r\n \"Price\": \"4.00\",\r\n \"Units\": 768,\r\n \"Sales\": 2540.73,\r\n \"GM\": 2228.92\r\n },\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 216,\r\n \"Subcategory\": \"COFFEE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2020,\r\n \"Name\": \"Cafe Expr/ Cortado\",\r\n \"Price\": \"3.60\",\r\n \"Units\": 624,\r\n \"Sales\": 1858.71,\r\n \"GM\": 1598.47\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"BUFFALO\",\r\n \"EAN\": 7795070203194,\r\n \"Name\": \"BFF Buffalo Escobilla C 19 P 1und\",\r\n \"Price\": \"16.20\",\r\n \"Units\": 162,\r\n \"Sales\": 2169.18,\r\n \"GM\": 831.94\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 205,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3116,\r\n \"Name\": \"JAMON FRESH TM\",\r\n \"Price\": \"9.75\",\r\n \"Units\": 195,\r\n \"Sales\": 1571.65,\r\n \"GM\": 826.97\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"BUFFALO\",\r\n \"EAN\": 7795070203200,\r\n \"Name\": \"BFF Buffalo Escobilla C 20 PL 1und\",\r\n \"Price\": \"16.50\",\r\n \"Units\": 144,\r\n \"Sales\": 1963.72,\r\n \"GM\": 734.25\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77918482,\r\n \"Name\": \"PM Marlboro Box 20und\",\r\n \"Price\": \"4.05\",\r\n \"Units\": 2474,\r\n \"Sales\": 9359.29,\r\n \"GM\": 671.09\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895006968,\r\n \"Name\": \"Coca Cola Botella 600ml\",\r\n \"Price\": \"3.30\",\r\n \"Units\": 528,\r\n \"Sales\": 1446.93,\r\n \"GM\": 652.56\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"BUFFALO\",\r\n \"EAN\": 7795070703182,\r\n \"Name\": \"BFF Buffalo Escobilla C 18 PLUS\",\r\n \"Price\": \"15.20\",\r\n \"Units\": 140,\r\n \"Sales\": 1758.41,\r\n \"GM\": 644.35\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895000430,\r\n \"Name\": \"Coca Cola 1.5L\",\r\n \"Price\": \"5.50\",\r\n \"Units\": 306,\r\n \"Sales\": 1392.36,\r\n \"GM\": 557.17\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895000997,\r\n \"Name\": \"Coca Cola 2.25L\",\r\n \"Price\": \"6.20\",\r\n \"Units\": 251,\r\n \"Sales\": 1287.61,\r\n \"GM\": 534.77\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 7795070030226,\r\n \"Name\": \"BFF Buffalo Escobilla C 22 PLUS\",\r\n \"Price\": \"22.10\",\r\n \"Units\": 69,\r\n \"Sales\": 1260,\r\n \"GM\": 491.34\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 207,\r\n \"Subcategory\": \"BAKERY\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3726,\r\n \"Name\": \"Medialuna De Manteca\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 800,\r\n \"Sales\": 859,\r\n \"GM\": 472.62\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7790315000446,\r\n \"Name\": \"DNN Villavicencio Agua 500ml\",\r\n \"Price\": \"2.50\",\r\n \"Units\": 439,\r\n \"Sales\": 908.95,\r\n \"GM\": 469.94\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 209,\r\n \"Subcategory\": \"OTHER CUISINE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3437,\r\n \"Name\": \"EMPANADA JAMON Y QUESO x 1 UNIDAD\",\r\n \"Price\": \"2.60\",\r\n \"Units\": 552,\r\n \"Sales\": 1186.8,\r\n \"GM\": 430.61\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 205,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3115,\r\n \"Name\": \"GRAN IBERICO TM\",\r\n \"Price\": \"11.00\",\r\n \"Units\": 71,\r\n \"Sales\": 645.39,\r\n \"GM\": 392.77\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895006975,\r\n \"Name\": \"Coca Cola Light 600ml\",\r\n \"Price\": \"3.30\",\r\n \"Units\": 309,\r\n \"Sales\": 843.4,\r\n \"GM\": 376.01\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"WYNNS\",\r\n \"EAN\": 73579610017,\r\n \"Name\": \"WNNS Injector Cleaner 354ml\",\r\n \"Price\": \"27.37\",\r\n \"Units\": 38,\r\n \"Sales\": 859.48,\r\n \"GM\": 374.76\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"BUFFALO\",\r\n \"EAN\": 7795070103241,\r\n \"Name\": \"BFF Buffalo Escobilla C 24 PLUS\",\r\n \"Price\": \"35.00\",\r\n \"Units\": 41,\r\n \"Sales\": 1186.1,\r\n \"GM\": 360.7\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 193,\r\n \"Subcategory\": \"OTHER ADDITIVES\",\r\n \"Manufacturer\": \"BARDAHL LUBRICANT\",\r\n \"EAN\": 7790627112523,\r\n \"Name\": \"BRDL TIR Long Life deBardhal 950ml\",\r\n \"Price\": \"26.00\",\r\n \"Units\": 44,\r\n \"Sales\": 945.56,\r\n \"GM\": 353.8\r\n },\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 217,\r\n \"Subcategory\": \"HOT TEA\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2027,\r\n \"Name\": \"Infusiones/Te/Mate/Inf.Arbolit\",\r\n \"Price\": \"3.00\",\r\n \"Units\": 153,\r\n \"Sales\": 379.44,\r\n \"GM\": 352.7\r\n },\r\n {\r\n \"CategoryId\": 195,\r\n \"Category\": \"Hielo\",\r\n \"SubcategoryId\": 196,\r\n \"Subcategory\": \"BAGGED/BLOCKED ICE\",\r\n \"Manufacturer\": \"REDONHIELO\",\r\n \"EAN\": 7798021470010,\r\n \"Name\": \"RDH Redonhielo x 4kg\",\r\n \"Price\": \"7.00\",\r\n \"Units\": 147,\r\n \"Sales\": 850.74,\r\n \"GM\": 328.89\r\n },\r\n {\r\n \"CategoryId\": 86,\r\n \"Category\": \"Comida Empacada\",\r\n \"SubcategoryId\": 87,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"CANON\",\r\n \"EAN\": 7795947000178,\r\n \"Name\": \"CN CaNon Pan Blanco Trip 3und\",\r\n \"Price\": \"6.90\",\r\n \"Units\": 115,\r\n \"Sales\": 655.54,\r\n \"GM\": 311.91\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 77990303,\r\n \"Name\": \"Alf Cachafaz Chocolate\",\r\n \"Price\": \"2.54\",\r\n \"Units\": 384,\r\n \"Sales\": 806.68,\r\n \"GM\": 307.35\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895639814,\r\n \"Name\": \"COCA COLA F.GRIP 410ML\",\r\n \"Price\": \"2.70\",\r\n \"Units\": 257,\r\n \"Sales\": 578.17,\r\n \"GM\": 307.06\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"BUFFALO\",\r\n \"EAN\": 7795070000212,\r\n \"Name\": \"BFF Buffalo Escobilla C 21 1und\",\r\n \"Price\": \"19.80\",\r\n \"Units\": 45,\r\n \"Sales\": 736.26,\r\n \"GM\": 303.15\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 190,\r\n \"Subcategory\": \"ANTIFREEZE ETC.\",\r\n \"Manufacturer\": \"GILIO HERMANOS\",\r\n \"EAN\": 7793735000089,\r\n \"Name\": \"GHN Ros Rig Agua Destilada 950ml\",\r\n \"Price\": \"3.44\",\r\n \"Units\": 120,\r\n \"Sales\": 340.58,\r\n \"GM\": 293.04\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7611,\r\n \"Name\": \"Ajuste Revistas\",\r\n \"Price\": \"0.10\",\r\n \"Units\": 2909,\r\n \"Sales\": 290.9,\r\n \"GM\": 290.9\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7791489177736,\r\n \"Name\": \"PM Massalin Tripack & Regalo\",\r\n \"Price\": \"12.14\",\r\n \"Units\": 324,\r\n \"Sales\": 3672.34,\r\n \"GM\": 287.51\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770328850021,\r\n \"Name\": \"Para Ti Decoracion\",\r\n \"Price\": \"11.00\",\r\n \"Units\": 25,\r\n \"Sales\": 275,\r\n \"GM\": 275\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 205,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3123,\r\n \"Name\": \"PECHUGUITA LIGHT TM\",\r\n \"Price\": \"11.50\",\r\n \"Units\": 52,\r\n \"Sales\": 494.04,\r\n \"GM\": 266.27\r\n },\r\n {\r\n \"CategoryId\": 86,\r\n \"Category\": \"Comida Empacada\",\r\n \"SubcategoryId\": 87,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"CANON\",\r\n \"EAN\": 7795947008112,\r\n \"Name\": \"CN Canon Triang Pollo Rucula Parmesa\",\r\n \"Price\": \"9.75\",\r\n \"Units\": 80,\r\n \"Sales\": 644.8,\r\n \"GM\": 260.05\r\n },\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 219,\r\n \"Subcategory\": \"CAPPUCC./SPEC.COFFEE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2031,\r\n \"Name\": \"Capuccino Italiano\",\r\n \"Price\": \"6.10\",\r\n \"Units\": 59,\r\n \"Sales\": 297.36,\r\n \"GM\": 258.88\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"FERRERO\",\r\n \"EAN\": 40084107,\r\n \"Name\": \"FRR Kinder Sorpresa 20gr\",\r\n \"Price\": \"3.70\",\r\n \"Units\": 188,\r\n \"Sales\": 575.19,\r\n \"GM\": 255.48\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062548686,\r\n \"Name\": \"DNN Villa del Sur Agua Pomelo 500ml\",\r\n \"Price\": \"3.10\",\r\n \"Units\": 195,\r\n \"Sales\": 501.15,\r\n \"GM\": 251.35\r\n },\r\n {\r\n \"CategoryId\": 86,\r\n \"Category\": \"Comida Empacada\",\r\n \"SubcategoryId\": 87,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"CANON\",\r\n \"EAN\": 7795947000208,\r\n \"Name\": \"CN CaNon Pebete J y Q 1und\",\r\n \"Price\": \"6.50\",\r\n \"Units\": 92,\r\n \"Sales\": 494.05,\r\n \"GM\": 248.49\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 205,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3094,\r\n \"Name\": \"Sacramento Jamon y Queso\",\r\n \"Price\": \"4.60\",\r\n \"Units\": 122,\r\n \"Sales\": 463.6,\r\n \"GM\": 248.1\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895001451,\r\n \"Name\": \"Coca Cola Light 1.5L\",\r\n \"Price\": \"5.50\",\r\n \"Units\": 141,\r\n \"Sales\": 648.78,\r\n \"GM\": 246.99\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 51,\r\n \"Subcategory\": \"Bebidas Alternativas\",\r\n \"Manufacturer\": \"ENERGY GROUP SRL\",\r\n \"EAN\": 7798119220015,\r\n \"Name\": \"EG Speed 250ml\",\r\n \"Price\": \"4.97\",\r\n \"Units\": 135,\r\n \"Sales\": 553.92,\r\n \"GM\": 243.42\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 205,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3121,\r\n \"Name\": \"PAVITA FRESH TM\",\r\n \"Price\": \"10.50\",\r\n \"Units\": 60,\r\n \"Sales\": 520.78,\r\n \"GM\": 235.3\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 170,\r\n \"Subcategory\": \"SMOKING ACCESSOIRES\",\r\n \"Manufacturer\": \"PURO TABACO\",\r\n \"EAN\": 6902004095218,\r\n \"Name\": \"PTBC Candela Encendedor Und\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 377,\r\n \"Sales\": 402.06,\r\n \"GM\": 233.22\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77916433,\r\n \"Name\": \"PM Marlboro KS 20und\",\r\n \"Price\": \"3.93\",\r\n \"Units\": 854,\r\n \"Sales\": 3132.6,\r\n \"GM\": 232.83\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 51,\r\n \"Subcategory\": \"Bebidas Alternativas\",\r\n \"Manufacturer\": \"RED BULL\",\r\n \"EAN\": 9002490100070,\r\n \"Name\": \"RB Red Bull Lata 250ml\",\r\n \"Price\": \"5.88\",\r\n \"Units\": 107,\r\n \"Sales\": 519.93,\r\n \"GM\": 232.74\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7798085680127,\r\n \"Name\": \"EC Citric Jugo 500 Ml\",\r\n \"Price\": \"3.80\",\r\n \"Units\": 160,\r\n \"Sales\": 502.4,\r\n \"GM\": 230.4\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7790315000439,\r\n \"Name\": \"DNN Villavicencio Agua 1.5L\",\r\n \"Price\": \"3.40\",\r\n \"Units\": 175,\r\n \"Sales\": 493.5,\r\n \"GM\": 228.19\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 179,\r\n \"Subcategory\": \"NEWSPAPERS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7670,\r\n \"Name\": \"Clarin Vier\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 113,\r\n \"Sales\": 226,\r\n \"GM\": 226\r\n },\r\n {\r\n \"CategoryId\": 86,\r\n \"Category\": \"Comida Empacada\",\r\n \"SubcategoryId\": 87,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"CANON\",\r\n \"EAN\": 7795947008105,\r\n \"Name\": \"CN Canon Triangulo Caprese\",\r\n \"Price\": \"9.25\",\r\n \"Units\": 70,\r\n \"Sales\": 534.82,\r\n \"GM\": 221.92\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895007439,\r\n \"Name\": \"Sprite Botella 600ml\",\r\n \"Price\": \"3.30\",\r\n \"Units\": 178,\r\n \"Sales\": 485.9,\r\n \"GM\": 221.26\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77927279,\r\n \"Name\": \"CAD BELDENT X CARE CONF MENT X50\",\r\n \"Price\": \"12.00\",\r\n \"Units\": 48,\r\n \"Sales\": 476.13,\r\n \"GM\": 214.95\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"FERRERO\",\r\n \"EAN\": 78909434,\r\n \"Name\": \"FRR Ferrero Rocher Chocolate 37.\",\r\n \"Price\": \"3.60\",\r\n \"Units\": 175,\r\n \"Sales\": 521.25,\r\n \"GM\": 212.79\r\n },\r\n {\r\n \"CategoryId\": 86,\r\n \"Category\": \"Comida Empacada\",\r\n \"SubcategoryId\": 87,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"CANON\",\r\n \"EAN\": 7795947001878,\r\n \"Name\": \"CN Canon Jam Queso y Muzzarella\",\r\n \"Price\": \"11.25\",\r\n \"Units\": 52,\r\n \"Sales\": 483.6,\r\n \"GM\": 212.69\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"BUFFALO\",\r\n \"EAN\": 7795070803165,\r\n \"Name\": \"BFF Buffalo Escobilla C 16 PLUS\",\r\n \"Price\": \"14.10\",\r\n \"Units\": 49,\r\n \"Sales\": 570.98,\r\n \"GM\": 211.83\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 164,\r\n \"Subcategory\": \"BATTERIES\",\r\n \"Manufacturer\": \"ENERGIZER\",\r\n \"EAN\": 39800014009,\r\n \"Name\": \"ENZ Energizer Alcalina AAA 2\",\r\n \"Price\": \"6.00\",\r\n \"Units\": 88,\r\n \"Sales\": 436.47,\r\n \"GM\": 208.55\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 209,\r\n \"Subcategory\": \"OTHER CUISINE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3438,\r\n \"Name\": \"EMPANADA CARNE x 1 UNIDAD\",\r\n \"Price\": \"2.60\",\r\n \"Units\": 259,\r\n \"Sales\": 556.84,\r\n \"GM\": 201.35\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895062926,\r\n \"Name\": \"COCA COLA BOTELLA 237ML\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 202,\r\n \"Sales\": 385.82,\r\n \"GM\": 199.99\r\n },\r\n {\r\n \"CategoryId\": 86,\r\n \"Category\": \"Comida Empacada\",\r\n \"SubcategoryId\": 87,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"CANON\",\r\n \"EAN\": 7795947006002,\r\n \"Name\": \"CN CaNon Pan Negro Jam y Ques Tr\",\r\n \"Price\": \"6.90\",\r\n \"Units\": 75,\r\n \"Sales\": 427.5,\r\n \"GM\": 195.09\r\n },\r\n {\r\n \"CategoryId\": 86,\r\n \"Category\": \"Comida Empacada\",\r\n \"SubcategoryId\": 87,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"CANON\",\r\n \"EAN\": 7795947001861,\r\n \"Name\": \"CN Canon Roll Pollo\",\r\n \"Price\": \"11.75\",\r\n \"Units\": 50,\r\n \"Sales\": 485.5,\r\n \"GM\": 191\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770328429005,\r\n \"Name\": \"Noticias\",\r\n \"Price\": \"8.30\",\r\n \"Units\": 23,\r\n \"Sales\": 190.9,\r\n \"GM\": 190.9\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895067549,\r\n \"Name\": \"Coca Cola Zero Botella 600ml\",\r\n \"Price\": \"3.30\",\r\n \"Units\": 153,\r\n \"Sales\": 420.75,\r\n \"GM\": 190.84\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 205,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3125,\r\n \"Name\": \"SICILIANO TM\",\r\n \"Price\": \"9.25\",\r\n \"Units\": 50,\r\n \"Sales\": 382.04,\r\n \"GM\": 188.04\r\n },\r\n {\r\n \"CategoryId\": 86,\r\n \"Category\": \"Comida Empacada\",\r\n \"SubcategoryId\": 87,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"CANON\",\r\n \"EAN\": 7795947000239,\r\n \"Name\": \"CN CaNon Super Milanesa\",\r\n \"Price\": \"7.40\",\r\n \"Units\": 63,\r\n \"Sales\": 385.49,\r\n \"GM\": 187.12\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77900166,\r\n \"Name\": \"CAD Beldent S/Azucar Menta 10gr\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 454,\r\n \"Sales\": 484.43,\r\n \"GM\": 186.17\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 22000000675,\r\n \"Name\": \"Hubba Bubba Chiclets S. W 42g\",\r\n \"Price\": \"3.80\",\r\n \"Units\": 151,\r\n \"Sales\": 474.14,\r\n \"GM\": 183.23\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7790315058201,\r\n \"Name\": \"DNN Villavicencio Sport Agua 750ml\",\r\n \"Price\": \"3.00\",\r\n \"Units\": 138,\r\n \"Sales\": 343.62,\r\n \"GM\": 181.98\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 51,\r\n \"Subcategory\": \"Bebidas Alternativas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7790315058195,\r\n \"Name\": \"DAN Energizante V x 250 ML\",\r\n \"Price\": \"3.75\",\r\n \"Units\": 112,\r\n \"Sales\": 347.2,\r\n \"GM\": 176.34\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77912879,\r\n \"Name\": \"PM Philip Morris KS 20und\",\r\n \"Price\": \"3.43\",\r\n \"Units\": 821,\r\n \"Sales\": 2619.74,\r\n \"GM\": 174.9\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895000447,\r\n \"Name\": \"Sprite Botella 1.5L\",\r\n \"Price\": \"5.50\",\r\n \"Units\": 91,\r\n \"Sales\": 414.96,\r\n \"GM\": 168.59\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895639821,\r\n \"Name\": \"COCA COLA LIGHT F.GRIP 410ML\",\r\n \"Price\": \"2.70\",\r\n \"Units\": 142,\r\n \"Sales\": 319.44,\r\n \"GM\": 168.16\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 8414090200400,\r\n \"Name\": \"Casa Viva\",\r\n \"Price\": \"13.90\",\r\n \"Units\": 12,\r\n \"Sales\": 166.8,\r\n \"GM\": 166.8\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77929877,\r\n \"Name\": \"CAD BELDENT S/A MENTA FUERT\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 361,\r\n \"Sales\": 386.52,\r\n \"GM\": 166.45\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77912954,\r\n \"Name\": \"PM Philip Morris Box 20und\",\r\n \"Price\": \"3.56\",\r\n \"Units\": 719,\r\n \"Sales\": 2385.36,\r\n \"GM\": 165.64\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 203,\r\n \"Subcategory\": \"HOT DOGS/GRILL PROD.\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3022,\r\n \"Name\": \"Hot Dog Grande\",\r\n \"Price\": \"2.50\",\r\n \"Units\": 149,\r\n \"Sales\": 308.23,\r\n \"GM\": 164.01\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 179,\r\n \"Subcategory\": \"NEWSPAPERS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7648,\r\n \"Name\": \"Clarin Dom\",\r\n \"Price\": \"4.80\",\r\n \"Units\": 34,\r\n \"Sales\": 163.2,\r\n \"GM\": 163.2\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 190,\r\n \"Subcategory\": \"ANTIFREEZE ETC.\",\r\n \"Manufacturer\": \"WAGNER BRAKE\",\r\n \"EAN\": 7797409057867,\r\n \"Name\": \"WAG Wagner Lockheed Refrg 1L\",\r\n \"Price\": \"30.33\",\r\n \"Units\": 15,\r\n \"Sales\": 376.05,\r\n \"GM\": 159.48\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310980552,\r\n \"Name\": \"FL Lays Clasicas 50gr\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 221,\r\n \"Sales\": 437.68,\r\n \"GM\": 159.22\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77914217,\r\n \"Name\": \"KR Shot Bloque 35gr\",\r\n \"Price\": \"1.90\",\r\n \"Units\": 250,\r\n \"Sales\": 392.5,\r\n \"GM\": 152.38\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 63,\r\n \"Subcategory\": \"Golosinas a granel\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222041604,\r\n \"Name\": \"BNFD Vizzio Almendra 80gr\",\r\n \"Price\": \"8.14\",\r\n \"Units\": 36,\r\n \"Sales\": 242.11,\r\n \"GM\": 151.03\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770328856009,\r\n \"Name\": \"Gente\",\r\n \"Price\": \"8.30\",\r\n \"Units\": 18,\r\n \"Sales\": 149.4,\r\n \"GM\": 149.4\r\n },\r\n {\r\n \"CategoryId\": 86,\r\n \"Category\": \"Comida Empacada\",\r\n \"SubcategoryId\": 87,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"CANON\",\r\n \"EAN\": 7795947000192,\r\n \"Name\": \"CN CaNon Luneta Gigante J y Q 1u\",\r\n \"Price\": \"6.90\",\r\n \"Units\": 55,\r\n \"Sales\": 313.52,\r\n \"GM\": 149.07\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77953124,\r\n \"Name\": \"Cofler B38gr\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 205,\r\n \"Sales\": 338.59,\r\n \"GM\": 147.97\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 190,\r\n \"Subcategory\": \"ANTIFREEZE ETC.\",\r\n \"Manufacturer\": \"GILIO HERMANOS\",\r\n \"EAN\": 7793735000072,\r\n \"Name\": \"GHN Ros Rig Agua Destilada 5L\",\r\n \"Price\": \"6.86\",\r\n \"Units\": 60,\r\n \"Sales\": 340.41,\r\n \"GM\": 146.61\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300056506,\r\n \"Name\": \"KR Milka Mjoy Almendras 70g\",\r\n \"Price\": \"4.40\",\r\n \"Units\": 97,\r\n \"Sales\": 352.99,\r\n \"GM\": 143.8\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 60,\r\n \"Subcategory\": \"Caramelos en bolsa\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580577001,\r\n \"Name\": \"Sugus Confitados 50gr\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 200,\r\n \"Sales\": 330.23,\r\n \"GM\": 142.68\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 205,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3118,\r\n \"Name\": \"PAMPA TM\",\r\n \"Price\": \"11.50\",\r\n \"Units\": 27,\r\n \"Sales\": 256.52,\r\n \"GM\": 141.46\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 164,\r\n \"Subcategory\": \"BATTERIES\",\r\n \"Manufacturer\": \"ENERGIZER\",\r\n \"EAN\": 39800015464,\r\n \"Name\": \"ENZ Energizer Pila Chica 2AA\",\r\n \"Price\": \"5.50\",\r\n \"Units\": 62,\r\n \"Sales\": 282.08,\r\n \"GM\": 140.98\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910066,\r\n \"Name\": \"Lucky Strike Box 20und\",\r\n \"Price\": \"4.05\",\r\n \"Units\": 517,\r\n \"Sales\": 1947.89,\r\n \"GM\": 138.46\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 207,\r\n \"Subcategory\": \"BAKERY\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3729,\r\n \"Name\": \"Sacramento\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 234,\r\n \"Sales\": 251.04,\r\n \"GM\": 138.26\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 193,\r\n \"Subcategory\": \"OTHER ADDITIVES\",\r\n \"Manufacturer\": \"BARDAHL LUBRICANT\",\r\n \"EAN\": 7790627112561,\r\n \"Name\": \"BRDL TIR 500ml\",\r\n \"Price\": \"15.70\",\r\n \"Units\": 28,\r\n \"Sales\": 363.43,\r\n \"GM\": 137.62\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 209,\r\n \"Subcategory\": \"OTHER CUISINE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3439,\r\n \"Name\": \"EMPANADA POLLO x 1 UNIDAD\",\r\n \"Price\": \"2.60\",\r\n \"Units\": 175,\r\n \"Sales\": 376.25,\r\n \"GM\": 136.88\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 203,\r\n \"Subcategory\": \"HOT DOGS/GRILL PROD.\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3023,\r\n \"Name\": \"Pancho Wall Street\",\r\n \"Price\": \"5.00\",\r\n \"Units\": 52,\r\n \"Sales\": 214.77,\r\n \"GM\": 136.59\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895005312,\r\n \"Name\": \"Coca Cola Light 2.25L\",\r\n \"Price\": \"6.20\",\r\n \"Units\": 67,\r\n \"Sales\": 346.45,\r\n \"GM\": 135.1\r\n },\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 218,\r\n \"Subcategory\": \"HOT CHOCOLATE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2029,\r\n \"Name\": \"Submarino\",\r\n \"Price\": \"6.20\",\r\n \"Units\": 33,\r\n \"Sales\": 169,\r\n \"GM\": 134.02\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895063091,\r\n \"Name\": \"Fanta Naranja 600ml\",\r\n \"Price\": \"3.30\",\r\n \"Units\": 107,\r\n \"Sales\": 292.1,\r\n \"GM\": 132.76\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77927262,\r\n \"Name\": \"CADBELDENTX CARE CONF SPERARMIN\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 162,\r\n \"Sales\": 307.81,\r\n \"GM\": 131.46\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77917843,\r\n \"Name\": \"PM Marlboro Box 10und\",\r\n \"Price\": \"2.03\",\r\n \"Units\": 1017,\r\n \"Sales\": 1925.01,\r\n \"GM\": 130.89\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954055660,\r\n \"Name\": \"SFA Filtros Fram PH-5566\",\r\n \"Price\": \"24.18\",\r\n \"Units\": 12,\r\n \"Sales\": 239.78,\r\n \"GM\": 129.69\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 205,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3112,\r\n \"Name\": \"GAUCHO TM\",\r\n \"Price\": \"11.50\",\r\n \"Units\": 31,\r\n \"Sales\": 294.57,\r\n \"GM\": 128.53\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 190,\r\n \"Subcategory\": \"ANTIFREEZE ETC.\",\r\n \"Manufacturer\": \"REVIGAL\",\r\n \"EAN\": 7790911000307,\r\n \"Name\": \"RVG Lava Parabrisas 580ml\",\r\n \"Price\": \"9.01\",\r\n \"Units\": 43,\r\n \"Sales\": 320.39,\r\n \"GM\": 128.02\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 164,\r\n \"Subcategory\": \"BATTERIES\",\r\n \"Manufacturer\": \"ENERGIZER\",\r\n \"EAN\": 7798087660721,\r\n \"Name\": \"ENZ Energizer Pila Alcalina AA 4\",\r\n \"Price\": \"10.00\",\r\n \"Units\": 32,\r\n \"Sales\": 264.36,\r\n \"GM\": 125.48\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062548310,\r\n \"Name\": \"DNN Ser Agua Plus Citrus 500ml\",\r\n \"Price\": \"3.10\",\r\n \"Units\": 100,\r\n \"Sales\": 256.95,\r\n \"GM\": 124.68\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 63,\r\n \"Subcategory\": \"Golosinas a granel\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7790114014323,\r\n \"Name\": \"KR SHOT TABLETA 200GR\",\r\n \"Price\": \"9.00\",\r\n \"Units\": 40,\r\n \"Sales\": 297.6,\r\n \"GM\": 124.32\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"FELFORT\",\r\n \"EAN\": 77907509,\r\n \"Name\": \"FLFR DOS CORAZONES 26GR\",\r\n \"Price\": \"1.76\",\r\n \"Units\": 211,\r\n \"Sales\": 306.13,\r\n \"GM\": 121.68\r\n },\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 216,\r\n \"Subcategory\": \"COFFEE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2042,\r\n \"Name\": \"Cafe Americano Grande\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 66,\r\n \"Sales\": 190.8,\r\n \"GM\": 121.34\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310981221,\r\n \"Name\": \"FL Twistos Jamon 110g\",\r\n \"Price\": \"4.99\",\r\n \"Units\": 69,\r\n \"Sales\": 284.34,\r\n \"GM\": 121.28\r\n },\r\n {\r\n \"CategoryId\": 86,\r\n \"Category\": \"Comida Empacada\",\r\n \"SubcategoryId\": 87,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"CANON\",\r\n \"EAN\": 7795947001885,\r\n \"Name\": \"CN Canon Roll Peceto\",\r\n \"Price\": \"12.75\",\r\n \"Units\": 30,\r\n \"Sales\": 316.17,\r\n \"GM\": 121.17\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771514607016,\r\n \"Name\": \"Living\",\r\n \"Price\": \"12.00\",\r\n \"Units\": 10,\r\n \"Sales\": 120,\r\n \"GM\": 120\r\n },\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 216,\r\n \"Subcategory\": \"COFFEE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2041,\r\n \"Name\": \"Cafe Americano Chico\",\r\n \"Price\": \"3.30\",\r\n \"Units\": 65,\r\n \"Sales\": 177.39,\r\n \"GM\": 119.03\r\n },\r\n {\r\n \"CategoryId\": 86,\r\n \"Category\": \"Comida Empacada\",\r\n \"SubcategoryId\": 87,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"CANON\",\r\n \"EAN\": 7795947000222,\r\n \"Name\": \"CN CaNon Pebete S y Q 1und\",\r\n \"Price\": \"6.50\",\r\n \"Units\": 44,\r\n \"Sales\": 236.28,\r\n \"GM\": 118.87\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 190,\r\n \"Subcategory\": \"ANTIFREEZE ETC.\",\r\n \"Manufacturer\": \"WAGNER BRAKE\",\r\n \"EAN\": 7797409057881,\r\n \"Name\": \"WAG Wagner Lockh Refrg Anticong 500ml\",\r\n \"Price\": \"17.74\",\r\n \"Units\": 19,\r\n \"Sales\": 278.57,\r\n \"GM\": 118.32\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310980569,\r\n \"Name\": \"FL LAYS CLASICAS 80GRS\",\r\n \"Price\": \"3.90\",\r\n \"Units\": 101,\r\n \"Sales\": 325.24,\r\n \"GM\": 118.19\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910981,\r\n \"Name\": \"Camel Filters Box 20und\",\r\n \"Price\": \"4.04\",\r\n \"Units\": 455,\r\n \"Sales\": 1709.96,\r\n \"GM\": 117.31\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895064302,\r\n \"Name\": \"Cepita Naranja 250ml\",\r\n \"Price\": \"1.70\",\r\n \"Units\": 158,\r\n \"Sales\": 222.77,\r\n \"GM\": 116.03\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062547436,\r\n \"Name\": \"DNN Villa del Sur Agua 1.5L\",\r\n \"Price\": \"3.10\",\r\n \"Units\": 101,\r\n \"Sales\": 259.6,\r\n \"GM\": 115.14\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 208,\r\n \"Subcategory\": \"SOUP & SALAD\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 7795947001984,\r\n \"Name\": \"Ensalada Primavera 200gr\",\r\n \"Price\": \"6.75\",\r\n \"Units\": 70,\r\n \"Sales\": 472.5,\r\n \"GM\": 113.79\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 7791249020067,\r\n \"Name\": \"CAD CADBURY FRUTILLA 27GR\",\r\n \"Price\": \"1.80\",\r\n \"Units\": 163,\r\n \"Sales\": 242.8,\r\n \"GM\": 112.01\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7798085680141,\r\n \"Name\": \"EC Citric Jugo 1 Lt\",\r\n \"Price\": \"5.90\",\r\n \"Units\": 56,\r\n \"Sales\": 273.25,\r\n \"GM\": 111.97\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"FERRERO\",\r\n \"EAN\": 80177609,\r\n \"Name\": \"FRR KINDER CHOCOLATE 50GR\",\r\n \"Price\": \"4.00\",\r\n \"Units\": 89,\r\n \"Sales\": 294.51,\r\n \"GM\": 110.88\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 210,\r\n \"Subcategory\": \"FRENCH FRIES/ WEDGES\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3092,\r\n \"Name\": \"Papas Fritas Baston\",\r\n \"Price\": \"2.90\",\r\n \"Units\": 71,\r\n \"Sales\": 170.33,\r\n \"GM\": 109.5\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7792170061013,\r\n \"Name\": \"Gatorade Sport 600ml Frutas Trop\",\r\n \"Price\": \"5.90\",\r\n \"Units\": 51,\r\n \"Sales\": 248.85,\r\n \"GM\": 109.14\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77971524,\r\n \"Name\": \"CAD BELDENT S/AZUCAR MENTOL TURB\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 235,\r\n \"Sales\": 251.65,\r\n \"GM\": 108.67\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310980576,\r\n \"Name\": \"FL Lays Clasicas 150gr\",\r\n \"Price\": \"5.90\",\r\n \"Units\": 60,\r\n \"Sales\": 292.79,\r\n \"GM\": 105.61\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7791813420118,\r\n \"Name\": \"Pepsi Botella 500ml\",\r\n \"Price\": \"3.10\",\r\n \"Units\": 82,\r\n \"Sales\": 211.56,\r\n \"GM\": 104.86\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7791813423119,\r\n \"Name\": \"Pepsi Pet 2250ml\",\r\n \"Price\": \"5.80\",\r\n \"Units\": 45,\r\n \"Sales\": 217.35,\r\n \"GM\": 103.69\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 63,\r\n \"Subcategory\": \"Golosinas a granel\",\r\n \"Manufacturer\": \"FERRERO\",\r\n \"EAN\": 7861002900117,\r\n \"Name\": \"FRR Ferrero Rocher 100Gr\",\r\n \"Price\": \"12.50\",\r\n \"Units\": 28,\r\n \"Sales\": 289.24,\r\n \"GM\": 103.11\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062548679,\r\n \"Name\": \"DNN Villa del Sur Agua Pomelo 1.5L\",\r\n \"Price\": \"4.90\",\r\n \"Units\": 64,\r\n \"Sales\": 259.89,\r\n \"GM\": 102.75\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 207,\r\n \"Subcategory\": \"BAKERY\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3077,\r\n \"Name\": \"Cuernito Unidad\",\r\n \"Price\": \"0.75\",\r\n \"Units\": 266,\r\n \"Sales\": 164.92,\r\n \"GM\": 102.72\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895067556,\r\n \"Name\": \"Coca Cola Zero 1.5L\",\r\n \"Price\": \"5.50\",\r\n \"Units\": 60,\r\n \"Sales\": 274.2,\r\n \"GM\": 102.35\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 179,\r\n \"Subcategory\": \"NEWSPAPERS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7610,\r\n \"Name\": \"Ajuste Diarios\",\r\n \"Price\": \"0.10\",\r\n \"Units\": 1021,\r\n \"Sales\": 102.1,\r\n \"GM\": 102.1\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310981245,\r\n \"Name\": \"FL Twistos Queso 110g\",\r\n \"Price\": \"4.99\",\r\n \"Units\": 59,\r\n \"Sales\": 243.14,\r\n \"GM\": 101.67\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 40000000518,\r\n \"Name\": \"MAR STARBURST 58,7G\",\r\n \"Price\": \"3.00\",\r\n \"Units\": 105,\r\n \"Sales\": 260.4,\r\n \"GM\": 100.93\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 77922106,\r\n \"Name\": \"Alf Cachafaz Maicena\",\r\n \"Price\": \"2.22\",\r\n \"Units\": 147,\r\n \"Sales\": 270.13,\r\n \"GM\": 100.66\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895000454,\r\n \"Name\": \"Fanta Naranja Botella 1.5L\",\r\n \"Price\": \"5.50\",\r\n \"Units\": 54,\r\n \"Sales\": 246.78,\r\n \"GM\": 100.28\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895640025,\r\n \"Name\": \" Powerade Mountain Blast 0,5 lts\",\r\n \"Price\": \"3.25\",\r\n \"Units\": 93,\r\n \"Sales\": 250.12,\r\n \"GM\": 100\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77935274,\r\n \"Name\": \"Cereal Mix Frutillas Yoghurt\",\r\n \"Price\": \"1.40\",\r\n \"Units\": 227,\r\n \"Sales\": 262.85,\r\n \"GM\": 99.98\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062548709,\r\n \"Name\": \"DNN Villa del Sur Agua Manzana 1.5L\",\r\n \"Price\": \"4.90\",\r\n \"Units\": 65,\r\n \"Sales\": 263.93,\r\n \"GM\": 99.79\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770328430001,\r\n \"Name\": \"Caras\",\r\n \"Price\": \"8.30\",\r\n \"Units\": 12,\r\n \"Sales\": 99.6,\r\n \"GM\": 99.6\r\n },\r\n {\r\n \"CategoryId\": 86,\r\n \"Category\": \"Comida Empacada\",\r\n \"SubcategoryId\": 87,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"CANON\",\r\n \"EAN\": 7795947001915,\r\n \"Name\": \"CN CANON PANINI CAPRESE\",\r\n \"Price\": \"10.25\",\r\n \"Units\": 20,\r\n \"Sales\": 169.4,\r\n \"GM\": 99.2\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 179,\r\n \"Subcategory\": \"NEWSPAPERS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7649,\r\n \"Name\": \"La Nacion Dom\",\r\n \"Price\": \"4.50\",\r\n \"Units\": 22,\r\n \"Sales\": 99,\r\n \"GM\": 99\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"PAULISTA\",\r\n \"EAN\": 77991430,\r\n \"Name\": \"PLT Biznique Nevado 28gr\",\r\n \"Price\": \"1.76\",\r\n \"Units\": 150,\r\n \"Sales\": 218.2,\r\n \"GM\": 98.49\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770328824008,\r\n \"Name\": \"Cosmopolitan\",\r\n \"Price\": \"7.50\",\r\n \"Units\": 13,\r\n \"Sales\": 97.5,\r\n \"GM\": 97.5\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"DON SATUR\",\r\n \"EAN\": 7795735000328,\r\n \"Name\": \"DST Don Satur Bizcocho Salado 20\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 128,\r\n \"Sales\": 243.2,\r\n \"GM\": 96.84\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"FERRERO\",\r\n \"EAN\": 78600010,\r\n \"Name\": \"FRR Tic Tac Menta 16gr\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 191,\r\n \"Sales\": 204.6,\r\n \"GM\": 96.8\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 59,\r\n \"Subcategory\": \"Barras sin chocolate\",\r\n \"Manufacturer\": \"FERRERO\",\r\n \"EAN\": 80052487,\r\n \"Name\": \"FER Raffaello 30g\",\r\n \"Price\": \"3.40\",\r\n \"Units\": 92,\r\n \"Sales\": 258.52,\r\n \"GM\": 96.39\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7790315058225,\r\n \"Name\": \"DNN Ser Vidactiv 715ml\",\r\n \"Price\": \"3.30\",\r\n \"Units\": 77,\r\n \"Sales\": 210.16,\r\n \"GM\": 96.3\r\n },\r\n {\r\n \"CategoryId\": 65,\r\n \"Category\": \"Leches\",\r\n \"SubcategoryId\": 70,\r\n \"Subcategory\": \"FLAVORED MILK\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7793940198007,\r\n \"Name\": \"DNN Cindor Larga Duracion 250ml\",\r\n \"Price\": \"2.37\",\r\n \"Units\": 172,\r\n \"Sales\": 336.93,\r\n \"GM\": 95.27\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 207,\r\n \"Subcategory\": \"BAKERY\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3735,\r\n \"Name\": \"Entrerriano\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 133,\r\n \"Sales\": 142.7,\r\n \"GM\": 95.12\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895064159,\r\n \"Name\": \"Sprite Zero 600ml\",\r\n \"Price\": \"3.30\",\r\n \"Units\": 76,\r\n \"Sales\": 207.47,\r\n \"GM\": 93.59\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895063107,\r\n \"Name\": \"Fanta Naranja Light 600ml\",\r\n \"Price\": \"3.30\",\r\n \"Units\": 74,\r\n \"Sales\": 202.02,\r\n \"GM\": 92.62\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300056483,\r\n \"Name\": \"KR Milka Mjoy Leche 70g\",\r\n \"Price\": \"4.40\",\r\n \"Units\": 61,\r\n \"Sales\": 221.94,\r\n \"GM\": 90.38\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770328438007,\r\n \"Name\": \"Parabrisas\",\r\n \"Price\": \"9.00\",\r\n \"Units\": 10,\r\n \"Sales\": 90,\r\n \"GM\": 90\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222041444,\r\n \"Name\": \"BNFD Bonafide Bocad dulc lech 16G\",\r\n \"Price\": \"0.94\",\r\n \"Units\": 252,\r\n \"Sales\": 196.21,\r\n \"GM\": 87.72\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 207,\r\n \"Subcategory\": \"BAKERY\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3732,\r\n \"Name\": \"Palmerita Con Azucar\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 125,\r\n \"Sales\": 134.04,\r\n \"GM\": 86.74\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 156,\r\n \"Subcategory\": \"PRESERVATIVOS\",\r\n \"Manufacturer\": \"LOC\",\r\n \"EAN\": 7791519200069,\r\n \"Name\": \"LOC Prime Preservativos Textura 3 Un\",\r\n \"Price\": \"4.60\",\r\n \"Units\": 54,\r\n \"Sales\": 205.2,\r\n \"GM\": 86.7\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062548716,\r\n \"Name\": \"DNN Villa del Sur Agua Manzana 500ml\",\r\n \"Price\": \"3.10\",\r\n \"Units\": 69,\r\n \"Sales\": 177.33,\r\n \"GM\": 86.68\r\n },\r\n {\r\n \"CategoryId\": 86,\r\n \"Category\": \"Comida Empacada\",\r\n \"SubcategoryId\": 87,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"CANON\",\r\n \"EAN\": 7795947001892,\r\n \"Name\": \"CN CANON PAN DE CAMPO\",\r\n \"Price\": \"7.25\",\r\n \"Units\": 28,\r\n \"Sales\": 167.73,\r\n \"GM\": 86.53\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 80,\r\n \"Subcategory\": \"YOGURT\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7793940135217,\r\n \"Name\": \"DNN Yogurisimo cereal zucaritas 185gr\",\r\n \"Price\": \"2.48\",\r\n \"Units\": 172,\r\n \"Sales\": 352.21,\r\n \"GM\": 85.98\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770328850007,\r\n \"Name\": \"Para Ti\",\r\n \"Price\": \"7.80\",\r\n \"Units\": 11,\r\n \"Sales\": 85.8,\r\n \"GM\": 85.8\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062548655,\r\n \"Name\": \"DNN Villa del Sur Agua Naranja 500ml\",\r\n \"Price\": \"3.10\",\r\n \"Units\": 69,\r\n \"Sales\": 177.33,\r\n \"GM\": 85.53\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"FERRERO\",\r\n \"EAN\": 80052760,\r\n \"Name\": \"FRR KINDER BUENO 43GR\",\r\n \"Price\": \"4.00\",\r\n \"Units\": 68,\r\n \"Sales\": 224.98,\r\n \"GM\": 84.62\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"BUFFALO\",\r\n \"EAN\": 7795070603154,\r\n \"Name\": \"BFF Buffalo Escobilla C 15 PL 1und\",\r\n \"Price\": \"15.70\",\r\n \"Units\": 15,\r\n \"Sales\": 194.69,\r\n \"GM\": 83.1\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 22000001726,\r\n \"Name\": \"WR WRIGLEYS DOUBLEMINT 15G\",\r\n \"Price\": \"1.70\",\r\n \"Units\": 137,\r\n \"Sales\": 192.02,\r\n \"GM\": 82.74\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 174,\r\n \"Subcategory\": \"SEASONAL\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 7797871983541,\r\n \"Name\": \"TPS Carbon Bolsa Pack 4Kg\",\r\n \"Price\": \"11.00\",\r\n \"Units\": 31,\r\n \"Sales\": 281.79,\r\n \"GM\": 82.17\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77939548,\r\n \"Name\": \"Aguila Hel Barrita 49ml\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 114,\r\n \"Sales\": 216.61,\r\n \"GM\": 82.01\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77916983,\r\n \"Name\": \"CAD Beldent S/Azucar Frutas Roja\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 177,\r\n \"Sales\": 189.54,\r\n \"GM\": 81.91\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"BUFFALO\",\r\n \"EAN\": 7795070000229,\r\n \"Name\": \"BFF Buffalo C 22 1und\",\r\n \"Price\": \"25.40\",\r\n \"Units\": 8,\r\n \"Sales\": 167.92,\r\n \"GM\": 81.68\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"QUILMES\",\r\n \"EAN\": 7792799000011,\r\n \"Name\": \"QLMS Eco de los Andes Agua 500ml\",\r\n \"Price\": \"2.20\",\r\n \"Units\": 94,\r\n \"Sales\": 171.15,\r\n \"GM\": 81.01\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7791813420248,\r\n \"Name\": \"H2OH CITRUS 500ML\",\r\n \"Price\": \"2.60\",\r\n \"Units\": 70,\r\n \"Sales\": 151.19,\r\n \"GM\": 80.91\r\n },\r\n {\r\n \"CategoryId\": 86,\r\n \"Category\": \"Comida Empacada\",\r\n \"SubcategoryId\": 87,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"CANON\",\r\n \"EAN\": 7795947001908,\r\n \"Name\": \"CN CANON PANINI PRIMAVERA\",\r\n \"Price\": \"10.25\",\r\n \"Units\": 20,\r\n \"Sales\": 169.4,\r\n \"GM\": 80.6\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062548648,\r\n \"Name\": \"DNN Villa del Sur Agua Naranja 1.5L\",\r\n \"Price\": \"4.90\",\r\n \"Units\": 51,\r\n \"Sales\": 207.57,\r\n \"GM\": 80.59\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7792170042241,\r\n \"Name\": \"GATORADE PET UVA FIERCE 500CC\",\r\n \"Price\": \"4.90\",\r\n \"Units\": 45,\r\n \"Sales\": 182.25,\r\n \"GM\": 79.27\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 209,\r\n \"Subcategory\": \"OTHER CUISINE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3440,\r\n \"Name\": \"EMPANADA QUESO Y CEBOLLA x 1 U\",\r\n \"Price\": \"2.60\",\r\n \"Units\": 96,\r\n \"Sales\": 206.4,\r\n \"GM\": 79.02\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77913418,\r\n \"Name\": \"PM Philip Morris Box 10und\",\r\n \"Price\": \"1.79\",\r\n \"Units\": 701,\r\n \"Sales\": 1172.42,\r\n \"GM\": 78.61\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7792170002054,\r\n \"Name\": \"Gatorade Manzana 473ml\",\r\n \"Price\": \"4.40\",\r\n \"Units\": 42,\r\n \"Sales\": 152.84,\r\n \"GM\": 77.09\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 22000001733,\r\n \"Name\": \"WR WRIGLEYS JUICY FRUIT 15G\",\r\n \"Price\": \"1.70\",\r\n \"Units\": 125,\r\n \"Sales\": 175.13,\r\n \"GM\": 76.2\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 6520,\r\n \"Name\": \"TPS Bidon de Plastico Und\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 32,\r\n \"Sales\": 92.52,\r\n \"GM\": 75.7\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 191,\r\n \"Subcategory\": \"BRAKE FLUIDS\",\r\n \"Manufacturer\": \"WAGNER BRAKE\",\r\n \"EAN\": 7797409093605,\r\n \"Name\": \"WAG DOT3 Wagner Liq Fren 200ml\",\r\n \"Price\": \"9.00\",\r\n \"Units\": 25,\r\n \"Sales\": 186,\r\n \"GM\": 74.94\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77912701,\r\n \"Name\": \"CAD Halls Caramelos Strong 28G\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 168,\r\n \"Sales\": 166.37,\r\n \"GM\": 74.13\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77925794,\r\n \"Name\": \"MENTHOPL BLIZ SA0.6GMEN\",\r\n \"Price\": \"3.70\",\r\n \"Units\": 61,\r\n \"Sales\": 186.65,\r\n \"GM\": 73.66\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"FERRERO\",\r\n \"EAN\": 78600027,\r\n \"Name\": \"FRR Tic Tac Naranja 16gr\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 145,\r\n \"Sales\": 155.33,\r\n \"GM\": 73.55\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77995162,\r\n \"Name\": \"CAD Beldent S/Azucar Polar 10gr\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 184,\r\n \"Sales\": 182.92,\r\n \"GM\": 73.32\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"GENERAL MILLS ARG\",\r\n \"EAN\": 74570610051,\r\n \"Name\": \"GMA Haagen Pints Belgian Choc 473ml\",\r\n \"Price\": \"23.90\",\r\n \"Units\": 10,\r\n \"Sales\": 197.5,\r\n \"GM\": 73.31\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 40000001607,\r\n \"Name\": \"MAS Skittles Origi Fruit 61.5g\",\r\n \"Price\": \"3.00\",\r\n \"Units\": 76,\r\n \"Sales\": 188.48,\r\n \"GM\": 73.01\r\n },\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 219,\r\n \"Subcategory\": \"CAPPUCC./SPEC.COFFEE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2044,\r\n \"Name\": \"CAFE AMERICANO CAPUCCINO GRANDE\",\r\n \"Price\": \"4.00\",\r\n \"Units\": 32,\r\n \"Sales\": 105.89,\r\n \"GM\": 72.96\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77903792,\r\n \"Name\": \"KR Terrabusi Triple Alfajor 70gr\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 72,\r\n \"Sales\": 136.82,\r\n \"GM\": 72.37\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954677305,\r\n \"Name\": \"SFA Filtros Fram PH-4701\",\r\n \"Price\": \"19.54\",\r\n \"Units\": 8,\r\n \"Sales\": 129.16,\r\n \"GM\": 72\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7791813421528,\r\n \"Name\": \"7 UP 1.5L\",\r\n \"Price\": \"5.40\",\r\n \"Units\": 35,\r\n \"Sales\": 156.8,\r\n \"GM\": 71.96\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"GENERAL MILLS ARG\",\r\n \"EAN\": 3415583272275,\r\n \"Name\": \"GMA Haagen Dazs Dulce de Leche 100ml\",\r\n \"Price\": \"8.50\",\r\n \"Units\": 24,\r\n \"Sales\": 168.53,\r\n \"GM\": 70.94\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 207,\r\n \"Subcategory\": \"BAKERY\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3727,\r\n \"Name\": \"Medialuna De Grasa\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 114,\r\n \"Sales\": 122.33,\r\n \"GM\": 69.89\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"GEORGIA\",\r\n \"EAN\": 7797212000012,\r\n \"Name\": \"GRGA Matafuego Polvo 1kg\",\r\n \"Price\": \"92.00\",\r\n \"Units\": 2,\r\n \"Sales\": 152.06,\r\n \"GM\": 69.77\r\n },\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 216,\r\n \"Subcategory\": \"COFFEE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2064,\r\n \"Name\": \"Cafe Doble Cortado c Leche To Go\",\r\n \"Price\": \"4.70\",\r\n \"Units\": 24,\r\n \"Sales\": 93.14,\r\n \"GM\": 69.47\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 149,\r\n \"Subcategory\": \"ANALGESICOS\",\r\n \"Manufacturer\": \"BAYER\",\r\n \"EAN\": 9802,\r\n \"Name\": \"BY Bayaspirina Tira 10und\",\r\n \"Price\": \"2.51\",\r\n \"Units\": 52,\r\n \"Sales\": 130.5,\r\n \"GM\": 69.26\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770329229000,\r\n \"Name\": \"Pronto Semanal\",\r\n \"Price\": \"4.33\",\r\n \"Units\": 16,\r\n \"Sales\": 69.2,\r\n \"GM\": 69.2\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 7798002419366,\r\n \"Name\": \"CAD BELDENT SPLASH FRUT LIMA 18G\",\r\n \"Price\": \"3.00\",\r\n \"Units\": 84,\r\n \"Sales\": 208.32,\r\n \"GM\": 68.98\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"QUILMES\",\r\n \"EAN\": 7792799000059,\r\n \"Name\": \"QLMS Eco de los Andes Agua 1.5L\",\r\n \"Price\": \"3.20\",\r\n \"Units\": 50,\r\n \"Sales\": 132.96,\r\n \"GM\": 68.53\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"FELFORT\",\r\n \"EAN\": 77909008,\r\n \"Name\": \"FLFR Cereal Fort Fel-F 23gr\",\r\n \"Price\": \"1.50\",\r\n \"Units\": 130,\r\n \"Sales\": 161.2,\r\n \"GM\": 68.53\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77913685,\r\n \"Name\": \"PM Marlboro Light Box 20und\",\r\n \"Price\": \"4.07\",\r\n \"Units\": 243,\r\n \"Sales\": 922.79,\r\n \"GM\": 68.37\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 193,\r\n \"Subcategory\": \"OTHER ADDITIVES\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 77910226,\r\n \"Name\": \"TPS Bardahl Top Adit P/Gas Oil 250ml\",\r\n \"Price\": \"9.40\",\r\n \"Units\": 12,\r\n \"Sales\": 93.24,\r\n \"GM\": 68.25\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954028701,\r\n \"Name\": \"SFA Filtros Fram PH-2870A\",\r\n \"Price\": \"20.59\",\r\n \"Units\": 9,\r\n \"Sales\": 153.19,\r\n \"GM\": 68.01\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770328186007,\r\n \"Name\": \"Dis y Deco\",\r\n \"Price\": \"17.00\",\r\n \"Units\": 4,\r\n \"Sales\": 68,\r\n \"GM\": 68\r\n },\r\n {\r\n \"CategoryId\": 65,\r\n \"Category\": \"Leches\",\r\n \"SubcategoryId\": 70,\r\n \"Subcategory\": \"FLAVORED MILK\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7793940192005,\r\n \"Name\": \"DNN Cindor Larga Duracion 1L\",\r\n \"Price\": \"4.77\",\r\n \"Units\": 63,\r\n \"Sales\": 248.02,\r\n \"GM\": 67.29\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7792170042258,\r\n \"Name\": \"GATORADE PET COOL BLUE 500CC\",\r\n \"Price\": \"4.90\",\r\n \"Units\": 38,\r\n \"Sales\": 153.9,\r\n \"GM\": 67.26\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"GENERAL MILLS ARG\",\r\n \"EAN\": 7797674049420,\r\n \"Name\": \"GMA Nature Valley Almend Tostadas 21g\",\r\n \"Price\": \"1.52\",\r\n \"Units\": 130,\r\n \"Sales\": 162.89,\r\n \"GM\": 67.19\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895640018,\r\n \"Name\": \" Powerade Manzana 0,5 lts\",\r\n \"Price\": \"3.25\",\r\n \"Units\": 57,\r\n \"Sales\": 153.31,\r\n \"GM\": 66.09\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7792170002061,\r\n \"Name\": \"Gatorade Frutas Tropicales 473ml\",\r\n \"Price\": \"4.40\",\r\n \"Units\": 36,\r\n \"Sales\": 131,\r\n \"GM\": 65.98\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"GENERAL MILLS ARG\",\r\n \"EAN\": 74570024001,\r\n \"Name\": \"GMA Haag D Pints Strawberry 473ml\",\r\n \"Price\": \"23.90\",\r\n \"Units\": 9,\r\n \"Sales\": 177.75,\r\n \"GM\": 65.79\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310980774,\r\n \"Name\": \"FL 3D MEGA QUESO 85G\",\r\n \"Price\": \"3.90\",\r\n \"Units\": 56,\r\n \"Sales\": 180.36,\r\n \"GM\": 65.56\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7791813420521,\r\n \"Name\": \"7 UP Botella 500ml\",\r\n \"Price\": \"3.10\",\r\n \"Units\": 53,\r\n \"Sales\": 136.21,\r\n \"GM\": 65.54\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 7798002419380,\r\n \"Name\": \"CAD BELDENT SPLASH MANZFRAM 18G\",\r\n \"Price\": \"3.00\",\r\n \"Units\": 81,\r\n \"Sales\": 200.88,\r\n \"GM\": 65.54\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"BUFFALO\",\r\n \"EAN\": 7795070303719,\r\n \"Name\": \"BFF Buffalo Escobilla C 17 PL 1und\",\r\n \"Price\": \"15.30\",\r\n \"Units\": 16,\r\n \"Sales\": 202.26,\r\n \"GM\": 65.27\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"DON SATUR\",\r\n \"EAN\": 7795735000335,\r\n \"Name\": \"DST Don Satur Bizcocho Dulce 200\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 84,\r\n \"Sales\": 159.6,\r\n \"GM\": 65.23\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"JORGITO\",\r\n \"EAN\": 77905741,\r\n \"Name\": \"JRG Jorgito Alfajor Chocolate 55\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 151,\r\n \"Sales\": 161.9,\r\n \"GM\": 65.14\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77912732,\r\n \"Name\": \"CAD HALLS CHERRY-IYPTUS 28GR\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 147,\r\n \"Sales\": 145.54,\r\n \"GM\": 64.81\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77916525,\r\n \"Name\": \"Cereal Mix Chocolate 23gr\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 153,\r\n \"Sales\": 163.99,\r\n \"GM\": 64.55\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 59,\r\n \"Subcategory\": \"Barras sin chocolate\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222041055,\r\n \"Name\": \"BNFD NUGATON LECHE 27GR\",\r\n \"Price\": \"1.21\",\r\n \"Units\": 130,\r\n \"Sales\": 130.02,\r\n \"GM\": 63.94\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300056568,\r\n \"Name\": \"KR Milka Mjoy Choc Crunchy 70g\",\r\n \"Price\": \"4.40\",\r\n \"Units\": 43,\r\n \"Sales\": 156.49,\r\n \"GM\": 63.78\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"FELFORT\",\r\n \"EAN\": 77922267,\r\n \"Name\": \"FLFR Refresco 38gr\",\r\n \"Price\": \"1.50\",\r\n \"Units\": 132,\r\n \"Sales\": 163.68,\r\n \"GM\": 63.59\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 156,\r\n \"Subcategory\": \"PRESERVATIVOS\",\r\n \"Manufacturer\": \"BUHL\",\r\n \"EAN\": 7791519200021,\r\n \"Name\": \"BUHL Prime Anatomico 3u\",\r\n \"Price\": \"4.84\",\r\n \"Units\": 35,\r\n \"Sales\": 140,\r\n \"GM\": 63.34\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771514001005,\r\n \"Name\": \"Auto Test\",\r\n \"Price\": \"7.90\",\r\n \"Units\": 8,\r\n \"Sales\": 63.2,\r\n \"GM\": 63.2\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300179434,\r\n \"Name\": \"SHOT CRUNCHY 35G\",\r\n \"Price\": \"1.90\",\r\n \"Units\": 106,\r\n \"Sales\": 166.42,\r\n \"GM\": 63.17\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"UNILEVER\",\r\n \"EAN\": 7794000730014,\r\n \"Name\": \"UNI Ades Manzana 1L\",\r\n \"Price\": \"5.30\",\r\n \"Units\": 34,\r\n \"Sales\": 149.26,\r\n \"GM\": 62.92\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040931206,\r\n \"Name\": \"BGLY Sonrisas Nutrileche Framb x 118g\",\r\n \"Price\": \"2.70\",\r\n \"Units\": 67,\r\n \"Sales\": 149.41,\r\n \"GM\": 62.81\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300108892,\r\n \"Name\": \"KR PEPITOS CHOCOLATE 126G\",\r\n \"Price\": \"2.50\",\r\n \"Units\": 66,\r\n \"Sales\": 136.59,\r\n \"GM\": 62.77\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77925817,\r\n \"Name\": \"Menthoplus Bliz s Az Mentol\",\r\n \"Price\": \"3.70\",\r\n \"Units\": 53,\r\n \"Sales\": 162.18,\r\n \"GM\": 62.56\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77916112,\r\n \"Name\": \"KR Milka Leger Almendras 45gr\",\r\n \"Price\": \"3.00\",\r\n \"Units\": 68,\r\n \"Sales\": 168.63,\r\n \"GM\": 62.47\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77930002,\r\n \"Name\": \"Bon o Bon Leche 17gr\",\r\n \"Price\": \"0.70\",\r\n \"Units\": 280,\r\n \"Sales\": 162.29,\r\n \"GM\": 61.93\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895064173,\r\n \"Name\": \"Sprite Zero 1.5L\",\r\n \"Price\": \"5.50\",\r\n \"Units\": 34,\r\n \"Sales\": 156.44,\r\n \"GM\": 61.82\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7791813423522,\r\n \"Name\": \"7Up Pet 2250\",\r\n \"Price\": \"5.80\",\r\n \"Units\": 34,\r\n \"Sales\": 163.54,\r\n \"GM\": 61.17\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7792170042135,\r\n \"Name\": \"Gatorade Propel Limon 0.5Lts\",\r\n \"Price\": \"4.90\",\r\n \"Units\": 32,\r\n \"Sales\": 129.6,\r\n \"GM\": 61.13\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 207,\r\n \"Subcategory\": \"BAKERY\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3702,\r\n \"Name\": \"MUFFIN CHOCOLATE\",\r\n \"Price\": \"2.60\",\r\n \"Units\": 67,\r\n \"Sales\": 144.05,\r\n \"GM\": 61\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77927255,\r\n \"Name\": \"CAD BELDENT X CARE CONF MENTA\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 75,\r\n \"Sales\": 142.5,\r\n \"GM\": 60.9\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77905291,\r\n \"Name\": \"CAD STANI MIEL CON MENTA 28GR\",\r\n \"Price\": \"1.10\",\r\n \"Units\": 166,\r\n \"Sales\": 151.06,\r\n \"GM\": 60.84\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 37634136744,\r\n \"Name\": \"National Geographic\",\r\n \"Price\": \"7.50\",\r\n \"Units\": 8,\r\n \"Sales\": 60,\r\n \"GM\": 60\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77950031,\r\n \"Name\": \"COFLER CHOC LECH MANI BLOCK\",\r\n \"Price\": \"5.30\",\r\n \"Units\": 32,\r\n \"Sales\": 140.16,\r\n \"GM\": 59.96\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 205,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 5037,\r\n \"Name\": \"Panino J&Q TM\",\r\n \"Price\": \"7.00\",\r\n \"Units\": 17,\r\n \"Sales\": 98.4,\r\n \"GM\": 59.74\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7790017400001,\r\n \"Name\": \"Tropicana Naranja 200ml\",\r\n \"Price\": \"1.60\",\r\n \"Units\": 86,\r\n \"Sales\": 114.38,\r\n \"GM\": 59.6\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770329565016,\r\n \"Name\": \"Rolling Stone\",\r\n \"Price\": \"8.50\",\r\n \"Units\": 7,\r\n \"Sales\": 59.5,\r\n \"GM\": 59.5\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7794600009435,\r\n \"Name\": \"KR Oreo 111gr\",\r\n \"Price\": \"2.50\",\r\n \"Units\": 71,\r\n \"Sales\": 146.9,\r\n \"GM\": 58.83\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 179,\r\n \"Subcategory\": \"NEWSPAPERS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7633,\r\n \"Name\": \"LA NACION VIERNES\",\r\n \"Price\": \"2.10\",\r\n \"Units\": 28,\r\n \"Sales\": 58.8,\r\n \"GM\": 58.8\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7891455313370,\r\n \"Name\": \"SFA Filtros Fram PH-4967\",\r\n \"Price\": \"62.37\",\r\n \"Units\": 2,\r\n \"Sales\": 103.1,\r\n \"GM\": 58.4\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062548303,\r\n \"Name\": \"DNN AGUA SER PLUS CITRUS 1.5 L\",\r\n \"Price\": \"4.90\",\r\n \"Units\": 32,\r\n \"Sales\": 129.92,\r\n \"GM\": 58.02\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77955272,\r\n \"Name\": \"Arcor Ser Alf Dulce Leche 42gr\",\r\n \"Price\": \"1.80\",\r\n \"Units\": 95,\r\n \"Sales\": 141.5,\r\n \"GM\": 57.88\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7792170042005,\r\n \"Name\": \"GATORADE PET MAN. 500CC\",\r\n \"Price\": \"4.90\",\r\n \"Units\": 33,\r\n \"Sales\": 133.65,\r\n \"GM\": 57.87\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 207,\r\n \"Subcategory\": \"BAKERY\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3736,\r\n \"Name\": \"MUFFIN VAINILLA Y DDL\",\r\n \"Price\": \"2.60\",\r\n \"Units\": 65,\r\n \"Sales\": 139.75,\r\n \"GM\": 57.81\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300190361,\r\n \"Name\": \"KR EXPR CAPRICH PARMALBAH 100G\",\r\n \"Price\": \"2.90\",\r\n \"Units\": 64,\r\n \"Sales\": 153.59,\r\n \"GM\": 57.56\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77914064,\r\n \"Name\": \"PM Marlboro Box 16und\",\r\n \"Price\": \"3.30\",\r\n \"Units\": 256,\r\n \"Sales\": 787.57,\r\n \"GM\": 57.5\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310979921,\r\n \"Name\": \"FL LAYS MEDI JAM SERRANO 65GR\",\r\n \"Price\": \"3.90\",\r\n \"Units\": 49,\r\n \"Sales\": 157.79,\r\n \"GM\": 57.34\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"CADBURYADAMS\",\r\n \"EAN\": 7791249997048,\r\n \"Name\": \"CAD CADBURY YOGURT AIREADO 50G\",\r\n \"Price\": \"4.50\",\r\n \"Units\": 37,\r\n \"Sales\": 137.64,\r\n \"GM\": 57.05\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770329219001,\r\n \"Name\": \"Mega Autos\",\r\n \"Price\": \"9.50\",\r\n \"Units\": 6,\r\n \"Sales\": 57,\r\n \"GM\": 57\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062548785,\r\n \"Name\": \"DDNN SER SPORT MANZANA 600ML\",\r\n \"Price\": \"4.16\",\r\n \"Units\": 41,\r\n \"Sales\": 140.86,\r\n \"GM\": 56.56\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 164,\r\n \"Subcategory\": \"BATTERIES\",\r\n \"Manufacturer\": \"ENERGIZER\",\r\n \"EAN\": 39800013613,\r\n \"Name\": \"ENZ Energizer Bateria 9 Voltios\",\r\n \"Price\": \"9.50\",\r\n \"Units\": 15,\r\n \"Sales\": 117.76,\r\n \"GM\": 56.41\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895001369,\r\n \"Name\": \"Quatro Botella 500ml\",\r\n \"Price\": \"3.30\",\r\n \"Units\": 44,\r\n \"Sales\": 120.12,\r\n \"GM\": 56.14\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77926470,\r\n \"Name\": \"CAD BELDENT X CARE COOL BUBBLE\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 118,\r\n \"Sales\": 126.36,\r\n \"GM\": 56.14\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"JORGITO\",\r\n \"EAN\": 77901729,\r\n \"Name\": \"JRG Jorgelin Maxialfajor Negro 85gr\",\r\n \"Price\": \"1.90\",\r\n \"Units\": 94,\r\n \"Sales\": 147.58,\r\n \"GM\": 56.08\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580395803,\r\n \"Name\": \"Arcor Cofler Almendras 80ml\",\r\n \"Price\": \"4.00\",\r\n \"Units\": 45,\r\n \"Sales\": 148.94,\r\n \"GM\": 56\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062548372,\r\n \"Name\": \"DNN Ser Agua Plus Naranja Dur 0.5L\",\r\n \"Price\": \"3.10\",\r\n \"Units\": 44,\r\n \"Sales\": 113.08,\r\n \"GM\": 55.97\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771139529007,\r\n \"Name\": \"Casa y Campo\",\r\n \"Price\": \"13.90\",\r\n \"Units\": 4,\r\n \"Sales\": 55.6,\r\n \"GM\": 55.6\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 7791249010730,\r\n \"Name\": \"CAD Cadbury Tres Suenos 24gr\",\r\n \"Price\": \"1.80\",\r\n \"Units\": 81,\r\n \"Sales\": 120.61,\r\n \"GM\": 55.59\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"MARS\",\r\n \"EAN\": 7896423421507,\r\n \"Name\": \"MARS MM Mani 40 Gr\",\r\n \"Price\": \"2.80\",\r\n \"Units\": 58,\r\n \"Sales\": 134.07,\r\n \"GM\": 55.57\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"TIA MARUCA\",\r\n \"EAN\": 7798082741098,\r\n \"Name\": \"TM Tia Maruca Fajitas 150gr\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 45,\r\n \"Sales\": 130.07,\r\n \"GM\": 55.43\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 156,\r\n \"Subcategory\": \"PRESERVATIVOS\",\r\n \"Manufacturer\": \"BUHL\",\r\n \"EAN\": 7791519200076,\r\n \"Name\": \"BUHL Prime Esper 3u\",\r\n \"Price\": \"4.78\",\r\n \"Units\": 31,\r\n \"Sales\": 122.55,\r\n \"GM\": 55.37\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770329832002,\r\n \"Name\": \"Veintitres\",\r\n \"Price\": \"6.90\",\r\n \"Units\": 8,\r\n \"Sales\": 55.2,\r\n \"GM\": 55.2\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 60,\r\n \"Subcategory\": \"Caramelos en bolsa\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580055806,\r\n \"Name\": \"Sugus Evolution 50 gr\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 75,\r\n \"Sales\": 123.83,\r\n \"GM\": 55.06\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7792170002009,\r\n \"Name\": \"Gatorade Pomelo 473ml\",\r\n \"Price\": \"4.40\",\r\n \"Units\": 30,\r\n \"Sales\": 109.2,\r\n \"GM\": 54.93\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7791813421115,\r\n \"Name\": \"Pepsi Cola 1.5L\",\r\n \"Price\": \"5.40\",\r\n \"Units\": 29,\r\n \"Sales\": 130.5,\r\n \"GM\": 54.7\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 78916401,\r\n \"Name\": \"PRO Mentos Fruit 29.7Gr\",\r\n \"Price\": \"1.40\",\r\n \"Units\": 110,\r\n \"Sales\": 127.51,\r\n \"GM\": 54.68\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"GENERAL MILLS ARG\",\r\n \"EAN\": 3415581533279,\r\n \"Name\": \"GMA Haagen Dazs Belgian Choco 100ml\",\r\n \"Price\": \"8.50\",\r\n \"Units\": 22,\r\n \"Sales\": 154.44,\r\n \"GM\": 54.55\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77935144,\r\n \"Name\": \"Cereal Mix Vain Yogurt 28g\",\r\n \"Price\": \"1.40\",\r\n \"Units\": 123,\r\n \"Sales\": 142.43,\r\n \"GM\": 54.46\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895001345,\r\n \"Name\": \"Quatro Botella 1.5L\",\r\n \"Price\": \"5.50\",\r\n \"Units\": 29,\r\n \"Sales\": 132.53,\r\n \"GM\": 54.18\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 8480002029049,\r\n \"Name\": \"El Mueble\",\r\n \"Price\": \"13.50\",\r\n \"Units\": 4,\r\n \"Sales\": 54,\r\n \"GM\": 54\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"BUFFALO\",\r\n \"EAN\": 7795070503140,\r\n \"Name\": \"BFF Buffalo Escobilla C 14 PLUS 1und\",\r\n \"Price\": \"15.40\",\r\n \"Units\": 10,\r\n \"Sales\": 127.3,\r\n \"GM\": 53.94\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 1111,\r\n \"Name\": \"Cabsha Bocadito 10gr\",\r\n \"Price\": \"0.60\",\r\n \"Units\": 223,\r\n \"Sales\": 110.93,\r\n \"GM\": 53.56\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 59,\r\n \"Subcategory\": \"Barras sin chocolate\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77995681,\r\n \"Name\": \"KR Rhodesia 22gr\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 153,\r\n \"Sales\": 126.57,\r\n \"GM\": 53.25\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062547801,\r\n \"Name\": \"DNN Villavicencio Agua Gas 500ml\",\r\n \"Price\": \"2.70\",\r\n \"Units\": 48,\r\n \"Sales\": 107.52,\r\n \"GM\": 53.12\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"QUILMES\",\r\n \"EAN\": 7792799005184,\r\n \"Name\": \"QLMS AGUA NESTL� POMELO 1500CC\",\r\n \"Price\": \"4.40\",\r\n \"Units\": 27,\r\n \"Sales\": 98.55,\r\n \"GM\": 53.03\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77900173,\r\n \"Name\": \"CAD Beldent S/Azucar Mentol 10gr\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 114,\r\n \"Sales\": 122.09,\r\n \"GM\": 52.86\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222003510,\r\n \"Name\": \"BNF DRF LATA MENTA 20G\",\r\n \"Price\": \"3.02\",\r\n \"Units\": 60,\r\n \"Sales\": 149.63,\r\n \"GM\": 52.79\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 59,\r\n \"Subcategory\": \"Barras sin chocolate\",\r\n \"Manufacturer\": \"INTERLINK\",\r\n \"EAN\": 7790095070134,\r\n \"Name\": \"ITLK Vauquita 25gr\",\r\n \"Price\": \"1.16\",\r\n \"Units\": 202,\r\n \"Sales\": 194.04,\r\n \"GM\": 52.7\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77929891,\r\n \"Name\": \"PM Parliament RC Box 20\",\r\n \"Price\": \"4.32\",\r\n \"Units\": 199,\r\n \"Sales\": 797.62,\r\n \"GM\": 52.62\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"QUILMES\",\r\n \"EAN\": 7792799005177,\r\n \"Name\": \"QLMS AGUA NESTL� POMELO 500CC\",\r\n \"Price\": \"2.50\",\r\n \"Units\": 45,\r\n \"Sales\": 93.16,\r\n \"GM\": 52.29\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7794600002047,\r\n \"Name\": \"KR Variedad Chocolate 300gr\",\r\n \"Price\": \"3.90\",\r\n \"Units\": 38,\r\n \"Sales\": 122.36,\r\n \"GM\": 52.1\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77917010,\r\n \"Name\": \"CAD Beldent Fruta Verdes\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 112,\r\n \"Sales\": 119.92,\r\n \"GM\": 51.92\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7790017405006,\r\n \"Name\": \"Tropicana Naranja 1L\",\r\n \"Price\": \"4.40\",\r\n \"Units\": 37,\r\n \"Sales\": 135.05,\r\n \"GM\": 51.9\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"BRITISH AMERICAN\",\r\n \"EAN\": 77910646,\r\n \"Name\": \"LUCKY STRIKE BOX 10UND\",\r\n \"Price\": \"2.02\",\r\n \"Units\": 375,\r\n \"Sales\": 708,\r\n \"GM\": 51.39\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310980125,\r\n \"Name\": \"FL PEP PALITOS SALADOS 90GR\",\r\n \"Price\": \"2.20\",\r\n \"Units\": 79,\r\n \"Sales\": 143.78,\r\n \"GM\": 51.35\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"GENERAL MILLS ARG\",\r\n \"EAN\": 74570274000,\r\n \"Name\": \"GMA Haagen Pints Cookies&Cream 473ml\",\r\n \"Price\": \"23.90\",\r\n \"Units\": 7,\r\n \"Sales\": 138.25,\r\n \"GM\": 51.28\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"GEORGALOS\",\r\n \"EAN\": 1185,\r\n \"Name\": \"GEO Tokke Lec Mani 9g\",\r\n \"Price\": \"0.60\",\r\n \"Units\": 206,\r\n \"Sales\": 102.57,\r\n \"GM\": 51.07\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 179,\r\n \"Subcategory\": \"NEWSPAPERS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771514965000,\r\n \"Name\": \"Clarin Sabado\",\r\n \"Price\": \"2.21\",\r\n \"Units\": 23,\r\n \"Sales\": 50.9,\r\n \"GM\": 50.9\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 80,\r\n \"Subcategory\": \"YOGURT\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7793940133732,\r\n \"Name\": \"DNN Ser Cereales Crons flakes 183gr\",\r\n \"Price\": \"2.36\",\r\n \"Units\": 96,\r\n \"Sales\": 187.49,\r\n \"GM\": 50.87\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 63,\r\n \"Subcategory\": \"Golosinas a granel\",\r\n \"Manufacturer\": \"FELFORT\",\r\n \"EAN\": 7790206502400,\r\n \"Name\": \"FLFR MARROC BOMBON 198GR\",\r\n \"Price\": \"18.14\",\r\n \"Units\": 7,\r\n \"Sales\": 104.94,\r\n \"GM\": 50.54\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580327415,\r\n \"Name\": \"Arcor Rocklets Chocolate 40gr\",\r\n \"Price\": \"1.80\",\r\n \"Units\": 81,\r\n \"Sales\": 120.66,\r\n \"GM\": 50.12\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222040980,\r\n \"Name\": \"BNFD Mecano 19gr\",\r\n \"Price\": \"1.23\",\r\n \"Units\": 102,\r\n \"Sales\": 103.21,\r\n \"GM\": 49.97\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77903860,\r\n \"Name\": \"KR Terrabusi Torta Deli Alfajor 70gr\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 49,\r\n \"Sales\": 93.1,\r\n \"GM\": 49.92\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"QUILMES\",\r\n \"EAN\": 7792799005252,\r\n \"Name\": \"QLMS NPV Manzana 500ml\",\r\n \"Price\": \"2.50\",\r\n \"Units\": 42,\r\n \"Sales\": 86.96,\r\n \"GM\": 49.47\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910585,\r\n \"Name\": \"Gitanes Blondes Box 20und\",\r\n \"Price\": \"4.06\",\r\n \"Units\": 196,\r\n \"Sales\": 740.33,\r\n \"GM\": 49.36\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7792170002856,\r\n \"Name\": \"Gatorade Manzana 946ml\",\r\n \"Price\": \"6.50\",\r\n \"Units\": 20,\r\n \"Sales\": 107.4,\r\n \"GM\": 49.17\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310980903,\r\n \"Name\": \"FL CHEETOS CLASSIC 85G\",\r\n \"Price\": \"3.90\",\r\n \"Units\": 42,\r\n \"Sales\": 135.24,\r\n \"GM\": 49.14\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 205,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"AMSOUTHFOOD\",\r\n \"EAN\": 5052,\r\n \"Name\": \"SALTENO DE POLLO\",\r\n \"Price\": \"11.30\",\r\n \"Units\": 8,\r\n \"Sales\": 74.72,\r\n \"GM\": 49.09\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300094041,\r\n \"Name\": \"KR CLUB SOCIAL CHIPS PARMES 120G\",\r\n \"Price\": \"5.10\",\r\n \"Units\": 26,\r\n \"Sales\": 109.47,\r\n \"GM\": 49\r\n },\r\n {\r\n \"CategoryId\": 134,\r\n \"Category\": \"Almacen\",\r\n \"SubcategoryId\": 135,\r\n \"Subcategory\": \"CAFE Y TE\",\r\n \"Manufacturer\": \"QUIMICA ESTRELLA\",\r\n \"EAN\": 7791445001013,\r\n \"Name\": \"QE Cruz de Malta Yerba 500gr\",\r\n \"Price\": \"5.01\",\r\n \"Units\": 22,\r\n \"Sales\": 91.08,\r\n \"GM\": 48.91\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"BUFFALO\",\r\n \"EAN\": 7795070403136,\r\n \"Name\": \"BFF Buffalo Escobilla C 13 1und\",\r\n \"Price\": \"14.20\",\r\n \"Units\": 11,\r\n \"Sales\": 129.14,\r\n \"GM\": 48.84\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 191,\r\n \"Subcategory\": \"BRAKE FLUIDS\",\r\n \"Manufacturer\": \"WAGNER BRAKE\",\r\n \"EAN\": 7797409411140,\r\n \"Name\": \"WAG DOT1 Wagner Liq Fren 1L\",\r\n \"Price\": \"33.00\",\r\n \"Units\": 4,\r\n \"Sales\": 109.09,\r\n \"GM\": 48.77\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77916105,\r\n \"Name\": \"KR Milka Leger Leche 45gr\",\r\n \"Price\": \"3.00\",\r\n \"Units\": 53,\r\n \"Sales\": 131.44,\r\n \"GM\": 48.72\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040298705,\r\n \"Name\": \"Aguila Alfajor Mini Torta 72\",\r\n \"Price\": \"2.20\",\r\n \"Units\": 58,\r\n \"Sales\": 105.56,\r\n \"GM\": 48.63\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77933478,\r\n \"Name\": \"COFLER BCO COOKIES 28 GS\",\r\n \"Price\": \"1.40\",\r\n \"Units\": 103,\r\n \"Sales\": 119.32,\r\n \"GM\": 48.57\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040996403,\r\n \"Name\": \"BGLY Bagley Alfajor B&N Blanco 50g\",\r\n \"Price\": \"1.80\",\r\n \"Units\": 79,\r\n \"Sales\": 117.71,\r\n \"GM\": 48.19\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580395704,\r\n \"Name\": \"Aguila Hel Mini Torta 80ml\",\r\n \"Price\": \"3.00\",\r\n \"Units\": 48,\r\n \"Sales\": 119.04,\r\n \"GM\": 48.18\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77912725,\r\n \"Name\": \"CAD Halls Menthol-Lyptus 28gr\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 109,\r\n \"Sales\": 107.92,\r\n \"GM\": 48.03\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 193,\r\n \"Subcategory\": \"OTHER ADDITIVES\",\r\n \"Manufacturer\": \"BARDAHL LUBRICANT\",\r\n \"EAN\": 7790627101329,\r\n \"Name\": \"BRDL Limpia Inyector Nafta Adit 250ml\",\r\n \"Price\": \"11.50\",\r\n \"Units\": 13,\r\n \"Sales\": 123.51,\r\n \"GM\": 47.71\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 205,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"AMSOUTHFOOD\",\r\n \"EAN\": 5051,\r\n \"Name\": \"SALTENO DE CARNE\",\r\n \"Price\": \"11.30\",\r\n \"Units\": 9,\r\n \"Sales\": 84.06,\r\n \"GM\": 47.68\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310001417,\r\n \"Name\": \"FL Pehuamar Palitos c Queso 200g\",\r\n \"Price\": \"4.00\",\r\n \"Units\": 23,\r\n \"Sales\": 76.13,\r\n \"GM\": 47.61\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7792170042234,\r\n \"Name\": \"GATORADE PET BERRY FIERCE 500CC\",\r\n \"Price\": \"4.90\",\r\n \"Units\": 27,\r\n \"Sales\": 109.35,\r\n \"GM\": 47.39\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300190330,\r\n \"Name\": \"KR CEREALITA CAPRICHOS 5 CEREAL\",\r\n \"Price\": \"2.90\",\r\n \"Units\": 54,\r\n \"Sales\": 129.59,\r\n \"GM\": 47.37\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"TIA MARUCA\",\r\n \"EAN\": 7798082740169,\r\n \"Name\": \"TM Galleta Pepas 250G\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 37,\r\n \"Sales\": 106.93,\r\n \"GM\": 47.3\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910325,\r\n \"Name\": \"Parisienes Filtre KS 20und\",\r\n \"Price\": \"3.78\",\r\n \"Units\": 192,\r\n \"Sales\": 674.18,\r\n \"GM\": 47.27\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 63,\r\n \"Subcategory\": \"Golosinas a granel\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622400991929,\r\n \"Name\": \"KR MILKA I LOVE PRALINES LEC\",\r\n \"Price\": \"19.00\",\r\n \"Units\": 8,\r\n \"Sales\": 125.6,\r\n \"GM\": 47.2\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895064319,\r\n \"Name\": \"Cepita Manzana 250ml\",\r\n \"Price\": \"1.70\",\r\n \"Units\": 63,\r\n \"Sales\": 88.83,\r\n \"GM\": 47.05\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7791813420491,\r\n \"Name\": \"7 UP Light 500ml\",\r\n \"Price\": \"3.10\",\r\n \"Units\": 38,\r\n \"Sales\": 97.66,\r\n \"GM\": 46.82\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895067990,\r\n \"Name\": \"Fanta Mandarina 600ml\",\r\n \"Price\": \"3.30\",\r\n \"Units\": 37,\r\n \"Sales\": 101.75,\r\n \"GM\": 46.8\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895639807,\r\n \"Name\": \"COCA COLA ZERO F.GRIP 410ML\",\r\n \"Price\": \"2.70\",\r\n \"Units\": 39,\r\n \"Sales\": 87.74,\r\n \"GM\": 46.6\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 28400055154,\r\n \"Name\": \"FL Lays Stax Onion 155Gr\",\r\n \"Price\": \"9.50\",\r\n \"Units\": 17,\r\n \"Sales\": 133.45,\r\n \"GM\": 46.58\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 59,\r\n \"Subcategory\": \"Barras sin chocolate\",\r\n \"Manufacturer\": \"INTERLINK\",\r\n \"EAN\": 77927361,\r\n \"Name\": \"ITLK Vauquita Light 25gr\",\r\n \"Price\": \"1.29\",\r\n \"Units\": 141,\r\n \"Sales\": 150.22,\r\n \"GM\": 46.53\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895640032,\r\n \"Name\": \" Powerade Naranja 0,5 lts\",\r\n \"Price\": \"3.25\",\r\n \"Units\": 36,\r\n \"Sales\": 96.77,\r\n \"GM\": 46.38\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770505014000,\r\n \"Name\": \"Vanidades\",\r\n \"Price\": \"6.61\",\r\n \"Units\": 7,\r\n \"Sales\": 46.3,\r\n \"GM\": 46.3\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7792170002016,\r\n \"Name\": \"Gatorade Naranja 473ml\",\r\n \"Price\": \"4.40\",\r\n \"Units\": 25,\r\n \"Sales\": 90.99,\r\n \"GM\": 46.29\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 156,\r\n \"Subcategory\": \"PRESERVATIVOS\",\r\n \"Manufacturer\": \"LOC\",\r\n \"EAN\": 7791519200045,\r\n \"Name\": \"BUHL Prime Extrafino 3u\",\r\n \"Price\": \"4.79\",\r\n \"Units\": 25,\r\n \"Sales\": 99,\r\n \"GM\": 46.2\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7790114015191,\r\n \"Name\": \"KR Milka Leger Almendras 100g\",\r\n \"Price\": \"5.20\",\r\n \"Units\": 27,\r\n \"Sales\": 116.1,\r\n \"GM\": 45.95\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"FELFORT\",\r\n \"EAN\": 77909039,\r\n \"Name\": \"FLFR CEREAL FORT FEL-F GRANRICO\",\r\n \"Price\": \"1.50\",\r\n \"Units\": 85,\r\n \"Sales\": 105.4,\r\n \"GM\": 45.88\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 80,\r\n \"Subcategory\": \"YOGURT\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7793940102882,\r\n \"Name\": \"DNN Ser Colchon Frutilla 190gr\",\r\n \"Price\": \"2.47\",\r\n \"Units\": 81,\r\n \"Sales\": 165.1,\r\n \"GM\": 45.85\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300057091,\r\n \"Name\": \"KR Milka Mjoy Castanas 70gr\",\r\n \"Price\": \"3.60\",\r\n \"Units\": 55,\r\n \"Sales\": 163.86,\r\n \"GM\": 45.32\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"GENERAL MILLS ARG\",\r\n \"EAN\": 3415586405007,\r\n \"Name\": \"GMA HAAGEN DAZS VAINI&ALMON 90ML\",\r\n \"Price\": \"8.50\",\r\n \"Units\": 18,\r\n \"Sales\": 126.37,\r\n \"GM\": 45.09\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77916136,\r\n \"Name\": \"KR Milka Leger Blanco 45gr\",\r\n \"Price\": \"3.00\",\r\n \"Units\": 49,\r\n \"Sales\": 121.52,\r\n \"GM\": 45\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771514735009,\r\n \"Name\": \"Elle Argentina\",\r\n \"Price\": \"7.50\",\r\n \"Units\": 6,\r\n \"Sales\": 45,\r\n \"GM\": 45\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77936271,\r\n \"Name\": \"Barra Cereal Ser Frutilla\",\r\n \"Price\": \"1.70\",\r\n \"Units\": 81,\r\n \"Sales\": 113.59,\r\n \"GM\": 44.94\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"MOLINO CANUELAS\",\r\n \"EAN\": 7792200000159,\r\n \"Name\": \"MLC 9 de Oro Bizcocho 200gr\",\r\n \"Price\": \"2.60\",\r\n \"Units\": 49,\r\n \"Sales\": 105.35,\r\n \"GM\": 44.9\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222041673,\r\n \"Name\": \"BNFD Bonafide Choc Crocante 25g\",\r\n \"Price\": \"1.50\",\r\n \"Units\": 86,\r\n \"Sales\": 106.62,\r\n \"GM\": 44.79\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7794910011647,\r\n \"Name\": \"KR CEREALITAS GALLET 200GR\",\r\n \"Price\": \"2.50\",\r\n \"Units\": 54,\r\n \"Sales\": 111.77,\r\n \"GM\": 44.78\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 156,\r\n \"Subcategory\": \"PRESERVATIVOS\",\r\n \"Manufacturer\": \"BUHL\",\r\n \"EAN\": 7791519200090,\r\n \"Name\": \"BUHL Prime Pres Tacha 3u\",\r\n \"Price\": \"4.81\",\r\n \"Units\": 24,\r\n \"Sales\": 95.45,\r\n \"GM\": 44.71\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"QUILMES\",\r\n \"EAN\": 7792799000035,\r\n \"Name\": \"QLMS Eco Andes Agua C Gas 500ml\",\r\n \"Price\": \"2.20\",\r\n \"Units\": 65,\r\n \"Sales\": 118.32,\r\n \"GM\": 44.54\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910370,\r\n \"Name\": \"Jockey Club Suave KS 20und\",\r\n \"Price\": \"3.42\",\r\n \"Units\": 210,\r\n \"Sales\": 669.03,\r\n \"GM\": 44.28\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"OSRAM\",\r\n \"EAN\": 4050300001470,\r\n \"Name\": \"OSRM Lampara 12W 64193 Und\",\r\n \"Price\": \"17.50\",\r\n \"Units\": 8,\r\n \"Sales\": 115.68,\r\n \"GM\": 44.28\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7790114015177,\r\n \"Name\": \"KR MILKA LEGER LECHE 100G\",\r\n \"Price\": \"5.20\",\r\n \"Units\": 26,\r\n \"Sales\": 111.8,\r\n \"GM\": 44.26\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040740006,\r\n \"Name\": \"Recetas de la Abuela 200gr\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 58,\r\n \"Sales\": 114.9,\r\n \"GM\": 44.26\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7791813420200,\r\n \"Name\": \"H2OH LIMA LIM�N 500ML\",\r\n \"Price\": \"2.60\",\r\n \"Units\": 37,\r\n \"Sales\": 79.92,\r\n \"GM\": 44.24\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7790017400018,\r\n \"Name\": \"Tropicana Manzana 200ml\",\r\n \"Price\": \"1.60\",\r\n \"Units\": 64,\r\n \"Sales\": 85.12,\r\n \"GM\": 44.23\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"MARS\",\r\n \"EAN\": 7896423420166,\r\n \"Name\": \"MARS MM Chocolate 40 Gr\",\r\n \"Price\": \"2.80\",\r\n \"Units\": 46,\r\n \"Sales\": 106.32,\r\n \"GM\": 44.18\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"EL TRIGAL\",\r\n \"EAN\": 7730116460131,\r\n \"Name\": \"ETG BRIDGE OBLEAS 140GR\",\r\n \"Price\": \"3.20\",\r\n \"Units\": 44,\r\n \"Sales\": 116.23,\r\n \"GM\": 44.17\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 164,\r\n \"Subcategory\": \"BATTERIES\",\r\n \"Manufacturer\": \"ENERGIZER\",\r\n \"EAN\": 39800011398,\r\n \"Name\": \"ENZ Energizer E2 Grande D2\",\r\n \"Price\": \"16.00\",\r\n \"Units\": 7,\r\n \"Sales\": 92.56,\r\n \"GM\": 44.05\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"JORGITO\",\r\n \"EAN\": 77905758,\r\n \"Name\": \"JRG Jorgito Alfajor Blanco 50gr\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 101,\r\n \"Sales\": 108.26,\r\n \"GM\": 44.02\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7792170042159,\r\n \"Name\": \"Gatorade Propel Manzana 0.5Lts\",\r\n \"Price\": \"4.90\",\r\n \"Units\": 23,\r\n \"Sales\": 93.15,\r\n \"GM\": 43.87\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"GENERAL MILLS ARG\",\r\n \"EAN\": 74570810116,\r\n \"Name\": \"GMA Haagen Daz Pints Dulce Lech 473ml\",\r\n \"Price\": \"23.90\",\r\n \"Units\": 6,\r\n \"Sales\": 118.5,\r\n \"GM\": 43.86\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580607418,\r\n \"Name\": \"Arcor Chocolate Blanco 25g\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 137,\r\n \"Sales\": 113.41,\r\n \"GM\": 43.6\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310980279,\r\n \"Name\": \"FL Doritos Queso 80gr\",\r\n \"Price\": \"3.90\",\r\n \"Units\": 37,\r\n \"Sales\": 119.15,\r\n \"GM\": 43.3\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 59,\r\n \"Subcategory\": \"Barras sin chocolate\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222042120,\r\n \"Name\": \"BNFD CHOCKMAN 35GR\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 123,\r\n \"Sales\": 101.83,\r\n \"GM\": 43.27\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77917119,\r\n \"Name\": \"PM Virginia Superslims 100 20und\",\r\n \"Price\": \"4.10\",\r\n \"Units\": 173,\r\n \"Sales\": 662.26,\r\n \"GM\": 43.22\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 203,\r\n \"Subcategory\": \"HOT DOGS/GRILL PROD.\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3026,\r\n \"Name\": \"Pancho Criollo\",\r\n \"Price\": \"5.00\",\r\n \"Units\": 17,\r\n \"Sales\": 70.21,\r\n \"GM\": 42.75\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910950,\r\n \"Name\": \"Parisienes Box 20und\",\r\n \"Price\": \"3.92\",\r\n \"Units\": 172,\r\n \"Sales\": 628.13,\r\n \"GM\": 42.63\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580389109,\r\n \"Name\": \"Arcor Tofi Cono 135ml\",\r\n \"Price\": \"4.00\",\r\n \"Units\": 34,\r\n \"Sales\": 112.5,\r\n \"GM\": 42.28\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580397104,\r\n \"Name\": \"Arcor Rocklets Cono 120ml\",\r\n \"Price\": \"4.00\",\r\n \"Units\": 34,\r\n \"Sales\": 112.47,\r\n \"GM\": 42.24\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580607210,\r\n \"Name\": \"Arcor Chocolate con Leche 25g\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 132,\r\n \"Sales\": 109.25,\r\n \"GM\": 42.08\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040449701,\r\n \"Name\": \"SER BUDIN TRADICIONAL 250G\",\r\n \"Price\": \"6.50\",\r\n \"Units\": 26,\r\n \"Sales\": 139.62,\r\n \"GM\": 42.02\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7792170042012,\r\n \"Name\": \"GATORADE PET NAR. 500CC\",\r\n \"Price\": \"4.90\",\r\n \"Units\": 24,\r\n \"Sales\": 97.2,\r\n \"GM\": 42\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 193,\r\n \"Subcategory\": \"OTHER ADDITIVES\",\r\n \"Manufacturer\": \"BARDAHL LUBRICANT\",\r\n \"EAN\": 7790627112103,\r\n \"Name\": \"BRDL no smoke Platinum 400ml\",\r\n \"Price\": \"14.50\",\r\n \"Units\": 9,\r\n \"Sales\": 107.86,\r\n \"GM\": 41.82\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954058036,\r\n \"Name\": \"SFA Filtros Fram PH-5803\",\r\n \"Price\": \"29.03\",\r\n \"Units\": 3,\r\n \"Sales\": 71.97,\r\n \"GM\": 41.67\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 156,\r\n \"Subcategory\": \"PRESERVATIVOS\",\r\n \"Manufacturer\": \"BUHL\",\r\n \"EAN\": 7791519000676,\r\n \"Name\": \"BUHL Prime preserv Extralu 3u\",\r\n \"Price\": \"4.74\",\r\n \"Units\": 23,\r\n \"Sales\": 90.15,\r\n \"GM\": 41.5\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"JORGITO\",\r\n \"EAN\": 77901705,\r\n \"Name\": \"JRG Jorgelin Maxialf Blanc Leche 85gr\",\r\n \"Price\": \"1.90\",\r\n \"Units\": 68,\r\n \"Sales\": 106.76,\r\n \"GM\": 41.5\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77915818,\r\n \"Name\": \"Cereal Mix Light Manzana 23gr\",\r\n \"Price\": \"1.40\",\r\n \"Units\": 80,\r\n \"Sales\": 92.67,\r\n \"GM\": 41.45\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954054960,\r\n \"Name\": \"SFA Filtros Fram CA-5496\",\r\n \"Price\": \"18.35\",\r\n \"Units\": 5,\r\n \"Sales\": 75.83,\r\n \"GM\": 41.43\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 7791249020074,\r\n \"Name\": \"CAD CADBURY YOGURT FRUTILLA 80G\",\r\n \"Price\": \"5.00\",\r\n \"Units\": 24,\r\n \"Sales\": 99.12,\r\n \"GM\": 41.37\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 40000001621,\r\n \"Name\": \"MAS Skittles Wildberry 61,5g\",\r\n \"Price\": \"3.00\",\r\n \"Units\": 43,\r\n \"Sales\": 106.64,\r\n \"GM\": 41.34\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300094010,\r\n \"Name\": \"KR CLUB SOCIAL CHIPSCREMCEB 120G\",\r\n \"Price\": \"5.10\",\r\n \"Units\": 22,\r\n \"Sales\": 92.63,\r\n \"GM\": 41.33\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771667651003,\r\n \"Name\": \"Hombre\",\r\n \"Price\": \"5.90\",\r\n \"Units\": 7,\r\n \"Sales\": 41.3,\r\n \"GM\": 41.3\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7792170042050,\r\n \"Name\": \"GATORADE PET LIMA-LIMON 500CC\",\r\n \"Price\": \"4.90\",\r\n \"Units\": 23,\r\n \"Sales\": 93.15,\r\n \"GM\": 40.6\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222041505,\r\n \"Name\": \"BNFD BOMBON DDL30GRS\",\r\n \"Price\": \"1.72\",\r\n \"Units\": 74,\r\n \"Sales\": 104.74,\r\n \"GM\": 40.36\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7791813420231,\r\n \"Name\": \"PEPSI MAX 0.5L\",\r\n \"Price\": \"3.10\",\r\n \"Units\": 36,\r\n \"Sales\": 92.88,\r\n \"GM\": 40.28\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 74490209328,\r\n \"Name\": \"Vougue\",\r\n \"Price\": \"10.00\",\r\n \"Units\": 4,\r\n \"Sales\": 40,\r\n \"GM\": 40\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6879,\r\n \"Name\": \"SFA Filtros Fram PH-5592\",\r\n \"Price\": \"104.00\",\r\n \"Units\": 1,\r\n \"Sales\": 85.95,\r\n \"GM\": 39.72\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"FELFORT\",\r\n \"EAN\": 1117,\r\n \"Name\": \"FLFR Marroc Bombon 14gr\",\r\n \"Price\": \"0.95\",\r\n \"Units\": 113,\r\n \"Sales\": 88.84,\r\n \"GM\": 39.7\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"TIA MARUCA\",\r\n \"EAN\": 7798082740336,\r\n \"Name\": \"TM Tia Maruca Junglitas 250gr\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 32,\r\n \"Sales\": 92.48,\r\n \"GM\": 39.69\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9789500828406,\r\n \"Name\": \"Para Teens\",\r\n \"Price\": \"7.90\",\r\n \"Units\": 5,\r\n \"Sales\": 39.5,\r\n \"GM\": 39.5\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"NESTLE\",\r\n \"EAN\": 7792799005221,\r\n \"Name\": \"Nestle Nar Dur 500ml\",\r\n \"Price\": \"2.50\",\r\n \"Units\": 34,\r\n \"Sales\": 70.4,\r\n \"GM\": 39.46\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300190316,\r\n \"Name\": \"KR CEREALITA CAPRICH MEDITER 00G\",\r\n \"Price\": \"2.90\",\r\n \"Units\": 45,\r\n \"Sales\": 107.97,\r\n \"GM\": 39.45\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7792170002870,\r\n \"Name\": \"Gatorade Naranja Pom 473ml\",\r\n \"Price\": \"4.40\",\r\n \"Units\": 21,\r\n \"Sales\": 76.41,\r\n \"GM\": 38.94\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6432,\r\n \"Name\": \"SFA Filtros Fram CA-5513D\",\r\n \"Price\": \"26.09\",\r\n \"Units\": 4,\r\n \"Sales\": 86.22,\r\n \"GM\": 38.94\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6472,\r\n \"Name\": \"SFA Filtros Fram CA-5970\",\r\n \"Price\": \"41.39\",\r\n \"Units\": 2,\r\n \"Sales\": 68.42,\r\n \"GM\": 38.88\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 22000000705,\r\n \"Name\": \"HUBBA BUBBA CHICLETS G.S 42G\",\r\n \"Price\": \"3.80\",\r\n \"Units\": 32,\r\n \"Sales\": 100.48,\r\n \"GM\": 38.76\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895063251,\r\n \"Name\": \"Fanta Naranja Light 1.5L\",\r\n \"Price\": \"5.50\",\r\n \"Units\": 24,\r\n \"Sales\": 109.2,\r\n \"GM\": 38.58\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"FELFORT\",\r\n \"EAN\": 77909190,\r\n \"Name\": \"FLFR CEREAL FORT FLEKOS 18G\",\r\n \"Price\": \"1.50\",\r\n \"Units\": 73,\r\n \"Sales\": 90.52,\r\n \"GM\": 38.55\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7791813421382,\r\n \"Name\": \"PST Pomelo 1.5L\",\r\n \"Price\": \"5.40\",\r\n \"Units\": 19,\r\n \"Sales\": 85.5,\r\n \"GM\": 38.48\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954095192,\r\n \"Name\": \"SFA Fram Filtro CA 9519\",\r\n \"Price\": \"26.00\",\r\n \"Units\": 4,\r\n \"Sales\": 85.94,\r\n \"GM\": 38.44\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 59,\r\n \"Subcategory\": \"Barras sin chocolate\",\r\n \"Manufacturer\": \"INTERLINK\",\r\n \"EAN\": 7798138290037,\r\n \"Name\": \"ITLK Vauquita 140G\",\r\n \"Price\": \"3.61\",\r\n \"Units\": 43,\r\n \"Sales\": 128.28,\r\n \"GM\": 38.41\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7792170061006,\r\n \"Name\": \"Gatorade Sport 600ml Naranja\",\r\n \"Price\": \"5.90\",\r\n \"Units\": 18,\r\n \"Sales\": 87.84,\r\n \"GM\": 38.35\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 60,\r\n \"Subcategory\": \"Caramelos en bolsa\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580061807,\r\n \"Name\": \"Sugus Mini Sugus Confitado 25g\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 130,\r\n \"Sales\": 107.62,\r\n \"GM\": 38.26\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040001855,\r\n \"Name\": \"BGLY Melitas 170gr\",\r\n \"Price\": \"2.70\",\r\n \"Units\": 43,\r\n \"Sales\": 95.89,\r\n \"GM\": 38.23\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 179,\r\n \"Subcategory\": \"NEWSPAPERS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7608,\r\n \"Name\": \"CLARIN LUNES\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 19,\r\n \"Sales\": 38,\r\n \"GM\": 38\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77913500,\r\n \"Name\": \"PM Marlboro Light KS 20und\",\r\n \"Price\": \"3.93\",\r\n \"Units\": 147,\r\n \"Sales\": 539.12,\r\n \"GM\": 37.58\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 51,\r\n \"Subcategory\": \"Bebidas Alternativas\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7798133510017,\r\n \"Name\": \"RF Rocket Fuel 250cc\",\r\n \"Price\": \"4.25\",\r\n \"Units\": 23,\r\n \"Sales\": 80.7,\r\n \"GM\": 37.48\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"FELFORT\",\r\n \"EAN\": 77909145,\r\n \"Name\": \"FLFR Cereal Fort Light Frut Manz\",\r\n \"Price\": \"1.50\",\r\n \"Units\": 69,\r\n \"Sales\": 85.56,\r\n \"GM\": 37.42\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580395902,\r\n \"Name\": \"Arcor Cofler Dulce Leche 80ml\",\r\n \"Price\": \"4.00\",\r\n \"Units\": 30,\r\n \"Sales\": 99.27,\r\n \"GM\": 37.3\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954870645,\r\n \"Name\": \"SFA Fram Filtro PH 5548\",\r\n \"Price\": \"23.34\",\r\n \"Units\": 4,\r\n \"Sales\": 77.15,\r\n \"GM\": 37.15\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"SCJHONSON\",\r\n \"EAN\": 7501032920142,\r\n \"Name\": \"SCJ Auto Sport Glade 7ml\",\r\n \"Price\": \"21.00\",\r\n \"Units\": 4,\r\n \"Sales\": 69.44,\r\n \"GM\": 37.1\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310980910,\r\n \"Name\": \"FL Cheetos Classic 150g\",\r\n \"Price\": \"5.10\",\r\n \"Units\": 24,\r\n \"Sales\": 101.06,\r\n \"GM\": 36.98\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"NESTLE\",\r\n \"EAN\": 79200317881,\r\n \"Name\": \"Wonka Rainbow 6 oz\",\r\n \"Price\": \"9.00\",\r\n \"Units\": 13,\r\n \"Sales\": 96.72,\r\n \"GM\": 36.67\r\n },\r\n {\r\n \"CategoryId\": 140,\r\n \"Category\": \"Limpieza\",\r\n \"SubcategoryId\": 144,\r\n \"Subcategory\": \"PAPER/PLASTIC/FOIL\",\r\n \"Manufacturer\": \"PORTACION\",\r\n \"EAN\": 7806540320102,\r\n \"Name\": \"PT Savion Soft Tissue 10und\",\r\n \"Price\": \"0.70\",\r\n \"Units\": 180,\r\n \"Sales\": 104.4,\r\n \"GM\": 36.63\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"BAGGIO\",\r\n \"EAN\": 7790036972558,\r\n \"Name\": \"RPBB Baggio Multifruta 200ml\",\r\n \"Price\": \"1.70\",\r\n \"Units\": 50,\r\n \"Sales\": 70.5,\r\n \"GM\": 36.56\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CHUPA CHUPS\",\r\n \"EAN\": 84155634,\r\n \"Name\": \"CH SMINT AZUL 8G\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 34,\r\n \"Sales\": 98.27,\r\n \"GM\": 36.39\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310979969,\r\n \"Name\": \"FL LAYS MEDITERRAN TOMAT Y ALB\",\r\n \"Price\": \"3.90\",\r\n \"Units\": 31,\r\n \"Sales\": 99.82,\r\n \"GM\": 36.27\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77924285,\r\n \"Name\": \"CAD Halls Creamy Frutilla 27gr\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 82,\r\n \"Sales\": 81.18,\r\n \"GM\": 36.18\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580394707,\r\n \"Name\": \"Arcor Tofi Crocante 80ml\",\r\n \"Price\": \"3.00\",\r\n \"Units\": 36,\r\n \"Sales\": 89.28,\r\n \"GM\": 36.08\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77936288,\r\n \"Name\": \"SER BARRA CEREAL DURAZNO 23G\",\r\n \"Price\": \"1.70\",\r\n \"Units\": 63,\r\n \"Sales\": 88.32,\r\n \"GM\": 36.06\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770017291005,\r\n \"Name\": \"El Grafico\",\r\n \"Price\": \"9.00\",\r\n \"Units\": 4,\r\n \"Sales\": 36,\r\n \"GM\": 36\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 10722990305,\r\n \"Name\": \"Glamour\",\r\n \"Price\": \"9.00\",\r\n \"Units\": 4,\r\n \"Sales\": 36,\r\n \"GM\": 36\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 25274174219,\r\n \"Name\": \"HOLA\",\r\n \"Price\": \"18.00\",\r\n \"Units\": 2,\r\n \"Sales\": 36,\r\n \"GM\": 36\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770328639008,\r\n \"Name\": \"Informacion Technology\",\r\n \"Price\": \"9.00\",\r\n \"Units\": 4,\r\n \"Sales\": 36,\r\n \"GM\": 36\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062547788,\r\n \"Name\": \"DNN Villavicencio Agua Gas 1.5L\",\r\n \"Price\": \"3.60\",\r\n \"Units\": 28,\r\n \"Sales\": 83.7,\r\n \"GM\": 35.99\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"WYNNS\",\r\n \"EAN\": 73579622058,\r\n \"Name\": \"WNNS Radiator 325ml\",\r\n \"Price\": \"30.33\",\r\n \"Units\": 3,\r\n \"Sales\": 75.2,\r\n \"GM\": 35.99\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"NESTLE\",\r\n \"EAN\": 79200003579,\r\n \"Name\": \"NES Nerd Apple & Lemonade 46.7\",\r\n \"Price\": \"3.70\",\r\n \"Units\": 27,\r\n \"Sales\": 82.62,\r\n \"GM\": 35.91\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040057081,\r\n \"Name\": \"BGLY CRIOLLITAS 105GR\",\r\n \"Price\": \"1.60\",\r\n \"Units\": 70,\r\n \"Sales\": 92.4,\r\n \"GM\": 35.84\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77974631,\r\n \"Name\": \"Tofi Chocolate 28G\",\r\n \"Price\": \"1.82\",\r\n \"Units\": 52,\r\n \"Sales\": 78.36,\r\n \"GM\": 35.72\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895066443,\r\n \"Name\": \"Dasani Mineralizada 500ml\",\r\n \"Price\": \"2.10\",\r\n \"Units\": 38,\r\n \"Sales\": 66.12,\r\n \"GM\": 35.59\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77920928,\r\n \"Name\": \"Camel Filters Box 10und\",\r\n \"Price\": \"2.02\",\r\n \"Units\": 268,\r\n \"Sales\": 506.38,\r\n \"GM\": 35.49\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062548365,\r\n \"Name\": \"DNN Ser Agua Plus Naran Dur 1.5L\",\r\n \"Price\": \"4.90\",\r\n \"Units\": 20,\r\n \"Sales\": 82,\r\n \"GM\": 35.2\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 81,\r\n \"Subcategory\": \"OTHER DAIRY\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7791337580855,\r\n \"Name\": \"DNN Actimel 0% Multifrutas 100gr\",\r\n \"Price\": \"1.47\",\r\n \"Units\": 96,\r\n \"Sales\": 116.53,\r\n \"GM\": 35.03\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"QUILMES\",\r\n \"EAN\": 7792799005153,\r\n \"Name\": \"QLMS AGUA NESTL� LIMONADA 500CC\",\r\n \"Price\": \"2.50\",\r\n \"Units\": 30,\r\n \"Sales\": 62.1,\r\n \"GM\": 35.01\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"MARS\",\r\n \"EAN\": 7896423424539,\r\n \"Name\": \"MARS Twix 45gr\",\r\n \"Price\": \"2.70\",\r\n \"Units\": 39,\r\n \"Sales\": 86.97,\r\n \"GM\": 34.84\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910905,\r\n \"Name\": \"John Player Gold Leaf 20und\",\r\n \"Price\": \"4.03\",\r\n \"Units\": 132,\r\n \"Sales\": 495.81,\r\n \"GM\": 34.82\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77960160,\r\n \"Name\": \"KR MILKA ALFAJOR MOUSSE 40G\",\r\n \"Price\": \"1.70\",\r\n \"Units\": 64,\r\n \"Sales\": 89.69,\r\n \"GM\": 34.76\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77933409,\r\n \"Name\": \"COFLER LECHE 28G\",\r\n \"Price\": \"1.40\",\r\n \"Units\": 73,\r\n \"Sales\": 84.54,\r\n \"GM\": 34.7\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222002865,\r\n \"Name\": \"BNFD DRF Menta 23 Gr\",\r\n \"Price\": \"0.81\",\r\n \"Units\": 114,\r\n \"Sales\": 76.62,\r\n \"GM\": 34.61\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895066429,\r\n \"Name\": \"Dasani Mineralizada Con Gas 500ml\",\r\n \"Price\": \"2.10\",\r\n \"Units\": 36,\r\n \"Sales\": 62.62,\r\n \"GM\": 34.33\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 9319,\r\n \"Name\": \"PEPSI BOTELLA 237ML\",\r\n \"Price\": \"2.20\",\r\n \"Units\": 40,\r\n \"Sales\": 73.2,\r\n \"GM\": 34.3\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77930019,\r\n \"Name\": \"Bon o Bon Choc Blanco 17gr\",\r\n \"Price\": \"0.80\",\r\n \"Units\": 110,\r\n \"Sales\": 72.64,\r\n \"GM\": 34.16\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"QUILMES\",\r\n \"EAN\": 7792799005160,\r\n \"Name\": \"QLMS AGUA NESTL� LIMONADA 1500CC\",\r\n \"Price\": \"4.40\",\r\n \"Units\": 16,\r\n \"Sales\": 58.4,\r\n \"GM\": 34.13\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580396107,\r\n \"Name\": \"Cofler Hel B80ml\",\r\n \"Price\": \"3.00\",\r\n \"Units\": 34,\r\n \"Sales\": 84.32,\r\n \"GM\": 34.12\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 60,\r\n \"Subcategory\": \"Caramelos en bolsa\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222003312,\r\n \"Name\": \"BNFD Billiken Gotitas de Amor 35g\",\r\n \"Price\": \"1.02\",\r\n \"Units\": 97,\r\n \"Sales\": 81.77,\r\n \"GM\": 34.11\r\n },\r\n {\r\n \"CategoryId\": 13,\r\n \"Category\": \"Otro Tabaco\",\r\n \"SubcategoryId\": 15,\r\n \"Subcategory\": \"Cigarros\",\r\n \"Manufacturer\": \"PURO TABACO\",\r\n \"EAN\": 8821,\r\n \"Name\": \"PTBC Romeo Y Julieta Nro 2 Tubo Mano\",\r\n \"Price\": \"35.75\",\r\n \"Units\": 2,\r\n \"Sales\": 59.72,\r\n \"GM\": 34.06\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222041468,\r\n \"Name\": \"BNFD BOCADITO BONAFIDE RHUM 16G\",\r\n \"Price\": \"0.92\",\r\n \"Units\": 104,\r\n \"Sales\": 78.98,\r\n \"GM\": 33.88\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222041079,\r\n \"Name\": \"BNFD Nugaton black 27gr\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 60,\r\n \"Sales\": 59.44,\r\n \"GM\": 33.8\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 149,\r\n \"Subcategory\": \"ANALGESICOS\",\r\n \"Manufacturer\": \"BAYER\",\r\n \"EAN\": 9803,\r\n \"Name\": \"BY Cafiaspirina Tira 10gr\",\r\n \"Price\": \"2.52\",\r\n \"Units\": 25,\r\n \"Sales\": 63,\r\n \"GM\": 33.66\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77956699,\r\n \"Name\": \"KR Shot Tri Alfajor 60gr\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 48,\r\n \"Sales\": 91.2,\r\n \"GM\": 33.21\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300121198,\r\n \"Name\": \"KR TERRAB ALFAJOR MOUSSE 55G\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 38,\r\n \"Sales\": 72.2,\r\n \"GM\": 33.11\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"JORGITO\",\r\n \"EAN\": 7790957000545,\r\n \"Name\": \"JRG Jorgito Alfajorcito Choc 6un\",\r\n \"Price\": \"3.70\",\r\n \"Units\": 28,\r\n \"Sales\": 85.68,\r\n \"GM\": 33.03\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 28400055093,\r\n \"Name\": \"FL Lays Stax Original 163g\",\r\n \"Price\": \"9.50\",\r\n \"Units\": 12,\r\n \"Sales\": 94.2,\r\n \"GM\": 32.88\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7794600007530,\r\n \"Name\": \"KR Duquesa 115gr\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 47,\r\n \"Sales\": 77.58,\r\n \"GM\": 32.87\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7791813422532,\r\n \"Name\": \"7Up H2OH Citrus 2000ml\",\r\n \"Price\": \"4.90\",\r\n \"Units\": 17,\r\n \"Sales\": 69.02,\r\n \"GM\": 32.79\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 59,\r\n \"Subcategory\": \"Barras sin chocolate\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77917850,\r\n \"Name\": \"Cofler Rally 38g\",\r\n \"Price\": \"1.60\",\r\n \"Units\": 55,\r\n \"Sales\": 72.62,\r\n \"GM\": 32.72\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954047030,\r\n \"Name\": \"SFA Filtros Fram PH-4703\",\r\n \"Price\": \"23.05\",\r\n \"Units\": 3,\r\n \"Sales\": 57.13,\r\n \"GM\": 32.72\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77936264,\r\n \"Name\": \"Barra Cereal Ser Manzana\",\r\n \"Price\": \"1.70\",\r\n \"Units\": 60,\r\n \"Sales\": 84.14,\r\n \"GM\": 32.51\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 8413042772804,\r\n \"Name\": \"Glamour Espanol\",\r\n \"Price\": \"6.50\",\r\n \"Units\": 5,\r\n \"Sales\": 32.5,\r\n \"GM\": 32.5\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7792799578756,\r\n \"Name\": \"Nestle 500 sin Gas\",\r\n \"Price\": \"2.20\",\r\n \"Units\": 38,\r\n \"Sales\": 69.53,\r\n \"GM\": 32.36\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580397203,\r\n \"Name\": \"Bon o Bon Hel Cono 135ml\",\r\n \"Price\": \"4.00\",\r\n \"Units\": 26,\r\n \"Sales\": 86.03,\r\n \"GM\": 32.32\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"NESTLE\",\r\n \"EAN\": 79200277567,\r\n \"Name\": \"NES Nerds W.Berry & W.melon 46.7 gr\",\r\n \"Price\": \"3.70\",\r\n \"Units\": 24,\r\n \"Sales\": 73.43,\r\n \"GM\": 32.08\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"TIA MARUCA\",\r\n \"EAN\": 7798082740381,\r\n \"Name\": \"TM TM Galletas Light 200gr\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 26,\r\n \"Sales\": 75.2,\r\n \"GM\": 32.04\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"GENERAL MILLS ARG\",\r\n \"EAN\": 3415586410001,\r\n \"Name\": \"GMA HAAGEN DAZS COOKIES&CRE 90ML\",\r\n \"Price\": \"8.50\",\r\n \"Units\": 13,\r\n \"Sales\": 91.26,\r\n \"GM\": 32\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300121976,\r\n \"Name\": \"KR Manon 135g\",\r\n \"Price\": \"2.20\",\r\n \"Units\": 38,\r\n \"Sales\": 69.16,\r\n \"GM\": 31.91\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"DON SATUR\",\r\n \"EAN\": 7798092780551,\r\n \"Name\": \"DST Don Satur Talitas 160g\",\r\n \"Price\": \"3.75\",\r\n \"Units\": 27,\r\n \"Sales\": 83.7,\r\n \"GM\": 31.9\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"GEORGALOS\",\r\n \"EAN\": 77926760,\r\n \"Name\": \"GRG MARROC CHOCOLATE 25G\",\r\n \"Price\": \"1.40\",\r\n \"Units\": 64,\r\n \"Sales\": 74.13,\r\n \"GM\": 31.84\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040930506,\r\n \"Name\": \"BGLY Rumba 112G\",\r\n \"Price\": \"2.70\",\r\n \"Units\": 35,\r\n \"Sales\": 78.05,\r\n \"GM\": 31.75\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 7790715013121,\r\n \"Name\": \"TPS Autopolish 450ml\",\r\n \"Price\": \"14.42\",\r\n \"Units\": 6,\r\n \"Sales\": 71.47,\r\n \"GM\": 31.63\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580397005,\r\n \"Name\": \"Arcor Kopa Chocolate 190ml\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 28,\r\n \"Sales\": 80.97,\r\n \"GM\": 31.38\r\n },\r\n {\r\n \"CategoryId\": 65,\r\n \"Category\": \"Leches\",\r\n \"SubcategoryId\": 69,\r\n \"Subcategory\": \"SKIM/NON FAT MILK\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7793940346002,\r\n \"Name\": \"DNN La Serenis Lech Descrem Larg D 1L\",\r\n \"Price\": \"3.30\",\r\n \"Units\": 54,\r\n \"Sales\": 147.31,\r\n \"GM\": 31.13\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"BAGGIO\",\r\n \"EAN\": 7790036971605,\r\n \"Name\": \"RPBB Baggio Naranja 1L\",\r\n \"Price\": \"4.50\",\r\n \"Units\": 19,\r\n \"Sales\": 70.88,\r\n \"GM\": 31.12\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7791813421368,\r\n \"Name\": \"PST Tonica 1.5L\",\r\n \"Price\": \"5.40\",\r\n \"Units\": 16,\r\n \"Sales\": 72,\r\n \"GM\": 30.94\r\n },\r\n {\r\n \"CategoryId\": 134,\r\n \"Category\": \"Almacen\",\r\n \"SubcategoryId\": 135,\r\n \"Subcategory\": \"CAFE Y TE\",\r\n \"Manufacturer\": \"MOL RIO DELA PLATA\",\r\n \"EAN\": 7790060054060,\r\n \"Name\": \"MRP Nobleza Gaucha Yerba 500gr\",\r\n \"Price\": \"5.50\",\r\n \"Units\": 12,\r\n \"Sales\": 54.6,\r\n \"GM\": 30.88\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"FERRERO\",\r\n \"EAN\": 78602649,\r\n \"Name\": \"FRR TIC TAC EXTRA FUERTE 16GR\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 61,\r\n \"Sales\": 65.33,\r\n \"GM\": 30.88\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"BARDAHL LUBRICANT\",\r\n \"EAN\": 7790558000012,\r\n \"Name\": \"BRDL Silicona A3 Vinilico Autom 120ml\",\r\n \"Price\": \"12.29\",\r\n \"Units\": 7,\r\n \"Sales\": 71.07,\r\n \"GM\": 30.88\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895066344,\r\n \"Name\": \"DASANI BALANCE DURAZ C/G 500\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 31,\r\n \"Sales\": 61.38,\r\n \"GM\": 30.78\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7793360475009,\r\n \"Name\": \"La Campagnola BC Naranja Lt\",\r\n \"Price\": \"4.90\",\r\n \"Units\": 17,\r\n \"Sales\": 69.19,\r\n \"GM\": 30.6\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77903785,\r\n \"Name\": \"KR MILKA TRIPLE MOUSSE ALF 55GR\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 44,\r\n \"Sales\": 83.6,\r\n \"GM\": 30.43\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6274,\r\n \"Name\": \"SFA Filtros Fram CA-8675D\",\r\n \"Price\": \"32.32\",\r\n \"Units\": 2,\r\n \"Sales\": 53.42,\r\n \"GM\": 30.36\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6279,\r\n \"Name\": \"SFA Fram G 5995\",\r\n \"Price\": \"25.37\",\r\n \"Units\": 4,\r\n \"Sales\": 83.87,\r\n \"GM\": 30.35\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9044400841000,\r\n \"Name\": \"Pez 25,5g\",\r\n \"Price\": \"9.50\",\r\n \"Units\": 10,\r\n \"Sales\": 78.5,\r\n \"GM\": 30.29\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"NESTLE\",\r\n \"EAN\": 1113,\r\n \"Name\": \"NES Dolca Bananita 30gr\",\r\n \"Price\": \"1.36\",\r\n \"Units\": 90,\r\n \"Sales\": 101.08,\r\n \"GM\": 30.28\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954869717,\r\n \"Name\": \"SFA Fram Filtro CH 9443\",\r\n \"Price\": \"32.00\",\r\n \"Units\": 2,\r\n \"Sales\": 52.9,\r\n \"GM\": 30.04\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6425,\r\n \"Name\": \"SFA Filtros Fram CA-5466\",\r\n \"Price\": \"79.38\",\r\n \"Units\": 1,\r\n \"Sales\": 65.6,\r\n \"GM\": 30.03\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77917713,\r\n \"Name\": \"CAD Beldent Power Mints Menta 8gr\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 42,\r\n \"Sales\": 79.8,\r\n \"GM\": 30.02\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 80,\r\n \"Subcategory\": \"YOGURT\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7791337265301,\r\n \"Name\": \"DNN Ser Total 183g\",\r\n \"Price\": \"2.58\",\r\n \"Units\": 67,\r\n \"Sales\": 143.15,\r\n \"GM\": 30\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 80,\r\n \"Subcategory\": \"YOGURT\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7791337332027,\r\n \"Name\": \"DNN Ser Bebible Frutilla 200gr\",\r\n \"Price\": \"2.13\",\r\n \"Units\": 76,\r\n \"Sales\": 133.45,\r\n \"GM\": 29.94\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 63,\r\n \"Subcategory\": \"Golosinas a granel\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580300302,\r\n \"Name\": \"Bon o Bon Display Leche 18 Unid\",\r\n \"Price\": \"15.00\",\r\n \"Units\": 5,\r\n \"Sales\": 62,\r\n \"GM\": 29.91\r\n },\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 217,\r\n \"Subcategory\": \"HOT TEA\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2036,\r\n \"Name\": \"Te Saborizado Mate Cocido\",\r\n \"Price\": \"3.20\",\r\n \"Units\": 12,\r\n \"Sales\": 31.68,\r\n \"GM\": 29.52\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"TIA MARUCA\",\r\n \"EAN\": 7798082740176,\r\n \"Name\": \"TM Tia Maruca Palmeritas 200gr\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 24,\r\n \"Sales\": 69.36,\r\n \"GM\": 29.52\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770329816002,\r\n \"Name\": \"CASA COUNTRY\",\r\n \"Price\": \"9.80\",\r\n \"Units\": 3,\r\n \"Sales\": 29.4,\r\n \"GM\": 29.4\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7794600460335,\r\n \"Name\": \"KR Mayco Galleta Sandwich 172g\",\r\n \"Price\": \"2.60\",\r\n \"Units\": 29,\r\n \"Sales\": 62.35,\r\n \"GM\": 29.25\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300108328,\r\n \"Name\": \"KR CEREALITAS CEREAL Y MIEL 142G\",\r\n \"Price\": \"2.90\",\r\n \"Units\": 26,\r\n \"Sales\": 62.39,\r\n \"GM\": 29.19\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580385514,\r\n \"Name\": \"Topline C Sin Azuc SandiaMta 14g\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 76,\r\n \"Sales\": 75.24,\r\n \"GM\": 29.17\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300420833,\r\n \"Name\": \"KR OREO BA�ADAS CHOCOLATE 204G\",\r\n \"Price\": \"6.60\",\r\n \"Units\": 14,\r\n \"Sales\": 76.3,\r\n \"GM\": 29.14\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 151,\r\n \"Subcategory\": \"REMEDIOS PARA ESTOMAGO\",\r\n \"Manufacturer\": \"GLAXO SMITHKLINE\",\r\n \"EAN\": 9805,\r\n \"Name\": \"LOCKGSK Alikal Limon 4.5gr\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 56,\r\n \"Sales\": 72.8,\r\n \"GM\": 29.12\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"FELFORT\",\r\n \"EAN\": 1118,\r\n \"Name\": \"FLFR Paraguitas 13gr\",\r\n \"Price\": \"0.98\",\r\n \"Units\": 74,\r\n \"Sales\": 60.15,\r\n \"GM\": 29.08\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6285,\r\n \"Name\": \"SFA Fram CH 6848\",\r\n \"Price\": \"79.38\",\r\n \"Units\": 1,\r\n \"Sales\": 65.6,\r\n \"GM\": 29.02\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040996304,\r\n \"Name\": \"BGLY Bagley Alfajor B&N Neg 50g\",\r\n \"Price\": \"1.80\",\r\n \"Units\": 47,\r\n \"Sales\": 70.02,\r\n \"GM\": 28.99\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 78916418,\r\n \"Name\": \"PRO Mentos Mints Caramelos 29.7Gr\",\r\n \"Price\": \"1.40\",\r\n \"Units\": 61,\r\n \"Sales\": 70.68,\r\n \"GM\": 28.98\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 60,\r\n \"Subcategory\": \"Caramelos en bolsa\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580200114,\r\n \"Name\": \"Fruti Gelatin Tiburoncit 30g\",\r\n \"Price\": \"1.10\",\r\n \"Units\": 66,\r\n \"Sales\": 60.06,\r\n \"GM\": 28.94\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 191,\r\n \"Subcategory\": \"BRAKE FLUIDS\",\r\n \"Manufacturer\": \"WAGNER BRAKE\",\r\n \"EAN\": 7797409305005,\r\n \"Name\": \"WAG DOT4 Wagner Liq Fren 200ml\",\r\n \"Price\": \"10.90\",\r\n \"Units\": 8,\r\n \"Sales\": 72.08,\r\n \"GM\": 28.93\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 62,\r\n \"Subcategory\": \"Caramelos sueltos\",\r\n \"Manufacturer\": \"GEORGALOS\",\r\n \"EAN\": 7790380002826,\r\n \"Name\": \"GRG Flynn Paff Confitado 50gr\",\r\n \"Price\": \"1.60\",\r\n \"Units\": 46,\r\n \"Sales\": 60.76,\r\n \"GM\": 28.86\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910974,\r\n \"Name\": \"Camel Filters KS 20und\",\r\n \"Price\": \"3.93\",\r\n \"Units\": 116,\r\n \"Sales\": 423.89,\r\n \"GM\": 28.8\r\n },\r\n {\r\n \"CategoryId\": 13,\r\n \"Category\": \"Otro Tabaco\",\r\n \"SubcategoryId\": 15,\r\n \"Subcategory\": \"Cigarros\",\r\n \"Manufacturer\": \"PURO TABACO\",\r\n \"EAN\": 8500001542100,\r\n \"Name\": \"PTBC Partagas Chicos Caja 5Und\",\r\n \"Price\": \"43.50\",\r\n \"Units\": 2,\r\n \"Sales\": 72.76,\r\n \"GM\": 28.78\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062547559,\r\n \"Name\": \"DNN Villa del Sur 2.25L\",\r\n \"Price\": \"3.62\",\r\n \"Units\": 22,\r\n \"Sales\": 65.97,\r\n \"GM\": 28.77\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 207,\r\n \"Subcategory\": \"BAKERY\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3730,\r\n \"Name\": \"Panal De Membrillo\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 48,\r\n \"Sales\": 51.52,\r\n \"GM\": 28.76\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77927309,\r\n \"Name\": \"CAD HALLS CREAMY MANZANA 27G\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 65,\r\n \"Sales\": 64.36,\r\n \"GM\": 28.68\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77916389,\r\n \"Name\": \"Topline Tableta Fruta 4und\",\r\n \"Price\": \"0.90\",\r\n \"Units\": 83,\r\n \"Sales\": 61.51,\r\n \"GM\": 28.6\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"MOLINO CANUELAS\",\r\n \"EAN\": 7792200000128,\r\n \"Name\": \"MLC 9 de Oro Bizc. Agridulce 200G\",\r\n \"Price\": \"2.60\",\r\n \"Units\": 31,\r\n \"Sales\": 66.65,\r\n \"GM\": 28.57\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77916419,\r\n \"Name\": \"Topline Tablet Defenses 4U\",\r\n \"Price\": \"0.90\",\r\n \"Units\": 86,\r\n \"Sales\": 63.76,\r\n \"GM\": 28.48\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300111922,\r\n \"Name\": \"KR OREO MINI 50 GRS\",\r\n \"Price\": \"1.40\",\r\n \"Units\": 62,\r\n \"Sales\": 71.79,\r\n \"GM\": 28.39\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 193,\r\n \"Subcategory\": \"OTHER ADDITIVES\",\r\n \"Manufacturer\": \"BARDAHL LUBRICANT\",\r\n \"EAN\": 7790627101275,\r\n \"Name\": \"BRDL Max Compresion Platinum 400ml\",\r\n \"Price\": \"16.70\",\r\n \"Units\": 5,\r\n \"Sales\": 69,\r\n \"GM\": 28.36\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7794600003532,\r\n \"Name\": \"KR Melba Galletitas 120 Grs\",\r\n \"Price\": \"2.10\",\r\n \"Units\": 38,\r\n \"Sales\": 66.1,\r\n \"GM\": 28.36\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"FELFORT\",\r\n \"EAN\": 1116,\r\n \"Name\": \"FLFR Licoritas 20gr\",\r\n \"Price\": \"1.46\",\r\n \"Units\": 57,\r\n \"Sales\": 68.79,\r\n \"GM\": 28.3\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 208,\r\n \"Subcategory\": \"SOUP & SALAD\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 7795947001977,\r\n \"Name\": \"Ensalada Huerta 200gr\",\r\n \"Price\": \"6.75\",\r\n \"Units\": 12,\r\n \"Sales\": 81,\r\n \"GM\": 28.11\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300301309,\r\n \"Name\": \"KR VARIEDAD 300G\",\r\n \"Price\": \"4.20\",\r\n \"Units\": 17,\r\n \"Sales\": 58.99,\r\n \"GM\": 28.05\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580475802,\r\n \"Name\": \"LA CAMPAGNOLA BC CITRUS 250ML\",\r\n \"Price\": \"1.90\",\r\n \"Units\": 42,\r\n \"Sales\": 66.32,\r\n \"GM\": 28.02\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"GENERAL MILLS ARG\",\r\n \"EAN\": 3415581312270,\r\n \"Name\": \"GMA Haagen Dazs Strawberry 100ml\",\r\n \"Price\": \"8.50\",\r\n \"Units\": 11,\r\n \"Sales\": 77.23,\r\n \"GM\": 28\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910455,\r\n \"Name\": \"Viceroy Classic FF Soft Cup 20und\",\r\n \"Price\": \"2.63\",\r\n \"Units\": 173,\r\n \"Sales\": 421.61,\r\n \"GM\": 27.74\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 110,\r\n \"Subcategory\": \"Mani y Semillas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310920749,\r\n \"Name\": \"FL Pehuamar Mani Pelado 180gr\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 33,\r\n \"Sales\": 95.39,\r\n \"GM\": 27.74\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 59,\r\n \"Subcategory\": \"Barras sin chocolate\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77900845,\r\n \"Name\": \"KR Tita 18gr\",\r\n \"Price\": \"0.80\",\r\n \"Units\": 103,\r\n \"Sales\": 68.01,\r\n \"GM\": 27.7\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 80,\r\n \"Subcategory\": \"YOGURT\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7793940332012,\r\n \"Name\": \"DNN Ser Bebible Vainilla 200gr\",\r\n \"Price\": \"2.13\",\r\n \"Units\": 70,\r\n \"Sales\": 123.34,\r\n \"GM\": 27.59\r\n },\r\n {\r\n \"CategoryId\": 13,\r\n \"Category\": \"Otro Tabaco\",\r\n \"SubcategoryId\": 15,\r\n \"Subcategory\": \"Cigarros\",\r\n \"Manufacturer\": \"PURO TABACO\",\r\n \"EAN\": 8812,\r\n \"Name\": \"PTBC Guantanamera Decimos Und\",\r\n \"Price\": \"14.50\",\r\n \"Units\": 4,\r\n \"Sales\": 48.79,\r\n \"GM\": 27.59\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77946829,\r\n \"Name\": \"Mentho Plus s azucar Mentol 26.6G\",\r\n \"Price\": \"1.50\",\r\n \"Units\": 50,\r\n \"Sales\": 62,\r\n \"GM\": 27.51\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"BAGGIO\",\r\n \"EAN\": 7790036559223,\r\n \"Name\": \"RPBB Baggio Multifrutal 1L\",\r\n \"Price\": \"4.50\",\r\n \"Units\": 17,\r\n \"Sales\": 63.41,\r\n \"GM\": 27.39\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77926463,\r\n \"Name\": \"CAD BELDENTET WHITE MINT\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 58,\r\n \"Sales\": 62.12,\r\n \"GM\": 27.35\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040614000,\r\n \"Name\": \"Bon o Bon Alfajor Triple 60gr\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 40,\r\n \"Sales\": 66.03,\r\n \"GM\": 27.14\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"GUAYMAYEN\",\r\n \"EAN\": 77980229,\r\n \"Name\": \"GYM Guaymayen Alfajor Chocolate 38gr\",\r\n \"Price\": \"0.60\",\r\n \"Units\": 121,\r\n \"Sales\": 60.08,\r\n \"GM\": 27.11\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77915481,\r\n \"Name\": \"KR Pepitos Alfajor 57gr\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 39,\r\n \"Sales\": 74.1,\r\n \"GM\": 27.11\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"GEORGALOS\",\r\n \"EAN\": 7790380016328,\r\n \"Name\": \"GEO TOKKE CHOC CEREAL CROCANTE\",\r\n \"Price\": \"1.60\",\r\n \"Units\": 53,\r\n \"Sales\": 69.98,\r\n \"GM\": 27.07\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7791813420354,\r\n \"Name\": \"Pepsi Light 500ml\",\r\n \"Price\": \"3.10\",\r\n \"Units\": 21,\r\n \"Sales\": 54.18,\r\n \"GM\": 27.06\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770328459002,\r\n \"Name\": \"Buena Salud\",\r\n \"Price\": \"9.00\",\r\n \"Units\": 3,\r\n \"Sales\": 27,\r\n \"GM\": 27\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"FELFORT\",\r\n \"EAN\": 7790206515257,\r\n \"Name\": \"FLFR JACK SORPRESA 10GRS\",\r\n \"Price\": \"5.27\",\r\n \"Units\": 15,\r\n \"Sales\": 65.3,\r\n \"GM\": 26.84\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"FELFORT\",\r\n \"EAN\": 1138,\r\n \"Name\": \"FLFR LICONFORT BOMBOM WHISKY 13G\",\r\n \"Price\": \"1.07\",\r\n \"Units\": 77,\r\n \"Sales\": 67.92,\r\n \"GM\": 26.81\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062548280,\r\n \"Name\": \"DNN SER CITRUS 2 LTS\",\r\n \"Price\": \"5.10\",\r\n \"Units\": 13,\r\n \"Sales\": 54.73,\r\n \"GM\": 26.77\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300202897,\r\n \"Name\": \"KR Milka Alf Xtreme 61 Grs\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 35,\r\n \"Sales\": 66.5,\r\n \"GM\": 26.61\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310924075,\r\n \"Name\": \"FL LAYS AIREADAS 50G\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 25,\r\n \"Sales\": 72.25,\r\n \"GM\": 26.5\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040003606,\r\n \"Name\": \"BGLY KESITAS 75GR\",\r\n \"Price\": \"1.80\",\r\n \"Units\": 43,\r\n \"Sales\": 64.07,\r\n \"GM\": 26.37\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300093983,\r\n \"Name\": \"KR CLUB SOCIAL CHIPS 120G\",\r\n \"Price\": \"5.10\",\r\n \"Units\": 14,\r\n \"Sales\": 58.95,\r\n \"GM\": 26.37\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77911988,\r\n \"Name\": \"PM Marlboro Light Box 10 und\",\r\n \"Price\": \"2.03\",\r\n \"Units\": 186,\r\n \"Sales\": 351.84,\r\n \"GM\": 26.21\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954869144,\r\n \"Name\": \"SFA Fram Filtro CA 9080\",\r\n \"Price\": \"39.69\",\r\n \"Units\": 2,\r\n \"Sales\": 65.6,\r\n \"GM\": 26.17\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580308315,\r\n \"Name\": \"TOPLINE C SIN AZUCAR BERRY\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 56,\r\n \"Sales\": 60.02,\r\n \"GM\": 25.96\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"TIA MARUCA\",\r\n \"EAN\": 7798082740237,\r\n \"Name\": \"TM Tia Maruca Biscuit 140gr\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 21,\r\n \"Sales\": 60.71,\r\n \"GM\": 25.85\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770329463015,\r\n \"Name\": \"Lugares\",\r\n \"Price\": \"12.90\",\r\n \"Units\": 2,\r\n \"Sales\": 25.8,\r\n \"GM\": 25.8\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040929609,\r\n \"Name\": \"BGLY Surtido 400gr\",\r\n \"Price\": \"4.80\",\r\n \"Units\": 16,\r\n \"Sales\": 63.51,\r\n \"GM\": 25.77\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"BAGGIO\",\r\n \"EAN\": 7790036512228,\r\n \"Name\": \"RPBB Baggio Manzana 1L\",\r\n \"Price\": \"4.50\",\r\n \"Units\": 15,\r\n \"Sales\": 55.96,\r\n \"GM\": 25.7\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 5022650272687,\r\n \"Name\": \"SFA Fram Filtro CH 9973\",\r\n \"Price\": \"43.00\",\r\n \"Units\": 2,\r\n \"Sales\": 71.08,\r\n \"GM\": 25.68\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770328427001,\r\n \"Name\": \"Weekend\",\r\n \"Price\": \"8.50\",\r\n \"Units\": 3,\r\n \"Sales\": 25.5,\r\n \"GM\": 25.5\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300190323,\r\n \"Name\": \"KR CEREALIT CAPRI QUECIBOU 100G\",\r\n \"Price\": \"2.90\",\r\n \"Units\": 29,\r\n \"Sales\": 69.59,\r\n \"GM\": 25.46\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040003569,\r\n \"Name\": \"BGLY Rex Original 75 Grs\",\r\n \"Price\": \"1.80\",\r\n \"Units\": 40,\r\n \"Sales\": 59.6,\r\n \"GM\": 25.39\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 63,\r\n \"Subcategory\": \"Golosinas a granel\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580219000,\r\n \"Name\": \"CABSHA CAJA ACRILIC 18 UN.\",\r\n \"Price\": \"12.00\",\r\n \"Units\": 6,\r\n \"Sales\": 59.51,\r\n \"GM\": 25.33\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 59,\r\n \"Subcategory\": \"Barras sin chocolate\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 7791249999547,\r\n \"Name\": \"CAD Mantecol 40g\",\r\n \"Price\": \"1.60\",\r\n \"Units\": 45,\r\n \"Sales\": 59.41,\r\n \"GM\": 25.3\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7791813420415,\r\n \"Name\": \"PST Pomelo Light 500ml\",\r\n \"Price\": \"3.10\",\r\n \"Units\": 19,\r\n \"Sales\": 49.02,\r\n \"GM\": 25.13\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580395209,\r\n \"Name\": \"Bombon Helado 60ml\",\r\n \"Price\": \"1.50\",\r\n \"Units\": 50,\r\n \"Sales\": 62,\r\n \"GM\": 25.09\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77912824,\r\n \"Name\": \"PM Next FF KS 20und\",\r\n \"Price\": \"2.64\",\r\n \"Units\": 142,\r\n \"Sales\": 348.74,\r\n \"GM\": 25.06\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062548808,\r\n \"Name\": \"DNN SER SPORT NARANJA 600ML\",\r\n \"Price\": \"4.25\",\r\n \"Units\": 17,\r\n \"Sales\": 59.67,\r\n \"GM\": 24.99\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222041529,\r\n \"Name\": \"BNFD BOMBON MOUSE 30GRS\",\r\n \"Price\": \"1.70\",\r\n \"Units\": 47,\r\n \"Sales\": 65.86,\r\n \"GM\": 24.97\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 60,\r\n \"Subcategory\": \"Caramelos en bolsa\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 7791249792001,\r\n \"Name\": \"CAD Yummy 25 Gr\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 87,\r\n \"Sales\": 72.05,\r\n \"GM\": 24.92\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040934801,\r\n \"Name\": \"BAGLEY BUDIN VAINILLA 250G\",\r\n \"Price\": \"6.00\",\r\n \"Units\": 15,\r\n \"Sales\": 74.4,\r\n \"GM\": 24.9\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77916495,\r\n \"Name\": \"KR Oreo Triple 55g\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 36,\r\n \"Sales\": 68.4,\r\n \"GM\": 24.84\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7895144610757,\r\n \"Name\": \"Mentos Menta Helada\",\r\n \"Price\": \"1.40\",\r\n \"Units\": 46,\r\n \"Sales\": 53.32,\r\n \"GM\": 24.69\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222041628,\r\n \"Name\": \"BNFD Bonafide Cubanito Choco 74g\",\r\n \"Price\": \"6.20\",\r\n \"Units\": 12,\r\n \"Sales\": 61.45,\r\n \"GM\": 24.67\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062548433,\r\n \"Name\": \"DNN Ser Agua Plus Lima Limon 0.5 L\",\r\n \"Price\": \"3.10\",\r\n \"Units\": 20,\r\n \"Sales\": 51.4,\r\n \"GM\": 24.66\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580716707,\r\n \"Name\": \"Saladix Jamon 100gr\",\r\n \"Price\": \"2.80\",\r\n \"Units\": 28,\r\n \"Sales\": 64.69,\r\n \"GM\": 24.65\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7794910011531,\r\n \"Name\": \"KR Cerealitas Pocket 105 Gr\",\r\n \"Price\": \"1.40\",\r\n \"Units\": 52,\r\n \"Sales\": 60.3,\r\n \"GM\": 24.62\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"FELFORT\",\r\n \"EAN\": 1137,\r\n \"Name\": \"FLFR LICONFORT BOMBOM CHERRY 13G\",\r\n \"Price\": \"1.07\",\r\n \"Units\": 70,\r\n \"Sales\": 61.8,\r\n \"GM\": 24.36\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 149,\r\n \"Subcategory\": \"ANALGESICOS\",\r\n \"Manufacturer\": \"GLAXO SMITHKLINE\",\r\n \"EAN\": 9804,\r\n \"Name\": \"GSK Geniol Tira 10und\",\r\n \"Price\": \"2.25\",\r\n \"Units\": 20,\r\n \"Sales\": 44.9,\r\n \"GM\": 24.34\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7802215512247,\r\n \"Name\": \"BNFD Costa Frac Galletita Class 135g\",\r\n \"Price\": \"2.80\",\r\n \"Units\": 29,\r\n \"Sales\": 67.03,\r\n \"GM\": 24.3\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"GENERAL MILLS ARG\",\r\n \"EAN\": 7797674049468,\r\n \"Name\": \"GMA NATURE VALLEY BANANA Y ALM\",\r\n \"Price\": \"1.52\",\r\n \"Units\": 47,\r\n \"Sales\": 58.92,\r\n \"GM\": 24.22\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77925077,\r\n \"Name\": \"SUGUS CREAMY FRUTILLA 18G\",\r\n \"Price\": \"0.80\",\r\n \"Units\": 83,\r\n \"Sales\": 54.79,\r\n \"GM\": 24.13\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"UNILEVER\",\r\n \"EAN\": 7794000730021,\r\n \"Name\": \"UNI Ades Manzana 200ml\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 33,\r\n \"Sales\": 54.78,\r\n \"GM\": 24.11\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 170,\r\n \"Subcategory\": \"SMOKING ACCESSOIRES\",\r\n \"Manufacturer\": \"BIC\",\r\n \"EAN\": 70330909229,\r\n \"Name\": \"BIC Bic Full Size Encendedor\",\r\n \"Price\": \"4.40\",\r\n \"Units\": 13,\r\n \"Sales\": 47.3,\r\n \"GM\": 24.03\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771666343008,\r\n \"Name\": \"Paparazzi\",\r\n \"Price\": \"4.00\",\r\n \"Units\": 6,\r\n \"Sales\": 24,\r\n \"GM\": 24\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770329242009,\r\n \"Name\": \"Planeta Urbano\",\r\n \"Price\": \"12.00\",\r\n \"Units\": 2,\r\n \"Sales\": 24,\r\n \"GM\": 24\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 179,\r\n \"Subcategory\": \"NEWSPAPERS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7620,\r\n \"Name\": \"Clarin Miercoles\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 12,\r\n \"Sales\": 24,\r\n \"GM\": 24\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7791813421245,\r\n \"Name\": \"H2OH Citrus 1.5L\",\r\n \"Price\": \"4.50\",\r\n \"Units\": 12,\r\n \"Sales\": 44.76,\r\n \"GM\": 23.97\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 59,\r\n \"Subcategory\": \"Barras sin chocolate\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222041062,\r\n \"Name\": \"BNFD NUGATON BLANCO 27GR\",\r\n \"Price\": \"1.21\",\r\n \"Units\": 42,\r\n \"Sales\": 41.86,\r\n \"GM\": 23.86\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7794600458523,\r\n \"Name\": \"KR BANADOS RHODESIA 75GR\",\r\n \"Price\": \"2.10\",\r\n \"Units\": 53,\r\n \"Sales\": 92.18,\r\n \"GM\": 23.84\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77915627,\r\n \"Name\": \"PM Benson & Hedges 100 Box 20und\",\r\n \"Price\": \"4.31\",\r\n \"Units\": 82,\r\n \"Sales\": 330.01,\r\n \"GM\": 23.82\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790407490605,\r\n \"Name\": \"Cofler Aireado blanco leche 6\",\r\n \"Price\": \"3.60\",\r\n \"Units\": 19,\r\n \"Sales\": 56.62,\r\n \"GM\": 23.81\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77921598,\r\n \"Name\": \"KR MILKA M JOY CASTANAS CARAMELO\",\r\n \"Price\": \"1.60\",\r\n \"Units\": 66,\r\n \"Sales\": 87.14,\r\n \"GM\": 23.76\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 76145513,\r\n \"Name\": \"KR Toblerone 50gr\",\r\n \"Price\": \"4.50\",\r\n \"Units\": 16,\r\n \"Sales\": 59.52,\r\n \"GM\": 23.75\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040439306,\r\n \"Name\": \"ARC ARCOR MANA RELLENAS CHOCO\",\r\n \"Price\": \"2.90\",\r\n \"Units\": 26,\r\n \"Sales\": 62.4,\r\n \"GM\": 23.74\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77918536,\r\n \"Name\": \"CAD Halls Fr Frut Mentol Eucalip 20G\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 51,\r\n \"Sales\": 54.59,\r\n \"GM\": 23.72\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771668482002,\r\n \"Name\": \"FTV Mag\",\r\n \"Price\": \"7.90\",\r\n \"Units\": 3,\r\n \"Sales\": 23.7,\r\n \"GM\": 23.7\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771851361008,\r\n \"Name\": \"PLAN D\",\r\n \"Price\": \"7.90\",\r\n \"Units\": 3,\r\n \"Sales\": 23.7,\r\n \"GM\": 23.7\r\n },\r\n {\r\n \"CategoryId\": 13,\r\n \"Category\": \"Otro Tabaco\",\r\n \"SubcategoryId\": 15,\r\n \"Subcategory\": \"Cigarros\",\r\n \"Manufacturer\": \"PURO TABACO\",\r\n \"EAN\": 8500001542131,\r\n \"Name\": \"RJ Romeo y Julieta Purito\",\r\n \"Price\": \"12.00\",\r\n \"Units\": 4,\r\n \"Sales\": 40.36,\r\n \"GM\": 23.68\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 80,\r\n \"Subcategory\": \"YOGURT\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7793940133299,\r\n \"Name\": \"DNN Ser Cereales muesli 191gr\",\r\n \"Price\": \"2.47\",\r\n \"Units\": 38,\r\n \"Sales\": 77.51,\r\n \"GM\": 23.65\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062548341,\r\n \"Name\": \"DNN SER NARANJ DURAZN 2 LTS\",\r\n \"Price\": \"5.10\",\r\n \"Units\": 13,\r\n \"Sales\": 54.73,\r\n \"GM\": 23.63\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580476007,\r\n \"Name\": \"La Campagnola BC Manzana 250ml\",\r\n \"Price\": \"1.90\",\r\n \"Units\": 34,\r\n \"Sales\": 53.71,\r\n \"GM\": 23.62\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6210,\r\n \"Name\": \"SFA Filtros Fram PH-5317\",\r\n \"Price\": \"26.08\",\r\n \"Units\": 2,\r\n \"Sales\": 43.1,\r\n \"GM\": 23.45\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222002827,\r\n \"Name\": \"BNFD DRF Naranja 23 Gr\",\r\n \"Price\": \"0.82\",\r\n \"Units\": 76,\r\n \"Sales\": 51.14,\r\n \"GM\": 23.28\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 60,\r\n \"Subcategory\": \"Caramelos en bolsa\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222001844,\r\n \"Name\": \"BNFD Billiken Gom Tutti-Frutti 30gr\",\r\n \"Price\": \"0.91\",\r\n \"Units\": 62,\r\n \"Sales\": 46.67,\r\n \"GM\": 23.05\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 62,\r\n \"Subcategory\": \"Caramelos sueltos\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 1153,\r\n \"Name\": \"CAD Palitos de la Selva 3.1gr\",\r\n \"Price\": \"0.10\",\r\n \"Units\": 477,\r\n \"Sales\": 39.14,\r\n \"GM\": 23.04\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"JORGITO\",\r\n \"EAN\": 7790957000538,\r\n \"Name\": \"JRG Jorgito Blanco 155gr\",\r\n \"Price\": \"3.70\",\r\n \"Units\": 19,\r\n \"Sales\": 58.14,\r\n \"GM\": 22.97\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 60,\r\n \"Subcategory\": \"Caramelos en bolsa\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580169312,\r\n \"Name\": \"Fruti Gelatin Cerebritos Rell 30g\",\r\n \"Price\": \"1.10\",\r\n \"Units\": 59,\r\n \"Sales\": 53.69,\r\n \"GM\": 22.88\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7794600458530,\r\n \"Name\": \"KR BANADOS SNACK 75 GRS\",\r\n \"Price\": \"2.10\",\r\n \"Units\": 51,\r\n \"Sales\": 88.66,\r\n \"GM\": 22.85\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7794600459605,\r\n \"Name\": \"KR Terrabusi Variedad Dorada 300g\",\r\n \"Price\": \"4.20\",\r\n \"Units\": 16,\r\n \"Sales\": 55.52,\r\n \"GM\": 22.8\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910059,\r\n \"Name\": \"Lucky Strike KS 20und\",\r\n \"Price\": \"3.93\",\r\n \"Units\": 89,\r\n \"Sales\": 325.49,\r\n \"GM\": 22.79\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77918543,\r\n \"Name\": \"CAD Halls Free Menta Mentol 20gr\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 49,\r\n \"Sales\": 52.48,\r\n \"GM\": 22.74\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300130213,\r\n \"Name\": \"KR TERRABUSI ALFAJOR MIX 55G\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 25,\r\n \"Sales\": 47.5,\r\n \"GM\": 22.73\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 80,\r\n \"Subcategory\": \"YOGURT\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7793940104015,\r\n \"Name\": \"DNN Ser Firme Vainilla 200gr\",\r\n \"Price\": \"1.58\",\r\n \"Units\": 75,\r\n \"Sales\": 98.24,\r\n \"GM\": 22.61\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"GENERAL MILLS ARG\",\r\n \"EAN\": 3415581534276,\r\n \"Name\": \"GMA Haagen Dazs Cookies & Cream 100ml\",\r\n \"Price\": \"8.50\",\r\n \"Units\": 9,\r\n \"Sales\": 63.2,\r\n \"GM\": 22.59\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"NESTLE\",\r\n \"EAN\": 79200311025,\r\n \"Name\": \"IMS: Wonka Runt 6 oz\",\r\n \"Price\": \"9.00\",\r\n \"Units\": 8,\r\n \"Sales\": 59.52,\r\n \"GM\": 22.56\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"NESTLE\",\r\n \"EAN\": 79200158866,\r\n \"Name\": \"NES Wonka Sweetarts 170g\",\r\n \"Price\": \"9.00\",\r\n \"Units\": 8,\r\n \"Sales\": 59.52,\r\n \"GM\": 22.56\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771850413005,\r\n \"Name\": \"7 DIAS\",\r\n \"Price\": \"4.50\",\r\n \"Units\": 5,\r\n \"Sales\": 22.5,\r\n \"GM\": 22.5\r\n },\r\n {\r\n \"CategoryId\": 134,\r\n \"Category\": \"Almacen\",\r\n \"SubcategoryId\": 135,\r\n \"Subcategory\": \"CAFE Y TE\",\r\n \"Manufacturer\": \"MOL RIO DELA PLATA\",\r\n \"EAN\": 7790387120370,\r\n \"Name\": \"ELM Termo Taragui\",\r\n \"Price\": \"7.73\",\r\n \"Units\": 8,\r\n \"Sales\": 51.1,\r\n \"GM\": 22.4\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7794600458554,\r\n \"Name\": \"KR BANADOS HABANITOS 75GRS\",\r\n \"Price\": \"2.10\",\r\n \"Units\": 43,\r\n \"Sales\": 74.79,\r\n \"GM\": 22.34\r\n },\r\n {\r\n \"CategoryId\": 13,\r\n \"Category\": \"Otro Tabaco\",\r\n \"SubcategoryId\": 15,\r\n \"Subcategory\": \"Cigarros\",\r\n \"Manufacturer\": \"PURO TABACO\",\r\n \"EAN\": 8810,\r\n \"Name\": \"PTBC Fonseca Delicias Und\",\r\n \"Price\": \"22.00\",\r\n \"Units\": 2,\r\n \"Sales\": 36.94,\r\n \"GM\": 22.24\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040938908,\r\n \"Name\": \"BGLY REX ORIGINAL 125G\",\r\n \"Price\": \"3.20\",\r\n \"Units\": 21,\r\n \"Sales\": 55.45,\r\n \"GM\": 22.2\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895064906,\r\n \"Name\": \"QUATRO POMELO LIGHT 500ML\",\r\n \"Price\": \"3.30\",\r\n \"Units\": 17,\r\n \"Sales\": 46.39,\r\n \"GM\": 22.15\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 77903518,\r\n \"Name\": \"BGLY Opera 92gr\",\r\n \"Price\": \"2.60\",\r\n \"Units\": 23,\r\n \"Sales\": 49.45,\r\n \"GM\": 22.13\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 93,\r\n \"Subcategory\": \"HELADOS PREMIUM\",\r\n \"Manufacturer\": \"GENERAL MILLS ARG\",\r\n \"EAN\": 3415581377149,\r\n \"Name\": \"GM HAAG DAZS V CARA BROWN 100ML\",\r\n \"Price\": \"8.50\",\r\n \"Units\": 9,\r\n \"Sales\": 63.18,\r\n \"GM\": 22.1\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77933416,\r\n \"Name\": \"Cofler Leche Alm 28g\",\r\n \"Price\": \"1.40\",\r\n \"Units\": 46,\r\n \"Sales\": 53.29,\r\n \"GM\": 22.03\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771668284002,\r\n \"Name\": \"El Federal\",\r\n \"Price\": \"5.50\",\r\n \"Units\": 4,\r\n \"Sales\": 22,\r\n \"GM\": 22\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 28400055116,\r\n \"Name\": \"FL Lays Stax Cheddar 155gr\",\r\n \"Price\": \"9.50\",\r\n \"Units\": 8,\r\n \"Sales\": 62.8,\r\n \"GM\": 21.92\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040929906,\r\n \"Name\": \"BGLY Chocolinas 170gr\",\r\n \"Price\": \"3.00\",\r\n \"Units\": 21,\r\n \"Sales\": 52.08,\r\n \"GM\": 21.85\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771667431001,\r\n \"Name\": \"Jardin de Genios\",\r\n \"Price\": \"10.90\",\r\n \"Units\": 2,\r\n \"Sales\": 21.8,\r\n \"GM\": 21.8\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 9311,\r\n \"Name\": \"FANTA BOTELLA 237ML\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 23,\r\n \"Sales\": 43.73,\r\n \"GM\": 21.79\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 60,\r\n \"Subcategory\": \"Caramelos en bolsa\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580039301,\r\n \"Name\": \"SUGUS SORPRESA 33GR\",\r\n \"Price\": \"2.80\",\r\n \"Units\": 27,\r\n \"Sales\": 62.41,\r\n \"GM\": 21.76\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954051112,\r\n \"Name\": \"SFA Filtros Fram CA-5111\",\r\n \"Price\": \"24.72\",\r\n \"Units\": 2,\r\n \"Sales\": 40.86,\r\n \"GM\": 21.71\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040930407,\r\n \"Name\": \"BGLY Amor 112g\",\r\n \"Price\": \"2.70\",\r\n \"Units\": 22,\r\n \"Sales\": 49.06,\r\n \"GM\": 21.66\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 63,\r\n \"Subcategory\": \"Golosinas a granel\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040351103,\r\n \"Name\": \"Cereal Mix Yogurt Frut X 3 84g\",\r\n \"Price\": \"4.10\",\r\n \"Units\": 18,\r\n \"Sales\": 61.02,\r\n \"GM\": 21.62\r\n },\r\n {\r\n \"CategoryId\": 65,\r\n \"Category\": \"Leches\",\r\n \"SubcategoryId\": 66,\r\n \"Subcategory\": \"WHOLE MILK\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7793940345005,\r\n \"Name\": \"DNN La Serenis Lech Ent Larga D\",\r\n \"Price\": \"3.30\",\r\n \"Units\": 34,\r\n \"Sales\": 92.76,\r\n \"GM\": 21.51\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CHUPA CHUPS\",\r\n \"EAN\": 84196033,\r\n \"Name\": \"CH Smint White Fresa\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 20,\r\n \"Sales\": 57.82,\r\n \"GM\": 21.43\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"TIA MARUCA\",\r\n \"EAN\": 7798082740268,\r\n \"Name\": \"TM Tia Maruca Bizc de Grasa 250g\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 17,\r\n \"Sales\": 49.15,\r\n \"GM\": 21.39\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040929807,\r\n \"Name\": \"BGLY Coquitas 170gr\",\r\n \"Price\": \"2.90\",\r\n \"Units\": 22,\r\n \"Sales\": 52.79,\r\n \"GM\": 21.36\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300093952,\r\n \"Name\": \"KR CLUB SOCIAL CHIPS PARMES 40G\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 23,\r\n \"Sales\": 45.55,\r\n \"GM\": 21.32\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040932708,\r\n \"Name\": \"BGLY Merengadas 93gr\",\r\n \"Price\": \"2.70\",\r\n \"Units\": 22,\r\n \"Sales\": 49.06,\r\n \"GM\": 21.17\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77916426,\r\n \"Name\": \"Topline Tableta Menta 4und\",\r\n \"Price\": \"0.90\",\r\n \"Units\": 62,\r\n \"Sales\": 45.97,\r\n \"GM\": 21.13\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310980736,\r\n \"Name\": \"FL Doritos Queso 85G\",\r\n \"Price\": \"3.90\",\r\n \"Units\": 18,\r\n \"Sales\": 57.97,\r\n \"GM\": 21.07\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 7702133264108,\r\n \"Name\": \"CAD HALLS CRUNCHY MENTA 18G\",\r\n \"Price\": \"1.10\",\r\n \"Units\": 58,\r\n \"Sales\": 52.78,\r\n \"GM\": 21.06\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7794600460083,\r\n \"Name\": \"KR Pepitos Rellenas Chocolate 130gr\",\r\n \"Price\": \"2.50\",\r\n \"Units\": 23,\r\n \"Sales\": 47.59,\r\n \"GM\": 21.02\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954045586,\r\n \"Name\": \"SFA Filtros Fram PH-4558\",\r\n \"Price\": \"17.97\",\r\n \"Units\": 3,\r\n \"Sales\": 44.56,\r\n \"GM\": 20.95\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6743,\r\n \"Name\": \"SFA Filtros Fram G-5857\",\r\n \"Price\": \"34.13\",\r\n \"Units\": 2,\r\n \"Sales\": 56.42,\r\n \"GM\": 20.92\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"GEORGALOS\",\r\n \"EAN\": 77909497,\r\n \"Name\": \"GR CHOCGEORGALOS S/A FRUT30G\",\r\n \"Price\": \"3.00\",\r\n \"Units\": 20,\r\n \"Sales\": 49.6,\r\n \"GM\": 20.8\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580591816,\r\n \"Name\": \"TOPLINE C S/A FRUTA 12GR\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 55,\r\n \"Sales\": 54.47,\r\n \"GM\": 20.8\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300093938,\r\n \"Name\": \"KR CLUB SOCIAL CHIPS CREMCEB 40G\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 22,\r\n \"Sales\": 43.59,\r\n \"GM\": 20.78\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 37000424536,\r\n \"Name\": \"LMAR PRINGLES ONION 80GR\",\r\n \"Price\": \"9.00\",\r\n \"Units\": 7,\r\n \"Sales\": 52.08,\r\n \"GM\": 20.78\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770328488002,\r\n \"Name\": \"Muy Interesante\",\r\n \"Price\": \"6.90\",\r\n \"Units\": 3,\r\n \"Sales\": 20.7,\r\n \"GM\": 20.7\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771669825006,\r\n \"Name\": \"TKM Revista\",\r\n \"Price\": \"6.90\",\r\n \"Units\": 3,\r\n \"Sales\": 20.7,\r\n \"GM\": 20.7\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 7798011660674,\r\n \"Name\": \"TPS Cuerda Emergencia Remolq Und\",\r\n \"Price\": \"30.00\",\r\n \"Units\": 2,\r\n \"Sales\": 49.58,\r\n \"GM\": 20.68\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77946805,\r\n \"Name\": \"Mentho Plus S.Az Cherry 26.6\",\r\n \"Price\": \"1.50\",\r\n \"Units\": 37,\r\n \"Sales\": 45.88,\r\n \"GM\": 20.56\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 80,\r\n \"Subcategory\": \"YOGURT\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7793940016028,\r\n \"Name\": \"DNN Yogurisimo Firme Frutilla 200gr\",\r\n \"Price\": \"1.51\",\r\n \"Units\": 71,\r\n \"Sales\": 88.59,\r\n \"GM\": 20.49\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 60,\r\n \"Subcategory\": \"Caramelos en bolsa\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222001868,\r\n \"Name\": \"BNFD Billiken Gom frutas 30gr\",\r\n \"Price\": \"0.91\",\r\n \"Units\": 55,\r\n \"Sales\": 41.49,\r\n \"GM\": 20.46\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040677005,\r\n \"Name\": \"TORTITAS CHOCOLATE 125GR\",\r\n \"Price\": \"2.60\",\r\n \"Units\": 23,\r\n \"Sales\": 49.45,\r\n \"GM\": 20.4\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580394806,\r\n \"Name\": \"Arcor Slice Frutilla 70ml\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 33,\r\n \"Sales\": 54.51,\r\n \"GM\": 20.39\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222041659,\r\n \"Name\": \"BNFD CHOCO BONAFIDE ALMENDRA 25G\",\r\n \"Price\": \"1.66\",\r\n \"Units\": 31,\r\n \"Sales\": 42.58,\r\n \"GM\": 20.27\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 7798011660599,\r\n \"Name\": \"TPS Conector Bateria 2und\",\r\n \"Price\": \"31.50\",\r\n \"Units\": 2,\r\n \"Sales\": 52.06,\r\n \"GM\": 20.26\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580697303,\r\n \"Name\": \"Saladix Pizza 100gr\",\r\n \"Price\": \"2.80\",\r\n \"Units\": 22,\r\n \"Sales\": 50.83,\r\n \"GM\": 20.22\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580396909,\r\n \"Name\": \"Arcor Kopa Frutilla 190ml\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 18,\r\n \"Sales\": 52.07,\r\n \"GM\": 20.19\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77939234,\r\n \"Name\": \"KR Terrabusi Choc Simple Alfaj 50gr\",\r\n \"Price\": \"1.60\",\r\n \"Units\": 42,\r\n \"Sales\": 55.46,\r\n \"GM\": 20.18\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310980897,\r\n \"Name\": \"FL CHEETOS CLASSIC 55G\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 28,\r\n \"Sales\": 55.44,\r\n \"GM\": 20.16\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7895144610788,\r\n \"Name\": \"Caramelos Mentos Frutilla\",\r\n \"Price\": \"1.40\",\r\n \"Units\": 43,\r\n \"Sales\": 49.86,\r\n \"GM\": 20.11\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895065200,\r\n \"Name\": \"Cepita Multifruta 250ml\",\r\n \"Price\": \"1.70\",\r\n \"Units\": 27,\r\n \"Sales\": 38.07,\r\n \"GM\": 20.05\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 191,\r\n \"Subcategory\": \"BRAKE FLUIDS\",\r\n \"Manufacturer\": \"WAGNER BRAKE\",\r\n \"EAN\": 7797409672626,\r\n \"Name\": \"WAG Wagner Lockh Dot 4 Liq Frenos 1L\",\r\n \"Price\": \"48.00\",\r\n \"Units\": 1,\r\n \"Sales\": 39.67,\r\n \"GM\": 20.01\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7609,\r\n \"Name\": \"Joy\",\r\n \"Price\": \"10.00\",\r\n \"Units\": 2,\r\n \"Sales\": 20,\r\n \"GM\": 20\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770325068009,\r\n \"Name\": \"MERCADO\",\r\n \"Price\": \"10.00\",\r\n \"Units\": 2,\r\n \"Sales\": 20,\r\n \"GM\": 20\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6643,\r\n \"Name\": \"SFA Filtros Fram CA-8675\",\r\n \"Price\": \"25.52\",\r\n \"Units\": 2,\r\n \"Sales\": 42.18,\r\n \"GM\": 19.98\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895064333,\r\n \"Name\": \"Cepita Naranja 1L\",\r\n \"Price\": \"4.50\",\r\n \"Units\": 10,\r\n \"Sales\": 37.3,\r\n \"GM\": 19.93\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7794600459124,\r\n \"Name\": \"KR OREO CHOCOLATE 111GR\",\r\n \"Price\": \"2.50\",\r\n \"Units\": 24,\r\n \"Sales\": 49.66,\r\n \"GM\": 19.9\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580396008,\r\n \"Name\": \"Arcor Cofler Blanco 80ml\",\r\n \"Price\": \"4.00\",\r\n \"Units\": 16,\r\n \"Sales\": 52.93,\r\n \"GM\": 19.89\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77921406,\r\n \"Name\": \"CAD HALLS UVA VERDE 27GR\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 45,\r\n \"Sales\": 44.56,\r\n \"GM\": 19.87\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895640049,\r\n \"Name\": \" POWERADE NARAN LIGHT 0,5 LTS\",\r\n \"Price\": \"3.25\",\r\n \"Units\": 12,\r\n \"Sales\": 32.27,\r\n \"GM\": 19.74\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895065217,\r\n \"Name\": \"Cepita Multifrutas 1L\",\r\n \"Price\": \"4.50\",\r\n \"Units\": 9,\r\n \"Sales\": 33.57,\r\n \"GM\": 19.71\r\n },\r\n {\r\n \"CategoryId\": 134,\r\n \"Category\": \"Almacen\",\r\n \"SubcategoryId\": 135,\r\n \"Subcategory\": \"CAFE Y TE\",\r\n \"Manufacturer\": \"MOL RIO DELA PLATA\",\r\n \"EAN\": 7790387110234,\r\n \"Name\": \"MRP Taragui Yerba Palo 500gr\",\r\n \"Price\": \"5.80\",\r\n \"Units\": 10,\r\n \"Sales\": 47.95,\r\n \"GM\": 19.7\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 63,\r\n \"Subcategory\": \"Golosinas a granel\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580489601,\r\n \"Name\": \"Arcor Bombones de Fruta 500g\",\r\n \"Price\": \"12.00\",\r\n \"Units\": 5,\r\n \"Sales\": 49.6,\r\n \"GM\": 19.69\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790407049001,\r\n \"Name\": \"Cofler Aireado Leche 100g\",\r\n \"Price\": \"6.70\",\r\n \"Units\": 8,\r\n \"Sales\": 44.31,\r\n \"GM\": 19.62\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 47,\r\n \"Subcategory\": \"Bebidas Deportivas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7792170002818,\r\n \"Name\": \"Gatorade Naranja 946ml\",\r\n \"Price\": \"6.50\",\r\n \"Units\": 8,\r\n \"Sales\": 42.96,\r\n \"GM\": 19.6\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77977731,\r\n \"Name\": \"PM Virginia Lights Soft 20\",\r\n \"Price\": \"4.33\",\r\n \"Units\": 61,\r\n \"Sales\": 245.29,\r\n \"GM\": 19.6\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580349011,\r\n \"Name\": \"COFLER LECHE X 55G\",\r\n \"Price\": \"3.40\",\r\n \"Units\": 17,\r\n \"Sales\": 47.77,\r\n \"GM\": 19.55\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771668548005,\r\n \"Name\": \"Maxim Argentina\",\r\n \"Price\": \"6.50\",\r\n \"Units\": 3,\r\n \"Sales\": 19.5,\r\n \"GM\": 19.5\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77921697,\r\n \"Name\": \"KRA ALFAJOR TERRABU DUL LECH 48G\",\r\n \"Price\": \"1.40\",\r\n \"Units\": 40,\r\n \"Sales\": 46.36,\r\n \"GM\": 19.47\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6653,\r\n \"Name\": \"SFA Filtros Fram CA-8963\",\r\n \"Price\": \"61.24\",\r\n \"Units\": 1,\r\n \"Sales\": 50.61,\r\n \"GM\": 19.38\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790407049018,\r\n \"Name\": \"Cofler Aireado Mixto 100g\",\r\n \"Price\": \"6.70\",\r\n \"Units\": 8,\r\n \"Sales\": 44.32,\r\n \"GM\": 19.37\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6796,\r\n \"Name\": \"SFA Filtros Fram P-5328\",\r\n \"Price\": \"57.83\",\r\n \"Units\": 1,\r\n \"Sales\": 47.79,\r\n \"GM\": 19.37\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"GENERAL MILLS ARG\",\r\n \"EAN\": 3415581332162,\r\n \"Name\": \"GMA Haagen Dazs Macadam Brittle 100ml\",\r\n \"Price\": \"8.50\",\r\n \"Units\": 8,\r\n \"Sales\": 56.16,\r\n \"GM\": 19.36\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77946836,\r\n \"Name\": \"Menthoplus S Az Pomelo 26.6g\",\r\n \"Price\": \"1.50\",\r\n \"Units\": 33,\r\n \"Sales\": 40.92,\r\n \"GM\": 19.31\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040676800,\r\n \"Name\": \"Tortitas Black 125gr\",\r\n \"Price\": \"2.60\",\r\n \"Units\": 22,\r\n \"Sales\": 47.3,\r\n \"GM\": 19.31\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7802215512254,\r\n \"Name\": \"BNFD COSTA FRAC GALLETI VAINILLA\",\r\n \"Price\": \"2.80\",\r\n \"Units\": 23,\r\n \"Sales\": 53.16,\r\n \"GM\": 19.29\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7791813421269,\r\n \"Name\": \"PEPSI MAX 1.5L\",\r\n \"Price\": \"5.40\",\r\n \"Units\": 9,\r\n \"Sales\": 40.5,\r\n \"GM\": 19.16\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222042427,\r\n \"Name\": \"BNFD DONUTS CHOCOLATE 78 GR\",\r\n \"Price\": \"4.20\",\r\n \"Units\": 9,\r\n \"Sales\": 31.23,\r\n \"GM\": 19.16\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040298903,\r\n \"Name\": \"Aguila Mini Torta Coco 73gr\",\r\n \"Price\": \"2.20\",\r\n \"Units\": 24,\r\n \"Sales\": 43.68,\r\n \"GM\": 19.15\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77916198,\r\n \"Name\": \"PM Le Mans Suave 100 20und\",\r\n \"Price\": \"3.59\",\r\n \"Units\": 57,\r\n \"Sales\": 191.1,\r\n \"GM\": 19.02\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7792799005214,\r\n \"Name\": \"Nestle Nar Dur 1500ml\",\r\n \"Price\": \"4.40\",\r\n \"Units\": 10,\r\n \"Sales\": 36.5,\r\n \"GM\": 18.97\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6214,\r\n \"Name\": \"SFA Fram PH 9566\",\r\n \"Price\": \"40.00\",\r\n \"Units\": 1,\r\n \"Sales\": 33.06,\r\n \"GM\": 18.91\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 5011053014956,\r\n \"Name\": \"TPPS Spray Pop 14ml\",\r\n \"Price\": \"5.70\",\r\n \"Units\": 8,\r\n \"Sales\": 37.71,\r\n \"GM\": 18.9\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954869267,\r\n \"Name\": \"SFA Fram Filtro CA 9511\",\r\n \"Price\": \"28.00\",\r\n \"Units\": 2,\r\n \"Sales\": 46.28,\r\n \"GM\": 18.84\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 81,\r\n \"Subcategory\": \"OTHER DAIRY\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7791337222151,\r\n \"Name\": \"DDNN Activia Manz-Ciruela 200gr\",\r\n \"Price\": \"2.18\",\r\n \"Units\": 51,\r\n \"Sales\": 92.06,\r\n \"GM\": 18.77\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 164,\r\n \"Subcategory\": \"BATTERIES\",\r\n \"Manufacturer\": \"ENERGIZER\",\r\n \"EAN\": 39800027955,\r\n \"Name\": \"ENZ Energizer Titanium AA 4\",\r\n \"Price\": \"12.50\",\r\n \"Units\": 4,\r\n \"Sales\": 41.32,\r\n \"GM\": 18.68\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580398903,\r\n \"Name\": \"Arcor Cono Snack 75ml\",\r\n \"Price\": \"2.50\",\r\n \"Units\": 21,\r\n \"Sales\": 43.43,\r\n \"GM\": 18.64\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910684,\r\n \"Name\": \"Jockey Club Suave 100 S 20und\",\r\n \"Price\": \"3.56\",\r\n \"Units\": 79,\r\n \"Sales\": 261.61,\r\n \"GM\": 18.62\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 165,\r\n \"Subcategory\": \"FILM / PHOTO\",\r\n \"Manufacturer\": \"KODAK\",\r\n \"EAN\": 86806033947,\r\n \"Name\": \"KOD KODAK GOLD PLUS 100 X 36\",\r\n \"Price\": \"21.00\",\r\n \"Units\": 2,\r\n \"Sales\": 34.72,\r\n \"GM\": 18.58\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"FELFORT\",\r\n \"EAN\": 7790206515301,\r\n \"Name\": \"FLFR JACKS HUEVO 14GR\",\r\n \"Price\": \"5.30\",\r\n \"Units\": 10,\r\n \"Sales\": 43.82,\r\n \"GM\": 18.57\r\n },\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 216,\r\n \"Subcategory\": \"COFFEE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2046,\r\n \"Name\": \"CAF� AMERICANO VIEN�S GRANDE\",\r\n \"Price\": \"4.50\",\r\n \"Units\": 8,\r\n \"Sales\": 29.76,\r\n \"GM\": 18.56\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 149,\r\n \"Subcategory\": \"ANALGESICOS\",\r\n \"Manufacturer\": \"BAYER\",\r\n \"EAN\": 9801,\r\n \"Name\": \"BY Bayaspirina C Calien 3.385gr\",\r\n \"Price\": \"1.44\",\r\n \"Units\": 31,\r\n \"Sales\": 44.6,\r\n \"GM\": 18.56\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895064890,\r\n \"Name\": \"Quatro Pomelo Light 1.5L\",\r\n \"Price\": \"5.50\",\r\n \"Units\": 10,\r\n \"Sales\": 45.5,\r\n \"GM\": 18.54\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040941601,\r\n \"Name\": \"BGLY Ser Dulces 125 Gr\",\r\n \"Price\": \"2.90\",\r\n \"Units\": 20,\r\n \"Sales\": 48,\r\n \"GM\": 18.4\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222041635,\r\n \"Name\": \"BNFD Chocolate Bonafide Leche\",\r\n \"Price\": \"1.56\",\r\n \"Units\": 32,\r\n \"Sales\": 41.33,\r\n \"GM\": 18.34\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7794600460106,\r\n \"Name\": \"KR Pepitos Rellenas Vainilla 130gr\",\r\n \"Price\": \"2.50\",\r\n \"Units\": 20,\r\n \"Sales\": 41.39,\r\n \"GM\": 18.28\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"FELFORT\",\r\n \"EAN\": 77909053,\r\n \"Name\": \"FLFR Cereal Fort Manzana 22g\",\r\n \"Price\": \"1.50\",\r\n \"Units\": 33,\r\n \"Sales\": 40.92,\r\n \"GM\": 18.22\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 53997784,\r\n \"Name\": \"Push Porp Triple 34 gr\",\r\n \"Price\": \"6.91\",\r\n \"Units\": 7,\r\n \"Sales\": 39.96,\r\n \"GM\": 18.22\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7891962021607,\r\n \"Name\": \"BAUDUCCO TOSTADA INTEGRAL 140G\",\r\n \"Price\": \"4.30\",\r\n \"Units\": 14,\r\n \"Sales\": 49.71,\r\n \"GM\": 18.21\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"DON SATUR\",\r\n \"EAN\": 7795735000342,\r\n \"Name\": \"DST Don Satur Bizcocho Negro 200\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 24,\r\n \"Sales\": 45.6,\r\n \"GM\": 18.18\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77913258,\r\n \"Name\": \"PM Next FF Box 20und\",\r\n \"Price\": \"2.79\",\r\n \"Units\": 89,\r\n \"Sales\": 231.08,\r\n \"GM\": 18.02\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771668204000,\r\n \"Name\": \"LA VALIJITA\",\r\n \"Price\": \"9.00\",\r\n \"Units\": 2,\r\n \"Sales\": 18,\r\n \"GM\": 18\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580396800,\r\n \"Name\": \"Arcor Kopa Dulce Leche 190ml\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 16,\r\n \"Sales\": 46.28,\r\n \"GM\": 17.93\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7791813421542,\r\n \"Name\": \"7 UP Light 1.5L\",\r\n \"Price\": \"5.40\",\r\n \"Units\": 9,\r\n \"Sales\": 40.32,\r\n \"GM\": 17.85\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 9320,\r\n \"Name\": \"SPRITE BOTELLA 237ML\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 19,\r\n \"Sales\": 36.1,\r\n \"GM\": 17.8\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771668300009,\r\n \"Name\": \"La Mano\",\r\n \"Price\": \"8.90\",\r\n \"Units\": 2,\r\n \"Sales\": 17.8,\r\n \"GM\": 17.8\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 80,\r\n \"Subcategory\": \"YOGURT\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7793940333026,\r\n \"Name\": \"DNN Yogurisimo Beb Frutilla 190 grs\",\r\n \"Price\": \"2.06\",\r\n \"Units\": 45,\r\n \"Sales\": 76.65,\r\n \"GM\": 17.76\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7802215505409,\r\n \"Name\": \"BNFD COSTA GALLETITA COCO 125G\",\r\n \"Price\": \"2.50\",\r\n \"Units\": 27,\r\n \"Sales\": 55.89,\r\n \"GM\": 17.75\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"MOLINO CANUELAS\",\r\n \"EAN\": 7792200000319,\r\n \"Name\": \"MLC 9 de Oro Bizcocho Azucar 210gr\",\r\n \"Price\": \"2.60\",\r\n \"Units\": 19,\r\n \"Sales\": 40.85,\r\n \"GM\": 17.73\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"BAGGIO\",\r\n \"EAN\": 7790036972497,\r\n \"Name\": \"RPBB Baggio Naranja 200ml\",\r\n \"Price\": \"1.70\",\r\n \"Units\": 24,\r\n \"Sales\": 33.84,\r\n \"GM\": 17.55\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77954923,\r\n \"Name\": \"TOPLINE ONE MENTA 0.8GR\",\r\n \"Price\": \"3.80\",\r\n \"Units\": 14,\r\n \"Sales\": 43.96,\r\n \"GM\": 17.55\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 81,\r\n \"Subcategory\": \"OTHER DAIRY\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7791337571853,\r\n \"Name\": \"DNN Actimel Multifruta 100gr\",\r\n \"Price\": \"1.48\",\r\n \"Units\": 49,\r\n \"Sales\": 59.8,\r\n \"GM\": 17.53\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954869175,\r\n \"Name\": \"SFA Fram Filtro CA 9315\",\r\n \"Price\": \"45.36\",\r\n \"Units\": 1,\r\n \"Sales\": 37.49,\r\n \"GM\": 17.51\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040930209,\r\n \"Name\": \"BGLY Mellizas 112G\",\r\n \"Price\": \"2.70\",\r\n \"Units\": 18,\r\n \"Sales\": 40.14,\r\n \"GM\": 17.51\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580665708,\r\n \"Name\": \"Cofler Almendras 55gr\",\r\n \"Price\": \"3.40\",\r\n \"Units\": 14,\r\n \"Sales\": 39.34,\r\n \"GM\": 17.45\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7794910452372,\r\n \"Name\": \"KR CEREALITAS COPOS 170GR\",\r\n \"Price\": \"2.50\",\r\n \"Units\": 21,\r\n \"Sales\": 43.47,\r\n \"GM\": 17.42\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 7791249010525,\r\n \"Name\": \"CAD ADAMS MENTOL\",\r\n \"Price\": \"0.80\",\r\n \"Units\": 71,\r\n \"Sales\": 46.86,\r\n \"GM\": 17.39\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310979952,\r\n \"Name\": \"FL LAYS MEDITERRANEA TOMAT Y ALB\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 24,\r\n \"Sales\": 47.52,\r\n \"GM\": 17.28\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77920355,\r\n \"Name\": \"Jockey Club KS 20und\",\r\n \"Price\": \"3.41\",\r\n \"Units\": 83,\r\n \"Sales\": 262.89,\r\n \"GM\": 17.26\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 80,\r\n \"Subcategory\": \"YOGURT\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7793940333019,\r\n \"Name\": \"DNN Yogurisimo Beb Vainilla 190 grs\",\r\n \"Price\": \"2.01\",\r\n \"Units\": 47,\r\n \"Sales\": 78.29,\r\n \"GM\": 17.23\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7791813421351,\r\n \"Name\": \"Pepsi Light 1.5L\",\r\n \"Price\": \"5.40\",\r\n \"Units\": 9,\r\n \"Sales\": 40.5,\r\n \"GM\": 17.22\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6208,\r\n \"Name\": \"SFA Filtros Fram PH-3593A\",\r\n \"Price\": \"34.81\",\r\n \"Units\": 1,\r\n \"Sales\": 28.77,\r\n \"GM\": 17.22\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7793427000908,\r\n \"Name\": \"SIL Mr Sapito Lav Parabri 42ml\",\r\n \"Price\": \"4.50\",\r\n \"Units\": 12,\r\n \"Sales\": 44.64,\r\n \"GM\": 17.04\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"FUSEL\",\r\n \"EAN\": 7798011060030,\r\n \"Name\": \"FSL Fusibles F Univ Ron Bay 8und\",\r\n \"Price\": \"5.50\",\r\n \"Units\": 9,\r\n \"Sales\": 40.94,\r\n \"GM\": 16.98\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77926258,\r\n \"Name\": \"PM L&M Light Box 20und\",\r\n \"Price\": \"3.64\",\r\n \"Units\": 48,\r\n \"Sales\": 163.17,\r\n \"GM\": 16.93\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954868796,\r\n \"Name\": \"SFA Fram Filtro CA 5680\",\r\n \"Price\": \"43.66\",\r\n \"Units\": 1,\r\n \"Sales\": 36.08,\r\n \"GM\": 16.9\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040613706,\r\n \"Name\": \"BON O BON ALFAJOR NEGRO 40G\",\r\n \"Price\": \"1.40\",\r\n \"Units\": 34,\r\n \"Sales\": 39.41,\r\n \"GM\": 16.9\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222042434,\r\n \"Name\": \"BNFD BONAFIDE DONUTS BLANCAS 78 GRS\",\r\n \"Price\": \"4.20\",\r\n \"Units\": 8,\r\n \"Sales\": 27.76,\r\n \"GM\": 16.76\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040298804,\r\n \"Name\": \"Aguila Mini Torta Brownie 74gr\",\r\n \"Price\": \"2.20\",\r\n \"Units\": 21,\r\n \"Sales\": 38.22,\r\n \"GM\": 16.74\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222042229,\r\n \"Name\": \"BNFD BONAFIDE BOCADITO BLANC 16G\",\r\n \"Price\": \"1.03\",\r\n \"Units\": 34,\r\n \"Sales\": 29.07,\r\n \"GM\": 16.72\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 9317,\r\n \"Name\": \"PST POMELO BOTELLA 237ML\",\r\n \"Price\": \"2.20\",\r\n \"Units\": 19,\r\n \"Sales\": 34.77,\r\n \"GM\": 16.67\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77915542,\r\n \"Name\": \"PM Benson & Hedges 100 20und\",\r\n \"Price\": \"4.34\",\r\n \"Units\": 45,\r\n \"Sales\": 182.32,\r\n \"GM\": 16.62\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771667466003,\r\n \"Name\": \"Fortuna\",\r\n \"Price\": \"8.30\",\r\n \"Units\": 2,\r\n \"Sales\": 16.6,\r\n \"GM\": 16.6\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771514700007,\r\n \"Name\": \"Sophia\",\r\n \"Price\": \"8.30\",\r\n \"Units\": 2,\r\n \"Sales\": 16.6,\r\n \"GM\": 16.6\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310979914,\r\n \"Name\": \"FL LAYS MEDITERRAN JAM SERRANO\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 23,\r\n \"Sales\": 45.54,\r\n \"GM\": 16.56\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 191,\r\n \"Subcategory\": \"BRAKE FLUIDS\",\r\n \"Manufacturer\": \"WAGNER BRAKE\",\r\n \"EAN\": 7797409183009,\r\n \"Name\": \"WAG Wagner Lockheed Liq Fre 350ml\",\r\n \"Price\": \"14.50\",\r\n \"Units\": 3,\r\n \"Sales\": 35.94,\r\n \"GM\": 16.53\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77922786,\r\n \"Name\": \"CAD PowerMints Frutas\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 23,\r\n \"Sales\": 43.7,\r\n \"GM\": 16.51\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"P&G\",\r\n \"EAN\": 37000117278,\r\n \"Name\": \"PG PRINGLES ORIGINAL CHICA 43G\",\r\n \"Price\": \"6.00\",\r\n \"Units\": 8,\r\n \"Sales\": 39.68,\r\n \"GM\": 16.31\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"CHUPA CHUPS\",\r\n \"EAN\": 76350610053,\r\n \"Name\": \"CH CRAZY DIPS FRESA 12G\",\r\n \"Price\": \"1.40\",\r\n \"Units\": 34,\r\n \"Sales\": 39.38,\r\n \"GM\": 16.3\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7802215505270,\r\n \"Name\": \"BNFD COSTA GALLETITA LIMON 140G\",\r\n \"Price\": \"2.50\",\r\n \"Units\": 25,\r\n \"Sales\": 51.75,\r\n \"GM\": 16.3\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"TIA MARUCA\",\r\n \"EAN\": 7798082740107,\r\n \"Name\": \"TM Tia Maruca Coco 250gr\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 13,\r\n \"Sales\": 37.58,\r\n \"GM\": 16.27\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77916501,\r\n \"Name\": \"Cereal Mix 23g\",\r\n \"Price\": \"1.40\",\r\n \"Units\": 29,\r\n \"Sales\": 33.59,\r\n \"GM\": 16.26\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 63,\r\n \"Subcategory\": \"Golosinas a granel\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 7791249985915,\r\n \"Name\": \"CAD MANTECOL 250G\",\r\n \"Price\": \"6.00\",\r\n \"Units\": 9,\r\n \"Sales\": 44.64,\r\n \"GM\": 16.11\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580395308,\r\n \"Name\": \"Arcor Mr Pops Max Crazy 100ml\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 26,\r\n \"Sales\": 42.95,\r\n \"GM\": 16.11\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580716806,\r\n \"Name\": \"Saladix Calabresa 100g\",\r\n \"Price\": \"2.80\",\r\n \"Units\": 18,\r\n \"Sales\": 41.59,\r\n \"GM\": 16.1\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770329329007,\r\n \"Name\": \"A Todo Motor\",\r\n \"Price\": \"8.00\",\r\n \"Units\": 2,\r\n \"Sales\": 16,\r\n \"GM\": 16\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062548938,\r\n \"Name\": \"DNN VILLA DEL SUR NARAN CG 500ML\",\r\n \"Price\": \"2.90\",\r\n \"Units\": 14,\r\n \"Sales\": 33.6,\r\n \"GM\": 15.96\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77921932,\r\n \"Name\": \"KR MILKA M JOY LECHE 30G\",\r\n \"Price\": \"1.60\",\r\n \"Units\": 46,\r\n \"Sales\": 60.72,\r\n \"GM\": 15.83\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771668351001,\r\n \"Name\": \"Soy Rock\",\r\n \"Price\": \"7.90\",\r\n \"Units\": 2,\r\n \"Sales\": 15.8,\r\n \"GM\": 15.8\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"NESTLE\",\r\n \"EAN\": 22110079820,\r\n \"Name\": \"NES Bubble Tape Strawerry 56,7 gr\",\r\n \"Price\": \"6.70\",\r\n \"Units\": 8,\r\n \"Sales\": 44.31,\r\n \"GM\": 15.75\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77995186,\r\n \"Name\": \"CAD Beldent S/Azucar Tutti Frutt\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 33,\r\n \"Sales\": 35.33,\r\n \"GM\": 15.69\r\n },\r\n {\r\n \"CategoryId\": 134,\r\n \"Category\": \"Almacen\",\r\n \"SubcategoryId\": 135,\r\n \"Subcategory\": \"CAFE Y TE\",\r\n \"Manufacturer\": \"MOL RIO DELA PLATA\",\r\n \"EAN\": 7790387120363,\r\n \"Name\": \"MRP Taragui Mate Listo 35gr\",\r\n \"Price\": \"3.58\",\r\n \"Units\": 12,\r\n \"Sales\": 35.49,\r\n \"GM\": 15.68\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 191,\r\n \"Subcategory\": \"BRAKE FLUIDS\",\r\n \"Manufacturer\": \"WAGNER BRAKE\",\r\n \"EAN\": 7797409030938,\r\n \"Name\": \"WAG DOT3 Wagner Liq Fren 110ml\",\r\n \"Price\": \"8.50\",\r\n \"Units\": 5,\r\n \"Sales\": 35.1,\r\n \"GM\": 15.64\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"QUILMES\",\r\n \"EAN\": 7792799005245,\r\n \"Name\": \"QLMS NPV Manzana 1500ml\",\r\n \"Price\": \"4.20\",\r\n \"Units\": 9,\r\n \"Sales\": 31.33,\r\n \"GM\": 15.58\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 164,\r\n \"Subcategory\": \"BATTERIES\",\r\n \"Manufacturer\": \"ENERGIZER\",\r\n \"EAN\": 39800034083,\r\n \"Name\": \"ENZ ENERGIZER LITHIUM AA2\",\r\n \"Price\": \"19.90\",\r\n \"Units\": 2,\r\n \"Sales\": 32.9,\r\n \"GM\": 15.58\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 167,\r\n \"Subcategory\": \"GREETING/GIFT/TOYS\",\r\n \"Manufacturer\": \"MATTEL\",\r\n \"EAN\": 27084120134,\r\n \"Name\": \"MTT HotWheels Autos Und\",\r\n \"Price\": \"10.00\",\r\n \"Units\": 4,\r\n \"Sales\": 33.04,\r\n \"GM\": 15.56\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77922656,\r\n \"Name\": \"Menthoplus Caramel Cherry 30.6\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 47,\r\n \"Sales\": 38.96,\r\n \"GM\": 15.47\r\n },\r\n {\r\n \"CategoryId\": 13,\r\n \"Category\": \"Otro Tabaco\",\r\n \"SubcategoryId\": 15,\r\n \"Subcategory\": \"Cigarros\",\r\n \"Manufacturer\": \"PURO TABACO\",\r\n \"EAN\": 8820,\r\n \"Name\": \"PTBC Guantanamera Compay und\",\r\n \"Price\": \"9.26\",\r\n \"Units\": 5,\r\n \"Sales\": 38.97,\r\n \"GM\": 15.46\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062548914,\r\n \"Name\": \"DNN Villa del Sur 6000 ml\",\r\n \"Price\": \"7.00\",\r\n \"Units\": 11,\r\n \"Sales\": 63.98,\r\n \"GM\": 15.35\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895066436,\r\n \"Name\": \"Dasani Mineralizada 1.5L\",\r\n \"Price\": \"3.30\",\r\n \"Units\": 10,\r\n \"Sales\": 27.4,\r\n \"GM\": 15.3\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895066290,\r\n \"Name\": \"DASANI BAL CITRUS C GAS 500ML\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 15,\r\n \"Sales\": 29.7,\r\n \"GM\": 15.2\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 80,\r\n \"Subcategory\": \"YOGURT\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7793940104022,\r\n \"Name\": \"DNN Ser Firme Frutilla 200gr\",\r\n \"Price\": \"1.66\",\r\n \"Units\": 43,\r\n \"Sales\": 59.16,\r\n \"GM\": 15.2\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040726505,\r\n \"Name\": \"BGLY BAGLEY SALVADO BAG FIBRACT\",\r\n \"Price\": \"2.70\",\r\n \"Units\": 16,\r\n \"Sales\": 35.68,\r\n \"GM\": 15.2\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"NESTLE\",\r\n \"EAN\": 79200814441,\r\n \"Name\": \"NES WONKA RUNTS CHEWY 52.4G\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 13,\r\n \"Sales\": 37.57,\r\n \"GM\": 15.14\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"NESTLE\",\r\n \"EAN\": 22110058504,\r\n \"Name\": \"NES BUBBLE GUM 53GRS\",\r\n \"Price\": \"7.90\",\r\n \"Units\": 9,\r\n \"Sales\": 58.77,\r\n \"GM\": 15.1\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040939400,\r\n \"Name\": \"BGLY Ser Equilibrio 120g\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 22,\r\n \"Sales\": 36.3,\r\n \"GM\": 15.09\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6205,\r\n \"Name\": \"SFA Filtros Fram CA-5456\",\r\n \"Price\": \"22.79\",\r\n \"Units\": 2,\r\n \"Sales\": 37.66,\r\n \"GM\": 15.08\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 81,\r\n \"Subcategory\": \"OTHER DAIRY\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7791337222212,\r\n \"Name\": \"DNN Activia Pera Kiwi 200gr\",\r\n \"Price\": \"2.19\",\r\n \"Units\": 41,\r\n \"Sales\": 74.2,\r\n \"GM\": 15.06\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77932136,\r\n \"Name\": \"BON O BON BARRITA CHOCOL 35G\",\r\n \"Price\": \"1.60\",\r\n \"Units\": 26,\r\n \"Sales\": 34.32,\r\n \"GM\": 15.05\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580139506,\r\n \"Name\": \"ARCOR CARAMEL CUBIX SORPRES\",\r\n \"Price\": \"2.80\",\r\n \"Units\": 15,\r\n \"Sales\": 34.68,\r\n \"GM\": 15.04\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"GENERAL MILLS ARG\",\r\n \"EAN\": 7797674049383,\r\n \"Name\": \"GMA Nature Avena y Miel 21g\",\r\n \"Price\": \"1.54\",\r\n \"Units\": 29,\r\n \"Sales\": 36.85,\r\n \"GM\": 15.03\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770329652006,\r\n \"Name\": \"BICICLUB\",\r\n \"Price\": \"7.50\",\r\n \"Units\": 2,\r\n \"Sales\": 15,\r\n \"GM\": 15\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770329910007,\r\n \"Name\": \"DMODE\",\r\n \"Price\": \"15.00\",\r\n \"Units\": 1,\r\n \"Sales\": 15,\r\n \"GM\": 15\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 77903501,\r\n \"Name\": \"BGLY Opera 55gr\",\r\n \"Price\": \"1.60\",\r\n \"Units\": 28,\r\n \"Sales\": 36.96,\r\n \"GM\": 14.82\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 164,\r\n \"Subcategory\": \"BATTERIES\",\r\n \"Manufacturer\": \"ENERGIZER\",\r\n \"EAN\": 39800008688,\r\n \"Name\": \"ENZ ENERGIZER RECHARGEABLE AA2\",\r\n \"Price\": \"37.00\",\r\n \"Units\": 1,\r\n \"Sales\": 30.58,\r\n \"GM\": 14.76\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310980316,\r\n \"Name\": \"FL Doritos Pizza 80gr\",\r\n \"Price\": \"3.90\",\r\n \"Units\": 12,\r\n \"Sales\": 38.66,\r\n \"GM\": 14.7\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"BAGGIO\",\r\n \"EAN\": 7790036972510,\r\n \"Name\": \"RPBB Baggio Manzan 200ml\",\r\n \"Price\": \"1.70\",\r\n \"Units\": 20,\r\n \"Sales\": 28.2,\r\n \"GM\": 14.63\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 59,\r\n \"Subcategory\": \"Barras sin chocolate\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 7791249999523,\r\n \"Name\": \"CAD MANTECOL MARMOLADO 40G\",\r\n \"Price\": \"1.60\",\r\n \"Units\": 26,\r\n \"Sales\": 34.32,\r\n \"GM\": 14.6\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 205,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3711,\r\n \"Name\": \"Medialuna Pillsbury Jamon Ques\",\r\n \"Price\": \"3.60\",\r\n \"Units\": 7,\r\n \"Sales\": 20.83,\r\n \"GM\": 14.53\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062548969,\r\n \"Name\": \"DNN VILLA DEL SUR POMELO C.G 500\",\r\n \"Price\": \"2.90\",\r\n \"Units\": 13,\r\n \"Sales\": 31.2,\r\n \"GM\": 14.41\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 80,\r\n \"Subcategory\": \"YOGURT\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7793940016011,\r\n \"Name\": \"DNN Yogurisimo Firme Vainilla 200gr\",\r\n \"Price\": \"1.50\",\r\n \"Units\": 51,\r\n \"Sales\": 63.3,\r\n \"GM\": 14.38\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 63,\r\n \"Subcategory\": \"Golosinas a granel\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222041246,\r\n \"Name\": \"BNFD Nugaton Mini 72gr\",\r\n \"Price\": \"3.40\",\r\n \"Units\": 13,\r\n \"Sales\": 36.53,\r\n \"GM\": 14.37\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77949080,\r\n \"Name\": \"Cofler Aireado Leche 30gr\",\r\n \"Price\": \"1.90\",\r\n \"Units\": 20,\r\n \"Sales\": 31.4,\r\n \"GM\": 14.34\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895006715,\r\n \"Name\": \"Swcheppes Tonica 1.5L\",\r\n \"Price\": \"5.50\",\r\n \"Units\": 8,\r\n \"Sales\": 36.56,\r\n \"GM\": 14.33\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 164,\r\n \"Subcategory\": \"BATTERIES\",\r\n \"Manufacturer\": \"ENERGIZER\",\r\n \"EAN\": 39800027962,\r\n \"Name\": \"ENZ Energizer Titanium AAA 2\",\r\n \"Price\": \"7.50\",\r\n \"Units\": 5,\r\n \"Sales\": 31,\r\n \"GM\": 14.3\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"GEORGALOS\",\r\n \"EAN\": 1140,\r\n \"Name\": \"GRG Tokke Bombon Marroc 10gr\",\r\n \"Price\": \"0.60\",\r\n \"Units\": 61,\r\n \"Sales\": 30.33,\r\n \"GM\": 14.29\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580476106,\r\n \"Name\": \"La Campagnola BC Naranja 250ml\",\r\n \"Price\": \"1.90\",\r\n \"Units\": 21,\r\n \"Sales\": 33.17,\r\n \"GM\": 14.28\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580388201,\r\n \"Name\": \"Aguila Slice Batido Pina 70ml\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 23,\r\n \"Sales\": 37.99,\r\n \"GM\": 14.22\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 60,\r\n \"Subcategory\": \"Caramelos en bolsa\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580604707,\r\n \"Name\": \"Fruti Gomitas Dientes 150gr\",\r\n \"Price\": \"3.80\",\r\n \"Units\": 12,\r\n \"Sales\": 37.68,\r\n \"GM\": 14.17\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7791813420156,\r\n \"Name\": \"Mirinda 500ml\",\r\n \"Price\": \"3.10\",\r\n \"Units\": 11,\r\n \"Sales\": 28.27,\r\n \"GM\": 14.14\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 9318,\r\n \"Name\": \"PST TONICA BOTELLA 237ML\",\r\n \"Price\": \"2.20\",\r\n \"Units\": 16,\r\n \"Sales\": 29.28,\r\n \"GM\": 14.14\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6306,\r\n \"Name\": \"SFA Filtros Fram C-8827\",\r\n \"Price\": \"30.39\",\r\n \"Units\": 1,\r\n \"Sales\": 25.12,\r\n \"GM\": 14.14\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7794600460014,\r\n \"Name\": \"KR OREO DULCE DE LECHE 111GR\",\r\n \"Price\": \"2.50\",\r\n \"Units\": 16,\r\n \"Sales\": 33.12,\r\n \"GM\": 14.14\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222042090,\r\n \"Name\": \"BNFD NUGATON OBLEA 50G\",\r\n \"Price\": \"1.43\",\r\n \"Units\": 29,\r\n \"Sales\": 34.41,\r\n \"GM\": 14.12\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7791813421238,\r\n \"Name\": \"H2OH LIMA LIM�N 1.5L\",\r\n \"Price\": \"4.50\",\r\n \"Units\": 7,\r\n \"Sales\": 26.11,\r\n \"GM\": 14.11\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"NESTLE\",\r\n \"EAN\": 79200310424,\r\n \"Name\": \"NES Wonka Gobstopper 170 G\",\r\n \"Price\": \"9.00\",\r\n \"Units\": 5,\r\n \"Sales\": 37.2,\r\n \"GM\": 14.1\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954053086,\r\n \"Name\": \"SFA Filtros Fram CA-5308\",\r\n \"Price\": \"29.03\",\r\n \"Units\": 1,\r\n \"Sales\": 23.99,\r\n \"GM\": 14.1\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954053574,\r\n \"Name\": \"SFA Filtros Fram CA-5357\",\r\n \"Price\": \"30.05\",\r\n \"Units\": 1,\r\n \"Sales\": 24.83,\r\n \"GM\": 14.1\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"MOLINO CANUELAS\",\r\n \"EAN\": 7792200000777,\r\n \"Name\": \"MLC 9 de Oro Bizcocho Light 170gr\",\r\n \"Price\": \"2.60\",\r\n \"Units\": 14,\r\n \"Sales\": 30.1,\r\n \"GM\": 14.1\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954869427,\r\n \"Name\": \"SFA Fram Filtro CF 9071\",\r\n \"Price\": \"41.39\",\r\n \"Units\": 1,\r\n \"Sales\": 34.21,\r\n \"GM\": 14.09\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77913173,\r\n \"Name\": \"PM Marlboro Box Mild flavor 20und\",\r\n \"Price\": \"4.06\",\r\n \"Units\": 47,\r\n \"Sales\": 177.93,\r\n \"GM\": 14.07\r\n },\r\n {\r\n \"CategoryId\": 13,\r\n \"Category\": \"Otro Tabaco\",\r\n \"SubcategoryId\": 15,\r\n \"Subcategory\": \"Cigarros\",\r\n \"Manufacturer\": \"PURO TABACO\",\r\n \"EAN\": 8811,\r\n \"Name\": \"PTBC Guantanamera Cristales Und\",\r\n \"Price\": \"23.00\",\r\n \"Units\": 1,\r\n \"Sales\": 19.35,\r\n \"GM\": 14.02\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 179,\r\n \"Subcategory\": \"NEWSPAPERS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770325094022,\r\n \"Name\": \"LA NACION LUNES\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 7,\r\n \"Sales\": 14,\r\n \"GM\": 14\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 9315,\r\n \"Name\": \"7 UP BOTELLA 237ML\",\r\n \"Price\": \"2.20\",\r\n \"Units\": 16,\r\n \"Sales\": 29.27,\r\n \"GM\": 13.96\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7802215512230,\r\n \"Name\": \"BNFD COSTA FRAC GALLETI CHOCOL\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 28,\r\n \"Sales\": 55.45,\r\n \"GM\": 13.95\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7659,\r\n \"Name\": \"DISC Revista Ser Salud\",\r\n \"Price\": \"6.90\",\r\n \"Units\": 2,\r\n \"Sales\": 13.8,\r\n \"GM\": 13.8\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77926289,\r\n \"Name\": \"PM L&M Light KS 20und\",\r\n \"Price\": \"3.42\",\r\n \"Units\": 60,\r\n \"Sales\": 191.31,\r\n \"GM\": 13.71\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"OSRAM\",\r\n \"EAN\": 4050300838069,\r\n \"Name\": \"LAMPARA OSRAM 7528 12V 21/5WBAYBLx 2\",\r\n \"Price\": \"2.90\",\r\n \"Units\": 12,\r\n \"Sales\": 28.79,\r\n \"GM\": 13.67\r\n },\r\n {\r\n \"CategoryId\": 232,\r\n \"Category\": \"Bebidas Congeladas dispensadas\",\r\n \"SubcategoryId\": 234,\r\n \"Subcategory\": \"FROZEN NON-CARBONATE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2604,\r\n \"Name\": \"BATIDO DURAZNO\",\r\n \"Price\": \"7.75\",\r\n \"Units\": 4,\r\n \"Sales\": 25.62,\r\n \"GM\": 13.64\r\n },\r\n {\r\n \"CategoryId\": 134,\r\n \"Category\": \"Almacen\",\r\n \"SubcategoryId\": 135,\r\n \"Subcategory\": \"CAFE Y TE\",\r\n \"Manufacturer\": \"ESTABL LAS MARIAS\",\r\n \"EAN\": 7790387110319,\r\n \"Name\": \"ELM Taragui Yerba Mate 250g\",\r\n \"Price\": \"3.12\",\r\n \"Units\": 11,\r\n \"Sales\": 28.36,\r\n \"GM\": 13.62\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 191,\r\n \"Subcategory\": \"BRAKE FLUIDS\",\r\n \"Manufacturer\": \"BARDAHL LUBRICANT\",\r\n \"EAN\": 7790627112202,\r\n \"Name\": \"BRDL Liquido Frenos 200ml\",\r\n \"Price\": \"7.30\",\r\n \"Units\": 6,\r\n \"Sales\": 36.18,\r\n \"GM\": 13.56\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954053253,\r\n \"Name\": \"SFA Filtros Fram CA-5325\",\r\n \"Price\": \"20.37\",\r\n \"Units\": 2,\r\n \"Sales\": 33.67,\r\n \"GM\": 13.53\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 5011053015298,\r\n \"Name\": \"TOP BIG BABY POP 31G\",\r\n \"Price\": \"5.79\",\r\n \"Units\": 6,\r\n \"Sales\": 28.71,\r\n \"GM\": 13.47\r\n },\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 219,\r\n \"Subcategory\": \"CAPPUCC./SPEC.COFFEE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2030,\r\n \"Name\": \"CAPUCCINO VIENES\",\r\n \"Price\": \"6.80\",\r\n \"Units\": 3,\r\n \"Sales\": 16.86,\r\n \"GM\": 13.44\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 40000001638,\r\n \"Name\": \"MAS SKITTLES TROPICAL 61,5G\",\r\n \"Price\": \"3.00\",\r\n \"Units\": 14,\r\n \"Sales\": 34.72,\r\n \"GM\": 13.44\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"OSRAM\",\r\n \"EAN\": 4050300222028,\r\n \"Name\": \"OSRM Osram Lamp 64198 Und\",\r\n \"Price\": \"20.40\",\r\n \"Units\": 2,\r\n \"Sales\": 33.72,\r\n \"GM\": 13.42\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77949059,\r\n \"Name\": \"Cofler Aireado Mixto 30g.\",\r\n \"Price\": \"1.90\",\r\n \"Units\": 20,\r\n \"Sales\": 31.4,\r\n \"GM\": 13.4\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954869137,\r\n \"Name\": \"SFA Fram Filtro CA 9074\",\r\n \"Price\": \"44.91\",\r\n \"Units\": 1,\r\n \"Sales\": 37.12,\r\n \"GM\": 13.34\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040677203,\r\n \"Name\": \"TORTITAS SUPERCHOCALETES 125G\",\r\n \"Price\": \"2.60\",\r\n \"Units\": 15,\r\n \"Sales\": 32.25,\r\n \"GM\": 13.34\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6273,\r\n \"Name\": \"SFA Filtros Fram CA-5929\",\r\n \"Price\": \"30.62\",\r\n \"Units\": 1,\r\n \"Sales\": 25.31,\r\n \"GM\": 13.16\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954055110,\r\n \"Name\": \"SFA Filtros Fram PH-5511\",\r\n \"Price\": \"27.10\",\r\n \"Units\": 1,\r\n \"Sales\": 22.4,\r\n \"GM\": 13.16\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 7790400021806,\r\n \"Name\": \"TPS WD 40 155gr\",\r\n \"Price\": \"12.50\",\r\n \"Units\": 3,\r\n \"Sales\": 30.99,\r\n \"GM\": 13.11\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790407490704,\r\n \"Name\": \"Cofler Aireado Leche 60gr\",\r\n \"Price\": \"3.60\",\r\n \"Units\": 10,\r\n \"Sales\": 29.8,\r\n \"GM\": 13.1\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 63,\r\n \"Subcategory\": \"Golosinas a granel\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580240608,\r\n \"Name\": \"Butter Toffees Black 250g\",\r\n \"Price\": \"9.10\",\r\n \"Units\": 4,\r\n \"Sales\": 30.08,\r\n \"GM\": 13.09\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"AMBROSOLI\",\r\n \"EAN\": 7792222003732,\r\n \"Name\": \"AMB BONAFIDE MENTITAS FRUTA 25GR\",\r\n \"Price\": \"0.81\",\r\n \"Units\": 36,\r\n \"Sales\": 24.09,\r\n \"GM\": 13.03\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771667201000,\r\n \"Name\": \"DEBATE\",\r\n \"Price\": \"6.50\",\r\n \"Units\": 2,\r\n \"Sales\": 13,\r\n \"GM\": 13\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 81,\r\n \"Subcategory\": \"OTHER DAIRY\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7791337303072,\r\n \"Name\": \"DNN Ser Postre Choc Pack x 2\",\r\n \"Price\": \"3.00\",\r\n \"Units\": 26,\r\n \"Sales\": 64.48,\r\n \"GM\": 12.98\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 63,\r\n \"Subcategory\": \"Golosinas a granel\",\r\n \"Manufacturer\": \"FELFORT\",\r\n \"EAN\": 7790206004188,\r\n \"Name\": \"FLFR FELFORT FELICIDADES 385GR\",\r\n \"Price\": \"34.00\",\r\n \"Units\": 1,\r\n \"Sales\": 28.1,\r\n \"GM\": 12.95\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954867850,\r\n \"Name\": \"SFA Fram Filtro C 8837\",\r\n \"Price\": \"28.35\",\r\n \"Units\": 1,\r\n \"Sales\": 23.43,\r\n \"GM\": 12.85\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77927453,\r\n \"Name\": \"CAD HALLS CREAMY LEMON PIE 27G\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 29,\r\n \"Sales\": 28.72,\r\n \"GM\": 12.79\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6289,\r\n \"Name\": \"SFA Fram CF 5475\",\r\n \"Price\": \"30.00\",\r\n \"Units\": 1,\r\n \"Sales\": 24.79,\r\n \"GM\": 12.73\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6654,\r\n \"Name\": \"SFA Filtros Fram CA-8964\",\r\n \"Price\": \"34.70\",\r\n \"Units\": 1,\r\n \"Sales\": 28.68,\r\n \"GM\": 12.7\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"TIA MARUCA\",\r\n \"EAN\": 7798082740015,\r\n \"Name\": \"TM Tia Maruca Obleas 120gr\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 9,\r\n \"Sales\": 26.01,\r\n \"GM\": 12.69\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77954930,\r\n \"Name\": \"Topline One Mentol 0.8gr\",\r\n \"Price\": \"3.80\",\r\n \"Units\": 10,\r\n \"Sales\": 31.4,\r\n \"GM\": 12.6\r\n },\r\n {\r\n \"CategoryId\": 86,\r\n \"Category\": \"Comida Empacada\",\r\n \"SubcategoryId\": 87,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"CANON\",\r\n \"EAN\": 7795947000475,\r\n \"Name\": \"CN CaNon J/T/H Trip 3und\",\r\n \"Price\": \"6.90\",\r\n \"Units\": 4,\r\n \"Sales\": 22.8,\r\n \"GM\": 12.52\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040936003,\r\n \"Name\": \"BGLY OPERA OBLEA TRIPLE ORIG 75G\",\r\n \"Price\": \"2.10\",\r\n \"Units\": 16,\r\n \"Sales\": 27.83,\r\n \"GM\": 12.43\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300087722,\r\n \"Name\": \"KR Express Litght 110g\",\r\n \"Price\": \"1.70\",\r\n \"Units\": 21,\r\n \"Sales\": 29.42,\r\n \"GM\": 12.39\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 193,\r\n \"Subcategory\": \"OTHER ADDITIVES\",\r\n \"Manufacturer\": \"BARDAHL LUBRICANT\",\r\n \"EAN\": 77910219,\r\n \"Name\": \"BRDL Top Diesel 110ml\",\r\n \"Price\": \"6.30\",\r\n \"Units\": 6,\r\n \"Sales\": 31.25,\r\n \"GM\": 12.29\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580395605,\r\n \"Name\": \"Bon o Bon Hel Corazon 60ml\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 17,\r\n \"Sales\": 32.3,\r\n \"GM\": 12.2\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771514268002,\r\n \"Name\": \"Autofoco\",\r\n \"Price\": \"6.00\",\r\n \"Units\": 2,\r\n \"Sales\": 12,\r\n \"GM\": 12\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580591717,\r\n \"Name\": \"TOPLINE C S/A MENTA 12GR\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 31,\r\n \"Sales\": 30.7,\r\n \"GM\": 11.96\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7790114015573,\r\n \"Name\": \"KR MILKA LEGER BLANCO 100G\",\r\n \"Price\": \"5.20\",\r\n \"Units\": 7,\r\n \"Sales\": 30.1,\r\n \"GM\": 11.91\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954044824,\r\n \"Name\": \"SFA Filtros Fram PH-4482\",\r\n \"Price\": \"24.83\",\r\n \"Units\": 1,\r\n \"Sales\": 20.52,\r\n \"GM\": 11.91\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"UNILEVER\",\r\n \"EAN\": 7794000730052,\r\n \"Name\": \"UNI Ades Naranja 200ml\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 16,\r\n \"Sales\": 26.56,\r\n \"GM\": 11.89\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300122027,\r\n \"Name\": \"KR OREO GALLETA DORADAS 111G\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 18,\r\n \"Sales\": 29.7,\r\n \"GM\": 11.84\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"GEORGALOS\",\r\n \"EAN\": 7790380016199,\r\n \"Name\": \"GRG CEREAL FLOW FRUT BOS C/ YOG\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 23,\r\n \"Sales\": 24.63,\r\n \"GM\": 11.83\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 5011053003325,\r\n \"Name\": \"TPPS Push Pop 15gr\",\r\n \"Price\": \"3.29\",\r\n \"Units\": 9,\r\n \"Sales\": 24.49,\r\n \"GM\": 11.8\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 81,\r\n \"Subcategory\": \"OTHER DAIRY\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7791337571020,\r\n \"Name\": \"DNN Actimel Clasico Frutilla 100ml\",\r\n \"Price\": \"1.47\",\r\n \"Units\": 33,\r\n \"Sales\": 39.94,\r\n \"GM\": 11.8\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910189,\r\n \"Name\": \"Kool Box 20und\",\r\n \"Price\": \"3.98\",\r\n \"Units\": 38,\r\n \"Sales\": 140.78,\r\n \"GM\": 11.79\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"TIA MARUCA\",\r\n \"EAN\": 7798082741517,\r\n \"Name\": \"TM Tia Maruca Fajitas Sab Cebo 160gr\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 9,\r\n \"Sales\": 26.01,\r\n \"GM\": 11.79\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 80,\r\n \"Subcategory\": \"YOGURT\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7791337489851,\r\n \"Name\": \"DNN Ser Fibramix 200gr\",\r\n \"Price\": \"2.70\",\r\n \"Units\": 14,\r\n \"Sales\": 31.22,\r\n \"GM\": 11.76\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7791813422518,\r\n \"Name\": \"7Up H2OH 2000ml\",\r\n \"Price\": \"4.90\",\r\n \"Units\": 6,\r\n \"Sales\": 24.36,\r\n \"GM\": 11.75\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 22000001719,\r\n \"Name\": \"WR WRIGLEYS SPEARMINT 15G\",\r\n \"Price\": \"1.70\",\r\n \"Units\": 19,\r\n \"Sales\": 26.63,\r\n \"GM\": 11.71\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77963697,\r\n \"Name\": \"MENTHOPLUS S AZ MANZANA 26.6G\",\r\n \"Price\": \"1.50\",\r\n \"Units\": 20,\r\n \"Sales\": 24.8,\r\n \"GM\": 11.69\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 63,\r\n \"Subcategory\": \"Golosinas a granel\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7792430607227,\r\n \"Name\": \"BARILOCHITO CAJA BOMBONES MIX\",\r\n \"Price\": \"12.39\",\r\n \"Units\": 4,\r\n \"Sales\": 40.96,\r\n \"GM\": 11.69\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 81,\r\n \"Subcategory\": \"OTHER DAIRY\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 77953070,\r\n \"Name\": \"DNN Danette Chocolate 100gr\",\r\n \"Price\": \"2.41\",\r\n \"Units\": 23,\r\n \"Sales\": 45.82,\r\n \"GM\": 11.64\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"BUFFALO\",\r\n \"EAN\": 7795070128190,\r\n \"Name\": \"BFF Buffalo Escob Duna/Uno 19 1und\",\r\n \"Price\": \"14.20\",\r\n \"Units\": 4,\r\n \"Sales\": 46.95,\r\n \"GM\": 11.59\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77903778,\r\n \"Name\": \"KR Milka Triple Dulce leche Alf 70gr\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 16,\r\n \"Sales\": 30.4,\r\n \"GM\": 11.58\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6463,\r\n \"Name\": \"SFA Filtros Fram CA-5827\",\r\n \"Price\": \"39.69\",\r\n \"Units\": 1,\r\n \"Sales\": 32.8,\r\n \"GM\": 11.51\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222002902,\r\n \"Name\": \"BNFD RUEDITAS BILLIKEN 25G\",\r\n \"Price\": \"0.81\",\r\n \"Units\": 39,\r\n \"Sales\": 25.98,\r\n \"GM\": 11.5\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"AMBROSOLI\",\r\n \"EAN\": 7792222003718,\r\n \"Name\": \"AMB Bonafide Mentitas Menta 25\",\r\n \"Price\": \"0.81\",\r\n \"Units\": 32,\r\n \"Sales\": 21.36,\r\n \"GM\": 11.45\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"GEORGALOS\",\r\n \"EAN\": 7790380016120,\r\n \"Name\": \"GEO GEORGALOS ALFAJOR DDL 50G\",\r\n \"Price\": \"1.40\",\r\n \"Units\": 24,\r\n \"Sales\": 27.83,\r\n \"GM\": 11.32\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 149,\r\n \"Subcategory\": \"ANALGESICOS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9815,\r\n \"Name\": \"GSK SOBRE ALIKAL COMUN 4.5G\",\r\n \"Price\": \"1.85\",\r\n \"Units\": 11,\r\n \"Sales\": 20.4,\r\n \"GM\": 11.31\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6715,\r\n \"Name\": \"SFA Filtros Fram CH-8530\",\r\n \"Price\": \"31.75\",\r\n \"Units\": 1,\r\n \"Sales\": 26.24,\r\n \"GM\": 11.29\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910158,\r\n \"Name\": \"Derby KS Suave 20und\",\r\n \"Price\": \"3.42\",\r\n \"Units\": 52,\r\n \"Sales\": 165.14,\r\n \"GM\": 11.2\r\n },\r\n {\r\n \"CategoryId\": 13,\r\n \"Category\": \"Otro Tabaco\",\r\n \"SubcategoryId\": 15,\r\n \"Subcategory\": \"Cigarros\",\r\n \"Manufacturer\": \"PURO TABACO\",\r\n \"EAN\": 8806,\r\n \"Name\": \"PTBC Quintero Brevas Mano Und\",\r\n \"Price\": \"9.50\",\r\n \"Units\": 4,\r\n \"Sales\": 31.96,\r\n \"GM\": 11.2\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770328042006,\r\n \"Name\": \"Semanario\",\r\n \"Price\": \"2.80\",\r\n \"Units\": 4,\r\n \"Sales\": 11.2,\r\n \"GM\": 11.2\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77924025,\r\n \"Name\": \"CAD HALLS FUSI�N FRUTOS ROJOS\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 23,\r\n \"Sales\": 24.63,\r\n \"GM\": 11.18\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580327613,\r\n \"Name\": \"Rocklets Con Mani 40gr\",\r\n \"Price\": \"1.80\",\r\n \"Units\": 17,\r\n \"Sales\": 25.33,\r\n \"GM\": 11.14\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7792170110063,\r\n \"Name\": \"Quaker Barra Frito Cream 25Gr\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 34,\r\n \"Sales\": 28.15,\r\n \"GM\": 11.12\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6212,\r\n \"Name\": \"SFA Filtros Fram PH-5949\",\r\n \"Price\": \"25.63\",\r\n \"Units\": 1,\r\n \"Sales\": 21.18,\r\n \"GM\": 11.08\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 60,\r\n \"Subcategory\": \"Caramelos en bolsa\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 7791249977187,\r\n \"Name\": \"CAD YUMMY BANANITAS 24.5G\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 30,\r\n \"Sales\": 29.7,\r\n \"GM\": 11.04\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 205,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 5039,\r\n \"Name\": \"PANINO CAMPERO TM\",\r\n \"Price\": \"8.00\",\r\n \"Units\": 6,\r\n \"Sales\": 39.66,\r\n \"GM\": 11.03\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"TIA MARUCA\",\r\n \"EAN\": 7798082742040,\r\n \"Name\": \"TM MARUQUITAS FRUTILLA 160 GRS\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 8,\r\n \"Sales\": 23.13,\r\n \"GM\": 11.03\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580388409,\r\n \"Name\": \"Aguila Granizado 80ml\",\r\n \"Price\": \"3.00\",\r\n \"Units\": 11,\r\n \"Sales\": 27.28,\r\n \"GM\": 11.02\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 28400055161,\r\n \"Name\": \"FL Lays Stax Barbecue 155gr\",\r\n \"Price\": \"9.50\",\r\n \"Units\": 4,\r\n \"Sales\": 31.4,\r\n \"GM\": 10.96\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"OSRAM\",\r\n \"EAN\": 4050300332185,\r\n \"Name\": \"LAMPARA OSRAM 64210 H7 12V 55W BLx1\",\r\n \"Price\": \"7.10\",\r\n \"Units\": 5,\r\n \"Sales\": 29.35,\r\n \"GM\": 10.95\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770328436003,\r\n \"Name\": \"PLAYBOY\",\r\n \"Price\": \"10.90\",\r\n \"Units\": 1,\r\n \"Sales\": 10.9,\r\n \"GM\": 10.9\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7790329981007,\r\n \"Name\": \"Tiempo Aventura\",\r\n \"Price\": \"10.90\",\r\n \"Units\": 1,\r\n \"Sales\": 10.9,\r\n \"GM\": 10.9\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 80,\r\n \"Subcategory\": \"YOGURT\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7791337019942,\r\n \"Name\": \"DNN Yogurisimo Licuado Frutas 190G\",\r\n \"Price\": \"2.10\",\r\n \"Units\": 31,\r\n \"Sales\": 53.9,\r\n \"GM\": 10.86\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910936,\r\n \"Name\": \"Camel Blue Box 20und\",\r\n \"Price\": \"4.05\",\r\n \"Units\": 44,\r\n \"Sales\": 165.76,\r\n \"GM\": 10.83\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040944602,\r\n \"Name\": \"BGLY REX 3 JAMON SERRANO 60GR\",\r\n \"Price\": \"1.80\",\r\n \"Units\": 18,\r\n \"Sales\": 26.82,\r\n \"GM\": 10.79\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580530334,\r\n \"Name\": \"BEAT MENSAJITOS 30G\",\r\n \"Price\": \"0.90\",\r\n \"Units\": 41,\r\n \"Sales\": 30.38,\r\n \"GM\": 10.76\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300108373,\r\n \"Name\": \"KR CEREALITAS MANZAN Y CAN 142G\",\r\n \"Price\": \"2.90\",\r\n \"Units\": 10,\r\n \"Sales\": 24,\r\n \"GM\": 10.74\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 7798011660384,\r\n \"Name\": \"TPS Topaes Franela Bli 50x60 U\",\r\n \"Price\": \"8.50\",\r\n \"Units\": 4,\r\n \"Sales\": 28.08,\r\n \"GM\": 10.64\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"QUILMES\",\r\n \"EAN\": 77927651,\r\n \"Name\": \"QLMS NPV Naranja 330ml\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 11,\r\n \"Sales\": 21.89,\r\n \"GM\": 10.55\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77946812,\r\n \"Name\": \"MENTHOPLUS S AZ DURAZNO 26.6G\",\r\n \"Price\": \"1.50\",\r\n \"Units\": 18,\r\n \"Sales\": 22.32,\r\n \"GM\": 10.54\r\n },\r\n {\r\n \"CategoryId\": 13,\r\n \"Category\": \"Otro Tabaco\",\r\n \"SubcategoryId\": 15,\r\n \"Subcategory\": \"Cigarros\",\r\n \"Manufacturer\": \"PURO TABACO\",\r\n \"EAN\": 8800,\r\n \"Name\": \"PTBC Gonzalez Panet Extra Und\",\r\n \"Price\": \"14.00\",\r\n \"Units\": 2,\r\n \"Sales\": 23.15,\r\n \"GM\": 10.53\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7794600458905,\r\n \"Name\": \"KR Club Social 26gr\",\r\n \"Price\": \"0.70\",\r\n \"Units\": 38,\r\n \"Sales\": 22.04,\r\n \"GM\": 10.46\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300121037,\r\n \"Name\": \"KR Lincoln Chocolate 161gr\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 14,\r\n \"Sales\": 26.6,\r\n \"GM\": 10.44\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7792170110186,\r\n \"Name\": \"Quaker Barra Chispa Choc 20G\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 29,\r\n \"Sales\": 24,\r\n \"GM\": 10.42\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 193,\r\n \"Subcategory\": \"OTHER ADDITIVES\",\r\n \"Manufacturer\": \"WYNNS\",\r\n \"EAN\": 73579643022,\r\n \"Name\": \"WNNS Super For Oil 325ml\",\r\n \"Price\": \"25.00\",\r\n \"Units\": 1,\r\n \"Sales\": 20.66,\r\n \"GM\": 10.42\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"LEHRITIER\",\r\n \"EAN\": 7792860016217,\r\n \"Name\": \"LHRT Baby Doll Chupetines 24g\",\r\n \"Price\": \"1.33\",\r\n \"Units\": 24,\r\n \"Sales\": 26.25,\r\n \"GM\": 10.38\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77915115,\r\n \"Name\": \"PM Colorado CF 20und\",\r\n \"Price\": \"3.66\",\r\n \"Units\": 38,\r\n \"Sales\": 129.64,\r\n \"GM\": 10.37\r\n },\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 219,\r\n \"Subcategory\": \"CAPPUCC./SPEC.COFFEE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2043,\r\n \"Name\": \"CAFE AMERICANO CAPUCCINO CHICO\",\r\n \"Price\": \"3.60\",\r\n \"Units\": 5,\r\n \"Sales\": 14.89,\r\n \"GM\": 10.27\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 155,\r\n \"Subcategory\": \"HIGIENE FEMENINA\",\r\n \"Manufacturer\": \"JHONSON & JHONSON\",\r\n \"EAN\": 7891010010546,\r\n \"Name\": \"J&J OB Medio 10und\",\r\n \"Price\": \"12.00\",\r\n \"Units\": 2,\r\n \"Sales\": 19.84,\r\n \"GM\": 10.25\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77918802,\r\n \"Name\": \"PM L&M KS 20und\",\r\n \"Price\": \"3.42\",\r\n \"Units\": 44,\r\n \"Sales\": 140.47,\r\n \"GM\": 10.23\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77925084,\r\n \"Name\": \"SUGUS CREAMY ANANA 18G\",\r\n \"Price\": \"0.80\",\r\n \"Units\": 33,\r\n \"Sales\": 21.78,\r\n \"GM\": 10.19\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77924261,\r\n \"Name\": \"CAD Halls Creamy Mora 27gr\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 23,\r\n \"Sales\": 22.77,\r\n \"GM\": 10.17\r\n },\r\n {\r\n \"CategoryId\": 65,\r\n \"Category\": \"Leches\",\r\n \"SubcategoryId\": 70,\r\n \"Subcategory\": \"FLAVORED MILK\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7791337519053,\r\n \"Name\": \"DNN Yogurisimo Licuado de Banana 200g\",\r\n \"Price\": \"2.12\",\r\n \"Units\": 28,\r\n \"Sales\": 48.94,\r\n \"GM\": 10.15\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"TIA MARUCA\",\r\n \"EAN\": 7798082741524,\r\n \"Name\": \"TM Maruca fajitas Pizza 160 Gr\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 8,\r\n \"Sales\": 23.13,\r\n \"GM\": 10.13\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580717407,\r\n \"Name\": \"Saladix Parmesano 100gr\",\r\n \"Price\": \"2.80\",\r\n \"Units\": 11,\r\n \"Sales\": 25.41,\r\n \"GM\": 10.08\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910172,\r\n \"Name\": \"Kool Milds 20und\",\r\n \"Price\": \"3.95\",\r\n \"Units\": 34,\r\n \"Sales\": 125.04,\r\n \"GM\": 10.05\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"P&G\",\r\n \"EAN\": 37000117285,\r\n \"Name\": \"PG PRINGLES QUESO CHICA 43G\",\r\n \"Price\": \"6.00\",\r\n \"Units\": 5,\r\n \"Sales\": 24.8,\r\n \"GM\": 10.05\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77926371,\r\n \"Name\": \"PM L&M Box 20und\",\r\n \"Price\": \"3.57\",\r\n \"Units\": 35,\r\n \"Sales\": 116.6,\r\n \"GM\": 9.96\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 93,\r\n \"Subcategory\": \"HELADOS PREMIUM\",\r\n \"Manufacturer\": \"GENERAL MILLS ARG\",\r\n \"EAN\": 3415581306149,\r\n \"Name\": \"GM Haagen Dazs Summer Berries 100ml\",\r\n \"Price\": \"8.50\",\r\n \"Units\": 4,\r\n \"Sales\": 28.08,\r\n \"GM\": 9.96\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 60,\r\n \"Subcategory\": \"Caramelos en bolsa\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580618315,\r\n \"Name\": \"Mogul Fruta 50g\",\r\n \"Price\": \"1.10\",\r\n \"Units\": 27,\r\n \"Sales\": 24.57,\r\n \"GM\": 9.92\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6200,\r\n \"Name\": \"SFA Filtros Fram C-1191\",\r\n \"Price\": \"20.07\",\r\n \"Units\": 1,\r\n \"Sales\": 16.59,\r\n \"GM\": 9.92\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6270,\r\n \"Name\": \"SFA Filtros Fram C 5563\",\r\n \"Price\": \"22.00\",\r\n \"Units\": 1,\r\n \"Sales\": 18.18,\r\n \"GM\": 9.9\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6666,\r\n \"Name\": \"SFA Filtros Fram CA-9391\",\r\n \"Price\": \"30.16\",\r\n \"Units\": 1,\r\n \"Sales\": 24.93,\r\n \"GM\": 9.89\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77920423,\r\n \"Name\": \"Viceroy Classic Rojo Box 20\",\r\n \"Price\": \"2.78\",\r\n \"Units\": 53,\r\n \"Sales\": 136.14,\r\n \"GM\": 9.83\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77974648,\r\n \"Name\": \"Tofi Chocolate Blanco 27Gr\",\r\n \"Price\": \"1.56\",\r\n \"Units\": 21,\r\n \"Sales\": 27.05,\r\n \"GM\": 9.83\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 165,\r\n \"Subcategory\": \"FILM / PHOTO\",\r\n \"Manufacturer\": \"KODAK\",\r\n \"EAN\": 86806034074,\r\n \"Name\": \"KOD KODAK ULTRA 400 X 36\",\r\n \"Price\": \"25.00\",\r\n \"Units\": 1,\r\n \"Sales\": 20.66,\r\n \"GM\": 9.78\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 77965233,\r\n \"Name\": \"PRO Pronovelties Pipas 18g\",\r\n \"Price\": \"0.60\",\r\n \"Units\": 50,\r\n \"Sales\": 24.84,\r\n \"GM\": 9.72\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"LEHRITIER\",\r\n \"EAN\": 1107,\r\n \"Name\": \"LHRT Pico Dulce Chupetin 15gr\",\r\n \"Price\": \"0.54\",\r\n \"Units\": 50,\r\n \"Sales\": 22.13,\r\n \"GM\": 9.7\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 156,\r\n \"Subcategory\": \"PRESERVATIVOS\",\r\n \"Manufacturer\": \"BUHL\",\r\n \"EAN\": 7791014090325,\r\n \"Name\": \"Tulipan preservativos classic 3u\",\r\n \"Price\": \"3.15\",\r\n \"Units\": 8,\r\n \"Sales\": 20.81,\r\n \"GM\": 9.7\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 51,\r\n \"Subcategory\": \"Bebidas Alternativas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895056765,\r\n \"Name\": \"Black Fire 250ml\",\r\n \"Price\": \"4.10\",\r\n \"Units\": 6,\r\n \"Sales\": 20.34,\r\n \"GM\": 9.63\r\n },\r\n {\r\n \"CategoryId\": 13,\r\n \"Category\": \"Otro Tabaco\",\r\n \"SubcategoryId\": 15,\r\n \"Subcategory\": \"Cigarros\",\r\n \"Manufacturer\": \"PURO TABACO\",\r\n \"EAN\": 8822,\r\n \"Name\": \"PTBC Romeo Y Julieta Nro 3 Tubo Mano\",\r\n \"Price\": \"27.70\",\r\n \"Units\": 1,\r\n \"Sales\": 22.91,\r\n \"GM\": 9.6\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 80,\r\n \"Subcategory\": \"YOGURT\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7791337181021,\r\n \"Name\": \"DNN Yogurisimo Total Frutilla 185g\",\r\n \"Price\": \"2.42\",\r\n \"Units\": 20,\r\n \"Sales\": 40.03,\r\n \"GM\": 9.59\r\n },\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 219,\r\n \"Subcategory\": \"CAPPUCC./SPEC.COFFEE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2032,\r\n \"Name\": \"CAPUCCINO SABORIZADO\",\r\n \"Price\": \"7.10\",\r\n \"Units\": 2,\r\n \"Sales\": 11.74,\r\n \"GM\": 9.58\r\n },\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 219,\r\n \"Subcategory\": \"CAPPUCC./SPEC.COFFEE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2033,\r\n \"Name\": \"Mocaccino\",\r\n \"Price\": \"7.10\",\r\n \"Units\": 2,\r\n \"Sales\": 11.74,\r\n \"GM\": 9.56\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 7791249008720,\r\n \"Name\": \"CAD CADBURY TAB 72GR\",\r\n \"Price\": \"4.20\",\r\n \"Units\": 9,\r\n \"Sales\": 31.23,\r\n \"GM\": 9.55\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 193,\r\n \"Subcategory\": \"OTHER ADDITIVES\",\r\n \"Manufacturer\": \"BARDAHL LUBRICANT\",\r\n \"EAN\": 7790627101237,\r\n \"Name\": \"BRDL Nafta Adit Nafta Top Gun 250ml\",\r\n \"Price\": \"11.50\",\r\n \"Units\": 2,\r\n \"Sales\": 19,\r\n \"GM\": 9.53\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300108960,\r\n \"Name\": \"KR PEPITOS CHIPS BLANCOS 126G\",\r\n \"Price\": \"2.50\",\r\n \"Units\": 10,\r\n \"Sales\": 20.7,\r\n \"GM\": 9.47\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895066412,\r\n \"Name\": \"Dasani Minerali Con Gas 1.5L\",\r\n \"Price\": \"3.30\",\r\n \"Units\": 7,\r\n \"Sales\": 19.18,\r\n \"GM\": 9.44\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 7792993002033,\r\n \"Name\": \"TPS Laffitte Llave Cruz Crom 4 B\",\r\n \"Price\": \"28.75\",\r\n \"Units\": 1,\r\n \"Sales\": 23.76,\r\n \"GM\": 9.41\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 179,\r\n \"Subcategory\": \"NEWSPAPERS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7665,\r\n \"Name\": \"Diario Perfil\",\r\n \"Price\": \"4.70\",\r\n \"Units\": 2,\r\n \"Sales\": 9.4,\r\n \"GM\": 9.4\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 81,\r\n \"Subcategory\": \"OTHER DAIRY\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7793940034169,\r\n \"Name\": \"DNN Serenito Combinado 130gr\",\r\n \"Price\": \"1.68\",\r\n \"Units\": 24,\r\n \"Sales\": 33.39,\r\n \"GM\": 9.38\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310980309,\r\n \"Name\": \"FL Lays Doritos Pizza 50g\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 13,\r\n \"Sales\": 25.75,\r\n \"GM\": 9.37\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77917324,\r\n \"Name\": \"CAD VITA-C NARANJA 27GR\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 21,\r\n \"Sales\": 20.79,\r\n \"GM\": 9.35\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"MARS\",\r\n \"EAN\": 7896423419276,\r\n \"Name\": \"MARS MM Minis Tube 30 Gr\",\r\n \"Price\": \"3.90\",\r\n \"Units\": 7,\r\n \"Sales\": 22.55,\r\n \"GM\": 9.3\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6447,\r\n \"Name\": \"SFA Filtros Fram CA-5627\",\r\n \"Price\": \"23.36\",\r\n \"Units\": 1,\r\n \"Sales\": 19.31,\r\n \"GM\": 9.3\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 164,\r\n \"Subcategory\": \"BATTERIES\",\r\n \"Manufacturer\": \"ENERGIZER\",\r\n \"EAN\": 39800011367,\r\n \"Name\": \"ENZ Energizer Bateria Med CX2\",\r\n \"Price\": \"11.50\",\r\n \"Units\": 2,\r\n \"Sales\": 19.01,\r\n \"GM\": 9.27\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954535742,\r\n \"Name\": \"SFA Filtros Fram CA-5357D\",\r\n \"Price\": \"27.56\",\r\n \"Units\": 1,\r\n \"Sales\": 22.78,\r\n \"GM\": 9.23\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77916006,\r\n \"Name\": \"PM Le Mans Suave KS 20und\",\r\n \"Price\": \"3.42\",\r\n \"Units\": 45,\r\n \"Sales\": 143.6,\r\n \"GM\": 9.22\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 191,\r\n \"Subcategory\": \"BRAKE FLUIDS\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 7790627112226,\r\n \"Name\": \"TPS Liquido para frenos 500ml\",\r\n \"Price\": \"14.70\",\r\n \"Units\": 2,\r\n \"Sales\": 24.3,\r\n \"GM\": 9.22\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040055414,\r\n \"Name\": \"BGLY SER Salvador 145Gr\",\r\n \"Price\": \"2.60\",\r\n \"Units\": 10,\r\n \"Sales\": 21.5,\r\n \"GM\": 9.2\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"REVIGAL\",\r\n \"EAN\": 7790911003551,\r\n \"Name\": \"REVIGAL AMB AUT LEMON BREGE\",\r\n \"Price\": \"16.50\",\r\n \"Units\": 1,\r\n \"Sales\": 13.64,\r\n \"GM\": 9.19\r\n },\r\n {\r\n \"CategoryId\": 134,\r\n \"Category\": \"Almacen\",\r\n \"SubcategoryId\": 135,\r\n \"Subcategory\": \"CAFE Y TE\",\r\n \"Manufacturer\": \"CABRALES S.A.\",\r\n \"EAN\": 7790550012716,\r\n \"Name\": \"CAB Cabral Cafe Ins Clas Frasc 170g\",\r\n \"Price\": \"11.75\",\r\n \"Units\": 6,\r\n \"Sales\": 58.26,\r\n \"GM\": 9.18\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6206,\r\n \"Name\": \"SFA Filtros Fram CA-8674\",\r\n \"Price\": \"21.09\",\r\n \"Units\": 1,\r\n \"Sales\": 17.43,\r\n \"GM\": 9.15\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"QUILMES\",\r\n \"EAN\": 77927644,\r\n \"Name\": \"QLMS NPV Manzana 330ml\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 10,\r\n \"Sales\": 19.9,\r\n \"GM\": 9.1\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300160975,\r\n \"Name\": \"KR Cerealita Arros 160g\",\r\n \"Price\": \"4.00\",\r\n \"Units\": 6,\r\n \"Sales\": 19.83,\r\n \"GM\": 9.09\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"GEORGALOS\",\r\n \"EAN\": 7790380016168,\r\n \"Name\": \"GRG CEREAL FLOW LIGHT DURAZ YOG\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 18,\r\n \"Sales\": 19.28,\r\n \"GM\": 9\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771668808000,\r\n \"Name\": \"APERTURA\",\r\n \"Price\": \"9.00\",\r\n \"Units\": 1,\r\n \"Sales\": 9,\r\n \"GM\": 9\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771851382003,\r\n \"Name\": \"POP STAR\",\r\n \"Price\": \"4.50\",\r\n \"Units\": 2,\r\n \"Sales\": 9,\r\n \"GM\": 9\r\n },\r\n {\r\n \"CategoryId\": 134,\r\n \"Category\": \"Almacen\",\r\n \"SubcategoryId\": 138,\r\n \"Subcategory\": \"OTROS ALMACEN\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7793360004971,\r\n \"Name\": \"FRUTILLA MERMELADA BC 390G\",\r\n \"Price\": \"9.00\",\r\n \"Units\": 3,\r\n \"Sales\": 22.32,\r\n \"GM\": 8.92\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7798011661657,\r\n \"Name\": \"Motorcraft Filtro Aceite E FL 600\",\r\n \"Price\": \"26.00\",\r\n \"Units\": 1,\r\n \"Sales\": 21.49,\r\n \"GM\": 8.92\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 37000446217,\r\n \"Name\": \"LMAR PRINGLES CHEDDAR 80G\",\r\n \"Price\": \"9.00\",\r\n \"Units\": 3,\r\n \"Sales\": 22.32,\r\n \"GM\": 8.9\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77916013,\r\n \"Name\": \"KR MILKA LEGER ALMENDRAS 25GR\",\r\n \"Price\": \"1.50\",\r\n \"Units\": 37,\r\n \"Sales\": 45.88,\r\n \"GM\": 8.88\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040345102,\r\n \"Name\": \"ARCOR BIZCOCHOS AZUCARAD 225G\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 11,\r\n \"Sales\": 21.79,\r\n \"GM\": 8.88\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"CLAMER SRL\",\r\n \"EAN\": 3709,\r\n \"Name\": \"CSRL Martin de Ridder Brownie\",\r\n \"Price\": \"2.90\",\r\n \"Units\": 8,\r\n \"Sales\": 19.18,\r\n \"GM\": 8.87\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 59,\r\n \"Subcategory\": \"Barras sin chocolate\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 7791249007280,\r\n \"Name\": \"CAD Mantecol 25gr\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 24,\r\n \"Sales\": 19.89,\r\n \"GM\": 8.85\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910653,\r\n \"Name\": \"Jockey Club S 100 20und\",\r\n \"Price\": \"3.54\",\r\n \"Units\": 38,\r\n \"Sales\": 125.12,\r\n \"GM\": 8.78\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895064340,\r\n \"Name\": \"Cepita Manzana 1L\",\r\n \"Price\": \"4.50\",\r\n \"Units\": 4,\r\n \"Sales\": 14.92,\r\n \"GM\": 8.75\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 7792993001890,\r\n \"Name\": \"TPS Triang Senal Bal Trian Est 2\",\r\n \"Price\": \"27.00\",\r\n \"Units\": 1,\r\n \"Sales\": 22.31,\r\n \"GM\": 8.57\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77915894,\r\n \"Name\": \"PM CHESTERFIELD KS BOX\",\r\n \"Price\": \"3.27\",\r\n \"Units\": 88,\r\n \"Sales\": 268.89,\r\n \"GM\": 8.51\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040609501,\r\n \"Name\": \"BON O BON ALF TRIP CHOC 60G\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 12,\r\n \"Sales\": 19.8,\r\n \"GM\": 8.51\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771515264003,\r\n \"Name\": \"TC Urbano\",\r\n \"Price\": \"8.50\",\r\n \"Units\": 1,\r\n \"Sales\": 8.5,\r\n \"GM\": 8.5\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580387105,\r\n \"Name\": \"Saladix Jamon 30gr\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 23,\r\n \"Sales\": 19.07,\r\n \"GM\": 8.46\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 205,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3063,\r\n \"Name\": \"DISC Adicional Jamon Cocido\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 17,\r\n \"Sales\": 14.05,\r\n \"GM\": 8.44\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580397500,\r\n \"Name\": \"Arcor Tacita Americana DDL 90ml\",\r\n \"Price\": \"1.80\",\r\n \"Units\": 14,\r\n \"Sales\": 20.85,\r\n \"GM\": 8.44\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 155,\r\n \"Subcategory\": \"HIGIENE FEMENINA\",\r\n \"Manufacturer\": \"JHONSON & JHONSON\",\r\n \"EAN\": 7790010003124,\r\n \"Name\": \"J&J SIEMP LIBRE PERMASEC ALAS 8U\",\r\n \"Price\": \"7.00\",\r\n \"Units\": 3,\r\n \"Sales\": 17.37,\r\n \"GM\": 8.44\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 80,\r\n \"Subcategory\": \"YOGURT\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7791337686946,\r\n \"Name\": \"DNN YOGURISIMO FULL 185G\",\r\n \"Price\": \"2.51\",\r\n \"Units\": 19,\r\n \"Sales\": 39.33,\r\n \"GM\": 8.4\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6886,\r\n \"Name\": \"SFA Filtros Fram PH-5796\",\r\n \"Price\": \"22.57\",\r\n \"Units\": 1,\r\n \"Sales\": 18.65,\r\n \"GM\": 8.4\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"P&G\",\r\n \"EAN\": 37000117261,\r\n \"Name\": \"PG PRINGLES CREM CEBOLLA C43G\",\r\n \"Price\": \"6.00\",\r\n \"Units\": 4,\r\n \"Sales\": 19.84,\r\n \"GM\": 8.4\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300093877,\r\n \"Name\": \"KR CLUB SOCIAL CHIPS 40G\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 9,\r\n \"Sales\": 17.83,\r\n \"GM\": 8.37\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77924162,\r\n \"Name\": \"CAD HALLS FUSI�N FRUTOS VERDES\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 17,\r\n \"Sales\": 18.22,\r\n \"GM\": 8.34\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"OSRAM\",\r\n \"EAN\": 7798011660834,\r\n \"Name\": \"OSRM Osram Lamp 2821 2und\",\r\n \"Price\": \"7.40\",\r\n \"Units\": 2,\r\n \"Sales\": 12.24,\r\n \"GM\": 8.34\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7662,\r\n \"Name\": \"Para Ti con Regalo\",\r\n \"Price\": \"8.30\",\r\n \"Units\": 1,\r\n \"Sales\": 8.3,\r\n \"GM\": 8.3\r\n },\r\n {\r\n \"CategoryId\": 134,\r\n \"Category\": \"Almacen\",\r\n \"SubcategoryId\": 135,\r\n \"Subcategory\": \"CAFE Y TE\",\r\n \"Manufacturer\": \"CABRALES S.A.\",\r\n \"EAN\": 7790550000157,\r\n \"Name\": \"CAB Cabrales 250gr\",\r\n \"Price\": \"7.40\",\r\n \"Units\": 4,\r\n \"Sales\": 24.48,\r\n \"GM\": 8.28\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77927408,\r\n \"Name\": \"SUCHARD CARAMELO ACIDOS 26.6G\",\r\n \"Price\": \"0.90\",\r\n \"Units\": 24,\r\n \"Sales\": 17.81,\r\n \"GM\": 8.28\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 175,\r\n \"Subcategory\": \"OTHER GM\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 86806120135,\r\n \"Name\": \"Camara Descartable Ultra 27 Flash\",\r\n \"Price\": \"19.90\",\r\n \"Units\": 2,\r\n \"Sales\": 32.89,\r\n \"GM\": 8.23\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7792170110421,\r\n \"Name\": \"Cereal Quaker Naran Choc 25g\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 25,\r\n \"Sales\": 20.7,\r\n \"GM\": 8.17\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040944800,\r\n \"Name\": \"BGLY Rex 3 Queso 60gr\",\r\n \"Price\": \"1.80\",\r\n \"Units\": 14,\r\n \"Sales\": 20.86,\r\n \"GM\": 8.16\r\n },\r\n {\r\n \"CategoryId\": 13,\r\n \"Category\": \"Otro Tabaco\",\r\n \"SubcategoryId\": 15,\r\n \"Subcategory\": \"Cigarros\",\r\n \"Manufacturer\": \"PURO TABACO\",\r\n \"EAN\": 8802,\r\n \"Name\": \"PTBC JL Piedra Cazadores Und\",\r\n \"Price\": \"15.40\",\r\n \"Units\": 1,\r\n \"Sales\": 12.95,\r\n \"GM\": 8.15\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954015664,\r\n \"Name\": \"SFA Fram Filtro C 1566\",\r\n \"Price\": \"20.87\",\r\n \"Units\": 1,\r\n \"Sales\": 17.25,\r\n \"GM\": 8.09\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7794600460342,\r\n \"Name\": \"KR Mayco sin Sal 169g\",\r\n \"Price\": \"2.60\",\r\n \"Units\": 8,\r\n \"Sales\": 17.2,\r\n \"GM\": 8.07\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 7790715013152,\r\n \"Name\": \"TPS Auto Polish Dos Lustre 450ml\",\r\n \"Price\": \"22.50\",\r\n \"Units\": 1,\r\n \"Sales\": 18.6,\r\n \"GM\": 8.06\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7792170110506,\r\n \"Name\": \"CEREAL QUAKER DURAZ A LA CREM 25\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 24,\r\n \"Sales\": 19.88,\r\n \"GM\": 7.84\r\n },\r\n {\r\n \"CategoryId\": 134,\r\n \"Category\": \"Almacen\",\r\n \"SubcategoryId\": 135,\r\n \"Subcategory\": \"CAFE Y TE\",\r\n \"Manufacturer\": \"QUIMICA ESTRELLA\",\r\n \"EAN\": 7791445052305,\r\n \"Name\": \"QE Cruz de Malta Yerba Naranja 500gr\",\r\n \"Price\": \"5.50\",\r\n \"Units\": 3,\r\n \"Sales\": 13.65,\r\n \"GM\": 7.78\r\n },\r\n {\r\n \"CategoryId\": 134,\r\n \"Category\": \"Almacen\",\r\n \"SubcategoryId\": 135,\r\n \"Subcategory\": \"CAFE Y TE\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7790387003482,\r\n \"Name\": \"LM Taragui Mate Listo todo en uno 65g\",\r\n \"Price\": \"7.50\",\r\n \"Units\": 3,\r\n \"Sales\": 18.6,\r\n \"GM\": 7.72\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77925091,\r\n \"Name\": \"SUGUS CREAMY MENTA 18G\",\r\n \"Price\": \"0.80\",\r\n \"Units\": 24,\r\n \"Sales\": 15.84,\r\n \"GM\": 7.72\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954031640,\r\n \"Name\": \"SFA Filtros Fram CA-3164\",\r\n \"Price\": \"28.12\",\r\n \"Units\": 1,\r\n \"Sales\": 23.24,\r\n \"GM\": 7.72\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040001022,\r\n \"Name\": \"BGLY SER TOST CLASICAS 110G\",\r\n \"Price\": \"4.50\",\r\n \"Units\": 5,\r\n \"Sales\": 18.6,\r\n \"GM\": 7.69\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 7797954055134,\r\n \"Name\": \"SFA Filtros Fram CA-5513\",\r\n \"Price\": \"23.25\",\r\n \"Units\": 1,\r\n \"Sales\": 19.21,\r\n \"GM\": 7.68\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300299637,\r\n \"Name\": \"KR Terrabusi Express 108G\",\r\n \"Price\": \"1.50\",\r\n \"Units\": 15,\r\n \"Sales\": 18.6,\r\n \"GM\": 7.66\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"WYNNS\",\r\n \"EAN\": 73579508079,\r\n \"Name\": \"WNNS Alto al Humo 325ml\",\r\n \"Price\": \"25.00\",\r\n \"Units\": 1,\r\n \"Sales\": 20.66,\r\n \"GM\": 7.63\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"CLAMER SRL\",\r\n \"EAN\": 3707,\r\n \"Name\": \"CSRL Martin de Ridder Limonito\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 10,\r\n \"Sales\": 16.51,\r\n \"GM\": 7.51\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7792170110469,\r\n \"Name\": \"CEREAL QUAKER MENTA C CHOC 22G\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 23,\r\n \"Sales\": 19.04,\r\n \"GM\": 7.5\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770006255001,\r\n \"Name\": \"Billiken\",\r\n \"Price\": \"7.50\",\r\n \"Units\": 1,\r\n \"Sales\": 7.5,\r\n \"GM\": 7.5\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77917232,\r\n \"Name\": \"KR CEREALITA MIEL/CEREALES BARRA\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 16,\r\n \"Sales\": 15.84,\r\n \"GM\": 7.46\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040455405,\r\n \"Name\": \"ARCOR BIZCOCHO GRASA 200G\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 9,\r\n \"Sales\": 17.83,\r\n \"GM\": 7.42\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040545960,\r\n \"Name\": \"BGLY Criollitas Bizcochos 140Gr\",\r\n \"Price\": \"1.90\",\r\n \"Units\": 12,\r\n \"Sales\": 18.84,\r\n \"GM\": 7.42\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"BARDAHL LUBRICANT\",\r\n \"EAN\": 7790627100698,\r\n \"Name\": \"BRDL Infla Neumatico Bardhal S 300gr\",\r\n \"Price\": \"23.00\",\r\n \"Units\": 1,\r\n \"Sales\": 19.01,\r\n \"GM\": 7.38\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"TIA MARUCA\",\r\n \"EAN\": 7798082740152,\r\n \"Name\": \"TM Tia Maruca Hojaldre 220gr\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 6,\r\n \"Sales\": 17.34,\r\n \"GM\": 7.38\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"PHILIPMORRIS\",\r\n \"EAN\": 77926333,\r\n \"Name\": \"PM L&M MENTHOL KS 20 UND\",\r\n \"Price\": \"3.41\",\r\n \"Units\": 34,\r\n \"Sales\": 108.09,\r\n \"GM\": 7.29\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 165,\r\n \"Subcategory\": \"FILM / PHOTO\",\r\n \"Manufacturer\": \"KODAK\",\r\n \"EAN\": 86806034036,\r\n \"Name\": \"KOD KODAK ULTRA 400 X 24\",\r\n \"Price\": \"20.00\",\r\n \"Units\": 1,\r\n \"Sales\": 16.53,\r\n \"GM\": 7.24\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"TIA MARUCA\",\r\n \"EAN\": 7798082740312,\r\n \"Name\": \"TM Tia Maruca Tortitas Dulce 220gr\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 5,\r\n \"Sales\": 14.45,\r\n \"GM\": 7.22\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 179,\r\n \"Subcategory\": \"NEWSPAPERS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7612,\r\n \"Name\": \"La Nacion Jueves\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 3,\r\n \"Sales\": 7.2,\r\n \"GM\": 7.2\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 63,\r\n \"Subcategory\": \"Golosinas a granel\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040379305,\r\n \"Name\": \"Cereal Mix Manzana Light X3 69g\",\r\n \"Price\": \"3.90\",\r\n \"Units\": 6,\r\n \"Sales\": 19.33,\r\n \"GM\": 7.11\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910943,\r\n \"Name\": \"Parisienes Box 10und\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 58,\r\n \"Sales\": 108.02,\r\n \"GM\": 7.1\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77922670,\r\n \"Name\": \"Menthoplus Strong 30.6 Gr\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 22,\r\n \"Sales\": 18.24,\r\n \"GM\": 7.1\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"CLAMER SRL\",\r\n \"EAN\": 3714,\r\n \"Name\": \"CSRL Martin Ridder Alfajorcito 4\",\r\n \"Price\": \"2.10\",\r\n \"Units\": 9,\r\n \"Sales\": 15.66,\r\n \"GM\": 7.02\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9991599000001,\r\n \"Name\": \"10 Segundos\",\r\n \"Price\": \"7.00\",\r\n \"Units\": 1,\r\n \"Sales\": 7,\r\n \"GM\": 7\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77973078,\r\n \"Name\": \"PM Particulares LS 20und\",\r\n \"Price\": \"3.29\",\r\n \"Units\": 29,\r\n \"Sales\": 89.03,\r\n \"GM\": 6.99\r\n },\r\n {\r\n \"CategoryId\": 134,\r\n \"Category\": \"Almacen\",\r\n \"SubcategoryId\": 137,\r\n \"Subcategory\": \"CONDIMENTOS\",\r\n \"Manufacturer\": \"MERISANT\",\r\n \"EAN\": 7792850000066,\r\n \"Name\": \"MER Chucker Edulcorante 250ml\",\r\n \"Price\": \"7.00\",\r\n \"Units\": 2,\r\n \"Sales\": 11.58,\r\n \"GM\": 6.97\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771514852003,\r\n \"Name\": \"Genios\",\r\n \"Price\": \"6.90\",\r\n \"Units\": 1,\r\n \"Sales\": 6.9,\r\n \"GM\": 6.9\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771851280002,\r\n \"Name\": \"HIGH SCHOOL La revista\",\r\n \"Price\": \"6.90\",\r\n \"Units\": 1,\r\n \"Sales\": 6.9,\r\n \"GM\": 6.9\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910622,\r\n \"Name\": \"Viceroy Classic Light Soft Cu 20un\",\r\n \"Price\": \"2.62\",\r\n \"Units\": 40,\r\n \"Sales\": 97.22,\r\n \"GM\": 6.89\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580592417,\r\n \"Name\": \"TOP LINE C SIN AZUC MENTOL\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 18,\r\n \"Sales\": 17.83,\r\n \"GM\": 6.85\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040933408,\r\n \"Name\": \"Panchitas Chocolate 120g\",\r\n \"Price\": \"2.20\",\r\n \"Units\": 9,\r\n \"Sales\": 16.38,\r\n \"GM\": 6.85\r\n },\r\n {\r\n \"CategoryId\": 65,\r\n \"Category\": \"Leches\",\r\n \"SubcategoryId\": 70,\r\n \"Subcategory\": \"FLAVORED MILK\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7791337430020,\r\n \"Name\": \"DNN Danone Bebible Maxi 200G\",\r\n \"Price\": \"2.20\",\r\n \"Units\": 15,\r\n \"Sales\": 27.25,\r\n \"GM\": 6.79\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7622300108878,\r\n \"Name\": \"KR LINCOLN GALLETITA 161GR\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 14,\r\n \"Sales\": 23.1,\r\n \"GM\": 6.74\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77923264,\r\n \"Name\": \"MENTHOPLUS PLUS UVA LIMON\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 20,\r\n \"Sales\": 16.57,\r\n \"GM\": 6.67\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"WYNNS\",\r\n \"EAN\": 7790039515196,\r\n \"Name\": \"WNNS Kwik Kool 354ml\",\r\n \"Price\": \"16.00\",\r\n \"Units\": 1,\r\n \"Sales\": 13.22,\r\n \"GM\": 6.66\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7794600459636,\r\n \"Name\": \"KR Club Social Jamon 25gr\",\r\n \"Price\": \"0.70\",\r\n \"Units\": 24,\r\n \"Sales\": 13.92,\r\n \"GM\": 6.59\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"REVIGAL\",\r\n \"EAN\": 7790911000291,\r\n \"Name\": \"RVG Revigal Silicon Citrico Aer 260G\",\r\n \"Price\": \"18.00\",\r\n \"Units\": 1,\r\n \"Sales\": 14.88,\r\n \"GM\": 6.58\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 81,\r\n \"Subcategory\": \"OTHER DAIRY\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7793940114076,\r\n \"Name\": \"DNN Postre Ser Chocolate 130gr\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 11,\r\n \"Sales\": 20.9,\r\n \"GM\": 6.57\r\n },\r\n {\r\n \"CategoryId\": 232,\r\n \"Category\": \"Bebidas Congeladas dispensadas\",\r\n \"SubcategoryId\": 234,\r\n \"Subcategory\": \"FROZEN NON-CARBONATE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2601,\r\n \"Name\": \"SMOOTHIE FRUTILLA\",\r\n \"Price\": \"7.25\",\r\n \"Units\": 2,\r\n \"Sales\": 11.98,\r\n \"GM\": 6.55\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 63,\r\n \"Subcategory\": \"Golosinas a granel\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580167806,\r\n \"Name\": \"Butter Toffees Leche 250g\",\r\n \"Price\": \"9.10\",\r\n \"Units\": 2,\r\n \"Sales\": 15.04,\r\n \"GM\": 6.55\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 193,\r\n \"Subcategory\": \"OTHER ADDITIVES\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 73579679120,\r\n \"Name\": \"TPS wynns Emision Plus 325ml\",\r\n \"Price\": \"18.25\",\r\n \"Units\": 1,\r\n \"Sales\": 15.08,\r\n \"GM\": 6.52\r\n },\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 216,\r\n \"Subcategory\": \"COFFEE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2066,\r\n \"Name\": \"Cafe Jarrito Tric Lagrima To go\",\r\n \"Price\": \"4.00\",\r\n \"Units\": 35,\r\n \"Sales\": 115.81,\r\n \"GM\": 6.5\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"GEORGALOS\",\r\n \"EAN\": 7790380016366,\r\n \"Name\": \"GEO TOKKE CHOC DDL 25G\",\r\n \"Price\": \"1.41\",\r\n \"Units\": 14,\r\n \"Sales\": 16.39,\r\n \"GM\": 6.48\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"OSRAM\",\r\n \"EAN\": 7798011660131,\r\n \"Name\": \"OSRM Lamparita 5007 2und\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 7,\r\n \"Sales\": 13.3,\r\n \"GM\": 6.44\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7794600459650,\r\n \"Name\": \"KR Club Social Pizza 25gr\",\r\n \"Price\": \"0.70\",\r\n \"Units\": 23,\r\n \"Sales\": 13.34,\r\n \"GM\": 6.32\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 9313,\r\n \"Name\": \"SPRITE ZERO 237ML\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 7,\r\n \"Sales\": 13.37,\r\n \"GM\": 6.31\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 208,\r\n \"Subcategory\": \"SOUP & SALAD\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3447,\r\n \"Name\": \"Ensalada Verde 200gr\",\r\n \"Price\": \"9.25\",\r\n \"Units\": 2,\r\n \"Sales\": 15.28,\r\n \"GM\": 6.31\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 208,\r\n \"Subcategory\": \"SOUP & SALAD\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3446,\r\n \"Name\": \"ESSO Ensalad Primav 200g Canast\",\r\n \"Price\": \"10.00\",\r\n \"Units\": 2,\r\n \"Sales\": 16.52,\r\n \"GM\": 6.28\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 81,\r\n \"Subcategory\": \"OTHER DAIRY\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7791337005709,\r\n \"Name\": \"DNN Actimel Natural 100gr\",\r\n \"Price\": \"1.43\",\r\n \"Units\": 20,\r\n \"Sales\": 23.59,\r\n \"GM\": 6.21\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 170,\r\n \"Subcategory\": \"SMOKING ACCESSOIRES\",\r\n \"Manufacturer\": \"CIA ARG FOSFOROS\",\r\n \"EAN\": 9913,\r\n \"Name\": \"CAF Fragata x 50und\",\r\n \"Price\": \"0.30\",\r\n \"Units\": 51,\r\n \"Sales\": 12.75,\r\n \"GM\": 6.16\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"GEORGALOS\",\r\n \"EAN\": 7790380016359,\r\n \"Name\": \"GEO Tokke Choc Cookie 25g\",\r\n \"Price\": \"1.42\",\r\n \"Units\": 13,\r\n \"Sales\": 15.31,\r\n \"GM\": 6.1\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77916044,\r\n \"Name\": \"KR Milka Leger Leche 25gr\",\r\n \"Price\": \"1.50\",\r\n \"Units\": 25,\r\n \"Sales\": 31,\r\n \"GM\": 6.06\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 63,\r\n \"Subcategory\": \"Golosinas a granel\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222042144,\r\n \"Name\": \"BNFD NUGATON MINI BCO 72GR\",\r\n \"Price\": \"3.48\",\r\n \"Units\": 5,\r\n \"Sales\": 14.38,\r\n \"GM\": 6.05\r\n },\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 216,\r\n \"Subcategory\": \"COFFEE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2045,\r\n \"Name\": \"Cafe Americano Vienes Chico\",\r\n \"Price\": \"4.00\",\r\n \"Units\": 3,\r\n \"Sales\": 9.93,\r\n \"GM\": 6.01\r\n },\r\n {\r\n \"CategoryId\": 13,\r\n \"Category\": \"Otro Tabaco\",\r\n \"SubcategoryId\": 15,\r\n \"Subcategory\": \"Cigarros\",\r\n \"Manufacturer\": \"PURO TABACO\",\r\n \"EAN\": 8816,\r\n \"Name\": \"PTBC JL Piedra Petit Cetros Und\",\r\n \"Price\": \"12.30\",\r\n \"Units\": 1,\r\n \"Sales\": 10.35,\r\n \"GM\": 5.95\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7792860012967,\r\n \"Name\": \"LHE CHUPET�N GIRO LOCO 12G\",\r\n \"Price\": \"1.90\",\r\n \"Units\": 10,\r\n \"Sales\": 15.7,\r\n \"GM\": 5.94\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7794910452648,\r\n \"Name\": \"KR CEREALITAS SALVADO 200G\",\r\n \"Price\": \"2.60\",\r\n \"Units\": 7,\r\n \"Sales\": 15.05,\r\n \"GM\": 5.94\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 174,\r\n \"Subcategory\": \"SEASONAL\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 9914,\r\n \"Name\": \"TPS Carbon Vegetal Pack 10kg\",\r\n \"Price\": \"28.00\",\r\n \"Units\": 1,\r\n \"Sales\": 23.14,\r\n \"GM\": 5.89\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040720107,\r\n \"Name\": \"Mana Vainillas 145g\",\r\n \"Price\": \"2.20\",\r\n \"Units\": 8,\r\n \"Sales\": 14.56,\r\n \"GM\": 5.84\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 62,\r\n \"Subcategory\": \"Caramelos sueltos\",\r\n \"Manufacturer\": \"GEORGALOS\",\r\n \"EAN\": 1155,\r\n \"Name\": \"GRG FLYNN PAFF CARAMELO MANZANA\",\r\n \"Price\": \"0.20\",\r\n \"Units\": 65,\r\n \"Sales\": 10.84,\r\n \"GM\": 5.83\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040534803,\r\n \"Name\": \"Arcor Formis Choc 108g\",\r\n \"Price\": \"2.20\",\r\n \"Units\": 8,\r\n \"Sales\": 14.56,\r\n \"GM\": 5.71\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 8410031935349,\r\n \"Name\": \"ADVENTURE POP 13 GR.\",\r\n \"Price\": \"10.00\",\r\n \"Units\": 2,\r\n \"Sales\": 16.53,\r\n \"GM\": 5.69\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580387006,\r\n \"Name\": \"Saladix Pizza 30gr\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 16,\r\n \"Sales\": 13.28,\r\n \"GM\": 5.67\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 50,\r\n \"Subcategory\": \"Otras Bebidas\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7790950104615,\r\n \"Name\": \"CA Terma Bosq del Sur 420ml Pet\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 6,\r\n \"Sales\": 11.88,\r\n \"GM\": 5.62\r\n },\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 219,\r\n \"Subcategory\": \"CAPPUCC./SPEC.COFFEE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2062,\r\n \"Name\": \"Adicional Crema\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 16,\r\n \"Sales\": 13.26,\r\n \"GM\": 5.58\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771850450000,\r\n \"Name\": \"SEVENTEEN\",\r\n \"Price\": \"5.50\",\r\n \"Units\": 1,\r\n \"Sales\": 5.5,\r\n \"GM\": 5.5\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 59,\r\n \"Subcategory\": \"Barras sin chocolate\",\r\n \"Manufacturer\": \"MARS INCORPORATED\",\r\n \"EAN\": 7896423424379,\r\n \"Name\": \"MARS TWIX 30GR\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 8,\r\n \"Sales\": 13.21,\r\n \"GM\": 5.45\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580253912,\r\n \"Name\": \"Mr Pops Chupetin Bots 12.5g\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 5,\r\n \"Sales\": 14.46,\r\n \"GM\": 5.43\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062548426,\r\n \"Name\": \"DNN SER AGUA PLUS LIMA LIM 1.5L\",\r\n \"Price\": \"4.90\",\r\n \"Units\": 3,\r\n \"Sales\": 12.15,\r\n \"GM\": 5.42\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 205,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3064,\r\n \"Name\": \"Adicional Queso Pratto\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 25,\r\n \"Sales\": 20.69,\r\n \"GM\": 5.42\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7792799578794,\r\n \"Name\": \"NESTLE 5000 5LTS\",\r\n \"Price\": \"6.50\",\r\n \"Units\": 5,\r\n \"Sales\": 26.85,\r\n \"GM\": 5.41\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77917225,\r\n \"Name\": \"KR CEREALITA BANANA ALM BARRA 23\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 12,\r\n \"Sales\": 11.88,\r\n \"GM\": 5.4\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"TIA MARUCA\",\r\n \"EAN\": 7798082740183,\r\n \"Name\": \"TM Tia Maruca Naranjitas 250gr\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 4,\r\n \"Sales\": 11.56,\r\n \"GM\": 5.4\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77904744,\r\n \"Name\": \"CAD Yapa 17gr\",\r\n \"Price\": \"0.50\",\r\n \"Units\": 38,\r\n \"Sales\": 15.66,\r\n \"GM\": 5.36\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 63,\r\n \"Subcategory\": \"Golosinas a granel\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580470807,\r\n \"Name\": \"ARCOR GAJITOS 150G\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 5,\r\n \"Sales\": 14.45,\r\n \"GM\": 5.35\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"CLAMER SRL\",\r\n \"EAN\": 3708,\r\n \"Name\": \"CSRL Martin R Alf Maic Dulc Lech\",\r\n \"Price\": \"2.60\",\r\n \"Units\": 5,\r\n \"Sales\": 10.75,\r\n \"GM\": 5.32\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 50,\r\n \"Subcategory\": \"Otras Bebidas\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7790950106633,\r\n \"Name\": \"CA Terma Bosq d Sur Light Pet\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 7,\r\n \"Sales\": 13.86,\r\n \"GM\": 5.29\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"POSTRES BALCARCE\",\r\n \"EAN\": 6221,\r\n \"Name\": \"PB Balcarce Alf Mixto caja 6 ud\",\r\n \"Price\": \"14.00\",\r\n \"Units\": 1,\r\n \"Sales\": 11.57,\r\n \"GM\": 5.24\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222002803,\r\n \"Name\": \"BNFD DRF LIMON 23 GR\",\r\n \"Price\": \"0.80\",\r\n \"Units\": 13,\r\n \"Sales\": 8.58,\r\n \"GM\": 5.13\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 171,\r\n \"Subcategory\": \"VIDEO / AUDIO / TAPE\",\r\n \"Manufacturer\": \"KODAK\",\r\n \"EAN\": 881295710696,\r\n \"Name\": \"KOD Kodak DVD en Sobre 16x\",\r\n \"Price\": \"3.46\",\r\n \"Units\": 7,\r\n \"Sales\": 20.02,\r\n \"GM\": 5.04\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310980729,\r\n \"Name\": \"FL DORITOS QUESO 58G\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 7,\r\n \"Sales\": 13.86,\r\n \"GM\": 5.04\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77920249,\r\n \"Name\": \"Derby Suave 100 20und\",\r\n \"Price\": \"3.51\",\r\n \"Units\": 23,\r\n \"Sales\": 75.12,\r\n \"GM\": 4.98\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580395100,\r\n \"Name\": \"Arcor Slice Mix Frutas 70ml\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 8,\r\n \"Sales\": 13.23,\r\n \"GM\": 4.96\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77935731,\r\n \"Name\": \"PM Imparciales 100 20und\",\r\n \"Price\": \"3.40\",\r\n \"Units\": 23,\r\n \"Sales\": 73.05,\r\n \"GM\": 4.95\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 1133,\r\n \"Name\": \"Aguila Medallon Menta 15gr\",\r\n \"Price\": \"0.70\",\r\n \"Units\": 22,\r\n \"Sales\": 12.76,\r\n \"GM\": 4.95\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 7791249010518,\r\n \"Name\": \"CAD ADAMS MENTA 11.6 GR\",\r\n \"Price\": \"0.90\",\r\n \"Units\": 15,\r\n \"Sales\": 11.13,\r\n \"GM\": 4.91\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 81,\r\n \"Subcategory\": \"OTHER DAIRY\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7791337074071,\r\n \"Name\": \"DNN Ser Serenito Shake 135ml\",\r\n \"Price\": \"2.33\",\r\n \"Units\": 12,\r\n \"Sales\": 23.09,\r\n \"GM\": 4.9\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 5011053015618,\r\n \"Name\": \"MEGA ROLL 22 ML\",\r\n \"Price\": \"4.10\",\r\n \"Units\": 3,\r\n \"Sales\": 10.17,\r\n \"GM\": 4.83\r\n },\r\n {\r\n \"CategoryId\": 134,\r\n \"Category\": \"Almacen\",\r\n \"SubcategoryId\": 138,\r\n \"Subcategory\": \"OTROS ALMACEN\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 7790050987057,\r\n \"Name\": \"KR Tang Sobre Naranja 45gr\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 9,\r\n \"Sales\": 8.99,\r\n \"GM\": 4.8\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 156,\r\n \"Subcategory\": \"PRESERVATIVOS\",\r\n \"Manufacturer\": \"BUHL\",\r\n \"EAN\": 7791014090332,\r\n \"Name\": \"Tulipan preservativo texturado3u\",\r\n \"Price\": \"3.10\",\r\n \"Units\": 4,\r\n \"Sales\": 10.24,\r\n \"GM\": 4.73\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 50,\r\n \"Subcategory\": \"Otras Bebidas\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7790950104608,\r\n \"Name\": \"CA Terma Traslasierra 420ml Pet\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 5,\r\n \"Sales\": 9.9,\r\n \"GM\": 4.65\r\n },\r\n {\r\n \"CategoryId\": 224,\r\n \"Category\": \"Bebidas fr�as dispensadas\",\r\n \"SubcategoryId\": 225,\r\n \"Subcategory\": \"FOUNTAIN-CARBONATED\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2307,\r\n \"Name\": \"Gaseosa FastFood ChicaCoca Light\",\r\n \"Price\": \"2.50\",\r\n \"Units\": 5,\r\n \"Sales\": 10.35,\r\n \"GM\": 4.65\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"OSRAM\",\r\n \"EAN\": 7798011660841,\r\n \"Name\": \"OSRM Lamparita 2825 2und\",\r\n \"Price\": \"3.70\",\r\n \"Units\": 3,\r\n \"Sales\": 9.18,\r\n \"GM\": 4.65\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 149,\r\n \"Subcategory\": \"ANALGESICOS\",\r\n \"Manufacturer\": \"BAYER\",\r\n \"EAN\": 9808,\r\n \"Name\": \"BY Bayaspirina C 3.385gr\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 12,\r\n \"Sales\": 12,\r\n \"GM\": 4.59\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 165,\r\n \"Subcategory\": \"FILM / PHOTO\",\r\n \"Manufacturer\": \"KODAK\",\r\n \"EAN\": 86806034265,\r\n \"Name\": \"KOD KODAK KCX24\",\r\n \"Price\": \"10.20\",\r\n \"Units\": 2,\r\n \"Sales\": 16.86,\r\n \"GM\": 4.56\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9771515851005,\r\n \"Name\": \"Vivir Mejor\",\r\n \"Price\": \"4.50\",\r\n \"Units\": 1,\r\n \"Sales\": 4.5,\r\n \"GM\": 4.5\r\n },\r\n {\r\n \"CategoryId\": 232,\r\n \"Category\": \"Bebidas Congeladas dispensadas\",\r\n \"SubcategoryId\": 234,\r\n \"Subcategory\": \"FROZEN NON-CARBONATE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2600,\r\n \"Name\": \"Cafe Frappe\",\r\n \"Price\": \"7.75\",\r\n \"Units\": 3,\r\n \"Sales\": 19.21,\r\n \"GM\": 4.49\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"OSRAM\",\r\n \"EAN\": 7798011660124,\r\n \"Name\": \"OSRM Lampara 533 2und\",\r\n \"Price\": \"2.90\",\r\n \"Units\": 4,\r\n \"Sales\": 9.6,\r\n \"GM\": 4.48\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77920416,\r\n \"Name\": \"Winston Box 20und\",\r\n \"Price\": \"3.92\",\r\n \"Units\": 17,\r\n \"Sales\": 62.07,\r\n \"GM\": 4.44\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"TIA MARUCA\",\r\n \"EAN\": 7798082740275,\r\n \"Name\": \"TM Bizc Azucarados 250gr\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 3,\r\n \"Sales\": 8.67,\r\n \"GM\": 4.44\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77922694,\r\n \"Name\": \"MENTHOPLUS MENTA 30.6 GR\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 12,\r\n \"Sales\": 9.95,\r\n \"GM\": 4.42\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 50,\r\n \"Subcategory\": \"Otras Bebidas\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7790950106602,\r\n \"Name\": \"CA Terma Traslasierra Lig Pet\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 5,\r\n \"Sales\": 9.9,\r\n \"GM\": 4.35\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910967,\r\n \"Name\": \"Derby KS 20und\",\r\n \"Price\": \"3.43\",\r\n \"Units\": 10,\r\n \"Sales\": 31.92,\r\n \"GM\": 4.32\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910318,\r\n \"Name\": \"43/70 KS 20und\",\r\n \"Price\": \"3.27\",\r\n \"Units\": 19,\r\n \"Sales\": 58,\r\n \"GM\": 4.25\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222041130,\r\n \"Name\": \"BNFD BONAFIDE OBLEAS VAINILLA 48\",\r\n \"Price\": \"1.38\",\r\n \"Units\": 8,\r\n \"Sales\": 9.07,\r\n \"GM\": 4.22\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222042441,\r\n \"Name\": \"BNFD DONUTS NARANJA 91G\",\r\n \"Price\": \"4.20\",\r\n \"Units\": 2,\r\n \"Sales\": 6.94,\r\n \"GM\": 4.16\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7790895067570,\r\n \"Name\": \"Coca Cola Zero 2.25\",\r\n \"Price\": \"5.40\",\r\n \"Units\": 3,\r\n \"Sales\": 13.38,\r\n \"GM\": 4.14\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77916457,\r\n \"Name\": \"Topline Tableta Mento 4und\",\r\n \"Price\": \"0.80\",\r\n \"Units\": 15,\r\n \"Sales\": 9.9,\r\n \"GM\": 4.12\r\n },\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 216,\r\n \"Subcategory\": \"COFFEE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2047,\r\n \"Name\": \"CAF� AMERICANO SABORIZADO CHICO\",\r\n \"Price\": \"4.00\",\r\n \"Units\": 2,\r\n \"Sales\": 6.62,\r\n \"GM\": 4.1\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 171,\r\n \"Subcategory\": \"VIDEO / AUDIO / TAPE\",\r\n \"Manufacturer\": \"KODAK\",\r\n \"EAN\": 881295710719,\r\n \"Name\": \"KOD Kodak CD en Sobr 52x\",\r\n \"Price\": \"2.46\",\r\n \"Units\": 8,\r\n \"Sales\": 16.26,\r\n \"GM\": 4.1\r\n },\r\n {\r\n \"CategoryId\": 13,\r\n \"Category\": \"Otro Tabaco\",\r\n \"SubcategoryId\": 15,\r\n \"Subcategory\": \"Cigarros\",\r\n \"Manufacturer\": \"PURO TABACO\",\r\n \"EAN\": 8815,\r\n \"Name\": \"PTBC JL Piedra Nacionales Und\",\r\n \"Price\": \"11.50\",\r\n \"Units\": 1,\r\n \"Sales\": 9.51,\r\n \"GM\": 4.06\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580394400,\r\n \"Name\": \"Arcor Space Frutilla 65ml\",\r\n \"Price\": \"1.50\",\r\n \"Units\": 8,\r\n \"Sales\": 9.92,\r\n \"GM\": 4\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222003121,\r\n \"Name\": \"BND Bonafide Mentitas Citrus 25g\",\r\n \"Price\": \"0.80\",\r\n \"Units\": 11,\r\n \"Sales\": 7.27,\r\n \"GM\": 3.98\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910431,\r\n \"Name\": \"43/70 100 S 20und\",\r\n \"Price\": \"3.44\",\r\n \"Units\": 16,\r\n \"Sales\": 51.32,\r\n \"GM\": 3.96\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 1126,\r\n \"Name\": \"CAD Bazoo Chic Horosc Oc Ment 4g\",\r\n \"Price\": \"0.10\",\r\n \"Units\": 75,\r\n \"Sales\": 6.21,\r\n \"GM\": 3.96\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77933423,\r\n \"Name\": \"COFLER CEREAL 28 GS\",\r\n \"Price\": \"1.40\",\r\n \"Units\": 8,\r\n \"Sales\": 9.27,\r\n \"GM\": 3.95\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"CLAMER SRL\",\r\n \"EAN\": 3706,\r\n \"Name\": \"CSRL Martin de Ridder Pasta Frol\",\r\n \"Price\": \"2.10\",\r\n \"Units\": 5,\r\n \"Sales\": 8.7,\r\n \"GM\": 3.95\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"BRITISH AMERICAN\",\r\n \"EAN\": 77910479,\r\n \"Name\": \"JOCKEY CLUB SUAVE SOFT KS10U\",\r\n \"Price\": \"1.76\",\r\n \"Units\": 32,\r\n \"Sales\": 52.64,\r\n \"GM\": 3.87\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 205,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 5049,\r\n \"Name\": \"PANINO CEBOLLA Y QUESO\",\r\n \"Price\": \"8.50\",\r\n \"Units\": 1,\r\n \"Sales\": 7.02,\r\n \"GM\": 3.77\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"NESTLE\",\r\n \"EAN\": 7798130950052,\r\n \"Name\": \"NES NERDS HUEVO 134G\",\r\n \"Price\": \"11.50\",\r\n \"Units\": 1,\r\n \"Sales\": 9.5,\r\n \"GM\": 3.69\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 6538,\r\n \"Name\": \"TPS Plumero\",\r\n \"Price\": \"11.00\",\r\n \"Units\": 1,\r\n \"Sales\": 9.09,\r\n \"GM\": 3.69\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 118,\r\n \"Subcategory\": \"Galletas\",\r\n \"Manufacturer\": \"TIA MARUCA\",\r\n \"EAN\": 7798082741449,\r\n \"Name\": \"TM Tia Maruca Tubo Gluten 180gr\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 3,\r\n \"Sales\": 8.67,\r\n \"GM\": 3.69\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 9314,\r\n \"Name\": \"SWCHEPPES TONICA 237ML\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 4,\r\n \"Sales\": 7.6,\r\n \"GM\": 3.68\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 121,\r\n \"Subcategory\": \"MEAT SNACKS\",\r\n \"Manufacturer\": \"GEORGALOS\",\r\n \"EAN\": 7790380016137,\r\n \"Name\": \"GRG Cereal Flow Merme Frut 25g\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 6,\r\n \"Sales\": 6.42,\r\n \"GM\": 3.54\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77946843,\r\n \"Name\": \"VACA LECHERA CARAMELO 27GR\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 9,\r\n \"Sales\": 7.46,\r\n \"GM\": 3.52\r\n },\r\n {\r\n \"CategoryId\": 232,\r\n \"Category\": \"Bebidas Congeladas dispensadas\",\r\n \"SubcategoryId\": 234,\r\n \"Subcategory\": \"FROZEN NON-CARBONATE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2603,\r\n \"Name\": \"BATIDO FRUTILLA\",\r\n \"Price\": \"7.75\",\r\n \"Units\": 1,\r\n \"Sales\": 6.4,\r\n \"GM\": 3.44\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"LEHRITIER\",\r\n \"EAN\": 1109,\r\n \"Name\": \"LHRT PICO DULCE ICE COOL 15G\",\r\n \"Price\": \"0.50\",\r\n \"Units\": 21,\r\n \"Sales\": 8.67,\r\n \"GM\": 3.44\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77917249,\r\n \"Name\": \"KR CEREALITA MANZANA BARRA 23GR\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 7,\r\n \"Sales\": 6.93,\r\n \"GM\": 3.37\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"CHUPA CHUPS\",\r\n \"EAN\": 76350553008,\r\n \"Name\": \"CH Crazy Dips Uva 12Gr\",\r\n \"Price\": \"1.40\",\r\n \"Units\": 7,\r\n \"Sales\": 8.11,\r\n \"GM\": 3.36\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 154,\r\n \"Subcategory\": \"GROOMING AIDS\",\r\n \"Manufacturer\": \"ENERGIZER\",\r\n \"EAN\": 75920036,\r\n \"Name\": \"ENZ Exacta Piel Sensible Shick 1und\",\r\n \"Price\": \"2.10\",\r\n \"Units\": 2,\r\n \"Sales\": 3.48,\r\n \"GM\": 3.36\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580244415,\r\n \"Name\": \"Monstruos Locos 12g\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 3,\r\n \"Sales\": 8.68,\r\n \"GM\": 3.28\r\n },\r\n {\r\n \"CategoryId\": 232,\r\n \"Category\": \"Bebidas Congeladas dispensadas\",\r\n \"SubcategoryId\": 234,\r\n \"Subcategory\": \"FROZEN NON-CARBONATE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2605,\r\n \"Name\": \"SMOOTHIE MIX FRUTILLA-DURAZNO\",\r\n \"Price\": \"7.25\",\r\n \"Units\": 1,\r\n \"Sales\": 5.99,\r\n \"GM\": 3.25\r\n },\r\n {\r\n \"CategoryId\": 178,\r\n \"Category\": \"Publicaciones\",\r\n \"SubcategoryId\": 180,\r\n \"Subcategory\": \"MAGAZINES/TABLOIDS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 9770328423003,\r\n \"Name\": \"Mia Semanario Femenino\",\r\n \"Price\": \"3.20\",\r\n \"Units\": 1,\r\n \"Sales\": 3.2,\r\n \"GM\": 3.2\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77919298,\r\n \"Name\": \"PM Chesterfield King Size 20und\",\r\n \"Price\": \"3.60\",\r\n \"Units\": 14,\r\n \"Sales\": 47.04,\r\n \"GM\": 3.17\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77922168,\r\n \"Name\": \"KR CEREALITA COCO BARRA 23GR\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 7,\r\n \"Sales\": 6.94,\r\n \"GM\": 3.14\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 205,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3062,\r\n \"Name\": \"Adicional Salsa Cr.Con Tomate\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 17,\r\n \"Sales\": 14.07,\r\n \"GM\": 3\r\n },\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 216,\r\n \"Subcategory\": \"COFFEE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2025,\r\n \"Name\": \"Cafe Expresso/Cortado Descaf\",\r\n \"Price\": \"2.50\",\r\n \"Units\": 2,\r\n \"Sales\": 4.13,\r\n \"GM\": 2.96\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 112,\r\n \"Subcategory\": \"Crackers\",\r\n \"Manufacturer\": \"BAGLEY\",\r\n \"EAN\": 7790040545939,\r\n \"Name\": \"BGLY Criollitas Tres Cereales 140G\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 4,\r\n \"Sales\": 6.6,\r\n \"GM\": 2.95\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"GUAYMAYEN\",\r\n \"EAN\": 77980212,\r\n \"Name\": \"GYM Guaymayen Alfajor Dulc Leche 38gr\",\r\n \"Price\": \"0.60\",\r\n \"Units\": 13,\r\n \"Sales\": 6.49,\r\n \"GM\": 2.93\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 6521,\r\n \"Name\": \"TPS Blister Lamparas 529 2und\",\r\n \"Price\": \"4.70\",\r\n \"Units\": 2,\r\n \"Sales\": 7.77,\r\n \"GM\": 2.89\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 6525,\r\n \"Name\": \"TPS Blister Lamparas 64196 Und\",\r\n \"Price\": \"9.20\",\r\n \"Units\": 1,\r\n \"Sales\": 7.6,\r\n \"GM\": 2.85\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 7798011660377,\r\n \"Name\": \"TPSTopaes Rejilla Florest-Bli\",\r\n \"Price\": \"9.00\",\r\n \"Units\": 1,\r\n \"Sales\": 7.44,\r\n \"GM\": 2.85\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 149,\r\n \"Subcategory\": \"ANALGESICOS\",\r\n \"Manufacturer\": \"BAYER\",\r\n \"EAN\": 9800,\r\n \"Name\": \"BY Aspirinetas Tira 10und\",\r\n \"Price\": \"2.50\",\r\n \"Units\": 2,\r\n \"Sales\": 5,\r\n \"GM\": 2.82\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 165,\r\n \"Subcategory\": \"FILM / PHOTO\",\r\n \"Manufacturer\": \"KODAK\",\r\n \"EAN\": 86806034401,\r\n \"Name\": \"KOD KODAK KCX36\",\r\n \"Price\": \"12.70\",\r\n \"Units\": 1,\r\n \"Sales\": 10.5,\r\n \"GM\": 2.81\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"GEORGALOS\",\r\n \"EAN\": 1119,\r\n \"Name\": \"GRG Tokke Bombon Relleno DDL10gr\",\r\n \"Price\": \"0.50\",\r\n \"Units\": 11,\r\n \"Sales\": 4.55,\r\n \"GM\": 2.79\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 205,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 5040,\r\n \"Name\": \"ADICIONAL QUESO DE M�QUINA\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 6,\r\n \"Sales\": 6.44,\r\n \"GM\": 2.77\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77916396,\r\n \"Name\": \"Topline Tableta Stron 4und\",\r\n \"Price\": \"0.80\",\r\n \"Units\": 10,\r\n \"Sales\": 6.6,\r\n \"GM\": 2.75\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 189,\r\n \"Subcategory\": \"MOTOR OIL\",\r\n \"Manufacturer\": \"SOGEFI FILTRATION\",\r\n \"EAN\": 6725,\r\n \"Name\": \"SFA Filtros Fram G-12\",\r\n \"Price\": \"7.82\",\r\n \"Units\": 1,\r\n \"Sales\": 6.46,\r\n \"GM\": 2.73\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 7798011661213,\r\n \"Name\": \"TPS Cem Polv Ver Got Rad Bloc20G\",\r\n \"Price\": \"5.80\",\r\n \"Units\": 1,\r\n \"Sales\": 4.79,\r\n \"GM\": 2.71\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"TACSA\",\r\n \"EAN\": 7798039290327,\r\n \"Name\": \"TCS Tacsa Cinta Aislad Und\",\r\n \"Price\": \"3.70\",\r\n \"Units\": 2,\r\n \"Sales\": 6.12,\r\n \"GM\": 2.68\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"NESTLE\",\r\n \"EAN\": 79200003364,\r\n \"Name\": \"NES Nerd Grape & Strawberry 46.7Gr\",\r\n \"Price\": \"3.70\",\r\n \"Units\": 2,\r\n \"Sales\": 6.12,\r\n \"GM\": 2.66\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 207,\r\n \"Subcategory\": \"BAKERY\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3734,\r\n \"Name\": \"Vigilante\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 4,\r\n \"Sales\": 4.28,\r\n \"GM\": 2.64\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 62,\r\n \"Subcategory\": \"Caramelos sueltos\",\r\n \"Manufacturer\": \"GEORGALOS\",\r\n \"EAN\": 1156,\r\n \"Name\": \"GRG Flynn Paff Caramelo T Fruti\",\r\n \"Price\": \"0.20\",\r\n \"Units\": 30,\r\n \"Sales\": 4.96,\r\n \"GM\": 2.64\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77923288,\r\n \"Name\": \"MENTHOPLUS AQUA MENTA EUC\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 8,\r\n \"Sales\": 6.62,\r\n \"GM\": 2.62\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77920713,\r\n \"Name\": \"Viceroy Classic Rojo Box 10\",\r\n \"Price\": \"1.41\",\r\n \"Units\": 28,\r\n \"Sales\": 36.56,\r\n \"GM\": 2.49\r\n },\r\n {\r\n \"CategoryId\": 134,\r\n \"Category\": \"Almacen\",\r\n \"SubcategoryId\": 138,\r\n \"Subcategory\": \"OTROS ALMACEN\",\r\n \"Manufacturer\": \"QUIMICA ESTRELLA\",\r\n \"EAN\": 7791150040765,\r\n \"Name\": \"QE TODDY 180GR\",\r\n \"Price\": \"4.40\",\r\n \"Units\": 1,\r\n \"Sales\": 3.64,\r\n \"GM\": 2.43\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"LEHRITIER\",\r\n \"EAN\": 1108,\r\n \"Name\": \"LHRT Pico Dulce Chips 15G\",\r\n \"Price\": \"0.50\",\r\n \"Units\": 15,\r\n \"Sales\": 6.18,\r\n \"GM\": 2.43\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580397609,\r\n \"Name\": \"Arcor Tacita Vainilla Choco 90ml\",\r\n \"Price\": \"1.80\",\r\n \"Units\": 4,\r\n \"Sales\": 5.96,\r\n \"GM\": 2.42\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 154,\r\n \"Subcategory\": \"GROOMING AIDS\",\r\n \"Manufacturer\": \"UNILEVER\",\r\n \"EAN\": 7791293020303,\r\n \"Name\": \"UNI Impulse Desod dynamique 82ml\",\r\n \"Price\": \"7.00\",\r\n \"Units\": 1,\r\n \"Sales\": 5.79,\r\n \"GM\": 2.37\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77949349,\r\n \"Name\": \"COFLER CUBANITO SEMIAMAR 16G\",\r\n \"Price\": \"0.90\",\r\n \"Units\": 6,\r\n \"Sales\": 4.46,\r\n \"GM\": 2.34\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77923769,\r\n \"Name\": \"PALL MALL BOX 20 BE\",\r\n \"Price\": \"3.27\",\r\n \"Units\": 23,\r\n \"Sales\": 70.24,\r\n \"GM\": 2.33\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77919915,\r\n \"Name\": \"CAD HALLS FREE MORA 20G\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 5,\r\n \"Sales\": 5.35,\r\n \"GM\": 2.33\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 175,\r\n \"Subcategory\": \"OTHER GM\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7403,\r\n \"Name\": \"Coca Cola Bandeja Canje\",\r\n \"Price\": \"5.00\",\r\n \"Units\": 6,\r\n \"Sales\": 24.79,\r\n \"GM\": 2.29\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 154,\r\n \"Subcategory\": \"GROOMING AIDS\",\r\n \"Manufacturer\": \"UNILEVER\",\r\n \"EAN\": 9807,\r\n \"Name\": \"UNI Sedal Shampoo 15ml\",\r\n \"Price\": \"0.60\",\r\n \"Units\": 9,\r\n \"Sales\": 4.48,\r\n \"GM\": 2.29\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 1129,\r\n \"Name\": \"CAD BUBALOO FRUTILLA 5.5G\",\r\n \"Price\": \"0.20\",\r\n \"Units\": 40,\r\n \"Sales\": 6.63,\r\n \"GM\": 2.26\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"OSRAM\",\r\n \"EAN\": 7798011660889,\r\n \"Name\": \"OSRM Osram Lamp 6428 2und\",\r\n \"Price\": \"8.40\",\r\n \"Units\": 1,\r\n \"Sales\": 6.94,\r\n \"GM\": 2.24\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 59,\r\n \"Subcategory\": \"Barras sin chocolate\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 7791249977170,\r\n \"Name\": \"CAD MANTECOL MARMOLADO 25G\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 6,\r\n \"Sales\": 4.98,\r\n \"GM\": 2.22\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77926791,\r\n \"Name\": \"PM L&M Menthol Box 20und\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 10,\r\n \"Sales\": 32.69,\r\n \"GM\": 2.21\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 107,\r\n \"Subcategory\": \"Papas Fritas\",\r\n \"Manufacturer\": \"FRITO LAY\",\r\n \"EAN\": 7790310980262,\r\n \"Name\": \"FL Lays Doritos Queso 50g\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 3,\r\n \"Sales\": 5.94,\r\n \"GM\": 2.16\r\n },\r\n {\r\n \"CategoryId\": 134,\r\n \"Category\": \"Almacen\",\r\n \"SubcategoryId\": 138,\r\n \"Subcategory\": \"OTROS ALMACEN\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7790315058324,\r\n \"Name\": \"DAN SER POLVO MANZANA TENTACION\",\r\n \"Price\": \"0.90\",\r\n \"Units\": 6,\r\n \"Sales\": 4.45,\r\n \"GM\": 2.13\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"BRITISH AMERICAN\",\r\n \"EAN\": 77910592,\r\n \"Name\": \"VICEROY CLAS FF SOFT CUP 10U\",\r\n \"Price\": \"1.33\",\r\n \"Units\": 20,\r\n \"Sales\": 24.46,\r\n \"GM\": 2.11\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222003756,\r\n \"Name\": \"BND Bonafide Mentitas Mentol 25g\",\r\n \"Price\": \"0.80\",\r\n \"Units\": 6,\r\n \"Sales\": 3.96,\r\n \"GM\": 2.05\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 48,\r\n \"Subcategory\": \"Jugos\",\r\n \"Manufacturer\": \"BAGGIO\",\r\n \"EAN\": 7790036512372,\r\n \"Name\": \"RPBB Baggio Manzana 250ml\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 4,\r\n \"Sales\": 4.28,\r\n \"GM\": 2\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77913098,\r\n \"Name\": \"PM Chesterfield KS Box 10\",\r\n \"Price\": \"1.75\",\r\n \"Units\": 7,\r\n \"Sales\": 11.43,\r\n \"GM\": 1.92\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 7798011060016,\r\n \"Name\": \"TPS Ron Bay Fus Americana 10L\",\r\n \"Price\": \"5.50\",\r\n \"Units\": 1,\r\n \"Sales\": 4.55,\r\n \"GM\": 1.91\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77949035,\r\n \"Name\": \"COFLER AIREADO BLANCO 30G.\",\r\n \"Price\": \"1.40\",\r\n \"Units\": 6,\r\n \"Sales\": 6.96,\r\n \"GM\": 1.87\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 156,\r\n \"Subcategory\": \"PRESERVATIVOS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7798134870042,\r\n \"Name\": \"PRESERV JAGER SENSITIVE\",\r\n \"Price\": \"4.40\",\r\n \"Units\": 1,\r\n \"Sales\": 3.64,\r\n \"GM\": 1.87\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 7798011060023,\r\n \"Name\": \"TPS Ron Bay Fus Europea 10L\",\r\n \"Price\": \"5.50\",\r\n \"Units\": 1,\r\n \"Sales\": 4.55,\r\n \"GM\": 1.85\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"BONAFIDE\",\r\n \"EAN\": 7792222003534,\r\n \"Name\": \"BND Bonafide Mentitas Light 25g\",\r\n \"Price\": \"0.82\",\r\n \"Units\": 5,\r\n \"Sales\": 3.38,\r\n \"GM\": 1.83\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77923387,\r\n \"Name\": \"CAD HALLS AIR MINT 28G\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 4,\r\n \"Sales\": 3.96,\r\n \"GM\": 1.78\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 154,\r\n \"Subcategory\": \"GROOMING AIDS\",\r\n \"Manufacturer\": \"UNILEVER\",\r\n \"EAN\": 9806,\r\n \"Name\": \"UNI Sedal Enjuague 10ml\",\r\n \"Price\": \"0.51\",\r\n \"Units\": 8,\r\n \"Sales\": 3.39,\r\n \"GM\": 1.7\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"OSRAM\",\r\n \"EAN\": 7798011660865,\r\n \"Name\": \"OSRM Lampara 6411 2und\",\r\n \"Price\": \"6.90\",\r\n \"Units\": 1,\r\n \"Sales\": 5.7,\r\n \"GM\": 1.68\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 167,\r\n \"Subcategory\": \"GREETING/GIFT/TOYS\",\r\n \"Manufacturer\": \"PEPSI\",\r\n \"EAN\": 7207,\r\n \"Name\": \"Llavero Pepsi\",\r\n \"Price\": \"3.00\",\r\n \"Units\": 1,\r\n \"Sales\": 2.48,\r\n \"GM\": 1.65\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580305314,\r\n \"Name\": \"TOP LINE CARAMEL MENTA S AZ\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 3,\r\n \"Sales\": 3.21,\r\n \"GM\": 1.63\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77920966,\r\n \"Name\": \"PM Next FF 10\",\r\n \"Price\": \"1.33\",\r\n \"Units\": 13,\r\n \"Sales\": 16.13,\r\n \"GM\": 1.58\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910660,\r\n \"Name\": \"Richmond KS 20und\",\r\n \"Price\": \"1.50\",\r\n \"Units\": 11,\r\n \"Sales\": 14,\r\n \"GM\": 1.57\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 7798011661169,\r\n \"Name\": \"TPS Top Lamp Auto H3 12v 55w U\",\r\n \"Price\": \"4.50\",\r\n \"Units\": 1,\r\n \"Sales\": 3.72,\r\n \"GM\": 1.49\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"NESTLE\",\r\n \"EAN\": 84194107,\r\n \"Name\": \"IMS: ChupaChups Sorp 12 gr\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 5,\r\n \"Sales\": 8.25,\r\n \"GM\": 1.43\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040939004,\r\n \"Name\": \"REX 3 QUESO CREM & CIBOULET\",\r\n \"Price\": \"1.90\",\r\n \"Units\": 2,\r\n \"Sales\": 3.14,\r\n \"GM\": 1.39\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"MARS\",\r\n \"EAN\": 7896423424874,\r\n \"Name\": \"MARS Snickers 52g\",\r\n \"Price\": \"3.30\",\r\n \"Units\": 1,\r\n \"Sales\": 2.73,\r\n \"GM\": 1.38\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77923271,\r\n \"Name\": \"MENTHOPLUS AQUA CEREZA NAR\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 4,\r\n \"Sales\": 3.32,\r\n \"GM\": 1.36\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77915979,\r\n \"Name\": \"PM Next Milds Taste 20und\",\r\n \"Price\": \"2.60\",\r\n \"Units\": 8,\r\n \"Sales\": 19.34,\r\n \"GM\": 1.35\r\n },\r\n {\r\n \"CategoryId\": 134,\r\n \"Category\": \"Almacen\",\r\n \"SubcategoryId\": 135,\r\n \"Subcategory\": \"CAFE Y TE\",\r\n \"Manufacturer\": \"QUIMICA ESTRELLA\",\r\n \"EAN\": 7791445001051,\r\n \"Name\": \"QE YE CRUZ MALTA MATE COC 25 SAQ\",\r\n \"Price\": \"2.70\",\r\n \"Units\": 1,\r\n \"Sales\": 2.23,\r\n \"GM\": 1.32\r\n },\r\n {\r\n \"CategoryId\": 140,\r\n \"Category\": \"Limpieza\",\r\n \"SubcategoryId\": 144,\r\n \"Subcategory\": \"PAPER/PLASTIC/FOIL\",\r\n \"Manufacturer\": \"PAPELERA DEL PLATA\",\r\n \"EAN\": 7790250010517,\r\n \"Name\": \"PDP Higienol Rollo 50mts Und\",\r\n \"Price\": \"1.70\",\r\n \"Units\": 2,\r\n \"Sales\": 2.8,\r\n \"GM\": 1.32\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 205,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 5042,\r\n \"Name\": \"Adicional Lechuga\",\r\n \"Price\": \"0.50\",\r\n \"Units\": 10,\r\n \"Sales\": 4.13,\r\n \"GM\": 1.25\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 209,\r\n \"Subcategory\": \"OTHER CUISINE\",\r\n \"Manufacturer\": \"UNILEVER\",\r\n \"EAN\": 9700,\r\n \"Name\": \"UNI QUICK SOPA VEGETALES UNID\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 2,\r\n \"Sales\": 2.14,\r\n \"GM\": 1.22\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 175,\r\n \"Subcategory\": \"OTHER GM\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7401,\r\n \"Name\": \"Coca Cola Vaso Canje\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 8,\r\n \"Sales\": 13.22,\r\n \"GM\": 1.22\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77925695,\r\n \"Name\": \"Viceroy Fire Box 20\",\r\n \"Price\": \"2.75\",\r\n \"Units\": 7,\r\n \"Sales\": 17.97,\r\n \"GM\": 1.2\r\n },\r\n {\r\n \"CategoryId\": 148,\r\n \"Category\": \"Salud y Belleza\",\r\n \"SubcategoryId\": 156,\r\n \"Subcategory\": \"PRESERVATIVOS\",\r\n \"Manufacturer\": \"BUHL\",\r\n \"EAN\": 7791014001178,\r\n \"Name\": \"BUHL Tulipan preserv Frutilla 3u\",\r\n \"Price\": \"3.10\",\r\n \"Units\": 1,\r\n \"Sales\": 2.56,\r\n \"GM\": 1.18\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"TOPAES S.A.\",\r\n \"EAN\": 7798011660803,\r\n \"Name\": \"TPS Blister Lamparas 5627 2und\",\r\n \"Price\": \"3.70\",\r\n \"Units\": 1,\r\n \"Sales\": 3.06,\r\n \"GM\": 1.14\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062548761,\r\n \"Name\": \"DNN VILLA DEL SUR FIZ POMEL 500\",\r\n \"Price\": \"2.80\",\r\n \"Units\": 1,\r\n \"Sales\": 2.32,\r\n \"GM\": 1.13\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"BAT\",\r\n \"EAN\": 77910547,\r\n \"Name\": \"Jockey Club Full FL Soft KS 10und\",\r\n \"Price\": \"1.76\",\r\n \"Units\": 9,\r\n \"Sales\": 14.74,\r\n \"GM\": 1.1\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77912930,\r\n \"Name\": \"PM Next Box 10und\",\r\n \"Price\": \"1.43\",\r\n \"Units\": 10,\r\n \"Sales\": 13.29,\r\n \"GM\": 1.02\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 94,\r\n \"Subcategory\": \"ICE CREAM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77939678,\r\n \"Name\": \"Arcor Rocklets Copa 120ml\",\r\n \"Price\": \"3.00\",\r\n \"Units\": 1,\r\n \"Sales\": 2.48,\r\n \"GM\": 1.01\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77916273,\r\n \"Name\": \"PM Le Mans Suave 10und\",\r\n \"Price\": \"1.75\",\r\n \"Units\": 8,\r\n \"Sales\": 13.05,\r\n \"GM\": 0.98\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"GEORGALOS\",\r\n \"EAN\": 7790380011699,\r\n \"Name\": \"GRG Tokke 2 Banana 25gr\",\r\n \"Price\": \"1.10\",\r\n \"Units\": 2,\r\n \"Sales\": 1.82,\r\n \"GM\": 0.98\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 49,\r\n \"Subcategory\": \"Aguas\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7798062548778,\r\n \"Name\": \"DNN Villa del Sur Fiz Lim 500ml\",\r\n \"Price\": \"2.40\",\r\n \"Units\": 1,\r\n \"Sales\": 1.99,\r\n \"GM\": 0.96\r\n },\r\n {\r\n \"CategoryId\": 44,\r\n \"Category\": \"Bebidas Embotelladas\",\r\n \"SubcategoryId\": 45,\r\n \"Subcategory\": \"Bebidas Carbonatadas\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 9312,\r\n \"Name\": \"COCA COLA BOTELLA LIGHT 237ML\",\r\n \"Price\": \"2.30\",\r\n \"Units\": 1,\r\n \"Sales\": 1.91,\r\n \"GM\": 0.96\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040274709,\r\n \"Name\": \"Aguila Minitorta Menta\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 2,\r\n \"Sales\": 2.14,\r\n \"GM\": 0.84\r\n },\r\n {\r\n \"CategoryId\": 106,\r\n \"Category\": \"Snacks Salados\",\r\n \"SubcategoryId\": 113,\r\n \"Subcategory\": \"Otros Snacks Salados\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040942103,\r\n \"Name\": \"REX 3 CAPRESSE 60GR\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 1,\r\n \"Sales\": 1.65,\r\n \"GM\": 0.78\r\n },\r\n {\r\n \"CategoryId\": 188,\r\n \"Category\": \"Productos para el Automotor\",\r\n \"SubcategoryId\": 192,\r\n \"Subcategory\": \"CAR CARE\",\r\n \"Manufacturer\": \"OSRAM\",\r\n \"EAN\": 7798011660148,\r\n \"Name\": \"OSRM Lam Patente Auto 3893 2und\",\r\n \"Price\": \"1.90\",\r\n \"Units\": 1,\r\n \"Sales\": 1.57,\r\n \"GM\": 0.73\r\n },\r\n {\r\n \"CategoryId\": 75,\r\n \"Category\": \"Lacteos\",\r\n \"SubcategoryId\": 80,\r\n \"Subcategory\": \"YOGURT\",\r\n \"Manufacturer\": \"DANONE\",\r\n \"EAN\": 7791337103023,\r\n \"Name\": \"DNN Activia Firme Frutilla 195g\",\r\n \"Price\": \"2.00\",\r\n \"Units\": 1,\r\n \"Sales\": 1.65,\r\n \"GM\": 0.68\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"BRITISH AMERICAN\",\r\n \"EAN\": 77910165,\r\n \"Name\": \"DERBY SUAVE 10UND\",\r\n \"Price\": \"1.77\",\r\n \"Units\": 3,\r\n \"Sales\": 4.94,\r\n \"GM\": 0.67\r\n },\r\n {\r\n \"CategoryId\": 120,\r\n \"Category\": \"Cereales\",\r\n \"SubcategoryId\": 123,\r\n \"Subcategory\": \"ENERGY BARS\",\r\n \"Manufacturer\": \"OTHER\",\r\n \"EAN\": 7792170110025,\r\n \"Name\": \"QUAKER BARRA LEMON PIE 25GR\",\r\n \"Price\": \"1.00\",\r\n \"Units\": 2,\r\n \"Sales\": 1.66,\r\n \"GM\": 0.66\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77958563,\r\n \"Name\": \"Arcor Leche 8gr\",\r\n \"Price\": \"0.40\",\r\n \"Units\": 4,\r\n \"Sales\": 1.32,\r\n \"GM\": 0.66\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"KRAFT\",\r\n \"EAN\": 77921604,\r\n \"Name\": \"KR Milka M Joy Choco Crunchy 26G\",\r\n \"Price\": \"1.60\",\r\n \"Units\": 3,\r\n \"Sales\": 3.96,\r\n \"GM\": 0.66\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"FELFORT\",\r\n \"EAN\": 1136,\r\n \"Name\": \"FLFR Jackelin Bombon 14gr\",\r\n \"Price\": \"0.60\",\r\n \"Units\": 4,\r\n \"Sales\": 1.98,\r\n \"GM\": 0.54\r\n },\r\n {\r\n \"CategoryId\": 92,\r\n \"Category\": \"Helados\",\r\n \"SubcategoryId\": 93,\r\n \"Subcategory\": \"HELADOS PREMIUM\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790580399009,\r\n \"Name\": \"Mr Pops Cream 60ML\",\r\n \"Price\": \"1.50\",\r\n \"Units\": 1,\r\n \"Sales\": 1.24,\r\n \"GM\": 0.5\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 57,\r\n \"Subcategory\": \"Caramelos Duros\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 77917317,\r\n \"Name\": \"CAD VITA-C FRUTILLA 27GR\",\r\n \"Price\": \"1.20\",\r\n \"Units\": 1,\r\n \"Sales\": 0.99,\r\n \"GM\": 0.45\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 59,\r\n \"Subcategory\": \"Barras sin chocolate\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77940131,\r\n \"Name\": \"Arcor Turrron 25gr\",\r\n \"Price\": \"0.50\",\r\n \"Units\": 2,\r\n \"Sales\": 0.83,\r\n \"GM\": 0.42\r\n },\r\n {\r\n \"CategoryId\": 115,\r\n \"Category\": \"Snacks Dulces\",\r\n \"SubcategoryId\": 116,\r\n \"Subcategory\": \"Tortas / Pasteles\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 7790040274600,\r\n \"Name\": \"Aguila Minitorta Durazno\",\r\n \"Price\": \"1.30\",\r\n \"Units\": 1,\r\n \"Sales\": 1.07,\r\n \"GM\": 0.42\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 58,\r\n \"Subcategory\": \"Chocolates Barras y Tabletas\",\r\n \"Manufacturer\": \"ARCOR\",\r\n \"EAN\": 77949233,\r\n \"Name\": \"COFLER CUBANITO LECHE 16G\",\r\n \"Price\": \"0.90\",\r\n \"Units\": 1,\r\n \"Sales\": 0.74,\r\n \"GM\": 0.39\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 7895800446805,\r\n \"Name\": \"CAD CLORETS CHICLETS 33G\",\r\n \"Price\": \"1.10\",\r\n \"Units\": 1,\r\n \"Sales\": 0.91,\r\n \"GM\": 0.39\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 205,\r\n \"Subcategory\": \"SANDWICHES\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 5041,\r\n \"Name\": \"Adicional Tomate\",\r\n \"Price\": \"0.50\",\r\n \"Units\": 2,\r\n \"Sales\": 0.82,\r\n \"GM\": 0.32\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 62,\r\n \"Subcategory\": \"Caramelos sueltos\",\r\n \"Manufacturer\": \"GEORGALOS\",\r\n \"EAN\": 1125,\r\n \"Name\": \"GRG FLYNN PAFF CARAM BANANA 5GR\",\r\n \"Price\": \"0.20\",\r\n \"Units\": 3,\r\n \"Sales\": 0.51,\r\n \"GM\": 0.27\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 62,\r\n \"Subcategory\": \"Caramelos sueltos\",\r\n \"Manufacturer\": \"GEORGALOS\",\r\n \"EAN\": 1158,\r\n \"Name\": \"GRG FLYNN PAFF CARAMEL LIMALIMON\",\r\n \"Price\": \"0.20\",\r\n \"Units\": 2,\r\n \"Sales\": 0.34,\r\n \"GM\": 0.24\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 1130,\r\n \"Name\": \"CAD Bubaloo Ensal Frutas 5.5gr\",\r\n \"Price\": \"0.20\",\r\n \"Units\": 2,\r\n \"Sales\": 0.33,\r\n \"GM\": 0.21\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 9,\r\n \"Subcategory\": \"Cigarrillos Descuento\",\r\n \"Manufacturer\": \"PHILIP MORRIS\",\r\n \"EAN\": 77971005,\r\n \"Name\": \"PM Dorados KX 20und\",\r\n \"Price\": \"1.40\",\r\n \"Units\": 1,\r\n \"Sales\": 1.19,\r\n \"GM\": 0.14\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 1103,\r\n \"Name\": \"CAD Bubaloo Tuti Fruti 5.5gr\",\r\n \"Price\": \"0.20\",\r\n \"Units\": 2,\r\n \"Sales\": 0.33,\r\n \"GM\": 0.11\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 1102,\r\n \"Name\": \"CAD Bubaloo Menta 5.5gr\",\r\n \"Price\": \"0.20\",\r\n \"Units\": 1,\r\n \"Sales\": 0.17,\r\n \"GM\": 0.06\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 56,\r\n \"Subcategory\": \"Gomas de Mascar\",\r\n \"Manufacturer\": \"CADBURY ADAMS\",\r\n \"EAN\": 1100,\r\n \"Name\": \"CAD Bazooka Horosc Ocul Fru 4g\",\r\n \"Price\": \"0.10\",\r\n \"Units\": 1,\r\n \"Sales\": 0.08,\r\n \"GM\": 0.05\r\n },\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 216,\r\n \"Subcategory\": \"COFFEE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2048,\r\n \"Name\": \"CAFE AMERICANO SABORIZADO GND\",\r\n \"Price\": null,\r\n \"Units\": 0,\r\n \"Sales\": 0,\r\n \"GM\": 0\r\n },\r\n {\r\n \"CategoryId\": 224,\r\n \"Category\": \"Bebidas fr�as dispensadas\",\r\n \"SubcategoryId\": 225,\r\n \"Subcategory\": \"FOUNTAIN-CARBONATED\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2306,\r\n \"Name\": \"Gaseosa Fast Food Chica Coca\",\r\n \"Price\": null,\r\n \"Units\": 0,\r\n \"Sales\": 0,\r\n \"GM\": 0\r\n },\r\n {\r\n \"CategoryId\": 224,\r\n \"Category\": \"Bebidas fr�as dispensadas\",\r\n \"SubcategoryId\": 225,\r\n \"Subcategory\": \"FOUNTAIN-CARBONATED\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2308,\r\n \"Name\": \"Gaseosa Fast Food Chica Naranja\",\r\n \"Price\": null,\r\n \"Units\": 0,\r\n \"Sales\": 0,\r\n \"GM\": 0\r\n },\r\n {\r\n \"CategoryId\": 224,\r\n \"Category\": \"Bebidas fr�as dispensadas\",\r\n \"SubcategoryId\": 225,\r\n \"Subcategory\": \"FOUNTAIN-CARBONATED\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2309,\r\n \"Name\": \"Gaseosa FastFoodChica Limalimon\",\r\n \"Price\": null,\r\n \"Units\": 0,\r\n \"Sales\": 0,\r\n \"GM\": 0\r\n },\r\n {\r\n \"CategoryId\": 198,\r\n \"Category\": \"Comida\",\r\n \"SubcategoryId\": 203,\r\n \"Subcategory\": \"HOT DOGS/GRILL PROD.\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 3028,\r\n \"Name\": \"Pancho Cantinflas\",\r\n \"Price\": null,\r\n \"Units\": 0,\r\n \"Sales\": 0,\r\n \"GM\": 0\r\n },\r\n {\r\n \"CategoryId\": 162,\r\n \"Category\": \"Mercader�a General\",\r\n \"SubcategoryId\": 175,\r\n \"Subcategory\": \"OTHER GM\",\r\n \"Manufacturer\": \"COCA COLA\",\r\n \"EAN\": 7402,\r\n \"Name\": \"Coca Cola Plato Canje\",\r\n \"Price\": \"1.75\",\r\n \"Units\": 9,\r\n \"Sales\": 13.02,\r\n \"GM\": -0.34\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"BRITISH AMERICAN\",\r\n \"EAN\": 77970008,\r\n \"Name\": \"Camel HULK Blue Box 20\",\r\n \"Price\": \"4.00\",\r\n \"Units\": 10,\r\n \"Sales\": 33.47,\r\n \"GM\": -1.35\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"BRITISH AMERICAN\",\r\n \"EAN\": 77997456,\r\n \"Name\": \"Camel HULK SC 20\",\r\n \"Price\": \"3.90\",\r\n \"Units\": 11,\r\n \"Sales\": 35.89,\r\n \"GM\": -1.45\r\n },\r\n {\r\n \"CategoryId\": 215,\r\n \"Category\": \"Bebidas Calientes\",\r\n \"SubcategoryId\": 216,\r\n \"Subcategory\": \"COFFEE\",\r\n \"Manufacturer\": \"AMSOUTH FOOD\",\r\n \"EAN\": 2065,\r\n \"Name\": \"Cafe Expr Cortado To Go\",\r\n \"Price\": \"3.60\",\r\n \"Units\": 13,\r\n \"Sales\": 38.74,\r\n \"GM\": -1.85\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"NESTLE\",\r\n \"EAN\": 79200231002,\r\n \"Name\": \"NES WONKA RUNTS 51G\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 9,\r\n \"Sales\": 26.03,\r\n \"GM\": -2.21\r\n },\r\n {\r\n \"CategoryId\": 55,\r\n \"Category\": \"Golosinas\",\r\n \"SubcategoryId\": 61,\r\n \"Subcategory\": \"Novedades de Temporada\",\r\n \"Manufacturer\": \"NESTLE\",\r\n \"EAN\": 79200230401,\r\n \"Name\": \"NES WONKA GOBSTOPPER 50.1G\",\r\n \"Price\": \"3.50\",\r\n \"Units\": 24,\r\n \"Sales\": 69.38,\r\n \"GM\": -13.46\r\n },\r\n {\r\n \"CategoryId\": 7,\r\n \"Category\": \"Cigarrillos\",\r\n \"SubcategoryId\": 8,\r\n \"Subcategory\": \"Cigarrillos Premium\",\r\n \"Manufacturer\": \"BRITISH AMERICAN\",\r\n \"EAN\": 7793677911313,\r\n \"Name\": \"Lucky Pacote 4 Bx Flyer\",\r\n \"Price\": \"16.00\",\r\n \"Units\": 38,\r\n \"Sales\": 502.4,\r\n \"GM\": -26.89\r\n }\r\n ];\r\n });\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n .service(\"catColor\", function () {\r\n var self = this;\r\n\r\n var palette = {};\r\n\r\n self.getSubcategoryColor = function (catColor, subCat) {\r\n var color = tinycolor(catColor);\r\n var colorName = color.toHexString();\r\n var paletteCatColor = palette[colorName];\r\n if (!paletteCatColor) {\r\n palette[colorName] = { byName: {}, all: [] };\r\n paletteCatColor = palette[colorName];\r\n }\r\n if (subCat) {\r\n if (!paletteCatColor.byName[subCat]) {\r\n\r\n var newColor = null;\r\n if (paletteCatColor.all.length === 0) {\r\n newColor = color.lighten(2).toHexString();\r\n } else {\r\n var lastColorName = paletteCatColor.all[paletteCatColor.all.length - 1];\r\n newColor = tinycolor(lastColorName).lighten(2).toHexString();\r\n }\r\n\r\n palette[colorName].byName[subCat] = newColor;\r\n palette[colorName].all.push(newColor);\r\n }\r\n }\r\n\r\n return paletteCatColor.byName[subCat];\r\n }\r\n });\r\n\r\n\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n .controller(\"ScorecardCtrl\", function (homeService, assortmentService, $rootScope) {\r\n var self = this;\r\n var numberColWidth = 100;\r\n self.scorecard = [];\r\n self.allBrands = [];\r\n self.selectedBrand = 2;\r\n\r\n self.columnDefs = [\r\n {\r\n headerName: \"Información General\",\r\n children: [\r\n {\r\n headerName: \"Sector / Categoria\",\r\n headerTooltip: \"\",\r\n field: \"categoryName\",\r\n width: numberColWidth + 55,\r\n pinned: 'left',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: {\r\n renderer: 'group',\r\n checkbox: false,\r\n innerRenderer: function (params) {\r\n return params.value;\r\n }\r\n }\r\n },\r\n {\r\n headerName: \"Peso de Categoria\",\r\n headerTooltip: \"Peso de la categoria Vs Sector\",\r\n field: \"categoryWeight\",\r\n filter: 'number',\r\n sort: 'desc',\r\n columnGroupShow: 'open',\r\n width: numberColWidth + 44,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererNoDecimals,\r\n },\r\n {\r\n headerName: \"Peso de Categoria M\",\r\n headerTooltip: \"Peso de la categoria Vs Sector\",\r\n field: \"marketCategoryWeight\",\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n width: numberColWidth + 55,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererNoDecimals,\r\n },\r\n //{\r\n // headerName: \"Última Revisión\",\r\n // headerTooltip: \"Fecha de ultima revision\",\r\n // field: \"rangeReviewLastRevision\",\r\n // filter: 'number',\r\n // columnGroupShow: 'open',\r\n // width: numberColWidth + 30,\r\n // cellClass: $rootScope.getClassForCell,\r\n // cellRenderer: $rootScope.dateRenderer\r\n //},\r\n ],\r\n },\r\n {\r\n headerName: \"Ventas\",\r\n children: [\r\n {\r\n headerName: \"Ventas\",\r\n headerTooltip: \"Suma de Ventas YTD\",\r\n field: \"sales\",\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: \"Ventas AA\",\r\n headerTooltip: \"Suma de Ventas a�o anterior\",\r\n field: \"salesPY\",\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: \"Objetivo Venta\",\r\n headerTooltip: \"Objetivo de venta YTD\",\r\n field: \"salesGoal\",\r\n filter: 'number',\r\n width: numberColWidth + 20,\r\n columnGroupShow: 'open',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals,\r\n },\r\n {\r\n headerName: \"VS AA\",\r\n headerTooltip: \"Ventas vs a�o anterior\",\r\n field: \"salesPYDelta\",\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n width: numberColWidth - 10,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererPP,\r\n //cellStyle: function (params) { return params.value < 0 ? { color: 'red' } : { color: 'green' }; }\r\n },\r\n {\r\n headerName: \"VS Objetivo\",\r\n headerTooltip: \"Ventas vs Objetivo\",\r\n field: \"salesGoalDelta\",\r\n filter: 'number',\r\n width: numberColWidth + 10,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererPP,\r\n cellStyle: function (params) { return (params.value < -0.02) ? { color: 'red' } : params.value >= -0.02 && params.value <= 0 ? { color: '#caca00' } : { color: 'green' }; }\r\n },\r\n ]\r\n },\r\n {\r\n headerName: \"Margen $\",\r\n children: [\r\n {\r\n headerName: \"Margen $\",\r\n headerTooltip: \"Suma de Margen YTD\",\r\n field: \"margin\",\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n width: numberColWidth + 40,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: \"Margen $ AA\",\r\n headerTooltip: \"Suma de Margen AA\",\r\n field: \"marginPY\",\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n width: numberColWidth + 30,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: \"Objetivo Margen $\",\r\n headerTooltip: \"Objetivo de Margen YTD\",\r\n field: \"marginGoal\",\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n width: numberColWidth + 65,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals,\r\n },\r\n {\r\n headerName: \"VS AA\",\r\n headerTooltip: \"Margen $ vs a�o anterior\",\r\n field: \"marginPYDelta\",\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n width: numberColWidth - 10,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererPP,\r\n },\r\n {\r\n headerName: \"VS Objetivo\",\r\n headerTooltip: \"Margen $ vs Objetivo\",\r\n field: \"marginGoalDelta\",\r\n filter: 'number',\r\n width: numberColWidth + 10,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererPP,\r\n cellStyle: function (params) { return (params.value < 0) ? { color: 'red' } : params.value > 0 ? { color: 'green' } : { color: '#caca00' }; }\r\n },\r\n ]\r\n },\r\n {\r\n headerName: \"Margen 2\",\r\n children: [\r\n {\r\n headerName: \"Margen 2\",\r\n headerTooltip: \"Suma de Margen 2 YTD\",\r\n field: \"margin2\",\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n width: numberColWidth + 40,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: \"Margen 2 AA\",\r\n headerTooltip: \"Suma de Margen 2 AA\",\r\n field: \"margin2PY\",\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n width: numberColWidth + 30,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: \"VS AA\",\r\n headerTooltip: \"Margen 2 vs a�o anterior\",\r\n field: \"margin2PYDelta\",\r\n filter: 'number',\r\n width: numberColWidth - 10,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererPP,\r\n },\r\n ]\r\n },\r\n {\r\n headerName: \"Unidades\",\r\n children: [\r\n {\r\n headerName: \"Unidades\",\r\n headerTooltip: \"Suma de UnidadesYTD\",\r\n field: \"units\",\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: \"Unidades AA\",\r\n headerTooltip: \"Suma de unidades A�o anterior\",\r\n field: \"unitsPY\",\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n width: numberColWidth + 5,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: \"Objetivo Unidades\",\r\n headerTooltip: \"Objetivo de unidades YTD\",\r\n field: \"unitsGoal\",\r\n filter: 'number',\r\n width: numberColWidth + 50,\r\n columnGroupShow: 'open',\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer,\r\n },\r\n {\r\n headerName: \"VS AA\",\r\n headerTooltip: \"Unidades Vs a�o anterior\",\r\n field: \"unitsPYDelta\",\r\n filter: 'number',\r\n width: numberColWidth - 10,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererPP,\r\n cellStyle: function (params) { return (params.value < -0.01) ? { color: 'red' } : params.value >= -0.01 && params.value <= 0.01 ? { color: '#caca00' } : { color: 'green' }; }\r\n },\r\n ]\r\n },\r\n {\r\n headerName: \"Ventas Mercado\",\r\n children: [\r\n {\r\n headerName: \"Ventas Mercado\",\r\n headerTooltip: \"Suma de Ventas Mercado YTD\",\r\n field: \"marketSales\",\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n width: numberColWidth + 27,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: \"Ventas Mercado AA\",\r\n headerTooltip: \"Suma de Ventas Mercado a�o anterior\",\r\n field: \"marketSalesPY\",\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n width: numberColWidth + 55,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: \"VS Mercado AA\",\r\n headerTooltip: \"Ventas Mercado vs a�o anterior\",\r\n field: \"marketSalesPYDelta\",\r\n filter: 'number',\r\n width: numberColWidth + 35,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererPP,\r\n cellStyle: function (params) { return (params.value < 0) ? { color: 'red' } : params.value >= 0 && params.value <= 0.02 ? { color: '#caca00' } : { color: 'green' }; }\r\n },\r\n ]\r\n },\r\n {\r\n headerName: \"Comp. vs Mercado\",\r\n children: [\r\n {\r\n headerName: \"Vs Mercado\",\r\n headerTooltip: \"Comparacion vs Mercado\",\r\n field: \"shareCencosud\",\r\n filter: 'number',\r\n width: numberColWidth + 35,\r\n cellClass: $rootScope.getClassForCell,\r\n cellStyle: function (params) { return (params.value < 0) ? { color: 'red' } : params.value == 0 ? { color: '#caca00' } : { color: 'green' }; },\r\n cellRenderer: function (params) {\r\n return ((params.data.salesPYDelta - params.data.marketSalesPYDelta) * 100).toFixed(1) + \" PP\";;\r\n },\r\n },\r\n ]\r\n },\r\n {\r\n headerName: \"Artículos\",\r\n children: [\r\n {\r\n headerName: \"Activos\",\r\n headerTooltip: \"Cantidad total de articulos activos\",\r\n field: \"activeSkus\",\r\n filter: 'number',\r\n width: numberColWidth - 10,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer,\r\n },\r\n {\r\n headerName: \"Activos AA\",\r\n headerTooltip: \"Cantidad total de articulos activos el a�o anterior\",\r\n field: \"activeSkusPY\",\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer,\r\n },\r\n ]\r\n },\r\n {\r\n headerName: \"Cobertura\",\r\n children: [\r\n {\r\n headerName: \"Cobertura\",\r\n headerTooltip: \"% de Cobertura actual de la categoria\",\r\n field: \"coverage\",\r\n columnGroupShow: 'open',\r\n filter: 'number',\r\n width: numberColWidth - 10,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererNoDecimals,\r\n },\r\n {\r\n headerName: \"Objetivo\",\r\n headerTooltip: \"% de Cobertura objetivo de la cadena seleccionada\",\r\n field: \"targetCoverage\",\r\n columnGroupShow: 'open',\r\n filter: 'number',\r\n width: numberColWidth - 15,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererNoDecimals,\r\n },\r\n {\r\n headerName: \"VS Objetivo\",\r\n headerTooltip: \"Cobertura Actual vs Objetivo\",\r\n field: \"targetCoverageDelta\",\r\n filter: 'number',\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererPP,\r\n cellStyle: function (params) {\r\n var valor = params.value * 100;\r\n return (valor > 2 && valor <= 5 || (valor < -2 && valor >= -5)) ? { color: '#caca00' } : (valor >= -2&& valor <= 2) ? { color: 'green' } : { color: 'red' };\r\n }\r\n },\r\n ]\r\n },\r\n {\r\n headerName: \"Días de inventario\",\r\n children: [\r\n {\r\n headerName: \"Dias Restantes\",\r\n headerTooltip: \"Dias Restantes de inventario\",\r\n field: \"inventoryDaysPYDelta\",\r\n filter: 'number',\r\n width: numberColWidth + 33,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer,\r\n cellStyle: function (params) { return (params.value > 1) ? { color: 'red' } : params.value == 0 || params.value == 1 ? { color: '#caca00' } : { color: 'green' }; }\r\n },\r\n ]\r\n },\r\n ]\r\n\r\n self.gridOptions = {\r\n columnDefs: self.columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n //enableFilter: true,\r\n groupHideGroupColumns: true,\r\n groupUseEntireRow: false,\r\n groupSelectsChildren: true,\r\n rowHeight: 30,\r\n rowSelection: \"multiple\",\r\n rowDeselection: true,\r\n showToolPanel: false,\r\n suppressRowClickSelection: true,\r\n suppressCellSelection: true,\r\n singleClickEdit: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n suppressColumnMoveAnimation: $rootScope.suppressColumnMoveAnimation(),\r\n enableRangeSelection: false,\r\n angularCompileRows: true,\r\n //isExternalFilterPresent: isExternalFilterPresent,\r\n //doesExternalFilterPass: doesExternalFilterPass,\r\n getNodeChildDetails: getNodeChildDetails\r\n }\r\n\r\n self.changeBrand = function (brandId)\r\n {\r\n self.gridOptions.api.showLoadingOverlay();\r\n self.selectedBrand = brandId;\r\n getScorecard(self.selectedBrand, self.year);\r\n }\r\n\r\n function getNodeChildDetails(rowItem) {\r\n if (rowItem.categories && rowItem.categories.length > 0) {\r\n return {\r\n group: true,\r\n expanded: false,\r\n // provide ag-Grid with the children of this group\r\n children: rowItem.categories,\r\n // the key is used by the default group cellRenderer\r\n key: rowItem.categoryId\r\n };\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n function getScorecard(brandId, year)\r\n {\r\n homeService.scorecard.getScorecard(brandId, year)\r\n .then(function (dtos) {\r\n self.scorecard = dtos;\r\n\r\n self.gridOptions.api.setRowData(self.scorecard);\r\n self.gridOptions.api.refreshView();\r\n });\r\n }\r\n\r\n function getBrands()\r\n {\r\n homeService.scorecard.getBrands()\r\n .then(function (brands) {\r\n self.allBrands = brands;\r\n });\r\n }\r\n\r\n function init() {\r\n\r\n getBrands();\r\n\r\n if (self.selectedBrand != 0)\r\n getScorecard(self.selectedBrand, self.year);\r\n }\r\n\r\n init();\r\n });\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n .controller(\"NotificationsCtrl\", function ($scope, httpService) {\r\n var self = this;\r\n self.section = \"Inicio\";\r\n self.name = \"Notificaciones\";\r\n\r\n $scope.unsecured = function () {\r\n httpService.get('test/unsecured').then(function (data) {\r\n $scope.result = data;\r\n });\r\n }\r\n $scope.authenticated = function () {\r\n httpService.get('test/authenticated').then(function (data) {\r\n $scope.result = data;\r\n });\r\n }\r\n $scope.roleAdmin = function () {\r\n httpService.get('test/role-admin').then(function (data) {\r\n $scope.result = data;\r\n });\r\n }\r\n $scope.roleRoot = function () {\r\n httpService.get('test/role-root').then(function (data) {\r\n $scope.result = data;\r\n });\r\n }\r\n $scope.claim = function () {\r\n httpService.get('test/claim').then(function (data) {\r\n $scope.result = data;\r\n });\r\n }\r\n\r\n $scope.info = function () {\r\n httpService.get('test/info').then(function (data) {\r\n $scope.userClaims = data;\r\n });\r\n }\r\n \r\n $scope.exception = function () {\r\n httpService.get('test/exception').then(function (data) {\r\n \r\n });\r\n }\r\n });\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n .controller(\"MapV2Ctrl\", function ($scope, $timeout) {\r\n var vm = this;\r\n vm.name = null;\r\n vm.getName = function(){\r\n return vm.name;\r\n }\r\n vm.zoomOut = function () {\r\n g.selectAll([\"#states\", \"#cities\"]).remove();\r\n state = null;\r\n\r\n if (province) {\r\n g.selectAll(\"#\" + province.id).style('display', null);\r\n }\r\n \r\n var xyz = get_xyz(country);\r\n zoom(xyz);\r\n }\r\n\r\n var m_width, width, height, country, province, state, projection, path, svg, g;\r\n\r\n\r\n function zoom(xyz) {\r\n g.transition()\r\n .duration(750)\r\n .attr(\"transform\", \"translate(\" + projection.translate() + \")scale(\" + xyz[2] + \")translate(-\" + xyz[0] + \",-\" + xyz[1] + \")\")\r\n .selectAll([\"#countries\", \"#states\", \"#cities\"])\r\n .style(\"stroke-width\", 1.0 / xyz[2] + \"px\")\r\n .selectAll(\".city\")\r\n .attr(\"d\", path.pointRadius(20.0 / xyz[2]));\r\n }\r\n\r\n function get_xyz(d) {\r\n var bounds = path.bounds(d);\r\n var w_scale = (bounds[1][0] - bounds[0][0]) / width;\r\n var h_scale = (bounds[1][1] - bounds[0][1]) / height;\r\n var z = .76 / Math.max(w_scale, h_scale);\r\n var x = (bounds[1][0] + bounds[0][0]) / 2;\r\n var y = (bounds[1][1] + bounds[0][1]) / 2 + (height / z / 6);\r\n return [x, y - 50, z];\r\n }\r\n\r\n function province_clicked(d) {\r\n g.selectAll([\"#states\", \"#cities\"]).remove();\r\n state = null;\r\n\r\n if (province) {\r\n g.selectAll(\"#\" + province.id).style('display', null);\r\n }\r\n\r\n if (d && province !== d) {\r\n var xyz = get_xyz(d);\r\n province = d;\r\n\r\n\r\n\r\n //if (d.id == 'USA' || d.id == 'JPN') {\r\n d3.json(\"assets/json/departamentos.topo.json\", function (error, us) {\r\n\r\n var json = topojson.feature(us, us.objects.departamentos);\r\n \r\n //add metadata\r\n for (var i = 0; i < json.features.length; i++) {\r\n var f = json.features[i];\r\n f.properties.id = i;\r\n }\r\n\r\n g.append(\"g\")\r\n .attr(\"id\", \"states\")\r\n .selectAll(\"path\")\r\n .data(json.features)\r\n .enter()\r\n .append(\"path\")\r\n .attr(\"id\", function (d) { return d.properties.id; })\r\n //.attr(\"class\", \"active\")\r\n .attr(\"d\", path)\r\n .on(\"mouseenter\", department_mouseenter)\r\n .on(\"mouseleave\", department_mouseleave);\r\n\r\n zoom(xyz);\r\n g.selectAll(\"#\" + d.id).style('display', 'none');\r\n });\r\n //} else {\r\n // zoom(xyz);\r\n //}\r\n } else {\r\n vm.zoomOut();\r\n }\r\n }\r\n\r\n \r\n\r\n function province_mouseenter(d) {\r\n d3.select(this)\r\n .attr('fill', 'rgba(20,20,200,.5)');\r\n\r\n $timeout(function () {\r\n vm.name = d.properties.NAM;\r\n });\r\n }\r\n function province_mouseleave(d) {\r\n d3.select(this)\r\n .attr('fill', '');\r\n }\r\n\r\n function department_mouseenter(d) {\r\n d3.select(this)\r\n .attr('fill', 'rgba(20,200,20,.5)');\r\n\r\n $timeout(function () {\r\n vm.name = d.properties.FNA;\r\n });\r\n }\r\n function department_mouseleave(d) {\r\n d3.select(this)\r\n .attr('fill', '');\r\n }\r\n\r\n\r\n function init_old() {\r\n\r\n m_width = $(\"#map\").width();\r\n width = 938;\r\n height = 500;\r\n\r\n projection = d3.geo.mercator()\r\n //.scale(380)\r\n //.translate([550, -100]);\r\n //.translate([width / 2, height / 1.5]);\r\n\r\n path = d3.geo.path()\r\n .projection(projection);\r\n\r\n svg = d3.select(\"#map\").append(\"svg\")\r\n .attr(\"preserveAspectRatio\", \"xMidYMid\")\r\n .attr(\"viewBox\", \"0 0 \" + width + \" \" + height)\r\n .attr(\"width\", m_width)\r\n .attr(\"height\", m_width * height / width);\r\n\r\n svg.append(\"rect\")\r\n .attr(\"class\", \"background\")\r\n .attr(\"width\", width)\r\n .attr(\"height\", height)\r\n .on(\"click\", province_clicked);\r\n\r\n g = svg.append(\"g\");\r\n\r\n d3.json(\"assets/json/provincias.topo.json\", function (error, us) {\r\n g.append(\"g\")\r\n .attr(\"id\", \"countries\")\r\n .selectAll(\"path\")\r\n .data(topojson.feature(us, us.objects.collection).features)\r\n .enter()\r\n .append(\"path\")\r\n .attr(\"id\", function (d) { return d.id; })\r\n .attr(\"d\", path)\r\n .on(\"click\", province_clicked);\r\n });\r\n\r\n $(window).resize(function () {\r\n var w = $(\"#map\").width();\r\n svg.attr(\"width\", w);\r\n svg.attr(\"height\", w * height / width);\r\n });\r\n }\r\n\r\n function init() {\r\n m_width = $(\"#map\").width();\r\n width = 300;\r\n height = 600;\r\n\r\n svg = d3.select(\"#map\")\r\n .append(\"svg\")\r\n .attr(\"width\", width)\r\n .attr(\"height\", height);\r\n \r\n\r\n d3.json(\"assets/json/provincias.topo.json\", function (error, us) {\r\n\r\n var json = topojson.feature(us, us.objects.provincias);\r\n\r\n country = json;\r\n\r\n //add metadata\r\n for (var i = 0; i < json.features.length; i++) {\r\n var f = json.features[i];\r\n f.properties.id = i;\r\n }\r\n\r\n\r\n // create a first guess for the projection\r\n var center = d3.geo.centroid(json)\r\n var scale = 150;\r\n var offset = [width / 2, height / 2];\r\n\r\n projection = d3.geo.mercator()\r\n .scale(scale)\r\n .center(center)\r\n .translate(offset);\r\n\r\n // create the path\r\n path = d3.geo.path().projection(projection);\r\n\r\n // using the path determine the bounds of the current map and use \r\n // these to determine better values for the scale and translation\r\n var bounds = path.bounds(json);\r\n var hscale = scale * width * 0.8 / (bounds[1][0] - bounds[0][0]);\r\n var vscale = scale * height * 0.8 / (bounds[1][1] - bounds[0][1]);\r\n var scale = (hscale < vscale) ? hscale : vscale;\r\n var offset = [width - (bounds[0][0] + bounds[1][0]) / 2,\r\n height - (bounds[0][1] + bounds[1][1]) / 2];\r\n\r\n //offset fine tuning\r\n //offset[0] = offset[0] - 20;\r\n offset[1] = offset[1] + 70;\r\n\r\n\r\n // new projection\r\n projection = d3.geo.mercator()\r\n .center(center)\r\n .scale(scale)\r\n .translate(offset);\r\n\r\n path = path.projection(projection);\r\n\r\n // add a rectangle to see the bound of the svg\r\n\r\n svg.append(\"rect\")\r\n .attr(\"class\", \"background\")\r\n .attr(\"width\", width)\r\n .attr(\"height\", height)\r\n .on(\"click\", province_clicked);\r\n\r\n g = svg.append(\"g\");\r\n\r\n g.append(\"g\")\r\n .attr(\"id\", \"countries\")\r\n .selectAll(\"path\")\r\n .data(json.features)\r\n .enter()\r\n .append(\"path\")\r\n .attr(\"id\", function (d) {\r\n return d.properties.id;\r\n })\r\n .attr(\"d\", path)\r\n .on(\"click\", province_clicked)\r\n .on(\"mouseenter\", province_mouseenter)\r\n .on(\"mouseleave\", province_mouseleave);\r\n\r\n\r\n var xyz = get_xyz(json)\r\n zoom(xyz);\r\n });\r\n\r\n }\r\n\r\n init();\r\n });\r\n","\r\n\r\nangular.module(\"prisma\")\r\n\r\n .controller(\"MarketBoardCtrl\", function ($scope, $rootScope, $translate, homeService, $filter, companyJson) {\r\n var self = this;\r\n\r\n\r\n var chart1 = c3.generate({\r\n bindto: '#productPriceEvolutionChart',\r\n\r\n padding: {\r\n top: 30,\r\n right: 50,\r\n bottom: 60,\r\n left: 50,\r\n },\r\n transition: {\r\n duration: 1000\r\n },\r\n data: {\r\n xs: {\r\n 'NaftaSuper': 'x1',\r\n 'GasoilRegular': 'x1',\r\n 'NaftaPremium': 'x1',\r\n 'GasoilPremium': 'x1',\r\n },\r\n columns: [\r\n //Eje X, cantidad de puntos sobre el eje X\r\n ['x1', '2018-12-05', '2018-12-06', '2018-12-07', '2018-12-08', '2018-12-09', '2018-12-10', '2018-12-11', '2018-12-12', '2018-12-13', '2018-12-14', '2018-12-15', '2018-12-16', '2018-12-17', '2018-12-18', '2018-12-19' ],\r\n //['x1', 5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 ],\r\n\r\n //Marcas con sus precios (tienen que tener la misma cantidad)\r\n ['NaftaSuper', 36.7, 36.7, 37.2, 37.2, 37.2, 37.2, 37.7, 37.7, 37.7, 37.7, 38.2, 38.2, 38.2, 38.2, 38.7],\r\n ['GasoilRegular', 32.7, 32.7, 33.2, 33.2, 33.2, 33.2, 33.7, 33.7, 33.7, 33.7, 34.2, 34.2, 34.2, 34.2, 34.7],\r\n ['NaftaPremium', 42.7, 42.7, 43.2, 43.2, 43.2, 43.2, 43.7, 43.7, 43.7, 43.7, 44.2, 44.2, 44.2, 44.2, 44.7],\r\n ['GasoilPremium', 39.6, 39.6, 40.1, 40.1, 40.1, 40.1, 40.6, 40.6, 40.6, 40.6, 41.1, 41.1, 41.1, 41.1, 41.6]\r\n ],\r\n type: 'spline',\r\n colors: {\r\n NaftaSuper: '#F35549',\r\n GasoilRegular: '#7460EE',\r\n NaftaPremium: '#26C6DA',\r\n GasoilPremium: '#3B97E8'\r\n }\r\n },\r\n axis: {\r\n x: {\r\n type: 'timeseries',\r\n tick: {\r\n format: '%y-%m-%d'\r\n }\r\n },\r\n y: {\r\n tick: {\r\n format: d3.format('.1f')\r\n }\r\n }\r\n }\r\n });\r\n\r\n var chart2 = c3.generate({\r\n bindto: '#exchangeRateEvolutionChart',\r\n padding: {\r\n top: 30,\r\n right: 50,\r\n bottom: 30,\r\n left: 50,\r\n },\r\n transition: {\r\n duration: 2000\r\n },\r\n data: {\r\n xs: {\r\n 'Dolar': 'x1',\r\n },\r\n columns: [\r\n //Eje X, cantidad de puntos sobre el eje X\r\n ['x1', '2018-12-05', '2018-12-06', '2018-12-07', '2018-12-08', '2018-12-09', '2018-12-10', '2018-12-11', '2018-12-12', '2018-12-13', '2018-12-14', '2018-12-15', '2018-12-16', '2018-12-17', '2018-12-18', '2018-12-19'],\r\n\r\n //Marcas con sus precios (tienen que tener la misma cantidad)\r\n ['Dolar', 36.9, 36.9, 37.4, 37.4, 37.4, 37.4, 37.9, 37.9, 37.9, 37.9, 38.4, 38.4, 38.4, 38.4, 38.9],\r\n ],\r\n type: 'spline',\r\n colors: {\r\n Dolar: '#1AB394',\r\n },\r\n\r\n },\r\n axis: {\r\n x: {\r\n type: 'timeseries',\r\n tick: {\r\n format: '%y-%m-%d'\r\n }\r\n },\r\n y: {\r\n tick: {\r\n format: d3.format('.1f')\r\n }\r\n }\r\n }\r\n });\r\n\r\n var chart3 = c3.generate({\r\n bindto: '#brendOilEvolutionChart',\r\n transition: {\r\n duration: 1000\r\n },\r\n padding: {\r\n top: 30,\r\n right: 50,\r\n bottom: 30,\r\n left: 50,\r\n },\r\n data: {\r\n xs: {\r\n 'BrentOil': 'x1',\r\n },\r\n columns: [\r\n //Eje X, cantidad de puntos sobre el eje X\r\n ['x1', '2018-12-05', '2018-12-06', '2018-12-07', '2018-12-08', '2018-12-09', '2018-12-10', '2018-12-11', '2018-12-12', '2018-12-13', '2018-12-14', '2018-12-15', '2018-12-16', '2018-12-17', '2018-12-18', '2018-12-19'],\r\n //['x1', 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19],\r\n\r\n //Marcas con sus precios (tienen que tener la misma cantidad)\r\n ['BrentOil', 79.0, 79.0, 79.5, 79.5, 79.5, 79.5, 80.0, 80.0, 80.0, 80.0, 80.5, 80.5, 80.5, 80.5, 81.0],\r\n ],\r\n type: 'spline',\r\n colors: {\r\n BrentOil: '#787A7C',\r\n },\r\n\r\n },\r\n axis: {\r\n x: {\r\n type: 'timeseries',\r\n tick: {\r\n format: '%y-%m-%d'\r\n }\r\n },\r\n y: {\r\n tick: {\r\n format: d3.format('.1f')\r\n }\r\n }\r\n }\r\n });\r\n\r\n\r\n function init() {\r\n\r\n }\r\n\r\n init();\r\n });\r\n\r\n","\r\n\r\n\r\nangular.module(\"prisma\")\r\n\r\n .controller(\"MapsCtrl\", function ($scope, $timeout, NgMap) {\r\n var vm = this;\r\n NgMap.getMap().then(function (map) {\r\n vm.map = map;\r\n\r\n vm.province = null;\r\n\r\n vm.map.data.setStyle(function (feature) {\r\n return /** @type {google.maps.Data.StyleOptions} */({\r\n //fillColor: feature.getProperty('color'),\r\n fillColor: vm.getProvinceColor(feature),\r\n strokeWeight: 1\r\n });\r\n });\r\n\r\n var infowindow = new google.maps.InfoWindow({\r\n content: \"MI BUENOS AIRES QUERIDO!\",\r\n position: { lat: -36.648446, lng: -65.557184 }\r\n });\r\n \r\n //infowindow.open(vm.map);\r\n \r\n });\r\n\r\n vm.onClick = function (event) {\r\n var id = event.feature.getProperty(\"objectid\");\r\n\r\n var name = event.feature.getProperty('provincia');\r\n var cap = event.feature.getProperty('capital');\r\n var h = event.feature.getProperty('habitantes');\r\n var ss = event.feature.getProperty('totalSS');\r\n \r\n vm.province = {\r\n provincia: name,\r\n capital: cap,\r\n habitantes: h,\r\n totalSS: ss,\r\n ratio: ((ss / h) * 10000).toFixed(2),\r\n };\r\n\r\n };\r\n\r\n vm.onMouseover = function (event) {\r\n vm.map.data.revertStyle();\r\n vm.map.data.overrideStyle(event.feature, { strokeWeight: 2 });\r\n };\r\n\r\n vm.onMouseout = function (event) {\r\n vm.map.data.revertStyle();\r\n };\r\n\r\n vm.getProvinceColor = function (feature) {\r\n \r\n //var colors = [\"red\", \"green\", \"yellow\"];\r\n //var rnd = ian.getRandomInt(0, 2);\r\n //var color = colors[rnd];\r\n\r\n var h = feature.getProperty('habitantes');\r\n var ss = feature.getProperty('totalSS');\r\n var ratio = (ss / h) * 10000;\r\n\r\n var color = ratio > 1.5 ? \"red\" : ratio < 1 ? \"green\" : \"yellow\";\r\n\r\n return color;\r\n\r\n }\r\n\r\n });\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n\r\n .controller(\"ItemDashboardCtrl\", function ($scope, $rootScope, $stateParams, $translate, homeService) {\r\n var self = this;\r\n\r\n self.datasets = null;\r\n self.priceSurveys = null;\r\n self.showPrices = false;\r\n self.price = 0;\r\n self.inventory = { days: '2', gmroi: '' };\r\n\r\n self.timerange = null;\r\n\r\n self.updateChart = function (timerange) {\r\n if (self.datasets == null || self.datasets == '')\r\n return;\r\n\r\n self.timerange = timerange;\r\n\r\n self.chart = c3.generate({\r\n bindto: '#saleschart',\r\n data: {\r\n json: (timerange == 'week' ? self.datasets.lastWeekXValues : timerange == 'month' ? self.datasets.lastMonthXValues : self.datasets.lastYearXValues),\r\n keys: {\r\n x: 'dateString',\r\n value: ['sales', 'units', 'margin', 'price'],\r\n },\r\n axes: {\r\n sales: 'y',\r\n units: 'y',\r\n margin: 'y',\r\n price: 'y2'\r\n },\r\n type: 'bar',\r\n types: {\r\n price: 'line',\r\n },\r\n colors: {\r\n sales: '#1ab394',\r\n units: '#1c84c6',\r\n margin: '#f8ac59',\r\n price: '#ED5565'\r\n }\r\n },\r\n axis: {\r\n x: {\r\n type: 'timeseries',\r\n tick: {\r\n fit: true,\r\n format: function (x) {\r\n if (self.timerange == 'week') {\r\n return $rootScope.shortWeekDayNames[x.getDay()];\r\n } else if (self.timerange == 'month') {\r\n return x.getDate() + '-' + $rootScope.shortMonthNames[(x.getMonth())];\r\n } else if (self.timerange == 'year') {\r\n return x.getFullYear() + '-' + (x.getMonth() + 1);\r\n }\r\n }\r\n }\r\n },\r\n y: {\r\n tick: {\r\n format: d3.format(\"s\")\r\n }\r\n },\r\n y2: {\r\n show: true,\r\n label: 'Precio en $',\r\n tick: {\r\n format: d3.format('.1f')\r\n },\r\n min: 0\r\n }\r\n },\r\n tooltip: {\r\n format: {\r\n title: function (d) {\r\n var toFormat = '%B %d, %Y';\r\n if (self.timerange == 'year')\r\n toFormat = '%B %Y';\r\n\r\n var format = d3.time.format(toFormat);\r\n return format(d);\r\n },\r\n value: function (value, ratio, id) {\r\n var format = id === 'price' ? d3.format(',.1f') : d3.format(',.0f');\r\n return format(value);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function loadData() {\r\n if ($stateParams.itemId) {\r\n\r\n homeService.dashboards.getItemDashboard($stateParams.itemId, $stateParams.storeId ? $stateParams.storeId : null, $stateParams.clusterId && $stateParams.clusterId != 0 ? $stateParams.clusterId : null, $stateParams.priceListId ? $stateParams.priceListId : null)\r\n .then(function (result) {\r\n\r\n self.datasets = result;\r\n\r\n self.updateChart('year');\r\n\r\n self.updateKPIs();\r\n\r\n self.getInventory();\r\n\r\n self.priceSurveys = result.priceSurveys;\r\n if (result.priceSurveys != null && result.priceSurveys != '' && result.priceSurveys.length > 0)\r\n {\r\n self.showPrices = true;\r\n }\r\n });\r\n }\r\n }\r\n\r\n self.updateKPIs = function ()\r\n {\r\n if (self.datasets == null || self.datasets == '')\r\n return;\r\n\r\n var l = self.datasets.lastYearXValues.length;\r\n if (l > 1)\r\n {\r\n self.lastDaySales = self.datasets.lastYearXValues[l - 1].sales;\r\n var lastDaySalesChange = (self.datasets.lastYearXValues[l - 1].sales / self.datasets.lastYearXValues[l - 2].sales - 1).toFixed(4);\r\n self.lastDaySalesChange = lastDaySalesChange;\r\n self.lastDaySalesChangeIcon = lastDaySalesChange < 0 ? 'fa fa-level-down' : (lastDaySalesChange > 0 ? 'fa fa-level-up' : 'fa fa-minus');\r\n\r\n self.lastDayUnits = self.datasets.lastYearXValues[l - 1].units;\r\n var lastDayUnitsChange = (self.datasets.lastYearXValues[l - 1].units / self.datasets.lastYearXValues[l - 2].units - 1).toFixed(4);\r\n self.lastDayUnitsChange = lastDayUnitsChange;\r\n self.lastDayUnitsChangeIcon = lastDayUnitsChange < 0 ? 'fa fa-level-down' : (lastDayUnitsChange > 0 ? 'fa fa-level-up' : 'fa fa-minus');\r\n\r\n self.lastDayMargin = self.datasets.lastYearXValues[l - 1].margin;\r\n var lastDayMarginChange = (self.datasets.lastYearXValues[l - 1].margin / self.datasets.lastYearXValues[l - 2].margin - 1).toFixed(4);\r\n self.lastDayMarginChange = lastDayMarginChange;\r\n self.lastDayMarginChangeIcon = lastDayMarginChange < 0 ? 'fa fa-level-down' : (lastDayMarginChange > 0 ? 'fa fa-level-up' : 'fa fa-minus');\r\n\r\n self.price = self.datasets.lastYearXValues[l - 1].price;\r\n self.lastDayPrice = self.price;\r\n \r\n var lastDayPriceChange = (self.datasets.lastYearXValues[l - 1].price / self.datasets.lastYearXValues[l - 2].price - 1).toFixed(4);\r\n self.lastDayPriceChange = lastDayPriceChange;\r\n self.lastDayPriceChangeIcon = lastDayPriceChange < 0 ? 'fa fa-level-down' : (lastDayPriceChange > 0 ? 'fa fa-level-up' : 'fa fa-minus');\r\n }\r\n \r\n }\r\n\r\n self.getInventory = function()\r\n {\r\n homeService.dashboards.getInventory($stateParams.itemId, $stateParams.storeId ? $stateParams.storeId : null, $stateParams.clusterId && $stateParams.clusterId != 0 ? $stateParams.clusterId : null, $stateParams.priceListId ? $stateParams.priceListId : null).then(function (inventory) {\r\n self.inventory = inventory;\r\n });\r\n }\r\n\r\n function init() {\r\n\r\n loadData();\r\n }\r\n\r\n init();\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"HeatMapMarginCtrl\", function ($state, $stateParams, $scope, $rootScope, $filter, $http, $translate, homeService, adminService) {\r\n var self = this;\r\n var geojson = null;\r\n var heatMap = null;\r\n var legend = L.control({ position: 'bottomright' });\r\n var country = '';\r\n var initialFeature = null;\r\n var initialLayer = null;\r\n\r\n self.heatType = 'margin';\r\n\r\n var lastProvince = '';\r\n var layers = [];\r\n self.sameStores = true;\r\n self.isZoomAplied = false;\r\n self.moneySymbol = '';\r\n self.metadata = { title: '', houses: 0, population: 0, sales: 0, units: 0, margin: 0 }\r\n self.emptyData = { sales: undefined, units: undefined, margin: undefined }\r\n self.selectedCategory = {};\r\n self.highlightedLayer;\r\n\r\n self.onCategorySelected = function (item) {\r\n self.selectedCategory = item;\r\n self.loadData();\r\n }\r\n\r\n self.reload = function () {\r\n $state.go('home.heatMapMargin', { categoryId: self.selectedCategoryId }, { reload: true });\r\n }\r\n\r\n //Leyenda\r\n legend.onAdd = function (map) {\r\n\r\n var div = L.DomUtil.create('div', 'info legend'),\r\n labels = [],\r\n prefix, from;\r\n\r\n labels.push(\r\n ' ' + translations.GreaterThan + ' USD 100 x m3'\r\n );\r\n\r\n labels.push(\r\n ' ' + translations.Between + ' USD 80' + translations.And + 'USD 100 x m3'\r\n );\r\n\r\n labels.push(\r\n ' ' + translations.Between + ' USD 60' + translations.And + 'USD 80 x m3'\r\n );\r\n\r\n labels.push(\r\n ' ' + translations.Between + ' USD 40' + translations.And + 'USD 60 x m3'\r\n );\r\n\r\n labels.push(\r\n ' ' + translations.Between + ' USD 20' + translations.And + 'USD 40 x m3'\r\n );\r\n\r\n labels.push(\r\n ' ' + translations.Between + ' USD 0' + translations.And + 'USD 20 x m3'\r\n );\r\n\r\n labels.push(\r\n ' ' + translations.Between + ' USD -20' + translations.And + 'USD 0 x m3'\r\n );\r\n\r\n labels.push(\r\n ' ' + translations.LessThan + ' USD -20 x m3'\r\n );\r\n\r\n div.innerHTML = labels.join('
');\r\n return div;\r\n\r\n };\r\n\r\n\r\n function loadProvincias() {\r\n $http.get('/app/home/heatMap/' + country + '/provincias.json').success(function (geoJsonData) {\r\n geojson = L.geoJson(geoJsonData, {\r\n onEachFeature: loadProvincia,\r\n style: getStyle\r\n }).addTo(heatMap);\r\n });\r\n }\r\n\r\n function loadProvincia(feature, layer) {\r\n feature.properties.category = layer.feature.properties.provincia;\r\n\r\n var provincias = _.filter(statesData.subcategories, function (o) {\r\n if (o.category != null)\r\n return o.category.toLowerCase() == feature.properties.category.toLowerCase();\r\n else\r\n return false;\r\n });\r\n\r\n var data = provincias.length > 0 ? provincias[0] : null;\r\n\r\n if (data != null) {\r\n _.assign(feature.properties, data);\r\n _.assign(layer.feature.properties, data);\r\n\r\n } else {\r\n _.assign(feature.properties, self.emptyData);\r\n _.assign(layer.feature.properties, self.emptyData);\r\n }\r\n\r\n layer.setStyle({\r\n fillColor: getColor(feature.properties[self.heatType])\r\n });\r\n\r\n layer.on({\r\n mouseover: highlightFeature,\r\n mouseout: resetHighlight,\r\n click: zoomToFeature\r\n });\r\n\r\n layers.push(layer);\r\n }\r\n\r\n function getColor(d) {\r\n return d >= 100 ? '#38b550' : //mas de 30\r\n d >= 80 ? '#62bb46' : // entre 20 y 30\r\n d >= 60 ? '#7bc470' ://entre 10 y 20\r\n d >= 40 ? '#a4cf57' : //entre 0 y 10\r\n d < -20 ? '#da203d' : // menos de -30\r\n d < 0 ? '#f04e29' : // entre -20 y -30\r\n d <= 20 ? '#f99d1c' : // entre -10 y - 20\r\n d < 40 ? '#ffd400' : // entre 0 y -10\r\n '#CCCCCC'; // null o undefined\r\n }\r\n\r\n function getStyle(feature) {\r\n\r\n return {\r\n fillOpacity: 0.9,\r\n color: 'white',\r\n weight: 1.5,\r\n opacity: 0.8,\r\n dashArray: '3'\r\n };\r\n }\r\n\r\n function highlightFeature(e) {\r\n var layer = e.target.feature ? e.target : $(this).data('layer');\r\n self.highlightedLayer = layer;\r\n\r\n self.metadata.entityType = layer.feature.properties.entityType;\r\n if (layer.feature.properties.provincia == undefined) {\r\n self.metadata.title = layer.feature.properties.category + ' - ' + layer.feature.properties.subcategory;\r\n self.metadata.population = layer.feature.properties.TOTAL_VARONES + layer.feature.properties.TOTAL_MUJERES;\r\n self.metadata.houses = layer.feature.properties.TOTAL_VIVIENDAS;\r\n }\r\n else {\r\n self.metadata.title = layer.feature.properties.category;\r\n }\r\n\r\n _.assign(self.metadata, layer.feature.properties);\r\n\r\n layer.setStyle({\r\n weight: 5,\r\n dashArray: '',\r\n fillOpacity: 0.7\r\n });\r\n\r\n if (!L.Browser.ie && !L.Browser.opera) {\r\n layer.bringToFront();\r\n }\r\n\r\n $scope.$apply();\r\n\r\n }\r\n\r\n function resetHighlight(e) {\r\n var layer = e.target.feature ? e.target : $(this).data('layer');\r\n //var layer = e.target;\r\n geojson.resetStyle(layer);\r\n\r\n layer.setStyle({\r\n fillColor: getColor(layer.feature.properties[self.heatType]),\r\n });\r\n }\r\n\r\n function zoomToFeature(e) {\r\n self.isZoomAplied = true;\r\n var layer = e.target.feature ? e.target : $(this).data('layer');\r\n heatMap.fitBounds(layer.getBounds());\r\n loadDepartamentos(layer.feature);\r\n layer.off({ mouseover: highlightFeature });\r\n layer.remove();\r\n }\r\n\r\n function zoomToDepartamento(e) {\r\n var layer = e.target.feature ? e.target : $(this).data('layer');\r\n heatMap.fitBounds(layer.getBounds());\r\n\r\n loadStores(layer.feature);\r\n }\r\n\r\n function loadStores(feature) {\r\n\r\n statesData.subcategories.forEach(function (category) {\r\n\r\n category.subcategories.forEach(function (subcategory) {\r\n\r\n subcategory.subcategories.forEach(function (store) {\r\n\r\n if (store.lat != 0 && store.long != 0 && store.lat != null && store.long != null) {\r\n\r\n if (feature.properties.category.toLowerCase() == category.category.toLowerCase() && feature.properties.subcategory.toLowerCase() == subcategory.subcategory.toLowerCase()) {\r\n var competitorIcon = L.icon({\r\n iconUrl: 'assets/images/competitors/' + store.icon,\r\n\r\n iconSize: [24, 24], // size of the icon\r\n iconAnchor: [0, 0], // point of the icon which will correspond to marker's location\r\n popupAnchor: [12, 6] // point from which the popup should open relative to the iconAnchor\r\n });\r\n\r\n\r\n var html = ''\r\n + ''\r\n + ''\r\n + '
' + '' + store.name + '
' + translations.UNITS + '' + $filter('number')(store.units, 0) + '
' + translations.MARGIN + '' + $filter('currency')(store.margin, \"USD \", 0) + '
';\r\n\r\n var marker = L.marker([store.lat, store.long], { icon: competitorIcon }).addTo(heatMap)\r\n .bindPopup(html);\r\n\r\n }\r\n }\r\n });\r\n\r\n });\r\n\r\n });\r\n }\r\n\r\n function loadDepartamento(feature, layer) {\r\n\r\n layer.feature.properties.PROVINCIA = layer.feature.properties.PROVINCIA == undefined ? lastProvince : layer.feature.properties.PROVINCIA;\r\n feature.properties.category = layer.feature.properties.PROVINCIA;\r\n feature.properties.subcategory = layer.feature.properties.DEPARTAMTO;\r\n\r\n\r\n var provincias = _.filter(statesData.subcategories, function (o) {\r\n\r\n if (o.category != null)\r\n return o.category.toLowerCase() == feature.properties.category.toLowerCase();\r\n else\r\n return false;\r\n });\r\n var provincia = provincias.length > 0 ? provincias[0] : null;\r\n if (provincia != null) {\r\n var departamentos = _.filter(provincia.subcategories, function (o) {\r\n if (o.subcategory) {\r\n return o.subcategory.toLowerCase() == feature.properties.subcategory.toLowerCase();\r\n }\r\n });\r\n\r\n var data = departamentos.length > 0 ? departamentos[0] : null;\r\n\r\n if (data != null) {\r\n _.assign(feature.properties, data);\r\n _.assign(layer.feature.properties, data);\r\n\r\n } else {\r\n _.assign(feature.properties, self.emptyData);\r\n _.assign(layer.feature.properties, self.emptyData);\r\n }\r\n }\r\n\r\n layer.setStyle({\r\n fillColor: getColor(feature.properties[self.heatType])\r\n });\r\n\r\n layer.on({\r\n mouseover: highlightFeature,\r\n mouseout: resetHighlight,\r\n click: zoomToDepartamento\r\n });\r\n layers.push(layer);\r\n\r\n }\r\n\r\n var isDepartamentosLoaded = false;\r\n function loadDepartamentos(feature) {\r\n\r\n lastProvince = feature.properties.provincia;\r\n if (country == \"Peru\") {\r\n if (!isDepartamentosLoaded) {\r\n $http.get('/app/home/heatMap/peru/provincias/departamentos.json').success(function (geoJsonData) {\r\n L.geoJson(geoJsonData, {\r\n onEachFeature: loadDepartamento,\r\n style: getStyle\r\n }).addTo(heatMap);\r\n });\r\n isDepartamentosLoaded = true;\r\n }\r\n }\r\n if (country == \"Colombia\") {\r\n if (!isDepartamentosLoaded) {\r\n $http.get('/app/home/heatMap/colombia/provincias/departamentos.json').success(function (geoJsonData) {\r\n L.geoJson(geoJsonData, {\r\n onEachFeature: loadDepartamento,\r\n style: getStyle\r\n }).addTo(heatMap);\r\n });\r\n isDepartamentosLoaded = true;\r\n }\r\n }\r\n else if (country == \"Argentina\") {\r\n $http.get('/app/home/heatMap/argentina/provincias/' + feature.properties.provincia.toUpperCase() + '.json').success(function (geoJsonData) {\r\n L.geoJson(geoJsonData, {\r\n onEachFeature: loadDepartamento,\r\n style: getStyle\r\n }).addTo(heatMap);\r\n });\r\n }\r\n else if (country == \"Mexico\") {\r\n\r\n for (var i = 1; i <= feature.properties.size; i++) {\r\n\r\n var url = ('00' + feature.properties.index).slice(-2);\r\n //var url = ('00' + \"01\").slice(-2);\r\n url += ('00' + i).slice(-3);\r\n\r\n $http.get('/app/home/heatMap/mexico/provincias/' + url + '.json').success(function (geoJsonData) {\r\n L.geoJson(geoJsonData, {\r\n onEachFeature: loadDepartamento,\r\n style: getStyle\r\n }).addTo(heatMap);\r\n });\r\n\r\n }\r\n\r\n }\r\n }\r\n\r\n var statesData = null;\r\n function loadData() {\r\n homeService.dashboards.getHeatMapByStateMargin(self.selectedCategoryId)\r\n .then(function (data) {\r\n \r\n statesData = data;\r\n\r\n _.assign(self.metadata, data);\r\n\r\n loadProvincias();\r\n });\r\n }\r\n\r\n var translations = null;\r\n\r\n self.categories = [];\r\n self.selectedCategoryId = 0;\r\n\r\n function init() {\r\n\r\n $translate([\"GreaterThan\", \"Between\", \"LessThan\", \"UNITS\", \"SALES\", \"MARGIN\", \"And\"])\r\n .then(function (all) {\r\n\r\n translations = all;\r\n self.isZoomAplied = false;\r\n homeService.dashboards.getCountry()\r\n .then(function (c) {\r\n country = c;\r\n\r\n adminService.categories.getSubCategories()\r\n .then(function (categories) {\r\n\r\n self.categories = $filter('orderBy')(categories, 'id', false);\r\n\r\n if ($stateParams.categoryId) {\r\n self.selectedCategoryId = $stateParams.categoryId; \r\n }\r\n else {\r\n self.selectedCategoryId = self.categories[0].id;\r\n }\r\n\r\n self.metadata.title = country;\r\n\r\n if (country == \"Peru\") {\r\n heatMap = L.map('heatMap').setView([-8.8822898, -73.7699384], 5); //Perú\r\n self.moneySymbol = '$';\r\n }\r\n if (country == \"Colombia\") {\r\n heatMap = L.map('heatMap').setView([1.8822898, -73.7699384], 5); //Colombia\r\n self.moneySymbol = '$';\r\n }\r\n else if (country == \"Argentina\") {\r\n heatMap = L.map('heatMap').setView([-38.005, -61.0739], 4); //Argentina\r\n self.moneySymbol = '$';\r\n }\r\n else if (country == \"Mexico\") {\r\n heatMap = L.map('heatMap').setView([21.695501, -101.666045], 5); //Mexico\r\n self.moneySymbol = '$';\r\n }\r\n L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\r\n attribution: '© OpenStreetMap',\r\n subdomains: ['a', 'b', 'c']\r\n }).addTo(heatMap);\r\n\r\n legend.addTo(heatMap);\r\n\r\n\r\n loadData();\r\n\r\n });\r\n });\r\n });\r\n }\r\n init();\r\n });\r\n","angular.module(\"prisma\")\r\n .controller(\"HeatMapCtrl\", function ($state, $stateParams, $scope, $rootScope, $filter, $http, $translate, homeService) {\r\n var self = this;\r\n var geojson = null;\r\n var heatMap = null;\r\n var legend = L.control({ position: 'bottomright' });\r\n var country = '';\r\n var initialFeature = null;\r\n var initialLayer = null;\r\n\r\n var lastProvince = '';\r\n var layers = [];\r\n self.sameStores = true;\r\n self.isZoomAplied = false;\r\n self.moneySymbol = '';\r\n self.metadata = { title: '', houses: 0, population: 0, sales: 0, units: 0, margin: 0, salesDelta: 0, unitsDelta: 0, marginDelta: 0 }\r\n self.emptyData = { sales: undefined, units: undefined, margin: undefined, salesDelta: undefined, unitsDelta: undefined, marginDelta: undefined }\r\n self.heatType = 'salesDelta';\r\n self.selectedCategory = {};\r\n self.timeType = '1';\r\n self.highlightedLayer;\r\n\r\n\r\n $scope.$watch('ct.sameStores', function (newVal, oldVar) {\r\n //console.log('newval', newVal);\r\n self.updateTime(newVal)\r\n });\r\n\r\n self.onCategorySelected = function (item) {\r\n //console.log('categoria', item);\r\n self.selectedCategory = item;\r\n self.updateTime(self.sameStores);\r\n }\r\n\r\n self.reload = function () {\r\n $state.go('home.heatMap', {}, { reload: true });\r\n }\r\n\r\n self.updateTime = function (withSameStores) {\r\n \r\n homeService.dashboards.getHeatMapByState(self.timeType, self.selectedCategory.id, withSameStores)\r\n .then(function (data) {\r\n\r\n console.log('data', data);\r\n statesData = data;\r\n\r\n _.assign(self.metadata, data);\r\n if (data) {\r\n\r\n dealWithSubCategories(statesData.subcategories);\r\n\r\n }\r\n else\r\n cleanLayers();\r\n self.updateHeat();\r\n });\r\n }\r\n\r\n function cleanLayers() {\r\n var data = { houses: 0, population: 0, sales: undefined, units: undefined, margin: undefined, salesDelta: undefined, unitsDelta: undefined, marginDelta: undefined }\r\n\r\n _.each(layers, function (layerItem) {\r\n _.assign(layerItem.feature.properties, data);\r\n })\r\n _.assign(self.metadata, data);\r\n }\r\n\r\n function dealWithSubCategories(sub) {\r\n\r\n _.each(sub, function (subItem) {\r\n\r\n //Me fijo que el layer highlighted se refresque-\r\n if (self.highlightedLayer && self.highlightedLayer.feature.properties.category.toLowerCase() == subItem.category.toLowerCase()\r\n && self.highlightedLayer.feature.properties.entityType == subItem.entityType\r\n && self.highlightedLayer.feature.properties.subcategory.toLowerCase() == subItem.subcategory.toLowerCase()) {\r\n _.assign(self.metadata, subItem);\r\n }\r\n _.each(layers, function (layerItem) {\r\n if (subItem.category == layerItem.feature.properties.category &&\r\n subItem.entityType == layerItem.feature.properties.entityType &&\r\n layerItem.feature.properties.subcategory && subItem.subcategory &&\r\n layerItem.feature.properties.subcategory.toLowerCase() == subItem.subcategory.toLowerCase()) {\r\n _.assign(layerItem.feature.properties, subItem);\r\n }\r\n })\r\n\r\n if (subItem.subcategories.length > 0) {\r\n dealWithSubCategories(subItem.subcategories)\r\n }\r\n })\r\n }\r\n\r\n\r\n self.updateHeat = function () {\r\n console.log(layers);\r\n _.each(layers, function (layer) {\r\n layer.setStyle({\r\n fillColor: getColor(layer.feature.properties[self.heatType])\r\n });\r\n })\r\n }\r\n\r\n\r\n //Leyenda\r\n legend.onAdd = function (map) {\r\n\r\n var div = L.DomUtil.create('div', 'info legend'),\r\n //grades = [0.31, 0.20, 0.10, 0.01, -0.1, -0.2, -0.3, -0.31],\r\n labels = [],\r\n prefix, from;\r\n\r\n labels.push(\r\n ' ' + translations.GreaterThan + ' ' + $rootScope.toPercentage(0.31)\r\n );\r\n\r\n labels.push(\r\n ' ' + translations.Between + ' ' + $rootScope.toPercentage(0.20) + ' y ' + $rootScope.toPercentage(0.30)\r\n );\r\n\r\n labels.push(\r\n ' ' + translations.Between + ' ' + $rootScope.toPercentage(0.1) + ' y ' + $rootScope.toPercentage(0.19)\r\n );\r\n\r\n labels.push(\r\n ' ' + translations.Between + ' ' + $rootScope.toPercentage(0.01) + ' y ' + $rootScope.toPercentage(0.09)\r\n );\r\n\r\n labels.push(\r\n ' ' + translations.Between + ' ' + $rootScope.toPercentage(0) + ' y ' + $rootScope.toPercentage(-0.09)\r\n );\r\n\r\n labels.push(\r\n ' ' + translations.Between + ' ' + $rootScope.toPercentage(-0.1) + ' y ' + $rootScope.toPercentage(-0.19)\r\n );\r\n\r\n labels.push(\r\n ' ' + translations.Between + ' ' + $rootScope.toPercentage(-0.2) + ' y ' + $rootScope.toPercentage(-0.30)\r\n );\r\n\r\n labels.push(\r\n ' ' + translations.LessThan + ' ' + $rootScope.toPercentage(-0.31)\r\n );\r\n\r\n div.innerHTML = labels.join('
');\r\n return div;\r\n\r\n };\r\n\r\n\r\n function loadProvincias() {\r\n $http.get('/app/home/heatMap/' + country + '/provincias.json').success(function (geoJsonData) {\r\n geojson = L.geoJson(geoJsonData, {\r\n onEachFeature: loadProvincia,\r\n style: getStyle\r\n }).addTo(heatMap);\r\n });\r\n }\r\n\r\n function loadProvincia(feature, layer) {\r\n feature.properties.category = layer.feature.properties.provincia;\r\n\r\n var provincias = _.filter(statesData.subcategories, function (o) {\r\n if (o.category != null)\r\n return o.category.toLowerCase() == feature.properties.category.toLowerCase();\r\n else\r\n return false;\r\n });\r\n\r\n var data = provincias.length > 0 ? provincias[0] : null;\r\n\r\n if (data != null) {\r\n //console.log('data', data);\r\n\r\n _.assign(feature.properties, data);\r\n _.assign(layer.feature.properties, data);\r\n //console.log('layer', layer);\r\n\r\n } else {\r\n _.assign(feature.properties, self.emptyData);\r\n _.assign(layer.feature.properties, self.emptyData);\r\n }\r\n\r\n layer.setStyle({\r\n fillColor: getColor(feature.properties[self.heatType])\r\n });\r\n\r\n layer.on({\r\n mouseover: highlightFeature,\r\n mouseout: resetHighlight,\r\n click: zoomToFeature\r\n });\r\n\r\n layers.push(layer);\r\n }\r\n\r\n function getColor(d) {\r\n //console.log(d);\r\n return d > 0.3 ? '#38b550' : //mas de 30\r\n d > 0.2 ? '#62bb46' : // entre 20 y 30\r\n d > 0.1 ? '#7bc470' ://entre 10 y 20\r\n d > 0 ? '#a4cf57' : //entre 0 y 10\r\n d < -0.3 ? '#da203d' : // menos de -30\r\n d < -0.2 ? '#f04e29' : // entre -20 y -30\r\n d < -0.1 ? '#f99d1c' : // entre -10 y - 20\r\n d <= 0 ? '#ffd400' : // entre 0 y -10\r\n '#CCCCCC'; // null o undefined\r\n }\r\n\r\n function getStyle(feature) {\r\n\r\n return {\r\n fillOpacity: 0.9,\r\n color: 'white',\r\n weight: 1.5,\r\n opacity: 0.8,\r\n dashArray: '3'\r\n };\r\n }\r\n\r\n function highlightFeature(e) {\r\n var layer = e.target.feature ? e.target : $(this).data('layer');\r\n self.highlightedLayer = layer;\r\n\r\n self.metadata.entityType = layer.feature.properties.entityType;\r\n if (layer.feature.properties.provincia == undefined) {\r\n self.metadata.title = layer.feature.properties.category + ' - ' + layer.feature.properties.subcategory;\r\n self.metadata.population = layer.feature.properties.TOTAL_VARONES + layer.feature.properties.TOTAL_MUJERES;\r\n self.metadata.houses = layer.feature.properties.TOTAL_VIVIENDAS;\r\n }\r\n else {\r\n self.metadata.title = layer.feature.properties.category;\r\n }\r\n\r\n //console.log(layer.feature.properties); \r\n _.assign(self.metadata, layer.feature.properties);\r\n\r\n layer.setStyle({\r\n weight: 5,\r\n dashArray: '',\r\n fillOpacity: 0.7\r\n });\r\n\r\n if (!L.Browser.ie && !L.Browser.opera) {\r\n layer.bringToFront();\r\n }\r\n\r\n $scope.$apply();\r\n\r\n }\r\n\r\n function resetHighlight(e) {\r\n var layer = e.target.feature ? e.target : $(this).data('layer');\r\n //var layer = e.target;\r\n geojson.resetStyle(layer);\r\n\r\n layer.setStyle({\r\n fillColor: getColor(layer.feature.properties[self.heatType]),\r\n });\r\n }\r\n\r\n function zoomToFeature(e) {\r\n self.isZoomAplied = true;\r\n var layer = e.target.feature ? e.target : $(this).data('layer');\r\n heatMap.fitBounds(layer.getBounds());\r\n loadDepartamentos(layer.feature);\r\n layer.off({ mouseover: highlightFeature });\r\n layer.remove();\r\n }\r\n\r\n function zoomToDepartamento(e) {\r\n var layer = e.target.feature ? e.target : $(this).data('layer');\r\n heatMap.fitBounds(layer.getBounds());\r\n\r\n loadStores(layer.feature);\r\n }\r\n\r\n function loadStores(feature) {\r\n\r\n statesData.subcategories.forEach(function (category) {\r\n\r\n category.subcategories.forEach(function (subcategory) {\r\n\r\n subcategory.subcategories.forEach(function (store) {\r\n\r\n if (store.lat != 0 && store.long != 0 && store.lat != null && store.long != null) {\r\n\r\n if (feature.properties.category.toLowerCase() == category.category.toLowerCase() && feature.properties.subcategory.toLowerCase() == subcategory.subcategory.toLowerCase()) {\r\n //if (feature.properties.category.toLowerCase() == category.category.toLowerCase() && feature.properties.subcategory.toLowerCase() == subcategory.subcategory.toLowerCase()) {\r\n //console.log('showing store',store);\r\n var competitorIcon = L.icon({\r\n iconUrl: 'assets/images/competitors/' + store.icon,\r\n\r\n iconSize: [24, 24], // size of the icon\r\n iconAnchor: [0, 0], // point of the icon which will correspond to marker's location\r\n popupAnchor: [12, 6] // point from which the popup should open relative to the iconAnchor\r\n });\r\n\r\n\r\n var html = ''\r\n + ''\r\n + '
' + '' + store.name + '
' + translations.SALES + '' + $filter('currency')(store.sales, \"$ \", 0)\r\n + ' 0 ? 'text-navy' : 'text-muted')) + '\">'\r\n + $rootScope.toPercentage(store.salesDelta) + ' 0 ? 'fa fa-level-up' : 'fa fa-minus')) + '\">
' + translations.UNITS + '' + $filter('number')(store.units, 0)\r\n + ' 0 ? 'text-navy' : 'text-muted')) + '\">'\r\n + $rootScope.toPercentage(store.unitsDelta) + ' 0 ? 'fa fa-level-up' : 'fa fa-minus')) + '\">
' + translations.MARGIN + '' + $filter('currency')(store.margin, \"$ \", 0)\r\n + ' 0 ? 'text-navy' : 'text-muted')) + '\">'\r\n + $rootScope.toPercentage(store.marginDelta) + ' 0 ? 'fa fa-level-up' : 'fa fa-minus')) + '\">
';\r\n\r\n var marker = L.marker([store.lat, store.long], { icon: competitorIcon }).addTo(heatMap)\r\n .bindPopup(html);\r\n\r\n //marker.valueOf()._icon.style.backgroundColor = getColor(store.marginDelta);\r\n }\r\n }\r\n });\r\n\r\n });\r\n\r\n });\r\n }\r\n\r\n function loadDepartamento(feature, layer) {\r\n\r\n layer.feature.properties.PROVINCIA = layer.feature.properties.PROVINCIA == undefined ? lastProvince : layer.feature.properties.PROVINCIA;\r\n feature.properties.category = layer.feature.properties.PROVINCIA;\r\n feature.properties.subcategory = layer.feature.properties.DEPARTAMTO;\r\n\r\n\r\n var provincias = _.filter(statesData.subcategories, function (o) {\r\n\r\n if (o.category != null)\r\n return o.category.toLowerCase() == feature.properties.category.toLowerCase();\r\n else\r\n return false;\r\n });\r\n var provincia = provincias.length > 0 ? provincias[0] : null;\r\n if (provincia != null) {\r\n var departamentos = _.filter(provincia.subcategories, function (o) {\r\n if (o.subcategory) {\r\n return o.subcategory.toLowerCase() == feature.properties.subcategory.toLowerCase();\r\n }\r\n });\r\n\r\n var data = departamentos.length > 0 ? departamentos[0] : null;\r\n\r\n if (data != null) {\r\n _.assign(feature.properties, data);\r\n _.assign(layer.feature.properties, data);\r\n\r\n } else {\r\n //console.log('emptydata');\r\n _.assign(feature.properties, self.emptyData);\r\n _.assign(layer.feature.properties, self.emptyData);\r\n }\r\n }\r\n\r\n layer.setStyle({\r\n fillColor: getColor(feature.properties[self.heatType])\r\n });\r\n\r\n layer.on({\r\n mouseover: highlightFeature,\r\n mouseout: resetHighlight,\r\n click: zoomToDepartamento\r\n });\r\n //console.log(layer);\r\n layers.push(layer);\r\n\r\n }\r\n\r\n var isDepartamentosLoaded = false;\r\n function loadDepartamentos(feature) {\r\n\r\n lastProvince = feature.properties.provincia;\r\n if (country == \"Peru\") {\r\n if (!isDepartamentosLoaded) {\r\n $http.get('/app/home/heatMap/peru/provincias/departamentos.json').success(function (geoJsonData) {\r\n L.geoJson(geoJsonData, {\r\n onEachFeature: loadDepartamento,\r\n style: getStyle\r\n }).addTo(heatMap);\r\n });\r\n isDepartamentosLoaded = true;\r\n }\r\n }\r\n if (country == \"Colombia\") {\r\n if (!isDepartamentosLoaded) {\r\n $http.get('/app/home/heatMap/colombia/provincias/departamentos.json').success(function (geoJsonData) {\r\n L.geoJson(geoJsonData, {\r\n onEachFeature: loadDepartamento,\r\n style: getStyle\r\n }).addTo(heatMap);\r\n });\r\n isDepartamentosLoaded = true;\r\n }\r\n }\r\n else if (country == \"Argentina\") {\r\n $http.get('/app/home/heatMap/argentina/provincias/' + feature.properties.provincia.toUpperCase() + '.json').success(function (geoJsonData) {\r\n L.geoJson(geoJsonData, {\r\n onEachFeature: loadDepartamento,\r\n style: getStyle\r\n }).addTo(heatMap);\r\n });\r\n }\r\n else if (country == \"Mexico\") {\r\n\r\n for (var i = 1; i <= feature.properties.size; i++) {\r\n\r\n var url = ('00' + feature.properties.index).slice(-2);\r\n //var url = ('00' + \"01\").slice(-2);\r\n url += ('00' + i).slice(-3);\r\n\r\n $http.get('/app/home/heatMap/mexico/provincias/' + url + '.json').success(function (geoJsonData) {\r\n L.geoJson(geoJsonData, {\r\n onEachFeature: loadDepartamento,\r\n style: getStyle\r\n }).addTo(heatMap);\r\n });\r\n }\r\n }\r\n else if (country == \"Chile\") {\r\n $http.get('/app/home/heatMap/chile/provincias/' + feature.properties.provincia.toLowerCase() + '.json').success(function (geoJsonData) {\r\n L.geoJson(geoJsonData, {\r\n onEachFeature: loadDepartamento,\r\n style: getStyle\r\n }).addTo(heatMap);\r\n });\r\n }\r\n }\r\n\r\n var statesData = null;\r\n function loadData() {\r\n homeService.dashboards.getHeatMapByState(self.timeType)\r\n .then(function (data) {\r\n //console.log('data', data);\r\n statesData = data;\r\n\r\n _.assign(self.metadata, data);\r\n\r\n loadProvincias();\r\n });\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n $translate([\"GreaterThan\", \"Between\", \"LessThan\", \"UNITS\", \"SALES\", \"MARGIN\"])\r\n .then(function (all) {\r\n\r\n translations = all;\r\n self.isZoomAplied = false;\r\n homeService.dashboards.getCountry()\r\n .then(function (c) {\r\n country = c;\r\n //country = 'Colombia';\r\n //country = 'Peru';\r\n //country = 'Argentina';\r\n\r\n self.metadata.title = country;\r\n\r\n if (country == \"Peru\") {\r\n heatMap = L.map('heatMap').setView([-8.8822898, -73.7699384], 5); //Perú\r\n self.moneySymbol = '$';\r\n }\r\n if (country == \"Colombia\") {\r\n heatMap = L.map('heatMap').setView([1.8822898, -73.7699384], 5); //Colombia\r\n self.moneySymbol = '$';\r\n }\r\n else if (country == \"Argentina\") {\r\n heatMap = L.map('heatMap').setView([-38.005, -61.0739], 4); //Argentina\r\n self.moneySymbol = '$';\r\n }\r\n else if (country == \"Mexico\") {\r\n heatMap = L.map('heatMap').setView([21.695501, -101.666045], 5); //Mexico\r\n self.moneySymbol = '$';\r\n }\r\n else if (country == \"Chile\") {\r\n heatMap = L.map('heatMap').setView([-33.4718999, -70.9100212], 5); //Chile\r\n self.moneySymbol = '$';\r\n }\r\n L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\r\n attribution: '© OpenStreetMap',\r\n subdomains: ['a', 'b', 'c']\r\n }).addTo(heatMap);\r\n\r\n legend.addTo(heatMap);\r\n\r\n\r\n loadData();\r\n });\r\n });\r\n }\r\n init();\r\n });\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n .controller(\"GoalsCtrl\", function ($scope, homeService, $rootScope, $q, $stateParams) {\r\n var self = this;\r\n var numberColWidth = 130;\r\n\r\n self.sameStores = true;\r\n self.type = $stateParams.type;\r\n self.goals = [];\r\n ////self.categoryGroups = null;\r\n self.selectedCategoryGroup = null;\r\n self.columnDefs = [\r\n {\r\n headerName: \"Información General\", //\"General Information\", \r\n children: [\r\n {\r\n headerName: \"Categoria\", //\"Category / Pricing Zone / Store\",\r\n headerTooltip: \"\",\r\n field: \"hierarchyName\",\r\n width: numberColWidth + 50,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: {\r\n renderer: 'group',\r\n checkbox: false,\r\n innerRenderer: function (params) {\r\n //console.log(params);\r\n if (params.data.children && params.data.children.length > 0)\r\n return '' + params.value + '';\r\n\r\n return params.value;\r\n }\r\n }\r\n //template: ''\r\n },\r\n ],\r\n },\r\n {\r\n headerName: \"Ventas vs Plan\", //\"Sales vs Plan\", \r\n children: [\r\n {\r\n headerName: \"Ventas YTD\", //\"Sales YTD\",\r\n field: \"sales\",\r\n columnGroupShow: 'open',\r\n filter: 'number',\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.bigMoneyRenderer\r\n },\r\n {\r\n headerName: \"Plan YTD\",\r\n headerTooltip: \"\",\r\n field: \"salesGoal\",\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.bigMoneyRenderer\r\n },\r\n {\r\n headerName: \"GAP\",\r\n headerTooltip: \"\",\r\n sort: 'asc',\r\n field: \"salesGoalGap\",\r\n filter: 'number',\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.bigMoneyRenderer,\r\n cellStyle: function (params) { return params.value < 0 ? { color: 'red' } : { color: 'green' }; }\r\n },\r\n {\r\n headerName: \"GAP %\",\r\n headerTooltip: \"\",\r\n field: \"salesGoalGapP\",\r\n filter: 'number',\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererNoDecimals,\r\n cellStyle: function (params) { return params.value < 0 ? { color: 'red' } : { color: 'green' }; }\r\n },\r\n ]\r\n },\r\n {\r\n headerName: \"Margen $ vs Plan\", //\"Margin $ vs Plan\", \r\n children: [\r\n {\r\n headerName: \"Margen $ YTD\", //\"Margin $ YTD\", \r\n field: \"margin\",\r\n columnGroupShow: 'open',\r\n filter: 'number',\r\n width: numberColWidth + 40,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.bigMoneyRenderer\r\n },\r\n {\r\n headerName: \"Plan YTD\",\r\n headerTooltip: \"\",\r\n field: \"marginGoal\",\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.bigMoneyRenderer\r\n },\r\n {\r\n headerName: \"GAP\",\r\n headerTooltip: \"\",\r\n field: \"marginGoalGap\",\r\n filter: 'number',\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.bigMoneyRenderer,\r\n cellStyle: function (params) { return params.value < 0 ? { color: 'red' } : { color: 'green' }; }\r\n },\r\n {\r\n headerName: \"GAP %\",\r\n headerTooltip: \"\",\r\n field: \"marginGoalGapP\",\r\n filter: 'number',\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererNoDecimals,\r\n cellStyle: function (params) { return params.value < 0 ? { color: 'red' } : { color: 'green' }; }\r\n },\r\n ]\r\n },\r\n {\r\n headerName: \"Unidades vs Plan\", //\"Units vs Plan\", \r\n children: [\r\n {\r\n headerName: \"Unidades YTD\", //\"Units YTD\", \r\n field: \"units\",\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n width: numberColWidth + 20,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.bigIntRenderer\r\n },\r\n {\r\n headerName: \"Plan YTD\",\r\n headerTooltip: \"\",\r\n field: \"unitsGoal\",\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.bigIntRenderer\r\n },\r\n {\r\n headerName: \"GAP\",\r\n headerTooltip: \"\",\r\n field: \"unitsGoalGap\",\r\n filter: 'number',\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.bigIntRenderer,\r\n cellStyle: function (params) { return params.value < 0 ? { color: 'red' } : { color: 'green' }; }\r\n },\r\n {\r\n headerName: \"GAP %\",\r\n headerTooltip: \"\",\r\n field: \"unitsGoalGapP\",\r\n filter: 'number',\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererNoDecimals,\r\n cellStyle: function (params) { return params.value < 0 ? { color: 'red' } : { color: 'green' }; }\r\n },\r\n ]\r\n },\r\n //{\r\n // headerName: \"Costos vs Plan\",\r\n // children: [\r\n // {\r\n // headerName: \"Costos YTD\",\r\n // headerTooltip: \"\",\r\n // field: \"cost\",\r\n // filter: 'number',\r\n // width: numberColWidth,\r\n // cellClass: $rootScope.getClassForCell,\r\n // cellRenderer: $rootScope.bigMoneyRenderer\r\n // },\r\n // {\r\n // headerName: \"Plan YTD\",\r\n // headerTooltip: \"\",\r\n // field: \"costGoal\",\r\n // filter: 'number',\r\n // width: numberColWidth,\r\n // columnGroupShow: 'open',\r\n // cellClass: $rootScope.getClassForCell,\r\n // cellRenderer: $rootScope.bigMoneyRenderer\r\n // },\r\n // {\r\n // headerName: \"GAP\",\r\n // headerTooltip: \"\",\r\n // field: \"costGoalGap\",\r\n // filter: 'number',\r\n // width: numberColWidth,\r\n // columnGroupShow: 'open',\r\n // cellClass: $rootScope.getClassForCell,\r\n // cellRenderer: $rootScope.bigMoneyRenderer,\r\n // cellStyle: function (params) { return params.value < 0 ? { color: 'red' } : { color: 'green' }; }\r\n // },\r\n // {\r\n // headerName: \"GAP %\",\r\n // headerTooltip: \"\",\r\n // field: \"costGoalGapP\",\r\n // filter: 'number',\r\n // width: numberColWidth,\r\n // cellClass: $rootScope.getClassForCell,\r\n // cellRenderer: $rootScope.percentageRendererNoDecimals,\r\n // cellStyle: function (params) { return params.value < 0 ? { color: 'red' } : { color: 'green' }; }\r\n // },\r\n // ]\r\n //},\r\n ]\r\n\r\n self.gridOptions = {\r\n columnDefs: self.columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: true,\r\n groupHideGroupColumns: true,\r\n groupUseEntireRow: false,\r\n groupSelectsChildren: true,\r\n rowHeight: 30,\r\n rowSelection: \"multiple\",\r\n rowDeselection: true,\r\n showToolPanel: false,// window.innerWidth > 1500,\r\n suppressRowClickSelection: true,\r\n suppressCellSelection: true,\r\n singleClickEdit: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n suppressColumnMoveAnimation: $rootScope.suppressColumnMoveAnimation(),\r\n enableRangeSelection: false,\r\n angularCompileRows: true,\r\n isExternalFilterPresent: isExternalFilterPresent,\r\n doesExternalFilterPass: doesExternalFilterPass,\r\n getNodeChildDetails: getNodeChildDetails,\r\n rowGroupOpened: rowGroupOpened\r\n\r\n }\r\n\r\n function getNodeChildDetails(rowItem) {\r\n //console.log(rowItem);\r\n if (rowItem.children && rowItem.children.length > 0) {\r\n return {\r\n group: true,\r\n expanded: false,\r\n // provide ag-Grid with the children of this group\r\n children: rowItem.children,\r\n // the key is used by the default group cellRenderer\r\n key: rowItem.hierarchyId\r\n };\r\n }\r\n\r\n //else if (rowItem.level == 4) {\r\n // var deferred = $q.defer();\r\n\r\n // homeService.goals.getPriceListsByCategory(rowItem.hierarchyId).then(function (data) {\r\n // deferred.resolve({\r\n // group: true,\r\n // expanded: false,\r\n // // provide ag-Grid with the children of this group\r\n // children: data,\r\n // // the key is used by the default group cellRenderer\r\n // key: rowItem.hierarchyId\r\n // });\r\n // });\r\n\r\n // return deferred.promise;\r\n //}\r\n\r\n return null;\r\n }\r\n\r\n function rowGroupOpened(rowItem) {\r\n //console.log('rowGroupOpened');\r\n //console.log(rowItem);\r\n }\r\n\r\n self.filterByCategoryGroup = function () {\r\n self.gridOptions.api.onFilterChanged();\r\n }\r\n\r\n function isExternalFilterPresent() {\r\n return self.selectedCategoryGroup != null;\r\n }\r\n\r\n function doesExternalFilterPass(node) {\r\n return node.data.categoryGroupId == self.selectedCategoryGroup.id;\r\n }\r\n\r\n self.selectedPath = '';\r\n\r\n self.changeCategory = function (cat) {\r\n console.log('cat', cat);\r\n self.selectedPath = cat;\r\n self.updateChart(varName, false);\r\n }\r\n\r\n var varName, varGoalName = null;\r\n self.updateChart = function (varNameP, isFirstLoad) {\r\n var v1 = varNameP;\r\n var v2 = varNameP + 'Goal';\r\n\r\n if (isFirstLoad) {\r\n renderGoalChart(v1, v2);\r\n }\r\n else {\r\n\r\n var data = {\r\n unload: [varName, varGoalName],\r\n json: getFilteredData(),\r\n keys: {\r\n x: 'hierarchyName',\r\n value: [v1, v2],\r\n },\r\n type: 'bar',\r\n };\r\n\r\n data.types = {};\r\n data.types[v2] = \"spline\";\r\n\r\n self.chart.load(data);\r\n\r\n }\r\n\r\n varName = v1;\r\n varGoalName = v2;\r\n }\r\n\r\n function renderGoalChart(varName, varGoalName) {\r\n\r\n var template = {\r\n bindto: '#goalschart',\r\n data: {\r\n json: getFilteredData(),\r\n keys: {\r\n x: 'hierarchyName',\r\n value: [varName, varGoalName],\r\n },\r\n type: 'bar',\r\n },\r\n axis: {\r\n x: {\r\n type: 'category'\r\n },\r\n y: {\r\n tick: {\r\n format: d3.format(\",.0f\")\r\n }\r\n }\r\n\r\n }\r\n };\r\n\r\n template.data.types = {};\r\n template.data.types[varGoalName] = 'spline';\r\n\r\n self.chart = c3.generate(template);\r\n }\r\n\r\n function getGoals(goals, callback) {\r\n\r\n _.each(goals, function (goal) {\r\n //console.log('goal == self.selectedPath', goal.path + ' === ' + self.selectedPath);\r\n if (goal.path == self.selectedPath) {\r\n callback(goal)\r\n return;\r\n }\r\n\r\n if (goal.children && goal.children.length > 0)\r\n getGoals(goal.children, callback);\r\n })\r\n\r\n }\r\n\r\n function getFilteredData() {\r\n var rv = [];\r\n //console.log('self.goals', self.goals);\r\n\r\n //console.log('selectedcategory', self.selectedPath); \r\n getGoals(self.goals, function (goal) {\r\n //console.log('goal to add', goal);\r\n rv.push(goal);\r\n })\r\n console.log('parsedData', rv);\r\n return rv;\r\n }\r\n\r\n $scope.$watch('ct.sameStores', function (newVal, oldVar) {\r\n //console.log('newval', newVal);\r\n loadGoals(newVal);\r\n });\r\n\r\n function setPath(goals) {\r\n //La version comentada arriba es mucho mas simple y funciona para N niveles de children, pero al ser\r\n //recursiva y trabajar con mas de 35k de registros tarda mucho.\r\n //Esta version, si bien es limitada, es mucho mas rapida.\r\n //Solo trabaja con 5 niveles de Children\r\n\r\n angular.forEach(goals, function (goal1) {\r\n goal1.path = \"\";\r\n angular.forEach(goal1.children, function (goal2) {\r\n goal2.path = goal1.path + \"/\" + goal1.hierarchyName;\r\n angular.forEach(goal2.children, function (goal3) {\r\n goal3.path = goal2.path + \"/\" + goal2.hierarchyName;\r\n angular.forEach(goal3.children, function (goal4) {\r\n goal4.path = goal3.path + \"/\" + goal3.hierarchyName;\r\n angular.forEach(goal4.children, function (goal5) {\r\n goal5.path = goal4.path + \"/\" + goal4.hierarchyName;\r\n\r\n })\r\n })\r\n })\r\n })\r\n })\r\n }\r\n\r\n function setGap(goal) {\r\n goal.costGoalGap = goal.cost - goal.costGoal;\r\n goal.unitsGoalGap = goal.units - goal.unitsGoal;\r\n goal.salesGoalGap = goal.sales - goal.salesGoal;\r\n goal.marginGoalGap = goal.margin - goal.marginGoal;\r\n goal.costGoalGapP = goal.costGoal ? (goal.cost / goal.costGoal) - 1 : null;\r\n goal.unitsGoalGapP = goal.unitsGoal ? (goal.units / goal.unitsGoal) - 1 : null;\r\n goal.salesGoalGapP = goal.salesGoal ? (goal.sales / goal.salesGoal) - 1 : null;\r\n goal.marginGoalGapP = goal.marginGoal ? (goal.margin / goal.marginGoal) - 1 : null;\r\n\r\n\r\n }\r\n\r\n function setGaps(goals) {\r\n if (!goals) return;\r\n angular.forEach(goals, function (goal) {\r\n setGap(goal);\r\n setGaps(goal.children);\r\n });\r\n }\r\n\r\n function loadGoals(withSameStores) {\r\n if (self.type == 'category') {\r\n homeService.goals.getGoalsByCategory(withSameStores)\r\n .then(function (dtos) {\r\n setPath(dtos);\r\n setGaps(dtos);\r\n console.log('data', dtos);\r\n\r\n self.goals = dtos;\r\n\r\n self.gridOptions.api.setRowData(self.goals);\r\n\r\n self.updateChart('sales', true);\r\n });\r\n }\r\n\r\n if (self.type == 'store') {\r\n homeService.goals.getGoalsByStore(withSameStores)\r\n .then(function (dtos) {\r\n setPath(dtos);\r\n setGaps(dtos);\r\n\r\n console.log('data', dtos);\r\n\r\n self.goals = dtos;\r\n\r\n self.gridOptions.api.setRowData(self.goals);\r\n\r\n self.updateChart('sales', true);\r\n });\r\n }\r\n }\r\n\r\n function init() {\r\n\r\n //loadGoals(true);\r\n\r\n\r\n }\r\n\r\n init();\r\n });\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n .controller(\"DeviationsCtrl\", function ($scope, $timeout) {\r\n var self = this;\r\n self.section = \"Inicio\";\r\n self.name = \"Analisis de Desvios\";\r\n });\r\n","\r\nangular.module(\"prisma\")\r\n .controller(\"DstCtrl\", function ($scope, $rootScope, $timeout, $translate, $interval, $stateParams, serverService, homeService, adminService) {\r\n var self = this;\r\n\r\n //TRADUCCIONES JS\r\n self.sameStores = true;\r\n self.type = $stateParams.type;\r\n //console.log('self.type', self.type);\r\n self.toTitleCase = $rootScope.toTitleCase;\r\n\r\n self.dstRunning = false;\r\n self.dstInited = false;\r\n self.selectedCategoryGroup = null;\r\n self.allCategoryGroups = null;\r\n self.states = null;\r\n //api\r\n var root = {};\r\n\r\n var destroyed = false;\r\n\r\n var translations = null;\r\n $translate([\"SALES\", \"UNITS\", \"MARGIN\", \"IsThe\", \"Store\", \"Category\", \"WithGreatestIncrease\", \"WithGreatestDecrease\", \"DstPopUpInformativeGraphic\", \"Family\", \"SelectFamily\", \"DstPopUpInformativeGraphicLess\"])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n\r\n self.getValueText = function () {\r\n if (self.sizeType == 'units')\r\n return translations.UNITS;\r\n\r\n if (self.sizeType == 'sales')\r\n return translations.SALES;\r\n\r\n if (self.sizeType == 'margin')\r\n return translations.MARGIN;\r\n }\r\n\r\n\r\n self.disableStart = function () {\r\n if (self.type == 'category') {\r\n return self.selectedCategoryGroup == null || self.dstRunning;\r\n }\r\n\r\n if (self.type == 'store') {\r\n return self.dstRunning;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n //Chart Class\r\n var Chart;\r\n\r\n Chart = function (data) {\r\n\r\n var that = this;\r\n\r\n /* STATE */\r\n\r\n this.data = data;\r\n this.width = 970;\r\n this.height = 1200;\r\n this.center = {\r\n x: that.width / 2,\r\n y: that.height / 2\r\n };\r\n this.centersBySalesDiff = [ //center 425\r\n { y: 450 },\r\n { y: 440 },\r\n { y: 430 },\r\n { y: 420 },\r\n { y: 410 },\r\n { y: 400 }\r\n ]\r\n this.dGravity = 0.1;\r\n this.damper = 1;\r\n this.dFriction = 0.9;\r\n this.svg = null;\r\n this.force = null;\r\n this.circles = null;\r\n this.nodes = [];\r\n this.changeTickValues = [-0.25, -0.15, -0.05, 0.05, 0.15, 0.25];\r\n this.tickChangeFormat = d3.format(\"+%\");\r\n this.groupby = \"category\";\r\n this.scaleRadius = d3.scale.pow().exponent(0.5).domain([0, 10000]).range([0.3, 55]);\r\n this.scaleChange = d3.scale.linear().domain([-0.28, 0.28]).range([680, 240]).clamp(true);\r\n this.scaleGroup = d3.scale.ordinal().rangePoints([0, 1]);\r\n this.scaleFillColor = d3.scale.ordinal().domain([-3, -2, -1, 0, 1, 2, 3]).range([\"#d84b2a\", \"#ee9586\", \"#e4b7b2\", \"#AAA\", \"#beccae\", \"#9caf84\", \"#7aa25c\"]);\r\n this.scaleStrokeColor = d3.scale.ordinal().domain([-3, -2, -1, 0, 1, 2, 3]).range([\"#c72d0a\", \"#e67761\", \"#d9a097\", \"#999\", \"#a7bb8f\", \"#7e965d\", \"#5a8731\"]);\r\n this.currentLayout = null;\r\n this.currentStep = 0;\r\n this.runningStory = true;\r\n this.highestSubcategoryId = 0;\r\n this.lowestSubcategoryId = 0;\r\n\r\n /* METHODS */\r\n\r\n this.init = function () {\r\n\r\n\r\n //Scale bubbles by sales [DB]\r\n var maxSales = d3.max(that.data, function (d) { return d[self.sizeType]; });\r\n that.scaleRadius = that.scaleRadius.domain([0, maxSales]);\r\n\r\n //Scale groups add domain\r\n var allGroups = that.data.map(function (e, i) { return e.category });\r\n var groups = [allGroups[0]];\r\n for (var i = 0; i < allGroups.length; i++) {\r\n var cur = allGroups[i];\r\n if (groups.indexOf(cur) < 0) {\r\n groups.push(cur);\r\n }\r\n }\r\n that.scaleGroup.domain(groups);\r\n\r\n\r\n //create nodes\r\n that.createNodes();\r\n\r\n //scale category\r\n groups.forEach(function (g, i) {\r\n var groupSales = that.nodes.reduce(function (a, b) {\r\n\r\n if (isNaN(a)) {\r\n return (a.original.category == g) ? a.original[self.sizeType] : 0\r\n + (b.original.category == g) ? b.original[self.sizeType] : 0;\r\n }\r\n else {\r\n return a + (b.original.category == g) ? b.original[self.sizeType] : 0;\r\n }\r\n\r\n });\r\n });\r\n\r\n //init chart\r\n that.createVis();\r\n\r\n //set force\r\n that.force = d3.layout\r\n .force()\r\n .nodes(that.nodes)\r\n .size([that.width, that.height]);\r\n }\r\n\r\n this.createNodes = function () {\r\n\r\n var max = 0;\r\n var min = 0;\r\n\r\n that.data.forEach(function (d, i) {\r\n\r\n if (d[self.sizeType + 'DeltaPercentage'] < min) {\r\n min = d[self.sizeType + 'DeltaPercentage'];\r\n that.lowestSubcategoryId = d.subcategoryId;\r\n }\r\n\r\n if (d[self.sizeType + 'DeltaPercentage'] > max) {\r\n max = d[self.sizeType + 'DeltaPercentage'];\r\n that.highestSubcategoryId = d.subcategoryId;\r\n }\r\n\r\n var hMultiplier = (that.height / that.changeTickValues.length);\r\n\r\n var node = {\r\n id: i,\r\n original: d,\r\n radius: that.scaleRadius(d[self.sizeType]),\r\n value: d[self.sizeType],\r\n isNegative: (d[self.sizeType] < 0),\r\n changeCategory: that.categorizeChange(d[self.colorType + 'DeltaPercentage']),\r\n changeCategorySize: that.categorizeChange(d[self.sizeType + 'DeltaPercentage']),\r\n x: that.center.x,\r\n y: -(this.changeCategorySize * hMultiplier)\r\n };\r\n\r\n that.nodes.push(node);\r\n });\r\n\r\n //sort the nodes\r\n that.nodes.sort(function (a, b) {\r\n return Math.abs(b[self.sizeType]) - Math.abs(a[self.sizeType]);\r\n });\r\n\r\n }\r\n\r\n this.createVis = function () {\r\n\r\n /*MAIN CHART*/\r\n\r\n //svg\r\n that.svg = d3.select(\"#vis\").append(\"svg\")\r\n .attr(\"width\", that.width)\r\n .attr(\"height\", that.height)\r\n .attr(\"id\", \"svg_vis\");\r\n\r\n\r\n /*OVERLAYS*/\r\n\r\n // total overlay\r\n d3.select(\"#deficitCircle circle\").remove();\r\n d3.select(\"#deficitCircle\").append(\"circle\")\r\n .attr('r', that.scaleRadius(2000000))\r\n .attr('class', \"deficitCircle\")\r\n .attr('cx', 125)\r\n .attr('cy', 125);\r\n d3.selectAll(\"#scaleKey circle\").remove()\r\n d3.select(\"#scaleKey\").append(\"circle\")\r\n //.attr('r', that.scaleRadius(800000))\r\n .attr('r', 40.22)\r\n .attr('class', \"scaleKeyCircle\")\r\n .attr('cx', 45)\r\n .attr('cy', 45);\r\n d3.select(\"#scaleKey\").append(\"circle\")\r\n //.attr('r', that.scaleRadius(100000))\r\n .attr('r', 14.41)\r\n .attr('class', \"scaleKeyCircle\")\r\n .attr('cx', 45)\r\n .attr('cy', 70);\r\n d3.select(\"#scaleKey\").append(\"circle\")\r\n //.attr('r', that.scaleRadius(10000))\r\n .attr('r', 4.76)\r\n .attr('class', \"scaleKeyCircle\")\r\n .attr('cx', 45)\r\n .attr('cy', 80);\r\n\r\n\r\n //changes overlay\r\n for (var i = 0; i < this.changeTickValues.length; i++) {\r\n d3.select(\"#changeOverlay\").append(\"div\")\r\n .html(\"

\" + this.tickChangeFormat(this.changeTickValues[i]) + \"

\")\r\n .style(\"top\", this.scaleChange(this.changeTickValues[i]) + 'px')\r\n .classed('discretionaryTick', true)\r\n .classed('discretionaryZeroTick', (this.changeTickValues[i] === 0))\r\n };\r\n d3.select(\"#changeOverlay\").append(\"div\")\r\n .html(\"

\")\r\n .style(\"top\", this.scaleChange(0) + 'px')\r\n .classed('discretionaryTick', true)\r\n .classed('discretionaryZeroTick', true)\r\n d3.select(\"#changeOverlay\").append(\"div\")\r\n .html(\"

+26% or higher

\")\r\n .style(\"top\", this.scaleChange(100) + 'px')\r\n .classed('discretionaryTickLabel', true)\r\n d3.select(\"#changeOverlay\").append(\"div\")\r\n .html(\"

−26% or lower

\")\r\n .style(\"top\", this.scaleChange(-100) + 'px')\r\n .classed('discretionaryTickLabel', true)\r\n\r\n //category overlays\r\n d3.select(\"#finishDialog #btnOk\").on(\"click\", that.finishStory);\r\n }\r\n\r\n this.labels = function (centers) {\r\n d3.selectAll(\".bb_label\").remove();\r\n\r\n if (!destroyed) {\r\n\r\n //HACK: con esto evito que saltee el primer item del array. No se que genera este comportamiento [DB]\r\n var data = centers;\r\n data.unshift({});\r\n\r\n //append as div\r\n d3.select(\"#vis\")\r\n .data(data).enter().append(\"div\")\r\n .text(function (d) { return d.name })\r\n .attr(\"class\", \"bb_label cat\")\r\n .attr(\"data-props\", function (d) { return d.h + \"h, \" + d.w + \"w, \" + d.x + \"x, \" + d.y + \"y\" })\r\n .style(\"width\", function (d) { return d.w + \"px\" })\r\n .style(\"top\", function (d) {\r\n return Math.floor((d.y - (d.h / 2)) - 130) + 230 + \"px\";\r\n })\r\n .style(\"left\", function (d) {\r\n return d.x - (d.w / 2) + 260 + \"px\";\r\n })\r\n .append(\"div\")\r\n .attr(\"class\", \"bb_label total\")\r\n .style(\"width\", function (d) { return d.w + \"px\" })\r\n .text(function (d) { return \"$ \" + ian.abbreviateNumber(d.total, 1) })\r\n\r\n }\r\n\r\n }\r\n\r\n this.clearLayout = function () {\r\n\r\n //remove all labels\r\n d3.selectAll(\".bb_label\").remove();\r\n\r\n //hide all overlays\r\n d3.selectAll('.overlay').style('display', 'none').style('opacity', 0);\r\n\r\n\r\n }\r\n\r\n this.getCenters = function (vname, size) {\r\n\r\n //group and sort\r\n var data = [];\r\n //var nodes = _.pluck(that.nodes, 'original');\r\n var nodes = _.map(that.nodes, 'original');\r\n nodes = _.groupBy(nodes, function (d) { return d[that.groupby]; });\r\n for (var name in nodes) {\r\n var group = nodes[name];\r\n data.push({\r\n name: name,\r\n items: group,\r\n total: _.reduce(group, function (memo, num) { return memo + num[self.sizeType]; }, 0)\r\n })\r\n }\r\n data = _.sortBy(data, 'total').reverse();\r\n\r\n //corrections\r\n var xt = 0;\r\n var yt = 510;\r\n\r\n var rows = [{ cols: 4, h: 210, y: 0 },\r\n { cols: 6, h: 150, y: 250 },\r\n { cols: 8, h: 150, y: 470 },\r\n { cols: 9, h: 100, y: 620 }, //580\r\n { cols: 9, h: 100, y: 730 },\r\n { cols: 9, h: 100, y: 820 },\r\n { cols: 9, h: 100, y: 920 }];\r\n\r\n var i = 0;\r\n for (var r = 0; r < rows.length; r++) {\r\n var row = rows[r];\r\n for (var c = 0; c < row.cols; c++) {\r\n if (i < data.length) {\r\n var d = data[i];\r\n var w = Math.floor(size[0] / row.cols);\r\n var h = row.h;\r\n var x = ((w * (c + 1)) - (w / 2));\r\n var y = row.y;\r\n\r\n d.w = w;\r\n d.h = h;\r\n d.x = x + xt;\r\n d.y = y + yt;\r\n\r\n i++;\r\n }\r\n }\r\n }\r\n\r\n return data;\r\n }\r\n\r\n this.show_details = function (data, i) {\r\n\r\n var el = d3.select(this)\r\n .style(\"stroke-width\", 2)\r\n .style(\"stroke\", \"black\");\r\n\r\n var title = data.original.category;\r\n var name = data.original.subcategory;\r\n var sales = ian.abbreviateNumber(data.original[self.sizeType], 1);\r\n var diff = Math.round(data.original[self.sizeType + 'DeltaPercentage'] * 100);\r\n\r\n var xpos = Number(el.attr('cx')) + 7;\r\n var ypos = (el.attr('cy') - data.radius - 85);\r\n\r\n d3.select(\"#details\").style('top', ypos + \"px\").style('left', xpos + \"px\")\r\n .style('display', 'block')\r\n .classed('plus', (data.original[self.sizeType + 'DeltaPercentage'] > 0))\r\n .classed('minus', (data.original[self.sizeType + 'DeltaPercentage'] < 0));\r\n d3.select(\"#details .name\").html(name);\r\n d3.select(\"#details .title\").text(title);\r\n d3.select(\"#details .value\").html((self.sizeType == 'units' ? '' : '$') + sales);\r\n d3.select(\"#details .change\").html(diff > 0 ? (\"+\" + diff + \"%\") : (diff + \"%\"));\r\n\r\n }\r\n\r\n this.hide_details = function (data, i) {\r\n d3.select(this)\r\n .style(\"stroke-width\", 1)\r\n .style(\"stroke\", that.getStrokeColor);\r\n\r\n d3.select(\"#details\").style('display', 'none');\r\n }\r\n\r\n this.getFillColor = function (d) {\r\n return that.scaleFillColor(d.changeCategory);\r\n }\r\n\r\n this.getStrokeColor = function (d) {\r\n return that.scaleStrokeColor(d.changeCategory);\r\n }\r\n\r\n this.categorizeChange = function (c) {\r\n if (isNaN(c)) {\r\n return 0;\r\n } else if (c < -0.25) {\r\n return -3;\r\n } else if (c < -0.05) {\r\n return -2;\r\n } else if (c < -0.001) {\r\n return -1;\r\n } else if (c <= 0.001) {\r\n return 0;\r\n } else if (c <= 0.05) {\r\n return 1;\r\n } else if (c <= 0.25) {\r\n return 2;\r\n } else { return 3; }\r\n }\r\n\r\n this.makeInteractive = function () {\r\n //activate tabs\r\n d3.selectAll('.navigation li').on('click', root.onLayoutChange);\r\n\r\n //activate tooltips\r\n that.circles\r\n .on(\"mouseover\", that.show_details)\r\n .on(\"mouseout\", that.hide_details);\r\n }\r\n\r\n that.removeLabels = function () {\r\n d3.selectAll(\".bb_label\").remove();\r\n }\r\n\r\n\r\n /* STORY SEQUENCE */\r\n\r\n this.beginStoryOrig = function () {\r\n\r\n var delay = 100 //modify to change delay [DB]\r\n\r\n //total layout\r\n window.setTimeout(function () { that.next(1000) }, delay * 0); //overview \r\n window.setTimeout(function () { that.next(1000) }, delay * 1); //create bubbles\r\n window.setTimeout(function () { that.next(2000) }, delay * 2); //size legend\r\n window.setTimeout(function () { that.next(2000) }, delay * 3); //resize bubbles\r\n window.setTimeout(function () { that.next(2000) }, delay * 4); //color legend\r\n window.setTimeout(function () { that.next(2000) }, delay * 5); //paint bubbles\r\n window.setTimeout(function () { that.next(1000) }, delay * 7); //goto change layout\r\n\r\n //changes layout\r\n window.setTimeout(function () { that.next(1000) }, delay * 10); //highlight best\r\n window.setTimeout(function () { that.next(1000) }, delay * 14); //highlight worst\r\n window.setTimeout(function () { that.next(1000) }, delay * 19); //goto category layout\r\n\r\n\r\n //category layout\r\n window.setTimeout(function () { that.next(1000) }, delay * 22); //show final dialog\r\n }\r\n\r\n this.beginStory = function () {\r\n\r\n var duration = 1800; //modify to change speed [DB] 1800\r\n var delay = duration;\r\n\r\n\r\n //total layout\r\n window.setTimeout(function () { that.next(duration) }, delay * 0); //overview \r\n window.setTimeout(function () { that.next(duration) }, delay * 1); //create bubbles\r\n window.setTimeout(function () { that.next(duration) }, delay * 2); //size legend\r\n window.setTimeout(function () { that.next(duration) }, delay * 3); //resize bubbles\r\n window.setTimeout(function () { that.next(duration) }, delay * 4); //color legend\r\n window.setTimeout(function () { that.next(duration) }, delay * 5); //paint bubbles\r\n window.setTimeout(function () { that.next(duration) }, delay * 7); //goto change layout\r\n\r\n //changes layout\r\n window.setTimeout(function () { that.next(duration) }, delay * 10); //highlight best\r\n window.setTimeout(function () { that.next(duration) }, delay * 14); //highlight worst\r\n window.setTimeout(function () { that.next(duration) }, delay * 19); //goto category layout\r\n\r\n\r\n //category layout\r\n window.setTimeout(function () { that.next(1000) }, delay * 22); //show final dialog\r\n }\r\n\r\n this.finishStory = function () {\r\n\r\n //animate final dialog exit\r\n d3.select(\"#finishDialog\")\r\n .transition()\r\n .duration(1000)\r\n .style('top', \"-500px\");\r\n\r\n //hide all tooltips\r\n window.setTimeout(function () {\r\n d3.selectAll(\".tooltip\").style(\"display\", \"none\");\r\n }, 2500);\r\n\r\n //enable user interaction\r\n that.makeInteractive();\r\n\r\n //mark story as finished\r\n that.runningStory = false;\r\n $scope.$apply(function () {\r\n self.dstRunning = false;\r\n });\r\n\r\n\r\n }\r\n\r\n this.next = function (duration) {\r\n\r\n that.currentStep++\r\n if (that.currentLayout == \"total\") {\r\n switch (that.currentStep) {\r\n case 1: that.showOverview(duration); break;\r\n case 2: that.createBubbles(duration); break;\r\n case 3: that.showSizeLegend(duration); break;\r\n case 4: that.resizeBubbles(duration); break;\r\n case 5: that.showColourLegend(duration); break;\r\n case 6: that.colourBubbles(duration); break;\r\n case 7: that.displayLayoutChange(duration); break;\r\n }\r\n }\r\n if (that.currentLayout == \"change\") {\r\n switch (that.currentStep) {\r\n case 1: that.highlightBest(duration); break;\r\n case 2: that.highlightWorst(duration); break;\r\n case 3: {\r\n that.clearChangesEffects(duration, that.displayLayoutCategory);\r\n break;\r\n }\r\n }\r\n }\r\n if (that.currentLayout == \"category\") {\r\n switch (that.currentStep) {\r\n case 1: that.showFinishDialog(duration); break;\r\n }\r\n }\r\n }\r\n\r\n\r\n //total story\r\n this.showOverview = function (duration) {\r\n d3.select('#totalOverlay .overview')\r\n .transition(duration)\r\n .style('opacity', 1);\r\n }\r\n\r\n this.showSizeLegend = function (duration) {\r\n d3.select('#totalOverlay .size-ref')\r\n .transition(duration)\r\n .style('opacity', 1);\r\n }\r\n\r\n this.showColourLegend = function (duration) {\r\n d3.select('#totalOverlay .color-ref')\r\n .transition(duration)\r\n .style('opacity', 1);\r\n }\r\n\r\n this.createBubbles = function (duration) {\r\n\r\n that.circles = that.svg.selectAll(\"circle\")\r\n .data(that.nodes, function (d) { return d.id; });\r\n that.circles.enter()\r\n .append(\"circle\")\r\n .attr(\"r\", 15)\r\n .attr(\"stroke\", \"#ccc\")\r\n .style(\"fill\", \"#555\")\r\n .attr(\"stroke-width\", 1)\r\n .attr(\"id\", function (d) { return \"bubble_\" + d.id; });\r\n\r\n that.force\r\n .gravity(-0.01)\r\n .charge(that.defaultCharge)\r\n .friction(0.9)\r\n .on(\"tick\", function (e) {\r\n that.circles\r\n .each(that.sortForLayoutAll(e.alpha))\r\n .each(that.buoyancy(e.alpha * 1.45))\r\n .attr(\"cx\", function (d) { return d.x; })\r\n .attr(\"cy\", function (d) { return d.y; });\r\n })\r\n .start();\r\n }\r\n\r\n this.resizeBubbles = function (duration) {\r\n\r\n that.circles\r\n .transition()\r\n .duration(duration)\r\n .attr(\"r\", function (d) { return d.radius; });\r\n }\r\n\r\n this.colourBubbles = function (duration) {\r\n that.circles\r\n .transition()\r\n .duration(duration)\r\n .attr(\"stroke\", that.getStrokeColor)\r\n .style(\"fill\", that.getFillColor)\r\n }\r\n\r\n //changes story\r\n this.highlightBest = function (duration) {\r\n that.circles\r\n .transition()\r\n .duration(duration)\r\n .style(\"opacity\", function (d) {\r\n if (d.original.subcategoryId == that.highestSubcategoryId) {\r\n\r\n var number = ian.abbreviateNumber(Math.abs(d.original[self.sizeType + 'Delta']), 1);\r\n if (number > 0 && number < 1)\r\n number = parseFloat(number).toPrecision(4);\r\n var text = d.original.subcategory + translations.IsThe + (self.type == 'store' ? translations.Store : translations.Category) + translations.WithGreatestIncrease + \" (\" + $rootScope.toPercentage(number) + \")\" + translations.DstPopUpInformativeGraphic;\r\n that.showCustomTooltip(text, this, duration);\r\n\r\n return 1;\r\n }\r\n else {\r\n return .2;\r\n }\r\n })\r\n .style(\"stroke-width\", function (d) { return d.original.subcategoryId == that.highestSubcategoryId ? 2 : 1; })\r\n .style(\"stroke\", function (d) { if (d.original.subcategoryId == that.highestSubcategoryId) return \"black\"; })\r\n\r\n that.circles\r\n .transition()\r\n .delay(11000)\r\n .duration(1000)\r\n .style(\"opacity\", 1)\r\n .style(\"stroke-width\", 1)\r\n .style(\"stroke\", that.getStrokeColor);\r\n\r\n d3.select(\"#customTooltip\")\r\n .transition()\r\n .delay(11000)\r\n .duration(1000)\r\n .style(\"opacity\", 0);\r\n\r\n }\r\n\r\n this.highlightWorst = function (duration) {\r\n that.circles\r\n .transition()\r\n .duration(duration)\r\n .style(\"opacity\", function (d) {\r\n if (d.original.subcategoryId == that.lowestSubcategoryId) {\r\n\r\n var number = ian.abbreviateNumber(Math.abs(d.original[self.sizeType + 'Delta']), 1);\r\n if (number > 0 && number < 1)\r\n number = parseFloat(number).toPrecision(4);\r\n var text = d.original.subcategory + translations.IsThe + (self.type == 'store' ? translations.Store : translations.Category) + translations.WithGreatestDecrease + \" (\" + $rootScope.toPercentage(number) + \")\" + translations.DstPopUpInformativeGraphicLess;\r\n that.showCustomTooltip(text, this, duration);\r\n return 1;\r\n }\r\n else {\r\n return .2;\r\n }\r\n })\r\n .style(\"stroke-width\", function (d) { return d.original.subcategoryId == that.lowestSubcategoryId ? 2 : 1; })\r\n .style(\"stroke\", function (d) { if (d.original.subcategoryId == that.lowestSubcategoryId) return \"black\"; });\r\n\r\n\r\n that.circles\r\n .transition()\r\n .delay(10500)\r\n .duration(1000)\r\n .style(\"opacity\", 1)\r\n .style(\"stroke-width\", 1)\r\n .style(\"stroke\", that.getStrokeColor);\r\n\r\n\r\n d3.select(\"#customTooltip\")\r\n .transition()\r\n .delay(10500)\r\n .duration(1000)\r\n .style(\"opacity\", 0);\r\n\r\n }\r\n\r\n this.showCustomTooltip = function (text, elem, duration) {\r\n\r\n var el = d3.select(elem);\r\n var xpos = Number(el.attr('cx'))\r\n var ypos = Number(el.attr('cy'))\r\n //var ypos = (el.attr('cy') - elem.__data__.radius - 100)\r\n\r\n d3.select(\"#customTooltip .title\").html(text);\r\n d3.select(\"#customTooltip\")\r\n .style('top', ypos + \"px\")\r\n .style('left', xpos + \"px\")\r\n .style('opacity', 0)\r\n .style('display', 'block')\r\n .classed('plus', (elem.__data__.original[self.sizeType + 'DeltaPercentage'] > 0))\r\n .classed('minus', (elem.__data__.original[self.sizeType + 'DeltaPercentage'] < 0))\r\n .transition()\r\n .duration(duration || 1000)\r\n .style('opacity', 1);\r\n }\r\n\r\n this.clearChangesEffects = function (duration, callback) {\r\n d3.selectAll(\"#customTooltip\").style('display', 'none');\r\n\r\n that.circles\r\n .style(\"opacity\", 1)\r\n .style(\"stroke-width\", 1)\r\n .style(\"stroke\", that.getStrokeColor);\r\n\r\n callback(duration);\r\n }\r\n\r\n //category story\r\n this.showFinishDialog = function (duration) {\r\n d3.select(\"#finishDialog\")\r\n .style('opacity', 0)\r\n .style('top', \"-1500px\")\r\n .style('display', 'block')\r\n .transition()\r\n .duration(2000)\r\n .style('opacity', 1)\r\n .style('top', \"500px\");\r\n\r\n }\r\n\r\n\r\n\r\n /* LAYOUTS */\r\n\r\n this.displayLayoutTotal = function () {\r\n\r\n //remove fixed labels\r\n that.removeLabels();\r\n\r\n that.currentStep = 0;\r\n that.currentLayout = 'total';\r\n\r\n that.clearLayout();\r\n\r\n d3.select('#totalOverlay')\r\n .style('display', 'block')\r\n .transition()\r\n .delay(300)\r\n .duration(500)\r\n .style('opacity', 1);\r\n\r\n if (that.runningStory) {\r\n that.beginStory();\r\n }\r\n else {\r\n that.force\r\n .gravity(-0.01)\r\n .charge(that.defaultCharge)\r\n .friction(0.9)\r\n .on(\"tick\", function (e) {\r\n that.circles\r\n .each(that.sortForLayoutAll(e.alpha))\r\n .each(that.buoyancy(e.alpha * 1.45))\r\n .attr(\"cx\", function (d) { return d.x; })\r\n .attr(\"cy\", function (d) { return d.y; })\r\n\r\n })\r\n .start();\r\n }\r\n\r\n }\r\n\r\n this.displayLayoutChange = function () {\r\n\r\n //remove fixed labels\r\n that.removeLabels();\r\n\r\n //set layout from step 0\r\n that.currentStep = 0;\r\n that.currentLayout = 'change';\r\n\r\n //highlight change tab\r\n d3.selectAll('.navigation li').classed({ 'selected': false });\r\n d3.select('.navigation li#change').classed({ 'selected': true });\r\n\r\n that.force\r\n .gravity(0)\r\n .charge(0)\r\n .friction(0.2)\r\n .on(\"tick\", function (e) {\r\n that.circles\r\n .each(that.sortForLayoutChange(e.alpha))\r\n .attr(\"cx\", function (d) { return d.x; })\r\n .attr(\"cy\", function (d) { return d.y; });\r\n })\r\n .start();\r\n\r\n that.clearLayout();\r\n\r\n d3.select('#changeOverlay')\r\n .style('display', 'block')\r\n .transition()\r\n .delay(300)\r\n .duration(500)\r\n .style('opacity', 1);\r\n }\r\n\r\n this.displayLayoutCategory = function () {\r\n\r\n //set layout from step 0\r\n that.currentStep = 0;\r\n that.currentLayout = 'category';\r\n\r\n //highlight change tab\r\n d3.selectAll('.navigation li').classed({ 'selected': false });\r\n d3.select('.navigation li#category').classed({ 'selected': true });\r\n\r\n\r\n\r\n var centers = that.getCenters(that.groupby, [that.width, that.height]);\r\n\r\n var foci = {};\r\n for (var i = 0; i < centers.length; i++) {\r\n var c = centers[i];\r\n foci[c.name] = {\r\n items: c.items,\r\n total: c.total,\r\n w: c.w,\r\n h: c.h,\r\n x: c.x,\r\n y: c.y\r\n }\r\n }\r\n\r\n that.clearLayout();\r\n\r\n that.force\r\n .gravity(0)\r\n .charge(1)\r\n .friction(0)\r\n .on(\"tick\", function (e) {\r\n that.circles\r\n .each(that.sortForLayoutCategory(foci, e.alpha))\r\n .each(that.collide(0.01))\r\n .attr(\"cx\", function (d) { return d.x; })\r\n .attr(\"cy\", function (d) { return d.y; });\r\n })\r\n .start();\r\n\r\n that.labels(centers);\r\n\r\n d3.select('#familyOverlay')\r\n .style('display', 'block')\r\n .transition()\r\n .delay(300)\r\n .duration(500)\r\n .style('opacity', 1);\r\n }\r\n\r\n\r\n /* SORTING */\r\n\r\n this.sortForLayoutAll = function (alpha) {\r\n\r\n return function (d) {\r\n var y = d3.scale.linear().domain([-0.5, 0.5]).rangeRound([0, 5]).clamp(true);\r\n //console.log('d', d);\r\n var range = y(d.original[self.sizeType + 'DeltaPercentage']);\r\n //console.log('that', that);\r\n //console.log('range', range);\r\n var targetY = that.centersBySalesDiff[range].y;\r\n var targetX = that.width / 2;\r\n\r\n if (d.isNegative) {\r\n if (d.changeCategorySize > 0) {\r\n d.x = -200\r\n } else {\r\n d.x = 1100\r\n }\r\n }\r\n\r\n d.y = d.y + (targetY - d.y) * 0.77 * alpha\r\n d.x = d.x + (targetX - d.x) * 0.77 * alpha\r\n };\r\n }\r\n\r\n this.sortForLayoutChange = function (alpha) {\r\n\r\n return function (d) {\r\n var targetY = that.height / 2;\r\n var targetX = 0;\r\n\r\n if (d.isNegative) {\r\n if (d.changeCategorySize > 0) {\r\n d.x = -200\r\n } else {\r\n d.x = 1100\r\n }\r\n return;\r\n }\r\n\r\n targetY = that.scaleChange(d.original[self.sizeType + 'DeltaPercentage']) + 122;\r\n targetX = 100 + that.scaleGroup(d.original.category) * (that.width - 220);\r\n if (isNaN(targetY)) { targetY = that.center.y };\r\n if (targetY > (that.height - 80)) { targetY = that.height - 80 };\r\n if (targetY < 80) { targetY = 80 };\r\n\r\n\r\n d.y = d.y + (targetY - d.y) * Math.sin(Math.PI * (1 - alpha * 10)) * 0.2\r\n d.x = d.x + (targetX - d.x) * Math.sin(Math.PI * (1 - alpha * 10)) * 0.1\r\n\r\n ////fixed out of screen\r\n //if (d.x > 800)\r\n // d.x -= 100;\r\n };\r\n }\r\n\r\n this.sortForLayoutCategory = function (foci, alpha) {\r\n\r\n return function (d) {\r\n var f = foci[d.original[that.groupby]];\r\n\r\n d.x += (f.x - d.x) * alpha;\r\n d.y += (f.y - d.y) * alpha;\r\n }\r\n }\r\n\r\n\r\n /* FORCES */\r\n\r\n this.defaultCharge = function (d) {\r\n if (d.radius === 0) {\r\n return 0;\r\n }\r\n return -Math.pow(d.radius, 2) / 1.15;\r\n }\r\n\r\n this.buoyancy = function (alpha) {\r\n var that = this;\r\n return function (d) {\r\n\r\n var targetY = that.center.y - (d.changeCategorySize / 3) * that.scaleRadius(10000)\r\n d.y = d.y + (targetY - d.y) * (that.dGravity) * alpha * alpha * alpha * 100\r\n\r\n };\r\n }\r\n\r\n this.collide = function (alpha) {\r\n var quadtree = d3.geom.quadtree(that.nodes);\r\n return function (d) {\r\n var maxRadius = d3.max(that.nodes, function (d) { d.radius });\r\n var padding = 5;\r\n var r = d.radius + maxRadius + padding,\r\n nx1 = d.x - r,\r\n nx2 = d.x + r,\r\n ny1 = d.y - r,\r\n ny2 = d.y + r;\r\n quadtree.visit(function (quad, x1, y1, x2, y2) {\r\n if (quad.point && (quad.point !== d)) {\r\n var x = d.x - quad.point.x,\r\n y = d.y - quad.point.y,\r\n l = Math.sqrt(x * x + y * y),\r\n r = d.radius + quad.point.radius + padding;\r\n if (l < r) {\r\n l = (l - r) / l * alpha;\r\n d.x -= x *= l;\r\n d.y -= y *= l;\r\n quad.point.x += x;\r\n quad.point.y += y;\r\n }\r\n }\r\n return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;\r\n });\r\n };\r\n }\r\n\r\n\r\n\r\n return this;\r\n };\r\n\r\n root.parseData = function (json) {\r\n console.log('parse data', json);\r\n if (json.length == 0) {\r\n self.dstInited = false;\r\n self.dstRunning = false;\r\n $scope.$apply();\r\n return;\r\n }\r\n\r\n json.forEach(function (d, i) {\r\n d[self.sizeType] = +d[self.sizeType];\r\n d['prev' + self.sizeType] = +d['prev' + self.sizeType];\r\n d[self.sizeType + 'Delta'] = +d[self.sizeType + 'Delta'];\r\n d[self.sizeType + 'DeltaPercentage'] = +d[self.sizeType + 'DeltaPercentage'];\r\n });\r\n root.renderChart(json);\r\n\r\n }\r\n root.renderChart = function (json) {\r\n\r\n root.chart = new Chart(json);\r\n root.chart.init();\r\n root.chart.displayLayoutTotal();\r\n\r\n d3.select('#next').on('click', root.chart.next);\r\n\r\n };\r\n root.onLayoutChange = function () {\r\n\r\n d3.selectAll('.navigation li').classed({ 'selected': false });\r\n d3.select(this).classed({ 'selected': true });\r\n\r\n switch (this.id) {\r\n case 'all': root.chart.displayLayoutTotal(); break;\r\n case 'change': root.chart.displayLayoutChange(); break;\r\n case 'category': root.chart.displayLayoutCategory(); break;\r\n }\r\n }\r\n root.start = function () {\r\n //init chart\r\n\r\n var filter = self.selectedCategoryGroup ? self.selectedCategoryGroup.toString() : self.selectedState.toString();\r\n\r\n homeService.dst.getBubbles(filter, self.timeType, self.type, self.sameStores)\r\n .then(function (bubbles) {\r\n\r\n root.parseData(bubbles);\r\n });\r\n\r\n }\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n try {\r\n root.chart.removeLabels();\r\n d3.select(\"svg\").remove();\r\n\r\n destroyed = true;\r\n } catch (e) {\r\n\r\n }\r\n\r\n });\r\n\r\n //init chart\r\n var isFirstLoad = true;\r\n self.startDst = function () {\r\n\r\n if (!self.selectedState && !self.selectedCategoryGroup)\r\n return;\r\n \r\n if (!isFirstLoad) {\r\n d3.selectAll('.navigation li').classed({ 'selected': false });\r\n root.chart.displayLayoutTotal();\r\n }\r\n d3.select(\"svg\").remove();\r\n self.dstRunning = true;\r\n self.dstInited = true;\r\n isFirstLoad = false;\r\n\r\n root.start();\r\n }\r\n\r\n //init Data\r\n self.loadData = function () {\r\n if (self.type == 'category') {\r\n homeService.categories.getCategoryGroups()\r\n .then(function (cg) {\r\n self.allCategoryGroups = cg;\r\n });\r\n }\r\n\r\n if (self.type == 'store') {\r\n homeService.dst.getStates()\r\n .then(function (states) {\r\n self.states = states;\r\n });\r\n }\r\n\r\n }\r\n\r\n self.changedCategoryGroup = function () {\r\n d3.selectAll(\".bb_label\").remove();\r\n }\r\n\r\n self.loadData();\r\n\r\n });\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n\r\n .controller(\"DashboardOilCtrl\", function ($scope, $rootScope, $translate, homeService, $filter, companyJson) {\r\n var self = this;\r\n\r\n self.sameStores = true;\r\n self.timerange = 'year';\r\n self.homeDashboard = null;\r\n self.homeDashboard2 = null;\r\n self.compareYtd = null;\r\n self.compareMonth = null;\r\n self.boxesCompareTo = 'Goal'; //Goal | Ytd | Month\r\n self.selectedMonth = 8;\r\n self.sliderOptions = {\r\n showTicksValues: true,\r\n stepsArray: [\r\n { value: 1, legend: 'Ene' },\r\n { value: 2 },\r\n { value: 3, legend: 'Mar' },\r\n { value: 4 },\r\n { value: 5, legend: 'May' },\r\n { value: 6 },\r\n { value: 7, legend: 'Jul' },\r\n { value: 8 },\r\n ]\r\n }\r\n self.notification = null;\r\n self.notificationPriceArrow = 'fa fa-level-up';\r\n self.notificationUnitsArrow = 'fa fa-level-up';\r\n\r\n self.hideBoxes = false;\r\n self.hideBoxes = companyJson.Dashboard.HideBoxes;\r\n self.decisionsConfig = companyJson.AssortmentDecisions;\r\n\r\n $scope.$on(\"slideEnded\", function () {\r\n self.updateBoxes('Month');\r\n });\r\n\r\n\r\n $scope.$watch('ct.sameStores', function (newVal, oldVar) {\r\n if (newVal != oldVar) {\r\n getYTDComparison(newVal);\r\n getDashboard(newVal);\r\n getNotifiactions(newVal);\r\n }\r\n });\r\n\r\n\r\n\r\n //chart\r\n self.updateChart = function (timerange) {\r\n\r\n self.timerange = timerange;\r\n\r\n if (self.homeDashboard == null || self.homeDashboard == '')\r\n return;\r\n\r\n self.chart = c3.generate({\r\n bindto: '#homeDashboardSaleschart',\r\n data: {\r\n json: (timerange == 'week' ? self.homeDashboard.lastWeekXValues : timerange == 'month' ? self.homeDashboard.lastMonthXValues : self.homeDashboard.lastYearXValues),\r\n keys: {\r\n x: 'dateString',\r\n value: ['sales', 'units', 'margin', 'price'],\r\n },\r\n names: {\r\n sales: translations.SalesLegend,\r\n units: translations.UnitsLegend,\r\n margin: translations.MarginLegend,\r\n price: translations.PriceLegend\r\n },\r\n axes: {\r\n sales: 'y',\r\n units: 'y',\r\n margin: 'y',\r\n price: 'y2'\r\n },\r\n type: 'bar',\r\n types: {\r\n price: 'line',\r\n },\r\n colors: {\r\n sales: '#1ab394',\r\n units: '#1c84c6',\r\n margin: '#f8ac59',\r\n price: '#ED5565'\r\n },\r\n },\r\n axis: {\r\n x: {\r\n type: 'timeseries',\r\n tick: {\r\n fit: true,\r\n format: function (x) {\r\n if (self.timerange == 'week') {\r\n return $rootScope.shortWeekDayNames[x.getDay()];\r\n } else if (self.timerange == 'month') {\r\n return x.getDate() + '-' + $rootScope.shortMonthNames[(x.getMonth())];\r\n } else if (self.timerange == 'year') {\r\n return x.getFullYear() + '-' + (x.getMonth() + 1);\r\n }\r\n }\r\n }\r\n },\r\n y: {\r\n tick: {\r\n format: d3.format(\"s\")\r\n }\r\n },\r\n y2: {\r\n show: true,\r\n label: translations.PriceInS,\r\n tick: {\r\n format: d3.format('.1f')\r\n },\r\n min: 0\r\n }\r\n },\r\n tooltip: {\r\n format: {\r\n title: function (d) {\r\n var toFormat = '%B %d, %Y';\r\n if (self.timerange == 'year')\r\n toFormat = '%B %Y';\r\n\r\n var format = d3.time.format(toFormat);\r\n return format(d);\r\n },\r\n value: function (value, ratio, id) {\r\n var format = id === 'price' ? d3.format('$.2f') : id === 'units' ? d3.format(',.0f') : d3.format('$,.0f');\r\n return format(value);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n //boxes\r\n self.getMainBoxTitle = function (box) {\r\n var rv = \"\";\r\n switch (box) {\r\n case \"sales\": rv = \"Ventas\"; break;\r\n case \"units\": rv = \"Unidades\"; break;\r\n case \"cost\": rv = \"Costos\"; break;\r\n case \"margin\": rv = \"Margen $\"; break;\r\n }\r\n\r\n if (self.boxesCompareTo === \"Month\") {\r\n switch (self.selectedMonth) {\r\n case 1: rv += \" Enero\"; break;\r\n case 2: rv += \" Febrero\"; break;\r\n case 3: rv += \" Marzo\"; break;\r\n case 4: rv += \" Abril\"; break;\r\n case 5: rv += \" Mayo\"; break;\r\n case 6: rv += \" Junio\"; break;\r\n case 7: rv += \" Julio\"; break;\r\n case 8: rv += \" Agosto\"; break;\r\n case 9: rv += \" Septiembre\"; break;\r\n case 10: rv += \" Octubre\"; break;\r\n case 11: rv += \" Noviembre\"; break;\r\n case 12: rv += \" Diciembre\"; break;\r\n }\r\n }\r\n else {\r\n rv += \" YTD\";\r\n }\r\n\r\n return rv;\r\n }\r\n self.getBoxCompareValue = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n\r\n if (self.boxesCompareTo === 'Month') {\r\n value = $filter('percentage')(self.compareMonth[box + 'PyDelta'], 1);\r\n }\r\n else {\r\n value = $filter('percentage')(self.compareYtd[box + 'PyDelta'], 1);\r\n }\r\n\r\n return self.compareYtd[box + 'PyDelta'] != 0 ? value : 'N/A';\r\n }\r\n }\r\n self.getBoxCompareTooltip = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('number') : $filter('currency');\r\n\r\n if (self.boxesCompareTo === 'Month') {\r\n value = box === 'units' ? filter(self.compareMonth[box + 'Py'], 0) : filter(self.compareMonth[box + 'Py'], '$', 0);\r\n }\r\n else {\r\n value = box === 'units' ? filter(self.compareYtd[box + 'Py'], 0) : filter(self.compareYtd[box + 'Py'], '$', 0);\r\n }\r\n\r\n return value;\r\n }\r\n }\r\n\r\n self.getMainBoxValueGoal = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('abbreviate') : $filter('abbreviate');\r\n var prefix = box === 'units' ? null : \"$\";\r\n var decimals = box === 'units' ? 0 : 2;\r\n\r\n //if (self.boxesCompareTo === 'Month') {\r\n // value = filter(self.compareMonth[box], decimals, prefix);\r\n //}\r\n //else if (self.boxesCompareTo === 'Goal') {\r\n filter = $filter('percentage');\r\n value = filter(self.compareYtd[box + 'GoalGapP'], 2);\r\n //}\r\n //else {\r\n // value = filter(self.compareYtd[box + 'Ytd'], decimals, prefix);\r\n //}\r\n\r\n return self.compareYtd[box + 'GoalGapP'] != 0 ? value : 'N/A';\r\n }\r\n }\r\n self.getMainBoxTooltip = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('number') : $filter('currency');\r\n\r\n if (self.boxesCompareTo === 'Month') {\r\n value = box === 'units' ? filter(self.compareMonth[box], 0) : filter(self.compareMonth[box], '$', 0);\r\n }\r\n else {\r\n value = box === 'units' ? filter(self.compareYtd[box + 'Ytd'], 0) : filter(self.compareYtd[box + 'Ytd'], '$', 0);\r\n }\r\n\r\n return value;\r\n }\r\n }\r\n self.isMainBoxGoalSignPositive = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n return self.compareYtd[box + 'GoalGapP'] > 0;\r\n }\r\n }\r\n\r\n self.getMainBoxValueYTD = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('abbreviate') : $filter('abbreviate');\r\n var prefix = box === 'units' ? null : \"$\";\r\n var decimals = box === 'units' ? 0 : 2;\r\n\r\n value = filter(self.compareYtd[box + 'Ytd'], decimals, prefix);\r\n }\r\n\r\n return value;\r\n }\r\n self.getMainBoxValueAnual = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('abbreviate') : $filter('abbreviate');\r\n var prefix = box === 'units' ? null : \"$\";\r\n var decimals = box === 'units' ? 0 : 2;\r\n\r\n value = filter(self.compareYtd[box + 'GoalTotal'], decimals, prefix);\r\n\r\n return self.compareYtd[box + 'GoalTotal'] != 0 ? value : 'N/A';\r\n }\r\n }\r\n self.getMainBoxAnualTooltip = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('number') : $filter('currency');\r\n\r\n if (self.boxesCompareTo === 'Month') {\r\n value = box === 'units' ? filter(self.compareMonth[box + 'GoalTotal'], 0) : filter(self.compareMonth[box + 'GoalTotal'], '$', 0);\r\n }\r\n else {\r\n value = box === 'units' ? filter(self.compareYtd[box + 'GoalTotal'], 0) : filter(self.compareYtd[box + 'GoalTotal'], '$', 0);\r\n }\r\n\r\n }\r\n return value;\r\n }\r\n\r\n self.getActualYtdValue = function (box) {\r\n if (self.compareYtd != null) {\r\n var value = null;\r\n var filter = box === 'units' ? $filter('abbreviate') : $filter('abbreviate');\r\n\r\n value = box === 'units' ? filter(self.compareYtd[box + 'Goal'], 0) : filter(self.compareYtd[box + 'Goal'], '$', 0);\r\n\r\n return value;\r\n }\r\n }\r\n self.getActualYtdTooltipValue = function (box) {\r\n if (self.compareYtd != null) {\r\n var value = null;\r\n var filter = box === 'units' ? $filter('number') : $filter('currency');\r\n\r\n value = box === 'units' ? filter(self.compareYtd[box + 'Goal'], 0) : filter(self.compareYtd[box + 'Goal'], '$', 0);\r\n\r\n return value;\r\n }\r\n }\r\n\r\n self.getProjectedYtdValue = function (box) {\r\n if (self.compareYtd != null) {\r\n var value = null;\r\n var filter = box === 'units' ? $filter('abbreviate') : $filter('abbreviate');\r\n\r\n value = box === 'units' ? filter((self.compareYtd[box + 'Projected'] + self.compareYtd[box + 'Ytd']), 0) : filter((self.compareYtd[box + 'Projected'] + self.compareYtd[box + 'Ytd']), '$', 0);\r\n\r\n return self.compareYtd[box + 'Projected'] != 0 ? value : 'N/A';\r\n }\r\n }\r\n self.getProjectedYtdTooltipValue = function (box) {\r\n if (self.compareYtd != null) {\r\n var value = null;\r\n var filter = box === 'units' ? $filter('number') : $filter('currency');\r\n\r\n value = box === 'units' ? filter((self.compareYtd[box + 'Projected'] + self.compareYtd[box + 'Ytd']), 0) : filter((self.compareYtd[box + 'Projected'] + self.compareYtd[box + 'Ytd']), '$', 0);\r\n\r\n return value;\r\n }\r\n }\r\n self.projectedPositive = function (box) {\r\n if (box && self.compareYtd) {\r\n var projected = self.compareYtd[box + 'Projected'] + self.compareYtd[box + 'Ytd'];\r\n var annual = self.compareYtd[box + 'GoalTotal'];\r\n\r\n if (box != 'cost')\r\n return projected >= annual;\r\n else\r\n return projected < annual;\r\n }\r\n }\r\n\r\n self.getBoxCompareIcon = function (box) {\r\n\r\n if (box && self.compareYtd) {\r\n\r\n var delta = null;\r\n var cls = '';\r\n\r\n if (self.boxesCompareTo === 'Month') {\r\n delta = self.compareMonth[box + 'PyDelta'];\r\n }\r\n else {\r\n delta = self.compareYtd[box + 'PyDelta'];\r\n }\r\n\r\n if (box != 'cost') {\r\n if (!delta)\r\n cls = '';\r\n else if (delta > 0.005)\r\n cls = 'fa fa-level-up text-navy';\r\n else if (delta < -0.005)\r\n cls = 'fa fa-level-down text-danger';\r\n else\r\n cls = 'fa fa-anchor';\r\n }\r\n else {\r\n if (!delta)\r\n cls = '';\r\n else if (delta > 0.005)\r\n cls = 'fa fa-level-up text-danger';\r\n else if (delta < -0.005)\r\n cls = 'fa fa-level-down text-navy';\r\n else\r\n cls = 'fa fa-anchor';\r\n }\r\n\r\n\r\n return cls;\r\n }\r\n }\r\n self.isBoxSignPositive = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n\r\n value = self.compareYtd[box + 'PyDelta'];\r\n\r\n if (box == 'cost') {\r\n if (value <= 0)\r\n return true\r\n else\r\n return false;\r\n }\r\n else {\r\n if (value > 0)\r\n return true\r\n else\r\n return false;\r\n }\r\n }\r\n\r\n }\r\n\r\n self.toggleLegend = function (chart) {\r\n if (!chart.legend.visible) {\r\n chart.legend.show();\r\n chart.legend.visible = true;\r\n }\r\n else {\r\n chart.legend.hide();\r\n chart.legend.visible = false;\r\n }\r\n }\r\n self.updateBoxes = function (compareTo) {\r\n\r\n if (compareTo === 'Month') {\r\n findMonthToCompare(self.selectedMonth);\r\n }\r\n\r\n self.boxesCompareTo = compareTo;\r\n\r\n if (compareTo === 'Goal')\r\n renderGoalCharts();\r\n\r\n }\r\n\r\n function findMonthToCompare(month) {\r\n\r\n var rv = null;\r\n angular.forEach(self.compareYtd.vsPriorYearByMonth, function (item) {\r\n if (item.month == month && item.year == self.compareYtd.currentYear) {\r\n rv = item;\r\n }\r\n });\r\n\r\n self.compareMonth = rv;\r\n\r\n return rv;\r\n }\r\n\r\n function renderGoalCharts() {\r\n\r\n var boxes = ['sales', 'margin', 'units', 'cost'];\r\n\r\n angular.forEach(boxes, function (box) {\r\n\r\n var chart = c3.generate(getGoalChartTemplate(box));\r\n\r\n\r\n setTimeout(function () {\r\n chart.load({\r\n columns: [['objetivo', self.compareYtd[box + 'Goal']]],\r\n });\r\n }, 500);\r\n\r\n setTimeout(function () {\r\n chart.load({\r\n columns: [['actual', self.compareYtd[box + 'Ytd']],\r\n ['proyectado', self.compareYtd[box + 'Projected']]\r\n ],\r\n });\r\n chart.groups([['proyectado', 'actual']]);\r\n }, 1500);\r\n\r\n self[box + 'GoalChart'] = chart;\r\n });\r\n }\r\n function getGoalChartTemplate(box) {\r\n\r\n var template = {\r\n bindto: ian.format('#{0}GoalChart', box),\r\n data: {\r\n columns: [],\r\n type: 'bar',\r\n groups: [],\r\n colors: {\r\n actual: '#1f77b4',\r\n proyectado: '#aec7e8',\r\n objetivo: '#1ab394',\r\n },\r\n order: null\r\n },\r\n size: {\r\n height: 65,\r\n },\r\n bar: {\r\n width: 5\r\n },\r\n axis: {\r\n rotated: true,\r\n x: { show: false },\r\n y: { show: false }\r\n },\r\n tooltip: {\r\n show: true,\r\n format: {\r\n title: function (x) { return 'vs Plan'; },\r\n value: function (value, ratio, id) {\r\n return box === 'units' ? $filter('abbreviate')(value, 0) : $filter('abbreviate')(value, '$', 0);\r\n }\r\n }\r\n },\r\n legend: {\r\n show: false\r\n }\r\n };\r\n\r\n return template;\r\n }\r\n\r\n //competitor in map\r\n \r\n self.getPriceLabel = function (competitor) {\r\n var myPrice = 4.00;\r\n\r\n if (competitor.price > myPrice) {\r\n return \"danger\";\r\n }\r\n\r\n if (competitor.price < myPrice) {\r\n return \"primary\";\r\n }\r\n\r\n return \"warning\";\r\n }\r\n\r\n //notification\r\n self.reason1 = true;\r\n self.reason2 = true;\r\n self.showR1 = function () { return self.reason1 };\r\n self.showR2 = function () { return self.reason2 };\r\n self.reason1Agreed = false;\r\n self.reason1Disagreed = false;\r\n self.reason2Agreed = false;\r\n self.reason2Disagreed = false;\r\n self.disagreeClass = function (reason) {\r\n if (reason === 1 && self.reason1Disagreed)\r\n return \"disagreed\";\r\n\r\n if (reason === 2 && self.reason2Disagreed)\r\n return \"disagreed\";\r\n\r\n return \"\";\r\n }\r\n\r\n var translations = null;\r\n $translate([\"DiscardConfirmTitle\", \"DiscardConfirmSub\", \"YesDiscard\", \"DiscardMessageTitle\", \"DiscardMessageComment\", \"ThanksForFeedback\", \"ThanksForFeedbackComment\", \"ThanksForFeedbackPoints\", \"ThanksForFeedbackTitle2\", \"DisagreeTitle\", \"DisagreeSub\", \"Send\", \"SalesLegend\", \"PriceInS\", \"UnitsLegend\", \"MarginLegend\", \"PriceLegend\"])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n self.discard = function () {\r\n swal({\r\n title: translations.DiscardConfirmTitle,\r\n text: translations.DiscardConfirmSub,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#DD6B55\",\r\n confirmButtonText: translations.YesDiscard,\r\n closeOnConfirm: false\r\n }, function () {\r\n self.reason1 = false;\r\n $scope.$apply();\r\n swal(translations.DiscardMessageTitle, translations.DiscardMessageComment, \"success\");\r\n });\r\n }\r\n\r\n self.agree = function (reason) {\r\n\r\n var points = 500; //por el agree / disagree;\r\n if (reason === 1) {\r\n self.reason1Agreed = true;\r\n } else {\r\n self.reason2Agreed = true;\r\n }\r\n grantPoints(points);\r\n $scope.$apply();\r\n\r\n swal(translations.ThanksForFeedback, translations.ThanksForFeedbackComment + points + translations.ThanksForFeedbackPoints, \"success\");\r\n }\r\n\r\n self.disagree = function (reason) {\r\n\r\n swal({\r\n title: translations.DisagreeTitle,\r\n text: translations.DisagreeSub,\r\n type: \"input\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#DD6B55\",\r\n confirmButtonText: translations.Send,\r\n closeOnConfirm: false,\r\n closeOnCancel: false\r\n }, function (feedback) {\r\n var points = 500; //por el agree / disagree;\r\n\r\n if (reason === 1) {\r\n self.reason1Disagreed = true;\r\n self.reason1feedback = feedback ? feedback : null;\r\n } else {\r\n self.reason2Disagreed = true;\r\n self.reason2feedback = feedback ? feedback : null;\r\n }\r\n\r\n if (feedback)\r\n points += 500;\r\n\r\n grantPoints(points);\r\n\r\n $scope.$apply();\r\n\r\n if (feedback) {\r\n swal(translations.ThanksForFeedback, translations.ThanksForFeedbackComment + points + translations.ThanksForFeedbackPoints, \"success\");\r\n } else {\r\n swal(translations.ThanksForFeedbackTitle2, translations.ThanksForFeedbackComment, \"error\");\r\n }\r\n });\r\n }\r\n\r\n function grantPoints(points) {\r\n $rootScope.$broadcast(\"pointsAdded\", { points: points });\r\n }\r\n\r\n function loadData() {\r\n //Traigo data para el chart\r\n getDashboard(true);\r\n //traigo data para los boxes\r\n getYTDComparison(true);\r\n\r\n getNotifiactions(true);\r\n\r\n\r\n\r\n }\r\n\r\n function getNotifiactions(withSameStores) {\r\n homeService.dashboards.getNotification(withSameStores)\r\n .then(function (notif) {\r\n if (notif) {\r\n self.notification = notif;\r\n self.notificationPriceArrow = notif.causePrice.split('%')[0].indexOf('aumentó') > 0 ? 'fa fa-level-up' : notif.causePrice.split('%')[0].indexOf('cayó') > 0 ? 'fa fa-level-down' : '';\r\n self.notificationUnitsArrow = notif.causeUnits.split('%')[0].indexOf('aumentó') > 0 ? 'fa fa-level-up' : notif.causeUnits.split('%')[0].indexOf('cayó') > 0 ? 'fa fa-level-down' : '';\r\n }\r\n });\r\n }\r\n\r\n self.isLoadingChart = false;\r\n function getDashboard(withSameStores) {\r\n self.isLoadingChart = true;\r\n homeService.dashboards.getHomeDashboard(withSameStores)\r\n .then(function (homeDashboard) {\r\n self.isLoadingChart = false;\r\n if (homeDashboard == null || homeDashboard == '')\r\n return;\r\n\r\n self.homeDashboard = homeDashboard;\r\n\r\n self.updateChart(self.timerange);\r\n });\r\n }\r\n\r\n self.isLoadingBoxes = false;\r\n function getYTDComparison(withSameStores) {\r\n self.isLoadingBoxes = true;\r\n homeService.dashboards.getYtdComparison(withSameStores)\r\n .then(function (dashboardComparisonDto) {\r\n self.isLoadingBoxes = false;\r\n\r\n self.compareYtd = dashboardComparisonDto;\r\n self.updateBoxes('Goal');\r\n });\r\n\r\n }\r\n self.compositionInf = {\r\n name: 'INF',\r\n icl: 7.83,\r\n co2: 0.48,\r\n iva: 6.35,\r\n comision: 6.06,\r\n flete: 0.08,\r\n iibb: 1.36,\r\n refineria: 22.02,\r\n price: 44.18,\r\n iclPrc: 17,\r\n co2Prc: 1,\r\n ivaPrc: 14,\r\n comisionPrc: 14,\r\n fletePrc: 0.2,\r\n iibbPrc: 3,\r\n refineriaPrc: 50,\r\n }\r\n self.compositionInfD = {\r\n name: 'IDS',\r\n icl: 4.94,\r\n co2: 0.56,\r\n iva: 6.78,\r\n comision: 4.57,\r\n flete: 0.08,\r\n iibb: 1.33,\r\n refineria: 25.53,\r\n price: 43.80,\r\n iclPrc: 11,\r\n co2Prc: 1,\r\n ivaPrc: 15,\r\n comisionPrc: 10,\r\n fletePrc: 0.1,\r\n iibbPrc: 3,\r\n refineriaPrc: 58,\r\n\r\n }\r\n self.compositionSup = {\r\n name: 'SUP',\r\n icl: 7.83,\r\n co2: 0.48,\r\n iva: 5.25,\r\n comision: 4.48,\r\n flete: 0.08,\r\n iibb: 1.17,\r\n refineria: 18.67,\r\n price: 37.98,\r\n iclPrc: 21,\r\n co2Prc: 1,\r\n ivaPrc: 14,\r\n comisionPrc: 12,\r\n fletePrc: 0.2,\r\n iibbPrc: 3,\r\n refineriaPrc: 49,\r\n }\r\n self.compositionD = {\r\n name: 'DSL',\r\n icl: 4.94,\r\n co2: 0.56,\r\n iva: 5.49,\r\n comision: 3.38,\r\n flete: 0.08,\r\n iibb: 1.11,\r\n refineria: 20.93,\r\n price: 36.50,\r\n iclPrc: 13.5,\r\n co2Prc: 2,\r\n ivaPrc: 15,\r\n comisionPrc: 9,\r\n fletePrc: 0.2,\r\n iibbPrc: 3,\r\n refineriaPrc: 57,\r\n }\r\n\r\n self.selectedComposition = angular.copy(self.compositionInf);\r\n\r\n\r\n function init() {\r\n\r\n //load data\r\n loadData();\r\n }\r\n\r\n init();\r\n });\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n\r\n .controller(\"DashboardCtrl\", function ($scope, $rootScope, $translate, homeService, $filter, companyJson) {\r\n var self = this;\r\n\r\n self.sameStores = true;\r\n self.timerange = 'year';\r\n self.homeDashboard = null;\r\n self.homeDashboard2 = null;\r\n self.compareYtd = null;\r\n self.compareMonth = null;\r\n self.boxesCompareTo = 'Goal'; //Goal | Ytd | Month\r\n self.selectedMonth = 8;\r\n self.sliderOptions = {\r\n showTicksValues: true,\r\n stepsArray: [\r\n { value: 1, legend: 'Ene' },\r\n { value: 2 },\r\n { value: 3, legend: 'Mar' },\r\n { value: 4 },\r\n { value: 5, legend: 'May' },\r\n { value: 6 },\r\n { value: 7, legend: 'Jul' },\r\n { value: 8 },\r\n ]\r\n }\r\n self.notification = null;\r\n self.notificationPriceArrow = 'fa fa-level-up';\r\n self.notificationUnitsArrow = 'fa fa-level-up';\r\n\r\n self.hideBoxes = false;\r\n self.hideBoxes = companyJson.Dashboard.HideBoxes;\r\n self.decisionsConfig = companyJson.AssortmentDecisions;\r\n\r\n $scope.$on(\"slideEnded\", function () {\r\n self.updateBoxes('Month');\r\n });\r\n\r\n\r\n $scope.$watch('ct.sameStores', function (newVal, oldVar) {\r\n if (newVal != oldVar) {\r\n getYTDComparison(newVal);\r\n getDashboard(newVal);\r\n getNotifiactions(newVal);\r\n }\r\n });\r\n\r\n\r\n\r\n //chart\r\n self.updateChart = function (timerange) {\r\n\r\n self.timerange = timerange;\r\n\r\n if (self.homeDashboard == null || self.homeDashboard == '')\r\n return;\r\n\r\n self.chart = c3.generate({\r\n bindto: '#homeDashboardSaleschart',\r\n data: {\r\n json: (timerange == 'week' ? self.homeDashboard.lastWeekXValues : timerange == 'month' ? self.homeDashboard.lastMonthXValues : self.homeDashboard.lastYearXValues),\r\n keys: {\r\n x: 'dateString',\r\n value: ['sales', 'units', 'margin', 'price'],\r\n },\r\n names: {\r\n sales: translations.SalesLegend,\r\n units: translations.UnitsLegend,\r\n margin: translations.MarginLegend,\r\n price: translations.PriceLegend\r\n },\r\n axes: {\r\n sales: 'y',\r\n units: 'y',\r\n margin: 'y',\r\n price: 'y2'\r\n },\r\n type: 'bar',\r\n types: {\r\n price: 'line',\r\n },\r\n colors: {\r\n sales: '#1ab394',\r\n units: '#1c84c6',\r\n margin: '#f8ac59',\r\n price: '#ED5565'\r\n },\r\n },\r\n axis: {\r\n x: {\r\n type: 'timeseries',\r\n tick: {\r\n fit: true,\r\n format: function (x) {\r\n if (self.timerange == 'week') {\r\n return $rootScope.shortWeekDayNames[x.getDay()];\r\n } else if (self.timerange == 'month') {\r\n return x.getDate() + '-' + $rootScope.shortMonthNames[(x.getMonth())];\r\n } else if (self.timerange == 'year') {\r\n return x.getFullYear() + '-' + (x.getMonth() + 1);\r\n }\r\n }\r\n }\r\n },\r\n y: {\r\n tick: {\r\n format: d3.format(\"s\")\r\n }\r\n },\r\n y2: {\r\n show: true,\r\n label: translations.PriceInS,\r\n tick: {\r\n format: d3.format('.1f')\r\n },\r\n min: 0\r\n }\r\n },\r\n tooltip: {\r\n format: {\r\n title: function (d, defaultTitleFormat, defaultValueFormat, color) {\r\n var toFormat = '%B %d, %Y';\r\n if (self.timerange == 'year')\r\n toFormat = '%B %Y';\r\n\r\n var format = d3.time.format(toFormat);\r\n return format(d);\r\n },\r\n value: function (value, ratio, id) {\r\n var format = id === 'price' ? d3.format('$.2f') : id === 'units' ? d3.format(',.0f') : d3.format('$,.0f');\r\n return format(value);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n //boxes\r\n self.getMainBoxTitle = function (box) {\r\n var rv = \"\";\r\n switch (box) {\r\n case \"sales\": rv = \"Ventas\"; break;\r\n case \"units\": rv = \"Unidades\"; break;\r\n case \"cost\": rv = \"Costos\"; break;\r\n case \"margin\": rv = \"Margen $\"; break;\r\n }\r\n\r\n if (self.boxesCompareTo === \"Month\") {\r\n switch (self.selectedMonth) {\r\n case 1: rv += \" Enero\"; break;\r\n case 2: rv += \" Febrero\"; break;\r\n case 3: rv += \" Marzo\"; break;\r\n case 4: rv += \" Abril\"; break;\r\n case 5: rv += \" Mayo\"; break;\r\n case 6: rv += \" Junio\"; break;\r\n case 7: rv += \" Julio\"; break;\r\n case 8: rv += \" Agosto\"; break;\r\n case 9: rv += \" Septiembre\"; break;\r\n case 10: rv += \" Octubre\"; break;\r\n case 11: rv += \" Noviembre\"; break;\r\n case 12: rv += \" Diciembre\"; break;\r\n }\r\n }\r\n else {\r\n rv += \" YTD\";\r\n }\r\n\r\n return rv;\r\n }\r\n self.getBoxCompareValue = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n\r\n if (self.boxesCompareTo === 'Month') {\r\n value = $filter('percentage')(self.compareMonth[box + 'PyDelta'], 1);\r\n }\r\n else {\r\n value = $filter('percentage')(self.compareYtd[box + 'PyDelta'], 1);\r\n }\r\n\r\n return self.compareYtd[box + 'PyDelta'] != 0 ? value : 'N/A';\r\n }\r\n }\r\n self.getBoxCompareTooltip = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('number') : $filter('currency');\r\n\r\n if (self.boxesCompareTo === 'Month') {\r\n value = box === 'units' ? filter(self.compareMonth[box + 'Py'], 0) : filter(self.compareMonth[box + 'Py'], '$', 0);\r\n }\r\n else {\r\n value = box === 'units' ? filter(self.compareYtd[box + 'Py'], 0) : filter(self.compareYtd[box + 'Py'], '$', 0);\r\n }\r\n\r\n return value;\r\n }\r\n }\r\n\r\n self.getMainBoxValueGoal = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('abbreviate') : $filter('abbreviate');\r\n var prefix = box === 'units' ? null : \"$\";\r\n var decimals = box === 'units' ? 0 : 2;\r\n\r\n //if (self.boxesCompareTo === 'Month') {\r\n // value = filter(self.compareMonth[box], decimals, prefix);\r\n //}\r\n //else if (self.boxesCompareTo === 'Goal') {\r\n filter = $filter('percentage');\r\n value = filter(self.compareYtd[box + 'GoalGapP'], 2);\r\n //}\r\n //else {\r\n // value = filter(self.compareYtd[box + 'Ytd'], decimals, prefix);\r\n //}\r\n\r\n return self.compareYtd[box + 'GoalGapP'] != 0 ? value : 'N/A';\r\n }\r\n }\r\n self.getMainBoxTooltip = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('number') : $filter('currency');\r\n\r\n if (self.boxesCompareTo === 'Month') {\r\n value = box === 'units' ? filter(self.compareMonth[box], 0) : filter(self.compareMonth[box], '$', 0);\r\n }\r\n else {\r\n value = box === 'units' ? filter(self.compareYtd[box + 'Ytd'], 0) : filter(self.compareYtd[box + 'Ytd'], '$', 0);\r\n }\r\n\r\n return value;\r\n }\r\n }\r\n self.isMainBoxGoalSignPositive = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n return self.compareYtd[box + 'GoalGapP'] > 0;\r\n }\r\n }\r\n\r\n self.getMainBoxValueYTD = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('abbreviate') : $filter('abbreviate');\r\n var prefix = box === 'units' ? null : \"$\";\r\n var decimals = box === 'units' ? 0 : 2;\r\n\r\n value = filter(self.compareYtd[box + 'Ytd'], decimals, prefix);\r\n }\r\n\r\n return value;\r\n }\r\n self.getMainBoxValueAnual = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('abbreviate') : $filter('abbreviate');\r\n var prefix = box === 'units' ? null : \"$\";\r\n var decimals = box === 'units' ? 0 : 2;\r\n\r\n value = filter(self.compareYtd[box + 'GoalTotal'], decimals, prefix);\r\n\r\n return self.compareYtd[box + 'GoalTotal'] != 0 ? value : 'N/A';\r\n }\r\n }\r\n self.getMainBoxAnualTooltip = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n var filter = box === 'units' ? $filter('number') : $filter('currency');\r\n\r\n if (self.boxesCompareTo === 'Month') {\r\n value = box === 'units' ? filter(self.compareMonth[box + 'GoalTotal'], 0) : filter(self.compareMonth[box + 'GoalTotal'], '$', 0);\r\n }\r\n else {\r\n value = box === 'units' ? filter(self.compareYtd[box + 'GoalTotal'], 0) : filter(self.compareYtd[box + 'GoalTotal'], '$', 0);\r\n }\r\n\r\n }\r\n return value;\r\n }\r\n\r\n self.getActualYtdValue = function (box) {\r\n if (self.compareYtd != null) {\r\n var value = null;\r\n var filter = box === 'units' ? $filter('abbreviate') : $filter('abbreviate');\r\n\r\n value = box === 'units' ? filter(self.compareYtd[box + 'Goal'], 0) : filter(self.compareYtd[box + 'Goal'], '$', 0);\r\n\r\n return value;\r\n }\r\n }\r\n self.getActualYtdTooltipValue = function (box) {\r\n if (self.compareYtd != null) {\r\n var value = null;\r\n var filter = box === 'units' ? $filter('number') : $filter('currency');\r\n\r\n value = box === 'units' ? filter(self.compareYtd[box + 'Goal'], 0) : filter(self.compareYtd[box + 'Goal'], '$', 0);\r\n\r\n return value;\r\n }\r\n }\r\n\r\n self.getProjectedYtdValue = function (box) {\r\n if (self.compareYtd != null) {\r\n var value = null;\r\n var filter = box === 'units' ? $filter('abbreviate') : $filter('abbreviate');\r\n\r\n value = box === 'units' ? filter((self.compareYtd[box + 'Projected'] + self.compareYtd[box + 'Ytd']), 0) : filter((self.compareYtd[box + 'Projected'] + self.compareYtd[box + 'Ytd']), '$', 0);\r\n\r\n return self.compareYtd[box + 'Projected'] != 0 ? value : 'N/A';\r\n }\r\n }\r\n self.getProjectedYtdTooltipValue = function (box) {\r\n if (self.compareYtd != null) {\r\n var value = null;\r\n var filter = box === 'units' ? $filter('number') : $filter('currency');\r\n\r\n value = box === 'units' ? filter((self.compareYtd[box + 'Projected'] + self.compareYtd[box + 'Ytd']), 0) : filter((self.compareYtd[box + 'Projected'] + self.compareYtd[box + 'Ytd']), '$', 0);\r\n\r\n return value;\r\n }\r\n }\r\n self.projectedPositive = function (box) {\r\n if (box && self.compareYtd) {\r\n var projected = self.compareYtd[box + 'Projected'] + self.compareYtd[box + 'Ytd'];\r\n var annual = self.compareYtd[box + 'GoalTotal'];\r\n\r\n if (box != 'cost')\r\n return projected >= annual;\r\n else\r\n return projected < annual;\r\n }\r\n }\r\n\r\n self.getBoxCompareIcon = function (box) {\r\n\r\n if (box && self.compareYtd) {\r\n\r\n var delta = null;\r\n var cls = '';\r\n\r\n if (self.boxesCompareTo === 'Month') {\r\n delta = self.compareMonth[box + 'PyDelta'];\r\n }\r\n else {\r\n delta = self.compareYtd[box + 'PyDelta'];\r\n }\r\n\r\n if (box != 'cost') {\r\n if (!delta)\r\n cls = '';\r\n else if (delta > 0.005)\r\n cls = 'fa fa-level-up text-navy';\r\n else if (delta < -0.005)\r\n cls = 'fa fa-level-down text-danger';\r\n else\r\n cls = 'fa fa-anchor';\r\n }\r\n else {\r\n if (!delta)\r\n cls = '';\r\n else if (delta > 0.005)\r\n cls = 'fa fa-level-up text-danger';\r\n else if (delta < -0.005)\r\n cls = 'fa fa-level-down text-navy';\r\n else\r\n cls = 'fa fa-anchor';\r\n }\r\n\r\n\r\n return cls;\r\n }\r\n }\r\n self.isBoxSignPositive = function (box) {\r\n if (box && self.compareYtd) {\r\n\r\n var value = null;\r\n\r\n value = self.compareYtd[box + 'PyDelta'];\r\n\r\n if (box == 'cost') {\r\n if (value <= 0)\r\n return true\r\n else\r\n return false;\r\n }\r\n else {\r\n if (value > 0)\r\n return true\r\n else\r\n return false;\r\n }\r\n }\r\n\r\n }\r\n\r\n self.toggleLegend = function (chart) {\r\n if (!chart.legend.visible) {\r\n chart.legend.show();\r\n chart.legend.visible = true;\r\n }\r\n else {\r\n chart.legend.hide();\r\n chart.legend.visible = false;\r\n }\r\n }\r\n self.updateBoxes = function (compareTo) {\r\n\r\n if (compareTo === 'Month') {\r\n findMonthToCompare(self.selectedMonth);\r\n }\r\n\r\n self.boxesCompareTo = compareTo;\r\n\r\n if (compareTo === 'Goal')\r\n renderGoalCharts();\r\n\r\n }\r\n\r\n function findMonthToCompare(month) {\r\n\r\n var rv = null;\r\n angular.forEach(self.compareYtd.vsPriorYearByMonth, function (item) {\r\n if (item.month == month && item.year == self.compareYtd.currentYear) {\r\n rv = item;\r\n }\r\n });\r\n\r\n self.compareMonth = rv;\r\n\r\n return rv;\r\n }\r\n\r\n function renderGoalCharts() {\r\n\r\n var boxes = ['sales', 'margin', 'units', 'cost'];\r\n\r\n angular.forEach(boxes, function (box) {\r\n\r\n var chart = c3.generate(getGoalChartTemplate(box));\r\n\r\n\r\n setTimeout(function () {\r\n chart.load({\r\n columns: [['objetivo', self.compareYtd[box + 'Goal']]],\r\n });\r\n }, 500);\r\n\r\n setTimeout(function () {\r\n chart.load({\r\n columns: [['actual', self.compareYtd[box + 'Ytd']],\r\n ['proyectado', self.compareYtd[box + 'Projected']]\r\n ],\r\n });\r\n chart.groups([['proyectado', 'actual']]);\r\n }, 1500);\r\n\r\n self[box + 'GoalChart'] = chart;\r\n });\r\n }\r\n function getGoalChartTemplate(box) {\r\n\r\n var template = {\r\n bindto: ian.format('#{0}GoalChart', box),\r\n data: {\r\n columns: [],\r\n type: 'bar',\r\n groups: [],\r\n colors: {\r\n actual: '#1f77b4',\r\n proyectado: '#aec7e8',\r\n objetivo: '#1ab394',\r\n },\r\n order: null\r\n },\r\n size: {\r\n height: 65,\r\n },\r\n bar: {\r\n width: 5\r\n },\r\n axis: {\r\n rotated: true,\r\n x: { show: false },\r\n y: { show: false }\r\n },\r\n tooltip: {\r\n show: true,\r\n format: {\r\n title: function (x) { return 'vs Plan'; },\r\n value: function (value, ratio, id) {\r\n return box === 'units' ? $filter('abbreviate')(value, 0) : $filter('abbreviate')(value, '$', 0);\r\n }\r\n }\r\n },\r\n legend: {\r\n show: false\r\n }\r\n };\r\n\r\n return template;\r\n }\r\n\r\n //competitor in map\r\n \r\n self.getPriceLabel = function (competitor) {\r\n var myPrice = 4.00;\r\n\r\n if (competitor.price > myPrice) {\r\n return \"danger\";\r\n }\r\n\r\n if (competitor.price < myPrice) {\r\n return \"primary\";\r\n }\r\n\r\n return \"warning\";\r\n }\r\n\r\n //notification\r\n self.reason1 = true;\r\n self.reason2 = true;\r\n self.showR1 = function () { return self.reason1 };\r\n self.showR2 = function () { return self.reason2 };\r\n self.reason1Agreed = false;\r\n self.reason1Disagreed = false;\r\n self.reason2Agreed = false;\r\n self.reason2Disagreed = false;\r\n self.disagreeClass = function (reason) {\r\n if (reason === 1 && self.reason1Disagreed)\r\n return \"disagreed\";\r\n\r\n if (reason === 2 && self.reason2Disagreed)\r\n return \"disagreed\";\r\n\r\n return \"\";\r\n }\r\n\r\n var translations = null;\r\n $translate([\"DiscardConfirmTitle\", \"DiscardConfirmSub\", \"YesDiscard\", \"DiscardMessageTitle\", \"DiscardMessageComment\", \"ThanksForFeedback\", \"ThanksForFeedbackComment\", \"ThanksForFeedbackPoints\", \"ThanksForFeedbackTitle2\", \"DisagreeTitle\", \"DisagreeSub\", \"Send\", \"SalesLegend\", \"PriceInS\", \"UnitsLegend\", \"MarginLegend\", \"PriceLegend\"])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n self.discard = function () {\r\n swal({\r\n title: translations.DiscardConfirmTitle,\r\n text: translations.DiscardConfirmSub,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#DD6B55\",\r\n confirmButtonText: translations.YesDiscard,\r\n closeOnConfirm: false\r\n }, function () {\r\n self.reason1 = false;\r\n $scope.$apply();\r\n swal(translations.DiscardMessageTitle, translations.DiscardMessageComment, \"success\");\r\n });\r\n }\r\n\r\n self.agree = function (reason) {\r\n\r\n var points = 500; //por el agree / disagree;\r\n if (reason === 1) {\r\n self.reason1Agreed = true;\r\n } else {\r\n self.reason2Agreed = true;\r\n }\r\n grantPoints(points);\r\n $scope.$apply();\r\n\r\n swal(translations.ThanksForFeedback, translations.ThanksForFeedbackComment + points + translations.ThanksForFeedbackPoints, \"success\");\r\n }\r\n\r\n self.disagree = function (reason) {\r\n\r\n swal({\r\n title: translations.DisagreeTitle,\r\n text: translations.DisagreeSub,\r\n type: \"input\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#DD6B55\",\r\n confirmButtonText: translations.Send,\r\n closeOnConfirm: false,\r\n closeOnCancel: false\r\n }, function (feedback) {\r\n var points = 500; //por el agree / disagree;\r\n\r\n if (reason === 1) {\r\n self.reason1Disagreed = true;\r\n self.reason1feedback = feedback ? feedback : null;\r\n } else {\r\n self.reason2Disagreed = true;\r\n self.reason2feedback = feedback ? feedback : null;\r\n }\r\n\r\n if (feedback)\r\n points += 500;\r\n\r\n grantPoints(points);\r\n\r\n $scope.$apply();\r\n\r\n if (feedback) {\r\n swal(translations.ThanksForFeedback, translations.ThanksForFeedbackComment + points + translations.ThanksForFeedbackPoints, \"success\");\r\n } else {\r\n swal(translations.ThanksForFeedbackTitle2, translations.ThanksForFeedbackComment, \"error\");\r\n }\r\n });\r\n }\r\n\r\n function grantPoints(points) {\r\n $rootScope.$broadcast(\"pointsAdded\", { points: points });\r\n }\r\n\r\n function loadData() {\r\n //Traigo data para el chart\r\n getDashboard(true);\r\n //traigo data para los boxes\r\n getYTDComparison(true);\r\n\r\n getNotifiactions(true);\r\n\r\n\r\n\r\n }\r\n\r\n function getNotifiactions(withSameStores) {\r\n homeService.dashboards.getNotification(withSameStores)\r\n .then(function (notif) {\r\n if (notif) {\r\n self.notification = notif;\r\n self.notificationPriceArrow = notif.causePrice.split('%')[0].indexOf('aumentó') > 0 ? 'fa fa-level-up' : notif.causePrice.split('%')[0].indexOf('cayó') > 0 ? 'fa fa-level-down' : '';\r\n self.notificationUnitsArrow = notif.causeUnits.split('%')[0].indexOf('aumentó') > 0 ? 'fa fa-level-up' : notif.causeUnits.split('%')[0].indexOf('cayó') > 0 ? 'fa fa-level-down' : '';\r\n }\r\n });\r\n }\r\n\r\n self.isLoadingChart = false;\r\n function getDashboard(withSameStores) {\r\n self.isLoadingChart = true;\r\n homeService.dashboards.getHomeDashboard(withSameStores)\r\n .then(function (homeDashboard) {\r\n self.isLoadingChart = false;\r\n if (homeDashboard == null || homeDashboard == '')\r\n return;\r\n\r\n self.homeDashboard = homeDashboard;\r\n\r\n self.updateChart(self.timerange);\r\n });\r\n }\r\n\r\n self.isLoadingBoxes = false;\r\n function getYTDComparison(withSameStores) {\r\n self.isLoadingBoxes = true;\r\n homeService.dashboards.getYtdComparison(withSameStores)\r\n .then(function (dashboardComparisonDto) {\r\n self.isLoadingBoxes = false;\r\n\r\n self.compareYtd = dashboardComparisonDto;\r\n self.updateBoxes('Goal');\r\n });\r\n\r\n }\r\n\r\n function init() {\r\n\r\n //load data\r\n loadData();\r\n }\r\n\r\n init();\r\n });\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n\r\n .controller(\"CategoryTreeMapCtrl\", function ($scope, $rootScope, $translate, homeService) {\r\n var self = this;\r\n\r\n self.selectedCategoryGroup = null;\r\n self.allCategoryGroups = null;\r\n\r\n var w = $(\"#categoryTreeMapDiv\").parent().width() - 50,\r\n h = 800,\r\n x = d3.scale.linear().range([0, w]),\r\n y = d3.scale.linear().range([0, h]),\r\n color = d3.scale.category20b(),\r\n root,\r\n node;\r\n\r\n var treemap = d3.layout.treemap()\r\n .round(false)\r\n .size([w, h])\r\n .sticky(false)\r\n .value(function (d) { return d.sales; });\r\n\r\n var svg = d3.select(\"#categoryTreeMapDiv\").append(\"div\")\r\n .attr(\"class\", \"chart\")\r\n .style(\"width\", w + \"px\")\r\n .style(\"height\", h + \"px\")\r\n .append(\"svg:svg\")\r\n .attr(\"width\", w)\r\n .attr(\"height\", h)\r\n .append(\"svg:g\")\r\n .attr(\"transform\", \"translate(.5,.5)\");\r\n\r\n function zoom(d) {\r\n var kx = w / d.dx,\r\n ky = h / d.dy;\r\n x.domain([d.x, d.x + d.dx]);\r\n y.domain([d.y, d.y + d.dy]);\r\n\r\n var t = svg.selectAll(\"g.cell\").transition()\r\n .duration(d3.event && d3.event.altKey ? 4000 : 750)\r\n .attr(\"transform\", function (d) {\r\n return \"translate(\" + x(d.x) + \",\" + y(d.y) + \")\";\r\n });\r\n\r\n t.select(\"rect\")\r\n .attr(\"width\", function (d) {\r\n var val = kx * d.dx - 1;\r\n if (val < 0)\r\n return 0;\r\n\r\n return val;\r\n })\r\n .attr(\"height\", function (d) {\r\n var val = ky * d.dy - 1;\r\n if (val < 0)\r\n return 0;\r\n\r\n return val;\r\n })\r\n\r\n t.select(\"text\")\r\n .attr(\"x\", function (d) {\r\n return kx * d.dx / 2;\r\n })\r\n .attr(\"y\", function (d) {\r\n return ky * d.dy / 2;\r\n })\r\n .style(\"opacity\", function (d) {\r\n return kx * d.dx > d.w ? 1 : 0;\r\n });\r\n\r\n node = d;\r\n d3.event.stopPropagation();\r\n }\r\n\r\n function sales(d) {\r\n return d.sales;\r\n }\r\n\r\n function units(d) {\r\n return d.units;\r\n }\r\n\r\n function margin(d) {\r\n return d.margin;\r\n }\r\n\r\n function marginP(d) {\r\n return d.marginP;\r\n }\r\n\r\n function price(d) {\r\n return d.price;\r\n }\r\n\r\n function inventory(d) {\r\n return d.inventory;\r\n }\r\n\r\n self.legend = [];\r\n\r\n function loadData() {\r\n\r\n homeService.categories.getCategoryGroups().then(function (cg) {\r\n self.allCategoryGroups = cg;\r\n });\r\n }\r\n\r\n self.start = function () {\r\n\r\n d3.select(\"#categoryTreeMapDiv div\").remove();\r\n\r\n svg = d3.select(\"#categoryTreeMapDiv\").append(\"div\")\r\n .attr(\"class\", \"chart\")\r\n .style(\"width\", w + \"px\")\r\n .style(\"height\", h + \"px\")\r\n .append(\"svg:svg\")\r\n .attr(\"width\", w)\r\n .attr(\"height\", h)\r\n .append(\"svg:g\")\r\n .attr(\"transform\", \"translate(.5,.5)\");\r\n\r\n self.legend = [];\r\n\r\n homeService.categoryTreeMap.getCategoryTreeMap(self.selectedCategoryGroup)\r\n\r\n .then(function (data) {\r\n node = root = data;\r\n\r\n var nodes = treemap.nodes(root)\r\n .filter(function (d) { return !d.children; });\r\n\r\n var cell = svg.selectAll(\"g\")\r\n .data(nodes)\r\n .enter().append(\"svg:g\")\r\n .attr(\"class\", \"cell\")\r\n .attr(\"transform\", function (d) {\r\n return \"translate(\" + d.x + \",\" + d.y + \")\";\r\n })\r\n .on(\"click\", function (d) {\r\n return zoom(node == d.parent ? root : d.parent);\r\n });\r\n\r\n cell.append(\"svg:rect\")\r\n .attr(\"width\", function (d) {\r\n var val = d.dx - 1;\r\n if (val < 0)\r\n return 0;\r\n\r\n return val;\r\n })\r\n .attr(\"height\", function (d) {\r\n var val = d.dy - 1;\r\n if (val < 0)\r\n return 0;\r\n\r\n return val;\r\n })\r\n .style(\"fill\", function (d) {\r\n var c = color(d.parent.name);\r\n\r\n var colors = [];\r\n\r\n var exists = false;\r\n angular.forEach(self.legend, function (l) {\r\n if (l.name === d.parent.name) exists = true;\r\n });\r\n\r\n if (!exists) {\r\n self.legend.push({\r\n name: d.parent.name,\r\n color: c,\r\n node: d.parent\r\n });\r\n }\r\n\r\n return c;\r\n });\r\n //.style(\"fill\", function (d) { return color(d.parent.name); });\r\n\r\n cell.append(\"svg:text\")\r\n .attr(\"x\", function (d) { return d.dx / 2; })\r\n .attr(\"y\", function (d) { return d.dy / 2; })\r\n .attr(\"dy\", \".35em\")\r\n .attr(\"text-anchor\", \"middle\")\r\n .text(function (d) { return d.name; })\r\n .style(\"opacity\", function (d) { d.w = this.getComputedTextLength(); return d.dx > d.w ? 1 : 0; });\r\n\r\n d3.select(window).on(\"click\", function () { zoom(root); });\r\n\r\n d3.select(\"select#variable\").on(\"change\", function () {\r\n treemap.value(this.value == \"sales\" ? sales : this.value == \"units\" ? units : this.value == \"margin\" ? margin : this.value == \"marginP\" ? marginP : this.value == \"price\" ? price : inventory).nodes(root);\r\n zoom(node);\r\n });\r\n });\r\n }\r\n\r\n function init() {\r\n //load data\r\n loadData();\r\n }\r\n\r\n init();\r\n });\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n\r\n .controller(\"BrandTreeMapCtrl\", function ($scope, $rootScope, $translate, homeService) {\r\n var self = this;\r\n\r\n self.selectedCategoryGroup = null;\r\n self.allCategoryGroups = null;\r\n\r\n var w = $(\"#categoryTreeMapDiv\").parent().width() - 50,\r\n h = 800,\r\n x = d3.scale.linear().range([0, w]),\r\n y = d3.scale.linear().range([0, h]),\r\n color = d3.scale.category20b(),\r\n root,\r\n node;\r\n\r\n var treemap = d3.layout.treemap()\r\n .round(false)\r\n .size([w, h])\r\n .sticky(true)\r\n .value(function (d) {\r\n return d.marginP;\r\n });\r\n\r\n var svg = d3.select(\"#categoryTreeMapDiv\").append(\"div\")\r\n .attr(\"class\", \"chart\")\r\n .style(\"width\", w + \"px\")\r\n .style(\"height\", h + \"px\")\r\n .append(\"svg:svg\")\r\n .attr(\"width\", w)\r\n .attr(\"height\", h)\r\n .append(\"svg:g\")\r\n .attr(\"transform\", \"translate(.5,.5)\");\r\n\r\n function zoom(d) {\r\n var kx = w / d.dx,\r\n ky = h / d.dy;\r\n x.domain([d.x, d.x + d.dx]);\r\n y.domain([d.y, d.y + d.dy]);\r\n\r\n var t = svg.selectAll(\"g.cell\").transition()\r\n .duration(d3.event && d3.event.altKey ? 4000 : 750)\r\n .attr(\"transform\", function (d) {\r\n return \"translate(\" + x(d.x) + \",\" + y(d.y) + \")\";\r\n });\r\n\r\n t.select(\"rect\")\r\n .attr(\"width\", function (d) {\r\n var val = kx * d.dx - 1;\r\n if (val < 0)\r\n return 0;\r\n\r\n return val;\r\n })\r\n .attr(\"height\", function (d) {\r\n var val = ky * d.dy - 1;\r\n if (val < 0)\r\n return 0;\r\n\r\n return val;\r\n })\r\n\r\n t.select(\"text\")\r\n .attr(\"x\", function (d) {\r\n return kx * d.dx / 2;\r\n })\r\n .attr(\"y\", function (d) {\r\n return ky * d.dy / 2;\r\n })\r\n .style(\"opacity\", function (d) {\r\n return kx * d.dx > d.w ? 1 : 0;\r\n });\r\n\r\n node = d;\r\n\r\n if (d3.event) d3.event.stopPropagation();\r\n }\r\n\r\n function sales(d) {\r\n return d.sales;\r\n }\r\n\r\n function units(d) {\r\n return d.units;\r\n }\r\n\r\n function margin(d) {\r\n return d.margin;\r\n }\r\n\r\n function marginP(d) {\r\n return d.marginP;\r\n }\r\n\r\n function price(d) {\r\n return d.price;\r\n }\r\n\r\n function inventory(d) {\r\n return d.inventory;\r\n }\r\n\r\n self.legend = [];\r\n\r\n function loadData() {\r\n homeService.categoryTreeMap.getBrandTreeMap()\r\n\r\n .then(function (data) {\r\n node = root = data;\r\n\r\n var nodes = treemap.nodes(root)\r\n .filter(function (d) { return !d.children; });\r\n\r\n var cell = svg.selectAll(\"g\")\r\n .data(nodes)\r\n .enter().append(\"svg:g\")\r\n .attr(\"class\", \"cell\")\r\n .attr(\"transform\", function (d) {\r\n return \"translate(\" + d.x + \",\" + d.y + \")\";\r\n })\r\n .on(\"click\", function (d) {\r\n return zoom(node == d.parent ? root : d.parent);\r\n });\r\n\r\n cell.append(\"svg:rect\")\r\n .attr(\"width\", function (d) {\r\n var val = d.dx - 1;\r\n if (val < 0)\r\n return 0;\r\n\r\n return val;\r\n })\r\n .attr(\"height\", function (d) {\r\n var val = d.dy - 1;\r\n if (val < 0)\r\n return 0;\r\n\r\n return val;\r\n })\r\n .style(\"fill\", function (d) {\r\n var c = color(d.parent.name);\r\n\r\n var colors = [];\r\n\r\n var exists = false;\r\n angular.forEach(self.legend, function (l) {\r\n if (l.name === d.parent.name) exists = true;\r\n });\r\n\r\n if (!exists) {\r\n self.legend.push({\r\n name: d.parent.name,\r\n color: c,\r\n node: d.parent\r\n });\r\n }\r\n\r\n return c;\r\n });\r\n\r\n cell.append(\"svg:text\")\r\n .attr(\"x\", function (d) { return d.dx / 2; })\r\n .attr(\"y\", function (d) { return d.dy / 2; })\r\n .attr(\"dy\", \".35em\")\r\n .attr(\"text-anchor\", \"middle\")\r\n .text(function (d) { return d.name; })\r\n .style(\"opacity\", function (d) { d.w = this.getComputedTextLength(); return d.dx > d.w ? 1 : 0; });\r\n\r\n d3.select(window).on(\"click\", function () { zoom(root); });\r\n\r\n d3.select(\".legend-item\").on(\"click\", function (d) { zoom(root) });\r\n\r\n d3.select(\"select\").on(\"change\", function () {\r\n treemap.value(this.value == \"sales\" ? sales : this.value == \"units\" ? units : this.value == \"margin\" ? margin : this.value == \"marginP\" ? marginP : this.value == \"price\" ? price : inventory).nodes(root);\r\n zoom(node);\r\n });\r\n });\r\n }\r\n\r\n\r\n function init() {\r\n //load data\r\n loadData();\r\n }\r\n\r\n init();\r\n });","\r\n\r\n\r\nangular.module(\"prisma\")\r\n\r\n .controller(\"BenchmarksCtrl\", function ($timeout, $scope, $rootScope, homeService, authService) {\r\n\r\n var self = this;\r\n self.sameStores = true;\r\n self.showLoader = true;\r\n self.salesChartData = null;\r\n self.marginChartData = null;\r\n self.unitsChartData = null;\r\n self.selectedType = 'spline';\r\n self.stores = [];\r\n self.categories = [];\r\n self.items = [];\r\n self.clusters = [];\r\n self.selectedStores = [];\r\n self.selectedCategories = [];\r\n self.selectedItems = [];\r\n self.selectedClusters = [];\r\n\r\n self.filterByStore = [];\r\n self.filterByCategory = [];\r\n self.filterByItem = [];\r\n self.filterByCluster = [];\r\n\r\n self.updateCharts = function () {\r\n\r\n if (self.salesChartData == null)\r\n return;\r\n //console.log(' self.salesChartData', self.salesChartData);\r\n self.salesChart = c3.generate(getChartConfig('#bechmarkSalesChart', self.salesChartData));\r\n\r\n if (self.marginChartData == null)\r\n return;\r\n self.marginChart = c3.generate(getChartConfig('#bechmarkMarginChart', self.marginChartData));\r\n\r\n if (self.unitsChartData == null)\r\n return;\r\n self.unitsChart = c3.generate(getChartConfig('#bechmarkUnitsChart', self.unitsChartData));\r\n }\r\n\r\n $scope.$watch('ct.selectedStores', function (newVal, oldVal) {\r\n if (newVal.length > 0) {\r\n self.selectedCategories = [];\r\n self.selectedItems = [];\r\n self.selectedClusters = [];\r\n self.filterByStore = [];\r\n }\r\n }, true);\r\n\r\n $scope.$watch('ct.selectedCategories', function (newVal, oldVal) {\r\n if (newVal.length > 0) {\r\n self.selectedStores = [];\r\n self.selectedItems = [];\r\n self.selectedClusters = [];\r\n self.filterByCategory = [];\r\n }\r\n }, true);\r\n\r\n $scope.$watch('ct.selectedItems', function (newVal, oldVal) {\r\n if (newVal.length > 0) {\r\n self.selectedStores = [];\r\n self.selectedCategories = [];\r\n self.selectedClusters = [];\r\n self.filterByItem = [];\r\n }\r\n }, true);\r\n\r\n $scope.$watch('ct.selectedClusters', function (newVal, oldVal) {\r\n if (newVal.length > 0) {\r\n self.selectedStores = [];\r\n self.selectedCategories = [];\r\n self.selectedItems = [];\r\n self.filterByCluster = [];\r\n }\r\n }, true);\r\n\r\n $scope.$watch('ct.filterByCluster', function (newVal, oldVal) {\r\n if (newVal.length > 0) {\r\n if (self.selectedClusters.length > 0) {\r\n swal(\"No puede comparar y filtrar por cluster a la vez\", \"\", \"warning\");\r\n self.filterByCluster = [];\r\n }\r\n }\r\n }, true);\r\n\r\n $scope.$watch('ct.filterByItem', function (newVal, oldVal) {\r\n if (newVal.length > 0) {\r\n self.selectedItems = [];\r\n }\r\n }, true);\r\n\r\n $scope.$watch('ct.filterByStore', function (newVal, oldVal) {\r\n if (newVal.length > 0) {\r\n self.selectedStores = [];\r\n }\r\n }, true);\r\n\r\n self.compare = function () {\r\n\r\n self.showLoader = true;\r\n\r\n var parameters = {\r\n companyId: authService.authentication.companyId,\r\n sameStores: self.sameStores,\r\n fromDate: self.fromDate,\r\n toDate: self.toDate,\r\n storeIdsToCompare: [],\r\n categoryIdsToCompare: [],\r\n clusterIdsToCompare: [],\r\n itemIdsToCompare: [],\r\n itemIds: [],\r\n storeIds: [],\r\n categoryIds: [],\r\n clusterIds: []\r\n }\r\n\r\n //Compare\r\n angular.forEach(self.selectedStores, function (st) {\r\n parameters.storeIdsToCompare.push(st.id);\r\n });\r\n angular.forEach(self.selectedCategories, function (st) {\r\n parameters.categoryIdsToCompare.push(st.id);\r\n });\r\n angular.forEach(self.selectedClusters, function (st) {\r\n parameters.clusterIdsToCompare.push(st.id);\r\n });\r\n angular.forEach(self.selectedItems, function (st) {\r\n parameters.itemIdsToCompare.push(st.id);\r\n });\r\n\r\n //Filtros\r\n angular.forEach(self.filterByStore, function (st) {\r\n parameters.storeIds.push(st.id);\r\n });\r\n angular.forEach(self.filterByCategory, function (st) {\r\n parameters.categoryIds.push(st.id);\r\n });\r\n angular.forEach(self.filterByCluster, function (st) {\r\n parameters.clusterIds.push(st.id);\r\n });\r\n angular.forEach(self.filterByItem, function (st) {\r\n parameters.itemIds.push(st.id);\r\n });\r\n\r\n homeService.benchmark.getBenchmark(parameters)\r\n .then(function (chartData) {\r\n\r\n //console.log('chartdata', chartData);\r\n\r\n if (chartData && chartData.length > 0) {\r\n self.salesChartData = parseChartData(chartData, 'sales');\r\n self.marginChartData = parseChartData(chartData, 'margin');\r\n self.unitsChartData = parseChartData(chartData, 'units');\r\n\r\n self.updateCharts();\r\n }\r\n\r\n self.showLoader = false;\r\n }), function (error) {\r\n self.showLoader = false;\r\n };\r\n }\r\n\r\n self.updateChartType = function (type) {\r\n self.selectedType = type;\r\n self.salesChart.transform(type);\r\n self.marginChart.transform(type);\r\n self.unitsChart.transform(type);\r\n }\r\n\r\n function getChartConfig(chartId, data) {\r\n if (chartId != '#bechmarkUnitsChart') {\r\n return {\r\n bindto: chartId,\r\n data: {\r\n x: 'x',\r\n columns: data,\r\n type: 'spline',\r\n },\r\n axis: {\r\n x: {\r\n type: 'timeseries',\r\n tick: {\r\n format: '%Y-%m',\r\n }\r\n },\r\n y: {\r\n tick: {\r\n format: d3.format(\"s\")\r\n }\r\n }\r\n },\r\n tooltip: {\r\n format: {\r\n title: function (d) {\r\n if (d) {\r\n var toFormat = '%B %Y';\r\n if (self.timerange == 'year')\r\n toFormat = '%B %Y';\r\n\r\n var format = d3.time.format(toFormat);\r\n return format(d);\r\n }\r\n },\r\n value: function (value, ratio, id) {\r\n var format = d3.format('$,.3s');\r\n return format(value);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n else\r\n {\r\n return {\r\n bindto: chartId,\r\n data: {\r\n x: 'x',\r\n columns: data,\r\n type: 'spline',\r\n },\r\n axis: {\r\n x: {\r\n type: 'timeseries',\r\n tick: {\r\n format: '%Y-%m',\r\n }\r\n },\r\n y: {\r\n tick: {\r\n format: d3.format(\"s\")\r\n }\r\n }\r\n },\r\n tooltip: {\r\n format: {\r\n title: function (d) {\r\n if (d) {\r\n var toFormat = '%B %Y';\r\n if (self.timerange == 'year')\r\n toFormat = '%B %Y';\r\n\r\n var format = d3.time.format(toFormat);\r\n return format(d);\r\n }\r\n },\r\n value: function (value, ratio, id) {\r\n var format = d3.format(',.3s'); \r\n return format(value);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n function parseChartData(chartData, chart) {\r\n var data = [];\r\n var names = [];\r\n var dates = ['x'];\r\n var series = [];\r\n\r\n //obtengo names\r\n var name = '';\r\n angular.forEach(chartData, function (d) {\r\n if (d.name !== name) {\r\n names.push(d.name);\r\n name = d.name;\r\n }\r\n });\r\n\r\n\r\n //obtengo dates\r\n var date = '';\r\n name = chartData[0].name;\r\n angular.forEach(chartData, function (d) {\r\n var currDate = d.transactionYear + '-' + d.transactionMonth + '-1';\r\n if (d.name == name) {\r\n if (currDate !== date) {\r\n dates.push(currDate);\r\n date = currDate;\r\n }\r\n }\r\n });\r\n\r\n //armo las series\r\n var serie = [];\r\n name = '';\r\n angular.forEach(names, function (n) {\r\n angular.forEach(chartData, function (d) {\r\n if (d.name !== name) {\r\n if (serie.length > 0)\r\n series.push(serie);\r\n\r\n serie = [];\r\n serie.push(d.name);\r\n serie.push(d[chart]);\r\n name = d.name;\r\n }\r\n else {\r\n serie.push(d[chart]);\r\n }\r\n });\r\n });\r\n\r\n data.push(dates);\r\n angular.forEach(series, function (s) {\r\n data.push(s);\r\n });\r\n\r\n return data;\r\n }\r\n\r\n function loadData() {\r\n\r\n homeService.benchmark.getBenchmarkValues()\r\n .then(function (values) {\r\n\r\n self.stores = values.stores;\r\n self.categories = values.categories;\r\n self.items = values.items;\r\n self.clusters = values.clusters;\r\n\r\n var date = new Date();\r\n self.toDate = new Date(date.getFullYear(), date.getMonth() - 1, 1);\r\n self.fromDate = new Date(date.getFullYear(), date.getMonth() - 12, 1);\r\n\r\n //self.compare();\r\n self.showLoader = false;\r\n });\r\n\r\n }\r\n\r\n function init() {\r\n\r\n //load data\r\n loadData();\r\n }\r\n\r\n init();\r\n });\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n .controller(\"BcgMatrixCtrl\", function ($scope, homeService) {\r\n var self = this;\r\n self.section = \"Inicio\";\r\n self.name = \"Matriz BCG\";\r\n\r\n // Various accessors that specify the four dimensions of data to visualize.\r\n function x(d) { return d.marginP; }\r\n function y(d) { return d.sales; }\r\n function radius(d) { return d.units; }\r\n function color(d) { return d.category; }\r\n function key(d) { return d.subCategory; }\r\n\r\n var margin = { top: 30, right: 20, bottom: 30, left: 80 },\r\n width = $(\"div\").parent().width() - margin.right - margin.left,\r\n height = 400 - margin.top - margin.bottom;\r\n\r\n // Create the SVG container and set the origin.\r\n var svg = d3.select(\"#bgcmatrixchart\").append(\"svg\")\r\n .attr(\"width\", width + margin.left + margin.right)\r\n .attr(\"height\", height + margin.top + margin.bottom)\r\n .append(\"g\")\r\n .attr(\"transform\", \"translate(\" + margin.left + \",\" + margin.top + \")\")\r\n .attr(\"class\", \"gRoot\");\r\n\r\n // Add the year label; the value is set on transition.\r\n var label = svg.append(\"text\")\r\n .attr(\"class\", \"year label\")\r\n .attr(\"text-anchor\", \"end\")\r\n .attr(\"y\", 0)\r\n .attr(\"x\", width - 300)\r\n .text(\"Cargando...\");\r\n\r\n // Add the country label; the value is set on transition.\r\n var countrylabel = svg.append(\"text\")\r\n .attr(\"class\", \"country label\")\r\n .attr(\"text-anchor\", \"end\")\r\n .attr(\"y\", 40)\r\n .attr(\"x\", width - 300)\r\n .text(\" \");\r\n\r\n var monthNames = [\r\n\"Enero\", \"Febrero\", \"Marzo\",\r\n\"Abril\", \"Mayo\", \"Junio\", \"Julio\",\r\n\"Agosto\", \"Septiembre\", \"Octubre\",\r\n\"Noviembre\", \"Diciembre\"\r\n ];\r\n\r\n var first_time = true;\r\n var lastMonth = 0;\r\n\r\n function loadData() {\r\n homeService.categoryBCGMatrix.getCategoryBCGMatrix()\r\n .then(function (root) {\r\n\r\n var data = root.children;\r\n\r\n // Various scales. These domains make assumptions of data, naturally.\r\n var xScale = d3.scale.linear().domain([0, 100]).range([0, width]),\r\n yScale = d3.scale.linear().domain([0, root.maxSales]).range([height, 0]),\r\n radiusScale = d3.scale.sqrt().domain([0, root.maxUnits]).range([0, 70]),\r\n colorScale = d3.scale.category20b();\r\n\r\n // The x & y axes.\r\n var xAxis = d3.svg.axis().orient(\"bottom\").scale(xScale).ticks(12, d3.format(\",d\")),\r\n yAxis = d3.svg.axis().scale(yScale).orient(\"left\");\r\n\r\n // Add the x-axis.\r\n svg.append(\"g\")\r\n .attr(\"class\", \"x axis\")\r\n .attr(\"transform\", \"translate(0,\" + height + \")\")\r\n .call(xAxis);\r\n\r\n // Add the y-axis.\r\n svg.append(\"g\")\r\n .attr(\"class\", \"y axis\")\r\n .call(yAxis);\r\n\r\n // Add an x-axis label.\r\n svg.append(\"text\")\r\n .attr(\"class\", \"x label\")\r\n .attr(\"text-anchor\", \"end\")\r\n .attr(\"x\", width)\r\n .attr(\"y\", height - 6)\r\n .text(\"margen $ (total red)\");\r\n\r\n // Add a y-axis label.\r\n svg.append(\"text\")\r\n .attr(\"class\", \"y label\")\r\n .attr(\"text-anchor\", \"end\")\r\n .attr(\"y\", 6)\r\n .attr(\"dy\", \".75em\")\r\n .attr(\"transform\", \"rotate(-90)\")\r\n .text(\"venta en $ (total red)\");\r\n\r\n\r\n // A bisector since many nation's data is sparsely-defined.\r\n var bisect = d3.bisector(function (d) { return d[0]; });\r\n\r\n // Add a dot per nation. Initialize the data at 1800, and set the colors.\r\n var dot = svg.append(\"g\")\r\n .attr(\"class\", \"dots\")\r\n .selectAll(\".dot\")\r\n .data(interpolateData(0))\r\n .enter().append(\"circle\")\r\n .attr(\"class\", \"dot\")\r\n .style(\"fill\", function (d) { return colorScale(color(d)); })\r\n .call(position)\r\n .on(\"mousedow\", function (d, i) {\r\n\r\n })\r\n .on(\"mouseup\", function (d, i) {\r\n dot.classed(\"selected\", false);\r\n d3.select(this).classed(\"selected\", !d3.select(this).classed(\"selected\"));\r\n dragit.trajectory.display(d, i, \"selected\");\r\n\r\n //TODO: test if has been dragged\r\n // Look at the state machine history and find a drag event in it?\r\n\r\n })\r\n .on(\"mouseenter\", function (d, i) {\r\n clear_demo();\r\n if (dragit.statemachine.current_state == \"idle\") {\r\n dragit.trajectory.display(d, i)\r\n dragit.utils.animateTrajectory(dragit.trajectory.display(d, i), dragit.time.current, 1000)\r\n countrylabel.text(d.name);\r\n dot.style(\"opacity\", .4)\r\n d3.select(this).style(\"opacity\", 1)\r\n d3.selectAll(\".selected\").style(\"opacity\", 1)\r\n }\r\n })\r\n .on(\"mouseleave\", function (d, i) {\r\n\r\n if (dragit.statemachine.current_state == \"idle\") {\r\n countrylabel.text(\"\");\r\n dot.style(\"opacity\", 1);\r\n }\r\n\r\n dragit.trajectory.remove(d, i);\r\n })\r\n .call(dragit.object.activate)\r\n\r\n // Add a title.\r\n dot.append(\"title\")\r\n .text(function (d) { return d.name; });\r\n\r\n // Start a transition that interpolates the data based on year.\r\n svg.transition()\r\n .duration(30000)\r\n .ease(\"linear\");\r\n\r\n displayYear(0);\r\n\r\n var sliderValues = new Array();\r\n\r\n for (var i = 0; i < root.months; i++) {\r\n sliderValues.push(getMonthLabel(i));\r\n }\r\n //Slider\r\n $(\"#ionrange_4\").ionRangeSlider({\r\n values: sliderValues,\r\n type: 'single',\r\n hasGrid: true,\r\n onChange: function (data) {\r\n clear_demo();\r\n updateSlider(data.from, 500);\r\n },\r\n onFinish: function (data) {\r\n clear_demo();\r\n updateSlider(data.from, 500);\r\n },\r\n onUpdate: function (data) {\r\n clear_demo();\r\n updateSlider(data.from, 500);\r\n },\r\n });\r\n\r\n var slider = $(\"#ionrange_4\").data(\"ionRangeSlider\");\r\n\r\n function getMonthLabel(month) {\r\n var minDate = new Date(root.minDate);\r\n var utcDate = new Date(minDate.getUTCFullYear(), minDate.getUTCMonth(), minDate.getUTCDate());\r\n var date = new Date(new Date(utcDate).setMonth(utcDate.getMonth() + month));\r\n return monthNames[date.getMonth()] + ' ' + date.getFullYear();\r\n }\r\n\r\n // Positions the dots based on data.\r\n function position(dot) {\r\n dot.attr(\"cx\", function (d) { return xScale(x(d)); })\r\n .attr(\"cy\", function (d) { return yScale(y(d)); })\r\n .attr(\"r\", function (d) { return radiusScale(radius(d)); });\r\n }\r\n\r\n // Defines a sort order so that the smallest dots are drawn on top.\r\n function order(a, b) {\r\n return radius(b) - radius(a);\r\n }\r\n\r\n // Updates the display to show the specified year.\r\n function displayYear(month) {\r\n dot.data(interpolateData(month), key).call(position).sort(order);\r\n label.text(getMonthLabel(month));\r\n\r\n }\r\n\r\n // Interpolates the dataset for the given (fractional) year.\r\n function interpolateData(month) {\r\n return data.map(function (d) {\r\n return {\r\n name: d.subCategory,\r\n category: d.category,\r\n sales: interpolateValues(d.sales, month),\r\n units: interpolateValues(d.units, month),\r\n marginP: interpolateValues(d.marginP, month)\r\n };\r\n });\r\n }\r\n\r\n // Finds (and possibly interpolates) the value for the specified year.\r\n function interpolateValues(values, month) {\r\n var i = bisect.left(values, month, 0, values.length - 1),\r\n a = values[i];\r\n\r\n return a[1];\r\n }\r\n\r\n init();\r\n\r\n function update(v, duration) {\r\n slider.update({\r\n from: v\r\n });\r\n }\r\n\r\n function updateSlider(v, duration) {\r\n if (v == lastMonth) return;\r\n\r\n dragit.time.current = v;\r\n displayYear(dragit.time.current);\r\n lastMonth = v;\r\n }\r\n\r\n function init() {\r\n\r\n dragit.init(\".gRoot\");\r\n\r\n dragit.time = { min: 0, max: root.months, step: 1, current: 0 }\r\n dragit.data = d3.range(data.length).map(function () { return Array(); })\r\n\r\n for (var mm = 0; mm < root.months; mm++) {\r\n\r\n interpolateData(mm).filter(function (d, i) {\r\n\r\n dragit.data[i][mm - dragit.time.min] = [xScale(x(d)), yScale(y(d))];\r\n\r\n })\r\n }\r\n\r\n dragit.evt.register(\"update\", update);\r\n\r\n var end_effect = function () {\r\n countrylabel.text(\"\");\r\n dot.style(\"opacity\", 1)\r\n }\r\n\r\n dragit.evt.register(\"dragend\", end_effect)\r\n }\r\n\r\n function clear_demo() {\r\n if (first_time) {\r\n svg.transition().duration(0);\r\n first_time = false;\r\n window.clearInterval(demo_interval);\r\n countrylabel.text(\"\");\r\n dragit.trajectory.removeAll();\r\n d3.selectAll(\".dot\").style(\"opacity\", 1)\r\n }\r\n }\r\n var demoCount = 0;\r\n function play_demo() {\r\n\r\n if (data.length == 0) return;\r\n\r\n if (demoCount >= root.months) return;\r\n //Muevo el slider\r\n // Change slider, by calling it's update method\r\n slider.update({\r\n from: demoCount\r\n });\r\n\r\n demoCount++;\r\n }\r\n var demo_interval = null;\r\n\r\n setTimeout(function () {\r\n if (first_time) {\r\n play_demo();\r\n demo_interval = setInterval(play_demo, 1000);\r\n }\r\n }, 1000);\r\n });\r\n }\r\n\r\n function init() {\r\n //load data\r\n loadData();\r\n }\r\n\r\n init();\r\n });\r\n\r\n","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n .controller(\"AssortmentReportCtrl\", function ($scope, homeService, adminService, $timeout, assortmentReportService, queueService, $rootScope, $q, $stateParams, ngDialog, $window, $http, $translate) {\r\n var self = this;\r\n var numberColWidth = 130;\r\n var columnDefs = null;\r\n\r\n self.allBrands = [];\r\n self.selectedBrands = [];\r\n\r\n self.allFormats = [];\r\n self.selectedFormat = [];\r\n\r\n self.allCustomerTypes = [];\r\n self.filteredAllCustomerTypes = [];\r\n self.selectedCustomerTypes = [];\r\n self.allCustomerBrands = [];\r\n\r\n self.allClusters = [];\r\n self.selectedClusters = [];\r\n\r\n self.allCategorySectors = [];\r\n self.selectedCategorySector = self.selectedCategorySector | {};\r\n\r\n self.allCategoryGroups = [];\r\n self.allCategoryGroupsFiltered = [];\r\n self.selectedCategoryGroup = self.selectedCategoryGroup | {};\r\n\r\n self.allCategories = [];\r\n self.allCategoriesFiltered = [];\r\n self.selectedCategory = self.selectedCategory | {};\r\n\r\n self.allSubCategories = [];\r\n self.allSubCategoriesFiltered = [];\r\n self.selectedSubCategorias = [];\r\n\r\n self.allTags = [];\r\n self.selectedTag = [];\r\n\r\n self.openByManufacturer = false;\r\n self.openByBrand = false;\r\n\r\n self.radioPeriod = '3';\r\n\r\n self.allTemplates = []\r\n\r\n self.showLoaderExecute = false;\r\n self.showLoaderExport = false;\r\n\r\n self.lastExecutedReports = [];\r\n\r\n self.selectedReport = null;\r\n self.showLastExecutedReports = false;\r\n\r\n self.changeCategorySector = function () {\r\n self.allCategoryGroupsFiltered = self.allCategoryGroups.filter(function (cat, index, ar) { return cat.parentId === self.selectedCategorySector });\r\n }\r\n\r\n self.changeCategoryGroup = function () {\r\n\r\n //self.allCategoriesFiltered = self.allCategories.filter(cat => cat.parentId === self.selectedCategoryGroup);\r\n self.allCategoriesFiltered = self.allCategories.filter(function (cat, index, ar) { return cat.parentId === self.selectedCategoryGroup });\r\n }\r\n\r\n self.changeCategory = function () {\r\n //self.allSubCategoriesFiltered = self.allSubCategories.filter(subc => subc.parentId === self.selectedCategory);\r\n self.allSubCategoriesFiltered = self.allSubCategories.filter(function (subc, index, ar) { return subc.parentId === self.selectedCategory });\r\n\r\n //traigo los clusters\r\n adminService.clusters.getClustersByCategory(self.selectedCategory)\r\n .then(function (clusters) {\r\n self.selectedClusters = [];\r\n self.allClusters = clusters;\r\n });\r\n }\r\n\r\n self.allBrandsCheck = false;\r\n self.allBrandsChange = function () {\r\n\r\n if (!self.allBrands) return;\r\n\r\n self.selectedBrands = [];\r\n\r\n //if (self.allFormatsCheck) {\r\n\r\n // for (var i = 0; i < self.allFormats.length; i++) {\r\n // self.selectedFormat.push(self.allFormats[i].id);\r\n // }\r\n //}\r\n }\r\n\r\n self.filterCustomerTypes = function (customer) {\r\n if (self.selectedBrands.length) {\r\n var filteredBrandsSelected = self.customerFormatBrands.filter(function (x) { return self.selectedBrands.includes(x.brandId) });\r\n var customerIds = filteredBrandsSelected.map(function (x) { return x.customerId });\r\n return customerIds.includes(customer.id);\r\n }\r\n return true;\r\n }\r\n\r\n self.filterFormats = function (format) {\r\n if (self.selectedBrands.length) {\r\n var filteredBrandsSelected = self.customerFormatBrands.filter(function (x) { return self.selectedBrands.includes(x.brandId) });\r\n var formatIds = filteredBrandsSelected.map(function (x) { return x.storeFormatId });\r\n return formatIds.includes(format.id);\r\n }\r\n return true;\r\n }\r\n\r\n self.allFormatsCheck = false;\r\n self.allFormatsChange = function () {\r\n\r\n if (!self.allFormats) return;\r\n\r\n self.selectedFormat = [];\r\n\r\n //if (self.allFormatsCheck) {\r\n\r\n // for (var i = 0; i < self.allFormats.length; i++) {\r\n // self.selectedFormat.push(self.allFormats[i].id);\r\n // }\r\n //}\r\n }\r\n\r\n self.allCustomerTypesCheck = false;\r\n self.allCustomerTypesChange = function () {\r\n\r\n if (!self.allCustomerTypes) return;\r\n\r\n self.selectedCustomerTypes = [];\r\n\r\n }\r\n\r\n self.allClustersCheck = false;\r\n self.allClustersChange = function () {\r\n\r\n if (!self.allClusters) return;\r\n\r\n self.selectedClusters = [];\r\n\r\n //if (self.allClustersCheck) {\r\n\r\n // for (var i = 0; i < self.allClusters.length; i++) {\r\n // self.selectedClusters.push(self.allClusters[i].id);\r\n // }\r\n //}\r\n }\r\n\r\n self.allSubcategoriesCheck = false;\r\n self.allSubcategoriesChange = function () {\r\n\r\n if (!self.allSubCategories) return;\r\n\r\n self.selectedSubCategorias = [];\r\n\r\n\r\n //self.selectedCategory\r\n //if (self.allSubcategoriesCheck) {\r\n\r\n // for (var i = 0; i < self.allSubCategoriesFiltered.length; i++) {\r\n // self.selectedSubCategorias.push(self.allSubCategoriesFiltered[i].id);\r\n // }\r\n //}\r\n }\r\n\r\n self.saveTemplate = function () {\r\n\r\n swal(\r\n {\r\n title: translations.SaveTemplate,\r\n text: translations.Name,\r\n type: \"input\",\r\n showCancelButton: true,\r\n closeOnConfirm: false,\r\n animation: \"slide-from-top\",\r\n inputPlaceholder: translations.NameRole\r\n },\r\n function (inputValue) {\r\n if (inputValue === false) return false;\r\n\r\n if (inputValue.length < 2) {\r\n swal.showInputError(translations.NameValidation);\r\n return false\r\n }\r\n\r\n var filterData = getFilterData(inputValue);\r\n\r\n\r\n if (filterData.brands.length == 0 &&\r\n filterData.formats.length == 0 &&\r\n filterData.clusters.length == 0 &&\r\n filterData.sector == 0 &&\r\n filterData.categoryGroup == 0 &&\r\n filterData.category == 0 &&\r\n filterData.subCategories.length == 0 &&\r\n !filterData.openByBrand && !filterData.openByManufacturer &&\r\n filterData.tags.length == 0) {\r\n swal(translations.ErrorTitleSwal, translations.SelectAtLeastOneFilter, \"error\");\r\n return;\r\n }\r\n\r\n if (filterData.category == 0) {\r\n swal(translations.ErrorTitleSwal, translations.SelectAtLeastOneCategory, \"error\");\r\n return;\r\n }\r\n\r\n\r\n assortmentReportService.saveTemplate(filterData)\r\n\r\n .then(function () {\r\n swal(translations.Save, translations.TheTemplate + inputValue + translations.HasBeenCreatedSuccessfully, \"success\");\r\n }, function (err) {\r\n swal(translations.ErrorTitleSwal, translations.ErrorSavingTemplate + err.message, \"error\");\r\n });\r\n\r\n });\r\n }\r\n\r\n self.openSelectedTemplate = function (id) {\r\n var templates = self.allTemplates.filter(function (item) { return item.id == id });\r\n if (templates.length <= 0)\r\n return;\r\n\r\n var template = templates[0];\r\n\r\n //for (var i = 0; i < template.brands.length; i++) {\r\n // self.selectedBrands[template.brands[i]] = true;\r\n //}\r\n\r\n self.allBrandsCheck = template.allBrandsCheck;\r\n self.allFormatsCheck = template.allFormatsCheck;\r\n self.allCustomerTypesCheck = template.allCustomerTypesCheck;\r\n self.allClustersCheck = template.allClustersCheck;\r\n self.allSubcategoriesCheck = template.allSubcategoriesCheck;\r\n\r\n self.selectedBrands = self.allBrandsCheck ? [] : template.brands;\r\n self.selectedFormat = self.allFormatsCheck ? [] : template.formats;\r\n self.selectedCustomerTypes = self.allCustomerTypesCheck ? [] : template.customerTypes;\r\n\r\n self.selectedClusters = self.allClustersCheck ? [] : template.clusters;\r\n self.selectedCategorySector = template.sector;\r\n self.selectedCategoryGroup = template.categoryGroup;\r\n self.selectedCategory = template.category;\r\n self.selectedSubCategorias = self.allSubcategoriesCheck ? [] : template.subCategories;\r\n\r\n self.changeCategory();\r\n\r\n self.openByBrand = template.openByBrand;\r\n self.openByManufacturer = template.openByManufacturer;\r\n\r\n self.selectedTag = template.tags;\r\n\r\n self.radioPeriod = template.periodMonths.toString();\r\n\r\n }\r\n\r\n self.exportToExcel = function () {\r\n //self.showLastExecutedReports = true;\r\n\r\n // if (self.selectedReport == null)\r\n // return;\r\n\r\n self.showLoaderExport = true;\r\n\r\n assortmentReportService.exportToExcel(self.selectedReport).then(function (url) {\r\n self.showLoaderExport = false;\r\n $window.open(url, '_blank', '');\r\n console.log(url);\r\n });\r\n }\r\n\r\n function getFilterData(name) {\r\n\r\n var filterData = {\r\n name: name,\r\n //brands: [],\r\n brands: self.allBrandsCheck ? self.allBrands.map(function (a) { return a.brandId; }) : self.selectedBrands,\r\n formats: self.allFormatsCheck ? self.allFormats.map(function (a) { return a.id; }) : self.selectedFormat,\r\n customerTypes: self.allCustomerTypesCheck ? self.allCustomerTypes.map(function (a) { return a.id; }) : self.selectedCustomerTypes,\r\n clusters: self.allClustersCheck ? self.allClusters.map(function (a) { return a.id; }) : self.selectedClusters,\r\n sector: self.selectedCategorySector,\r\n categoryGroup: self.selectedCategoryGroup,\r\n category: self.selectedCategory,\r\n subCategories: self.allSubcategoriesCheck ? self.allSubCategoriesFiltered.map(function (a) { return a.id; }) : self.selectedSubCategorias,\r\n\r\n openByBrand: self.openByBrand,\r\n openByManufacturer: self.openByManufacturer,\r\n\r\n tags: self.selectedTag,\r\n\r\n PeriodMonths: self.radioPeriod,\r\n\r\n allBrandsCheck: self.allBrandsCheck,\r\n allFormatsCheck: self.allFormatsCheck,\r\n allCustomerTypesCheck: self.allCustomerTypesCheck,\r\n allClustersCheck: self.allClustersCheck,\r\n allSubcategoriesCheck: self.allSubcategoriesCheck,\r\n }\r\n\r\n //for (var i = 0; i < self.allBrands.length; i++) {\r\n // if (self.selectedBrands[self.allBrands[i].brandId]) {\r\n // filterData.brands.push(self.allBrands[i].brandId);\r\n // }\r\n //}\r\n\r\n return filterData;\r\n }\r\n\r\n self.openTemplate = function () {\r\n\r\n assortmentReportService.getTemplates()\r\n .then(function (templates) {\r\n self.allTemplates = templates;\r\n\r\n ngDialog.open({\r\n template: 'openTemplateModal',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: $scope\r\n });\r\n })\r\n }\r\n\r\n self.deleteTemplate = function (id) {\r\n assortmentReportService.deleteTemplate(id)\r\n .then(function (templates) {\r\n self.allTemplates = templates;\r\n })\r\n }\r\n\r\n self.ExecuteReport = function () {\r\n //TODO:validar??\r\n //console.log(getFilterData()); return;\r\n loadReportData();\r\n }\r\n\r\n self.disableTags = false;\r\n\r\n self.select3M6M = function () {\r\n self.disableTags = false;\r\n }\r\n\r\n self.select12M = function () {\r\n if (self.selectedTag.length <= 0) {\r\n return true;\r\n }\r\n\r\n swal(\r\n {\r\n title: translations.Confirm,\r\n type: \"warning\",\r\n text: translations.ConfirmPeriod,\r\n showCancelButton: true,\r\n closeOnConfirm: true,\r\n animation: \"slide-from-top\"\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n self.selectedTag = [];\r\n self.disableTags = true;\r\n }\r\n else {\r\n self.radioPeriod = \"3\";\r\n $('#defaultPeriod').trigger('click');\r\n $('#defaultPeriod').focus()\r\n $(\".btn12M\").removeClass(\"active\");\r\n $(\".btn12M\").css(\"background\", \"white\");\r\n\r\n $('#defaultPeriod').addClass(\"active\");\r\n\r\n $('#defaultPeriod').css(\"active\");\r\n self.disableTags = false;\r\n }\r\n }\r\n )\r\n }\r\n\r\n function getBrands() {\r\n homeService.scorecard.getBrands()\r\n .then(function (brands) {\r\n self.allBrands = brands;\r\n });\r\n }\r\n\r\n function getStoreFormats() {\r\n adminService.stores.getStoreFormats()\r\n .then(function (formats) {\r\n self.allFormats = formats;\r\n })\r\n }\r\n\r\n function getCustomerTypes() {\r\n adminService.stores.getCustomerTypes()\r\n .then(function (customerTypes) {\r\n self.allCustomerTypes = customerTypes;\r\n self.filteredAllCustomerTypes = customerTypes;\r\n })\r\n }\r\n\r\n function getCustomerFormatBrands() { //Trae la relacion bandera-cliente-formato\r\n adminService.stores.getCustomerFormatBrands()\r\n .then(function (customerFormatBrands) {\r\n self.customerFormatBrands = customerFormatBrands;\r\n })\r\n }\r\n\r\n function getClusters() {\r\n adminService.clusters.getClusters()\r\n .then(function (clusters) {\r\n self.allClusters = clusters;\r\n })\r\n }\r\n\r\n function getCategorySectors() {\r\n adminService.categories.getCategorySector()\r\n .then(function (c) {\r\n self.allCategorySectors = c;\r\n })\r\n }\r\n\r\n function getCategoryGroups() {\r\n adminService.categories.getCategoryGroups()\r\n .then(function (c) {\r\n self.allCategoryGroups = c;\r\n self.allCategoryGroupsFiltered = c;\r\n })\r\n }\r\n\r\n function getCategories() {\r\n adminService.categories.getCategories()\r\n .then(function (c) {\r\n self.allCategories = c;\r\n self.allCategoriesFiltered = c;\r\n })\r\n }\r\n\r\n function getSubCategories() {\r\n adminService.categories.getSubCategories()\r\n .then(function (c) {\r\n self.allSubCategories = c;\r\n self.allSubCategoriesFiltered = c;\r\n })\r\n }\r\n\r\n function getTags() {\r\n adminService.tags.getTagGroups()\r\n .then(function (t) {\r\n self.allTags = t;\r\n })\r\n }\r\n\r\n self.getLastExecutedReport = function () {\r\n self.loadingReport = true;\r\n assortmentReportService.getLastExecutedReport()\r\n .then(function (report) {\r\n self.selectedReport = report;\r\n self.loadingReport = false;\r\n });\r\n }\r\n\r\n function fieldValidator(array) {\r\n var rv = false;\r\n angular.forEach(array, function (value) {\r\n if (value === 0 || value === null) {\r\n rv = true;\r\n }\r\n });\r\n return rv;\r\n }\r\n //--------------------------------------------------\r\n //grid\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: ' ', //agrupacion\r\n width: numberColWidth + 200,\r\n pinned: 'left',\r\n field: 'groupName',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n cellRenderer: {\r\n renderer: 'group',\r\n checkbox: false,\r\n innerRenderer: function (params) {\r\n var name = params.value;\r\n return name;\r\n }\r\n }\r\n },\r\n {\r\n headerName: \"SKUs\",\r\n field: \"activeSkus\",\r\n filter: 'number',\r\n headerTooltip: translations.SKUsTooltip,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"% SKUs\",\r\n field: \"activeSkusPercentage\",\r\n filter: 'number',\r\n headerTooltip: translations.SKUsTooltip1,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererDirect\r\n },\r\n {\r\n headerName: translations.SalesDolar,\r\n field: \"sales\",\r\n filter: 'number',\r\n headerTooltip: translations.Sales,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.bigMoneyRenderer\r\n },\r\n {\r\n headerName: \"Share ($)\",\r\n field: \"share\",\r\n filter: 'number',\r\n headerTooltip: \"Share\",\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererDirect\r\n },\r\n {\r\n headerName: translations.SalesQty,\r\n field: \"salesqty\",\r\n filter: 'number',\r\n headerTooltip: translations.AmountOfSales,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.bigMoneyRenderer\r\n },\r\n {\r\n headerName: \"Share (qty)\",\r\n field: \"shareQty\",\r\n filter: 'number',\r\n headerTooltip: \"Share\",\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererDirect\r\n },\r\n {\r\n headerName: translations.MarginInDollars,\r\n field: \"margin\",\r\n filter: 'number',\r\n headerTooltip: translations.Margin,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.bigMoneyRenderer\r\n },\r\n {\r\n headerName: \"Share (Mg)\",\r\n field: \"shareMargin\",\r\n filter: 'number',\r\n headerTooltip: \"Share\",\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererDirect\r\n },\r\n {\r\n headerName: translations.Dds,\r\n field: \"dds\",\r\n filter: 'number',\r\n headerTooltip: translations.DaysInStock,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Stock ($)\",\r\n field: \"stock\",\r\n filter: 'number',\r\n headerTooltip: \"Cantidad de SKUs activos\",\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.bigMoneyRenderer\r\n },\r\n {\r\n headerName: \"Stock (%)\",\r\n field: \"stockPercentage\",\r\n filter: 'number',\r\n headerTooltip: \"Stock\",\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererDirect\r\n },\r\n //{\r\n // headerName: \"Aging ($)+180\",\r\n // field: \"agin\",\r\n // filter: 'number',\r\n // headerTooltip: \"Aging ($) + 180\",\r\n // width: numberColWidth,\r\n // cellClass: $rootScope.getClassForCell\r\n //},\r\n //{\r\n // headerName: \"Aging (%)+180\",\r\n // field: \"aginPercentage\",\r\n // filter: 'number',\r\n // headerTooltip: \"Aging (%) + 180\",\r\n // width: numberColWidth,\r\n // cellClass: $rootScope.getClassForCell,\r\n // cellRenderer: $rootScope.percentageRendererDirect,\r\n // cellRenderer: $rootScope.percentageRendererDirect\r\n //},\r\n {\r\n headerName: \"GMROI\",\r\n field: \"gmroi\",\r\n enableFilter: true,\r\n filter: 'number:2',\r\n headerTooltip: \"GMROI\",\r\n width: numberColWidth,\r\n //cellClass: $rootScope.getClassForCell\r\n },\r\n //{\r\n // headerName: \"GMROS\",\r\n // field: \"gmros\",\r\n // filter: 'number',\r\n // headerTooltip: \"GMROS\",\r\n // width: numberColWidth,\r\n // cellClass: $rootScope.getClassForCell\r\n //},\r\n ];\r\n\r\n }\r\n function setGridOptions() {\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n groupHeaders: false,\r\n suppressCellSelection: true,\r\n rowHeight: 35,\r\n groupHideGroupColumns: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n angularCompileRows: true,\r\n getNodeChildDetails: getNodeChildDetails,\r\n rowGroupOpened: rowGroupOpened\r\n };\r\n }\r\n\r\n\r\n function getNodeChildDetails(rowItem) {\r\n if (rowItem.subItems && rowItem.subItems.length > 0) {\r\n return {\r\n group: true,\r\n expanded: false,\r\n // provide ag-Grid with the children of this group\r\n children: rowItem.subItems,\r\n // the key is used by the default group cellRenderer\r\n key: rowItem.id\r\n };\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n function rowGroupOpened(rowItem) {\r\n console.log(rowItem);\r\n }\r\n\r\n self.showTagError = false;\r\n function loadReportData() {\r\n\r\n if (self.gridOptions != null) {\r\n self.showTagError = false;\r\n\r\n if (self.selectedTag && self.selectedTag.length > 5) {\r\n self.showTagError = true;\r\n\r\n return;\r\n }\r\n\r\n var filterData = getFilterData();\r\n\r\n //if (filterData.brands.length == 0 &&\r\n // filterData.formats.length == 0 &&\r\n // filterData.clusters.length == 0 &&\r\n // filterData.sector == 0 &&\r\n // filterData.categoryGroup == 0 &&\r\n // filterData.category == 0 &&\r\n // filterData.subCategories.length == 0 &&\r\n // !filterData.openByBrand && !filterData.openByManufacturer &&\r\n // filterData.tags.length == 0) {\r\n // swal(\"Error\", \"Seleccione al menos un filtro\", \"error\");\r\n // return;\r\n //}\r\n\r\n if (fieldValidator(filterData)) {\r\n swal(\"Error\", \"Seleccione Sector, Seccion y Familia\", \"error\");\r\n return;\r\n }\r\n\r\n swal({\r\n title: translations.GenerateTheReport,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n\r\n if (isConfirm) {\r\n\r\n assortmentReportService.loadReportData(filterData)\r\n .then(function (reportData) {\r\n\r\n if (reportData) {\r\n //Issue CP 960\r\n angular.forEach(reportData, function (brand) {\r\n if (brand.subItems) {\r\n angular.forEach(brand.subItems, function (bSubItem) {\r\n if (bSubItem.subItems) {\r\n for (var i = 0; i <= bSubItem.subItems.length; i++) {\r\n if (bSubItem.subItems[i] != null && bSubItem.subItems[i].activeSkus == 0) {\r\n bSubItem.subItems.splice(i, 1);\r\n i--;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n });\r\n swal(translations.GeneratedReport, translations.GeneratedReportSubtitle, \"success\");\r\n self.selectedReport = self.getLastExecutedReport();\r\n self.gridOptions.api.setRowData(reportData);\r\n self.gridOptions.api.sizeColumnsToFit();\r\n }\r\n else {\r\n swal(translations.GeneratingReport, translations.GeneratingReportSubtitle, \"success\");\r\n\r\n //actualizo las tareas pendientes.\r\n queueService.queuedTasks.getTop5();\r\n }\r\n\r\n\r\n });\r\n }\r\n });\r\n\r\n /*\r\n self.showTagError = false;\r\n \r\n self.showLoaderExecute = true;\r\n \r\n if (self.selectedTag.length > 5) {\r\n self.showTagError = true;\r\n self.showLoaderExecute = false;\r\n return;\r\n }\r\n \r\n var filterData = getFilterData();\r\n \r\n assortmentReportService.loadReportData(filterData).then(function (reportRows) {\r\n \r\n self.gridOptions.api.setRowData(reportRows);\r\n self.gridOptions.api.sizeColumnsToFit();\r\n \r\n self.showLoaderExecute = false;\r\n });*/\r\n }\r\n }\r\n\r\n self.openReport = function (dto) {\r\n\r\n self.showLoaderExecute = true;\r\n self.selectedReport = dto;\r\n assortmentReportService.openReport(dto)\r\n .then(function (reportRows) {\r\n self.showLoaderExecute = false;\r\n self.gridOptions.api.setRowData(reportRows);\r\n self.gridOptions.api.sizeColumnsToFit();\r\n });\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n setGridOptions();\r\n\r\n $translate([\"SaveTemplate\", \"Name\", \"NameRole\", \"NameValidation\", \"ErrorTitleSwal\", \"SelectAtLeastOneFilter\", \"SelectAtLeastOneCategory\"\r\n , \"Save\", \"TheTemplate\", \"HasBeenCreatedSuccessfully\", \"ErrorSavingTemplate\", \"Confirm\", \"ConfirmPeriod\", \"GenerateTheReport\"\r\n , \"ContinueSwal\", \"CancelSwal\", \"GeneratedReport\", \"GeneratedReportSubtitle\", \"GeneratingReport\", \"GeneratingReportSubtitle\"\r\n , \"SKUsTooltip\", \"SKUsTooltip1\", \"Sales\", \"SalesDolar\", \"AmountOfSales\", \"SalesQty\", \"MarginInDollars\", \"Margin\", \"DaysInStock\"\r\n , \"Dds\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n setColumnDefinitions();\r\n self.gridOptions.api.setColumnDefs(columnDefs);\r\n\r\n $timeout(function () {\r\n self.gridOptions.api.showNoRowsOverlay();\r\n }, 500);\r\n\r\n });\r\n\r\n getBrands();\r\n getStoreFormats();\r\n getCustomerTypes();\r\n getCustomerFormatBrands();\r\n\r\n //getClusters();\r\n\r\n getCategorySectors();\r\n getCategoryGroups();\r\n getCategories();\r\n getSubCategories();\r\n\r\n getTags();\r\n\r\n //getLastExecutedReports();\r\n }\r\n\r\n //button Collapsed\r\n $scope.isNavCollapsed = true;\r\n $scope.isCollapsed = false;\r\n $scope.isCollapsedHorizontal = false;\r\n\r\n $scope.isGeneralCollapsed = false;\r\n $scope.isScopeCollapsed = false;\r\n $scope.isOpeningCollapsed = false;\r\n $scope.isPeriodCollapsed = false;\r\n\r\n\r\n init();\r\n });\r\n","angular.module(\"prisma\")\r\n .controller(\"AssortmentSummaryReportCtrl\", function ($scope, $rootScope, $stateParams, $timeout, $filter, assortmentService, homeService) {\r\n var self = this;\r\n self.gridData = null;\r\n self.allCategoryGroups = null;\r\n self.selectedCategoryGroup = null;\r\n\r\n self.exportData = function () {\r\n var params = {\r\n skipHeader: false,\r\n skipFooters: false,\r\n skipGroups: false,\r\n allColumns: true,\r\n onlySelected: false,\r\n suppressQuotes: false,\r\n fileName: 'ExportReporteEstatico-Dinamico' + (new Date()).toISOString().replace(/[^0-9]/g, \"\").substring(0, 12) + '.csv',\r\n columnSeparator: ','\r\n };\r\n\r\n self.gridOptions.api.exportDataAsCsv(params);\r\n }\r\n\r\n //grid config\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: 'General',\r\n children: [\r\n {\r\n headerName: \"Sector / Categorias\",\r\n field: \"categoryName\",\r\n headerTooltip: \"Nombre del Sector / Categoria / SubCategoria\",\r\n width: 240,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellRenderer: {\r\n renderer: 'group',\r\n checkbox: false,\r\n innerRenderer: function (params) {\r\n var name = params.value + (params.node.group && params.node.children != null ? ' (' + params.node.children.length + ')' : '');\r\n\r\n if (params.node.level > 1)\r\n return params.value;\r\n else if (name != null)\r\n return name;\r\n else\r\n return '';\r\n }\r\n }\r\n },\r\n {\r\n headerName: \"Cluster\",\r\n field: \"clusterName\",\r\n width: 70,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n {\r\n headerName: \"Tienda\",\r\n field: \"storeName\",\r\n width: 210,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n ]\r\n },\r\n {\r\n headerName: 'Estatico',\r\n children: [\r\n {\r\n headerName: \"# Articulos\",\r\n headerTooltip: \"Categoria: Suma de SubCategorias | SubCategoria: Cantidad maxima de articulos de Clusters | Cluster: Cantiad maxima de articulos de Tiendas\",\r\n field: \"activeSkus\",\r\n width: 80,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: \"Cobertura\",\r\n field: \"coverage\",\r\n headerTooltip: \"Categoria: Promedio de SubCategorias | SubCategoria: Promedio de Clusters | Cluster: Promedio de Tiendas\",\r\n width: 90,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRenderer\r\n }]\r\n },\r\n {\r\n headerName: 'Dinamico',\r\n children: [\r\n {\r\n headerName: \"# Articulos PM\",\r\n field: \"activeSkusPM\",\r\n headerTooltip: \"Cantidad de articulos activos en el Mes anterior\",\r\n width: 100,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: \"Altas PM\",\r\n field: \"listedSkusPM\",\r\n headerTooltip: \"Altas en el Mes anterior\",\r\n width: 80,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: \"Bajas PM\",\r\n field: \"delistedSkusPM\",\r\n headerTooltip: \"Bajas en el Mes anterior\",\r\n width: 80,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: \"Impacto\",\r\n field: \"totalImpact\",\r\n headerTooltip: \"Impacto generado por los cambios realizados\",\r\n width: 100,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRenderer\r\n }]\r\n },\r\n ]\r\n }\r\n function setGridOptions() {\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: true,\r\n groupHideGroupColumns: true,\r\n groupUseEntireRow: false,\r\n groupSelectsChildren: false,\r\n rowHeight: 30,\r\n rowSelection: \"multiple\",\r\n rowDeselection: true,\r\n showToolPanel: false,// window.innerWidth > 1500,\r\n suppressRowClickSelection: true,\r\n suppressCellSelection: true,\r\n singleClickEdit: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n suppressColumnMoveAnimation: $rootScope.suppressColumnMoveAnimation(),\r\n enableRangeSelection: false,\r\n angularCompileRows: true,\r\n angularCompileHeaders: true,\r\n getNodeChildDetails: getNodeChildDetails,\r\n }\r\n }\r\n\r\n function getNodeChildDetails(rowItem) {\r\n if (rowItem.categories && rowItem.categories.length > 0) {\r\n return {\r\n group: true,\r\n expanded: false,\r\n // provide ag-Grid with the children of this group\r\n children: rowItem.categories,\r\n // the key is used by the default group cellRenderer\r\n key: rowItem.categoryName\r\n };\r\n }\r\n else if (rowItem.clusterStores && rowItem.clusterStores.length > 0) {\r\n return {\r\n group: true,\r\n expanded: false,\r\n // provide ag-Grid with the children of this group\r\n children: rowItem.clusterStores,\r\n // the key is used by the default group cellRenderer\r\n key: rowItem.categoryName\r\n };\r\n }\r\n else {\r\n return '';\r\n }\r\n }\r\n\r\n\r\n function loadData() {\r\n\r\n homeService.categories.getCategoryGroups()\r\n .then(function (cg) {\r\n self.allCategoryGroups = cg;\r\n });\r\n }\r\n\r\n self.changedCategoryGroup = function () {\r\n {\r\n self.gridOptions.api.showLoadingOverlay();\r\n\r\n assortmentService.summaryReport.getSummaryReport(self.selectedCategoryGroup)\r\n .then(function (data) {\r\n self.gridData = data;\r\n\r\n self.gridOptions.api.setRowData(self.gridData);\r\n self.gridOptions.api.refreshView();\r\n });\r\n }\r\n }\r\n\r\n function init() {\r\n loadData();\r\n\r\n setGridOptions();\r\n\r\n $timeout(function () {\r\n self.gridOptions.api.showNoRowsOverlay();\r\n }, 200)\r\n\r\n }\r\n\r\n init();\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"AssortmentRulesCategoryCtrl\", function ($rootScope, $scope, $state, $timeout, $interval, ngDialog, $filter, assortmentService, adminService, assortmentReportService, companyJson, $translate) {\r\n\r\n var self = this;\r\n var numberColWidth = 100;\r\n var editableColWidth = 140;\r\n var lastAdded = null;\r\n var columnDefs = null;\r\n\r\n self.gridOptions = null;\r\n self.summary = null;\r\n self.categoryRoleStrategyCoverages = [];\r\n self.brandCategoryRoleStrategyCoverages = [];\r\n self.roles = [];\r\n self.strategies = [];\r\n self.rsBrands = [];\r\n self.ruleTypes = [\r\n { id: 1, name: 'BAJA' },\r\n { id: 2, name: 'ALTA' }\r\n ];\r\n self.selectedRuleType = null;\r\n self.selectedBrand = 1;\r\n self.categoryLevel = 3;\r\n self.hideStrategy = null;\r\n\r\n self.customCategoryMonths = [];\r\n self.newCustomCategoryMonths = { toDelete: false, categoryId: 0, jan: true, feb: true, mar: true, apr: true, may: true, jun: true, jul: true, aug: true, sep: true, oct: true, nov: true, dic: true };\r\n\r\n self.goToRules = function (newTab, id, categoryGroup, category, subcategory) {\r\n\r\n categoryGroup = categoryGroup.replace(/ /g, \"-\").replace(/\\//g, \"_\");\r\n category = category.replace(/ /g, \"-\").replace(/\\//g, \"_\");\r\n subcategory = subcategory.replace(/ /g, \"-\").replace(/\\//g, \"_\");\r\n\r\n var encodedcategoryGroup = categoryGroup != 'null' ? encodeURIComponent(categoryGroup) : '';\r\n var encodedcategory = category != 'null' ? encodeURIComponent(category) : '';\r\n var encodedsubcategory = subcategory != 'null' ? encodeURIComponent(subcategory) : '';\r\n\r\n if (newTab)\r\n $state.goNewTab('assortment.rules', { categoryId: id, categoryGroup: encodedcategoryGroup, category: encodedcategory, subcategory: encodedsubcategory });\r\n else\r\n $state.go('assortment.rules', { categoryId: id, categoryGroup: encodedcategoryGroup, category: encodedcategory, subcategory: encodedsubcategory });\r\n\r\n }\r\n\r\n self.save = function () {\r\n swal({\r\n title: translations.DiscardConfirmTitle,\r\n //text: 'Esta seguro que desea guardar los cambios realizados y las estrategias, roles y cobertura para ' + _.find(self.rsBrands, function (b) { return b.brandId == self.selectedBrand }).name + '?',\r\n text: translations.AreYouSureSwalSubtitle,\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function () {\r\n var itemsToSave = [];\r\n var allIndexes100 = true;\r\n self.gridOptions.api.forEachNode(function (node) {\r\n if (node.data.dirty) {\r\n itemsToSave.push(node.data);\r\n }\r\n if ((node.data.indexSalesWeight || node.data.indexUnitsWeight || node.data.indexMarginWeight || node.data.indexMarketSalesWeight || node.data.indexMarketUnitsWeight) && //Que haya al menos uno no nulo\r\n (node.data.indexSalesWeight > 0 && node.data.indexUnitsWeight > 0 && node.data.indexMarginWeight > 0 && node.data.indexMarketSalesWeight > 0 && node.data.indexMarketUnitsWeight > 0) && //Que no haya numeros negativos\r\n ((node.data.indexSalesWeight + node.data.indexUnitsWeight + node.data.indexMarginWeight + node.data.indexMarketSalesWeight + node.data.indexMarketUnitsWeight) < 1 || //Que la suma este entre 1 y 0.9999 (WorkArround, la suma daba 0.9999999999999)\r\n (node.data.indexSalesWeight + node.data.indexUnitsWeight + node.data.indexMarginWeight + node.data.indexMarketSalesWeight + node.data.indexMarketUnitsWeight) < 0.9999))\r\n allIndexes100 = false;\r\n });\r\n\r\n if (allIndexes100) {\r\n if (itemsToSave.length > 0) {\r\n var categories = JSON.stringify(itemsToSave);\r\n assortmentService.rules.saveCategoryRules(categories, self.selectedBrand).then(function () {\r\n loadStrategyAndRoles(false);\r\n\r\n assortmentService.rules.saveCustomCategoryMonths(self.customCategoryMonths).then(function () {\r\n self.customCategoryMonths = [];\r\n loadData();\r\n swal(translations.ConfirmedSwal, translations.ConfirmedSwalSubtitle, \"success\");\r\n });\r\n\r\n }).catch(function (fallback) {\r\n console.log(fallback);\r\n swal(translations.ErrorTitleSwal, translations.ErrorSwalSubtitle, \"error\");\r\n });\r\n }\r\n else {\r\n $timeout(function () { swal(translations.NoChangesWereRecorded, \"\", \"info\") }, 200);\r\n }\r\n }\r\n else {\r\n $timeout(function () {\r\n swal(translations.ErrorTitleSwal, translations.SumErrorOfWeightedIndexes, \"error\");\r\n }, 200);\r\n }\r\n });\r\n }\r\n\r\n self.changeBrandClick = function (brandId) {\r\n var hasChanges = false;\r\n self.gridOptions.api.forEachNode(function (node) {\r\n if (node.data.dirty) {\r\n hasChanges = true;\r\n }\r\n });\r\n\r\n if (hasChanges) {\r\n swal({\r\n title: translations.PendingChangesWithoutSaving,\r\n text: translations.TheChangesYouHaveMadeInRoleWillBeLost + _.find(self.rsBrands, function (b) { return b.brandId == self.selectedBrand }).name + '.',\r\n type: \"info\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#DD6B55\",\r\n confirmButtonText: translations.Discard,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: true,\r\n closeOnCancel: true\r\n },\r\n function () {\r\n self.changeBrand(brandId);\r\n });\r\n }\r\n else\r\n self.changeBrand(brandId);\r\n }\r\n\r\n self.changeBrand = function (brandId) {\r\n\r\n self.selectedBrand = brandId;\r\n\r\n self.brandCategoryRoleStrategyCoverages = _.filter(self.categoryRoleStrategyCoverages, function (o) {\r\n return o.brandId == self.selectedBrand;\r\n });\r\n\r\n //Clear de los campos y seteo dirty = false en todos\r\n self.gridOptions.api.forEachNode(function (node) {\r\n node.data.categoryRole = null;\r\n node.data.categoryRoleId = null;\r\n node.data.categoryStrategy = null;\r\n node.data.categoryStrategyId = null;\r\n node.data.targetCoverage = null;\r\n node.data.dirty = false;\r\n self.gridOptions.api.refreshRows([node]);\r\n });\r\n\r\n //Recorro la grilla seteando los valores del brand seleccionado\r\n self.gridOptions.api.forEachNode(function (node) {\r\n\r\n angular.forEach(self.brandCategoryRoleStrategyCoverages, function (bc) {\r\n if (bc.id == node.data.id) {\r\n node.data.categoryRole = bc.categoryRole;\r\n node.data.categoryRoleId = bc.categoryRoleId;\r\n node.data.categoryStrategy = bc.categoryStrategy;\r\n node.data.categoryStrategyId = bc.categoryStrategyId;\r\n node.data.targetCoverage = bc.targetCoverage;\r\n //break;\r\n self.gridOptions.api.refreshRows([node]);\r\n }\r\n\r\n });\r\n });\r\n\r\n self.gridOptions.api.refreshView();\r\n\r\n }\r\n\r\n self.openCustomMonthsDialog = function (categoryIds, monthsValue) {\r\n var newScope = $scope.$new();\r\n newScope.customMonths = angular.copy(self.newCustomCategoryMonths);\r\n\r\n //Si es Custom, agrego los meses asociados a la categor�a\r\n if (monthsValue == 0) {\r\n\r\n newScope.saveCustomMonths = function () {\r\n\r\n angular.forEach(categoryIds, function (sc) {\r\n\r\n for (var i = 0; i < self.customCategoryMonths.length; i++) {\r\n var indexToRemove = null;\r\n if (self.customCategoryMonths[i].categoryId == sc)\r\n indexToRemove = i;\r\n\r\n if (indexToRemove != null)\r\n self.customCategoryMonths.splice(indexToRemove, 1);\r\n }\r\n\r\n newScope.customMonths.categoryId = sc;\r\n self.customCategoryMonths.push(angular.copy(newScope.customMonths));\r\n });\r\n\r\n ngDialog.close();\r\n }\r\n\r\n ngDialog.open({\r\n template: 'customCategoryMonthsDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n closeByDocument : false,\r\n scope: newScope\r\n });\r\n }\r\n else { //Si no es Custom, pongo toDelete a la categor�a para eliminar previas asociaciones.\r\n\r\n angular.forEach(categoryIds, function (sc) {\r\n\r\n for (var i = 0; i < self.customCategoryMonths.length; i++) {\r\n var indexToRemove = null;\r\n if (self.customCategoryMonths[i].categoryId == sc)\r\n indexToRemove = i;\r\n\r\n if (indexToRemove != null)\r\n self.customCategoryMonths.splice(indexToRemove, 1);\r\n }\r\n\r\n newScope.customMonths.categoryId = sc;\r\n self.customCategoryMonths.push(angular.copy(newScope.customMonths));\r\n });\r\n }\r\n };\r\n\r\n self.externalFilterChanged = function () {\r\n self.gridOptions.api.onFilterChanged();\r\n }\r\n\r\n //grid config\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: translations.Category,\r\n width: numberColWidth + 200,\r\n pinned: 'left',\r\n field: 'name',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n cellRenderer: {\r\n renderer: 'group',\r\n checkbox: false,\r\n innerRenderer: function (params) {\r\n var name = params.value + (params.node.group && params.node.children != null ? ' (' + params.node.children.length + ')' : '');\r\n\r\n if ((self.categoryLevel == 3 && params.node.data.level != 3) || (self.categoryLevel == 4 && params.node.data.level > 3)) {\r\n var anchor = document.createElement('a');\r\n anchor.title = translations.ClickToEnterCategory;\r\n anchor.style = 'padding: 5px';\r\n anchor.innerHTML = name;\r\n\r\n anchor.addEventListener('click', function (e) {\r\n var categoryGroup = '';\r\n var category = '';\r\n var subcategory = '';\r\n if (!params.node.parent || params.node.parent == null) {\r\n categoryGroup = params.value;\r\n }\r\n else if (params.node.parent != null && params.node.children != null) {\r\n categoryGroup = params.node.parent.data.name;\r\n category = params.value\r\n }\r\n else if (params.node.parent != null && params.node.children == null) {\r\n categoryGroup = params.node.parent.parent.data.name;\r\n category = params.node.parent.data.name\r\n subcategory = params.value\r\n }\r\n self.goToRules(e.ctrlKey, params.data.id, categoryGroup, category, subcategory);\r\n });\r\n\r\n return anchor;\r\n }\r\n else\r\n return name;\r\n }\r\n }\r\n },\r\n {\r\n headerName: translations.RoleAndStrategy,\r\n\r\n children: [\r\n {\r\n headerName: translations.Role,\r\n field: \"categoryRole\",\r\n headerTooltip: \"\",\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: dropDownDecisionEditor\r\n },\r\n {\r\n headerName: translations.Strategy,\r\n field: \"categoryStrategy\",\r\n headerTooltip: \"\",\r\n columnGroupShow: self.hideStrategy,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: dropDownDecisionEditor\r\n },\r\n {\r\n headerName: translations.Coverage,\r\n field: \"targetCoverage\",\r\n headerTooltip: \"\",\r\n filter: 'number',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: function (param) {\r\n if (param.data.level == 3) {\r\n param.value = param.data.subcategories\r\n .reduce(function (maxOfCat4, cat4) {\r\n return cat4.subcategories\r\n .map(function (x) { return x.targetCoverage; })\r\n .reduce(function (maxOfCat5, targetCoverage) {\r\n return targetCoverage > maxOfCat5 ? targetCoverage : maxOfCat5;\r\n }, 0);\r\n }, 0);\r\n }\r\n else if (param.data.level == 4) {\r\n param.value = param.data.subcategories\r\n .map(function (x) { return x.targetCoverage; })\r\n .reduce(function (maxOfCat5, targetCoverage) {\r\n return targetCoverage > maxOfCat5 ? targetCoverage : maxOfCat5; \r\n }, 0);\r\n }\r\n\r\n return $rootScope.WeightedIndexPercentageEditor(param);\r\n }\r\n }]\r\n },\r\n {\r\n headerName: translations.WeightedIndex,\r\n\r\n children: [\r\n {\r\n headerName: translations.Sales,\r\n field: \"indexSalesWeight\",\r\n filter: 'number',\r\n headerTooltip: \"\",\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: numberColWidth - 25,\r\n cellClass: $rootScope.getClassForWeightedIndexCell,\r\n cellRenderer: $rootScope.WeightedIndexPercentageEditor\r\n },\r\n {\r\n headerName: translations.Units,\r\n field: \"indexUnitsWeight\",\r\n filter: 'number',\r\n headerTooltip: \"\",\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: numberColWidth - 25,\r\n cellClass: $rootScope.getClassForWeightedIndexCell,\r\n cellRenderer: $rootScope.WeightedIndexPercentageEditor\r\n },\r\n {\r\n headerName: translations.MarginInDollars,\r\n field: \"indexMarginWeight\",\r\n headerTooltip: \"\",\r\n filter: 'number',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: numberColWidth - 10,\r\n cellClass: $rootScope.getClassForWeightedIndexCell,\r\n cellRenderer: $rootScope.WeightedIndexPercentageEditor\r\n },\r\n {\r\n headerName: translations.MarketSales,\r\n field: \"indexMarketSalesWeight\",\r\n headerTooltip: \"\",\r\n filter: 'number',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: numberColWidth + 10,\r\n cellClass: $rootScope.getClassForWeightedIndexCell,\r\n cellRenderer: $rootScope.WeightedIndexPercentageEditor\r\n },\r\n {\r\n headerName: translations.MarketUnits,\r\n field: \"indexMarketUnitsWeight\",\r\n headerTooltip: \"\",\r\n filter: 'number',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: numberColWidth + 25,\r\n cellClass: $rootScope.getClassForWeightedIndexCell,\r\n cellRenderer: $rootScope.WeightedIndexPercentageEditor\r\n },\r\n {\r\n headerName: translations.MonthsForCalculation,\r\n field: \"monthsForCalculations\",\r\n width: 190,\r\n headerTooltip: \"\",\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: dropDownDecisionEditorMonthsForCalculations\r\n }\r\n ]\r\n },\r\n {\r\n headerName: translations.AnalysisSchedule,\r\n\r\n children: [\r\n {\r\n headerName: translations.StartDate,\r\n field: \"rangeReviewStartDate\",\r\n headerTooltip: \"\",\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: numberColWidth + 40,\r\n cellClass: $rootScope.getClassForCell,\r\n filter: 'text',\r\n cellRenderer: self.dateEditor\r\n },\r\n {\r\n headerName: translations.Frequency,\r\n headerTooltip: translations.InDays,\r\n field: \"rangeReviewFrequencyInDays\",\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: numberColWidth - 10,\r\n cellClass: $rootScope.getClassForCell,\r\n filter: 'number',\r\n cellRenderer: $rootScope.integerEditor\r\n },\r\n {\r\n headerName: translations.LastRevision,\r\n field: \"rangeReviewLastRevision\",\r\n headerTooltip: \"\",\r\n filter: 'text',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n width: numberColWidth + 20,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.dateRenderer\r\n }]\r\n },\r\n ]\r\n }\r\n\r\n function setGridOptions() {\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: false,\r\n enableFilter: false,\r\n groupUseEntireRow: false,\r\n rowSelection: \"multiple\",\r\n groupSelectsChildren: true,\r\n suppressCellSelection: true,\r\n groupSuppressAutoColumn: false, // or undefined\r\n showToolPanel: false,// window.innerWidth > 1500,\r\n groupColumnDef: null, // or undefined\r\n singleClickEdit: true,\r\n rowHeight: 35,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n enableRangeSelection: false,\r\n angularCompileRows: true,\r\n getNodeChildDetails: getNodeChildDetails,\r\n enableFilter: true,\r\n doesExternalFilterPass: doesExternalFilterPass,\r\n isExternalFilterPresent: isExternalFilterPresent\r\n }\r\n }\r\n\r\n function changeStrategyOnColumnGroupShow() {\r\n if (companyJson.Erp && companyJson.Erp.Implementation && companyJson.Erp.Implementation == \"CencosudColombia\") {\r\n self.hideStrategy = 'open';\r\n }\r\n }\r\n\r\n function getNodeChildDetails(rowItem) {\r\n if (rowItem.subcategories && rowItem.subcategories.length > 0) {\r\n return {\r\n group: true,\r\n expanded: false,\r\n // provide ag-Grid with the children of this group\r\n children: rowItem.subcategories,\r\n // the key is used by the default group cellRenderer\r\n key: rowItem.id\r\n };\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n function isExternalFilterPresent() {\r\n return self.search != null && self.search != '';\r\n }\r\n\r\n function doesExternalFilterPass(node) {\r\n if (node.data.cat1.toLowerCase().indexOf(self.search.toLowerCase()) != -1\r\n || node.data.cat2 && node.data.cat2.toLowerCase().indexOf(self.search.toLowerCase()) != -1\r\n || node.data.cat3 && node.data.cat3.toLowerCase().indexOf(self.search.toLowerCase()) != -1\r\n || (self.categoryLevel > 3\r\n && node.data.cat4 && node.data.cat4.toLowerCase().indexOf(self.search.toLowerCase()) != -1)\r\n )\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n function dropDownDecisionEditorMonthsForCalculations(params) {\r\n\r\n var editing = false;\r\n\r\n var eCell = document.createElement('div');\r\n\r\n var eLabel = null\r\n\r\n if (params.value)\r\n eLabel = document.createTextNode('Ultimos ' + params.value + ' meses');\r\n else {\r\n if (params.data.customMonths && params.data.customMonths != '')\r\n eLabel = document.createTextNode(params.data.customMonths);\r\n else\r\n eLabel = document.createTextNode(\"Personalizado\");\r\n }\r\n\r\n eCell.appendChild(eLabel);\r\n\r\n var eSelect = document.createElement(\"select\");\r\n eSelect.className = \"form-control\";\r\n eSelect.style = \"margin:0px !important; border: 0px; line-height: 100%; font-size:12px !important\";\r\n\r\n for (var i = 0; i < self.monthsForCalculations.length; i++) {\r\n var eOption = document.createElement(\"option\");\r\n eOption.setAttribute(\"value\", self.monthsForCalculations[i].value);\r\n eOption.innerHTML = self.monthsForCalculations[i].text;\r\n eSelect.appendChild(eOption);\r\n }\r\n\r\n eSelect.value = params.data.monthsForCalculations;\r\n\r\n eCell.addEventListener('click', function () {\r\n if (!editing) {\r\n eCell.removeChild(eLabel);\r\n eCell.appendChild(eSelect);\r\n eSelect.focus();\r\n editing = true;\r\n }\r\n });\r\n\r\n eSelect.addEventListener('blur', function () {\r\n if (editing) {\r\n editing = false;\r\n eCell.removeChild(eSelect);\r\n eCell.appendChild(eLabel);\r\n }\r\n });\r\n\r\n eSelect.addEventListener('change', function () {\r\n if (editing) {\r\n\r\n var colIds = [];\r\n colIds.push(params.column.colId);\r\n var changedRows = [];\r\n changedRows.push(params.node);\r\n\r\n editing = false;\r\n var newValue = '';\r\n\r\n var categoryIds = [];\r\n for (var i = 0; i < self.monthsForCalculations.length; i++) {\r\n if (self.monthsForCalculations[i].value == eSelect.value) {\r\n newValue = self.monthsForCalculations[i].value;\r\n params.data['monthsForCalculations'] = newValue;\r\n\r\n if (params.data.level == 5) //Si elegi sub-categor�a la agrego\r\n categoryIds.push(params.data.id);\r\n else if (params.data.level == 4)\r\n categoryIds.push(params.data.id);\r\n\r\n //Children\r\n if (params.node != null && params.node.children != null) {\r\n params.node.children.forEach(function (node) {\r\n if (node.children) {\r\n node.children.forEach(function (node) {\r\n node.data['monthsForCalculations'] = newValue;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n if (node.data.level == 5) //Si elegi Grupo de Categorias, agrego a los hijos de las categorias (LVL5)\r\n categoryIds.push(node.data.id);\r\n });\r\n }\r\n node.data['monthsForCalculations'] = newValue;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n if (node.data.level == 5) //Si elegi Categoria, agrego a sus hijos (LVL5)\r\n categoryIds.push(node.data.id);\r\n else if (node.data.level == 4)\r\n categoryIds.push(node.data.id);\r\n });\r\n }\r\n break;\r\n }\r\n }\r\n\r\n params.data.dirty = true;\r\n\r\n params.api.refreshCells(changedRows, colIds);\r\n\r\n eLabel.nodeValue = newValue;\r\n eCell.removeChild(eSelect);\r\n eCell.appendChild(eLabel);\r\n\r\n self.openCustomMonthsDialog(categoryIds, newValue);\r\n }\r\n });\r\n\r\n return eCell;\r\n }\r\n\r\n function dropDownDecisionEditor(params) {\r\n\r\n var editing = false;\r\n\r\n var eCell = document.createElement('div');\r\n\r\n var eLabel = null\r\n\r\n if (params.value != null && params.value != \"\")\r\n eLabel = document.createTextNode(params.value);\r\n else\r\n eLabel = document.createTextNode(\"------------\");\r\n\r\n eCell.appendChild(eLabel);\r\n\r\n var eSelect = document.createElement(\"select\");\r\n eSelect.className = \"form-control\";\r\n eSelect.style = \"margin:0px !important; border: 0px; line-height: 100%; font-size:12px !important\";\r\n\r\n if (params.colDef.field == 'categoryRole') {\r\n for (var i = 0; i < self.roles.length; i++) {\r\n var eOption = document.createElement(\"option\");\r\n eOption.setAttribute(\"value\", self.roles[i].key);\r\n eOption.innerHTML = self.roles[i].value;\r\n eSelect.appendChild(eOption);\r\n }\r\n\r\n eSelect.value = params.data.categoryRoleId;\r\n }\r\n else if (params.colDef.field == 'categoryStrategy') {\r\n for (var i = 0; i < self.strategies.length; i++) {\r\n var eOption = document.createElement(\"option\");\r\n eOption.setAttribute(\"value\", self.strategies[i].key);\r\n eOption.innerHTML = self.strategies[i].value;\r\n eSelect.appendChild(eOption);\r\n }\r\n\r\n eSelect.value = params.data.categoryStrategyId;\r\n }\r\n\r\n eCell.addEventListener('click', function () {\r\n if (!editing) {\r\n eCell.removeChild(eLabel);\r\n eCell.appendChild(eSelect);\r\n eSelect.focus();\r\n editing = true;\r\n }\r\n });\r\n\r\n eSelect.addEventListener('blur', function () {\r\n if (editing) {\r\n editing = false;\r\n eCell.removeChild(eSelect);\r\n eCell.appendChild(eLabel);\r\n }\r\n });\r\n\r\n eSelect.addEventListener('change', function () {\r\n if (editing) {\r\n\r\n var colIds = [];\r\n colIds.push(params.column.colId);\r\n var changedRows = [];\r\n changedRows.push(params.node);\r\n\r\n editing = false;\r\n var newValue = '';\r\n if (params.colDef.field == 'categoryRole') {\r\n for (var i = 0; i < self.roles.length; i++) {\r\n if (self.roles[i].key == eSelect.value) {\r\n newValue = self.roles[i].value;\r\n params.data['categoryRole'] = newValue;\r\n params.data['categoryRoleId'] = eSelect.value;\r\n //Children\r\n if (params.node != null && params.node.children != null) {\r\n params.node.children.forEach(function (node) {\r\n if (node.children) {\r\n node.children.forEach(function (node) {\r\n node.data['categoryRole'] = newValue;\r\n node.data['categoryRoleId'] = eSelect.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n }\r\n node.data['categoryRole'] = newValue;\r\n node.data['categoryRoleId'] = eSelect.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n }\r\n break;\r\n }\r\n }\r\n\r\n }\r\n else if (params.colDef.field == 'categoryStrategy') {\r\n for (var i = 0; i < self.strategies.length; i++) {\r\n if (self.strategies[i].key == eSelect.value) {\r\n newValue = self.strategies[i].value;\r\n params.data['categoryStrategy'] = newValue;\r\n params.data['categoryStrategyId'] = eSelect.value;\r\n\r\n //Children\r\n if (params.node != null && params.node.children != null) {\r\n params.node.children.forEach(function (node) {\r\n if (node.children) {\r\n node.children.forEach(function (node) {\r\n node.data['categoryStrategy'] = newValue;\r\n node.data['categoryStrategyId'] = eSelect.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n }\r\n node.data['categoryStrategy'] = newValue;\r\n node.data['categoryStrategyId'] = eSelect.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n params.data.dirty = true;\r\n for (var i = 0; i < self.categoryRoleStrategyCoverages.length; i++) {\r\n if (params.data['categoryRoleId'] == self.categoryRoleStrategyCoverages[i].categoryRoleId\r\n && params.data['categoryStrategyId'] == self.categoryRoleStrategyCoverages[i].categoryStrategyId) {\r\n params.data['targetCoverage'] = self.categoryRoleStrategyCoverages[i].targetCoverage;\r\n //Children\r\n if (params.node != null && params.node.children != null) {\r\n params.node.children.forEach(function (node) {\r\n if (node.children) {\r\n node.children.forEach(function (node) {\r\n node.data['targetCoverage'] = self.categoryRoleStrategyCoverages[i].targetCoverage;\r\n });\r\n }\r\n node.data['targetCoverage'] = self.categoryRoleStrategyCoverages[i].targetCoverage;\r\n });\r\n }\r\n\r\n colIds.push('targetCoverage');\r\n break;\r\n }\r\n }\r\n\r\n params.api.refreshCells(changedRows, colIds);\r\n\r\n eLabel.nodeValue = newValue;\r\n eCell.removeChild(eSelect);\r\n eCell.appendChild(eLabel);\r\n self.gridOptions.api.refreshView();\r\n }\r\n self.gridOptions.api.refreshView();\r\n });\r\n\r\n return eCell;\r\n }\r\n\r\n self.download = function () {\r\n if (!self.selectedRuleType) {\r\n swal('Seleccione un tipo de regla.', '', 'error');\r\n return;\r\n }\r\n self.isLoadingReport = true;\r\n assortmentReportService.downloadRulesReport(self.selectedRuleType)\r\n .then(function (url) {\r\n self.isLoadingReport = false;\r\n window.open(url);\r\n });\r\n }\r\n\r\n var isFirstLoad = true;\r\n function loadData() {\r\n self.categoryLevel = companyJson.Category.Levels;\r\n\r\n assortmentService.rules.getCategories(self.categoryLevel)\r\n .then(function (summary) {\r\n\r\n self.summary = summary;\r\n\r\n //seteo los nombres de las jerarquias a cada nodo (facilita el filtro de busqueda)\r\n setHierarchiesNames(self.categoryLevel);\r\n\r\n self.gridOptions.api.setRowData(summary);\r\n\r\n loadStrategyAndRoles(isFirstLoad);\r\n isFirstLoad = false;\r\n });\r\n }\r\n\r\n //agrega campos de nombre de categoria de todos los niveles a cada nodo para facilitar la busqueda por texto libre\r\n function setHierarchiesNames() {\r\n angular.forEach(self.summary, function (cat1) {\r\n cat1.cat1 = cat1.name;\r\n angular.forEach(cat1.subcategories, function (cat2) {\r\n cat2.cat1 = cat1.name;\r\n cat2.cat2 = cat2.name;\r\n angular.forEach(cat2.subcategories, function (cat3) {\r\n cat3.cat1 = cat1.name;\r\n cat3.cat2 = cat2.name;\r\n cat3.cat3 = cat3.name;\r\n if (self.categoryLevel > 3) {\r\n angular.forEach(cat3.subcategories, function (cat4) {\r\n cat4.cat1 = cat1.name;\r\n cat4.cat2 = cat2.name;\r\n cat4.cat3 = cat3.name;\r\n cat4.cat4 = cat4.name;\r\n\r\n });\r\n }\r\n });\r\n });\r\n });\r\n }\r\n\r\n function loadStrategyAndRoles(isFirstLoad) {\r\n\r\n //Cargo la cobertura\r\n assortmentService.categoryRoleStrategyCoverages.getCoverages()\r\n .then(function (roleStrategyCoverages) {\r\n if (roleStrategyCoverages && roleStrategyCoverages.length > 0) {\r\n self.categoryRoleStrategyCoverages = roleStrategyCoverages;\r\n }\r\n\r\n if (isFirstLoad) {\r\n //Get distinct BrandId, BrandName, BranIcon\r\n self.rsBrands = _.uniqBy(_.uniq(_.map(_.flatten(roleStrategyCoverages), function (e) {\r\n return { brandId: e.brandId, name: e.brand, brandIcon: e.brandIcon }\r\n })), 'brandId');\r\n\r\n //Ordenamiento del issue #854 \r\n if (self.rsBrands && companyJson.AssortmentRules && companyJson.AssortmentRules.CustomOrderBrands) {\r\n angular.forEach(self.rsBrands, function (b) {\r\n switch (b.name) {\r\n case \"Jumbo\":\r\n b.name = '1-' + b.name;\r\n break;\r\n case \"Metro\":\r\n b.name = '2-' + b.name;\r\n break;\r\n case \"Metro Express\":\r\n b.name = '3-' + b.name;\r\n break;\r\n case \"Metro Express Caf\\u00E9\":\r\n b.name = '4-' + b.name;\r\n break;\r\n case \"Metro Discount\":\r\n b.name = '5-' + b.name;\r\n break;\r\n case \"Jumbo E-Commerce\":\r\n b.name = '6-' + b.name;\r\n break;\r\n case \"Jumbo E-Commerce\":\r\n b.name = '7-' + b.name;\r\n break;\r\n }\r\n });\r\n }\r\n\r\n //Cargo los Roles y Estrategias para el combo\r\n assortmentService.categoryRoleStrategyCoverages.getStrategyAndRoles()\r\n .then(function (rolesAndStrategies) {\r\n self.roles = [];\r\n self.strategies = [];\r\n\r\n angular.forEach(rolesAndStrategies, function (rs) {\r\n if (rs.isRole)\r\n self.roles.push({ key: rs.key, value: rs.value });\r\n else\r\n self.strategies.push({ key: rs.key, value: rs.value });\r\n });\r\n });\r\n }\r\n\r\n self.changeBrand(self.selectedBrand);\r\n });\r\n\r\n\r\n\r\n }\r\n\r\n var translations = null;\r\n\r\n self.monthsForCalculations = [\r\n { value: 3, text: 'Ultimos 3 meses' }\r\n , { value: 6, text: 'Ultimos 6 meses' }\r\n , { value: 12, text: 'Ultimos 12 meses' }\r\n , { value: 0, text: 'Personalizado' }\r\n ];\r\n\r\n self.dateEditor = function (params) {\r\n\r\n var editing = false;\r\n\r\n var eCell = document.createElement('div');\r\n eCell.style = \"width:100%;height:100%; cursor: pointer;\"\r\n var eLabel = document.createTextNode(self.dateRenderer(params));\r\n eCell.appendChild(eLabel);\r\n\r\n var eInput = document.createElement(\"input\");\r\n eInput.style = \"width:135px;\"\r\n eInput.type = \"date\";\r\n\r\n eCell.addEventListener('click', function () {\r\n if (!editing) {\r\n eCell.removeChild(eLabel);\r\n eCell.appendChild(eInput);\r\n eInput.focus();\r\n eInput.value = params.value;\r\n editing = true;\r\n \r\n }\r\n });\r\n\r\n eInput.addEventListener('blur', function () {\r\n if (editing) {\r\n editing = false;\r\n eCell.removeChild(eInput);\r\n eCell.appendChild(eLabel);\r\n }\r\n });\r\n\r\n eInput.addEventListener('change', function () {\r\n if (editing) {\r\n editing = false;\r\n var newValue = eInput.value;\r\n params.data[params.colDef.field] = newValue;\r\n params.data[\"dirty\"] = true;\r\n params.value = newValue;\r\n eLabel.nodeValue = $rootScope.dateRenderer(params);\r\n eCell.removeChild(eInput);\r\n eCell.appendChild(eLabel);\r\n\r\n if (params.node != null && params.node.children != null) {\r\n var changedRows = [];\r\n var colIds = [];\r\n colIds.push(params.column.colId);\r\n params.node.children.forEach(function (node) {\r\n if (node.children) {\r\n node.children.forEach(function (node) {\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n }\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n params.api.refreshCells(changedRows, colIds);\r\n }\r\n }\r\n });\r\n\r\n return eCell;\r\n }\r\n\r\n self.dateRenderer = function (params) {\r\n if (params.value == null)\r\n return \"_______________________\"; //''\r\n\r\n return new Date(params.value).toISOString().slice(0, 10);\r\n }\r\n\r\n function init() {\r\n changeStrategyOnColumnGroupShow();\r\n setGridOptions();\r\n\r\n $translate([\"DiscardConfirmTitle\", \"AreYouSureSwalSubtitle\", \"ContinueSwal\", \"CancelSwal\", \"ConfirmedSwal\", \"ConfirmedSwalSubtitle\"\r\n , \"ErrorTitleSwal\", \"ErrorSwalSubtitle\", \"NoChangesWereRecorded\", \"SumErrorOfWeightedIndexes\", \"PendingChangesWithoutSaving\"\r\n , \"TheChangesYouHaveMadeInRoleWillBeLost\", \"Discard\", \"Category\", \"ClickToEnterCategory\", \"RoleAndStrategy\", \"Role\"\r\n , \"Strategy\", \"Coverage\", \"WeightedIndex\", \"Sales\", \"Units\", \"MarginInDollars\", \"MarketSales\", \"MarketUnits\", \"AnalysisSchedule\"\r\n , \"StartDate\", \"Frequency\", \"LastRevision\", \"InDays\", \"MonthsForCalculation\", \"AssortmentStrategyAndRulesSubtitle\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n self.subtitle = translations.AssortmentStrategyAndRulesSubtitle;\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions.api.setColumnDefs(columnDefs);\r\n });\r\n\r\n //init columnDefs and gridOptions\r\n\r\n loadData();\r\n }\r\n\r\n init();\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"AssortmentRulesCtrl\", function ($scope, $rootScope, $stateParams, $filter, $timeout, assortmentService, queueService, $translate) {\r\n\r\n var self = this;\r\n var columnDefs = null;\r\n\r\n self.isEditingListingRule = false;\r\n self.isEditingDelistingRule = false;\r\n\r\n //general\r\n self.isSaving = false;\r\n self.selectedCategory = $stateParams.category;\r\n self.categories = [];\r\n self.clusters = [];\r\n self.tags = [];\r\n self.excludedTags = [];\r\n self.allClustersChecked = true;\r\n self.allTagsChecked = true;\r\n self.allCategoriesChecked = true;\r\n self.includedItemProperties = \"\";\r\n self.excludedItemProperties = \"\";\r\n self.itemproperties = { assortmentRuleId: 0, value: \"\", exclude: false };\r\n self.exitemproperties = { assortmentRuleId: 0, value: \"\", exclude: true };\r\n self.brandCoverages = [];\r\n self.isCoverageRule = false;\r\n self.itemManufacturers = [];\r\n self.itemBrands = [];\r\n self.selectedParetoFilterItemBrands = [];\r\n self.selectedParetoFilterItemManufacturers = [];\r\n self.selectedParetoFilterItemTags = [];\r\n\r\n self.cancel = function () {\r\n self.isEditingListingRule = false;\r\n self.isEditingDelistingRule = false;\r\n self.gridOptions.api.onFilterChanged();\r\n\r\n self.listingRule = {\r\n writtenRule: \"\",\r\n categories: angular.copy(self.categories),\r\n excategories: [],\r\n tags: [],\r\n extags: [],\r\n itemProperties: [],\r\n exitemProperties: [],\r\n clusters: [],\r\n exclusters: [],\r\n conditions: []\r\n }\r\n self.delistingRule = {\r\n writtenRule: \"\",\r\n categories: angular.copy(self.categories),\r\n excategories: [],\r\n tags: [],\r\n extags: [],\r\n itemProperties: [],\r\n exitemProperties: [],\r\n clusters: [],\r\n exclusters: [],\r\n conditions: []\r\n }\r\n\r\n self.pendingPerformanceVariable = angular.copy(self.performanceVariable);\r\n self.pendingDelistingPerformanceVariable = angular.copy(self.delistingPerformanceVariable);\r\n self.listingCondition.condition = '';\r\n self.delistingCondition.condition = '';\r\n self.includedItemProperties = \"\";\r\n self.excludedItemProperties = \"\";\r\n self.excludedTags = [];\r\n self.allClustersChecked = true;\r\n self.allTagsChecked = true;\r\n self.allCategoriesChecked = true;\r\n self.listingRule.tags = [];\r\n self.delistingRule.tags = [];\r\n self.listingRule.clusters = self.clusters;\r\n self.delistingRule.clusters = self.clusters;\r\n self.isCoverageRule = false;\r\n self.listingCondition.performanceVariable = null;\r\n\r\n var listingParetoItemFilters = { paretoFilterItemBrand: [], paretoFilterItemManufacturer: [], paretoFilterTag: [] };\r\n var delistingParetoItemFilters = { paretoFilterItemBrand: [], paretoFilterItemManufacturer: [], paretoFilterTag: [] };\r\n self.selectedParetoFilterItemBrands = [];\r\n self.selectedParetoFilterItemManufacturers = [];\r\n self.selectedParetoFilterItemTags = [];\r\n }\r\n self.generateSuggestions = function () {\r\n\r\n swal({\r\n title: translations.GenerateSuggestionsSwal,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n var isListing = self.isEditingListingRule ? true : (self.isEditingDelistingRule ? false : null);\r\n\r\n $timeout(function () {\r\n swal(translations.TheProcessContinues, translations.TheSuggestionsContinueToBeGeneratedAssortment)\r\n }, 1000);\r\n\r\n assortmentService.suggestion.generateSuggestions(isListing, $stateParams.categoryId)\r\n .then(function (isOk) {\r\n swal(translations.YourRequestToGenerateSuggestionsHasBeenPasted, translations.RequestQueuedInfo, \"success\");\r\n\r\n //actualizo las tareas pendientes.\r\n //queueService.queuedTasks.getTop5();\r\n\r\n }, function (status) {\r\n swal(translations.ErrorTitleSwal, translations.ErrorWhenGeneratingSuggestionsForThisCategorySwal, \"error\");\r\n });\r\n }\r\n });\r\n }\r\n self.includeItemProperty = function (rule) {\r\n rule.itemProperties.push(angular.copy(self.itemproperties));\r\n if (self.includedItemProperties == \"\" && self.itemproperties.value != '')\r\n self.includedItemProperties += self.itemproperties.value;\r\n else if (self.itemproperties.value != '')\r\n self.includedItemProperties += \", \" + self.itemproperties.value;\r\n\r\n self.itemproperties.value = \"\";\r\n }\r\n self.excludeItemProperty = function (rule) {\r\n rule.itemProperties.push(angular.copy(self.exitemproperties));\r\n if (self.excludedItemProperties == \"\" && self.exitemproperties.value != '')\r\n self.excludedItemProperties += self.exitemproperties.value;\r\n else if (self.exitemproperties.value != '')\r\n self.excludedItemProperties += \", \" + self.exitemproperties.value;\r\n\r\n self.exitemproperties.value = \"\";\r\n }\r\n self.addExcluded = function (rule) {\r\n\r\n //Agregar Clusters Excluidos\r\n for (var i = 0; i < rule.exclusters.length; i++) {\r\n for (var j = 0; j < rule.clusters.length; j++) {\r\n if (rule.exclusters[i].clusterId == rule.clusters[j].clusterId)\r\n rule.clusters[j].exclude = true;\r\n }\r\n }\r\n\r\n //Agregar Tags Excluidos\r\n for (var i = 0; i < rule.extags.length; i++) {\r\n rule.extags[i].exclude = true;\r\n rule.tags.push(rule.extags[i]);\r\n }\r\n\r\n ////Agregar Categorias Excluidas\r\n //for (var i = 0; i < rule.excategories.length; i++) {\r\n // for (var j = 0; j < rule.categories.length; j++) {\r\n // if (rule.excategories[i].categoryId == rule.categories[j].categoryId)\r\n // rule.categories[j].exclude = true;\r\n // }\r\n //}\r\n\r\n }\r\n self.selectAllClustersForRule = function (rule) {\r\n if (self.allClustersChecked)\r\n rule.clusters = self.clusters;\r\n else\r\n rule.clusters = [];\r\n }\r\n self.selectAllTagsForRule = function (rule) {\r\n //Si tildo todos no pongo ninguno para no filtrar, si lo destildo, tambi�n saco todos para que incluya o excluya unicamente.\r\n if (self.allTagsChecked) {\r\n rule.tags = [];\r\n rule.extags = [];\r\n }\r\n else {\r\n rule.tags = [];\r\n rule.extags = [];\r\n }\r\n }\r\n self.selectAllCategoriesForRule = function (rule) {\r\n if (self.allCategoriesChecked)\r\n rule.categories = self.categories;\r\n else\r\n rule.categories = [];\r\n }\r\n self.deleteRule = function (ruleId) {\r\n swal({\r\n title: translations.RemoveRuleSwal,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n assortmentService.rules.deleteRule(ruleId)\r\n .then(function () {\r\n swal(translations.RuleEliminatedSwal, translations.TheRuleHasBeenSuccessfullyRemovedSwal, \"success\");\r\n loadRules();\r\n },\r\n function errorCallback(response) {\r\n swal(translations.ErrorTitleSwal, translations.ErrorWhenDeletingTheRule, \"error\");\r\n console.log(response);\r\n });\r\n }\r\n });\r\n }\r\n\r\n //LISTING\r\n self.listingRule = {\r\n writtenRule: \"\",\r\n categories: [],\r\n excategories: [],\r\n tags: [],\r\n extags: [],\r\n //items: [],\r\n itemProperties: [],\r\n exitemProperties: [],\r\n clusters: [],\r\n exclusters: [],\r\n conditions: []\r\n }\r\n \r\n \r\n self.pendingPerformanceVariable = angular.copy(self.performanceVariable);\r\n self.listingCondition = {\r\n condition: '', // (0 First) (1 Or) (2 And)\r\n filterCondition: 'menor', // (< 1) (> 2) (= 3)\r\n performanceVariable: null,\r\n performanceVariableValue: null\r\n }\r\n self.leftSignVisible = false;\r\n self.leftSignText = '$';\r\n self.rightSignVisible = true;\r\n self.rightSignText = '%';\r\n self.isSpaceListingRule = false;\r\n\r\n\r\n $scope.$watch('ct.listingRule', function (newVal, oldVal) {\r\n\r\n if (self.listingRule.conditions.length > 0) {\r\n var writtenRule = \"REGLA: Alta de productos\";\r\n\r\n _.forEach(self.listingRule.conditions, function (c, key) {\r\n writtenRule += ian.format(' {0} donde {1} sea {2} ', c.condition, c.performanceVariable.label, c.filterCondition);\r\n\r\n if (c.filterCondition == 'igual') {\r\n if (c.performanceVariable.label == 'Espacios') { //Regla de espacios:\r\n writtenRule = writtenRule.substring(0, writtenRule.indexOf(\"Espacios\")) + \"Se cumpla el lineamiento de espacios\";\r\n }\r\n else if (c.performanceVariable.label == 'Cobertura') { //Regla de cobertura:\r\n self.isCoverageRule = true;\r\n\r\n writtenRule += 'a ' + c.performanceVariableValue + c.performanceVariable.sign.text;\r\n //writtenRule = writtenRule.substring(0, writtenRule.indexOf(\"Cobertura\")) + \"Se cumpla la cobertura por cadena\";\r\n }\r\n else if (c.performanceVariable.sign.text == '$')\r\n writtenRule += 'a ' + c.performanceVariable.sign.text + c.performanceVariableValue;\r\n else\r\n writtenRule += 'a ' + c.performanceVariableValue + c.performanceVariable.sign.text;\r\n }\r\n else {\r\n if (c.performanceVariable.label == 'Espacios') { //Regla de espacios:\r\n writtenRule = writtenRule.substring(0, writtenRule.indexOf(\"Espacios\")) + \"Se cumpla el lineamiento de espacios\";\r\n }\r\n else if (c.performanceVariable.label == 'Cobertura') { //Regla de cobertura:\r\n self.isCoverageRule = true;\r\n\r\n writtenRule += 'que ' + c.performanceVariableValue + c.performanceVariable.sign.text;\r\n //writtenRule = writtenRule.substring(0, writtenRule.indexOf(\"Cobertura\")) + \"Se cumpla la cobertura por cadena\";\r\n }\r\n else if (c.performanceVariable.sign.text == '$')\r\n writtenRule += 'que ' + c.performanceVariable.sign.text + c.performanceVariableValue;\r\n else\r\n writtenRule += 'que ' + c.performanceVariableValue + c.performanceVariable.sign.text;\r\n }\r\n });\r\n\r\n self.listingRule.writtenRule = writtenRule;\r\n }\r\n\r\n }, true);\r\n self.newListingRule = function () {\r\n self.isEditingListingRule = true;\r\n self.isEditingDelistingRule = false;\r\n self.gridOptions.api.onFilterChanged();\r\n }\r\n self.shouldShowListing = function (performanceVariable) {\r\n if (performanceVariable != null) {\r\n show = true;\r\n\r\n _.forEach(self.listingRule.conditions, function (c, key) {\r\n if (c.performanceVariable.id == performanceVariable.id)\r\n show = false;\r\n });\r\n return show;\r\n }\r\n }\r\n self.changePerformanceVariable = function () {\r\n var s = self.listingCondition.performanceVariable;\r\n\r\n self.isSpaceListingRule = false;\r\n self.isCoverageRule = false;\r\n\r\n if (s.label == \"Espacios\")\r\n self.isSpaceListingRule = true;\r\n if (s.label == \"Cobertura\")\r\n self.isCoverageRule = true;\r\n\r\n if (s.sign.position === 'left') {\r\n self.rightSignVisible = false;\r\n self.leftSignVisible = true;\r\n self.leftSignText = s.sign.text;\r\n }\r\n else {\r\n self.leftSignVisible = false;\r\n self.rightSignVisible = true;\r\n self.rightSignText = s.sign.text;\r\n }\r\n }\r\n self.addListingCondition = function () {\r\n\r\n //add condition to rule\r\n self.listingRule.conditions.push(angular.copy(self.listingCondition));\r\n\r\n //remove used variable \r\n _.remove(self.pendingPerformanceVariable, function (variable) {\r\n return variable.id == self.listingCondition.performanceVariable.id\r\n });\r\n\r\n //clear conditions\r\n self.listingCondition.performanceVariable = null;\r\n self.listingCondition.performanceVariableValue = null;\r\n self.listingCondition.filterCondition = 'mayor'; //Inicializo en Mayor para que ya tenga uno seleccionado\r\n if (self.listingRule.conditions.length == 1) //Inicializo en Y para que ya tengan uno seleccionado.\r\n self.listingCondition.condition = 'Y';\r\n }\r\n self.canSaveListingRule = function () {\r\n var canSave = false;\r\n\r\n if (self.listingRule.conditions.length > 0) {\r\n if (self.listingRule.clusters.length > 0 && self.listingRule.categories.length > 0) {\r\n canSave = true;\r\n }\r\n }\r\n\r\n return canSave;\r\n }\r\n self.saveListingRule = function () {\r\n\r\n swal({\r\n title: translations.ConfirmationCreateThisRule,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n if (!self.isSaving) {\r\n\r\n self.isSaving = true;\r\n\r\n self.addExcluded(self.listingRule);\r\n\r\n var listingConditionsDto = [];\r\n _.forEach(self.listingRule.conditions, function (c, key) {\r\n var conditionDto = {\r\n assortmentRuleId: 0,\r\n condition: c.condition == \"\" ? 0 : c.condition == \"O\" ? 1 : 2,\r\n filterCondition: c.filterCondition == 'menor' ? 1 : c.filterCondition == \"mayor\" ? 2 : 3,\r\n performanceVariable: c.performanceVariable.id,\r\n performanceVariableValue: c.performanceVariable.sign.text == '-' ? 0 : c.performanceVariable.sign.text == '%' ? c.performanceVariableValue / 100 : c.performanceVariableValue\r\n };\r\n\r\n listingConditionsDto.push(conditionDto);\r\n });\r\n\r\n listingParetoItemFilters = {\r\n paretoFilterItemBrand: self.selectedParetoFilterItemBrands\r\n , paretoFilterItemManufacturer: self.selectedParetoFilterItemManufacturers\r\n , paretoFilterTag: self.selectedParetoFilterItemTags\r\n }\r\n\r\n var assortmentRuleListingDto = {\r\n id: null,\r\n name: self.listingRule.writtenRule,\r\n companyId: $rootScope.companyId,\r\n categories: self.listingRule.categories,\r\n clusters: self.listingRule.clusters,\r\n tags: self.listingRule.tags,\r\n itemProperties: self.listingRule.itemProperties,\r\n assortmentRuleConditions: listingConditionsDto,\r\n paretoItemFilters: listingParetoItemFilters\r\n }\r\n\r\n assortmentService.rules.saveListingRule(assortmentRuleListingDto)\r\n .then(function (savedOk) {\r\n self.cancel();\r\n loadRules();\r\n self.isSaving = false;\r\n swal(translations.SavedRule, translations.SavedRuleSubtitle, \"success\");\r\n }, function (fallback) {\r\n swal(translations.ErrorTitleSwal, translations.ErrorWhenSavingTheRule, \"error\");\r\n self.isSaving = false;\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n //DE-LISTING\r\n self.delistingRule = {\r\n writtenRule: \"\",\r\n categories: [],\r\n excategories: [],\r\n tags: [],\r\n extags: [],\r\n //items: [],\r\n itemProperties: [],\r\n exitemProperties: [],\r\n clusters: [],\r\n exclusters: [],\r\n conditions: []\r\n }\r\n \r\n self.pendingDelistingPerformanceVariable = angular.copy(self.delistingPerformanceVariable);\r\n self.delistingCondition = {\r\n condition: '', // (0 First) (1 Or) (2 And)\r\n filterCondition: 'menor', // (< 1) (> 2) (= 3)\r\n performanceVariable: null,\r\n performanceVariableValue: null\r\n }\r\n self.leftSignDelistingVisible = false;\r\n self.leftSignDelistingText = '$';\r\n self.rightSignDelistingVisible = true;\r\n self.rightSignDelistingText = '%';\r\n self.isSpaceDelistingRule = false;\r\n $scope.$watch('ct.delistingRule', function (newVal, oldVal) {\r\n\r\n if (self.delistingRule.conditions.length > 0) {\r\n var writtenRule = \"REGLA: Baja de productos\";\r\n\r\n _.forEach(self.delistingRule.conditions, function (c, key) {\r\n writtenRule += ian.format(' {0} donde {1} sea {2} ', c.condition, c.performanceVariable.label, c.filterCondition);\r\n\r\n if (c.filterCondition == 'igual') {\r\n if (c.performanceVariable.label == 'Espacios') { //Regla de espacios:\r\n writtenRule = writtenRule.substring(0, writtenRule.indexOf(\"Espacios\")) + \"Se cumpla el lineamiento de espacios\";\r\n }\r\n else if (c.performanceVariable.sign.text == '$')\r\n writtenRule += 'a ' + c.performanceVariable.sign.text + c.performanceVariableValue;\r\n else\r\n writtenRule += 'a ' + c.performanceVariableValue + c.performanceVariable.sign.text;\r\n }\r\n else {\r\n if (c.performanceVariable.label == 'Espacios') { //Regla de espacios:\r\n writtenRule = writtenRule.substring(0, writtenRule.indexOf(\"Espacios\")) + \"Se cumpla el lineamiento de espacios\";\r\n }\r\n else if (c.performanceVariable.sign.text == '$')\r\n writtenRule += 'que ' + c.performanceVariable.sign.text + c.performanceVariableValue;\r\n else\r\n writtenRule += 'que ' + c.performanceVariableValue + c.performanceVariable.sign.text;\r\n }\r\n });\r\n\r\n self.delistingRule.writtenRule = writtenRule;\r\n }\r\n\r\n }, true);\r\n self.newDelistingRule = function () {\r\n self.isEditingListingRule = false;\r\n self.isEditingDelistingRule = true;\r\n self.gridOptions.api.onFilterChanged();\r\n }\r\n self.shouldShowDelisting = function (performanceVariable) {\r\n if (performanceVariable != null) {\r\n show = true;\r\n\r\n _.forEach(self.delistingRule.conditions, function (c, key) {\r\n if (c.delistingPerformanceVariable.id == delistingPerformanceVariable.id)\r\n show = false;\r\n });\r\n return show;\r\n }\r\n }\r\n self.changeDelistingPerformanceVariable = function () {\r\n var s = self.delistingCondition.performanceVariable;\r\n\r\n self.isSpaceListingRule = false;\r\n self.isCoverageRule = false;\r\n\r\n if (s.label == \"Espacios\")\r\n self.isSpaceListingRule = true;\r\n if (s.label == \"Cobertura\")\r\n self.isCoverageRule = true;\r\n\r\n if (s.sign.position === 'left') {\r\n self.rightSignDelistingVisible = false;\r\n self.leftSignDelistingVisible = true;\r\n self.leftSignDelistingText = s.sign.text;\r\n }\r\n else {\r\n self.leftSignDelistingVisible = false;\r\n self.rightSignDelistingVisible = true;\r\n self.rightSignDelistingText = s.sign.text;\r\n }\r\n }\r\n self.addDelistingCondition = function () {\r\n\r\n //add condition to rule\r\n self.delistingRule.conditions.push(angular.copy(self.delistingCondition));\r\n\r\n //remove used variable\r\n _.remove(self.pendingDelistingPerformanceVariable, function (variable) {\r\n return variable.id == self.delistingCondition.performanceVariable.id\r\n });\r\n\r\n //clear conditions\r\n self.delistingCondition.performanceVariable = null;\r\n self.delistingCondition.performanceVariableValue = null;\r\n self.delistingCondition.filterCondition = 'menor'; //Inicializo en Menor para que ya tenga uno seleccionado\r\n if (self.delistingRule.conditions.length == 1) //Inicializo en Y para que ya tengan uno seleccionado.\r\n self.delistingCondition.condition = 'Y';\r\n }\r\n self.canSaveDelistingRule = function () {\r\n var canSave = false;\r\n\r\n if (self.delistingRule.conditions.length > 0) {\r\n if (self.delistingRule.clusters.length > 0 && self.delistingRule.categories.length > 0) {\r\n canSave = true;\r\n }\r\n }\r\n\r\n return canSave;\r\n }\r\n self.saveDelistingRule = function () {\r\n\r\n swal({\r\n title: translations.ConfirmationCreateThisRule,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n if (!self.isSaving) {\r\n\r\n self.isSaving = true;\r\n\r\n self.addExcluded(self.delistingRule);\r\n\r\n //_.forEach(self.categories, function (c, key) {\r\n // if (c.categoryId == $stateParams.categoryId)\r\n // self.delistingRule.categories.push(angular.copy(c));\r\n //});\r\n\r\n var delistingConditionsDto = [];\r\n _.forEach(self.delistingRule.conditions, function (c, key) {\r\n var conditionDto = {\r\n assortmentRuleId: 0,\r\n condition: c.condition == \"\" ? 0 : c.condition == \"O\" ? 1 : 2,\r\n filterCondition: c.filterCondition == 'menor' ? 1 : c.filterCondition == \"mayor\" ? 2 : 3,\r\n performanceVariable: c.performanceVariable.id,\r\n performanceVariableValue: c.performanceVariable.sign.text == '-' ? 0 : c.performanceVariable.sign.text == '%' ? c.performanceVariableValue / 100 : c.performanceVariableValue\r\n };\r\n\r\n delistingConditionsDto.push(conditionDto);\r\n });\r\n\r\n delistingParetoItemFilters = {\r\n paretoFilterItemBrand: self.selectedParetoFilterItemBrands\r\n , paretoFilterItemManufacturer: self.selectedParetoFilterItemManufacturers\r\n , paretoFilterTag: self.selectedParetoFilterItemTags\r\n }\r\n\r\n var assortmentRuleDelistingDto = {\r\n id: null,\r\n name: self.delistingRule.writtenRule,\r\n companyId: $rootScope.companyId,\r\n categories: self.delistingRule.categories,\r\n clusters: self.delistingRule.clusters,\r\n tags: self.delistingRule.tags,\r\n itemProperties: self.delistingRule.itemProperties,\r\n assortmentRuleConditions: delistingConditionsDto,\r\n paretoItemFilters: delistingParetoItemFilters\r\n }\r\n\r\n assortmentService.rules.saveDelistingRule(assortmentRuleDelistingDto)\r\n .then(function (savedOk) {\r\n if (savedOk) {\r\n self.cancel();\r\n loadRules();\r\n swal(translations.SavedRule, translations.SavedRuleSubtitle, \"success\");\r\n self.isSaving = false;\r\n }\r\n },\r\n function () {\r\n swal(translations.ErrorTitleSwal, translations.ErrorWhenSavingTheRule, \"error\");\r\n self.isSaving = false;\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n //grid\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: translations.Associations,\r\n children: [\r\n {\r\n headerName: translations.Categories,\r\n field: \"categories\",\r\n cellRenderer: function (params) {\r\n return params.value ? params.value : \"\";\r\n },\r\n width: 200,\r\n },\r\n {\r\n headerName: translations.Clusters,\r\n field: \"clusters\",\r\n cellRenderer: function (params) {\r\n return params.value ? params.value : \"\";\r\n },\r\n width: 200,\r\n columnGroupShow: 'open',\r\n },\r\n {\r\n headerName: translations.Tags,\r\n field: \"tags\",\r\n cellRenderer: function (params) {\r\n return params.value ? params.value : \"\";\r\n },\r\n width: 100,\r\n columnGroupShow: 'open',\r\n },\r\n {\r\n headerName: translations.Values,\r\n field: \"itemProperties\",\r\n cellRenderer: function (params) {\r\n return params.value ? params.value : \"\";\r\n },\r\n width: 100,\r\n columnGroupShow: 'open',\r\n }]\r\n },\r\n {\r\n headerName: \"Filtros\",\r\n children: [\r\n {\r\n headerName: \"Marcas\",\r\n field: \"paretoFilterItemBrand\",\r\n cellRenderer: function (params) {\r\n return params.value ? params.value : \"\";\r\n },\r\n width: 200,\r\n columnGroupShow: 'open',\r\n },\r\n {\r\n headerName: \"Fabricantes\",\r\n field: \"paretoFilterItemManufacturer\",\r\n cellRenderer: function (params) {\r\n return params.value ? params.value : \"\";\r\n },\r\n width: 200,\r\n columnGroupShow: 'open',\r\n },\r\n {\r\n headerName: \"Etiquetas\",\r\n field: \"paretoFilterItemTags\",\r\n cellRenderer: function (params) {\r\n return params.value ? params.value : \"\";\r\n },\r\n width: 100,\r\n }]\r\n },\r\n {\r\n headerName: \"Regla\",\r\n children: [\r\n {\r\n headerName: translations.Delete,\r\n field: \"id\",\r\n cellRenderer: function (params) {\r\n if (params.node.data.isParent) { //Si la regla de categoria es padre\r\n if (params.node.data.categoryId != $stateParams.categoryId) //Si no es la categoria padre no la puede borrar\r\n return '
';\r\n else //Si es la padre, si la puede borrar\r\n return '
';\r\n }\r\n return '
';\r\n },\r\n width: 55\r\n },\r\n {\r\n headerName: translations.Type,\r\n field: \"type\",\r\n cellRenderer: function (params) {\r\n var cls = ian.format(\"label label-sm {0}\", params.value === 2 ? \"label-primary\" : \"label-danger\");\r\n var elem = ian.format('
{2}
', params.value === 2 ? 'style=\"padding: 3px 13.5px;\"' : '', cls, params.value === 2 ? \"Alta\" : \"Baja\");\r\n return elem;\r\n },\r\n width: 40\r\n },\r\n {\r\n headerName: translations.Description,\r\n field: \"name\",\r\n width: 400,\r\n cellStyle: { 'white-space': 'normal' }\r\n }\r\n ]\r\n }\r\n ];\r\n }\r\n\r\n function setGridOptions() {\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: false,\r\n enableFilter: false,\r\n groupUseEntireRow: false,\r\n rowSelection: \"multiple\",\r\n groupSelectsChildren: true,\r\n suppressCellSelection: true,\r\n groupSuppressAutoColumn: false, // or undefined\r\n showToolPanel: false,// window.innerWidth > 1500,\r\n groupColumnDef: null, // or undefined\r\n singleClickEdit: true,\r\n rowHeight: 35,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n enableRangeSelection: false,\r\n angularCompileRows: true,\r\n isExternalFilterPresent: isExternalFilterPresent,\r\n doesExternalFilterPass: doesExternalFilterPass,\r\n onGridSizeChanged: function (params) {\r\n self.gridOptions.api.sizeColumnsToFit();\r\n }\r\n };\r\n }\r\n\r\n self.toggleToolPanel = function () {\r\n var showing = self.gridOptions.api.isToolPanelShowing();\r\n self.gridOptions.api.showToolPanel(!showing);\r\n }\r\n self.onFilterChanged = function (value) {\r\n self.gridOptions.api.setQuickFilter(value);\r\n }\r\n\r\n //Grid Filters\r\n var getRuleFilter = function () {\r\n return self.isEditingDelistingRule && !self.isEditingListingRule ? 1 : !self.isEditingDelistingRule && self.isEditingListingRule ? 2 : 0;\r\n }\r\n function isExternalFilterPresent() {\r\n return self.isEditingListingRule || self.isEditingDelistingRule;\r\n }\r\n function doesExternalFilterPass(node) {\r\n return node.data.type == getRuleFilter(); //1 baja, 2 alta\r\n }\r\n\r\n function getDataFromCategorySummary() {\r\n //Seteo el titulo tipo Breadcrumb\r\n var categoryGroup = decodeURIComponent($stateParams.categoryGroup.replace(/-/g, \" \").replace(/_/g, \"\\/\"));\r\n var category = decodeURIComponent($stateParams.category.replace(/-/g, \" \").replace(/_/g, \"\\/\"));\r\n var subcategory = decodeURIComponent($stateParams.subcategory.replace(/-/g, \" \").replace(/_/g, \"\\/\"));\r\n\r\n self.title = categoryGroup\r\n if (category != '') {\r\n self.title += ' / ' + category;\r\n if (subcategory != '') {\r\n self.title += ' / ' + subcategory;\r\n }\r\n }\r\n }\r\n function loadClusters() {\r\n assortmentService.rules.getClustersByCategory($stateParams.categoryId)\r\n .then(function (clusters) {\r\n self.clusters = clusters;\r\n self.listingRule.clusters = clusters;\r\n self.delistingRule.clusters = clusters;\r\n });\r\n }\r\n function loadCategories() {\r\n assortmentService.rules.getCategoriesForRules($stateParams.categoryId)\r\n .then(function (categories) {\r\n self.categories = categories;\r\n self.listingRule.categories = categories;\r\n self.delistingRule.categories = categories;\r\n });\r\n }\r\n function loadTags() {\r\n assortmentService.rules.getTags()\r\n .then(function (tags) {\r\n self.tags = tags;\r\n });\r\n }\r\n function loadRules() {\r\n\r\n assortmentService.rules.getRules($stateParams.categoryId).then(function (rules) {\r\n\r\n self.gridOptions.api.setRowData(rules);\r\n self.gridOptions.api.sizeColumnsToFit();\r\n });\r\n }\r\n function loadBrandCoverages() {\r\n assortmentService.categoryRoleStrategyCoverages.getCoveragesForCategory($stateParams.categoryId)\r\n .then(function (coverages) {\r\n self.brandCoverages = coverages;\r\n });\r\n }\r\n function loadCategoryItemBrands() {\r\n assortmentService.rules.getItemBrands($stateParams.categoryId)\r\n .then(function (itemBrands) {\r\n self.itemBrands = itemBrands;\r\n });\r\n }\r\n function loadCategoryItemManufacturers() {\r\n assortmentService.rules.getItemManufacturers($stateParams.categoryId)\r\n .then(function (itemManufacturers) {\r\n self.itemManufacturers = itemManufacturers;\r\n });\r\n }\r\n self.performanceVariable = [];\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n setGridOptions();\r\n\r\n $translate([\"GenerateSuggestionsSwal\", \"ContinueSwal\", \"CancelSwal\", \"YourRequestToGenerateSuggestionsHasBeenPasted\", \"RequestQueuedInfo\", \"TheProcessContinues\", \"ErrorTitleSwal\", \"ErrorWhenGeneratingSuggestionsForThisCategorySwal\"\r\n , \"TheSuggestionsContinueToBeGeneratedAssortment\", \"RemoveRuleSwal\", \"RuleEliminatedSwal\", \"TheRuleHasBeenSuccessfullyRemovedSwal\", \"ErrorWhenDeletingTheRule\", \"ConfirmationCreateThisRule\", \"SavedRule\", \"SavedRuleSubtitle\"\r\n , \"ErrorWhenSavingTheRule\", \"Associations\", \"Categories\", \"Clusters\", \"Tags\", \"Values\", \"Rule\", \"Delete\", \"Type\", \"Description\", \"Spaces\", \"MarketSales\", \"MarketUnits\", \"MarketPrice\", \"SalesRankingMarket\", \"ShareOfSalesMarket\"\r\n , \"ShareOfUnitsMarket\", \"AccumulatedSalesMarket\", \"Coverage\", \"Sales\", \"Units\", \"Margin\", \"Margin2\", \"Price\", \"WeightedIndex2\", \"SalesRanking\", \"UnitsRanking\", \"MarginRanking\", \"SalesShare\", \"ShareOfUnits\", \"ShareOfMargen\"\r\n , \"PercentajeMargin\", \"Margin2Percentage\", \"ShareOfMargen2\", \"Presence\", \"AccumulatedSales\", \"AccumulatedUnits\", \"AccumulatedMargin\", \"AccumulatedWeightedIndex\"])\r\n .then(function (all) {\r\n translations = all;\r\n self.performanceVariable = [\r\n {\r\n id: 12,\r\n label: translations.Spaces,\r\n sign: {\r\n position: 'right',\r\n text: '-',\r\n desc: '-'\r\n }\r\n },\r\n {\r\n id: 100,\r\n label: translations.MarketSales,\r\n sign: {\r\n position: 'left',\r\n text: '$',\r\n desc: 'ej: $2500'\r\n }\r\n },\r\n {\r\n id: 101,\r\n label: translations.MarketUnits,\r\n sign: {\r\n position: 'right',\r\n text: 'un',\r\n desc: 'ej: 10un'\r\n }\r\n },\r\n {\r\n id: 102,\r\n label: translations.MarketPrice,\r\n sign: {\r\n position: 'left',\r\n text: '$',\r\n desc: 'ej: $10'\r\n }\r\n },\r\n {\r\n id: 103,\r\n label: translations.SalesRankingMarket,\r\n sign: {\r\n position: 'left',\r\n text: '',\r\n desc: 'ej: 1'\r\n }\r\n },\r\n {\r\n id: 150,\r\n label: translations.ShareOfSalesMarket,\r\n sign: {\r\n position: 'right',\r\n text: '%',\r\n desc: 'ej: 25%'\r\n }\r\n },\r\n {\r\n id: 151,\r\n label: translations.ShareOfUnitsMarket,\r\n sign: {\r\n position: 'right',\r\n text: '%',\r\n desc: 'ej: 10%'\r\n }\r\n },\r\n {\r\n id: 153,\r\n label: translations.AccumulatedSalesMarket,\r\n sign: {\r\n position: 'right',\r\n text: '%',\r\n desc: 'ej: 10%'\r\n }\r\n },\r\n {\r\n id: 154,\r\n label: translations.Coverage,\r\n sign: {\r\n position: 'right',\r\n text: '%',\r\n desc: 'ej: 10%'\r\n }\r\n },\r\n ];\r\n self.delistingPerformanceVariable = [\r\n {\r\n id: 1,\r\n label: translations.Sales,\r\n sign: {\r\n position: 'left',\r\n text: '$',\r\n desc: 'ej: $500'\r\n }\r\n },\r\n {\r\n id: 2,\r\n label: translations.Units,\r\n sign: {\r\n position: 'right',\r\n text: 'un',\r\n desc: 'ej: 5un'\r\n }\r\n },\r\n {\r\n id: 3,\r\n label: translations.Margin,\r\n sign: {\r\n position: 'left',\r\n text: '$',\r\n desc: 'ej: $500'\r\n }\r\n },\r\n {\r\n id: 13,\r\n label: translations.Margin2,\r\n sign: {\r\n position: 'left',\r\n text: '$',\r\n desc: 'ej: $500'\r\n }\r\n },\r\n {\r\n id: 4,\r\n label: translations.Price,\r\n sign: {\r\n position: 'right',\r\n text: '$',\r\n desc: 'ej: $3'\r\n }\r\n },\r\n {\r\n id: 5,\r\n label: translations.WeightedIndex2,\r\n sign: {\r\n position: 'left',\r\n text: '',\r\n desc: 'ej: 5'\r\n }\r\n },\r\n //{\r\n // id: 6,\r\n // label: 'GMROS',\r\n // sign: {\r\n // position: 'right',\r\n // text: '',\r\n // desc: 'ej: 0.55'\r\n // }\r\n //},\r\n {\r\n id: 7,\r\n label: 'GMROI',\r\n sign: {\r\n position: 'right',\r\n text: '',\r\n desc: 'ej: 0.55'\r\n }\r\n },\r\n //{\r\n // id: 8,\r\n // label: 'GMROL',\r\n // sign: {\r\n // position: 'right',\r\n // text: '',\r\n // desc: 'ej: 0.55'\r\n // }\r\n //},\r\n {\r\n id: 9,\r\n label: translations.SalesRanking,\r\n sign: {\r\n position: 'right',\r\n text: '',\r\n desc: 'ej: 4'\r\n }\r\n },\r\n {\r\n id: 10,\r\n label: translations.UnitsRanking,\r\n sign: {\r\n position: 'right',\r\n text: '',\r\n desc: 'ej: 30'\r\n }\r\n },\r\n {\r\n id: 11,\r\n label: translations.MarginRanking,\r\n sign: {\r\n position: 'right',\r\n text: '',\r\n desc: 'ej: 10'\r\n }\r\n },\r\n {\r\n id: 12,\r\n label: translations.Spaces,\r\n sign: {\r\n position: 'right',\r\n text: '-',\r\n desc: '-'\r\n }\r\n },\r\n {\r\n id: 50,\r\n label: translations.SalesShare,\r\n sign: {\r\n position: 'right',\r\n text: '%',\r\n desc: 'ej: 5%'\r\n }\r\n },\r\n {\r\n id: 51,\r\n label: translations.ShareOfUnits,\r\n sign: {\r\n position: 'right',\r\n text: '%',\r\n desc: 'ej: 6%'\r\n }\r\n },\r\n {\r\n id: 52,\r\n label: translations.ShareOfMargen,\r\n sign: {\r\n position: 'right',\r\n text: '%',\r\n desc: 'ej: 9%'\r\n }\r\n },\r\n {\r\n id: 53,\r\n label: translations.PercentajeMargin,\r\n sign: {\r\n position: 'right',\r\n text: '%',\r\n desc: 'ej: 31%'\r\n }\r\n },\r\n {\r\n id: 60,\r\n label: translations.Margin2Percentage,\r\n sign: {\r\n position: 'right',\r\n text: '%',\r\n desc: 'ej: 32%'\r\n }\r\n },\r\n {\r\n id: 61,\r\n label: translations.ShareOfMargen2,\r\n sign: {\r\n position: 'right',\r\n text: '%',\r\n desc: 'ej: 9%'\r\n }\r\n },\r\n //{\r\n // id: 54,\r\n // label: 'Share de Index',\r\n // sign: {\r\n // position: 'right',\r\n // text: '%',\r\n // desc: 'ej: 3%'\r\n // }\r\n //},\r\n {\r\n id: 55,\r\n label: translations.Presence,\r\n sign: {\r\n position: 'right',\r\n text: '%',\r\n desc: 'ej: 10%'\r\n }\r\n },\r\n {\r\n id: 56,\r\n label: translations.AccumulatedSales,\r\n sign: {\r\n position: 'right',\r\n text: '%',\r\n desc: 'ej: 10%'\r\n }\r\n },\r\n {\r\n id: 57,\r\n label: translations.AccumulatedUnits,\r\n sign: {\r\n position: 'right',\r\n text: '%',\r\n desc: 'ej: 10%'\r\n }\r\n },\r\n {\r\n id: 58,\r\n label: translations.AccumulatedMargin,\r\n sign: {\r\n position: 'right',\r\n text: '%',\r\n desc: 'ej: 10%'\r\n }\r\n },\r\n {\r\n id: 59,\r\n label: translations.AccumulatedWeightedIndex,\r\n sign: {\r\n position: 'right',\r\n text: '%',\r\n desc: 'ej: 10%'\r\n }\r\n },\r\n {\r\n id: 100,\r\n label: translations.MarketSales,\r\n sign: {\r\n position: 'left',\r\n text: '$',\r\n desc: 'ej: $2500'\r\n }\r\n },\r\n {\r\n id: 101,\r\n label: translations.MarketUnits,\r\n sign: {\r\n position: 'right',\r\n text: 'un',\r\n desc: 'ej: 10un'\r\n }\r\n },\r\n {\r\n id: 102,\r\n label: translations.MarketPrice,\r\n sign: {\r\n position: 'left',\r\n text: '$',\r\n desc: 'ej: $10'\r\n }\r\n },\r\n {\r\n id: 103,\r\n label: translations.SalesRankingMarket,\r\n sign: {\r\n position: 'left',\r\n text: '',\r\n desc: 'ej: 1'\r\n }\r\n },\r\n {\r\n id: 150,\r\n label: translations.ShareOfSalesMarket,\r\n sign: {\r\n position: 'right',\r\n text: '%',\r\n desc: 'ej: 25%'\r\n }\r\n },\r\n {\r\n id: 151,\r\n label: translations.ShareOfUnitsMarket,\r\n sign: {\r\n position: 'right',\r\n text: '%',\r\n desc: 'ej: 10%'\r\n }\r\n },\r\n {\r\n id: 153,\r\n label: translations.AccumulatedSalesMarket,\r\n sign: {\r\n position: 'right',\r\n text: '%',\r\n desc: 'ej: 10%'\r\n }\r\n },\r\n ]\r\n self.pendingPerformanceVariable = angular.copy(self.performanceVariable);\r\n self.pendingDelistingPerformanceVariable = angular.copy(self.delistingPerformanceVariable);\r\n\r\n setColumnDefinitions();\r\n self.gridOptions.api.setColumnDefs(columnDefs);\r\n\r\n });\r\n\r\n loadBrandCoverages();\r\n loadCategories();\r\n loadClusters();\r\n loadTags();\r\n loadCategoryItemBrands();\r\n loadCategoryItemManufacturers();\r\n getDataFromCategorySummary();\r\n\r\n //load data\r\n loadRules();\r\n }\r\n\r\n init();\r\n });\r\n","angular.module(\"prisma\")\r\n .controller(\"AssortmentReportsCtrl\", function ($rootScope, $scope, $state, $timeout, $interval, ngDialog, $filter, assortmentService, adminService, assortmentReportService, companyJson, $translate) {\r\n\r\n var self = this;\r\n self.brands = [];\r\n self.clusters = [];\r\n self.reportTypes = [{ value: \"AssortmentSuggestionsReport\", name: \"Sugerencia de Altas\" }];\r\n self.selectedReportType = self.reportTypes[0];\r\n self.selectedBrandId = null;\r\n self.selectedClusterIds = [];\r\n\r\n self.download = function () {\r\n if (!self.selectedBrandId || !self.selectedReportType) {\r\n swal('Seleccione un tipo de reporte y una bandera', '', 'error');\r\n return;\r\n }\r\n self.isLoadingReport = true;\r\n var dto = {\r\n reportType: self.selectedReportType.value,\r\n brandId: self.selectedBrandId,\r\n clusterIds: self.selectedClusterIds\r\n };\r\n\r\n assortmentReportService.downloadListingSuggestionsReport(dto)\r\n .then(function (url) {\r\n self.isLoadingReport = false;\r\n window.open(url);\r\n });\r\n }\r\n\r\n function init() {\r\n\r\n\r\n adminService.brands.getBrandsCombo(true)\r\n .then(function (brands) {\r\n self.brands = brands;\r\n });\r\n\r\n adminService.clusters.getClusters()\r\n .then(function (clusters) {\r\n self.clusters = clusters;\r\n });\r\n }\r\n\r\n init();\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"AssortmentOutputPrismaCtrl\", function ($scope, $timeout, $rootScope, $stateParams, $filter, assortmentService, adminService) {\r\n var self = this;\r\n self.gridData = null;\r\n\r\n self.categoryId = null;\r\n self.categoryGroupId = null;\r\n self.categoriesGroup = [];\r\n self.allCategories = [];\r\n self.categories = [];\r\n\r\n self.exportData = function () {\r\n\r\n swal({\r\n title: \"Esta seguro?\",\r\n text: 'Esta seguro que desea exportar la informacion ?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: true,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n var params = {\r\n skipHeader: false,\r\n skipFooters: false,\r\n skipGroups: false,\r\n allColumns: true,\r\n onlySelected: false,\r\n suppressQuotes: false,\r\n fileName: 'ExportDatosSurtido' + (new Date()).toISOString().replace(/[^0-9]/g, \"\").substring(0, 12) + '.csv',\r\n columnSeparator: ','\r\n };\r\n\r\n self.gridOptions.api.exportDataAsCsv(params);\r\n $timeout(function () { swal(\"Confirmado\", \"Se exporto correctamente\", \"success\"); }, 100);\r\n\r\n }\r\n });\r\n }\r\n\r\n //grid config\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: '',\r\n children: [\r\n {\r\n headerName: \"Codigo Tienda\",\r\n field: \"storeCode\",\r\n width: 100,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n {\r\n headerName: \"Codigo Item\",\r\n field: \"itemCode\",\r\n width: 100,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n {\r\n headerName: \"Desde\",\r\n field: \"validFrom\",\r\n width: 80,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n }\r\n , {\r\n headerName: \"Hasta\",\r\n field: \"validTo\",\r\n width: 80,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n //{\r\n // headerName: \"Cluster\",\r\n // field: \"clusterCode\",\r\n // width: 80,\r\n // suppressMenu: true,\r\n // suppressSorting: true,\r\n // cellClass: $rootScope.getClassForCell,\r\n //},\r\n //{\r\n // headerName: \"Categoria\",\r\n // field: \"category\",\r\n // width: 120,\r\n // suppressMenu: true,\r\n // suppressSorting: true,\r\n // cellClass: $rootScope.getClassForCell,\r\n //},\r\n //{\r\n // headerName: \"SubCategoria\",\r\n // field: \"subCategory\",\r\n // width: 120,\r\n // suppressMenu: true,\r\n // suppressSorting: true,\r\n // cellClass: $rootScope.getClassForCell,\r\n //}\r\n ]\r\n }]\r\n }\r\n function setGridOptions() {\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: true,\r\n groupHideGroupColumns: true,\r\n groupUseEntireRow: false,\r\n groupSelectsChildren: false,\r\n rowHeight: 30,\r\n rowSelection: \"multiple\",\r\n rowDeselection: true,\r\n showToolPanel: false,// window.innerWidth > 1500,\r\n suppressRowClickSelection: true,\r\n suppressCellSelection: true,\r\n singleClickEdit: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n suppressColumnMoveAnimation: $rootScope.suppressColumnMoveAnimation(),\r\n enableRangeSelection: false,\r\n angularCompileRows: true,\r\n angularCompileHeaders: true,\r\n }\r\n }\r\n\r\n self.loadData = function () {\r\n //if (self.categoryId != null || self.categoryGroupId != null) {\r\n\r\n var catId = self.categoryId != null ? self.categoryId : self.categoryGroupId;\r\n assortmentService.output.getPrismaEndosedData(catId).then(function (data) {\r\n self.gridData = data;\r\n\r\n self.gridOptions.api.setRowData(self.gridData);\r\n self.gridOptions.api.sizeColumnsToFit();\r\n self.gridOptions.api.refreshView();\r\n });\r\n //}\r\n }\r\n function loadCategories() {\r\n adminService.categories.getCategories()\r\n .then(function (categories) {\r\n self.allCategories = categories;\r\n });\r\n }\r\n function loadCategoriesGroup() {\r\n adminService.categories.getCategoryGroups()\r\n .then(function (cgrp) {\r\n self.categoriesGroup = cgrp;\r\n });\r\n }\r\n\r\n self.categoryGroupChanged = function (catGrpId) {\r\n self.categoryId = null;\r\n self.categories = [];\r\n angular.forEach(self.allCategories, function (cat) {\r\n if (cat.parentId == catGrpId)\r\n self.categories.push(cat);\r\n });\r\n }\r\n\r\n function init() {\r\n setGridOptions();\r\n loadCategoriesGroup();\r\n loadCategories();\r\n }\r\n\r\n init();\r\n });\r\n","angular.module(\"prisma\")\r\n .controller(\"AssortmentOutputColombiaCtrl\", function ($scope, $rootScope, $stateParams, $filter, assortmentService) {\r\n var self = this;\r\n self.gridData = null;\r\n\r\n\r\n self.exportData = function () {\r\n\r\n swal({\r\n title: \"Esta seguro?\",\r\n text: 'Esta seguro que desea exportar la informacion y pasar su estado a informado?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: true,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n var params = {\r\n skipHeader: false,\r\n skipFooters: false,\r\n skipGroups: false,\r\n allColumns: true,\r\n onlySelected: false,\r\n suppressQuotes: false,\r\n fileName: 'ExportDatosSurtido' + (new Date()).toISOString().replace(/[^0-9]/g, \"\").substring(0, 12) + '.csv',\r\n columnSeparator: ','\r\n };\r\n\r\n self.gridOptions.api.exportDataAsCsv(params);\r\n\r\n assortmentService.output.changeOutputStatus().then(function () {\r\n\r\n swal(\"Confirmado\", \"Se exporto correctamente\", \"success\");\r\n loadData();\r\n },\r\n function () {\r\n swal(\"Error\", \"Ha ocurrido un error\", \"error\");\r\n });\r\n }\r\n });\r\n }\r\n\r\n //grid config\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: 'Datos',\r\n children: [\r\n {\r\n headerName: \"\",\r\n field: \"\",\r\n width: 5,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Baja\",\r\n field: \"\",\r\n width: 20,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Ean\",\r\n field: \"ean\",\r\n width: 165,\r\n },\r\n {\r\n headerName: \"Estructura Comercial\",\r\n field: \"subCategoryCode\",\r\n width: 180,\r\n },\r\n {\r\n headerName: \"Cambio Estructura Comercial\",\r\n field: \"\",\r\n width: 155,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Descripcion del Producto\",\r\n field: \"itemName\",\r\n width: 255,\r\n },\r\n {\r\n headerName: \"Tipo Articulo\",\r\n field: \"itemTypeCode\",\r\n width: 150,\r\n },\r\n {\r\n headerName: \"Cambio Tipo Articulo\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Categoria\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Articulo Plataforma\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Articulo a domicilio\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Articulo a inventariar\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Articulo Importado\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Marca del articulo\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n\r\n },\r\n {\r\n headerName: \"Venta Asistida\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Temporada\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Registro Sanitario\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Fecha Final del Registro Sanitario\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Unidad de medida\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Unidad de Consumo\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Tipo de Value\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Bandera Aplicacion\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Unidades por pack\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Unidad de Medida a Comparar\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Unidad de Consumo a comparar\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Marca\",\r\n field: \"itemBrand\",\r\n width: 100\r\n },\r\n {\r\n headerName: \"Ean\",\r\n field: \"ean\",\r\n width: 155\r\n },\r\n {\r\n headerName: \"Estado\",\r\n field: \"isListed\",\r\n width: 100\r\n },\r\n {\r\n headerName: \"Tipo Surtido\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Mix Surtido (Hipermercado)\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Mix Surtido (Proximidad)\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Surtido Nacional\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Tiendas excluidas\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"fecha inicio\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"fecha fin\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Fraccion Articulo\",\r\n field: \"\",\r\n width: 55,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n columnGroupShow: 'open',\r\n cellRenderer: function (params) { return \"\"; }\r\n },\r\n {\r\n headerName: \"Tienda\",\r\n field: \"store\",\r\n width: 400\r\n },\r\n {\r\n headerName: \"Tiendas Activas\",\r\n field: \"totalActiveStores\",\r\n width: 155\r\n }]\r\n }]\r\n }\r\n function setGridOptions() {\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: true,\r\n groupHideGroupColumns: true,\r\n groupUseEntireRow: false,\r\n groupSelectsChildren: false,\r\n rowHeight: 30,\r\n rowSelection: \"multiple\",\r\n rowDeselection: true,\r\n showToolPanel: false,// window.innerWidth > 1500,\r\n suppressRowClickSelection: true,\r\n suppressCellSelection: true,\r\n singleClickEdit: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n suppressColumnMoveAnimation: $rootScope.suppressColumnMoveAnimation(),\r\n enableRangeSelection: false,\r\n angularCompileRows: true,\r\n angularCompileHeaders: true,\r\n }\r\n }\r\n\r\n function loadData() {\r\n assortmentService.output.getEndosedDataCencosudColombia().then(function (data) {\r\n self.gridData = data;\r\n\r\n self.gridOptions.api.setRowData(self.gridData);\r\n self.gridOptions.api.refreshView();\r\n });\r\n }\r\n function init() {\r\n loadData();\r\n\r\n setGridOptions();\r\n }\r\n\r\n init();\r\n });\r\n","angular.module(\"prisma\")\r\n .controller(\"AssortmentOutputChileCtrl\", function ($scope, $rootScope, $stateParams, $filter, assortmentService) {\r\n var self = this;\r\n self.gridData = null;\r\n\r\n\r\n self.exportData = function () {\r\n\r\n swal({\r\n title: \"Esta seguro?\",\r\n text: 'Esta seguro que desea exportar la informacion y pasar su estado a informado?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: true,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n var params = {\r\n skipHeader: false,\r\n skipFooters: false,\r\n skipGroups: false,\r\n allColumns: true,\r\n onlySelected: false,\r\n suppressQuotes: false,\r\n fileName: 'ExportDatosSurtido' + (new Date()).toISOString().replace(/[^0-9]/g, \"\").substring(0, 12) + '.csv',\r\n columnSeparator: ','\r\n };\r\n\r\n self.gridOptions.api.exportDataAsCsv(params);\r\n\r\n assortmentService.output.changeOutputStatus().then(function () {\r\n\r\n swal(\"Confirmado\", \"Se exporto correctamente\", \"success\");\r\n loadData();\r\n },\r\n function () {\r\n swal(\"Error\", \"Ha ocurrido un error\", \"error\");\r\n });\r\n }\r\n });\r\n }\r\n\r\n //grid config\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: 'Datos',\r\n children: [\r\n {\r\n headerName: \"Tipo\",\r\n field: \"isListed\",\r\n width: 60,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n },\r\n {\r\n headerName: \"Surtido\",\r\n field: \"clusterCode\",\r\n width: 180,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n },\r\n {\r\n headerName: \"Nombre Surtido\",\r\n field: \"clusterName\",\r\n width: 220,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n },\r\n {\r\n headerName: \"Tienda\",\r\n field: \"store\",\r\n width: 100,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n },\r\n {\r\n headerName: \"Categoria Jerarquia\",\r\n field: \"subCategoryName\",\r\n width: 180,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n },\r\n {\r\n headerName: \"Categoria Nielsen\",\r\n field: \"nielsenCategory\",\r\n width: 180,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n },\r\n {\r\n headerName: \"Codigo SAP\",\r\n field: \"subCategoryCode\",\r\n width: 150,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n },\r\n {\r\n headerName: \"Ean\",\r\n field: \"ean\",\r\n width: 165,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n },\r\n {\r\n headerName: \"Descripcion\",\r\n field: \"itemName\",\r\n width: 255,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n },\r\n {\r\n headerName: \"Marca\",\r\n field: \"itemBrand\",\r\n width: 105,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n },\r\n {\r\n headerName: \"Fabricante\",\r\n field: \"itemManufacturer\",\r\n width: 105,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n },\r\n ]\r\n }]\r\n }\r\n function setGridOptions() {\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: true,\r\n groupHideGroupColumns: true,\r\n groupUseEntireRow: false,\r\n groupSelectsChildren: false,\r\n rowHeight: 30,\r\n rowSelection: \"multiple\",\r\n rowDeselection: true,\r\n showToolPanel: false,// window.innerWidth > 1500,\r\n suppressRowClickSelection: true,\r\n suppressCellSelection: true,\r\n singleClickEdit: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n suppressColumnMoveAnimation: $rootScope.suppressColumnMoveAnimation(),\r\n enableRangeSelection: false,\r\n angularCompileRows: true,\r\n angularCompileHeaders: true,\r\n }\r\n }\r\n\r\n function loadData() {\r\n assortmentService.output.getEndosedDataCencosudChile().then(function (data) {\r\n self.gridData = data;\r\n\r\n self.gridOptions.api.setRowData(self.gridData);\r\n self.gridOptions.api.refreshView();\r\n });\r\n }\r\n function init() {\r\n loadData();\r\n\r\n setGridOptions();\r\n }\r\n\r\n init();\r\n });\r\n","angular.module(\"prisma\")\r\n .controller(\"AssortmentOutputCtrl\", function ($scope, $rootScope, $stateParams, $filter, assortmentService) {\r\n var self = this;\r\n self.gridData = null;\r\n\r\n\r\n self.exportData = function () {\r\n\r\n swal({\r\n title: \"Esta seguro?\",\r\n text: 'Esta seguro que desea exportar la informacion y pasar su estado a informado?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: true,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n var params = {\r\n skipHeader: false,\r\n skipFooters: false,\r\n skipGroups: false,\r\n allColumns: true,\r\n onlySelected: false,\r\n suppressQuotes: false,\r\n fileName: 'ExportDatosSurtido' + (new Date()).toISOString().replace(/[^0-9]/g, \"\").substring(0, 12) + '.csv',\r\n columnSeparator: ','\r\n };\r\n\r\n self.gridOptions.api.exportDataAsCsv(params);\r\n\r\n assortmentService.output.changeOutputStatus().then(function () {\r\n\r\n swal(\"Confirmado\", \"Se exporto correctamente\", \"success\");\r\n loadData();\r\n },\r\n function () {\r\n swal(\"Error\", \"Ha ocurrido un error\", \"error\");\r\n });\r\n }\r\n });\r\n }\r\n\r\n //grid config\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: 'Datos Item',\r\n children: [\r\n {\r\n headerName: \"Tipo\",\r\n field: \"status\",\r\n width: 50,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n {\r\n headerName: \"Fabricante\",\r\n field: \"manufacturer\",\r\n width: 120,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n {\r\n headerName: \"Marca\",\r\n field: \"brand\",\r\n width: 120,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n {\r\n headerName: \"Ean\",\r\n field: \"ean\",\r\n width: 100,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n {\r\n headerName: \"Descripcion\",\r\n field: \"itemName\",\r\n width: 155,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n }]\r\n },\r\n {\r\n headerName: 'Datos Internos',\r\n children: [\r\n {\r\n headerName: \"Categoria\",\r\n field: \"category\",\r\n width: 120,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n {\r\n headerName: \"SubCategoria\",\r\n field: \"subCategory\",\r\n width: 120,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n {\r\n headerName: \"Material\",\r\n field: \"codMaterial\",\r\n width: 100,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n {\r\n headerName: \"Cluster\",\r\n field: \"clusterCode\",\r\n width: 80,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n {\r\n headerName: \"Tienda\",\r\n field: \"storeCode\",\r\n width: 80,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n {\r\n headerName: \"Impacto\",\r\n field: \"impact\",\r\n width: 80,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n }]\r\n },\r\n {\r\n headerName: 'Datos Externos',\r\n children: [\r\n {\r\n headerName: \"Categoria\",\r\n field: \"categoryNielsen\",\r\n width: 120,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: function (params) {\r\n if (params.data.status == \"BAJA\")\r\n return \"\";\r\n else\r\n return params.data.categoryNielsen;\r\n }\r\n },\r\n {\r\n headerName: \"SubCategoria\",\r\n id: \"select\",\r\n field: \"subcategoryNielsen\",\r\n width: 120,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n {\r\n headerName: \"SubCategoria 2\",\r\n id: \"select\",\r\n field: \"subcategoryNielsen2\",\r\n width: 100,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n },\r\n {\r\n headerName: \"SubCategoria 3\",\r\n id: \"select\",\r\n field: \"subcategoryNielsen3\",\r\n width: 100,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n cellClass: $rootScope.getClassForCell,\r\n }]\r\n }\r\n ]\r\n }\r\n function setGridOptions() {\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: true,\r\n groupHideGroupColumns: true,\r\n groupUseEntireRow: false,\r\n groupSelectsChildren: false,\r\n rowHeight: 30,\r\n rowSelection: \"multiple\",\r\n rowDeselection: true,\r\n showToolPanel: false,// window.innerWidth > 1500,\r\n suppressRowClickSelection: true,\r\n suppressCellSelection: true,\r\n singleClickEdit: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n suppressColumnMoveAnimation: $rootScope.suppressColumnMoveAnimation(),\r\n enableRangeSelection: false,\r\n angularCompileRows: true,\r\n angularCompileHeaders: true,\r\n }\r\n }\r\n\r\n function loadData() {\r\n assortmentService.output.getEndosedData().then(function (data) {\r\n self.gridData = data;\r\n\r\n self.gridOptions.api.setRowData(self.gridData);\r\n self.gridOptions.api.refreshView();\r\n });\r\n }\r\n function init() {\r\n loadData();\r\n\r\n setGridOptions();\r\n }\r\n\r\n init();\r\n });\r\n","angular.module(\"prisma\")\r\n .controller(\"AssortmentDecisionsCtrl\", function ($scope, $rootScope, $timeout, $interval, $stateParams, $state, $filter, assortmentService, adminService, ngDialog, companyJson) {\r\n\r\n /*** PRIVATE VARIABLES ***/\r\n var numberColWidth = 100;\r\n var editableColWidth = 140;\r\n var columnDefs = null;\r\n var totalMarketSalesActiveItems = 0;\r\n var totalMarketSales = 0;\r\n var selectedFilterForText = '';\r\n var self = this;\r\n var y;\r\n\r\n /*** PUBLIC PROPERTIES ***/\r\n self.title = null;\r\n self.isEndorse = false;\r\n self.busy = false;\r\n self.currentCategoryId = $stateParams.subcategoryId != 0 ? $stateParams.subcategoryId : $stateParams.categoryId;\r\n self.itemStatus = ['Todos', 'Activo', 'Inactivo'];\r\n self.itemClusters = ['Todos'];\r\n self.dropDrowncluster = { isopen: false };\r\n self.dropDrownstatus = { isopen: false };\r\n self.onlyEndorse = [];\r\n self.allEndorse = [];\r\n self.selectedFilterForStatus = 'Todos';\r\n self.selectedFilterForCluster = 'Todos';\r\n self.selectedFilterForAssortmentStatus = 'Todos';\r\n self.isEndorse = $stateParams.isEndorse ? JSON.parse($stateParams.isEndorse) : false;\r\n self.selectedFilterForStatus = self.isEndorse ? 'Para Validar' : 'Todos';\r\n self.gridOptions = null;\r\n self.pareto = null;\r\n self.tags = [];\r\n self.isLoadingReport = false;\r\n self.clusters = [];\r\n self.allClusters = [];\r\n self.categoryDetails = null;\r\n self.actualCoverage = 0;\r\n self.actualSuggested = 0;\r\n self.actualNew = 0;\r\n self.totalItemClusters = 0;\r\n self.totalActiveItemClusters = 0;\r\n self.listingSuggestions = 0;\r\n self.listingNew = 0;\r\n self.delistingNew = 0;\r\n self.delistingSuggestions = 0;\r\n self.impact = 0;\r\n self.pendingImpact = 0;\r\n self.totalSales = 0;\r\n self.timerange = 'year';\r\n self.paretoSections = null;\r\n self.showParam1 = false;\r\n self.showPresence2 = false;\r\n self.showUnitsTotal = true;\r\n self.showSalesTotal = true;\r\n self.showWasteUnits = true;\r\n self.showPlanogramEdition = companyJson.Navigation.Spaces;\r\n self.filters = [];\r\n self.matrixOfIndexes = [];\r\n self.loadGrid = false;\r\n self.totalSalesOnColumnGroupShow = null;//se muestra la venta TOTAL sin desplegar\r\n self.salesOnColumnGroupShow = null;//se muestra la venta sin desplegar\r\n\r\n self.showPresence2 = companyJson.AssortmentDecisions.Grid.ShowPresence2; //Mostrar u ocultar Presence2\r\n self.showParam1 = companyJson.AssortmentDecisions.Grid.Param1;\r\n self.hideSpaces = companyJson.AssortmentDecisions && companyJson.AssortmentDecisions.Grid && companyJson.AssortmentDecisions.Grid.HideSpaces;\r\n self.showWasteUnits = companyJson.AssortmentDecisions.Grid.WasteUnits;\r\n self.PrevCategory = (companyJson.AssortmentDecisions.Grid ? companyJson.AssortmentDecisions.Grid.PrevCategory : false);\r\n self.PrevSubCategory = (companyJson.AssortmentDecisions.Grid ? companyJson.AssortmentDecisions.Grid.PrevSubCategory : false);\r\n\r\n //estos setColumnVisible estan administrados desde columndef por la propiedad hide\r\n //$timeout(function () {\r\n\r\n //self.gridOptions.columnApi.setColumnVisible('presence', !self.showPresence2); //Presencia 1\r\n //self.gridOptions.columnApi.setColumnVisible('presence2', self.showPresence2); //Presencia 2 (Cenco)\r\n\r\n //self.gridOptions.columnApi.setColumnVisible('param1', self.showParam1); //Param1 (Cenco colombia)\r\n //self.gridOptions.columnApi.setColumnVisible('param2', self.showParam1); //Param1 (Cenco colombia)\r\n //self.gridOptions.columnApi.setColumnVisible('param3', self.showParam1); //Param1 (Cenco colombia)\r\n\r\n //self.gridOptions.columnApi.setColumnVisible('unitsTotal', self.showUnitsTotal);\r\n //self.gridOptions.columnApi.setColumnVisible('salesTotal', self.showSalesTotal);\r\n\r\n //self.gridOptions.columnApi.setColumnVisible('currentAdjust', self.showWasteUnits);\r\n\r\n\r\n //}, 0);\r\n\r\n /*** PUBLIC FUNCTIONS ***/\r\n //actions\r\n self.showItemInDashboard = function (itemId, clusterId) {\r\n $state.go('home.itemDashboard', { 'itemId': itemId, 'clusterId': clusterId });\r\n }\r\n\r\n self.endorse = function () {\r\n swal({\r\n title: \"Esta seguro?\",\r\n text: 'Esta seguro que desea guardar los cambios realizados?',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n var itemsToSave = [];\r\n self.gridOptions.api.forEachNode(function (node) {\r\n var item = node.data;\r\n\r\n if ((item.assortmentStatus == 1 || item.isSuggestionIgnored) && node.selected && node.group === undefined)\r\n itemsToSave.push(item);\r\n });\r\n\r\n if (itemsToSave.length > 0) {\r\n assortmentService.decisions.saveDecisions(itemsToSave, true, $stateParams.categoryId)\r\n .then(function () {\r\n //ReloadGrid\r\n loadData(true);\r\n swal(\"Confirmado\", \"Se guardaron los cambios seleccionados\", \"success\");\r\n },\r\n function (error) {\r\n swal(\"Error\", \"Ha ocurrido un error\", \"error\");\r\n });\r\n\r\n }\r\n else\r\n swal(\"Sin Items\", \"No hay items seleccionados\", \"error\");\r\n\r\n }\r\n else {\r\n swal(\"Cancelado\", \"Se ignoraron las decisiones seleccionadas\", \"error\");\r\n }\r\n });\r\n }\r\n self.reject = function () {\r\n if (self.gridOptions.api.getSelectedNodes().length > 0) {\r\n swal({\r\n title: \"Comentario de rechazo\",\r\n text: \"Ingrese un comentario por el cual se rechazaron los items sugeridos:\",\r\n type: \"input\",\r\n showCancelButton: true,\r\n closeOnConfirm: false,\r\n showLoaderOnConfirm: true,\r\n animation: \"slide-from-top\",\r\n //inputPlaceholder: \"\"\r\n },\r\n function (inputValue) {\r\n if (inputValue === false)\r\n return false;\r\n\r\n var assortmentIdsToReject = [];\r\n\r\n // rechazo solo los seleccionados.\r\n angular.forEach(self.gridOptions.api.getSelectedNodes(), function (node, key) {\r\n var item = node.data;\r\n\r\n if ((item.assortmentStatus == 1 || item.isSuggestionIgnored) && node.selected && node.group === undefined)\r\n assortmentIdsToReject.push(item.assortmentId);\r\n });\r\n\r\n if (assortmentIdsToReject.length > 0) {\r\n // Guardar cambios\r\n var currentUrl = window.location.href;\r\n assortmentService.decisions.rejectEndorse(assortmentIdsToReject, inputValue, currentUrl, $stateParams.categoryId)\r\n .then(function () {\r\n //ReloadGrid\r\n loadData(true);\r\n swal(\"Items Rechazados\", \"Se han rechazado los items seleccionados\", \"success\");\r\n },\r\n function (fallback) {\r\n swal(\"Error\", \"Ha ocurrido un error\", \"error\");\r\n }\r\n );\r\n }\r\n });\r\n }\r\n }\r\n self.exportToExcel = function () {\r\n var params = {\r\n skipHeader: false,\r\n skipFooters: false,\r\n skipGroups: false,\r\n allColumns: false,\r\n onlySelected: false,\r\n suppressQuotes: false,\r\n fileName: self.category + '.xls',\r\n columnSeparator: ','\r\n };\r\n\r\n self.gridOptions.api.exportDataAsCsv(params);\r\n }\r\n self.markAsReview = function (showModal) {\r\n self.busy = true;\r\n assortmentService.decisions.updateLastRevisionDate(self.currentCategoryId)\r\n .then(function (resp) {\r\n if (showModal) {\r\n swal(\"Categoria revisada!\", \"Se marco como revisada a esta categoria\", \"success\");\r\n }\r\n },\r\n function (fallback) {\r\n swal(\"Error\", \"Hubo un error al guardar los cambios\", \"error\");\r\n });\r\n\r\n self.busy = false;\r\n }\r\n self.updateCoverage = function () {\r\n swal({\r\n title: 'Modificar Cobertura',\r\n text: 'Ingrese el valor de cobertura a incorporar:',\r\n type: \"input\",\r\n showCancelButton: true,\r\n closeOnConfirm: false,\r\n animation: \"slide-from-top\",\r\n inputPlaceholder: \"Valor en %\"\r\n },\r\n function (inputValue) {\r\n if (inputValue === false)\r\n return false;\r\n if (inputValue === \"\") {\r\n swal.showInputError(\"Debe ingresar un valor\");\r\n return false\r\n }\r\n inputValue = inputValue.replace(',', '.');\r\n if (isNaN(inputValue)) {\r\n swal.showInputError(\"Debe ingresar un valor numerico\");\r\n return false\r\n }\r\n\r\n //Saco todos los filtros\r\n removeFilters();\r\n\r\n if (self.actualCoverage * 100 < parseInt(inputValue)) {\r\n self.gridOptions.api.forEachNode(function (node) {\r\n //Esto solo considera subir la cobertura actual\r\n if (!node.group && self.actualCoverage * 100 < parseInt(inputValue)) {\r\n if ((node.data.newIsListed == false || (node.data.newIsListed == null && node.data.isListed == true)) && node.data.marketSales > 0) {\r\n node.setSelected(true);\r\n }\r\n }\r\n });\r\n }\r\n\r\n swal(\"Cobertura Actualizada!\", \"Se actualizo correctamente la cobertura a \" + inputValue + \" %\", \"success\");\r\n });\r\n }\r\n self.updateChart = function (timerange) {\r\n\r\n self.timerange = timerange;\r\n\r\n if (self.assortmentDashboard == null)\r\n return;\r\n\r\n var lastWeekXValues = [];\r\n var lastMonthXValues = [];\r\n var lastYearXValues = [];\r\n var xValues = [];\r\n var lastXValues = [];\r\n\r\n\r\n if (timerange == 'week')\r\n xValues = self.assortmentDashboard.lastWeekXValues;\r\n else if (timerange == 'month')\r\n xValues = self.assortmentDashboard.lastMonthXValues;\r\n else\r\n xValues = self.assortmentDashboard.lastYearXValues;\r\n\r\n var lastDateString = null;\r\n var lastXValue = null;\r\n var selectedClusterId = 0;\r\n var cluster = _.filter(self.clusters, function (o) {\r\n return o.clusterCode == self.selectedFilterForCluster;\r\n });\r\n\r\n if (cluster.length > 0)\r\n selectedClusterId = cluster[0].clusterId;\r\n\r\n xValues.forEach(function (xValue) {\r\n\r\n if (lastDateString != xValue.dateString) {\r\n if (lastXValue != null) {\r\n lastXValue.precio = lastXValue.ventas_Un != 0 ? Math.round((lastXValue.ventas_$ / lastXValue.ventas_Un) * 100) / 100 : 0;\r\n lastXValues.push(lastXValue);\r\n }\r\n\r\n lastXValue = { dateString: xValue.dateString, ventas_$: 0, ventas_Un: 0, margen_$: 0, precio: 0 };\r\n }\r\n\r\n if (selectedClusterId == 0 || (xValue.clusterId == selectedClusterId)) {\r\n lastXValue.ventas_$ += xValue.sales;\r\n lastXValue.ventas_Un += xValue.units;\r\n lastXValue.margen_$ += xValue.margin;\r\n }\r\n\r\n lastDateString = xValue.dateString;\r\n });\r\n\r\n if (lastXValue != null) {\r\n lastXValue.precio = lastXValue.ventas_Un != 0 ? Math.round((lastXValue.ventas_$ / lastXValue.ventas_Un) * 100) / 100 : 0;\r\n lastXValues.push(lastXValue);\r\n }\r\n\r\n\r\n if (timerange == 'week')\r\n lastWeekXValues = lastXValues;\r\n else if (timerange == 'month')\r\n lastMonthXValues = lastXValues;\r\n else\r\n lastYearXValues = lastXValues;\r\n\r\n self.chart = c3.generate({\r\n bindto: '#saleschart',\r\n size: {\r\n height: 220\r\n },\r\n data: {\r\n json: (timerange == 'week' ? lastWeekXValues : timerange == 'month' ? lastMonthXValues : lastYearXValues),\r\n keys: {\r\n x: 'dateString',\r\n value: ['ventas_$', 'ventas_Un', 'margen_$', 'precio'],\r\n },\r\n axes: {\r\n ventas_$: 'y',\r\n ventas_Un: 'y',\r\n margen_$: 'y',\r\n precio: 'y2'\r\n },\r\n type: 'bar',\r\n types: {\r\n precio: 'line',\r\n },\r\n colors: {\r\n ventas_$: '#1ab394',\r\n ventas_Un: '#1c84c6',\r\n margen_$: '#f8ac59',\r\n precio: '#ED5565'\r\n }\r\n },\r\n axis: {\r\n x: {\r\n type: 'timeseries',\r\n tick: {\r\n fit: true,\r\n format: function (x) {\r\n if (self.timerange == 'week') {\r\n return $rootScope.shortWeekDayNames[x.getDay()];\r\n } else if (self.timerange == 'month') {\r\n return x.getDate() + '-' + $rootScope.shortMonthNames[(x.getMonth())];\r\n } else if (self.timerange == 'year') {\r\n return x.getFullYear() + '-' + (x.getMonth() + 1);\r\n }\r\n }\r\n }\r\n },\r\n y: {\r\n tick: {\r\n format: d3.format(\"s\")\r\n }\r\n },\r\n y2: {\r\n show: true,\r\n label: 'Precio en $',\r\n tick: {\r\n format: d3.format('.1f')\r\n },\r\n min: 0\r\n }\r\n },\r\n tooltip: {\r\n format: {\r\n title: function (d) {\r\n var toFormat = '%B %d, %Y';\r\n if (self.timerange == 'year')\r\n toFormat = '%B %Y';\r\n\r\n var format = d3.time.format(toFormat);\r\n return format(d);\r\n },\r\n value: function (value, ratio, id) {\r\n if (id === 'precio') {\r\n var format = d3.format('$,.2f');\r\n }\r\n else {\r\n var format = d3.format(',.0f');\r\n }\r\n\r\n return format(value);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n self.filterByText = function () {\r\n var eInput = document.querySelector('#searchGridInput');\r\n if (eInput) {\r\n\r\n if ((eInput.value.length > 2 && selectedFilterForText != eInput.value) || (eInput.value == '' && selectedFilterForText != '')) {\r\n selectedFilterForText = eInput.value;\r\n externalFilterChanged();\r\n }\r\n }\r\n }\r\n self.filterByTextIfEnter = function (e) {\r\n if (e.which === 13) { //Enter keycode\r\n self.filterByText();\r\n }\r\n }\r\n self.filterByStatus = function (status) {\r\n\r\n self.selectedFilters.status = status;\r\n\r\n //if (self.selectedFilterForStatus != status) {\r\n // self.selectedFilterForStatus = status;\r\n //externalFilterChanged();\r\n //}\r\n }\r\n self.filterByAssortmentStatus = function (assortmentStatus) {\r\n\r\n self.selectedFilters.assortmentStatus = assortmentStatus;\r\n\r\n //if (self.selectedFilterForAssortmentStatus != assortmentStatus) {\r\n // self.selectedFilterForAssortmentStatus = assortmentStatus;\r\n // externalFilterChanged();\r\n //}\r\n }\r\n self.filterByCluster = function (cluster) {\r\n\r\n self.selectedFilters.cluster = cluster;\r\n\r\n //if (self.selectedFilterForCluster != cluster) {\r\n // self.selectedFilterForCluster = cluster;\r\n\r\n // if (self.selectedFilterForCluster == 'Todos') {\r\n // self.acceptedAllSuggestions = false;\r\n // self.gridOptions.api.setRowData(self.pareto.items);\r\n // }\r\n // else {\r\n // self.acceptedAllSuggestions = false;\r\n // var onlySelectedCluster = [];\r\n // for (var i = 0; i < self.pareto.items.length; i++) {\r\n // if (self.pareto.items[i].subcategories.length > 0) {\r\n // for (var j = 0; j < self.pareto.items[i].subcategories.length; j++) {\r\n // if (self.pareto.items[i].subcategories[j].clusterCode == cluster)\r\n // onlySelectedCluster.push(angular.copy(self.pareto.items[i].subcategories[j]));\r\n // }\r\n // }\r\n // }\r\n\r\n // self.gridOptions.api.setRowData(onlySelectedCluster);\r\n // }\r\n\r\n // externalFilterChanged();\r\n // self.updateChart(self.timerange);\r\n //}\r\n }\r\n\r\n self.selectedFilters = {};\r\n\r\n self.filterByBrand = function (brand) {\r\n self.selectedFilters.brand = brand;\r\n }\r\n self.filterByStoreFormat = function (storeFormat) {\r\n self.selectedFilters.storeFormat = storeFormat;\r\n }\r\n self.filterByCustomerType = function (customerType) {\r\n self.selectedFilters.customerType = customerType;\r\n }\r\n self.filterByRegion = function (region) {\r\n self.selectedFilters.region = region;\r\n }\r\n self.applyFilters = function () {\r\n\r\n var pendingChanges = false;\r\n\r\n self.gridOptions.api.forEachNode(function (node) {\r\n if (node.data.dirty === true)\r\n pendingChanges = true;\r\n }); \r\n\r\n if (pendingChanges) {\r\n swal({\r\n title: \"Se perderan los cambios pendientes\",\r\n text: \"Si continua con esta accion se pederan los cambios que no hayan sido guardados. ¿Desea continuar?\",\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true,\r\n html: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n self.newListedItems = 0;\r\n self.newDelistedItems = 0;\r\n self.totalListedItems = 0;\r\n doApplyFilters();\r\n\r\n $timeout(function () {\r\n swal(\"Confirmado\", \"Se aceptaron todas las sugerencias\", \"success\");\r\n }, 1000);\r\n\r\n }\r\n });\r\n }\r\n else {\r\n doApplyFilters();\r\n }\r\n\r\n\r\n\r\n }\r\n\r\n function doApplyFilters () {\r\n //capturo los filtros seleccionados\r\n var filters = {\r\n onlySuggested: self.selectedFilters.status == 'Sugeridos' ? true : false,\r\n onlyNew: self.selectedFilters.status == 'Nuevos' ? true : false,\r\n onlyToEndorse: self.selectedFilters.status == 'Para Validar' ? true : false,\r\n onlyActive: self.selectedFilters.assortmentStatus == 'Activo' ? true : false,\r\n onlyInactive: self.selectedFilters.assortmentStatus == 'Inactivo' ? true : false,\r\n categoryId: self.currentCategoryId,\r\n clusterId: self.selectedFilters.cluster ? self.selectedFilters.cluster.id : null,\r\n brandId: self.selectedFilters.brand ? self.selectedFilters.brand.id : null,\r\n storeFormatId: self.selectedFilters.storeFormat ? self.selectedFilters.storeFormat.id : null,\r\n customerTypeId: self.selectedFilters.customerType ? self.selectedFilters.customerType.id : null,\r\n regionId: self.selectedFilters.region ? self.selectedFilters.region.id : null,\r\n groupByBrand: self.selectedFilters.groupByBrand,\r\n groupByFormat: self.selectedFilters.groupByFormat,\r\n groupByCustomer: self.selectedFilters.groupByCustomer,\r\n groupByRegion: self.selectedFilters.groupByRegion,\r\n }\r\n\r\n //recargo el pareto\r\n loadPareto(filters);\r\n }\r\n\r\n self.downloadSalesAndMarginReport = function () {\r\n self.isLoadingReport = true;\r\n assortmentService.reports.getSalesAndMargin($stateParams.categoryId).then(function (url) {\r\n window.open(url);\r\n self.isLoadingReport = false;\r\n });\r\n }\r\n\r\n self.checkGroupByOption = function (groupByOption) {\r\n\r\n switch (groupByOption) {\r\n case 'Brand': self.selectedFilters.groupByBrand = !self.selectedFilters.groupByBrand; break;\r\n case 'Format': self.selectedFilters.groupByFormat = !self.selectedFilters.groupByFormat; break;\r\n case 'Customer': self.selectedFilters.groupByCustomer = !self.selectedFilters.groupByCustomer; break;\r\n case 'Region': self.selectedFilters.groupByRegion = !self.selectedFilters.groupByRegion; break;\r\n }\r\n\r\n //Pedido especial de colombia (si se usa Region no se usa BTC)\r\n if (groupByOption == 'Region' && self.selectedFilters.groupByRegion == true) {\r\n self.selectedFilters.groupByBrand = false;\r\n self.selectedFilters.groupByFormat = false;\r\n self.selectedFilters.groupByCustomer = false;\r\n }\r\n else if (self.selectedFilters.groupByBrand || self.selectedFilters.groupByFormat || self.selectedFilters.groupByCustomer) {\r\n self.selectedFilters.groupByRegion = false;\r\n }\r\n }\r\n\r\n //dialogs\r\n self.openChatDialog = function (itemId, clusterId) {\r\n\r\n var newScope = $scope.$new();\r\n newScope.showLoader = true;\r\n assortmentService.decisions.getChatForItem(itemId, clusterId).then(function (data) {\r\n newScope.showLoader = false;\r\n\r\n newScope.chats = [];\r\n newScope.isSaving = false;\r\n newScope.newChat = {\r\n id: 0,\r\n assortmentId: data.length > 0 ? data[0].assortmentId : 0,\r\n clusterId: clusterId,\r\n itemId: itemId,\r\n message: \"\",\r\n pictureUrl: \"defaultUser.jpg\", //TODO: Reemplazar por el current userPicture\r\n sendDate: new Date()\r\n };\r\n\r\n if (data.length > 0 && data[0].id != null && data[0].id != 0)\r\n newScope.chats = data;\r\n\r\n newScope.saveMessage = function () {\r\n newScope.isSaving = true;\r\n assortmentService.decisions.saveChatForItem(newScope.newChat)\r\n .then(function (resp) {\r\n if (resp != null) {\r\n newScope.chats.push(resp);\r\n newScope.newChat.message = \"\";\r\n newScope.isSaving = false;\r\n }\r\n else {\r\n newScope.isSaving = true;\r\n }\r\n },\r\n function (fallback) {\r\n newScope.isSaving = true;\r\n });\r\n }\r\n });\r\n\r\n ngDialog.open({\r\n template: 'chatDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-300',\r\n scope: newScope\r\n });\r\n };\r\n\r\n self.openColumnViewerDialog = function () {\r\n var newScope = $scope.$new();\r\n newScope.auxColumnIndexesToHide = [];\r\n newScope.allColumns = self.gridOptions.columnDefs;\r\n\r\n angular.forEach(newScope.allColumns, function (p) {\r\n angular.forEach(p.children, function (c) {\r\n c.isChecked = !c.hide;//checkeado si no esta oculto\r\n });\r\n });\r\n\r\n newScope.filterColumnViewer = function (c) {\r\n rv = true;\r\n if (c.id == \"select\") {\r\n rv = false;\r\n }\r\n if (c.headerName == \"Codigo\" && self.hideSpaces) {\r\n rv = false;\r\n }\r\n if (c.headerName == \"Discontinuidad\" && !canView(\"BlockedForPurchase\")) {\r\n rv = false;\r\n }\r\n if ((c.headerName == \"Id Mix\" || c.headerName == \"Id Cluster\" || c.headerName == \"SKU\") && !self.showParam1) {\r\n rv = false;\r\n }\r\n if ((c.headerName == \"SubRubro\" || c.headerName == \"Grupo\") && !self.PrevCategory) {\r\n rv = false;\r\n }\r\n if (c.headerName == \"Decision\" && c.field == \"isSuggestionIgnored\" && !self.isEndorse) {\r\n rv = false;\r\n }\r\n else if (c.headerName == \"Decision\" && c.field == \"newIsListed\" && self.isEndorse) {\r\n rv = false;\r\n }\r\n if (c.headerName == \"%\" && c.field == \"presence2\" && !self.showPresence2) {\r\n rv = false;\r\n }\r\n else if (c.headerName == \"%\" && c.field == \"presence\" && self.showPresence2) {\r\n rv = false;\r\n }\r\n if (c.headerName == \"Venta Total\" && self.showSalesTotal) {\r\n rv = false;\r\n }\r\n if (c.headerName == \"Ventas Un Total\" && !self.showUnitsTotal) {\r\n rv = false;\r\n }\r\n if ((c.headerName == \"Metros\" || c.headerName == \"Frentes\" || c.headerName == \"% Espacio\" || c.headerName == \"GMROS\") && self.hideSpaces) {\r\n rv = false;\r\n }\r\n if (c.headerName == \"Planograma\" && (!self.showPlanogramEdition || self.hideSpaces)) {\r\n rv = false;\r\n }\r\n if (c.headerName == \"Disponibilidad\" && !canView(\"Availability\")) {\r\n rv = false;\r\n }\r\n if (c.headerName == \"Merma Desconocida %\" && c.hide) {\r\n rv = false;\r\n }\r\n if (c.headerName == \"Merma\" && !self.showWasteUnits) {\r\n rv = false;\r\n }\r\n return rv;\r\n }\r\n\r\n self.saveColumnsToHide = function () {\r\n angular.forEach(newScope.allColumns, function (p, parentIdx) {\r\n newScope.auxColumnIndexesToHide[parentIdx] = [];\r\n angular.forEach(p.children, function (c, childrenIdx) {\r\n if (!c.isChecked && newScope.filterColumnViewer(c)) {\r\n newScope.auxColumnIndexesToHide[parentIdx].push(childrenIdx);\r\n }\r\n });\r\n });\r\n var jsonColumnIndexesToHide = JSON.stringify(newScope.auxColumnIndexesToHide);\r\n assortmentService.decisions.saveColumnsToHide(jsonColumnIndexesToHide).then(function (resp) {\r\n if (resp != null) {\r\n swal(\"Guardado exitosamente\", \"Recargue la pantalla para visualizar sus cambios.\", \"success\");\r\n ngDialog.close();\r\n }\r\n })\r\n }\r\n\r\n ngDialog.open({\r\n template: 'columnViewerDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-height-500 tagsDialog',\r\n scope: newScope\r\n });\r\n }\r\n\r\n \r\n\r\n self.openTagsDialog = function (itemId) {\r\n var itemTags = null;\r\n self.gridOptions.api.forEachNode(function (node) {\r\n if (node.data.itemId === itemId)\r\n itemTags = node.data.tagIds;\r\n });\r\n\r\n var tagGroups = _.groupBy(self.tags, 'group');\r\n angular.forEach(tagGroups, function (tg) {\r\n tg.selectedTags = [];\r\n tg.itemId = itemId\r\n });\r\n\r\n var newScope = $scope.$new();\r\n newScope.tagGroups = tagGroups;\r\n newScope.selectedItemId = itemId;\r\n\r\n //Load existing tags\r\n if (itemTags != null && itemTags != 'null') {\r\n var existingTagIds = itemTags.split(',');\r\n\r\n for (var i = 0; i < existingTagIds.length; i++) {\r\n angular.forEach(newScope.tagGroups, function (tg) {\r\n if (_.find(tg, function (t) {\r\n return t.id == existingTagIds[i].trim();\r\n }) != null) {\r\n let t = tg.filter(function (t) { return t.id == existingTagIds[i].trim(); });\r\n if (t.length === 1)\r\n tg.selectedTags.push(t[0]);\r\n }\r\n });\r\n }\r\n }\r\n\r\n //SaveTags\r\n newScope.saveTags = function () {\r\n var tagIdsToSave = [];\r\n var tagNamesToSave = [];\r\n\r\n angular.forEach(newScope.tagGroups, function (tg) {\r\n angular.forEach(tg.selectedTags, function (tag) {\r\n tagIdsToSave.push(tag.id);\r\n tagNamesToSave.push(tag.name);\r\n });\r\n });\r\n\r\n adminService.items.saveItemTags(tagIdsToSave, newScope.selectedItemId)\r\n .then(function (resp) {\r\n if (resp) {\r\n ngDialog.close();\r\n //loadData(); no recargo la grilla porque pierdo las deciciones tomadas. recargar solo estos tags.\r\n self.gridOptions.api.forEachNode(function (node) {\r\n if (node.data.itemId === itemId) {\r\n node.data.tagIds = tagIdsToSave.join(', ');\r\n node.data.tags = tagNamesToSave.join(', ');\r\n }\r\n });\r\n }\r\n else {\r\n //Todo: Ocurrio un error, Pedir que se guarden nuevamnete.\r\n }\r\n });\r\n }\r\n\r\n ngDialog.open({\r\n template: 'tagDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-height-500 tagsDialog',\r\n backdrop: 'static',\r\n keyboard: false,\r\n scope: newScope\r\n });\r\n };\r\n self.openPresenceDialog = function (itemId, clusterId) {\r\n\r\n var newScope = $scope.$new();\r\n newScope.showLoader = true;\r\n assortmentService.decisions.getPresenceDetail(itemId, clusterId).then(function (data) {\r\n newScope.showLoader = false;\r\n\r\n newScope.presence = [];\r\n newScope.isSaving = false;\r\n\r\n if (data && data.length > 0)\r\n newScope.presence = data\r\n });\r\n\r\n ngDialog.open({\r\n template: 'presenceDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n };\r\n self.openParetoSectionsDialog = function () {\r\n\r\n var newScope = $scope.$new();\r\n newScope.isSaving = false;\r\n newScope.applyParetoSections = function () {\r\n //re-count\r\n countParetoSections();\r\n\r\n //refresh grid\r\n self.gridOptions.api.setRowData(self.pareto.items);\r\n self.gridOptions.api.refreshView();\r\n\r\n ngDialog.close();\r\n }\r\n newScope.saveParetoSections = function () {\r\n\r\n assortmentService.decisions.saveParetoSections(self.paretoSections)\r\n .then(function () {\r\n newScope.applyParetoSections();\r\n });\r\n }\r\n newScope.edit = function (prop, $$hashKey) {\r\n newScope[prop + $$hashKey] = true;\r\n }\r\n newScope.done = function (prop, $$hashKey) {\r\n newScope[prop + $$hashKey] = false;\r\n }\r\n newScope.editing = function (prop, $$hashKey) {\r\n if (newScope[prop + $$hashKey])\r\n return newScope[prop + $$hashKey];\r\n\r\n return false;\r\n }\r\n newScope.newSection = function () {\r\n self.paretoSections.push({\r\n categoryId: self.currentCategoryId,\r\n name: 'NuevaSeccion',\r\n valueFrom: 0,\r\n valueTo: 0,\r\n alpha: null\r\n });\r\n }\r\n newScope.deleteSection = function (section) {\r\n var ix = self.paretoSections.indexOf(section);\r\n self.paretoSections.splice(ix, 1);\r\n\r\n }\r\n\r\n if (!self.paretoSections) {\r\n assortmentService.decisions.getParetoSections(self.currentCategoryId).then(function (sections) {\r\n\r\n self.paretoSections = sections;\r\n newScope.paretoSections = self.paretoSections;\r\n\r\n ngDialog.open({\r\n template: 'paretoSectionsDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n });\r\n }\r\n else {\r\n newScope.paretoSections = self.paretoSections;\r\n\r\n ngDialog.open({\r\n template: 'paretoSectionsDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n scope: newScope\r\n });\r\n }\r\n\r\n };\r\n self.openSuggestionActionsDialog = function (nodeId) {\r\n\r\n y = window.scrollY;\r\n $scope.selectedNode = nodeId ? getNodeById(nodeId) : undefined;\r\n\r\n ngDialog.open({\r\n template: 'suggestionActionsDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n preCloseCallback: function () {\r\n $timeout(function () {\r\n window.scroll(0, y);\r\n }, 550);\r\n },\r\n scope: $scope\r\n });\r\n\r\n };\r\n self.openDecisionActionDialog = function (nodeId) {\r\n\r\n y = window.scrollY;\r\n $scope.selectedNode = nodeId ? getNodeById(nodeId) : undefined;\r\n\r\n ngDialog.open({\r\n template: 'decisionActionsDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom',\r\n preCloseCallback: function () {\r\n $timeout(function () {\r\n window.scroll(0, y);\r\n }, 550);\r\n },\r\n scope: $scope\r\n });\r\n\r\n };\r\n\r\n //main actions\r\n self.toggleAllSuggestions = function () {\r\n if (self.acceptedAllSuggestions)\r\n self.revertAllSuggestions();\r\n else\r\n self.acceptAllSuggestions();\r\n }\r\n self.acceptAllSuggestions = function () {\r\n swal({\r\n title: \"Esta seguro?\",\r\n text: \"Esta accion aceptara todas las sugerencias hechas por prisma.\",\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n self.gridOptions.api.forEachNode(function (node) {\r\n if (node.group) {\r\n acceptSuggestionsForAllChildren(node);\r\n }\r\n else {\r\n //solo actualizo los que tienen sugerencia sin decision\r\n if (node.data.suggestionListed != null) {\r\n if (node.data.suggestionListed != node.data.newIsListed) {\r\n if (node.data.suggestionListed == false)\r\n removeFromAssortment(node);\r\n else if (node.data.suggestionListed == true)\r\n addToAssortment(node);\r\n }\r\n }\r\n }\r\n });\r\n\r\n self.acceptedAllSuggestions = true;\r\n\r\n $timeout(function () {\r\n swal(\"Confirmado\", \"Se aceptaron todas las sugerencias\", \"success\");\r\n }, 1000);\r\n\r\n }\r\n });\r\n }\r\n self.revertAllSuggestions = function () {\r\n swal({\r\n title: \"Esta seguro?\",\r\n text: \"Esta accion revertira todas las sugerencias aceptadas.\",\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n self.gridOptions.api.forEachNode(function (node) {\r\n if (node.group) {\r\n revertAcceptedSuggestionsForAllChildren(node);\r\n }\r\n else {\r\n //solo revierto los que tienen sugerencia y decision\r\n if (node.data.suggestionListed != null) {\r\n if (node.data.suggestionListed === node.data.newIsListed) {\r\n revertDecision(node);\r\n }\r\n }\r\n }\r\n });\r\n\r\n self.acceptedAllSuggestions = false;\r\n\r\n $timeout(function () {\r\n swal(\"Confirmado\", \"Se revirtieron todas las sugerencias\", \"success\");\r\n }, 1000);\r\n\r\n }\r\n });\r\n }\r\n self.addToAssortment = function (nodeId) {\r\n\r\n //obtengo el nodo de la grilla\r\n var node = getNodeById(nodeId);\r\n\r\n addToAssortment(node);\r\n self.updateSummaryBox();\r\n }\r\n self.removeFromAssortment = function (nodeId) {\r\n //obtengo el nodo de la grilla\r\n var node = getNodeById(nodeId);\r\n\r\n removeFromAssortment(node);\r\n self.updateSummaryBox();\r\n }\r\n self.acceptSuggestionsForAllChildren = function (nodeId) {\r\n\r\n if (nodeId) {\r\n //obtengo el nodo de la grilla\r\n var node = getNodeById(nodeId);\r\n acceptSuggestionsForAllChildren(node);\r\n }\r\n else {\r\n self.acceptAllSuggestions();\r\n }\r\n\r\n }\r\n self.revertAcceptedSuggestionsForAllChildren = function (nodeId) {\r\n\r\n if (nodeId) {\r\n //obtengo el nodo de la grilla\r\n var node = getNodeById(nodeId);\r\n revertAcceptedSuggestionsForAllChildren(node);\r\n }\r\n else {\r\n self.revertAllSuggestions();\r\n }\r\n }\r\n self.ignoreAll = function () {\r\n swal({\r\n title: \"Esta seguro?\",\r\n text: \"Se ignoraran todas las sugerencias hechas por prisma.\",\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n self.gridOptions.api.forEachNode(function (node) {\r\n if (!node.group) {\r\n self.ignore(node);\r\n }\r\n });\r\n\r\n self.ignoredAll = true;\r\n\r\n $timeout(function () {\r\n swal(\"Confirmado\", \"Se ignoraron todas las sugerencias\", \"success\");\r\n }, 1000);\r\n\r\n }\r\n });\r\n }\r\n self.undoIgnoreAll = function () {\r\n swal({\r\n title: \"Esta seguro?\",\r\n text: \"Se volveran a incluir todas las sugerencias hechas por prisma.\",\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n\r\n self.gridOptions.api.forEachNode(function (node) {\r\n if (!node.group) {\r\n self.undoIgnore(node);\r\n }\r\n });\r\n\r\n self.ignoredAll = false;\r\n\r\n $timeout(function () {\r\n swal(\"Confirmado\", \"Se incluyeron todas las sugerencias\", \"success\");\r\n }, 1000);\r\n }\r\n });\r\n }\r\n\r\n self.addToAssortmentForAllChildren = function (node) {\r\n //recorro todos los hijos (no solo filtrados porque el filtro puede ser cualquiera)\r\n node.children.forEach(function (node) {\r\n\r\n //si hay rows de grupos en la jerarquia bajo un nivel mas para llegar a los ClusterRow\r\n if (node.data.rowType == \"GroupRow\") {\r\n\r\n node.children.forEach(function (node) {\r\n self.addToAssortment(node);\r\n });\r\n }\r\n else {\r\n self.addToAssortment(node);\r\n }\r\n\r\n });\r\n }\r\n self.removeFromAssortmentForAllChildren = function (node) {\r\n //recorro todos los hijos (no solo filtrados porque el filtro puede ser cualquiera)\r\n node.children.forEach(function (node) {\r\n\r\n //si hay rows de grupos en la jerarquia bajo un nivel mas para llegar a los ClusterRow\r\n if (node.data.rowType == \"GroupRow\") {\r\n\r\n node.children.forEach(function (node) {\r\n self.removeFromAssortment(node);\r\n });\r\n }\r\n else {\r\n self.removeFromAssortment(node);\r\n }\r\n\r\n });\r\n }\r\n\r\n self.ignore = function (pNode) {\r\n\r\n if (pNode) {\r\n var node = getNodeById(pNode);\r\n\r\n if (node.group) {\r\n //si es un nodo padre ignoro las sugerencias de cada hijo\r\n node.children.forEach(function (childNode) {\r\n if (!childNode.group && childNode.data.suggestionListed != null) {\r\n childNode.data.ignored = true;\r\n childNode.data.dirty = true;\r\n self.gridOptions.api.refreshRows([childNode]);\r\n }\r\n });\r\n\r\n node.data.ignored = true;\r\n self.gridOptions.api.refreshRows([node]);\r\n }\r\n else if (node.data.suggestionListed != null) {\r\n //si es un nodo hijo ignoro la sugerencia\r\n node.data.ignored = true;\r\n node.data.dirty = true;\r\n self.gridOptions.api.refreshRows([node]);\r\n }\r\n }\r\n else {\r\n self.ignoreAll();\r\n }\r\n updateParentAndRefreshScreen(node, false);\r\n\r\n }\r\n self.undoIgnore = function (pNode) {\r\n\r\n if (pNode) {\r\n\r\n var node = getNodeById(pNode);\r\n\r\n if (node.group) {\r\n //si es un nodo padre ignoro las sugerencias de cada hijo\r\n node.children.forEach(function (childNode) {\r\n if (!childNode.group && childNode.data.suggestionListed != null) {\r\n childNode.data.ignored = false;\r\n childNode.data.dirty = true;\r\n self.gridOptions.api.refreshRows([childNode]);\r\n }\r\n });\r\n\r\n node.data.ignored = false;\r\n self.gridOptions.api.refreshRows([node]);\r\n }\r\n else if (node.data.suggestionListed != null) {\r\n //si es un nodo hijo ignoro la sugerencia\r\n node.data.ignored = false;\r\n node.data.dirty = true;\r\n self.gridOptions.api.refreshRows([node]);\r\n }\r\n }\r\n else {\r\n self.undoIgnoreAll();\r\n }\r\n updateParentAndRefreshScreen(node, false);\r\n }\r\n\r\n self.isIgnored = function (nodeId) {\r\n var node = getNodeById(nodeId);\r\n\r\n if (node.data.ignored)\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n self.saveDecisions = function () {\r\n\r\n var swalText = \"Esta seguro que desea guardar los cambios seleccionados?\";\r\n\r\n swal({\r\n title: \"Esta seguro?\",\r\n text: swalText,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n var itemsToSave = [];\r\n self.gridOptions.api.forEachNode(function (node) {\r\n var item = node.data;\r\n\r\n if (!node.group && item.dirty) {\r\n\r\n var itemToSave = {\r\n itemId: item.itemId,\r\n clusterId: item.clusterId,\r\n subcategoryId: item.subcategoryId,\r\n assortmentId: item.assortmentId,\r\n isListed: item.isListed,\r\n newIsListed: item.newIsListed,\r\n suggestionListed: item.suggestionListed,\r\n isSuggestionIgnored: item.ignored\r\n };\r\n\r\n itemsToSave.push(itemToSave);\r\n }\r\n });\r\n\r\n if (itemsToSave.length > 0) {\r\n assortmentService.decisions.saveDecisions(itemsToSave, false, $stateParams.categoryId)\r\n .then(function () {\r\n //ReloadGrid\r\n loadData(true);\r\n swal(\"Confirmado\", \"Se guardaron los cambios seleccionados\", \"success\");\r\n doApplyFilters();\r\n },\r\n function (status) {\r\n if (status != 502) {\r\n swal(\"Error\", \"Hubo un error al generar las sugerencias para esta categoria\", \"error\");\r\n }\r\n });\r\n\r\n }\r\n else {\r\n $timeout(function () {\r\n swal(\"Sin Items\", \"No hay items con modificaciones\", \"error\");\r\n }, 1000);\r\n }\r\n }\r\n });\r\n }\r\n\r\n self.goToPlanogram = function (itemId, clusterId) {\r\n $state.go('spaces.editPlanogram', { planogramId: 0, itemId: itemId, clusterId: clusterId });\r\n }\r\n\r\n\r\n\r\n /*** PRIVATE FUNCTIONS ***/\r\n //grid config\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: 'Informacion General',\r\n children: [\r\n {\r\n id: \"select\",\r\n field: \"itemId\",\r\n pinned: 'left',\r\n colIndex: 0,\r\n width: 25,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n hide: !self.isEndorse,\r\n filter: false,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.emptyRenderer,\r\n checkboxSelection: function (params) {\r\n // we put checkbox on only if we are not grouping\r\n return params.columnApi.getRowGroupColumns().length === 0;\r\n },\r\n headerCellRenderer: function (params) {\r\n return '';\r\n }\r\n },\r\n {\r\n headerName: \"EAN\",\r\n headerTooltip: \"\",\r\n field: \"itemEan\",\r\n pinned: 'left',\r\n width: numberColWidth + 40,\r\n hide: self.hideColumn(0, 1),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: {\r\n renderer: 'group',\r\n checkbox: false,\r\n innerRenderer: function (params) {\r\n var description = '';\r\n\r\n if (!params.node.group) {\r\n var totalChats = params.data.chatsQuantity != 0 ? '(' + params.data.chatsQuantity + ') ' : '';\r\n description = ' '\r\n }\r\n\r\n description += params.value || \"\";\r\n return description;\r\n }\r\n }\r\n },\r\n {\r\n headerName: \"Fecha de Creacion\",\r\n pinned: 'left',\r\n headerTooltip: \"\",\r\n field: \"created\",\r\n filter: 'text',\r\n width: numberColWidth + 40,\r\n hide: self.hideColumn(0, 2),\r\n cellClass: $rootScope.getClassForCell\r\n }, \r\n {\r\n headerName: \"Codigo\",\r\n pinned: 'left',\r\n //columnGroupShow: 'open',\r\n headerTooltip: \"\",\r\n field: \"itemCode\",\r\n filter: 'number',\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n hide: self.hideSpaces || self.hideColumn(0, 3)\r\n },\r\n {\r\n headerName: \"Discontinuidad\",\r\n pinned: 'left',\r\n hide: !canView(\"BlockedForPurchase\") || self.hideColumn(0, 4),\r\n headerTooltip: \"\",\r\n field: \"blockedForPurchase\",\r\n filter: 'text',\r\n width: numberColWidth + 20,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Id Mix\",\r\n columnGroupShow: 'open',\r\n hide: !self.showParam1 || self.hideColumn(0, 5),\r\n headerTooltip: \"\",\r\n field: \"param1\",\r\n filter: 'text',\r\n width: numberColWidth + 20,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Id Cluster\",\r\n columnGroupShow: 'open',\r\n hide: !self.showParam1 || self.hideColumn(0, 6),\r\n headerTooltip: \"\",\r\n field: \"param2\",\r\n filter: 'text',\r\n width: numberColWidth + 20,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"SKU\",\r\n columnGroupShow: 'open',\r\n hide: !self.showParam1 || self.hideColumn(0, 7),\r\n headerTooltip: \"\",\r\n field: \"param3\",\r\n filter: 'text',\r\n width: numberColWidth + 20,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Desc Articulo\",\r\n headerTooltip: \"\",\r\n field: \"itemName\",\r\n pinned: 'left',\r\n width: numberColWidth + 240,\r\n hide: self.hideColumn(0, 8),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer:\r\n function (params) {\r\n\r\n var description = '';\r\n\r\n if (params.data.itemId != null && params.node.group) {\r\n //var tagIds = \"'\" + params.data.tagIds + \"'\";\r\n description += ' ';\r\n }\r\n var newLabel = '';\r\n if (params.data.isNew && params.node.group)\r\n newLabel = ' NUEVO';\r\n\r\n var name = newLabel + params.value + (params.node.group && params.node.children != null ? ' (' + params.node.children.length + ')' : '');\r\n\r\n description += '' + name + '';\r\n //description += '' + name + '';\r\n\r\n return description;\r\n\r\n }\r\n },\r\n {\r\n headerName: \"Cluster\",\r\n headerTooltip: \"\",\r\n field: \"clusterCode\",\r\n pinned: 'left',\r\n width: numberColWidth,\r\n hide: self.hideColumn(0, 9),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer:\r\n function (params) {\r\n if (params.data.clusterCode)\r\n return params.data.clusterCode + ' | ' + params.data.cluster;\r\n else\r\n return '';\r\n }\r\n },\r\n {\r\n headerName: \"SubRubro\",\r\n headerTooltip: \"\",\r\n hide: !self.PrevCategory || self.hideColumn(0, 10), // Hacer el parametro arriba y poner true solo si es chile !\r\n field: \"param2\",\r\n columnGroupShow: 'open',\r\n width: numberColWidth + 20,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Grupo\",\r\n headerTooltip: \"\",\r\n hide: !self.PrevCategory || self.hideColumn(0, 11), // Hacer el parametro arriba y poner true solo si es chile !\r\n field: \"param1\",\r\n columnGroupShow: 'open',\r\n width: numberColWidth + 15,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Marca\",\r\n columnGroupShow: 'open',\r\n field: \"brand\",\r\n headerTooltip: \"\",\r\n width: numberColWidth,\r\n hide: self.hideColumn(0, 12),\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Fabricante\",\r\n columnGroupShow: 'open',\r\n field: \"manufacturer\",\r\n headerTooltip: \"\",\r\n width: numberColWidth,\r\n hide: self.hideColumn(0, 13),\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Tags\",\r\n columnGroupShow: 'open',\r\n field: \"tags\",\r\n width: 220,\r\n hide: self.hideColumn(0, 14),\r\n cellClass: $rootScope.getClassForCell\r\n }]\r\n },\r\n {\r\n headerName: 'Estado',\r\n children: [\r\n {\r\n headerName: \"Actual\",\r\n field: \"isListed\",\r\n headerTooltip: \"\",\r\n width: numberColWidth,\r\n hide: self.hideColumn(1, 0),\r\n cellClass: getClassForSuggestionCell,\r\n cellRenderer: function (params) {\r\n\r\n //Si es padre evaluo de mostrar los * o mismo valor\r\n if (params.node.group) {\r\n var textToShow = '';\r\n allIsListed = null;\r\n angular.forEach(params.node.data.subcategories, function (nodoHijo) {\r\n if (allIsListed == null && nodoHijo.isListed != null) //Si es el primero con isListed != a null\r\n allIsListed = nodoHijo.isListed;\r\n else if (allIsListed != null && nodoHijo.isListed != null && nodoHijo.isListed != allIsListed)\r\n textToShow = '*';\r\n })\r\n\r\n if (textToShow != '*') //Estaban todos Listados o delistados o sin valor\r\n if (allIsListed == true)\r\n textToShow = 'Activo';\r\n else if (allIsListed == false)\r\n textToShow = 'Inactivo';\r\n\r\n return textToShow;\r\n }\r\n else {\r\n if (params.value == true)\r\n return 'Activo';\r\n else\r\n return 'Inactivo';\r\n }\r\n }\r\n },\r\n {\r\n headerName: \"Sugerencia\",\r\n headerCellRenderer: function (params) {\r\n var header = 'Sugerencia';\r\n\r\n //header += ''\r\n // + '';\r\n\r\n //var action = 'toggleAllSuggestions';\r\n //var tooltip = 'Aceptar / Revertir las sugerencias';\r\n //var icon = 'fa-check';\r\n\r\n //header += ian.format('', action, tooltip, icon);\r\n\r\n if (!self.isEndorse)\r\n header += '';\r\n\r\n return header;\r\n },\r\n field: \"suggestionListed\",\r\n headerTooltip: \"\",\r\n width: numberColWidth + 60,\r\n hide: self.hideColumn(1, 1),\r\n cellClass: $rootScope.getClassForCell,\r\n filter: 'select',\r\n suppressSorting: true,\r\n cellRenderer: function (params) {\r\n\r\n //NEW WAY\r\n var suggestionText = \"\";\r\n if (params.value != null)\r\n suggestionText = params.value == true ? \"Incorporar\" : \"Quitar\";\r\n\r\n var cell = '' + (suggestionText != null ? suggestionText : '') + '';\r\n\r\n if (params.node.data.rowType == \"ItemRow\") {\r\n\r\n if (self.anyChildSuggestions(params.node)) {\r\n cell += '';\r\n }\r\n\r\n }\r\n else if (params.node.data.rowType == \"GroupRow\") {\r\n\r\n if (self.anyChildSuggestions(params.node)) {\r\n cell += '';\r\n }\r\n\r\n }\r\n else if (params.node.data.rowType == \"ClusterRow\") {\r\n\r\n if (!self.isEndorse && (params.node.data.isSuggestionIgnored || params.node.data.suggestionListed == undefined || params.node.data.suggestionListed == null)) {\r\n cell = '';\r\n }\r\n else {\r\n cell += ''\r\n + '';\r\n }\r\n\r\n }\r\n\r\n return cell;\r\n\r\n ////OLD WAY\r\n //if (params.value == null)\r\n // return '';\r\n //else {\r\n // var suggestionText = params.value == true ? \"Incorporar\" : \"Quitar\";\r\n\r\n // if (params.node.group) {\r\n\r\n // var cell = '' + (suggestionText != null ? suggestionText : '') + '';\r\n // cell += ''\r\n // cell += ''\r\n\r\n // if (self.anyChildSuggestions(params.node)) {\r\n // var icon = params.node.data.accepted ? 'fa-undo' : 'fa-check';\r\n // var tooltip = params.node.data.accepted ? 'Revertir sugerencias aceptadas' : 'Aceptar todas las sugerencias para este Item';\r\n // var action = params.node.data.accepted ? 'revertAcceptedSuggestionsForAllChildren' : 'acceptSuggestionsForAllChildren';\r\n\r\n // cell += ian.format('', tooltip, action, params.node.id, icon);\r\n // }\r\n\r\n // return cell;\r\n // }\r\n\r\n // if (!self.isEndorse && params.node.data.isSuggestionIgnored)\r\n // return '';\r\n\r\n // return '' + suggestionText + ''\r\n // + ''\r\n // + '';\r\n //}\r\n\r\n\r\n\r\n }\r\n\r\n },\r\n {\r\n headerName: \"Decision\",\r\n headerCellRenderer: function (params) {\r\n var header = 'Decision';\r\n\r\n if (!self.isEndorse)\r\n header += '';\r\n\r\n return header;\r\n },\r\n field: \"newIsListed\",\r\n filter: 'select',\r\n hide: self.isEndorse || self.hideColumn(1, 2),\r\n headerTooltip: \"\",\r\n suppressSorting: true,\r\n width: numberColWidth + 20,\r\n cellClass: getClassForSuggestionCell,\r\n cellRenderer: function (params) {\r\n\r\n var cell = '';\r\n\r\n if (params.node.data.rowType == \"ItemRow\") {\r\n cell += '';\r\n }\r\n else if (params.node.data.rowType == \"GroupRow\") {\r\n cell += '';\r\n }\r\n else if (params.node.data.rowType == \"ClusterRow\") {\r\n\r\n var nodeId = params.node.id;\r\n\r\n var decision = params.data.newIsListed;\r\n var suggestion = params.data.suggestionListed;\r\n var actual = params.data.isListed;\r\n\r\n var btnIncorporar = '';\r\n var btnQuitar = '';\r\n\r\n if (decision != null) {\r\n if (decision == false)\r\n cell = btnIncorporar\r\n else if (decision == true)\r\n cell = btnQuitar;\r\n }\r\n else if (suggestion != null) {\r\n if (suggestion == false)\r\n cell = btnQuitar;\r\n else if (suggestion == true)\r\n cell = btnIncorporar;\r\n }\r\n else {\r\n if (actual == true)\r\n cell = btnQuitar\r\n else if (actual == false)\r\n cell = btnIncorporar;\r\n }\r\n }\r\n\r\n return cell;\r\n }\r\n },\r\n {\r\n headerName: \"Decision\",\r\n field: \"isSuggestionIgnored\",\r\n filter: 'select',\r\n hide: !self.isEndorse || self.hideColumn(1, 3),\r\n headerTooltip: \"\",\r\n suppressSorting: true,\r\n width: numberColWidth + 20,\r\n cellClass: getClassForSuggestionCell,\r\n cellRenderer: function (params) {\r\n\r\n if (params.node.group) {//es padre\r\n var allIgnored = true;\r\n angular.forEach(params.node.data.subcategories, function (nodoHijo) {\r\n if (!nodoHijo.isSuggestionIgnored)\r\n allIgnored = false;\r\n })\r\n if (allIgnored)\r\n return \"Sugerencia Ignorada\";\r\n else return \"\";\r\n }\r\n else {// es hijo\r\n if (params.value == true)\r\n return \"Sugerencia Ignorada\";\r\n else return \"\";\r\n }\r\n }\r\n },\r\n {\r\n headerName: \"Nuevo\",\r\n field: \"newIsListed\",\r\n filter: 'text',\r\n filter: 'select',\r\n headerTooltip: \"Refleja el nuevo estado de catalogacion\",\r\n width: numberColWidth - 20,\r\n hide: self.hideColumn(1, 4),\r\n cellClass: getClassForSuggestionCell,\r\n cellRenderer: function (params) {\r\n\r\n //Si es padre evaluo de mostrar los * o mismo valor\r\n if (params.node.group) {\r\n var textToShow = '';\r\n var allNewIsListed = true;//todos los hijos tienen decision tomada\r\n var allIgnored = true;\r\n var currentNewIsListed = null;//flag de decision tomada \r\n\r\n angular.forEach(params.node.data.subcategories, function (nodoHijo) {\r\n if (currentNewIsListed == null) {//si todavia no encontramos una decision tomada\r\n if (nodoHijo.newIsListed != null) {//y si este tiene una decision tomada\r\n currentNewIsListed = nodoHijo.newIsListed;//tenemos un nuevo flag\r\n allIgnored = false;\r\n }\r\n else {//si no tiene una decision tomada\r\n allNewIsListed = false;//entonces no TODAS comparten una decision\r\n if (!nodoHijo.ignored)\r\n allIgnored = false;\r\n }\r\n }\r\n else {//si ya hay un hijo con decision tomada...\r\n if (nodoHijo.newIsListed != null) {//y si este tiene una decision tomada\r\n if (nodoHijo.newIsListed != currentNewIsListed) {//y este tiene distinta\r\n textToShow = '*';//muestro *\r\n allNewIsListed = false; // no TODAS comparten una decision\r\n }\r\n }\r\n else//si no tiene para ofreser\r\n allNewIsListed = false;//entonces no TODAS comparten una decision\r\n }\r\n //else if (currentNewIsListed == null && nodoHijo.ignored)\r\n // textToShow = 'Sugerencia Ignorada';\r\n })\r\n\r\n if (textToShow != '*') {\r\n if (allNewIsListed) {\r\n if (currentNewIsListed == true) {\r\n textToShow = 'Incorporado';\r\n }\r\n else if (currentNewIsListed == false) {\r\n textToShow = 'Quitado';\r\n }\r\n }\r\n else if (allIgnored)\r\n textToShow = \"Sugerencia Ignorada\";\r\n }\r\n\r\n return textToShow;\r\n }\r\n else {// es hijo\r\n if (params.value == null) {\r\n if (params.node.data.ignored)\r\n return 'Sugerencia Ignorada';\r\n return '';\r\n }\r\n else if (params.value == true)\r\n return 'Incorporado';\r\n else if (params.value == false)\r\n return 'Quitado';\r\n }\r\n }\r\n }]\r\n },\r\n {\r\n headerName: 'Impacto',\r\n children: [\r\n {\r\n headerName: \"Sugerido\",\r\n field: \"absImpact\",\r\n filter: 'number',\r\n headerTooltip: \"Impacto Sugerido\",\r\n width: 110,\r\n hide: self.hideColumn(2, 0),\r\n cellClass: $rootScope.getClassForImpactCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: \"Pendiente\",\r\n field: \"absPendingImpact\",\r\n filter: 'number',\r\n headerTooltip: \"Impacto Pendiente\",\r\n width: 110,\r\n hide: self.hideColumn(2, 1),\r\n cellClass: $rootScope.getClassForImpactCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n //{\r\n // headerName: \"Sugerido Promedio\",\r\n // field: \"impact\",\r\n // filter: 'number',\r\n // columnGroupShow: 'open',\r\n // headerTooltip: \"Impacto por Cluster x Mes (si se acepta la sugerencia)\",\r\n // width: numberColWidth + 45,\r\n // cellClass: $rootScope.getClassForImpactCell,\r\n // cellRenderer: $rootScope.moneyRendererNoDecimals\r\n //},\r\n //{\r\n // headerName: \"Pendiente Promedio\",\r\n // field: \"pendingImpact\",\r\n // filter: 'number',\r\n // columnGroupShow: 'open',\r\n // headerTooltip: \"Impacto por Cluster x Mes (si se valida la decision)\",\r\n // width: numberColWidth + 55,\r\n // cellClass: $rootScope.getClassForImpactCell,\r\n // cellRenderer: $rootScope.moneyRendererNoDecimals\r\n //}\r\n ]\r\n },\r\n {\r\n headerName: 'Rankings',\r\n children: [\r\n //{\r\n // headerName: \"Indice\",\r\n // columnGroupShow: 'open',\r\n // field: \"indexRank\",\r\n // filter: 'number',\r\n // headerTooltip: \"Ranking de promedio ponderado entre Ventas, Unidades, Margen $ y Venta Mercado\",\r\n // width: numberColWidth - 30,\r\n // cellClass: $rootScope.getClassForCell\r\n //} \r\n {\r\n headerName: \"Indice Ponderado\",\r\n field: \"indexRank\",\r\n filter: 'number',\r\n //sort: 'asc',\r\n headerTooltip: \"Ranking por indice ponderado de la categoría\",\r\n width: numberColWidth + 45,\r\n hide: self.hideColumn(3, 0),\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Indice % Acum\",\r\n field: \"acumIndex\",\r\n filter: 'number',\r\n headerTooltip: \"\",\r\n width: numberColWidth + 20,\r\n hide: self.hideColumn(3, 1),\r\n cellStyle: function (params) {\r\n return calculateParetoSectionColor(params.data);\r\n },\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererNoDecimals\r\n },\r\n {\r\n headerName: \"SKUs % Acum\",\r\n columnGroupShow: 'open',\r\n field: \"acumSKUs\",\r\n filter: 'number',\r\n headerTooltip: \"% de SKUs acumulados hasta este SKU\",\r\n width: numberColWidth + 15,\r\n hide: self.hideColumn(3, 2),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererNoDecimals\r\n },\r\n ]\r\n },\r\n {\r\n headerName: 'Performance Interna',\r\n children: [\r\n //{\r\n // headerName: \"Indice Ponderado\",\r\n // field: \"index\",\r\n // filter: 'number',\r\n // columnGroupShow: 'open',\r\n // headerTooltip: \"\",\r\n // width: numberColWidth + 40,\r\n // cellClass: $rootScope.getClassForCell,\r\n // cellRenderer: $rootScope.integerRenderer\r\n //},\r\n {\r\n headerName: \"Venta\",\r\n field: \"sales\",\r\n filter: 'number',\r\n columnGroupShow: self.salesOnColumnGroupShow,\r\n headerTooltip: \"Venta promedio mensual por Tienda en el Cluster\",\r\n width: numberColWidth,\r\n hide: self.hideColumn(4, 0),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: \"Venta Total\",\r\n field: \"salesTotal\",\r\n hide: !self.showSalesTotal || self.hideColumn(4, 1),\r\n columnGroupShow: self.totalSalesOnColumnGroupShow,\r\n filter: 'number',\r\n headerTooltip: \"Venta promedio mensual del Cluster\",\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: \"% Ventas\",\r\n columnGroupShow: 'open',\r\n field: \"salesShare\",\r\n filter: 'number',\r\n headerTooltip: \"Participacion en las ventas de este SKU sobre el total de la categoria\",\r\n width: 120,\r\n hide: self.hideColumn(4, 2),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRenderer\r\n },\r\n {\r\n headerName: \"Venta % Acum\",\r\n columnGroupShow: 'open',\r\n field: \"acumSales\",\r\n filter: 'number',\r\n headerTooltip: \"% de Venta acumulada hasta este SKU\",\r\n width: numberColWidth + 20,\r\n hide: self.hideColumn(4, 3),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererNoDecimals\r\n },\r\n {\r\n headerName: \"Rank Venta\",\r\n columnGroupShow: 'open',\r\n field: \"salesRank\",\r\n filter: 'number',\r\n headerTooltip: \"Ranking de ventas en unidades dentro de la categoria\",\r\n width: numberColWidth + 25,\r\n hide: self.hideColumn(4, 4),\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Ventas Un\",\r\n field: \"units\",\r\n filter: 'number',\r\n columnGroupShow: self.salesOnColumnGroupShow,\r\n headerTooltip: \"Venta en unidades promedio mensual por Tienda en el Cluster\",\r\n width: numberColWidth,\r\n hide: self.hideColumn(4, 5),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: \"Ventas Un Total\",\r\n field: \"unitsTotal\",\r\n hide: !self.showUnitsTotal || self.hideColumn(4, 6),\r\n filter: 'number',\r\n columnGroupShow: self.totalSalesOnColumnGroupShow,\r\n headerTooltip: \"Venta en unidades promedio mensual del Cluster\",\r\n width: numberColWidth + 40,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: \"% Ventas Un\",\r\n field: \"unitsShare\",\r\n columnGroupShow: 'open',\r\n filter: 'number',\r\n headerTooltip: \"Participación en las ventas unitarias de este SKU sobre el total de la categoría\",\r\n width: numberColWidth + 10,\r\n hide: self.hideColumn(4, 7),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRenderer\r\n },\r\n {\r\n headerName: \"Rank Venta Un\",\r\n columnGroupShow: 'open',\r\n field: \"unitsRank\",\r\n filter: 'number',\r\n headerTooltip: \"Ranking de unidades dentro de la categoria\",\r\n width: numberColWidth + 30,\r\n hide: self.hideColumn(4, 8),\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Margen $\",\r\n field: \"margin\",\r\n filter: 'number',\r\n headerTooltip: \"Margen promedio mensual por Tienda en el Cluster\",\r\n width: numberColWidth + 15,\r\n hide: self.hideColumn(4, 9),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: \"Margen 2 $\",\r\n field: \"margin2\",\r\n filter: 'number',\r\n headerTooltip: \"Margen 2\",\r\n width: numberColWidth + 15,\r\n hide: self.hideColumn(4, 10),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: \"% Margen\",\r\n field: \"marginShare\",\r\n columnGroupShow: 'open',\r\n filter: 'number',\r\n headerTooltip: \"Participacion en margen de este SKU sobre el total de la categoria\",\r\n width: numberColWidth + 25,\r\n hide: self.hideColumn(4, 11),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRenderer\r\n },\r\n {\r\n headerName: \"% Margen 2\",\r\n field: \"margin2Share\",\r\n columnGroupShow: 'open',\r\n filter: 'number',\r\n headerTooltip: \"Participacion en margen2 de este SKU sobre el total de la categoria\",\r\n width: numberColWidth + 25,\r\n hide: self.hideColumn(4, 12),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRenderer\r\n },\r\n {\r\n headerName: \"Rank Margen\",\r\n columnGroupShow: 'open',\r\n field: \"marginRank\",\r\n filter: 'number',\r\n headerTooltip: \"Ranking de margen dentro de la categoria\",\r\n width: numberColWidth + 15,\r\n hide: self.hideColumn(4, 13),\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Precio Promedio\",\r\n field: \"price\",\r\n filter: 'number',\r\n headerTooltip: \"Precio promedio de este SKU en este Cluster\",\r\n width: numberColWidth + 35,\r\n hide: self.hideColumn(4, 14),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRenderer\r\n },\r\n {\r\n headerName: \"Rotacion\",\r\n columnGroupShow: 'open',\r\n field: \"turnsC\",\r\n filter: 'number',\r\n headerTooltip: \"\",\r\n width: numberColWidth,\r\n hide: self.hideColumn(4, 15),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.decimalRenderer\r\n },\r\n ]\r\n },\r\n {\r\n headerName: 'Presencia',\r\n children: [\r\n {\r\n headerName: \"%\",\r\n field: \"presence\",\r\n hide: self.showPresence2 || self.hideColumn(5, 0),\r\n filter: 'number',\r\n headerTooltip: \"Meses y Tiendas en los que este SKU tuvo ventas / Total de meses y Total de Tiendas del Cluster\",\r\n width: numberColWidth - 10,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: function (params) {\r\n if (!params.value)\r\n return '';\r\n\r\n var presencia = $rootScope.percentageRendererNoDecimals(params);\r\n if (!params.node.group) {\r\n presencia = '' + $rootScope.percentageRendererNoDecimals(params) + '';\r\n }\r\n return presencia;\r\n }\r\n },\r\n {\r\n headerName: \"%\",\r\n field: \"presence2\",\r\n hide: !self.showPresence2 || self.hideColumn(5, 1),\r\n filter: 'number',\r\n headerTooltip: \"Total de tiendas donde el item est� activo / Total de tiendas del cluster\",\r\n width: numberColWidth - 10,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: function (params) {\r\n if (!params.value)\r\n return '';\r\n\r\n var presencia = $rootScope.percentageRendererNoDecimals(params);\r\n if (!params.node.group) {\r\n presencia = '' + $rootScope.percentageRendererNoDecimals(params) + '';\r\n }\r\n return presencia;\r\n }\r\n },\r\n //{ //REVISAR DATOS, VIENEN NUMEROS MUY GRANDES\r\n // headerName: \"Tiendas\",\r\n // field: \"numberOfStores\",\r\n // columnGroupShow: 'open',\r\n // filter: 'number',\r\n // headerTooltip: \"Número de stores con ventas de este SKU\",\r\n // width: numberColWidth - 10,\r\n // cellClass: $rootScope.getClassForCell,\r\n // cellRenderer: $rootScope.integerRenderer\r\n //},\r\n //{\r\n // headerName: \"Meses\",\r\n // field: \"numberOfMonths\",\r\n // columnGroupShow: 'open',\r\n // filter: 'number',\r\n // headerTooltip: \"Número de meses con ventas de este SKU\",\r\n // width: numberColWidth - 10,\r\n // cellClass: $rootScope.getClassForCell,\r\n // cellRenderer: $rootScope.integerRenderer\r\n //} \r\n ]\r\n },\r\n {\r\n headerName: 'Performance Mercado',\r\n children: [\r\n {\r\n headerName: \"Venta\",\r\n field: \"marketSales\",\r\n filter: 'number',\r\n headerTooltip: \"Venta Mercado\",\r\n width: numberColWidth,\r\n hide: self.hideColumn(6, 0),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: \"% Ventas\",\r\n field: \"marketSalesShare\",\r\n columnGroupShow: 'open',\r\n filter: 'number',\r\n headerTooltip: \"Participacion en las ventas de mercado de este SKU sobre el total de la categoria \",\r\n width: numberColWidth + 40,\r\n hide: self.hideColumn(6, 1),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRenderer\r\n },\r\n {\r\n headerName: \"Venta Mercado % Acum\",\r\n columnGroupShow: 'open',\r\n field: \"acumMarketSales\",\r\n filter: 'number',\r\n headerTooltip: \"% de Venta Mercado acumulada hasta este SKU\",\r\n width: numberColWidth + 75,\r\n hide: self.hideColumn(6, 2),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererNoDecimals\r\n },\r\n {\r\n headerName: \"Rank Ventas M\",\r\n columnGroupShow: 'open',\r\n field: \"marketSalesRank\",\r\n filter: 'number',\r\n headerTooltip: \"Ranking de ventas del mercado en unidades dentro de la categoria\",\r\n width: numberColWidth + 20,\r\n hide: self.hideColumn(6, 3),\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"GAP Vs Mercado\",\r\n field: \"salesGap\",\r\n columnGroupShow: 'open',\r\n filter: 'number',\r\n headerTooltip: \"Diferencia de Participacion entre ventas propias y ventas de mercado\",\r\n width: numberColWidth + 30,\r\n hide: self.hideColumn(6, 4),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererPP\r\n },\r\n {\r\n headerName: \"Ventas Un\",\r\n field: \"marketUnits\",\r\n filter: 'number',\r\n headerTooltip: \"Venta Mercado en unidades\",\r\n width: numberColWidth,\r\n hide: self.hideColumn(6, 5),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: \"% Ventas Un\",\r\n field: \"marketUnitsShare\",\r\n columnGroupShow: 'open',\r\n filter: 'number',\r\n headerTooltip: \"Participacion en las ventas mercado unitarias de este SKU sobre el total de la categoria\",\r\n width: numberColWidth + 15,\r\n hide: self.hideColumn(6, 6),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRenderer\r\n },\r\n //{\r\n // headerName: \"Rank Ventas Un\",\r\n // columnGroupShow: 'open',\r\n // field: \"marketUnitsRank\",\r\n // filter: 'number',\r\n // headerTooltip: \"Ranking de unidades en el mercado dentro de la categoria\",\r\n // width: numberColWidth + 25,\r\n // cellClass: $rootScope.getClassForCell\r\n //},\r\n {\r\n headerName: \"GAP vs Mercado\",\r\n field: \"unitsGap\",\r\n columnGroupShow: 'open',\r\n filter: 'number',\r\n headerTooltip: \"Diferencia de Participacion entre ventas unitarias propias y ventas unitarias de mercado\",\r\n width: numberColWidth + 45,\r\n hide: self.hideColumn(6, 7),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererPP\r\n },\r\n {\r\n headerName: \"Precio\",\r\n field: \"marketPrice\",\r\n filter: 'number',\r\n headerTooltip: \"Precio promedio del mercado para este SKU en este cluster\",\r\n width: numberColWidth,\r\n hide: self.hideColumn(6, 8),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRenderer\r\n }]\r\n },\r\n {\r\n headerName: 'Espacios',\r\n children: [\r\n {\r\n headerName: \"Metros\",\r\n field: \"linearSpace\",\r\n filter: 'number',\r\n headerTooltip: \"\",\r\n width: numberColWidth - 15,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.decimalRenderer,\r\n hide: self.hideSpaces || self.hideColumn(7, 0)\r\n },\r\n {\r\n headerName: \"Frentes\",\r\n field: \"spaceFronts\",\r\n columnGroupShow: 'open',\r\n filter: 'number',\r\n headerTooltip: \"\",\r\n width: numberColWidth - 15,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.decimalRenderer,\r\n hide: self.hideSpaces || self.hideColumn(7, 1)\r\n },\r\n {\r\n headerName: \"% Espacio\",\r\n field: \"spaceShare\",\r\n columnGroupShow: 'open',\r\n filter: 'number',\r\n headerTooltip: \"Participacion en el espacio lineal de este SKU sobre el total de la categoria\",\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRenderer,\r\n hide: self.hideSpaces || self.hideColumn(7, 2)\r\n },\r\n {\r\n headerName: \"GMROS\",\r\n field: \"gmros\",\r\n columnGroupShow: 'open',\r\n filter: 'number',\r\n headerTooltip: \"Margen / Espacio Lineal en m2\",\r\n width: numberColWidth - 15,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n hide: self.hideSpaces || self.hideColumn(7, 3)\r\n },\r\n {\r\n headerName: \"Planograma\",\r\n field: \"itemId\",\r\n //columnGroupShow: 'open',\r\n hide: !self.showPlanogramEdition ? true : self.hideSpaces || self.hideColumn(7, 4),\r\n filter: 'text',\r\n headerTooltip: \"Ver Planograma asociado a este item-cluster\",\r\n width: numberColWidth + 10,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: function (params) {\r\n if (!params.value)\r\n return '';\r\n\r\n var planogram = '';\r\n\r\n if (!params.node.group) {\r\n planogram = ' ';\r\n }\r\n return planogram;\r\n }\r\n },\r\n ]\r\n },\r\n {\r\n headerName: 'Inventarios',\r\n children: [\r\n {\r\n headerName: \"Disponibilidad\",\r\n hide: !canView(\"Availability\") || self.hideColumn(8, 0),\r\n headerTooltip: \"\",\r\n field: \"availability\",\r\n filter: 'text',\r\n width: numberColWidth + 20,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererNoDecimals\r\n },\r\n {\r\n headerName: \"Stock $\",\r\n field: \"currentInventory\",\r\n filter: 'number',\r\n headerTooltip: \"Costo del Inventario en el Cluster del dia anterior\",\r\n width: numberColWidth,\r\n hide: self.hideColumn(8, 1),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: \"Stock %\",\r\n field: \"inventoryShare\",\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n headerTooltip: \"Participacion en el costo del inventario de este SKU sobre el total de la categoria\",\r\n width: numberColWidth + 10,\r\n hide: self.hideColumn(8, 2),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRenderer\r\n },\r\n //{\r\n // headerName: \"Dias de Inv\",\r\n // field: \"inventoryDays\",\r\n // columnGroupShow: 'open',\r\n // filter: 'number',\r\n // headerTooltip: \"Dias de Inventario mensual por Tienda en el Cluster\",\r\n // width: numberColWidth,\r\n // cellClass: $rootScope.getClassForCell,\r\n // cellRenderer: $rootScope.integerRenderer\r\n //},\r\n {\r\n headerName: \"Stock Un\",\r\n field: \"currentInventoryUnits\",\r\n filter: 'number',\r\n headerTooltip: \"Unidades del Inventario en el Cluster del dia anterior\",\r\n width: numberColWidth,\r\n hide: self.hideColumn(8, 3),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: \"Stock CD\",\r\n field: \"inventoryInCds\",\r\n filter: 'number',\r\n headerTooltip: \"Suma de unidades de Inventario de los Centros de distribucion del dia anterior\",\r\n width: numberColWidth,\r\n hide: self.hideColumn(8, 4),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: \"Dias In-Stock\",\r\n field: \"inStockDays\",\r\n filter: 'number',\r\n headerTooltip: \"Dias de stock del item en el mes, considerando el promedio de los meses anteriores.\",\r\n width: numberColWidth + 15,\r\n hide: self.hideColumn(8, 5),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: !companyJson.AssortmentDecisions.Grid.ShowDDSextended ? \"DDS\" : \"Dias de Stock\",\r\n field: \"inventoryDays3\",\r\n filter: 'number',\r\n width: numberColWidth + 15,\r\n hide: self.hideColumn(8, 6),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: \"Merma\",\r\n field: \"wasteUnitsPercentage\",\r\n filter: 'number',\r\n width: numberColWidth + 15,\r\n hide: self.hideColumn(8, 7),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRenderer\r\n },\r\n {\r\n headerName: \"Merma Desconocida %\",\r\n field: \"wasteUnknownUnitsPercentage\",\r\n filter: 'number',\r\n width: numberColWidth + 15,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRenderer,\r\n hide : true\r\n },\r\n {\r\n headerName: \"GMROI\",\r\n field: \"gmroi\",\r\n filter: 'number',\r\n columnGroupShow: 'open',\r\n headerTooltip: \"Margen / Costo Promedio del Inventario\",\r\n width: numberColWidth,\r\n hide: self.hideColumn(8, 9),\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.decimalRenderer\r\n },\r\n {\r\n headerName: \"Merma\",\r\n field: \"currentAdjust\",\r\n filter: 'number',\r\n hide: !self.showWasteUnits || self.hideColumn(8, 10),\r\n columnGroupShow: 'open',\r\n headerTooltip: \"Unidades de Merma Conocida + Merma desconocida Actual\",\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.decimalRenderer\r\n },]\r\n }]\r\n }\r\n\r\n self.anySuggestions = function () {\r\n var rv = false;\r\n\r\n if (self.pareto) {\r\n for (var i = 0; i < self.pareto.items.length; i++) {\r\n var item = self.pareto.items[i];\r\n if (item.suggestionListed != null) {\r\n rv = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return rv;\r\n }\r\n self.anyChildSuggestions = function (node) {\r\n\r\n var rv = false;\r\n\r\n if (node && node.children) {\r\n\r\n var isListedFn = function (node) {\r\n var item = node.data;\r\n if (item.suggestionListed != null && item.suggestionListed != undefined && !item.isSuggestionIgnored) {\r\n return true;\r\n }\r\n }\r\n\r\n node.children.forEach(function (node) {\r\n if (node.data.rowType == \"GroupRow\") {\r\n //bajo un nivel mas para llegar al ClusterRow\r\n node.children.forEach(function (node) {\r\n if (isListedFn(node))\r\n rv = true;\r\n });\r\n }\r\n else {\r\n if (isListedFn(node))\r\n rv = true;\r\n }\r\n });\r\n\r\n }\r\n\r\n return rv;\r\n }\r\n\r\n function getClassForSuggestionCell(params) {\r\n var cls = [\"text-center\"];\r\n\r\n if (params.value == 'Quitar') {\r\n cls.push(\"text-danger\");\r\n }\r\n else if (params.value == 'Incorporar') {\r\n cls.push(\"text-ok\");\r\n }\r\n else {\r\n cls = $rootScope.getClassForCell(params);\r\n }\r\n\r\n //cls = $rootScope.getClassForCell(params);\r\n\r\n return cls;\r\n }\r\n function setGridOptions() {\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: true,\r\n groupHideGroupColumns: true,\r\n groupUseEntireRow: false,\r\n groupSelectsChildren: false,\r\n rowHeight: 30,\r\n rowSelection: \"multiple\",\r\n rowDeselection: true,\r\n showToolPanel: false,// window.innerWidth > 1500,\r\n suppressRowClickSelection: true,\r\n suppressCellSelection: false,\r\n singleClickEdit: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n suppressColumnMoveAnimation: $rootScope.suppressColumnMoveAnimation(),\r\n enableRangeSelection: false,\r\n angularCompileRows: true,\r\n angularCompileHeaders: true,\r\n isExternalFilterPresent: isExternalFilterPresent,\r\n doesExternalFilterPass: doesExternalFilterPass,\r\n onRowSelected: rowSelected,\r\n getNodeChildDetails: getNodeChildDetails,\r\n onAfterFilterChanged: afterFilterChanged,\r\n //onGridReady: function () { console.log(\"Grilla lista\"); loadData(); },\r\n //getRowStyle: function (params) {\r\n // var acum = params.data.acumIndex;\r\n // if (acum >= 0.2) {\r\n // return {\r\n // 'background-color': 'green'\r\n // };\r\n // } else if (acum >= 0.95) {\r\n // return {\r\n // 'background-color': '#FFF'\r\n // };\r\n // } else {\r\n // return {\r\n // 'background-color': '#red'\r\n // };\r\n // }\r\n // return null;\r\n //}\r\n }\r\n\r\n }\r\n function getNodeChildDetails(rowItem) {\r\n if (rowItem.subcategories && rowItem.subcategories.length > 0 && self.selectedFilterForCluster == 'Todos') {\r\n return {\r\n group: true,\r\n expanded: false,\r\n // provide ag-Grid with the children of this group\r\n children: rowItem.subcategories,\r\n // the key is used by the default group cellRenderer\r\n key: rowItem.itemEan\r\n };\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n self.hideColumn = function (parentIndex, childIndex) {\r\n let retorno = false;\r\n if ((self.matrixOfIndexes != null && self.matrixOfIndexes.length > 0) && (self.matrixOfIndexes[parentIndex].includes(childIndex))) {\r\n retorno = true;\r\n }\r\n return retorno;\r\n }\r\n\r\n //grid filters\r\n function isExternalFilterPresent() {\r\n return self.selectedFilterForStatus != 'Todos' || self.selectedFilterForCluster != 'Todos' || self.selectedFilterForAssortmentStatus != 'Todos' || selectedFilterForText != '';\r\n }\r\n function afterFilterChanged(event) {\r\n getKPIs();\r\n }\r\n function doesExternalFilterPass(node) {\r\n\r\n var filter1 = true;\r\n var filter2 = true;\r\n var filter3 = true;\r\n var filter4 = true;\r\n\r\n //filter1 = (node.data.clusterCode == self.selectedFilterForCluster || self.selectedFilterForCluster == 'Todos');\r\n\r\n //switch (self.selectedFilterForStatus) {\r\n // case 'Para Validar': filter2 = (node.data.assortmentStatus == 1 || node.data.isSuggestionIgnored); break;\r\n // case 'Nuevos': filter2 = (node.data.newIsListed != null); break;\r\n // case 'Sugeridos': filter2 = (node.data.suggestionListed != null && !node.data.isSuggestionIgnored); break;\r\n // default: filter2 = true; break;\r\n //}\r\n\r\n //filter3 = (self.selectedFilterForAssortmentStatus == 'Todos' || (self.selectedFilterForAssortmentStatus == 'Activo' && node.data.isListed == true) || (self.selectedFilterForAssortmentStatus == 'Inactivo' && node.data.isListed == false));\r\n\r\n var splittedText = selectedFilterForText.split(';');\r\n filter4 = (selectedFilterForText == ''\r\n || (node.data.itemCode != null && node.data.itemCode.toLowerCase().indexOf(selectedFilterForText.toLowerCase()) != -1)\r\n || (node.data.itemEan != null && node.data.itemEan.toLowerCase().indexOf(selectedFilterForText.toLowerCase()) != -1)\r\n || (node.data.itemName != null && node.data.itemName.toLowerCase().indexOf(selectedFilterForText.toLowerCase()) != -1)\r\n || (node.data.subcategory != null && node.data.subcategory.toLowerCase().indexOf(selectedFilterForText.toLowerCase()) != -1)\r\n || (node.data.brand != null && node.data.brand.toLowerCase().indexOf(selectedFilterForText.toLowerCase()) != -1)\r\n || (node.data.manufacturer != null && node.data.manufacturer.toLowerCase().indexOf(selectedFilterForText.toLowerCase()) != -1))\r\n || (node.data.tags != null && containsAllTags(splittedText, node.data.tags));\r\n\r\n return filter1 && filter2 && filter3 && filter4;\r\n }\r\n function externalFilterChanged() {\r\n\r\n if (self.gridOptions.api)\r\n self.gridOptions.api.onFilterChanged();\r\n }\r\n function removeFilters() {\r\n self.selectedFilterForStatus = 'Todos';\r\n self.selectedFilterForAssortmentStatus = 'Todos';\r\n self.selectedFilterForCluster = 'Todos';\r\n\r\n externalFilterChanged();\r\n }\r\n function containsAllTags(splittedText, tags) {\r\n if (splittedText.length == 1)\r\n return tags.toLowerCase().indexOf(selectedFilterForText.toLowerCase()) != -1;\r\n else {\r\n var rv = true;\r\n _.forEach(splittedText, function (value) {\r\n var containsTag = _.includes(tags.toLowerCase().trim(), value.toLowerCase().trim());\r\n if (!containsTag)\r\n rv = false;\r\n });\r\n\r\n return rv;\r\n }\r\n }\r\n function selectAll(checked, rowNode) {\r\n if (rowNode == null) {\r\n self.gridOptions.api.forEachNodeAfterFilter(function (node) {\r\n if (node.group)\r\n node.setSelected(checked);\r\n });\r\n }\r\n }\r\n //main actions\r\n function addToAssortment(node) {\r\n\r\n //solo ejecuto si es un nodo hijo (item-cluster)\r\n if (!node.group) {\r\n\r\n if ((node.data.isListed === false && node.data.newIsListed == null) || node.data.newIsListed === false) {\r\n\r\n if (node.data.assortmentStatus < 2 && node.data.newIsListed == null) { //Si tiene estado current o new y no tiene decicion\r\n\r\n //actualizo decision en NewIsListed y el impacto del nodo \r\n node.data.newIsListed = true;\r\n node.data.absPendingImpact = node.data.listingImpact;\r\n\r\n //actualizo el impacto total (indicador del box)\r\n self.pendingImpact += node.data.absPendingImpact;\r\n\r\n //actualizo el impacto del padre\r\n if (node.parent != null)\r\n node.parent.data.absPendingImpact += node.data.absPendingImpact;\r\n\r\n //marco el nodo como dirty\r\n node.data.dirty = true;\r\n\r\n //actualizo el nodo padre\r\n updateParentAndRefreshScreen(node, true);\r\n }\r\n else if (node.data.assortmentStatus < 2 && node.data.newIsListed != null) { //Si tiene estado current o new y tiene decicion\r\n //revierto la decision\r\n revertDecision(node);\r\n\r\n //actualizo el nodo padre\r\n updateParentAndRefreshScreen(node, false);\r\n }\r\n else if (node.data.assortmentStatus == 2) //Si est� endosado pero aun no se informo y se lo quiere volver al status anterior\r\n {\r\n if (node.data.newIsListed == node.data.isListed) { //Es una vuelta atras al estado anterior\r\n //actualizo decision en NewIsListed \r\n node.data.newIsListed = true;\r\n\r\n //desmarco el nodo como dirty\r\n node.data.dirty = false;\r\n\r\n //actualizo el nodo padre\r\n updateParentAndRefreshScreen(node, true);\r\n }\r\n else {\r\n //actualizo decision en NewIsListed \r\n node.data.newIsListed = true;\r\n\r\n //marco el nodo como dirty\r\n node.data.dirty = true;\r\n\r\n //actualizo el nodo padre\r\n updateParentAndRefreshScreen(node, true);\r\n }\r\n }\r\n\r\n }\r\n }\r\n }\r\n function removeFromAssortment(node) {\r\n\r\n //solo ejecuto si es un nodo hijo (item-cluster)\r\n if (!node.group) {\r\n\r\n if ((node.data.isListed === true && node.data.newIsListed == null) || node.data.newIsListed === true) {\r\n\r\n //if (node.data.newIsListed == null) {\r\n if (node.data.assortmentStatus < 2 && node.data.newIsListed == null) { //Si tiene estado current o new y no tiene decicion\r\n //actualizo decision en NewIsListed y el impacto del nodo\r\n node.data.newIsListed = false;\r\n node.data.absPendingImpact = node.data.delistingImpact;\r\n\r\n //actualizo el impacto total (indicador del box)\r\n self.pendingImpact += node.data.absPendingImpact;\r\n\r\n //actualizo el impacto del padre\r\n if (node.parent != null)\r\n node.parent.data.absPendingImpact += node.data.absPendingImpact;\r\n\r\n //marco el nodo como dirty\r\n node.data.dirty = true;\r\n\r\n //actualizo el nodo padre\r\n updateParentAndRefreshScreen(node, true);\r\n }\r\n //else {\r\n else if (node.data.assortmentStatus < 2 && node.data.newIsListed != null) { //Si tiene estado current o new y tiene decicion\r\n //si ya habia tomado una decision la revierto\r\n revertDecision(node);\r\n\r\n //actualizo el nodo padre\r\n updateParentAndRefreshScreen(node, false);\r\n }\r\n else if (node.data.assortmentStatus == 2) //Si est� endosado, pero aun no se informo,\r\n {\r\n if (node.data.newIsListed == node.data.isListed) { //Es una vuelta atras al estado anterior\r\n //actualizo decision en NewIsListed \r\n node.data.newIsListed = false;\r\n\r\n //desmarco el nodo como dirty\r\n node.data.dirty = false;\r\n\r\n //actualizo el nodo padre\r\n updateParentAndRefreshScreen(node, true);\r\n }\r\n else {\r\n //actualizo decision en NewIsListed \r\n node.data.newIsListed = false;\r\n\r\n //marco el nodo como dirty\r\n node.data.dirty = true;\r\n\r\n //actualizo el nodo padre\r\n updateParentAndRefreshScreen(node, true);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n self.updateSummaryBox = function () {\r\n\r\n self.newListedItems = 0;//cantidad de items dados de alta\r\n self.newDelistedItems = 0;//cantidad de items dados de baja \r\n self.totalListedItems = 0;//diferencia de altas y bajas\r\n var totalActiveItems = 0;//Items ya listados \r\n\r\n self.gridOptions.api.forEachNode(function (node) {\r\n if (node.data.rowType == \"ItemRow\" && node.data.subcategories) {//evaluo solo a nivel item\r\n var allClustersDeListedFlag = true;//indica si todos los clusters del item estan delistados\r\n var takenDecision = false;//indica si se tomo una decision en al menos un cluster \r\n var anyClusterListed = node.data.subcategories.some(function (x) {\r\n return x.isListed;\r\n });//indica si algun cluster ya esta listado\r\n var anyClusterNewIsListed = false;// indica si al menos se listo un cluster\r\n\r\n if (anyClusterListed)\r\n totalActiveItems++;\r\n\r\n for (var i = 0; i < node.data.subcategories.length; i++) {\r\n var decision = node.data.subcategories[i].newIsListed;\r\n var suggestion = node.data.subcategories[i].suggestionListed;\r\n var actual = node.data.subcategories[i].isListed;\r\n\r\n var clusterIsListed = null; //define el estado del cluster\r\n if (decision != null) {\r\n takenDecision = true;\r\n if (decision == false)\r\n clusterIsListed = false;\r\n else if (decision == true) {\r\n clusterIsListed = true;\r\n anyClusterNewIsListed = true;\r\n }\r\n }\r\n else if (suggestion != null) {\r\n if (suggestion == false)\r\n clusterIsListed = true;\r\n else if (suggestion == true)\r\n clusterIsListed = false;\r\n }\r\n else {\r\n if (actual == true)\r\n clusterIsListed = true;\r\n else if (actual == false)\r\n clusterIsListed = false;\r\n }\r\n\r\n if (clusterIsListed)\r\n allClustersDeListedFlag = false;\r\n\r\n }\r\n if (takenDecision) {\r\n if (anyClusterNewIsListed == true && !anyClusterListed) {//tiene que haber al menos uno listado pero antes debian estar todos delistados\r\n self.newListedItems++;\r\n }\r\n else if (allClustersDeListedFlag) {\r\n self.newDelistedItems++;\r\n }\r\n }\r\n }\r\n });\r\n\r\n self.totalListedItems = totalActiveItems + self.newListedItems - self.newDelistedItems;\r\n }\r\n\r\n function revertDecision(node) {\r\n\r\n if (node.data.suggestionListed == null || node.data.suggestionListed == node.data.newIsListed) {\r\n\r\n var revertImpact = 0;\r\n if (node.data.assortmentStatus < 2 && node.data.newIsListed == false)\r\n revertImpact = node.data.delistingImpact;\r\n else if (node.data.assortmentStatus < 2 && node.data.newIsListed == true)\r\n revertImpact = node.data.listingImpact;\r\n\r\n //revierto la decision del nodo hijo (item-cluster)\r\n node.data.newIsListed = null;\r\n node.data.absPendingImpact = 0;\r\n\r\n //revierto el impacto en el indicador del box\r\n self.pendingImpact -= revertImpact;\r\n\r\n //revierto el impacto en el padre\r\n if (node.parent != null)\r\n node.parent.data.absPendingImpact -= revertImpact;\r\n\r\n //marco el nodo como no dirty si es la primera vez. Si es un endosado o nuevo, lo marco dirty, si es un current le saco el dirty\r\n if (node.data.dirty == undefined)\r\n node.data.dirty = true;\r\n else if (node.data.dirty == true) {\r\n if (node.data.assortmentStatus != 0)\r\n node.data.dirty = true;\r\n else\r\n node.data.dirty = false;\r\n }\r\n\r\n //refresco el nodo\r\n self.gridOptions.api.refreshRows([node]);\r\n\r\n //actualizo el nodo padre\r\n updateParentAndRefreshScreen(node, true);\r\n }\r\n }\r\n function acceptSuggestionsForAllChildren(node) {\r\n //solo ejecuto si es un nodo padre\r\n if (node.group) {\r\n\r\n //flagueo el nodo como aceptado / revertido\r\n node.data.accepted = !node.data.accepted;\r\n\r\n //defino la funcion que voy a usar para actualizar los nodos\r\n var updateFunc = function (node) {\r\n //solo actualizo los que tienen sugerencia sin decision\r\n if (node.data.suggestionListed != null && node.data.suggestionListed != node.data.newIsListed) {\r\n if (node.data.suggestionListed == false)\r\n removeFromAssortment(node);\r\n else if (node.data.suggestionListed == true)\r\n addToAssortment(node);\r\n\r\n }\r\n }\r\n\r\n //recorro todos los hijos (no solo filtrados porque el filtro puede ser cualquiera)\r\n node.children.forEach(function (node) {\r\n\r\n //si hay rows de grupos en la jerarquia bajo un nivel mas para llegar a los ClusterRow\r\n if (node.data.rowType == \"GroupRow\") {\r\n\r\n //flagueo el nodo como aceptado / revertido\r\n node.data.accepted = !node.data.accepted;\r\n\r\n node.children.forEach(function (node) {\r\n updateFunc(node);\r\n });\r\n }\r\n else {\r\n updateFunc(node);\r\n }\r\n\r\n\r\n });\r\n self.updateSummaryBox();\r\n }\r\n }\r\n function revertAcceptedSuggestionsForAllChildren(node) {\r\n //solo ejecuto si es un nodo padre\r\n if (node.group) {\r\n\r\n //flagueo el nodo como aceptado / revertido\r\n node.data.accepted = !node.data.accepted;\r\n\r\n //recorro todos los hijos (no solo filtrados porque el filtro puede ser cualquiera)\r\n node.children.forEach(function (node) {\r\n\r\n //si hay rows de grupos en la jerarquia bajo un nivel mas para llegar a los ClusterRow\r\n if (node.data.rowType == \"GroupRow\") {\r\n\r\n //flagueo el nodo como aceptado / revertido\r\n node.data.accepted = !node.data.accepted;\r\n\r\n node.children.forEach(function (node) {\r\n //solo revierto los que tienen sugerencia y decision\r\n if (node.data.suggestionListed != null && node.data.suggestionListed == node.data.newIsListed) {\r\n revertDecision(node);\r\n }\r\n });\r\n }\r\n else {\r\n //solo revierto los que tienen sugerencia y decision\r\n if (node.data.suggestionListed != null && node.data.suggestionListed == node.data.newIsListed) {\r\n revertDecision(node);\r\n }\r\n }\r\n\r\n\r\n });\r\n self.updateSummaryBox();\r\n }\r\n }\r\n function updateParentAndRefreshScreen(node, updateKpis) {\r\n\r\n //actualiza la grilla\r\n self.gridOptions.api.refreshRows([node]);\r\n self.gridOptions.api.refreshRows([node.parent]);\r\n\r\n //actualiza los KPI\r\n if (updateKpis)\r\n updateKPIs(node, true);\r\n }\r\n function rowSelected(event) {\r\n if (!event.node.group) { //if it's not a group row\r\n var data = event.node.data;\r\n\r\n if (!self.isEndorse) {\r\n changeAssortment(event.node, event.node.selected);\r\n }\r\n }\r\n else {\r\n event.node.childrenAfterFilter.forEach(function (node) {\r\n node.setSelected(event.node.selected);\r\n });\r\n }\r\n }\r\n //helpers\r\n function getNodeById(nodeOrId) {\r\n var rv = nodeOrId;\r\n\r\n if (typeof (nodeOrId) !== \"object\") {\r\n self.gridOptions.api.forEachNode(function (node) {\r\n if (node.id === nodeOrId) {\r\n rv = node;\r\n }\r\n });\r\n }\r\n\r\n return rv;\r\n }\r\n function countParetoSections() {\r\n\r\n angular.forEach(self.paretoSections, function (section) {\r\n var index = 0;\r\n\r\n angular.forEach(self.pareto.items, function (item) {\r\n\r\n if (item.acumIndex > section.valueFrom && item.acumIndex <= section.valueTo) {\r\n item.paretoSectionIndex = ++index;\r\n }\r\n });\r\n\r\n section.count = index;\r\n });\r\n }\r\n\r\n //esta funcion se hizo porque el cliente quiere ver en el filtro solo los cluster que se obvservan en la grilla y esta puede ir cambiando\r\n self.updateClusterFilter = function (pareto) {\r\n var auxArray = [];\r\n\r\n angular.forEach(pareto.items, function (item) {\r\n\r\n angular.forEach(item.subcategories, function (sc) {\r\n\r\n if (!auxArray.length || !auxArray.map(function (x) { return x => x.id }).includes(sc.clusterId)) {\r\n\r\n auxArray.push({ id: sc.clusterId, name: sc.cluster });\r\n }\r\n });\r\n\r\n });\r\n\r\n self.filters.clusters = auxArray;\r\n self.filters.clusters.splice(0, 0, { id: null, name: 'Todos' });\r\n }\r\n\r\n function calculateParetoSectionColor(item) {\r\n\r\n var finalColor = null;\r\n\r\n angular.forEach(self.paretoSections, function (section) {\r\n\r\n if (item.acumIndex > section.valueFrom && item.acumIndex <= section.valueTo) {\r\n var color = section.colorRgb;\r\n\r\n if (section.alpha) {\r\n var ix = item.paretoSectionIndex;\r\n var alpha = 0;\r\n if (section.alpha === \"desc\")\r\n alpha = ix / section.count;\r\n if (section.alpha === \"asc\")\r\n alpha = (section.count - (ix - 1)) / section.count;\r\n var colors = color.replace(\"rgb(\", \"\").replace(\")\", \"\").split(\",\");\r\n finalColor = ian.format(\"rgba({0}, {1}, {2}, {3})\", colors[0], colors[1], colors[2], alpha)\r\n }\r\n else {\r\n finalColor = color;\r\n }\r\n\r\n }\r\n });\r\n\r\n if (finalColor)\r\n return { 'background-color': finalColor };\r\n\r\n\r\n return finalColor;\r\n }\r\n //fetch data\r\n function getKPIs() {\r\n //Reseteo las variables\r\n self.listingSuggestions = 0;\r\n self.delistingSuggestions = 0;\r\n self.impact = 0;\r\n self.pendingImpact = 0;\r\n self.listingNew = 0;\r\n self.delistingNew = 0;\r\n self.totalItemClusters = 0;\r\n self.totalActiveItemClusters = 0;\r\n self.actualCoverage = 0;\r\n self.actualSuggested = 0;\r\n self.actualNew = 0;\r\n totalMarketSalesActiveItems = 0;\r\n totalMarketSales = 0;\r\n self.totalSales = 0;\r\n\r\n self.gridOptions.api.forEachNodeAfterFilterAndSort(function (node) {\r\n if (!node.group) {\r\n\r\n self.impact += node.data.absImpact;\r\n self.pendingImpact += node.data.absPendingImpact;\r\n totalMarketSales += node.data.marketSales;\r\n self.totalSales += node.data.salesTotal;\r\n self.totalItemClusters++;\r\n\r\n if (node.data.isListed)\r\n self.totalActiveItemClusters++;\r\n\r\n updateKPIs(node, false);\r\n }\r\n });\r\n\r\n self.actualCoverage = totalMarketSales != null && totalMarketSales != 0 ? totalMarketSalesActiveItems / totalMarketSales : 1; //Si no tengo data de mercado, asumo que tengo el 100% de cobertura\r\n\r\n angular.forEach(self.categoryDetails, function (cd) {\r\n cd.brandCoverage = totalMarketSales != null && totalMarketSales != 0 ? cd.totalMarketSalesActiveItemsBrand / totalMarketSales : 1;\r\n });\r\n\r\n //Si ambos filtros son todos, uso el total del surtido activo para las cajitas de decisiones. \r\n //Me importa saber cuantos items activos me van a quedar cuando selecciono Todos los Skus y Todos los Estados.\r\n if (self.selectedFilterForStatus == 'Todos' && self.selectedFilterForAssortmentStatus == 'Todos')\r\n self.totalItemClusters = self.totalActiveItemClusters;\r\n }\r\n function updateKPIs(node, assortmentChanged) {\r\n var item = node.data;\r\n\r\n var clusters = _.filter(self.clusters, function (o) {\r\n return o.clusterId == item.clusterId;\r\n });\r\n\r\n var cluster = clusters.length > 0 ? clusters[0] : null;\r\n\r\n if (!assortmentChanged) {\r\n self.listingSuggestions += item.listingSuggestions;\r\n self.delistingSuggestions += item.delistingSuggestions;\r\n\r\n if (item.isListed == true) {\r\n self.actualSuggested++;\r\n self.actualNew++;\r\n }\r\n }\r\n\r\n\r\n if (item.newIsListed == true) {\r\n totalMarketSalesActiveItems += item.marketSales;\r\n self.listingNew++;\r\n if (cluster != null) {\r\n cluster.usedSpace += item.space == null ? 1 : item.space;\r\n }\r\n }\r\n else if (item.newIsListed == false) {\r\n totalMarketSalesActiveItems -= item.marketSales;\r\n self.delistingNew++;\r\n if (cluster != null) {\r\n cluster.usedSpace -= item.space == null ? 1 : item.space;\r\n }\r\n }\r\n else if (item.newIsListed == null) {\r\n if (item.isListed == true) {\r\n\r\n totalMarketSalesActiveItems += item.marketSales;\r\n\r\n if (assortmentChanged) {\r\n self.delistingNew--;\r\n if (cluster) {\r\n cluster.usedSpace += item.space == null ? 1 : item.space;\r\n }\r\n }\r\n }\r\n else {\r\n totalMarketSalesActiveItems -= assortmentChanged ? item.marketSales : 0;\r\n\r\n if (assortmentChanged) {\r\n self.listingNew--;\r\n if (cluster) {\r\n cluster.usedSpace -= item.space == null ? 1 : item.space;\r\n }\r\n }\r\n }\r\n }\r\n\r\n //Cobertura real por bandera\r\n\r\n angular.forEach(self.categoryDetails, function (cd) {\r\n\r\n if (item.storeBrandId == cd.brandId) {\r\n\r\n if (item.newIsListed == true) {\r\n cd.totalMarketSalesActiveItemsBrand += item.marketSales || 0;\r\n }\r\n else if (item.newIsListed == false) {\r\n cd.totalMarketSalesActiveItemsBrand -= item.marketSales || 0;\r\n }\r\n else if (item.newIsListed == null) {\r\n\r\n if (item.isListed == true) {\r\n\r\n cd.totalMarketSalesActiveItemsBrand += item.marketSales || 0;\r\n\r\n }\r\n\r\n else {\r\n cd.totalMarketSalesActiveItemsBrand -= assortmentChanged && item.marketSales ? item.marketSales : 0;\r\n }\r\n }\r\n\r\n }\r\n });\r\n\r\n if (assortmentChanged) {\r\n self.actualCoverage = totalMarketSales != null && totalMarketSales != 0 ? totalMarketSalesActiveItems / totalMarketSales : 1; //Si no tengo data de mercado, asumo que tengo el 100% de cobertura\r\n\r\n angular.forEach(self.categoryDetails, function (cd) {\r\n cd.brandCoverage = totalMarketSales != null && totalMarketSales != 0 ? cd.totalMarketSalesActiveItemsBrand / totalMarketSales : 1;\r\n });\r\n }\r\n\r\n }\r\n function loadData(forceRefresh) {\r\n\r\n\r\n ////defino los filtros del pareto\r\n //var filters = {\r\n // categoryId: self.currentCategoryId,\r\n // brandId: null,\r\n // storeFormatId: null,\r\n // customerTypeId: null,\r\n // regionId: null,\r\n // onlySuggested: false\r\n //}\r\n\r\n ////Cargo el pareto\r\n //loadPareto(filters);\r\n\r\n self.applyFilters();\r\n\r\n //Cargo los clusters\r\n assortmentService.clusters.getClustersByCategory(self.currentCategoryId).then(function (allClusters) {\r\n\r\n self.allClusters = allClusters;\r\n\r\n for (var i = 0; i < self.allClusters.length; i++) {\r\n self.itemClusters.push(angular.copy(self.allClusters[i].code));\r\n }\r\n });\r\n\r\n //Cargo el pareto Sections\r\n assortmentService.decisions.getParetoSections(self.currentCategoryId)\r\n .then(function (sections) {\r\n self.paretoSections = sections;\r\n });\r\n }\r\n\r\n function loadPareto(filters) {\r\n if (self.gridOptions.api)\r\n self.gridOptions.api.showLoadingOverlay();\r\n\r\n //Cargo los datos del pareto\r\n assortmentService.decisions.getParetoByCategory(filters)\r\n .then(function (dto) {\r\n\r\n self.pareto = dto;\r\n\r\n self.updateClusterFilter(self.pareto);\r\n\r\n countParetoSections();\r\n\r\n setColumnDefinitions();\r\n self.gridOptions.columnDefs = columnDefs;\r\n self.gridOptions.api.refreshView();\r\n\r\n if (self.gridOptions.api) {\r\n self.gridOptions.api.setRowData(dto.items);\r\n self.gridOptions.api.refreshView();\r\n }\r\n\r\n if (dto != null && dto.items != null && dto.items.length > 0) {\r\n //Seteo los datos del header\r\n self.pareto = dto;\r\n\r\n self.currentCategoryId\r\n\r\n self.allEndorse = dto.items;\r\n\r\n if (self.gridOptions.api)\r\n loadClusterCategorySpaces();\r\n\r\n //loadChartData();\r\n }\r\n\r\n //Si vengo con un clusterId desde el categorySummary, filtro por ese cluster.\r\n if ($stateParams.clusterId != 0) {\r\n\r\n var result = _.filter(self.allClusters, function (o) {\r\n return o.id == $stateParams.clusterId;\r\n });\r\n\r\n self.filterByCluster(result[0].code);\r\n }\r\n\r\n externalFilterChanged();\r\n });\r\n }\r\n\r\n function loadClusterCategorySpaces() {\r\n assortmentService.clusters.getClusterCategorySpaces(self.currentCategoryId).then(function (clusters) {\r\n self.clusters = clusters;\r\n\r\n //actualizo los kpi de espacios\r\n self.gridOptions.api.forEachNode(function (node) {\r\n\r\n var item = node.data;\r\n\r\n var clusters = _.filter(self.clusters, function (o) {\r\n return o.clusterId == item.clusterId;\r\n });\r\n\r\n var cluster = clusters.length > 0 ? clusters[0] : null;\r\n\r\n if (item.newIsListed == null) {\r\n if (item.isListed == true) {\r\n\r\n if (cluster != null) {\r\n cluster.usedSpace += item.space == null ? 1 : item.space;\r\n }\r\n }\r\n else {\r\n if (cluster != null) {\r\n //cluster.usedSpace -= item.space == null ? 1 : item.space;\r\n }\r\n }\r\n }\r\n });\r\n\r\n });\r\n }\r\n function loadTags() {\r\n adminService.tags.getTags()\r\n .then(function (tags) {\r\n self.tags = tags;\r\n });\r\n }\r\n function loadCategoryDetails() {\r\n assortmentService.decisions.getCategoryDetail(self.currentCategoryId).then(function (catDet) {\r\n self.categoryDetails = catDet;\r\n self.categoryDetails.forEach(function (cd) {\r\n cd.totalMarketSalesActiveItemsBrand = 0; //no lo agrego al Dto por que es un campo que solo se calcula y se usa en pantalla.\r\n });\r\n });\r\n }\r\n function getDataFromCategorySummary() {\r\n\r\n //Seteo el titulo tipo Breadcrumb\r\n var categoryGroup = decodeURIComponent($stateParams.categoryGroup.replace(/-/g, \" \").replace(/_/g, \"\\/\"));\r\n var category = decodeURIComponent($stateParams.category.replace(/-/g, \" \").replace(/_/g, \"\\/\"));\r\n var subcategory = decodeURIComponent($stateParams.subcategory.replace(/-/g, \" \").replace(/_/g, \"\\/\"));\r\n\r\n self.title = categoryGroup\r\n if (category != '') {\r\n self.title += ' / ' + category;\r\n if (subcategory != '') {\r\n self.title += ' / ' + subcategory;\r\n }\r\n }\r\n }\r\n function loadChartData() {\r\n //Traigo data para el chart\r\n assortmentService.decisions.getAssortmentDashboard($stateParams.categoryId)\r\n .then(function (assortmentDashboard) {\r\n self.assortmentDashboard = assortmentDashboard;\r\n\r\n self.updateChart(self.timerange);\r\n if (companyJson.AssortmentDecisions.CollapseSalesGraph) {\r\n $('div.ibox-content.ibox-p-sm').slideUp();\r\n }\r\n });\r\n }\r\n\r\n function changeSalesOnColumnGroupShow() {\r\n if (companyJson.Erp && companyJson.Erp.Implementation) {\r\n if (companyJson.Erp.Implementation == \"CencosudColombia\"\r\n || companyJson.Erp.Implementation == \"CencosudChile\") {\r\n self.salesOnColumnGroupShow = 'open';//venta se muestra solo al desplegar\r\n }\r\n else {\r\n self.totalSalesOnColumnGroupShow = 'open';//venta TOTAL se muestra solo al desplegar\r\n }\r\n }\r\n }\r\n\r\n function getHiddenColumnIndexes(callback) {\r\n assortmentService.decisions.getHiddenColumnIndexes().then(function (matrix) {\r\n self.matrixOfIndexes = matrix;\r\n callback();\r\n });\r\n }\r\n\r\n function loadFiltersByCategory() {\r\n assortmentService.decisions.getParetoFiltersByCategory(self.currentCategoryId).then(function (filters) {\r\n //agrego opcion 'Todos' a los filtros\r\n self.filters = {\r\n brands: [{ id: null, name: 'Todas' }],\r\n storeFormats: [{ id: null, name: 'Todos' }],\r\n customerTypes: [{ id: null, name: 'Todos' }],\r\n regions: [{ id: null, name: 'Todas' }],\r\n clusters: [{ id: null, name: 'Todos' }]\r\n }\r\n self.filters.brands = self.filters.brands.concat(filters.brands);\r\n self.filters.storeFormats = self.filters.storeFormats.concat(filters.storeFormats);\r\n self.filters.customerTypes = self.filters.customerTypes.concat(filters.customerTypes);\r\n self.filters.regions = self.filters.regions.concat(filters.regions);\r\n self.filters.clusters = self.filters.clusters.concat(filters.clusters);\r\n\r\n //seteo la seleccion inicial de filtros\r\n self.selectedFilters.status = self.isEndorse ? \"Para Validar\" : \"Sugeridos\";\r\n self.selectedFilters.assortmentStatus = \"Todos\";\r\n self.selectedFilters.brand = self.filters.brands[0];\r\n self.selectedFilters.storeFormat = self.filters.storeFormats[0];\r\n self.selectedFilters.customerType = self.filters.customerTypes[0];\r\n self.selectedFilters.region = self.filters.regions[0];\r\n if ($stateParams.clusterId) {\r\n self.selectedFilters.cluster = self.filters.clusters.find(function (c) {\r\n return c.id === parseInt($stateParams.clusterId);\r\n });\r\n\r\n self.selectedFilters.cluster = self.selectedFilters.cluster || self.filters.clusters[0];\r\n }\r\n else {\r\n self.selectedFilters.cluster = self.filters.clusters[0];\r\n }\r\n self.selectedFilters.groupByBrand = false;\r\n self.selectedFilters.groupByFormat = false;\r\n self.selectedFilters.groupByCustomer = false;\r\n self.selectedFilters.groupByRegion = false;\r\n\r\n //init data\r\n loadData();\r\n\r\n });\r\n }\r\n\r\n function canView(property) {\r\n return $rootScope.decisionsConfig[property] != undefined ? $rootScope.decisionsConfig[property] : false;\r\n }\r\n\r\n\r\n function init() {\r\n \r\n changeSalesOnColumnGroupShow();\r\n\r\n //init columnDefs and gridOptions\r\n setGridOptions();\r\n\r\n loadFiltersByCategory();\r\n\r\n //Load data for title and endorsement\r\n getDataFromCategorySummary();\r\n\r\n loadCategoryDetails();\r\n loadChartData();\r\n loadTags();\r\n self.loadGrid = true;\r\n }\r\n\r\n getHiddenColumnIndexes(function () {\r\n init();\r\n });\r\n\r\n self.changeAssortmentDecision = function (nodeId) {\r\n //Obtengo el nodo de la grilla\r\n var node = getNodeById(nodeId);\r\n\r\n //Logica para distinguir nodos hijos y padres\r\n if (!node.group) {\r\n if (!self.isEndorse) {\r\n updateAssortmentDecision(node);\r\n }\r\n }\r\n\r\n //marco el nodo como dirty\r\n node.data.dirty = true;\r\n\r\n //actualiza la grilla\r\n self.gridOptions.api.refreshRows([node]);\r\n self.gridOptions.api.refreshRows([node.parent]);\r\n\r\n //actualiza los KPI\r\n updateKPIs(node, true);\r\n }\r\n function updateAssortmentDecision(node) {\r\n\r\n if (node.data.newIsListed == null) {\r\n if (node.data.isListed == true) {\r\n node.data.newIsListed = false;\r\n node.data.absPendingImpact = node.data.delistingImpact;\r\n }\r\n else {\r\n node.data.newIsListed = true;\r\n node.data.absPendingImpact = node.data.listingImpact;\r\n }\r\n\r\n self.pendingImpact += node.data.absPendingImpact;\r\n\r\n if (node.parent != null)\r\n node.parent.data.absPendingImpact += node.data.absPendingImpact;\r\n }\r\n else {\r\n var revertImpact = 0;\r\n if (node.data.newIsListed == false)\r\n revertImpact = node.data.delistingImpact;\r\n else if (node.data.newIsListed == true)\r\n revertImpact = node.data.listingImpact;\r\n\r\n node.data.newIsListed = null;\r\n node.data.absPendingImpact = 0;\r\n\r\n self.pendingImpact -= revertImpact;\r\n if (node.parent != null)\r\n node.parent.data.absPendingImpact -= revertImpact;\r\n }\r\n }\r\n function changeAssortment(rowNode, isSelected) {\r\n if (isSelected) {\r\n //Si no tengo decision tomada\r\n if (rowNode.data.assortmentStatus == 0) {\r\n changeAssortmentUpdate(true, rowNode);\r\n }\r\n else {\r\n changeAssortmentUpdate(false, rowNode);\r\n }\r\n }\r\n else //Si la estoy deseleccionando \r\n {\r\n if (rowNode.data.assortmentStatus == 0)\r\n changeAssortmentUpdate(false, rowNode);\r\n else {\r\n changeAssortmentUpdate(true, rowNode);\r\n }\r\n }\r\n rowNode.data.dirty = true;\r\n\r\n self.gridOptions.api.refreshRows([rowNode]);\r\n self.gridOptions.api.refreshRows([rowNode.parent]);\r\n\r\n updateKPIs(rowNode, true);\r\n }\r\n function changeAssortmentUpdate(add, rowNode) {\r\n if (add) {\r\n if (rowNode.data.isListed == true) {\r\n rowNode.data.newIsListed = false;\r\n rowNode.data.absPendingImpact = rowNode.data.delistingImpact;\r\n }\r\n else {\r\n rowNode.data.newIsListed = true;\r\n rowNode.data.absPendingImpact = rowNode.data.listingImpact;\r\n }\r\n\r\n self.pendingImpact += rowNode.data.absPendingImpact;\r\n\r\n if (rowNode.parent != null)\r\n rowNode.parent.data.absPendingImpact += rowNode.data.absPendingImpact;\r\n }\r\n else {\r\n var revertImpact = 0;\r\n if (rowNode.data.newIsListed == false)\r\n revertImpact = rowNode.data.delistingImpact;\r\n else if (rowNode.data.newIsListed == true)\r\n revertImpact = rowNode.data.listingImpact;\r\n\r\n rowNode.data.newIsListed = null;\r\n rowNode.data.absPendingImpact = 0;\r\n\r\n self.pendingImpact -= revertImpact;\r\n if (rowNode.parent != null)\r\n rowNode.parent.data.absPendingImpact -= revertImpact;\r\n }\r\n }\r\n //FIN DEPRECATED: To Be Deleted\r\n });","angular.module(\"prisma\")\r\n .controller(\"AssortmentClusterHierarchyCtrl\", function ($rootScope, $state, $stateParams, $timeout, $filter, assortmentService, authService, companyJson) {\r\n\r\n var self = this;\r\n var numberColWidth = 100;\r\n var editableColWidth = 140;\r\n var columnDefs = null;\r\n self.hasPermission = authService.hasPermission('assortment_clusterHierarchy');\r\n\r\n self.paretos = [];\r\n self.pareto = null;\r\n self.gridOptions = null;\r\n self.categoryLevel = self.categoryLevel = companyJson.Category.Levels;\r\n\r\n\r\n //grid config\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: 'Categoria / Cluster',\r\n width: numberColWidth + 200,\r\n pinned: 'left',\r\n field: 'name',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n cellRenderer: {\r\n renderer: 'group',\r\n checkbox: false,\r\n innerRenderer: function (params) {\r\n var name = params.value + (params.node.group && params.node.children != null ? ' (' + params.node.children.length + ')' : '');\r\n\r\n if (params.node.data.majorId || params.node.group) //Cluster Menores o Categoria\r\n return '' + name + '';\r\n else //Cluster Mayor\r\n return '' + name + '';\r\n\r\n }\r\n }\r\n },\r\n {\r\n headerName: \"SKUs\",\r\n field: \"activeSKUs\",\r\n filter: 'number',\r\n headerTooltip: \"Cantidad de SKUs activos\",\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"Dif % Vs Mayor\",\r\n field: \"diffWithMajorP\",\r\n filter: 'number',\r\n headerTooltip: \"Diferencia en % vs Cluster Mayor\",\r\n width: numberColWidth + 100,\r\n cellClass: $rootScope.getClassForHierarchyPCell,\r\n cellRenderer: $rootScope.percentageRenderer\r\n },\r\n {\r\n headerName: \"Dif # Vs Mayor\",\r\n field: \"diffWithMajor\",\r\n filter: 'number',\r\n headerTooltip: \"Diferencia en Cantidad vs Cluster Mayor\",\r\n width: numberColWidth + 100,\r\n cellClass: $rootScope.getClassForHierarchyCell,\r\n },\r\n {\r\n headerName: \"Dif % Vs Anterior\",\r\n field: \"diffWithPreviousP\",\r\n filter: 'number',\r\n headerTooltip: \"Diferencia en % vs Cluster Mayor\",\r\n width: numberColWidth + 100,\r\n cellClass: $rootScope.getClassForHierarchyPCell,\r\n cellRenderer: $rootScope.percentageRenderer\r\n },\r\n {\r\n headerName: \"Dif # Vs Anterior\",\r\n field: \"diffWithPrevious\",\r\n filter: 'number',\r\n headerTooltip: \"Diferencia en Cantidad vs Cluster Mayor\",\r\n width: numberColWidth + 100,\r\n cellClass: $rootScope.getClassForHierarchyCell,\r\n },\r\n {\r\n headerName: \"% SKUs\",\r\n columnGroupShow: 'open',\r\n field: \"skUsShare\",\r\n filter: 'number',\r\n headerTooltip: \"Share de SKUs\",\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRenderer\r\n }\r\n ]\r\n }\r\n\r\n function setGridOptions() {\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n groupHeaders: false,\r\n suppressCellSelection: true,\r\n rowHeight: 35,\r\n groupHideGroupColumns: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n angularCompileRows: true,\r\n getNodeChildDetails: getNodeChildDetails,\r\n //rowGroupOpened: rowGroupOpened,\r\n enableFilter: true,\r\n }\r\n }\r\n\r\n self.exportToExcel = function () {\r\n var params = {\r\n skipHeader: false,\r\n skipFooters: false,\r\n skipGroups: false,\r\n allColumns: true,\r\n onlySelected: false,\r\n suppressQuotes: false,\r\n fileName: 'Prisma-CategorySummary.xls',\r\n columnSeparator: ','\r\n };\r\n\r\n self.gridOptions.api.exportDataAsCsv(params);\r\n }\r\n\r\n //function rowGroupOpened(rowItem) {\r\n // console.log(rowItem);\r\n //}\r\n\r\n function getNodeChildDetails(rowItem) {\r\n //console.log(rowItem);\r\n if (rowItem.subcategories && rowItem.subcategories.length > 0) {\r\n return {\r\n group: true,\r\n expanded: false,\r\n // provide ag-Grid with the children of this group\r\n children: rowItem.subcategories,\r\n // the key is used by the default group cellRenderer\r\n key: rowItem.subcategory != null ? rowItem.subcategory : ''\r\n };\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n function loadData() {\r\n\r\n assortmentService.reports.getClusterHierarchy(self.categoryLevel)\r\n .then(function (items) {\r\n self.paretos = items;\r\n self.gridOptions.api.setRowData(self.paretos);\r\n });\r\n }\r\n\r\n function init() {\r\n\r\n //init columnDefs and gridOptions\r\n setGridOptions();\r\n\r\n //load data\r\n loadData();\r\n }\r\n\r\n init();\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"AssortmentClusterCrossingCtrl\", function ($rootScope, $scope, $state, assortmentService, adminService) {\r\n\r\n var self = this;\r\n self.categories = [];\r\n self.selectedCategoriesIds = [];\r\n self.selectedSubategoriesIds = [];\r\n self.clusters = [];\r\n self.sourceClusterId = null;\r\n self.targetClusterId = null;\r\n self.ruleTypes = [\r\n { value: 1, name: 'Venta' },\r\n { value: 2, name: 'Unidades' },\r\n { value: 3, name: 'Margen' },\r\n { value: 4, name: 'Participacion Venta' },\r\n { value: 5, name: 'Participacion Unidades' },\r\n { value: 6, name: 'Participacion Margen' }\r\n ];\r\n self.comparationTypes = [\r\n { value: 1, label: '≤' },//menor o igual\r\n { value: 2, label: '≥' },//mayor o igual\r\n { value: 3, label: '=' }\r\n ];\r\n self.comparationIdx = 0;\r\n self.rule = { type: 1, comparation: 1, value: null };\r\n self.rules = [];\r\n self.writtenRule = '';\r\n self.crossingResults = [];\r\n\r\n self.changeComparation = function () {\r\n if (self.comparationIdx === self.comparationTypes.length - 1)\r\n self.comparationIdx = 0;\r\n else self.comparationIdx++;\r\n }\r\n\r\n self.addRule = function () {\r\n if (!validateRule()) {\r\n swal('Regla invalida', '', 'error');\r\n return;\r\n }\r\n\r\n self.rule.comparation = self.comparationTypes[self.comparationIdx].value;\r\n console.log(self.rule);\r\n self.rules.push(self.rule);\r\n self.rule = { type: 1, comparation: 1, value: null };\r\n writeRule();\r\n }\r\n\r\n self.getResults = function () {\r\n if (!validateParams()) {\r\n swal('Error', 'Complete todos los campos.', 'error');\r\n return;\r\n }\r\n var dto = {\r\n sourceClusterId: self.sourceClusterId,\r\n targetClusterId: self.targetClusterId,\r\n categoriesIds: self.selectedCategoriesIds,\r\n subcategoriesIds: self.selectedSubategoriesIds,\r\n rules: self.rules\r\n };\r\n self.isComparing = true;\r\n assortmentService.decisions.getClusterCrossing(dto)\r\n .then(function (response) {\r\n console.log(response);\r\n response.forEach(function (x) {\r\n x.add = false;\r\n });\r\n self.crossingResults = response;\r\n self.isComparing = false;\r\n },\r\n function (error) {\r\n console.log(error);\r\n swal(\"Error\", \"Ha ocurrido un error\", \"error\");\r\n self.isComparing = false;\r\n });\r\n }\r\n\r\n self.save = function () {\r\n if (!self.crossingResults.some(function (x) { return x.add; })) {\r\n swal('Debe incorporar al menos un item.', '', 'warning');\r\n return;\r\n }\r\n\r\n swal({\r\n title: 'Atencion',\r\n text: 'Se tomaran decisiones de alta para el cluster revision.',\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n self.isSaving = true;\r\n var req = self.crossingResults.filter(function (x) { return x.add; });\r\n assortmentService.decisions.saveClusterCrossing(req)\r\n .then(function (response) {\r\n console.log(response);\r\n self.crossingResults = [];\r\n swal(\"Confirmado\", \"Se guardaron los cambios seleccionados\", \"success\");\r\n self.isSaving = false;\r\n },\r\n function (error) {\r\n console.log(error);\r\n swal(\"Error\", \"Ha ocurrido un error\", \"error\");\r\n self.isSaving = false;\r\n });\r\n }\r\n });\r\n }\r\n\r\n function validateRule() {\r\n return self.rule.value != null;\r\n }\r\n\r\n function validateParams() {\r\n return (self.selectedCategoriesIds.length > 0 || self.selectedSubategoriesIds.length > 0)\r\n && self.targetClusterId && self.sourceClusterId\r\n && self.rules.length > 0;\r\n }\r\n\r\n function writeRule() {\r\n var writtenRule = \"REGLA: Productos del cluster de referencia\";\r\n\r\n _.forEach(self.rules, function (r, index) {\r\n var type = self.ruleTypes.find(function (t) { return t.value === r.type; });\r\n var comparation = r.comparation === 3 ? 'igual' : r.comparation === 1 ? 'menor o igual' : 'mayor o igual';\r\n var value = '';\r\n switch (type.value) {\r\n case 1: value = '$' + r.value; break;\r\n case 2: value = r.value; break;\r\n case 3: value = '$' + r.value; break;\r\n case 4: value = r.value + '%'; break;\r\n case 5: value = r.value + '%'; break;\r\n case 6: value = r.value + '%'; break;\r\n }\r\n\r\n writtenRule += ian.format(\r\n ' {0} donde {1} sea {2} a {3}'\r\n , index ? 'Y' : '', type.name, comparation, value);\r\n\r\n });\r\n\r\n self.writtenRule = writtenRule;\r\n }\r\n\r\n function init() {\r\n adminService.categories.getCategoriesWithLevels([5, 4])\r\n .then(function (categories) {\r\n self.categories = categories;\r\n });\r\n\r\n adminService.clusters.getClusters()\r\n .then(function (clusters) {\r\n self.clusters = clusters;\r\n });\r\n\r\n }\r\n\r\n init();\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"AssortmentCategorySummaryCtrl\", function ($rootScope, $state, $stateParams, $timeout, $interval, $filter, assortmentService, authService, companyJson, $translate) {\r\n\r\n var self = this;\r\n var dic = {};\r\n var numberColWidth = 100;\r\n var editableColWidth = 140;\r\n var lastAdded = null;\r\n var columnDefs = null;\r\n\r\n self.hasPermissionToEndorse = authService.hasPermission('assortment_endorse');\r\n\r\n self.paretos = [];\r\n self.clusterFilteringText = \"Filtrar por Cluster\";\r\n self.allClusters = [{ id: 0, code: 'Todos', name: 'Todos', companyId: 1, }];\r\n self.selectedClusterId = null;\r\n self.hideSpaces = companyJson.AssortmentDecisions && companyJson.AssortmentDecisions.Grid && companyJson.AssortmentDecisions.Grid.HideSpaces;\r\n\r\n self.pareto = null;\r\n self.gridOptions = null;\r\n self.categoryLevel = 3;\r\n\r\n self.chartViewAll = function (viewMore) {\r\n self.maxBarsToDisplay = viewMore ? 150 : 10;\r\n var data = buildChartData(self.paretos);\r\n renderBarChart(data);\r\n }\r\n\r\n self.chartChangeDimension = function (newDimension) {\r\n if (newDimension != dimension) {\r\n dimension = newDimension;\r\n var data = buildChartData(self.paretos);\r\n renderBarChart(data);\r\n }\r\n }\r\n\r\n //grid config\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: translations.CategoryCluster,\r\n width: numberColWidth + 200,\r\n pinned: 'left',\r\n field: 'name',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n cellRenderer: {\r\n renderer: 'group',\r\n checkbox: false,\r\n innerRenderer: function (params) {\r\n var name = params.value + (params.node.group && params.node.children != null ? ' (' + params.node.children.length + ')' : '');\r\n\r\n var allowCategoryNavigation = companyJson.AssortmentDecisions.SupportAnalysisFromCategoryLevel < 5;\r\n\r\n var canNavigate = params.data.categoryId != 0 && params.data.subcategoryId == 0 && !allowCategoryNavigation ? false : true;\r\n\r\n if (params.data.categoryId != null && params.data.categoryId != 0 && canNavigate) {\r\n\r\n var categoryGroup = \"'\" + params.data.categoryGroup + \"'\";\r\n var category = \"'\" + params.data.category + \"'\";\r\n var subcategory = \"'\" + params.data.subcategory + \"'\";\r\n var clusterId = self.selectedClusterId != null ? self.selectedClusterId : params.data.clusterId;\r\n\r\n var anchor = '' + name + '';\r\n var endorse = true;\r\n var endorseLink = '';\r\n if (endorse && (params.data.delistingPending > 0 || params.data.listingPending > 0))\r\n endorseLink = '';\r\n\r\n return endorseLink + anchor;\r\n }\r\n else\r\n return name;\r\n }\r\n }\r\n },\r\n {\r\n headerName: translations.CategoryCluster,\r\n width: numberColWidth + 200,\r\n pinned: 'left',\r\n field: 'name',\r\n hide: true,\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n cellRenderer: {\r\n renderer: 'group',\r\n checkbox: false,\r\n innerRenderer: function (params) {\r\n return params.value;\r\n }\r\n }\r\n },\r\n {\r\n headerName: \"SKUs\",\r\n field: \"totalActiveSKUs\",\r\n filter: 'number',\r\n headerTooltip: translations.SKUsTooltip,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell\r\n },\r\n {\r\n headerName: \"% SKUs\",\r\n columnGroupShow: 'open',\r\n field: \"skUsShare\",\r\n filter: 'number',\r\n headerTooltip: \"Share de SKUs\",\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRenderer\r\n },\r\n {\r\n headerName: translations.Suggestions,\r\n children: [\r\n {\r\n headerName: \"Bajas\",\r\n field: \"delistingSuggestions\",\r\n filter: 'number',\r\n headerTooltip: translations.AmountSuggestions,\r\n width: 50,\r\n suppressMenu: true,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: translations.HighF,\r\n field: \"listingSuggestions\",\r\n filter: 'number',\r\n headerTooltip: translations.NumberHighSuggestions,\r\n width: 50,\r\n suppressMenu: true,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: translations.Impact,\r\n field: \"impact\",\r\n filter: 'number',\r\n headerTooltip: translations.ImpactInDolar,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForImpactCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n //{\r\n // headerName: \"Final\",\r\n // columnGroupShow: 'open',\r\n // valueGetter: 'data.activeSKUs - data.delistingSuggestions + data.listingSuggestions',\r\n // filter: 'number',\r\n // headerTooltip: \"Cantidad de SKUs activos\",\r\n // width: numberColWidth,\r\n // cellClass: $rootScope.getClassForCell\r\n //},\r\n ]\r\n },\r\n {\r\n headerName: translations.Pending,\r\n children: [\r\n {\r\n headerName: translations.Falls,\r\n field: \"delistingPending\",\r\n filter: 'number',\r\n headerTooltip: translations.PendindFalls,\r\n width: 50,\r\n suppressMenu: true,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: translations.HighF,\r\n field: \"listingPending\",\r\n filter: 'number',\r\n headerTooltip: translations.HighSlopes,\r\n width: 50,\r\n suppressMenu: true,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: translations.Impact,\r\n field: \"pendingImpact\",\r\n filter: 'number',\r\n headerTooltip: translations.ImpactByDecisionsByCluster,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForImpactCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n }\r\n ]\r\n },\r\n {\r\n headerName: translations.InternalPerformance,\r\n children: [\r\n {\r\n headerName: translations.SalesInDollars,\r\n field: \"sales\",\r\n filter: 'number',\r\n headerTooltip: translations.InternalPerformanceTooltip,\r\n width: numberColWidth + 10,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: translations.SalePercentage,\r\n field: \"salesShare\",\r\n filter: 'number',\r\n width: numberColWidth + 35,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererNoDecimals\r\n },\r\n {\r\n headerName: translations.SalesUn,\r\n columnGroupShow: 'open',\r\n field: \"units\",\r\n filter: 'number',\r\n headerTooltip: translations.SaleUnTooltip,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: translations.UnitsPercentage,\r\n columnGroupShow: 'open',\r\n field: \"unitsShare\",\r\n filter: 'number',\r\n headerTooltip: translations.ShareOfSalesInUnits,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererNoDecimals\r\n },\r\n {\r\n headerName: translations.MarginInDollars,\r\n columnGroupShow: 'open',\r\n field: \"margin\",\r\n filter: 'number',\r\n headerTooltip: \"\",\r\n width: numberColWidth + 10,\r\n cellClass: $rootScope.getClassForImpactCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: translations.PercentageMargin,\r\n columnGroupShow: 'open',\r\n field: \"marginShare\",\r\n filter: 'number',\r\n headerTooltip: translations.MarginShare,\r\n width: numberColWidth + 25,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererNoDecimals\r\n },\r\n {\r\n headerName: translations.PercentageMargin2,\r\n columnGroupShow: 'open',\r\n field: \"marginP\",\r\n filter: 'number',\r\n headerTooltip: \"\",\r\n width: numberColWidth + 25,\r\n cellClass: $rootScope.getClassForImpactCell,\r\n cellRenderer: $rootScope.percentageRendererNoDecimals\r\n },\r\n //{\r\n // headerName: \"Margen 2 $\",\r\n // field: \"margin2\",\r\n // filter: 'number',\r\n // headerTooltip: \"Margen 2\",\r\n // width: numberColWidth + 15,\r\n // cellClass: $rootScope.getClassForCell,\r\n // cellRenderer: $rootScope.moneyRendererNoDecimals\r\n //},\r\n //{\r\n // headerName: \"% Margen 2 $\",\r\n // field: \"margin2Share\",\r\n // columnGroupShow: 'open',\r\n // headerTooltip: \"Share de Margen 2 $\",\r\n // filter: 'number',\r\n // width: numberColWidth + 25,\r\n // cellClass: $rootScope.getClassForCell,\r\n // cellRenderer: $rootScope.percentageRenderer\r\n //},\r\n {\r\n headerName: translations.AveragePrice,\r\n columnGroupShow: 'open',\r\n field: \"price\",\r\n filter: 'number',\r\n headerTooltip: \"\",\r\n width: numberColWidth + 30,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRenderer\r\n },\r\n {\r\n headerName: translations.SaleXsku,\r\n columnGroupShow: 'open',\r\n field: \"hurdleRate\",\r\n filter: 'number',\r\n headerTooltip: \"\",\r\n width: numberColWidth + 10,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: translations.Rotation,\r\n columnGroupShow: 'open',\r\n field: \"turnsC\",\r\n filter: 'number',\r\n headerTooltip: \"\",\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.decimalRenderer\r\n }]\r\n },\r\n {\r\n headerName: translations.PerformanceMarket,\r\n children: [\r\n {\r\n headerName: translations.Coverage,\r\n field: \"coverage\",\r\n filter: 'number',\r\n headerTooltip: translations.AssortmentCoverage,\r\n width: numberColWidth + 65,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererNoDecimals\r\n },\r\n {\r\n headerName: translations.SalesInDollars,\r\n columnGroupShow: 'open',\r\n field: \"marketSales\",\r\n filter: 'number',\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: translations.MarketSalePercentage,\r\n columnGroupShow: 'open',\r\n field: \"marketSalesShare\",\r\n filter: 'number',\r\n headerTooltip: translations.ShareOfSalesInTheMarket,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererNoDecimals\r\n },\r\n {\r\n headerName: translations.GAPSale,\r\n columnGroupShow: 'open',\r\n field: \"salesGap\",\r\n filter: 'number',\r\n headerTooltip: translations.GAPSaleTooltip,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForImpactCell,\r\n cellRenderer: $rootScope.percentageRendererPP\r\n },\r\n {\r\n headerName: translations.SalesUn,\r\n columnGroupShow: 'open',\r\n field: \"marketUnits\",\r\n filter: 'number',\r\n headerTooltip: translations.SaleInUnitsTooltip2,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: translations.MarketUnitsPercentage,\r\n columnGroupShow: 'open',\r\n field: \"marketUnitsShare\",\r\n filter: 'number',\r\n headerTooltip: translations.MarketUnitsPercentageTooltip,\r\n width: numberColWidth + 20,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererNoDecimals\r\n },\r\n {\r\n headerName: translations.GAPUnits,\r\n columnGroupShow: 'open',\r\n field: \"unitsGap\",\r\n filter: 'number',\r\n headerTooltip: translations.GAPUnitsTooltip,\r\n width: numberColWidth + 25,\r\n cellClass: $rootScope.getClassForImpactCell,\r\n cellRenderer: $rootScope.percentageRendererPP\r\n },\r\n {\r\n headerName: translations.AveragePrice,\r\n columnGroupShow: 'open',\r\n field: \"marketPrice\",\r\n filter: 'number',\r\n headerTooltip: \"\",\r\n width: numberColWidth + 45,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRenderer\r\n }]\r\n },\r\n {\r\n headerName: translations.Inventory,\r\n children: [\r\n {\r\n headerName: \"Stock\",\r\n field: \"inventory\",\r\n filter: 'number',\r\n headerTooltip: translations.InventoryInDolar,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRendererNoDecimals\r\n },\r\n {\r\n headerName: \"% Stock.\",\r\n columnGroupShow: 'open',\r\n field: \"inventoryShare\",\r\n filter: 'number',\r\n headerTooltip: translations.ShareOfInventoryValue,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererNoDecimals\r\n },\r\n {\r\n headerName: \"Stock Un\",\r\n columnGroupShow: 'open',\r\n field: \"inventoryUnits\",\r\n filter: 'number',\r\n headerTooltip: translations.InventoryInUnits,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.integerRenderer\r\n },\r\n {\r\n headerName: \"GMROI\",\r\n columnGroupShow: 'open',\r\n field: \"gmroi\",\r\n filter: 'number',\r\n headerTooltip: translations.GMROITooltip,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRenderer\r\n }\r\n ]\r\n },\r\n {\r\n headerName: translations.Spaces,\r\n children: [\r\n {\r\n headerName: translations.Mlinear,\r\n field: \"linearSpace\",\r\n filter: 'number',\r\n headerTooltip: translations.MlinearTooltip,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.decimalRenderer,\r\n hide: self.hideSpaces\r\n },\r\n {\r\n headerName: translations.Facings,\r\n field: \"spaceFronts\",\r\n filter: 'number',\r\n headerTooltip: translations.ProductFronts,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.decimalRenderer,\r\n hide: self.hideSpaces\r\n },\r\n {\r\n headerName: \"GMROS\",\r\n columnGroupShow: 'open',\r\n field: \"gmros\",\r\n filter: 'number',\r\n headerTooltip: translations.GMROSTooltip,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.moneyRenderer,\r\n hide: self.hideSpaces\r\n },\r\n {\r\n headerName: translations.PercentageSpace,\r\n columnGroupShow: 'open',\r\n field: \"spaceShare\",\r\n filter: 'number',\r\n headerTooltip: translations.PercentageSpaceTooltip,\r\n width: numberColWidth,\r\n cellClass: $rootScope.getClassForCell,\r\n cellRenderer: $rootScope.percentageRendererNoDecimals,\r\n hide: self.hideSpaces\r\n }\r\n\r\n ]\r\n },\r\n {\r\n headerName: translations.Reviews,\r\n children: [\r\n {\r\n headerName: translations.Revised,\r\n width: numberColWidth,\r\n field: 'isChecked',\r\n cellClass: getClassForRevision,\r\n cellRenderer: revisionNeededRenderer\r\n },\r\n {\r\n headerName: translations.LastRevision,\r\n width: numberColWidth + 25,\r\n field: 'rangeReviewLastRevision',\r\n cellClass: self.getClassForCell,\r\n cellRenderer: lastRevisionRenderer\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n\r\n function setGridOptions() {\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n groupHeaders: false,\r\n suppressCellSelection: true,\r\n rowHeight: 35,\r\n groupHideGroupColumns: true,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n angularCompileRows: true,\r\n getNodeChildDetails: getNodeChildDetails,\r\n rowGroupOpened: rowGroupOpened,\r\n enableFilter: true,\r\n doesExternalFilterPass: doesExternalFilterPass,\r\n isExternalFilterPresent: isExternalFilterPresent\r\n }\r\n }\r\n\r\n self.goToDecisions = function (categoryId, subcategoryId, categoryGroup, category, subcategory, clusterId, isEndorse) {\r\n\r\n categoryGroup = categoryGroup.replace(/ /g, \"-\").replace(/\\//g, \"_\");\r\n category = category.replace(/ /g, \"-\").replace(/\\//g, \"_\");\r\n subcategory = subcategory.replace(/ /g, \"-\").replace(/\\//g, \"_\");\r\n\r\n var encodedcategoryGroup = categoryGroup != 'null' ? encodeURIComponent(categoryGroup) : '';\r\n var encodedcategory = category != 'null' ? encodeURIComponent(category) : '';\r\n var encodedsubcategory = subcategory != 'null' ? encodeURIComponent(subcategory) : '';\r\n\r\n $state.go('assortment.decisions', { categoryId: categoryId, subcategoryId: subcategoryId, categoryGroup: encodedcategoryGroup, category: encodedcategory, subcategory: encodedsubcategory, clusterId: clusterId, isEndorse: isEndorse });\r\n }\r\n\r\n self.exportToExcel = function () {\r\n var params = {\r\n skipHeader: false,\r\n skipFooters: false,\r\n skipGroups: false,\r\n allColumns: true,\r\n onlySelected: false,\r\n suppressQuotes: false,\r\n fileName: 'Prisma-CategorySummary.xls',\r\n columnSeparator: ','\r\n };\r\n\r\n self.gridOptions.api.exportDataAsCsv(params);\r\n }\r\n\r\n function rowGroupOpened(rowItem) {\r\n console.log(rowItem);\r\n }\r\n\r\n function getNodeChildDetails(rowItem) {\r\n //console.log(rowItem);\r\n if (rowItem.subcategories && rowItem.subcategories.length > 0) {\r\n return {\r\n group: true,\r\n expanded: false,\r\n // provide ag-Grid with the children of this group\r\n children: rowItem.subcategories,\r\n // the key is used by the default group cellRenderer\r\n key: rowItem.subcategory != null ? rowItem.subcategory : ''\r\n };\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n\r\n function getClassForRevision(params) {\r\n var cls = [];\r\n\r\n if (params.data.isChecked == false) {\r\n cls.push(\"text-danger\");\r\n cls.push(\"b\");\r\n }\r\n else {\r\n cls.push(\"text-ok\");\r\n }\r\n\r\n var baseClass = $rootScope.getClassForCell(params);\r\n for (var i = 0; i < baseClass.length; i++) {\r\n cls.push(baseClass[0]);\r\n }\r\n\r\n return cls;\r\n }\r\n function revisionNeededRenderer(params) {\r\n if (params.data.clusterId == 0 && (params.data.categoryId != 0 || params.data.subcategoryId != 0)) {\r\n //Si es el agrupador de categorias se fija que todos esten revisados para poner revisada la categoria\r\n if (params.data.categoryId != 0 && params.data.subcategoryId == 0 && params.data.subcategories.length > 0) {\r\n for (var i = 0; i < params.data.subcategories.length; i++) {\r\n if (params.data.subcategories[i].isChecked == false)\r\n return \"NO\";\r\n }\r\n\r\n params.data.isChecked = true;\r\n return \"SI\";\r\n }\r\n if (params.value)\r\n return \"SI\";\r\n else\r\n return \"NO\";\r\n }\r\n return \"\";\r\n }\r\n function lastRevisionRenderer(params) {\r\n if (params.data.categoryId != 0 && params.data.subcategoryId == 0) {\r\n return $rootScope.dateRenderer(params);\r\n }\r\n return \"\";\r\n\r\n }\r\n\r\n\r\n\r\n self.externalFilterChanged = function () {\r\n self.gridOptions.api.onFilterChanged();\r\n }\r\n\r\n\r\n function isExternalFilterPresent() {\r\n return self.search != null && self.search != '';\r\n }\r\n\r\n function doesExternalFilterPass(node) {\r\n if (node.data.categoryGroup.toLowerCase().indexOf(self.search.toLowerCase()) != -1\r\n || node.data.category.toLowerCase().indexOf(self.search.toLowerCase()) != -1\r\n || node.data.subcategory.toLowerCase().indexOf(self.search.toLowerCase()) != -1)\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n\r\n //grid filter\r\n self.dropDrowncluster = { isopen: false };\r\n self.filterByCluster = function (cluster) {\r\n\r\n if (cluster.name == 'Todos') {\r\n self.selectedClusterId = null;\r\n self.clusterFilteringText = \"Filtrar por Cluster\";\r\n self.gridOptions.api.setQuickFilter();\r\n }\r\n else {\r\n self.selectedClusterId = cluster.id;\r\n self.gridOptions.api.setQuickFilter(cluster.code);\r\n self.clusterFilteringText = \"Cluster: \" + cluster.name;\r\n }\r\n }\r\n\r\n function loadData() {\r\n self.categoryLevel = companyJson.Category.Levels;\r\n\r\n assortmentService.decisions.getCategorySummary(self.categoryLevel)\r\n .then(function (items) {\r\n\r\n self.paretos = items;\r\n self.gridOptions.api.setRowData(self.paretos);\r\n //self.gridOptions.api.sizeColumnsToFit();\r\n\r\n var data = buildChartData(self.paretos);\r\n renderBarChart(data);\r\n });\r\n }\r\n function loadClusters() {\r\n\r\n assortmentService.clusters.getClusters().then(function (clusters) {\r\n self.allClusters = self.allClusters.concat(clusters);\r\n });\r\n }\r\n\r\n self.maxBarsToDisplay = 10;\r\n var dimension = \"units\";\r\n\r\n function buildChartData(paretos) {\r\n var flare = { name: 'flare', children: [] };\r\n\r\n var barCount = 0;\r\n var otherSize = 0;\r\n\r\n var orderedParetos = _.orderBy(paretos, [dimension], 'desc');\r\n\r\n angular.forEach(orderedParetos, function (paretoCategoryGroup) {\r\n\r\n barCount++;\r\n\r\n if (barCount < self.maxBarsToDisplay) {\r\n var categoryGroup = { name: paretoCategoryGroup.name, size: paretoCategoryGroup[dimension], children: [] };\r\n flare.children.push(categoryGroup);\r\n\r\n angular.forEach(paretoCategoryGroup.subcategories, function (paretoCategory) {\r\n var category = { name: paretoCategory.name, size: paretoCategory[dimension], children: [] };\r\n categoryGroup.children.push(category);\r\n\r\n angular.forEach(paretoCategory.subcategories, function (paretoSubcategory) {\r\n var subcategory = { name: paretoSubcategory.name, size: paretoSubcategory[dimension], children: [] };\r\n category.children.push(subcategory);\r\n\r\n angular.forEach(paretoSubcategory.subcategories, function (paretoCluster) {\r\n var cluster = { name: paretoCluster.name, size: paretoCluster[dimension], children: [] };\r\n subcategory.children.push(cluster);\r\n });\r\n });\r\n });\r\n }\r\n else {\r\n otherSize += paretoCategoryGroup[dimension]\r\n }\r\n });\r\n\r\n if (otherSize > 0) {\r\n var others = { name: \"Otras\", size: otherSize, children: [] };\r\n flare.children.push(others);\r\n }\r\n\r\n return flare;\r\n }\r\n\r\n function renderBarChart(data) {\r\n var m = [80, 160, 0, 160], // top right bottom left\r\n w = 1000, // - m[1] - m[3], // width\r\n h = 570, // - m[0] - m[2], // height\r\n x = d3.scale.linear().range([0, w - 100]),\r\n y = 15, // bar height\r\n z = d3.scale.ordinal().range([\"steelblue\", \"#aaa\"]); // bar color\r\n\r\n var hierarchy = d3.layout.partition()\r\n .value(function (d) { return d.size; });\r\n\r\n var xAxis = d3.svg.axis()\r\n .scale(x)\r\n .orient(\"top\");\r\n\r\n d3.select(\"div.svg-container\").remove();\r\n\r\n var svg = d3.select(\"div#bars\")\r\n .append(\"div\")\r\n .classed(\"svg-container\", true) //container class to make it responsive\r\n .append(\"svg\")\r\n //responsive SVG needs these 2 attributes and no width and height attr\r\n .attr(\"preserveAspectRatio\", \"xMinYMin meet\")\r\n .attr(\"viewBox\", \"0 0 \" + w + \" \" + h)\r\n //class to make it responsive\r\n .classed(\"svg-content-responsive\", true)\r\n //.attr(\"width\", w + m[1] + m[3])\r\n //.attr(\"height\", h + m[0] + m[2])\r\n .append(\"svg:g\")\r\n .attr(\"transform\", \"translate(\" + 140 + \",\" + 20 + \")\");\r\n\r\n svg.append(\"svg:rect\")\r\n .attr(\"class\", \"background\")\r\n .attr(\"width\", w)\r\n .attr(\"height\", h)\r\n .on(\"click\", up);\r\n\r\n svg.append(\"svg:g\")\r\n .attr(\"class\", \"x axis\");\r\n\r\n svg.append(\"svg:g\")\r\n .attr(\"class\", \"y axis\")\r\n .append(\"svg:line\")\r\n .attr(\"y1\", \"100%\");\r\n\r\n //fix to show all\r\n if (self.maxBarsToDisplay > 10)\r\n d3.select(\"div.svg-container\").style(\"padding-bottom\", \"58%\");\r\n else\r\n d3.select(\"div.svg-container\").style(\"padding-bottom\", \"22%\");\r\n\r\n\r\n //d3.json(\"flare.json\", function (root) {\r\n // hierarchy.nodes(root);\r\n // x.domain([0, root.value]).nice();\r\n // down(root, 0);\r\n //});\r\n\r\n hierarchy.nodes(data);\r\n x.domain([0, data.value]).nice();\r\n down(data, 0);\r\n\r\n function down(d, i) {\r\n if (!d.children || this.__transition__) return;\r\n var duration = d3.event && d3.event.altKey ? 7500 : 750,\r\n delay = duration / d.children.length;\r\n\r\n // Mark any currently-displayed bars as exiting.\r\n var exit = svg.selectAll(\".enter\").attr(\"class\", \"exit\");\r\n\r\n // Entering nodes immediately obscure the clicked-on bar, so hide it.\r\n exit.selectAll(\"rect\").filter(function (p) { return p === d; })\r\n .style(\"fill-opacity\", 1e-6);\r\n\r\n // Enter the new bars for the clicked-on data.\r\n // Per above, entering bars are immediately visible.\r\n var enter = bar(d)\r\n .attr(\"transform\", stack(i))\r\n .style(\"opacity\", 1);\r\n\r\n // Have the text fade-in, even though the bars are visible.\r\n // Color the bars as parents; they will fade to children if appropriate.\r\n enter.select(\"text\").style(\"fill-opacity\", 1e-6);\r\n enter.select(\"rect\").style(\"fill\", z(true));\r\n\r\n // Update the x-scale domain.\r\n x.domain([0, d3.max(d.children, function (d) { return d.value; })]).nice();\r\n\r\n // Update the x-axis.\r\n svg.selectAll(\".x.axis\").transition()\r\n .duration(duration)\r\n .call(xAxis);\r\n\r\n // Transition entering bars to their new position.\r\n var enterTransition = enter.transition()\r\n .duration(duration)\r\n .delay(function (d, i) { return i * delay; })\r\n .attr(\"transform\", function (d, i) { return \"translate(0,\" + y * i * 1.2 + \")\"; });\r\n\r\n // Transition entering text.\r\n enterTransition.select(\"text\").style(\"fill-opacity\", 1);\r\n\r\n // Transition entering rects to the new x-scale.\r\n enterTransition.select(\"rect\")\r\n .attr(\"width\", function (d) { return x(d.value); })\r\n .style(\"fill\", function (d) { return z(!!d.children); });\r\n\r\n // Transition exiting bars to fade out.\r\n var exitTransition = exit.transition()\r\n .duration(duration)\r\n .style(\"opacity\", 1e-6)\r\n .remove();\r\n\r\n // Transition exiting bars to the new x-scale.\r\n exitTransition.selectAll(\"rect\").attr(\"width\", function (d) { return x(d.value); });\r\n\r\n // Rebind the current node to the background.\r\n svg.select(\".background\").data([d]).transition().duration(duration * 2); d.index = i;\r\n }\r\n\r\n function up(d) {\r\n if (!d.parent || this.__transition__) return;\r\n var duration = d3.event && d3.event.altKey ? 7500 : 750,\r\n delay = duration / d.children.length;\r\n\r\n // Mark any currently-displayed bars as exiting.\r\n var exit = svg.selectAll(\".enter\").attr(\"class\", \"exit\");\r\n\r\n // Enter the new bars for the clicked-on data's parent.\r\n var enter = bar(d.parent)\r\n .attr(\"transform\", function (d, i) { return \"translate(0,\" + y * i * 1.2 + \")\"; })\r\n .style(\"opacity\", 1e-6);\r\n\r\n // Color the bars as appropriate.\r\n // Exiting nodes will obscure the parent bar, so hide it.\r\n enter.select(\"rect\")\r\n .style(\"fill\", function (d) { return z(!!d.children); })\r\n .filter(function (p) { return p === d; })\r\n .style(\"fill-opacity\", 1e-6);\r\n\r\n // Update the x-scale domain.\r\n x.domain([0, d3.max(d.parent.children, function (d) { return d.value; })]).nice();\r\n\r\n // Update the x-axis.\r\n svg.selectAll(\".x.axis\").transition()\r\n .duration(duration * 2)\r\n .call(xAxis);\r\n\r\n // Transition entering bars to fade in over the full duration.\r\n var enterTransition = enter.transition()\r\n .duration(duration * 2)\r\n .style(\"opacity\", 1);\r\n\r\n // Transition entering rects to the new x-scale.\r\n // When the entering parent rect is done, make it visible!\r\n enterTransition.select(\"rect\")\r\n .attr(\"width\", function (d) { return x(d.value); })\r\n .each(\"end\", function (p) { if (p === d) d3.select(this).style(\"fill-opacity\", null); });\r\n\r\n // Transition exiting bars to the parent's position.\r\n var exitTransition = exit.selectAll(\"g\").transition()\r\n .duration(duration)\r\n .delay(function (d, i) { return i * delay; })\r\n .attr(\"transform\", stack(d.index));\r\n\r\n // Transition exiting text to fade out.\r\n exitTransition.select(\"text\")\r\n .style(\"fill-opacity\", 1e-6);\r\n\r\n // Transition exiting rects to the new scale and fade to parent color.\r\n exitTransition.select(\"rect\")\r\n .attr(\"width\", function (d) { return x(d.value); })\r\n .style(\"fill\", z(true));\r\n\r\n // Remove exiting nodes when the last child has finished transitioning.\r\n exit.transition().duration(duration * 2).remove();\r\n\r\n // Rebind the current parent to the background.\r\n svg.select(\".background\").data([d.parent]).transition().duration(duration * 2);\r\n }\r\n\r\n // Creates a set of bars for the given data node, at the specified index.\r\n function bar(d) {\r\n var bar = svg.insert(\"svg:g\", \".y.axis\")\r\n .attr(\"class\", \"enter\")\r\n .attr(\"transform\", \"translate(0,5)\")\r\n .selectAll(\"g\")\r\n .data(d.children)\r\n .enter().append(\"svg:g\")\r\n .style(\"cursor\", function (d) { return !d.children ? null : \"pointer\"; })\r\n .on(\"click\", down);\r\n\r\n bar.append(\"svg:text\")\r\n .attr(\"x\", -6)\r\n .attr(\"y\", y / 2)\r\n .attr(\"dy\", \".35em\")\r\n .attr(\"text-anchor\", \"end\")\r\n .text(function (d) { return d.name; });\r\n\r\n bar.append(\"svg:rect\")\r\n .attr(\"width\", function (d) { return x(d.value); })\r\n .attr(\"height\", y);\r\n\r\n return bar;\r\n }\r\n\r\n // A stateful closure for stacking bars horizontally.\r\n function stack(i) {\r\n var x0 = 0;\r\n return function (d) {\r\n var tx = \"translate(\" + x0 + \",\" + y * i * 1.2 + \")\";\r\n x0 += x(d.value);\r\n return tx;\r\n };\r\n }\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n //init columnDefs and gridOptions\r\n setGridOptions();\r\n\r\n $translate([\"CategoryCluster\", \"SKUsTooltip\", \"Suggestions\", \"AmountSuggestions\", \"HighF\", \"NumberHighSuggestions\"\r\n , \"Impact\", \"ImpactInDolar\", \"Pending\", \"Falls\", \"PendindFalls\", \"HighSlopes\", \"ImpactByDecisionsByCluster\"\r\n , \"InternalPerformance\", \"InternalPerformanceTooltip\", \"SalesInDollars\", \"SalePercentage\", \"SalesUn\"\r\n , \"SaleUnTooltip\", \"UnitsPercentage\", \"ShareOfSalesInUnits\", \"MarginInDollars\", \"PercentageMargin\", \"MarginShare\"\r\n , \"PercentageMargin2\", \"AveragePrice\", \"SaleXsku\", \"Rotation\", \"PerformanceMarket\", \"Coverage\", \"AssortmentCoverage\"\r\n , \"MarketSalePercentage\", \"ShareOfSalesInTheMarket\", \"GAPSale\", \"GAPSaleTooltip\", \"SaleInUnitsTooltip2\", \"MarketUnitsPercentage\"\r\n , \"MarketUnitsPercentageTooltip\", \"GAPUnits\", \"GAPUnitsTooltip\", \"Inventory\", \"InventoryInDolar\", \"ShareOfInventoryValue\"\r\n , \"GMROITooltip\", \"Spaces\", \"Mlinear\", \"MlinearTooltip\", \"Facings\", \"ProductFronts\", \"GMROSTooltip\", \"PercentageSpace\"\r\n , \"PercentageSpaceTooltip\", \"Reviews\", \"Revised\", \"LastRevision\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions.api.setColumnDefs(columnDefs);\r\n });\r\n\r\n loadClusters();\r\n\r\n //load data\r\n loadData();\r\n }\r\n\r\n init();\r\n });\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"MissionsCtrl\", function ($scope, $state, $translate, adminService, $timeout) {\r\n\r\n var self = this;\r\n self.search = \"\";\r\n self.filter = \"\";\r\n self.order = \"daysLeft\";\r\n\r\n self.missionList = [];\r\n self.frecuencies = [];\r\n self.surveyMethods = [];\r\n self.missionTypes = [];\r\n\r\n self.getProgressBar = function (progress) {\r\n if (progress != null) {\r\n return progress + '%';\r\n }\r\n }\r\n\r\n self.editMission = function (mission) {\r\n $state.go('admin.editMissions', { missionId: mission.id });\r\n }\r\n\r\n self.addNew = function () {\r\n $state.go('admin.editMissions', { missionId: 0 });\r\n }\r\n\r\n\r\n //CODIGO QUE YA EXISTIA\r\n\r\n //var pageLoaded = false;\r\n //self.pageNumber = 1;\r\n //self.pageSize = 30;\r\n\r\n\r\n //$(window).scroll(function () {\r\n // if ($(window).scrollTop() + $(window).height() == $(document).height()) {\r\n // if (pageLoaded) {\r\n // $timeout(function () {\r\n // self.pageNumber++;\r\n // }, 0)\r\n // }\r\n // }\r\n //});\r\n\r\n\r\n //self.missions = [];\r\n\r\n //self.newStore = { id: null, name: '', code: '', isExcluded: false };\r\n\r\n //self.search = \"\";\r\n\r\n //self.filter = \"\";\r\n\r\n //self.addNew = function () {\r\n // $state.go('admin.editMissions', { missionId: 0 });\r\n // //self.newStore.id = 0;\r\n //}\r\n\r\n //self.editMission = function (mission) {\r\n // $state.go('admin.editMissions', { missionId: mission.id });\r\n // //self.newStore = store;\r\n //}\r\n\r\n function loadMissions() {\r\n adminService.missions.getMissions()\r\n .then(function (missions) {\r\n self.missionList = missions;\r\n });\r\n }\r\n\r\n self.getMissionEnums = function () {\r\n adminService.missions.getMissionEnums().then(function (enums) {\r\n\r\n self.missionTypes = enums.missionTypes;\r\n self.surveyMethods = enums.surveyMethods;\r\n self.frecuencies = enums.frecuencies;\r\n\r\n self.missionTypes.forEach(function (x) {\r\n x.name = translations[x.name] || x.name;\r\n });\r\n\r\n self.surveyMethods.forEach(function (x) {\r\n x.name = translations[x.name] || x.name;\r\n });\r\n\r\n self.frecuencies.forEach(function (x) {\r\n x.name = translations[x.name] || x.name;\r\n });\r\n\r\n loadMissions();\r\n\r\n });\r\n }\r\n\r\n self.getNameMissionType = function (type) {\r\n var rv = \"\";\r\n angular.forEach(self.missionTypes, function (mT) {\r\n if (mT.id == type) {\r\n rv = mT.name;\r\n }\r\n });\r\n return rv;\r\n }\r\n\r\n self.getNameSurveyMethods = function (type) {\r\n var rv = \"\";\r\n angular.forEach(self.surveyMethods, function (sM) {\r\n if (sM.id == type) {\r\n rv = sM.name;\r\n }\r\n });\r\n return rv;\r\n }\r\n\r\n self.getNameFrecuencies = function (type) {\r\n var rv = \"\";\r\n angular.forEach(self.frecuencies, function (f) {\r\n if (f.id == type) {\r\n rv = f.name;\r\n }\r\n });\r\n return rv;\r\n }\r\n\r\n self.isExpiredMission = function (mission) {\r\n rv = false;\r\n if (mission.daysLeft < 0) {\r\n rv = true;\r\n }\r\n return rv;\r\n }\r\n\r\n self.deleteMission = function (mission) {\r\n swal({\r\n title: \"Esta seguro que desea eliminar la mision?.\",\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n\r\n if (!isConfirm) return;\r\n\r\n adminService.missions.deleteMission(mission.id).then(function () {\r\n swal(\"Confirmado\", \"\", \"success\");\r\n var index = self.missionList.indexOf(mission);\r\n self.missionList.splice(index, 1);\r\n }),\r\n function () {\r\n swal(\"Error\", \"\", \"error\");\r\n };\r\n });\r\n }\r\n\r\n \r\n var translations = null;\r\n\r\n function init() {\r\n $translate([\"Strip\", \"Catalog\", \"OneTime\", \"Biannual\", \"Annual\", \"PriceSurvey\",\r\n \"ExhibitionSurvey\", \"PriceLabelScan\", \"VoiceCommand\", \"ManualEntry\", \"Daily\", \"Weekly\", \"Biweekly\", \"Monthly\"])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n self.getMissionEnums();\r\n }\r\n\r\n init();\r\n });\r\n\r\n\r\n\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"EditMissionsCtrl\", function ($scope, $stateParams, $translate, $state, $uibModal, spaceService, adminService, priceService) {\r\n var self = this;\r\n\r\n self.mission = {};\r\n self.agentPlaces = [];\r\n self.selectedBrands = [];//banderas\r\n self.itemBrands = [];//marcas de los items\r\n self.selectedRegions = [];\r\n self.selectedLocalities = [];\r\n self.selectedPriceZone = [];\r\n self.selectedRegions = [];\r\n self.selectedStores = [];\r\n self.suppliers = [];\r\n self.selectedGroups = [];\r\n self.selectedSubgroups = [];\r\n self.selectedCategories = [];\r\n self.selectedSubcategories = [];\r\n self.selectedItemBrands = [];\r\n self.selectedSuppliers = [];\r\n self.brands = [];\r\n self.showRequiredFields = false;\r\n self.isLoading = true;\r\n self.isLoadingItems = false;\r\n self.listAgentCompetitor = [];\r\n self.subGroupLabel = companyJson.Erp.Implementation == \"LaRebaja\" ? \"Division\" : \"Subgrupos\";\r\n self.subGroupPlaceHolder = companyJson.Erp.Implementation == \"LaRebaja\" ? \"Seleccione divisiones\" : \"Seleccione Subgrupos\";\r\n self.groupLabel = companyJson.Erp.Implementation == \"LaRebaja\" ? \"Unidad de Negocio\" : \"Grupo\";\r\n self.groupPlaceHolder = companyJson.Erp.Implementation == \"LaRebaja\" ? \"Seleccione Unidades de Negocio\" : \"Seleccione Grupos\";\r\n self.showItemFilters = !(companyJson.MysteryShopper && companyJson.MysteryShopper.HideItemFilters);\r\n\r\n self.filterItems = function (item) {\r\n //1. si el brand del item matchea (whole word)con alguno de los seleccionados\r\n var itemInSelectedBrands = !self.selectedItemBrands.length || (item.brand && self.selectedItemBrands.includes(item.brand));\r\n\r\n //2. si el manufacturer del item matchea (whole word) con alguno de los seleccionados\r\n var itemInSelectedSuppliers = !self.selectedSuppliers.length || (item.manufacturer && self.selectedSuppliers.includes(item.manufacturer));\r\n\r\n //3. si la categoryId del item esta en las seleccionadas\r\n var itemCategoryInSelection = (!self.selectedSubcategories.length\r\n && !self.selectedCategories.length\r\n && !self.selectedSubgroups.length\r\n && !self.selectedGroups.length)\r\n || isCategoryInSelection(item.subcategoryId);\r\n\r\n return itemInSelectedBrands && itemInSelectedSuppliers && itemCategoryInSelection;\r\n }\r\n\r\n function isCategoryInSelection(subcategoryId) {\r\n\r\n if (self.selectedSubcategories.map(function (x) { return x.id; }).includes(subcategoryId))\r\n return true;\r\n var subcategory = self.subcategories.find(function (x) { return x.id === subcategoryId; });\r\n if (subcategory && subcategory.parentId) {\r\n if (self.selectedCategories.map(function (x) { return x.id; }).includes(subcategory.parentId))\r\n return true;\r\n }\r\n if (subcategory && subcategory.parentId) {\r\n var category = self.categories.find(function (x) { return x.id === subcategory.parentId; })\r\n if (category.parentId) {\r\n if (self.selectedSubgroups.map(function (x) { return x.id; }).includes(category.parentId))\r\n return true;\r\n }\r\n }\r\n if (category && category.parentId) {\r\n var subgroup = self.subgroups.find(function (x) { return x.id === category.parentId; })\r\n if (subgroup.parentId) {\r\n if (self.selectedGroups.map(function (x) { return x.id; }).includes(subgroup.parentId))\r\n return true;\r\n }\r\n }\r\n return false;\r\n\r\n }\r\n\r\n self.cancel = function () {\r\n $state.go('admin.missions');\r\n }\r\n\r\n self.validateRequiredFields = function () {\r\n var rv = true;\r\n if (self.mission.missionName && self.mission.missionType\r\n && self.mission.frecuency\r\n && self.mission.actionType && self.mission.dueDate\r\n && self.mission.items && self.mission.items.length && self.agentPlaces.length) {\r\n\r\n angular.forEach(self.agentPlaces, function (ap) {\r\n if (!ap.competitorIds || !ap.competitorIds.length || !ap.userName) {\r\n rv = false;\r\n }\r\n });\r\n }\r\n else {\r\n rv = false;\r\n }\r\n\r\n return rv;\r\n }\r\n\r\n self.validateCompetitors = function () {\r\n var flag = 0;\r\n var rv = true;\r\n angular.forEach(self.competitors, function (c) {\r\n flag = 0;\r\n angular.forEach(self.agentPlaces, function (ap) {\r\n for (var i = 0; i < ap.competitorIds.length; i++) {\r\n if (c.id == ap.competitorIds[i] && flag == 0) {\r\n flag = 1;\r\n }\r\n else if (c.id == ap.competitorIds[i] && flag) {\r\n rv = false;\r\n }\r\n }\r\n });\r\n });\r\n return rv;\r\n }\r\n\r\n self.validateUsers = function () {\r\n var rv = true;\r\n for (var i = 0; i < self.agentPlaces.length; i++) {\r\n\r\n var arr = self.agentPlaces.filter(function (x) {\r\n return x.userName == self.agentPlaces[i].userName;\r\n });\r\n if (arr.length > 1) {\r\n rv = false;\r\n break;\r\n }\r\n }\r\n\r\n return rv;\r\n }\r\n\r\n self.validateExpiration = function (frecuency, dueDate) {\r\n var rv = true;\r\n switch (frecuency) {\r\n case 1:\r\n return true;\r\n break;\r\n case 2:\r\n frecuency = 1;\r\n break;\r\n case 3:\r\n frecuency = 7;\r\n break;\r\n case 4:\r\n frecuency = 15;\r\n break;\r\n case 5:\r\n frecuency = 30;\r\n break;\r\n case 5:\r\n frecuency = 181;\r\n break;\r\n case 7:\r\n frecuency = 365;\r\n break;\r\n }\r\n var today = new Date();\r\n today.setDate(today.getDate() + frecuency);\r\n var result = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate();\r\n var auxDueDate = dueDate.getFullYear() + '-' + (dueDate.getMonth() + 1) + '-' + dueDate.getDate();\r\n if (auxDueDate > result) {\r\n rv = false;\r\n }\r\n return rv;\r\n }\r\n\r\n self.onChangeUsers = function (AgentPlace) {\r\n var listFilterByUser = self.listAgentCompetitor.filter(function (x) { return x.userName == AgentPlace.userName });\r\n var newcompetitorsIds = listFilterByUser.map(function (x) { return x.competitorId })\r\n AgentPlace.competitorIds = newcompetitorsIds;\r\n }\r\n\r\n self.getAgentCompetitor = function () {\r\n adminService.missions.getAgentCompetitors().then(function (agentCompetitor) {\r\n self.listAgentCompetitor = agentCompetitor;\r\n });\r\n }\r\n\r\n self.getUsers = function () {\r\n adminService.security.getUsers().then(function (users) {\r\n self.users = users;\r\n });\r\n }\r\n\r\n self.getStores = function () {\r\n adminService.security.getStores().then(function (stores) {\r\n self.stores = stores;\r\n });\r\n }\r\n\r\n self.getCompetitors = function () {\r\n priceService.competitors.competitors().then(function (competitors) {\r\n self.competitors = competitors;\r\n });\r\n }\r\n\r\n self.getBrands = function () {\r\n adminService.brands.getBrands().then(function (brands) {\r\n self.brands = brands;\r\n });\r\n }\r\n\r\n self.getMissionEnums = function () {\r\n adminService.missions.getMissionEnums().then(function (response) {\r\n self.missionTypes = response.missionTypes;\r\n self.actionTypes = response.actionTypes;\r\n self.surveyMethods = response.surveyMethods;\r\n self.frecuencies = response.frecuencies;\r\n\r\n self.missionTypes.forEach(function (x) {\r\n x.name = translations[x.name] || x.name;\r\n });\r\n self.actionTypes.forEach(function (x) {\r\n x.name = translations[x.name] || x.name;\r\n });\r\n self.surveyMethods.forEach(function (x) {\r\n x.name = translations[x.name] || x.name;\r\n });\r\n self.frecuencies.forEach(function (x) {\r\n x.name = translations[x.name] || x.name;\r\n });\r\n });\r\n }\r\n\r\n function buildAgentPlaces() {\r\n if (!self.mission || !self.mission.agentPlaces || !self.mission.agentPlaces.length)\r\n return;\r\n\r\n var users = [];\r\n _.forOwn(_.groupBy(self.mission.agentPlaces, \"assignedTo\"), function (value, key) {\r\n users.push(key);\r\n });\r\n var competitorIds = [];\r\n\r\n\r\n angular.forEach(users, function (u) {\r\n var thisUserHasValidateLocation = false;\r\n competitorIds = [];\r\n angular.forEach(self.mission.agentPlaces, function (ap) {\r\n if (ap.assignedTo == u) {\r\n competitorIds.push(ap.competitorId);\r\n thisUserHasValidateLocation = ap.validateLocation;\r\n }\r\n });\r\n\r\n self.agentPlaces.push({\r\n userName: u,\r\n competitorIds: competitorIds,\r\n validateLocation: thisUserHasValidateLocation\r\n });\r\n });\r\n }\r\n\r\n self.getItems = function () {\r\n if (self.selectedGroups.length > 0 || self.selectedSubgroups.length > 0\r\n || self.selectedCategories.length > 0 || self.selectedSubcategories.length > 0) {\r\n self.isLoadingItems = true;\r\n\r\n var subCategoriesIds = self.getSubcategoriesIds();\r\n\r\n adminService.items.getItemsByCategories(subCategoriesIds).then(function (items) {\r\n self.items = items;\r\n self.isLoadingItems = false;\r\n\r\n //distincts brands\r\n _.forOwn(_.groupBy(items, \"brand\"), function (value, key) {\r\n if (key && key != 'null')\r\n self.itemBrands.push(key);\r\n });\r\n //distincts manufacturers\r\n _.forOwn(_.groupBy(items, \"manufacturer\"), function (value, key) {\r\n if (key && key != 'null')\r\n self.suppliers.push(key);\r\n });\r\n });\r\n }\r\n else {\r\n var text = \"Seleccione al menos uno de los siguientes filtros: \" + self.groupLabel + \", \" + self.subGroupLabel + \", \" + \"Categoria, Subcategoria.\";\r\n swal({\r\n title: \"Error\",\r\n text: text,\r\n type: \"error\",\r\n confirmButtonClass: \"btn-danger\",\r\n confirmButtonText: \"Ok\",\r\n closeOnConfirm: false\r\n });\r\n }\r\n }\r\n\r\n self.getSubcategoriesIds = function () {\r\n var subCategoriesIds = [];\r\n\r\n if (self.selectedSubcategories.length > 0) {\r\n var subCatIds = self.selectedSubcategories.map(function (x) { return x.id });\r\n subCategoriesIds = subCategoriesIds.concat(subCatIds);\r\n }\r\n if (self.selectedCategories.length > 0) {\r\n var catIds = self.selectedCategories.map(function (x) { return x.id });\r\n var auxSubcat = self.subcategories.filter(function (x) { return catIds.includes(x.parentId) });\r\n var subCatIds = auxSubcat.map(function (x) { return x.id });\r\n subCategoriesIds = subCategoriesIds.concat(subCatIds);\r\n }\r\n if (self.selectedSubgroups.length > 0) {\r\n var subGroupIds = self.selectedSubgroups.map(function (x) { return x.id });\r\n var auxCats = self.categories.filter(function (x) { return subGroupIds.includes(x.parentId) });\r\n var auxCatIds = auxCats.map(function (x) { return x.id });\r\n var auxSubcat = self.subcategories.filter(function (x) { return auxCatIds.includes(x.parentId) });\r\n var subCatIds = auxSubcat.map(function (x) { return x.id });\r\n subCategoriesIds = subCategoriesIds.concat(subCatIds);\r\n }\r\n if (self.selectedGroups.length > 0) {\r\n var groupIds = self.selectedGroups.map(function (x) { return x.id });\r\n auxSubGroup = self.subgroups.filter(function (x) { return groupIds.includes(x.parentId) });\r\n auxSubGroupIds = auxSubGroup.map(function (x) { return x.id });\r\n var auxCats = self.categories.filter(function (x) { return auxSubGroupIds.includes(x.parentId) });\r\n var auxCatIds = auxCats.map(function (x) { return x.id });\r\n var auxSubcat = self.subcategories.filter(function (x) { return auxCatIds.includes(x.parentId) });\r\n var subCatIds = auxSubcat.map(function (x) { return x.id });\r\n subCategoriesIds = subCategoriesIds.concat(subCatIds);\r\n }\r\n\r\n return subCategoriesIds;\r\n }\r\n\r\n self.getCategories = function (levels) {\r\n adminService.categories.getCategoriesWithLevels(levels).then(function (categories) {\r\n self.subcategories = categories.filter(function (x) { return x.level === 5 });\r\n self.categories = categories.filter(function (x) { return x.level === 4 });\r\n self.subgroups = categories.filter(function (x) { return x.level === 3 });\r\n self.groups = categories.filter(function (x) { return x.level === 2 });\r\n });\r\n }\r\n\r\n self.save = function () { \r\n if (!self.validateRequiredFields()) {\r\n swal(\"Error\", \"Complete los campos obligatorios.\", \"error\");\r\n self.showRequiredFields = true;\r\n return;\r\n }\r\n if (!self.validateCompetitors()) {\r\n swal(\"Error\", \"Mas de un usuario tiene el mismo competidor.\", \"error\");\r\n return;\r\n }\r\n if (!self.validateUsers()) {\r\n swal(\"Error\", \"Eliga solo una tupla por usuario.\", \"error\");\r\n return;\r\n }\r\n if (!self.validateExpiration(self.mission.frecuency, self.mission.dueDate)) {\r\n swal(\"Error\", \"La expiracion debe ser menor o igual a la frecuencia a partir de la fecha de creacion de la mision\", \"error\");\r\n return;\r\n }\r\n\r\n self.showRequiredFields = false;\r\n swal({\r\n title: \"Esta seguro que desea guardar los cambios?.\",\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: \"Continuar\",\r\n cancelButtonText: \"Cancelar\",\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n\r\n if (!isConfirm) return;\r\n mapAgentPlaces();\r\n adminService.missions.saveMission(self.mission).then(function () {\r\n swal(\"Confirmado\", \"\", \"success\");\r\n self.cancel();\r\n }),\r\n function () {\r\n swal(\"Error\", \"\", \"error\");\r\n };\r\n });\r\n }\r\n \r\n\r\n self.addAgentPlace = function() {\r\n self.agentPlaces.push({ userName: '', competitorIds: [] });\r\n }\r\n\r\n self.removeAgentPlace = function (index) {\r\n self.agentPlaces.splice(index, 1);\r\n }\r\n\r\n function mapAgentPlaces() {\r\n self.mission.agentPlaces = [];\r\n var agentPlace = null;\r\n angular.forEach(self.agentPlaces, function (ap) {\r\n angular.forEach(ap.competitorIds, function (id) {\r\n agentPlace = {\r\n mSMissionId: self.mission.id,\r\n competitorId: id,\r\n assignedTo: ap.userName,\r\n validateLocation: ap.validateLocation\r\n };\r\n\r\n self.mission.agentPlaces.push(agentPlace);\r\n });\r\n });\r\n }\r\n\r\n //button Collapsed\r\n $scope.isNavCollapsed = true;\r\n $scope.isCollapsed = false;\r\n $scope.isCollapsedHorizontal = false;\r\n\r\n $scope.isProgrammingCollapsed = false;\r\n $scope.isCompetitorsCollapsed = false;\r\n $scope.isProductsCollapsed = false;\r\n $scope.isResponsibleCollapsed = false;\r\n\r\n var translations = null;\r\n function init() {\r\n\r\n $translate([\"Strip\", \"Catalog\", \"OneTime\", \"Biannual\", \"Annual\", \"PriceSurvey\",\r\n \"ExhibitionSurvey\", \"PriceLabelScan\", \"VoiceCommand\", \"ManualEntry\", \"Daily\", \"Weekly\", \"Biweekly\", \"Monthly\"])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n self.getCompetitors();\r\n self.getUsers();\r\n self.getStores();\r\n self.getMissionEnums();\r\n self.getCategories([2, 3, 4, 5]);\r\n self.getBrands();\r\n self.getAgentCompetitor();\r\n\r\n if ($stateParams.missionId != '0') {\r\n self.isNew = false;\r\n adminService.missions.getMission($stateParams.missionId).then(function (mission) {\r\n self.mission = mission;\r\n self.mission.dueDate = new Date(self.mission.dueDate);\r\n //selecciono agentPlaces\r\n buildAgentPlaces();\r\n\r\n self.isLoading = false;\r\n })\r\n }\r\n else {\r\n self.isNew = true;\r\n self.isLoading = false;\r\n }\r\n\r\n \r\n \r\n };\r\n\r\n init();\r\n\r\n });\r\n\r\n\r\n\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"ItemsCtrl\", function ($scope, $state, $translate, adminService, $timeout, homeService) {\r\n\r\n //Variables Globales\r\n\r\n var self = this;\r\n self.selectedItem = null;\r\n //ITEM LOOKUP\r\n self.item = null;\r\n self.itemLookupText = '';\r\n self.itemsInLookup = [];\r\n self.selectedItem = null;\r\n self.loadingLookupItems = false;\r\n self.lookupItemsNoResults = true;\r\n\r\n self.lstItems = [];\r\n\r\n self.search = \"\";\r\n\r\n self.order = \"\";\r\n\r\n var previousLookupText = '';\r\n\r\n $scope.$watch('ct.itemLookupText', function (newVal, oldVal) {\r\n if (newVal) {\r\n\r\n if (newVal.id) {\r\n self.selectedItem = self.itemLookupText;\r\n\r\n getItem(newVal.id);\r\n }\r\n\r\n if (newVal && newVal != oldVal && (newVal.length == 4 || (oldVal.length < 3 && newVal.length >= 4)) && newVal != previousLookupText) {\r\n previousLookupText = newVal;\r\n\r\n self.itemsInLookup = [{ id: 0, code: '', name: 'Cargando Items con el texto ' + newVal + '...' }];\r\n self.loadingLookupItems = true;\r\n var lookupText = { SearchTerm: newVal };\r\n\r\n homeService.lookups.abmItemsLookup(lookupText)\r\n .then(function (items) {\r\n self.itemsInLookup = items;\r\n self.loadingLookupItems = false;\r\n if (items.length > 0)\r\n self.lookupItemsNoResults = false;\r\n else\r\n self.lookupItemsNoResults = true;\r\n });\r\n }\r\n }\r\n\r\n }, true);\r\n\r\n function getItem(itemId) {\r\n self.isLoading = true;\r\n\r\n homeService.items.getItem(itemId)\r\n .then(function (item) {\r\n self.lstItems.push(item);\r\n self.isLoading = false;\r\n });\r\n }\r\n\r\n //Load Data\r\n function loadItems() {\r\n self.isLoading = true;\r\n }\r\n\r\n function init() {\r\n //loadItems();\r\n }\r\n\r\n init();\r\n });\r\n\r\n\r\n\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"EditMasterItemCtrl\", [\"$window\", \"$scope\", \"$stateParams\", \"$translate\", \"$state\", \"homeService\", \"serverService\", \"authService\", \"Upload\", \"ngDialog\", function ($window, $scope, $stateParams, $translate, $state, homeService, serverService, authService, Upload, ngDialog) {\r\n\r\n //Variables Globales\r\n var self = this;\r\n self.stateChange = false;\r\n self.isNew = $stateParams.itemId == 0 ? true : false;\r\n self.isLaRebaja = companyJson.Erp.Implementation == \"LaRebaja\" ? true : false;\r\n\r\n self.hasPermissionToEdit = authService.hasPermission('item_admin');\r\n\r\n self.cums = [];\r\n self.categories = [];\r\n self.subcategories = [];\r\n self.types = [];\r\n self.selectedCategory = null;\r\n self.selectedTypeId = -1;\r\n\r\n self.loadingVerifyItemEan = false;\r\n self.resultsVerifyEan = false;\r\n self.isVerify = false;\r\n self.unitOfMeasureSelected = null;\r\n self.cumAdded = null;\r\n\r\n self.item = {\r\n id: 0,\r\n code: \"\",\r\n cums: self.cums,\r\n name: \"\",\r\n ean: \"\",\r\n brand: \"\",\r\n manufacturer: \"\",\r\n distributor: \"\",\r\n height: null,\r\n width: null,\r\n depth: null,\r\n weight: null,\r\n imageUrl: \"\",\r\n imagePlanogramFront: null,\r\n imagePlanogramLeft: null,\r\n imagePlanogramTop: null,\r\n isExcluded: false,\r\n category: { id: 0, name: \"\", code: \"\" },\r\n unitOfMeasures: [{\r\n id: 0,\r\n itemId: 0,\r\n code: \"\",\r\n itemCode: 0,\r\n height: null,\r\n width: null,\r\n depth: null,\r\n weight: null,\r\n isBaseUnitOfMeasure: true,\r\n conversion: 1,\r\n imagePlanogramFront: null,\r\n imagePlanogramLeft: null,\r\n imagePlanogramTop: null\r\n }],\r\n type: { id: 0, code: \"\", name: \"\" }\r\n }\r\n\r\n function generateUnitOfMeasure() {\r\n return {\r\n id: 0,\r\n itemId: 0,\r\n code: \"\",\r\n itemCode: 0,\r\n height: null,\r\n width: null,\r\n depth: null,\r\n weight: null,\r\n isBaseUnitOfMeasure: false,\r\n conversion: 1,\r\n imagePlanogramFront: null,\r\n imagePlanogramLeft: null,\r\n imagePlanogramTop: null\r\n }\r\n }\r\n\r\n self.back = function () {\r\n $window.history.back();\r\n }\r\n\r\n self.onCategorySelected = function (category) {\r\n self.selectedCategory = category;\r\n self.loadSubcategories()\r\n }\r\n\r\n self.togleExclude = function () {\r\n self.item.isExcluded = !self.item.isExcluded;\r\n }\r\n\r\n function isValidField(field) {\r\n if (field == undefined || field == null || field == '')\r\n return false;\r\n\r\n return true;\r\n }\r\n\r\n self.save = function () {\r\n\r\n //Set Selected Type\r\n angular.forEach(self.types, function (t) {\r\n if (t.id == self.selectedTypeId)\r\n self.item.type = t;\r\n });\r\n\r\n if (!isValidField(self.item.code)\r\n || !isValidField(self.item.name)\r\n //|| !isValidField(self.item.ean)\r\n //|| !isValidField(self.item.brand)\r\n //|| !isValidField(self.item.manufacturer)\r\n //|| !isValidField(self.item.distributor)\r\n || !isValidField(self.item.category.code)\r\n || !isValidField(self.item.type.code))\r\n {\r\n swal(translations.ValidationSwalTitle, translations.ValidationSwalSubtitle, 'error');\r\n return;\r\n }\r\n var isValiddUOM = false\r\n var allItemUoms = [];\r\n self.uomRepeated = \"\";\r\n angular.forEach(self.item.unitOfMeasures, function (_uom) {\r\n\r\n if (allItemUoms.indexOf(_uom.code) == -1)\r\n allItemUoms.push(_uom.code);\r\n else {\r\n self.uomRepeated = _uom.code;\r\n }\r\n\r\n if ( !isValidField(_uom.code)\r\n || !isValidField(_uom.height)\r\n || !isValidField(_uom.width)\r\n || !isValidField(_uom.depth)\r\n //|| !isValidField(_uom.conversion)\r\n //|| !isValidField(_uom.weight)\r\n ) {\r\n swal(translations.ValidationSwalTitle, translations.ValidationSwalSubtitle, 'error');\r\n isValiddUOM = true\r\n return;\r\n }\r\n if (self.uomRepeated != \"\") {\r\n swal(translations.ErrorTitleSwal, translations.ValidationSwalUomRepeted, 'error');\r\n isValiddUOM = true\r\n return;\r\n }\r\n })\r\n\r\n if (self.item.code != null && !isValiddUOM) {\r\n\r\n swal({\r\n title: translations.SaveItemSwall,\r\n text: translations.SaveItemSwallSubtitle,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.Cancel,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n\r\n if (!isConfirm) return;\r\n\r\n //Save Item\r\n self.item.cums = self.cums\r\n homeService.items.saveItem(self.item)\r\n .then(function () {\r\n swal(translations.ItemSavedProperly, \"\", \"success\");\r\n self.cancel();\r\n });\r\n }\r\n );\r\n }\r\n\r\n self.stateChange = false;\r\n }\r\n\r\n self.cancel = function () {\r\n $state.go('admin.items');\r\n }\r\n\r\n self.filterCums = function (c) {\r\n return c.isDeleted == 0;\r\n }\r\n\r\n self.setPrincipalCum = function (cum) {\r\n angular.forEach(self.cums, function (c) {\r\n if (c.cum == cum.cum) {\r\n c.principal = true;\r\n }\r\n else {\r\n c.principal = false;\r\n }\r\n })\r\n }\r\n\r\n self.deleteCum = function (cum) {\r\n cum.principal = false;\r\n cum.isDeleted = 1;\r\n }\r\n\r\n self.addCum = function () {\r\n if (self.cumAdded != null) {\r\n var duplicated = false;\r\n var cum = {\r\n cum: self.cumAdded,\r\n inUse: false,\r\n principal: false,\r\n isDeleted: false,\r\n maximumPrice: 0,\r\n itemId: $stateParams.itemId,\r\n ItemCode: self.item.code\r\n }\r\n\r\n duplicated = self.cums.some(function (x) { return x.cum == self.cumAdded.trim() && x.isDeleted == 0});\r\n\r\n if (!duplicated) {\r\n self.cums.push(cum);\r\n }\r\n else {\r\n swal('Error', 'Ya existe el cum ingresado.', 'error');\r\n }\r\n }\r\n else {\r\n swal('Error', 'Ingrese un Cum.', 'error');\r\n }\r\n }\r\n\r\n self.onBlur = function () {\r\n \r\n if (self.item.ean && self.item.ean.length > 4) {\r\n self.loadingVerifyItemEan = true;\r\n self.isVerify = false;\r\n homeService.items.isItemEanRepeat(self.item.ean)\r\n .then(function (result) {\r\n self.loadingVerifyItemEan = false;\r\n self.resultsVerifyEan = result;\r\n self.isVerify = true;\r\n result ? self.item.code = '' : self.item.code = self.item.ean;\r\n })\r\n }\r\n }\r\n\r\n self.loadSubcategories = function () {\r\n homeService.items.getSubcategories(self.selectedCategory.id)\r\n .then(function (subcategories) {\r\n self.subcategories = subcategories;\r\n });\r\n }\r\n\r\n self.addUnitOfMeasure = function () {\r\n self.item.unitOfMeasures.push(generateUnitOfMeasure());\r\n //self.unitOfMeasureSelected = null;\r\n }\r\n\r\n self.deleteUnitOfMeasure = function (uom, index) {\r\n self.item.unitOfMeasures.splice(index, 1)\r\n }\r\n\r\n self.togleBaseUnitOfMeasure = function (uom) {\r\n angular.forEach(self.item.unitOfMeasures, function (_uom) {\r\n _uom.isBaseUnitOfMeasure = false;\r\n })\r\n\r\n uom.isBaseUnitOfMeasure = true;\r\n }\r\n \r\n self.uploadFiles = function (files, front, errFiles) {\r\n if (errFiles && errFiles.length > 0) {\r\n var allowedSize = null;\r\n var largeFiles = '';\r\n\r\n angular.forEach(errFiles, function (file) {\r\n if (file.$error == 'maxSize') {\r\n if (allowedSize == null)\r\n allowedSize = file.$errorParam;\r\n if (largeFiles != '')\r\n largeFiles += ', ';\r\n largeFiles += ian.format(' {0} ({1}KB)', file.name, (file.size / 1024).toFixed(0));\r\n }\r\n });\r\n\r\n swal('Peso de imagenes excedido', ian.format('El peso maximo para cada imagen es {0}. Las siguientes imagenes exceden el peso permitido: {1}', allowedSize, largeFiles), 'error');\r\n }\r\n else if (files && files.length) {\r\n var filesToBig = '';\r\n for (i = 0; i < files.length; i++) {\r\n if (files[i].size > 153600) {\r\n filesToBig = 'El peso de cada imagen no debe superar los 150KB';\r\n break;\r\n };\r\n }\r\n\r\n if (filesToBig != '') {\r\n swal('Peso de imagenes excedido', filesToBig, 'error');\r\n }\r\n else {\r\n\r\n self.isBusy = true;\r\n var photoName = self.item.ean + front + self.unitOfMeasureSelected.code + Math.random();\r\n\r\n var url = ian.urlCombine(serverService.getApiUrl(), '/admin/items/uploadFile/' + photoName);\r\n Upload.upload({\r\n url: url,\r\n data: { files: files }\r\n }).then(function (response) {\r\n var uploadResults = response.data;\r\n processResults(uploadResults, front);\r\n if (!anyError(uploadResults))\r\n self.filesUploaded = true;\r\n });\r\n }\r\n }\r\n }\r\n\r\n function processResults(uploadResults, front) {\r\n self.isBusy = false;\r\n if (uploadResults.length > 0) {\r\n loadResults(uploadResults, front);\r\n }\r\n if (anyError(uploadResults)) {\r\n self.error = true;\r\n }\r\n else {\r\n self.filesUploaded = true;\r\n self.error = false;\r\n self.files = [];\r\n }\r\n }\r\n function anyError(uploadResults) {\r\n var error = false;\r\n for (var i = 0; i < uploadResults.length; i++) {\r\n if (uploadResults[i].severity === 3)\r\n error = true;\r\n }\r\n\r\n return error;\r\n }\r\n\r\n function loadResults(results, front) {\r\n if (front == 'Front') self.unitOfMeasureSelected.imagePlanogramFront = results[0]; \r\n\r\n if (front == 'Left') self.unitOfMeasureSelected.imagePlanogramLeft = results[0]; \r\n\r\n if (front == 'Top') self.unitOfMeasureSelected.imagePlanogramTop = results[0]; \r\n \r\n }\r\n\r\n\r\n\r\n //Dialog upload photos\r\n \r\n self.showUploadPhotosModal = function (unitOfMeasure) {\r\n self.unitOfMeasureSelected = unitOfMeasure;\r\n //self.unitOfMeasureSelected.imagePlanogramFront == null;\r\n ngDialog.open({\r\n template: 'modal-uploadPhotos',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-width-500',\r\n scope: $scope\r\n });\r\n }\r\n\r\n self.okLoadPhoto = function () {\r\n ngDialog.close();\r\n }\r\n\r\n //button Collapsed\r\n $scope.isNavCollapsed = true;\r\n $scope.isCollapsed = false;\r\n $scope.isCollapsedHorizontal = false;\r\n\r\n $scope.isBasicInformationCollapsed = false;\r\n $scope.isGeneralInformationCollapsed = false;\r\n $scope.isMeasurementsCollapsed = false;\r\n $scope.isCumInformationCollapsed = false;\r\n \r\n\r\n //Load Data\r\n function loadItem() {\r\n self.isLoading = true;\r\n\r\n homeService.items.getItem($stateParams.itemId)\r\n .then(function (item) {\r\n self.item = item;\r\n self.selectedTypeId = self.item.type.id;\r\n angular.forEach(self.item.unitOfMeasures, function (_uom) {\r\n self.item.baseUnitOfMeasureId == _uom.id ? _uom.isBaseUnitOfMeasure = true : _uom.isBaseUnitOfMeasure = false;\r\n })\r\n \r\n self.isLoading = false;\r\n });\r\n }\r\n\r\n function loadCategories() {\r\n homeService.items.getCategories()\r\n .then(function (categories) {\r\n self.categories = categories;\r\n });\r\n }\r\n function loadTypes() {\r\n homeService.items.getTypes()\r\n .then(function (types) {\r\n self.types = types;\r\n });\r\n }\r\n function loadCums() {\r\n if ($stateParams.itemId != \"0\") {\r\n homeService.items.getCums($stateParams.itemId)\r\n .then(function (cums) {\r\n self.cums = cums;\r\n });\r\n }\r\n }\r\n\r\n $scope.$on('$stateChangeStart', function (event) {\r\n if (self.stateChange) {\r\n var answer = confirm(translations.AlertWillLoseChanges)\r\n if (!answer) {\r\n event.preventDefault();\r\n }\r\n }\r\n });\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n $translate([\"ValidationSwalTitle\", \"ValidationSwalSubtitle\", \"SaveItemSwall\", \"SaveItemSwallSubtitle\", \"Cancel\", \"ContinueSwal\", \"ItemSavedProperly\", \"AlertWillLoseChanges\", \"ValidationSwalUomRepeted\", \"ErrorTitleSwal\" ])\r\n .then(function (all) {\r\n translations = all;\r\n });\r\n\r\n loadCategories();\r\n loadTypes();\r\n if (self.isLaRebaja) {\r\n loadCums();\r\n }\r\n\r\n if ($stateParams.itemId != 0) {\r\n loadItem();\r\n }\r\n }\r\n\r\n init();\r\n }]);\r\n\r\n\r\n\r\n\r\n","angular.module(\"prisma\")\r\n .controller(\"InterfaceCtrl\", function ($scope, adminService, $timeout, $window, $stateParams, $filter, $http) {\r\n var self = this;\r\n\r\n self.isLoading = true;\r\n self.isLoadingDetails = false;\r\n self.isLoadingDetailSummary = false;\r\n self.interfaces = [];\r\n self.detailSummary = [];\r\n self.details = [];\r\n\r\n self.filter = {\r\n batchIdentifier: '',\r\n importer: '',\r\n step: ''\r\n }\r\n\r\n self.search = '';\r\n\r\n self.clearFilter = function () {\r\n self.filter = {\r\n batchIdentifier: '',\r\n importer: '',\r\n step: ''\r\n }\r\n\r\n }\r\n\r\n self.downloadFile = function (importerType, fileName) {\r\n\r\n var url = '/api/admin/interfaces/getFile/' + importerType + '/' + fileName;\r\n\r\n //$window.open(url, \"_blank\");\r\n\r\n $http.get(url).success(function (data, status, headers) {\r\n ////PopUps.hideLoading()\r\n //var headers = result.headers()\r\n //var blob = new Blob([result.data], { type: headers['content-type'] })\r\n //var windowUrl = (window.URL || window.webkitURL)\r\n //var downloadUrl = windowUrl.createObjectURL(blob)\r\n //var anchor = document.createElement(\"a\")\r\n //anchor.href = downloadUrl\r\n //var fileNamePattern = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/\r\n //anchor.download = fileNamePattern.exec(headers['content-disposition'])[1]\r\n //document.body.appendChild(anchor)\r\n //anchor.click()\r\n //windowUrl.revokeObjectURL(blob)\r\n\r\n headers = headers();\r\n\r\n var filename = fileName;\r\n var contentType = headers['content-type'];\r\n\r\n var linkElement = document.createElement('a');\r\n try {\r\n var blob = new Blob([data], { type: contentType });\r\n var url = window.URL.createObjectURL(blob);\r\n\r\n linkElement.setAttribute('href', url);\r\n linkElement.setAttribute(\"download\", filename);\r\n\r\n var clickEvent = new MouseEvent(\"click\", {\r\n \"view\": window,\r\n \"bubbles\": true,\r\n \"cancelable\": false\r\n });\r\n linkElement.dispatchEvent(clickEvent);\r\n } catch (ex) {\r\n console.log(ex);\r\n }\r\n })\r\n }\r\n\r\n self.dateChanged = function () {\r\n var date = self.selectedDate;\r\n\r\n self.isLoading = true;\r\n adminService.interfaces.getByDate(date).then(function (interfaces) {\r\n self.interfaces = interfaces;\r\n self.detailSummary = [];\r\n self.details = [];\r\n self.isLoading = false;\r\n });\r\n }\r\n\r\n self.back = function () {\r\n self.details = [];\r\n self.detailSummary = [];\r\n }\r\n\r\n self.setFilterInterface = function (interfaceName) {\r\n self.filter.importer = interfaceName;\r\n self.txtFilterInterface = interfaceName;\r\n }\r\n\r\n self.setFilterStatus = function (status) {\r\n self.search = status;\r\n self.txtFilterStatus = status;\r\n }\r\n\r\n self.setFilterStep = function (step) {\r\n self.filter.step = step;\r\n self.txtFilterStep = step;\r\n }\r\n\r\n self.getFilteredDuration = function () {\r\n if (self.interfaces) {\r\n var list = $filter('filter')(self.interfaces, self.search);\r\n list = $filter('filter')(list, self.filter.importer);\r\n list = $filter('filter')(list, self.filter.step);\r\n var total = 0;\r\n angular.forEach(list, function (item) {\r\n total += item.duration;\r\n });\r\n\r\n return (total / 60).toFixed(2);\r\n }\r\n\r\n return '';\r\n }\r\n\r\n self.getIcon = function (interfaceDto) {\r\n if (!interfaceDto.success)\r\n return 'fa-times';\r\n\r\n if (interfaceDto.message.indexOf('WARNING') != -1)\r\n return 'fa-exclamation-triangle';\r\n\r\n return 'fa-check';\r\n }\r\n\r\n self.getColor = function (interfaceDto) {\r\n if (!interfaceDto.success)\r\n return 'text-danger';\r\n\r\n if (interfaceDto.message.indexOf('WARNING') != -1)\r\n return 'text-warning';\r\n\r\n return 'text-success';\r\n }\r\n\r\n\r\n self.getIconDetail = function (detail) {\r\n if (detail.severity == 'Information')\r\n return 'fa-info-circle';\r\n\r\n if (detail.severity == 'Warning')\r\n return 'fa-exclamation-triangle';\r\n\r\n if (detail.severity == 'Error')\r\n return 'fa-times';\r\n\r\n }\r\n\r\n self.getColorDetail = function (detail) {\r\n if (detail.severity == 'Information')\r\n return 'text-success';\r\n\r\n if (detail.severity == 'Warning')\r\n return 'text-warning';\r\n\r\n if (detail.severity == 'Error')\r\n return 'text-danger';\r\n }\r\n\r\n self.selectInterface = function (interfaceDto) {\r\n\r\n self.isLoadingDetailSummary = true;\r\n adminService.interfaces.getDetailSummary(interfaceDto.id).then(function (detailSummary) {\r\n self.detailSummary = detailSummary;\r\n self.isLoadingDetailSummary = false;\r\n });\r\n }\r\n\r\n\r\n self.selectDetailSummary = function (InterfaceLogId) {\r\n \r\n self.isLoadingDetails = true;\r\n adminService.interfaces.getDetails(InterfaceLogId).then(function (details) {\r\n self.details = details;\r\n self.isLoadingDetails = false;\r\n });\r\n }\r\n\r\n function init() {\r\n\r\n self.isLoading = true;\r\n if ($stateParams.batchIdentifier) {\r\n adminService.interfaces.getByBatch($stateParams.batchIdentifier).then(function (interfaces) {\r\n self.interfaces = interfaces;\r\n self.selectedDate = new Date(interfaces[0].importedDate);\r\n self.isLoading = false;\r\n });\r\n }\r\n else {\r\n adminService.interfaces.getLast().then(function (interfaces) {\r\n self.interfaces = interfaces;\r\n self.isLoading = false;\r\n });\r\n }\r\n\r\n \r\n\r\n }\r\n\r\n init();\r\n });","\r\nangular.module(\"prisma\")\r\n .controller(\"ImporterCtrl\", function ($scope, $log, $rootScope, $state, authService, adminService, serverService, priceService, Upload, ngDialog, $translate) {\r\n var self = this;\r\n\r\n self.importerType = null;\r\n self.importerName = null;\r\n self.importerServiceName = null;\r\n self.currentStep = 1;\r\n self.gridVisible = false;\r\n self.filesUploaded = false;\r\n self.isBusy = false;\r\n self.isBusy2 = false;\r\n self.isBusy3 = false;\r\n self.isBusy4 = false;\r\n self.error = false;\r\n self.files = null;\r\n self.gridOptions = null;\r\n self.showCategorySwal = false;\r\n self.allCategories = [];\r\n self.allSubCategories = [];\r\n self.mustShowCategorySwal = false;\r\n var columnDefs = null;\r\n self.gridOptions = null;\r\n\r\n self.finished1 = false;\r\n self.finished2 = false;\r\n self.finished3 = false;\r\n self.finished4 = false;\r\n\r\n self.runStep = function (args) {\r\n self.gridVisible = false;\r\n switch (self.currentStep) {\r\n case 1: { self.uploadFiles(); break; }\r\n case 2: { self.processFiles(); break; }\r\n case 3: { self.validateDataQuality(); break; }\r\n case 4: { self.importData(); break; }\r\n }\r\n }\r\n\r\n self.uploadFiles = function () {\r\n var files = self.files;\r\n if (files && files.length) {\r\n self.isBusy = true;\r\n var url = ian.urlCombine(serverService.getApiUrl(), '/admin/importer/uploadFile', authService.authentication.companyId, self.importerType);\r\n Upload.upload({\r\n url: url,\r\n data: { files: files }\r\n }).then(function (response) {\r\n var importerResults = response.data;\r\n processImporterResults(importerResults);\r\n if (!anyError(importerResults))\r\n self.filesUploaded = true;\r\n });\r\n }\r\n }\r\n\r\n self.processFiles = function () {\r\n self.isBusy2 = true;\r\n adminService.importers.processFiles(authService.authentication.companyId, self.importerType).then(function (importerResults) {\r\n processImporterResults(importerResults);\r\n });\r\n }\r\n\r\n self.validateDataQuality = function () {\r\n self.isBusy3 = true;\r\n adminService.importers.validateDataQuality(authService.authentication.companyId, self.importerType).then(function (importerResults) {\r\n processImporterResults(importerResults);\r\n if (ngDialog != null)\r\n ngDialog.close();\r\n });\r\n }\r\n\r\n self.importData = function () {\r\n self.isBusy4 = true;\r\n if (self.importerType == \"PriceSurveys\") {\r\n swal(\"Subiendo Reporte\", \"Se está terminando de importar el relevamiento y generar las sugerencias, cuando finalice recibirá un Email notificandolo.\", \"success\")\r\n self.isBusy4 = false;\r\n self.finished4 = true;\r\n self.currentStep = 1;\r\n }\r\n if (self.importerType == \"MarketData\") {\r\n swal(\"Subiendo Reporte\", \"Se está terminando de importar la información, cuando finalice recibirá un Email notificandolo.\", \"success\")\r\n self.isBusy4 = false;\r\n self.finished4 = true;\r\n self.currentStep = 1;\r\n }\r\n if (self.importerType == \"StoreClusterCategory\") {\r\n\r\n swal(\"Reporte subido correctamente\", \"Estos cambios se verán reflejados mañana luego de que Prisma actualice los datos.\", \"success\")\r\n self.isBusy4 = false;\r\n self.finished4 = true;\r\n self.currentStep = 1;\r\n }\r\n\r\n if (self.importerType == \"CostsByProvider\" || self.importerType == \"CostsByVendors\" ) {\r\n swal(\"Subiendo Reporte\", \"Se está terminando de importar el archivo y generar las sugerencias, cuando finalice recibirá un Email notificandolo.\", \"success\")\r\n self.isBusy4 = false;\r\n self.finished4 = true;\r\n self.currentStep = 1;\r\n }\r\n\r\n adminService.importers.importData(authService.authentication.companyId, self.importerType).then(function (importerResults) {\r\n processImporterResults(importerResults);\r\n //if (self.importerType == \"PriceSurveys\") //Se está haciendo en el paso 4 automaticamente, al hacerlo aca si no vuelve a la pantalla, no se generan las sugerencias. \r\n // priceService.suggestion.generateSuggestionsForAllCategories();\r\n if (self.importerType == \"CostsByProvider\")\r\n window.open(importerResults[0].source);\r\n });\r\n\r\n }\r\n\r\n self.finish = function () {\r\n\r\n if (self.importerType == \"OxxoCosts\")\r\n $state.go('prices.costs');\r\n\r\n\r\n self.currentStep = 1;\r\n loadResults([]);\r\n self.files = null;\r\n self.filesUploaded = false;\r\n self.finished1 = false;\r\n self.finished2 = false;\r\n self.finished3 = false;\r\n self.finished4 = false;\r\n }\r\n\r\n self.exportToExcel = function () {\r\n var params = {\r\n skipHeader: false,\r\n skipFooters: false,\r\n skipGroups: false,\r\n allColumns: true,\r\n onlySelected: false,\r\n suppressQuotes: false,\r\n fileName: 'Results' + '_' + self.importerName + '.xls',\r\n columnSeparator: ','\r\n };\r\n\r\n self.gridOptions.api.exportDataAsCsv(params);\r\n }\r\n\r\n self.showNextStep = function () {\r\n if (self.currentStep > 0 && self.currentStep < 4) {\r\n self.currentStep++;\r\n loadResults([]);\r\n }\r\n }\r\n\r\n self.addCategoryConfirm = function () {\r\n swal({\r\n title: translations.NoCategoriesFoundForAllSKUs,\r\n text: translations.YouWantToAddThem,\r\n type: \"warning\",\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true\r\n },\r\n function (isConfirm) {\r\n if (isConfirm) {\r\n swal.close();\r\n openCategoriesDialog();\r\n }\r\n });\r\n }\r\n\r\n\r\n function openCategoriesDialog() {\r\n var newScope = $scope.$new();\r\n newScope.showLoader = true;\r\n\r\n adminService.categories.getCategories().then(function (allCategories) {\r\n self.allCategories = allCategories;\r\n\r\n\r\n adminService.categories.getSubCategories().then(function (allSubCategories) {\r\n self.allSubCategories = allSubCategories;\r\n adminService.items.getNoCategoryItems()\r\n .then(function (items) {\r\n newScope.showLoader = false;\r\n newScope.items = items;\r\n newScope.allCategories = angular.copy(self.allCategories);\r\n newScope.allSubCategories = angular.copy(self.allSubCategories);\r\n newScope.filteredSubcategories = angular.copy(self.allSubCategories);\r\n newScope.selectedCategory = null;\r\n newScope.selectedSubCategory = null;\r\n newScope.saving = false;\r\n newScope.filterText = '';\r\n\r\n newScope.filterSubCategories = function (category) {\r\n if (category != null) {\r\n newScope.filteredSubcategories = [];\r\n angular.forEach(newScope.allSubCategories, function (sc) {\r\n if (sc.parentId == category.id)\r\n newScope.filteredSubcategories.push(angular.copy(sc));\r\n });\r\n }\r\n }\r\n\r\n newScope.saveCategories = function () {\r\n\r\n if (this.selectedSubCategory != null) {\r\n newScope.saving = true;\r\n var itemEansToAplyCategory = []\r\n\r\n angular.forEach(newScope.items, function (i) {\r\n if (i.selected)\r\n itemEansToAplyCategory.push(angular.copy(i.ean));\r\n });\r\n\r\n adminService.items.saveItemCategories(this.selectedSubCategory.categoryId, this.selectedSubCategory.id, itemEansToAplyCategory)\r\n .then(function (pendingItemsWithNoCategory) {\r\n //Si no queda ninguno vuelvo a correr el paso 3 y cierro el dialog.\r\n if (pendingItemsWithNoCategory.length == 0) {\r\n swal(translations.ValidationWillRunAgain, \"\", \"success\");\r\n self.showCategorySwal = false;\r\n self.validateDataQuality();\r\n }\r\n else {\r\n newScope.items = pendingItemsWithNoCategory;\r\n }\r\n newScope.saving = false;\r\n },\r\n function () {\r\n newScope.saving = false;\r\n });\r\n }\r\n }\r\n\r\n newScope.selectFilteredItems = function (filteredItems) {\r\n angular.forEach(filteredItems, function (fi) {\r\n fi.selected = true;\r\n });\r\n }\r\n });\r\n });\r\n });\r\n\r\n ngDialog.open({\r\n template: 'categoriesDialog',\r\n className: 'ngdialog-theme-default ngdialog-theme-custom custom-height-500 custom-width-1124 categoriesDialog',\r\n backdrop: 'static',\r\n keyboard: false,\r\n closeByDocument: false,\r\n scope: newScope\r\n });\r\n }\r\n\r\n function loadResults(results) {\r\n self.gridOptions.api.setRowData(results);\r\n self.gridOptions.api.refreshView();\r\n\r\n self.gridVisible = results.length > 0 ? true : false;\r\n }\r\n\r\n function processImporterResults(importerResults) {\r\n self.isBusy = false;\r\n self.isBusy2 = false;\r\n self.isBusy3 = false;\r\n self.isBusy4 = false;\r\n\r\n self[\"finished\" + self.currentStep] = true;\r\n\r\n if (importerResults.length > 0) {\r\n //self.gridOptions.groupDefaultExpanded = importerResults.length < 10 ? 1 : 0;\r\n loadResults(importerResults);\r\n }\r\n if (anyError(importerResults)) {\r\n self.error = true;\r\n }\r\n else\r\n self.error = false;\r\n }\r\n\r\n function anyError(importerResults) {\r\n var error = false;\r\n for (var i = 0; i < importerResults.length; i++) {\r\n if (importerResults[i].severity === 'Error')\r\n error = true;\r\n }\r\n\r\n return error;\r\n }\r\n\r\n function setColumnDefinitions() {\r\n columnDefs = [\r\n {\r\n headerName: translations.Severity,\r\n width: 100,\r\n field: 'severity',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n rowGroupIndex: 0,\r\n cellRenderer: function (params) {\r\n var severityName = '';\r\n switch (params.value) {\r\n case 'Information': { severityName = ' Info'; break; }\r\n case 'Error': { severityName = ' Error'; break; }\r\n case 'Warning':\r\n {\r\n if (params.node.data != null && params.node.data.phase == 'ValidateDataQuality' && params.node.data.category == 'VDQ_CategoryNotFound' && !self.showCategorySwal && self.mustShowCategorySwal) {\r\n self.addCategoryConfirm();\r\n self.showCategorySwal = true;\r\n }\r\n severityName = ' Warn'; break;\r\n }\r\n }\r\n return severityName;\r\n }\r\n },\r\n {\r\n headerName: translations.Phase,\r\n width: 100,\r\n field: 'phase',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false\r\n },\r\n {\r\n headerName: translations.File,\r\n width: 50,\r\n field: 'row',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n {\r\n headerName: translations.Category,\r\n width: 200,\r\n rowGroupIndex: 1,\r\n field: 'category',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n {\r\n headerName: translations.Description,\r\n width: 500,\r\n field: 'description',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n },\r\n {\r\n headerName: translations.FileName,\r\n width: 500,\r\n field: 'source',\r\n suppressMenu: true,\r\n suppressSorting: true,\r\n filter: false,\r\n }\r\n ]\r\n }\r\n\r\n function setGridOptions() {\r\n\r\n self.gridOptions = {\r\n columnDefs: columnDefs,\r\n enableColResize: true,\r\n enableSorting: true,\r\n enableFilter: false,\r\n rowHeight: 35,\r\n suppressCellSelection: true,\r\n groupUseEntireRow: true,\r\n groupSuppressAutoColumn: false,\r\n groupDefaultExpanded: 0,\r\n icons: {\r\n columnRemoveFromGroup: '',\r\n filter: '',\r\n sortAscending: '',\r\n sortDescending: '',\r\n groupExpanded: '',\r\n groupContracted: '',\r\n columnGroupOpened: '',\r\n columnGroupClosed: ''\r\n },\r\n angularCompileRows: true,\r\n }\r\n }\r\n\r\n self.clearAllSensitivities = function () {\r\n swal({\r\n title: translations.WarningM,\r\n text: translations.AllSensitivityRecordsWillBeDeleted,\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.ContinueSwal,\r\n cancelButtonText: translations.CancelSwal,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: false,\r\n closeOnCancel: true,\r\n imageUrl: \"../../../assets/images/icons/icon_warning.png\",\r\n }, function (isConfirm) {\r\n if (isConfirm) {\r\n adminService.importers.removeAllSensitivities()\r\n .then(function (ok) {\r\n swal(translations.Success, translations.NoArticleInAnyAreaHasSensitivity, \"success\");\r\n });\r\n }\r\n });\r\n }\r\n\r\n // Segun el importerType consulta en base de datos si existen datos pendientes previamente cargados\r\n // Si es el caso presenta un popup anunciando lo mismo y habilita el procesp para terminar de agregar los datos especificados.\r\n function hasPendingData(importerType) {\r\n const methodName = 'ImporterCtrl::hasPendingData';\r\n //$log.debug(`${methodName} importerType %o`, importerType);\r\n\r\n var fileName = \"\";\r\n\r\n // Consulta en base de datos si existe un archivo precargado y no finalizado segun su importerType.\r\n adminService.importers.getLastUploadedFile(importerType).then(function (lastFileName) {\r\n //$log.debug(`${methodName} (then) lastFileName`, lastFileName);\r\n\r\n fileName = lastFileName;\r\n\r\n // Evalua si el resultado de la busqueda posee contenido, de ser asi renderiza el popup con el warning.\r\n if (fileName !== null && fileName != \"\") {\r\n const pendingFilesAlert = function () {\r\n swal({\r\n title: translations.WarningM,\r\n text: translations.ItHasPendingFiles,\r\n showCancelButton: true,\r\n confirmButtonColor: \"#1AB394\",\r\n confirmButtonText: translations.Accept,\r\n cancelButtonText: translations.Cancel,\r\n showLoaderOnConfirm: true,\r\n closeOnConfirm: true,\r\n closeOnCancel: true,\r\n imageUrl: \"../../../assets/images/icons/icon_warning.png\",\r\n }, function (isConfirm) {\r\n if (isConfirm) {\r\n //$log.debug(`${methodName} (confirm) %o`, isConfirm);\r\n\r\n // Setea el currentstep al nivel 3.\r\n self.currentStep = 3;\r\n\r\n // Ejecuta el proceso que corre los steps.\r\n self.runStep();\r\n }\r\n });\r\n }\r\n\r\n pendingFilesAlert();\r\n }\r\n })\r\n .catch(function (ex) {\r\n //$log.debug(`${methodName} (catch) %o`, ex);\r\n });\r\n }\r\n\r\n var translations = null;\r\n\r\n function init() {\r\n\r\n $translate([\"StepOneOp1Importers\", \"StepOneOp2Importers\", \"IntroductionToTheStepsImporters\", \"RemainingStepsImporters\", \"NoCategoriesFoundForAllSKUs\", \"YouWantToAddThem\"\r\n , \"ContinueSwal\", \"CancelSwal\", \"ValidationWillRunAgain\", \"Severity\", \"Phase\", \"File\", \"Category\", \"Description\", \"FileName\", \"WarningM\", \"AllSensitivityRecordsWillBeDeleted\", \"Success\"\r\n , \"NoArticleInAnyAreaHasSensitivity\", \"ItHasPendingFiles\", \"Accept\", \"TheImporterTypeParameterHasNotBeenReceived\", \"MarketData\", \"CompetitivePricesSurvey\", \"Spaces\"\r\n , \"NewPrices\", \"MassiveLoadOfCosts\", \"Sensitivity\", \"BulkLoadingOfLabels\", \"ManualLiquidations\", \"LiquidationsByMaturity\", \"CancelLiquidations\", \"UpdateFieldsOfMeasurementUnits\"\r\n , \"CostsByProvider\", \"CostsByVendors\"])\r\n .then(function (all) {\r\n translations = all;\r\n\r\n var stepOne = $state.params.importerType == \"ItemSensitivityPriceLists\" ?\r\n translations.StepOneOp1Importers\r\n : translations.StepOneOp2Importers;\r\n\r\n var steps = translations.IntroductionToTheStepsImporters + stepOne + translations.RemainingStepsImporters;\r\n\r\n $('#steps').html(steps);\r\n\r\n //defino titulo\r\n switch (self.importerType) {\r\n case \"MarketData\": { self.importerName = translations.MarketData; self.mustShowCategorySwal = true; break; }\r\n case \"PriceSurveys\": self.importerName = translations.CompetitivePricesSurvey; break;\r\n case \"Spaces\": self.importerName = translations.Spaces; break;\r\n case \"NewPrices\": self.importerName = translations.NewPrices; break;\r\n case \"OxxoCosts\": self.importerName = translations.MassiveLoadOfCosts; break;\r\n case \"ItemSensitivityPriceLists\": self.importerName = translations.Sensitivity; break;\r\n case \"ItemTags\": self.importerName = translations.BulkLoadingOfLabels; break;\r\n case \"HandMadeMarkdowns\": self.importerName = translations.ManualLiquidations; break;\r\n case \"ExpirationMarkdowns\": self.importerName = translations.LiquidationsByMaturity; break;\r\n case \"UndoMarkdowns\": self.importerName = translations.CancelLiquidations; break;\r\n case \"EditUnitOfMeasures\": self.importerName = translations.UpdateFieldsOfMeasurementUnits; break;\r\n case \"Competitors\": self.importerName = translations.Competitors; break;\r\n case \"CostsByProvider\": self.importerName = translations.CostsByProvider; break;\r\n case \"CostsByVendors\": self.importerName = translations.CostsByVendors; break;\r\n case \"RegulatedPrices\": self.importerName = translations.RegulatedPrices; break;\r\n }\r\n\r\n setColumnDefinitions();\r\n\r\n self.gridOptions.api.setColumnDefs(columnDefs);\r\n\r\n });\r\n\r\n $log.debug('ImporterCtrl::init')\r\n\r\n //validaciones\r\n if (!$state.params.importerType) {\r\n alert(translations.TheImporterTypeParameterHasNotBeenReceived);\r\n $rootScope.goBack();\r\n }\r\n\r\n //defino el tipo de importador\r\n self.importerType = $state.params.importerType;\r\n\r\n //inicializo la grilla\r\n setGridOptions();\r\n\r\n // Valida si existen datos previamente cargados por completar.\r\n hasPendingData(self.importerType);\r\n }\r\n\r\n init();\r\n });","\"use strict\";\r\n\r\nangular.module(\"prisma\")\r\n .controller(\"MainCtrl\", function ($translate, $state, $rootScope, $scope, $location, $window, authService, adminService, companyJson, queueService) {\r\n var self = this;\r\n\r\n self.points = 1500;\r\n self.prevPoints = 0;\r\n self.search = \"\";\r\n self.notifications = [];\r\n self.nav = companyJson.Navigation;\r\n\r\n\r\n self.isActive = function (name) {\r\n var active = $state.includes(name);\r\n return active;\r\n }\r\n\r\n self.changeLanguage = function (langKey) {\r\n $translate.use(langKey);\r\n }\r\n\r\n self.goBack = function () {\r\n $state.go($rootScope.prevState);\r\n }\r\n\r\n self.canGoBack = function () {\r\n if ($rootScope.prevState && !$rootScope.prevState.abstract) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n self.logout = function () {\r\n authService.logOut();\r\n $state.go(\"login\");\r\n }\r\n\r\n self.navigateToUrl = function (url) {\r\n $location.path(url);\r\n }\r\n\r\n self.username = function () {\r\n return authService.authentication.firstname + \" \" + authService.authentication.lastname;\r\n }\r\n\r\n self.role = function () {\r\n return authService.authentication.roles ? authService.authentication.roles[0] : '';\r\n }\r\n\r\n self.hasPermission = function (permission) {\r\n return authService.hasPermission(permission);\r\n }\r\n\r\n self.getTaskIcon = function (task) {\r\n\r\n var icon = 'fa-tasks';\r\n switch (task.statusString) {\r\n case 'Queued': icon = 'fa-clock-o'; break;\r\n case 'Failed': icon = 'fa-exclamation text-danger'; break;\r\n case 'Succeeded': icon = 'fa-check-circle text-green'; break;\r\n case 'InProgress': icon = 'fa-circle-o-notch fa-spin fa-fw'; break;\r\n }\r\n\r\n return icon;\r\n }\r\n\r\n\r\n self.pendingTasksCount = function () {\r\n return queueService.queuedTasks.pendingTasksCount();\r\n }\r\n\r\n self.createDummyTask = function () {\r\n queueService.queuedTasks.createDummyTask();\r\n }\r\n\r\n self.getQueuedTasks = function () {\r\n return queueService.queuedTasks.queue;\r\n }\r\n\r\n $rootScope.$on('pointsAdded', function (event, args) {\r\n self.prevPoints = self.points;\r\n $scope.$apply();\r\n\r\n self.points += parseInt(args.points);\r\n\r\n });\r\n\r\n\r\n function init() {\r\n //get user notifications\r\n\r\n if (authService.authentication.isAuth) {\r\n adminService.notifications.getTop5().then(function (notifications) {\r\n self.notifications = notifications;\r\n });\r\n\r\n queueService.queuedTasks.getTop5().then(function () {\r\n self.queuedTasks = queueService.queuedTasks.queue;\r\n }.bind(self));\r\n }\r\n \r\n\r\n }\r\n\r\n\r\n init();\r\n });","angular.module(\"prisma\")\r\n .controller(\"LoginCtrl\", function ($scope, $location, authService, ngAuthSettings, $rootScope, $state, $http, companyJson) {\r\n\r\n var self = this;\r\n\r\n $scope.welcomeMessage = \"\";\r\n $scope.welcomeMessage = companyJson.LoginWelcomeMessage;\r\n $scope.security = angular.extend({}, { Local: true }, companyJson.Security);\r\n\r\n $scope.userRole = \"\";\r\n $scope.message = \"\";\r\n $scope.loginData = {\r\n userName: \"\",\r\n password: \"\",\r\n useRefreshTokens: false\r\n };\r\n self.errorLoginMsj = \"\";\r\n\r\n self.showLogo = function () {\r\n if (location.hostname === \"localhost\" || location.hostname === \"127.0.0.1\")\r\n return false;\r\n return true;\r\n }\r\n\r\n $scope.login = function () {\r\n\r\n authService.login($scope.loginData).then(function (authentication) {\r\n $scope.authentication = authentication;\r\n authService.getUserInfo().then(function () {\r\n\r\n //redirect donde corresponda\r\n if (authentication.redirectUrl) {\r\n\r\n $location.path(authentication.redirectUrl);\r\n }\r\n //else if (authService.hasPermission('store_admin') && $scope.loginData.userName != 'root@root.com') {\r\n // $state.go('spaces.viewLayout', { layoutId: 1 });\r\n //}\r\n\r\n else if (authService.hasPermission('promotion_isStore') && authentication.userName != 'root@root.com') {//perfil de tienda no debe ir al dashboard\r\n $state.go('promotions.comunication', { taskId: 0 });\r\n }\r\n else {\r\n $state.go('home.dashboard');\r\n }\r\n\r\n });\r\n },\r\n function (err) {\r\n if (err) {\r\n $scope.message = err.exception ? err.message : err.error_description;\r\n self.errorLoginMsj = $scope.message;\r\n }\r\n else {\r\n $scope.message = \"Usuario o Contrase�a incorrectos\";\r\n self.errorLoginMsj = \"Usuario o Password incorrectos\";\r\n }\r\n });\r\n };\r\n\r\n $scope.logout = function () {\r\n\r\n authService.logOut()\r\n $state.go('login');\r\n };\r\n\r\n $scope.authExternalProvider = function (provider) {\r\n\r\n var redirectUri = location.protocol + '//' + location.host + '/authcomplete.html';\r\n\r\n var externalProviderUrl = ngAuthSettings.apiServiceBaseUri + \"Account/ExternalLogin?provider=\" + provider\r\n + \"&response_type=token&client_id=\" + ngAuthSettings.clientId\r\n + \"&redirect_uri=\" + redirectUri;\r\n window.$windowScope = $scope;\r\n\r\n var oauthWindow = window.open(externalProviderUrl, \"Authenticate Account\", \"location=0,status=0,width=600,height=750\");\r\n };\r\n\r\n $scope.authCompletedCB = function (fragment) {\r\n\r\n $scope.$apply(function () {\r\n\r\n if (fragment.haslocalaccount == 'False') {\r\n\r\n authService.logOut();\r\n\r\n authService.externalAuthData = {\r\n provider: fragment.provider,\r\n userName: fragment.external_user_name,\r\n externalAccessToken: fragment.external_access_token\r\n };\r\n\r\n $location.path('/associate');\r\n\r\n }\r\n else {\r\n //Obtain access token and redirect to orders\r\n var externalData = { provider: fragment.provider, externalAccessToken: fragment.external_access_token };\r\n authService.obtainAccessToken(externalData).then(function (response) {\r\n\r\n $location.path('/orders');\r\n\r\n },\r\n function (err) {\r\n $scope.message = err.error_description;\r\n });\r\n }\r\n\r\n });\r\n }\r\n\r\n if (authService.authentication.isAuth) {\r\n if (authService.hasPermission('promotion_isStore') && authService.authentication.userName != 'root@root.com') {//perfil de tienda no debe ir al dashboard\r\n $state.go('promotions.comunication', { taskId: 0 });\r\n }\r\n else {\r\n $state.go('home.dashboard');\r\n }\r\n }\r\n\r\n });\r\n","/**\r\n * INSPINIA - Responsive Admin Theme\r\n * 2.5\r\n *\r\n * Custom scripts\r\n */\r\n\r\nangular.element(document).ready(function ($timeout) {\r\n\r\n\r\n // Full height of sidebar\r\n function fix_height() {\r\n var heightWithoutNavbar = angular.element(\"body > #wrapper\").height() - 61;\r\n angular.element(\".sidebard-panel\").css(\"min-height\", heightWithoutNavbar + \"px\");\r\n\r\n var navbarHeigh = angular.element('nav.navbar-default').height();\r\n var wrapperHeigh = angular.element('#page-wrapper').height();\r\n\r\n if(navbarHeigh > wrapperHeigh){\r\n angular.element('#page-wrapper').css(\"min-height\", navbarHeigh + \"px\");\r\n }\r\n\r\n if(navbarHeigh < wrapperHeigh){\r\n angular.element('#page-wrapper').css(\"min-height\", angular.element(window).height() + \"px\");\r\n }\r\n\r\n if (angular.element('body').hasClass('fixed-nav')) {\r\n if (navbarHeigh > wrapperHeigh) {\r\n angular.element('#page-wrapper').css(\"min-height\", navbarHeigh - 60 + \"px\");\r\n } else {\r\n angular.element('#page-wrapper').css(\"min-height\", angular.element(window).height() - 60 + \"px\");\r\n }\r\n }\r\n\r\n }\r\n\r\n angular.element(window).bind(\"load resize scroll\", function() {\r\n if(!angular.element(\"body\").hasClass('body-small')) {\r\n fix_height();\r\n }\r\n });\r\n\r\n // Move right sidebar top after scroll\r\n angular.element(window).scroll(function(){\r\n if (angular.element(window).scrollTop() > 0 && !angular.element('body').hasClass('fixed-nav') ) {\r\n angular.element('#right-sidebar').addClass('sidebar-top');\r\n } else {\r\n angular.element('#right-sidebar').removeClass('sidebar-top');\r\n }\r\n });\r\n\r\n $timeout(function(){\r\n fix_height();\r\n });\r\n\r\n // Minimalize menu when screen is less than 768px\r\n angular.element(window).bind(\"load resize\", function() {\r\n if (angular.element(document).width() < 769) {\r\n angular.element('body').addClass('body-small')\r\n } else {\r\n angular.element('body').removeClass('body-small')\r\n }\r\n })\r\n\r\n});\r\n","(function () {\r\n 'use strict';\r\n\r\n angular.module('prisma')\r\n .filter('percentage', ['$filter', function ($filter) {\r\n return function (input, decimals) {\r\n if (input)\r\n return $filter('number')(input * 100, decimals) + '%';\r\n else\r\n return null;\r\n };\r\n }])\r\n .constant(\"companyJson\", window.companyJson)\r\n .run(runBlock);\r\n\r\n\r\n\r\n\r\n /** @ngInject */\r\n function runBlock($log, $rootScope, $state, $stateParams, $window, $filter, authService, homeService, adminService, companyJson, $translate) {\r\n\r\n //Session\r\n authService.fillAuthData();\r\n\r\n\r\n //TODO: genero un objeto por default para que el dashboard que estamos usando en la home tenga datos para renderizarse. Cuando tengamos el dashboard final hay que eliminar esto\r\n //$rootScope.selectedParetoItem = JSON.parse();\r\n\r\n $rootScope.$on('$stateChangeStart', function (event, toState, toStateParams) {\r\n // track the state the user wants to go to; authorization service needs this\r\n $rootScope.toState = toState;\r\n $rootScope.toStateParams = toStateParams;\r\n // if the principal is resolved, do an authorization check immediately. otherwise,\r\n // it'll be done when the state it resolved.\r\n //if (principal.isIdentityResolved()) authorization.authorize();\r\n });\r\n\r\n $rootScope.$on('$stateChangeSuccess', function (ev, to, toParams, from, fromParams) {\r\n $rootScope.currState = to;\r\n $rootScope.prevState = from;\r\n });\r\n\r\n $rootScope.goBack = function () {\r\n var goto = $rootScope.prevState\r\n && !$rootScope.prevState.abstract\r\n && $rootScope.prevState != $rootScope.currState\r\n ? $rootScope.prevState : \"home.dashboard\";\r\n\r\n $state.go(goto);\r\n }\r\n\r\n $rootScope.toTitleCase = function (str) {\r\n return str.replace(/\\w\\S*/g, function (txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); });\r\n }\r\n\r\n //Estoy hardcodeando el companyId. Despues tendria que sacarse del user que se loguea.\r\n $rootScope.companyId = 1;\r\n $rootScope.allDataDate = '';\r\n $rootScope.logoNavbar = '';\r\n $rootScope.logoLogin = '';\r\n $rootScope.domain = '';\r\n $rootScope.navigation = companyJson.Navigation;\r\n $rootScope.decisionsConfig = companyJson.AssortmentDecisions.Grid;\r\n $rootScope.navigation = companyJson.Navigation;\r\n $rootScope.erp = companyJson.Erp;\r\n $rootScope.maxPlanType = companyJson.MarkdownAging ? companyJson.MarkdownAging.MaxPlanType : 29;\r\n $rootScope.maxAgingLevel = companyJson.MarkdownAging ? companyJson.MarkdownAging.Level : 7;\r\n\r\n $rootScope.hasPermission = function (permission) {\r\n return authService.hasPermission(permission);\r\n }\r\n\r\n $rootScope.shortWeekDayNames = [];\r\n $rootScope.shortMonthNames = [];\r\n $rootScope.weekDayNames = [];\r\n $rootScope.monthNames = [];\r\n $translate([\"SundayS\", \"MondayS\", \"TuesdayS\", \"WednesdayS\", \"ThursdayS\", \"FridayS\", \"SaturdayS\", \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"JanuaryS\", \"FebruaryS\", \"MarchS\", \"AprilS\", \"MayS\", \"JuneS\", \"JulyS\", \"AugustS\", \"SeptemberS\", \"OctoberS\", \"NovemberS\", \"DecemberS\", \"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"])\r\n .then(function (translations) {\r\n $rootScope.shortWeekDayNames = [translations.SundayS, translations.MondayS, translations.TuesdayS, translations.WednesdayS, translations.ThursdayS, translations.FridayS, translations.SaturdayS];\r\n\r\n $rootScope.shortMonthNames = [translations.JanuaryS, translations.FebruaryS, translations.MarchS, translations.AprilS\r\n , translations.MayS, translations.JuneS, translations.JulyS, translations.AugustS, translations.SeptemberS, translations.OctoberS, translations.NovemberS, translations.DecemberS];\r\n\r\n $rootScope.weekDayNames = [translations.Sunday, translations.Monday, translations.Tuesday, translations.Wednesday, translations.Thursday, translations.Friday, translations.Saturday];\r\n\r\n $rootScope.monthNames = [translations.January, translations.February, translations.March, translations.April\r\n , translations.May, translations.June, translations.July, translations.August, translations.September, translations.October, translations.November, translations.December];\r\n\r\n var d3Locale = {};\r\n if ($translate.use() == 'en') {\r\n d3Locale = d3.locale({\r\n \"decimal\": \",\",\r\n \"thousands\": \".\",\r\n \"grouping\": [3],\r\n \"currency\": [\"$\", \"\"],\r\n \"dateTime\": \"%a %b %e %X %Y\",\r\n \"date\": \"%m/%d/%Y\",\r\n \"time\": \"%H:%M:%S\",\r\n \"periods\": [\"AM\", \"PM\"],\r\n \"days\": $rootScope.weekDayNames,\r\n \"shortDays\": $rootScope.shortWeekDayNames,\r\n \"months\": $rootScope.monthNames,\r\n \"shortMonths\": $rootScope.shortMonthNames\r\n });\r\n }\r\n else {\r\n //D3 Configuration Formats\r\n d3Locale = d3.locale({\r\n \"decimal\": \".\",\r\n \"thousands\": \",\",\r\n \"grouping\": [3],\r\n \"currency\": [\"$\", \"\"],\r\n \"dateTime\": \"%a %b %e %X %Y\",\r\n \"date\": \"%m/%d/%Y\",\r\n \"time\": \"%H:%M:%S\",\r\n \"periods\": [\"AM\", \"PM\"],\r\n \"days\": $rootScope.weekDayNames,\r\n \"shortDays\": $rootScope.shortWeekDayNames,\r\n \"months\": $rootScope.monthNames,\r\n \"shortMonths\": $rootScope.shortMonthNames\r\n });\r\n }\r\n d3.time.format = d3Locale.timeFormat;\r\n\r\n });\r\n\r\n \r\n $translate([])\r\n .then(function (translations) {\r\n \r\n });\r\n\r\n /*\r\n RENDERERES Y FUNCIONES COMUNES PARA AG GRID\r\n */\r\n\r\n $rootScope.toPercentage = function (number) {\r\n number = number * 100;\r\n\r\n if (number.toString().indexOf('.') > 0)\r\n return number.toFixed(1) + \" %\";\r\n else\r\n return number.toFixed(0) + \" %\";\r\n }\r\n\r\n $rootScope.toMoneyNoDecimals = function (number) {\r\n return '$ ' + $filter('number')(number, 0);\r\n }\r\n\r\n $rootScope.getClassForImpactCell = function (params) {\r\n var cls = [];\r\n\r\n if (params.value < 0) {\r\n cls.push(\"text-danger\");\r\n }\r\n else {\r\n cls.push(\"text-ok\");\r\n }\r\n\r\n var baseClass = $rootScope.getClassForCell(params);\r\n for (var i = 0; i < baseClass.length; i++) {\r\n cls.push(baseClass[0]);\r\n }\r\n\r\n return cls;\r\n }\r\n\r\n $rootScope.getClassForImpactCellInverse = function (params) {\r\n var cls = [];\r\n\r\n if (params.value > 0) {\r\n cls.push(\"text-danger\");\r\n }\r\n else {\r\n cls.push(\"text-ok\");\r\n }\r\n\r\n var baseClass = $rootScope.getClassForCell(params);\r\n for (var i = 0; i < baseClass.length; i++) {\r\n cls.push(baseClass[0]);\r\n }\r\n\r\n return cls;\r\n }\r\n\r\n $rootScope.getClassForMarginCell = function (params) {\r\n var cls = [];\r\n\r\n if (params.data.minMargin != null && params.data.minMargin != 0 && params.data.maxMargin != null && params.data.maxMargin != 0 && (params.value < params.data.minMargin || params.value > params.data.maxMargin)) {\r\n cls.push(\"text-danger\");\r\n }\r\n\r\n var baseClass = $rootScope.getClassForCell(params);\r\n for (var i = 0; i < baseClass.length; i++) {\r\n cls.push(baseClass[0]);\r\n }\r\n\r\n return cls;\r\n }\r\n\r\n $rootScope.getClassForWeightedIndexCell = function (params) {\r\n var cls = [];\r\n\r\n if (Math.round((params.data.indexSalesWeight + params.data.indexUnitsWeight + params.data.indexMarginWeight + params.data.indexMarketSalesWeight + params.data.indexMarketUnitsWeight) * 100) / 100 != 1) {\r\n cls.push(\"text-danger\");\r\n }\r\n\r\n var baseClass = $rootScope.getClassForCell(params);\r\n for (var i = 0; i < baseClass.length; i++) {\r\n cls.push(baseClass[0]);\r\n }\r\n\r\n return cls;\r\n }\r\n\r\n $rootScope.getClassForHierarchyPCell = function (params) {\r\n var cls = [];\r\n\r\n if (params.value > 1) {\r\n cls.push(\"text-danger\");\r\n }\r\n cls.push(\"text-right\");\r\n\r\n return cls;\r\n }\r\n\r\n $rootScope.getClassForHierarchyCell = function (params) {\r\n var cls = [];\r\n\r\n if (params.value > 0) {\r\n cls.push(\"text-danger\");\r\n }\r\n\r\n cls.push(\"text-right\");\r\n\r\n return cls;\r\n }\r\n\r\n $rootScope.WeightedIndexPercentageEditor = function (params) {\r\n\r\n var editing = false;\r\n\r\n var eCell = document.createElement('div');\r\n eCell.style = \"width:100% !important;height:100% !important\";\r\n eCell.className = \"input-group\";\r\n var eLabel = params.value != null ? document.createTextNode($rootScope.percentageRendererNoDecimals(params)) : document.createTextNode('');\r\n eCell.appendChild(eLabel);\r\n\r\n var eInput = document.createElement(\"input\");\r\n eInput.type = \"number\";\r\n eInput.step = \"0.01\";\r\n eInput.className = \"form-control\";\r\n var eSpan = document.createElement(\"span\");\r\n eSpan.className = \"input-group-addon\";\r\n eSpan.style = \"margin:0px !important; height: 100% !important; border: 0px; line-height: 100%; font-size:12px !important\";\r\n eSpan.innerText = \"%\";\r\n\r\n\r\n eCell.addEventListener('click', function () {\r\n if (!editing) {\r\n eCell.removeChild(eLabel);\r\n eCell.appendChild(eInput);\r\n eCell.appendChild(eSpan);\r\n eInput.focus();\r\n eInput.value = params.value ? params.value * 100 : null;\r\n editing = true;\r\n }\r\n });\r\n\r\n eInput.addEventListener('blur', function () {\r\n if (editing) {\r\n editing = false;\r\n eCell.removeChild(eInput);\r\n eCell.removeChild(eSpan);\r\n eCell.appendChild(eLabel);\r\n }\r\n });\r\n\r\n eInput.addEventListener('change', function () {\r\n if (editing) {\r\n editing = false;\r\n var oldValue = params.value;\r\n var newValue = eInput.value / 100;\r\n params.value = newValue;\r\n params.data[params.column.colId] = newValue;\r\n eLabel.nodeValue = $rootScope.percentageRendererNoDecimals(params);\r\n eCell.removeChild(eInput);\r\n eCell.removeChild(eSpan);\r\n eCell.appendChild(eLabel);\r\n\r\n if (params.node != null && params.node.children != null) {\r\n var changedRows = [];\r\n var colIds = [];\r\n colIds.push(params.column.colId);\r\n params.node.children.forEach(function (node) {\r\n if (node.children) {\r\n node.children.forEach(function (node) {\r\n //if (node.data[params.column.colId] == oldValue && node.data.indexSalesWeight == node.parent.data.indexSalesWeight && node.data.indexUnitsWeight == node.parent.data.indexUnitsWeight && node.data.indexMarginWeight == node.parent.data.indexMarginWeight && node.data.indexMarketSalesWeight == node.parent.data.indexMarketSalesWeight && node.data.indexMarketUnitsWeight == node.parent.data.indexMarketUnitsWeight) {\r\n node.data[params.column.colId] = params.value;\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n //}\r\n });\r\n }\r\n //if (node.data[params.column.colId] == oldValue && node.data.indexSalesWeight == node.parent.data.indexSalesWeight && node.data.indexUnitsWeight == node.parent.data.indexUnitsWeight && node.data.indexMarginWeight == node.parent.data.indexMarginWeight && node.data.indexMarketSalesWeight == node.parent.data.indexMarketSalesWeight && node.data.indexMarketUnitsWeight == node.parent.data.indexMarketUnitsWeight) {\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n //}\r\n });\r\n params.api.refreshCells(changedRows, colIds);\r\n params.api.recomputeAggregates();\r\n\r\n }\r\n params.data.dirty = true;\r\n params.api.recomputeAggregates();\r\n }\r\n });\r\n\r\n return eCell;\r\n }\r\n\r\n $rootScope.getClassForCell = function (params) {\r\n\r\n var cls = [];\r\n\r\n if (params.colDef.filter === \"number\") {\r\n cls.push(\"text-right\");\r\n }\r\n else if (params.colDef.filter === \"input\" || params.colDef.filter === \"select\")\r\n cls.push(\"text-center\");\r\n else\r\n cls.push(\"text-left\");\r\n\r\n cls.push('ag-cell-padding');\r\n return cls;\r\n }\r\n\r\n $rootScope.backgroundNumberClass = function (prams) {\r\n var cls = [];\r\n\r\n cls.push(\"text-right\");\r\n cls.push(\"backgroundInput\");\r\n\r\n return cls;\r\n },\r\n\r\n $rootScope.suppressColumnMoveAnimation = function () {\r\n var isFirefox = typeof InstallTrigger !== 'undefined';\r\n // At least Safari 3+: \"[object HTMLElementConstructor]\"\r\n var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;\r\n // Internet Explorer 6-11\r\n var isIE = /*@cc_on!@*/\r\n false || !!document.documentMode;\r\n\r\n return isFirefox || isSafari || isIE;\r\n }\r\n\r\n $rootScope.integerRenderer = function (params) {\r\n if (params.value == null || params.value == 0)\r\n return null;\r\n\r\n return $filter('number')(params.value, 0);\r\n };\r\n\r\n $rootScope.integerRendererWithZero = function (params) {\r\n if (params.value == null)\r\n return null;\r\n\r\n return $filter('number')(params.value, 0);\r\n };\r\n\r\n $rootScope.decimalRenderer = function (params) {\r\n if (params.value == null || params.value == 0)\r\n return null;\r\n\r\n return $filter('number')(params.value, 2);\r\n };\r\n\r\n $rootScope.dateRenderer = function (params) {\r\n if (params.value == null)\r\n return \"\";\r\n\r\n return new Date(params.value).toISOString().slice(0, 10);\r\n }\r\n\r\n $rootScope.dateTimeRenderer = function (params) {\r\n if (params.value == null)\r\n return \"\";\r\n\r\n return new Date(params.value).toISOString().replace('T', ' ').slice(0, 19);\r\n }\r\n\r\n $rootScope.emptyRenderer = function (params) {\r\n return \"\";\r\n }\r\n\r\n $rootScope.moneyRenderer = function (params) {\r\n if (params.value == null || params.value == 0 || params.value == '')\r\n return null;\r\n\r\n return \"$ \" + $filter('number')(params.value, 2);\r\n };\r\n\r\n $rootScope.moneyRendererWithZeros = function (params) {\r\n if (params.value == null || params.value == '')\r\n return null;\r\n\r\n return \"$ \" + $filter('number')(params.value, 2);\r\n };\r\n\r\n $rootScope.bigMoneyRenderer = function (params) {\r\n if (params.value == null || params.value == 0 || params.value == '')\r\n return '';\r\n\r\n var value = ian.abbreviateNumberThousand(params.value, 2, '$');\r\n\r\n return value;\r\n }\r\n\r\n $rootScope.greaterThan = function (params) {\r\n if (!params.value) {\r\n return '';\r\n }\r\n\r\n return \"> \" + $filter('number')(params.value, 2);\r\n }\r\n\r\n $rootScope.greaterThanNoDecimals = function (params) {\r\n if (!params.value) {\r\n return '';\r\n }\r\n var value = $rootScope.integerRenderer(params);\r\n\r\n\r\n return \"> \" + value;\r\n }\r\n\r\n $rootScope.bigIntRenderer = function (params) {\r\n if (params.value == null || params.value == 0 || params.value == '')\r\n return '';\r\n\r\n var value = ian.abbreviateNumberThousand(params.value, 2, '');\r\n\r\n return value;\r\n }\r\n\r\n $rootScope.moneyRendererNoDecimals = function (params) {\r\n var value = $rootScope.integerRenderer(params);\r\n if (value == null || value == 0 || value == '')\r\n return null;\r\n\r\n return \"$ \" + value;\r\n };\r\n\r\n $rootScope.percentageRenderer = function (params) {\r\n if (params.value == null || params.value == 0 || params.value == '')\r\n return null;\r\n\r\n var value = params.value * 100; //TODO: ver si existe una manera mejor de formatear un porcentaje. Como regla general los porcentajes se deben guardar en la base como decimales 0.5 = 50%\r\n\r\n return value.toFixed(1) + \" %\";\r\n }\r\n\r\n $rootScope.percentageRendererDirect = function (params) {\r\n if (params.value == null || params.value == 0 || params.value == '')\r\n return null;\r\n\r\n var value = params.value;\r\n\r\n return value.toFixed(1) + \" %\";\r\n }\r\n\r\n $rootScope.percentageRendererWithZero = function (params) {\r\n if (params.value == null || params.value === '')\r\n return null;\r\n\r\n var value = params.value * 100; //TODO: ver si existe una manera mejor de formatear un porcentaje. Como regla general los porcentajes se deben guardar en la base como decimales 0.5 = 50%\r\n\r\n return value.toFixed(1) + \" %\";\r\n }\r\n\r\n $rootScope.percentageRenderer2Decimals = function (params) {\r\n if (params.value == null || params.value == 0 || params.value == '')\r\n return null;\r\n\r\n var value = params.value * 100; //TODO: ver si existe una manera mejor de formatear un porcentaje. Como regla general los porcentajes se deben guardar en la base como decimales 0.5 = 50%\r\n\r\n return value.toFixed(2) + \" %\";\r\n }\r\n\r\n $rootScope.percentageRendererPP = function (params) {\r\n if (params.value == null || params.value == 0 || params.value == '')\r\n return null;\r\n\r\n var value = params.value * 100; //TODO: ver si existe una manera mejor de formatear un porcentaje. Como regla general los porcentajes se deben guardar en la base como decimales 0.5 = 50%\r\n\r\n return value.toFixed(1) + \" PP\";\r\n }\r\n\r\n $rootScope.percentageRendererNoDecimals = function (params) {\r\n if (params.value == null || params.value == 0 || params.value == '')\r\n return '';\r\n\r\n var value = params.value * 100;\r\n\r\n return value.toFixed(0) + \" %\";\r\n }\r\n\r\n $rootScope.checkboxEditor = function (onChangeCallback) {\r\n\r\n\r\n return function (params) {\r\n var eInput = document.createElement(\"input\");\r\n eInput.type = \"checkbox\";\r\n eInput.checked = params.value;\r\n\r\n eInput.addEventListener(\"change\", function (event) {\r\n var changedRows = [];\r\n var colIds = [];\r\n colIds.push(params.column.colId);\r\n params.value = eInput.checked;\r\n params.data[params.column.colId] = eInput.checked;\r\n\r\n //Excepto para la grilla de precios\r\n if (params.colDef.field != 'priceId') {\r\n if (params.node != null && params.node.children != null) {\r\n params.node.children.forEach(function (node) {\r\n if (node.children) {\r\n node.children.forEach(function (node) {\r\n node.data[params.column.colId] = eInput.checked;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n }\r\n node.data[params.column.colId] = eInput.checked;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n params.api.refreshCells(changedRows, colIds);\r\n }\r\n params.data.dirty = true;\r\n }\r\n\r\n\r\n if (onChangeCallback != undefined) {\r\n onChangeCallback(event, params);\r\n }\r\n });\r\n\r\n return eInput;\r\n }\r\n }\r\n\r\n\r\n\r\n $rootScope.percentageEditor = function (params) {\r\n\r\n var editing = false;\r\n\r\n var eCell = document.createElement('div');\r\n eCell.style = \"width:100% !important;height:100% !important\";\r\n eCell.className = \"input-group\";\r\n var eLabel = params.value != null && params.value != 0 ? document.createTextNode($rootScope.percentageRendererNoDecimals(params)) : document.createTextNode('');\r\n eCell.appendChild(eLabel);\r\n\r\n var eInput = document.createElement(\"input\");\r\n eInput.type = \"number\";\r\n eInput.step = \"0.01\";\r\n eInput.className = \"form-control\";\r\n var eSpan = document.createElement(\"span\");\r\n eSpan.className = \"input-group-addon\";\r\n eSpan.style = \"margin:0px !important; height: 100% !important; border: 0px; line-height: 100%; font-size:12px !important\";\r\n eSpan.innerText = \"%\";\r\n\r\n\r\n eCell.addEventListener('click', function () {\r\n if (!editing) {\r\n eCell.removeChild(eLabel);\r\n eCell.appendChild(eInput);\r\n eCell.appendChild(eSpan);\r\n eInput.focus();\r\n eInput.value = params.value ? params.value * 100 : null;\r\n editing = true;\r\n }\r\n });\r\n\r\n eInput.addEventListener('blur', function () {\r\n if (editing) {\r\n editing = false;\r\n eCell.removeChild(eInput);\r\n eCell.removeChild(eSpan);\r\n eCell.appendChild(eLabel);\r\n }\r\n });\r\n\r\n eInput.addEventListener('change', function () {\r\n if (editing) {\r\n editing = false;\r\n var newValue = eInput.value / 100;\r\n params.value = newValue;\r\n params.data[params.column.colId] = newValue;\r\n eLabel.nodeValue = $rootScope.percentageRendererNoDecimals(params);\r\n eCell.removeChild(eInput);\r\n eCell.removeChild(eSpan);\r\n eCell.appendChild(eLabel);\r\n\r\n if (params.node != null && params.node.children != null) {\r\n var changedRows = [];\r\n var colIds = [];\r\n colIds.push(params.column.colId);\r\n params.node.children.forEach(function (node) {\r\n if (node.children) {\r\n node.children.forEach(function (node) {\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n }\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n params.api.refreshCells(changedRows, colIds);\r\n params.api.recomputeAggregates();\r\n\r\n }\r\n params.data.dirty = true;\r\n\r\n }\r\n });\r\n\r\n return eCell;\r\n }\r\n\r\n $rootScope.percentageEditorWithDecimal = function (params) {\r\n\r\n var editing = false;\r\n\r\n var eCell = document.createElement('div');\r\n eCell.style = \"width:100% !important;height:100% !important\";\r\n eCell.className = \"input-group\";\r\n var eLabel = params.value != null && params.value != 0 ? document.createTextNode($rootScope.percentageRenderer(params)) : document.createTextNode('');\r\n eCell.appendChild(eLabel);\r\n\r\n var eInput = document.createElement(\"input\");\r\n eInput.type = \"number\";\r\n eInput.step = \"0.01\";\r\n eInput.className = \"form-control\";\r\n var eSpan = document.createElement(\"span\");\r\n eSpan.className = \"input-group-addon\";\r\n eSpan.style = \"margin:0px !important; height: 100% !important; border: 0px; line-height: 100%; font-size:12px !important\";\r\n eSpan.innerText = \"%\";\r\n\r\n\r\n eCell.addEventListener('click', function () {\r\n if (!editing) {\r\n eCell.removeChild(eLabel);\r\n eCell.appendChild(eInput);\r\n eCell.appendChild(eSpan);\r\n eInput.focus();\r\n eInput.value = params.value ? params.value * 100 : null;\r\n editing = true;\r\n }\r\n });\r\n\r\n eInput.addEventListener('blur', function () {\r\n if (editing) {\r\n editing = false;\r\n eCell.removeChild(eInput);\r\n eCell.removeChild(eSpan);\r\n eCell.appendChild(eLabel);\r\n }\r\n });\r\n\r\n eInput.addEventListener('change', function () {\r\n if (editing) {\r\n editing = false;\r\n var newValue = eInput.value / 100;\r\n params.value = newValue;\r\n params.data[params.column.colId] = newValue;\r\n eLabel.nodeValue = $rootScope.percentageRenderer(params);\r\n eCell.removeChild(eInput);\r\n eCell.removeChild(eSpan);\r\n eCell.appendChild(eLabel);\r\n\r\n if (params.node != null && params.node.children != null) {\r\n var changedRows = [];\r\n var colIds = [];\r\n colIds.push(params.column.colId);\r\n params.node.children.forEach(function (node) {\r\n if (node.children) {\r\n node.children.forEach(function (node) {\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n }\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n params.api.refreshCells(changedRows, colIds);\r\n params.api.recomputeAggregates();\r\n\r\n }\r\n params.data.dirty = true;\r\n\r\n }\r\n });\r\n\r\n return eCell;\r\n }\r\n\r\n $rootScope.percentageEditorWithDecimalAndZero = function (params) {\r\n\r\n var editing = false;\r\n\r\n var eCell = document.createElement('div');\r\n eCell.style = \"width:100% !important;height:100% !important\";\r\n eCell.className = \"input-group\";\r\n var eLabel = params.value != null ? document.createTextNode($rootScope.percentageRendererWithZero(params)) : document.createTextNode('');\r\n eCell.appendChild(eLabel);\r\n\r\n var eInput = document.createElement(\"input\");\r\n eInput.type = \"number\";\r\n eInput.step = \"0.01\";\r\n eInput.className = \"form-control\";\r\n var eSpan = document.createElement(\"span\");\r\n eSpan.className = \"input-group-addon\";\r\n eSpan.style = \"margin:0px !important; height: 100% !important; border: 0px; line-height: 100%; font-size:12px !important\";\r\n eSpan.innerText = \"%\";\r\n\r\n\r\n eCell.addEventListener('click', function () {\r\n if (!editing) {\r\n eCell.removeChild(eLabel);\r\n eCell.appendChild(eInput);\r\n eCell.appendChild(eSpan);\r\n eInput.focus();\r\n eInput.value = params.value ? params.value * 100 : null;\r\n editing = true;\r\n }\r\n });\r\n\r\n eInput.addEventListener('blur', function () {\r\n if (editing) {\r\n editing = false;\r\n eCell.removeChild(eInput);\r\n eCell.removeChild(eSpan);\r\n eCell.appendChild(eLabel);\r\n }\r\n });\r\n\r\n eInput.addEventListener('change', function () {\r\n if (editing) {\r\n editing = false;\r\n var newValue = eInput.value / 100;\r\n params.value = newValue;\r\n params.data[params.column.colId] = newValue;\r\n eLabel.nodeValue = $rootScope.percentageRendererWithZero(params);\r\n eCell.removeChild(eInput);\r\n eCell.removeChild(eSpan);\r\n eCell.appendChild(eLabel);\r\n\r\n if (params.node != null && params.node.children != null) {\r\n var changedRows = [];\r\n var colIds = [];\r\n colIds.push(params.column.colId);\r\n params.node.children.forEach(function (node) {\r\n if (node.children) {\r\n node.children.forEach(function (node) {\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n }\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n params.api.refreshCells(changedRows, colIds);\r\n params.api.recomputeAggregates();\r\n\r\n }\r\n params.data.dirty = true;\r\n\r\n }\r\n });\r\n\r\n return eCell;\r\n }\r\n\r\n\r\n $rootScope.percentageEditorWith2Decimals = function (params) {\r\n\r\n var editing = false;\r\n\r\n var eCell = document.createElement('div');\r\n eCell.style = \"width:100% !important;height:100% !important\";\r\n eCell.className = \"input-group\";\r\n var eLabel = params.value != null && params.value != 0 ? document.createTextNode($rootScope.percentageRenderer2Decimals(params)) : document.createTextNode('');\r\n eCell.appendChild(eLabel);\r\n\r\n var eInput = document.createElement(\"input\");\r\n eInput.type = \"number\";\r\n eInput.step = \"0.01\";\r\n eInput.className = \"form-control\";\r\n var eSpan = document.createElement(\"span\");\r\n eSpan.className = \"input-group-addon\";\r\n eSpan.style = \"margin:0px !important; height: 100% !important; border: 0px; line-height: 100%; font-size:12px !important\";\r\n eSpan.innerText = \"%\";\r\n\r\n\r\n eCell.addEventListener('click', function () {\r\n if (!editing) {\r\n eCell.removeChild(eLabel);\r\n eCell.appendChild(eInput);\r\n eCell.appendChild(eSpan);\r\n eInput.focus();\r\n eInput.value = params.value ? params.value * 100 : null;\r\n editing = true;\r\n }\r\n });\r\n\r\n eInput.addEventListener('blur', function () {\r\n if (editing) {\r\n editing = false;\r\n eCell.removeChild(eInput);\r\n eCell.removeChild(eSpan);\r\n eCell.appendChild(eLabel);\r\n }\r\n });\r\n\r\n eInput.addEventListener('change', function () {\r\n if (editing) {\r\n editing = false;\r\n var newValue = eInput.value / 100;\r\n params.value = newValue;\r\n params.data[params.column.colId] = newValue;\r\n eLabel.nodeValue = $rootScope.percentageRenderer2Decimals(params);\r\n eCell.removeChild(eInput);\r\n eCell.removeChild(eSpan);\r\n eCell.appendChild(eLabel);\r\n\r\n if (params.node != null && params.node.children != null) {\r\n var changedRows = [];\r\n var colIds = [];\r\n colIds.push(params.column.colId);\r\n params.node.children.forEach(function (node) {\r\n if (node.children) {\r\n node.children.forEach(function (node) {\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n }\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n params.api.refreshCells(changedRows, colIds);\r\n params.api.recomputeAggregates();\r\n\r\n }\r\n params.data.dirty = true;\r\n\r\n }\r\n });\r\n\r\n return eCell;\r\n }\r\n\r\n $rootScope.moneyEditor = function (params) {\r\n\r\n var editing = false;\r\n\r\n var eCell = document.createElement('div');\r\n eCell.style = \"width:100% !important;height:100% !important\";\r\n eCell.className = \"input-group\";\r\n var eLabel = params.value != null ? document.createTextNode($rootScope.moneyRenderer(params)) : document.createTextNode('');\r\n var eIcon = document.createElement(\"i\");\r\n eIcon.className = \"fa fa-exclamation-triangle\";\r\n eCell.appendChild(eIcon);\r\n //eCell.appendChild(eLabel);\r\n\r\n var eInput = document.createElement(\"input\");\r\n eInput.type = \"number\";\r\n eInput.step = \"0.01\";\r\n eInput.className = \"form-control\";\r\n var eSpan = document.createElement(\"span\");\r\n eSpan.className = \"input-group-addon\";\r\n eSpan.style = \"margin:0px !important; height: 100% !important; border: 0px; line-height: 100%; font-size:12px !important\";\r\n eSpan.innerText = \"$\";\r\n\r\n\r\n eCell.addEventListener('click', function () {\r\n if (!editing) {\r\n eCell.removeChild(eLabel);\r\n eCell.appendChild(eSpan);\r\n eCell.appendChild(eInput);\r\n eInput.focus();\r\n eInput.value = params.value;\r\n editing = true;\r\n }\r\n });\r\n\r\n eInput.addEventListener('blur', function () {\r\n if (editing) {\r\n editing = false;\r\n eCell.removeChild(eSpan);\r\n eCell.removeChild(eInput);\r\n eCell.appendChild(eLabel);\r\n }\r\n });\r\n\r\n eInput.addEventListener('change', function () {\r\n if (editing) {\r\n editing = false;\r\n params.value = eInput.value;\r\n params.data[params.column.colId] = eInput.value;\r\n params.data.dirty = true;\r\n eLabel.nodeValue = $rootScope.moneyRenderer(params);\r\n eCell.removeChild(eSpan);\r\n eCell.removeChild(eInput);\r\n eCell.appendChild(eLabel);\r\n\r\n if (params.node != null && params.node.children != null) {\r\n var changedRows = [];\r\n var colIds = [];\r\n colIds.push(params.column.colId);\r\n params.node.children.forEach(function (node) {\r\n if (node.children) {\r\n node.children.forEach(function (node) {\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n }\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n params.api.refreshCells(changedRows, colIds);\r\n }\r\n }\r\n });\r\n\r\n return eCell;\r\n }\r\n\r\n $rootScope.integerEditor = function (params) {\r\n\r\n var editing = false;\r\n\r\n var eCell = document.createElement('div');\r\n eCell.style = \"width:100% !important;height:100% !important\";\r\n eCell.className = \"input-group\";\r\n var eLabel = params.value != null && params.value != 0 ? document.createTextNode($rootScope.integerRenderer(params)) : document.createTextNode('');\r\n eCell.appendChild(eLabel);\r\n\r\n var eInput = document.createElement(\"input\");\r\n eInput.type = \"number\";\r\n eInput.step = \"1\";\r\n eInput.className = \"form-control\";\r\n\r\n eCell.addEventListener('click', function () {\r\n if (!editing) {\r\n eCell.removeChild(eLabel);\r\n eCell.appendChild(eInput);\r\n eInput.focus();\r\n eInput.value = params.value;\r\n editing = true;\r\n }\r\n });\r\n\r\n eInput.addEventListener('blur', function () {\r\n if (editing) {\r\n editing = false;\r\n eCell.removeChild(eInput);\r\n eCell.appendChild(eLabel);\r\n }\r\n });\r\n\r\n eInput.addEventListener('change', function () {\r\n if (editing) {\r\n editing = false;\r\n params.value = eInput.value;\r\n params.data[params.column.colId] = eInput.value;\r\n eLabel.nodeValue = $rootScope.integerRenderer(params);\r\n eCell.removeChild(eInput);\r\n eCell.appendChild(eLabel);\r\n\r\n if (params.node != null && params.node.children != null) {\r\n var changedRows = [];\r\n var colIds = [];\r\n colIds.push(params.column.colId);\r\n params.node.children.forEach(function (node) {\r\n if (node.children) {\r\n node.children.forEach(function (node) {\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n }\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n params.api.refreshCells(changedRows, colIds);\r\n }\r\n params.data.dirty = true;\r\n\r\n }\r\n });\r\n\r\n return eCell;\r\n }\r\n\r\n $rootScope.decimalEditor = function (params) {\r\n\r\n var editing = false;\r\n\r\n var eCell = document.createElement('div');\r\n eCell.style = \"width:100% !important;height:100% !important\";\r\n eCell.className = \"input-group\";\r\n var eLabel = params.value != null && params.value != 0 ? document.createTextNode($rootScope.decimalRenderer(params)) : document.createTextNode('');\r\n eCell.appendChild(eLabel);\r\n\r\n var eInput = document.createElement(\"input\");\r\n eInput.type = \"number\";\r\n eInput.step = \"1\";\r\n eInput.className = \"form-control\";\r\n\r\n eCell.addEventListener('click', function () {\r\n if (!editing) {\r\n eCell.removeChild(eLabel);\r\n eCell.appendChild(eInput);\r\n eInput.focus();\r\n eInput.value = params.value;\r\n editing = true;\r\n }\r\n });\r\n\r\n eInput.addEventListener('blur', function () {\r\n if (editing) {\r\n editing = false;\r\n eCell.removeChild(eInput);\r\n eCell.appendChild(eLabel);\r\n }\r\n });\r\n\r\n eInput.addEventListener('change', function () {\r\n if (editing) {\r\n editing = false;\r\n params.value = eInput.value;\r\n params.data[params.column.colId] = eInput.value;\r\n eLabel.nodeValue = $rootScope.decimalRenderer(params);\r\n eCell.removeChild(eInput);\r\n eCell.appendChild(eLabel);\r\n\r\n if (params.node != null && params.node.children != null) {\r\n var changedRows = [];\r\n var colIds = [];\r\n colIds.push(params.column.colId);\r\n params.node.children.forEach(function (node) {\r\n if (node.children) {\r\n node.children.forEach(function (node) {\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n }\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n params.api.refreshCells(changedRows, colIds);\r\n }\r\n params.data.dirty = true;\r\n\r\n }\r\n });\r\n\r\n return eCell;\r\n }\r\n\r\n $rootScope.dateEditor = function (params) {\r\n\r\n var editing = false;\r\n\r\n var eCell = document.createElement('div');\r\n eCell.style = \"width:100%;height:100%;\"\r\n var eLabel = document.createTextNode($rootScope.dateRenderer(params));\r\n eCell.appendChild(eLabel);\r\n\r\n var eInput = document.createElement(\"input\");\r\n eInput.style = \"width:135px;\"\r\n eInput.type = \"date\";\r\n\r\n eCell.addEventListener('click', function () {\r\n if (!editing) {\r\n if (params.data.newValidFrom == null && params.data.newPrice == null)\r\n swal(\"Error\", \"No puede editar las fechas manualmente sin antes cargar un precio nuevo.\", \"error\");\r\n else {\r\n eCell.removeChild(eLabel);\r\n eCell.appendChild(eInput);\r\n eInput.focus();\r\n eInput.value = params.value;\r\n editing = true;\r\n }\r\n }\r\n });\r\n\r\n eInput.addEventListener('blur', function () {\r\n if (editing) {\r\n editing = false;\r\n eCell.removeChild(eInput);\r\n eCell.appendChild(eLabel);\r\n }\r\n });\r\n\r\n eInput.addEventListener('change', function () {\r\n if (editing) {\r\n editing = false;\r\n var newValue = eInput.value;\r\n params.data[params.colDef.field] = newValue;\r\n params.data[\"dirty\"] = true;\r\n params.value = newValue;\r\n eLabel.nodeValue = $rootScope.dateRenderer(params);\r\n eCell.removeChild(eInput);\r\n eCell.appendChild(eLabel);\r\n\r\n if (params.node != null && params.node.children != null) {\r\n var changedRows = [];\r\n var colIds = [];\r\n colIds.push(params.column.colId);\r\n params.node.children.forEach(function (node) {\r\n if (node.children) {\r\n node.children.forEach(function (node) {\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n }\r\n node.data[params.column.colId] = params.value;\r\n node.data.dirty = true;\r\n changedRows.push(node);\r\n });\r\n params.api.refreshCells(changedRows, colIds);\r\n }\r\n }\r\n });\r\n\r\n return eCell;\r\n }\r\n\r\n $rootScope.trimLeft0 = function (param) {\r\n\r\n if (param.value != null && param.value.length > 0) {\r\n return param.value.replace(/^0+/, '');\r\n }\r\n else return param.value;\r\n }\r\n\r\n $rootScope.removeDuplicates = function (arr, prop) {\r\n var newArray = [];\r\n var lookup = {};\r\n for (var i in arr) {\r\n if (i != 'equals')\r\n lookup[arr[i][prop]] = arr[i];\r\n }\r\n for (i in lookup) {\r\n newArray.push(lookup[i]);\r\n }\r\n return newArray;\r\n }\r\n\r\n $rootScope.translate = function (translationKey) {\r\n $translate(translationKey).then(function (translation) {\r\n return translation;\r\n });\r\n }\r\n\r\n //$rootScope.convertUTCDateToLocalDate = function (date) {\r\n // var newDate = new Date(date);\r\n // newDate.setMinutes(newDate.getMinutes() - newDate.getTimezoneOffset());\r\n // return newDate;\r\n //}\r\n\r\n $rootScope.convertUTCDateToLocalDate = function (dateStr) {\r\n return new Date(moment(new Date(dateStr.replace(\"Z\", \"\"))).add(companyJson.TimeZone.Gmt, 'hours'));\r\n }\r\n\r\n $rootScope.arrayAverage = function (array) {\r\n let avg = null;\r\n if (Array.isArray(array) && array.length > 0) {\r\n array.forEach(function (element) {\r\n if (isNaN(element))\r\n return null;\r\n });\r\n let sum = array.reduce(function (total, num) {\r\n return total + num;\r\n });\r\n avg = sum / array.length;\r\n }\r\n return avg;\r\n }\r\n\r\n function getDataDate() {\r\n homeService.dashboards.getAllDataDate($translate.preferredLanguage())\r\n .then(function (stringDate) {\r\n $rootScope.allDataDate = stringDate;\r\n });\r\n }\r\n\r\n function getLogosAndDomain() {\r\n homeService.dashboards.getLogosAndDomain()\r\n .then(function (logosAndDomain) {\r\n $rootScope.logoNavbar = logosAndDomain.logoNavbar;\r\n $rootScope.logoLogin = logosAndDomain.logoLogin;\r\n $rootScope.domain = logosAndDomain.domain;\r\n });\r\n }\r\n\r\n getDataDate();\r\n getLogosAndDomain();\r\n\r\n //config toastr\r\n toastr.options = {\r\n \"closeButton\": true,\r\n \"debug\": false,\r\n \"newestOnTop\": false,\r\n \"progressBar\": true,\r\n \"positionClass\": \"toast-top-center\",\r\n \"preventDuplicates\": false,\r\n \"onclick\": null,\r\n \"showDuration\": \"300\",\r\n \"hideDuration\": \"1000\",\r\n \"timeOut\": \"5000\",\r\n \"extendedTimeOut\": \"1000\",\r\n \"showEasing\": \"swing\",\r\n \"hideEasing\": \"linear\",\r\n \"showMethod\": \"fadeIn\",\r\n \"hideMethod\": \"fadeOut\"\r\n }\r\n\r\n $log.debug('runBlock end');\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('prisma')\r\n .config(routerConfig);\r\n\r\n /** @ngInject */\r\n function routerConfig($stateProvider, $urlRouterProvider, companyJson) {\r\n\r\n $stateProvider\r\n .state(\"login\", {\r\n url: \"/login\",\r\n templateUrl: \"app/login/login.html\",\r\n controller: 'LoginCtrl',\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"home\", {\r\n abstract: true,\r\n url: \"/home\",\r\n templateUrl: \"app/components/common/content.html\"\r\n })\r\n .state(\"home.dashboardV1\", { \r\n url: \"/dashboardV1\",\r\n templateUrl: \"app/home/dashboard/dashboard.html\",\r\n data: { pageTitle: \"Smart Dashboard\" },\r\n controller: \"DashboardCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"home.dashboard\", { //Dashbard de Oils. Harcoded\r\n url: \"/dashboard\",\r\n templateUrl: companyJson.Navigation.UseOilDashboard ? \"app/home/dashboardOil/dashboardOil.html\" : \"app/home/dashboard/dashboard.html\",\r\n data: { pageTitle: \"Smart Dashboard\" },\r\n controller: companyJson.Navigation.UseOilDashboard ? \"DashboardOilCtrl\" : \"DashboardCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"home.marketBoard\", {\r\n url: \"/marketBoard\",\r\n templateUrl: \"app/home/marketBoard/marketBoard.html\",\r\n data: {\r\n pageTitle: \"Market Board\" },\r\n controller: \"MarketBoardCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"home.itemDashboard\", {\r\n url: \"/itemDashboard/:itemId/:storeId/:clusterId/:priceListId\",\r\n templateUrl: \"app/home/itemDashboard/itemDashboard.html\",\r\n data: { pageTitle: \"Item Dashboard\" },\r\n controller: \"ItemDashboardCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"home.maps\", {\r\n url: \"/maps\",\r\n templateUrl: \"app/home/maps/maps.html\",\r\n data: { pageTitle: \"Maps\" },\r\n controller: \"MapsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"home.goals\", {\r\n url: \"/goals/:type\",\r\n templateUrl: \"app/home/goals/goals.html\",\r\n data: { pageTitle: \"Goals\" },\r\n controller: \"GoalsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"home.mapv2\", {\r\n url: \"/mapv2\",\r\n templateUrl: \"app/home/mapv2/mapv2.html\",\r\n data: { pageTitle: \"Mapv2\" },\r\n controller: \"MapV2Ctrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"home.heatMap\", {\r\n url: \"/heatMap\",\r\n templateUrl: \"app/home/heatMap/heatMap.html\",\r\n data: { pageTitle: \"Mapa de Calor\" },\r\n controller: \"HeatMapCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"home.heatMapMargin\", {\r\n url: \"/heatMapMargin\",\r\n templateUrl: \"app/home/heatMap/heatMapMargin.html\",\r\n data: { pageTitle: \"Mapa de Calor\" },\r\n controller: \"HeatMapMarginCtrl\",\r\n controllerAs: \"ct\",\r\n params: {\r\n 'categoryId': 0\r\n }\r\n })\r\n .state(\"home.deviations\", {\r\n url: \"/deviations\",\r\n templateUrl: \"app/home/deviations/deviations.html\",\r\n data: { pageTitle: \"Analysis of deviations\" },\r\n controller: \"DeviationsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"home.benchmarks\", {\r\n url: \"/benchmarks\",\r\n templateUrl: \"app/home/benchmarks/benchmarks.html\",\r\n data: { pageTitle: \"Benchmarks\" },\r\n controller: \"BenchmarksCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"home.weather\", {\r\n url: \"/weather\",\r\n templateUrl: \"app/home/weather/weather.html\",\r\n data: { pageTitle: \"Analysis of weather\" },\r\n controller: \"WeatherCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"home.bcgmatrix\", {\r\n url: \"/matrizbcg\",\r\n templateUrl: \"app/home/bcgmatrix/bcgmatrix.html\",\r\n data: { pageTitle: \"Matriz BCG\" },\r\n controller: \"BcgMatrixCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"home.pivot\", {\r\n url: \"/pivot\",\r\n templateUrl: \"app/home/pivot/pivot.html\",\r\n data: { pageTitle: \"Pivot\" },\r\n controller: \"PivotCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"home.notifications\", {\r\n url: \"/notifications\",\r\n templateUrl: \"app/home/notifications/notifications.html\",\r\n data: { pageTitle: \"Notifications\" },\r\n controller: \"NotificationsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"home.categoryTreeMap\", {\r\n url: \"/categoryTreeMap\",\r\n templateUrl: \"app/home/categoryTreeMap/categoryTreeMap.html\",\r\n data: { pageTitle: \"CategoryTreeMap\" },\r\n controller: \"CategoryTreeMapCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"home.categoryDst\", {\r\n url: \"/category-data-story-telling/:type\",\r\n templateUrl: \"app/home/dst/dst.html\",\r\n data: { pageTitle: \"DST - Categorias\" },\r\n controller: \"DstCtrl\",\r\n controllerAs: \"ct\",\r\n params: {\r\n 'type': 'category'\r\n }\r\n })\r\n .state(\"home.scorecard\", {\r\n url: \"/scorecard\",\r\n templateUrl: \"app/home/scorecard/scorecard.html\",\r\n data: { pageTitle: \"Scorecard - Categorias\" },\r\n controller: \"ScorecardCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"inventory\", {\r\n abstract: true,\r\n url: \"/inventory\",\r\n templateUrl: \"app/components/common/content.html\"\r\n })\r\n .state(\"inventory.stockAnalysis\", {\r\n url: \"/stockAnalysis\",\r\n templateUrl: \"app/inventory/stockAnalysis/stockAnalysis.html\",\r\n data: { pageTitle: \"Analisis de Inventarios\" },\r\n controller: \"StockAnalysisCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n\r\n .state(\"home.assortmentReport\", {\r\n url: \"/assortmentReport\",\r\n templateUrl: \"app/home/assortmentReport/assortmentReport.html\",\r\n data: { pageTitle: \"Assortment Report\" },\r\n controller: \"AssortmentReportCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n\r\n .state(\"prices\", {\r\n abstract: true,\r\n url: \"/prices\",\r\n templateUrl: \"app/components/common/content.html\"\r\n })\r\n .state(\"prices.volumeMeasurement\", {\n url: \"/volumeMeasurement\",\n templateUrl: \"app/prices/reports/volumeMeasurement.html\",\n data: { pageTitle: \"Medici�n de Volumen\" },\n controller: \"VolumeMeasurementCtrl\",\n controllerAs: \"ct\"\n })\r\n .state(\"prices.evolutionReport\", {\r\n url: \"/evolutionReport\",\r\n templateUrl: \"app/prices/reports/priceEvolutionReport.html\",\r\n data: { pageTitle: \"Reporte Evoluci�n de Precios\" },\r\n controller: \"PriceEvolutionReportCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.weeklyReport\", {\r\n url: \"/weeklyReport\",\r\n templateUrl: \"app/prices/reports/priceWeeklyReport.html\",\r\n data: { pageTitle: \"Reporte semanal\" },\r\n controller: \"PriceWeeklyReportCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.informedPrices\", {\r\n url: \"/informedPrices\",\r\n templateUrl: \"app/prices/reports/informedPricesReport.html\",\r\n data: { pageTitle: \"Reporte semanal\" },\r\n controller: \"InformedPricesReportCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.competitorsPrices\", {\r\n url: \"/competitorsPrices\",\r\n templateUrl: \"app/prices/reports/competitorsPrices.html\",\r\n data: { pageTitle: \"Reporte Precios de Competidores\" },\r\n controller: \"CompetitorsPricesReportCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.dailyMarginReport\", {\r\n url: \"/dailyMarginReport\",\r\n templateUrl: \"app/prices/reports/dailyMarginReport.html\",\r\n data: { pageTitle: \"Reporte de Margenes Diarios\" },\r\n controller: \"DailyMarginReportCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.competitiveIndex\", {\r\n url: \"/competitiveIndex\",\r\n templateUrl: \"app/prices/reports/competitiveIndex.html\",\r\n data: { pageTitle: \"Indice de Competitividad\" },\r\n controller: \"CompetitiveIndexCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.competitivePositionReport\", {\r\n url: \"/competitivePositionReport\",\r\n templateUrl: \"app/prices/reports/priceCompetitivePositionReport.html\",\r\n data: { pageTitle: \"Gr�fico de posici�n Competitiva\" },\r\n controller: \"PriceCompetitivePositionReportCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.competitiveReport\", {\r\n url: \"/competitiveReport\",\r\n templateUrl: \"app/prices/reports/priceCompetitiveReport.html\",\r\n data: { pageTitle: \"Gr�fico de Competitividad\" },\r\n controller: \"PriceCompetitiveReportCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.itemSensitivities\", {\r\n url: \"/itemSensitivities\",\r\n templateUrl: \"app/prices/itemSensitivities/itemSensitivities.html\",\r\n data: { pageTitle: \"Sensibilidad de Precios\" },\r\n controller: \"ItemSensitivitiesCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.editItemSensitivities\", {\r\n url: \"/itemSensitivities/:itemSensitivityId\",\r\n templateUrl: \"app/prices/itemSensitivities/editItemSensitivity.html\",\r\n data: { pageTitle: \"Sensibilidad de Precios\" },\r\n controller: \"EditItemSensitivityCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.categorySummary\", {\r\n url: \"/category-summary\",\r\n templateUrl: \"app/prices/categorySummary/category-summary.html\",\r\n data: { pageTitle: \"Decisions\" },\r\n controller: \"CategorySummaryCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.competitors\", {\r\n url: \"/competitors\",\r\n templateUrl: \"app/prices/competitors/competitors.html\",\r\n data: { pageTitle: \"Competidores\" },\r\n controller: \"CompetitorsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.priceMap\", {\r\n url: \"/priceMap/:itemId/:priceListId\",\r\n templateUrl: \"app/prices/priceMap/priceMap.html\",\r\n data: { pageTitle: \"Mapa de Precios\" },\r\n params: {\r\n 'itemId': '0',\r\n 'priceListId': '0'\r\n },\r\n controller: \"PriceMapCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.decisions\", {\r\n url: \"/decisions/:categoryId?endorse=:isEndorse&catg=:categoryGroup&cat=:category&subcat=:subcategory&newf=:new\",\r\n templateUrl: companyJson.Navigation.UsePriceRedesign ? \"app/prices/decisions/redesign/decisions.html\" : \"app/prices/decisions/decisions.html\",\r\n data: { pageTitle: \"Decisions\" },\r\n params: {\r\n 'categoryId': '0',\r\n 'categoryGroup': '',\r\n 'category': '',\r\n 'subcategory': '',\r\n 'isEndorse': '',\r\n 'new': 'false'\r\n },\r\n controller: companyJson.Navigation.UsePriceRedesign ? \"PriceDecisionsCtrl\" : \"DecisionsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.decisionsRedesigned\", {\r\n url: \"/decisions/redesign/:categoryId?endorse=:isEndorse&catg=:categoryGroup&cat=:category&subcat=:subcategory&newf=:new\",\r\n templateUrl: \"app/prices/decisions/redesign/decisions.html\",\r\n data: { pageTitle: \"Decisions\" },\r\n params: {\r\n 'categoryId': '0',\r\n 'categoryGroup': '',\r\n 'category': '',\r\n 'subcategory': '',\r\n 'isEndorse': '',\r\n 'new': 'false'\r\n },\r\n controller: \"PriceDecisionsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.rulesCategory\", {\r\n url: \"/rules\",\r\n templateUrl: \"app/prices/rulesCategory/rules-category.html\",\r\n data: { pageTitle: \"Estrategias y Reglas de Precios\" },\r\n controller: \"PricesRulesCategoryCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.rules\", {\r\n url: \"/rules/:categoryId/:categoryGroup/:category/:subcategory\",\r\n templateUrl: \"app/prices/rules/rules.html\",\r\n data: { pageTitle: \"Estrategias y Reglas de Precios\" },\r\n controller: \"PricesRulesCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.toInform\", {\r\n url: \"/output/toInform\",\r\n templateUrl: companyJson.Navigation.InformToErpWs ? \"app/prices/outputWS/priceOutputWS.html\" : \"app/prices/output/priceOutput.html\",\r\n data: { pageTitle: \"Informar al ERP\" },\r\n controller: companyJson.Navigation.InformToErpWs ? \"priceOutputWSCtrl\" : \"priceOutputCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.abTesting\", {\r\n url: \"/abTesting\",\r\n templateUrl: \"app/prices/abTesting/abTesting.html\",\r\n data: { pageTitle: \"AB Testing\" },\r\n controller: \"AbTestingCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.abTestingIndex\", {\r\n url: \"/abTestingIndex\",\r\n templateUrl: \"app/prices/abTestingIndex/abTestingIndex.html\",\r\n data: { pageTitle: \"AB Testing\" },\r\n controller: \"AbTestingIndexCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.abTestingReports\", {\r\n url: \"/abTestingReports/:abTestingId\",\r\n templateUrl: \"app/prices/abTestingReports/abTestingReports.html\",\r\n data: { pageTitle: \"AB Testing reporte\" },\r\n controller: \"AbTestingReportsCtrl\",\r\n controllerAs: \"ct\",\r\n params: {\r\n 'abTestingId': '0',\r\n }\r\n })\r\n .state(\"prices.priceChangesReport\", {\r\n url: \"/reports/priceChangesReport\",\r\n templateUrl: \"app/prices/reports/priceChangesReport.html\",\r\n data: { pageTitle: \"Reporte de Cambio de Precios\" },\r\n controller: \"PriceChangesReportCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.priceMapReport\", {\r\n url: \"/reports/priceMapReport\",\r\n templateUrl: \"app/prices/reports/priceMapReport.html\",\r\n data: { pageTitle: \"Reporte de mapa de Precios\" },\r\n controller: \"PriceMapReportCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.costs\", {\r\n url: \"/costs\",\r\n templateUrl: \"app/prices/costs/costs.html\",\r\n data: { pageTitle: \"Costos de Reposicion\" },\r\n controller: \"CostsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.editCost\", {\r\n url: \"/editCost\",\r\n templateUrl: \"app/prices/costs/editCost.html\",\r\n data: { pageTitle: \"Nuevo Costo de Reposicion\" },\r\n controller: \"EditCostCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.priceLists\", {\r\n url: \"/pricelists\",\r\n templateUrl: \"app/prices/pricelists/pricelists.html\",\r\n data: { pageTitle: \"Zona de Precios\" },\r\n controller: \"PricelistsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.editPricelist\", {\r\n url: \"/editPricelist/:priceListId\",\r\n templateUrl: \"app/prices/pricelists/editPricelist.html\",\r\n data: { pageTitle: \"Zona de Precios\" },\r\n controller: \"EditPricelistCtrl\",\r\n params: {\r\n 'priceListId': '0'\r\n },\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.priceListsSubsidies\", {\r\n url: \"/pricelistsSubsidies\",\r\n templateUrl: \"app/prices/pricelistsSubsidies/pricelistsSubsidies.html\",\r\n data: { pageTitle: \"Subsidios\" },\r\n controller: \"PricelistsSubsidiesCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.editPricelistSubsidies\", {\r\n url: \"/editPricelistSubsidies/:priceListSubsidyId\",\r\n templateUrl: \"app/prices/pricelistsSubsidies/editPricelistSubsidies.html\",\r\n data: { pageTitle: \"Subsidios\" },\r\n controller: \"EditPricelistSubsidiesCtrl\",\r\n params: {\r\n 'priceListSubsidiesId': '0'\r\n },\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.regions\", {\r\n url: \"/regions\",\r\n templateUrl: \"app/prices/regions/regions.html\",\r\n data: { pageTitle: \"Regiones\" },\r\n controller: \"PriceRegionsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.editRegion\", {\r\n url: \"/editRegions/:regionId\",\r\n templateUrl: \"app/prices/regions/editRegion.html\",\r\n data: { pageTitle: \"Regiones\" },\r\n controller: \"EditPriceRegionCtrl\",\r\n params: {\r\n 'regionId': '0'\r\n },\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"assortment\", {\r\n abstract: true,\r\n url: \"/assortment\",\r\n templateUrl: \"app/components/common/content.html\"\r\n })\r\n .state(\"assortment.categorySummary\", {\r\n url: \"/category-summary\",\r\n templateUrl: \"app/assortment/categorySummary/category-summary.html\",\r\n data: { pageTitle: \"Analisis de Surtido\" },\r\n controller: \"AssortmentCategorySummaryCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"assortment.decisions\", {\r\n url: \"/decisions/:categoryId/:subcategoryId/:clusterId?endorse=:isEndorse&catg=:categoryGroup&cat=:category&subcat=:subcategory\",\r\n templateUrl: \"app/assortment/decisions/decisions.html\",\r\n data: { pageTitle: \"Decisions\" },\r\n params: {\r\n 'categoryId': '0',\r\n 'subcategoryId': '0',\r\n 'categoryGroup': '',\r\n 'category': '',\r\n 'subcategory': '',\r\n 'clusterId': '0',\r\n 'isEndorse': ''\r\n },\r\n controller: \"AssortmentDecisionsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"assortment.rules\", {\r\n url: \"/rules/:categoryId/:categoryGroup/:category/:subcategory\",\r\n templateUrl: \"app/assortment/rules/rules.html\",\r\n data: { pageTitle: \"Reglas de Surtido\" },\r\n controller: \"AssortmentRulesCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"assortment.rulesCategory\", {\r\n url: \"/rules\",\r\n templateUrl: \"app/assortment/rulesCategory/rules-category.html\",\r\n data: { pageTitle: \"Estrategias y Reglas de Surtido\" },\r\n controller: \"AssortmentRulesCategoryCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"assortment.outputErp\", {\r\n url: \"/output\",\r\n templateUrl: \"app/assortment/output/output.html\",\r\n data: { pageTitle: \"Salida ERP\" },\r\n controller: \"AssortmentOutputCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"assortment.outputErpCencosudColombia\", {\r\n url: \"/outputCencosudColombia\",\r\n templateUrl: \"app/assortment/output/outputColombia.html\",\r\n data: { pageTitle: \"Salida ERP\" },\r\n controller: \"AssortmentOutputColombiaCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"assortment.outputErpCencosudChile\", {\r\n url: \"/outputCencosudhile\",\r\n templateUrl: \"app/assortment/output/outputChile.html\",\r\n data: { pageTitle: \"Salida ERP\" },\r\n controller: \"AssortmentOutputChileCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"assortment.outputPrismaErp\", {\r\n url: \"/outputPrisma\",\r\n templateUrl: \"app/assortment/output/outputPrisma.html\",\r\n data: { pageTitle: \"Salida ERP\" },\r\n controller: \"AssortmentOutputPrismaCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"assortment.summaryReport\", {\r\n url: \"/summaryReport\",\r\n templateUrl: \"app/assortment/summaryReport/summary-report.html\",\r\n data: { pageTitle: \"Reporte Estatico y Dinamico\" },\r\n controller: \"AssortmentSummaryReportCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"assortment.clusterHierarchy\", {\r\n url: \"/clusterHierarchy\",\r\n templateUrl: \"app/assortment/clusterHierarchy/clusterHierarchy.html\",\r\n data: { pageTitle: \"Reporte de Cascadeo\" },\r\n controller: \"AssortmentClusterHierarchyCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"assortment.reports\", {\r\n url: \"/reports\",\r\n templateUrl: \"app/assortment/reports/reports.html\",\r\n data: { pageTitle: \"Reportes\" },\r\n controller: \"AssortmentReportsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"assortment.clusterCrossing\", {\r\n url: \"/clusterCrossing\",\r\n templateUrl: \"app/assortment/clusterCrossing/clusterCrossing.html\",\r\n data: { pageTitle: \"Cruce de Clusters\" },\r\n controller: \"AssortmentClusterCrossingCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"admin\", {\r\n abstract: true,\r\n url: \"/admin\",\r\n templateUrl: \"app/components/common/content.html\"\r\n })\r\n .state(\"admin.importers\", {\r\n abstract: true,\r\n url: \"/importers\",\r\n templateUrl: \"app/components/common/empty_view.html\"\r\n })\r\n .state(\"admin.importer\", {\r\n url: \"/importer/:importerType\",\r\n params: { \"importerType\": \"\" },\r\n templateUrl: \"app/admin/importers/importer.html\",\r\n data: { pageTitle: \"Importer\" },\r\n controller: \"ImporterCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"admin.cluster\", {\r\n url: \"/clusters\",\r\n templateUrl: \"app/admin/masters/cluster/cluster.html\",\r\n data: { pageTitle: \"Cluster\" },\r\n controller: \"ClusterCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"admin.stores\", {\r\n url: \"/stores\",\r\n templateUrl: \"app/admin/masters/stores/stores.html\",\r\n data: { pageTitle: \"Stores\" },\r\n controller: \"StoresCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"admin.editStores\", {\r\n url: \"/stores/:storeId\",\r\n templateUrl: \"app/admin/masters/stores/editStores.html\",\r\n data: { pageTitle: \"Stores\" },\r\n controller: \"EditStoresCtrl\",\r\n controllerAs: \"ct\",\r\n params: {\r\n 'storeId': '0',\r\n }\r\n })\r\n .state(\"admin.items\", {\r\n url: \"/items\",\r\n templateUrl: \"app/admin/masters/items/items.html\",\r\n data: { pageTitle: \"Items\" },\r\n controller: \"ItemsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"admin.editItem\", {\r\n url: \"/item/:itemId\",\r\n templateUrl: \"app/admin/masters/items/editItem.html\",\r\n data: { pageTitle: \"Items\" },\r\n controller: \"EditMasterItemCtrl\",\r\n params: {\r\n 'itemId': '0'\r\n },\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"admin.brands\", {\r\n url: \"/brands\",\r\n templateUrl: \"app/admin/masters/brands/brands.html\",\r\n data: { pageTitle: \"Brands\" },\r\n controller: \"BrandsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"admin.managementItems\", {\r\n url: \"/managementItems\",\r\n templateUrl: \"app/admin/masters/managementItems/managementItems.html\",\r\n data: { pageTitle: \"managementItems\" },\r\n controller: \"ManagementItemsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"admin.missions\", {\r\n url: \"/missions\",\r\n templateUrl: \"app/admin/missions/missions.html\",\r\n data: { pageTitle: \"Missions\" },\r\n controller: \"MissionsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"admin.editMissions\", {\r\n url: \"/Missions/:missionId\",\r\n templateUrl: \"app/admin/Missions/editMissions.html\",\r\n data: { pageTitle: \"Missions\" },\r\n controller: \"EditMissionsCtrl\",\r\n controllerAs: \"ct\",\r\n params: {\r\n 'MissionsId': '0',\r\n }\r\n })\r\n .state(\"admin.interfaces\", {\r\n url: \"/interfaces/:batchIdentifier\",\r\n params: { \"batchIdentifier\": \"\" },\r\n templateUrl: \"app/admin/interface/interface.html\",\r\n data: { pageTitle: \"Interfaces\" },\r\n controller: \"InterfaceCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"admin.reports\", {\r\n abstract: true,\r\n url: \"/reports\",\r\n templateUrl: \"app/components/common/empty_view.html\"\r\n })\r\n .state(\"admin.reports.itemsToIgnore\", {\r\n url: \"/items-to-ignore\",\r\n templateUrl: \"app/admin/reports/itemsToIgnore/itemsToIgnore.html\",\r\n data: { pageTitle: \"ItemsToIgnore\" },\r\n controller: \"ItemsToIgnoreCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"admin.security\", {\r\n abstract: true,\r\n url: \"/security\",\r\n templateUrl: \"app/components/common/empty_view.html\"\r\n })\r\n .state(\"admin.security.roles\", {\r\n url: \"/roles\",\r\n templateUrl: \"app/admin/security/roles/roles.html\",\r\n data: { pageTitle: \"Roles\" },\r\n controller: \"RolesCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"admin.security.users\", {\r\n url: \"/users\",\r\n templateUrl: \"app/admin/security/users/users.html\",\r\n data: { pageTitle: \"Roles\" },\r\n controller: \"UsersCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"admin.security.audit\", {\r\n url: \"/audit\",\r\n templateUrl: \"app/admin/security/audit/audit.html\",\r\n data: { pageTitle: \"Auditoria\" },\r\n controller: \"AuditCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"admin.security.reports\", {\r\n url: \"/reports\",\r\n templateUrl: \"app/admin/security/reports/reports.html\",\r\n data: { pageTitle: \"Reportes\" },\r\n controller: \"ReportsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions\", {\r\n abstract: true,\r\n url: \"/promotions\",\r\n templateUrl: \"app/components/common/content.html\"\r\n })\r\n .state(\"promotions.promotionalProcesses\", {\r\n url: \"/promotionalProcesses\",\r\n templateUrl: \"app/promotions/promotionalProcesses/promotionalProcesses.html\",\r\n data: { pageTitle: \"test\" },\r\n controller: \"promotionalProcessesCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.promotions\", {\r\n url: \"/promotions\",\r\n templateUrl: \"app/promotions/promotions/promotions.html\",\r\n data: { pageTitle: \"Acciones Promocionales\" },\r\n controller: \"promotionsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.editPromotion\", {\r\n url: \"/promotions/:promotionId/:taskId/:promotionType/:copy/:readOnly\",\r\n templateUrl: \"app/promotions/promotions/editPromotion.html\",\r\n data: { pageTitle: \"Editar Accion Promocional\" },\r\n params: {\r\n 'promotionId': '0',\r\n 'taskId': '0',\r\n 'promotionType': '',\r\n 'copy': 'false',\r\n 'readOnly':'false'\r\n },\r\n controller: \"editPromotionCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.editInternalPromotion\", {\r\n url: \"/internalPromotions/:promotionId/:promotionMediaPageId/:readOnly/:copy/:rejected\",\r\n templateUrl: \"app/promotions/promotions/editInternalPromotion.html\",\r\n data: { pageTitle: \"Editar Accion Promocional\" },\r\n params: {\r\n 'promotionId': '0',\r\n 'promotionMediaPageId': '0',\r\n 'readOnly': 'false',\r\n 'copy': 'false',\r\n 'rejected': 'false'\r\n },\r\n controller: \"editInternalPromotionCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.promotionSearch\", {\r\n url: \"/promotionSearch\",\r\n templateUrl: \"app/promotions/promotions/promotionSearch.html\",\r\n data: { pageTitle: \"Busqueda avanzada\" },\r\n controller: \"promotionSearchCtrl\",\r\n controllerAs: \"ct\"\r\n }) \r\n .state(\"promotions.layouts\", {\r\n url: \"/layouts\",\r\n templateUrl: \"app/promotions/layouts/layouts.html\",\r\n data: { pageTitle: \"Layouts de P�ginas\" },\r\n controller: \"layoutsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.rules\", {\r\n url: \"/rules\",\r\n templateUrl: \"app/promotions/rules/promotionRules.html\",\r\n data: { pageTitle: \"Promotion Rules\" },\r\n controller: \"promotionRulesCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.editRule\", {\r\n url: \"/rules/edit/:promotionRuleId\",\r\n templateUrl: \"app/promotions/rules/editPromotionRule.html\",\r\n data: { pageTitle: \"Promotion Rules\" },\r\n params: {\r\n 'promotionRuleId': '0'\r\n },\r\n controller: \"editPromotionRuleCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.layout\", {\r\n url: \"/layouts/:layoutId\",\r\n templateUrl: \"app/promotions/layouts/editLayout.html\",\r\n data: { pageTitle: \"Editar o Crear Layout\" },\r\n params: {\r\n 'layoutId': '0'\r\n },\r\n controller: \"EditPromotionLayoutCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.controlPanel\", {\r\n url: \"/controlPanel\",\r\n templateUrl: \"app/promotions/controlPanel/controlPanel.html\",\r\n data: { pageTitle: \"test\" },\r\n controller: \"controlPanelCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.comunication\", {\r\n url: \"/comunication/:taskId\",\r\n templateUrl: \"app/promotions/comunication/comunication.html\",\r\n data: { pageTitle: \"Acciones Promocionales Vigentes\" },\r\n params: {\r\n 'taskId': '0'\r\n },\r\n controller: \"comunicationCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.prices\", {\r\n url: \"/prices/:promotionId/:taskId\",\r\n templateUrl: \"app/promotions/prices/prices.html\",\r\n data: { pageTitle: \"Cierre de Precios\" },\r\n params: {\r\n 'promotionId': '0',\r\n 'taskId': '0'\r\n },\r\n controller: \"pricesCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.campaigns\", {\r\n url: \"/campaigns\",\r\n templateUrl: \"app/promotions/campaigns/campaigns.html\",\r\n data: { pageTitle: \"Campa�as Promocionales\" },\r\n controller: \"promotionalCampaignsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.editcampaign\", {\r\n url: \"/campaigns/:campaignId\",\r\n templateUrl: \"app/promotions/campaigns/editCampaign.html\",\r\n data: { pageTitle: \"Campa�a Promocional\" },\r\n params: {\r\n 'campaignId': '0'\r\n },\r\n controller: \"editPromotionalCampaignCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.workflows\", {\r\n url: \"/workflows\",\r\n templateUrl: \"app/promotions/workflows/workflows.html\",\r\n data: { pageTitle: \"Procesos Promocionales\" },\r\n controller: \"promotionalWorkflowsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.editworkflow\", {\r\n url: \"/workflows/:workflowId\",\r\n templateUrl: \"app/promotions/workflows/editWorkflow.html\",\r\n data: { pageTitle: \"Proceso Promocional\" },\r\n params: {\r\n 'workflowId': '0'\r\n },\r\n controller: \"editPromotionalWorkflowCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.layoutsassignment\", {\r\n url: \"/layoutsassignment/:promotionId/:taskId\",\r\n templateUrl: \"app/promotions/layouts/layoutsAssignment.html\",\r\n data: { pageTitle: \"Asignar Layouts\" },\r\n params: {\r\n 'promotionId': '0',\r\n 'taskId': '0'\r\n },\r\n controller: \"layoutsAssignmentCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.myTasks\", {\r\n url: \"/myTasks\",\r\n templateUrl: \"app/promotions/myTasks/myTasks.html\",\r\n data: { pageTitle: \"test\" },\r\n controller: \"myTasksCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.editItem\", {\r\n url: \"/editItem/:promotionMediaPageId/:taskId/:position/:isHighlighted/:isSubstitute/:promotionItemId/:promotionId/:promotionItemType/:salesUnitOfMeasureId\",\r\n templateUrl: \"app/promotions/items/editItem.html\",\r\n data: { pageTitle: \"Editar Item Relacionado a la Promocion\" },\r\n params: {\r\n 'promotionMediaPageId': '0',\r\n 'position': '0',\r\n 'isHighlighted': 'False',\r\n 'isSubstitute': 'False',\r\n 'taskId': '0',\r\n 'promotionItemId': '0',\r\n 'promotionId': '0',\r\n 'promotionItemType': '0',\r\n 'salesUnitOfMeasureId': '0'\r\n },\r\n controller: \"editItemCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.editMechanic\", {\r\n url: \"/editMechanic/:promotionMediaPageId/:taskId/:position/:isHighlighted/:isSubstitute/:promotionItemId/:promotionMechanicId/:promotionId/:promotionItemType/:isEditPanguiCode\",\r\n templateUrl: \"app/promotions/mechanics/editMechanic.html\",\r\n data: { pageTitle: \"Editar Mecanica Relacionada a la Promocion\" },\r\n params: {\r\n 'promotionMediaPageId': '0',\r\n 'taskId': '0',\r\n 'position': '0',\r\n 'isHighlighted': 'False',\r\n 'isSubstitute': 'False',\r\n 'promotionItemId': '0',\r\n 'promotionMechanicId': '0',\r\n 'promotionId': '0',\r\n 'promotionItemType': '0',\r\n 'isEditPanguiCode': 'False'\r\n },\r\n controller: \"editMechanicCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.calendar\", {\r\n url: \"/calendar/:promotionId/:taskId\",\r\n templateUrl: \"app/promotions/promotions/calendar.html\",\r\n data: { pageTitle: \"Calendario Promocional\" },\r\n params: {\r\n 'promotionId': '0',\r\n 'taskId': '0'\r\n },\r\n controller: \"promotionsCalendarCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.addItemToLayout\", {\r\n url: \"/addItemToLayout/:promotionId/:taskId/:promotionMediaPageId\",\r\n templateUrl: \"app/promotions/addItemToLayout/addItemToLayout.html\",\r\n data: { pageTitle: \"Agregar Items\" },\r\n params: {\r\n 'promotionId': '0',\r\n 'taskId': '0',\r\n 'promotionMediaPageId': '0',\r\n 'isLayoutImageUpload': 'false',\r\n 'isPrintLayoutCompare': 'false'\r\n },\r\n controller: \"addItemToLayoutCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.printLayoutCompare\", {\r\n url: \"/printLayoutCompare/:promotionId/:taskId/:promotionMediaPageId\",\r\n templateUrl: \"app/promotions/addItemToLayout/addItemToLayout.html\",\r\n data: { pageTitle: \"Agregar Items\" },\r\n params: {\r\n 'promotionId': '0',\r\n 'taskId': '0',\r\n 'promotionMediaPageId': '0',\r\n 'isLayoutImageUpload': 'false',\r\n 'isPrintLayoutCompare': 'true'\r\n },\r\n controller: \"addItemToLayoutCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.layoutImageUpload\", {\r\n url: \"/layoutImageUpload/:promotionId/:taskId/:promotionMediaPageId\",\r\n templateUrl: \"app/promotions/addItemToLayout/addItemToLayout.html\",\r\n data: { pageTitle: \"Agregar Items\" },\r\n params: {\r\n 'promotionId': '0',\r\n 'taskId': '0',\r\n 'promotionMediaPageId': '0',\r\n 'isLayoutImageUpload': 'true',\r\n 'isPrintLayoutCompare': 'false'\r\n },\r\n controller: \"addItemToLayoutCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.finalValidation\", {\r\n url: \"/finalValidation/:promotionId/:taskId/:promotionMediaPageId\",\r\n templateUrl: \"app/promotions/addItemToLayout/addItemToLayout.html\",\r\n data: { pageTitle: \"validacion final\" },\r\n params: {\r\n 'taskId': '0',\r\n 'isLayoutImageUpload': 'true',\r\n 'isPrintLayoutCompare': 'true'\r\n },\r\n controller: \"addItemToLayoutCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.forecastImporter\", {\r\n url: \"/forecastImporter/:promotionId/:taskId\",\r\n templateUrl: \"app/promotions/items/forecastImporter.html\",\r\n data: { pageTitle: \"Agregar Items\" },\r\n params: {\r\n 'promotionId': '0',\r\n 'taskId': '0',\r\n 'promotionMediaPageId': '0'\r\n },\r\n controller: \"forecastImporterCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.supplying\", {\r\n url: \"/supplying/:promotionId/:taskId\",\r\n templateUrl: \"app/promotions/supplying/supplying.html\",\r\n data: { pageTitle: \"Abastecimiento\" },\r\n params: {\r\n 'taskId': '0',\r\n 'promotionId': '0'\r\n },\r\n controller: \"supplyingCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.AssortmentActivation\", {\r\n url: \"/AssortmentActivation/:taskId\",\r\n templateUrl: \"app/promotions/AssortmentActivation/AssortmentActivation.html\",\r\n data: { pageTitle: \"Activacion de surtido\" },\r\n params: {\r\n 'taskId': '0'\r\n },\r\n controller: \"AssortmentActivationCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.storeControlAndExhibition\", {\r\n url: \"/storeControlAndExhibition/:taskId\",\r\n templateUrl: \"app/promotions/storeControlAndExhibition/storeControlAndExhibition.html\",\r\n data: { pageTitle: \"Control y Exhibicion en tienda\" },\r\n params: {\r\n 'taskId': '0'\r\n },\r\n controller: \"storeControlAndExhibitionCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.2reviewTradeAgreements\", {\r\n url: \"/reviewTradeAgreements/:promotionId/:taskId/:promotionMediaPageId\",\r\n templateUrl: \"app/promotions/addItemToLayout/addItemToLayout.html\",\r\n data: { pageTitle: \"Revision de acuerdos comerciales\" },\r\n params: {\r\n 'promotionId': '0',\r\n 'taskId': '0',\r\n 'promotionMediaPageId': '0',\r\n 'isLayoutImageUpload': 'false',\r\n 'isPrintLayoutCompare': 'false',\r\n 'isLayoutForReview': 'true'\r\n },\r\n controller: \"addItemToLayoutCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.activation\", {\r\n url: \"/activation/:taskId/:promotionId\",\r\n templateUrl: \"app/promotions/activation/activation.html\",\r\n data: { pageTitle: \"Activacion\" },\r\n params: {\r\n 'taskId': '0',\r\n 'promotionId': '0'\r\n },\r\n controller: \"activationCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.reviewTradeAgreements\", {\r\n url: \"/reviewTradeAgreements/:taskId\",\r\n templateUrl: \"app/promotions/reviewTradeAgreements/reviewTradeAgreements.html\",\r\n data: { pageTitle: \"Revision de acuerdos comerciales\" },\r\n params: {\r\n 'taskId': '0'\r\n },\r\n controller: \"reviewTradeAgreementsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.priceSurveys\", {\r\n url: \"/priceSurveys/:taskId\",\r\n templateUrl: \"app/promotions/priceSurveys/priceSurveys.html\",\r\n data: { pageTitle: \"Relevamiento de precios\" },\r\n params: {\r\n 'taskId': '0'\r\n },\r\n controller: \"priceSurveysCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.downloadBIReport\", {\r\n url: \"/BIReport\",\r\n templateUrl: \"app/promotions/promotions/BIReport.html\",\r\n data: { pageTitle: \"Descargar reporte para BI\" },\r\n controller: \"BIReportCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.downloadOverlappingReport\", {\r\n url: \"/overlappingReport\",\r\n templateUrl: \"app/promotions/promotions/overlappingReport.html\",\r\n data: { pageTitle: \"Descargar reporte de solapamientos\" },\r\n controller: \"overlappingReportCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"promotions.reports\", {\r\n url: \"/reports\",\r\n templateUrl: \"app/promotions/reports/reports.html\",\r\n data: { pageTitle: \"Reportes\" },\r\n controller: \"reportsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.priceRoundings\", {\r\n url: \"/priceRoundings\",\r\n templateUrl: \"app/prices/priceRoundings/priceRoundings.html\",\r\n data: { pageTitle: \"Reglas de Redondeo\" },\r\n controller: \"PriceRoundingsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"prices.editPriceRoundings\", {\r\n url: \"/priceRoundings/:priceTypeId\",\r\n templateUrl: \"app/prices/priceRoundings/editPriceRoundings.html\",\r\n data: { pageTitle: \"Regla de Redondeo\" },\r\n params: {\r\n 'priceTypeId': '-1'\r\n },\r\n controller: \"editPriceRoundingsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"spaces\", {\r\n abstract: true,\r\n url: \"/spaces\",\r\n templateUrl: \"app/components/common/content.html\"\r\n })\r\n .state(\"spaces.createPlanogram\", {\r\n url: \"/planograms/create/:planogramId/:copyFromPlanogramId\",\r\n templateUrl: \"app/spaces/planograms/createPlanogram.html\",\r\n params: {\r\n planogramId: '0',\r\n copyFromPlanogramId: '0'\r\n },\r\n controller: \"CreatePlanogramCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"spaces.createPlanogramOld\", {\r\n // TODO: Eliminar al terminar de integrar la edici�n SVG.\r\n url: \"/planograms/createold/:planogramId/:copyFromPlanogramId\",\r\n templateUrl: \"app/spaces/planograms/createPlanogram.html\",\r\n params: {\r\n planogramId: '0',\r\n copyFromPlanogramId: '0'\r\n },\r\n controller: \"CreatePlanogramCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"spaces.importPlanogram\", {\r\n url: \"/planograms/import\",\r\n templateUrl: \"app/spaces/planograms/createPlanogram.html\",\r\n controller: \"CreatePlanogramCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"spaces.editPlanogram\", {\r\n url: \"/planograms/edit/:planogramId/:itemId/:clusterId\",\r\n templateUrl: \"app/spaces/planograms/editPlanogram.html\",\r\n params: {\r\n planogramId: '0',\r\n itemId: '0',\r\n clusterId: '0'\r\n },\r\n controller: \"EditPlanogramCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n // TODO: Eliminar al terminar de integrar la edici�n SVG.\r\n .state(\"spaces.editPlanogramOld\", {\r\n url: \"/planograms/editold/:planogramId/:itemId/:clusterId\",\r\n templateUrl: \"app/spaces/planograms/editPlanogram.html\",\r\n params: {\r\n planogramId: '0',\r\n itemId: '0',\r\n clusterId: '0'\r\n },\r\n controller: \"EditPlanogramCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"spaces.viewPlanogram\", {\r\n url: \"/planograms/view/:planogramId\",\r\n templateUrl: \"app/spaces/planograms/editPlanogram.html\",\r\n params: { planogramId: '1' },\r\n controller: \"EditPlanogramCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n //TODO: Eliminar al terminar de integrar la edici�n SVG.\r\n .state(\"spaces.viewPlanogramOld\", {\r\n url: \"/planograms/viewold/:planogramId\",\r\n templateUrl: \"app/spaces/planograms/editPlanogram.html\",\r\n params: { planogramId: '1' },\r\n controller: \"EditPlanogramCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"spaces.editLayout\", {\r\n url: \"/layouts/edit/:layoutId\",\r\n templateUrl: \"app/spaces/layouts/editLayout.html\",\r\n data: { pageTitle: \"test\" },\r\n params: {\r\n 'layoutId': '0'\r\n },\r\n controller: \"editSpacesLayoutCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n\r\n\r\n .state(\"markdowns\", {\r\n abstract: true,\r\n url: \"/markdowns\",\r\n templateUrl: \"app/components/common/content.html\"\r\n })\r\n .state(\"markdowns.categorySummary\", {\r\n url: \"/summary\",\r\n templateUrl: \"app/markdowns/categorySummary/category-summary-markdowns.html\",\r\n data: { pageTitle: \"Decisiones de liquidaciones\" },\r\n controller: \"CategorySummaryMarkdownsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"markdowns.decisions\", {\r\n url: \"/decisions/:categoryId?catg=:categoryGroup&cat=:category&type=:decisionType\",\r\n templateUrl: \"app/markdowns/decisions/markdownDecisions.html\",\r\n data: { pageTitle: \"Decisiones de liquidaciones\" },\r\n controller: \"MarkdownDecisionsCtrl\",\r\n controllerAs: \"ct\",\r\n\r\n //url: \"/decisions/:categoryId?endorse=:isEndorse&catg=:categoryGroup&cat=:category&subcat=:subcategory&newf=:new\",\r\n params: {\r\n 'categoryId': '0',\r\n 'categoryGroup': '',\r\n 'category': '',\r\n 'decisionType': '0'\r\n },\r\n })\r\n .state(\"markdowns.rulesCategory\", {\r\n url: \"/rules\",\r\n templateUrl: \"app/markdowns/rulesCategory/markdownRulesCategories.html\",\r\n data: { pageTitle: \"Estrategias y Reglas de liquidaciones\" },\r\n controller: \"MarkdownRulesCategoryCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"markdowns.rulesSelection\", {\r\n url: \"/rulesSelection\",\r\n templateUrl: \"app/markdowns/rulesSelection/markdownRulesSelection.html\",\r\n data: { pageTitle: \"Seleccion de reglas\" },\r\n controller: \"MarkdownRulesSelectionCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"markdowns.rulesCreation\", {\r\n url: \"/rulesCreation\",\r\n templateUrl: \"app/markdowns/rulesCreation/markdownRulesCreation.html\",\r\n data: { pageTitle: \"Creacion de reglas\" },\r\n controller: \"MarkdownRulesCreationCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"markdowns.activation\", {\r\n url: \"/activation\",\r\n templateUrl: \"app/markdowns/activation/markdownActivation.html\",\r\n data: { pageTitle: \"Activacion\" },\r\n controller: \"MarkdownActivationCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"markdowns.importer\", {\r\n url: \"/importer/:importerType\",\r\n params: { \"importerType\": \"\" },\r\n templateUrl: \"app/admin/importers/importer.html\",\r\n data: { pageTitle: \"Importer\" },\r\n controller: \"ImporterCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"spaces.viewLayout\", {\r\n url: \"/layouts/view/:layoutId\",\r\n templateUrl: \"app/spaces/layouts/editLayout.html\",\r\n data: { pageTitle: \"test\" },\r\n params: {\r\n 'layoutId': '0',\r\n },\r\n controller: \"editSpacesLayoutCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"spaces.viewLayoutWithChange\", {\r\n url: \"/layouts/view/:layoutId/:planogramIdChange\",\r\n templateUrl: \"app/spaces/layouts/editLayout.html\",\r\n data: { pageTitle: \"test\" },\r\n params: {\r\n 'layoutId': '0',\r\n 'planogramIdChange': '0'\r\n },\r\n controller: \"editSpacesLayoutCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"spaces.layouts\", {\r\n url: \"/layouts\",\r\n templateUrl: \"app/spaces/layouts/layouts.html\",\r\n data: { pageTitle: \"test\" },\r\n controller: \"spacesLayoutsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"spaces.generalKpis\", {\r\n url: \"/generalKpis\",\r\n templateUrl: \"app/spaces/reports/generalKpis.html\",\r\n data: { pageTitle: \"KPIs Generales\" },\r\n controller: \"GeneralKpisCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"spaces.itemsByAssortment\", {\r\n url: \"/itemsByAssortment\",\r\n templateUrl: \"app/spaces/reports/itemsByAssortment.html\",\r\n data: { pageTitle: \"Articulos por Surtido\" },\r\n controller: \"ItemsByAssortmentCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"spaces.tickets\", {\r\n url: \"/tickets/:planogramLevelItemId/:layoutObjectId\",\r\n templateUrl: \"app/spaces/tickets/tickets.html\",\r\n data: { pageTitle: \"test\" },\r\n controller: \"spacesTicketsCtrl\",\r\n controllerAs: \"ct\",\r\n params: {\r\n 'layoutObjectId': '0',\r\n 'planogramLevelItemId': '0'\r\n },\r\n })\r\n .state(\"spaces.ticketsTypes\", {\r\n url: \"/ticketsTypes\",\r\n templateUrl: \"app/spaces/ticketsTypes/ticketsTypes.html\",\r\n data: { pageTitle: \"test\" },\r\n controller: \"spacesTicketsTypesCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n .state(\"spaces.editTicketType\", {\r\n url: \"/ticketType/:ticketTypeId\",\r\n templateUrl: \"app/spaces/ticketsTypes/editTicketType.html\",\r\n data: { pageTitle: \"test\" },\r\n controller: \"EditTicketsTypesCtrl\",\r\n controllerAs: \"ct\",\r\n params: {\r\n ticketTypeId: '0',\r\n //name: '',\r\n //type: 1,\r\n //needsDescription: false,\r\n }\r\n })\r\n .state(\"spaces.planograms\", {\r\n url: \"/planograms\",\r\n templateUrl: \"app/spaces/planograms/planograms.html\",\r\n data: { pageTitle: \"test\" },\r\n controller: \"spacesPlanogramsCtrl\",\r\n controllerAs: \"ct\"\r\n })\r\n\r\n\r\n\r\n $urlRouterProvider.otherwise(\"/login\");\r\n\r\n //$locationProvider.html5Mode(true);\r\n\r\n }\r\n\r\n})();\r\n\r\n","(function () {\r\n 'use strict';\r\n \r\n angular\r\n .module('prisma')\r\n .config(config);\r\n\r\n function config($httpProvider) {\r\n $httpProvider.defaults.timeout = 0;\r\n $httpProvider.interceptors.push('authInterceptorService');\r\n\r\n }\r\n\r\n})();\r\n"]}