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;
}
}]);
});