angular.module('fasit') .controller('KundportalCtrl', [ '$q', '$scope', '$filter', 'maeklarObjektService', 'sideDrawerService', 'intressentService', 'personService', 'kundportalenService', 'globalTimerService', ( $q: ng.IQService, $scope: fb.IKundportalScope, $filter: ng.IFilterService, maeklarObjektService: fb.IMaeklarObjektService, sideDrawerService: fb.ISideDrawerService, intressentService: fb.IIntressentService, personService: fb.IPersonService, kundportalenService: fb.IKundportalenService, globalTimerService: fb.IGlobalTimerService ) => { var phoneNumber = $filter('phoneNumber'); // Sätta upp lokala varibler i scope:t let changedBefintligMejlAngivet: boolean = false; const aktivaSaeljare: number[] = []; // Lista av säljarna som redan har tillgång till Kundportalen const params: { maeklarObjekt: fb.MaeklarObjektDO, maeklarObjektId?: number, fraanStatusByte?: boolean } = sideDrawerService.getParams(); const maeklarObjekt: fb.MaeklarObjektDO = params.maeklarObjekt || maeklarObjektService.get(params.maeklarObjektId); const kundportalInstaellningar = kundportalenService.get( params.maeklarObjekt ? params.maeklarObjekt.MaeklarObjektId.value : params.maeklarObjektId); let parter: fb.List = intressentService.queryParter( params.maeklarObjekt ? params.maeklarObjekt.MaeklarObjektId.value : params.maeklarObjektId ); let befintligaSaeljarePromise = parter.$promise.then(function () { $scope.befintligaSaeljare = []; const personPromises: angular.IPromise[] = []; angular.forEach(parter, (part: fb.ObjIntressentPartDO, index: number) => { const person = personService.get(part.PersonId.value, false); person.$promise.then(() => { if (person.person && person.person.$resolved !== true) { person.person.$promise.then(() => { laeggTillSaeljare(part, person ? person.person : null); if (!kanAktiveraKundportalen(part, person ? person.person : null) && part.KundportalAktiverad && part.KundportalAktiverad.value) { part.KundportalAktiverad.setValue(false); } }); } else if (!person.person) { return; } else { laeggTillSaeljare(part, person ? person.person : null); if (!kanAktiveraKundportalen(part, person ? person.person : null) && part.KundportalAktiverad && part.KundportalAktiverad.value) { part.KundportalAktiverad.setValue(false); } } }); personPromises.push(person.$promise); }); return $q.all(personPromises); }); // Kör en watch på person.MejlAdress.Mejladress som finns i $scope.befintligaSaeljare // För att kunna visa info text för att uppdatera allFlyttaMedBevakningar fält på säljarna $scope.$watch(() => { return angular.isArray($scope.befintligaSaeljare) && $scope.befintligaSaeljare.filter( val => val.person.MejlAdress.Mejladress.dirty === true ).length > 0; }, (isUpdated: boolean) => { if (!isUpdated) { return; } const updatedPersons = $scope.befintligaSaeljare.filter(val => val.person.MejlAdress.Mejladress.dirty === true); if (updatedPersons.length > 0 && !$scope.changedBefintligMejl && !changedBefintligMejlAngivet) { $scope.changedBefintligMejl = true; changedBefintligMejlAngivet = true; $scope.allFlyttaMedBevakningar.setValue(true); } }); // Lysnnara på kundportalInstaellningar promis för att sätta upp de inställningarna kundportalInstaellningar.$promise.then(() => { // Sätta default värden vid behov: if (kundportalInstaellningar.length > 0 && // Alla inställningar är inaktiverat: (params.fraanStatusByte || kundportalInstaellningar.toArray().filter(value => !value.AerAktiverat || !value.AerAktiverat.value).length === kundportalInstaellningar.toArray().length)) { angular.forEach(kundportalInstaellningar, (instaellning: fb.KundportalInstaellningarLO) => { if (instaellning.AerDefault.value) { instaellning.AerAktiverat.value = true; } else { instaellning.AerAktiverat.value = false; } }); } }); // Sätta upp scope:t $scope.done = () => done(); $scope.resolvedDeps = { $resolved: false }; $scope.palett = { $resolving: false }; $scope.fraanStatusByte = params.fraanStatusByte; $scope.skickaEpost = skickaEpost; $scope.skickaSMS = skickaSMS; $scope.kundportalInstaellningar = kundportalInstaellningar; $scope.allFlyttaMedBevakningar = new fb.ChangeTrack(true); $scope.disableInstaellningar = disableInstaellningar; $scope.canStartaKundportalen = canStartaKundportalen; $scope.alertStartKundportalenFailed = false; $scope.finnsSaeljareUtanPersonnummer = false; $scope.radioClicked = radioClicked; // Vänta på alla promises som den här jordgubben behöver $q.all([ maeklarObjekt.$promise, parter.$promise, kundportalInstaellningar.$promise, befintligaSaeljarePromise]) .then(() =>{ $scope.resolvedDeps.$success = true; $scope.header = maeklarObjekt.Adress.AdressText.value; }) .catch(err => { console.log(err); $scope.resolvedDeps.$success = false; }) .finally(() => $scope.resolvedDeps.$resolved = true); //Functioner /** * Spara Kundportal inställningar, uppdatera aktiva säljare samt epost adresser * @returns {angular.IPromise[]} en Array av alla promises som sparar datan */ function spara(): angular.IPromise[] { const instaellningar = kundportalInstaellningar.toArray().map(instaellning => new fb.KundportalInstaellningarLO({ KundportalInstaellningId: instaellning.KundportalInstaellningId.value, AerAktiverat: (instaellning.AerAktiverat as any).value !== undefined ? (instaellning.AerAktiverat as any).value : instaellning.AerAktiverat })); $scope.befintligaSaeljare.forEach(val => { if (val.person.MejlAdress.Mejladress.dirty) { val.person.MejlAdress.FlyttaMedBevakningar.setValue($scope.allFlyttaMedBevakningar.value); } }); const globalTimerSavePromise = globalTimerService.globalSave(true); const kundportalenServicePromise = !disableInstaellningar() ? kundportalenService.save(maeklarObjekt.MaeklarObjektId.value, instaellningar).$promise : null; return [ globalTimerSavePromise, kundportalenServicePromise ]; } /** * Den här funktionen ska bindas till Klar knapp, * den sparar alla, stänger denna jordgubben och öppnar EpostUtskick jordgubben vid behov */ function done() { $scope.palett.$resolving = true; const promises = spara(); $q.all(promises) .then(() => { $scope.alertStartKundportalenFailed = false; if (params.fraanStatusByte) { oeppnaSkickaEpost(true); } else { sideDrawerService.clearDrawer(); const nyaMottagare = getNyaMottagare(); if (nyaMottagare && nyaMottagare.length > 0 && !aerBostadsbeskrivningenAktiv()) { oeppnaSkickaEpost(false); } else if (nyaMottagare && nyaMottagare.length > 0 && aerBostadsbeskrivningenAktiv()) { oeppnaSkickaEpostBostadsbeskrivning(true); } else if (aerBostadsbeskrivningenAktiv()) { oeppnaSkickaEpostBostadsbeskrivning(); } } }) .catch(err => { console.log(err); $scope.alertStartKundportalenFailed = true; }) .finally(() => $scope.palett.$resolving = false); } /** * Den funktionen ska bindas till Skicka epost knapp, * Den spara allt, hämtar lista av nya mottagare och öppnar Epost utskick jordgubbe */ function skickaEpost() { $scope.palett.$resolving = true; const promises = spara(); $q.all(promises) .then(() => { $scope.alertStartKundportalenFailed = false; //sideDrawerService.clearDrawer(); oeppnaSkickaEpost(false, true, true, fb.FasITDomain.TextMallNamn.KUNDPORTALEN_INLOGGNING); }) .catch(err => { console.log(err); $scope.alertStartKundportalenFailed = true; }) .finally(() => $scope.palett.$resolving = false); } /** * Den funktionen ska bindas till Skicka SMS knapp, * Den spara allt, hämtar lista av nya mottagare och öppnar SMS utskick jordgubbe */ function skickaSMS() { $scope.palett.$resolving = true; const promises = spara(); $q.all(promises) .then(() => { $scope.alertStartKundportalenFailed = false; //sideDrawerService.clearDrawer(); oeppnaSkickaSMS(true); }) .catch(err => { console.log(err); $scope.alertStartKundportalenFailed = true; }) .finally(() => $scope.palett.$resolving = false); } /** * Öppnar epost utskick jordgubben * @param medCallback {boolean} För att köra - eller inte - den callback funktionem som finns i SideDrawerService när man stänger epost utskick jordgubben * @param inloggadAnvaendareSomAvsaendare {boolean} för att sätta den inloggade användaren som avsändare istället av den ansvarig mäklare * @param tillAllaAktivaSaeljare {boolean} True: för att sätta alla säljarna som har Kundportalen aktiverat som mottagarem, False för att sätta bara de nya */ function oeppnaSkickaEpost(medCallback: boolean = false, inloggadAnvaendareSomAvsaendare: boolean = false, tillAllaAktivaSaeljare: boolean = false, mejlMall: string = fb.FasITDomain.TextMallNamn.KUNDPORTALEN_AKTIVERAD) { let callback: any = null; if (medCallback) { callback = sideDrawerService.getCallback(); } const tmp = function () { if (callback && medCallback) { sideDrawerService.clearDrawer(); callback(); } else { sideDrawerService.clearDrawer(); } }; sideDrawerService.setSideDrawer('EpostUtskick', { textMallNamn: mejlMall, recipients: tillAllaAktivaSaeljare ? getAllaAktivaSaeljare() : getNyaMottagare(), sender: inloggadAnvaendareSomAvsaendare? null : new fb.PersonAvsaendare({ PersonId: maeklarObjekt.AnsvarigMaeklareId.value, PersonNamn: maeklarObjekt.AnsvarigMaeklareNamn.value }), useCallbackOnAbort: medCallback, maeklarObjektId: maeklarObjekt.MaeklarObjektId.value }, undefined, tmp.bind(this)); } /** * Öppnar SMS utskick jordgubben * @param tillAllaAktivaSaeljare {boolean} True: för att sätta alla säljarna som har Kundportalen aktiverat som mottagarem, False för att sätta bara de nya */ function oeppnaSkickaSMS(tillAllaAktivaSaeljare: boolean = false) { sideDrawerService.setSideDrawer('SMSUtskick', { textMallNamn: fb.FasITDomain.TextMallNamn.KUNDPORTALEN_SMS, recipients: tillAllaAktivaSaeljare? getAllaAktivaSaeljare() : getNyaMottagare(), maeklarObjektId: maeklarObjekt.MaeklarObjektId.value }); } ///** // * Öppnar epost utskick bostadsbeskrivningsjordgubben som sista steg // * @param kundportalAktiveradMejlFoerst {boolean } True: Ifall Kundportalaktiverad-jordgubben ska visas först //*/ function oeppnaSkickaEpostBostadsbeskrivning(kundportalAktiveradMejlFoerst: boolean = false) { sideDrawerService.setSideDrawer('EpostUtskick', { textMallNamn: fb.FasITDomain.TextMallNamn.GRANSKA_BOSTADSBESKRIVNING, recipients: getAllaAktivaSaeljare(), sender: null, maeklarObjektId: maeklarObjekt.MaeklarObjektId.value }, undefined); if (kundportalAktiveradMejlFoerst) { oeppnaSkickaEpost(false); } } /** * En funktion som kontrollerar om Kundportal inställningar är redigerbara eller inte */ function disableInstaellningar(): boolean { if ( maeklarObjekt.UppdragStatus.value === fb.FasITDomain.UppdragStatus.SAALD || maeklarObjekt.UppdragStatus.value === fb.FasITDomain.UppdragStatus.AATERTAGEN || maeklarObjekt.UppdragStatus.value === fb.FasITDomain.UppdragStatus.INGET_UPPDRAG ) { return true; } else { return false; } } /** * Validerar om man kan starta kundportalen eller inte */ function canStartaKundportalen(): boolean { if (!$scope.befintligaSaeljare || $scope.befintligaSaeljare.length < 1) { return false; } return true; } /** * Hämtar de säljarna som har aktiverat i den här jorgubben och filtrerar bort som redan har tillgång till Kundportalen, * Den mappar resultatet till en lista av fb.PersonMottagare * @returns {fb.PersonMottagare[]} en lista av mottagare, kompatiblet med Epost och SMS utskick jordgubbe */ function getNyaMottagare(): fb.PersonMottagare[] { return $scope.befintligaSaeljare .filter(saeljare => saeljare.part.KundportalAktiverad.value && aktivaSaeljare.indexOf(saeljare.part.PersonId.value) < 0) .map(saeljare => new fb.PersonMottagare({ TelefonnummerMobil: saeljare.part.TelefonnummerMobil !== null ? phoneNumber(saeljare.part.TelefonnummerMobil.value) : null, PersonId: saeljare.part.PersonId.value, PersonNamn: saeljare.part.Personnamn.value, MejlAdress: saeljare.person.MejlAdress.Mejladress.value })); } /** * Hämtar alla säljarna som har tillgång till Kondportalen, * Den mappar resultatet till en lista av fb.PersonMottagare * @returns {fb.PersonMottagare[]} en lista av mottagare, kompatiblet med Epost och SMS utskick jordgubbe */ function getAllaAktivaSaeljare(): fb.PersonMottagare[] { return $scope.befintligaSaeljare .filter(saeljare => saeljare.part.KundportalAktiverad.value) .map(saeljare => new fb.PersonMottagare({ TelefonnummerMobil: saeljare.part.TelefonnummerMobil !== null ? phoneNumber(saeljare.part.TelefonnummerMobil.value) : null, PersonId: saeljare.part.PersonId.value, PersonNamn: saeljare.part.Personnamn.value, MejlAdress: saeljare.person.MejlAdress.Mejladress.value })); } /** * Lägg till en ny säljare till befintligaSaeljare lista * @param part {fb.ObjIntressentPartDO} * @param person {fb.Models_IPersonDO} */ function laeggTillSaeljare(part: fb.ObjIntressentPartDO, person: fb.Models_IPersonDO) { //(part: fb.ObjIntressentPartDO) => if ((part.ObjIntressentRoll.value === fb.FasITDomain.ObjIntressentRoll.SAELJARE || part.ObjIntressentRoll.value === fb.FasITDomain.ObjIntressentRoll.SAELJARENS_KONTAKTPERSON) && !person.isPersonJuridisk()) { $scope.befintligaSaeljare.push({ 'part': part, 'person': person, aktiv: kanAktiveraKundportalen(part, person) ? true : false }); // Kontrollera om det finns personer utan personnummer eller av annan nationalitet if (person && ( (!person.Personnummer || !person.Personnummer.value) || (person.NationalitetId && person.NationalitetId.value && person.NationalitetId.value !== 204) )) { $scope.finnsSaeljareUtanPersonnummer = true; } if (params && params.fraanStatusByte) { part.KundportalAktiverad.setValue(true); } else if (part.KundportalAktiverad.value === true && (person && person.Personnummer && person.Personnummer.value)) { // Måste ha svenskt personnummer aktivaSaeljare.push(part.PersonId.value); } } } /** * Kollar om det går att aktivera Kundportalen på den här säljaren * @param part {fb.ObjIntressentPartDO} * @param person {fb.Models_IPersonDO} */ function kanAktiveraKundportalen(part: fb.ObjIntressentPartDO, person: fb.Models_IPersonDO) { return (part.ObjIntressentRoll.value === fb.FasITDomain.ObjIntressentRoll.SAELJARE || part.ObjIntressentRoll.value === fb.FasITDomain.ObjIntressentRoll.SAELJARENS_KONTAKTPERSON) && !person.isPersonJuridisk() && person.Personnummer && person.Personnummer.value && (!person.NationalitetId || !person.NationalitetId.value || person.NationalitetId.value === 204) // Säljaren har ett svenskt personnummer } /** * En funktion som returnerar namnet på installningsgruppen om den finns * @param rotId {KundportalInstaellningId: number} * @returns {string} groupnamn */ $scope.getBarnInstaellningsGrupp = function (rotId: number): string { if ($scope.kundportalInstaellningar.toArray().filter(instaelnning => instaelnning.RotinstaellningId.value === rotId).length === 0) { return ""; } return $scope.kundportalInstaellningar.toArray().filter(instaelnning => instaelnning.RotinstaellningId.value === rotId)[0].InstaellninggruppNamn.value; } /** * En funktion som returnerar en lista med barninställningar * @param rotId {KundportalInstaellningId: number} * @returns {fb.KundportalInstaellningarLO[]} en lista av barn-installningar */ $scope.getBarnInstaellningar = function (rotId: number): fb.KundportalInstaellningarLO[] { return $scope.kundportalInstaellningar.toArray().filter(instaelnning => instaelnning.RotinstaellningId.value === rotId); } /** * En funktion som kontrollerar om en inställning har barn-inställningar * @param instaellningId {KundportalInstaellningId: number} * @returns bool */ $scope.harBarnInstaellningar = function (instaellningId: number): boolean { if ($scope.kundportalInstaellningar.toArray().filter(instaelnning => instaelnning.RotinstaellningId.value === instaellningId).length > 0) { return true; } return false; } function aerBostadsbeskrivningenAktiv(): boolean { if ($scope.kundportalInstaellningar.toArray().filter(inst => inst.Instaellningsnamn.value === 'Bostadsbeskrivning' && inst.AerAktiverat.value === true).length > 0) { return true; } return false; } function radioClicked(intaellning: fb.Models_KundportalInstaellningarLOGen): void { if ($scope.kundportalInstaellningar.toArray().filter(inst => inst.InstaellninggruppId.value === intaellning.InstaellninggruppId.value && inst.KundportalInstaellningId.value === intaellning.KundportalInstaellningId.value && inst.AerAktiverat.value === true ).length === 0) { $scope.kundportalInstaellningar .toArray() .filter( inst => inst.InstaellninggruppId.value === intaellning.InstaellninggruppId.value && inst.KundportalInstaellningId.value === intaellning.KundportalInstaellningId.value ).forEach(inst => inst.AerAktiverat.setValue(true)); } $scope.kundportalInstaellningar .toArray() .filter( inst => inst.InstaellninggruppId.value === intaellning.InstaellninggruppId.value && inst.KundportalInstaellningId.value !== intaellning.KundportalInstaellningId.value ).forEach(inst => inst.AerAktiverat.setValue(false)); } } ]);