define(['quote/quote'], function (quote) { quote.controller('AcceptHouseholdMember', ['$scope', 'Helpers', '$http', function ($scope, Helpers, $http) { $scope.SetStepHeader('

Household member information

'); $scope.RiskAddress = $scope.Quote.RiskAddress; $scope.OrigPostalAddress = $scope.Quote.PostalAddress || ($scope.Quote.PostalAddress = {}); //create "Suburb" objects which don't exist on the serialized objects $scope.RiskAddress.Suburb = { SuburbName: $scope.RiskAddress.SuburbName || "", PostCode: $scope.RiskAddress.PostCode || "" }; $scope.OrigPostalAddress.Suburb = { SuburbName: $scope.OrigPostalAddress.SuburbName || "", PostCode: $scope.OrigPostalAddress.PostCode || "" }; //default to same as postal if postal is unset var same = true; if ($scope.Quote.PostalAddress && $scope.Quote.PostalAddress.Address1 && $scope.Quote.PostalAddress.Address1.length > 0) { same = false; } $scope.RiskAddress.PostalAddressSame = same; $scope.RiskAddressValid = true; $scope.PostalAddressValid = true; $scope.validateAddress = function (address, isResidential) { var ac; if (isResidential) { ac = $scope.acceptHousholdMemberRiskAddress.RiskAddress1; } else if (!$scope.RiskAddress.PostalAddressSame) { ac = $scope.acceptHousholdMemberPostalAddress.PostalAddress1; } var address1Valid = !address.Address1 || !!address.Address1.match(/\d/); if (ac) ac.$setValidity("number", address1Valid); if (!isResidential && !address1Valid) { $scope.PostalAddressValid = false; return; } // For postal, if address1 regex passes, only validate the entire address once the suburb is entered. if (!isResidential && address.Suburb) { if (!address.Suburb.SuburbSequence) { $scope.PostalAddressValid = true; return; } if (address.Suburb.SuburbSequence <= 0) { $scope.PostalAddressValid = true; return; } // Postal address Suburb exists in it's own separate object. Set this for entire address validation. address.SuburbSequence = address.Suburb.SuburbSequence; } return $http({ method: 'POST', url: '/Quote/AcceptHouseholdMember/ValidateEntireAddress', data: { address1: address.Address1, address2: address.Address2, address3: address.Address3, addressType: "", suburbSequence: address.SuburbSequence } }).success(function (data, status, headers, config) { if (isResidential) { $scope.RiskAddressValid = data; } else { $scope.PostalAddressValid = data; } }); } $scope.$watch('RiskAddressValid', function (v) { $scope.acceptHousholdMemberRiskAddress.RiskAddress1.$setValidity("addressValid", v); }); $scope.$watch('PostalAddressValid', function (v) { $scope.acceptHousholdMemberPostalAddress.PostalAddress1.$setValidity("addressValid", v || $scope.RiskAddress.PostalAddressSame); }); $scope.$watch("Quote.RiskAddress.Address1", function () { $scope.validateAddress($scope.Quote.RiskAddress, true); }); $scope.$watch("Quote.RiskAddress.Address2", function () { $scope.validateAddress($scope.Quote.RiskAddress, true); }); $scope.$watch("Quote.RiskAddress.Address3", function () { $scope.validateAddress($scope.Quote.RiskAddress, true); }); $scope.$watch("Quote.RiskAddress.Suburb", function () { $scope.validateAddress($scope.Quote.RiskAddress, true); }); $scope.$watch("Quote.PostalAddress.Address1", function () { $scope.validateAddress($scope.Quote.PostalAddress, false); }); $scope.$watch("Quote.PostalAddress.Address2", function () { $scope.validateAddress($scope.Quote.PostalAddress, false); }); $scope.$watch("Quote.PostalAddress.Address3", function () { $scope.validateAddress($scope.Quote.PostalAddress, false); }); $scope.$watch("Quote.PostalAddress.Suburb", function () { $scope.validateAddress($scope.Quote.PostalAddress, false); }); $scope.$watch("RiskAddress.PostalAddressSame", function (v) { if (v) { $scope.Quote.PostalAddress = $scope.Quote.RiskAddress; } else { $scope.Quote.PostalAddress = $scope.OrigPostalAddress; } $scope.PostalAddress = $scope.Quote.PostalAddress; }); $scope.$watch("$scope.RiskAddress.Suburb", function (suburb) { if (suburb) { $scope.RiskAddress.SuburbSequence = suburb.SuburbSequence; $scope.RiskAddress.SuburbName = suburb.SuburbName; $scope.RiskAddress.PostCode = suburb.PostCode; $scope.RiskAddress.AddressLattitude = suburb.Latitude; $scope.RiskAddress.AddressLongitude = suburb.Longitude; } }); $scope.$watch("$scope.PostalAddress.Suburb", function (suburb) { if ($scope.PostalAddress !== $scope.RiskAddress && suburb) { $scope.RiskAddress.SuburbSequence = suburb.SuburbSequence; $scope.RiskAddress.SuburbName = suburb.SuburbName; $scope.RiskAddress.PostCode = suburb.PostCode; $scope.RiskAddress.AddressLattitude = suburb.Latitude; $scope.RiskAddress.AddressLongitude = suburb.Longitude; } }); //for suburb autocomplete. TODO: replace with directive $scope.suburbAutocompleteFormatter = function suburbAutocompleteFormatter(value) { if (value && value.SuburbName) { return "" + value.SuburbName + ' ' + value.PostCode; } else { return ""; } } }]); quote.controller('HouseholdMember', ['$scope', 'Helpers', '$mdDialog', function ($scope, Helpers, $mdDialog) { $scope.Persons = $scope.Quote.Persons; var selectedPerson = $scope.Quote.Type == 'Amendment' && $scope.Quote.AmendmentSequenceNumber ? $scope.Persons.filter(function (d) { return d.PersonNumber == $scope.Quote.AmendmentSequenceNumber; })[0] : $scope.Quote.PolicyHolder; $scope.index = $scope.Persons.indexOf(selectedPerson); var initPersonLength = $scope.Persons.length; $scope.disableEmploymentStatus = false; $scope.removePerson = function removePerson(index) { $scope.Persons.splice(index, 1); if (index <= $scope.index) { $scope.index--; } validateSpouseOptions(); } $scope.addPerson = function addPerson() { $scope.index = $scope.Persons.length; $scope.disableEmploymentStatus = false; $scope.Persons.push({}); } $scope.editPerson = function editPerson(index) { $scope.index = index; $scope.disableEmploymentStatus = false; if ($scope.Quote.Type == "Lead" && $scope.Persons[0].IsDriver) { $scope.disableEmploymentStatus = true; } } $scope.displayName = function displayName(person) { if (person && (person.FirstName || person.Surname)) { var firstName = (person.FirstName) ? person.FirstName : ''; var surname = (person.Surname) ? person.Surname : ''; return firstName + ' ' + surname; } else { return 'Current member' } } $scope.personType = function personType(person) { if (person.IsPolicyHolder) { return "policyholder"; } else if (person.IsDriver) { return "regular driver"; } } $scope.mustAddSignificantOther = function () { var phms = $scope.Quote.PolicyHolder.MaritalStatus; var persons = $scope.Persons || []; var r = { spouse: phms == 'M' && !persons.filter(function (d) { return d.MaritalStatus == phms && d.RelationToPolicyHolder == "S"; }).length, cohabitee: phms == 'P' && !$scope.Persons.filter(function (d) { return d.MaritalStatus == phms && d.RelationToPolicyHolder == "W"; }).length }; return !!(r.spouse || r.cohabitee); } $scope.hasAddedSpouse = function () { return $scope.Persons && $scope.Persons.length && !!$scope.Persons.filter(function (d) { return d.MaritalStatus == "M" && d.RelationToPolicyHolder == "S"; }).length; } $scope.hasAddedCohabitee = function () { return $scope.Persons && $scope.Persons.length && !!$scope.Persons.filter(function (d) { return d.MaritalStatus == "P" && d.RelationToPolicyHolder == "W"; }).length; } $scope.$watch("Persons[index].Gender", function (gender) { if ($scope.Persons && $scope.index >= 0 && $scope.Persons[$scope.index]) { var relation = $scope.Persons[$scope.index].RelationToPolicyHolder; if (relation == 'OD' && gender == 'M' || relation == 'OS' && gender == 'F') { $scope.Persons[$scope.index].RelationToPolicyHolder = ""; } } }); $scope.$watch("Persons[index].MaritalStatus", function (maritalStatus) { if ($scope.Persons && $scope.index >= 0 && $scope.Persons[$scope.index]) { var person = $scope.Persons[$scope.index]; if (person.IsPolicyHolder) { person.RelationToPolicyHolder = null; } else { var relation = person.RelationToPolicyHolder; if (relation == 'S' && maritalStatus != 'M' || relation == 'W' && maritalStatus != 'P') { person.RelationToPolicyHolder = null; } else if (!relation) { var policyHolderStatus = $scope.Quote.PolicyHolder.MaritalStatus; if (maritalStatus == policyHolderStatus) { if (maritalStatus == "M") { person.RelationToPolicyHolder = "S"; } else if (maritalStatus == "P") { person.RelationToPolicyHolder = "W"; } } } } } }); function validateGenderAndAgeBasedOnIdNumber() { $scope.displayDateOfBirthWarning = false; var person = $scope.Persons[$scope.index]; var ageValid = true; var genderValid = true; if (person && person.IdNumber) { var age = person.Age; var gender = person.Gender; var idage = Helpers.getIdNumberAge(person.IdNumber); var idbirthdate = Helpers.getIdNumberBirthdate(person.IdNumber); var idgender = Helpers.getIdNumberGender(person.IdNumber); ageValid = !age || !idage || age == idage; genderValid = !gender || !idgender || gender == idgender; person.Age = idage; person.Gender = idgender; if (person.BirthDate && person.BirthDate.getTime() !== idbirthdate.getTime() && typeof $scope.householdMemberCurrent.IdNumber !== 'undefined' && $scope.householdMemberCurrent.IdNumber.$valid) { $scope.displayDateOfBirthWarning = true; } } var ageEdit = $scope.householdMemberCurrent.Age; var genderEdit = $scope.householdMemberCurrent.Gender; if ($scope.HouseholdMemberSection) { ageEdit = $scope.HouseholdMemberSection.Age; genderEdit = $scope.HouseholdMemberSection.Gender; } ageEdit && ageEdit.$setValidity('idnumber', ageValid); genderEdit && genderEdit.$setValidity('idnumber', genderValid); } var validateSpouseOptions = function () { if (!$scope.SignificantOthers) $scope.SignificantOthers = {}; var twoSpouses = $scope.Persons.filter(function (d) { return d.MaritalStatus == "M" && d.RelationToPolicyHolder == "S"; }).length > 1; if (typeof $scope.householdMemberCurrent.RelationToPolicyHolder !== 'undefined' && $scope.householdMemberCurrent.RelationToPolicyHolder !== null) $scope.householdMemberCurrent.RelationToPolicyHolder.$setValidity("twospouse", !twoSpouses); }; $scope.$watch("Persons[index].Age", validateGenderAndAgeBasedOnIdNumber); $scope.$watch("Persons[index].Gender", validateGenderAndAgeBasedOnIdNumber); $scope.$watch("Persons[index].IdNumber", validateGenderAndAgeBasedOnIdNumber); $scope.$watch("Persons[index].RelationToPolicyHolder", validateSpouseOptions); $scope.$watch("mustAddSignificantOther()", function (ma) { if (!$scope.SignificantOthers) $scope.SignificantOthers = {}; if (ma) { if ($scope.Quote.PolicyHolder.MaritalStatus == 'M') { $scope.SignificantOthers.spouse = true; $scope.SignificantOthers.cohabitee = false; } else if ($scope.Quote.PolicyHolder.MaritalStatus == 'P') { $scope.SignificantOthers.spouse = false; $scope.SignificantOthers.cohabitee = true; } } else { $scope.SignificantOthers.spouse = false; $scope.SignificantOthers.cohabitee = false; } //$scope.AcceptHouseholdMemberForm.$setValidity("mustAddSpouse", !ma); }); function checkIsPolicyholderMarried() { var invalid = false; var isPolicyHolder = $scope.Persons[$scope.index].IsPolicyHolder; var person = $scope.Persons[$scope.index]; var policyHolder = $scope.Quote.Personal; if (!isPolicyHolder && person.MaritalStatus === "M") { invalid = invalid || policyHolder.MaritalStatus !== "M" || person.RelationToPolicyHolder !== "S"; } $scope.SignificantOthers.PolicyholderNotMarried = invalid; } $scope.$watch('Persons[index].MaritalStatus', checkIsPolicyholderMarried); $scope.$watch('Persons[index].RelationToPolicyHolder', checkIsPolicyholderMarried); var anyNotfromAS400 = false; for (var a = 0; a < $scope.Persons.length; a++) { if (!$scope.Persons[a].FromAs400) { anyNotfromAS400 = true; break; } } if ($scope.Quote.AmendmentMode == 'Add' && $scope.Quote.AmendmentType == 'HouseholdMember' && !anyNotfromAS400) { $scope.addPerson(); } $scope.isIdnumberUnique = function () { var uniqueCount = 0; for (var x in $scope.Persons) { if($scope.Persons[$scope.index].IdNumber == $scope.Persons[x].IdNumber) { uniqueCount++; } } if (uniqueCount <= 1) { if ($scope.Persons[$scope.index].IdNumber && $scope.Persons[$scope.index].IdNumber != "") { if ($scope.Persons[$scope.index].Age == null || $scope.Persons[$scope.index].Age == "") { $scope.Persons[$scope.index].Age = Helpers.getIdNumberAge($scope.Persons[$scope.index].IdNumber); } if ($scope.Persons[$scope.index].Gender == null || $scope.Persons[$scope.index].Gender == "") { $scope.Persons[$scope.index].Gender = Helpers.getIdNumberGender($scope.Persons[$scope.index].IdNumber); } } } $scope.householdMemberCurrent.IdNumber.$setValidity("idNumberUnique", (uniqueCount <= 1)); } $scope.isDisabledWhenEdit = function () { return ($scope.Quote.AmendmentMode == "Edit" && $scope.index < initPersonLength) } $scope.isAddDisabled = function() { $scope.AcceptHouseholdMemberForm.$setValidity("AllGood", true); var formValid = $scope.AcceptHouseholdMemberForm.$valid; var requiresSpouse = $scope.mustAddSignificantOther(); if ((formValid && !requiresSpouse)) { $scope.AcceptHouseholdMemberForm.$setValidity("AllGood", true); return false; } else if ((formValid && requiresSpouse)) { $scope.AcceptHouseholdMemberForm.$setValidity("AllGood", false); return false; } else { $scope.AcceptHouseholdMemberForm.$setValidity("AllGood", formValid); return !formValid; } } if ($scope.Quote.Type == "Lead" && $scope.Persons[0].IsDriver) { $scope.disableEmploymentStatus = true; } $scope.RemoveDialog = function (ev) { return $mdDialog.confirm() .title('Are you sure?') .content('Are you sure you want to remove this household member?') .ok('Remove') .cancel('Cancel') .disableParentScroll(false) .targetEvent(ev); }; $scope.removePersonMd = function (ev, index) { var confirm = $scope.RemoveDialog(ev); $mdDialog.show(confirm).then(function () { $scope.removePerson(index); }); } $scope.showSignificantOthersMessage = function (isPolicyHolder) { if (isPolicyHolder && $scope.mustAddSignificantOther()) { var shouldHaveSpouse = false, shouldHaveCohabitee = false; if (typeof $scope.SignificantOthers.spouse !== 'undefined' && $scope.SignificantOthers.spouse !== null) shouldHaveSpouse = $scope.SignificantOthers.spouse; if (typeof $scope.SignificantOthers.cohabitee !== 'undefined' && $scope.SignificantOthers.cohabitee !== null) shouldHaveCohabitee = $scope.SignificantOthers.cohabitee; return shouldHaveSpouse || shouldHaveCohabitee; } return false; } }]); });