angular.module('fasit') .controller('KopieraLantmaeteridataCtrl', ['$scope', '$filter', 'sideDrawerService', 'lantmaeterietService', '$q', 'maeklarObjektPantbrevService', 'maeklarObjektTaxeringService', 'domainService', 'kommunService', '$rootScope', 'commonService', '$timeout', 'fbBroadcastService', function ($scope: fb.IKopieraLantmaeteridataScope, $filter: ng.IFilterService, sideDrawerService, lantmaeterietService: fb.ILantmaeterietService, $q: ng.IQService, maeklarObjektPantbrevService: fb.IMaeklarObjektPantbrevService, maeklarObjektTaxeringService: fb.IMaeklarObjektTaxeringService, domainService: fb.IDomainService, kommunService: fb.IKommunService, $rootScope: fb.IRootScope, commonService: fb.ICommonService, $timeout: ng.ITimeoutService, fbBroadcastService: fb.IFbBroadcastService) { var params = sideDrawerService.getParams(); var maeklarObjekt: fb.MaeklarObjektDO = params.maeklarObjekt; $scope.utdragData = lantmaeterietService.getUtdragImportera(maeklarObjekt.MaeklarObjektId.value); // objekt för att hålla koll på alla sidor som är en del av kopieringen $scope.PAGES = { MERGE_DATA: 0, SOEK_DUBLETTER: 1, MERGE_KONTAKTDATA: 2, EXISTERANDE_KONTAKTER_ACTIONS: 3, MERGE_ANDELAR: 4, DONE: 5 }; $scope.PAGE = $scope.PAGES.MERGE_DATA; // Statusar för sparningen (sista steget) $scope.STATUS = { PAAGAAR: 1, MISSLYCKADES: 2, KLAR: 3 }; var objektData = { Saeljare: lantmaeterietService.getSaeljareInfo(maeklarObjekt.MaeklarObjektId.value), Taxeringsdata: maeklarObjektTaxeringService.get(maeklarObjekt.MaeklarObjektId.value), Pantbrev: maeklarObjektPantbrevService.query(maeklarObjekt.MaeklarObjektId.value) }; $scope.data = { Saeljare: {}, upplaatelseform: domainService.upplatelseform.query(maeklarObjekt.ObjektTypId.value), kommuner: kommunService.query(true), }; // Objekt för att hantera visning av de olika data-merge sektionerna $scope.sections = { Taxering: { Ny: 0, Aendrad: 0, Borttagen: 0, hidden: true, fullView: true, header: $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.TAXERINGSENHETER') }, Pantbrev: { Ny: 0, Aendrad: 0, Borttagen: 0, hidden: true, fullView: true, header: $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.PANTBREV') }, Fastighetsdata: { Konflikter: 0, hidden: true, fullView: true, header: $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.FASTIGHETSDATA') }, Aegare: { hidden: false, fullView: true, header: $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.AEGARE') } }; var setFastighetsdataNumber = function (fasitVaerde: number, lmVaerde: any) { return { fasitVaerde: new fb.ChangeTrack(fasitVaerde), lmVaerde: new fb.ChangeTrack(lmVaerde), AerKonflikt: fasitVaerde !== undefined && fasitVaerde !== null && (fasitVaerde !== lmVaerde), ValdKaella: (!fasitVaerde || fasitVaerde !== lmVaerde) ? new fb.ChangeTrack(0) : new fb.ChangeTrack(null) }; }; var setFastighetsdataString = function (fasitVaerde: string, lmVaerde: any) { return { fasitVaerde: new fb.ChangeTrack(fasitVaerde), lmVaerde: new fb.ChangeTrack(lmVaerde), // Om den ena är null och den andra en tom sträng ska de ändå betraktas som samma // Om det inte finns något fasitvärde så ska lmvärdet användas automatiskt utan konflikt AerKonflikt: !!fasitVaerde && (fasitVaerde !== lmVaerde && !(!fasitVaerde && !lmVaerde)), ValdKaella: (!fasitVaerde || (fasitVaerde !== lmVaerde && !(!fasitVaerde && !lmVaerde))) ? new fb.ChangeTrack(0) : new fb.ChangeTrack(null) }; }; // När LM-data och kommuner laddats, sätt KommunId för LM om det går $q.all([$scope.utdragData.$promise, $scope.data.kommuner.$promise]).then(function () { var choosenKommun = _.find($scope.data.kommuner, function (kommun: fb.Kommun) { return (typeof $scope.utdragData.Kommunnamn === 'string' && typeof kommun.KommunNamn === 'string') && $scope.utdragData.Kommunnamn.toLowerCase() === kommun.KommunNamn.toLowerCase(); }); if (choosenKommun) { $scope.utdragData.KommunId = choosenKommun.KommunId; } //När utdragsdata laddats skapas konflikt-objekt för fastighetsdatan $scope.Fastighetsdata = { Upplaatelseform: setFastighetsdataNumber(maeklarObjekt.Upplaatelseform.value, $scope.utdragData.Upplaatelseform), KommunId: setFastighetsdataNumber(maeklarObjekt.KommunId.value, $scope.utdragData.KommunId), Fastighetsbeteckning: setFastighetsdataString(maeklarObjekt.Fastighetsbeteckning.value, $scope.utdragData.Fastighetsbeteckning), Postnummer: setFastighetsdataString(maeklarObjekt.Adress.Postnummer.value, $scope.utdragData.Postnummer), Postort: setFastighetsdataString(maeklarObjekt.Adress.Postort.value, $scope.utdragData.Postort), Adress: setFastighetsdataString(maeklarObjekt.Adress.AdressText.value, $scope.utdragData.Adress), TomtYta: setFastighetsdataNumber(maeklarObjekt.TomtYta.value, $scope.utdragData.Tomtyta), KommunalPlan: setFastighetsdataString(maeklarObjekt.KommunalPlan.value, $scope.utdragData.SenasteBeslutadePlanen), KommunalPlanGenomfoerandeTid: setFastighetsdataString(maeklarObjekt.GenomfoerandeTidFoerKommunalPlan.value, $scope.utdragData.SenasteBeslutadePlanensGenomfoerandeSlut), VA: setFastighetsdataString(maeklarObjekt.VABeskr.value, $scope.utdragData.VA), GAOchSamfaelligheterOchServitut: setFastighetsdataString(maeklarObjekt.RattigheterEllerServitut.value, $scope.utdragData.GAOchSamfaelligheterOchServitut), ByggnadsAar: setFastighetsdataString(maeklarObjekt.ByggnadsAar.value, $scope.utdragData.Byggaar), ByggnadsAarKommentar: setFastighetsdataString(maeklarObjekt.ByggnadsAarKommentar.value, $scope.utdragData.ByggaarKommentar), BoYta: setFastighetsdataNumber(maeklarObjekt.BoYta.value, $scope.utdragData.Boarea), BiYta: setFastighetsdataNumber(maeklarObjekt.BiYta.value, $scope.utdragData.Biarea), Tomtraettsavgaeld: setFastighetsdataNumber(maeklarObjekt.Avgift.value, $scope.utdragData.Tomtraettsavgaeld), }; var konflikter = 0; angular.forEach($scope.Fastighetsdata, function (value) { if (value.AerKonflikt) { konflikter++; } }); $scope.sections.Fastighetsdata.Konflikter = konflikter; }); // Hjälpfunktion för att sätta header på Taxering var setTaxeringHeader = function () { var header = $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.TAXERINGSENHETER'); if (objektData.Taxeringsdata.$resolved && (objektData.Taxeringsdata.MaeklarObjektTaxeringList.length > 0) && ($scope.sections.Taxering.Ny || $scope.sections.Taxering.Aendrad || $scope.sections.Taxering.Borttagen) ) { header += ' ( '; if ($scope.sections.Taxering.Ny) { header += ' ' + $scope.sections.Taxering.Ny + ' '; header += ($scope.sections.Taxering.Ny === 1) ? $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.NY') : $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.NYA'); } if ($scope.sections.Taxering.Aendrad) { header += ' ' + $scope.sections.Taxering.Aendrad + ' '; header += ($scope.sections.Taxering.Aendrad === 1) ? $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.AENDRAD') : $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.AENDRADE'); } if ($scope.sections.Taxering.Borttagen) { header += ' ' + $scope.sections.Taxering.Borttagen + ' '; header += ($scope.sections.Taxering.Borttagen === 1) ? $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.BORTTAGEN') : $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.BORTTAGNA'); } header += ' )'; $scope.sections.Taxering.hidden = false; } else { $scope.sections.Taxering.hidden = true; } $scope.sections.Taxering.header = header; }; // Hjälpfunktion för att sätta header på Pantbrev var setPantbrevHeader = function () { var header = $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.PANTBREV'); if (objektData.Pantbrev.$resolved && (objektData.Pantbrev.length > 0) && ($scope.sections.Pantbrev.Ny || $scope.sections.Pantbrev.Aendrad || $scope.sections.Pantbrev.Borttagen)) { header += ' ( '; if ($scope.sections.Pantbrev.Ny) { header += ' ' + $scope.sections.Pantbrev.Ny + ' '; header += ($scope.sections.Pantbrev.Ny === 1) ? $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.NY') : $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.NYA'); } if ($scope.sections.Pantbrev.Aendrad) { header += ' ' + $scope.sections.Pantbrev.Aendrad + ' '; header += ($scope.sections.Pantbrev.Aendrad === 1) ? $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.AENDRAD') : $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.AENDRADE'); } if ($scope.sections.Pantbrev.Borttagen) { header += ' ' + $scope.sections.Pantbrev.Borttagen + ' '; header += ($scope.sections.Pantbrev.Borttagen === 1) ? $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.BORTTAGEN') : $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.BORTTAGNA'); } header += ' )'; $scope.sections.Pantbrev.hidden = false; } else { $scope.sections.Pantbrev.hidden = true; } $scope.sections.Pantbrev.header = header; }; // Hjälpfunktion för att sätta header på Fastighetsdata var setFastighetsdataHeader = function () { var header = $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.FASTIGHETSDATA'); if ($scope.sections.Fastighetsdata.Konflikter) { header += ' ( ' + $scope.sections.Fastighetsdata.Konflikter + ' '; header += ($scope.sections.Fastighetsdata.Konflikter === 1) ? $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.KONFLIKT') : $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.KONFLIKTER'); header += ' )'; $scope.sections.Fastighetsdata.hidden = false; } else { $scope.sections.Fastighetsdata.hidden = true; } $scope.sections.Fastighetsdata.header = header; }; $scope.$watch('sections.Taxering.Ny', setTaxeringHeader); $scope.$watch('sections.Taxering.Aendrad', setTaxeringHeader); $scope.$watch('sections.Taxering.Borttagen', setTaxeringHeader); $scope.$watch('sections.Pantbrev.Ny', setPantbrevHeader); $scope.$watch('sections.Pantbrev.Aendrad', setPantbrevHeader); $scope.$watch('sections.Pantbrev.Borttagen', setPantbrevHeader); $scope.$watch('sections.Fastighetsdata.Konflikter', setFastighetsdataHeader); // När taxeringsdata laddats beräknas konflikter $q.all([$scope.utdragData.$promise, objektData.Taxeringsdata.$promise]).then(function () { if ($scope.utdragData.Taxeringsenheter) { fasitTaxeringLoop: for (var i = 0; i < objektData.Taxeringsdata.MaeklarObjektTaxeringList.length; i++) { var fasitTaxering = objektData.Taxeringsdata.MaeklarObjektTaxeringList[i]; for (var j = 0; j < $scope.utdragData.Taxeringsenheter.length; j++) { var lmTaxering = $scope.utdragData.Taxeringsenheter[j]; // Taxeringarna är från samma år if (fasitTaxering.TaxeringsAar.value === lmTaxering.Vaerdeaar) { if (fasitTaxering.TaxeringsAar.value !== lmTaxering.Vaerdeaar || fasitTaxering.TaxeringsAerPreliminaer.value || fasitTaxering.TaxeringskodText.value !== lmTaxering.Taxeringskod || fasitTaxering.TaxeringsVaerdeFoerByggnad.value !== lmTaxering.Byggnadsvaerde || fasitTaxering.Taxeringsvarde.value !== lmTaxering.Taxeringsvaerde) { // Något värde hade ändrats $scope.sections.Taxering.Aendrad++; (lmTaxering).Status = 'Aendrad'; } else { (lmTaxering).Status = 'Ofoeraendrad'; } continue fasitTaxeringLoop; } } // Fanns ingen lmTaxering för året av nuvarande fasitTaxering $scope.sections.Taxering.Borttagen++; } // Om någon taxering existerar som inte fått status for (var k = 0; k < $scope.utdragData.Taxeringsenheter.length; k++) { var _lmTaxering = $scope.utdragData.Taxeringsenheter[k]; if (!(_lmTaxering).Status) { (_lmTaxering).Status = 'Ny'; $scope.sections.Taxering.Ny++; } } } }); // När pantbrev laddats beräknas konflikter $q.all([$scope.utdragData.$promise, objektData.Pantbrev.$promise]).then(function () { if ($scope.utdragData.Pantbrev) { fasitPantbrevLoop: for (var i = 0; i < objektData.Pantbrev.length; i++) { var fasitPantbrev = objektData.Pantbrev[i]; for (var j = 0; j < $scope.utdragData.Pantbrev.length; j++) { var lmPantbrev = $scope.utdragData.Pantbrev[j]; // Pantbreven har samma aktnummer if (fasitPantbrev.Aktnummer.value === lmPantbrev.Aktnummer) { if (fasitPantbrev.Anteckning.value !== lmPantbrev.Anteckning || fasitPantbrev.Belopp.value !== lmPantbrev.Belopp || fasitPantbrev.Datum.value !== lmPantbrev.Datum || fasitPantbrev.Form.value !== lmPantbrev.Form || fasitPantbrev.Ordning.value !== lmPantbrev.Ordning) { $scope.sections.Pantbrev.Aendrad++; (lmPantbrev).Status = 'Aendrad'; } continue fasitPantbrevLoop; } } // Fanns ingen lmTaxering för året av nuvarande fasitTaxering $scope.sections.Pantbrev.Borttagen++; } // Kontrollera de som inte har någon status om de redan finns eller är nya lmPantbrevLoop: for (var k = 0; k < $scope.utdragData.Pantbrev.length; k++) { var _lmPantbrev = $scope.utdragData.Pantbrev[k]; if (!(_lmPantbrev).Status) { for (var l = 0; l < objektData.Pantbrev.length; l++) { var _fasitPantbrev = objektData.Pantbrev[l]; if (_fasitPantbrev.Aktnummer.value === _lmPantbrev.Aktnummer) { (_lmPantbrev).Status = 'Ofoeraendrad'; //De oförändrade ska inte visas. continue lmPantbrevLoop; } } // Om något Pantbrev existerar som inte fått status (_lmPantbrev).Status = 'Ny'; $scope.sections.Pantbrev.Ny++; } } } }); // Hjälpfunktion för att skapa likadana säljare-objekt från PersonDO som man får från anropet SaeljareInfo, var getPersondata = function (data): fb.SaeljareInfoFoerLMLO { if (data instanceof fb.SaeljareInfoFoerLMLO) { return data; } else { var mapped = new fb.SaeljareInfoFoerLMLO({ PersonId: data.PersonId.value, Personnummer: data.Personnummer.value, Personnamn: data.Personnamn.value, Foernamn: (data.Foernamn) ? data.Foernamn.value : null, Efternamn: (data.Efternamn) ? data.Efternamn.value : null, Adress: data.Adress.AdressText.value, Postnummer: data.Adress.Postnummer.value, Postort: data.Adress.Postort.value, AndelTaeljare: (data.AndelTaeljare) ? data.AndelTaeljare.value : null, AndelNaemnare: (data.AndelNaemnare) ? data.AndelNaemnare.value : null }); return mapped; } } // När Säljare och LM-data laddats matchas dessa mot ägare från LM $q.all([$scope.utdragData.$promise, objektData.Saeljare.$promise]).then(function () { angular.forEach(objektData.Saeljare, function (value: fb.Saeljare) { var person = getPersondata(value); $scope.data.Saeljare[person.PersonId] = person; }); angular.forEach($scope.utdragData.Aegare, function (aegare) { angular.forEach($scope.data.Saeljare, function (saeljare: fb.SaeljareInfoFoerLMLO) { // Om personnummer matchar // Eller om utdrags-personens för och efternamn är exakta matcher med fasit-personen // Eller om fasit-personens hela namn innehåller både förnamn och efternamn från utdrags-personen // Eller om utdrags-personens hela namn innehåller både förnamn och efternamn från fasit-personen // Eller om Personnamn är en exakt match if ((saeljare.Personnummer && aegare.Personnummer && saeljare.Personnummer === aegare.Personnummer) || ( (typeof saeljare.Foernamn === 'string' && typeof saeljare.Efternamn === 'string' && typeof aegare.Foernamn === 'string' && typeof aegare.Efternamn === 'string') && saeljare.Foernamn.toLowerCase() === aegare.Foernamn.toLowerCase() && saeljare.Efternamn.toLowerCase() === aegare.Efternamn.toLowerCase() ) || ( (typeof saeljare.Personnamn === 'string' && typeof aegare.Foernamn === 'string' && typeof aegare.Efternamn === 'string') && saeljare.Personnamn.toLowerCase().indexOf(aegare.Foernamn.toLowerCase()) >= 0 && saeljare.Personnamn.toLowerCase().indexOf(aegare.Efternamn.toLowerCase()) >= 0 ) || ( (typeof saeljare.Foernamn === 'string' && typeof saeljare.Efternamn === 'string' && typeof aegare.Foernamn === 'string' && typeof aegare.Efternamn === 'string') && (aegare.Foernamn + ' ' + aegare.Efternamn).toLowerCase().indexOf(saeljare.Foernamn.toLowerCase()) >= 0 && (aegare.Foernamn + ' ' + aegare.Efternamn).toLowerCase().indexOf(saeljare.Efternamn.toLowerCase()) >= 0 ) || ( saeljare.Personnamn && aegare.Organisationsnamn && saeljare.Personnamn.toLowerCase() === aegare.Organisationsnamn.toLowerCase() )) { aegare.PersonId = (new fb.ChangeTrack(saeljare.PersonId)); } }); if (!aegare.PersonId) { aegare.PersonId = (new fb.ChangeTrack(null)); } }); $scope.data.Saeljare[-1] = new fb.SaeljareInfoFoerLMLO({ PersonId: null, Personnamn: $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.NY_SAELJARE') }); }); // objekt som skickas med till fbNewContact-directivet för att exponera funktioner för att sätta söksträng och trigga sökning $scope.newContactScope = {}; var updateNewContactSuggestion = function () { if ($scope.newContactScope.searchFieldData && $scope.newContactScope.onSearchButtonClick && $scope.current.SoekStraeng) { if ($scope.current.Aegare) { if ($scope.current.Aegare.Organisationsnamn) { $scope.newContactScope.newContactSuggestion.Personnummer = $scope.current.Aegare.Personnummer; $scope.newContactScope.newContactSuggestion.Personnamn = $scope.current.Aegare.Organisationsnamn; $scope.newContactScope.newContactSuggestion.Foernamn = null; $scope.newContactScope.newContactSuggestion.Efternamn = null; } else { $scope.newContactScope.newContactSuggestion.Personnummer = $scope.current.Aegare.Personnummer; $scope.newContactScope.newContactSuggestion.Personnamn = null; $scope.newContactScope.newContactSuggestion.Foernamn = $scope.current.Aegare.Foernamn; $scope.newContactScope.newContactSuggestion.Efternamn = $scope.current.Aegare.Efternamn; } } } }; // watcher som när funktionaliteten exponeras från fbNewContact direkt sätter söksträng till önskat värde och söker $scope.$watchCollection('newContactScope', function () { if ($scope.newContactScope.searchFieldData && $scope.newContactScope.onSearchButtonClick && $scope.current.SoekStraeng) { $scope.newContactScope.searchFieldData.value = $scope.current.SoekStraeng; updateNewContactSuggestion(); $scope.newContactScope.onSearchButtonClick(); } if ($scope.newContactScope.valdKundTyp) { if ($scope.current.Aegare.Organisationsnamn) { $scope.newContactScope.valdKundTyp.value = 0; } else { $scope.newContactScope.valdKundTyp.value = null; } } }); // Funktion för att hitta den minsta gemensamma multipeln för 2 tal var lcm = function (a: number, b: number) { if (!angular.isNumber(a) || !angular.isNumber(b)) { return null; } var divisor = commonService.gcdHelper(a, b); if (divisor) { return a * b / divisor; } return a * b; }; // Hämtar den minsta gemensamma multipeln för alla valda andelars nämnare var getNaemnare = function () { if (!$scope.aegarAndelar) { return 0; } var naemnare; if ($scope.aegarAndelar.length === 1) { naemnare = parseInt(($scope.aegarAndelar[0].ValdKaella.value === 0) ? $scope.aegarAndelar[0].AndelNaemnare.lmVaerde.value : $scope.aegarAndelar[0].AndelNaemnare.fasitVaerde.value); } else if ($scope.aegarAndelar.length > 1) { // nämnaren är lcm för naemnare 0 och 1 naemnare = lcm(parseInt(($scope.aegarAndelar[0].ValdKaella.value === 0) ? $scope.aegarAndelar[0].AndelNaemnare.lmVaerde.value : $scope.aegarAndelar[0].AndelNaemnare.fasitVaerde.value), parseInt(($scope.aegarAndelar[1].ValdKaella.value === 0) ? $scope.aegarAndelar[1].AndelNaemnare.lmVaerde.value : $scope.aegarAndelar[1].AndelNaemnare.fasitVaerde.value)); // och lcm på detta vidare för alla olika angivna nämnare for (var j = 2; j < $scope.aegarAndelar.length; j++) { var aegareNaemnare = parseInt(($scope.aegarAndelar[j].ValdKaella.value === 0) ? $scope.aegarAndelar[j].AndelNaemnare.lmVaerde.value : $scope.aegarAndelar[j].AndelNaemnare.fasitVaerde.value); naemnare = lcm(naemnare, aegareNaemnare); } } return naemnare; }; $scope.andelarSumRight = false; // Funktion som adderar ihop alla valda andelar och sätter $scope.andelarSumRight till true/false beroende på ifall andelarna adderar upp till 100% $scope.setAndelarSum = function () { //Har vi inga ägarandelar så anser vi att de summerar korrekt och vi får gå till nästa steg. if (!$scope.aegarAndelar) { $scope.andelarSumRight = true; return true; } var naemnare = getNaemnare(); var taeljareSum = 0; for (var k = 0; k < $scope.aegarAndelar.length; k++) { if ($scope.aegarAndelar[k].ValdKaella.value !== 0 && $scope.aegarAndelar[k].ValdKaella.value !== 1) { $scope.andelarSumRight = false; return false; } var aegarTaeljare = parseInt(($scope.aegarAndelar[k].ValdKaella.value === 0) ? $scope.aegarAndelar[k].AndelTaeljare.lmVaerde.value : $scope.aegarAndelar[k].AndelTaeljare.fasitVaerde.value); var aegarNaemnare = ($scope.aegarAndelar[k].ValdKaella.value === 0) ? $scope.aegarAndelar[k].AndelNaemnare.lmVaerde.value : $scope.aegarAndelar[k].AndelNaemnare.fasitVaerde.value; taeljareSum += aegarTaeljare * (naemnare / aegarNaemnare); } $scope.andelarSumRight = (taeljareSum === naemnare); return taeljareSum === naemnare; }; $scope.andelWatchers = []; $scope.kontaktMergeMissingValue = function () { return !!_.find($scope.currentKontaktMerge, function (value: any) { return value.AerKonflikt && value.ValdKaella.value !== 0 && value.ValdKaella.value !== 1; }); }; $scope.kontaktActionsMissingValue = function () { return !!_.find($scope.okoppladeSaeljare, function (saeljare) { return !(saeljare).Action.value; }); }; // Objekt med actions som navigerar mellan sidor $scope.actions = { // Första mergningen är klar, kontrollerar så att alla konflikter fått ett valt värde och ifall de fått detta, sätter data på utdragData-objektet samt går vidare till nästa sida mergeKlar: function () { var missingValue = !!_.find($scope.Fastighetsdata, function (value: any) { return value.AerKonflikt && value.ValdKaella.value !== 0 && value.ValdKaella.value !== 1; }); if (missingValue) { return; } $scope.utdragData.Upplaatelseform = ($scope.Fastighetsdata.Upplaatelseform.ValdKaella.value === 0) ? $scope.Fastighetsdata.Upplaatelseform.lmVaerde.value : $scope.Fastighetsdata.Upplaatelseform.fasitVaerde.value; $scope.utdragData.KommunId = ($scope.Fastighetsdata.KommunId.ValdKaella.value === 0) ? $scope.Fastighetsdata.KommunId.lmVaerde.value : $scope.Fastighetsdata.KommunId.fasitVaerde.value; $scope.utdragData.Fastighetsbeteckning = ($scope.Fastighetsdata.Fastighetsbeteckning.ValdKaella.value === 0) ? $scope.Fastighetsdata.Fastighetsbeteckning.lmVaerde.value : $scope.Fastighetsdata.Fastighetsbeteckning.fasitVaerde.value; $scope.utdragData.Adress = ($scope.Fastighetsdata.Adress.ValdKaella.value === 0) ? $scope.Fastighetsdata.Adress.lmVaerde.value : $scope.Fastighetsdata.Adress.fasitVaerde.value; $scope.utdragData.Postnummer = ($scope.Fastighetsdata.Postnummer.ValdKaella.value === 0) ? $scope.Fastighetsdata.Postnummer.lmVaerde.value : $scope.Fastighetsdata.Postnummer.fasitVaerde.value; $scope.utdragData.Postort = ($scope.Fastighetsdata.Postort.ValdKaella.value === 0) ? $scope.Fastighetsdata.Postort.lmVaerde.value : $scope.Fastighetsdata.Postort.fasitVaerde.value; $scope.utdragData.Tomtyta = ($scope.Fastighetsdata.TomtYta.ValdKaella.value === 0) ? $scope.Fastighetsdata.TomtYta.lmVaerde.value : $scope.Fastighetsdata.TomtYta.fasitVaerde.value; $scope.utdragData.SenasteBeslutadePlanen = ($scope.Fastighetsdata.KommunalPlan.ValdKaella.value === 0) ? $scope.Fastighetsdata.KommunalPlan.lmVaerde.value : $scope.Fastighetsdata.KommunalPlan.fasitVaerde.value; $scope.utdragData.SenasteBeslutadePlanensGenomfoerandeSlut = ($scope.Fastighetsdata.KommunalPlanGenomfoerandeTid.ValdKaella.value === 0) ? $scope.Fastighetsdata.KommunalPlanGenomfoerandeTid.lmVaerde.value : $scope.Fastighetsdata.KommunalPlanGenomfoerandeTid.fasitVaerde.value; $scope.utdragData.VA = ($scope.Fastighetsdata.VA.ValdKaella.value === 0) ? $scope.Fastighetsdata.VA.lmVaerde.value : $scope.Fastighetsdata.VA.fasitVaerde.value; $scope.utdragData.GAOchSamfaelligheterOchServitut = ($scope.Fastighetsdata.GAOchSamfaelligheterOchServitut.ValdKaella.value === 0) ? $scope.Fastighetsdata.GAOchSamfaelligheterOchServitut.lmVaerde.value : $scope.Fastighetsdata.GAOchSamfaelligheterOchServitut.fasitVaerde.value; $scope.utdragData.Byggaar = ($scope.Fastighetsdata.ByggnadsAar.ValdKaella.value === 0) ? $scope.Fastighetsdata.ByggnadsAar.lmVaerde.value : $scope.Fastighetsdata.ByggnadsAar.fasitVaerde.value; $scope.utdragData.ByggaarKommentar = ($scope.Fastighetsdata.ByggnadsAarKommentar.ValdKaella.value === 0) ? $scope.Fastighetsdata.ByggnadsAarKommentar.lmVaerde.value : $scope.Fastighetsdata.ByggnadsAarKommentar.fasitVaerde.value; $scope.utdragData.Boarea = ($scope.Fastighetsdata.BoYta.ValdKaella.value === 0) ? $scope.Fastighetsdata.BoYta.lmVaerde.value : $scope.Fastighetsdata.BoYta.fasitVaerde.value; $scope.utdragData.BoareaValdFraanLM = ($scope.Fastighetsdata.BoYta.ValdKaella.value === 0); $scope.utdragData.Biarea = ($scope.Fastighetsdata.BiYta.ValdKaella.value === 0) ? $scope.Fastighetsdata.BiYta.lmVaerde.value : $scope.Fastighetsdata.BiYta.fasitVaerde.value; $scope.utdragData.Tomtraettsavgaeld = ($scope.Fastighetsdata.Tomtraettsavgaeld.ValdKaella.value === 0) ? $scope.Fastighetsdata.Tomtraettsavgaeld.lmVaerde.value : $scope.Fastighetsdata.Tomtraettsavgaeld.fasitVaerde.value; // All fastighetsdata är satt $scope.PAGE = $scope.PAGES.SOEK_DUBLETTER; $scope.actions.hittatKontakt(); }, // callback från fbNewContact när en kontakt har hittats så anropas denna funktion med PersonDO-objektet för att sätta aktiv ägares personkoppling laeggTillKontakt: function (kontakt, skapadDirekt: boolean = false) { $scope.current.Aegare.PersonId = kontakt.PersonId.value; if (skapadDirekt) { ($scope.current.Aegare).anvaendLmDirekt = true; } var saeljare = getPersondata(kontakt); $scope.data.Saeljare[saeljare.PersonId] = saeljare; $scope.actions.hittatKontakt(); }, // Anropas när en kontakt har matchats med ägare för att antingen gå vidare till nästa ägare eller vidare till kontakt-data-merge hittatKontakt: function () { if (!$scope.utdragData.Aegare || $scope.utdragData.Aegare.length === 0) { $scope.actions.avsluta(); } else { for (var i = 0; i < $scope.utdragData.Aegare.length; i++) { if (commonService.changeTrack.isChangeTrackObject($scope.utdragData.Aegare[i].PersonId)) { $scope.utdragData.Aegare[i].PersonId = ($scope.utdragData.Aegare[i].PersonId).value; } if (!$scope.utdragData.Aegare[i].PersonId) { $scope.current = { Aegare: $scope.utdragData.Aegare[i], // jshint ignore: start NamnFoerslag: (typeof $scope.utdragData.Aegare[i].Foernamn === 'string' && typeof $scope.utdragData.Aegare[i].Efternamn === 'string') ? _.map($scope.utdragData.Aegare[i].Foernamn.split(' '), function (foernamn) { return foernamn + ' ' + $scope.utdragData.Aegare[i].Efternamn; }) : (typeof $scope.utdragData.Aegare[i].Organisationsnamn === 'string') ? [$scope.utdragData.Aegare[i].Organisationsnamn] : [], // jshint ignore: end Index: i + 1 }; if ($scope.current.Aegare.Personnummer) { $scope.current.NamnFoerslag.push($scope.current.Aegare.Personnummer); } $scope.current.SoekStraeng = $scope.current.NamnFoerslag.join(", "); $scope.actions.saettNyKontaktSoekStraeng($scope.current.SoekStraeng); if ($scope.newContactScope.valdKundTyp) { if ($scope.current.Aegare.Organisationsnamn) { $scope.newContactScope.valdKundTyp.value = 0; } else { $scope.newContactScope.valdKundTyp.value = null; } } return; } } // Alla Ägare har personId satt delete $scope.current; $scope.PAGE = $scope.PAGES.MERGE_KONTAKTDATA; $scope.actions.kontaktDataMergead(); } }, // Hjälpfunktion för att byta ut aktiv söksträng i fbNewContact och söka på den nya strängen saettNyKontaktSoekStraeng: function (soekstraeng: string) { if ($scope.newContactScope.searchFieldData && $scope.newContactScope.onSearchButtonClick) { $scope.newContactScope.searchFieldData.value = soekstraeng; $scope.newContactScope.onSearchButtonClick(); $scope.current.SoekStraeng = soekstraeng; updateNewContactSuggestion(); } }, // Anropas när en kontakts data är färdig-mergead för att kopiera data till ägaren och gå vidare till nästa kontakt eller merge av andelar kontaktDataMergead: function () { // Om funktionen anropas med currentKontaktMerge redan satt, verifiera så att ägaren är färdigmergead if ($scope.currentKontaktMerge) { if ($scope.kontaktMergeMissingValue()) { return; } var _aegare = $scope.currentKontaktMerge.Aegare.Aegare; _aegare.Personnummer = ($scope.currentKontaktMerge.Personnummer.ValdKaella.value === 0) ? $scope.currentKontaktMerge.Personnummer.lmVaerde.value : $scope.currentKontaktMerge.Personnummer.fasitVaerde.value; _aegare.Foernamn = ($scope.currentKontaktMerge.Foernamn.ValdKaella.value === 0) ? $scope.currentKontaktMerge.Foernamn.lmVaerde.value : $scope.currentKontaktMerge.Foernamn.fasitVaerde.value; _aegare.Efternamn = ($scope.currentKontaktMerge.Efternamn.ValdKaella.value === 0) ? $scope.currentKontaktMerge.Efternamn.lmVaerde.value : $scope.currentKontaktMerge.Efternamn.fasitVaerde.value; _aegare.Adress = ($scope.currentKontaktMerge.Adress.ValdKaella.value === 0) ? $scope.currentKontaktMerge.Adress.lmVaerde.value : $scope.currentKontaktMerge.Adress.fasitVaerde.value; _aegare.Postnummer = ($scope.currentKontaktMerge.Postnummer.ValdKaella.value === 0) ? $scope.currentKontaktMerge.Postnummer.lmVaerde.value : $scope.currentKontaktMerge.Postnummer.fasitVaerde.value; _aegare.Postort = ($scope.currentKontaktMerge.Postort.ValdKaella.value === 0) ? $scope.currentKontaktMerge.Postort.lmVaerde.value : $scope.currentKontaktMerge.Postort.fasitVaerde.value; (_aegare).Merged = true; } if ($scope.utdragData.Aegare) { for (var i = 0; i < $scope.utdragData.Aegare.length; i++) { var aegare = $scope.utdragData.Aegare[i]; var saeljare = $scope.data.Saeljare[aegare.PersonId]; if (!aegare || !saeljare) { throw "Någonting gick fel vid mergning av kontakter vid kopiering av LM-data" } if ((aegare).Merged && aegare.PersonId) { // Om aegaren är markerad som mergead: gå vidare till nästa continue; } else { // Annars, sätt ägaren till nuvarande kontakt-merge $scope.currentKontaktMerge = { Aegare: { AerKonflikt: false, Aegare: aegare, Index: i + 1 }, Foernamn: setFastighetsdataString(saeljare.Foernamn, aegare.Foernamn), Efternamn: setFastighetsdataString(saeljare.Efternamn, aegare.Efternamn), Personnummer: setFastighetsdataString(saeljare.Personnummer, aegare.Personnummer), Adress: setFastighetsdataString(saeljare.Adress, aegare.Adress), Postort: setFastighetsdataString(saeljare.Postort, aegare.Postort), Postnummer: setFastighetsdataString(saeljare.Postnummer, aegare.Postnummer) }; var antalKonflikter = 0; // jshint ignore: start angular.forEach($scope.currentKontaktMerge, function (kontaktMerge) { if (kontaktMerge.AerKonflikt) { antalKonflikter++; } }); // jshint ignore: end // Om det inte finns några konflikter eller om LM ska användas direkt så merga direkt // Behöver inte göra något mer eftersom LM alltid förväljs if (antalKonflikter === 0 || (aegare).anvaendLmDirekt === true) { // Det fanns inga konflikter mellan säljaren och ägaren, sätt ägaren till mergead och gå vidare till nästa ägare (aegare).Merged = true; continue; } else { // Annars, lämna funktionen för att utföra ytterligare mergning av kontakten return; } } } } $scope.PAGE = $scope.PAGES.EXISTERANDE_KONTAKTER_ACTIONS; $scope.actions.existerandeKontaktActionsVald(); }, // Anropas när alternativ valts för existerande kontakter som inte matchats, går vidare om alternativ är valt för alla existerandeKontaktActionsVald: function () { var actions = { LAEMNA_KVAR: 1, TA_BORT: 2, GOER_TILL_EXTRA_KONTAKT: 3 }; $scope.actionOptions = [ { text: $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.LAEMNA_KVAR'), action: actions.LAEMNA_KVAR }, { text: $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.TA_BORT'), action: actions.TA_BORT }, { text: $filter('translate')('SIDEDRAWER_KOPIERA_LANTMAETERIDATA.GOER_TILL_EXTRA_KONTAKT'), action: actions.GOER_TILL_EXTRA_KONTAKT } ]; if (!$scope.okoppladeSaeljare) { angular.forEach($scope.utdragData.Aegare, function (aegare) { ($scope.data.Saeljare[aegare.PersonId]).Kopplad = true; }); $scope.okoppladeSaeljare = []; angular.forEach($scope.data.Saeljare, function (saeljare: fb.SaeljareInfoFoerLMLO) { if (!saeljare.Kopplad && saeljare.PersonId) { saeljare.Action = new fb.ChangeTrack(null); $scope.okoppladeSaeljare.push(saeljare); } }); } if ($scope.kontaktActionsMissingValue()) { return; } angular.forEach($scope.okoppladeSaeljare, function (saeljare) { switch ((saeljare).Action.value) { case actions.LAEMNA_KVAR: $scope.utdragData.Aegare.push({ AndelTaeljare: null, AndelNaemnare: null, Efternamn: saeljare.Efternamn, Foernamn: saeljare.Foernamn, MaeklarObjektId: maeklarObjekt.MaeklarObjektId.value, Organisationsnamn: saeljare.Personnamn, PersonId: saeljare.PersonId, Personnummer: saeljare.Personnummer, Adress: saeljare.Adress, Postnummer: saeljare.Postnummer, Postort: saeljare.Postort, }); break; case actions.TA_BORT: if (!$scope.utdragData.IntressenterAttTaBort) { $scope.utdragData.IntressenterAttTaBort = []; } $scope.utdragData.IntressenterAttTaBort.push(saeljare.PersonId); break; case actions.GOER_TILL_EXTRA_KONTAKT: if (!$scope.utdragData.IntressenterAttBliExtraKontakter) { $scope.utdragData.IntressenterAttBliExtraKontakter = []; } $scope.utdragData.IntressenterAttBliExtraKontakter.push(saeljare.PersonId); break; } }); if (objektData.Saeljare.length > 0) { $scope.PAGE = $scope.PAGES.MERGE_ANDELAR; $scope.actions.andelarMerged(); } else { $scope.actions.avsluta(); } }, // Anropas för att visa andelar-merge eller gå vidare och spara andelarna till ägare. andelarMerged: function () { var AerKonflikt = false; if (!$scope.aegarAndelar) { // Första anropet, aegarAndelar är inte initierat $scope.aegarAndelar = []; angular.forEach($scope.utdragData.Aegare, function (aegare, index) { var saeljare = $scope.data.Saeljare[aegare.PersonId]; var notIdenticalAndel = (saeljare.AndelTaeljare !== aegare.AndelTaeljare || saeljare.AndelNaemnare !== aegare.AndelNaemnare); $scope.aegarAndelar.push({ Personnamn: (aegare.Organisationsnamn) ? aegare.Organisationsnamn : aegare.Foernamn + ' ' + aegare.Efternamn, ValdKaella: notIdenticalAndel ? new fb.ChangeTrack(0) : new fb.ChangeTrack(null), AndelTaeljare: { fasitVaerde: new fb.ChangeTrack(saeljare.AndelTaeljare), lmVaerde: new fb.ChangeTrack(aegare.AndelTaeljare), }, AndelNaemnare: { fasitVaerde: new fb.ChangeTrack(saeljare.AndelNaemnare), lmVaerde: (aegare.AndelNaemnare) ? new fb.ChangeTrack(aegare.AndelNaemnare) : new fb.ChangeTrack(null), }, }); $scope.andelWatchers.push($scope.$watch('aegarAndelar[' + index + '].AndelTaeljare.fasitVaerde.value', $scope.setAndelarSum)); $scope.andelWatchers.push($scope.$watch('aegarAndelar[' + index + '].AndelTaeljare.lmVaerde.value', $scope.setAndelarSum)); $scope.andelWatchers.push($scope.$watch('aegarAndelar[' + index + '].AndelNaemnare.fasitVaerde.value', $scope.setAndelarSum)); $scope.andelWatchers.push($scope.$watch('aegarAndelar[' + index + '].AndelNaemnare.lmVaerde.value', $scope.setAndelarSum)); $scope.andelWatchers.push($scope.$watch('aegarAndelar[' + index + '].ValdKaella.value', $scope.setAndelarSum)); if (saeljare.AndelTaeljare !== aegare.AndelTaeljare || saeljare.AndelNaemnare !== aegare.AndelNaemnare) { AerKonflikt = true; } }); if (!AerKonflikt) { // Alla andelar matchade exakt, så vi väljer att använda lm-datan angular.forEach($scope.aegarAndelar, function (value, key) { value.ValdKaella.value = 0; }); $scope.setAndelarSum(); } } else { // Efterkommande anrop, validera ifall konflikt fortfarande existerar angular.forEach($scope.aegarAndelar, function (aegarAndel) { if (aegarAndel.ValdKaella.value !== 0 && aegarAndel.ValdKaella.value !== 1) { AerKonflikt = true; } }); } if (!AerKonflikt && $scope.andelarSumRight) { // Ingen konflikt fanns kvar och andelarna summerar till 100% // avregistrera watchers angular.forEach($scope.andelWatchers, function (watcher, key) { watcher(); }); var naemnare = getNaemnare(); for (var k = 0; k < $scope.aegarAndelar.length; k++) { var aegare = $scope.utdragData.Aegare[k]; var aegarTaeljare = ($scope.aegarAndelar[k].ValdKaella.value === 0) ? $scope.aegarAndelar[k].AndelTaeljare.lmVaerde.value : $scope.aegarAndelar[k].AndelTaeljare.fasitVaerde.value; var aegarNaemnare = ($scope.aegarAndelar[k].ValdKaella.value === 0) ? $scope.aegarAndelar[k].AndelNaemnare.lmVaerde.value : $scope.aegarAndelar[k].AndelNaemnare.fasitVaerde.value; aegare.AndelTaeljare = aegarTaeljare; aegare.AndelNaemnare = aegarNaemnare; } // går igenom andelarna för att hitta den största gemensamma delaren, ifall andelarna kan reduceras var sgd; if ($scope.utdragData.Aegare.length === 1) { // En ägare, så andelen är alltid 100% $scope.utdragData.Aegare[0].AndelTaeljare = 1; $scope.utdragData.Aegare[0].AndelNaemnare = 1; } else if ($scope.aegarAndelar.length > 1) { for (var j = 0; j < $scope.utdragData.Aegare.length; j++) { sgd = commonService.gcdHelper($scope.utdragData.Aegare[j].AndelNaemnare, $scope.utdragData.Aegare[j].AndelTaeljare); if (sgd > 1) { // talen hade en gemensam faktor > 1, dividera alla tal med denna faktor $scope.utdragData.Aegare[j].AndelNaemnare = $scope.utdragData.Aegare[j].AndelNaemnare / sgd; $scope.utdragData.Aegare[j].AndelTaeljare = $scope.utdragData.Aegare[j].AndelTaeljare / sgd; } } } $scope.actions.avsluta(); } }, // Skicka iväg request för att kopiera data och uppdatera status på kopieringen KopieraData: function () { var kopiering = lantmaeterietService.saveUtdragImportera($scope.utdragData); $scope.KopieraStatus = $scope.STATUS.PAAGAAR; kopiering.$promise.then(function () { $scope.KopieraStatus = $scope.STATUS.KLAR; $rootScope.$broadcast(fb.FasITDomain.GlobalEvents.LANTMAETERIDATA_KOPIERAT); // Ajs fbBroadcastService.broadcast(fb.FasITDomain.GlobalEvents.LANTMAETERIDATA_KOPIERAT); // Angular $scope.actions.closeDrawer(); }); kopiering.$promise.catch(function () { $scope.KopieraStatus = $scope.STATUS.MISSLYCKADES; }); }, // Avsluta kopieringsflödet avsluta: function () { $scope.actions.KopieraData(); $scope.PAGE = $scope.PAGES.DONE; }, // Stänger sideDrawer closeDrawer: function () { sideDrawerService.clearDrawer(); } }; }]);