diff --git a/Apollo/api/application/controllers/Receive_Enrolment_Fees_Univ_Controller.php b/Apollo/api/application/controllers/Receive_Enrolment_Fees_Univ_Controller.php index c2cb6cff..01120c37 100644 --- a/Apollo/api/application/controllers/Receive_Enrolment_Fees_Univ_Controller.php +++ b/Apollo/api/application/controllers/Receive_Enrolment_Fees_Univ_Controller.php @@ -273,6 +273,8 @@ class Receive_Enrolment_Fees_Univ_Controller extends REST_Controller { } } + // get formid draft mode list details + // kdk public function getForFormIdDraftDetails_post(){ $reqBranch = $this->post('localDetails'); $getForFormIdDraftDetails = $this->receive_model->getForFormIdDraftDetails(); // Check if the employee exist @@ -288,6 +290,8 @@ class Receive_Enrolment_Fees_Univ_Controller extends REST_Controller { } } + // add formid manual details form the university and draftmode + // kdk public function addForFormIdDraftDetails_post(){ $reqBranch = $this->post('localDetails'); $details = $this->post('details'); @@ -306,6 +310,8 @@ class Receive_Enrolment_Fees_Univ_Controller extends REST_Controller { } } + // manual formid entry draft details move to the list details + // kdk public function draftMovetoList_post(){ $reqBranch = $this->post('localDetails'); $details = $this->post('details'); @@ -322,6 +328,8 @@ class Receive_Enrolment_Fees_Univ_Controller extends REST_Controller { } } + // edit draft mode formid manul entry details + // kdk public function editDraftFormIdFeesDetails_post(){ $reqBranch = $this->post('localDetails'); $details = $this->post('details'); @@ -341,7 +349,8 @@ class Receive_Enrolment_Fees_Univ_Controller extends REST_Controller { } } - // get formid fee details list with status + // get formid , fee details form the file upload for the university , course, student + // kdk public function getStudentUnivFormIdFeeDatailsList_post(){ $reqBranchData = $this->post('data'); $searchDetails = $this->post('search'); @@ -359,6 +368,8 @@ class Receive_Enrolment_Fees_Univ_Controller extends REST_Controller { } } + // get formid status list for that particular record + // kdk public function getFormIdDetailsStatusUpdateList_post(){ $reqBranchData = $this->post('localDetails'); $statusDetailsId = $this->post('detailsID'); @@ -376,6 +387,8 @@ class Receive_Enrolment_Fees_Univ_Controller extends REST_Controller { } } + // add formid list file status list for that record + // kdk public function insertStatusUpdateDetails_post(){ $reqBranchData = $this->post('localDetails'); $statusDetails = $this->post('details'); @@ -413,6 +426,8 @@ class Receive_Enrolment_Fees_Univ_Controller extends REST_Controller { } } + // get unmatched records of the formid file details , compare with file 1 + // kdk public function getUnmatchedFormIdFeesDetails_post(){ $localDetails = $this->post('localDetails'); $getDetailsFor = $this->post('getDetailsFor'); @@ -430,6 +445,8 @@ class Receive_Enrolment_Fees_Univ_Controller extends REST_Controller { } } + // add fromid university amount details to account state + // kdk public function addToAccountStateList_post(){ $localDetails = $this->post('localDetails'); $getDetailsFor = $this->post('details'); diff --git a/Apollo/api/application/models/Receive_Enrolment_Fees_Univ_model.php b/Apollo/api/application/models/Receive_Enrolment_Fees_Univ_model.php index 8ebda10d..e4c23cf8 100644 --- a/Apollo/api/application/models/Receive_Enrolment_Fees_Univ_model.php +++ b/Apollo/api/application/models/Receive_Enrolment_Fees_Univ_model.php @@ -367,7 +367,8 @@ class Receive_Enrolment_Fees_Univ_model extends CI_Model { return $finalArray; } - + // add student formid feedetails from the university by file upload , with check the unique entry + // kdk public function formIdFeeDetails($formFeeDetails=null,$local=null, $univ =null){ $localBranchID = $local['localBranchID']; $localUserID = $local['localUserID']; @@ -890,6 +891,8 @@ class Receive_Enrolment_Fees_Univ_model extends CI_Model { return $resultArray; } + // get formid draft mode list details + // kdk public function getForFormIdDraftDetails(){ $selectQuery = "SELECT * FROM T_FormId_FeeDetails_Received_From_University WHERE DraftStatus = 1"; $details = $this->db->query($selectQuery); @@ -906,6 +909,8 @@ class Receive_Enrolment_Fees_Univ_model extends CI_Model { return $result; } + // add formid manual details form the university and draftmode + // kdk public function addForFormIdDraftDetails($details, $local, $univ =null){ $localBranchID = $local['localBranchID']; @@ -988,6 +993,8 @@ class Receive_Enrolment_Fees_Univ_model extends CI_Model { return $result; } + // manual formid entry draft details move to the list details + // kdk public function draftMovetoList($detail, $local){ // print_r($details);exit(); @@ -1016,6 +1023,8 @@ class Receive_Enrolment_Fees_Univ_model extends CI_Model { return $result; } + // edit draft mode formid manul entry details + // kdk public function editDraftFormIdFeesDetails($reqBranch, $details, $detailsID){ $ids = $detailsID; $formIds = $details['FormID']; @@ -1085,6 +1094,8 @@ $result['updatedraftStatus'] = false; return $result; } + // get formid , fee details form the file upload for the university , course, student + // kdk public function getStudentUnivFormIdFeeDatailsList($reqBranchData, $searchDetails){ $this->db->select('FUD.*, concat(ST.FirstName," ", ST.Lastname) as app_StudentName, IF(concat(ST.FirstName," " , ST.Lastname) = FUD.Student_Name, "YES", "NO") as StudentNameStatus , @@ -1154,6 +1165,8 @@ $result['updatedraftStatus'] = false; } + // get formid status list for that particular record + // kdk public function getFormIdDetailsStatusUpdateList($reqBranchData, $searchDetails){ $selectQuery = "SELECT * , concat(t3.Firstname, '', t3.Lastname) as CreatedByName FROM T_FormId_FeeDetails_Received_From_University_StatusUpdate as t1 @@ -1174,6 +1187,8 @@ $result['updatedraftStatus'] = false; return $result; } + // add formid list file status list for that record + // kdk public function insertStatusUpdateDetails($reqBranchData, $statusDetails, $id, $formId ){ $newLeadDetails['FormIdDetailsID'] = $id; @@ -1194,7 +1209,8 @@ $result['updatedraftStatus'] = false; return $result; } - // get university list + // get university list for search + // kdk public function get_university_list($branch) { $this->db->select('UniversityID, UniversityName'); $this->db->order_by('CreatedOn', 'DESC'); @@ -1213,6 +1229,8 @@ $result['updatedraftStatus'] = false; return $results; } + // get unmatched records of the formid file details , compare with file 1 + // kdk public function getUnmatchedFormIdFeesDetails($localDetails, $getDetailsFor) { $searchUniv = $getDetailsFor['univCode']; @@ -1237,6 +1255,8 @@ $result['updatedraftStatus'] = false; return $resultArr; } + // Add formid , university amount payment details to the account state + // kdk public function addFormIdListToAccountState($localDetails, $getDetailsFor){ $localCreatedBy = $localDetails['localUserID']; $time = date('Y-m-d H:i:s'); diff --git a/Apollo/assets/js/controllers/studentUnivFormIdFeeDetailsCtrl.js b/Apollo/assets/js/controllers/studentUnivFormIdFeeDetailsCtrl.js index e908a57a..24c39d90 100644 --- a/Apollo/assets/js/controllers/studentUnivFormIdFeeDetailsCtrl.js +++ b/Apollo/assets/js/controllers/studentUnivFormIdFeeDetailsCtrl.js @@ -1,7 +1,6 @@ 'use strict'; /** - * controllers for ng-table - * Simple table with sorting and filtering on AngularJS + * Student University Formid, Fee details compare * kdk */ @@ -89,7 +88,7 @@ app.controller('studentUnivFormIdFeeDetailsCtrl', ["$scope", "toaster", "$filter }); }; - $scope.semDetails=["1","2","3","4","5","6","7","8"]; + $scope.semDetails = ["1", "2", "3", "4", "5", "6", "7", "8"]; $scope.searchData = { "University": "", @@ -164,15 +163,15 @@ app.controller('studentUnivFormIdFeeDetailsCtrl', ["$scope", "toaster", "$filter } } - $scope.myObj = { + $scope.myObj = { // "color" : "green", - "font-size" : "inherit" + "font-size": "inherit" } - $scope.myObjErr = { + $scope.myObjErr = { "text-decoration": "underline", "text-decoration-color": "red", - "font-size" : "inherit" + "font-size": "inherit" } $scope.editId = -1; @@ -296,7 +295,7 @@ app.controller('studentUnivFormIdFeeDetailsCtrl', ["$scope", "toaster", "$filter }); } - + $scope.formIdMissMatchUnivSelectID = { 'univCode': '' }; @@ -334,8 +333,8 @@ app.controller('studentUnivFormIdFeeDetailsCtrl', ["$scope", "toaster", "$filter // get subtab details for the formid fee details get form the university - $scope.subTabActive= function(tab){ - if( tab == 'subTabactive2'){ + $scope.subTabActive = function (tab) { + if (tab == 'subTabactive2') { getDraftFormIdDetails(); } } @@ -345,14 +344,14 @@ app.controller('studentUnivFormIdFeeDetailsCtrl', ["$scope", "toaster", "$filter 'FormID': '', 'FormType': 'NEW', 'CentreCode': '', - 'Session':'', - 'Year':'', - 'Semester':'', - 'Student_Name':'', - 'Father_Name':'', - 'CourseCode':'', - 'ActualCourseFee':'0', - 'CourseFee':'0', + 'Session': '', + 'Year': '', + 'Semester': '', + 'Student_Name': '', + 'Father_Name': '', + 'CourseCode': '', + 'ActualCourseFee': '0', + 'CourseFee': '0', 'ExamFee': '0', 'EnrollmentFee': '0', 'ProspectusFee': '0', @@ -361,7 +360,7 @@ app.controller('studentUnivFormIdFeeDetailsCtrl', ["$scope", "toaster", "$filter 'LateralEntryFee': '0', 'DualSpclFee': '0', 'OtherFee': '0', - 'NRIFEE':'0', + 'NRIFEE': '0', 'ProvisionalFee': '0', 'MigrationFee': '0', 'UrgentResultDMCFee': '0', @@ -369,12 +368,12 @@ app.controller('studentUnivFormIdFeeDetailsCtrl', ["$scope", "toaster", "$filter 'Amount': '0' } - + $scope.draftListDetails = ''; $scope.draftListDetailsNoRecordFound = false; $scope.draftListDetailsLoading = false; // get draft form id details - function getDraftFormIdDetails(){ + function getDraftFormIdDetails() { $scope.draftListDetailsLoading = true; $scope.draftListDetailsNoRecordFound = false; $scope.draftListDetails = ''; @@ -402,8 +401,8 @@ app.controller('studentUnivFormIdFeeDetailsCtrl', ["$scope", "toaster", "$filter // manual entry details add - $scope.addManualData = function() { - alert(JSON.stringify($scope.draftManualEntryDetails)); + $scope.addManualData = function () { + // alert(JSON.stringify($scope.draftManualEntryDetails)); var addDraftDetailsList = { method: 'POST', @@ -413,7 +412,7 @@ app.controller('studentUnivFormIdFeeDetailsCtrl', ["$scope", "toaster", "$filter }, data: { localDetails: localDetail, - details : $scope.draftManualEntryDetails, + details: $scope.draftManualEntryDetails, univ: $scope.formUploadUnivSelectID } }; @@ -430,93 +429,96 @@ app.controller('studentUnivFormIdFeeDetailsCtrl', ["$scope", "toaster", "$filter }); } - function getEmptycall(){ -$scope.draftManualEntryDetails = { - 'FormID': '', - 'FormType': 'NEW', - 'CentreCode': '', - 'Session':'', - 'Year':'', - 'Semester':'', - 'Student_Name':'', - 'Father_Name':'', - 'CourseCode':'', - 'ActualCourseFee':'0', - 'CourseFee':'0', - 'ExamFee': '0', - 'EnrollmentFee': '0', - 'ProspectusFee': '0', - 'ReRegFee': '0', - 'CreditTransferFee': '0', - 'LateralEntryFee': '0', - 'DualSpclFee': '0', - 'OtherFee': '0', - 'NRIFEE':'0', - 'ProvisionalFee': '0', - 'MigrationFee': '0', - 'UrgentResultDMCFee': '0', - 'AdditionalFee': '0', - 'Amount': '0' + function getEmptycall() { + $scope.draftManualEntryDetails = { + 'FormID': '', + 'FormType': 'NEW', + 'CentreCode': '', + 'Session': '', + 'Year': '', + 'Semester': '', + 'Student_Name': '', + 'Father_Name': '', + 'CourseCode': '', + 'ActualCourseFee': '0', + 'CourseFee': '0', + 'ExamFee': '0', + 'EnrollmentFee': '0', + 'ProspectusFee': '0', + 'ReRegFee': '0', + 'CreditTransferFee': '0', + 'LateralEntryFee': '0', + 'DualSpclFee': '0', + 'OtherFee': '0', + 'NRIFEE': '0', + 'ProvisionalFee': '0', + 'MigrationFee': '0', + 'UrgentResultDMCFee': '0', + 'AdditionalFee': '0', + 'Amount': '0' + } + return 0; } - return 0; -} - $scope.addToList = function(id){ - swal({ - title: "Are you sure?", - text: "You Want to Add this Record to List!", - type: "warning", - showCancelButton: true, - confirmButtonColor: '#DD6B55', - confirmButtonText: 'Yes', - cancelButtonText: "No", - closeOnConfirm: false, - closeOnCancel: false - }, - function(isConfirm){ - if (isConfirm){ - var selectedItems = []; - function getUpdateDetails(id) { - this.ID = id; - this.DraftStatus = 0; - } - let itemGetID = new getUpdateDetails(id); - selectedItems.push(itemGetID); - var draftMoveToList = { - method: 'POST', - url: apiPoint.url + 'draftMovetoList/', - headers: { - 'Content-Type': 'application/json' - }, - data: { - localDetails: localDetail, - details : selectedItems + // add draft details to list + $scope.addToList = function (id) { + swal({ + title: "Are you sure?", + text: "You Want to Add this Record to List!", + type: "warning", + showCancelButton: true, + confirmButtonColor: '#DD6B55', + confirmButtonText: 'Yes', + cancelButtonText: "No", + closeOnConfirm: false, + closeOnCancel: false + }, + function (isConfirm) { + if (isConfirm) { + var selectedItems = []; + function getUpdateDetails(id) { + this.ID = id; + this.DraftStatus = 0; } - }; - $http(draftMoveToList).then(function (response) { - if (response.data.draftStatus == true) { - // alert(); - swal("", response.data.draftDetailsMessagae, "success"); - getDraftFormIdDetails(); - } else { - swal("", response.data.draftDetailsMessagae, "warning"); - - }}); + let itemGetID = new getUpdateDetails(id); + selectedItems.push(itemGetID); + var draftMoveToList = { + method: 'POST', + url: apiPoint.url + 'draftMovetoList/', + headers: { + 'Content-Type': 'application/json' + }, + data: { + localDetails: localDetail, + details: selectedItems + } + }; + $http(draftMoveToList).then(function (response) { + if (response.data.draftStatus == true) { + // alert(); + swal("", response.data.draftDetailsMessagae, "success"); + getDraftFormIdDetails(); + } else { + swal("", response.data.draftDetailsMessagae, "warning"); + + } + }); } else { - swal("Cancelled", "Your record not added to list :)", "error"); + swal("Cancelled", "Your record not added to list :)", "error"); } }); } $scope.editId = -1; $scope.leader = {}; - $scope.editList = function(details, d){ + $scope.editList = function (details, d) { $scope.leader = {}; angular.copy(d, $scope.leader); $scope.editId = details; } - $scope.updateFeeIDDetails = function(id, p){ + // update feeid details in draft mode + $scope.updateFeeIDDetails = function (id, p) { var editDraftMoveToList = { method: 'POST', url: apiPoint.url + 'editDraftFormIdFeesDetails/', @@ -525,7 +527,7 @@ $scope.draftManualEntryDetails = { }, data: { localDetails: localDetail, - details : p, + details: p, detailsID: id } }; @@ -535,27 +537,29 @@ $scope.draftManualEntryDetails = { swal("", response.data.updatedraftDetailsMessagae, "success"); getDraftFormIdDetails(); $scope.editId = -1; - $scope.leader = {}; + $scope.leader = {}; } else { swal("", response.data.updatedraftDetailsMessagae, "warning"); - - }}); + + } + }); } $scope.statusUpdateEditId = -1; - $scope.statusUpdate = function(id){ + $scope.statusUpdate = function (id) { $scope.statusUpdateEditId = id; - $scope.statusUpdateFormIdDetails = { + $scope.statusUpdateFormIdDetails = { "Status": "", "Comments": "" } } - $scope.StatusListDetails = ''; + $scope.StatusListDetails = ''; $scope.getFormIdDetailsStatusListLoading = false; - $scope.getFormIdDetailsStatusList = function(id){ - + // formid records status details + $scope.getFormIdDetailsStatusList = function (id) { + $scope.getFormIdDetailsStatusListLoading = true; var getFormIdDetailsStatusList = { method: 'POST', @@ -565,18 +569,19 @@ $scope.draftManualEntryDetails = { }, data: { localDetails: localDetail, - detailsID : id + detailsID: id } }; $http(getFormIdDetailsStatusList).then(function (response) { if (response.data.formIdstatusListStatus == true) { - $scope.getFormIdDetailsStatusListLoading = false; + $scope.getFormIdDetailsStatusListLoading = false; $scope.StatusListDetails = response.data.formIdstatusListDetails; } else { - $scope.getFormIdDetailsStatusListLoading = false; + $scope.getFormIdDetailsStatusListLoading = false; $scope.StatusListDetails = response.data.formIdstatusListDetails; $scope.StatusListDetailsApiMessage = response.data.formIdstatusListMessagae; - }}); + } + }); } $scope.statusUpdateFormIdDetails = { @@ -584,14 +589,16 @@ $scope.draftManualEntryDetails = { "Comments": "" } - $scope.resetStatusUpdateForm = function(){ - $scope.statusUpdateFormIdDetails = { + $scope.resetStatusUpdateForm = function () { + $scope.statusUpdateFormIdDetails = { "Status": "", "Comments": "" } } - $scope.addStatusUpdateDetails = function(id, formId){ + // add status for the formid record details + // kdk + $scope.addStatusUpdateDetails = function (id, formId) { var addStatusUpdateDetailsStatusList = { method: 'POST', url: apiPoint.url + 'insertStatusUpdateDetails/', @@ -600,69 +607,73 @@ $scope.draftManualEntryDetails = { }, data: { localDetails: localDetail, - details : $scope.statusUpdateFormIdDetails, + details: $scope.statusUpdateFormIdDetails, id: id, - formId : formId + formId: formId } }; $http(addStatusUpdateDetailsStatusList).then(function (response) { if (response.data.insertStatusUpdateDetailsStatus == true) { - $scope.statusUpdateFormIdDetails = { - "Status": "", - "Comments": "" - } - $scope.statusUpdateEditId = -1; - swal("", response.data.insertStatusUpdateDetailsMessagae, "success"); - } else { - swal("", response.data.insertStatusUpdateDetailsMessagae, "success"); + $scope.statusUpdateFormIdDetails = { + "Status": "", + "Comments": "" + } + $scope.statusUpdateEditId = -1; + swal("", response.data.insertStatusUpdateDetailsMessagae, "success"); + } else { + swal("", response.data.insertStatusUpdateDetailsMessagae, "success"); // $scope.getFormIdDetailsStatusListLoading = false; // $scope.StatusListDetails = response.data.formIdstatusListDetails; // $scope.StatusListDetailsApiMessage = response.data.formIdstatusListMessagae; - }}); + } + }); } - $scope.addToAccountState = function(id){ + // add formid list details to account state + // kdk + $scope.addToAccountState = function (id) { - swal({ - title: "Are you sure?", - text: "You Want to Add this Record to Account State List!", - type: "warning", - showCancelButton: true, - confirmButtonColor: '#DD6B55', - confirmButtonText: 'Yes', - cancelButtonText: "No", - closeOnConfirm: false, - closeOnCancel: false - }, - function(isConfirm){ - if (isConfirm){ - var selectedItems = []; - function getUpdateDetails(id) { - this.ID = id; - } - let itemGetID = new getUpdateDetails(id); - selectedItems.push(itemGetID); - var addToAccountStateList = { - method: 'POST', - url: apiPoint.url + 'addToAccountStateList/', - headers: { - 'Content-Type': 'application/json' - }, - data: { - localDetails: localDetail, - details : selectedItems + swal({ + title: "Are you sure?", + text: "You Want to Add this Record to Account State List!", + type: "warning", + showCancelButton: true, + confirmButtonColor: '#DD6B55', + confirmButtonText: 'Yes', + cancelButtonText: "No", + closeOnConfirm: false, + closeOnCancel: false + }, + function (isConfirm) { + if (isConfirm) { + var selectedItems = []; + function getUpdateDetails(id) { + this.ID = id; } - }; - $http(addToAccountStateList).then(function (response) { - if (response.data.accountStateMoveStatus == true) { - swal("", response.data.accountStateMoveMessagae, "success"); - $scope.onSubmit(); - } else { - swal("", response.data.accountStateMoveMessagae, "warning"); - - }}); + let itemGetID = new getUpdateDetails(id); + selectedItems.push(itemGetID); + var addToAccountStateList = { + method: 'POST', + url: apiPoint.url + 'addToAccountStateList/', + headers: { + 'Content-Type': 'application/json' + }, + data: { + localDetails: localDetail, + details: selectedItems + } + }; + $http(addToAccountStateList).then(function (response) { + if (response.data.accountStateMoveStatus == true) { + swal("", response.data.accountStateMoveMessagae, "success"); + $scope.onSubmit(); + } else { + swal("", response.data.accountStateMoveMessagae, "warning"); + + } + }); } else { - swal("Cancelled", "Your record not added to list :)", "error"); + swal("Cancelled", "Your record not added to list :)", "error"); } }); } diff --git a/Apollo/assets/views/student/studentUnivFormIdFeeDetails.html b/Apollo/assets/views/student/studentUnivFormIdFeeDetails.html index b9ff5667..7072f594 100644 --- a/Apollo/assets/views/student/studentUnivFormIdFeeDetails.html +++ b/Apollo/assets/views/student/studentUnivFormIdFeeDetails.html @@ -5,7 +5,7 @@

