From 87b6fbf9878c2925201e1640b2cd689c4696d2e1 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Wed, 4 May 2022 12:09:22 +0530 Subject: [PATCH 01/42] susee --- app/controllers/creditpd.controller.js | 117 ++++++++++++++++++ app/controllers/test.controller.js | 101 ++------------- .../CreditBorrowerAndGuarantorDetails.js | 2 +- app/models/CreditFilterTable.js | 31 +++++ app/models/CreditGeneralInformation.js | 6 +- app/routes/routes.js | 41 +++++- app/services/CreditPdHelper.js | 18 +++ package-lock.json | 45 +++++++ package.json | 1 + server.js | 2 +- 10 files changed, 271 insertions(+), 93 deletions(-) create mode 100644 app/controllers/creditpd.controller.js create mode 100644 app/models/CreditFilterTable.js create mode 100644 app/services/CreditPdHelper.js diff --git a/app/controllers/creditpd.controller.js b/app/controllers/creditpd.controller.js new file mode 100644 index 0000000..7ae4b7a --- /dev/null +++ b/app/controllers/creditpd.controller.js @@ -0,0 +1,117 @@ +const { keys, values } = require('lodash'); +const { sequelize,Test,CreditGeneralInformation,SizeAndGeographicalResearch,CreditProfile,ProductAndProcess,PortFolioHealth,TotalOverallDebit,OverallPlanOfAction,ValidationPoint, + CreditLoanDetail,CreditFinalRemarks,CreditGeneralBusinessInformation,CreditKeyProductBusinessContribution,EmployeeStrength,CreditBusinessAndPersonalBankingDetails,CreditFinancialInformation, + SupplierDetail ,ClientDetail,CreditFuturePlans,CreditExistingLoanObligation,FamilyMemberInvolvedInBusiness,CreditManager,CreditBorrowerAndGuarantorDetails,CreditFinancialAnalysis,CreditAddressDetail, + CreditKeyShareholder,Covid19Questions,StockDetail,BusinessAsset,CreditFilterTable} = require('../models') +const { logMsg } = require('../services/logger.js'); +const Credit_PdHelper = require('../services/CreditPdHelper.js'); +var global = require('global') +global.arr = [ CreditAddressDetail , CreditBorrowerAndGuarantorDetails , CreditBusinessAndPersonalBankingDetails , BusinessAsset , + ClientDetail , Covid19Questions , EmployeeStrength , CreditExistingLoanObligation , + FamilyMemberInvolvedInBusiness , CreditFinalRemarks , CreditFinancialAnalysis , CreditFinancialInformation , + CreditFuturePlans , CreditGeneralBusinessInformation , CreditGeneralInformation , CreditKeyProductBusinessContribution , CreditKeyShareholder , CreditLoanDetail , OverallPlanOfAction , PortFolioHealth , ProductAndProcess , CreditProfile , SizeAndGeographicalResearch , StockDetail , SupplierDetail , TotalOverallDebit , ValidationPoint , CreditManager ] + +exports.Welcome = (req, res) => +{ + try + { + const Msg = "Welcome....!"; + console.log(Msg); + logMsg.info("Api Call Success"); + res.send({'status':200 , message:"Success." ,'data': Msg}); + } catch(err) { + res.status(500).send({'status':404, + message: err.message || "Some error occurred while inserting statements." ,'data': "No data" + }); } //end of try catch + +}; + +exports.CreditPd = async (req, res) => +{ + // + const tempData ={ + + + // case 1 + "Borrower & Guarantor Details":{ + "borrower_details":[{"mobile_numbers":"","borrower_type":"Main Applicant","borrower_name":"J K COATING INDUSTRIES","entity_type":"Proprietorship Firm","designation":"Not Applicable","relationship_to":"NA","relationship":"NA","numbers_of_years_business_running":"3"}, + {"borrower_type":"Co-Applicant","borrower_name":"SIMA","mobile_numbers":"","entity_type":"Individual","designation":"Proprietor","relationship_to":"JITENDRA","relationship":"Wife","numbers_of_years_business_running":"3","borrower_age":36,"borrower_met":"No"} + ,{"borrower_type":"Co-Applicant","borrower_name":"JITENDRA","mobile_numbers":"","entity_type":"Individual","designation":"Not Applicable","relationship_to":"SIMA","relationship":"Husband","numbers_of_years_business_running":"4","borrower_age":40,"borrower_met":"Yes"} + ,{"borrower_type":"Co-Applicant","borrower_name":"J.K SAND BLASTING AND POWDER COATING","mobile_numbers":"","entity_type":"Proprietorship Firm","designation":"Not Applicable","relationship_to":"NA","relationship":"NA","numbers_of_years_business_running":"4"} + ,{"borrower_type":"Co-Applicant","borrower_name":"KAMLA","mobile_numbers":"","entity_type":"Individual","designation":"Not Applicable","relationship_to":"JITENDRA","relationship":"Mother","numbers_of_years_business_running":"0","borrower_age":57,"borrower_met":"No"}], + "common_remarks":"good","person_met":"JITENDRA##2## "}, + + // case 2 + // "Address details":{"initiated_address":"Subhash Colony Plot No 21 A Bhagat K J Kothi Jodhpur, Jodhpur, Rajasthan - 342001","is_pd_done_on_initiated_address":"Yes","address_type":{"address_type_id":"2","address_type":"Clinic","isactive":"1","is_others":"0"},"pd_locality":{"locality_id":"5","locality_name":"Mix Use Area","isactive":"1","is_others":"1"},"pd_location":{"pd_location_approach_id":"2","description":"Easy to locate & Reach","createdon":"2018-10-17 10:15:43","fk_createdby":"1","updatedon":"2019-02-04 07:11:14","fk_updatedby":"1","isactive":"1","is_others":"0"},"comment_locality":{"comments_on_locality_id":"2","rating":"Good","createdon":"2018-10-17 10:35:29","fk_createdby":"1","updatedon":null,"fk_updatedby":null,"isactive":"1","is_others":"0"},"business_estimated_area":"108","uom":"Square Yards","uom_searchControl":null,"common_remarks":"nil","alternative_address":""}, + + // case 3 + // "Future Plans & Business Environments":{"usp_of_business":"NA","future_business_expansion":"TO START BUSINESS IN OWN FACTORY","key_competitors":"NA","sucession_plan":"SON IS STUDYING","other_group_business_applicants":"NA","common_remarks":""}, + + } + var obj = { }; + var arr_ObjKey = [ ] + var creditFilter_obj_key = [ ]; + var creditFilter_table_name = [ ]; + var name; + var pd_id = [ ]; + for (const [key, value] of Object.entries(tempData)) { + creditFilter_obj_key = await CreditFilterTable.findAll({ raw: true , attributes: [ 'obj_key' ], where : { section : key , is_active : 1 }}) + creditFilter_table_name = await CreditFilterTable.findAll({ raw: true, attributes: [ 'table_name' ,'section'], where : { section : key , is_active : 1 } , group: ['table_name' , 'section']}) + for (let index = 0; index < creditFilter_obj_key.length; index++) { + arr_ObjKey.push(creditFilter_obj_key[index].obj_key) + } + if (key == creditFilter_table_name[0].section) { + for (var [keys, element] of Object.entries(value)) { + if ( Array.isArray(element) == true ) // array of object data + { + element.forEach(async(element , index) => { + // if ( keys == 'borrower_details' && index == 0 ) + // { + // Object.keys(element).forEach(async ( datas ) => { + // if ( datas == 'borrower_name') + // { + // name = element[datas] ; + // } + // }); + // pd_id = await CreditGeneralInformation.create({ name : name}); + // } + obj = element; + delete value.obj + Object.assign( obj, value ); + var index = creditFilter_table_name[0].table_name; + var tableName = arr[index] + await tableName.create( obj ).then((data)=>{}).catch((err)=>console.log(err)) + // setTimeout(async() => { + // Object.assign( obj, { pd_id : pd_id.pd_id } ); + // console.log(obj); + // await tableName.create( obj ).then((data)=>{}).catch((err)=>console.log(err)) + // },1000) + }); + } + else + { + Object.keys(value).forEach( async (key) => { // nested object data + const keys = Object.keys(value) + if( typeof value[key] === "object" && ( value[key] !== null ) ) + { + Credit_PdHelper.CreditPd( key , value[key] , arr_ObjKey , obj ) + } + else if( value[key] !== null ) // object data + { + Object.assign( obj, { [key] : value[key] }); + } + }); + } + } + } //end + // data insert into DB + // var index = creditFilter_table_name[0].table_name; + // var tableName = arr[index] + // setTimeout(async() => { + // // Object.assign( obj, { pd_id : pd_id.pd_id } ); + // console.log(obj); + // await tableName.create( obj ).then((data)=>{}).catch((err)=>console.log(err)) + // },1000) + } +} + diff --git a/app/controllers/test.controller.js b/app/controllers/test.controller.js index 39cba93..ea34e60 100644 --- a/app/controllers/test.controller.js +++ b/app/controllers/test.controller.js @@ -1,14 +1,10 @@ -const { sequelize,Test,CreditGeneralInformation,SizeAndGeographicalResearch,CreditProfile,ProductAndProcess,PortFolioHealth,TotalOverallDebit,OverallPlanOfAction,ValidationPoint, - CreditLoanDetail,CreditFinalRemarks,CreditGeneralBusinessInformation,CreditKeyProductBusinessContribution,EmployeeStrength,CreditBusinessAndPersonalBankingDetails,CreditFinancialInformation, - SupplierDetail ,ClientDetail,CreditFuturePlans,CreditExistingLoanObligation,FamilyMemberInvolvedInBusiness,CreditManager,CreditBorrowerAndGuarantorDetails,CreditFinancialAnalysis,CreditAddressDetail, - CreditKeyShareholder,Covid19Questions,StockDetail,BusinessAsset} = require('../models') +const { sequelize,Test} = require('../models') const { logMsg } = require('../services/logger.js'); - exports.Welcome = (req, res) => { try - { + { const Msg = "Welcome....!"; console.log(Msg); logMsg.info("Api Call Success"); @@ -21,88 +17,15 @@ exports.Welcome = (req, res) => }; -exports.CreditPd = async (req, res) => + +exports.PullCreditPdData = async (req, res) => { - // try - // { - const tempData = {"Address details":{"initiated_address":"Subhash Colony Plot No 21 A Bhagat K J Kothi Jodhpur, Jodhpur, Rajasthan - 342001","is_pd_done_on_initiated_address":"Yes","address_type":{"address_type_id":"2","address_type":"Clinic","isactive":"1","is_others":"0"},"pd_locality":{"locality_id":"5","locality_name":"Mix Use Area","isactive":"1","is_others":"1"},"pd_location":{"pd_location_approach_id":"2","description":"Easy to locate & Reach", - "createdon":"2018-10-17 10:15:43","fk_createdby":"1","updatedon":"2019-02-04 07:11:14","fk_updatedby":"1", - "isactive":"1","is_others":"0"},"comment_locality":{"comments_on_locality_id":"2","rating":"Good", - "createdon":"2018-10-17 10:35:29","fk_createdby":"1","updatedon":null,"fk_updatedby":null, - "isactive":"1","is_others":"0"},"business_estimated_area":"108","uom":"Square Yards", - "uom_searchControl":null,"common_remarks":"nil","alternative_address":""} } - - // var count = 0; - // var generalInformation = [ ]; - // var storeData = [ ]; - // const len = Object.keys(tempData).length - 1; - - - for (const [keys, values] of Object.entries(tempData)) { - - Object.values(values).forEach( async (element) => { - // Object.keys(element).forEach( async (elementKey) => { - // if (typeof values.elementKey === "object" && values.elementKey !== null ) { - // console.log("object" , element.elementKey); - // } - // else - // { - // console.log("not a object" , element.elementKey); - // } - // }); - if (typeof element === "object" && element !== null ) { - console.log("object" , element); - } - else - { - console.log("not a object" , element); - } - }); - - - - - - - - - - - - - // if (keys == 'General Information') { generalInformation = await CreditGeneralInformation.create( values ); storeId = await CreditGeneralInformation.findOne({ where : { pd_id : generalInformation.pd_id , is_active : 1 }}); }; - // if (keys == 'Profile') { Object.assign(values, { pd_id: storeId.pd_id }); await CreditProfile.create( values ) }; - // if (keys == 'Size and Geographical Reach') { Object.assign(values, { pd_id: storeId.pd_id }); await SizeAndGeographicalResearch.create( values) }; - // if (keys == 'Product and Process') { Object.assign(values, { pd_id: storeId.pd_id }); await ProductAndProcess.create( values) }; - // if (keys == 'Portfolio Health') { Object.assign(values, { pd_id: storeId.pd_id }); await PortFolioHealth.create( values) }; - // if (keys == 'Total Overall Debt/Equity Profile') { Object.assign(values, { pd_id: storeId.pd_id }); await TotalOverallDebit.create( values) }; - // if (keys == 'Financial analysis') { Object.assign(values, { pd_id: storeId.pd_id }); await CreditFinancialAnalysis.create( values) }; - // if (keys == 'Overall Plan of Action') { Object.assign(values, { pd_id: storeId.pd_id }); await OverallPlanOfAction.create( values) }; - // if (keys == 'Validation Points vide Systems and Books at HQ and Branches') { Object.assign(values, { pd_id: storeId.pd_id }); await ValidationPoint.create( values) }; - // if (keys == 'Final remarks') { Object.assign(values, { pd_id: storeId.pd_id }); await CreditFinalRemarks.create( values) }; - // if (keys == 'Address details') { Object.assign(values, { pd_id: storeId.pd_id }); await CreditAddressDetail.create( values) }; - // if (keys == 'Loan details') { Object.assign(values, { pd_id: storeId.pd_id }); await CreditLoanDetail.create( values ) }; - // if (keys == 'General Business Information') { Object.assign(values, { pd_id: storeId.pd_id }); await CreditGeneralBusinessInformation.create( values) }; - // if (keys == 'Key Products and Business Contribution') { Object.assign(values, { pd_id: storeId.pd_id }); await CreditKeyProductBusinessContribution.create( values) }; - // if (keys == 'Employee Strength') { Object.assign(values, { pd_id: storeId.pd_id }); await EmployeeStrength.create( values) }; - // if (keys == 'Business and Personal Banking') { Object.assign(values, { pd_id: storeId.pd_id }); await CreditBusinessAndPersonalBankingDetails.create( values) }; - // if (keys == 'Financial Information') { Object.assign(values, { pd_id: storeId.pd_id }); await CreditFinancialInformation.create( values) }; - // if (keys == 'Supplier details') { Object.assign(values, { pd_id: storeId.pd_id }); await SupplierDetail.create( values) }; - // if (keys == 'Clients details') { Object.assign(values, { pd_id: storeId.pd_id }); await ClientDetail.create( values) }; - // if (keys == 'Future Plans & Business Environments') { Object.assign(values, { pd_id: storeId.pd_id }); await CreditFuturePlans.create( values) }; - // if (keys == 'Existing Loan Obligations') { Object.assign(values, { pd_id: storeId.pd_id }); await CreditExistingLoanObligation.create( values) }; - // if (keys == 'Family Members Involved in Business') { Object.assign(values, { pd_id: storeId.pd_id }); await FamilyMemberInvolvedInBusiness.create( values ) }; - // if (keys == 'Credit manager specific queries') { Object.assign(values, { pd_id: storeId.pd_id }); await CreditManager.create( values) }; - // if (keys == 'Borrower & Guarantor Details') { Object.assign(values, { pd_id: storeId.pd_id }); await CreditBorrowerAndGuarantorDetails.create( values) }; - // if (keys == 'Key Stakeholders in Business') { Object.assign(values, { pd_id: storeId.pd_id }); await CreditKeyShareholder.create( values) }; - // if (keys == 'Covid 19 Questions') { Object.assign(values, { pd_id: storeId.pd_id }); await Covid19Questions.create( values) }; - // if (keys == 'Stock details') { Object.assign(values, { pd_id: storeId.pd_id }); await StockDetail.create( values) }; - // if (keys == 'Business Assets') { Object.assign(values, { pd_id: storeId.pd_id }); await BusinessAsset.create( values) }; - // }); - // } + try + { + res.send({'status':200,'message':"success",'data':req.body}); + + } catch(err) { + res.send({'status':404,message: err.message || "Some error occurred while retrieving data." ,'data': "No data" }); + } //end of try catch - - } - -} - +}; \ No newline at end of file diff --git a/app/models/CreditBorrowerAndGuarantorDetails.js b/app/models/CreditBorrowerAndGuarantorDetails.js index 6c23a75..9373e78 100644 --- a/app/models/CreditBorrowerAndGuarantorDetails.js +++ b/app/models/CreditBorrowerAndGuarantorDetails.js @@ -6,7 +6,7 @@ module.exports = (sequelize, DataTypes) => { } CreditBorrowerAndGuarantorDetails.init( { - pd_id: { type: DataTypes.INTEGER }, + pd_id: { type: DataTypes.INTEGER }, borrower_type: { type: DataTypes.STRING }, numbers_of_years_business_running: { type: DataTypes.INTEGER }, borrower_name: { type: DataTypes.STRING }, diff --git a/app/models/CreditFilterTable.js b/app/models/CreditFilterTable.js new file mode 100644 index 0000000..115709e --- /dev/null +++ b/app/models/CreditFilterTable.js @@ -0,0 +1,31 @@ +'use strict' +const { Model } = require('sequelize') +module.exports = (sequelize, DataTypes) => { + class CreditFilterTable extends Model { + + } + CreditFilterTable.init( + { + pd_id: { type: DataTypes.INTEGER }, + section: { type: DataTypes.STRING }, + ques_key: { type: DataTypes.STRING }, + is_obj: { type: DataTypes.INTEGER }, + obj_key: { type: DataTypes.STRING }, + is_mul: { type: DataTypes.INTEGER }, + mul_key: { type: DataTypes.STRING }, + temp_key: { type: DataTypes.STRING }, + table_name: { type: DataTypes.STRING }, + createdby: { type: DataTypes.INTEGER }, + updatedby: { type: DataTypes.INTEGER } + + }, + { + sequelize, + tableName: 'credit_filter_table', + modelName: 'CreditFilterTable', + } + ) + + + return CreditFilterTable +} \ No newline at end of file diff --git a/app/models/CreditGeneralInformation.js b/app/models/CreditGeneralInformation.js index c52b6c9..4ea5efa 100644 --- a/app/models/CreditGeneralInformation.js +++ b/app/models/CreditGeneralInformation.js @@ -6,7 +6,11 @@ module.exports = (sequelize, DataTypes) => { } CreditGeneralInformation.init( { - pd_id: { type: DataTypes.INTEGER }, + pd_id: { + type: DataTypes.INTEGER, + autoIncrement : true, + primaryKey: true + }, name: { type: DataTypes.STRING }, loan_amount: { type: DataTypes.INTEGER }, product: { type: DataTypes.STRING }, diff --git a/app/routes/routes.js b/app/routes/routes.js index a6b512a..59ab102 100644 --- a/app/routes/routes.js +++ b/app/routes/routes.js @@ -22,7 +22,46 @@ module.exports = app => { router.get("/demo", Mycontroller.Welcome); - router.get('/creditPd',Mycontroller.CreditPd) +/** +* @swagger +* definitions: +* PullCreditPdData: +* type: object +* properties: +* pdid: +* type: integer +* description: pdid +* example: 6646 +* product: +* type: string +* description: product +* example: LFMP +* data: +* type: string +* description: json string +* example: +*/ +/** +* @swagger +* /api/PullCreditPdData: +* post: +* summary: Pull SalesPd Data +* description: Pull SalesPd Data +* requestBody: +* content: +* application/json: +* schema: +* $ref: '#/definitions/PullCreditPdData' +* responses: +* 200: +* description: success +* 500: +* description: failed +*/ +router.post("/PullCreditPdData", Mycontroller.PullCreditPdData); + + +// router.get('/creditPd',Mycontroller.CreditPd) // routes started here diff --git a/app/services/CreditPdHelper.js b/app/services/CreditPdHelper.js new file mode 100644 index 0000000..5118803 --- /dev/null +++ b/app/services/CreditPdHelper.js @@ -0,0 +1,18 @@ +const { keys, values } = require('lodash'); +const { sequelize,Test,CreditGeneralInformation,SizeAndGeographicalResearch,CreditProfile,ProductAndProcess,PortFolioHealth,TotalOverallDebit,OverallPlanOfAction,ValidationPoint, + CreditLoanDetail,CreditFinalRemarks,CreditGeneralBusinessInformation,CreditKeyProductBusinessContribution,EmployeeStrength,CreditBusinessAndPersonalBankingDetails,CreditFinancialInformation, + SupplierDetail ,ClientDetail,CreditFuturePlans,CreditExistingLoanObligation,FamilyMemberInvolvedInBusiness,CreditManager,CreditBorrowerAndGuarantorDetails,CreditFinancialAnalysis,CreditAddressDetail, + CreditKeyShareholder,Covid19Questions,StockDetail,BusinessAsset} = require('../models') +const { logMsg } = require('../services/logger.js'); + + +exports.CreditPd = async ( credit_key , credit_value ,credit_temp_array ,credit_obj) => { + for (let i = 0; i < credit_temp_array.length; i++) { + if ( Object.keys(credit_value).includes(credit_temp_array[i]) ) { + await Object.assign( credit_obj, { [credit_key] : credit_value[credit_temp_array[i]] }); + } + } + } + + + diff --git a/package-lock.json b/package-lock.json index 84ac22d..5640fb9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "cors": "^2.8.5", "dotenv": "^10.0.0", "express": "^4.17.1", + "global": "^4.4.0", "lodash": "^4.17.21", "log4js": "^6.3.0", "mssql": "^7.2.0", @@ -1625,6 +1626,11 @@ "node": ">=6.0.0" } }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -2151,6 +2157,15 @@ "node": ">= 6" } }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, "node_modules/global-dirs": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", @@ -3056,6 +3071,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -6252,6 +6275,11 @@ "esutils": "^2.0.2" } }, + "dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, "dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -6668,6 +6696,15 @@ "is-glob": "^4.0.1" } }, + "global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, "global-dirs": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", @@ -7367,6 +7404,14 @@ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "optional": true }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "requires": { + "dom-walk": "^0.1.0" + } + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", diff --git a/package.json b/package.json index 7d86ab8..45d01cd 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "cors": "^2.8.5", "dotenv": "^10.0.0", "express": "^4.17.1", + "global": "^4.4.0", "lodash": "^4.17.21", "log4js": "^6.3.0", "mssql": "^7.2.0", diff --git a/server.js b/server.js index ab2e204..54b2502 100644 --- a/server.js +++ b/server.js @@ -19,7 +19,7 @@ const options = { definition: { openapi: '3.0.0', info: { - title: 'Smc_cet_financials', + title: 'Smc_cet_creditPd', version: '1.0.0', }, }, From dcd4ba5c715a01394f488ea2b655cf0b5e39340e Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Wed, 4 May 2022 12:20:14 +0530 Subject: [PATCH 02/42] susee --- app/routes/routes.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/routes/routes.js b/app/routes/routes.js index 59ab102..5a72dc3 100644 --- a/app/routes/routes.js +++ b/app/routes/routes.js @@ -45,8 +45,8 @@ module.exports = app => { * @swagger * /api/PullCreditPdData: * post: -* summary: Pull SalesPd Data -* description: Pull SalesPd Data +* summary: Pull CreditPd Data +* description: Pull CreditPd Data * requestBody: * content: * application/json: From 1d984b83ccbd55afb4af03aafbab4524dc49d9d6 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Fri, 6 May 2022 09:31:00 +0530 Subject: [PATCH 03/42] susee --- app/controllers/abc.js | 112 +++++++++++++++++ app/controllers/creditpd.controller.js | 165 +++++++++++++------------ app/models/BusinessAsset.js | 2 +- app/models/CreditManager.js | 2 +- app/routes/routes.js | 3 +- server.js | 1 + 6 files changed, 202 insertions(+), 83 deletions(-) create mode 100644 app/controllers/abc.js diff --git a/app/controllers/abc.js b/app/controllers/abc.js new file mode 100644 index 0000000..bfac685 --- /dev/null +++ b/app/controllers/abc.js @@ -0,0 +1,112 @@ +// for (const [key, value] of Object.entries(tempData)) { +// creditFilter_obj_key = await CreditFilterTable.findAll({ raw: true , attributes: [ 'obj_key' ], where : { section : key , is_active : 1 }}) +// creditFilter_table_name = await CreditFilterTable.findAll({ raw: true, attributes: [ 'table_name' ,'section'], where : { section : key , is_active : 1 } , group: ['table_name' , 'section']}) +// for (let index = 0; index < creditFilter_obj_key.length; index++) { +// arr_ObjKey.push(creditFilter_obj_key[index].obj_key) +// } +// if (key == creditFilter_table_name[0].section) { +// arrkeys = key; +// for (var [keys, elements] of Object.entries(value)) { +// // arrkeys_1 = Object.keys(value); +// console.log(keys , elements); +// // if ( Array.isArray(elements) == true ) // array of object data +// // { + elements.forEach(async(element , index) => { + Object.assign(obj,element); + for (let i = 1; i < arrkeys_1.length; i++) { + Object.assign(obj , {[arrkeys_1[i]] : value[arrkeys_1[i]] } ); + } + Object.assign( obj, { pd_id : pd_id.pd_id } ); + var index = creditFilter_table_name[0].table_name; + var tableName = arr[index] + await tableName.create( obj ).then((data)=>{}).catch((err)=>console.log(err)); + }); +// // } +// // else +// // { +// // Object.keys(value).forEach( async (key) => { // nested object data +// // Object.assign( obj, { pd_id : pd_id.pd_id } ); +// // if( typeof value[key] === "object" && ( value[key] !== null ) && Array.isArray(value[key]) == false ) +// // { +// // Credit_PdHelper.CreditPd( key , value[key] , arr_ObjKey , obj ) +// // } +// // else if( value[key] !== null && Array.isArray(value[key]) == false ) // object data +// // { +// // Object.assign( obj, { [key] : value[key] }); +// // } +// // else if (Array.isArray(value[key]) == true ) +// // { +// // value[key].forEach( async (element) => { +// // Object.assign( obj, { [key] : element }); +// // }); +// // } +// // }); +// // } +// } +// } //end +// // data insert into DB +// if (arrkeys.includes(creditFilter_table_name[0].table_name) == false) { +// // var index = creditFilter_table_name[0].table_name; +// // var tableName = arr[index] +// // await tableName.create( obj ).then((data)=>{}).catch((err)=>console.log(err)); +// // console.log(obj); +// } +// } +// } +// case 2 + + +for (const [key, value] of Object.entries(tempData)) { + creditFilter_obj_key = await CreditFilterTable.findAll({ raw: true , attributes: [ 'mul_key' ], where : { section : key , is_active : 1 , is_mul : 1}}) + creditFilter_table_name = await CreditFilterTable.findAll({ raw: true, attributes: [ 'table_name' ,'section' ,'ques_key'], where : { section : key , is_active : 1 } , group: ['table_name' , 'section' ,'ques_key']}) + for (let index = 0; index < creditFilter_obj_key.length; index++) + { + arr_ObjKey.push(creditFilter_obj_key[index].mul_key) + } + if (key == creditFilter_table_name[0].section) { + arrkeys = key; + storeKeys = Object.keys(value); + for (var [arr_keys, arr_of_element] of Object.entries(value)) { + if ( Array.isArray(arr_of_element) == true ) + { + // for (let i = 0 ; i < storeKeys.length ; i++) + // { + // if ( storeKeys[i] != arr_keys ) + // { + // Object.assign(temp_obj , { [storeKeys[i]] : value[storeKeys[i]] } ); + // } + // } + arr_of_element.forEach(async(iter_element , index) => { + if (Object.keys(iter_element)[0] == '0') { + temp_obj.push({ [arr_keys] : iter_element }) + } else { + temp_obj.push(iter_element) ; + } + // Object.assign(obj,iter_element ,temp_obj, { pd_id : 1 }); // pd_id.pd_id + // var index = creditFilter_table_name[0].table_name; + // var tableName = arr[index] + // await tableName.create( obj ).then((data)=>{}).catch((err)=>console.log(err)); + // console.log(obj); + }); + } + else if( typeof arr_of_element === "object" && ( arr_of_element !== null ) ) + { + await Object.assign( obj, { pd_id : pd_id.pd_id } ); + await Credit_PdHelper.CreditPd( arr_keys , arr_of_element , arr_ObjKey , obj ) + } + else if( storeKeys.includes(creditFilter_table_name[0].ques_key) == false ) + { + Object.assign( obj, { pd_id : pd_id.pd_id } ); + Object.assign( obj, { [arr_keys] : arr_of_element }); + } + }// inner forLoop + // DB insert + // var index = creditFilter_table_name[0].table_name; + // var tableName = arr[index] + // await tableName.create( obj ).then((data)=>{}).catch((err)=>console.log(err)); + // console.log(obj); + console.log(temp_obj); + } + } // 1st forLoop +} + diff --git a/app/controllers/creditpd.controller.js b/app/controllers/creditpd.controller.js index 7ae4b7a..9ffefdf 100644 --- a/app/controllers/creditpd.controller.js +++ b/app/controllers/creditpd.controller.js @@ -28,90 +28,95 @@ exports.Welcome = (req, res) => exports.CreditPd = async (req, res) => { - // - const tempData ={ + const tempData = + { - // case 1 - "Borrower & Guarantor Details":{ - "borrower_details":[{"mobile_numbers":"","borrower_type":"Main Applicant","borrower_name":"J K COATING INDUSTRIES","entity_type":"Proprietorship Firm","designation":"Not Applicable","relationship_to":"NA","relationship":"NA","numbers_of_years_business_running":"3"}, - {"borrower_type":"Co-Applicant","borrower_name":"SIMA","mobile_numbers":"","entity_type":"Individual","designation":"Proprietor","relationship_to":"JITENDRA","relationship":"Wife","numbers_of_years_business_running":"3","borrower_age":36,"borrower_met":"No"} - ,{"borrower_type":"Co-Applicant","borrower_name":"JITENDRA","mobile_numbers":"","entity_type":"Individual","designation":"Not Applicable","relationship_to":"SIMA","relationship":"Husband","numbers_of_years_business_running":"4","borrower_age":40,"borrower_met":"Yes"} - ,{"borrower_type":"Co-Applicant","borrower_name":"J.K SAND BLASTING AND POWDER COATING","mobile_numbers":"","entity_type":"Proprietorship Firm","designation":"Not Applicable","relationship_to":"NA","relationship":"NA","numbers_of_years_business_running":"4"} - ,{"borrower_type":"Co-Applicant","borrower_name":"KAMLA","mobile_numbers":"","entity_type":"Individual","designation":"Not Applicable","relationship_to":"JITENDRA","relationship":"Mother","numbers_of_years_business_running":"0","borrower_age":57,"borrower_met":"No"}], - "common_remarks":"good","person_met":"JITENDRA##2## "}, - - // case 2 - // "Address details":{"initiated_address":"Subhash Colony Plot No 21 A Bhagat K J Kothi Jodhpur, Jodhpur, Rajasthan - 342001","is_pd_done_on_initiated_address":"Yes","address_type":{"address_type_id":"2","address_type":"Clinic","isactive":"1","is_others":"0"},"pd_locality":{"locality_id":"5","locality_name":"Mix Use Area","isactive":"1","is_others":"1"},"pd_location":{"pd_location_approach_id":"2","description":"Easy to locate & Reach","createdon":"2018-10-17 10:15:43","fk_createdby":"1","updatedon":"2019-02-04 07:11:14","fk_updatedby":"1","isactive":"1","is_others":"0"},"comment_locality":{"comments_on_locality_id":"2","rating":"Good","createdon":"2018-10-17 10:35:29","fk_createdby":"1","updatedon":null,"fk_updatedby":null,"isactive":"1","is_others":"0"},"business_estimated_area":"108","uom":"Square Yards","uom_searchControl":null,"common_remarks":"nil","alternative_address":""}, - - // case 3 - // "Future Plans & Business Environments":{"usp_of_business":"NA","future_business_expansion":"TO START BUSINESS IN OWN FACTORY","key_competitors":"NA","sucession_plan":"SON IS STUDYING","other_group_business_applicants":"NA","common_remarks":""}, - - } - var obj = { }; - var arr_ObjKey = [ ] + + + } + var obj = { }; // store obj + let temp_obj = [ ]; // store array of obj + var arr_ObjKey = [ ] var creditFilter_obj_key = [ ]; var creditFilter_table_name = [ ]; var name; var pd_id = [ ]; - for (const [key, value] of Object.entries(tempData)) { - creditFilter_obj_key = await CreditFilterTable.findAll({ raw: true , attributes: [ 'obj_key' ], where : { section : key , is_active : 1 }}) - creditFilter_table_name = await CreditFilterTable.findAll({ raw: true, attributes: [ 'table_name' ,'section'], where : { section : key , is_active : 1 } , group: ['table_name' , 'section']}) - for (let index = 0; index < creditFilter_obj_key.length; index++) { - arr_ObjKey.push(creditFilter_obj_key[index].obj_key) - } - if (key == creditFilter_table_name[0].section) { - for (var [keys, element] of Object.entries(value)) { - if ( Array.isArray(element) == true ) // array of object data - { - element.forEach(async(element , index) => { - // if ( keys == 'borrower_details' && index == 0 ) - // { - // Object.keys(element).forEach(async ( datas ) => { - // if ( datas == 'borrower_name') - // { - // name = element[datas] ; - // } - // }); - // pd_id = await CreditGeneralInformation.create({ name : name}); - // } - obj = element; - delete value.obj - Object.assign( obj, value ); - var index = creditFilter_table_name[0].table_name; - var tableName = arr[index] - await tableName.create( obj ).then((data)=>{}).catch((err)=>console.log(err)) - // setTimeout(async() => { - // Object.assign( obj, { pd_id : pd_id.pd_id } ); - // console.log(obj); - // await tableName.create( obj ).then((data)=>{}).catch((err)=>console.log(err)) - // },1000) - }); - } - else - { - Object.keys(value).forEach( async (key) => { // nested object data - const keys = Object.keys(value) - if( typeof value[key] === "object" && ( value[key] !== null ) ) - { - Credit_PdHelper.CreditPd( key , value[key] , arr_ObjKey , obj ) - } - else if( value[key] !== null ) // object data - { - Object.assign( obj, { [key] : value[key] }); - } - }); - } - } - } //end - // data insert into DB - // var index = creditFilter_table_name[0].table_name; - // var tableName = arr[index] - // setTimeout(async() => { - // // Object.assign( obj, { pd_id : pd_id.pd_id } ); - // console.log(obj); - // await tableName.create( obj ).then((data)=>{}).catch((err)=>console.log(err)) - // },1000) - } -} + // var arrkeys = [ ]; + // var storeKeys; + + for (const [key, value] of Object.entries(tempData)) { + if (key == "Borrower & Guarantor Details") { + for (var [keys, element] of Object.entries(value)) { + if ( Array.isArray(element) == true ) // array of object data + { + element.forEach(async(element , index) => { + if ( keys == 'borrower_details' && index == 0 ) + { + name = element['borrower_name']; + // pd_id = await CreditGeneralInformation.create({ name : name }); // get main applicant name + } + }); + } + } + } + } + + + for (const [key, value] of Object.entries(tempData)) { + creditFilter_obj_key = await CreditFilterTable.findAll({ raw: true , attributes: [ 'mul_key' ], where : { section : key , is_active : 1 , is_mul : 1}}) + creditFilter_table_name = await CreditFilterTable.findAll({ raw: true, attributes: [ 'table_name' ,'section' ,'ques_key'], where : { section : key , is_active : 1 } , group: ['table_name' , 'section' ,'ques_key']}) + for (let index = 0; index < creditFilter_obj_key.length; index++) + { + arr_ObjKey.push(creditFilter_obj_key[index].mul_key) // store nested obj keys + } + if (key == creditFilter_table_name[0].section) { + temp_obj.length = 0 ; // clear array + obj = { }; // clear obj + // arrkeys = key; + // storeKeys = Object.keys(value); + for (var [arr_keys, arr_of_element] of Object.entries(value)) { + if ( Array.isArray(arr_of_element) == true ) + { + arr_of_element.forEach(async(iter_element , index) => { + if (Object.keys(iter_element)[0] == '0') { + temp_obj.push({ [arr_keys] : iter_element }) + } else { + temp_obj.push(iter_element) ; + } + }); + } + else if( typeof arr_of_element === "object" && ( arr_of_element !== null ) ) + { + await Credit_PdHelper.CreditPd( arr_keys , arr_of_element , arr_ObjKey , obj ) + } + else + { + Object.assign( obj, { [arr_keys] : arr_of_element }); + } + }// inner forLoop + // DB insertion + if (temp_obj.length != 0 ) + { + temp_obj.forEach( async (temp_obj_element) => + { + Object.assign( obj,{ pd_id : pd_id.pd_id} ); + Object.assign( obj,temp_obj_element ); + var index = creditFilter_table_name[0].table_name; + var tableName = arr[index] + await tableName.create( obj ).then((data)=>{}).catch((err)=>console.log(err)); + // console.log(obj); + }); + } + else + { + Object.assign( obj,{ pd_id : pd_id.pd_id} ); + var index = creditFilter_table_name[0].table_name; + var tableName = arr[index] + await tableName.create( obj ).then((data)=>{}).catch((err)=>console.log(err)); + // console.log(obj); + } + } // if end + } // outer forLoop +} diff --git a/app/models/BusinessAsset.js b/app/models/BusinessAsset.js index 6a44a8e..5c02094 100644 --- a/app/models/BusinessAsset.js +++ b/app/models/BusinessAsset.js @@ -15,7 +15,7 @@ module.exports = (sequelize, DataTypes) => { business_pd_visited_remark: { type: DataTypes.STRING }, business_ownership_type: { type: DataTypes.STRING }, business_approximate_market_value: { type: DataTypes.INTEGER }, - business_name_of_the_owner: { type: DataTypes.STRING }, + business_name_of_the_owner: { type: DataTypes.STRING }, // DataTypes.ARRAY(DataTypes.STRING), business_vintage: { type: DataTypes.INTEGER }, business_purchase_year: { type: DataTypes.INTEGER }, business_emi: { type: DataTypes.INTEGER }, diff --git a/app/models/CreditManager.js b/app/models/CreditManager.js index a203718..49b09f4 100644 --- a/app/models/CreditManager.js +++ b/app/models/CreditManager.js @@ -16,7 +16,7 @@ module.exports = (sequelize, DataTypes) => { }, { sequelize, - tableName: 'crredit_credit_manager_specific_queries', + tableName: 'credit_credit_manager_specific_queries', modelName: 'CreditManager', } ) diff --git a/app/routes/routes.js b/app/routes/routes.js index 5a72dc3..83ca924 100644 --- a/app/routes/routes.js +++ b/app/routes/routes.js @@ -2,6 +2,7 @@ module.exports = app => { const request = require("request"); const cors=require('cors'); const Mycontroller = require("../controllers/test.controller.js"); + const CreditPdController = require("../controllers/creditpd.controller.js"); const { logMsg } = require('../services/logger.js'); var router = require("express").Router(); @@ -61,7 +62,7 @@ module.exports = app => { router.post("/PullCreditPdData", Mycontroller.PullCreditPdData); -// router.get('/creditPd',Mycontroller.CreditPd) + router.get('/creditPd',CreditPdController.CreditPd) // routes started here diff --git a/server.js b/server.js index 54b2502..175d664 100644 --- a/server.js +++ b/server.js @@ -61,3 +61,4 @@ app.listen({ port: PORT_NUMBER }, async () => { //await sequelize.authenticate() }) + From 4b0d57198a3814dba62796175d2fb958e729c2e3 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Fri, 6 May 2022 09:32:08 +0530 Subject: [PATCH 04/42] susee --- app/controllers/abc.js | 112 ----------------------------------------- 1 file changed, 112 deletions(-) delete mode 100644 app/controllers/abc.js diff --git a/app/controllers/abc.js b/app/controllers/abc.js deleted file mode 100644 index bfac685..0000000 --- a/app/controllers/abc.js +++ /dev/null @@ -1,112 +0,0 @@ -// for (const [key, value] of Object.entries(tempData)) { -// creditFilter_obj_key = await CreditFilterTable.findAll({ raw: true , attributes: [ 'obj_key' ], where : { section : key , is_active : 1 }}) -// creditFilter_table_name = await CreditFilterTable.findAll({ raw: true, attributes: [ 'table_name' ,'section'], where : { section : key , is_active : 1 } , group: ['table_name' , 'section']}) -// for (let index = 0; index < creditFilter_obj_key.length; index++) { -// arr_ObjKey.push(creditFilter_obj_key[index].obj_key) -// } -// if (key == creditFilter_table_name[0].section) { -// arrkeys = key; -// for (var [keys, elements] of Object.entries(value)) { -// // arrkeys_1 = Object.keys(value); -// console.log(keys , elements); -// // if ( Array.isArray(elements) == true ) // array of object data -// // { - elements.forEach(async(element , index) => { - Object.assign(obj,element); - for (let i = 1; i < arrkeys_1.length; i++) { - Object.assign(obj , {[arrkeys_1[i]] : value[arrkeys_1[i]] } ); - } - Object.assign( obj, { pd_id : pd_id.pd_id } ); - var index = creditFilter_table_name[0].table_name; - var tableName = arr[index] - await tableName.create( obj ).then((data)=>{}).catch((err)=>console.log(err)); - }); -// // } -// // else -// // { -// // Object.keys(value).forEach( async (key) => { // nested object data -// // Object.assign( obj, { pd_id : pd_id.pd_id } ); -// // if( typeof value[key] === "object" && ( value[key] !== null ) && Array.isArray(value[key]) == false ) -// // { -// // Credit_PdHelper.CreditPd( key , value[key] , arr_ObjKey , obj ) -// // } -// // else if( value[key] !== null && Array.isArray(value[key]) == false ) // object data -// // { -// // Object.assign( obj, { [key] : value[key] }); -// // } -// // else if (Array.isArray(value[key]) == true ) -// // { -// // value[key].forEach( async (element) => { -// // Object.assign( obj, { [key] : element }); -// // }); -// // } -// // }); -// // } -// } -// } //end -// // data insert into DB -// if (arrkeys.includes(creditFilter_table_name[0].table_name) == false) { -// // var index = creditFilter_table_name[0].table_name; -// // var tableName = arr[index] -// // await tableName.create( obj ).then((data)=>{}).catch((err)=>console.log(err)); -// // console.log(obj); -// } -// } -// } -// case 2 - - -for (const [key, value] of Object.entries(tempData)) { - creditFilter_obj_key = await CreditFilterTable.findAll({ raw: true , attributes: [ 'mul_key' ], where : { section : key , is_active : 1 , is_mul : 1}}) - creditFilter_table_name = await CreditFilterTable.findAll({ raw: true, attributes: [ 'table_name' ,'section' ,'ques_key'], where : { section : key , is_active : 1 } , group: ['table_name' , 'section' ,'ques_key']}) - for (let index = 0; index < creditFilter_obj_key.length; index++) - { - arr_ObjKey.push(creditFilter_obj_key[index].mul_key) - } - if (key == creditFilter_table_name[0].section) { - arrkeys = key; - storeKeys = Object.keys(value); - for (var [arr_keys, arr_of_element] of Object.entries(value)) { - if ( Array.isArray(arr_of_element) == true ) - { - // for (let i = 0 ; i < storeKeys.length ; i++) - // { - // if ( storeKeys[i] != arr_keys ) - // { - // Object.assign(temp_obj , { [storeKeys[i]] : value[storeKeys[i]] } ); - // } - // } - arr_of_element.forEach(async(iter_element , index) => { - if (Object.keys(iter_element)[0] == '0') { - temp_obj.push({ [arr_keys] : iter_element }) - } else { - temp_obj.push(iter_element) ; - } - // Object.assign(obj,iter_element ,temp_obj, { pd_id : 1 }); // pd_id.pd_id - // var index = creditFilter_table_name[0].table_name; - // var tableName = arr[index] - // await tableName.create( obj ).then((data)=>{}).catch((err)=>console.log(err)); - // console.log(obj); - }); - } - else if( typeof arr_of_element === "object" && ( arr_of_element !== null ) ) - { - await Object.assign( obj, { pd_id : pd_id.pd_id } ); - await Credit_PdHelper.CreditPd( arr_keys , arr_of_element , arr_ObjKey , obj ) - } - else if( storeKeys.includes(creditFilter_table_name[0].ques_key) == false ) - { - Object.assign( obj, { pd_id : pd_id.pd_id } ); - Object.assign( obj, { [arr_keys] : arr_of_element }); - } - }// inner forLoop - // DB insert - // var index = creditFilter_table_name[0].table_name; - // var tableName = arr[index] - // await tableName.create( obj ).then((data)=>{}).catch((err)=>console.log(err)); - // console.log(obj); - console.log(temp_obj); - } - } // 1st forLoop -} - From 89726104947797a60f134a9a9b0b954f2766f2c8 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Fri, 6 May 2022 16:43:48 +0530 Subject: [PATCH 05/42] susee --- app/controllers/creditpd.controller.js | 54 +++++++++---------- app/models/CreditAddressDetail.js | 2 +- app/models/CreditFinancialInformation.js | 12 ++--- .../CreditKeyProductBusinessContribution.js | 2 +- app/models/CreditLoanDetail.js | 2 +- package-lock.json | 26 +++++++++ package.json | 3 ++ 7 files changed, 65 insertions(+), 36 deletions(-) diff --git a/app/controllers/creditpd.controller.js b/app/controllers/creditpd.controller.js index 9ffefdf..096f0bb 100644 --- a/app/controllers/creditpd.controller.js +++ b/app/controllers/creditpd.controller.js @@ -5,11 +5,14 @@ const { sequelize,Test,CreditGeneralInformation,SizeAndGeographicalResearch,Cred CreditKeyShareholder,Covid19Questions,StockDetail,BusinessAsset,CreditFilterTable} = require('../models') const { logMsg } = require('../services/logger.js'); const Credit_PdHelper = require('../services/CreditPdHelper.js'); +const moment = require('moment'); var global = require('global') global.arr = [ CreditAddressDetail , CreditBorrowerAndGuarantorDetails , CreditBusinessAndPersonalBankingDetails , BusinessAsset , ClientDetail , Covid19Questions , EmployeeStrength , CreditExistingLoanObligation , FamilyMemberInvolvedInBusiness , CreditFinalRemarks , CreditFinancialAnalysis , CreditFinancialInformation , - CreditFuturePlans , CreditGeneralBusinessInformation , CreditGeneralInformation , CreditKeyProductBusinessContribution , CreditKeyShareholder , CreditLoanDetail , OverallPlanOfAction , PortFolioHealth , ProductAndProcess , CreditProfile , SizeAndGeographicalResearch , StockDetail , SupplierDetail , TotalOverallDebit , ValidationPoint , CreditManager ] + CreditFuturePlans , CreditGeneralBusinessInformation , CreditGeneralInformation , CreditKeyProductBusinessContribution , + CreditKeyShareholder , CreditLoanDetail , OverallPlanOfAction , PortFolioHealth , ProductAndProcess , CreditProfile , + SizeAndGeographicalResearch , StockDetail , SupplierDetail , TotalOverallDebit , ValidationPoint , CreditManager ] exports.Welcome = (req, res) => { @@ -29,41 +32,36 @@ exports.Welcome = (req, res) => exports.CreditPd = async (req, res) => { - const tempData = - { - - - - } + // { + // "pdid":"4526", + // "product":"WCTL", + // "data":"jsonstring + // } + + const tempData = { } + var obj = { }; // store obj let temp_obj = [ ]; // store array of obj var arr_ObjKey = [ ] var creditFilter_obj_key = [ ]; var creditFilter_table_name = [ ]; var name; + var loan_amount; var pd_id = [ ]; - // var arrkeys = [ ]; - // var storeKeys; - for (const [key, value] of Object.entries(tempData)) { - if (key == "Borrower & Guarantor Details") { + for (const [key, value] of Object.entries(tempData)) { + if (key == "Loan details" || key =="Borrower & Guarantor Details") { for (var [keys, element] of Object.entries(value)) { - if ( Array.isArray(element) == true ) // array of object data - { - element.forEach(async(element , index) => { - if ( keys == 'borrower_details' && index == 0 ) - { - name = element['borrower_name']; - // pd_id = await CreditGeneralInformation.create({ name : name }); // get main applicant name - } - }); - } + if ( Array.isArray(element) == true ) { element.forEach(async(element , index) => { + if ( keys == 'borrower_details' && index == 0 ) { Object.assign( obj , {name : element['borrower_name']}) } }); + } else { if ( keys == 'loan_amount') { { Object.assign( obj , { loan_amount : element })} } } } } } - + pd_id = await CreditGeneralInformation.create(obj); for (const [key, value] of Object.entries(tempData)) { + console.log(key); creditFilter_obj_key = await CreditFilterTable.findAll({ raw: true , attributes: [ 'mul_key' ], where : { section : key , is_active : 1 , is_mul : 1}}) creditFilter_table_name = await CreditFilterTable.findAll({ raw: true, attributes: [ 'table_name' ,'section' ,'ques_key'], where : { section : key , is_active : 1 } , group: ['table_name' , 'section' ,'ques_key']}) for (let index = 0; index < creditFilter_obj_key.length; index++) @@ -73,8 +71,6 @@ exports.CreditPd = async (req, res) => if (key == creditFilter_table_name[0].section) { temp_obj.length = 0 ; // clear array obj = { }; // clear obj - // arrkeys = key; - // storeKeys = Object.keys(value); for (var [arr_keys, arr_of_element] of Object.entries(value)) { if ( Array.isArray(arr_of_element) == true ) { @@ -88,11 +84,17 @@ exports.CreditPd = async (req, res) => } else if( typeof arr_of_element === "object" && ( arr_of_element !== null ) ) { + delete arr_of_element.display_data; + delete value.display_data; await Credit_PdHelper.CreditPd( arr_keys , arr_of_element , arr_ObjKey , obj ) } else { - Object.assign( obj, { [arr_keys] : arr_of_element }); + if (moment(arr_of_element, "DD-MM-YYYY", true).isValid() == true) { + var mydate = moment(arr_of_element, "DD-MM-YYYY"); // convert dd/mm/yyyy to yyyy/mm/dd + var my_date = moment(mydate).format("YYYY-MM-DD") + Object.assign( obj, { [arr_keys] : my_date }); + } else { Object.assign( obj, { [arr_keys] : arr_of_element }); } } }// inner forLoop // DB insertion @@ -105,7 +107,6 @@ exports.CreditPd = async (req, res) => var index = creditFilter_table_name[0].table_name; var tableName = arr[index] await tableName.create( obj ).then((data)=>{}).catch((err)=>console.log(err)); - // console.log(obj); }); } else @@ -114,7 +115,6 @@ exports.CreditPd = async (req, res) => var index = creditFilter_table_name[0].table_name; var tableName = arr[index] await tableName.create( obj ).then((data)=>{}).catch((err)=>console.log(err)); - // console.log(obj); } } // if end } // outer forLoop diff --git a/app/models/CreditAddressDetail.js b/app/models/CreditAddressDetail.js index 58e5812..696e198 100644 --- a/app/models/CreditAddressDetail.js +++ b/app/models/CreditAddressDetail.js @@ -14,7 +14,7 @@ module.exports = (sequelize, DataTypes) => { address_type_others: { type: DataTypes.STRING }, pd_locality: { type: DataTypes.STRING }, locality_other: { type: DataTypes.STRING }, - pd_location: { type: DataTypes.STRING }, + pd_location: { type: DataTypes.STRING }, // gen info comment_locality: { type: DataTypes.STRING }, business_estimated_area: { type: DataTypes.INTEGER }, uom: { type: DataTypes.STRING }, diff --git a/app/models/CreditFinancialInformation.js b/app/models/CreditFinancialInformation.js index 9aa078e..9f0e3cb 100644 --- a/app/models/CreditFinancialInformation.js +++ b/app/models/CreditFinancialInformation.js @@ -28,12 +28,12 @@ module.exports = (sequelize, DataTypes) => { sales_revenue: { type: DataTypes.STRING }, net_profit: { type: DataTypes.STRING }, net_profit_sales_percent: { type: DataTypes.STRING }, - sales_py: { type: DataTypes.INTEGER }, - netprofit_py: { type: DataTypes.INTEGER }, - netprofit_py_percent: { type: DataTypes.INTEGER }, - debtor_days_cet: { type: DataTypes.INTEGER }, - creditor_days_cet: { type: DataTypes.INTEGER }, - inventory_days_cet: { type: DataTypes.INTEGER }, + sales_py: { type: DataTypes.STRING }, + netprofit_py: { type: DataTypes.STRING }, + netprofit_py_percent: { type: DataTypes.STRING }, + debtor_days_cet: { type: DataTypes.STRING }, + creditor_days_cet: { type: DataTypes.STRING }, + inventory_days_cet: { type: DataTypes.STRING }, company_name: { type: DataTypes.STRING }, no_of_financial_years: { type: DataTypes.INTEGER }, common_remarks: { type: DataTypes.STRING }, diff --git a/app/models/CreditKeyProductBusinessContribution.js b/app/models/CreditKeyProductBusinessContribution.js index e43d4f9..8e3aed5 100644 --- a/app/models/CreditKeyProductBusinessContribution.js +++ b/app/models/CreditKeyProductBusinessContribution.js @@ -7,7 +7,7 @@ module.exports = (sequelize, DataTypes) => { CreditKeyProductBusinessContribution.init( { pd_id: { type: DataTypes.INTEGER }, - product_name: { type: DataTypes.STRING }, + product_name: { type: DataTypes.STRING }, // gen info contribution_business_product: { type: DataTypes.STRING }, remarks: { type: DataTypes.STRING }, company_name: { type: DataTypes.STRING }, diff --git a/app/models/CreditLoanDetail.js b/app/models/CreditLoanDetail.js index ec31656..c2d7033 100644 --- a/app/models/CreditLoanDetail.js +++ b/app/models/CreditLoanDetail.js @@ -7,7 +7,7 @@ module.exports = (sequelize, DataTypes) => { CreditLoanDetail.init( { pd_id: { type: DataTypes.INTEGER }, - loan_amount: { type: DataTypes.INTEGER }, + loan_amount: { type: DataTypes.INTEGER }, // gen info remarks_fund_source_balance: { type: DataTypes.STRING }, loan_tenure: { type: DataTypes.INTEGER }, sub_product: { type: DataTypes.STRING }, diff --git a/package-lock.json b/package-lock.json index 5640fb9..7fd8eeb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,11 +11,14 @@ "dependencies": { "body-parser": "^1.19.0", "cors": "^2.8.5", + "date-and-time": "^2.3.1", + "dateformat": "^5.0.3", "dotenv": "^10.0.0", "express": "^4.17.1", "global": "^4.4.0", "lodash": "^4.17.21", "log4js": "^6.3.0", + "moment": "^2.29.3", "mssql": "^7.2.0", "request": "^2.88.2", "sequelize": "^6.6.5", @@ -1521,6 +1524,11 @@ "node": ">=0.10" } }, + "node_modules/date-and-time": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-2.3.1.tgz", + "integrity": "sha512-OaIRmSJXifwEN21rMVVDs0Kz8uhJ3wWPYd86atkRiqN54liaMQYEbbrgjZQea75YXOBWL4ZFb3rG/waenw1TEg==" + }, "node_modules/date-format": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.7.tgz", @@ -1537,6 +1545,14 @@ "node": ">0.4.0" } }, + "node_modules/dateformat": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-5.0.3.tgz", + "integrity": "sha512-Kvr6HmPXUMerlLcLF+Pwq3K7apHpYmGDVqrxcDasBg86UcKeTSNWbEzU8bwdXnxnR44FtMhJAxI4Bov6Y/KUfA==", + "engines": { + "node": ">=12.20" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -6201,6 +6217,11 @@ "assert-plus": "^1.0.0" } }, + "date-and-time": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-2.3.1.tgz", + "integrity": "sha512-OaIRmSJXifwEN21rMVVDs0Kz8uhJ3wWPYd86atkRiqN54liaMQYEbbrgjZQea75YXOBWL4ZFb3rG/waenw1TEg==" + }, "date-format": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.7.tgz", @@ -6211,6 +6232,11 @@ "resolved": "https://registry.npmjs.org/date-utils/-/date-utils-1.2.21.tgz", "integrity": "sha1-YfsWzcEnSzyayq/+n8ad+HIKK2Q=" }, + "dateformat": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-5.0.3.tgz", + "integrity": "sha512-Kvr6HmPXUMerlLcLF+Pwq3K7apHpYmGDVqrxcDasBg86UcKeTSNWbEzU8bwdXnxnR44FtMhJAxI4Bov6Y/KUfA==" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", diff --git a/package.json b/package.json index 45d01cd..5a88b04 100644 --- a/package.json +++ b/package.json @@ -11,11 +11,14 @@ "dependencies": { "body-parser": "^1.19.0", "cors": "^2.8.5", + "date-and-time": "^2.3.1", + "dateformat": "^5.0.3", "dotenv": "^10.0.0", "express": "^4.17.1", "global": "^4.4.0", "lodash": "^4.17.21", "log4js": "^6.3.0", + "moment": "^2.29.3", "mssql": "^7.2.0", "request": "^2.88.2", "sequelize": "^6.6.5", From d1e85235ec3aeac5576894173e0155f3fdfa3991 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Mon, 16 May 2022 12:00:18 +0530 Subject: [PATCH 06/42] susee --- app/controllers/creditpd.controller.js | 329 +++++++++++++++++------- app/controllers/test.controller.js | 2 +- app/models/CreditGeneralInformation.js | 81 +++++- app/models/Photograph.js | 25 ++ app/models/SupplierDetail.js | 4 +- app/routes/routes.js | 158 +++++++++++- app/services/CreditPdHelper.js | 25 +- package-lock.json | 338 ++++++++++++++++++++++++- package.json | 1 + 9 files changed, 852 insertions(+), 111 deletions(-) create mode 100644 app/models/Photograph.js diff --git a/app/controllers/creditpd.controller.js b/app/controllers/creditpd.controller.js index 096f0bb..7404907 100644 --- a/app/controllers/creditpd.controller.js +++ b/app/controllers/creditpd.controller.js @@ -2,17 +2,19 @@ const { keys, values } = require('lodash'); const { sequelize,Test,CreditGeneralInformation,SizeAndGeographicalResearch,CreditProfile,ProductAndProcess,PortFolioHealth,TotalOverallDebit,OverallPlanOfAction,ValidationPoint, CreditLoanDetail,CreditFinalRemarks,CreditGeneralBusinessInformation,CreditKeyProductBusinessContribution,EmployeeStrength,CreditBusinessAndPersonalBankingDetails,CreditFinancialInformation, SupplierDetail ,ClientDetail,CreditFuturePlans,CreditExistingLoanObligation,FamilyMemberInvolvedInBusiness,CreditManager,CreditBorrowerAndGuarantorDetails,CreditFinancialAnalysis,CreditAddressDetail, - CreditKeyShareholder,Covid19Questions,StockDetail,BusinessAsset,CreditFilterTable} = require('../models') + CreditKeyShareholder,Covid19Questions,StockDetail,BusinessAsset,CreditFilterTable,Photograph} = require('../models') const { logMsg } = require('../services/logger.js'); const Credit_PdHelper = require('../services/CreditPdHelper.js'); const moment = require('moment'); -var global = require('global') -global.arr = [ CreditAddressDetail , CreditBorrowerAndGuarantorDetails , CreditBusinessAndPersonalBankingDetails , BusinessAsset , - ClientDetail , Covid19Questions , EmployeeStrength , CreditExistingLoanObligation , +var global = require('global'); +global.arr = [ CreditAddressDetail , CreditBorrowerAndGuarantorDetails , CreditBusinessAndPersonalBankingDetails, + BusinessAsset , ClientDetail , Covid19Questions , EmployeeStrength , + CreditExistingLoanObligation , FamilyMemberInvolvedInBusiness , CreditFinalRemarks , CreditFinancialAnalysis , CreditFinancialInformation , CreditFuturePlans , CreditGeneralBusinessInformation , CreditGeneralInformation , CreditKeyProductBusinessContribution , CreditKeyShareholder , CreditLoanDetail , OverallPlanOfAction , PortFolioHealth , ProductAndProcess , CreditProfile , - SizeAndGeographicalResearch , StockDetail , SupplierDetail , TotalOverallDebit , ValidationPoint , CreditManager ] + SizeAndGeographicalResearch , StockDetail , SupplierDetail , TotalOverallDebit , + ValidationPoint , CreditManager , Photograph ] exports.Welcome = (req, res) => { @@ -29,94 +31,239 @@ exports.Welcome = (req, res) => }; -exports.CreditPd = async (req, res) => +exports.PullCreditPdData = async (req, res) => { - // { - // "pdid":"4526", - // "product":"WCTL", - // "data":"jsonstring - // } - - const tempData = { } - - var obj = { }; // store obj - let temp_obj = [ ]; // store array of obj - var arr_ObjKey = [ ] - var creditFilter_obj_key = [ ]; - var creditFilter_table_name = [ ]; - var name; - var loan_amount; - var pd_id = [ ]; - - for (const [key, value] of Object.entries(tempData)) { - if (key == "Loan details" || key =="Borrower & Guarantor Details") { - for (var [keys, element] of Object.entries(value)) { - if ( Array.isArray(element) == true ) { element.forEach(async(element , index) => { - if ( keys == 'borrower_details' && index == 0 ) { Object.assign( obj , {name : element['borrower_name']}) } }); - } else { if ( keys == 'loan_amount') { { Object.assign( obj , { loan_amount : element })} } } - } - } - } - pd_id = await CreditGeneralInformation.create(obj); - - for (const [key, value] of Object.entries(tempData)) { - console.log(key); - creditFilter_obj_key = await CreditFilterTable.findAll({ raw: true , attributes: [ 'mul_key' ], where : { section : key , is_active : 1 , is_mul : 1}}) - creditFilter_table_name = await CreditFilterTable.findAll({ raw: true, attributes: [ 'table_name' ,'section' ,'ques_key'], where : { section : key , is_active : 1 } , group: ['table_name' , 'section' ,'ques_key']}) - for (let index = 0; index < creditFilter_obj_key.length; index++) + try { - arr_ObjKey.push(creditFilter_obj_key[index].mul_key) // store nested obj keys - } - if (key == creditFilter_table_name[0].section) { - temp_obj.length = 0 ; // clear array - obj = { }; // clear obj - for (var [arr_keys, arr_of_element] of Object.entries(value)) { - if ( Array.isArray(arr_of_element) == true ) - { - arr_of_element.forEach(async(iter_element , index) => { - if (Object.keys(iter_element)[0] == '0') { - temp_obj.push({ [arr_keys] : iter_element }) - } else { - temp_obj.push(iter_element) ; - } - }); - } - else if( typeof arr_of_element === "object" && ( arr_of_element !== null ) ) - { - delete arr_of_element.display_data; - delete value.display_data; - await Credit_PdHelper.CreditPd( arr_keys , arr_of_element , arr_ObjKey , obj ) - } - else - { - if (moment(arr_of_element, "DD-MM-YYYY", true).isValid() == true) { - var mydate = moment(arr_of_element, "DD-MM-YYYY"); // convert dd/mm/yyyy to yyyy/mm/dd - var my_date = moment(mydate).format("YYYY-MM-DD") - Object.assign( obj, { [arr_keys] : my_date }); - } else { Object.assign( obj, { [arr_keys] : arr_of_element }); } - } - }// inner forLoop - // DB insertion - if (temp_obj.length != 0 ) - { - temp_obj.forEach( async (temp_obj_element) => - { - Object.assign( obj,{ pd_id : pd_id.pd_id} ); - Object.assign( obj,temp_obj_element ); - var index = creditFilter_table_name[0].table_name; - var tableName = arr[index] - await tableName.create( obj ).then((data)=>{}).catch((err)=>console.log(err)); - }); - } - else - { - Object.assign( obj,{ pd_id : pd_id.pd_id} ); - var index = creditFilter_table_name[0].table_name; - var tableName = arr[index] - await tableName.create( obj ).then((data)=>{}).catch((err)=>console.log(err)); - } - } // if end - } // outer forLoop + const tempData = parse(JSON.stringify(req.body.data)); + var obj = { }; + let temp_obj = [ ]; + var arr_ObjKey = [ ] + var creditFilter_obj_key = [ ]; + var creditFilter_table_name = [ ]; + var name; + var loan_amount; + var pd_id = [ ]; + + // create creditGeneralInormationData + for (const [key, value] of Object.entries(tempData)) { + if (key == "Loan details" || key =="Borrower & Guarantor Details") { + for (var [keys, element] of Object.entries(value)) { + if ( Array.isArray(element) == true ) { + element.forEach(async(element , index) => { + if ( keys == 'borrower_details' && index == 0 ) { + Object.assign( obj , {name : element['borrower_name']}) + Object.assign(obj, { ref_no: req.body.pdid , product :req.body.product , case_no :req.body.caseno}); + } + }); + } else { if ( keys == 'loan_amount') { { Object.assign( obj , { loan_amount : element })} } } + } + } + } + // Object.assign( obj , { ref_no : req.body.pdid }); + await CreditGeneralInformation.create(obj) + .then((successData)=>{logMsg.info("GeneralInformation insert success ,PdId= "+successData.dataValues.pd_id);}) + .catch((err)=>{ logMsg.info("GeneralInformation insert failed ,PdId(ref_no)= "+req.body.pdid); }); + pd_id = await CreditGeneralInformation.findOne({ where : { ref_no : req.body.pdid , is_active : 1 }}); + // pd_id = await CreditGeneralInformation.create(obj) + + + // loop to check if the data is array or nestedObject or objects + for (const [key, value] of Object.entries(tempData)) { + creditFilter_obj_key = await CreditFilterTable.findAll({ raw: true , attributes: [ 'mul_key' ], where : { section : key , is_active : 1 , is_mul : 1}}) + creditFilter_table_name = await CreditFilterTable.findAll({ raw: true, attributes: [ 'table_name' ,'section' ,'ques_key'], where : { section : key , is_active : 1 } , group: ['table_name' , 'section' ,'ques_key']}) + for (let index = 0; index < creditFilter_obj_key.length; index++) + { + arr_ObjKey.push(creditFilter_obj_key[index].mul_key) // store nested obj keys + } + if (key == creditFilter_table_name[0].section) { + temp_obj.length = 0 ; // clear array datas + obj = { }; // clear obj datas + + // Check if the data is array or not + for (var [arr_keys, arr_of_element] of Object.entries(value)) { + if ( Array.isArray(arr_of_element) == true ) + { + arr_of_element.forEach(async(iter_element , index) => { + // assign only value with in array + if (Object.keys(iter_element)[0] == '0') { + temp_obj.push({ [arr_keys] : iter_element }) + } + // assign array of objects + else + { + temp_obj.push(iter_element) ; + } + }); + } + // assign nestedObject datas + else if( typeof arr_of_element === "object" && ( arr_of_element !== null ) ) + { + delete arr_of_element.display_data; + delete value.display_data; + await Credit_PdHelper.CreditPd( arr_keys , arr_of_element , arr_ObjKey , obj ) + } + // assign object data + else + { + if (moment(arr_of_element, "DD-MM-YYYY", true).isValid() == true) { + var mydate = moment(arr_of_element, "DD-MM-YYYY"); // convert dd/mm/yyyy to yyyy/mm/dd + var my_date = moment(mydate).format("YYYY-MM-DD") + Object.assign( obj, { [arr_keys] : my_date }); + } else { Object.assign( obj, { [arr_keys] : arr_of_element }); } + } + }// end of inner forLoop + // DB insertion + // insert array of object datas + if (temp_obj.length != 0 ) + { + temp_obj.forEach( async (temp_obj_element) => + { + Object.assign( obj,{ pd_id : pd_id.pd_id} ); + Object.assign( obj,temp_obj_element ); + var index = creditFilter_table_name[0].table_name; + var tableName = arr[index] + await tableName.create( obj ) + .then((successData)=>{logMsg.info(` ${tableName} insert success ,PdId= `+pd_id.pd_id);}) + .catch((err)=>{ logMsg.info(` ${tableName} insert failed ,PdId= `+pd_id.pd_id); }); + }); + } + // insert nestedObject and object datas + else + { + Object.assign( obj,{ pd_id : pd_id.pd_id} ); + var index = creditFilter_table_name[0].table_name; + var tableName = arr[index] + await tableName.create( obj ) + .then((successData)=>{logMsg.info(` ${tableName} insert success ,PdId= `+pd_id.pd_id);}) + .catch((err)=>{ logMsg.info(` ${tableName} insert failed ,PdId= `+pd_id.pd_id); }); + } + } // if end + } // end of outer forLoop + + } catch(err) { + res.send({'status':404,message: err.message || "Some error occurred while retrieving data." ,'data': "No data" }); + } //end of try catch + } + + + +exports.PullCreditPdPhotographsData = async (req, res) => +{ + try + { + // fetch SMC PdId from DB + GeneralSectionData = await CreditGeneralInformation.findOne({ where : { ref_no : req.body.pdid ,case_no :req.body.caseno, is_active : 1 }}); + PdId = GeneralSectionData.dataValues.pd_id; + // convert image file to base64 code + // path = "storage/uploads/" + // file = path+img_name; + // base64_data = "data:image/png;base64," + fs.readFileSync(file, 'base64'); + // insert photograph data here + + await Photograph.create({pd_id: PdId , ref_no :req.body.pdid , img_name :req.body.img_name , img : img_name}) + .then((successData)=>{logMsg.info("Photograph insert success ,PdId= "+PdId);}) + .catch((err)=>{ logMsg.info("Photograph insert failed ,PdId= "+PdId+" ERROR : "+err);}); + // responce to FE + setTimeout(() => { + res.send({'status':200,'message':"success",'data':"INSERT INTO sales_photograph (pd_id,ref_no,img_name,img) VALUES ("+PdId+","+req.body.pdid+","+req.body.img_name+","+base64_data+")"}); + }, 300); + + + } catch(err) { + res.send({'status':404,message: err.message || "Some error occurred while retrieving data." ,'data': "No data" }); + } //end of try catch + +}; + + +exports.imageView = async (req, res) => +{ + try + { + const filePath = "storage/uploads/"+req.query.img_name; + const { dirname } = require('path'); + const appDir = dirname(require.main.filename); + + res.sendFile(filePath , { root: appDir }); + } catch(err) { + res.send({'status':404,message: err.message || "Some error occurred while retrieving data." ,'data': "No data" }) ; + } //end of try catch +}; + + + +exports.DownloadPdReport = async (req, res) => +{ + try + { + pd_id = req.query.ref_no; + DownloadPdReportUrl = process.env.PD_REPORT_URL; + url = DownloadPdReportUrl+""+pd_id; + + + request({ + url: url, + method: "GET" + + }, function (error, response, body) { console.log(body); + if (body != undefined) { + data = JSON.parse(body); + if ( data.status == 200) { + + link = data.records; + res.send({'status':200,'message':"success",'data':link}); + }else{ + res.send({'status':404,'message':"failed",'data':"No data"}); + } + } + }); + + + + } catch(err) { + res.send({'status':404,message: err.message || "Some error occurred while retrieving data." ,'data': "No data" }); + } //end of try catch + +}; + +exports.GetCreditPdData = async (req, res) => +{ + try + { + applicantDetails = await Credit_PdHelper.MainApplicantDetails(req.query.losid); + MainApplicantDetails = JSON.parse(applicantDetails); + + if(MainApplicantDetails.status == 200) + { + var resData = await CreditGeneralInformation.findAll({ where : { name : MainApplicantDetails.data.name,is_active : 1}, + include : [ + {model: CreditAddressDetail }, {model: CreditFuturePlans }, + {model : CreditBorrowerAndGuarantorDetails }, + {model: CreditBusinessAndPersonalBankingDetails }, {model: BusinessAsset }, + {model: CreditFinancialInformation }, {model: CreditKeyShareholder }, + {model: CreditKeyProductBusinessContribution }, {model: EmployeeStrength }, + {model: ClientDetail }, {model: StockDetail }, + {model: CreditExistingLoanObligation }, {model: FamilyMemberInvolvedInBusiness }, + {model : CreditManager }, // {model: Photograph }, + {model: CreditFinalRemarks }, {model: CreditLoanDetail }, + {model: CreditGeneralBusinessInformation }, {model: SupplierDetail } + ] + }) + res.send({'status':200,'message':"success",'data':resData}); + }else + { + res.send({'status':404,'message':"failed",'data':"No data"}); + } + + } catch(err) { + res.status(500).send({'status':404, + message: err.message || "Some error occurred while inserting statements." ,'data': "No data" + }); + } + +}; + diff --git a/app/controllers/test.controller.js b/app/controllers/test.controller.js index ea34e60..44866b2 100644 --- a/app/controllers/test.controller.js +++ b/app/controllers/test.controller.js @@ -28,4 +28,4 @@ exports.PullCreditPdData = async (req, res) => res.send({'status':404,message: err.message || "Some error occurred while retrieving data." ,'data': "No data" }); } //end of try catch -}; \ No newline at end of file +}; diff --git a/app/models/CreditGeneralInformation.js b/app/models/CreditGeneralInformation.js index 4ea5efa..1306d1a 100644 --- a/app/models/CreditGeneralInformation.js +++ b/app/models/CreditGeneralInformation.js @@ -1,5 +1,9 @@ 'use strict' const { Model } = require('sequelize') +const { sequelize,Test,CreditGeneralInformation,SizeAndGeographicalResearch,CreditProfile,ProductAndProcess,PortFolioHealth,TotalOverallDebit,OverallPlanOfAction,ValidationPoint, + CreditLoanDetail,CreditFinalRemarks,CreditGeneralBusinessInformation,CreditKeyProductBusinessContribution,EmployeeStrength,CreditBusinessAndPersonalBankingDetails,CreditFinancialInformation, + SupplierDetail ,ClientDetail,CreditFuturePlans,CreditExistingLoanObligation,FamilyMemberInvolvedInBusiness,CreditManager,CreditBorrowerAndGuarantorDetails,CreditFinancialAnalysis,CreditAddressDetail, + CreditKeyShareholder,Covid19Questions,StockDetail,BusinessAsset,CreditFilterTable} = require('../models') module.exports = (sequelize, DataTypes) => { class CreditGeneralInformation extends Model { @@ -15,6 +19,8 @@ module.exports = (sequelize, DataTypes) => { loan_amount: { type: DataTypes.INTEGER }, product: { type: DataTypes.STRING }, location: { type: DataTypes.STRING }, + ref_no: { type: DataTypes.INTEGER }, + case_no: { type: DataTypes.STRING }, createdby: { type: DataTypes.INTEGER }, updatedby: { type: DataTypes.INTEGER } }, @@ -24,7 +30,80 @@ module.exports = (sequelize, DataTypes) => { modelName: 'CreditGeneralInformation', } ) - + CreditGeneralInformation.associate = models => { + CreditGeneralInformation.hasMany(models.CreditAddressDetail, { + foreignKey: 'pd_id', + sourceKey : 'pd_id' + }); + CreditGeneralInformation.hasMany(models.CreditFuturePlans, { + foreignKey: 'pd_id', + sourceKey : 'pd_id' + }); + CreditGeneralInformation.hasMany(models.CreditBorrowerAndGuarantorDetails, { + foreignKey: 'pd_id', + sourceKey : 'pd_id' + }); + CreditGeneralInformation.hasMany(models.CreditBusinessAndPersonalBankingDetails, { + foreignKey: 'pd_id', + sourceKey : 'pd_id' + }); + CreditGeneralInformation.hasMany(models.BusinessAsset, { + foreignKey: 'pd_id', + sourceKey : 'pd_id' + }); + CreditGeneralInformation.hasMany(models.CreditFinancialInformation, { + foreignKey: 'pd_id', + sourceKey : 'pd_id' + }); + CreditGeneralInformation.hasMany(models.CreditKeyShareholder, { + foreignKey: 'pd_id', + sourceKey : 'pd_id' + }); + CreditGeneralInformation.hasMany(models.CreditKeyProductBusinessContribution, { + foreignKey: 'pd_id', + sourceKey : 'pd_id' + }); + CreditGeneralInformation.hasMany(models.EmployeeStrength, { + foreignKey: 'pd_id', + sourceKey : 'pd_id' + }); + CreditGeneralInformation.hasMany(models.ClientDetail, { + foreignKey: 'pd_id', + sourceKey : 'pd_id' + }); + CreditGeneralInformation.hasMany(models.StockDetail, { + foreignKey: 'pd_id', + sourceKey : 'pd_id' + }); + CreditGeneralInformation.hasMany(models.CreditExistingLoanObligation, { + foreignKey: 'pd_id', + sourceKey : 'pd_id' + }); + CreditGeneralInformation.hasMany(models.FamilyMemberInvolvedInBusiness, { + foreignKey: 'pd_id', + sourceKey : 'pd_id' + }); + CreditGeneralInformation.hasMany(models.CreditManager, { + foreignKey: 'pd_id', + sourceKey : 'pd_id' + }); + CreditGeneralInformation.hasMany(models.CreditFinalRemarks, { + foreignKey: 'pd_id', + sourceKey : 'pd_id' + }); + CreditGeneralInformation.hasMany(models.CreditLoanDetail, { + foreignKey: 'pd_id', + sourceKey : 'pd_id' + }); + CreditGeneralInformation.hasMany(models.CreditGeneralBusinessInformation, { + foreignKey: 'pd_id', + sourceKey : 'pd_id' + }); + CreditGeneralInformation.hasMany(models.SupplierDetail, { + foreignKey: 'pd_id', + sourceKey : 'pd_id' + }); + } return CreditGeneralInformation } \ No newline at end of file diff --git a/app/models/Photograph.js b/app/models/Photograph.js new file mode 100644 index 0000000..e85d46e --- /dev/null +++ b/app/models/Photograph.js @@ -0,0 +1,25 @@ +'use strict' +const { Model } = require('sequelize') +module.exports = (sequelize, DataTypes) => { + class Photograph extends Model { + + } + Photograph.init( + { + pd_id: { type: DataTypes.INTEGER }, + ref_no: { type: DataTypes.INTEGER }, + img: { type: DataTypes.STRING }, + img_name: { type: DataTypes.STRING }, + createdby: { type: DataTypes.INTEGER }, + updatedby: { type: DataTypes.INTEGER } + + }, + { + sequelize, + tableName: 'credit_photograph', + modelName: 'Photograph', + } + ) + + return Photograph +} \ No newline at end of file diff --git a/app/models/SupplierDetail.js b/app/models/SupplierDetail.js index f05b659..2407e3b 100644 --- a/app/models/SupplierDetail.js +++ b/app/models/SupplierDetail.js @@ -7,8 +7,8 @@ module.exports = (sequelize, DataTypes) => { SupplierDetail.init( { pd_id: { type: DataTypes.INTEGER }, - stock_info_available: { type: DataTypes.STRING }, - stock_not_available_reason: { type: DataTypes.STRING }, + supplier_info_available: { type: DataTypes.STRING }, + supplier_not_available_reason: { type: DataTypes.STRING }, provider_name: { type: DataTypes.STRING }, supplier_name: { type: DataTypes.STRING }, contact_person_name: { type: DataTypes.STRING }, diff --git a/app/routes/routes.js b/app/routes/routes.js index 83ca924..55b647f 100644 --- a/app/routes/routes.js +++ b/app/routes/routes.js @@ -20,9 +20,15 @@ module.exports = app => { * 200: * description: success */ - router.get("/demo", Mycontroller.Welcome); + router.get("/demo", CreditPdController.Welcome); + + + + + +// Pull CreditPd Data /** * @swagger * definitions: @@ -59,12 +65,158 @@ module.exports = app => { * 500: * description: failed */ -router.post("/PullCreditPdData", Mycontroller.PullCreditPdData); +router.get("/PullCreditPdData", CreditPdController.PullCreditPdData); - router.get('/creditPd',CreditPdController.CreditPd) + + + + + +// photograph upload +const multer = require('multer'); +img_name = ""; +const storage = multer.diskStorage({ + destination: (req, file, cb) => { + cb(null, 'storage/uploads/'); + }, + filename: (req, file, cb) => { + img_name = ""; + img_name += Date.now()+'-'+file.originalname; + cb(null, img_name); + } +}); +const upload = multer({ storage }); +/** +* @swagger +* definitions: +* PullCreditPdPhotographsData: +* type: object +* properties: +* pdid: +* type: integer +* description: pdid +* example: 6646 +* product: +* type: string +* description: product +* example: LFMP +* caseno: +* type: string +* description: +* example: MW53315 +* img: +* type: file +* description: image file +* example: +* img_name: +* type: string +* description: image file +* example: sample +*/ +/** +* @swagger +* /api/PullCreditPdPhotographsData: +* post: +* summary: Pull CreditPd Photographs Data +* description: Pull CreditPd Photographs Data +* requestBody: +* content: +* application/json: +* schema: +* $ref: '#/definitions/PullCreditPdPhotographsData' +* responses: +* 200: +* description: success +* 500: +* description: failed +*/ +// router.post('/PullCreditPdPhotographsData', upload.single('img'),function(req,res){ CreditPdController.PullCreditPdPhotographsData(req,res,img_name); } ); + + + + + + +// view image + /** +* @swagger +* /api/imageView: +* get: +* summary: view image file api +* description: +* parameters: +* - in: query +* name: img_name +* schema: +* type: integer +* required: true +* example: +* responses: +* 200: +* description: success +*/ +// router.get('/imageView',CreditPdController.imageView); + + + + + + + + + +//get credit pd data List Api +/** +* @swagger +* /api/GetCreditPdData: +* get: +* summary: Get CreditPdData Data List +* description: Get CreditPdData Data List +* parameters: +* - in: query +* name: losid +* schema: +* type: string +* required: true +* example: MW112233 +* responses: +* 200: +* description: success +*/ +router.get('/GetCreditPdData',CreditPdController.GetCreditPdData) + + + + +// DownloadPdReport +/** +* @swagger +* /api/DownloadPdReport: +* get: +* summary: Download Pd Report as pdf file +* description: Download Pd Report as pdf file +* parameters: +* - in: query +* name: ref_no +* schema: +* type: integer +* required: true +* example: 614 +* responses: +* 200: +* description: success +*/ +// router.get("/DownloadPdReport", SalesPdController.DownloadPdReport); + + + + + + + // routes started here app.use('/api', router); }; diff --git a/app/services/CreditPdHelper.js b/app/services/CreditPdHelper.js index 5118803..26e5ce7 100644 --- a/app/services/CreditPdHelper.js +++ b/app/services/CreditPdHelper.js @@ -4,6 +4,7 @@ const { sequelize,Test,CreditGeneralInformation,SizeAndGeographicalResearch,Cred SupplierDetail ,ClientDetail,CreditFuturePlans,CreditExistingLoanObligation,FamilyMemberInvolvedInBusiness,CreditManager,CreditBorrowerAndGuarantorDetails,CreditFinancialAnalysis,CreditAddressDetail, CreditKeyShareholder,Covid19Questions,StockDetail,BusinessAsset} = require('../models') const { logMsg } = require('../services/logger.js'); +const request = require('request'); exports.CreditPd = async ( credit_key , credit_value ,credit_temp_array ,credit_obj) => { @@ -12,7 +13,29 @@ exports.CreditPd = async ( credit_key , credit_value ,credit_temp_array ,credit await Object.assign( credit_obj, { [credit_key] : credit_value[credit_temp_array[i]] }); } } - } +} +exports.MainApplicantDetails = async(losid) => { + + try { + const url = "https://demo.devopsmcfinance.com/cet_mainapp/api/MainApplicantDetailsList?losid="+losid; + + return new Promise((resolve, reject) => { + request({ + url: url, + method: "GET" + + }, function (error, response, body) { + resolve(body); + }); + + }); +} +catch (error) { + console.log(error); +} +} + + diff --git a/package-lock.json b/package-lock.json index 7fd8eeb..fb2bda3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "log4js": "^6.3.0", "moment": "^2.29.3", "mssql": "^7.2.0", + "multer": "^1.4.4", "request": "^2.88.2", "sequelize": "^6.6.5", "swagger-jsdoc": "^6.1.0", @@ -857,6 +858,11 @@ "node": ">= 8" } }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" + }, "node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -1152,6 +1158,44 @@ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/busboy": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", + "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "dependencies": { + "dicer": "0.2.5", + "readable-stream": "1.1.x" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/busboy/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/busboy/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/busboy/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -1432,6 +1476,47 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/configstore": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", @@ -1631,6 +1716,39 @@ "node": ">=8" } }, + "node_modules/dicer": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", + "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", + "dependencies": { + "readable-stream": "1.1.x", + "streamsearch": "0.1.2" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/dicer/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/dicer/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/dicer/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -2696,8 +2814,7 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "optional": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "node_modules/isstream": { "version": "0.1.2", @@ -3109,8 +3226,18 @@ "node_modules/minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "devOptional": true + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } }, "node_modules/mkdirp-classic": { "version": "0.5.3", @@ -3197,6 +3324,24 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/multer": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4.tgz", + "integrity": "sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^0.2.11", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "on-finished": "^2.3.0", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", @@ -3574,8 +3719,7 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "optional": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/proxy-addr": { "version": "2.0.7", @@ -4215,6 +4359,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -4550,6 +4702,11 @@ "node": ">= 0.6" } }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -4969,6 +5126,14 @@ "node": ">=0.4.0" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -5689,6 +5854,11 @@ "picomatch": "^2.0.4" } }, + "append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" + }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -5926,6 +6096,43 @@ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "busboy": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", + "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "requires": { + "dicer": "0.2.5", + "readable-stream": "1.1.x" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -6146,6 +6353,46 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "configstore": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", @@ -6293,6 +6540,38 @@ "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", "optional": true }, + "dicer": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", + "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", + "requires": { + "readable-stream": "1.1.x", + "streamsearch": "0.1.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -7097,8 +7376,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "optional": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isstream": { "version": "0.1.2", @@ -7449,8 +7727,15 @@ "minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "devOptional": true + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } }, "mkdirp-classic": { "version": "0.5.3", @@ -7518,6 +7803,21 @@ } } }, + "multer": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4.tgz", + "integrity": "sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw==", + "requires": { + "append-field": "^1.0.0", + "busboy": "^0.2.11", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "on-finished": "^2.3.0", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + } + }, "napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", @@ -7798,8 +8098,7 @@ "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "optional": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "proxy-addr": { "version": "2.0.7", @@ -8250,6 +8549,11 @@ } } }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -8506,6 +8810,11 @@ "mime-types": "~2.1.24" } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -8836,6 +9145,11 @@ "resolved": "https://registry.npmjs.org/xpath.js/-/xpath.js-1.1.0.tgz", "integrity": "sha512-jg+qkfS4K8E7965sqaUl8mRngXiKb3WZGfONgE18pr03FUQiuSV6G+Ej4tS55B+rIQSFEIw3phdVAQ4pPqNWfQ==" }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", diff --git a/package.json b/package.json index 5a88b04..ed6c453 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "log4js": "^6.3.0", "moment": "^2.29.3", "mssql": "^7.2.0", + "multer": "^1.4.4", "request": "^2.88.2", "sequelize": "^6.6.5", "swagger-jsdoc": "^6.1.0", From 42a6921aa86c1c6e0393467126fc789e61163d41 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Mon, 16 May 2022 16:59:39 +0530 Subject: [PATCH 07/42] susee --- app/controllers/creditpd.controller.js | 51 ++++++- app/models/CreditGeneralInformation.js | 4 - app/routes/routes.js | 12 +- package-lock.json | 196 +++++++++++++++++++++++++ package.json | 2 + 5 files changed, 255 insertions(+), 10 deletions(-) diff --git a/app/controllers/creditpd.controller.js b/app/controllers/creditpd.controller.js index 7404907..3e9ff87 100644 --- a/app/controllers/creditpd.controller.js +++ b/app/controllers/creditpd.controller.js @@ -31,12 +31,22 @@ exports.Welcome = (req, res) => }; + + + + + + + + + + exports.PullCreditPdData = async (req, res) => { try { - const tempData = parse(JSON.stringify(req.body.data)); + const tempData = JSON.parse(JSON.stringify(req.body.data)); var obj = { }; let temp_obj = [ ]; var arr_ObjKey = [ ] @@ -141,7 +151,7 @@ exports.PullCreditPdData = async (req, res) => } } // if end } // end of outer forLoop - + res.send({'status':200,'message':"success"}); } catch(err) { res.send({'status':404,message: err.message || "Some error occurred while retrieving data." ,'data': "No data" }); } //end of try catch @@ -151,6 +161,15 @@ exports.PullCreditPdData = async (req, res) => + + + + + + + + + exports.PullCreditPdPhotographsData = async (req, res) => { try @@ -180,6 +199,16 @@ exports.PullCreditPdPhotographsData = async (req, res) => }; + + + + + + + + + + exports.imageView = async (req, res) => { try @@ -196,6 +225,15 @@ exports.imageView = async (req, res) => + + + + + + + + + exports.DownloadPdReport = async (req, res) => { try @@ -230,6 +268,15 @@ exports.DownloadPdReport = async (req, res) => }; + + + + + + + + + exports.GetCreditPdData = async (req, res) => { try diff --git a/app/models/CreditGeneralInformation.js b/app/models/CreditGeneralInformation.js index 1306d1a..440bb45 100644 --- a/app/models/CreditGeneralInformation.js +++ b/app/models/CreditGeneralInformation.js @@ -1,9 +1,5 @@ 'use strict' const { Model } = require('sequelize') -const { sequelize,Test,CreditGeneralInformation,SizeAndGeographicalResearch,CreditProfile,ProductAndProcess,PortFolioHealth,TotalOverallDebit,OverallPlanOfAction,ValidationPoint, - CreditLoanDetail,CreditFinalRemarks,CreditGeneralBusinessInformation,CreditKeyProductBusinessContribution,EmployeeStrength,CreditBusinessAndPersonalBankingDetails,CreditFinancialInformation, - SupplierDetail ,ClientDetail,CreditFuturePlans,CreditExistingLoanObligation,FamilyMemberInvolvedInBusiness,CreditManager,CreditBorrowerAndGuarantorDetails,CreditFinancialAnalysis,CreditAddressDetail, - CreditKeyShareholder,Covid19Questions,StockDetail,BusinessAsset,CreditFilterTable} = require('../models') module.exports = (sequelize, DataTypes) => { class CreditGeneralInformation extends Model { diff --git a/app/routes/routes.js b/app/routes/routes.js index 55b647f..a87fbc4 100644 --- a/app/routes/routes.js +++ b/app/routes/routes.js @@ -43,6 +43,10 @@ module.exports = app => { * type: string * description: product * example: LFMP +* caseno: +* type: string +* description: case no +* example: MW30 * data: * type: string * description: json string @@ -65,7 +69,7 @@ module.exports = app => { * 500: * description: failed */ -router.get("/PullCreditPdData", CreditPdController.PullCreditPdData); +router.post("/PullCreditPdData", CreditPdController.PullCreditPdData); @@ -131,7 +135,7 @@ const upload = multer({ storage }); * 500: * description: failed */ -// router.post('/PullCreditPdPhotographsData', upload.single('img'),function(req,res){ CreditPdController.PullCreditPdPhotographsData(req,res,img_name); } ); +router.post('/PullCreditPdPhotographsData', upload.single('img'),function(req,res){ CreditPdController.PullCreditPdPhotographsData(req,res,img_name); } ); @@ -156,7 +160,7 @@ const upload = multer({ storage }); * 200: * description: success */ -// router.get('/imageView',CreditPdController.imageView); +router.get('/imageView',CreditPdController.imageView); @@ -209,7 +213,7 @@ router.get('/GetCreditPdData',CreditPdController.GetCreditPdData) * 200: * description: success */ -// router.get("/DownloadPdReport", SalesPdController.DownloadPdReport); +router.get("/DownloadPdReport", CreditPdController.DownloadPdReport); diff --git a/package-lock.json b/package-lock.json index fb2bda3..5785508 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "body-parser": "^1.19.0", "cors": "^2.8.5", + "csv-parse": "^5.0.4", "date-and-time": "^2.3.1", "dateformat": "^5.0.3", "dotenv": "^10.0.0", @@ -21,6 +22,7 @@ "moment": "^2.29.3", "mssql": "^7.2.0", "multer": "^1.4.4", + "parse": "^3.4.2", "request": "^2.88.2", "sequelize": "^6.6.5", "swagger-jsdoc": "^6.1.0", @@ -511,6 +513,29 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/@babel/runtime": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", + "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.8.tgz", + "integrity": "sha512-ZbYSUvoSF6dXZmMl/CYTMOvzIFnbGfv4W3SEHYgMvNsFTeLaF2gkGAF4K2ddmtSK4Emej+0aYcnSC6N5dPCXUQ==", + "dependencies": { + "core-js-pure": "^3.20.2", + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -1572,6 +1597,16 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "node_modules/core-js-pure": { + "version": "3.22.5", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.5.tgz", + "integrity": "sha512-8xo9R00iYD7TcV7OrC98GwxiUEAabVWO3dix+uyWjnYrx9fyASLlIX+f/3p5dW5qByaP2bcZ8X/T47s55et/tA==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -1589,6 +1624,12 @@ "node": ">= 0.10" } }, + "node_modules/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==", + "optional": true + }, "node_modules/crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -1598,6 +1639,11 @@ "node": ">=8" } }, + "node_modules/csv-parse": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.0.4.tgz", + "integrity": "sha512-5AIdl8l6n3iYQYxan5djB5eKDa+vBnhfWZtRpJTcrETWfVLYN0WSj3L9RwvgYt+psoO77juUr8TG8qpfGZifVQ==" + }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -2560,6 +2606,14 @@ "node": ">=0.10.0" } }, + "node_modules/idb-keyval": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.0.3.tgz", + "integrity": "sha512-yh8V7CnE6EQMu9YDwQXhRxwZh4nv+8xm/HV4ZqK4IiYFJBWYGjJuykADJbSP+F/GDXUBwCSSNn/14IpGL81TuA==", + "dependencies": { + "safari-14-idb-fix": "^3.0.0" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -3629,6 +3683,23 @@ "semver": "bin/semver.js" } }, + "node_modules/parse": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/parse/-/parse-3.4.2.tgz", + "integrity": "sha512-Ruehcp/S7eB3A0lDG5eAPvZHa5pABCbUR+lMJL2gUNKJLZNcD9/s3RL255PwI5jTqa+TCJ7MdPqobUplouN1pQ==", + "dependencies": { + "@babel/runtime": "7.17.9", + "@babel/runtime-corejs3": "7.17.8", + "idb-keyval": "6.0.3", + "react-native-crypto-js": "1.0.0", + "uuid": "3.4.0", + "ws": "7.5.1", + "xmlhttprequest": "1.8.0" + }, + "optionalDependencies": { + "crypto-js": "4.1.1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -3825,6 +3896,11 @@ "rc": "cli.js" } }, + "node_modules/react-native-crypto-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/react-native-crypto-js/-/react-native-crypto-js-1.0.0.tgz", + "integrity": "sha512-FNbLuG/HAdapQoybeZSoes1PWdOj0w242gb+e1R0hicf3Gyj/Mf8M9NaED2AnXVOX01b2FXomwUiw1xP1K+8sA==" + }, "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -3850,6 +3926,11 @@ "node": ">=8.10.0" } }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, "node_modules/registry-auth-token": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", @@ -3932,6 +4013,11 @@ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" }, + "node_modules/safari-14-idb-fix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/safari-14-idb-fix/-/safari-14-idb-fix-3.0.0.tgz", + "integrity": "sha512-eBNFLob4PMq8JA1dGyFn6G97q3/WzNtFK4RnzT1fnLq+9RyrGknzYiM/9B12MnKAxuj1IXr7UKYtTNtjyKMBog==" + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -5089,6 +5175,26 @@ "typedarray-to-buffer": "^3.1.5" } }, + "node_modules/ws": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.1.tgz", + "integrity": "sha512-2c6faOUH/nhoQN6abwMloF7Iyl0ZS2E9HGtsiLrWn0zOOMWlhtDmdf/uihDt6jnuCxgtwGBNy6Onsoy2s2O2Ow==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/xdg-basedir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", @@ -5118,6 +5224,14 @@ "node": ">=4.0" } }, + "node_modules/xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/xpath.js": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/xpath.js/-/xpath.js-1.1.0.tgz", @@ -5568,6 +5682,23 @@ } } }, + "@babel/runtime": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", + "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/runtime-corejs3": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.8.tgz", + "integrity": "sha512-ZbYSUvoSF6dXZmMl/CYTMOvzIFnbGfv4W3SEHYgMvNsFTeLaF2gkGAF4K2ddmtSK4Emej+0aYcnSC6N5dPCXUQ==", + "requires": { + "core-js-pure": "^3.20.2", + "regenerator-runtime": "^0.13.4" + } + }, "@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -6436,6 +6567,11 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "core-js-pure": { + "version": "3.22.5", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.5.tgz", + "integrity": "sha512-8xo9R00iYD7TcV7OrC98GwxiUEAabVWO3dix+uyWjnYrx9fyASLlIX+f/3p5dW5qByaP2bcZ8X/T47s55et/tA==" + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -6450,12 +6586,23 @@ "vary": "^1" } }, + "crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==", + "optional": true + }, "crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true }, + "csv-parse": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.0.4.tgz", + "integrity": "sha512-5AIdl8l6n3iYQYxan5djB5eKDa+vBnhfWZtRpJTcrETWfVLYN0WSj3L9RwvgYt+psoO77juUr8TG8qpfGZifVQ==" + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -7205,6 +7352,14 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "idb-keyval": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.0.3.tgz", + "integrity": "sha512-yh8V7CnE6EQMu9YDwQXhRxwZh4nv+8xm/HV4ZqK4IiYFJBWYGjJuykADJbSP+F/GDXUBwCSSNn/14IpGL81TuA==", + "requires": { + "safari-14-idb-fix": "^3.0.0" + } + }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -8032,6 +8187,21 @@ } } }, + "parse": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/parse/-/parse-3.4.2.tgz", + "integrity": "sha512-Ruehcp/S7eB3A0lDG5eAPvZHa5pABCbUR+lMJL2gUNKJLZNcD9/s3RL255PwI5jTqa+TCJ7MdPqobUplouN1pQ==", + "requires": { + "@babel/runtime": "7.17.9", + "@babel/runtime-corejs3": "7.17.8", + "crypto-js": "4.1.1", + "idb-keyval": "6.0.3", + "react-native-crypto-js": "1.0.0", + "uuid": "3.4.0", + "ws": "7.5.1", + "xmlhttprequest": "1.8.0" + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -8180,6 +8350,11 @@ "strip-json-comments": "~2.0.1" } }, + "react-native-crypto-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/react-native-crypto-js/-/react-native-crypto-js-1.0.0.tgz", + "integrity": "sha512-FNbLuG/HAdapQoybeZSoes1PWdOj0w242gb+e1R0hicf3Gyj/Mf8M9NaED2AnXVOX01b2FXomwUiw1xP1K+8sA==" + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -8199,6 +8374,11 @@ "picomatch": "^2.2.1" } }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, "registry-auth-token": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", @@ -8270,6 +8450,11 @@ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" }, + "safari-14-idb-fix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/safari-14-idb-fix/-/safari-14-idb-fix-3.0.0.tgz", + "integrity": "sha512-eBNFLob4PMq8JA1dGyFn6G97q3/WzNtFK4RnzT1fnLq+9RyrGknzYiM/9B12MnKAxuj1IXr7UKYtTNtjyKMBog==" + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -9120,6 +9305,12 @@ "typedarray-to-buffer": "^3.1.5" } }, + "ws": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.1.tgz", + "integrity": "sha512-2c6faOUH/nhoQN6abwMloF7Iyl0ZS2E9HGtsiLrWn0zOOMWlhtDmdf/uihDt6jnuCxgtwGBNy6Onsoy2s2O2Ow==", + "requires": {} + }, "xdg-basedir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", @@ -9140,6 +9331,11 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + }, "xpath.js": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/xpath.js/-/xpath.js-1.1.0.tgz", diff --git a/package.json b/package.json index ed6c453..140d8b9 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "dependencies": { "body-parser": "^1.19.0", "cors": "^2.8.5", + "csv-parse": "^5.0.4", "date-and-time": "^2.3.1", "dateformat": "^5.0.3", "dotenv": "^10.0.0", @@ -21,6 +22,7 @@ "moment": "^2.29.3", "mssql": "^7.2.0", "multer": "^1.4.4", + "parse": "^3.4.2", "request": "^2.88.2", "sequelize": "^6.6.5", "swagger-jsdoc": "^6.1.0", From f44969a8c58a9e082dcca1d48f333bce2cb3cf99 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Mon, 16 May 2022 17:29:29 +0530 Subject: [PATCH 08/42] susee --- app/controllers/creditpd.controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/creditpd.controller.js b/app/controllers/creditpd.controller.js index 3e9ff87..08361ab 100644 --- a/app/controllers/creditpd.controller.js +++ b/app/controllers/creditpd.controller.js @@ -188,7 +188,7 @@ exports.PullCreditPdPhotographsData = async (req, res) => .catch((err)=>{ logMsg.info("Photograph insert failed ,PdId= "+PdId+" ERROR : "+err);}); // responce to FE setTimeout(() => { - res.send({'status':200,'message':"success",'data':"INSERT INTO sales_photograph (pd_id,ref_no,img_name,img) VALUES ("+PdId+","+req.body.pdid+","+req.body.img_name+","+base64_data+")"}); + res.send({'status':200,'message':"success",'data':"INSERT INTO sales_photograph (pd_id,ref_no,img_name,img) VALUES ("+PdId+","+req.body.pdid+","+req.body.img_name+")"}); //,"+base64_data+" }, 300); From 4d2adf5968fe76cdcdcd531e51a1cb33873eda9a Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Tue, 17 May 2022 12:50:05 +0530 Subject: [PATCH 09/42] susee --- .gitignore | 8 ++++++-- app/controllers/creditpd.controller.js | 4 ++-- app/models/CreditGeneralInformation.js | 4 ++++ app/routes/routes.js | 4 ++-- .../uploads/1652702282873-tree-736885__480.jpg | Bin 0 -> 44304 bytes .../uploads/1652702321006-tree-736885__480.jpg | Bin 0 -> 44304 bytes storage/uploads/1652765011227-download.jpg | Bin 0 -> 7978 bytes storage/uploads/1652771595904-download.jpg | Bin 0 -> 7978 bytes storage/uploads/1652771661979-download.jpg | Bin 0 -> 7978 bytes storage/uploads/1652771695177-download.jpg | Bin 0 -> 7978 bytes 10 files changed, 14 insertions(+), 6 deletions(-) create mode 100644 storage/uploads/1652702282873-tree-736885__480.jpg create mode 100644 storage/uploads/1652702321006-tree-736885__480.jpg create mode 100644 storage/uploads/1652765011227-download.jpg create mode 100644 storage/uploads/1652771595904-download.jpg create mode 100644 storage/uploads/1652771661979-download.jpg create mode 100644 storage/uploads/1652771695177-download.jpg diff --git a/.gitignore b/.gitignore index 310c475..60fca29 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ +.env /node_modules -/storage -.env \ No newline at end of file +/storage/log/ +/storage/uploads/ +!storage +storage/* +!storage/uploads/ \ No newline at end of file diff --git a/app/controllers/creditpd.controller.js b/app/controllers/creditpd.controller.js index 08361ab..957e2a8 100644 --- a/app/controllers/creditpd.controller.js +++ b/app/controllers/creditpd.controller.js @@ -198,7 +198,7 @@ exports.PullCreditPdPhotographsData = async (req, res) => }; - +// MWISE00840 @@ -295,7 +295,7 @@ exports.GetCreditPdData = async (req, res) => {model: CreditKeyProductBusinessContribution }, {model: EmployeeStrength }, {model: ClientDetail }, {model: StockDetail }, {model: CreditExistingLoanObligation }, {model: FamilyMemberInvolvedInBusiness }, - {model : CreditManager }, // {model: Photograph }, + {model : CreditManager }, {model: Photograph }, {model: CreditFinalRemarks }, {model: CreditLoanDetail }, {model: CreditGeneralBusinessInformation }, {model: SupplierDetail } ] diff --git a/app/models/CreditGeneralInformation.js b/app/models/CreditGeneralInformation.js index 440bb45..99cf4f8 100644 --- a/app/models/CreditGeneralInformation.js +++ b/app/models/CreditGeneralInformation.js @@ -99,6 +99,10 @@ module.exports = (sequelize, DataTypes) => { foreignKey: 'pd_id', sourceKey : 'pd_id' }); + CreditGeneralInformation.hasMany(models.Photograph, { + foreignKey: 'pd_id', + sourceKey : 'pd_id' + }); } return CreditGeneralInformation diff --git a/app/routes/routes.js b/app/routes/routes.js index a87fbc4..22b9bc3 100644 --- a/app/routes/routes.js +++ b/app/routes/routes.js @@ -153,9 +153,9 @@ router.post('/PullCreditPdPhotographsData', upload.single('img'),function(req,re * - in: query * name: img_name * schema: -* type: integer +* type: string * required: true -* example: +* example: 1652702282873-tree-736885__480 * responses: * 200: * description: success diff --git a/storage/uploads/1652702282873-tree-736885__480.jpg b/storage/uploads/1652702282873-tree-736885__480.jpg new file mode 100644 index 0000000000000000000000000000000000000000..abce7a7732c41aa2fc5db2b492149dd5062ee35e GIT binary patch literal 44304 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 qsGeP`Q#Te~zhpDat{Kph2cHF~Yid4)|Fs literal 0 HcmV?d00001 diff --git a/storage/uploads/1652771595904-download.jpg b/storage/uploads/1652771595904-download.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c47192c982806a253a5b1a567712cd50e2725c9a GIT binary patch literal 7978 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 qsGeP`Q#Te~zhpDat{Kph2cHF~Yid4)|Fs literal 0 HcmV?d00001 diff --git a/storage/uploads/1652771661979-download.jpg b/storage/uploads/1652771661979-download.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c47192c982806a253a5b1a567712cd50e2725c9a GIT binary patch literal 7978 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 qsGeP`Q#Te~zhpDat{Kph2cHF~Yid4)|Fs literal 0 HcmV?d00001 diff --git a/storage/uploads/1652771695177-download.jpg b/storage/uploads/1652771695177-download.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c47192c982806a253a5b1a567712cd50e2725c9a GIT binary patch literal 7978 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 qsGeP`Q#Te~zhpDat{Kph2cHF~Yid4)|Fs literal 0 HcmV?d00001 From 8279b33c4a997694266d73915241caf0080e44f9 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Tue, 17 May 2022 16:55:42 +0530 Subject: [PATCH 10/42] susee --- app/controllers/creditpd.controller.js | 1 - package.json | 1 - storage/uploads/.gitignore | 3 +++ 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 storage/uploads/.gitignore diff --git a/app/controllers/creditpd.controller.js b/app/controllers/creditpd.controller.js index 957e2a8..f47e14a 100644 --- a/app/controllers/creditpd.controller.js +++ b/app/controllers/creditpd.controller.js @@ -283,7 +283,6 @@ exports.GetCreditPdData = async (req, res) => { applicantDetails = await Credit_PdHelper.MainApplicantDetails(req.query.losid); MainApplicantDetails = JSON.parse(applicantDetails); - if(MainApplicantDetails.status == 200) { var resData = await CreditGeneralInformation.findAll({ where : { name : MainApplicantDetails.data.name,is_active : 1}, diff --git a/package.json b/package.json index 140d8b9..ffa0827 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,6 @@ "dependencies": { "body-parser": "^1.19.0", "cors": "^2.8.5", - "csv-parse": "^5.0.4", "date-and-time": "^2.3.1", "dateformat": "^5.0.3", "dotenv": "^10.0.0", diff --git a/storage/uploads/.gitignore b/storage/uploads/.gitignore new file mode 100644 index 0000000..e7a210e --- /dev/null +++ b/storage/uploads/.gitignore @@ -0,0 +1,3 @@ +* +*/ +!.gitignore \ No newline at end of file From 137d432569b4fc00a67003476a7249ea0edb3769 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Tue, 17 May 2022 17:16:02 +0530 Subject: [PATCH 11/42] susee --- storage/uploads/.gitignore | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 storage/uploads/.gitignore diff --git a/storage/uploads/.gitignore b/storage/uploads/.gitignore deleted file mode 100644 index e7a210e..0000000 --- a/storage/uploads/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -* -*/ -!.gitignore \ No newline at end of file From b82d3b1b0d731371fd683b1edac620e26d27b6a7 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Tue, 17 May 2022 17:17:40 +0530 Subject: [PATCH 12/42] susee --- storage/uploads/.gitignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 storage/uploads/.gitignore diff --git a/storage/uploads/.gitignore b/storage/uploads/.gitignore new file mode 100644 index 0000000..e7a210e --- /dev/null +++ b/storage/uploads/.gitignore @@ -0,0 +1,3 @@ +* +*/ +!.gitignore \ No newline at end of file From 64173dd0d7f228b65c7a8d4607cb9a9883f23549 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Tue, 17 May 2022 17:19:07 +0530 Subject: [PATCH 13/42] susee --- storage/uploads/.gitignore | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 storage/uploads/.gitignore diff --git a/storage/uploads/.gitignore b/storage/uploads/.gitignore deleted file mode 100644 index e7a210e..0000000 --- a/storage/uploads/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -* -*/ -!.gitignore \ No newline at end of file From 2d194050c8cc206f0266d5d554d3dcafc2f664d7 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Wed, 18 May 2022 11:42:11 +0530 Subject: [PATCH 14/42] susee --- app/controllers/creditpd.controller.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/creditpd.controller.js b/app/controllers/creditpd.controller.js index f47e14a..a1b150a 100644 --- a/app/controllers/creditpd.controller.js +++ b/app/controllers/creditpd.controller.js @@ -5,6 +5,7 @@ const { sequelize,Test,CreditGeneralInformation,SizeAndGeographicalResearch,Cred CreditKeyShareholder,Covid19Questions,StockDetail,BusinessAsset,CreditFilterTable,Photograph} = require('../models') const { logMsg } = require('../services/logger.js'); const Credit_PdHelper = require('../services/CreditPdHelper.js'); +const request = require('request'); const moment = require('moment'); var global = require('global'); global.arr = [ CreditAddressDetail , CreditBorrowerAndGuarantorDetails , CreditBusinessAndPersonalBankingDetails, @@ -240,8 +241,7 @@ exports.DownloadPdReport = async (req, res) => { pd_id = req.query.ref_no; DownloadPdReportUrl = process.env.PD_REPORT_URL; - url = DownloadPdReportUrl+""+pd_id; - + url = DownloadPdReportUrl+"getCreditPDReportforCETApp?credit_pd_id="+pd_id; request({ url: url, From ee8c405d74979d7b863991b55670e4cd7b42c498 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Thu, 19 May 2022 09:34:21 +0530 Subject: [PATCH 15/42] susee --- .gitignore | 3 ++- server.js | 2 +- storage/uploads/.gitkeep | 0 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 storage/uploads/.gitkeep diff --git a/.gitignore b/.gitignore index 60fca29..142aff7 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ /storage/uploads/ !storage storage/* -!storage/uploads/ \ No newline at end of file +!storage/uploads/ +!uploads/* \ No newline at end of file diff --git a/server.js b/server.js index 175d664..192eec9 100644 --- a/server.js +++ b/server.js @@ -56,7 +56,7 @@ require("./app/routes/routes.js")(app); const PORT_NUMBER = process.env.SERVER_PORT app.listen({ port: PORT_NUMBER }, async () => { - console.log('Server up on http://localhost:8080') + console.log('Server up on http://localhost:'+PORT_NUMBER) //await sequelize.authenticate() }) diff --git a/storage/uploads/.gitkeep b/storage/uploads/.gitkeep new file mode 100644 index 0000000..e69de29 From 0b39e48372e7ca8c737170c30b361b4463a09f46 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Thu, 19 May 2022 09:38:29 +0530 Subject: [PATCH 16/42] susee --- .gitignore | 3 ++- storage/uploads/.gitkeep | 0 2 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 storage/uploads/.gitkeep diff --git a/.gitignore b/.gitignore index 142aff7..77ba692 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ !storage storage/* !storage/uploads/ -!uploads/* \ No newline at end of file +!uploads +uploads/* \ No newline at end of file diff --git a/storage/uploads/.gitkeep b/storage/uploads/.gitkeep deleted file mode 100644 index e69de29..0000000 From 268017b2f6d0a427e5d3c3b699f0d93d4df325c2 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Thu, 19 May 2022 09:39:10 +0530 Subject: [PATCH 17/42] susee --- storage/uploads/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 storage/uploads/.gitkeep diff --git a/storage/uploads/.gitkeep b/storage/uploads/.gitkeep new file mode 100644 index 0000000..e69de29 From 0def5e8e4f8acc933266f39ed33eda730f9210dc Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Thu, 19 May 2022 09:42:32 +0530 Subject: [PATCH 18/42] susee --- storage/uploads/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 storage/uploads/.gitkeep diff --git a/storage/uploads/.gitkeep b/storage/uploads/.gitkeep deleted file mode 100644 index e69de29..0000000 From d8f4d33b98839902642edad5eb324d4948dd3c5b Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Thu, 19 May 2022 12:41:41 +0530 Subject: [PATCH 19/42] susee --- .gitignore | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 77ba692..0d00a8f 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,4 @@ /storage/uploads/ !storage storage/* -!storage/uploads/ -!uploads -uploads/* \ No newline at end of file +!storage/uploads*/ \ No newline at end of file From e2143011260ba7afe77d4698a93a4fdfe0a94136 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Thu, 19 May 2022 12:48:22 +0530 Subject: [PATCH 20/42] susee --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 0d00a8f..6729fea 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,4 @@ /storage/uploads/ !storage storage/* -!storage/uploads*/ \ No newline at end of file +!storage/uploads/* \ No newline at end of file From 2034f734a0756af6427e67078a4068f3d5cb3984 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Thu, 19 May 2022 12:56:22 +0530 Subject: [PATCH 21/42] susee --- .gitignore | 2 +- storage/uploads/.gitignore | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 storage/uploads/.gitignore diff --git a/.gitignore b/.gitignore index 6729fea..60fca29 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,4 @@ /storage/uploads/ !storage storage/* -!storage/uploads/* \ No newline at end of file +!storage/uploads/ \ No newline at end of file diff --git a/storage/uploads/.gitignore b/storage/uploads/.gitignore new file mode 100644 index 0000000..e7a210e --- /dev/null +++ b/storage/uploads/.gitignore @@ -0,0 +1,3 @@ +* +*/ +!.gitignore \ No newline at end of file From bf17e592f49e987a76c6a7fedf83b4e05ad77cb4 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Thu, 19 May 2022 13:08:21 +0530 Subject: [PATCH 22/42] susee --- .gitignore | 4 +++- storage/uploads/.gitignore | 3 --- 2 files changed, 3 insertions(+), 4 deletions(-) delete mode 100644 storage/uploads/.gitignore diff --git a/.gitignore b/.gitignore index 60fca29..52affec 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ /storage/uploads/ !storage storage/* -!storage/uploads/ \ No newline at end of file +!storage/uploads/ +**/*.jpg +!/storage/uploads/*.jpg \ No newline at end of file diff --git a/storage/uploads/.gitignore b/storage/uploads/.gitignore deleted file mode 100644 index e7a210e..0000000 --- a/storage/uploads/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -* -*/ -!.gitignore \ No newline at end of file From 7a039966b6bd935be91683ed28385ea93206eb71 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Thu, 19 May 2022 15:40:22 +0530 Subject: [PATCH 23/42] susee --- .gitignore | 3 +-- storage/uploads/.gitkeep | 0 2 files changed, 1 insertion(+), 2 deletions(-) create mode 100644 storage/uploads/.gitkeep diff --git a/.gitignore b/.gitignore index 52affec..f1d98cb 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,4 @@ !storage storage/* !storage/uploads/ -**/*.jpg -!/storage/uploads/*.jpg \ No newline at end of file +uploads/* \ No newline at end of file diff --git a/storage/uploads/.gitkeep b/storage/uploads/.gitkeep new file mode 100644 index 0000000..e69de29 From 74b88517565dee29d7aef7371c90bed0e6ef17f4 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Thu, 19 May 2022 15:48:02 +0530 Subject: [PATCH 24/42] susee --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index f1d98cb..7040395 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,4 @@ !storage storage/* !storage/uploads/ -uploads/* \ No newline at end of file +uploads* \ No newline at end of file From cb94c07777b06b85bf47c492c2c4a375b37b52f6 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Thu, 19 May 2022 15:53:17 +0530 Subject: [PATCH 25/42] susee --- .gitignore | 3 +-- storage/uploads/.gitignore | 2 ++ storage/uploads/.gitkeep | 0 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 storage/uploads/.gitignore delete mode 100644 storage/uploads/.gitkeep diff --git a/.gitignore b/.gitignore index 7040395..60fca29 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,4 @@ /storage/uploads/ !storage storage/* -!storage/uploads/ -uploads* \ No newline at end of file +!storage/uploads/ \ No newline at end of file diff --git a/storage/uploads/.gitignore b/storage/uploads/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/storage/uploads/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/storage/uploads/.gitkeep b/storage/uploads/.gitkeep deleted file mode 100644 index e69de29..0000000 From a4a646986759bc5a9c413bac1285f3809d6c003c Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Thu, 19 May 2022 16:05:23 +0530 Subject: [PATCH 26/42] susee --- .gitignore | 3 ++- storage/uploads/.gitignore | 2 -- 2 files changed, 2 insertions(+), 3 deletions(-) delete mode 100644 storage/uploads/.gitignore diff --git a/.gitignore b/.gitignore index 60fca29..461d4d0 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ /storage/uploads/ !storage storage/* -!storage/uploads/ \ No newline at end of file +*.jpg +!storage/uploads/*.jpg diff --git a/storage/uploads/.gitignore b/storage/uploads/.gitignore deleted file mode 100644 index c96a04f..0000000 --- a/storage/uploads/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore \ No newline at end of file From 91649e963b8e54f3927be735ada881c2352e2671 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Thu, 19 May 2022 16:15:16 +0530 Subject: [PATCH 27/42] susee --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 461d4d0..c10daa6 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,5 @@ /storage/uploads/ !storage storage/* -*.jpg -!storage/uploads/*.jpg +!storage/uploads/ +*.jpg \ No newline at end of file From ee174bb7d6fa922dbdc7a92f827ab9e9e6b2ef71 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Thu, 19 May 2022 16:27:21 +0530 Subject: [PATCH 28/42] susee --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index c10daa6..94ba41d 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,4 @@ !storage storage/* !storage/uploads/ -*.jpg \ No newline at end of file +!uploads/*.jpg \ No newline at end of file From 2653f32c35c7e3a532be0aa9464c9e3bed089046 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Thu, 19 May 2022 16:36:04 +0530 Subject: [PATCH 29/42] susee --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 94ba41d..8d9a3c6 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,5 @@ /storage/uploads/ !storage storage/* -!storage/uploads/ -!uploads/*.jpg \ No newline at end of file +!storage/uploads/*.jpg +!!storage/uploads/.gitkeep \ No newline at end of file From cb3c95bb494385e5f57550286e38f619998d4d1a Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Thu, 19 May 2022 16:38:49 +0530 Subject: [PATCH 30/42] susee --- .gitignore | 3 ++- storage/uploads/.gitkeep | 0 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 storage/uploads/.gitkeep diff --git a/.gitignore b/.gitignore index 8d9a3c6..adfcb9c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,6 @@ /storage/uploads/ !storage storage/* -!storage/uploads/*.jpg +!storage/uploads/ +storage/uploads/*.jpg !!storage/uploads/.gitkeep \ No newline at end of file diff --git a/storage/uploads/.gitkeep b/storage/uploads/.gitkeep new file mode 100644 index 0000000..e69de29 From 7e9d14e55aacdc03244b0c6c4fdf506307ef00fd Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Thu, 19 May 2022 16:41:53 +0530 Subject: [PATCH 31/42] susee --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index adfcb9c..80ce9cf 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,4 @@ storage/* !storage/uploads/ storage/uploads/*.jpg -!!storage/uploads/.gitkeep \ No newline at end of file +!storage/uploads/.gitkeep \ No newline at end of file From 0d2af01eef228f9d5048ff5d1e6303cfac61fc6a Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Thu, 19 May 2022 16:48:38 +0530 Subject: [PATCH 32/42] susee --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 80ce9cf..55b7f76 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,5 @@ !storage storage/* !storage/uploads/ -storage/uploads/*.jpg +storage/uploads/* !storage/uploads/.gitkeep \ No newline at end of file From b43229e6cdf0e292698809f80a64d7effbb3e5a0 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Fri, 20 May 2022 09:49:09 +0530 Subject: [PATCH 33/42] susee --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 55b7f76..b59dab5 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ storage/* !storage/uploads/ storage/uploads/* -!storage/uploads/.gitkeep \ No newline at end of file +!storage/uploads/.gitkeep + From e29282af58d3883f361b4012f615e2e92de07d6c Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Fri, 20 May 2022 09:54:49 +0530 Subject: [PATCH 34/42] susee --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index b59dab5..1333785 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,6 @@ !storage storage/* !storage/uploads/ -storage/uploads/* +storage/uploads/*.jpg !storage/uploads/.gitkeep From 59648923581fa65df181d8e126e6bb738520f5c2 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Fri, 20 May 2022 10:01:40 +0530 Subject: [PATCH 35/42] susee --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1333785..fccf5a7 100644 --- a/.gitignore +++ b/.gitignore @@ -6,5 +6,4 @@ storage/* !storage/uploads/ storage/uploads/*.jpg -!storage/uploads/.gitkeep From 7040607b8aa1f39a4e7856cad68f912b929696c4 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Fri, 20 May 2022 10:07:52 +0530 Subject: [PATCH 36/42] susee --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index fccf5a7..8ec8dbe 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,8 @@ /node_modules /storage/log/ /storage/uploads/ +/storage/uploads/*.jpg !storage storage/* !storage/uploads/ -storage/uploads/*.jpg From 512223887891dcc51ae6215a371ec3db11def42c Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Fri, 20 May 2022 10:16:45 +0530 Subject: [PATCH 37/42] susee --- .gitignore | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 8ec8dbe..05d1eb2 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,7 @@ /node_modules /storage/log/ /storage/uploads/ -/storage/uploads/*.jpg -!storage -storage/* -!storage/uploads/ +/storage/uploads/ +**/*.jpg +!storage/uploads/*.jpg From fcabbf4380e1cbab8553625a02b851c91686e831 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Fri, 20 May 2022 10:18:13 +0530 Subject: [PATCH 38/42] susee --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 05d1eb2..0ad50cd 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ /node_modules /storage/log/ /storage/uploads/ -/storage/uploads/ **/*.jpg !storage/uploads/*.jpg From b5bd01dc51e3162e2885e5489b55f5886edc16e2 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Mon, 23 May 2022 15:14:27 +0530 Subject: [PATCH 39/42] susee --- .gitignore | 7 ++++--- app/controllers/creditpd.controller.js | 9 ++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 0ad50cd..4af7866 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ /node_modules /storage/log/ /storage/uploads/ -**/*.jpg -!storage/uploads/*.jpg - +!storage +storage/* +storage/uploads/* +!storage/uploads/ diff --git a/app/controllers/creditpd.controller.js b/app/controllers/creditpd.controller.js index a1b150a..8e6d625 100644 --- a/app/controllers/creditpd.controller.js +++ b/app/controllers/creditpd.controller.js @@ -73,11 +73,10 @@ exports.PullCreditPdData = async (req, res) => } } // Object.assign( obj , { ref_no : req.body.pdid }); - await CreditGeneralInformation.create(obj) - .then((successData)=>{logMsg.info("GeneralInformation insert success ,PdId= "+successData.dataValues.pd_id);}) - .catch((err)=>{ logMsg.info("GeneralInformation insert failed ,PdId(ref_no)= "+req.body.pdid); }); - pd_id = await CreditGeneralInformation.findOne({ where : { ref_no : req.body.pdid , is_active : 1 }}); - // pd_id = await CreditGeneralInformation.create(obj) + pd_id = await CreditGeneralInformation.create(obj) + // .then((successData)=>{logMsg.info("GeneralInformation insert success ,PdId= "+successData.dataValues.pd_id);}) + // .catch((err)=>{ logMsg.info("GeneralInformation insert failed ,PdId(ref_no)= "+req.body.pdid); }); + // pd_id = await CreditGeneralInformation.findOne({ where : { ref_no : req.body.pdid , is_active : 1 }}); // loop to check if the data is array or nestedObject or objects From e14f0637aa9866eb20b4c33bdc558565139e6659 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Mon, 23 May 2022 15:21:17 +0530 Subject: [PATCH 40/42] susee --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 4af7866..30063b7 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,4 @@ !storage storage/* storage/uploads/* -!storage/uploads/ +!uploads/.gitkeep From e1bd17df26c65b1a35fbef670ca45b1ea05a7787 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Thu, 26 May 2022 14:23:20 +0530 Subject: [PATCH 41/42] susee --- .gitignore | 3 +- app/controllers/creditpd.controller.js | 111 +++++++++++++++--- app/models/BusinessAsset.js | 4 +- app/models/ClientDetail.js | 13 +- app/models/CreditFinalRemarks.js | 2 + .../CreditGeneralBusinessInformation.js | 4 +- app/models/CreditGeneralInformation.js | 5 + .../CreditKeyProductBusinessContribution.js | 4 +- app/models/CreditKeyShareholder.js | 4 +- app/models/StockDetail.js | 1 + app/models/SupplierDetail.js | 9 +- app/routes/routes.js | 20 ++++ 12 files changed, 150 insertions(+), 30 deletions(-) diff --git a/.gitignore b/.gitignore index 30063b7..83cb5b3 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,4 @@ /storage/uploads/ !storage storage/* -storage/uploads/* -!uploads/.gitkeep +!storage/uploads/ diff --git a/app/controllers/creditpd.controller.js b/app/controllers/creditpd.controller.js index 8e6d625..004e66c 100644 --- a/app/controllers/creditpd.controller.js +++ b/app/controllers/creditpd.controller.js @@ -1,4 +1,4 @@ -const { keys, values } = require('lodash'); +const { keys, values, forEach } = require('lodash'); const { sequelize,Test,CreditGeneralInformation,SizeAndGeographicalResearch,CreditProfile,ProductAndProcess,PortFolioHealth,TotalOverallDebit,OverallPlanOfAction,ValidationPoint, CreditLoanDetail,CreditFinalRemarks,CreditGeneralBusinessInformation,CreditKeyProductBusinessContribution,EmployeeStrength,CreditBusinessAndPersonalBankingDetails,CreditFinancialInformation, SupplierDetail ,ClientDetail,CreditFuturePlans,CreditExistingLoanObligation,FamilyMemberInvolvedInBusiness,CreditManager,CreditBorrowerAndGuarantorDetails,CreditFinancialAnalysis,CreditAddressDetail, @@ -49,17 +49,21 @@ exports.PullCreditPdData = async (req, res) => { const tempData = JSON.parse(JSON.stringify(req.body.data)); var obj = { }; - let temp_obj = [ ]; + var temp_obj = [ ]; var arr_ObjKey = [ ] var creditFilter_obj_key = [ ]; var creditFilter_table_name = [ ]; + var key_for_arrays = [ ]; var name; var loan_amount; var pd_id = [ ]; + var resPonse = [ ]; + // create creditGeneralInormationData + resPonse.length = 0 ; // clear array datas for (const [key, value] of Object.entries(tempData)) { - if (key == "Loan details" || key =="Borrower & Guarantor Details") { + if (key == "Loan details" || key =="Borrower & Guarantor Details" || key == "Officer Details") { for (var [keys, element] of Object.entries(value)) { if ( Array.isArray(element) == true ) { element.forEach(async(element , index) => { @@ -68,11 +72,27 @@ exports.PullCreditPdData = async (req, res) => Object.assign(obj, { ref_no: req.body.pdid , product :req.body.product , case_no :req.body.caseno}); } }); - } else { if ( keys == 'loan_amount') { { Object.assign( obj , { loan_amount : element })} } } + } + else + { + if ( key == "Borrower & Guarantor Details" && keys == 'common_remarks') { Object.assign( obj , {remarks : element}) } + if ( keys == 'loan_amount') { { Object.assign( obj , { loan_amount : element })} }; + if ( key == "Officer Details") { + if (moment(element, "DD/MM/YYYY hh:mm:ss A", true).isValid() == true) { + var mydate = moment(element, "DD/MM/YYYY hh:MM:ss A"); // convert dd/mm/yyyy to yyyy/mm/dd + var my_date = moment(mydate).format("YYYY-MM-DD HH:mm:ss A") + Object.assign( obj, { [keys] : my_date }); + } + else{ + Object.assign(obj, { [ keys ] : element }); + } + } + } } } } // Object.assign( obj , { ref_no : req.body.pdid }); + console.log(obj); pd_id = await CreditGeneralInformation.create(obj) // .then((successData)=>{logMsg.info("GeneralInformation insert success ,PdId= "+successData.dataValues.pd_id);}) // .catch((err)=>{ logMsg.info("GeneralInformation insert failed ,PdId(ref_no)= "+req.body.pdid); }); @@ -81,6 +101,7 @@ exports.PullCreditPdData = async (req, res) => // loop to check if the data is array or nestedObject or objects for (const [key, value] of Object.entries(tempData)) { + console.log(key); creditFilter_obj_key = await CreditFilterTable.findAll({ raw: true , attributes: [ 'mul_key' ], where : { section : key , is_active : 1 , is_mul : 1}}) creditFilter_table_name = await CreditFilterTable.findAll({ raw: true, attributes: [ 'table_name' ,'section' ,'ques_key'], where : { section : key , is_active : 1 } , group: ['table_name' , 'section' ,'ques_key']}) for (let index = 0; index < creditFilter_obj_key.length; index++) @@ -92,21 +113,35 @@ exports.PullCreditPdData = async (req, res) => obj = { }; // clear obj datas // Check if the data is array or not - for (var [arr_keys, arr_of_element] of Object.entries(value)) { + for (var [arr_keys, arr_of_element] of Object.entries(value)) { if ( Array.isArray(arr_of_element) == true ) { arr_of_element.forEach(async(iter_element , index) => { - // assign only value with in array - if (Object.keys(iter_element)[0] == '0') { - temp_obj.push({ [arr_keys] : iter_element }) - } - // assign array of objects - else - { - temp_obj.push(iter_element) ; - } + if (Object.keys(iter_element)[0] == '0') { + Object.assign( obj, { [arr_keys] : iter_element }); + } + // assign array of objects + else { + key_for_arrays = Object.keys(iter_element); + Object.values(iter_element).forEach( async (element_ele , index ) => { + if ( typeof element_ele === "object" && ( element_ele !== null )) + { + delete element_ele.display_data; + delete value.display_data; + await Credit_PdHelper.CreditPd( key_for_arrays[index] , element_ele , arr_ObjKey , obj ) + } + else + { + // temp_obj.push(iter_element) ; + Object.assign( obj, { [key_for_arrays[index]] : element_ele }); + } + }); + } + temp_obj.push(obj) + obj = { }; // clear obj datas }); } + // end of array // assign nestedObject datas else if( typeof arr_of_element === "object" && ( arr_of_element !== null ) ) { @@ -121,11 +156,14 @@ exports.PullCreditPdData = async (req, res) => var mydate = moment(arr_of_element, "DD-MM-YYYY"); // convert dd/mm/yyyy to yyyy/mm/dd var my_date = moment(mydate).format("YYYY-MM-DD") Object.assign( obj, { [arr_keys] : my_date }); - } else { Object.assign( obj, { [arr_keys] : arr_of_element }); } + } else { + Object.assign( obj, { [arr_keys] : arr_of_element }); + } } }// end of inner forLoop // DB insertion // insert array of object datas + if (temp_obj.length != 0 ) { temp_obj.forEach( async (temp_obj_element) => @@ -312,3 +350,46 @@ exports.GetCreditPdData = async (req, res) => }; + + + + + + + + +// // test + +// exports.testGetCreditPdData = async (req, res) => +// { +// try +// { +// var resData = await CreditGeneralInformation.findAll({ where : { pd_id : req.query.pdid ,is_active : 1}, +// include : [ +// {model: CreditAddressDetail }, {model: CreditFuturePlans }, +// {model : CreditBorrowerAndGuarantorDetails }, +// {model: CreditBusinessAndPersonalBankingDetails }, {model: BusinessAsset }, +// {model: CreditFinancialInformation }, {model: CreditKeyShareholder }, +// {model: CreditKeyProductBusinessContribution }, {model: EmployeeStrength }, +// {model: ClientDetail }, {model: StockDetail }, +// {model: CreditExistingLoanObligation }, {model: FamilyMemberInvolvedInBusiness }, +// {model : CreditManager }, {model: Photograph }, +// {model: CreditFinalRemarks }, {model: CreditLoanDetail }, +// {model: CreditGeneralBusinessInformation }, {model: SupplierDetail } +// ] +// }) +// res.send({'status':200,'message':"success",'data':resData}); +// } +// catch(err) { +// res.status(500).send({'status':404, +// message: err.message || "Some error occurred while inserting statements." ,'data': "No data" +// }); +// } + +// }; + + + + + + diff --git a/app/models/BusinessAsset.js b/app/models/BusinessAsset.js index 5c02094..2aa39d2 100644 --- a/app/models/BusinessAsset.js +++ b/app/models/BusinessAsset.js @@ -15,7 +15,7 @@ module.exports = (sequelize, DataTypes) => { business_pd_visited_remark: { type: DataTypes.STRING }, business_ownership_type: { type: DataTypes.STRING }, business_approximate_market_value: { type: DataTypes.INTEGER }, - business_name_of_the_owner: { type: DataTypes.STRING }, // DataTypes.ARRAY(DataTypes.STRING), + business_name_of_the_owner: { type: DataTypes.STRING }, business_vintage: { type: DataTypes.INTEGER }, business_purchase_year: { type: DataTypes.INTEGER }, business_emi: { type: DataTypes.INTEGER }, @@ -24,6 +24,8 @@ module.exports = (sequelize, DataTypes) => { business_assets_mode: { type: DataTypes.STRING }, other_asset_description: { type: DataTypes.STRING }, company_name: { type: DataTypes.STRING }, + business_assets_mode_name: { type: DataTypes.STRING }, + business_owner_name: { type: DataTypes.STRING }, createdby: { type: DataTypes.INTEGER }, updatedby: { type: DataTypes.INTEGER } diff --git a/app/models/ClientDetail.js b/app/models/ClientDetail.js index 0576196..06f1ac0 100644 --- a/app/models/ClientDetail.js +++ b/app/models/ClientDetail.js @@ -12,18 +12,21 @@ module.exports = (sequelize, DataTypes) => { provider_name: { type: DataTypes.STRING }, client_name: { type: DataTypes.INTEGER }, contact_person_name: { type: DataTypes.STRING }, - contact_person_designation: { type: DataTypes.STRING }, - contact_person_mobile_no: { type: DataTypes.INTEGER }, + contact_person_designation: { type: DataTypes.INTEGER }, + contact_person_mobile_no: { type: DataTypes.STRING }, person_stdcode: { type: DataTypes.INTEGER }, person_landline: { type: DataTypes.INTEGER }, - payment_type: { type: DataTypes.STRING }, + payment_type: { type: DataTypes.INTEGER }, credit_period_no: { type: DataTypes.INTEGER }, credit_total_purchase: { type: DataTypes.INTEGER }, payment_mode: { type: DataTypes.STRING }, - company_name: { type: DataTypes.STRING }, + company_name: { type: DataTypes.INTEGER }, common_remarks: { type: DataTypes.STRING }, createdby: { type: DataTypes.INTEGER }, - updatedby: { type: DataTypes.INTEGER } + updatedby: { type: DataTypes.INTEGER }, + type_of_payment : { type: DataTypes.STRING }, // new + name_of_the_company: { type: DataTypes.STRING }, // new + }, { diff --git a/app/models/CreditFinalRemarks.js b/app/models/CreditFinalRemarks.js index 8ab9b21..1a7c323 100644 --- a/app/models/CreditFinalRemarks.js +++ b/app/models/CreditFinalRemarks.js @@ -12,6 +12,8 @@ module.exports = (sequelize, DataTypes) => { business_location_suited: { type: DataTypes.STRING }, pd_officer_recommendation: { type: DataTypes.STRING }, pd_officer_recommendation_other: { type: DataTypes.STRING }, + pd_officer_recommendation_name: { type: DataTypes.STRING }, + customer_behaviour_name: { type: DataTypes.STRING }, reason: { type: DataTypes.STRING }, final_form_remarks: { type: DataTypes.STRING }, createdby: { type: DataTypes.INTEGER }, diff --git a/app/models/CreditGeneralBusinessInformation.js b/app/models/CreditGeneralBusinessInformation.js index 73222f7..8dd933d 100644 --- a/app/models/CreditGeneralBusinessInformation.js +++ b/app/models/CreditGeneralBusinessInformation.js @@ -16,7 +16,9 @@ module.exports = (sequelize, DataTypes) => { low_sale_month: { type: DataTypes.STRING }, common_remarks: { type: DataTypes.STRING }, createdby: { type: DataTypes.INTEGER }, - updatedby: { type: DataTypes.INTEGER } + updatedby: { type: DataTypes.INTEGER }, + name_of_the_company: { type: DataTypes.STRING }, // new + }, { diff --git a/app/models/CreditGeneralInformation.js b/app/models/CreditGeneralInformation.js index 99cf4f8..6430b4d 100644 --- a/app/models/CreditGeneralInformation.js +++ b/app/models/CreditGeneralInformation.js @@ -17,6 +17,11 @@ module.exports = (sequelize, DataTypes) => { location: { type: DataTypes.STRING }, ref_no: { type: DataTypes.INTEGER }, case_no: { type: DataTypes.STRING }, + officer_id: { type: DataTypes.INTEGER }, + email: { type: DataTypes.STRING }, + mobile_no: { type: DataTypes.INTEGER }, + officer: { type: DataTypes.STRING }, + pd_visit_date: { type: DataTypes.STRING }, createdby: { type: DataTypes.INTEGER }, updatedby: { type: DataTypes.INTEGER } }, diff --git a/app/models/CreditKeyProductBusinessContribution.js b/app/models/CreditKeyProductBusinessContribution.js index 8e3aed5..1323df4 100644 --- a/app/models/CreditKeyProductBusinessContribution.js +++ b/app/models/CreditKeyProductBusinessContribution.js @@ -14,7 +14,9 @@ module.exports = (sequelize, DataTypes) => { business_process: { type: DataTypes.STRING }, common_remarks: { type: DataTypes.STRING }, createdby: { type: DataTypes.INTEGER }, - updatedby: { type: DataTypes.INTEGER } + updatedby: { type: DataTypes.INTEGER }, + name_of_the_company: { type: DataTypes.STRING }, // new + }, { diff --git a/app/models/CreditKeyShareholder.js b/app/models/CreditKeyShareholder.js index 431fb3b..12e4e93 100644 --- a/app/models/CreditKeyShareholder.js +++ b/app/models/CreditKeyShareholder.js @@ -17,7 +17,9 @@ module.exports = (sequelize, DataTypes) => { started_biz: { type: DataTypes.STRING }, common_remarks: { type: DataTypes.STRING }, createdby: { type: DataTypes.INTEGER }, - updatedby: { type: DataTypes.INTEGER } + updatedby: { type: DataTypes.INTEGER }, + name_of_the_company: { type: DataTypes.STRING }, // new + }, { diff --git a/app/models/StockDetail.js b/app/models/StockDetail.js index 30c80d3..6634afd 100644 --- a/app/models/StockDetail.js +++ b/app/models/StockDetail.js @@ -18,6 +18,7 @@ module.exports = (sequelize, DataTypes) => { estimated_stock_value: { type: DataTypes.INTEGER }, company_name: { type: DataTypes.STRING }, common_remarks: { type: DataTypes.STRING }, + name_of_the_company: { type: DataTypes.STRING }, // new createdby: { type: DataTypes.INTEGER }, updatedby: { type: DataTypes.INTEGER } diff --git a/app/models/SupplierDetail.js b/app/models/SupplierDetail.js index 2407e3b..8efb9cc 100644 --- a/app/models/SupplierDetail.js +++ b/app/models/SupplierDetail.js @@ -12,15 +12,16 @@ module.exports = (sequelize, DataTypes) => { provider_name: { type: DataTypes.STRING }, supplier_name: { type: DataTypes.STRING }, contact_person_name: { type: DataTypes.STRING }, - contact_person_designation: { type: DataTypes.STRING }, - contact_person_mobile_no: { type: DataTypes.INTEGER }, + contact_person_designation: { type: DataTypes.INTEGER }, + contact_person_mobile_no: { type: DataTypes.STRING }, person_stdcode: { type: DataTypes.INTEGER }, person_landline: { type: DataTypes.INTEGER }, - payment_type: { type: DataTypes.STRING }, + type_of_payment : { type: DataTypes.STRING }, // new payment_mode: { type: DataTypes.STRING }, credit_period_no: { type: DataTypes.INTEGER }, credit_total_purchase: { type: DataTypes.INTEGER }, - company_name: { type: DataTypes.STRING }, + company_name: { type: DataTypes.INTEGER }, + name_of_the_company: { type: DataTypes.STRING }, // new common_remarks: { type: DataTypes.STRING }, createdby: { type: DataTypes.INTEGER }, updatedby: { type: DataTypes.INTEGER } diff --git a/app/routes/routes.js b/app/routes/routes.js index 22b9bc3..c664cdb 100644 --- a/app/routes/routes.js +++ b/app/routes/routes.js @@ -216,7 +216,27 @@ router.get('/GetCreditPdData',CreditPdController.GetCreditPdData) router.get("/DownloadPdReport", CreditPdController.DownloadPdReport); +// // test +// //get credit pd data List Api +// /** +// * @swagger +// * /api/testGetCreditPdData: +// * get: +// * summary: Get testGetCreditPdData Data List +// * description: Get testGetCreditPdData Data List +// * parameters: +// * - in: query +// * name: pdid +// * schema: +// * type: integer +// * required: true +// * example: 206 +// * responses: +// * 200: +// * description: success +// */ +// router.get('/testGetCreditPdData',CreditPdController.testGetCreditPdData) From 44c5ae1a1b9ebeb3394af5ade9755437cd8e2984 Mon Sep 17 00:00:00 2001 From: suseendhiran17 <58357088+suseendhiran17@users.noreply.github.com> Date: Thu, 26 May 2022 15:51:26 +0530 Subject: [PATCH 42/42] susee --- app/models/CreditGeneralInformation.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/models/CreditGeneralInformation.js b/app/models/CreditGeneralInformation.js index 6430b4d..a43a722 100644 --- a/app/models/CreditGeneralInformation.js +++ b/app/models/CreditGeneralInformation.js @@ -21,6 +21,7 @@ module.exports = (sequelize, DataTypes) => { email: { type: DataTypes.STRING }, mobile_no: { type: DataTypes.INTEGER }, officer: { type: DataTypes.STRING }, + remarks: { type: DataTypes.STRING }, pd_visit_date: { type: DataTypes.STRING }, createdby: { type: DataTypes.INTEGER }, updatedby: { type: DataTypes.INTEGER }