angular.module('fasit').controller('KonstantIntressentCtrl', [ '$scope', '$rootScope', '$routeParams', '$q', '$translate', '$filter', 'intressentService', 'parterService', 'visningService', 'sideDrawerService', 'domainService', 'exportService', 'commonService', 'utskriftService', 'personService', 'instaellningarService', 'navigationService', 'stateService', 'anteckningService', 'fbBroadcastService', function ( $scope: fb.IKonstantIntressentCtrlScope, $rootScope: fb.IRootScope, $routeParams: any, $q: ng.IQService, $translate: any, $filter: ng.IFilterService, intressentService: fb.IIntressentService, parterService: fb.IParterService, visningService: fb.IVisningService, sideDrawerService: fb.ISideDrawerService, domainService: fb.IDomainService, exportService: fb.IExportService, commonService: fb.ICommonService, utskriftService: fb.IUtskriftService, personService: fb.IPersonService, instaellningarService: fb.IInstaellningarService, navigationService: fb.INavigationService, stateService: fb.IStateService, anteckningService: fb.IAnteckningService, fbBroadcastService: fb.IFbBroadcastService ) { 'use strict'; $scope.soek = { fritext: ''}; var isProjekt = (!!$scope.maeklarObjekt) ? $scope.maeklarObjekt.isProjekt() : false; var intressenter: fb.List; ////Ny ProjektIntressent var parter: fb.List; var visningar: fb.List; var koepareKontaktIndex: _.Dictionary; var koepareExtraKontaktKontaktIndex: _.Dictionary; var tableViewRows: fb.IIntressentRow[] = []; var niceDate = $filter('niceDate'); var translate = $filter('translate'); var statusClasses = { 'status-ej-intresserad': 'Ej intresserad', 'status-anvisad': 'Anvisad', 'status-intresserad': 'Intresserad', 'status-bokad-paa-visning': 'Bokad på visning', 'status-varit-paa-visning': 'Varit på visning', 'status-mycket-intresserad': 'Mycket intresserad', 'status-stannat-i-budgivningen': 'Stannat i budgivning', 'status-deltar-i-budgivningen': 'Deltar i budgivningen' }; $scope.updateOrder = updateOrder; $scope.openCopyIntressenter = openCopyIntressenter; $scope.kopiera = { kopieraTyp: undefined, kopieraId: undefined, getKopieraId: undefined, entitetnamn: undefined, def: new fb.ResourceBase({}), showPopup: false, showSpinner: false, objekts: undefined, kopiera: kopiera, getShowStr: undefined }; $scope.anteckningAlltidFoerKontakt = new fb.ChangeTrack(false); $scope.skapaAnteckningAlltidFoerKontaktOptions = [ { value: false, label: 'Endast aktuellt objekt' }, { value: true, label: 'Alltid för kontakten' }]; var instaellningar = instaellningarService.instaellningar.instaellningar; $scope.anvaenderRingLaenkar = instaellningar[fb.InstaellningTyp.AnvaenderRingLaenkar.id] ? instaellningar[fb.InstaellningTyp.AnvaenderRingLaenkar.id].InstaellningVaerde : null; $scope.anvaenderRingLaenkarCallTo = instaellningar[fb.InstaellningTyp.AnvaenderRingLaenkarCallTo.id] ? instaellningar[fb.InstaellningTyp.AnvaenderRingLaenkarCallTo.id].InstaellningVaerde : null; var setIntressegradForAllCorrespondingObjektIntressenterIProjektet = false; function callbackForNewIntressentSidedrawer(intressent: fb.NyObjektIntressent) { //TODO frha var ret = { $promise: $q.defer(), row: null }; fetchIntressenter().then(function () { var allRows = _.reduce($scope.primarKontakter, function (prev: fb.IIntressentRow[], row: fb.IIntressentRow) { return prev.concat(row.subRows); }, $scope.primarKontakter); var row = _.find(allRows, function (row: fb.IIntressentRow) { return row.Intressent.ObjektIntressentId.value === intressent.ObjektIntressentId; }); ret.row = row; ret.$promise.resolve(); }, function () { ret.$promise.reject(); }); return ret; } function updateTableRow(intressent: fb.ObjektIntressentBasLOGen) { if (intressent) { var person = personService.get(intressent.PersonId.value); if (person.person) { person.person.$promise.then(function () { intressent.PersonNamn.value = person.person.isPersonFysisk() ? (person.person).Foernamn.value + ' ' + (person.person).Efternamn.value : (person.person).Personnamn.value; intressent.TelefonnummerMobil = person.person.TelefonnummerMobil; if (person.person.isPersonFysisk()) { var fyperson = person.person; intressent.TelefonnummerArbete = fyperson.TelefonnummerArbete; intressent.TelefonnummerHem = fyperson.TelefonnummerHem; } else { var juperson = person.person; intressent.TelefonnummerDirekt = juperson.TelefonnummerDirekt; } intressent.Mejladress = person.person.MejlAdress; intressent.SfdBankNyttaSvarDatum.value = $filter('niceDate')(person.person.BankNyttaSvarDatum.value, false, false); intressent.SfdFraagatOmLaemnatObjektDatum.value = person.person.FraagatOmLaemnatObjektDatum.value; }); } } } function updateEfterDubblettSammanslagning(sammanslagenPersonId: number) { fetchIntressenter().then(() => { if (sammanslagenPersonId) { var row: fb.IIntressentRow = _.find($scope.primarKontakter, function (pK: fb.IIntressentRow) { return pK.Intressent.PersonId.value === sammanslagenPersonId; }); if (row) { $scope.intressentClicked(row); } } }); } function fetchIntressenter() { //if (isProjekt) { // intressenter = intressentService.getProjektIntressenter($routeParams.id); //} else { // intressenter = intressentService.query($routeParams.id, fb.ObjektIntressentRollId.Intressent); //} intressenter = (isProjekt) ? intressentService.getProjektIntressenter($routeParams.id) : intressentService.query($routeParams.id, fb.ObjektIntressentRollId.Intressent); parter = parterService.query($routeParams.id); visningar = visningService.query($routeParams.id); $scope.fetchingData = { $resolved: false, $promise: $q.all([intressenter.$promise, parter.$promise, visningar.$promise]), $failed: false }; $scope.fetchingData.$promise.then(function () { $scope.intressenter = intressenter; // Endast kvar för SideDrawer deps. $scope.nyIntressent.visningar = _.map(visningar, function (v: fb.Visning, i) { return { name: (i + 1) + '. ' + niceDate(v.AktivitetStart.value, true, true) + ' - ' + commonService.date.timePart(v.AktivitetSlut.value || ''), id: v.AktivitetId.value }; }); $scope.allaVisningar = {}; _.each(visningar, function (row: fb.Visning) { $scope.allaVisningar[row.AktivitetStart.value] = row; }); doAfterFetchingIntressenter(); $scope.fetchingData.$resolved = true; }).catch(function () { $scope.fetchingData.$failed = true; }); return $scope.fetchingData.$promise; } function isKoepareOrExtraKontakt(i: fb.Objektintressent | fb.Projektintressent) { return !_.isUndefined(koepareKontaktIndex[i.ObjektIntressentId.value]) || !_.isUndefined(koepareExtraKontaktKontaktIndex[i.ObjektIntressentId.value]) } function isEnoughSelectedAttKoppla() { return $scope.selectedItems.length > 1; } function isAtleastOneSelectedHeadRow() { return _.filter($scope.selectedItems, function (row: fb.IIntressentRow) { return _.isUndefined(row.parentRow); }).length > 0; } function isTwoDoedsboOrFirmaSelected() { var nrOfDoedsBo = _.filter($scope.selectedItems, function (row: fb.IIntressentRow) { return row.Intressent.JurPersonTyp.value === fb.JuridiskPersonTypId.DOEDSBO; }).length; var nrOfFirma = _.filter($scope.selectedItems, function (row: fb.IIntressentRow) { return row.Intressent.JurPersonTyp.value === fb.JuridiskPersonTypId.OSPECIFICERAD; }).length; return nrOfDoedsBo > 1 || nrOfFirma > 1; } function hasAnySelectedRowLagtBud() { return _.filter($scope.selectedItems, function (row: fb.IIntressentRow) { if (row.Intressent instanceof fb.Objektintressent) { return row.Intressent.Bud.length > 0; } else { return false; } }).length > 0; } function hasAnySelectedRowGammaltBud() { return _.filter($scope.selectedItems, function (row: fb.IIntressentRow) { if (row.Intressent instanceof fb.Objektintressent) { return row.Intressent.HarGamlaBud.value; } else { return false; } }).length > 0; } function isAllSubRowsForSelectedMainRowsSelected() { for (var i = 0; i < $scope.selectedItems.length; ++i) { var row = $scope.selectedItems[i]; for (var j = 0; j < row.subRows.length; ++j) { var subRow = row.subRows[j]; if ($scope.selectedItems.indexOf(subRow) === -1) { return false; } } } return true; } function isAnySelectedInSameGroup(): boolean { var mainRows = _.filter($scope.selectedItems, function (row: fb.IIntressentRow) { return _.isUndefined(row.parentRow); }); var countedMainRow = _.indexBy(mainRows, function (row: fb.IIntressentRow) { return row.Intressent.ObjektIntressentId.value; }); for (var i = 0; i < $scope.selectedItems.length; ++i) { var subRow = $scope.selectedItems[i]; if (!_.isUndefined(subRow.parentRow)) { var parentId = subRow.parentRow.Intressent.ObjektIntressentId.value; if (!_.isUndefined(countedMainRow[parentId])) { return true; } countedMainRow[parentId] = subRow.parentRow; } } return false; } function isAnyKoepareSelected(): boolean { for (var i = 0; i < $scope.selectedItems.length; ++i) { var row = $scope.selectedItems[i]; if (isKoepareOrExtraKontakt(row.Intressent)) { return true; } } return false; } function isAnyMainRowSelected() { for (var i = 0; i < $scope.selectedItems.length; i++) { if ($scope.selectedItems[i].subRows.length > 0) { return true; } } return false; } function isAnySubRowSelected() { for (var i = 0; i < $scope.selectedItems.length; ++i) { if (!_.isUndefined($scope.selectedItems[i].parentRow)) { return true; } } return false; } function isAllSelectedInSameGroup() { var mainRows = _.filter($scope.selectedItems, function (row: fb.IIntressentRow) { return _.isUndefined(row.parentRow); }); if (mainRows.length !== 1) { return false; } var subRows = _.filter($scope.selectedItems, function (row: fb.IIntressentRow) { return !_.isUndefined(row.parentRow); }); for (var i = 0; i < subRows.length; ++i) { var subRow = subRows[i]; if (subRow.parentRow !== mainRows[0]) { return false; } } return true; } function isMoreThanOneBudgivareSelected() { var budgivareRows = _.filter($scope.selectedItems, function (row: fb.IIntressentRow) { if (row.Intressent instanceof fb.Objektintressent) { return !_.isUndefined(row.Intressent.Budnr) && row.Intressent.Budnr.value !== null; } }); return budgivareRows.length > 1 } function hasWarnings(): boolean { return $scope.warningKeys.length > 0; } function updateWarnings(action: string) { $scope.warningKeys = []; if (action === 'koppla') { if (!isEnoughSelectedAttKoppla()) { $scope.warningKeys.push('MAEKLAROBJEKT_INTRESSENT.WARNING_VAELJ_MINST_TVAA'); } if (!isAtleastOneSelectedHeadRow() || isTwoDoedsboOrFirmaSelected() || isMoreThanOneBudgivareSelected()) { $scope.warningKeys.push('MAEKLAROBJEKT_INTRESSENT.WARNING_KAN_INTE_KOPPLA_DESSA'); } } else if (action === 'bytPrimarKontakt') { if (isAnySelectedInSameGroup()) { $scope.warningKeys.push('MAEKLAROBJEKT_INTRESSENT.WARNING_PRIMAER_KONTAKTPERSON_KAN_ENDAST_VAELJAS'); } } else if (action === 'taBort') { if (hasAnySelectedRowLagtBud()) { $scope.warningKeys.push('MAEKLAROBJEKT_INTRESSENT.WARNING_KAN_INTE_TA_BORT_INTRESSENT'); } if (!isAllSubRowsForSelectedMainRowsSelected()) { $scope.warningKeys.push('MAEKLAROBJEKT_INTRESSENT.WARNING_KAN_INTE_TA_BORT_INTRESSENT2'); } if (hasAnySelectedRowGammaltBud()) { $scope.warningKeys.push('MAEKLAROBJEKT_INTRESSENT.WARNING_KAN_INTE_TA_BORT_INTRESSENT_GAMMALT_BUD'); } } else if (action === 'goerTillKoepare') { if (isAnyKoepareSelected()) { $scope.warningKeys.push('MAEKLAROBJEKT_INTRESSENT.WARNING_REDAN_KOEPARE'); } if (isAnySubRowSelected() && !isAllSelectedInSameGroup()) { $scope.warningKeys.push('MAEKLAROBJEKT_INTRESSENT.WARNING_UNDERKONTAKT_INOM_SAMMA_GRUPP'); } } else if (action === 'saettIntressegrad') { if (isAnySubRowSelected()) { $scope.warningKeys.push('MAEKLAROBJEKT_INTRESSENT.WARNING_EJ_SAETTA_STATUS_UNDERKONTAKT'); } } else if (action === 'taBortProjektIntressent') { $scope.warningKeys.push('MAEKLAROBJEKT_INTRESSENT.WARNING_KAN_INTE_TA_BORT_PROJEKT_INTRESSENT'); } } function saveKoppling(intressentDo: fb.NyObjektIntressent, intressentLo: fb.Objektintressent | fb.Projektintressent): ng.IPromise { //var newIntressentDO = new fb.NyObjektIntressent({ // ObjektIntressentId: intressentLo.ObjektIntressentId.value, // PersonId: intressentLo.PersonId.value, // MaeklarObjektId: intressentLo.MaeklarObjektId.value, // ObjektIntressentRoll: intressentLo.ObjektIntressentRoll.value, // Visningar: intressentLo.Visningar //}); intressentDo.Underkontakter = _.map(intressentLo.Underkontakter as any, function (uk: fb.Objektintressent | fb.Projektintressent) { return { ObjektIntressentId: uk.ObjektIntressentId.value, ObjektIntressentRoll: uk.ObjektIntressentRoll.value }; }); return intressentService.save((intressentDo)).$promise; } // Sparar först alla kopplingar som blivit rensade, sedan de med nya/ändrade function updateKopplingarInOrder(intressenter: (fb.Objektintressent | fb.Projektintressent)[]): ng.IPromise { var clearedKopplingar = _.filter(intressenter, function (i: fb.Objektintressent | fb.Projektintressent) { return i.Underkontakter.length === 0; }); var changedKopplingar = _.filter(intressenter, function (i: fb.Objektintressent | fb.Projektintressent) { return i.Underkontakter.length > 0; }); return $q .all(_.map(intressenter, function (i: fb.Objektintressent | fb.Projektintressent) { return intressentService.get(i.ObjektIntressentId.value, i.ObjektIntressentRoll.value).$promise; })) .then(function (intressentDOs: fb.NyObjektIntressent[]) { var doIndex = _.indexBy(intressentDOs, function (i: fb.NyObjektIntressent) { return i.ObjektIntressentId; }); return $q .all(_.map(clearedKopplingar, function (i: fb.Objektintressent | fb.Projektintressent) { return saveKoppling(doIndex[i.ObjektIntressentId.value], i); })) .then(function () { return $q .all(_.map(changedKopplingar, function (i: fb.Objektintressent | fb.Projektintressent) { return saveKoppling(doIndex[i.ObjektIntressentId.value], i); })); }); }); } //Flyttar budinfo från underkontakter med bud till sin primärkontakt function flyttaBudInfo(intressenter: fb.IIntressentRow[]) { if (intressenter[0].Intressent instanceof fb.Projektintressent) { return; } var underKontaktMedBudRow = _.filter(intressenter, function (i: fb.IIntressentRow) { if (i.Intressent instanceof fb.Objektintressent) { return i.Intressent.Bud.length !== 0 && i.Intressent.Underkontakter.length === 0; } })[0]; if (!_.isUndefined(underKontaktMedBudRow)) { var primaerKontaktRow = _.filter(intressenter, function (i: fb.IIntressentRow) { return i.Intressent.Underkontakter.length !== 0; })[0]; if (primaerKontaktRow.Intressent instanceof fb.Objektintressent && underKontaktMedBudRow.Intressent instanceof fb.Objektintressent) { var primaerKontakt = primaerKontaktRow.Intressent; var underKontaktMedBud = underKontaktMedBudRow.Intressent; primaerKontakt.Bud = underKontaktMedBud.Bud; primaerKontakt.Budnr = underKontaktMedBud.Budnr; primaerKontakt.HarGamlaBud = underKontaktMedBud.HarGamlaBud; primaerKontakt.Intressegrad = underKontaktMedBud.Intressegrad; underKontaktMedBud.Bud = []; underKontaktMedBud.Budnr = null; underKontaktMedBud.HarGamlaBud = null; } } } function sattTillPrimarKontaktFromSelectedRows(row: fb.IIntressentRow): void { var affectedIntressenter = [row.Intressent]; if (row.isPrimarKontakt !== true && !_.isUndefined(row.parentRow)) { var possiblePrimarKontakt = _.filter(row.Intressent.Underkontakter, function (uk: fb.Objektintressent | fb.Projektintressent) { return uk.JurPersonTyp.value === null; // Just nu antar vi inga firmor kan va primära kontaktpersoner })[0]; if (_.isUndefined(possiblePrimarKontakt)) { _.each(row.Intressent.Underkontakter, function (uk: fb.Objektintressent | fb.Projektintressent) { intressenter.push(uk); // Lägg till dödsbo/firma som mainrow }); } else { if (!isProjekt) { possiblePrimarKontakt.Underkontakter = _.filter(row.Intressent.Underkontakter, function (uk: fb.Objektintressent) { return uk !== possiblePrimarKontakt; }); } else { possiblePrimarKontakt.Underkontakter = _.filter(row.Intressent.Underkontakter, function (uk: fb.Projektintressent) { return uk !== possiblePrimarKontakt; }); } intressenter.push(possiblePrimarKontakt); if (affectedIntressenter.indexOf(possiblePrimarKontakt) === -1) { affectedIntressenter.push(possiblePrimarKontakt); } } row.Intressent.Underkontakter = []; // Behöver inte flytta några underkontakter till ny primär kontakt } _.each($scope.selectedItems, function (selRow: fb.IIntressentRow) { var index; if (selRow !== row && selRow.Intressent) { index = intressenter.indexOf(selRow.Intressent); if (index > -1) { intressenter.splice(index, 1); } if (!_.isUndefined(selRow.parentRow)) { var realParentRow = selRow.parentRow.isPrimarKontakt ? selRow.parentRow : _.filter(selRow.parentRow.subRows, function (subRow: fb.IIntressentRow) { return subRow.isPrimarKontakt === true; })[0]; if (realParentRow.Intressent) { index = (!isProjekt) ? (realParentRow.Intressent).Underkontakter.indexOf(selRow.Intressent) : (realParentRow.Intressent).Underkontakter.indexOf(selRow.Intressent); if (index > -1) { if (isProjekt) { (realParentRow.Intressent).Underkontakter.splice(index, 1); } else { (realParentRow.Intressent).Underkontakter.splice(index, 1); } if (affectedIntressenter.indexOf(realParentRow.Intressent) === -1) { affectedIntressenter.push(realParentRow.Intressent); } } if (realParentRow === selRow) { var possiblePrimarKontakt = _.filter(selRow.Intressent.Underkontakter, function (uk: fb.Objektintressent | fb.Projektintressent) { return uk.JurPersonTyp.value === null; // Just nu antar vi inga firmor kan va primära kontaktpersoner })[0]; if (_.isUndefined(possiblePrimarKontakt)) { _.each(selRow.Intressent.Underkontakter as any, function (uk: fb.Objektintressent | fb.Projektintressent) { intressenter.push(uk); // Lägg till dödsbo/firma som mainrow }); } else { //possiblePrimarKontakt.Underkontakter = _.filter(selRow.Intressent.Underkontakter, function (uk: fb.Objektintressent | fb.Projektintressent) { // return uk !== possiblePrimarKontakt; //}); if (!isProjekt) { possiblePrimarKontakt.Underkontakter = _.filter(selRow.Intressent.Underkontakter, function (uk: fb.Objektintressent) { return uk !== possiblePrimarKontakt; }); } else { possiblePrimarKontakt.Underkontakter = _.filter(selRow.Intressent.Underkontakter, function (uk: fb.Projektintressent) { return uk !== possiblePrimarKontakt; }); } intressenter.push(possiblePrimarKontakt); if (affectedIntressenter.indexOf(possiblePrimarKontakt) === -1) { affectedIntressenter.push(possiblePrimarKontakt); } } if (selRow.Intressent.Underkontakter.length > 0) { if (affectedIntressenter.indexOf(selRow.Intressent) === -1) { affectedIntressenter.push(selRow.Intressent); } } selRow.Intressent.Underkontakter = []; // Behöver inte flytta några underkontakter till ny primär kontakt } } } if (row.Intressent instanceof fb.Objektintressent && selRow.Intressent instanceof fb.Objektintressent) { if (row.Intressent.Underkontakter.indexOf(selRow.Intressent) === -1) { row.Intressent.Underkontakter.push(selRow.Intressent); } _.each(selRow.Intressent.Underkontakter, function (i: fb.Objektintressent) { if (row.Intressent instanceof fb.Objektintressent && row.Intressent.Underkontakter.indexOf(i) === -1) { row.Intressent.Underkontakter.push(i); } }); } else if (row.Intressent instanceof fb.Projektintressent && selRow.Intressent instanceof fb.Projektintressent) { if (row.Intressent.Underkontakter.indexOf(selRow.Intressent) === -1) { row.Intressent.Underkontakter.push(selRow.Intressent); } _.each(selRow.Intressent.Underkontakter, function (i: fb.Projektintressent) { if (row.Intressent instanceof fb.Projektintressent && row.Intressent.Underkontakter.indexOf(i) === -1) { row.Intressent.Underkontakter.push(i); } }); } if (selRow.Intressent.Underkontakter.length > 0) { if (affectedIntressenter.indexOf(selRow.Intressent) === -1) { affectedIntressenter.push(selRow.Intressent); } } selRow.Intressent.Underkontakter = []; } else { if (intressenter.indexOf(row.Intressent) === -1) { row.isPrimarKontakt = true; intressenter.push(row.Intressent); } if (!_.isUndefined(row.parentRow) && row.parentRow.Intressent instanceof fb.Objektintressent && row.Intressent instanceof fb.Objektintressent) { index = row.parentRow.Intressent.Underkontakter.indexOf(row.Intressent); if (index > -1) { row.parentRow.Intressent.Underkontakter.splice(index, 1); if (affectedIntressenter.indexOf(row.parentRow.Intressent) === -1) { affectedIntressenter.push(row.parentRow.Intressent); } } } } }); updateKopplingarInOrder(affectedIntressenter); flyttaBudInfo($scope.selectedItems); doAfterFetchingIntressenter(); } function transformToRow(i: fb.Objektintressent | fb.Projektintressent): fb.IIntressentRow { var isKoepare = !_.isUndefined(koepareKontaktIndex[i.ObjektIntressentId.value]); var isExtraKontakt = !_.isUndefined(koepareExtraKontaktKontaktIndex[i.ObjektIntressentId.value]); var s: string; var row: fb.IIntressentRow = { Intressent: i, subRows: null, primarTelefonnummer: function (): fb.Models_Telefonnummer2RO { if (!!i.TelefonnummerMobil) { return i.TelefonnummerMobil; } else if (!!i.TelefonnummerHem) { return i.TelefonnummerHem; } else if (!!i.TelefonnummerArbete) { return i.TelefonnummerArbete; } else if (!!i.TelefonnummerDirekt) { return i.TelefonnummerDirekt; } return null; }, senastVisning: function (): fb.IVisningSlot { return _.sortBy(i.Visningar || [], function (v: fb.IVisningSlot) { return moment(v.AktivitetStart.value) }).reverse()[0]; }, hoegstaBud: function (): fb.Bud { if (i instanceof fb.Projektintressent) { return null; } return _.sortBy(i.Bud || [], function (b: fb.Bud) { s = ' '; if (b.Status.value !== 4) { // returnerar det högsta icke-annullerade budet return - b.Bud.value; } else if (b.Status.value === 4 && !b.BudAvvisat.value) { // returnerar det högsta icke-annullerade budet s = $translate.instant(' MAEKLAROBJEKT_INTRESSENT.ANNULLERAT'); } else if (b.Status.value === 4 && b.BudAvvisat.value) { s = $translate.instant('MAEKLAROBJEKT_INTRESSENT.AVVISAT'); } b.BudStatus = s; })[0]; }, joinAnteckningar(): string { return _.map(_.sortBy(i.Anteckningar, function (note: fb.Anteckning) { return note.SenastAendrad && note.SenastAendrad.value ? note.SenastAendrad.value : null; }).reverse(), function (a: fb.Anteckning) { return niceDate(a.SenastAendrad.value, false, false) + ': ' + _.escape(a.Anteckning.value); }).join('
'); // Line-break }, isKoepare: isKoepare, isExtraKontakt: isExtraKontakt }; row.subRows = _.map((i.Underkontakter || []) as any, function (u: fb.Objektintressent | fb.Projektintressent): fb.IIntressentRow { var subRow = transformToRow(u); subRow.parentRow = row; return subRow; }); return row; } function moveSubRow(oldParentRow: fb.IIntressentRow, newParentRow: fb.IIntressentRow) { // Peka om primarkonakt till newParentRow var pkDataIndex = $scope.primarKontakter.indexOf(oldParentRow); $scope.primarKontakter[pkDataIndex] = newParentRow; // Sätt om alla underkontaker till ny primärkontakt // Ta bort sig själv som underkontakt och peka om parentRow newParentRow.subRows = _.compact(_.map(oldParentRow.subRows, function (subRow: fb.IIntressentRow) { if (subRow === newParentRow) { return null; } subRow.parentRow = newParentRow; return subRow; })); newParentRow.parentRow = undefined; newParentRow.subRows = [oldParentRow].concat(newParentRow.subRows); oldParentRow.parentRow = newParentRow; oldParentRow.subRows = []; } function doAfterFetchingIntressenter() { var koepare = _.filter(parter, function (p: fb.ObjektintressentPart) { return p.ObjektIntressentRoll === fb.ObjektIntressentRollId.Koepare; }); var extraKontakter = _.flatten(_.map(koepare, function (k: fb.ObjektintressentPart) { return k.ExtraKontakter; })); koepareKontaktIndex = _.indexBy(koepare, function (k: fb.ObjektintressentPart) { return k.ObjektIntressentId; }); koepareExtraKontaktKontaktIndex = _.indexBy(extraKontakter, function (k: fb.ObjektintressentPart) { return k.ObjektIntressentId; }); $scope.primarKontakter = _.map(intressenter, function (i: fb.Objektintressent | fb.Projektintressent): fb.IIntressentRow { return transformToRow(i); }); // Gruppera om bereonde på jurpersontyp // Om någon underkontakt är dödsbo sätt som primärrad // Om ingen underkontakt är dödsbo, men det finns en underkontakt av typ firm, sätta firman som primarkontakt. Ska inte finnas flera firmor om ej dödsbo. _.each($scope.primarKontakter, function (row: fb.IIntressentRow) { row.isPrimarKontakt = true; // Tagga som 'riktig' primarkontakt var dodesBon = _.filter(row.subRows, function (subRow: fb.IIntressentRow) { return subRow.Intressent.JurPersonTyp.value === fb.JuridiskPersonTypId.DOEDSBO; }); if (dodesBon.length > 0) { moveSubRow(row, dodesBon[0]); } else { var firmor = _.filter(row.subRows, function (subRow: fb.IIntressentRow) { return subRow.Intressent.JurPersonTyp.value === fb.JuridiskPersonTypId.OSPECIFICERAD; }); if (firmor.length > 0) { moveSubRow(row, firmor[0]); } } }); var selIndex = _.indexBy($scope.selectedItems, function (row: fb.IIntressentRow) { return row.Intressent.ObjektIntressentId.value; }); var reselectRows = _.filter(_.flatten(_.map($scope.primarKontakter, function (row: fb.IIntressentRow) { return [row].concat(row.subRows); })), function (row: fb.IIntressentRow) { return !_.isUndefined(selIndex[row.Intressent.ObjektIntressentId.value]); }); $scope.selectedItems.length = 0; // console.log("not h'r"); _.each(reselectRows, function (row: fb.IIntressentRow) { $scope.selectedItems.push(row); }); } function getNextViewTableRow(row: fb.IIntressentRow): fb.IIntressentRow { if (row === null) { return null; } var parentRowIndex = tableViewRows.indexOf(row.parentRow ? row.parentRow : row); if (parentRowIndex < 0) { return null; } var parentRow = tableViewRows[parentRowIndex]; var startChildRowIndex = row.parentRow ? parentRow.subRows.indexOf(row) : -1; if (parentRow.subRows.length === 0 || (startChildRowIndex + 1) >= parentRow.subRows.length) { return ++parentRowIndex < tableViewRows.length ? tableViewRows[parentRowIndex] : null; } return tableViewRows[parentRowIndex].subRows[++startChildRowIndex]; } function getPreviousViewTableRow(row: fb.IIntressentRow): fb.IIntressentRow { if (row === null) { return null; } var parentRowIndex = tableViewRows.indexOf(row.parentRow ? row.parentRow : row); if (parentRowIndex < 0) { return null; } var parentRow = tableViewRows[parentRowIndex]; var startChildRowIndex = row.parentRow ? parentRow.subRows.indexOf(row) : -1; if (startChildRowIndex === 0) { return tableViewRows[parentRowIndex]; } if (parentRow.subRows.length === 0 || startChildRowIndex - 1 < 0) { if (--parentRowIndex >= 0) { var lastChildIndex = tableViewRows[parentRowIndex].subRows.length - 1; return lastChildIndex >= 0 ? tableViewRows[parentRowIndex].subRows[lastChildIndex] : tableViewRows[parentRowIndex]; } return null; } return tableViewRows[parentRowIndex].subRows[--startChildRowIndex]; } function openOtherIntressent(dir: string, lastRow: fb.IIntressentRow): fb.IIntressentRow { if (dir === 'preceding') { return getPreviousViewTableRow(lastRow); } else if (dir === 'succeeding') { return getNextViewTableRow(lastRow); } } function removeIntressent(row: fb.IIntressentRow): { action: string; intressent: fb.Objektintressent | fb.Projektintressent }[] { var isMainRow = _.isUndefined(row.parentRow); var isPrimarKontakt = row.isPrimarKontakt === true; var index; if (isMainRow) { index = intressenter.indexOf(row.Intressent); if (index > -1 && row.Intressent.Underkontakter.length === 0) { if (!$scope.maeklarObjekt.isProjekt()) { intressenter.splice(index, 1); } return [{ action: 'remove', intressent: row.Intressent }]; } } else { if (!isPrimarKontakt) { var isParentPrimarKonakt = row.parentRow.isPrimarKontakt || row.parentRow.Intressent.JurPersonTyp.value === null; var realParentRow = isParentPrimarKonakt ? row.parentRow : _.filter(row.parentRow.subRows, function (row: fb.IIntressentRow) { return row.Intressent.Underkontakter.length > 0 })[0] // Underkontakt till verklig primärkontakt under dödsbo/firma if (!_.isUndefined(realParentRow) && realParentRow.Intressent instanceof fb.Objektintressent && row.Intressent instanceof fb.Objektintressent) { index = realParentRow.Intressent.Underkontakter.indexOf(row.Intressent); if (index > -1 && row.Intressent.Underkontakter.length === 0) { realParentRow.Intressent.Underkontakter.splice(index, 1); return [{ action: 'remove', intressent: row.Intressent }]; } } else if (!_.isUndefined(realParentRow) && realParentRow.Intressent instanceof fb.Projektintressent && row.Intressent instanceof fb.Projektintressent) { index = realParentRow.Intressent.Underkontakter.indexOf(row.Intressent); if (index > -1 && row.Intressent.Underkontakter.length === 0) { return [{ action: 'remove', intressent: row.Intressent }]; } } } else { // Verklig primarkontakt för dödsbo/firma if (row.Intressent.Underkontakter.length > 1) { // Koppla om var newPrimarKontakt = _.filter(row.Intressent.Underkontakter, function (uk: fb.Objektintressent | fb.Projektintressent) { return uk.JurPersonTyp.value === null; })[0]; newPrimarKontakt.Underkontakter = (!isProjekt) ? _.filter(row.Intressent.Underkontakter, function (uk: fb.Objektintressent) { return uk !== newPrimarKontakt; }) : _.filter(row.Intressent.Underkontakter, function (uk: fb.Projektintressent | fb.Objektintressent) { return uk !== newPrimarKontakt; }); index = intressenter.indexOf(row.Intressent); intressenter.splice(index, 1, newPrimarKontakt); row.Intressent.Underkontakter = []; return [ { action: 'save', intressent: row.Intressent }, { action: 'save', intressent: newPrimarKontakt }, { action: 'remove', intressent: row.Intressent } ]; } else { // Koppla isär, gör om firma/dödsbo till primärkontakt // Koppla isäs, ta bort från förälders parentlista var firmaOrDoedsbo = row.Intressent.Underkontakter[0]; index = intressenter.indexOf(row.Intressent); intressenter.splice(index, 1, firmaOrDoedsbo); return [{ action: 'remove', intressent: row.Intressent }]; } } } // Borde inte komma hit return []; } function openEpostSideDrawer(rows: fb.IIntressentRow[]) { var recipients = _.map(rows, function (row: fb.IIntressentRow) { return new fb.PersonMottagare({ PersonNamn: row.Intressent.PersonNamn.value, MejlAdress: row.Intressent.Mejladress['value'] === null ? null : row.Intressent.Mejladress.Mejladress.value, PersonId: row.Intressent.PersonId.value, EjReklam: !!row.Intressent.Mejladress && !!row.Intressent.Mejladress.AerSpaerrad.value, }); }); sideDrawerService.setSideDrawer('EpostUtskick', { recipients: recipients, sender: null, body: null, maeklarObjektId: $routeParams.id * 1, subject: null }); } function openSMSSideDrawer(persons: fb.IIntressentRow[], extended) { var recipients = _.map(persons, function (person) { return new fb.PersonMottagare({ PersonNamn: person.Intressent.PersonNamn.value, TelefonnummerMobil: !!person.Intressent.TelefonnummerMobil && person.Intressent.TelefonnummerMobil.NormaliseratTelefonnummer && person.Intressent.TelefonnummerMobil.NormaliseratTelefonnummer ? $filter('phoneNumber')(person.Intressent.TelefonnummerMobil.NormaliseratTelefonnummer.value) : null, PersonId: person.Intressent.PersonId.value, EjReklam: !!person.Intressent.TelefonnummerMobil && !!person.Intressent.TelefonnummerMobil.AerSpaerrat && !!person.Intressent.TelefonnummerMobil.AerSpaerrat.value, }); }); sideDrawerService.setSideDrawer('SMSUtskick', { extended: extended, useDefaultExtendedForBud: extended, recipients: recipients, sender: null, body: null, maeklarObjektId: $routeParams.id * 1, intressenter: $scope.intressenter }); } $scope.selectedItems = []; $scope['tableRefiltered'] = function (viewRows) { tableViewRows = viewRows; } $scope.warningKeys = []; $scope.clearWarnings = function () { $scope.warningKeys = []; } $scope.openSideDrawer = function (param, row: fb.IIntressentRow) { var navObject: fb.ISideDrawerIntressentParams = { maeklarObjekt: $scope.maeklarObjekt, intressenter: intressenter, updateTableRow: updateTableRow, updateEfterDubblettSammanslagning: updateEfterDubblettSammanslagning }; if (row) { var intressent = row.Intressent; navObject.PersonId = intressent.PersonId.value; navObject.navigateToAdjacent = openOtherIntressent; navObject.prevRow = openOtherIntressent('preceding', row); navObject.row = row; navObject.nextRow = openOtherIntressent('succeeding', row); } if (param === 'nyIntressent') { navObject.callbackForNewIntressent = callbackForNewIntressentSidedrawer; //navObject.offsetToTop = 166; navObject.visningId = !_.isUndefined($scope.nyIntressent.tillVisning) ? $scope.nyIntressent.tillVisning.id : undefined; } else if (param === 'behoeverDubblettFoerslag') { navObject.behoeverDubblettFoerslag = true; if (row && row.Intressent.Kaella && row.Intressent.Kaella.value === fb.FasITDomain.ObjSpekKaella.DIGITALBUDGIVNING) { navObject.sammanslagningFraanNotifiering = true; // Än så länga endast digital budgivning som har notifieringar för intresssenter som behöver dubblettsammanslås } } sideDrawerService.setSideDrawer('Intressent', navObject, '75%'); }; $scope.intressentClicked = function (row: fb.IIntressentRow) { if (row.Intressent.SfdStatusLagring.value === fb.FasITDomain.StatusLagring.IMPORTERAD && (row.Intressent.Kaella.value === fb.FasITDomain.ObjSpekKaella.DIGITALBUDGIVNING || row.Intressent.Kaella.value === fb.FasITDomain.ObjSpekKaella.VISNINGANMAELAN || row.Intressent.Kaella.value === fb.FasITDomain.ObjSpekKaella.INTRESSEANMAELAN)) { $scope.openSideDrawer('behoeverDubblettFoerslag', row); } else { $scope.openSideDrawer(null, row); } }; $scope.filter = { status: new fb.Intressegrad({}), visning: null }; $scope.intressentFilter = function (val) { //Om fritextsök används så måste minst en matcha if ($scope.soek.fritext && $scope.soek.fritext.length && (!(val.Intressent.PersonNamn && val.Intressent.PersonNamn.value && val.Intressent.PersonNamn.value.toLowerCase().indexOf($scope.soek.fritext.toLowerCase()) !== -1) && !(val.Intressent.Mejladress && val.Intressent.Mejladress.Mejladress.value && val.Intressent.Mejladress.Mejladress.value.toLowerCase().indexOf($scope.soek.fritext.toLowerCase()) !== -1) && !(val.primarTelefonnummer().Telefonnummer && val.primarTelefonnummer().Telefonnummer.value.indexOf($scope.soek.fritext) !== -1))) { return false; } if ($scope.filter.status && $scope.filter.status.Intressegrad && $scope.filter.status.Intressegrad !== val.Intressent.Intressegrad.value) { return false; } if ($scope.filter.visning && $scope.filter.visning.AktivitetId) { var foundVisning = false; for (var i: number = 0; i < val.Intressent.Visningar.length; i++) { if ($scope.filter.visning.AktivitetId.value === val.Intressent.Visningar[i].VisningId.value) { foundVisning = true; } } if (!foundVisning) { return false; } } return true; }; $scope.setStatus = function (intresse: fb.Intressegrad) { updateWarnings('saettIntressegrad'); if (!hasWarnings()) { if ((intresse.Intressegrad === 70 && $scope.selectedItems.length > 1) || intresse.Intressegrad === 50) { return; // Ignorera om intressegrad är "Stannat i budgivning" och fler är markerade eller intressegrad är "Har köpt" } if (intresse.Intressegrad === fb.FasITDomain.Intressegrad.EJ_INTRESSERAD && $scope.maeklarObjekt.isObjektIProjekt()) { $scope.showPopoverSetEjIntresseradForAllCorrespondingObjIntressenter = true; } else { if (intresse.Intressegrad === fb.FasITDomain.Intressegrad.EJ_INTRESSERAD && $scope.maeklarObjekt.isProjekt()) { setIntressegradForAllCorrespondingObjektIntressenterIProjektet = true; } _.each($scope.selectedItems, function (row: fb.IIntressentRow) { row.Intressent.Intressegrad.value = intresse.Intressegrad; }); var ObjektIntressentIntressegradDO = new fb.ObjektIntressentIntressegradDO({ MaeklarObjektId: $routeParams.id, Intressegrad: intresse.Intressegrad, DoForAllCorrespondingObjektIntressenterIProjektet: setIntressegradForAllCorrespondingObjektIntressenterIProjektet, ObjektIntressentIdList: _.map($scope.selectedItems, function (row: fb.IIntressentRow) { return row.Intressent.ObjektIntressentId.value; }) }); setIntressegradForAllCorrespondingObjektIntressenterIProjektet = false; intressentService.saettIntressegrad(ObjektIntressentIntressegradDO); //Status bara möjlig för Objektintressent if (intresse.Intressegrad === fb.FasITDomain.Intressegrad.STANNAT_I_BUDGIVNINGEN && $scope.selectedItems.length === 1 && $scope.selectedItems[0].Intressent instanceof fb.Objektintressent) { var iintressent = $scope.selectedItems[0].Intressent; sideDrawerService.setSideDrawer('SMSUtskick', { extended: true, useDefaultExtendedForBud: true, recipients: [], maeklarObjektId: $scope.maeklarObjekt.MaeklarObjektId.value, textMallNamn: fb.FasITDomain.TextMallNamn.BUDGIVNING_BUDGIVARE_STANNAT, extraData: { BudgivareNummer: iintressent.Budnr.value } }); } } } }; $scope.setEjIntresseradForAllCorrespondingObjIntressenter = function (val: boolean): void { $scope.showPopoverSetEjIntresseradForAllCorrespondingObjIntressenter = false; setIntressegradForAllCorrespondingObjektIntressenterIProjektet = val; _.each($scope.selectedItems, function (row: fb.IIntressentRow) { row.Intressent.Intressegrad.value = fb.FasITDomain.Intressegrad.EJ_INTRESSERAD; }); var ObjektIntressentIntressegradDO = new fb.ObjektIntressentIntressegradDO({ MaeklarObjektId: $routeParams.id, Intressegrad: fb.FasITDomain.Intressegrad.EJ_INTRESSERAD, DoForAllCorrespondingObjektIntressenterIProjektet: setIntressegradForAllCorrespondingObjektIntressenterIProjektet, ObjektIntressentIdList: _.map($scope.selectedItems, function (row: fb.IIntressentRow) { return row.Intressent.ObjektIntressentId.value; }) }); setIntressegradForAllCorrespondingObjektIntressenterIProjektet = false; intressentService.saettIntressegrad(ObjektIntressentIntressegradDO); } function toPart(i: fb.Objektintressent | fb.Projektintressent, extraKontakter?: any[]): fb.ObjektintressentPart { return new fb.ObjektintressentPart({ ObjektIntressentId: i.ObjektIntressentId.value, ObjektIntressentRoll: fb.ObjektIntressentRollId.Koepare, PersonId: i.PersonId.value, ExtraKontakter: extraKontakter }); } $scope.visaExcelexportVarning = false; $scope.goerTillKoepare = { show: false, $resolved: true, $error: false, fn: function () { updateWarnings('goerTillKoepare'); if (hasWarnings()) { $scope.goerTillKoepare.show = false; return } $scope.goerTillKoepare.$resolved = false; var missingDoedsboOrFirmaForSubRows = _.map(_.filter($scope.selectedItems, function (subRow: fb.IIntressentRow) { // Lägg till dödsbo/firma för underkontakter return !_.isUndefined(subRow.parentRow) && subRow.parentRow.Intressent.JurPersonTyp.value !== null && $scope.selectedItems.indexOf(subRow.parentRow) === -1; }), function (subRow: fb.IIntressentRow) { return subRow.parentRow; }); var doedsboOrFirmaMainRows = _.filter($scope.selectedItems, function (row: fb.IIntressentRow) { return _.isUndefined(row.parentRow) && row.Intressent.JurPersonTyp.value !== null; }).concat(missingDoedsboOrFirmaForSubRows); var koepareRows = _.filter($scope.selectedItems, function (row: fb.IIntressentRow) { // Ta bort underkontaker för dödsbon/firmor return _.isUndefined(row.parentRow) || doedsboOrFirmaMainRows.indexOf(row.parentRow) === -1; }).concat(missingDoedsboOrFirmaForSubRows); var koepareAsPart = _.map(koepareRows, function (row: fb.IIntressentRow) { var mainRow = _.isUndefined(row.parentRow) ? row : row.parentRow; var extraKontakter = _.map(_.filter(mainRow.subRows.concat(mainRow), function (row: fb.IIntressentRow) { return koepareRows.indexOf(row) === -1; }), function (row: fb.IIntressentRow) { return toPart(row.Intressent); }); return toPart(row.Intressent, extraKontakter); }); _.each(koepareAsPart, function (p: fb.ObjektintressentPart) { if (_.isUndefined(koepareKontaktIndex[p.ObjektIntressentId])) { parter.push(p); } }); $q.all(_.map($scope.selectedItems, function (row: fb.IIntressentRow) { return intressentService.get(row.Intressent.ObjektIntressentId.value, row.Intressent.ObjektIntressentRoll.value).$promise; })).then(function (intressenterDo: fb.NyObjektIntressent[]) { _.each(intressenterDo, function (ido: fb.NyObjektIntressent) { ido.ObjektIntressentRoll = fb.ObjektIntressentRollId.Koepare; }); return intressentService.addParter(intressenterDo).$promise; }).catch(function () { $scope.goerTillKoepare.$resolved = true; $scope.goerTillKoepare.$error = true; }).then(function () { $rootScope.$broadcast(fb.FasITDomain.GlobalEvents.LADDA_OM_PARTER); fbBroadcastService.broadcast(fb.FasITDomain.GlobalEvents.LADDA_OM_PARTER); const slutPris: number = _.max(_.map($scope.selectedItems, function (item: fb.IIntressentRow) { return item.hoegstaBud() ? item.hoegstaBud().Bud.value : 0 })); if (slutPris) { $scope.maeklarObjekt.SlutPris.setValue(slutPris); } ($scope.$parent).scrollToBasplatta('parterData'); $scope.goerTillKoepare.$resolved = true; $scope.goerTillKoepare.show = false }); doAfterFetchingIntressenter(); } } const getRows = onlySelected => (onlySelected ? $scope.selectedItems : $scope.primarKontakter) .map(i => [i.Intressent.PersonNamn.value, i.senastVisning() ? $filter('niceDate')(i.senastVisning().AktivitetStart.value, false, false) : '', i.hoegstaBud() ? i.hoegstaBud().Bud.value + ' kr ' + (i.hoegstaBud().BudStatus ? i.hoegstaBud().BudStatus : '') : '', ( i.Intressent).Budnr.value || '', $filter('niceDate')(i.Intressent.SfdBankNyttaSvarDatum.value, false, false) || '', $filter('niceDate')(i.Intressent.SfdFraagatOmLaemnatObjektDatum.value, false, false) || '']); const getRowsProjekt = onlySelected => (onlySelected ? $scope.selectedItems : $scope.primarKontakter) .map(i => [i.Intressent.PersonNamn.value, i.senastVisning() ? $filter('niceDate')(i.senastVisning().AktivitetStart.value, false, false) : '', $filter('husnummerList')( i.Intressent) || '', $filter('niceDate')((i.Intressent).Tillagd.value, false, false) || '', $filter('niceDate')(i.Intressent.SfdBankNyttaSvarDatum.value, false, false) || '', $filter('niceDate')(i.Intressent.SfdFraagatOmLaemnatObjektDatum.value, false, false) || '']); const headers = isProjekt ? ['Namn', 'Visning', 'Intresserad av', 'Tillagd', 'Uppf. bank', 'Uppf. lämnar'] : ['Namn', 'Visning', 'Bud', 'Budnr', 'Uppf. bank', 'Uppf. lämnar']; $scope.getExcel = function () { var selection = _.map($scope.selectedItems, function (row: fb.IIntressentRow) { return 'intressentRad_' + row.Intressent.ObjektIntressentId.value; }); let matrix = []; matrix.push(headers); matrix = isProjekt ? matrix.concat(getRowsProjekt(true)) : matrix.concat(getRows(true)); exportService.exportExcel(matrix, 'Intressentlista'); }; $scope.sparaAnteckning = function (anteckningText: string): void { let currentUser = ($rootScope).InloggadAnvaendare; if ($scope.anteckningAlltidFoerKontakt.value) { let personIds = _.map($scope.selectedItems, //TODO: fixa radiobuttons för valet. function (intressentRow: fb.IIntressentRow) { return intressentRow.Intressent.PersonId.value; }); anteckningService.addBatch({ Typ: "Person", Anteckning: anteckningText, SparadAvPersonId: currentUser.PersonId, KoppladTillObjekt: personIds } as fb.AnteckningBatch); } else { let intressentIds = _.map($scope.selectedItems, function (intressentRow: fb.IIntressentRow) { return intressentRow.Intressent.ObjektIntressentId.value; }); anteckningService.addBatch({ Typ: "ObjIntressent", Anteckning: anteckningText, SparadAvPersonId: currentUser.PersonId, KoppladTillObjekt: intressentIds } as fb.AnteckningBatch); } }; $scope.skickaSMS = function (extended) { var persons: any[]; if (!_.isEmpty($scope.selectedItems)) { persons = $scope.selectedItems; } openSMSSideDrawer(persons, extended); }; $scope.snabbSkickaSMS = function (person: fb.IIntressentRow) { openSMSSideDrawer([person], false); }; $scope.skickaPost = function () { var personidMedChangeTrack = _.map($scope.selectedItems, function (intr) { return { PersonId: new fb.ChangeTrack(intr.Intressent.PersonId.value) } }); sideDrawerService.setSideDrawer('Bostadsbevakning', { type: fb.FasITDomain.MabeContactType.POST, persons: personidMedChangeTrack, maeklarObjektId: null //ansvarigMaeklare: ansvarigMaeklare }); }; $scope.skickaEpost = function (string) { var persons: any[]; if (!_.isEmpty($scope.selectedItems)) { persons = $scope.selectedItems; } openEpostSideDrawer(persons); }; $scope.snabbSkickaEpost = function (person: fb.IIntressentRow) { openEpostSideDrawer([person]); }; $scope.skapaMoejlighet = function () { var koppladTillKunder = _.map($scope.selectedItems, function (row: fb.IIntressentRow) { return { PersonNamn: row.Intressent.PersonNamn.value, PersonId: row.Intressent.PersonId.value, }; }); sideDrawerService.setSideDrawer( 'NyMoejlighet', { koppladTillKunder: koppladTillKunder, }); }; $scope.HasSelectedImporteradIntressent = function () { var persons: any[]; if (!_.isEmpty($scope.selectedItems)) { persons = $scope.selectedItems; return persons.length > 0 && persons.some(function (i) { return !!i.Intressent.SfdStatusLagring.value && i.Intressent.SfdStatusLagring.value === fb.FasITDomain.StatusLagring.IMPORTERAD && (i.Intressent.Kaella.value === fb.FasITDomain.ObjSpekKaella.DIGITALBUDGIVNING || i.Intressent.Kaella.value === fb.FasITDomain.ObjSpekKaella.VISNINGANMAELAN || i.Intressent.Kaella.value === fb.FasITDomain.ObjSpekKaella.INTRESSEANMAELAN) }); } return false; }; $scope.HasMultipleSelectedImporteradIntressent = function () { var persons: any[]; if (!_.isEmpty($scope.selectedItems)) { persons = $scope.selectedItems; return persons.length > 1 && persons.filter(function (i) { return !!i.Intressent.SfdStatusLagring.value && i.Intressent.SfdStatusLagring.value === fb.FasITDomain.StatusLagring.IMPORTERAD && (i.Intressent.Kaella.value === fb.FasITDomain.ObjSpekKaella.DIGITALBUDGIVNING || i.Intressent.Kaella.value === fb.FasITDomain.ObjSpekKaella.VISNINGANMAELAN || i.Intressent.Kaella.value === fb.FasITDomain.ObjSpekKaella.INTRESSEANMAELAN) }).length > 1; } return false; }; $scope.isAnySammankoppladRowSelected = function (): boolean { return isAnySubRowSelected() || isAnyMainRowSelected(); }; $scope.showTaBortDisabledTooltip = function () { if ($scope.isAnySammankoppladRowSelected() && $scope.maeklarObjekt.isObjektIProjekt()) { return $filter('translate')('MAEKLAROBJEKT_INTRESSENT.TOOLTIP_TA_BORT') } return null; } const getIds = (markerade: boolean) => { // Skapar map från intressentId till PersonId const intressenter = $scope.order ? $filter('orderByObject')( _.map($scope.intressenter, (i: fb.Objektintressent | fb.Projektintressent): fb.IIntressentRow => transformToRow(i)), $scope.order, $scope.orderReversed) .map((value: fb.IIntressentRow) => value.Intressent) : $scope.intressenter.toArray(); return intressenter .filter(i => !markerade || $scope.selectedItems.some(sI => sI.Intressent.PersonId.value === i.PersonId.value)) .reduce((acc, val) => { acc.push(val); acc = acc.concat(val.Underkontakter); return acc; }, []) .map(i => i.PersonId.value); }; $scope.skrivUtLista = function (markerade: boolean) { if (markerade && $scope.selectedItems.length === 0) { return; } var tmp = utskriftService.skrivUtKontaktinformation1(getIds(markerade)); $scope.utskriftLaddningPaagaar = true; tmp.then(function () { $scope.utskriftLaddningPaagaar = false; }); }; $scope.skrivUtVisningslista = function (markerade: boolean) { if (markerade && $scope.selectedItems.length === 0) { return; } var tmp = utskriftService.skrivUtVisningslista({ MaeklarObjektId: $routeParams.id, personIds: getIds(markerade), sorterat: $scope.order ? true: false }); $scope.utskriftLaddningPaagaar = true; tmp.then(function () { $scope.utskriftLaddningPaagaar = false; }); }; $scope.skrivUtTabell = function (markerade: boolean) { if (markerade && $scope.selectedItems.length === 0) { return; } if (!isProjekt) { utskriftService.skrivUtTabellData(getRows(markerade), headers, 3, 15); } else { utskriftService.skrivUtTabellData(getRowsProjekt(markerade), headers, 3, 15); } }; $scope.skrivUtKomplettInformation = function (markerade: boolean) { if (markerade && $scope.selectedItems.length === 0) { return; } var tmp = utskriftService.skrivUtKontaktinformation2({ MaeklarObjektId: $routeParams.id, personIds: getIds(markerade)}); $scope.utskriftLaddningPaagaar = true; tmp.then(function () { $scope.utskriftLaddningPaagaar = false; }); }; $scope.tipsa = function () { sideDrawerService.setSideDrawer('Tipsa', { tipsKontakter: $scope.selectedItems, typAvKontakt: 'intressent', foervaldMottagare: 'bank' //maeklarObjekt: $scope.maeklarObjekt }, '640px'); }; $scope.kopplaIhop = function () { updateWarnings('koppla'); if (!hasWarnings()) { var doedsBo = _.filter($scope.selectedItems, function (row: fb.IIntressentRow) { return row.Intressent.JurPersonTyp.value === fb.JuridiskPersonTypId.DOEDSBO; })[0]; var firma = _.filter($scope.selectedItems, function (row: fb.IIntressentRow) { return row.Intressent.JurPersonTyp.value === fb.JuridiskPersonTypId.OSPECIFICERAD; })[0]; var prioSelectedRow = doedsBo || firma; if (!_.isUndefined(prioSelectedRow)) { // En dödsbo eller firma markerad var realPrimarKontakt = _.filter(prioSelectedRow.subRows, function (row: fb.IIntressentRow) { return row.isPrimarKontakt === true; })[0]; if (_.isUndefined(realPrimarKontakt)) { // Existerar ingen riktigt primar kontakt, välj godtycklig från valda rader realPrimarKontakt = _.filter($scope.selectedItems, function (row: fb.IIntressentRow) { return row !== doedsBo && row !== firma; })[0]; } sattTillPrimarKontaktFromSelectedRows(realPrimarKontakt); } else { // Hederliga fysiska personer har markerats var primaraRows = _.filter($scope.selectedItems, function (row: fb.IIntressentRow) { return _.isUndefined(row.parentRow) && row.Intressent.JurPersonTyp.value === null; // Endast riktiga primärkontakter }); if (primaraRows.length === 1) { sattTillPrimarKontaktFromSelectedRows(primaraRows[0]); } else { // Låt användaren välja primar kontaktperson $scope.koppla.primarKontakter = primaraRows; $scope.koppla.tillPrimarKontakt = primaraRows[0]; $scope.koppla.showPopup = true; } } } }; $scope.dubblettsammanslaaManuellt = function () { sideDrawerService.setSideDrawer('Dubblettsammanslagning', { personIds: _.map($scope.selectedItems, function (row: fb.IIntressentRow) { return row.Intressent.PersonId.value; }), importeradPersonId: null }, undefined, function (data: fb.DubblettsammanslagenPersonWO) { fetchIntressenter(); }); }; $scope.kopplaIsaer = function () { updateWarnings('kopplaIsaer'); if (!hasWarnings()) { var affectedIntressenter = []; var mainRows = _.filter($scope.selectedItems, function (row: fb.IIntressentRow) { return _.isUndefined(row.parentRow); }); var subRowsWithoutSelectedMain = _.filter($scope.selectedItems, function (row: fb.IIntressentRow) { return !_.isUndefined(row.parentRow) && mainRows.indexOf(row.parentRow) === -1; }); _.each(mainRows, function (row: fb.IIntressentRow) { // Koppla loss alla underkontaker var primarKontaktRow = row.isPrimarKontakt === true ? row : _.filter(row.subRows, function (subRow: fb.IIntressentRow) { return subRow.Intressent.Underkontakter.length > 0; })[0]; if (!_.isUndefined(primarKontaktRow) && primarKontaktRow.Intressent.Underkontakter.length > 0) { _.each(primarKontaktRow.Intressent.Underkontakter as any, function (uk: fb.Objektintressent | fb.Projektintressent) { if (intressenter.indexOf(uk) === -1) { intressenter.push(uk); } }); primarKontaktRow.Intressent.Underkontakter = []; if (affectedIntressenter.indexOf(primarKontaktRow.Intressent) === -1) { affectedIntressenter.push(primarKontaktRow.Intressent); } } }); _.each(subRowsWithoutSelectedMain, function (row: fb.IIntressentRow) { var index = (!isProjekt) ? (row.parentRow.Intressent).Underkontakter.indexOf(row.Intressent) : (row.parentRow.Intressent).Underkontakter.indexOf(row.Intressent); if (index > -1) { if (isProjekt) { (row.parentRow.Intressent).Underkontakter.splice(index, 1); } else { (row.parentRow.Intressent).Underkontakter.splice(index, 1); } //row.parentRow.Intressent.Underkontakter.splice(index, 1); if (affectedIntressenter.indexOf(row.parentRow.Intressent) === -1) { affectedIntressenter.push(row.parentRow.Intressent); } } else { var realPrimarKontaktRow = _.filter(row.parentRow.subRows, function (subRow: fb.IIntressentRow) { return subRow.Intressent.Underkontakter.length > 0; })[0]; if (realPrimarKontaktRow === row) { var possiblePrimarKontakt = _.filter(row.Intressent.Underkontakter, function (uk: fb.Objektintressent | fb.Projektintressent) { return uk.JurPersonTyp.value === null; })[0]; if (_.isUndefined(possiblePrimarKontakt)) { // Inga underkontakter hittades som kan agera primar kontakt _.each(row.Intressent.Underkontakter as any, function (uk: fb.Objektintressent | fb.Projektintressent) { intressenter.push(uk); // Lägg till dödsbo/firma som mainrow }); } else { if (!isProjekt) { possiblePrimarKontakt.Underkontakter = _.filter(row.Intressent.Underkontakter, function (uk: fb.Objektintressent) { return uk !== possiblePrimarKontakt; }); } else { possiblePrimarKontakt.Underkontakter = _.filter(row.Intressent.Underkontakter, function (uk: fb.Projektintressent) { return uk !== possiblePrimarKontakt; }); } //possiblePrimarKontakt.Underkontakter = _.filter(row.Intressent.Underkontakter, function (uk: fb.Objektintressent | fb.Projektintressent) { // return uk !== possiblePrimarKontakt; //}); intressenter.push(possiblePrimarKontakt); if (affectedIntressenter.indexOf(possiblePrimarKontakt) === -1) { affectedIntressenter.push(possiblePrimarKontakt); } } row.Intressent.Underkontakter = []; // Behöver inte flytta några underkontakter till ny primär kontakt if (affectedIntressenter.indexOf(row.Intressent) === -1) { affectedIntressenter.push(row.Intressent); } } else if (realPrimarKontaktRow.Intressent instanceof fb.Objektintressent && row.Intressent instanceof fb.Objektintressent) { index = realPrimarKontaktRow.Intressent.Underkontakter.indexOf(row.Intressent); realPrimarKontaktRow.Intressent.Underkontakter.splice(index, 1); if (affectedIntressenter.indexOf(realPrimarKontaktRow.Intressent) === -1) { affectedIntressenter.push(realPrimarKontaktRow.Intressent); } } else if (realPrimarKontaktRow.Intressent instanceof fb.Projektintressent && row.Intressent instanceof fb.Projektintressent) { index = realPrimarKontaktRow.Intressent.Underkontakter.indexOf(row.Intressent); realPrimarKontaktRow.Intressent.Underkontakter.splice(index, 1); if (affectedIntressenter.indexOf(realPrimarKontaktRow.Intressent) === -1) { affectedIntressenter.push(realPrimarKontaktRow.Intressent); } } } if (intressenter.indexOf(row.Intressent) === -1) { intressenter.push(row.Intressent); } }); updateKopplingarInOrder(affectedIntressenter); doAfterFetchingIntressenter(); } } $scope.bytPrimaerKontaktperson = function () { updateWarnings('bytPrimarKontakt'); if (!hasWarnings()) { var affectedIntressenter = []; _.each($scope.selectedItems, function (row: fb.IIntressentRow) { if (!_.isUndefined(row.parentRow) && row.Intressent.Underkontakter.length === 0) { var currentPrimarKontaktRow = row.parentRow.Intressent.Underkontakter.length > 0 ? row.parentRow : _.filter(row.parentRow.subRows, function (subRow: fb.IIntressentRow) { return subRow.Intressent.Underkontakter.length > 0; })[0]; if (!isProjekt) { row.Intressent.Underkontakter = _.filter(currentPrimarKontaktRow.Intressent.Underkontakter, function (uk: fb.Objektintressent) { return uk !== row.Intressent; }); (row.Intressent.Underkontakter as fb.Projektintressent[]).push(currentPrimarKontaktRow.Intressent as fb.Projektintressent); } else { row.Intressent.Underkontakter = _.filter(currentPrimarKontaktRow.Intressent.Underkontakter, function (uk: fb.Projektintressent) { return uk !== row.Intressent; }); (row.Intressent.Underkontakter as fb.Objektintressent[]).push(currentPrimarKontaktRow.Intressent as fb.Objektintressent); } //row.Intressent.Underkontakter.push(currentPrimarKontaktRow.Intressent); currentPrimarKontaktRow.Intressent.Underkontakter = []; var index = intressenter.indexOf(currentPrimarKontaktRow.Intressent); intressenter.splice(index, 1); if (intressenter.indexOf(row.Intressent) === -1) { intressenter.push(row.Intressent); } if (affectedIntressenter.indexOf(currentPrimarKontaktRow.Intressent) === -1) { affectedIntressenter.push(currentPrimarKontaktRow.Intressent); } if (affectedIntressenter.indexOf(row.Intressent) === -1) { affectedIntressenter.push(row.Intressent); } } }); updateKopplingarInOrder(affectedIntressenter); _.each($scope.selectedItems, function (currentRow: fb.IIntressentRow) { flyttaBudInfo([currentRow, currentRow.parentRow]); }); doAfterFetchingIntressenter(); } }; function removeProjektIntressent(action: any) { if (!(!!action && !!action.intressent && !!action.intressent.ObjektIntressentRoll)) { return; } let objIntressentIProjekt = action.intressent; var deletedProjIntressent = intressentService.removeProjektIntressent(action.intressent, action.intressent.ObjektIntressentRoll.value); deletedProjIntressent.$promise.then(function (data: fb.ProjektIntressentDO) { if (data.DeletedProjektIntressent) { var intressentRow = transformToRow(objIntressentIProjekt); var index = intressenter.indexOf(intressentRow.Intressent); if (index > -1) { if (intressentRow.isPrimarKontakt || intressentRow.isPrimarKontakt === undefined) { intressenter.splice(index, 1); } } else { var subRowList =_.filter(_.flatten(_.map($scope.primarKontakter, function (row: fb.IIntressentRow) { return [row].concat(row.subRows);}) ), function (row: fb.IIntressentRow) { return row.Intressent.ObjektIntressentId.value === intressentRow.Intressent.ObjektIntressentId.value; }); var subRow = subRowList.length > 0 ? subRowList[0] : null; if (subRow === null) { // Här borde vi aldrig hamna, vi kan inte ta bort en intressent som inte finns i intressentlistan return; } var isParentPrimarKonakt = subRow.parentRow.isPrimarKontakt || subRow.parentRow.Intressent.JurPersonTyp.value === null; var realParentRow = isParentPrimarKonakt ? subRow.parentRow : _.filter(subRow.parentRow.subRows, function (row: fb.IIntressentRow) { return row.Intressent.Underkontakter.length > 0 })[0] // Underkontakt till verklig primärkontakt under dödsbo/firma if (!_.isUndefined(realParentRow) && realParentRow.Intressent instanceof fb.Projektintressent && subRow.Intressent instanceof fb.Projektintressent) { index = realParentRow.Intressent.Underkontakter.indexOf(subRow.Intressent); if (index > -1 && subRow.Intressent.Underkontakter.length === 0) { realParentRow.Intressent.Underkontakter.splice(index, 1); } } } } else { updateWarnings('taBortProjektIntressent'); } doAfterFetchingIntressenter(); }); return deletedProjIntressent.$promise; } function taBortIntressenter() { updateWarnings('taBort'); if (!hasWarnings()) { var mainRows = _.filter($scope.selectedItems, function (row: fb.IIntressentRow) { return _.isUndefined(row.parentRow); }); var subRows = _.filter($scope.selectedItems, function (row: fb.IIntressentRow) { return !_.isUndefined(row.parentRow); }).sort(function (a: fb.IIntressentRow, b: fb.IIntressentRow) { return a.isPrimarKontakt === b.isPrimarKontakt ? 0 : a.isPrimarKontakt === true ? 1 : -1; }); var subActions = _.flatten(_.map(subRows, removeIntressent)); var mainActions = _.flatten(_.map(mainRows, removeIntressent)); var subSaveIntressenter = _.map(_.filter(subActions, function (a: any) { return a.action === 'save'; }), function (a: any) { return a.intressent; }); var subRemoveActions = _.filter(subActions, function (a: any) { return a.action === 'remove'; }); updateKopplingarInOrder(subSaveIntressenter) .then(function () { // Ta bort sekventiellt för att va snällare mot backend return _.reduce(subRemoveActions, function (prev: any, a: any) { return prev.then(function () { if (!$scope.maeklarObjekt.isProjekt()) { return intressentService.remove(a.intressent, a.intressent.ObjektIntressentRoll.value).$promise; } else { return removeProjektIntressent(a); } }); }, $q.when()); }) .then(function () { return $q.all(_.map(mainActions, function (a: any) { if (!$scope.maeklarObjekt.isProjekt()) { return intressentService.remove(a.intressent, a.intressent.ObjektIntressentRoll.value).$promise; } else { return removeProjektIntressent(a); } })); }); if (!$scope.maeklarObjekt.isProjekt()) { doAfterFetchingIntressenter(); } } } $scope.getVisningsTid = function (v: fb.Visning): string { if (v == null) { return ''; } var hideTime = commonService.date.timePart(v.AktivitetStart.value) === ('00:00:00') && commonService.date.timePart(v.AktivitetSlut.value) === ('00:00:00') return getAktivitetStart(v, hideTime) + (hideTime ? '' : getTidsintervall(v)); } function getAktivitetStart(v: fb.Visning, hideTime): string { return $filter('niceDate')(v.AktivitetStart ? v.AktivitetStart.value || '' : '', false, !hideTime); } function getTidsintervall(v: fb.Visning): string { if (angular.isUndefined(v.AktivitetStart)) { return ''; } var endMom = moment(commonService.date.timePart(v.AktivitetSlut.value), 'HH:mm:ss', true); return endMom.isValid() ? (' - ' + endMom.format('HH:mm')) : ''; } $scope.tabort = { showPopup: false, taBortIntressenter: taBortIntressenter }; $scope.koppla = { showPopup: false, primarKontakter: [], tillPrimarKontakt: undefined, sattTillPrimarKontaktFromSelectedRows: sattTillPrimarKontaktFromSelectedRows }; $scope.nyIntressent = { tillVisning: undefined, visningar: undefined, open: function (visningId: number) { $scope.openSideDrawer('nyIntressent'); } }; domainService.Intressegrad.query(isProjekt).$promise.then(function (data) { $scope.Intressegrader = data; }); fetchIntressenter(); $scope.$watch('tabIndex.currentTabIndex', function (newVal: number, oldVal: number) { if (newVal !== oldVal && $scope['tabIndex'].currentTabIndex === $scope['tabIndex'].Intressenter) { fetchIntressenter(); } }); $scope.showWarningIsAllSelected = true; $scope.showWarningDeselectAll = true; function openCopyIntressenter() { $scope.kopiera.entitetnamn = 'GLOBALS.OBJEKT'; $scope.kopiera.objekts = navigationService.getNavigationObjects().OeppnaObjekt.OeppnaMaeklarObjekt .filter((oeppetObjekt: fb.OeppnaMaeklarObjekt) => { return oeppetObjekt.MaeklarObjektId !== +$routeParams.id; }) .reverse(); $scope.kopiera.getShowStr = function (oeppetObjekt: fb.OeppnaMaeklarObjekt) { return oeppetObjekt.Visningstext + ' (' + oeppetObjekt.Objektnummer + ')'; }; $scope.kopiera.kopieraTyp = 'MaeklarObjekt'; $scope.kopiera.getKopieraId = function () { return ($scope.kopiera.objekt).MaeklarObjektId; } $scope.kopiera.showPopup = true; } function kopiera() { if ($scope.kopiera.objekt) { var objektIntressentIds = $scope.selectedItems.map(i => i.Intressent.ObjektIntressentId.value); $scope.kopiera.def = intressentService.kopiera(+$scope.kopiera.getKopieraId(), objektIntressentIds); $scope.kopiera.def.$promise.then(function () { $scope.kopiera.showPopup = false; }); $scope.kopiera.objekt = undefined; } else { $scope.kopiera.showPopup = false; } } function updateOrder(order: string, orderReversed: boolean) { $scope.order = order; $scope.orderReversed = orderReversed; } }]);