{{ mainTitle }}

Student University FormId Fees Details. - + @@ -105,7 +105,7 @@ - @@ -147,23 +147,23 @@ - - - - - + --> - + + + + + + + + + + + +
Action + Action FormID NRIFEE ProvisionalFee + ProvisionalFee MigrationFee + MigrationFee UrgentResultDMCFee + UrgentResultDMCFee AdditionalFee - Amount + AdditionalFee + Amount
- - + + {{p.FormID}} @@ -184,10 +184,10 @@ {{p.Semester}} - {{p.Student_Name}} + {{p.Student_Name}} - {{p.Father_Name}} + {{p.Father_Name}} {{p.CourseCode}} @@ -213,15 +213,16 @@
- -
-
-
-

Loading...

-
- -
+
+ +
+
+
+

Loading...

+
+
+ +
@@ -253,7 +254,8 @@
-
- - - - - - - - - - - - -
FormIDStatusCommentsUpdated On
{{s.FormID}}{{s.Status}}{{s.Comments}}{{s.CreatedOn}}
+
FormIDStatusCommentsUpdated On
{{s.FormID}}{{s.Status}}{{s.Comments}}{{s.CreatedOn}}
-
-

{{StatusListDetailsApiMessage}}

-
- -
-
- +
+
+

{{StatusListDetailsApiMessage}}

-
- - +
+
+
+ +
+
+ + + + - - +
+
- -
- +
@@ -443,7 +447,7 @@ UrgentResultDMCFee AdditionalFee Amount - + @@ -471,7 +475,7 @@ {{p.DualSpclFee}} {{p.OtherFee}} {{p.NRIFEE}} - {{p.ProvisionalFee}} + {{p.ProvisionalFee}} {{p.MigrationFee}} {{p.UrgentResultDMCFee}} {{p.AdditionalFee}} @@ -485,76 +489,76 @@ - +
- +
- +
- +
-
+
- +
- +
-
- +
+
- +
- +
- +
- +
- +
- +
@@ -562,76 +566,76 @@ - +
- +
- +
- +
- +
- +
- +
- +
- +
-
+
- +
- +
- +
- +
@@ -639,7 +643,7 @@ - +
@@ -662,7 +666,7 @@
- +
- -
@@ -778,8 +782,8 @@ +
- - \ No newline at end of file + \ No newline at end of file