diff --git a/README.md b/README.md index 9da5176fb2..f323364d1d 100644 --- a/README.md +++ b/README.md @@ -176,3 +176,4 @@ https://docs.google.com/document/d/1oXQ2mNojyDFkY_x4RBRPaqS-xhpnDE9coQnbmI3Pobw/ Please read the <a href="https://github.com/openMF/community-app/blob/develop/Contributing.md" >contribution guidelines</a> Note: This application will hit the demo server by default. + diff --git a/app/global-translations/locale-en.json b/app/global-translations/locale-en.json index 5570d54651..04f87404f1 100644 --- a/app/global-translations/locale-en.json +++ b/app/global-translations/locale-en.json @@ -79,6 +79,7 @@ "label.heading.recurringaccoverview": "Recurring Deposits Overview", "label.heading.members": "Members", "label.heading.confirm": "Confirm", + "are.you.sure": "Are you sure you want to ", "label.confirm.group.transfer": "Confirm Group Transfer", "label.heading.attendance": "Attendance", "label.heading.comments": "Comments", @@ -104,6 +105,20 @@ "label.heading.user": "User", "label.heading.loan": "Loan", "label.input.paidloans": "Paid Loans", + "label.input.othernames": "Other Names", + "label.input.maidenname": "Maiden/Married Name", + "label.input.groupno": "Group Number", + "label.input.groupmember": "Group Member", + "label.input.statusingroup": "Status In Group", + "label.input.retirementreason": "Retirement Reason", + "label.input.civilstatus": "Civil Status", + "label.input.education": "Education", + "label.input.ethinicity": "Ethinicity", + "label.input.nationality": "Nationality", + "label.input.languages": "Languages", + "label.input.economicsector": "Economic Sector", + "label.input.economicactivity": "Economic Activity", + "label.input.familyreference": "Family Reference", "label.heading.principal": "Principal", "label.heading.amount": "Amount", "label.heading.date": "Date", @@ -209,6 +224,7 @@ "label.heading.createdby": "Created By", "label.heading.campaign": "Campaign", "label.heading.isactive": "Status", + "label.heading.noactiveloans": "No Active Loans found for this client", "#Menu Links": "..", "label.menu.selectloanofficer": "Select Staff", "label.menu.selectone": "Select One", @@ -276,6 +292,9 @@ "label.input.closuredate": "Closure date", "label.input.closurereason": "Closure reason", "label.input.description": "Description", + "label.input.observations": "Observations", + "label.input.document.purpose": "Document Purpose", + "label.heading.contact.information": "Contact Information", "label.input.repeat": "Repeat", "label.input.comments": "Comments", "label.input.closurereasons": "Closure reasons", @@ -393,6 +412,26 @@ "label.button.postdividends": "Post Dividends", "label.button.proceed": "Proceed", "label.button.addAddress": "Add Address", + "label.button.hardpolicychecklist": "Hard Policy Checklist", + "label.heading.hardpolicychecklist": "Hard Policy Checklist", + "label.heading.clientshardpolicychecklist": "Clients Hard Policy Checklist", + "label.button.createhardpolicychecklist": "Create Checklist", + "label.button.edithardpolicychecklist": "Edit Checklist", + "label.heading.newclientcategorization": "New Client Categorization", + "label.heading.recurringcustomercategorization": "Recurring Customer Categorization", + "label.heading.mandatoryphotograph": "Mandatory Photographs", + "label.heading.clientage": "Client Age", + "label.heading.noOfMembersAccordingToPolicy": "No. Of Members According To Policy", + "label.heading.minAndMaxAmount": "Minimum and Maximum Amount", + "label.heading.disparityOfValues": "Disparity of Values", + "label.heading.percentageOfMembersStartingBusiness": "% Of Members Starting Business", + "label.heading.percentageOfMembersWithTheirOwnHome": "% Of Members with their own home", + "label.heading.chairmanOfTheBCBoardOfDirectors": "Chairman of The BC Board Of Directors", + "label.heading.overallCondition": "Overall Condition", + "label.heading.categoriesOfClientToAccept": "Categories of Clients to Accept", + "label.heading.requestedAmount": "Requested Amount", + "label.heading.addEndorsement": "Add Endorsement", + "label.heading.paymentsOutsideCurrentTerm": "Payments Outside Current Term", "#Misc Labels": "..", "label.uniquelyidentifiedwithid": "Uniquely identified with ID", "label.belongsto": "Belongs To", @@ -732,6 +771,7 @@ "label.heading.clientclosed": "Client Closed", "label.heading.clientrejected": "Client Rejected", "label.heading.withdrawn": "Client Withdrawn", + "label.heading.creditrestructure": "Credit Restructuring", "#Anchors": "..", "label.anchor.clients": "Clients", "label.anchor.createclient": "Create Client", @@ -756,7 +796,8 @@ "label.input.selectexcelfile": "Select Excel file", "label.input.documenttype": "Document Type", "label.input.uniqueidentification": "Unique ID Number", - "label.input.mobilenumber": "Mobile number", + "label.input.mobilenumber": "Cell Phone", + "label.input.homeNumber": "Home Phone", "label.input.client.activationdate": "Activation date", "label.input.client.creationdate": "Creation date", "label.input.rejectiondate": "Rejection date", @@ -2345,6 +2386,9 @@ "savingsAccountStatusType.invalid": "Invalid status", "savingsAccountStatusType.submitted.and.pending.approval": "Submitted and pending approval", "savingsAccountStatusType.approved": "Approved", + "restructure.status.approved": "Approved", + "restructure.status.rejected": "Rejected", + "restructure.status.pending": "Pending", "savingsAccountStatusType.active": "Active", "savingsAccountStatusType.withdrawn.by.applicant": "Withdrawn by applicant", "savingsAccountStatusType.rejected": "Rejected", @@ -3872,6 +3916,7 @@ "label.input.multidisburseloan": "Enable Multiple Disbursals", "label.input.maxtranchecount": "Maximum Tranche count", "label.input.outstandingloanbalance": "Maximum allowed outstanding balance", + "label.input.outstandingloanbalance": "Maximum allowed outstanding balance", "validation.msg.loanproduct.interestType.not.equal.to.specified.number": "Flat interest type is not allowed for multi disburse loan ", "validation.msg.loanproduct.outstandingLoanBalance.not.zero.or.greater": "Max outstanding balance must be a positive Amount", "validation.msg.loanproduct.maxTrancheCount.cannot.be.blank": "Tranche count must be provided", @@ -4609,5 +4654,53 @@ "label.heading.loanTotalRepayment": "Paid", "label.heading.loanTotalOverdue": "Overdue", "label.heading.groupNumberOfClients": "Customers", + "label.heading.portfolioHeader": "Portfolio: ", + "label.heading.agencyName": "Agency", + "label.heading.portfolioplanning": "Portfolio Planning", + "label.heading.planningDate": "Date", + "label.heading.planningDay": "Day", + "label.heading.meetingStartTime": "Hour", + "label.heading.portfolioCenter": "Center", + "label.heading.centerGroupId": "Group No.", + "label.heading.centerGroupName": "Group Name", + "label.button.searchPlanning": "Search planning", + "label.input.client.area": "Area", + "label.input.client.publicservice": "Type of public services", + "label.input.client.municipal": "Municipality", + "label.input.client.housingtype": "Housing Type", + "label.input.client.department": "Department", + "label.input.residenceYears": "Years of living in the current residence", + "label.input.communityYears": "Years of living in the Community", + "label.input.village": "Village", + "label.input.referencedata": "Reference Housing Data", + "label.input.street": "Street", + "label.input.avenue": "Avenue", + "label.input.houseNumber": "House Number", + "label.input.colony": "Colony", + "label.input.sector": "Sector", + "label.input.batch": "Batch", + "label.input.square": "Square", + "label.input.zone": "Zone", + "label.input.lightDeviceNumber": "Light Device Number", + "error.msg.loan.existing.active.loan.product": "This loan could not be disbursed as this client or group already has an active loan for the product `{{params[0].value}}`.", + "label.button.futurepayment": "Future Payment", + "label.heading.loan.futurepayments": "Loan Future Payments", + "label.anchor.futurepayment": "Future Payments", + "label.input.partialPayment": "Partial", + "label.input.fullPayment": "Full", + "label.button.process": "Process", + "label.input.bank.agreements": "Bank agreements", + "label.anchor.futurepayment.details": "Details of payment simulation", + "label.heading.futurepayment.code": "Payment code", + "label.heading.futurepayment.principal": "Principal", + "label.heading.futurepayment.interest": "Interest", + "label.heading.futurepayment.lateinterest": "Late interest", + "label.heading.futurepayment.totalamount": "Total", + "label.heading.futurepayment.availableguarantee": "Available guarantee", + "label.heading.futurepayment.bank": "Bank", + "label.heading.futurepayment.agreement": "Agreement", + "label.heading.prequalification.validation.result": "Group Hard Policies Validation Result", + "label.heading.hard.policy.status": "Hard Policy", + "label.input.streetNumber": "Street No.", "----End---": "--End of file--- " } diff --git a/app/global-translations/locale-es.json b/app/global-translations/locale-es.json index 323be3eaca..c533e4dee7 100644 --- a/app/global-translations/locale-es.json +++ b/app/global-translations/locale-es.json @@ -220,6 +220,7 @@ "label.heading.createdby": "Creado por", "label.heading.campaign": "Campaña", "label.heading.isactive": "Estado", + "label.heading.noactiveloans": "No se encontraron préstamos activos para este cliente", "label.menu.selectloanofficer": "Seleccione personal", "label.menu.selectone": "Seleccione uno", "label.menu.constitution": "Seleccione Constitución", @@ -240,8 +241,8 @@ "label.anchor.importoffices": "Oficinas", "label.anchor.editpermissions": "Editar permisos", "label.input.name": "Nombre", - "label.input.firstname": "Nombre", - "label.input.lastname": "Apellido(s)", + "label.input.firstname": "1er Nombre", + "label.input.lastname": "2do Nombre", "label.input.middlename": "2.º nombre:", "label.input.fathername": "Nombre de padre", "label.input.qualification": "Calificación", @@ -270,6 +271,7 @@ "label.input.closuredate": "Fecha de cierre", "label.input.closurereason": "Motivo de cierre", "label.input.description": "Descripción", + "label.input.observations": "Observacaiones", "label.input.repeat": "Repetir", "label.input.comments": "Comentarios", "label.input.closurereasons": "Motivos de cierre", @@ -375,6 +377,8 @@ "label.button.postdividends": "Post Dividendos", "label.button.proceed": "Continuar", "label.button.addAddress": "Agregar dirección", + "label.button.hardpolicychecklist": "Check list de políticas duras", + "label.heading.hardpolicychecklist": "Check list de políticas duras", "label.uniquelyidentifiedwithid": "Exclusivamente identificado con Id", "label.belongsto": "Pertenece a", "label.memberof": "Miembro de", @@ -565,6 +569,7 @@ "label.heading.primaryemail": "Correo electrónico principal", "label.heading.categoryname": "Nombre de la categoría", "label.heading.contract": "Contrato", + "label.heading.creditrestructure": "Reestructuras de Créditos", "label.menu.office": "Oficina", "label.anchor.startpage": "Página de inicio", "label.anchor.homepage": "Página principal", @@ -1452,6 +1457,7 @@ "label.input.mobile": "Móvil", "label.input.residence": "Residencia", "label.input.purpose": "Propósito", + "label.input.document.purpose": "Finalidad del documento", "label.input.syncrepaymentswithmeeting": "Sincronizar reembolsos con la reunión", "label.input.syncdisbursementdatewithmeeting": "Sincronizar fecha de desembolso con la reunión", "label.input.loanterm": "Plazo del préstamo", @@ -1980,6 +1986,21 @@ "label.input.dividendperiodenddate": "Dividendo Fecha De Inicio Del Período", "label.input.dividendamount": "Cantidad de dividendo", "label.input.todaysprice": "Hoy Precio", + "label.input.familyreference": "Refencia Familiar", + "label.input.loancycle": "Ciclo de Préstamo", + "label.input.othernames": "otros nombres", + "label.input.maidenname": "Apellido de casada", + "label.input.groupno": "Grupo No.", + "label.input.groupmember": "Miembro de Grupo", + "label.input.statusingroup": "Estado Miembro de Grupo", + "label.input.retirementreason": "Razón de Retiro", + "label.input.civilstatus": "Estado Civil", + "label.input.education": "Educación", + "label.input.ethinicity": "Etnicidad", + "label.input.nationality": "Nacionalidad", + "label.input.languages": "Idioma(s)", + "label.input.economicsector": "Sector Economico", + "label.input.economicactivity": "Actividad Economica", "label.button.undo": "Deshacer", "label.button.modifyapplication": "Modificar solicitud", "label.button.withdrawnbyclient": "Retirado por el cliente", @@ -2162,6 +2183,10 @@ "savingsAccountStatusType.invalid": "Estado no válido", "savingsAccountStatusType.submitted.and.pending.approval": "Presentado y pendiente de aprobación", "savingsAccountStatusType.approved": "Aprobado", + "restructure.status.approved": "Aprobado", + "restructure.status.rejected": "Rechazado", + "restructure.status.pending": "Pendiente", + "are.you.sure": "Estás seguro que quieres ", "savingsAccountStatusType.active": "Activo", "savingsAccountStatusType.withdrawn.by.applicant": "Retirado por solicitante", "savingsAccountStatusType.rejected": "Rechazado", @@ -2640,7 +2665,7 @@ "Customer Identifier": "Identificador de cliente", "LoanCollateral": "Garantía del préstamo", "LoanPurpose": "Propósito del préstamo", - "Gender": "Sexo", + "Gender": "Género", "YesNo": "Sí o no", "GuarantorRelationship": "Relación de garante", "AssetAccountTags": "Etiquetas de activos de cuenta", @@ -4292,5 +4317,25 @@ "label.heading.loanTotalRepayment": "A Cobrar", "label.heading.loanTotalOverdue": "Mora", "label.heading.groupNumberOfClients": "Clientes", + "label.heading.prequalification.validation.result": "Resultado de validación de Politicas Duras Grupal", + "label.heading.hard.policy.status": "Politica Dura", + "label.input.residenceYears": "Años de residir vivienda actual", + "label.input.communityYears": "Años de vivir en la Comunidad", + "label.input.client.area": "Vive en área", + "label.input.client.housingtype": "Tipo de vivienda", + "label.input.client.publicservice": "Tipo de servicios públicos", + "label.input.client.department": "Departamento", + "label.input.client.municipal": "Municipio", + "label.input.village": "Aldea o Cantón", + "label.input.referencedata": "Datos de referencia para localizar la vivienda", + "label.input.avenue": "Avenida", + "label.input.streetNumber": "No. De casa", + "label.input.colony": "Colonia", + "label.input.sector": "Sector", + "label.input.batch": "Lote", + "label.input.square": "Manzana", + "label.input.zone": "Zona", + "label.input.lightDeviceNumber": "No. Contador Luz", + "label.heading.contact.information": "Datos de Contacto", "----End---": "---Fin del archivo---" } diff --git a/app/scripts/controllers/client/ClientDocumentController.js b/app/scripts/controllers/client/ClientDocumentController.js index fa7b792aa1..3aeb9bf9a3 100644 --- a/app/scripts/controllers/client/ClientDocumentController.js +++ b/app/scripts/controllers/client/ClientDocumentController.js @@ -1,15 +1,19 @@ (function (module) { mifosX.controllers = _.extend(module, { - ClientDocumentController: function (scope, location, resourceFactory, http, routeParams, API_VERSION, Upload, $rootScope) { + ClientDocumentController: function (scope, location, resourceFactory, http, routeParams,dateFilter, API_VERSION, Upload, $rootScope) { scope.clientId = routeParams.clientId; scope.onFileSelect = function (files) { scope.formData.file = files[0]; }; scope.submit = function () { + let dateCreated = dateFilter(scope.formData.dateCreated, scope.df); + Upload.upload({ url: $rootScope.hostUrl + API_VERSION + '/clients/' + scope.clientId + '/documents', - data: { name : scope.formData.name, description : scope.formData.description, file: scope.formData.file}, + data: { name : scope.formData.name, description : scope.formData.description, file: scope.formData.file, + documentType: scope.formData.documentType,documentPurpose: scope.formData.documentPurpose, + dateCreated: dateCreated, locale : scope.optlang.code, dateFormat : scope.df}, }).then(function (data) { // to fix IE not refreshing the model if (!scope.$$phase) { @@ -19,12 +23,19 @@ }); }; + resourceFactory.codeValueNameResource.getAllCodeValues({codeName: "Document Type"}, function (data) { + scope.documentTypes = data; + }); + + resourceFactory.codeValueNameResource.getAllCodeValues({codeName: "Document Purpose"}, function (data) { + scope.documentPurposes = data; + }); resourceFactory.codeValueResource.getAllCodeValues({codeId: 34}, function (data) { - scope.documenttypes = data; + scope.allowedDocumentTypes = data; }); } }); - mifosX.ng.application.controller('ClientDocumentController', ['$scope', '$location', 'ResourceFactory', '$http', '$routeParams', 'API_VERSION', 'Upload', '$rootScope', mifosX.controllers.ClientDocumentController]).run(function ($log) { + mifosX.ng.application.controller('ClientDocumentController', ['$scope', '$location', 'ResourceFactory', '$http', '$routeParams','dateFilter', 'API_VERSION', 'Upload', '$rootScope', mifosX.controllers.ClientDocumentController]).run(function ($log) { $log.info("ClientDocumentController initialized"); }); }(mifosX.controllers || {})); diff --git a/app/scripts/controllers/client/CreateClientController.js b/app/scripts/controllers/client/CreateClientController.js index b44b01da57..cb9981fae1 100755 --- a/app/scripts/controllers/client/CreateClientController.js +++ b/app/scripts/controllers/client/CreateClientController.js @@ -28,6 +28,8 @@ scope.formData.address=[]; //familymembers scope.formData.familyMembers=[]; + scope.formData.residenceYears = 0; + scope.formData.communityYears = 0; scope.familyArray=[]; scope.datatables = []; scope.noOfTabs = 1; @@ -55,6 +57,22 @@ scope.clientNonPersonConstitutionOptions = data.clientNonPersonConstitutionOptions; scope.clientNonPersonMainBusinessLineOptions = data.clientNonPersonMainBusinessLineOptions; scope.clientLegalFormOptions = data.clientLegalFormOptions; + scope.clientAreaOptions = data.clientAreaOptions; + scope.publicServiceOptions = data.publicServiceOptions; + scope.housingTypeOptions = data.housingTypeOptions; + scope.departamentoOptions = data.departamentoOptions; + scope.municipioOptions = data.municipioOptions; + scope.economicSectorOptions = data.economicSectorData; + scope.economicActivities = data.economicActivityData; + scope.formData.publicServices = []; + scope.publicServiceChecks = {}; + for (var i = 0; i < scope.publicServiceOptions.length; i++) { + scope.publicServiceChecks[scope.publicServiceOptions[i].id] = false; + scope.formData.publicServices.push({ + id: scope.publicServiceOptions[i].id, + checked: false + }); + } scope.datatables = data.datatables; if (!_.isUndefined(scope.datatables) && scope.datatables.length > 0) { scope.noOfTabs = scope.datatables.length + 1; @@ -123,17 +141,21 @@ } - - scope.relationshipIdOptions=data.familyMemberOptions.relationshipIdOptions; scope.genderIdOptions=data.familyMemberOptions.genderIdOptions; scope.maritalStatusIdOptions=data.familyMemberOptions.maritalStatusIdOptions; scope.professionIdOptions=data.familyMemberOptions.professionIdOptions; - - - }); + scope.checkPublicService = function(serviceId){ + for (var i = 0; i < scope.formData.publicServices.length; i++) { + if(serviceId == scope.formData.publicServices[i].id){ + scope.formData.publicServices[i].checked = scope.publicServiceChecks[serviceId]; + break; + } + } + } + scope.updateColumnHeaders = function(columnHeaderData) { var colName = columnHeaderData[0].columnName; if (colName == 'id') { @@ -198,6 +220,13 @@ }); }; + scope.updateActivities = function () { + scope.formData.economicActivity = null; + scope.economicActivityOptions = scope.economicActivities.filter(function (economicActivity) { + return economicActivity.sectorId == scope.formData.economicSector; + }); + }; + scope.setChoice = function () { if (this.formData.active) { scope.choice = 1; diff --git a/app/scripts/controllers/client/EditClientController.js b/app/scripts/controllers/client/EditClientController.js index ef7629eb53..3febaf2941 100755 --- a/app/scripts/controllers/client/EditClientController.js +++ b/app/scripts/controllers/client/EditClientController.js @@ -41,6 +41,90 @@ remarks: data.clientNonPersonDetails.remarks } }; + scope.clientAreaOptions = data.clientAreaOptions; + scope.publicServiceOptions = data.publicServiceOptions; + scope.housingTypeOptions = data.housingTypeOptions; + scope.departamentoOptions = data.departamentoOptions; + scope.municipioOptions = data.municipioOptions; + scope.formData.publicServices = []; + scope.publicServiceChecks = {}; + scope.publicServiceTypes = []; + scope.economicSectorOptions = data.economicSectorData; + scope.economicActivities = data.economicActivityData; + + var detailData = data.detailData; + if(detailData){ + scope.formData = {...scope.formData, ...detailData}; + if (detailData.economicSector) { + scope.formData.economicSector = Number(detailData.economicSector); + scope.updateActivities(); + scope.formData.economicActivity = Number(detailData.economicActivity); + } + } + + + + + + var contactInformation = data.clientContactInformation; + if(contactInformation){ + scope.formData.residenceYears = contactInformation.yearsOfResidence; + scope.formData.communityYears = contactInformation.communityYears; + scope.formData.village = contactInformation.village; + scope.formData.homeNumber = contactInformation.homePhone; + scope.formData.lightDeviceNumber = contactInformation.lightMeterNumber; + scope.formData.zone = contactInformation.zone; + scope.formData.square = contactInformation.square; + scope.formData.colony = contactInformation.colony; + scope.formData.streetNumber = contactInformation.streetNumber; + scope.formData.avenue = contactInformation.avenue; + scope.formData.street = contactInformation.street; + scope.formData.sector = contactInformation.sector; + scope.formData.batch = contactInformation.batch; + scope.formData.referenceData = contactInformation.referenceHousingData; + scope.publicServiceTypes = contactInformation.publicServiceTypes; + for(var i = 0; i < scope.clientAreaOptions.length; i++){ + if(contactInformation.area === scope.clientAreaOptions[i].name){ + scope.formData.clientArea = scope.clientAreaOptions[i].id + break; + } + } + + for(var i = 0; i < scope.departamentoOptions.length; i++){ + if(contactInformation.department === scope.departamentoOptions[i].name){ + scope.formData.departmentId = scope.departamentoOptions[i].id + break; + } + } + + for(var i = 0; i < scope.housingTypeOptions.length; i++){ + if(contactInformation.housingType === scope.housingTypeOptions[i].name){ + scope.formData.housingTypeId = scope.housingTypeOptions[i].id + break; + } + } + + for(var i = 0; i < scope.municipioOptions.length; i++){ + if(contactInformation.municipality === scope.municipioOptions[i].name){ + scope.formData.municipalId = scope.municipioOptions[i].id + break; + } + } + } + for (var i = 0; i < scope.publicServiceOptions.length; i++) { + var serviceId = scope.publicServiceOptions[i].id; + var checked = false; + for (var j = 0; j < scope.publicServiceTypes.length; j++){ + if(scope.publicServiceTypes[j].id === serviceId){ + checked = true; + } + } + scope.publicServiceChecks[serviceId] = checked; + scope.formData.publicServices.push({ + id: scope.publicServiceOptions[i].id, + checked: checked + }); + } if(data.gender){ scope.formData.genderId = data.gender.id; @@ -99,6 +183,15 @@ }); + scope.checkPublicService = function(serviceId){ + for (var i = 0; i < scope.formData.publicServices.length; i++) { + if(serviceId == scope.formData.publicServices[i].id){ + scope.formData.publicServices[i].checked = scope.publicServiceChecks[serviceId]; + break; + } + } + } + scope.displayPersonOrNonPersonOptions = function (legalFormId) { if(legalFormId == scope.clientPersonId || legalFormId == null) { scope.showNonPersonOptions = false; @@ -107,6 +200,14 @@ } }; + scope.updateActivities = function () { + scope.formData.economicActivity = null; + console.log("updateActivities: " + scope.formData.economicSector); + scope.economicActivityOptions = scope.economicActivities.filter(function (economicActivity) { + return economicActivity.sectorId == scope.formData.economicSector; + }); + }; + scope.submit = function () { this.formData.locale = scope.optlang.code; this.formData.dateFormat = scope.df; diff --git a/app/scripts/controllers/client/ViewClientController.js b/app/scripts/controllers/client/ViewClientController.js index 3f50da6c5f..5e6195ee0e 100644 --- a/app/scripts/controllers/client/ViewClientController.js +++ b/app/scripts/controllers/client/ViewClientController.js @@ -16,6 +16,7 @@ scope.showRecurring = false; scope.updateDefaultSavings = false; scope.charges = []; + scope.clientContactInformation = null; scope.legalform = 'm_client'; scope.collaterals = []; @@ -176,6 +177,8 @@ scope.haveFile = []; resourceFactory.clientResource.get({clientId: routeParams.id}, function (data) { scope.client = data; + scope.clientContactInformation = data.clientContactInformation; + scope.detailData = data.detailData; scope.collaterals = scope.client.clientCollateralManagements; scope.collateralSize = scope.collaterals.length; scope.isClosedClient = scope.client.status.value == 'Closed'; diff --git a/app/scripts/controllers/hardpolicychecklist/ViewHardPolicyChecklistController.js b/app/scripts/controllers/hardpolicychecklist/ViewHardPolicyChecklistController.js new file mode 100644 index 0000000000..91a6eed226 --- /dev/null +++ b/app/scripts/controllers/hardpolicychecklist/ViewHardPolicyChecklistController.js @@ -0,0 +1,28 @@ +(function (module) { + mifosX.controllers = _.extend(module, { + ViewHardPolicyChecklistController: function (scope, routeParams, route, dateFilter, location, resourceFactory, http, $uibModal, API_VERSION, $timeout, $rootScope, Upload) { + scope.prequalificationNumber; + scope.groupId = routeParams.groupId; + scope.checklist = []; + scope.tf = "HH:mm"; + scope.showChecklistTable = true; + + resourceFactory.groupResource.get({groupId: routeParams.groupId, associations: 'all'}, function (data) { + + }); + + scope.fetchClientChecklists = function () { + var items = resourceFactory.prequalificationChecklistResource.get({ + prequalificationId: scope.routeParams.groupId + }, function (data) { + scope.checklist = data; + }); + } + + } + }); + + mifosX.ng.application.controller('ViewHardPolicyChecklistController', ['$scope', '$routeParams', '$route', 'dateFilter', '$location', 'ResourceFactory', '$http', '$uibModal', 'API_VERSION', '$timeout', '$rootScope', 'Upload', mifosX.controllers.ViewHardPolicyChecklistController]).run(function ($log) { + $log.info("ViewHardPolicyChecklistController initialized"); + }); +}(mifosX.controllers || {})); diff --git a/app/scripts/controllers/loanAccount/LoanFuturePaymentController.js b/app/scripts/controllers/loanAccount/LoanFuturePaymentController.js new file mode 100644 index 0000000000..1989aca999 --- /dev/null +++ b/app/scripts/controllers/loanAccount/LoanFuturePaymentController.js @@ -0,0 +1,39 @@ +(function (module) { + mifosX.controllers = _.extend(module, { + LoanFuturePaymentController: function (scope, routeParams, resourceFactory, location, route, http, $uibModal, dateFilter, $filter) { + scope.accountId = routeParams.id; + scope.formData = {}; + scope.formData.loanId = scope.accountId; + scope.taskTypeName = 'Future Payment'; + scope.subTaskTypeName = 'Futurepayment'; + scope.formData.paymentDate = new Date(); + scope.formData.paymentType = 'partial'; + scope.restrictDate = new Date(); + + resourceFactory.LoanAccountResource.getLoanAccountDetails({loanId: routeParams.id, associations: 'all'}, function (data) { + scope.loandetails = data; + scope.restrictDate = new Date(data.timeline.expectedMaturityDate); + }); + + scope.simulatePayment = function() { + resourceFactory.loanTrxnsSimulatePaymentResource.get({ + loanId: routeParams.id, + command: 'futurepayment', + paymentDate: dateFilter(this.formData.paymentDate, scope.df), + paymentType: this.formData.paymentType, + dateFormat: scope.df, + locale: scope.optlang.code + }, function (data) { + scope.simulationPaymentData = data; + }); + } + + scope.cancel = function () { + location.path('/viewloanaccount/' + scope.accountId); + }; + } + }); + mifosX.ng.application.controller('LoanFuturePaymentController', ['$scope', '$routeParams', 'ResourceFactory', '$location', '$route', '$http', '$uibModal', 'dateFilter','$filter', mifosX.controllers.LoanFuturePaymentController]).run(function ($log) { + $log.info("LoanFuturePaymentController initialized"); + }); +}(mifosX.controllers || {})); \ No newline at end of file diff --git a/app/scripts/controllers/loanAccount/RestructureCreditsController.js b/app/scripts/controllers/loanAccount/RestructureCreditsController.js new file mode 100644 index 0000000000..0c6bf62474 --- /dev/null +++ b/app/scripts/controllers/loanAccount/RestructureCreditsController.js @@ -0,0 +1,250 @@ +(function (module) { + mifosX.controllers = _.extend(module, { + RestructureCreditsController: function (scope, resourceFactory, routeParams, location, dateFilter,$uibModal) { + scope.clientId = routeParams.clientId; + scope.formData = {}; + scope.loandetails = {}; + scope.inparams = {resourceType: 'template', activeOnly: 'true',clientId:routeParams.clientId}; + scope.formData.clientId = routeParams.clientId; + scope.chargeFormData = {}; //For charges + scope.outstandingBalance=0; + scope.restructureData; + scope.product; + + resourceFactory.restructurecreditsResource.template({clientId:scope.clientId,anotherResource:'template'},function(data){ + + scope.activeLoans = data.activeLoans; + scope.clientData = data.clientData; + scope.requestData = data.requestData; + scope.loanProductData = data.loanProductData; + if (data.requestData){ + scope.retrieveLoanProductTemplate(data.requestData); + } + }); + scope.cancel = function () { + location.path('/viewclient/' + scope.clientId); + }; + scope.computeTotalBalance = function () { + for (let i=0; i<scope.activeLoans.length; i++) { + if (scope.activeLoans[i].selected){ + scope.outstandingBalance = scope.outstandingBalance+ Number(scope.activeLoans[i].summary.totalOutstanding) + } + } + + }; + + scope.retrieveLoanProductTemplate = function (requestData) { + scope.inparams.productId = requestData.productId; + scope.formData.productId = requestData.productId; + scope.inparams.templateType = 'individual'; + scope.formData.loanType = 'individual'; + + scope.inparams.staffInSelectedOfficeOnly = true; + + resourceFactory.loanResource.get(scope.inparams, function (data) { + scope.loanaccountinfo = data; + scope.product = data.product; + + scope.previewClientLoanAccInfo(); + scope.loandetails.interestValue = scope.loanaccountinfo.interestType.value; + scope.loandetails.amortizationValue = scope.loanaccountinfo.amortizationType.value; + scope.loandetails.interestCalculationPeriodValue = scope.loanaccountinfo.interestCalculationPeriodType.value; + scope.loandetails.transactionProcessingStrategyValue = scope.formValue(scope.loanaccountinfo.transactionProcessingStrategyOptions, scope.formData.transactionProcessingStrategyId, 'id', 'name'); + scope.datatables = data.datatables; + scope.handleDatatables(scope.datatables); + scope.disabled = false; + }); + + resourceFactory.loanResource.get({ + resourceType: 'template', + templateType: 'collateral', + productId: requestData.productId, + clientId: scope.clientId, + fields: 'id,loanCollateralOptions' + }, function (data) { + scope.collateralOptions = data.loanCollateralOptions || []; + }); + }; + + scope.formValue = function (array, model, findattr, retAttr) { + findattr = findattr ? findattr : 'id'; + retAttr = retAttr ? retAttr : 'value'; + console.log("finding: "+findattr, retAttr, model); + return _.find(array, function (obj) { + return obj[findattr] === model; + })[retAttr]; + }; + + scope.handleDatatables = function (datatables) { + if (!_.isUndefined(datatables) && datatables.length > 0) { + scope.formData.datatables = []; + scope.formDat.datatables = []; + scope.noOfTabs = datatables.length + 1; + angular.forEach(datatables, function (datatable, index) { + scope.updateColumnHeaders(datatable.columnHeaderData); + angular.forEach(datatable.columnHeaderData, function (colHeader, i) { + if (_.isEmpty(scope.formDat.datatables[index])) { + scope.formDat.datatables[index] = {data: {}}; + } + + if (_.isEmpty(scope.formData.datatables[index])) { + scope.formData.datatables[index] = { + registeredTableName: datatable.registeredTableName, + data: {locale: scope.optlang.code} + }; + } + + if (datatable.columnHeaderData[i].columnDisplayType == 'DATETIME') { + scope.formDat.datatables[index].data[datatable.columnHeaderData[i].columnName] = {}; + } + }); + }); + } + }; + + + + scope.resolveDateTime = function (dateTime) { + if (dateTime){ + let year = dateTime[0] + let month = dateTime[1].toString().padStart(2,'0'); + let date = dateTime[2].toString().padStart(2,'0'); + let hour = dateTime[3].toString().padStart(2,'0'); + let minute = dateTime[4].toString().padStart(2,'0'); + let seconds = dateTime[5].toString().padStart(2,'0'); + return ""+ year +"-"+ month+"-"+ date+" "+ hour+":"+ minute+":"+ seconds; + } + }; + + scope.submit = function () { + console.log("selected loans: \n\n"+ JSON.stringify(scope.activeLoans)) + let selectedLoans = [] + for (let i=0; i<scope.activeLoans.length; i++){ + if (scope.activeLoans[i].selected){ + selectedLoans.push(scope.activeLoans[i].id) + } + }; + + var disbursementDate = dateFilter(scope.formData.disbursementDate, scope.dft); + + + let formData = { + ...this.formData, + clientId:scope.clientId, + selectedLoanIds: selectedLoans, + disbursementDate: disbursementDate, + outstandingBalance: scope.outstandingBalance, + locale : scope.optlang.code, + dateFormat: scope.dft + } + + resourceFactory.restructurecreditsResource.save({clientId:scope.clientId},formData,function(data){ + location.path('/viewclient/' + scope.clientId); + }); + + + }; + + scope.processRequest = function (action) { + scope.action = action; + $uibModal.open({ + templateUrl: 'processRequest.html', + controller: ProcessRequestCtrl + }); + } + + var ProcessRequestCtrl = function ($scope, $uibModalInstance) { + $scope.action = scope.action; + scope.formData.principal = scope.requestData.totalLoanAmount; + $scope.processRequest = function () { + let formData = { + requestId:scope.requestData.id, + transactionDate : dateFilter(new Date(), scope.df), + notes : scope.requestData.comments, + locale : scope.optlang.code, + dateFormat: scope.df, + loanData: scope.formData + }; + + console.log("final sending : "+ JSON.stringify(formData)); + + resourceFactory.restructurecreditsResource.save({clientId:scope.clientId, anotherresource: scope.action}, formData, function (data) { + $uibModalInstance.close('delete'); + location.path('/viewclient/' + scope.clientId); + }); + }; + $scope.cancel = function () { + $uibModalInstance.dismiss('cancel'); + }; + }; + + scope.previewClientLoanAccInfo = function () { + scope.previewRepayment = false; + scope.charges = scope.loanaccountinfo.charges || []; + scope.formData.disbursementData = scope.loanaccountinfo.disbursementDetails || []; + scope.collaterals = []; + + if (scope.loanaccountinfo.calendarOptions) { + scope.formData.syncRepaymentsWithMeeting = true; + scope.formData.syncDisbursementWithMeeting = true; + } + scope.multiDisburseLoan = scope.loanaccountinfo.multiDisburseLoan; + scope.formData.productId = scope.loanaccountinfo.loanProductId; + scope.formData.fundId = scope.loanaccountinfo.fundId; + scope.formData.principal = scope.loanaccountinfo.principal; + scope.formData.loanTermFrequency = scope.loanaccountinfo.termFrequency; + scope.formData.loanTermFrequencyType = scope.loanaccountinfo.termPeriodFrequencyType.id; + scope.loandetails.loanTermFrequencyValue = scope.loanaccountinfo.termPeriodFrequencyType.value; + scope.formData.numberOfRepayments = scope.loanaccountinfo.numberOfRepayments; + scope.formData.repaymentEvery = scope.loanaccountinfo.repaymentEvery; + scope.formData.repaymentFrequencyType = scope.loanaccountinfo.repaymentFrequencyType.id; + scope.loandetails.repaymentFrequencyValue = scope.loanaccountinfo.repaymentFrequencyType.value; + scope.formData.interestRatePerPeriod = scope.loanaccountinfo.interestRatePerPeriod; + scope.formData.amortizationType = scope.loanaccountinfo.amortizationType.id; + scope.formData.fixedPrincipalPercentagePerInstallment = scope.loanaccountinfo.fixedPrincipalPercentagePerInstallment; + scope.formData.isEqualAmortization = scope.loanaccountinfo.isEqualAmortization; + scope.loandetails.amortizationValue = scope.loanaccountinfo.amortizationType.value; + scope.formData.interestType = scope.loanaccountinfo.interestType.id; + scope.loandetails.interestValue = scope.loanaccountinfo.interestType.value; + scope.formData.interestCalculationPeriodType = scope.loanaccountinfo.interestCalculationPeriodType.id; + scope.loandetails.interestCalculationPeriodValue = scope.loanaccountinfo.interestCalculationPeriodType.value; + scope.formData.allowPartialPeriodInterestCalcualtion = scope.loanaccountinfo.allowPartialPeriodInterestCalcualtion; + scope.formData.inArrearsTolerance = scope.loanaccountinfo.inArrearsTolerance; + scope.formData.graceOnPrincipalPayment = scope.loanaccountinfo.graceOnPrincipalPayment; + scope.formData.graceOnInterestPayment = scope.loanaccountinfo.graceOnInterestPayment; + scope.formData.graceOnArrearsAgeing = scope.loanaccountinfo.graceOnArrearsAgeing; + scope.formData.transactionProcessingStrategyId = scope.loanaccountinfo.transactionProcessingStrategyId; + scope.loandetails.transactionProcessingStrategyValue = scope.formValue(scope.loanaccountinfo.transactionProcessingStrategyOptions, scope.formData.transactionProcessingStrategyId, 'id', 'name'); + scope.formData.graceOnInterestCharged = scope.loanaccountinfo.graceOnInterestCharged; + scope.formData.fixedEmiAmount = scope.loanaccountinfo.fixedEmiAmount; + scope.formData.maxOutstandingLoanBalance = scope.loanaccountinfo.maxOutstandingLoanBalance; + + if (scope.loanaccountinfo.isInterestRecalculationEnabled && scope.loanaccountinfo.interestRecalculationData.recalculationRestFrequencyDate) { + scope.date.recalculationRestFrequencyDate = new Date(scope.loanaccountinfo.interestRecalculationData.recalculationRestFrequencyDate); + } + if (scope.loanaccountinfo.isInterestRecalculationEnabled && scope.loanaccountinfo.interestRecalculationData.recalculationCompoundingFrequencyDate) { + scope.date.recalculationCompoundingFrequencyDate = new Date(scope.loanaccountinfo.interestRecalculationData.recalculationCompoundingFrequencyDate); + } + + if (scope.loanaccountinfo.isLoanProductLinkedToFloatingRate) { + scope.formData.isFloatingInterestRate = false; + } + + scope.loandetails = angular.copy(scope.formData); + // console.log("prods: \n\n"+ JSON.stringify(scope.products)); + // scope.loandetails.productName = scope.formValue(scope.products, scope.formData.productId, 'id', 'name'); + scope.formData.rates = scope.loanaccountinfo.product.rates; + if (scope.formData.rates && scope.formData.rates.length > 0) { + scope.rateFlag = true; + } + scope.rateOptions = []; + + console.log("form data to send: "+ JSON.stringify(scope.formData)); + }; + + } + }); + mifosX.ng.application.controller('RestructureCreditsController', ['$scope', 'ResourceFactory', '$routeParams', '$location', 'dateFilter','$uibModal', mifosX.controllers.RestructureCreditsController]).run(function ($log) { + $log.info("RestructureCreditsController initialized"); + }); +}(mifosX.controllers || {})); diff --git a/app/scripts/controllers/main/ExpertSearchController.js b/app/scripts/controllers/main/ExpertSearchController.js index 098ae15669..e597ceb583 100644 --- a/app/scripts/controllers/main/ExpertSearchController.js +++ b/app/scripts/controllers/main/ExpertSearchController.js @@ -12,7 +12,9 @@ 'create user', 'employees', 'create employee', 'manage funds', 'offices', 'chart of accounts', 'frequent postings', 'Journal entry', 'search transaction', 'account closure', 'accounting rules', 'add accounting rule', 'data tables', 'create data table', 'add code', 'jobs', 'codes', 'reports', 'create report', 'holidays', 'create holiday', 'create charge', 'product mix', 'add member', 'add product mix', - 'bulk loan reassignment', 'audit', 'create accounting closure', 'enter collection sheet', 'navigation', 'accounting', 'organization', 'system']; + 'bulk loan reassignment', 'audit', 'create accounting closure', 'enter collection sheet', 'navigation', 'accounting', 'organization', 'system', + 'Prequalification of Credits' + ]; scope.search = function () { switch (this.formData.search) { case 'create client': @@ -177,6 +179,9 @@ case 'system users': location.path('/admin/users'); break; + case 'Prequalification of Credits': + location.path('/prequalificationsmenu'); + break; default: location.path('/home'); } diff --git a/app/scripts/controllers/prequalification/EditGroupPrequalificatoinController.js b/app/scripts/controllers/prequalification/EditGroupPrequalificatoinController.js new file mode 100644 index 0000000000..a98918a83c --- /dev/null +++ b/app/scripts/controllers/prequalification/EditGroupPrequalificatoinController.js @@ -0,0 +1,207 @@ +(function (module) { + mifosX.controllers = _.extend(module, { + EditGroupPrequalificatoinController: function (scope, routeParams, route, dateFilter, location, resourceFactory, validationService, http, $uibModal, API_VERSION, $timeout, $rootScope, Upload) { + + scope.agenciesList = []; + scope.portfoliosList = []; + scope.centersList = []; + scope.groupsList = []; + scope.productsList = []; + scope.facilitators = []; + scope.yesNo = [{value: "YES", name: "Yes"}, {value: "NO", name: "No"}]; + scope.restrictDate = new Date(); + scope.formData = {}; + scope.formData.members = []; + scope.membersForm = { + workWithPuente: "YES" + }; + scope.memberDetailsForm; + scope.groupData; + scope.membersList = []; + scope.tf = "HH:mm"; + + resourceFactory.prequalificationResource.get({groupId: routeParams.groupId}, function (data) { + console.log("Make call for prequalification"); + console.log(data); + //scope.offices = data.allowedParents; + scope.id = data.id; + if (data.openingDate) { + var editDate = dateFilter(data.openingDate, scope.df); + scope.first.date = new Date(editDate); + } + + if(data.groupMembers){ + data.groupMembers.forEach(member => { + if (member.dob) { + var dobDate = dateFilter(member.dob, scope.df); + member.dob = new Date(dobDate); + } + }); + } + scope.formData = + { + agencyId: data.agencyId, + productId: data.productId, + centerId: data.centerId, + facilitator: data.facilitatorId, + groupName: data.groupName, + prequalificationNumber: data.prequalificationNumber, + members: data.groupMembers + + } + }); + + resourceFactory.prequalificationTemplateResource.get(function (data) { + console.log(data.facilitators); + scope.agenciesList = data.agencies, + scope.centersList = data.centerData, + scope.productsList = data.loanProducts, + scope.facilitators = data.facilitators + }); + + scope.addMemberData = function () { + var uiValidationErrors = []; + if (!validationService.checkDPI(scope.membersForm.dpi)) { + uiValidationErrors.push({ + message: `${scope.membersForm.dpi} DPI provided is invalid` + }); + } else { + var reqDate = dateFilter(scope.membersForm.dob, scope.df); + scope.membersForm.dob = reqDate; + scope.membersForm['locale'] = scope.optlang.code; + scope.membersForm['dateFormat'] = scope.df; + scope.formData.members.push(scope.membersForm); + scope.membersForm = { + workWithPuente: "YES" + }; + scope.memberDetailsForm.$setUntouched(); + scope.memberDetailsForm.$setPristine(); + + } + this.uiValidationErrors = uiValidationErrors; + } + + scope.removeMember = function (index) { + scope.formData.members.splice(index,1); + }; + + scope.getGroupsByCenterId = function (centerId) { + scope.groupsList = []; + + resourceFactory.centerResource.get({centerId: centerId,associations: 'groupMembers'}, function (data) { + scope.groupsList = data.groupMembers; + }); + } + + scope.getGroupMembers = function (groupId) { + + resourceFactory.groupResource.get({groupId: groupId, associations: 'clientMembers'}, function (data) { + scope.group = data; + if(data.clientMembers){ + scope.isGroupMembersAvailable = (data.clientMembers.length>0); + scope.membersList = data.clientMembers; + scope.groupData = data; + + if (scope.groupData.meetingStartTime) { + scope.groupData.meetingStartTime = dateFilter(scope.groupData.meetingStartTime, scope.tf); + } + if (scope.groupData.meetingEndTime) { + scope.groupData.meetingEndTime = dateFilter(scope.groupData.meetingEndTime, scope.tf); + } + } + scope.isClosedGroup = data.status.value == 'Closed'; + scope.staffData.staffId = data.staffId; + }); + } + + scope.prequalifyGroup = function (){ + console.log("submitting form data") + scope.formData.locale = scope.optlang.code; + scope.formData.individual = false; + scope.formData.dateFormat = scope.df; + if (scope.membersList.length > 0){ + let newMemberData = []; + for (var i = 0; i < scope.membersList.length; i++) { + let memberData = {}; + memberData.clientId = scope.membersList[i].id ; + memberData.name = scope.membersList[i].displayName ; + memberData.dpi = scope.membersList[i].dpiNumber ; + if(scope.membersList[i].dateOfBirth){ + memberData.dob = dateFilter(new Date(scope.membersList[i].dateOfBirth),scope.df); + } + memberData.amount = scope.membersList[i].requestedAmount ; + memberData.locale = scope.optlang.code; + memberData.dateFormat = scope.df; + scope.formData.members.push(memberData) + } + } + + + resourceFactory.prequalificationResource.prequalifyExistingGroup({groupId: scope.formData.groupId,anotherResource:'prequalifyGroup'},this.formData, function (data) { + location.path('prequalification/' + data.resourceId + '/viewdetails'); + }); + } + + scope.requestPrequalification = function () { + console.log("submitting form data") + this.formData.locale = scope.optlang.code; + this.formData.dateFormat = scope.df; + this.formData.individual = false; + + // this.formData.members.forEach(function(member){ + // member.locale = scope.optlang.code; + // member.dateFormat = scope.df; + // }) + resourceFactory.prequalificationResource.save(this.formData, function (data) { + location.path('prequalification/' + data.resourceId + '/viewdetails'); + }); + } + + scope.generatePrequalificationNumber = function (){ + var agencyId = this.formData.agencyId + var groupId = this.formData.groupId + return "PRECAL-"+agencyId+"-"+groupId.toString().padStart(4,"0") + } + + scope.resolveTime = function (time) { + let hour = time[0]; + let minute = time[1]; + let seconds = time[2]; + return hour.toString().padStart(2,"0")+':'+minute.toString().padStart(2,"0")+':'+seconds.toString().padStart(2,"0"); + } + + scope.updatePreQualification = function () { + console.log("submitting form data for update"); + this.formData.locale = scope.optlang.code; + this.formData.dateFormat = scope.df; + this.formData.individual = false; + + let eMembers = this.formData.members; + let memberArray = []; + eMembers.forEach(function(member){ + let m = { + locale : scope.optlang.code, + dateFormat : scope.df, + name : member.name, + dpi : member.dpi, + dob : member.dob ? dateFilter(member.dob, scope.df) : member.dob, + amount : member.requestedAmount, + puente : member.workWithPuente, + id : member.id + } + + memberArray.push(m); + }); + this.formData.members = memberArray; + resourceFactory.prequalificationResource.update({groupId: routeParams.groupId},this.formData, function (data) { + location.path('prequalification/' + data.resourceId + '/viewdetails'); + }); + } + + } + }); + + mifosX.ng.application.controller('EditGroupPrequalificatoinController', ['$scope', '$routeParams', '$route', 'dateFilter', '$location', 'ResourceFactory', 'ValidationService', '$http', '$uibModal', 'API_VERSION', '$timeout', '$rootScope', 'Upload', mifosX.controllers.EditGroupPrequalificatoinController]).run(function ($log) { + $log.info("EditGroupPrequalificatoinController initialized"); + }); +}(mifosX.controllers || {})); diff --git a/app/scripts/controllers/prequalification/NewGroupPrequalificatoinController.js b/app/scripts/controllers/prequalification/NewGroupPrequalificatoinController.js index de7b5fc725..4f7ee33ec0 100644 --- a/app/scripts/controllers/prequalification/NewGroupPrequalificatoinController.js +++ b/app/scripts/controllers/prequalification/NewGroupPrequalificatoinController.js @@ -1,6 +1,6 @@ (function (module) { mifosX.controllers = _.extend(module, { - NewGroupPrequalificatoinController: function (scope, routeParams, route, dateFilter, location, resourceFactory, http, $uibModal, API_VERSION, $timeout, $rootScope, Upload) { + NewGroupPrequalificatoinController: function (scope, routeParams, route, dateFilter, location, resourceFactory, validationService, http, $uibModal, API_VERSION, $timeout, $rootScope, Upload) { scope.agenciesList = []; scope.portfoliosList = []; @@ -12,7 +12,9 @@ scope.restrictDate = new Date(); scope.formData = {}; scope.formData.members = []; - scope.membersForm = {}; + scope.membersForm = { + workWithPuente: "YES" + }; scope.memberDetailsForm; scope.groupData; scope.membersList = []; @@ -25,22 +27,32 @@ scope.facilitators = data.facilitators }); - - scope.addMemberData = function () { - var reqDate = dateFilter(scope.membersForm.dob, scope.df); - - scope.membersForm.dob = reqDate; - scope.membersForm['locale'] = scope.optlang.code; - scope.membersForm['dateFormat'] = scope.df; - - scope.formData.members.push(scope.membersForm); - scope.membersForm = {} - scope.memberDetailsForm.$setUntouched(); - scope.memberDetailsForm.$setPristine(); + var uiValidationErrors = []; + if (!validationService.checkDPI(scope.membersForm.dpi)) { + uiValidationErrors.push({ + message: `${scope.membersForm.dpi} DPI provided is invalid` + }); + } else { + var reqDate = dateFilter(scope.membersForm.dob, scope.df); + scope.membersForm.dob = reqDate; + scope.membersForm['locale'] = scope.optlang.code; + scope.membersForm['dateFormat'] = scope.df; + scope.formData.members.push(scope.membersForm); + scope.membersForm = { + workWithPuente: "YES" + }; + scope.memberDetailsForm.$setUntouched(); + scope.memberDetailsForm.$setPristine(); + } + this.uiValidationErrors = uiValidationErrors; } + scope.removeMember = function (index) { + scope.formData.members.splice(index,1); + }; + scope.getGroupsByCenterId = function (centerId) { scope.groupsList = []; @@ -129,7 +141,7 @@ } }); - mifosX.ng.application.controller('NewGroupPrequalificatoinController', ['$scope', '$routeParams', '$route', 'dateFilter', '$location', 'ResourceFactory', '$http', '$uibModal', 'API_VERSION', '$timeout', '$rootScope', 'Upload', mifosX.controllers.NewGroupPrequalificatoinController]).run(function ($log) { + mifosX.ng.application.controller('NewGroupPrequalificatoinController', ['$scope', '$routeParams', '$route', 'dateFilter', '$location', 'ResourceFactory', 'ValidationService', '$http', '$uibModal', 'API_VERSION', '$timeout', '$rootScope', 'Upload', mifosX.controllers.NewGroupPrequalificatoinController]).run(function ($log) { $log.info("NewGroupPrequalificatoinController initialized"); }); }(mifosX.controllers || {})); diff --git a/app/scripts/controllers/prequalification/PrequalificationDetailsController.js b/app/scripts/controllers/prequalification/PrequalificationDetailsController.js index eed4b488c6..9fcb59331d 100644 --- a/app/scripts/controllers/prequalification/PrequalificationDetailsController.js +++ b/app/scripts/controllers/prequalification/PrequalificationDetailsController.js @@ -6,7 +6,7 @@ scope.formData = {}; scope.groupMembers = []; scope.prequalificationDocuments = []; - + scope.showValidatePolicies = routeParams.showValidatePolicies == 'true' ? true : false; resourceFactory.prequalificationResource.get({groupId: routeParams.groupId}, function (data) { scope.groupData = data; scope.groupMembers = data.groupMembers; @@ -37,7 +37,7 @@ if (!scope.$$phase) { scope.$apply(); } - location.path('/prequalificationGroups/newprequalification/new'); + location.path('/prequalificationGroups/new'); }); }; @@ -52,10 +52,29 @@ return 'text-success'; } } + scope.policyCheckColor = function (redValidationCount) { + if (redValidationCount > 0){ + return 'text-danger'; + } + return 'text-success' + } + scope.validateHardPolicy = function(){ + resourceFactory.prequalificationChecklistResource.validate({prequalificationId: routeParams.groupId}, {}, function (data) { + route.reload(); + }); + } scope.onFileSelect = function (files) { scope.formData.file = files[0]; }; + + scope.showSupportDocumentUploadPage = function(){ + var allowedStatuses = [400, 200]; + if(scope.groupData.status){ + return allowedStatuses.includes(scope.groupData.status.id) + } + return false; + } } }); diff --git a/app/scripts/filters/StatusLookup.js b/app/scripts/filters/StatusLookup.js index b42abaeb78..9d57344350 100644 --- a/app/scripts/filters/StatusLookup.js +++ b/app/scripts/filters/StatusLookup.js @@ -39,7 +39,9 @@ "purchasedSharesStatusType.approved": "statusApproved", "purchasedSharesStatusType.rejected": "statusrejected", "charges.StatusType.active.true": "statusactive", - "employees.StatusType.active.true": "statusactive" + "employees.StatusType.active.true": "statusactive", + "prequalification.status.blacklist.checked": "statusApproved", + "prequalification.status.blacklist.rejected": "statusrejected" } return cssClassNameLookup[input]; diff --git a/app/scripts/mifosXComponents.js b/app/scripts/mifosXComponents.js index f195c804be..4425c9c94a 100755 --- a/app/scripts/mifosXComponents.js +++ b/app/scripts/mifosXComponents.js @@ -13,6 +13,7 @@ define(['Q', 'underscore', 'mifosX'], function (Q) { 'SessionManager', 'Paginator', 'UIConfigService', + 'ValidationService', 'NotificationResponseHeaderProvider' ], @@ -51,6 +52,7 @@ define(['Q', 'underscore', 'mifosX'], function (Q) { 'loanAccount/CreditBureauSummaryController', 'loanAccount/CreditReportFetchThitsaWorksController', 'loanAccount/CreditReportUploadThitsaWorksController', + 'loanAccount/LoanFuturePaymentController', 'groups/AssignStaffController', 'client/ClientController', 'client/CreateClientCollateralController', @@ -392,7 +394,10 @@ define(['Q', 'underscore', 'mifosX'], function (Q) { 'prequalification/PrequalificationsController', 'prequalification/PrequalificationDetailsController', 'prequalification/IndividualPrequalificatoinFormController', - 'prequalification/IndividualPrequalificatoinController' + 'prequalification/IndividualPrequalificatoinController', + 'prequalification/EditGroupPrequalificatoinController', + 'loanAccount/RestructureCreditsController', + 'hardpolicychecklist/ViewHardPolicyChecklistController' ], filters: [ 'StatusLookup', @@ -420,6 +425,7 @@ define(['Q', 'underscore', 'mifosX'], function (Q) { 'FormValidateDirective', 'FormSubmitValidateDirective', 'ApiValidationDirective', + 'UiValidationDirective', 'HasPermissionDirective', 'ActivitiesDisplayPanelDirective', 'ScrollbarTopDirective', diff --git a/app/scripts/routes.js b/app/scripts/routes.js index 16b05e56ff..52f20304bd 100755 --- a/app/scripts/routes.js +++ b/app/scripts/routes.js @@ -956,6 +956,9 @@ .when('/loanforeclosure/:id', { templateUrl: 'views/loans/loanforeclosure.html' }) + .when('/loanfuturepayment/:id', { + templateUrl: 'views/loans/loanfuturepayment.html' + }) .when('/address/:id', { templateUrl: 'views/administration/AddressForm.html' }) @@ -1211,10 +1214,20 @@ templateUrl: 'views/prequalifications/existingGroupPrequalification.html' }).when('/prequalification/:groupId/viewdetails', { templateUrl: 'views/prequalifications/prequalificationDetails.html' + }).when('/prequalification/:groupId/edit', { + templateUrl: 'views/prequalifications/editgroup.html' }).when('/prequalifications/individualprequalifications', { templateUrl: 'views/prequalifications/individualPrequalificationList.html' }).when('/prequalifications/individual/create', { templateUrl: 'views/prequalifications/individualPrequalification.html' + }).when('/evaluation/hardpolicychecklist/:groupId', { + templateUrl: 'views/hardpolicy/checklistevaluationform.html' + }).when('/evaluation/hardpolicychecklist/:groupId/:evaluationId', { + templateUrl: 'views/hardpolicy/checklistevaluationdetails.html' + }).when('/loans/restructurecredit/:clientId', { + templateUrl: 'views/loans/restructurecredits.html' + }).when('/viewhardpolicychecklist/:groupId', { + templateUrl: '/views/hardpolicychecklist/viewhardpolicychecklist.html' }); $locationProvider.hashPrefix(''); $locationProvider.html5Mode(false); diff --git a/app/scripts/services/ResourceFactoryProvider.js b/app/scripts/services/ResourceFactoryProvider.js index 730a51a900..f4de4c6e13 100755 --- a/app/scripts/services/ResourceFactoryProvider.js +++ b/app/scripts/services/ResourceFactoryProvider.js @@ -10,6 +10,7 @@ this.setTenantIdenetifier = function (tenant) { tenantIdentifier = tenant; } + this.$get = ['$resource', '$rootScope', function (resource, $rootScope) { var defineResource = function (url, paramDefaults, actions) { var tempUrl = baseUrl; @@ -84,6 +85,11 @@ prequalificationTemplateResource: defineResource(apiVer + "/prequalification/template", {}, { get: {method: 'GET', params: {}}, }), + + prequalificationChecklistResource: defineResource(apiVer + "/prequalification/checklist/:prequalificationId", {prequalificationId:'@prequalificationId'}, { + get: {method: 'GET', params: {}, isArray:true}, + validate: {method: 'POST', params: {command: 'validateprequalification'}}, + }), prequalificationResource: defineResource(apiVer + "/prequalification/:anotherResource/:groupId", {groupId: '@groupId',anotherResource: '@anotherResource'}, { get: {method: 'GET', params: {}}, prequalifyExistingGroup: {method: 'POST', params: {anotherResource: '@anotherResource'}}, @@ -376,6 +382,10 @@ getAllCodeValues: {method: 'GET', params: {}, isArray: true}, update: { method: 'PUT', params: {} } }), + codeValueNameResource: defineResource(apiVer + "/codes/codevalues/:codeName", {codeName: '@codeName'}, { + getAllCodeValues: {method: 'GET', params: {}, isArray: true}, + update: { method: 'PUT', params: {} } + }), hookResources: defineResource(apiVer + "/hooks/:hookId", {hookId: "@hookId"}, { getAllHooks: {method: 'GET', params: {}, isArray: true}, getHook: {method: 'GET', params: {}}, @@ -556,6 +566,14 @@ reject:{method:'POST',params:{command:'reject'}}, approve:{method:'POST',params:{command:'approve'}} }), + + restructurecreditsResource: defineResource(apiVer + "/restructurecredits/:clientId/:anotherresource",{clientId:'@clientId', anotherresource: '@anotherresource'},{ + get: {method: 'GET',params:{}}, + save: {method: 'POST',params:{anotherresource: '@anotherresource'}}, + template: {method: 'GET',params:{anotherresource:'template'}}, + reject:{method:'POST',params:{command:'reject'}}, + approve:{method:'POST',params:{command:'approve'}} + }), auditResource: defineResource(apiVer + "/audits/:templateResource", {templateResource: '@templateResource'}, { get: {method: 'GET', params: {}}, search: {method: 'GET', params: {}, isArray: false} @@ -961,6 +979,9 @@ transferAgencyResource: defineResource(apiVer + "/agencies/:agencyId/transfer", {agencyId: "@agencyId"}, { transfer: { method: 'PUT'} }), + loanTrxnsSimulatePaymentResource: defineResource(apiVer + "/loans/:loanId/transactions/simulation", {loanId: '@loanId'}, { + get: {method: 'GET', params: {}} + }), }; }]; } diff --git a/app/views/_topnavbar.html b/app/views/_topnavbar.html index e14887826a..78e67449e7 100644 --- a/app/views/_topnavbar.html +++ b/app/views/_topnavbar.html @@ -30,6 +30,7 @@ }}</a></li> <li><a href="#/centers" has-permission='READ_CENTER'>{{ 'label.anchor.centers' | translate }}</a></li> + <li><a href="#/prequalificationsmenu" has-permission='VIEW_PREQUALIFICATIONS'>{{'label.anchor.prequalifications' | translate}}</a></li> <li><a href="#/blacklist" has-permission='VIEW_BLACKLIST'>{{ 'label.anchor.blacklist' | translate }}</a></li> </ul> diff --git a/app/views/administration/organization.html b/app/views/administration/organization.html index 544e715682..7be799a662 100644 --- a/app/views/administration/organization.html +++ b/app/views/administration/organization.html @@ -10,10 +10,10 @@ <h5>Organization</h5> <div class="list-group"> <a class="list-group-item" href="#/offices" has-permission='READ_OFFICE'> <h5 class="list-group-item-heading"><i class="fa fa-building fa fa-large"></i> {{'label.anchor.manageoffices' - | translate}}</h5> + | translate}}</h5> <p class="list-group-item-text">{{'label.addnewofficeormodifyordeactivateofficeormodifyofficeheirarchy' - | translate}}</p> + | translate}}</p> </a> <a class="list-group-item" href="#/agencies" has-permission='READ_AGENCY'> <h5 class="list-group-item-heading"><i class="fa fa-building-o fa fa-large"></i> {{'label.anchor.manageagencies' @@ -45,37 +45,37 @@ <h5 class="list-group-item-heading"><i class="fa fa-book fa fa-large"></i> </a> <a class="list-group-item" href="#/holidays" has-permission='READ_HOLIDAY'> <h5 class="list-group-item-heading"><i class="fa fa-calendar fa fa-large"></i> {{'label.anchor.manageholidays' - | translate}}</h5> + | translate}}</h5> <p class="list-group-item-text">{{'label.defineholidaysforoffices' | translate}}</p> </a> <a class="list-group-item" href="#/employees" has-permission='READ_STAFF'> <h5 class="list-group-item-heading"><i class="fa fa-user fa fa-large"></i> {{'label.anchor.manageemployees' - | translate}}</h5> + | translate}}</h5> <p class="list-group-item-text">{{'label.aemployeerepresentsloanofficerswithnoaccesstosystem' | - translate}}</p> + translate}}</p> </a> <a class="list-group-item" href="#/standinginstructions/history" has-permission='READ_STANDINGINSTRUCTION'> <h5 class="list-group-item-heading"><i class="fa fa-book fa fa-large"></i> {{'label.anchor.standinginstruction.history' | translate}}</h5> <p class="list-group-item-text">{{'label.view.standinginstructions.history.logging' | - translate}}</p> + translate}}</p> </a> - <!-- <a class="list-group-item" href="#/advsearch"> - <h5 class="list-group-item-heading"><i class="fa fa-large fa fa-money"></i> - {{'label.anchor.fund.mapping' | translate}}</h5> + <!-- <a class="list-group-item" href="#/advsearch"> + <h5 class="list-group-item-heading"><i class="fa fa-large fa fa-money"></i> + {{'label.anchor.fund.mapping' | translate}}</h5> - <p class="list-group-item-text">{{'label.view.advance.search.fund.mapping' | - translate}}</p> - </a>--> + <p class="list-group-item-text">{{'label.view.advance.search.fund.mapping' | + translate}}</p> + </a>--> <a class="list-group-item" href="#/passwordpreferences" has-permission='READ_PASSWORD_VALIDATION_POLICY'> <h5 class="list-group-item-heading"><i class="fa fa-lock fa fa-large"></i> {{'label.anchor.passwordPreferences' | translate}}</h5> <p class="list-group-item-text">{{'label.view.passwordPreferences' | - translate}}</p> + translate}}</p> </a> <a class="list-group-item" href="#/viewallprovisionings" has-permission='VIEW_PROVISIONS'> <h5 class="list-group-item-heading"><i class="fa fa-pencil fa fa-large"></i> @@ -91,21 +91,21 @@ <h5 class="list-group-item-heading"><i class="fa fa-check fa fa-large"></i>  <h5 class="list-group-item-heading"><i class="icon-large icon-double-angle-right"></i> {{'label.anchor.adhoc' | translate}}</h5> <p class="list-group-item-text">{{'label.view.adhocs' | translate}}</p> - </a> + </a> </div> </div> <div class="col-sm-6 col-md-6"> <div class="list-group"> <a class="list-group-item" href="#/currconfig" has-permission='READ_CURRENCY'> <h5 class="list-group-item-heading"><i class="fa fa-large fa fa-cogs"></i> {{'label.anchor.currencyconfig' - | translate}}</h5> + | translate}}</h5> <p class="list-group-item-text">{{'label.currenciesavailableacrossorganizationfordifferentproducts' | - translate}}</p> + translate}}</p> </a> <a class="list-group-item" href="#/managefunds" has-permission='READ_FUND'> <h5 class="list-group-item-heading"><i class="fa fa-large fa fa-money"></i> {{'label.anchor.managefunds' - | translate}}</h5> + | translate}}</h5> <p class="list-group-item-text">{{'label.fundsareassociatedwithloans' | translate}}</p> </a> @@ -114,27 +114,27 @@ <h5 class="list-group-item-heading"><i class="fa fa-money fa fa-large"></i>  'label.anchor.bulkloanreassignment' | translate}}</h5> <p class="list-group-item-text">{{'label.easywaytoreassignalltheloanfromonelotoanotherlo' | - translate}}</p> + translate}}</p> </a> <a class="list-group-item" href="#/tellers" has-permission='READ_TELLER'> <h5 class="list-group-item-heading"><i class="fa fa-money fa fa-large"></i> {{'label.anchor.tellercashmanagement' | translate}}</h5> <p class="list-group-item-text">{{'label.view.tellercashmanagement' | - translate}}</p> + translate}}</p> </a> <a class="list-group-item" href="#/workingdays" has-permission='READ_WORKINGDAYS'> <h5 class="list-group-item-heading"><i class="fa fa-calendar fa fa-large"></i> {{'label.anchor.workingDays' | translate}}</h5> <p class="list-group-item-text">{{'label.view.workingDays' | - translate}}</p> + translate}}</p> </a> <a class="list-group-item" href="#/viewpaymenttype" has-permission='READ_PAYMENTTYPE'> <h5 class="list-group-item-heading"><i class="fa fa-dollar fa fa-large"></i> {{'label.anchor.paymentTypes' | translate}}</h5> <p class="list-group-item-text">{{'label.view.paymentTypes' | - translate}}</p> + translate}}</p> </a> <a class="list-group-item" href="#/smscampaigns" has-permission='VIEW_SMSCAMPAIGNS'> <h5 class="list-group-item-heading"><i class="fa fa-envelope fa fa-large"></i> @@ -146,11 +146,6 @@ <h5 class="list-group-item-heading"><i class="fa fa-upload fa fa-large"></i>&nbs {{'label.anchor.bulkimport' | translate}}</h5> <p class="list-group-item-text">{{'label.view.bulkimport' | translate}}</p> </a> - <a class="list-group-item" href="#/prequalificationsmenu" has-permission='VIEW_PREQUALIFICATIONS'> - <h5 class="list-group-item-heading"><i class="fa fa-check-square-o fa fa-large"></i> - {{'label.anchor.prequalifications' | translate}}</h5> - <p class="list-group-item-text">{{'label.view.prequalifications' | translate}}</p> - </a> </div> </div> </div> diff --git a/app/views/clients/addclientdocument.html b/app/views/clients/addclientdocument.html index 3714500cc9..918406be02 100644 --- a/app/views/clients/addclientdocument.html +++ b/app/views/clients/addclientdocument.html @@ -15,7 +15,7 @@ <div class="col-sm-3"> <select id="name" ng-model="formData.name" - ng-options="documenttype.name as documenttype.name for documenttype in documenttypes" + ng-options="documenttype.name as documenttype.name for documenttype in allowedDocumentTypes" value="{{documenttype.name}}" required="required" class="form-control"> <option style="display:none" value="">{{'label.menu.selectone' | translate}} @@ -24,10 +24,53 @@ <div class="col-sm-3"> <form-validate valattributeform="clientdocumentform" valattribute="name"/> </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2" for="type">{{'label.input.documenttype' | translate}}<span + class="required">*</span></label> + + <div class="col-sm-3"> + <select id="type" ng-model="formData.documentType" + ng-options="type.id as type.name for type in documentTypes" + value="{{type.id}}" required="required" + class="form-control"> + <option style="display:none" value="">{{'label.menu.selectone' | translate}} + </select> + </div> + <div class="col-sm-3"> + <form-validate valattributeform="clientdocumentform" valattribute="type"/> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-2" for="purpose">{{'label.input.purpose' | translate}}<span + class="required">*</span></label> + + <div class="col-sm-3"> + <select id="purpose" ng-model="formData.documentPurpose" + ng-options="purpose.id as purpose.name for purpose in documentPurposes" + value="{{purpose.id}}" required="required" + class="form-control"> + <option style="display:none" value="">{{'label.menu.selectone' | translate}} + </select> + </div> + <div class="col-sm-3"> + <form-validate valattributeform="clientdocumentform" valattribute="purpose"/> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-2">{{'label.input.date' | translate}}</label> + + <div class="col-sm-3"> + <input id="transferDate" type="text" name="datecreated" datepicker-pop="dd MMMM yyyy" required="required" + class="form-control paddedbottom10 paddedtop" ng-model="formData.dateCreated" is-open="opened" + max="restrictDate" autocomplete="off"/> + </div> </div> <div class="form-group"> - <label class="control-label col-sm-2">{{'label.input.description' | translate}}</label> + <label class="control-label col-sm-2">{{'label.input.observations' | translate}}</label> <div class="col-sm-3"> <textarea rows="2" ng-model="formData.description" class="form-control"></textarea> diff --git a/app/views/clients/createclient.html b/app/views/clients/createclient.html index 387b5fadbc..db12e6682b 100755 --- a/app/views/clients/createclient.html +++ b/app/views/clients/createclient.html @@ -1,727 +1,1229 @@ <!DOCTYPE html> <div class="content-container" ng-controller="CreateClientController"> - <ul class="breadcrumb"> - <li ng-if="!groupid"><a href="#/clients">{{'label.anchor.clients' | translate}}</a></li> - <li ng-if="groupid"><a href="#/groups">{{'label.anchor.groups' | translate}}</a></li> - <li ng-if="groupid"><a href="#/viewgroup/{{groupid}}">{{'label.anchor.viewgroup' | translate}}</a></li> - <li class="active">{{'label.anchor.createclient' | translate}}</li> - </ul> - <wizard current-step="step" class="card well"> - <wz-step icon="fa fa-circle-o" wz-title="{{'label.heading.createclient' | translate}}"> - <div class="card-content"> - <form name="createclientform" novalidate="" class="form-horizontal" rc-submit="submit()"> - <api-validate></api-validate> - <fieldset> - <!--<legend>{{'label.heading.createclient' | translate}}</legend>--> - <div class="form-group"> - <label class="control-label col-sm-2"> - {{'label.input.office' | translate}} <span ng-show="forceOffice == null" - class="required">*</span> - </label> - <div class="col-sm-3"> - <div ng-show="forceOffice == null"> - <select chosen="offices" id="officeId" ng-model="formData.officeId" class="form-control" - ng-options="office.id as office.name for office in offices" value="{{office.id}}" - ng-change="changeOffice(formData.officeId)"></select> - </div> - <div ng-show="forceOffice != null"> - <p class="form-control-static">{{forceOffice.name}}</p> - </div> - </div> - <label class="control-label col-sm-2">{{'label.input.staff' | translate}}</label> - <div class="col-sm-3"> - <select chosen="staffs" id="staffId" ng-model="formData.staffId" class="form-control" - ng-options="staff.id as staff.displayName for staff in staffs" value="{{staff.id}}"> - <option value="">--{{'label.menu.selectloanofficer' | translate}}--</option> - </select> - </div> - </div> - <div class="form-group"> - <label class="control-label col-sm-2">{{'label.input.legalForm' | translate}}<span class="required">*</span></label> - <div class="col-sm-3"> - <select id="legalFormId" ng-model="formData.legalFormId" class="form-control" - ng-options="legalForm.id as legalForm.value for legalForm in clientLegalFormOptions" - value="{{legalForm.id}}" ng-change="displayPersonOrNonPersonOptions(formData.legalFormId)" late-Validate> - <option value="">--{{'label.menu.legalForm' | translate}}--</option> - </select> - </div> - </div> - <div data-ng-switch on="showNonPersonOptions"> - <div data-ng-switch-when="false"> + <ul class="breadcrumb"> + <li ng-if="!groupid"><a href="#/clients">{{'label.anchor.clients' | translate}}</a></li> + <li ng-if="groupid"><a href="#/groups">{{'label.anchor.groups' | translate}}</a></li> + <li ng-if="groupid"><a href="#/viewgroup/{{groupid}}">{{'label.anchor.viewgroup' | translate}}</a></li> + <li class="active">{{'label.anchor.createclient' | translate}}</li> + </ul> + <wizard current-step="step" class="card well"> + <wz-step icon="fa fa-circle-o" wz-title="{{'label.heading.createclient' | translate}}"> + <div class="card-content"> + <form name="createclientform" novalidate="" class="form-horizontal" rc-submit="submit()"> + <api-validate></api-validate> + <fieldset> + <!--<legend>{{'label.heading.createclient' | translate}}</legend>--> <div class="form-group"> - <label class="control-label col-sm-2" for="firstname">{{ 'label.input.firstname' | translate - }}<span class="required">*</span></label> - <div class="col-sm-3"> - <input type="text" id="firstname" name="firstname" ng-model="formData.firstname" - class="form-control" required ng-pattern="/(^[A-z])[A-z.'-]*/" late-Validate /> - </div> - <div class="col-sm-2"> + <label class="control-label col-sm-2"> + {{'label.input.office' | translate}} <span ng-show="forceOffice == null" + class="required">*</span> + </label> + <div class="col-sm-3"> + <div ng-show="forceOffice == null"> + <select chosen="offices" id="officeId" ng-model="formData.officeId" + class="form-control" + ng-options="office.id as office.name for office in offices" + value="{{office.id}}" + ng-change="changeOffice(formData.officeId)"></select> + </div> + <div ng-show="forceOffice != null"> + <p class="form-control-static">{{forceOffice.name}}</p> + </div> + </div> + <label class="control-label col-sm-2">{{'label.input.staff' | translate}}</label> + <div class="col-sm-3"> + <select chosen="staffs" id="staffId" ng-model="formData.staffId" class="form-control" + ng-options="staff.id as staff.displayName for staff in staffs" + value="{{staff.id}}"> + <option value="">--{{'label.menu.selectloanofficer' | translate}}--</option> + </select> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2">{{'label.input.legalForm' | translate}}<span + class="required">*</span></label> + <div class="col-sm-3"> + <select id="legalFormId" ng-model="formData.legalFormId" class="form-control" + ng-options="legalForm.id as legalForm.value for legalForm in clientLegalFormOptions" + value="{{legalForm.id}}" + ng-change="displayPersonOrNonPersonOptions(formData.legalFormId)" late-Validate> + <option value="">--{{'label.menu.legalForm' | translate}}--</option> + </select> + </div> + </div> + <div data-ng-switch on="showNonPersonOptions"> + <div data-ng-switch-when="false"> + <div class="form-group"> + <label class="control-label col-sm-2" + for="firstname">{{ 'label.input.firstname' | translate + }}<span class="required">*</span></label> + <div class="col-sm-3"> + <input type="text" id="firstname" name="firstname" ng-model="formData.firstname" + class="form-control" required ng-pattern="/(^[A-z])[A-z.'-]*/" + late-Validate/> + </div> + <div class="col-sm-2"> <span ng-show="createclientform.firstname.$invalid && createclientform.firstname.$dirty"> <small class="error required" ng-show="createclientform.firstname.$error.pattern"> {{'validation.msg.client.name.cannot.start.specialchar.ornumber' | translate}} </small> </span> - <form-validate valattributeform="createclientform" valattribute="firstname" /> - </div> + <form-validate valattributeform="createclientform" valattribute="firstname"/> + </div> + </div> + </div> </div> - </div> - </div> - <div data-ng-switch on="showNonPersonOptions"> - <div data-ng-switch-when="false"> - <div class="form-group"> - <label class="control-label col-sm-2" for="middlename">{{'label.input.middlename' | - translate}}</label> - <div class="col-sm-3"> - <input type="text" id="middlename" name="middlename" ng-model="formData.middlename" - class="form-control" ng-pattern="/(^[A-z])[A-z.'-]*/" /> - </div> - <div class="col-sm-2"> + <div data-ng-switch on="showNonPersonOptions"> + <div data-ng-switch-when="false"> + <div class="form-group"> + <label class="control-label col-sm-2" for="middlename">{{'label.input.middlename' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="middlename" name="middlename" + ng-model="formData.middlename" + class="form-control" ng-pattern="/(^[A-z])[A-z.'-]*/"/> + </div> + <div class="col-sm-2"> <span - ng-show="createclientform.middlename.$invalid && createclientform.middlename.$dirty"> + ng-show="createclientform.middlename.$invalid && createclientform.middlename.$dirty"> <small class="error required" ng-show="createclientform.middlename.$error.pattern"> {{'validation.msg.client.name.cannot.start.specialchar.ornumber' | translate}} </small> </span> - </div> - <label data-ng-switch on="showNonPersonOptions" class="control-label col-sm-2" - for="isStaff">{{ 'label.input.isStaff' | translate }}</label> - - <div data-ng-switch on="showNonPersonOptions" class="col-sm-3"> - <label class="checkbox"> - <input type="checkbox" id="isStaff" ng-model="formData.isStaff"> - </label> - </div> - </div> - </div> - </div> - <div data-ng-switch on="showNonPersonOptions"> - <div data-ng-switch-when="false"> - <div class="form-group"> - <label class="control-label col-sm-2" for="lastname">{{'label.input.lastname' | translate}} - <span class="required">*</span> - </label> - <div class="col-sm-3"> - <input type="text" id="lastname" name="lastname" ng-model="formData.lastname" - class="form-control" ng-pattern="/(^[A-z])[A-z.'-]*/" required late-Validate /> - </div> - <div class="col-sm-2"> + </div> + <label data-ng-switch on="showNonPersonOptions" class="control-label col-sm-2" + for="isStaff">{{ 'label.input.isStaff' | translate }}</label> + + <div data-ng-switch on="showNonPersonOptions" class="col-sm-3"> + <label class="checkbox"> + <input type="checkbox" id="isStaff" ng-model="formData.isStaff"> + </label> + </div> + </div> + </div> + </div> + <div data-ng-switch on="showNonPersonOptions"> + <div data-ng-switch-when="false"> + <div class="form-group"> + <label class="control-label col-sm-2" + for="lastname">{{'label.input.lastname' | translate}} + <span class="required">*</span> + </label> + <div class="col-sm-3"> + <input type="text" id="lastname" name="lastname" ng-model="formData.lastname" + class="form-control" ng-pattern="/(^[A-z])[A-z.'-]*/" required + late-Validate/> + </div> + <div class="col-sm-2"> <span ng-show="createclientform.lastname.$invalid && createclientform.lastname.$dirty"> <small class="error required" ng-show="createclientform.lastname.$error.pattern"> {{'validation.msg.client.name.cannot.start.specialchar.ornumber' | translate}} </small> </span> - <form-validate valattributeform="createclientform" valattribute="lastname" /> - </div> + <form-validate valattributeform="createclientform" valattribute="lastname"/> + </div> + </div> + </div> </div> - </div> - </div> - <div data-ng-switch on="showNonPersonOptions"> - <div data-ng-switch-when="true"> + + <div data-ng-switch on="showNonPersonOptions"> + <div data-ng-switch-when="false"> + <div class="form-group"> + <label class="control-label col-sm-2" + for="othernames">{{'label.input.othernames' | translate}} + <span class="required">*</span> + </label> + <div class="col-sm-3"> + <input type="text" id="othernames" name="othernames" ng-model="formData.othernames" + class="form-control" ng-pattern="/(^[A-z])[A-z.'-]*/" + late-Validate/> + </div> + <div class="col-sm-2"> + <span ng-show="createclientform.othernames.$invalid && createclientform.othernames.$dirty"> + <small class="error required" ng-show="createclientform.othernames.$error.pattern"> + {{'validation.msg.client.name.cannot.start.specialchar.ornumber' | translate}} + </small> + </span> + <form-validate valattributeform="createclientform" valattribute="othernames"/> + </div> + </div> + </div> + </div> + + <div data-ng-switch on="showNonPersonOptions"> + <div data-ng-switch-when="false"> + <div class="form-group"> + <label class="control-label col-sm-2" + for="maidenName">{{'label.input.maidenname' | translate}} + <span class="required">*</span> + </label> + <div class="col-sm-3"> + <input type="text" id="maidenName" name="maidenName" ng-model="formData.maidenName" + class="form-control" ng-pattern="/(^[A-z])[A-z.'-]*/" + late-Validate/> + </div> + <div class="col-sm-2"> + <span ng-show="createclientform.maidenName.$invalid && createclientform.maidenName.$dirty"> + <small class="error required" ng-show="createclientform.maidenName.$error.pattern"> + {{'validation.msg.client.name.cannot.start.specialchar.ornumber' | translate}} + </small> + </span> + <form-validate valattributeform="createclientform" valattribute="maidenName"/> + </div> + </div> + </div> + </div> + <div data-ng-switch on="showNonPersonOptions"> + <div data-ng-switch-when="true"> + <div class="form-group"> + <label class="control-label col-sm-2" for="fullname">{{'label.input.fullname' | + translate}}<span class="required">*</span></label> + <div class="col-sm-3"> + <input type="text" id="fullname" name="fullname" ng-model="formData.fullname" + class="form-control" ng-pattern="/(^[A-z])[A-z.'-]*/" required + late-Validate/> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="fullname"/> + </div> + </div> + </div> + </div> + <div class="form-group"> - <label class="control-label col-sm-2" for="fullname">{{'label.input.fullname' | - translate}}<span class="required">*</span></label> - <div class="col-sm-3"> - <input type="text" id="fullname" name="fullname" ng-model="formData.fullname" - class="form-control" ng-pattern="/(^[A-z])[A-z.'-]*/" required late-Validate /> - </div> - <div class="col-sm-2"> - <form-validate valattributeform="createclientform" valattribute="fullname" /> - </div> - </div> - </div> - </div> - <div class="form-group"> - <label class="control-label col-sm-2" for="mobileNo">{{'label.input.mobilenumber' | - translate}}</label> - <div class="col-sm-3"> - <input type="text" id="mobileNo" name="mobileNo" ng-model="formData.mobileNo" - ng-pattern="/^[0-9]+$/" class="form-control" /> - </div> - <div class="col-sm-2"> - <span ng-show="createclientform.mobileNo.$invalid && createclientform.mobileNo.$dirty"> - <small class="required" ng-show="createclientform.mobileNo.$error.pattern"> - {{'label.mustbenumeric' | translate}} - </small> - </span> - </div> - </div> - <div class="form-group"> - <label class="control-label col-sm-2" for="dpi">{{'label.input.dpi' | - translate}}<span class="required">*</span></label> - <div class="col-sm-3"> - <input type="text" id="dpi" name="dpi" ng-model="formData.dpi" - ng-pattern="/^[0-9]+$/" class="form-control" /> - </div> - <div class="col-sm-2"> + <label class="control-label col-sm-2" for="dpi">{{'label.input.dpi' | + translate}}<span class="required">*</span></label> + <div class="col-sm-3"> + <input type="text" id="dpi" name="dpi" ng-model="formData.dpi" + ng-pattern="/^[0-9]+$/" class="form-control"/> + </div> + <div class="col-sm-2"> <span ng-show="createclientform.dpi.$invalid && createclientform.dpi.$dirty"> <small class="required" ng-show="createclientform.dpi.$error.pattern"> {{'label.mustbenumeric' | translate}} </small> </span> - </div> - </div> - <div class="form-group"> - <label class="control-label col-sm-2" ng-hide="showNonPersonOptions">{{'label.input.dateofbirth' | - translate}}<span class="required">*</span></label> - <label class="control-label col-sm-2" - ng-show="showNonPersonOptions">{{'label.input.incorporationdate' | translate}}<span class="required">*</span></label> - <div class="col-sm-3"> - <input id="dateofbirth" type="text" name="dateofbirth" datepicker-pop="dd MMMM yyyy" - ng-model="first.dateOfBirth" is-open="opened1" required min="minDate" max="restrictDate" - class="form-control" /> - </div> - <div data-ng-switch on="showNonPersonOptions"> - <div data-ng-switch-when="false"> - <label class="control-label col-sm-2">{{'label.input.gender' | translate}}</label> - <div class="col-sm-3"> - <select id="genderId" ng-model="formData.genderId" class="form-control" - ng-options="gender.id as gender.name for gender in genderOptions" - value="{{gender.id}}"> - <option value="">--{{'label.menu.gender' | translate}}--</option> - </select> - </div> - </div> - </div> - <div data-ng-switch on="showNonPersonOptions"> - <div data-ng-switch-when="true"> - <label class="control-label col-sm-2">{{'label.input.incorpValidityTillDate' | - translate}}</label> - <div class="col-sm-3"> - <input id="incorpValidityTillDate" type="text" name="incorpValidityTillDate" - datepicker-pop="dd MMMM yyyy" ng-model="first.incorpValidityTillDate" is-open="opened1" - class="form-control" /> - </div> - </div> - </div> - </div> - <div class="form-group"> - <label class="control-label col-sm-2">{{'label.input.clienttype' | translate}}</label> - <div class="col-sm-3"> - <select id="clienttypeId" ng-model="formData.clientTypeId" class="form-control" - ng-options="clienttype.id as clienttype.name for clienttype in clienttypeOptions" - value="{{clienttype.id}}"> - <option value="">--{{'label.menu.clienttype' | translate}}--</option> - </select> - </div> - <label class="control-label col-sm-2">{{'label.input.clientclassification' | translate}}</label> - <div class="col-sm-3"> - <select id="clientClassificationId" ng-model="formData.clientClassificationId" - class="form-control" - ng-options="clientClassification.id as clientClassification.name for clientClassification in clientClassificationOptions" - value="{{clientClassification.id}}"> - <option value="">--{{'label.menu.clientclassification' | translate}}--</option> - </select> - </div> - </div> - <div data-ng-switch on="showNonPersonOptions"> - <div data-ng-switch-when="true"> - <div class="form-group"> - <label class="control-label col-sm-2" for="incorpNumber">{{'label.input.incorpNumber' | - translate}}</label> - <div class="col-sm-3"> - <input type="text" id="incorpNumber" - ng-model="formData.clientNonPersonDetails.incorpNumber" class="form-control" /> - </div> - <label class="control-label col-sm-2">{{'label.input.mainBusinessLine' | translate}}</label> - <div class="col-sm-3"> - <select id="mainBusinessLineId" - ng-model="formData.clientNonPersonDetails.mainBusinessLineId" class="form-control" - ng-options="mainBusinessLine.id as mainBusinessLine.name for mainBusinessLine in clientNonPersonMainBusinessLineOptions" - value="{{mainBusinessLine.id}}"> - <option value="">--{{'label.menu.mainBusinessLine' | translate}}--</option> - </select> - </div> - </div> - </div> - </div> - <div data-ng-switch on="showNonPersonOptions"> - <div data-ng-switch-when="true"> + </div> + </div> <div class="form-group"> - <label class="control-label col-sm-2">{{'label.input.constitution' | translate}}<span - class="required"></span></label> - <div class="col-sm-3"> - <select id="constitutionId" name="constitution" - ng-model="formData.clientNonPersonDetails.constitutionId" class="form-control" - ng-options="constitution.id as constitution.name for constitution in clientNonPersonConstitutionOptions" - value="{{constitution.id}}"> - <option value="">--{{'label.menu.constitution' | translate}}--</option> - </select> - </div> - <div class="col-sm-2"> - </div> - </div> - </div> - </div> - <div data-ng-switch on="showNonPersonOptions"> - <div data-ng-switch-when="true"> + <label class="control-label col-sm-2" + ng-hide="showNonPersonOptions">{{'label.input.dateofbirth' | + translate}}<span class="required">*</span></label> + <label class="control-label col-sm-2" + ng-show="showNonPersonOptions">{{'label.input.incorporationdate' | translate}}<span + class="required">*</span></label> + <div class="col-sm-3"> + <input id="dateofbirth" type="text" name="dateofbirth" datepicker-pop="dd MMMM yyyy" + ng-model="first.dateOfBirth" is-open="opened1" required min="minDate" + max="restrictDate" + class="form-control"/> + </div> + <div data-ng-switch on="showNonPersonOptions"> + <div data-ng-switch-when="false"> + <label class="control-label col-sm-2">{{'label.input.gender' | translate}}</label> + <div class="col-sm-3"> + <select id="genderId" ng-model="formData.genderId" class="form-control" + ng-options="gender.id as gender.name for gender in genderOptions" + value="{{gender.id}}"> + <option value="">--{{'label.menu.gender' | translate}}--</option> + </select> + </div> + </div> + </div> + <div data-ng-switch on="showNonPersonOptions"> + <div data-ng-switch-when="true"> + <label class="control-label col-sm-2">{{'label.input.incorpValidityTillDate' | + translate}}</label> + <div class="col-sm-3"> + <input id="incorpValidityTillDate" type="text" name="incorpValidityTillDate" + datepicker-pop="dd MMMM yyyy" ng-model="first.incorpValidityTillDate" + is-open="opened1" + class="form-control"/> + </div> + </div> + </div> + </div> <div class="form-group"> - <label class="control-label col-sm-2" for="remarks">{{'label.input.remarks' | - translate}}</label> - <div class="col-sm-3"> - <textarea type="text" id="remarks" ng-model="formData.clientNonPersonDetails.remarks" - rows="4" class="form-control" /> - </div> - </div> - </div> - </div> - <div class="form-group"> - <label class="control-label col-sm-2" for="externalId">{{'label.input.externalid' | - translate}}</label> - <div class="col-sm-3"> - <input type="text" id="externalId" name="externalId" ng-model="formData.externalId" - class="form-control" /> - </div> - </div> - - <div class="form-group"> - <label class="control-label col-sm-2" for="oldCustNumber">{{'label.input.old.customer.number' | - translate}}</label> - <div class="col-sm-3"> - <input type="text" id="oldCustNumber" name="oldCustNumber" ng-model="formData.oldCustomerNumber" - class="form-control" /> - </div> - </div> - <div class="form-group" has-permission="ACTIVATE_CLIENT"> - <label class="control-label col-sm-2">{{'label.input.active' | translate}}</label> - <div class="col-sm-3"> - <input id="activeCheckbox" type="checkbox" ng-model="formData.active" - data-ng-change="setChoice()"> - </div> - <div data-ng-switch on="choice"> - <div data-ng-switch-when="1"> - <label class="control-label col-sm-2">{{'label.input.activationdate' | translate}}<span - class="required">*</span></label> - <div class="col-sm-3"> - <input id="activationDate" type="text" name="activationdate" datepicker-pop="dd MMMM yyyy" - ng-model="first.date" is-open="opened" min="'2000-01-01'" max="restrictDate" - class="form-control" /> - </div> - </div> - </div> - </div> - <div class="form-group"> - <label class="control-label col-sm-2">{{'label.input.submittedon' | translate}}</label> - <div class="col-sm-3"> - <input id="submittedon" type="text" name="submittedon" datepicker-pop="dd MMMM yyyy" - ng-model="first.submitondate" is-open="opened1" min="'2000-01-01'" max="restrictDate" - class="form-control" /> - </div> - </div> - <div class="form-group" ng-show="showSavingOptions"> - <label class="control-label col-sm-2">{{ 'label.input.opensavingsproduct' | translate - }} </label> - <div class="col-sm-3"> - <input id="opensavingsproduct" type="checkbox" ng-model="savings.opensavingsproduct" - ng-true-value="true" ng-false-value="false"> - </div> - <div ng-show="savings.opensavingsproduct"> - <label class="control-label col-sm-2">{{'label.input.savingproduct' | translate}}</label> - <div class="col-sm-3"> - <select id="savingsProductId" ng-model="formData.savingsProductId" - ng-options="savingProduct.id as savingProduct.name for savingProduct in savingproducts" - value="{{savingProduct.id}}" class="form-control"> - <option value="">--{{'label.menu.selectsavingproduct' | translate}}--</option> - </select> + <label class="control-label col-sm-2">{{'label.input.clienttype' | translate}}</label> + <div class="col-sm-3"> + <select id="clienttypeId" ng-model="formData.clientTypeId" class="form-control" + ng-options="clienttype.id as clienttype.name for clienttype in clienttypeOptions" + value="{{clienttype.id}}"> + <option value="">--{{'label.menu.clienttype' | translate}}--</option> + </select> + </div> + <label class="control-label col-sm-2">{{'label.input.clientclassification' | translate}}</label> + <div class="col-sm-3"> + <select id="clientClassificationId" ng-model="formData.clientClassificationId" + class="form-control" + ng-options="clientClassification.id as clientClassification.name for clientClassification in clientClassificationOptions" + value="{{clientClassification.id}}"> + <option value="">--{{'label.menu.clientclassification' | translate}}--</option> + </select> + </div> + </div> + <div data-ng-switch on="showNonPersonOptions"> + <div data-ng-switch-when="true"> + <div class="form-group"> + <label class="control-label col-sm-2" + for="incorpNumber">{{'label.input.incorpNumber' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="incorpNumber" + ng-model="formData.clientNonPersonDetails.incorpNumber" + class="form-control"/> + </div> + <label class="control-label col-sm-2">{{'label.input.mainBusinessLine' | translate}}</label> + <div class="col-sm-3"> + <select id="mainBusinessLineId" + ng-model="formData.clientNonPersonDetails.mainBusinessLineId" + class="form-control" + ng-options="mainBusinessLine.id as mainBusinessLine.name for mainBusinessLine in clientNonPersonMainBusinessLineOptions" + value="{{mainBusinessLine.id}}"> + <option value="">--{{'label.menu.mainBusinessLine' | translate}}--</option> + </select> + </div> + </div> + </div> </div> - </div> - </div> - <div class="form-group"> - <div class="form-group"> - <div class="control-label col-sm-3"> - <h3><strong>{{ 'label.heading.familymembers' | translate }}</strong> <a - ng-click="addFamilyMember()"><i class="fa fa-plus" - title="{{'label.button.addfamilymember' | translate}}"></i></a></h3> + <div data-ng-switch on="showNonPersonOptions"> + <div data-ng-switch-when="true"> + <div class="form-group"> + <label class="control-label col-sm-2">{{'label.input.constitution' | translate}}<span + class="required"></span></label> + <div class="col-sm-3"> + <select id="constitutionId" name="constitution" + ng-model="formData.clientNonPersonDetails.constitutionId" + class="form-control" + ng-options="constitution.id as constitution.name for constitution in clientNonPersonConstitutionOptions" + value="{{constitution.id}}"> + <option value="">--{{'label.menu.constitution' | translate}}--</option> + </select> + </div> + <div class="col-sm-2"> + </div> + </div> + </div> </div> + <div data-ng-switch on="showNonPersonOptions"> + <div data-ng-switch-when="true"> + <div class="form-group"> + <label class="control-label col-sm-2" for="remarks">{{'label.input.remarks' | + translate}}</label> + <div class="col-sm-3"> + <textarea type="text" id="remarks" ng-model="formData.clientNonPersonDetails.remarks" + rows="4" class="form-control"/> + </div> + </div> + </div> + </div> + - </div> - <div ng-repeat="family in familyArray"> <div class="form-group"> - <div class="control-label col-sm-2"> - <label>{{ 'label.input.relationship' | translate }}<span class="required">*</span></label> - </div> - <div class="col-sm-3"> - <select chosen="relationshipIdOptions" id="relationshipIdOption" - ng-model="familyArray[$index].relationshipId" class="form-control" - ng-options="relationshipIdOption.id as relationshipIdOption.name for relationshipIdOption in relationshipIdOptions track by relationshipIdOption.id" - value="formData.relationshipId"></select> - </div> - <div class="col-sm-2"> - <form-validate valattributeform="createclientform" valattribute="addressType" /> - </div> - <a ng-click="removeFamilyMember($index)" uib-tooltip="{{'label.remove.row' | translate}}"><i - class="fa fa-times"></i></a> + <label class="control-label col-sm-2" for="externalId">{{'label.input.externalid' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="externalId" name="externalId" ng-model="formData.externalId" + class="form-control"/> + </div> + + <label class="control-label col-sm-2" for="externalId">{{'label.input.loanCycle' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="loanCycle" name="loanCycle" ng-model="formData.loanCycle" required late-validate + class="form-control"/> + </div> </div> + <div class="form-group"> + <label class="control-label col-sm-2" + for="oldCustNumber">{{'label.input.old.customer.number' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="oldCustNumber" name="oldCustNumber" + ng-model="formData.oldCustomerNumber" + class="form-control"/> + </div> + </div> <div class="form-group"> - <label class="control-label col-sm-2" for="firstName">{{'label.input.firstname' | translate - }}</label> + <label class="control-label col-sm-2" + for="groupmem">{{'label.input.groupno' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="groupno" name="groupno" + ng-model="formData.groupNumber" + class="form-control"/> + </div> - <div class="col-sm-3"> - <input type="text" id="firstName" name="firstName" - ng-model="familyArray[$index].firstName" class="form-control"> - </div> + <label class="control-label col-sm-2" + for="groupmem">{{'label.input.groupmember' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="groupmem" name="groupme" + ng-model="formData.groupMember" + class="form-control"/> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-2" + for="groupmem">{{'label.input.statusingroup' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="groupstatus" name="groupstatus" + ng-model="formData.statusInGroup" + class="form-control"/> + </div> + <label class="control-label col-sm-2" + for="groupmem">{{'label.input.retirementreason' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="retReason" name="retReason" + ng-model="formData.retirementReason" + class="form-control"/> + </div> </div> <div class="form-group"> - <label class="control-label col-sm-2" for="middleName">{{'label.input.middlename' | translate - }}</label> + <label class="control-label col-sm-2" + for="civilstatus">{{'label.input.civilstatus' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="civilstatus" name="civilstatus" + ng-model="formData.civilStatus" + class="form-control"/> + </div> - <div class="col-sm-3"> - <input type="text" id="middleName" name="middleName" - ng-model="familyArray[$index].middleName" class="form-control"> - </div> + <label class="control-label col-sm-2" + for="education">{{'label.input.education' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="education" name="education" + ng-model="formData.educationLevel" + class="form-control"/> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2" + for="ethinicity">{{'label.input.ethinicity' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="ethinicity" name="ethinicity" + ng-model="formData.ethinicity" + class="form-control"/> + </div> + <label class="control-label col-sm-2" + for="nationality">{{'label.input.nationality' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="nationality" name="nationality" + ng-model="formData.nationality" + class="form-control"/> + </div> </div> <div class="form-group"> - <label class="control-label col-sm-2" for="lastName">{{'label.input.lastname' | translate - }}</label> + <label class="control-label col-sm-2" + for="languages">{{'label.input.languages' | + translate}}</label> + <div class="col-sm-3"> + <textarea type="text" rows="3" id="languages" name="languages" + ng-model="formData.languages" + class="form-control"></textarea> + </div> + + <label class="control-label col-sm-2" ng-if="economicSectorOptions" + for="econSector">{{'label.input.economicsector' | + translate}}</label> + <div class="col-sm-3" ng-if="economicSectorOptions"> + <select chosen="sector" id="econSector" ng-model="formData.economicSector" class="form-control" + ng-options="sector.id as sector.name for sector in economicSectorOptions" ng-change="updateActivities()" + value="{{sector.id}}"> + <option value="">--{{'label.input.economicsector' | translate}}--</option> + </select> + </div> + </div> - <div class="col-sm-3"> - <input type="text" id="lastName" name="lastName" ng-model="familyArray[$index].lastName" - class="form-control"> - </div> + <div class="form-group" ng-if="formData.economicSector && economicActivityOptions"> + <label class="control-label col-sm-2" + for="languages">{{'label.input.economicactivity' | + translate}}</label> + <div class="col-sm-3"> + <select chosen="economicActivity" id="" ng-model="formData.economicActivity" class="form-control" + ng-options="activity.id as activity.name for activity in economicActivityOptions" + value="{{activity.id}}"> + <option value="">--{{'label.input.economicactivity' | translate}}--</option> + </select> + </div> + <label class="control-label col-sm-2" + for="familyReference">{{'label.input.familyreference' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" rows="3" id="familyReference" name="familyReference" + ng-model="formData.familyReference" + class="form-control"/> + </div> </div> + <div class="form-group" has-permission="ACTIVATE_CLIENT"> + <label class="control-label col-sm-2">{{'label.input.active' | translate}}</label> + <div class="col-sm-3"> + <input id="activeCheckbox" type="checkbox" ng-model="formData.active" + data-ng-change="setChoice()"> + </div> + <div data-ng-switch on="choice"> + <div data-ng-switch-when="1"> + <label class="control-label col-sm-2">{{'label.input.activationdate' | translate}}<span + class="required">*</span></label> + <div class="col-sm-3"> + <input id="activationDate" type="text" name="activationdate" + datepicker-pop="dd MMMM yyyy" + ng-model="first.date" is-open="opened" min="'2000-01-01'" + max="restrictDate" + class="form-control"/> + </div> + </div> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2">{{'label.input.submittedon' | translate}}</label> + <div class="col-sm-3"> + <input id="submittedon" type="text" name="submittedon" datepicker-pop="dd MMMM yyyy" + ng-model="first.submitondate" is-open="opened1" min="'2000-01-01'" + max="restrictDate" + class="form-control"/> + </div> + </div> + <div class="form-group" ng-show="showSavingOptions"> + <label class="control-label col-sm-2">{{ 'label.input.opensavingsproduct' | translate + }} </label> + <div class="col-sm-3"> + <input id="opensavingsproduct" type="checkbox" ng-model="savings.opensavingsproduct" + ng-true-value="true" ng-false-value="false"> + </div> + <div ng-show="savings.opensavingsproduct"> + <label class="control-label col-sm-2">{{'label.input.savingproduct' | translate}}</label> + <div class="col-sm-3"> + <select id="savingsProductId" ng-model="formData.savingsProductId" + ng-options="savingProduct.id as savingProduct.name for savingProduct in savingproducts" + value="{{savingProduct.id}}" class="form-control"> + <option value="">--{{'label.menu.selectsavingproduct' | translate}}--</option> + </select> + </div> + </div> + </div> + <hr/> <div class="form-group"> - <label class="control-label col-sm-2" for="qualification">{{ 'label.input.qualification' | - translate }}</label> + <div class="form-group"> + <div class="control-label col-sm-3"> + <h3><strong>{{ 'label.heading.contact.information' | translate }}</strong> </h3> + </div> + </div> + <div> + <div class="form-group"> + <div class="control-label col-sm-2"> + <label>{{ 'label.input.client.area' | translate }}<span + class="required">*</span></label> + </div> + <div class="col-sm-3"> + <select id="clientArea" + ng-model="formData.clientArea" class="form-control" required="required" + ng-options="area.id as area.name for area in clientAreaOptions " + value="{{area.id}}"></select> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="clientArea"/> + </div> + </div> - <div class="col-sm-3"> - <input type="text" id="qualification" name="qualification" - ng-model="familyArray[$index].qualification" class="form-control"> - </div> + <div class="form-group"> + <div class="control-label col-sm-2"> + <label>{{ 'label.input.client.housingtype' | translate }}<span + class="required">*</span></label> + </div> + <div class="col-sm-3"> + <select id="housing" + ng-model="formData.housingTypeId" class="form-control" required="required" + ng-options="housing.id as housing.name for housing in housingTypeOptions " + value="{{housing.id}}"></select> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="housing"/> + </div> + </div> - </div> + <div class="form-group"> + <label class="control-label col-sm-2">{{ 'label.input.residenceYears' | translate }}<span + class="required">*</span> + </label> + <div class="col-sm-3"> + <input type="text" id="residenceYears" class="form-control" name="residenceYears" + ng-model="formData.residenceYears" required late-validate number=true/> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="residenceYears"></form-validate> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2">{{ 'label.input.communityYears' | translate }}<span + class="required">*</span> + </label> + <div class="col-sm-3"> + <input type="text" id="communityYears" class="form-control" name="communityYears" + ng-model="formData.communityYears" required late-validate number=true/> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="residenceYears"></form-validate> + </div> + </div> - <div class="form-group"> - <label class="control-label col-sm-2" for="mobileNumber">{{ 'label.input.mobileNumber' | - translate }}</label> + <div class="form-group"> + <div class="control-label col-sm-2"> + <label>{{ 'label.input.client.publicservice' | translate }}<span + class="required">*</span></label> + </div> + <div class="col-sm-3"> + <table> + <tr ng-repeat="publicServiceOption in publicServiceOptions"> + <td> + <input id="{{publicServiceOption.id}}" type="checkbox" name='publicService' data-ng-model="publicServiceChecks[publicServiceOption.id]" data-ng-change="checkPublicService(publicServiceOption.id)"> + <label>{{publicServiceOption.name}}</label> + </td> + </tr> + </table> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="publicService"></form-validate> + </div> + </div> - <div class="col-sm-3"> - <input type="text" id="mobileNumber" name="mobileNumber" - ng-model="familyArray[$index].mobileNumber" class="form-control"> - </div> + <div class="form-group"> + <div class="control-label col-sm-2"> + <label>{{ 'label.input.client.department' | translate }}<span + class="required">*</span></label> + </div> + <div class="col-sm-3"> + <select id="department" + ng-model="formData.departmentId" class="form-control" required="required" + ng-options="department.id as department.name for department in departamentoOptions " + value="{{department.id}}"></select> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="department"/> + </div> + </div> - </div> + <div class="form-group"> + <div class="control-label col-sm-2"> + <label>{{ 'label.input.client.municipal' | translate }}<span + class="required">*</span></label> + </div> + <div class="col-sm-3"> + <select id="municipal" + ng-model="formData.municipalId" class="form-control" required="required" + ng-options="municipal.id as municipal.name for municipal in municipioOptions " + value="{{municipal.id}}"></select> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="municipal"/> + </div> + </div> - <div class="form-group"> - <label class="control-label col-sm-2" for="age">{{ 'label.input.age' | translate }}</label> + <div class="form-group"> + <label class="control-label col-sm-2" + for="village">{{ 'label.input.village' | translate }}</label> + <div class="col-sm-3"> + <input type="text" id="village" name="village" ng-model="formData.village" + class="form-control"> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="village"/> + </div> + </div> - <div class="col-sm-3"> - <input type="text" id="age" name="age" ng-model="familyArray[$index].age" - class="form-control"> - </div> + <div class="form-group"> + <label class="control-label col-sm-2" + for="reference">{{ 'label.input.referencedata' | translate }}</label> + <div class="col-sm-3"> + <input type="text" id="reference" name="reference" + ng-model="formData.referenceData" + class="form-control"> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="reference"/> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2" + for="reference">{{ 'label.input.street' | translate }}</label> + <div class="col-sm-3"> + <input type="text" id="street" name="street" ng-model="formData.street" + class="form-control"> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="street"/> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2" + for="reference">{{ 'label.input.avenue' | translate }}</label> + <div class="col-sm-3"> + <input type="text" id="avenue" name="avenue" ng-model="formData.avenue" + class="form-control"> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="avenue"/> + </div> + </div> - </div> + <div class="form-group"> + <label class="control-label col-sm-2" + for="reference">{{ 'label.input.streetNumber' | translate }}</label> + <div class="col-sm-3"> + <input type="text" id="streetNumber" name="street" ng-model="formData.streetNumber" + class="form-control"> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="streetNumber"/> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2" + for="reference">{{ 'label.input.colony' | translate }}</label> + <div class="col-sm-3"> + <input type="text" id="colony" name="colony" ng-model="formData.colony" + class="form-control"> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="colony"/> + </div> + </div> - <div class="form-group"> - <label class="control-label col-sm-2" for="isDependent">{{ 'label.input.isDependent' | - translate }}</label> + <div class="form-group"> + <label class="control-label col-sm-2" + for="reference">{{ 'label.input.sector' | translate }}</label> + <div class="col-sm-3"> + <input type="text" id="sector" name="sector" ng-model="formData.sector" + class="form-control"> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="sector"/> + </div> + </div> - <div class="col-sm-3"> - <input type="checkbox" class="input-mini-small" id="isDependent" name="isDependent" - ng-model="familyArray[$index].isDependent"> - </div> + <div class="form-group"> + <label class="control-label col-sm-2" + for="reference">{{ 'label.input.batch' | translate }}</label> + <div class="col-sm-3"> + <input type="text" id="batch" name="batch" ng-model="formData.batch" + class="form-control"> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="batch"/> + </div> + </div> - </div> + <div class="form-group"> + <label class="control-label col-sm-2" + for="reference">{{ 'label.input.square' | translate }}</label> + <div class="col-sm-3"> + <input type="text" id="square" name="square" ng-model="formData.square" + class="form-control"> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="square"/> + </div> + </div> - <div class="form-group"> - <div class="control-label col-sm-2"> - <label>{{ 'label.input.gender' | translate }}</label> - </div> - <div class="col-sm-3"> - <select chosen="genderIdOptions" id="genderIdOption" - ng-model="familyArray[$index].genderId" class="form-control" - ng-options="genderIdOption.id as genderIdOption.name for genderIdOption in genderIdOptions track by genderIdOption.id" - value="formData.genderId"></select> - </div> - </div> + <div class="form-group"> + <label class="control-label col-sm-2" + for="reference">{{ 'label.input.zone' | translate }}</label> + <div class="col-sm-3"> + <input type="text" id="zone" name="zone" ng-model="formData.zone" + class="form-control"> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="zone"/> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2" + for="reference">{{ 'label.input.lightDeviceNumber' | translate }}</label> + <div class="col-sm-3"> + <input type="text" id="lightDeviceNumber" name="lightDeviceNumber" + ng-model="formData.lightDeviceNumber" + class="form-control"> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="lightDeviceNumber"></form-validate> + </div> + </div> - <div class="form-group"> - <div class="control-label col-sm-2"> - <label>{{ 'label.input.profession' | translate }}</label> - </div> - <div class="col-sm-3"> - <select chosen="professionIdOptions" id="professionIdOption" - ng-model="familyArray[$index].professionId" class="form-control" - ng-options="professionIdOption.id as professionIdOption.name for professionIdOption in professionIdOptions track by professionIdOption.id" - value="formData.professionId"></select> - </div> - </div> + <div class="form-group"> + <label class="control-label col-sm-2" for="mobileNo">{{'label.input.mobilenumber' | + translate}}<span class="required">*</span></label> + <div class="col-sm-3"> + <input type="text" id="mobileNo" name="mobileNo" ng-model="formData.mobileNo" required="required" class="form-control"/> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="mobileNo"/> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2" for="homeNumber">{{'label.input.homeNumber' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="homeNumber" name="homeNumber" ng-model="formData.homeNumber" class="form-control"/> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="homeNumber"/> + </div> + </div> + + </div> - <div class="form-group"> - <div class="control-label col-sm-2"> - <label>{{ 'label.input.maritalstatus' | translate }}</label> - </div> - <div class="col-sm-3"> - <select chosen="maritalStatusIdOptions" id="maritalStatusId" - ng-model="familyArray[$index].maritalStatusId" class="form-control" - ng-options="maritalStatusIdOption.id as maritalStatusIdOption.name for maritalStatusIdOption in maritalStatusIdOptions track by maritalStatusIdOption.id" - value="formData.maritalStatusId"></select> - </div> </div> <div class="form-group"> - <label class="control-label col-sm-2" for="dateofbirth">{{ 'label.input.dateofbirth' | - translate }}</label> + <div class="form-group"> + <div class="control-label col-sm-3"> + <h3><strong>{{ 'label.heading.familymembers' | translate }}</strong> <a + ng-click="addFamilyMember()"><i class="fa fa-plus" + title="{{'label.button.addfamilymember' | translate}}"></i></a> + </h3> + </div> - <div class="col-sm-3"> - <input id="dateofbirth" type="text" name="dateofbirth" datepicker-pop="dd MMMM yyyy" - ng-model="familyArray[$index].dateOfBirth" is-open="opened1" min="minDate " - max="restrictDate" class="form-control" /> - </div> + </div> - </div> + <div ng-repeat="family in familyArray"> + + <div class="form-group"> + <div class="control-label col-sm-2"> + <label>{{ 'label.input.relationship' | translate }}<span + class="required">*</span></label> + </div> + <div class="col-sm-3"> + <select chosen="relationshipIdOptions" id="relationshipIdOption" + ng-model="familyArray[$index].relationshipId" class="form-control" + ng-options="relationshipIdOption.id as relationshipIdOption.name for relationshipIdOption in relationshipIdOptions track by relationshipIdOption.id" + value="formData.relationshipId"></select> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="addressType"/> + </div> + <a ng-click="removeFamilyMember($index)" + uib-tooltip="{{'label.remove.row' | translate}}"><i + class="fa fa-times"></i></a> + </div> + + + <div class="form-group"> + <label class="control-label col-sm-2" + for="firstName">{{'label.input.firstname' | translate + }}</label> + + <div class="col-sm-3"> + <input type="text" id="firstName" name="firstName" + ng-model="familyArray[$index].firstName" class="form-control"> + </div> + + </div> + + <div class="form-group"> + <label class="control-label col-sm-2" + for="middleName">{{'label.input.middlename' | translate + }}</label> + + <div class="col-sm-3"> + <input type="text" id="middleName" name="middleName" + ng-model="familyArray[$index].middleName" class="form-control"> + </div> + + </div> + + <div class="form-group"> + <label class="control-label col-sm-2" + for="lastName">{{'label.input.lastname' | translate + }}</label> + + <div class="col-sm-3"> + <input type="text" id="lastName" name="lastName" + ng-model="familyArray[$index].lastName" + class="form-control"> + </div> + + </div> + + + <div class="form-group"> + <label class="control-label col-sm-2" + for="qualification">{{ 'label.input.qualification' | + translate }}</label> + + <div class="col-sm-3"> + <input type="text" id="qualification" name="qualification" + ng-model="familyArray[$index].qualification" class="form-control"> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2" + for="mobileNumber">{{ 'label.input.mobileNumber' | + translate }}</label> + <div class="col-sm-3"> + <input type="text" id="mobileNumber" name="mobileNumber" + ng-model="familyArray[$index].mobileNumber" class="form-control"> + </div> + </div> - </div> + <div class="form-group"> + <label class="control-label col-sm-2" for="age">{{ 'label.input.age' | translate + }}</label> - </div> + <div class="col-sm-3"> + <input type="text" id="age" name="age" ng-model="familyArray[$index].age" + class="form-control"> + </div> + + </div> + + <div class="form-group"> + <label class="control-label col-sm-2" + for="isDependent">{{ 'label.input.isDependent' | + translate }}</label> + + <div class="col-sm-3"> + <input type="checkbox" class="input-mini-small" id="isDependent" + name="isDependent" + ng-model="familyArray[$index].isDependent"> + </div> + + </div> + + <div class="form-group"> + <div class="control-label col-sm-2"> + <label>{{ 'label.input.gender' | translate }}</label> + </div> + <div class="col-sm-3"> + <select chosen="genderIdOptions" id="genderIdOption" + ng-model="familyArray[$index].genderId" class="form-control" + ng-options="genderIdOption.id as genderIdOption.name for genderIdOption in genderIdOptions track by genderIdOption.id" + value="formData.genderId"></select> + </div> + </div> + + + <div class="form-group"> + <div class="control-label col-sm-2"> + <label>{{ 'label.input.profession' | translate }}</label> + </div> + <div class="col-sm-3"> + <select chosen="professionIdOptions" id="professionIdOption" + ng-model="familyArray[$index].professionId" class="form-control" + ng-options="professionIdOption.id as professionIdOption.name for professionIdOption in professionIdOptions track by professionIdOption.id" + value="formData.professionId"></select> + </div> + </div> + + + <div class="form-group"> + <div class="control-label col-sm-2"> + <label>{{ 'label.input.maritalstatus' | translate }}</label> + </div> + <div class="col-sm-3"> + <select chosen="maritalStatusIdOptions" id="maritalStatusId" + ng-model="familyArray[$index].maritalStatusId" class="form-control" + ng-options="maritalStatusIdOption.id as maritalStatusIdOption.name for maritalStatusIdOption in maritalStatusIdOptions track by maritalStatusIdOption.id" + value="formData.maritalStatusId"></select> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-2" + for="dateofbirth">{{ 'label.input.dateofbirth' | + translate }}</label> + + <div class="col-sm-3"> + <input id="dateofbirth" type="text" name="dateofbirth" + datepicker-pop="dd MMMM yyyy" + ng-model="familyArray[$index].dateOfBirth" is-open="opened1" + min="minDate " + max="restrictDate" class="form-control"/> + </div> + + </div> + + + </div> - <div ng-show="enableAddress" class="form-group"> - <div class="form-group"> - <div class="control-label col-sm-2"> - <h3><strong>{{ 'label.input.address' | translate }}</strong> <a - ng-click="addAddress()"><i class="fa fa-plus" - title="{{'label.button.addAddress' | translate}}"></i></a></h3> </div> - </div> - <div ng-repeat="addr in addressArray"> - <div class="form-group"> - <div class="control-label col-sm-2"> - <label>{{ 'label.input.addressType' | translate }}<span class="required">*</span></label> - </div> - <div class="col-sm-3"> - <select chosen="addressTypes" name="addressType" - ng-model="addressArray[$index].addressTypeId" class="form-control" - ng-options="addressType.id as addressType.name for addressType in addressTypes " - value="addressTypeId" required late-validate></select> - </div> - <div class="col-sm-2"> - <form-validate valattributeform="createclientform" valattribute="addressType" /> - </div> - <a ng-click="removeAddress($index)" uib-tooltip="{{'label.remove.row' | translate}}"><i - class="fa fa-times"></i></a> - </div> - <div class="form-group" ng-show="street"> - <div class="control-label col-sm-2"> - <label>{{ 'label.input.street' | translate }}</label> - </div> - <div class="col-sm-3"> - <input type="text" name="street" ng-model="addressArray[$index].street" - class="form-control" late-validate /> - </div> - <div class="col-sm-2"> - <form-validate valattributeform="createclientform" valattribute="street" /> - </div> - </div> - - - <div class="form-group" ng-show="addressLine1"> - <label class="control-label col-sm-2">{{ 'label.input.addressline1' | translate }}</label> - <div class="col-sm-3"> - <input type="text" name="addressline1" ng-model="addressArray[$index].addressLine1" - class="form-control"> - </div> - </div> - <div class="form-group" ng-show="addressLine2"> - <label class="control-label col-sm-2">{{ 'label.input.addressline2' | translate }}</label> - <div class="col-sm-3"> - <input type="text" name="addressline2" ng-model="addressArray[$index].addressLine2" - class="form-control"> - </div> - </div> - <div class="form-group" ng-show="addressLine3"> - <label class="control-label col-sm-2">{{ 'label.input.addressline3' | translate }}</label> - <div class="col-sm-3"> - <input type="text" name="addressline3" ng-model="addressArray[$index].addressLine3" - class="form-control"> - </div> - </div> - - <div class="form-group" ng-show="city"> - <label class="control-label col-sm-2">{{ 'label.input.city' | translate }}</label> - <div class="col-sm-3"> - <input type="text" name="city" ng-model="addressArray[$index].city" class="form-control"> - </div> - </div> - <div class="form-group" ng-show="townVillage"> - <label class="control-label col-sm-2">{{ 'label.input.town_village' | translate }}</label> - <div class="col-sm-3"> - <input type="text" name="town_village" ng-model="addressArray[$index].townVillage" - class="form-control"> - </div> - </div> - <div class="form-group" ng-show="countyDistrict"> - <label class="control-label col-sm-2">{{ 'label.input.county_district' | translate }}</label> - <div class="col-sm-3"> - <input type="text" name="county_district" ng-model="addressArray[$index].countyDistrict" - class="form-control"> - </div> - </div> - <div class="form-group" ng-show="stateProvinceId"> - <div class="control-label col-sm-2"> - <label>{{ 'label.input.state_province' | translate }}</label> - </div> - <div class="col-sm-3"> - <select chosen="stateOptions" ng-model="addressArray[$index].stateProvinceId" - class="form-control" - ng-options="stateOption.id as stateOption.name for stateOption in stateOptions track by stateOption.id" - value="stateProvinceId"></select> - </div> - </div> - <div> - </div> - <div class="form-group" ng-show="countryId"> - <div class="control-label col-sm-2"> - <label>{{ 'label.input.country' | translate }}</label> - </div> - <div class="col-sm-3"> - <select chosen="countryOptions" ng-model="addressArray[$index].countryId" - class="form-control" - ng-options="countryOption.id as countryOption.name for countryOption in countryOptions track by countryOption.id" - value="countryId"></select> - </div> - </div> - <div class="form-group" ng-show="postalCode"> - <label class="control-label col-sm-2">{{ 'label.input.postal_code' | translate }}</label> - <div class="col-sm-3"> - <input type="text" name="postal_code" ng-model="addressArray[$index].postalCode" - class="form-control"> - </div> - </div> - <div class="form-group" ng-show="latitude"> - <label class="control-label col-sm-2">{{ 'label.input.latitude' | translate }}</label> - <div class="col-sm-3"> - <input type="text" name="latitude" ng-model="addressArray[$index].latitude" - class="form-control"> - </div> - </div> - <div class="form-group" ng-show="longitude"> - <label class="control-label col-sm-2">{{ 'label.input.longitude' | translate }}</label> - <div class="col-sm-3"> - <input type="text" name="longitude" ng-model="addressArray[$index].longitude" - class="form-control"> - </div> - </div> - <div class="form-group" ng-show="isActive"> - <label class="control-label col-sm-2">{{'label.input.is_active' | translate}} </label> - <div class="col-sm-3"> - <input class="input-mini-small" type="checkbox" ng-model="addressArray[$index].isActive"> - </div> - </div> - </div> - </div> - <div class="pull-right"> - <button id="save1" class="btn btn-primary" ng-if="datatables" wz-next> - {{'label.button.proceed' | translate}} - </button> - <div ng-if="!datatables"> - <a id="cancel" ng-href="{{cancel}}" class="btn btn-default">{{'label.button.cancel' | - translate}}</a> - <button id="save" type="submit" class="btn btn-primary" ng-hide="blockUI" - has-permission='CREATE_CLIENT'>{{'label.button.save' | translate}}</button> - <button class="btn btn-info" ng-show="blockUI"><strong>{{'label.button.processing' | - translate}}</strong></button> - </div> - </div> - </fieldset> - </form> - </div> - </wz-step> - <wz-step ng-if="datatables" ng-repeat="datatable in datatables" icon="fa fa-circle-o" - wz-title="{{datatable.registeredTableName}}"> - <div class="card-content"> - <form class="form-horizontal" ng-submit="submit()"> - <api-validate></api-validate> - <fieldset> - <legend>{{datatable.registeredTableName}}</legend> - <div class="form-group" ng-repeat="columnHeader in datatable.columnHeaderData"> - <label class="control-label col-sm-3">{{ columnHeader.columnName | prettifyDataTableColumn }} - <span ng-show="!columnHeader.isColumnNullable" class="required">*</span> - </label> - <div class="col-sm-3"> - <input ng-show="fieldType(columnHeader.columnDisplayType) == 'TEXT'" type="text" - ng-model="formData.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName]" - class="form-control" /> - <input ng-show="fieldType(columnHeader.columnDisplayType) == 'DATE'" type="text" - datepicker-pop="dd MMMM yyyy" - ng-model="formDat.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName]" - is-open="opened{{$index}}" class="form-control" /> - <div ng-show="fieldType(columnHeader.columnDisplayType) == 'DATETIME'" class="form-inline"> - <div class="form-group"> - <input type="text" datepicker-pop="dd MMMM yyyy" - ng-model="formDat.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName].date" - is-open="opened{{$index}}" class="form-control" /> - </div> - <div class="form-group"> - <input type="time" placeholder="HH:MM:SS" - ng-model="formDat.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName].time" - class="form-control" /> - </div> - </div> - <div ng-show="fieldType(columnHeader.columnDisplayType) == 'BOOLEAN'"> - <label class="radio-inline"> - <input type="radio" - ng-model="formData.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName]" - value="true" /> - {{'label.input.true' | translate}} - </label> - <label class="radio-inline"> - <input type="radio" - ng-model="formData.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName]" - value="false" /> - {{'label.input.false' | translate}} - </label> - </div> - <span data-ng-switch on="columnHeader.columnDisplayType"> + + <div ng-show="enableAddress" class="form-group"> + <div class="form-group"> + <div class="control-label col-sm-2"> + <h3><strong>{{ 'label.input.address' | translate }}</strong> <a + ng-click="addAddress()"><i class="fa fa-plus" + title="{{'label.button.addAddress' | translate}}"></i></a> + </h3> + </div> + </div> + <div ng-repeat="addr in addressArray"> + <div class="form-group"> + <div class="control-label col-sm-2"> + <label>{{ 'label.input.addressType' | translate }}<span + class="required">*</span></label> + </div> + <div class="col-sm-3"> + <select chosen="addressTypes" name="addressType" + ng-model="addressArray[$index].addressTypeId" class="form-control" + ng-options="addressType.id as addressType.name for addressType in addressTypes " + value="addressTypeId" required late-validate></select> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="addressType"/> + </div> + <a ng-click="removeAddress($index)" + uib-tooltip="{{'label.remove.row' | translate}}"><i + class="fa fa-times"></i></a> + </div> + <div class="form-group" ng-show="street"> + <div class="control-label col-sm-2"> + <label>{{ 'label.input.street' | translate }}</label> + </div> + <div class="col-sm-3"> + <input type="text" name="street" ng-model="addressArray[$index].street" + class="form-control" late-validate/> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="street"/> + </div> + </div> + + + <div class="form-group" ng-show="addressLine1"> + <label class="control-label col-sm-2">{{ 'label.input.addressline1' | translate + }}</label> + <div class="col-sm-3"> + <input type="text" name="addressline1" + ng-model="addressArray[$index].addressLine1" + class="form-control"> + </div> + </div> + <div class="form-group" ng-show="addressLine2"> + <label class="control-label col-sm-2">{{ 'label.input.addressline2' | translate + }}</label> + <div class="col-sm-3"> + <input type="text" name="addressline2" + ng-model="addressArray[$index].addressLine2" + class="form-control"> + </div> + </div> + <div class="form-group" ng-show="addressLine3"> + <label class="control-label col-sm-2">{{ 'label.input.addressline3' | translate + }}</label> + <div class="col-sm-3"> + <input type="text" name="addressline3" + ng-model="addressArray[$index].addressLine3" + class="form-control"> + </div> + </div> + + <div class="form-group" ng-show="city"> + <label class="control-label col-sm-2">{{ 'label.input.city' | translate }}</label> + <div class="col-sm-3"> + <input type="text" name="city" ng-model="addressArray[$index].city" + class="form-control"> + </div> + </div> + <div class="form-group" ng-show="townVillage"> + <label class="control-label col-sm-2">{{ 'label.input.town_village' | translate + }}</label> + <div class="col-sm-3"> + <input type="text" name="town_village" + ng-model="addressArray[$index].townVillage" + class="form-control"> + </div> + </div> + <div class="form-group" ng-show="countyDistrict"> + <label class="control-label col-sm-2">{{ 'label.input.county_district' | translate + }}</label> + <div class="col-sm-3"> + <input type="text" name="county_district" + ng-model="addressArray[$index].countyDistrict" + class="form-control"> + </div> + </div> + <div class="form-group" ng-show="stateProvinceId"> + <div class="control-label col-sm-2"> + <label>{{ 'label.input.state_province' | translate }}</label> + </div> + <div class="col-sm-3"> + <select chosen="stateOptions" ng-model="addressArray[$index].stateProvinceId" + class="form-control" + ng-options="stateOption.id as stateOption.name for stateOption in stateOptions track by stateOption.id" + value="stateProvinceId"></select> + </div> + </div> + <div> + </div> + <div class="form-group" ng-show="countryId"> + <div class="control-label col-sm-2"> + <label>{{ 'label.input.country' | translate }}</label> + </div> + <div class="col-sm-3"> + <select chosen="countryOptions" ng-model="addressArray[$index].countryId" + class="form-control" + ng-options="countryOption.id as countryOption.name for countryOption in countryOptions track by countryOption.id" + value="countryId"></select> + </div> + </div> + <div class="form-group" ng-show="postalCode"> + <label class="control-label col-sm-2">{{ 'label.input.postal_code' | translate + }}</label> + <div class="col-sm-3"> + <input type="text" name="postal_code" ng-model="addressArray[$index].postalCode" + class="form-control"> + </div> + </div> + <div class="form-group" ng-show="latitude"> + <label class="control-label col-sm-2">{{ 'label.input.latitude' | translate + }}</label> + <div class="col-sm-3"> + <input type="text" name="latitude" ng-model="addressArray[$index].latitude" + class="form-control"> + </div> + </div> + <div class="form-group" ng-show="longitude"> + <label class="control-label col-sm-2">{{ 'label.input.longitude' | translate + }}</label> + <div class="col-sm-3"> + <input type="text" name="longitude" ng-model="addressArray[$index].longitude" + class="form-control"> + </div> + </div> + <div class="form-group" ng-show="isActive"> + <label class="control-label col-sm-2">{{'label.input.is_active' | translate}} </label> + <div class="col-sm-3"> + <input class="input-mini-small" type="checkbox" + ng-model="addressArray[$index].isActive"> + </div> + </div> + </div> + </div> + <div class="pull-right"> + <button id="save1" class="btn btn-primary" ng-if="datatables" wz-next> + {{'label.button.proceed' | translate}} + </button> + <div ng-if="!datatables"> + <a id="cancel" ng-href="{{cancel}}" class="btn btn-default">{{'label.button.cancel' | + translate}}</a> + <button id="save" type="submit" class="btn btn-primary" ng-hide="blockUI" + has-permission='CREATE_CLIENT'>{{'label.button.save' | translate}} + </button> + <button class="btn btn-info" ng-show="blockUI"><strong>{{'label.button.processing' | + translate}}</strong></button> + </div> + </div> + </fieldset> + </form> + </div> + </wz-step> + <wz-step ng-if="datatables" ng-repeat="datatable in datatables" icon="fa fa-circle-o" + wz-title="{{datatable.registeredTableName}}"> + <div class="card-content"> + <form class="form-horizontal" ng-submit="submit()"> + <api-validate></api-validate> + <fieldset> + <legend>{{datatable.registeredTableName}}</legend> + <div class="form-group" ng-repeat="columnHeader in datatable.columnHeaderData"> + <label class="control-label col-sm-3">{{ columnHeader.columnName | prettifyDataTableColumn + }} + <span ng-show="!columnHeader.isColumnNullable" class="required">*</span> + </label> + <div class="col-sm-3"> + <input ng-show="fieldType(columnHeader.columnDisplayType) == 'TEXT'" type="text" + ng-model="formData.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName]" + class="form-control"/> + <input ng-show="fieldType(columnHeader.columnDisplayType) == 'DATE'" type="text" + datepicker-pop="dd MMMM yyyy" + ng-model="formDat.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName]" + is-open="opened{{$index}}" class="form-control"/> + <div ng-show="fieldType(columnHeader.columnDisplayType) == 'DATETIME'" + class="form-inline"> + <div class="form-group"> + <input type="text" datepicker-pop="dd MMMM yyyy" + ng-model="formDat.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName].date" + is-open="opened{{$index}}" class="form-control"/> + </div> + <div class="form-group"> + <input type="time" placeholder="HH:MM:SS" + ng-model="formDat.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName].time" + class="form-control"/> + </div> + </div> + <div ng-show="fieldType(columnHeader.columnDisplayType) == 'BOOLEAN'"> + <label class="radio-inline"> + <input type="radio" + ng-model="formData.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName]" + value="true"/> + {{'label.input.true' | translate}} + </label> + <label class="radio-inline"> + <input type="radio" + ng-model="formData.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName]" + value="false"/> + {{'label.input.false' | translate}} + </label> + </div> + <span data-ng-switch on="columnHeader.columnDisplayType"> <select ng-show="fieldType(columnHeader.columnDisplayType) == 'SELECT'" - data-ng-switch-when="CODELOOKUP" - ng-model="formData.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName]" - ng-options="columnValue.id as columnValue.value for columnValue in columnHeader.columnValues" - value="{{columnValue.id}}" class="form-control"> + data-ng-switch-when="CODELOOKUP" + ng-model="formData.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName]" + ng-options="columnValue.id as columnValue.value for columnValue in columnHeader.columnValues" + value="{{columnValue.id}}" class="form-control"> <option value="">{{'label.selectone' | translate}}</option> </select> <select ng-show="fieldType(columnHeader.columnDisplayType) == 'SELECT'" - data-ng-switch-when="CODEVALUE" - ng-model="formData.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName]" - ng-options="columnValue.value as columnValue.value for columnValue in columnHeader.columnValues" - value="{{columnValue.id}}" class="form-control"> + data-ng-switch-when="CODEVALUE" + ng-model="formData.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName]" + ng-options="columnValue.value as columnValue.value for columnValue in columnHeader.columnValues" + value="{{columnValue.id}}" class="form-control"> <option value="">{{'label.selectone' | translate}}</option> </select> </span> - </div> - </div> - <div class="pull-right" ng-if="!$last"> - <button id="save4" class="btn btn-primary" wz-next> - {{'label.button.proceed' | translate}} - </button> - </div> - <div class="col-md-offset-5" ng-if="$last"> - <a id="cancel2" ng-href="{{cancel}}" class="btn btn-default">{{'label.button.cancel' | - translate}}</a> - <button id="save2" type="submit" class="btn btn-primary" ng-hide="blockUI" - has-permission='CREATE_CLIENT'>{{'label.button.save' | translate}}</button> - <button class="btn btn-info" ng-show="blockUI"><strong>{{'label.button.processing' | - translate}}</strong></button> - </div> - </fieldset> - </form> - </div> - </wz-step> - </wizard> + </div> + </div> + <div class="pull-right" ng-if="!$last"> + <button id="save4" class="btn btn-primary" wz-next> + {{'label.button.proceed' | translate}} + </button> + </div> + <div class="col-md-offset-5" ng-if="$last"> + <a id="cancel2" ng-href="{{cancel}}" class="btn btn-default">{{'label.button.cancel' | + translate}}</a> + <button id="save2" type="submit" class="btn btn-primary" ng-hide="blockUI" + has-permission='CREATE_CLIENT'>{{'label.button.save' | translate}} + </button> + <button class="btn btn-info" ng-show="blockUI"><strong>{{'label.button.processing' | + translate}}</strong></button> + </div> + </fieldset> + </form> + </div> + </wz-step> + </wizard> </div> diff --git a/app/views/clients/editclient.html b/app/views/clients/editclient.html index 67793df2d5..65d7563b67 100755 --- a/app/views/clients/editclient.html +++ b/app/views/clients/editclient.html @@ -60,6 +60,21 @@ </div> </div> + <div data-ng-switch on="showNonPersonOptions"> + <div data-ng-switch-when="false"> + <div class="form-group"> + <label class="control-label col-sm-2">{{ 'label.input.othernames' | translate }}:</label> + + <div class="col-sm-3"> + <input id="othernames" type="text" ng-model="formData.othernames" class="form-control"> + </div> + <label class="control-label col-sm-2" for="maidenname">{{ 'label.input.maidenname' | translate }}</label> + <div class="col-sm-3"> + <input id="maidenname" type="text" ng-model="formData.maidenname" class="form-control"> + </div> + </div> + </div> + </div> <div data-ng-switch on="showNonPersonOptions"> <div data-ng-switch-when="false"> <div class="form-group"> @@ -279,11 +294,420 @@ </div> </div> + + <div class="form-group"> + <div class="form-group"> + <div class="control-label col-sm-3"> + <h3><strong>{{ 'label.heading.contact.information' | translate }}</strong> </h3> + </div> + </div> + <div> + <div class="form-group"> + <div class="control-label col-sm-2"> + <label>{{ 'label.input.client.area' | translate }}<span + class="required">*</span></label> + </div> + <div class="col-sm-3"> + <select id="clientArea" + ng-model="formData.clientArea" class="form-control" required="required" + ng-options="area.id as area.name for area in clientAreaOptions " + value="{{area.id}}"></select> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="clientArea"/> + </div> + </div> + + <div class="form-group"> + <div class="control-label col-sm-2"> + <label>{{ 'label.input.client.housingtype' | translate }}<span + class="required">*</span></label> + </div> + <div class="col-sm-3"> + <select id="housing" + ng-model="formData.housingTypeId" class="form-control" required="required" + ng-options="housing.id as housing.name for housing in housingTypeOptions " + value="{{housing.id}}"></select> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="housing"/> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-2">{{ 'label.input.residenceYears' | translate }}<span + class="required">*</span> + </label> + <div class="col-sm-3"> + <input type="text" id="residenceYears" class="form-control" name="residenceYears" + ng-model="formData.residenceYears" required late-validate number=true/> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="residenceYears"></form-validate> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-2">{{ 'label.input.communityYears' | translate }}<span + class="required">*</span> + </label> + <div class="col-sm-3"> + <input type="text" id="communityYears" class="form-control" name="communityYears" + ng-model="formData.communityYears" required late-validate number=true/> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="residenceYears"></form-validate> + </div> + </div> + + <div class="form-group"> + <div class="control-label col-sm-2"> + <label>{{ 'label.input.client.publicservice' | translate }}<span + class="required">*</span></label> + </div> + <div class="col-sm-3"> + <table> + <tr ng-repeat="publicServiceOption in publicServiceOptions"> + <td> + <input id="{{publicServiceOption.id}}" type="checkbox" name='publicService' data-ng-model="publicServiceChecks[publicServiceOption.id]" data-ng-change="checkPublicService(publicServiceOption.id)"> + <label>{{publicServiceOption.name}}</label> + </td> + </tr> + </table> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="publicService"></form-validate> + </div> + </div> + + <div class="form-group"> + <div class="control-label col-sm-2"> + <label>{{ 'label.input.client.department' | translate }}<span + class="required">*</span></label> + </div> + <div class="col-sm-3"> + <select id="department" + ng-model="formData.departmentId" class="form-control" required="required" + ng-options="department.id as department.name for department in departamentoOptions " + value="{{department.id}}"></select> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="department"/> + </div> + </div> + + <div class="form-group"> + <div class="control-label col-sm-2"> + <label>{{ 'label.input.client.municipal' | translate }}<span + class="required">*</span></label> + </div> + <div class="col-sm-3"> + <select id="municipal" + ng-model="formData.municipalId" class="form-control" required="required" + ng-options="municipal.id as municipal.name for municipal in municipioOptions " + value="{{municipal.id}}"></select> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="municipal"/> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-2" + for="village">{{ 'label.input.village' | translate }}</label> + <div class="col-sm-3"> + <input type="text" id="village" name="village" ng-model="formData.village" + class="form-control"> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="village"/> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-2" + for="reference">{{ 'label.input.referencedata' | translate }}</label> + <div class="col-sm-3"> + <input type="text" id="reference" name="reference" + ng-model="formData.referenceData" + class="form-control"> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="reference"/> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2" + for="reference">{{ 'label.input.street' | translate }}</label> + <div class="col-sm-3"> + <input type="text" id="street" name="street" ng-model="formData.street" + class="form-control"> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="street"/> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2" + for="reference">{{ 'label.input.avenue' | translate }}</label> + <div class="col-sm-3"> + <input type="text" id="avenue" name="avenue" ng-model="formData.avenue" + class="form-control"> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="avenue"/> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-2" + for="reference">{{ 'label.input.streetNumber' | translate }}</label> + <div class="col-sm-3"> + <input type="text" id="streetNumber" name="street" ng-model="formData.streetNumber" + class="form-control"> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="streetNumber"/> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2" + for="reference">{{ 'label.input.colony' | translate }}</label> + <div class="col-sm-3"> + <input type="text" id="colony" name="colony" ng-model="formData.colony" + class="form-control"> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="colony"/> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-2" + for="reference">{{ 'label.input.sector' | translate }}</label> + <div class="col-sm-3"> + <input type="text" id="sector" name="sector" ng-model="formData.sector" + class="form-control"> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="sector"/> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-2" + for="reference">{{ 'label.input.batch' | translate }}</label> + <div class="col-sm-3"> + <input type="text" id="batch" name="batch" ng-model="formData.batch" + class="form-control"> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="batch"/> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-2" + for="reference">{{ 'label.input.square' | translate }}</label> + <div class="col-sm-3"> + <input type="text" id="square" name="square" ng-model="formData.square" + class="form-control"> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="square"/> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-2" + for="reference">{{ 'label.input.zone' | translate }}</label> + <div class="col-sm-3"> + <input type="text" id="zone" name="zone" ng-model="formData.zone" + class="form-control"> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="zone"/> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-2" + for="reference">{{ 'label.input.lightDeviceNumber' | translate }}</label> + <div class="col-sm-3"> + <input type="text" id="lightDeviceNumber" name="lightDeviceNumber" + ng-model="formData.lightDeviceNumber" + class="form-control"> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="lightDeviceNumber"></form-validate> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-2" for="mobileNo">{{'label.input.mobilenumber' | + translate}}<span class="required">*</span></label> + <div class="col-sm-3"> + <input type="text" id="mobileNo" name="mobileNo" ng-model="formData.mobileNo" required="required" class="form-control"/> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="mobileNo"/> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-2" for="homeNumber">{{'label.input.homeNumber' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="homeNumber" name="homeNumber" ng-model="formData.homeNumber" class="form-control"/> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="createclientform" valattribute="homeNumber"/> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-2" for="externalId">{{'label.input.loanCycle' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="loanCycle" name="loanCycle" ng-model="formData.loanCycle" required late-validate + class="form-control"/> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-2" + for="groupmem">{{'label.input.groupno' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="groupno" name="groupno" + ng-model="formData.groupNumber" + class="form-control"/> + </div> + + <label class="control-label col-sm-2" + for="groupmem">{{'label.input.groupmember' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="groupmem" name="groupme" + ng-model="formData.groupMember" + class="form-control"/> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-2" + for="groupmem">{{'label.input.statusingroup' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="groupstatus" name="groupstatus" + ng-model="formData.statusInGroup" + class="form-control"/> + </div> + + <label class="control-label col-sm-2" + for="groupmem">{{'label.input.retirementreason' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="retReason" name="retReason" + ng-model="formData.retirementReason" + class="form-control"/> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-2" + for="civilstatus">{{'label.input.civilstatus' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="civilstatus" name="civilstatus" + ng-model="formData.civilStatus" + class="form-control"/> + </div> + + <label class="control-label col-sm-2" + for="education">{{'label.input.education' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="education" name="education" + ng-model="formData.educationLevel" + class="form-control"/> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2" + for="ethinicity">{{'label.input.ethinicity' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="ethinicity" name="ethinicity" + ng-model="formData.ethinicity" + class="form-control"/> + </div> + + <label class="control-label col-sm-2" + for="nationality">{{'label.input.nationality' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" id="nationality" name="nationality" + ng-model="formData.nationality" + class="form-control"/> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-2" + for="languages">{{'label.input.languages' | + translate}}</label> + <div class="col-sm-3"> + <textarea type="text" rows="3" id="languages" name="languages" + ng-model="formData.languages" + class="form-control"></textarea> + </div> + + <label class="control-label col-sm-2" + for="econSector">{{'label.input.economicsector' | + translate}}</label> + <div class="col-sm-3" ng-if="economicSectorOptions"> + <select chosen="sector" id="econSector" ng-model="formData.economicSector" class="form-control" + ng-options="sector.id as sector.name for sector in economicSectorOptions" ng-change="updateActivities()" + value="{{sector.id}}"> + <option value="">--{{'label.input.economicsector' | translate}}--</option> + </select> + </div> + </div> + + <div class="form-group" ng-if="formData.economicSector && economicActivityOptions"> + <label class="control-label col-sm-2" + for="languages">{{'label.input.economicactivity' | + translate}}</label> + <div class="col-sm-3" ng-if="formData.economicSector && economicActivityOptions"> + <select chosen="economicActivity" id="" ng-model="formData.economicActivity" class="form-control" + ng-options="activity.id as activity.name for activity in economicActivityOptions" + value="{{activity.id}}"> + <option value="">--{{'label.input.economicactivity' | translate}}--</option> + </select> + </div> + + <label class="control-label col-sm-2" + for="familyReference">{{'label.input.familyreference' | + translate}}</label> + <div class="col-sm-3"> + <input type="text" rows="3" id="familyReference" name="familyReference" + ng-model="formData.familyReference" + class="form-control"/> + </div> + </div> + + + </div> + + </div> + + <div class="col-md-offset-3"> <a id="cancel" href="#/viewclient/{{clientId}}"> <button type="reset" class="btn btn-default">{{'label.button.cancel' | translate}}</button> </a> - <button id="save" type="submit" class="btn btn-primary" has-permission='UPDATE_CLIENT'>{{'label.button.save' | translate}}</button> + <button id="saveedit" type="submit" class="btn btn-primary" has-permission='UPDATE_CLIENT' ng-click="submit()" >{{'label.button.save' | translate}}</button> </div> </fieldset> diff --git a/app/views/clients/viewclient.html b/app/views/clients/viewclient.html index 588ea1e740..dd684677ae 100755 --- a/app/views/clients/viewclient.html +++ b/app/views/clients/viewclient.html @@ -250,6 +250,9 @@ <h3 class="client-title"> <li class="{{button.icon}}"> <a href="#/selfservice/createuser/{{client.id}}">{{'label.createselfserviceuser' | translate}}</a> </li> + <li class="{{button.icon}}"> + <a href="#/loans/restructurecredit/{{client.id}}">{{'label.heading.creditrestructure' | translate}}</a> + </li> </ul> </span> </div> @@ -362,6 +365,9 @@ <h3>{{'label.heading.withdrawn' | translate}}</h3> <a uib-tooltip="{{'label.button.makerepayment' | translate}}" ng-href="#/loanaccount/{{loanaccount.id}}/repayment" class="btn btn-xs btn-primary ng-binding"> <i class="fa fa-dollar"></i> </a> + <a uib-tooltip="{{'label.button.futurepayment' | translate}}" ng-href="#/loanfuturepayment/{{loanaccount.id}}" class="btn btn-xs btn-primary ng-binding"> + <i class="fa fa-question-circle"></i> + </a> </td> <td class="pointer center" ng-if="loanaccount.status.pendingApproval"> <a uib-tooltip="{{'label.button.approve' | translate}}" has-permission='APPROVE_LOAN' ng-href="#/loanaccount/{{loanaccount.id}}/approve" class="btn btn-xs btn-primary ng-binding"> @@ -1147,6 +1153,92 @@ <h4><strong>{{client.displayName}}</strong></h4> </div> </uib-tab> + <!--Contact information--> + <uib-tab ng-show="clientContactInformation" heading="{{'label.heading.contact.information' | translate}}" > + <div ng-show="clientContactInformation"> + <div class="row" style="margin-right: auto; margin-left: auto"> + <div class="col-md-5 m-1 alert alert-info"> + <span>{{'label.input.client.area'| translate}}<span class="pull-right">{{clientContactInformation.area}}</span></span> + </div> + <div class="col-md-5 m-1 alert alert-info"> + <span>{{'label.input.client.housingtype'| translate}}<span class="pull-right">{{clientContactInformation.housingType}}</span></span> + </div> + + <div class="col-md-5 m-1 alert alert-info"> + <span>{{'label.input.residenceYears'| translate}}<span class="pull-right">{{clientContactInformation.yearsOfResidence}}</span></span> + </div> + + <div class="col-md-5 m-1 alert alert-info"> + <span>{{'label.input.communityYears'| translate}}<span class="pull-right">{{clientContactInformation.communityYears}}</span></span> + </div> + + <div class="col-md-5 m-1 alert alert-info"> + <span>{{'label.input.client.publicservice'| translate}}<span class="pull-right"><span ng-repeat="publicServiceType in clientContactInformation.publicServiceTypes track by $index">{{publicServiceType.name}}, </span></span></span> + </div> + + <div class="col-md-5 m-1 alert alert-info"> + <span>{{'label.input.client.department'| translate}}<span class="pull-right">{{clientContactInformation.department}}</span></span> + </div> + + <div class="col-md-5 m-1 alert alert-info"> + <span>{{'label.input.client.municipal'| translate}}<span class="pull-right">{{clientContactInformation.municipality}}</span></span> + </div> + + <div class="col-md-5 m-1 alert alert-info"> + <span>{{'label.input.village'| translate}}<span class="pull-right">{{clientContactInformation.village}}</span></span> + </div> + + <div class="col-md-5 m-1 alert alert-info"> + <span>{{'label.input.referencedata'| translate}}<span class="pull-right">{{clientContactInformation.referenceHousingData}}</span></span> + </div> + + <div class="col-md-5 m-1 alert alert-info"> + <span>{{'label.input.street'| translate}}<span class="pull-right">{{clientContactInformation.street}}</span></span> + </div> + + <div class="col-md-5 m-1 alert alert-info"> + <span>{{'label.input.avenue'| translate}}<span class="pull-right">{{clientContactInformation.avenue}}</span></span> + </div> + + <div class="col-md-5 m-1 alert alert-info"> + <span>{{'label.input.streetNumber'| translate}}<span class="pull-right">{{clientContactInformation.streetNumber}}</span></span> + </div> + + <div class="col-md-5 m-1 alert alert-info"> + <span>{{'label.input.houseNumber'| translate}}<span class="pull-right">{{clientContactInformation.homePhone}}</span></span> + </div> + + <div class="col-md-5 m-1 alert alert-info"> + <span>{{'label.input.colony'| translate}}<span class="pull-right">{{clientContactInformation.colony}}</span></span> + </div> + + <div class="col-md-5 m-1 alert alert-info"> + <span>{{'label.input.sector'| translate}}<span class="pull-right">{{clientContactInformation.sector}}</span></span> + </div> + + <div class="col-md-5 m-1 alert alert-info"> + <span>{{'label.input.batch'| translate}}<span class="pull-right">{{clientContactInformation.batch}}</span></span> + </div> + + <div class="col-md-5 m-1 alert alert-info"> + <span>{{'label.input.square'| translate}}<span class="pull-right">{{clientContactInformation.square}}</span></span> + </div> + + <div class="col-md-5 m-1 alert alert-info"> + <span>{{'label.input.zone'| translate}}<span class="pull-right">{{clientContactInformation.zone}}</span></span> + </div> + + <div class="col-md-5 m-1 alert alert-info"> + <span>{{'label.input.lightDeviceNumber'| translate}}<span class="pull-right">{{clientContactInformation.lightMeterNumber}}</span></span> + </div> + + <div class="col-md-5 m-1 alert alert-info"> + <span>{{'label.input.homeNumber'| translate}}<span class="pull-right">{{clientContactInformation.homePhone}}</span></span> + </div> + </div> + </div> + </uib-tab> + <!--end of family tab--> @@ -1207,8 +1299,11 @@ <h4><strong>{{client.displayName}}</strong></h4> <thead> <tr class="graybg"> <th>{{'label.heading.name' | translate}}</th> - <th>{{'label.heading.description' | translate}}</th> + <th>{{'label.input.observations' | translate}}</th> <th>{{'label.heading.filename' | translate}}</th> + <th>{{'label.input.documenttype' | translate}}</th> + <th>{{'label.input.document.purpose' | translate}}</th> + <th>{{'label.input.date' | translate}}</th> <th>{{'label.heading.actions' | translate}}</th> </tr> </thead> @@ -1217,6 +1312,10 @@ <h4><strong>{{client.displayName}}</strong></h4> <td>{{clientdocument.name}}</td> <td>{{clientdocument.description}}</td> <td>{{clientdocument.fileName}}</td> + <td>{{clientdocument.documentType?clientdocument.documentType:'---'}}</td> + <td>{{clientdocument.documentPurpose?clientdocument.documentPurpose:'---'}}</td> + <td ng-if="clientdocument.dateCreated">{{clientdocument.dateCreated |DateFormat}}</td> + <td ng-if="!clientdocument.dateCreated">---</td> <td> <a target="_blank" href="{{hostUrl}}{{clientdocument.docUrl}}"><i class="fa fa-cloud-download"></i></a> <a ng-show="clientdocument.fileIsImage" ng-click="previewDocument(clientdocument.docUrl,clientdocument.fileName)"><i class="fa fa-eye"></i></a> diff --git a/app/views/groups/viewgroup.html b/app/views/groups/viewgroup.html index 98eab07f16..e243f9a36a 100644 --- a/app/views/groups/viewgroup.html +++ b/app/views/groups/viewgroup.html @@ -46,7 +46,7 @@ <h4 class=""> <div class=""> <div class="btn-group pull-right" data-ng-hide="group.status.value == 'Closed'"> - <a href="#/editgroup/{{group.id}}?managecode=2" + <a href="#/editgroup/{{group.id}}?managecode=2" class="btn btn-primary" has-permission='UPDATE_GROUP' data-ng-hide="group.status.value=='Active'"><i class="fa fa-check"></i> {{'label.button.activate' | translate }} @@ -102,6 +102,9 @@ <h4 class=""> {{ 'label.button.unassignstaff' | translate }} </a> </li> + <li> + <a href="#/prequalification/11/viewdetails?showValidatePolicies=true" has-permission='READ_GROUP'>{{'label.button.hardpolicychecklist' | translate }}</a> + </li> <li class="{{button.icon}}"> <a href="#/groups/cupo/{{group.id}}">{{'label.cupo' | translate}}</a> </li> diff --git a/app/views/hardpolicychecklist/viewhardpolicychecklist.html b/app/views/hardpolicychecklist/viewhardpolicychecklist.html new file mode 100644 index 0000000000..56f1eb5d98 --- /dev/null +++ b/app/views/hardpolicychecklist/viewhardpolicychecklist.html @@ -0,0 +1,75 @@ +<div class="content-container" ng-controller="ViewHardPolicyChecklistController"> + <ul class="breadcrumb"> + <li><a href="#/viewgroup/{{groupId}}">{{'label.anchor.viewgroup' | translate}}</a></li> + <li class="active">{{ 'label.heading.hardpolicychecklist' | translate}}</li> + </ul> + <div class="card"> + <div class="content"> + <br> + <div class="row"> + <div class="col-sm-5"> + <form ng-submit="search()" class="form-horizontal"> + <div class="form-group"> + <div class="col-md-10"> + <div class="input-group"> + <input data-ng-model="searchText" type="text" placeholder="{{'label.input.searchByNameExternalId' | translate}}" class="form-control"/> + <br> + <span class="input-group-btn"> + <button class="btn btn-primary form-control"> + <span class="fa fa-search"></span> + </button> + </span> + </div> + </div> + </div> + </form> + </div> + <div class="col-sm-5" data-ng-show="!showChecklistTable"> + <a href="#/createhardpolicychecklist/{{groupId}}" class="btn btn-primary pull-right" has-permission='UPDATE_GROUP'><i class="fa fa-plus "></i>{{'label.button.createhardpolicychecklist' | translate}}</a> + </div> + <div class="col-sm-5" data-ng-show="showChecklistTable"> + <a href="#/edithardpolicychecklist{{checklistId}}" class="btn btn-primary pull-right" has-permission='UPDATE_GROUP'><i class="fa fa-edit "></i>{{'label.button.edithardpolicychecklist' | translate}}</a> + </div> + </div> + <div class="toolbar"><h4>{{ 'label.heading.clientshardpolicychecklist' | translate}}</h4></div> + <div data-ng-show="showChecklistTable" scroll> + <table style="width: 1200px;white-space:nowrap" class="table table-bordered" data-anchor> + <thead> + <tr class="graybg"> + <th>{{'label.heading.clientname' | translate}}</th> + <th> {{'label.heading.clientno' | translate}}</th> + <th> {{'label.heading.newclientcategorization' | translate}}</th> + <th>{{'label.heading.recurringcustomercategorization' | translate}}</th> + <th>{{'label.heading.mandatoryphotograph' | translate}}</th> + <th>{{'label.heading.clientage' | translate}}</th> + <th>{{'label.heading.noOfMembersAccordingToPolicy' | translate}}</th> + <th>{{'label.heading.minAndMaxAmount' | translate}}</th> + <th>{{'label.heading.disparityOfValues' | translate}}</th> + <th>{{'label.heading.percentageOfMembersStartingBusiness' | translate}}</th> + <th>{{'label.heading.percentageOfMembersWithTheirOwnHome' | translate}}</th> + <th>{{'label.heading.chairmanOfTheBCBoardOfDirectors' | translate}}</th> + <th>{{'label.heading.categoriesOfClientToAccept' | translate}}</th> + <th>{{'label.heading.requestedAmount' | translate}}</th> + <th>{{'label.heading.addEndorsement' | translate}}</th> + <th>{{'label.heading.paymentsOutsideCurrentTerm' | translate}}</th> + </tr> + </thead> + <tbody> + <tr class="pointer-main" dir-paginate="group in groups | orderBy:'name':reverse | filter:filterText | itemsPerPage: groupsPerPage" total-items="totalGroups" pagination-id="groups" ng-show="group.status.code != 'clientStatusType.closed' || showClosed"> + <td class="pointer" data-ng-click="routeTo(group.id)">{{group.name}}</td> + <td class="pointer" data-ng-click="routeTo(group.id)">{{group.accountNo}}</td> + <td class="pointer" data-ng-click="routeTo(group.id)">{{group.externalId}}</td> + <td class="pointer" data-ng-click="routeTo(group.id)"> + <i class="fa fa-stop {{group.status.code | StatusLookup}}" uib-tooltip="{{group.status.value}}" uib-tooltip-placement="top"> + </i> + </td> + <td data-ng-click="routeTo(group.id)">{{group.officeName}}</td> + </tr> + </tbody> + </table> + <dir-pagination-controls boundary-links="true" pagination-id="groups" template-url="bower_components/angular-utils-pagination/dirPagination.tpl.html" on-page-change="getResultsPage(newPageNumber)"></dir-pagination-controls> + </div> + </div> + </div> + </div> +</div> diff --git a/app/views/loans/loanaccountactions.html b/app/views/loans/loanaccountactions.html index dc9432ffed..ec338a0cab 100644 --- a/app/views/loans/loanaccountactions.html +++ b/app/views/loans/loanaccountactions.html @@ -270,7 +270,7 @@ </div> </div> <div class="form-group" ng-show="paymentDatefield"> - <label class="control-label col-sm-2" for="modelName">{{'label.input.paymentdate' | translate}}<span + <label class="control-label col-sm-2" for="{{modelName}}">{{'label.input.paymentdate' | translate}}<span class="required">*</span></label> <div class="col-sm-3"> diff --git a/app/views/loans/loanfuturepayment.html b/app/views/loans/loanfuturepayment.html new file mode 100644 index 0000000000..2220291d92 --- /dev/null +++ b/app/views/loans/loanfuturepayment.html @@ -0,0 +1,95 @@ +<div class="col-md-12" ng-controller="LoanFuturePaymentController"> + <ul class="breadcrumb"> + <li><a href="#/viewloanaccount/{{accountId}}">{{'label.anchor.viewloanaccount' | translate}}</a></li> + <li class="active">{{'label.anchor.futurepayment' | translate}}</li> + </ul> + <form class="form-horizontal well" novalidate="" name="futurepaymentform" rc-submit="submit()"> + <api-validate></api-validate> + <fieldset> + <legend>{{'label.heading.loan.futurepayments' | translate}}</legend> + <div class="form-group"> + <label class="control-label col-sm-2">{{'label.input.paymentdate' | translate}}<span + class="required">*</span></label> + <div class="col-sm-3"> + <input id="paymentDate" name="paymentDate" class="form-control" type="text" sort datepicker-pop="dd MMMM yyyy" + ng-model="formData.paymentDate" max="restrictDate" is-open="opened"/> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2">{{'label.input.paymenttype' | translate}}<span + class="required">*</span></label> + <div class="radio-inline"> + <label> + <input type="radio" ng-model="formData.paymentType" value="partial">{{'label.input.partialPayment' + |translate}} + </label> + </div> + <div class="radio-inline"> + <label> + <input type="radio" ng-model="formData.paymentType" value="full">{{'label.input.fullPayment' + |translate}} + </label> + </div> + </div> + <div class="col-md-offset-3"> + <button id="cancel" type="reset" class="btn btn-default" ng-click="cancel()">{{ 'label.button.cancel' | translate }}</button> + <button id="save" type="submit" class="btn btn-primary" ng-click="simulatePayment()">{{ 'label.button.process' | translate }}</button> + </div> + <br/> + <br/> + <div class="form-group"> + <label class="control-label col-sm-2">{{'label.input.bank.agreements' | translate}}</label> + </div> + <!-- table with loan bank agreements payment details --> + <div class="col-md-3 col-md-offset-1"> + <table class="table"> + <thead> + <tr class="graybg"> + <th>{{'label.heading.futurepayment.bank' | translate}} : {{'label.heading.futurepayment.agreement' | translate}}</th> + </tr> + </thead> + <tbody> + <tr ng-repeat="loanBankAgreement in simulationPaymentData.loanBankAgreements"> + <td>{{loanBankAgreement}}</td> + </tr> + </tbody> + </table> + </div> + <br/> + <br/> + <div style="clear:both"> + + </div> + <div class="form-group" style="margin-top: 20px;"> + <label class="control-label col-sm-2">{{'label.anchor.futurepayment.details' | translate}}</label> + </div> + <!-- table with loan future payment details --> + <div class="col-md-6 col-md-offset-1"> + <table class="table"> + <thead> + <tr class="graybg"> + <th>{{'label.heading.futurepayment.code' | translate}}</th> + <th>{{'label.heading.futurepayment.principal' | translate}}</th> + <th>{{'label.heading.futurepayment.interest' | translate}}</th> + <th>{{'label.heading.futurepayment.lateinterest' | translate}}</th> + <th>{{'label.heading.futurepayment.totalamount' | translate}}</th> + <th>{{'label.heading.futurepayment.availableguarantee' | translate}}</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{simulationPaymentData.paymentCode}}</td> + <td>{{simulationPaymentData.principalPortion | number}}</td> + <td>{{simulationPaymentData.interestPortion | number}}</td> + <td>{{simulationPaymentData.lateInterestPortion | number}}</td> + <td>{{simulationPaymentData.totalAmount | number}}</td> + <td>0</td> + </tr> + </tbody> + </table> + </div> + <br/> + </fieldset> + <br/> + </form> +</div> \ No newline at end of file diff --git a/app/views/loans/restructurecredits.html b/app/views/loans/restructurecredits.html new file mode 100755 index 0000000000..26870542e1 --- /dev/null +++ b/app/views/loans/restructurecredits.html @@ -0,0 +1,173 @@ +<div class="content-container" ng-controller="RestructureCreditsController"> + <div class="card"> + <div class="content"> + <div class="toolbar"> + <h4>{{'label.heading.creditrestructure' | translate}}</h4> + </div> + <br/> + <div ng-if="clientData"> + <div class="alert alert-info"> + <span>{{'label.input.clientName' | translate}}<span + class="pull-right">{{clientData.displayName}}</span></span> + </div> + <div class="alert alert-info"> + <span>{{'label.input.office' | translate}}<span class="pull-right">{{clientData.officeName}}</span></span> + </div> + </div> + + <hr/> + <div ng-if="activeLoans && !requestData"> + <div class="alert alert-default row m-1" ng-repeat="loan in activeLoans"> + <div class="col-md-9"> + <div class="h5">{{'label.heading.loanproduct' | translate}} <span + class="pull-right">{{loan.loanProductName}}</span></div> + <div class="h5">{{'label.heading.loanoutstanding' | translate}} <span + class="pull-right">{{loan.currency.code}} {{loan.summary.totalOutstanding | number}}</span> + </div> + <div class="h5">{{'label.heading.disbursementdate' | translate}} - + {{loan.timeline.actualDisbursementDate | DateFormat}} <span + class="pull-right">{{'label.account.maturity.date' | translate}} - {{loan.timeline.expectedMaturityDate | DateFormat}}</span> + </div> + </div> + <div class="col-md-3"> + <input type="checkbox" ng-change="computeTotalBalance()" + style="width: 20px; height: 20px; display: inline-block; vertical-align: middle; cursor: pointer;" + class="pull-right" ng-model="activeLoans[$index].selected"> + </div> + + </div> + + </div> + <hr/> + <h4 class="text-danger" ng-if="!activeLoans || activeLoans.length<=0">{{'label.heading.noactiveloans' | translate}}</h4> + + <form ng-if="activeLoans && activeLoans.length>0 && !requestData" class="form-horizontal" + name="restructureform" novalidate="" + rc-submit="submit()"> + <api-validate></api-validate> + + <fieldset> + <div class="form-group"> + <label class="control-label col-sm-2 width20" style="text-align: left;">{{ 'label.input.product' | translate }}</label> + <div class="col-sm-3 paddedbottom10 paddedtop"> + <select id="productId" ng-model="formData.productId" class="form-control" + ng-options="prod.id as prod.name for prod in loanProductData" required="required" + value="{{prod.id}}"></select> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="restructureform" valattribute="productId"/> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-2 width20" style="text-align: left;">{{ 'label.input.totalLoanAmount' | translate }}</label> + <div class="col-sm-3 paddedbottom10 paddedtop"> + <input type="text" disabled id="outstanding" name="outstanding" ng-model="outstandingBalance" + class="form-control" + required="required" late-Validate/> + </div> + <div class="col-sm-2"> + <form-validate valattributeform="restructureform" valattribute="outstanding"/> + </div> + </div> + + <div class="form-group"> + + <label class="control-label col-sm-2 width20" style="text-align: left;">{{ 'label.input.comments' | translate }}</label> + <div class="col-sm-3 paddedbottom10 paddedtop"> + + <textarea rows="3" style="width: 402px; height: 76px;" class="form-control" ng-model="formData.comments" ></textarea> + </div> + </div> + + <div class="form-group"> + + <label class="control-label col-sm-2 width20" style="text-align: left;"> {{ 'label.heading.disbursementdate' | translate }}</label> + <div class="col-sm-3 paddedbottom10 paddedtop"> + + <input id="expectedDisbursementDate" sort type="text" name="expecteddisbursementon" datepicker-pop="dd MMMM yyyy" ng-model="formData.disbursementDate" + is-open="opened1" min="minDate" class="form-control" required /> + </div> + + <div class="col-sm-2"> + <form-validate valattributeform="restructureform" valattribute="expectedDisbursementDate"/> + </div> + </div> + + </fieldset> + + + </form> + <div class="text-center" ng-if="!requestData"> + <button class="btn btn-warning" ng-click="cancel()">{{'label.button.cancel' | translate}}</button> + <button class="btn btn-success" ng-click="submit()" ng-disabled="!activeLoans || activeLoans.length<=0">{{'label.button.submit' | translate}}</button> + </div> + + <div ng-if="requestData"> + <h4>{{'loanStatusType.submitted.and.pending.approval' | translate}}</h4> + + <div class="alert alert-info"> + <span>{{'label.input.product' | translate}}<span + class="pull-right">{{requestData.productName}}</span></span> + </div> + <div class="alert alert-info"> + <span>{{'label.input.totalLoanAmount' | translate}}<span + class="pull-right fa-bold">{{requestData.totalLoanAmount}}</span></span> + </div> + <div class="alert alert-info"> + <span>{{'label.input.status' | translate}}<span + class="pull-right">{{requestData.status.code |translate}}</span></span> + </div> + <div class="alert alert-info"> + <span>{{'label.input.addedBy' | translate}}<span + class="pull-right">{{requestData.requestedByUser}}</span></span> + </div> + <div class="alert alert-info"> + <span>{{'label.heading.disbursementdate' | translate}}<span + class="pull-right">{{resolveDateTime(requestData.newDisbursementDate)}}</span></span> + </div> + + <div class="alert alert-info"> + <span>{{'label.createdon' | translate}}<span + class="pull-right">{{resolveDateTime(requestData.dateRequested)}}</span></span> + </div> + <table class="table table-striped"> + <tr> + <th>{{'label.input.product'|translate}}</th> + <th>{{'label.input.totalLoanAmount'|translate}}</th> + <th>{{'label.heading.disbursementdate'|translate}}</th> + <th>{{'label.account.maturity.date'|translate}}</th> + </tr> + <tr ng-repeat="loan in requestData.loanMappingData"> + <td>{{loan.loanProduct}}</td> + <td>{{loan.outstandingBalance}}</td> + <td>{{loan.disbursementDate|DateFormat}}</td> + <td>{{loan.maturityDate|DateFormat}}</td> + </tr> + </table> + + <div class="text-center"> + <button class="btn btn-warning" ng-click="cancel()">{{'label.button.cancel' | translate}}</button> + <button class="btn btn-success" ng-click="processRequest('approve')">{{'label.button.approve' | translate}}</button> + <button class="btn btn-danger" ng-click="processRequest('reject')">{{'label.button.reject' | translate}}</button> + </div> + </div> + + </div> + </div> + + <script type="text/ng-template" id="processRequest.html"> + <div class="modal-header silver"> + <h3 class="bolder">{{'label.heading.confirm' | translate}}</h3> + </div> + <div class="modal-body"> + <api-validate></api-validate> + <div>{{'are.you.sure'|translate}} {{action}}</div> + <br> + <button class="btn btn-warning" ng-click="cancel()">{{'label.button.cancel' | translate}}</button> + <button class="btn btn-primary" ng-click="processRequest()"> {{'label.button.confirm' | translate}}</button> + </div> + </script> +</div> + + diff --git a/app/views/prequalifications/editgroup.html b/app/views/prequalifications/editgroup.html new file mode 100644 index 0000000000..4f5c2b44ff --- /dev/null +++ b/app/views/prequalifications/editgroup.html @@ -0,0 +1,183 @@ +<div ng-controller="EditGroupPrequalificatoinController"> + <div> + <ul class="breadcrumb"> + <li><a href="#/prequalificationGroups/new">{{'label.anchor.prequalifications' | translate}}</a></li> + <li class="active">{{'label.heading.editgroup.prequalification' | translate}}</li> + </ul> + </div> + <api-validate></api-validate> + <form name="groupDetailsForm" novalidate="" class="well form-inline" ng-submit="updatePreQualification()"> + <fieldset> + <legend>{{ 'label.heading.editgroup.prequalification' | translate }}</legend> + <table class="width100"> + <tr> + <td class="width14"> + <label>{{ 'label.input.agency' | translate }}<span class="required">*</span>: </label> + </td> + <td class="width36 paddedbottom10"> + <select id="agency" ng-model="formData.agencyId" + ng-options="agency.id as agency.name for agency in agenciesList" value="{{agency.id}}" + class="form-control width170px" required late-validate> +<!-- <option style="display:none" value="">{{'label.input.agency' | translate}}</option>--> + </select> + <form-validate valattributeform="groupDetailsForm" valattribute="productId"/> + </td> + + <td class="width14"> + <label>{{ 'label.input.select.center' | translate }}<span + class="required">*</span>: </label> + </td> + <td class="width36 paddedbottom10"> + <select id="centerId" ng-model="formData.centerId" + ng-options="pcenter.id as pcenter.name for pcenter in centersList" + value="{{pcenter.id}}" + class="form-control width170px" required="true" late-Validate> + <!-- <option style="display:none" value="">{{'label.input.select.center' | translate}}</option>--> + </select> + <form-validate valattributeform="groupDetailsForm" valattribute="centerId"/> + </td> + + </tr> + <tr ng-if="centersList && centersList.length>0"> + <td class="width14"> + <label>{{ 'label.input.groupname' | translate }}<span class="required">*</span>: </label> + </td> + <td class="width36 paddedbottom10"> + <input type="text" class="form-control" name="grpnm" ng-model="formData.groupName" id="grpnm" required> + <form-validate valattributeform="groupDetailsForm" valattribute="groupId"/> + </td> + <td class="width14"> + <label>{{ 'label.input.prequalification.number' | translate }}<span + class="required">*</span>: </label> + </td> + <td class="width36 paddedbottom10"> + <div class="alert alert-info"> + <span>{{'label.input.prequalification.number'|translate}}: <span class="pull-right">{{formData.prequalificationNumber}}</span></span> + </div> + </td> + </tr> + <tr ng-if="productsList && productsList.length>0"> + <td class="width14"> + <label>{{ 'label.input.selectproduct' | translate }}<span + class="required">*</span>: </label> + </td> + <td class="width36 paddedbottom10"> + <select id="product" ng-model="formData.productId" + ng-options="product.id as product.name for product in productsList" + value="{{product.id}}" required late-validate + class="form-control width170px"> +<!-- <option style="display:none" value="">{{'label.input.selectproduct' | translate}}</option>--> + </select> + <form-validate valattributeform="groupDetailsForm" valattribute="product"/> + </td> + </tr> + <tr ng-if="facilitators && facilitators.length>0"> + <td class="width14"> + <label>{{ 'label.input.facilitator' | translate }}<span + class="required">*</span>: </label> + </td> + <td class="width36 paddedbottom10"> + <select id="facilitator" ng-model="formData.facilitator" + ng-options="facilitator.id as facilitator.firstname + ' ' + facilitator.lastname + ' (' + facilitator.username + ')' for facilitator in facilitators" + value="{{facilitator.id}}" required late-validate + class="form-control width170px"> +<!-- <option style="display:none" value="">{{'label.input.selectproduct' | translate}}</option>--> + </select> + <form-validate valattributeform="groupDetailsForm" valattribute="facilitator"/> + </td> + </tr> + + </table> + + <hr/> + <table class="width100" style="table-layout: fixed" + ng-if="formData.members && formData.members.length>0"> + <tr> + <th>{{'label.input.name'|translate}}</th> + <th>{{'label.input.dpi'|translate}}</th> + <th>{{'label.input.dateofbirth'|translate}}</th> + <th>{{'label.input.amount.requested'|translate}}</th> + <th>{{'label.input.work.with.puente' | translate}}</th> + <th></th> + </tr> + + <tr ng-repeat="member in formData.members"> + <td>{{member.name}}</td> + <td>{{member.dpi}}</td> + <td>{{member.dob | DateFormat}}</td> + <td>{{member.requestedAmount| number}}</td> + <td>{{member.workWithPuente}}</td> + <td><a ng-click="removeMember($index)" uib-tooltip="{{'label.remove.row' | translate}}"><i class="fa fa-times"></i></a></td> + </tr> + </table> + + <hr/> + <div class="text-center"> + <a id="cancel" ng-href="#/prequalificationsmenu" class="btn btn-default">{{'label.button.cancel' | + translate}}</a> + <button id="submit" type="submit" class="btn btn-primary" ng-disabled="formData.members.length<=0 || (!formData.group && !formData.groupName)?true:false" + has-permission='UPDATE_PREQUALIFICATIONS'>{{'label.button.edit' | translate}}</button> + </div> + </fieldset> + </form> + <hr/> + + <legend>{{ 'label.heading.add.groupmembers' | translate }}</legend> + + <ui-validate></ui-validate> + + <form name="memberDetailsForm" novalidate="" rc-submit="addMemberData()"> + + <table class="width100" style="table-layout: fixed"> + <tr> + <th>{{'label.input.name'|translate}}</th> + <th>{{'label.input.dpi'|translate}}</th> + <th>{{'label.input.dateofbirth'|translate}}</th> + <th>{{'label.input.amount.requested'|translate}}</th> + <th>{{'label.input.work.with.puente' | translate}}</th> + </tr> + <tr> + <td> + <input type="text" class="form-control" name="name" + placeholder="{{'label.heading.clientname'|translate}}" + ng-model="membersForm.name" id="clientname" required> + <form-validate valattributeform="memberDetailsForm" valattribute="name"/> + </td> + <td> + <input type="text" class="form-control" name="dpi" + placeholder="{{'label.input.dpi' | translate}}" ng-model="membersForm.dpi" + id="dpi" required> + <form-validate valattributeform="memberDetailsForm" valattribute="dpi"/> + </td> + <td> + <input id="dob" type="text" name="dob" datepicker-pop="dd MMMM yyyy" + ng-model="membersForm.dob" is-open="opened1" min="minDate" max="restrictDate" + class="form-control" required/> + <form-validate valattributeform="memberDetailsForm" valattribute="dob"/> + </td> + + <td> + <input type="text" class="form-control" name="amount" + placeholder="{{'label.input.amount.requested' |translate}}" + ng-model="membersForm.requestedAmount" id="amount" required> + <form-validate valattributeform="memberDetailsForm" valattribute="amount"/> + </td> + + <td> + <select id="puente" ng-model="membersForm.workWithPuente" + ng-options="item.value as item.name for item in yesNo" value="{{group.value}}" + class="form-control" required="required" required> + <option style="display:none" value="">{{'label.input.work.with.puente' | translate}}</option> + </select> + <form-validate valattributeform="memberDetailsForm" valattribute="puente"/> + </td> + + <td class="text-center"> + <button id="save" class="btn btn-primary" type="submit"><i class="fa fa-plus" has-permission='CREATE_PREQUALIFICATIONS'> {{'label.button.add' | translate}}</i> + </button> + </td> + </tr> + </table> + </form> + +</div> diff --git a/app/views/prequalifications/existingGroupPrequalification-backup.html b/app/views/prequalifications/existingGroupPrequalification-backup.html new file mode 100644 index 0000000000..60d7794fea --- /dev/null +++ b/app/views/prequalifications/existingGroupPrequalification-backup.html @@ -0,0 +1,147 @@ +<div ng-controller="NewGroupPrequalificatoinController"> + <div> + <ul class="breadcrumb"> + <li><a href="#/prequalificationsmenu">{{'label.anchor.prequalifications' | translate}}</a></li> + <li class="active">{{'label.heading.newgroup.prequalification' | translate}}</li> + </ul> + </div> + <api-validate></api-validate> + <form name="groupDetailsForm" novalidate="" class="well form-inline" ng-submit="prequalifyGroup()"> + <fieldset> + <legend>{{ 'label.heading.newgroup.prequalification' | translate }}</legend> + <table class="width100"> + <tr> + <td class="width14"> + <label>{{ 'label.input.agency' | translate }}<span class="required">*</span>: </label> + </td> + <td class="width36 paddedbottom10"> + <select id="agency" ng-model="formData.agencyId" + ng-options="agency.id as agency.name for agency in agenciesList" value="{{agency.id}}" + class="form-control width170px" required late-validate> + <!-- <option style="display:none" value="">{{'label.input.agency' | translate}}</option>--> + </select> + <form-validate valattributeform="groupDetailsForm" valattribute="productId"/> + </td> + + <td class="width14"> + <label>{{ 'label.input.select.center' | translate }}<span + class="required">*</span>: </label> + </td> + <td class="width36 paddedbottom10"> + <select id="centerId" ng-model="formData.centerId" + ng-options="pcenter.id as pcenter.name for pcenter in centersList" + value="{{pcenter.id}}" ng-change="getGroupsByCenterId(formData.centerId)" + class="form-control width170px" required="true" late-Validate> + <!-- <option style="display:none" value="">{{'label.input.select.center' | translate}}</option>--> + </select> + <form-validate valattributeform="groupDetailsForm" valattribute="centerId"/> + </td> + + </tr> + + <tr ng-if="productsList && productsList.length>0"> + <td class="width14"> + <label>{{ 'label.input.selectproduct' | translate }}<span + class="required">*</span>: </label> + </td> + <td class="width36 paddedbottom10"> + <select id="product" ng-model="formData.productId" + ng-options="product.id as product.name for product in productsList" + value="{{product.id}}" required late-validate + class="form-control width170px"> + <!-- <option style="display:none" value="">{{'label.input.selectproduct' | translate}}</option>--> + </select> + <form-validate valattributeform="groupDetailsForm" valattribute="product"/> + </td> + + <td class="width14"> + <label>{{ 'label.input.facilitator' | translate }}<span + class="required">*</span>: </label> + </td> + <td class="width36 paddedbottom10"> + <select id="facilitator" ng-model="formData.facilitator" + ng-options="responsibleUser.id as responsibleUser.firstname + ' ' + responsibleUser.lastname + ' (' + responsibleUser.username + ')' for responsibleUser in facilitators" + value="{{facilitator.id}}" required late-validate + class="form-control width170px"> + <!-- <option style="display:none" value="">{{'label.input.selectproduct' | translate}}</option>--> + </select> + <form-validate valattributeform="groupDetailsForm" valattribute="facilitator"/> + </td> + </tr> + + <tr ng-if="groupsList && groupsList.length>0"> + <td class="width14"> + <label>{{ 'label.input.group' | translate }}<span class="required">*</span>: </label> + </td> + <td class="width36 paddedbottom10"> + <select id="groupId" ng-model="formData.groupId" + ng-options="group.id as group.name for group in groupsList" + value="{{group.id}}" ng-change="getGroupMembers(formData.groupId)" + class="form-control width170px" required="true" late-Validate> + <!-- <option style="display:none" value="">{{'label.input.select.center' | translate}}</option>--> + </select> + <form-validate valattributeform="groupDetailsForm" valattribute="groupId"/> + </td> + </tr> + + </table> + + <hr/> + <div ng-if="groupData"> + + <h4>{{'label.heading.groupdetails' | translate}}</h4> + <table class="table table-bordered table-striped"> + <tr> + <th>{{'label.input.prequalification.number' | translate}}</th> + <td>{{generatePrequalificationNumber()}}</td> + </tr> + <tr> + <th>{{'label.input.date' | translate}}</th> + <td>{{groupData.createdDate|DateFormat}}</td> + </tr> + <tr> + <th>{{'label.input.office' | translate}}</th> + <td>{{groupData.officeName}}</td> + </tr> + <tr ng-if="groupData.meetingStartTime"> + <th>{{'label.heading.meetingtimes' | translate}}</th> + <td>FROM: {{resolveTime(groupData.meetingStartTime)}} - TO: {{resolveTime(groupData.meetingEndTime)}}</td> + </tr> + </table> + <hr/> + <table class="width100" style="table-layout: fixed" + ng-if="membersList && membersList.length>0"> + <tr> + <th>{{'label.input.name' | translate}}</th> + <th>{{'label.input.dpi' | translate}}</th> + <th>{{'label.input.accountnumber' | translate}}</th> + <th>{{'label.input.dateofbirth' | translate}}</th> + <th>{{'label.input.amount.requested' | translate}}</th> + </tr> + + <tr ng-repeat="member in membersList"> + <td>{{member.displayName}}</td> + <td>{{member.dpiNumber}}</td> + <td>{{member.accountNo}}</td> + <td>{{member.dateOfBirth | DateFormat}}</td> + <td> <input type="text" class="form-control" name="requestedAmount" + placeholder="{{'label.input.amount.requested'|translate}}" + data-ng-model="membersList[$index].requestedAmount" id="requestedAmount{{$index}}" required> + <form-validate valattributeform="groupDetailsForm" valattribute="requestedAmount{{$index}}"/> + </td> + </tr> + </table> + </div> + + <hr/> + <div class="text-center"> + <a id="cancel" ng-href="#/prequalificationsmenu" class="btn btn-default">{{'label.button.cancel' | + translate}}</a> + <button id="submit" type="submit" class="btn btn-primary" + ng-disabled="membersList.length<=0 || !formData.groupId?true:false" + has-permission='CREATE_PREQUALIFICATIONS'>{{'label.button.save' | translate}} + </button> + </div> + </fieldset> + </form> +</div> diff --git a/app/views/prequalifications/existingGroupPrequalification.html b/app/views/prequalifications/existingGroupPrequalification.html index 60d7794fea..fb5aea9153 100644 --- a/app/views/prequalifications/existingGroupPrequalification.html +++ b/app/views/prequalifications/existingGroupPrequalification.html @@ -1,147 +1,76 @@ -<div ng-controller="NewGroupPrequalificatoinController"> +<div class="content-container" ng-controller="PrequalificationsController"> <div> <ul class="breadcrumb"> <li><a href="#/prequalificationsmenu">{{'label.anchor.prequalifications' | translate}}</a></li> - <li class="active">{{'label.heading.newgroup.prequalification' | translate}}</li> + <li class="active">{{'label.heading.existinggroup.prequalification' | translate}}</li> </ul> </div> - <api-validate></api-validate> - <form name="groupDetailsForm" novalidate="" class="well form-inline" ng-submit="prequalifyGroup()"> - <fieldset> - <legend>{{ 'label.heading.newgroup.prequalification' | translate }}</legend> - <table class="width100"> - <tr> - <td class="width14"> - <label>{{ 'label.input.agency' | translate }}<span class="required">*</span>: </label> - </td> - <td class="width36 paddedbottom10"> - <select id="agency" ng-model="formData.agencyId" - ng-options="agency.id as agency.name for agency in agenciesList" value="{{agency.id}}" - class="form-control width170px" required late-validate> - <!-- <option style="display:none" value="">{{'label.input.agency' | translate}}</option>--> - </select> - <form-validate valattributeform="groupDetailsForm" valattribute="productId"/> - </td> + <div class="card"> + <api-validate></api-validate> + <div class="content"> + <div class="row"> - <td class="width14"> - <label>{{ 'label.input.select.center' | translate }}<span - class="required">*</span>: </label> - </td> - <td class="width36 paddedbottom10"> - <select id="centerId" ng-model="formData.centerId" - ng-options="pcenter.id as pcenter.name for pcenter in centersList" - value="{{pcenter.id}}" ng-change="getGroupsByCenterId(formData.centerId)" - class="form-control width170px" required="true" late-Validate> - <!-- <option style="display:none" value="">{{'label.input.select.center' | translate}}</option>--> - </select> - <form-validate valattributeform="groupDetailsForm" valattribute="centerId"/> - </td> - - </tr> - - <tr ng-if="productsList && productsList.length>0"> - <td class="width14"> - <label>{{ 'label.input.selectproduct' | translate }}<span - class="required">*</span>: </label> - </td> - <td class="width36 paddedbottom10"> - <select id="product" ng-model="formData.productId" - ng-options="product.id as product.name for product in productsList" - value="{{product.id}}" required late-validate - class="form-control width170px"> - <!-- <option style="display:none" value="">{{'label.input.selectproduct' | translate}}</option>--> - </select> - <form-validate valattributeform="groupDetailsForm" valattribute="product"/> - </td> - - <td class="width14"> - <label>{{ 'label.input.facilitator' | translate }}<span - class="required">*</span>: </label> - </td> - <td class="width36 paddedbottom10"> - <select id="facilitator" ng-model="formData.facilitator" - ng-options="responsibleUser.id as responsibleUser.firstname + ' ' + responsibleUser.lastname + ' (' + responsibleUser.username + ')' for responsibleUser in facilitators" - value="{{facilitator.id}}" required late-validate - class="form-control width170px"> - <!-- <option style="display:none" value="">{{'label.input.selectproduct' | translate}}</option>--> - </select> - <form-validate valattributeform="groupDetailsForm" valattribute="facilitator"/> - </td> - </tr> - - <tr ng-if="groupsList && groupsList.length>0"> - <td class="width14"> - <label>{{ 'label.input.group' | translate }}<span class="required">*</span>: </label> - </td> - <td class="width36 paddedbottom10"> - <select id="groupId" ng-model="formData.groupId" - ng-options="group.id as group.name for group in groupsList" - value="{{group.id}}" ng-change="getGroupMembers(formData.groupId)" - class="form-control width170px" required="true" late-Validate> - <!-- <option style="display:none" value="">{{'label.input.select.center' | translate}}</option>--> - </select> - <form-validate valattributeform="groupDetailsForm" valattribute="groupId"/> - </td> - </tr> - - </table> - - <hr/> - <div ng-if="groupData"> - - <h4>{{'label.heading.groupdetails' | translate}}</h4> - <table class="table table-bordered table-striped"> - <tr> - <th>{{'label.input.prequalification.number' | translate}}</th> - <td>{{generatePrequalificationNumber()}}</td> - </tr> - <tr> - <th>{{'label.input.date' | translate}}</th> - <td>{{groupData.createdDate|DateFormat}}</td> - </tr> - <tr> - <th>{{'label.input.office' | translate}}</th> - <td>{{groupData.officeName}}</td> - </tr> - <tr ng-if="groupData.meetingStartTime"> - <th>{{'label.heading.meetingtimes' | translate}}</th> - <td>FROM: {{resolveTime(groupData.meetingStartTime)}} - TO: {{resolveTime(groupData.meetingEndTime)}}</td> - </tr> - </table> + <div class="col-sm-6"> + <form ng-submit="getResultsPage(1)" class="form-horizontal"> + <div class="form-group"> + <div class="col-md-8"> + <div class="input-group"> + <input data-ng-model="searchText" type="text" + placeholder="{{'label.input.searchByGroupOrGroupNameOrCenter' | translate}}" + class="form-control unstyled"/> + <span class="input-group-btn"> + <button class="btn btn-primary form-control" ng-disabled="!searchText"> + <span class="fa fa-search"></span> + </button> + </span> + </div> + </div> + </div> + </form> + </div> + <!-- <div class="col-sm-12"> + <a href="#/prequalifications/individual/create" class="btn btn-primary pull-right" + has-permission='CREATE_PREQUALIFICATIONS'><i + class="fa fa-plus"></i> {{'label.heading.newgroup.prequalification' | translate}}</a> + </div> --> <hr/> - <table class="width100" style="table-layout: fixed" - ng-if="membersList && membersList.length>0"> + <table class="table"> + <thead> <tr> - <th>{{'label.input.name' | translate}}</th> - <th>{{'label.input.dpi' | translate}}</th> - <th>{{'label.input.accountnumber' | translate}}</th> - <th>{{'label.input.dateofbirth' | translate}}</th> - <th>{{'label.input.amount.requested' | translate}}</th> + <th>{{'label.heading.prequalificationnumber' | translate}}</th> + <th>{{'label.input.agency' | translate}}</th> + <th>{{'label.input.group' | translate}}</th> + <th>{{'label.input.center' | translate}}</th> + <!-- <th>{{'label.input.portfolio' | translate}}</th>--> + <th>{{'label.input.product' | translate}}</th> + <th>{{'label.input.addedBy' | translate}}</th> + <th>{{'label.heading.action' | translate}}</th> </tr> + </thead> - <tr ng-repeat="member in membersList"> - <td>{{member.displayName}}</td> - <td>{{member.dpiNumber}}</td> - <td>{{member.accountNo}}</td> - <td>{{member.dateOfBirth | DateFormat}}</td> - <td> <input type="text" class="form-control" name="requestedAmount" - placeholder="{{'label.input.amount.requested'|translate}}" - data-ng-model="membersList[$index].requestedAmount" id="requestedAmount{{$index}}" required> - <form-validate valattributeform="groupDetailsForm" valattribute="requestedAmount{{$index}}"/> + <tbody> + <tr dir-paginate="group in groupsList | itemsPerPage: groupsPerPage" class="pointer-main" + total-items="totalGroups" pagination-id="blacklist"> + <td class="pointer" data-ng-click="routeTo('#/prequalification/' + group.id + '/viewdetails')">{{group.prequalificationNumber}}</td> + <td class="pointer">{{group.agencyName}}</td> + <td class="pointer">{{group.groupName}}</td> + <td class="pointer">{{group.centerName}}</small></td> + <!-- <td class="pointer">{{client.portforlioName}}</td>--> + <td class="pointer">{{group.productName}}</td> + <td class="pointer">{{group.addedBy}}</td> + <td class="pointer"> + <a href="#/prequalification/{{group.id}}/viewdetails" has-permission='VIEW_PREQUALIFICATIONS'> + <i class="fa fa-search fa fa-2x" title="View Prequalifications"></i></a> </td> </tr> - </table> - </div> + </tbody> - <hr/> - <div class="text-center"> - <a id="cancel" ng-href="#/prequalificationsmenu" class="btn btn-default">{{'label.button.cancel' | - translate}}</a> - <button id="submit" type="submit" class="btn btn-primary" - ng-disabled="membersList.length<=0 || !formData.groupId?true:false" - has-permission='CREATE_PREQUALIFICATIONS'>{{'label.button.save' | translate}} - </button> + </table> + <dir-pagination-controls align="center" boundary-links="true" + template-url="bower_components/angular-utils-pagination/dirPagination.tpl.html" + on-page-change="getResultsPage(newPageNumber)" pagination-id="blacklist"> + </dir-pagination-controls> </div> - </fieldset> - </form> + </div> + </div> </div> diff --git a/app/views/prequalifications/newgroup.html b/app/views/prequalifications/newgroup.html index 858f9c47cf..ddae33f4ba 100644 --- a/app/views/prequalifications/newgroup.html +++ b/app/views/prequalifications/newgroup.html @@ -90,6 +90,7 @@ <th>{{'label.input.dateofbirth'|translate}}</th> <th>{{'label.input.work.with.puente' | translate}}</th> <th>{{'label.input.amount.requested'|translate}}</th> + <th></th> </tr> <tr ng-repeat="member in formData.members"> @@ -98,6 +99,7 @@ <td>{{member.dob}}</td> <td>{{member.puente}}</td> <td>{{member.amount}}</td> + <td><a ng-click="removeMember($index)" uib-tooltip="{{'label.remove.row' | translate}}"><i class="fa fa-times"></i></a></td> </tr> </table> @@ -114,6 +116,8 @@ <legend>{{ 'label.heading.add.groupmembers' | translate }}</legend> + <ui-validate></ui-validate> + <form name="memberDetailsForm" novalidate="" rc-submit="addMemberData()"> <table class="width100" style="table-layout: fixed"> @@ -154,7 +158,7 @@ </td> <td class="text-center"> - <button id="save" class="btn btn-primary" type="submit"><i class="fa fa-plus"> Add</i> + <button id="save" class="btn btn-primary" type="submit"><i class="fa fa-plus" has-permission='CREATE_PREQUALIFICATIONS'> {{'label.button.add' | translate}}</i> </button> </td> </tr> diff --git a/app/views/prequalifications/prequalificationDetails.html b/app/views/prequalifications/prequalificationDetails.html index 1c9ef566cf..8698c71190 100644 --- a/app/views/prequalifications/prequalificationDetails.html +++ b/app/views/prequalifications/prequalificationDetails.html @@ -4,7 +4,10 @@ <div class="content"> <div class="toolbar"> - <h3>{{'label.anchor.prequalifications' | translate }}</h3> + <ul class="breadcrumb"> + <li><a href="#/prequalificationGroups/new">{{'label.anchor.prequalifications' | translate}}</a></li> + <li class="active">{{'label.anchor.prequalification.details' | translate}}</li> + </ul> </div> <hr/> <div class="row"> @@ -32,6 +35,12 @@ <h3>{{'label.anchor.prequalifications' | translate }}</h3> <div class="alert alert-info"> <span>{{'label.input.addedBy'|translate}}: <span class="pull-right">{{groupData.addedBy}}</span></span> </div> + <div class="alert alert-info"> + <span>{{'label.input.status'|translate}}: <span class="pull-right fa fa-stop {{groupData.status.code | StatusLookup}}" + uib-tooltip-placement="right" uib-tooltip="{{groupData.status.value}}"> + {{groupData.status.value}} </span> + </span> + </div> <div class="alert alert-default" ng-if="groupData.comments"> <span>{{'label.input.comments'|translate}}: <span class="pull-right">{{groupData.comments}}</span></span> </div> @@ -39,6 +48,9 @@ <h3>{{'label.anchor.prequalifications' | translate }}</h3> </div> <hr/> + <div class="toolbar" data-ng-show="showValidatePolicies"> + <h4>{{'label.heading.prequalification.validation.result' | translate}} </h4><i class="fa fa-circle fa-2x {{policyCheckColor(groupData.redValidationCount)}}">{{groupData.redValidationCount}}</i> + </div> <h5 ng-if="groupMembers && groupMembers.length>0">{{'label.heading.members' | translate }}</h5> <table class="width100" style="table-layout: fixed" ng-if="groupMembers && groupMembers.length>0"> @@ -49,6 +61,7 @@ <h5 ng-if="groupMembers && groupMembers.length>0">{{'label.heading.members' | tr <th>{{'label.input.work.with.puente' | translate}}</th> <th>{{'label.input.amount.requested'|translate}}</th> <th>{{'label.input.status' |translate}}</th> + <th data-ng-show="showValidatePolicies" >{{'label.heading.hard.policy.status' |translate}}</th> <th ng-if="groupData.groupId">{{'label.input.totalLoanAmount' |translate}}</th> <th ng-if="groupData.groupId">{{'label.input.totalLoanBalance' |translate}}</th> <th ng-if="groupData.groupId">{{'label.input.totalGuaranteedLoanBalance' |translate}}</th> @@ -62,18 +75,24 @@ <h5 ng-if="groupMembers && groupMembers.length>0">{{'label.heading.members' | tr <td>{{member.dpi}}</td> <td>{{member.dob|DateFormat}}</td> <td>{{member.workWithPuente}}</td> - <td>{{member.requestedAmount}}</td> + <td>{{member.requestedAmount | number}}</td> <td><i class="fa fa-circle fa-2x {{resolveMemberStatus(member.status.value)}}">{{member.blacklistCount}}</i></td> - <td ng-if="groupData.groupId">{{member.totalLoanAmount}}</td> - <td ng-if="groupData.groupId">{{member.totalLoanBalance}}</td> - <td ng-if="groupData.groupId">{{member.totalGuaranteedLoanBalance}}</td> + <td data-ng-show="showValidatePolicies"><i class="fa fa-circle fa-2x {{policyCheckColor(member.redValidationCount)}}">{{member.redValidationCount}}</i></td> + <td ng-if="groupData.groupId">{{member.totalLoanAmount | number}}</td> + <td ng-if="groupData.groupId">{{member.totalLoanBalance | number}}</td> + <td ng-if="groupData.groupId">{{member.totalGuaranteedLoanBalance | number}}</td> <td ng-if="groupData.groupId">{{member.noOfCycles}}</td> <td ng-if="groupData.groupId">{{member.additionalCreditsCount}}</td> - <td ng-if="groupData.groupId">{{member.additionalCreditsSum}}</td> + <td ng-if="groupData.groupId">{{member.additionalCreditsSum | number}}</td> </tr> </table> - + <hr/> + <div> + <button data-ng-show="showValidatePolicies" id="validate" class="btn btn-success" ng-click="validateHardPolicy()" type="button" value="validate" + has-permission='VALIDATEHARDPOLICIES_PREQUALIFICATION_CHECKLIST'>{{'label.button.validate' | translate}} + </button> + </div> <hr/> <table class="table" ng-if="prequalificationDocuments.length > 0"> <thead> @@ -98,7 +117,8 @@ <h5 ng-if="groupMembers && groupMembers.length>0">{{'label.heading.members' | tr </tbody> </table> - <form name="prequalForm" novalidate="" class="card form-horizontal well" rc-submit="submit()" ng-if="prequalificationDocuments.length<=0"> + + <form name="prequalForm" novalidate="" class="card form-horizontal well" rc-submit="submit()" ng-if="prequalificationDocuments.length<=0" data-ng-show="showSupportDocumentUploadPage()"> <api-validate></api-validate> <fieldset> <div class="form-group"> diff --git a/app/views/prequalifications/prequalificationsGroups.html b/app/views/prequalifications/prequalificationsGroups.html index 2f24d08a18..9e02a29fec 100644 --- a/app/views/prequalifications/prequalificationsGroups.html +++ b/app/views/prequalifications/prequalificationsGroups.html @@ -1,5 +1,6 @@ <div class="content-container" ng-controller="PrequalificationsController"> <ul class="breadcrumb"> + <li><a href="#/prequalificationsmenu">{{'label.anchor.prequalifications' | translate}}</a></li> <li class="active">{{'label.anchor.prequalification.groups' | translate}}</li> </ul> @@ -12,22 +13,22 @@ <h4 class="pull-left">{{'label.anchor.prequalification.groups'| translate}}</h4> <br> <div class="row"> <div class="col-sm-6"> - <!-- <form ng-submit="getResultsPage(1)" class="form-horizontal">--> - <!-- <div class="form-group">--> - <!-- <div class="col-md-8">--> - <!-- <div class="input-group">--> - <!-- <input data-ng-model="searchText" type="text"--> - <!-- placeholder="{{'label.input.searchByNameDpi' | translate}}"--> - <!-- class="form-control unstyled"/>--> - <!-- <span class="input-group-btn">--> - <!-- <button class="btn btn-primary form-control" ng-disabled="!searchText">--> - <!-- <span class="fa fa-search"></span>--> - <!-- </button>--> - <!-- </span>--> - <!-- </div>--> - <!-- </div>--> - <!-- </div>--> - <!-- </form>--> + <form ng-submit="getResultsPage(1)" class="form-horizontal"> + <div class="form-group"> + <div class="col-md-8"> + <div class="input-group"> + <input data-ng-model="searchText" type="text" + placeholder="{{'label.input.searchByGroupOrGroupNameOrCenter' | translate}}" + class="form-control unstyled"/> + <span class="input-group-btn"> + <button class="btn btn-primary form-control" ng-disabled="!searchText"> + <span class="fa fa-search"></span> + </button> + </span> + </div> + </div> + </div> + </form> </div> <div class="col-sm-3"> @@ -35,7 +36,8 @@ <h4 class="pull-left">{{'label.anchor.prequalification.groups'| translate}}</h4> </div> <div class="col-sm-3"> - <a href="#/prequalifications/newprequalification/{{prequalificationType}}" class="btn btn-primary pull-right" has-permission='CREATE_PREQUALIFICATIONS'><i + <!-- Only show New Pre-qualification button if type is not existing--> + <a ng-if="prequalificationType !== 'existing'" href="#/prequalifications/newprequalification/{{prequalificationType}}" class="btn btn-primary pull-right" has-permission='CREATE_PREQUALIFICATIONS'><i class="fa fa-plus"></i> {{'label.heading.newgroup.prequalification' | translate}}</a> </div> </div> @@ -67,6 +69,8 @@ <h4 class="pull-left">{{'label.anchor.prequalification.groups'| translate}}</h4> <td class="pointer"> <a href="#/prequalification/{{client.id}}/viewdetails" has-permission='VIEW_PREQUALIFICATIONS'> <i class="fa fa-search fa fa-2x" title="View Prequalifications"></i></a> + <a href="#/prequalification/{{client.id}}/edit" has-permission='EDIT_PREQUALIFICATIONS'> + <i class="fa fa-edit fa fa-2x" title="Edit Prequalifications"></i></a> </td> </tr> </tbody> diff --git a/app/views/prequalifications/prequalificationsMenu.html b/app/views/prequalifications/prequalificationsMenu.html index 21f633e303..f648eaffa5 100644 --- a/app/views/prequalifications/prequalificationsMenu.html +++ b/app/views/prequalifications/prequalificationsMenu.html @@ -10,34 +10,34 @@ <h5>{{'label.anchor.prequalifications' | translate }}</h5> <div class="list-group"> <a class="list-group-item" href="#/prequalificationGroups/new" has-permission='CREATE_PREQUALIFICATIONS'> <h5 class="list-group-item-heading"> - <i class="fa fa-large fa fa-cogs"></i> {{'label.heading.newgroup.prequalification' - | translate}}</h5> - </a> - </div> - <div class="list-group"> - <a class="list-group-item" href="#/prequalificationGroups/existing" has-permission='VIEW_PREQUALIFICATIONS'> - <h5 class="list-group-item-heading"> - <i class="fa fa-large fa fa-cogs"></i> {{'label.heading.existinggroup.prequalification' - | translate}}</h5> - </a> - </div> - <div class="list-group"> - <a class="list-group-item" href="#/prequalificationGroups/chanimcredit" has-permission='VIEW_PREQUALIFICATIONS'> - <h5 class="list-group-item-heading"> - <i class="fa fa-large fa fa-cogs"></i> {{'label.heading.chanimcredit.prequalification' + <i class="fa fa-large fa fa-cogs"></i> {{'label.heading.groupcredit.prequalification' | translate}}</h5> </a> </div> + <!-- <div class="list-group"> + <a class="list-group-item" href="#/prequalifications/newprequalification/existing" has-permission='VIEW_PREQUALIFICATIONS'> + <h5 class="list-group-item-heading"> + <i class="fa fa-large fa fa-cogs"></i> {{'label.heading.existinggroup.prequalification' + | translate}}</h5> + </a> + </div> --> + <!-- <div class="list-group"> + <a class="list-group-item" href="#/prequalificationGroups/chanimcredit" has-permission='VIEW_PREQUALIFICATIONS'> + <h5 class="list-group-item-heading"> + <i class="fa fa-large fa fa-cogs"></i> {{'label.heading.chanimcredit.prequalification' + | translate}}</h5> + </a> + </div> --> </div> <div class="col-sm-6"> - <div class="list-group"> - <a class="list-group-item" href="#/prequalificationGroups/parallelcredit" has-permission='VIEW_PREQUALIFICATIONS'> - <h5 class="list-group-item-heading"> - <i class="fa fa-large fa fa-cogs"></i> {{'label.heading.parallelcredit.prequalification' - | translate}}</h5> - </a> - </div> + <!-- <div class="list-group"> + <a class="list-group-item" href="#/prequalificationGroups/parallelcredit" has-permission='VIEW_PREQUALIFICATIONS'> + <h5 class="list-group-item-heading"> + <i class="fa fa-large fa fa-cogs"></i> {{'label.heading.parallelcredit.prequalification' + | translate}}</h5> + </a> + </div> --> <div class="list-group"> <a class="list-group-item" href="#/prequalifications/individualprequalifications" has-permission='VIEW_PREQUALIFICATIONS'> <h5 class="list-group-item-heading"> diff --git a/package-lock.json b/package-lock.json index 8afc7cfbf0..b7feb20024 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3125,6 +3125,12 @@ } } }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true + }, "graceful-readlink": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", @@ -3547,6 +3553,258 @@ } } }, + "grunt-devcode": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/grunt-devcode/-/grunt-devcode-0.0.4.tgz", + "integrity": "sha1-pTfB/efuEzGxjf3Ae/iPDFteOwc=", + "dev": true, + "requires": { + "grunt": "~0.4.0" + }, + "dependencies": { + "argparse": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", + "dev": true, + "requires": { + "underscore": "~1.7.0", + "underscore.string": "~2.4.0" + }, + "dependencies": { + "underscore.string": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=", + "dev": true + } + } + }, + "async": { + "version": "0.1.22", + "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", + "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=", + "dev": true + }, + "dateformat": { + "version": "1.0.2-1.2.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz", + "integrity": "sha1-sCIMAt6YYXQztyhRz0fePfLNvuk=", + "dev": true + }, + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", + "dev": true + }, + "findup-sync": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", + "integrity": "sha1-fz56l7gjksZTvwZYm9hRkOk8NoM=", + "dev": true, + "requires": { + "glob": "~3.2.9", + "lodash": "~2.4.1" + }, + "dependencies": { + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "requires": { + "inherits": "2", + "minimatch": "0.3" + } + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "dev": true, + "requires": { + "graceful-fs": "~1.2.0", + "inherits": "1", + "minimatch": "~0.2.11" + }, + "dependencies": { + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true + } + } + }, + "grunt": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", + "integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=", + "dev": true, + "requires": { + "async": "~0.1.22", + "coffee-script": "~1.3.3", + "colors": "~0.6.2", + "dateformat": "1.0.2-1.2.3", + "eventemitter2": "~0.4.13", + "exit": "~0.1.1", + "findup-sync": "~0.1.2", + "getobject": "~0.1.0", + "glob": "~3.1.21", + "grunt-legacy-log": "~0.1.0", + "grunt-legacy-util": "~0.2.0", + "hooker": "~0.2.3", + "iconv-lite": "~0.2.11", + "js-yaml": "~2.0.5", + "lodash": "~0.9.2", + "minimatch": "~0.2.12", + "nopt": "~1.0.10", + "rimraf": "~2.2.8", + "underscore.string": "~2.2.1", + "which": "~1.0.5" + } + }, + "grunt-legacy-log": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", + "integrity": "sha1-7ClCboAwIa9ZAp+H0vnNczWgVTE=", + "dev": true, + "requires": { + "colors": "~0.6.2", + "grunt-legacy-log-utils": "~0.1.1", + "hooker": "~0.2.3", + "lodash": "~2.4.1", + "underscore.string": "~2.3.3" + }, + "dependencies": { + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true + }, + "underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", + "dev": true + } + } + }, + "grunt-legacy-log-utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", + "integrity": "sha1-wHBrndkGThFvNvI/5OawSGcsD34=", + "dev": true, + "requires": { + "colors": "~0.6.2", + "lodash": "~2.4.1", + "underscore.string": "~2.3.3" + }, + "dependencies": { + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true + }, + "underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", + "dev": true + } + } + }, + "grunt-legacy-util": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", + "integrity": "sha1-kzJIhNv343qf98Am3/RR2UqeVUs=", + "dev": true, + "requires": { + "async": "~0.1.22", + "exit": "~0.1.1", + "getobject": "~0.1.0", + "hooker": "~0.2.3", + "lodash": "~0.9.2", + "underscore.string": "~2.2.1", + "which": "~1.0.5" + } + }, + "iconv-lite": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", + "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=", + "dev": true + }, + "js-yaml": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", + "integrity": "sha1-olrmUJmZ6X3yeMZxnaEb0Gh3Q6g=", + "dev": true, + "requires": { + "argparse": "~ 0.1.11", + "esprima": "~ 1.0.2" + } + }, + "lodash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", + "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true + }, + "underscore.string": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", + "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=", + "dev": true + } + } + }, "grunt-gh-pages": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/grunt-gh-pages/-/grunt-gh-pages-4.0.0.tgz", @@ -3841,16 +4099,6 @@ } } }, - "grunt-preprocess": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/grunt-preprocess/-/grunt-preprocess-5.1.0.tgz", - "integrity": "sha512-akQU6U8ULt8gLC6yeGFSBqWQUAqMQPFMm0jAIL4FVIIEkzp3unjDUxu/ZBpbJhiQ9i4IP1M1S6wsdMjE0QsrhQ==", - "dev": true, - "requires": { - "lodash": "^4.5.0", - "preprocess": "^3.0.2" - } - }, "grunt-replace": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/grunt-replace/-/grunt-replace-1.0.1.tgz", @@ -5667,6 +5915,12 @@ "signal-exit": "^3.0.0" } }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -7009,15 +7263,6 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, - "preprocess": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/preprocess/-/preprocess-3.2.0.tgz", - "integrity": "sha512-cO+Rf+Ose/eD+ze8Hxd9p9nS1xT8thYqv8owG/V8+IS/Remd7Z17SvaRK/oJxp08yaM8zb+QTckDKJUul2pk7g==", - "dev": true, - "requires": { - "xregexp": "3.1.0" - } - }, "preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", @@ -8012,6 +8257,12 @@ "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", "dev": true }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -9171,6 +9422,12 @@ "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", "dev": true }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", + "dev": true + }, "underscore.string": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", @@ -9596,12 +9853,6 @@ "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", "dev": true }, - "xregexp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-3.1.0.tgz", - "integrity": "sha512-4Y1x6DyB8xRoxosooa6PlGWqmmSKatbzhrftZ7Purmm4B8R4qIEJG1A2hZsdz5DhmIqS0msC0I7KEq93GphEVg==", - "dev": true - }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",