rp041993 4 سال پیش
کامیت
9c76fd6256
100فایلهای تغییر یافته به همراه5067 افزوده شده و 0 حذف شده
  1. BIN
      .DS_Store
  2. 3 0
      .vscode/settings.json
  3. BIN
      __pycache__/config.cpython-37.pyc
  4. BIN
      __pycache__/engine.cpython-37.pyc
  5. 8 0
      config.py
  6. BIN
      dao/__pycache__/asset_dao.cpython-37.pyc
  7. BIN
      dao/__pycache__/fetch_master_dao.cpython-37.pyc
  8. BIN
      dao/__pycache__/project_dao.cpython-37.pyc
  9. BIN
      dao/__pycache__/reports_dao.cpython-37.pyc
  10. BIN
      dao/__pycache__/vendor_dao.cpython-37.pyc
  11. BIN
      dao/__pycache__/voucher_approval_dao.cpython-37.pyc
  12. BIN
      dao/__pycache__/voucher_dao.cpython-37.pyc
  13. 35 0
      dao/asset_dao.py
  14. 32 0
      dao/fetch_master_dao.py
  15. 147 0
      dao/project_dao.py
  16. 61 0
      dao/reports_dao.py
  17. 114 0
      dao/vendor_dao.py
  18. 75 0
      dao/voucher_approval_dao.py
  19. 130 0
      dao/voucher_dao.py
  20. 676 0
      engine.py
  21. BIN
      far.xlsx
  22. BIN
      po_pdf/.DS_Store
  23. BIN
      po_pdf/5faba52895bad6215a324808.pdf
  24. BIN
      po_pdf/603628383953495ac6711147.pdf
  25. BIN
      po_pdf/6036289f3953495ac67111a5.pdf
  26. BIN
      po_pdf/603f51bf3953495ac6b3aa57.pdf
  27. BIN
      po_pdf/603f528d3953495ac6b3ae16.pdf
  28. BIN
      po_pdf/60d983d13953495ac639dbcf.pdf
  29. BIN
      po_pdf/613881a880b34c1886f9afec.pdf
  30. BIN
      po_pdf/Formate-2-5.pdf
  31. BIN
      po_pdf/infra_tc.pdf
  32. 154 0
      requirements.txt
  33. BIN
      service/__pycache__/asset_service.cpython-37.pyc
  34. BIN
      service/__pycache__/fetch_master_service.cpython-37.pyc
  35. BIN
      service/__pycache__/project_service.cpython-37.pyc
  36. BIN
      service/__pycache__/reports_service.cpython-37.pyc
  37. BIN
      service/__pycache__/vendor_service.cpython-37.pyc
  38. BIN
      service/__pycache__/voucher_approval_service.cpython-37.pyc
  39. BIN
      service/__pycache__/voucher_list.cpython-37.pyc
  40. 77 0
      service/asset_service.py
  41. 30 0
      service/fetch_master_service.py
  42. 952 0
      service/project_service.py
  43. 623 0
      service/reports_service.py
  44. 206 0
      service/vendor_service.py
  45. 786 0
      service/voucher_approval_service.py
  46. 920 0
      service/voucher_list.py
  47. BIN
      static_img/.DS_Store
  48. BIN
      static_img/kef-logo 10.53.11 AM 10.53.11 AM.jpg
  49. BIN
      uploads/12a_1603095780257.jpeg
  50. BIN
      uploads/80g_1603095780257.jpeg
  51. BIN
      uploads/audit_1603095780258.jpeg
  52. BIN
      uploads/audit_1603095803605.jpeg
  53. BIN
      uploads/audit_1614835085236.pdf
  54. BIN
      uploads/cheq_11614170637865.pdf
  55. BIN
      uploads/cheq_11625127574550.xlsx
  56. BIN
      uploads/cheq_1602584176586.xlsx
  57. BIN
      uploads/dec_1602584176586.xlsx
  58. BIN
      uploads/deed_1603095780257.jpeg
  59. BIN
      uploads/deed_1614835085235.jpg
  60. BIN
      uploads/donation_1603095780258.jpeg
  61. BIN
      uploads/donation_1614835085237.jpg
  62. BIN
      uploads/far.xlsx
  63. BIN
      uploads/invoice_11606996785639.jpg
  64. BIN
      uploads/invoice_11606996887585.jpg
  65. BIN
      uploads/invoice_11607056146259.jpg
  66. BIN
      uploads/invoice_11607063695143.jpg
  67. BIN
      uploads/invoice_11607072422344.jpg
  68. BIN
      uploads/invoice_11607072550371.jpg
  69. BIN
      uploads/invoice_11607072632207.jpg
  70. BIN
      uploads/invoice_11607072708118.jpg
  71. BIN
      uploads/invoice_11608191892137.xlsx
  72. BIN
      uploads/invoice_11608191998601.xlsx
  73. BIN
      uploads/invoice_11608279220260.pdf
  74. BIN
      uploads/invoice_11608279461211.pdf
  75. BIN
      uploads/invoice_11608279778210.pdf
  76. 38 0
      uploads/invoice_11609998702652.xls
  77. BIN
      uploads/invoice_11609998861797.pdf
  78. BIN
      uploads/invoice_11625127324850.pdf
  79. BIN
      uploads/invoice_11625127470790.pdf
  80. BIN
      uploads/invoice_11625127574530.pdf
  81. BIN
      uploads/invoice_11634118452014.pdf
  82. BIN
      uploads/invoice_21606996785642.jpg
  83. BIN
      uploads/invoice_21606996887594.jpg
  84. BIN
      uploads/invoice_21607056146263.jpg
  85. BIN
      uploads/invoice_21607063695147.jpg
  86. BIN
      uploads/invoice_21607072422348.jpg
  87. BIN
      uploads/invoice_21607072550378.jpg
  88. BIN
      uploads/invoice_21607072632211.jpg
  89. BIN
      uploads/invoice_21607072708125.jpg
  90. BIN
      uploads/invoice_21625127324854.pdf
  91. BIN
      uploads/invoice_21625127470793.pdf
  92. BIN
      uploads/invoice_21625127574533.pdf
  93. BIN
      uploads/invoice_31625127324856.pdf
  94. BIN
      uploads/invoice_31625127470794.pdf
  95. BIN
      uploads/invoice_31625127574537.pdf
  96. BIN
      uploads/invoice_41625127324857.pdf
  97. BIN
      uploads/invoice_41625127470795.pdf
  98. BIN
      uploads/invoice_41625127574540.pdf
  99. BIN
      uploads/invoice_51625127324858.pdf
  100. BIN
      uploads/invoice_51625127470796.pdf

BIN
.DS_Store


+ 3 - 0
.vscode/settings.json

@@ -0,0 +1,3 @@
+{
+    "python.formatting.provider": "yapf"
+}

BIN
__pycache__/config.cpython-37.pyc


BIN
__pycache__/engine.cpython-37.pyc


+ 8 - 0
config.py

@@ -0,0 +1,8 @@
+SECRET_KEY='sacC2p7rFaljsacC' # Secret key for flask project
+MONGO_DBNAME='Migration' # Database name
+MONGO_URI='mongodb://kefOnboard:sacC2p7rFaLj@142.93.210.143:27017/Migration' # MongoDB URI
+
+TEMPLATES_AUTO_RELOAD=True
+PORT=9005 # Flask running port
+
+V_BASE_CODE=10000

BIN
dao/__pycache__/asset_dao.cpython-37.pyc


BIN
dao/__pycache__/fetch_master_dao.cpython-37.pyc


BIN
dao/__pycache__/project_dao.cpython-37.pyc


BIN
dao/__pycache__/reports_dao.cpython-37.pyc


BIN
dao/__pycache__/vendor_dao.cpython-37.pyc


BIN
dao/__pycache__/voucher_approval_dao.cpython-37.pyc


BIN
dao/__pycache__/voucher_dao.cpython-37.pyc


+ 35 - 0
dao/asset_dao.py

@@ -0,0 +1,35 @@
+from utils.UpdateOwnId import updateOwnId
+from datetime import datetime
+
+def getInserterdAssetsCount(asset_type,mongo):
+    count=0
+    try:
+        count=mongo["i_tbl_asset_master_new"].count({'asset_type':asset_type})
+    except Exception as err:
+        print(err)
+    
+    return count
+
+def getAssetCategoryListDao(mongo):
+    category=[]
+    try:
+        category=list(mongo["i_assets_sub_cat_master"].find({},{'_id':0}))
+    except Exception as err:
+        print('getAssetCategoryListDao',err)
+    return category
+
+def getAllAssetsListDao(mongo):
+    assets=[]
+    try:
+        assets=list(mongo["i_tbl_asset_master_new"].find({},{'_id':0}))
+    except Exception as err:
+        print('getVendorListByUID',err)
+    return assets
+
+def updateAssetReportDetailsDao(asset_id,update_obj,mongo):
+    try:
+        UpdateResult =mongo["i_tbl_asset_master_new"].update_one({'id':str(asset_id)},{'$set':update_obj})
+        
+    except Exception as identifier:
+        print(identifier)
+

+ 32 - 0
dao/fetch_master_dao.py

@@ -0,0 +1,32 @@
+
+def getAllVoucherTypeListDao(mongo):
+    voucher_type_list=[]
+    try:
+        voucher_type_list=list(mongo["v_voucher_type"].find({},{'_id':0}))
+    except Exception as err:
+        print('getAllVoucherTypeListDao',err)
+    return voucher_type_list
+
+def getBudgetHeadListDao(mongo):
+    budget_head_list=[]
+    try:
+        budget_head_list=list(mongo["v_budget_head"].find({},{'_id':0}))
+    except Exception as err:
+        print('getBudgetHeadListDao',err)
+    return budget_head_list
+
+def getTDSRateListDao(mongo):
+    tds_rate_list=[]
+    try:
+        tds_rate_list=list(mongo["v_tds_rate"].find({},{'_id':0}))
+    except Exception as err:
+        print('getTDSRateListDao',err)
+    return tds_rate_list
+
+def getCatAgeListDao(mongo):
+    cat_age_list=[]
+    try:
+        cat_age_list=list(mongo["v_cat_age_master"].find({},{'_id':0}))
+    except Exception as err:
+        print('getCatAgeListDao',err)
+    return cat_age_list

+ 147 - 0
dao/project_dao.py

@@ -0,0 +1,147 @@
+from utils.UpdateOwnId import updateOwnId
+from datetime import datetime
+from utils.error_log import insert_into_error_log
+
+def insertIntoProjectMaster(requestObject,mongo):
+    _id=""
+    try:
+        UpdateResult =mongo["v_tbl_project_master"].update_one({'id':str(requestObject['id'])},{'$set':requestObject},upsert=True)
+        _id=UpdateResult.raw_result['upserted']
+        updateOwnId("v_tbl_project_master",_id,mongo)
+    except Exception as identifier:
+        print(identifier)
+
+    return _id
+
+def getProjectListByUID(u_id,mongo):
+    vendors=[]
+    try:
+        vendors=list(mongo["v_tbl_project_master"].find({'user_id':u_id},{'_id':0}))
+    except Exception as err:
+        print('getProjectListByUID',err)
+    return vendors
+
+def getAllProjectListDao(mongo):
+    vendors=[]
+    try:
+        vendors=list(mongo["v_tbl_project_master"].find({},{'_id':0}))
+    except Exception as err:
+        print('getProjectListByUID',err)
+    return vendors
+
+def getPendingPOForApprovalDao(u_id,mongo):
+    vendors=[]
+    try:
+        
+        vendors=list(mongo["v_tbl_project_master"].find({'po_submitted':True,
+        'po_status':'PENDING','$or':[
+            {'approval_track.senior_level_1.id':u_id,'approval_track.senior_level_1.status':'PENDING'},
+            {'approval_track.senior_level_2.id':u_id,'approval_track.senior_level_2.status':'PENDING'},
+            {'approval_track.senior_level_3.id':u_id,'approval_track.senior_level_3.status':'PENDING'}
+        ]},{'_id':0}))
+    except Exception as err:
+        print('getProjectListByUID',err)
+    return vendors
+
+def getProjectDetailsDao(id,mongo):
+    vendors=[]
+    try:
+        vendors=list(mongo["v_tbl_project_master"].find({'id':id},{'_id':0}))
+    except Exception as err:
+        print('getProjectDetailsDao',err)
+    return vendors
+
+def submitProjectDao(requestObject,mongo):
+    
+    try:
+        mongo["v_tbl_project_master"].update_one({'id':str(requestObject['p_id'])},{'$set':{'status':'SUBMITTED','submitted_on':int(datetime.now().timestamp()*1000)}})
+
+    except Exception as identifier:
+        print(identifier)
+
+def updatePurchaseOrder(requestObject,p_id,mongo):
+    
+    try:
+        mongo["v_tbl_project_master"].update_one({'id':str(p_id),'po_submitted':False},{'$set':requestObject})
+
+    except Exception as identifier:
+        print(identifier)
+
+def getPOYear(mongo):
+    years=''
+    try:
+        years=list(mongo["v_po_year"].find({},{'_id':0},sort=[('timestamp', 1)]).limit(1))
+    except Exception as err:
+        print('getProjectListByUID',err)
+    return years
+
+def insertPOYear(po_year,mongo):
+    try:
+        mongo["v_po_year"].insert({'year':po_year})
+    except Exception as err:
+        print(err)
+
+def getInserterdPoCount(po_year,mongo):
+    count=0
+    try:
+        count=mongo["v_tbl_project_master"].count({'po_submitted':True,'po_year':po_year})
+    except Exception as err:
+        print(err)
+    
+    return count
+
+def getUserDetailsFromMaster(user_id,mongo):
+    users=[]
+    try:
+        users=list(mongo["users"].find({'key':user_id},{'_id':0,'access_points':0}).limit(1))
+    except Exception as err:
+        print('getUserDetailsFromMaster',err)
+    
+    return users
+
+def getAllUsersFromMaster(mongo):
+    users=[]
+    try:
+        users=list(mongo["users"].find({"current_status" :{"$ne": "Resigned"}},{'_id':False,'key':True,'intervention':True,'first_name':True,'emp_id':True}))
+    except Exception as err:
+        print('getAllUsersFromMaster',err)
+    
+    return users
+
+def updatePurchaseOrderApprovalStatus(requestObject,po_id,mongo):
+    
+    try:
+        mongo["v_tbl_project_master"].update_one({'id':str(po_id)},{'$set':requestObject})
+
+    except Exception as identifier:
+        print(identifier)
+
+def insertPOStatusLog(status_obj,mongo):
+    try:
+        mongo["v_po_status_log"].insert(status_obj)
+    except Exception as err:
+        print(err)
+
+def getPOStatusLog(po_id,mongo):
+    po_status=[]
+    try:
+        po_status=list(mongo["v_po_status_log"].find({'po_id':po_id},{'_id':0}))
+    except Exception as err:
+        print('getProjectListByUID',err)
+    return po_status
+
+def getPOList(mongo):
+    po_list=[]
+    try:
+        po_list=list(mongo["v_tbl_project_master"].find({'po_submitted':True,'po_status':'APPROVED'},{'_id':0}))
+    except Exception as err:
+        print('getProjectListByUID',err)
+    return po_list
+
+def getPOListForReport(mongo):
+    po_list=[]
+    try:
+        po_list=list(mongo["v_tbl_project_master"].find({'po_submitted':True,'po_status':'APPROVED'},{'_id':0,'po_order_id':1,'id':1}))
+    except Exception as err:
+        print('getProjectListByUID',err)
+    return po_list

+ 61 - 0
dao/reports_dao.py

@@ -0,0 +1,61 @@
+
+def tdsNameList(mongo):
+    tds_list=[]
+    try:
+        tds_list=list(mongo["v_tds_rate"].distinct("name"))
+    except Exception as err:
+        print(err)
+        
+    return tds_list
+
+def getMOUReportsDataDao(from_date,to_date,mongo):
+    mous=[]
+    try:
+        mous=list(mongo["v_tbl_project_master"].find({"po_submitted":True,"submitted_on":{"$gte":int(from_date),"$lte":int(to_date)}},{'_id':0}))
+    except Exception as err:
+        print('getMOUReportsDataDao',err)
+    return mous
+
+def getTdsReportsDataDao(from_date,to_date,tds_name,mongo):
+    vouchers=[]
+    try:
+        vouchers=list(mongo["v_tbl_voucher_master"].find({"tds_name":tds_name,"voucher_created_on":{"$gte":int(from_date),"$lte":int(to_date)}},{'_id':0}))
+    except Exception as err:
+        print('getTdsReportsDataDao',err)
+    return vouchers
+
+def getTallyReportsDataDao(from_date,to_date,mongo):
+    vouchers=[]
+    try:
+        vouchers=list(mongo["v_tbl_voucher_master"].find({"voucher_created_on":{"$gte":int(from_date),"$lte":int(to_date)}},{'_id':0}))
+    except Exception as err:
+        print('getTallyReportsDataDao',err)
+    return vouchers
+
+def getAssetReportsDataDao(category,mongo):
+    assets=[]
+    try:
+        assets=list(mongo["i_tbl_asset_master_new"].find({"asset_master_type":category},{'_id':0}))
+    except Exception as err:
+        print('getAssetReportsDataDao',err)
+    return assets
+
+def getAllVoucherAnalyticsDataDao(from_date,to_date,mongo):
+    vouchers=[]
+    try:
+        vouchers=list(mongo["v_tbl_voucher_master"].find({"voucher_created_on":{"$gte":int(from_date),"$lte":int(to_date)}},{'_id':0}))
+    except Exception as err:
+        print('getAllVoucherAnalyticsDataDao',err)
+    return vouchers
+
+def getAssetDepriciationDataDao(category,mongo):
+    depriciation=0
+    age=0
+    try:
+        data=list(mongo["i_assets_type_master"].find({"name":category},{'_id':0,'depriciation':1,'age':1}).limit(1))
+        for dep_obj in data:
+           depriciation=dep_obj['depriciation']
+           age=dep_obj['age']
+    except Exception as err:
+        print('getAssetReportsDataDao',err)
+    return depriciation,age

+ 114 - 0
dao/vendor_dao.py

@@ -0,0 +1,114 @@
+from utils.UpdateOwnId import updateOwnId
+from datetime import datetime
+from utils.error_log import insert_into_error_log
+
+def validateVendorCodeDao(v_code,mongo):
+    query=mongo["v_tbl_vendor_code"].find({'code':v_code})
+    return list(query)
+
+def validatePANDao(v_pan,mongo):
+    query=mongo["v_tbl_vendor_master"].find({'v_pan':v_pan})
+    return list(query)
+
+def getTotalUserCount(mongo):
+    count=0
+    try:
+        count=mongo["v_tbl_vendor_master"].find({}).count()
+    except Exception as err:
+        print('getTotalUserCount',err)
+    return count
+
+def insertIntoVendorMaster(requestObject,mongo):
+    _id=""
+    try:
+        UpdateResult =mongo["v_tbl_vendor_master"].update_one({'id':str(requestObject['id'])},{'$set':requestObject},upsert=True)
+        _id=UpdateResult.raw_result['upserted']
+        updateOwnId("v_tbl_vendor_master",_id,mongo)
+    except Exception as identifier:
+        print(identifier)
+
+    return _id
+
+def updateVendorStatusDao(requestObject,v_id,mongo):
+    if 'requestKey' in requestObject:
+        del requestObject['requestKey']
+
+    if 'flag' in requestObject:
+        del requestObject['flag']
+        
+    try:
+        UpdateResult =mongo["v_tbl_vendor_master"].update_one({'id':v_id},{'$set':requestObject})
+        
+    except Exception as identifier:
+        print(identifier)
+
+    return ""
+
+def updateVendorStatusAdminDao(requestObject,v_id,mongo):
+    
+    try:
+        UpdateResult =mongo["v_tbl_vendor_master"].update_one({'id':v_id},{'$set':requestObject})
+        
+    except Exception as identifier:
+        print(identifier)
+
+    return ""
+
+def getVendorListByUID(u_id,mongo):
+    vendors=[]
+    try:
+        vendors=list(mongo["v_tbl_vendor_master"].find({'user_id':u_id},{'_id':0}))
+    except Exception as err:
+        print('getVendorListByUID',err)
+    return vendors
+
+def getAllVendorListDao(mongo):
+    vendors=[]
+    try:
+        vendors=list(mongo["v_tbl_vendor_master"].find({},{'_id':0}))
+    except Exception as err:
+        print('getVendorListByUID',err)
+    return vendors
+
+def getAllUnregisteredVendorListDao(mongo):
+    vendors=[]
+    try:
+        vendors=list(mongo["v_tbl_voucher_master"].find({'vendor_name':{'$exists':True}},{'_id':0,'vendor_name':1,'vendor_email':1,'vendor_address':1,'vendor_number':1}))
+    except Exception as err:
+        print('getVendorListByUID',err)
+    return vendors
+
+def getVendorDetailsDao(id,mongo):
+    vendors=[]
+    try:
+        vendors=list(mongo["v_tbl_vendor_master"].find({'id':id},{'_id':0}))
+    except Exception as err:
+        print('getVendorListByUID',err)
+    return vendors
+
+def updateVendorRatingDao(requestObject,mongo):
+    _id=""
+    try:
+        mongo["v_tbl_vendor_rating"].update_one({'user_id':str(requestObject['user_id']),'vendor_id':str(requestObject['vendor_id'])},{'$set':requestObject},upsert=True)
+        
+    except Exception as identifier:
+        print(identifier)
+
+    return _id
+
+def getVendorRatingsDao(id,mongo):
+    vendors=[]
+    try:
+        vendors=list(mongo["v_tbl_vendor_rating"].find({'vendor_id':id},{'_id':0}))
+    except Exception as err:
+        print('getVendorRatingsDao',err)
+    return vendors
+
+
+def getAllUserListDao(mongo):
+    vendors=[]
+    try:
+        vendors=list(mongo["users"].find({},{'_id':0,'key':1,'full_name':1}))
+    except Exception as err:
+        print('getVendorListByUID',err)
+    return vendors

+ 75 - 0
dao/voucher_approval_dao.py

@@ -0,0 +1,75 @@
+from utils.UpdateOwnId import updateOwnId
+
+
+def updateSeniorDataMaster(insert_obj, mongo):
+    _id = ""
+    try:
+        UpdateResult = mongo["v_tbl_voucher_senior_master"].update_one(
+            {'emp_key': str(insert_obj['emp_key'])}, {'$set': insert_obj},
+            upsert=True)
+        _id = UpdateResult.raw_result['upserted']
+        updateOwnId("v_tbl_voucher_senior_master", _id, mongo)
+    except Exception as identifier:
+        print(identifier)
+
+    return _id
+
+def getVoucherSeniorListDao(emp_key, mongo):
+    voucher_senior_list = []
+    try:
+        voucher_senior_list = list(mongo["v_tbl_voucher_senior_master"].find(
+            {'emp_key': emp_key}, {'_id': 0}))
+    except Exception as err:
+        print('getVoucherSeniorListDao', err)
+    return voucher_senior_list
+
+def getVoucherDetailsDao(id, mongo):
+    vouchers = []
+    try:
+        vouchers = list(mongo["v_tbl_voucher_master"].find({'id': id},
+                                                           {'_id': 0}))
+    except Exception as err:
+        print('getVoucherDetailsDao', err)
+
+    return vouchers
+
+def updateVoucherApprovalStatus(requestObject, voucher_id, mongo):
+    try:
+        mongo["v_tbl_voucher_master"].update_one({'id': str(voucher_id)},
+                                                 {'$set': requestObject})
+
+    except Exception as identifier:
+        print(identifier)
+
+def insertVoucherStatusLog(status_obj, mongo):
+    try:
+        mongo["v_voucher_status_log"].insert(status_obj)
+    except Exception as err:
+        print(err)
+
+def getPendingVoucherForApprovalDao(u_id, mongo):
+    vouchers = []
+    try:
+        vouchers = list(mongo["v_tbl_voucher_master"].find(
+            {
+                'voucher_status':'PENDING',
+                '$or': [{
+                    'approval_track.senior_level_1.id': u_id,
+                    'approval_track.senior_level_1.status': 'PENDING'
+                }, {
+                    'approval_track.senior_level_2.id': u_id,
+                    'approval_track.senior_level_2.status': 'PENDING'
+                }, {
+                    'approval_track.senior_level_3.id': u_id,
+                    'approval_track.senior_level_3.status': 'PENDING'
+                }, {
+                    'approval_track.finance_level_1.id': u_id,
+                    'approval_track.finance_level_1.status': 'PENDING'
+                }, {
+                    'approval_track.finance_level_2.id': u_id,
+                    'approval_track.finance_level_2.status': 'PENDING'
+                }]
+            }, {'_id': 0}))
+    except Exception as err:
+        print('getPendingVoucherForApprovalDao', err)
+    return vouchers

+ 130 - 0
dao/voucher_dao.py

@@ -0,0 +1,130 @@
+from utils.UpdateOwnId import updateOwnId
+from datetime import datetime
+
+def getVoucherListByUID(u_id,mongo):
+    vouchers=[]
+    try:
+        vouchers=list(mongo["v_tbl_voucher_master"].find({'deleted':{'$ne':True},'user_id':u_id},{'_id':0}))
+    except Exception as err:
+        print('getProjectListByUID',err)
+    return vouchers
+
+def getVoucherListById(id,mongo):
+    voucher_lst=[]
+    try:
+        voucher_lst=list(mongo["v_tbl_voucher_master"].find({'id':id},{'_id':0}).limit(1))
+    except Exception as err:
+        print('getVoucherListById',err)
+    return voucher_lst
+
+def getAllVoucherList(mongo):
+    vouchers=[]
+    try:
+        vouchers=list(mongo["v_tbl_voucher_master"].find({},{'_id':0}))
+    except Exception as err:
+        print('getAllVoucherList',err)
+    return vouchers
+
+def saveVoucherDao(requestObject,mongo):
+    _id=""
+    try:
+        UpdateResult =mongo["v_tbl_voucher_master"].update_one({'id':str(requestObject['id'])},{'$set':requestObject},upsert=True)
+        _id=UpdateResult.raw_result['upserted']
+        updateOwnId("v_tbl_voucher_master",_id,mongo)
+    except Exception as identifier:
+        print(identifier)
+
+    return _id
+
+def getVoucherYear(mongo):
+    years=''
+    try:
+        years=list(mongo["v_po_year"].find({},{'_id':0},sort=[('timestamp', 1)]).limit(1))
+    except Exception as err:
+        print('getProjectListByUID',err)
+    return years
+
+def insertVoucherYear(po_year,mongo):
+    try:
+
+        mongo["v_po_year"].insert({'year':po_year,'timestamp':int(datetime.now().timestamp() *1000)})
+    except Exception as err:
+        print(err)
+
+def getInserterdVoucherCount(voucher_year,mongo):
+    count=0
+    try:
+        count=mongo["v_tbl_voucher_master"].count({'voucher_year':voucher_year})
+    except Exception as err:
+        print(err)
+    
+    return count
+
+def getVoucherAnalyticsDataDao(from_date,to_date,mongo):
+    vouchers=[]
+    try:
+        vouchers=list(mongo["v_tbl_voucher_master"].find({"voucher_status":"APPROVED","voucher_created_on":{"$gte":int(from_date),"$lte":int(to_date)}},{'_id':0}))
+    except Exception as err:
+        print('getProjectListByUID',err)
+    return vouchers
+
+def updateVoucherDao(voucherCode,date,mongo):
+    try:
+        mongo["v_tbl_voucher_master"].update_one({'voucher_code':str(voucherCode)},{'$set':{'voucher_created_on':date}})
+        
+    except Exception as identifier:
+        print(identifier)
+
+def updateVoucherPhyCopyStatusDao(id,date,mongo):
+    try:
+        mongo["v_tbl_voucher_master"].update_one({'id':id},{'$set':{'sub_phy_copy':True,'phy_sub_on':date}})
+        
+    except Exception as identifier:
+        print(identifier)
+
+def updateVoucherDeleteStatusDao(id,date,mongo):
+    try:
+        mongo["v_tbl_voucher_master"].update_one({'id':id},{'$set':{'deleted':True,'deleted_on':date}})
+        
+    except Exception as identifier:
+        print(identifier)
+
+def getVoucherStatusLogDao(id,mongo):
+    voucher_status=[]
+    try:
+        voucher_status=list(mongo["v_voucher_status_log"].find({'voucher_id':id},{'_id':0}))
+    except Exception as err:
+        print('getVoucherStatusLogDao',err)
+    return voucher_status
+
+def getAssetCodePresentOrNotDao(asset_code_list,mongo):
+    asset_count=[]
+    try:
+        asset_count=mongo["i_tbl_asset_master_new"].find({"asset_code":{"$in":asset_code_list}}).count()
+    except Exception as err:
+        print('getAssetCodePresentOrNotDao',err)
+    return asset_count
+
+def updateAssetDetailsSelected(asset_code_list,update_obj,mongo):
+    try:
+        mongo["i_tbl_asset_master_new"].update_many({"asset_code":{"$in":asset_code_list}},{'$set':update_obj})
+        
+    except Exception as identifier:
+        print(identifier)
+
+def saveAssetDetailsDao(requestObject,mongo):
+    _id=""
+    try:
+        UpdateResult =mongo["i_tbl_asset_master_new"].update_one({'id':str(requestObject['id'])},{'$set':requestObject},upsert=True)
+        _id=UpdateResult.raw_result['upserted']
+        updateOwnId("i_tbl_asset_master_new",_id,mongo)
+    except Exception as identifier:
+        print(identifier)
+
+    return _id
+
+def voucherFileDeleteDao(query,update_obj,mongo):
+    try:
+        mongo["v_tbl_voucher_master"].update(query,update_obj)
+    except Exception as identifier:
+        print(identifier)

+ 676 - 0
engine.py

@@ -0,0 +1,676 @@
+#----------Import neccessary packeges Starts-----------------#
+from flask import Flask, request, jsonify, make_response, render_template
+import pymongo
+import json
+from flask_cors import CORS
+import gc
+import os
+from datetime import datetime
+from flask import send_from_directory
+import base64
+
+#----------Import neccessary packeges Ends-----------------#
+
+#----------Import Config File Starts-----------------#
+from config import *
+import requests
+#----------Import neccessary  Ends-----------------#
+
+#----------Import Service Func Starts------------ -----#
+from service.vendor_service import *
+from service.project_service import *
+from service.fetch_master_service import *
+from service.voucher_approval_service import *
+from utils.FetchInterventions import getInterventionMaster
+from service.voucher_list import *
+from service.asset_service import *
+from service.reports_service import *
+from utils.DateOperation import *
+from utils.FetchInterventions import getUserDetails
+#----------Import Service Func Ends-----------------#
+
+#----------Mongo Connection-----------#
+mongoClient = pymongo.MongoClient(MONGO_URI)
+mongo = mongoClient[MONGO_DBNAME]
+#----------Mongo Connection End-------#
+UPLOAD_FOLDER = 'uploads'
+ALLOWED_EXTENSIONS = { '.pptx','.pdf', '.png', '.jpg', '.jpeg', '.gif','.xlsx','.xls'}
+
+
+app = Flask(__name__)
+
+app.config['JSON_SORT_KEYS'] = False
+app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
+app.config['STATIC_IMG']='static_img'
+app.config['PO_PDF']='po_pdf'
+app.config['UPLOAD_EXTENSIONS']=ALLOWED_EXTENSIONS
+app.config['SECRET_KEY'] = SECRET_KEY
+app.config['TEMPLATES_AUTO_RELOAD'] = TEMPLATES_AUTO_RELOAD # Auto reload flak template
+cors = CORS(app, resources={r"/*": {"origins": "*"}}) # Allow Cross origin request
+
+
+@app.before_request
+def before_request():
+    gc.collect()
+
+#------------------------------------------
+#------------ Fetch Master Data------------
+#------------------------------------------
+@app.route('/validate_vendor_code', methods=['GET'])
+def validate_vendor_code():
+    try:
+        queryResult=validateVendorCode(request.args.get('v_code'),mongo)
+        return jsonify(queryResult)
+
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify({'status': 'failure', 'message': 'Something went wrong!'})
+
+@app.route('/validate_pan', methods=['GET'])
+def validate_pan():
+    try:
+        queryResult=validatePANService(request.args.get('v_pan'),mongo)
+        return jsonify(queryResult)
+
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify({'status': 'failure', 'message': 'Something went wrong'})
+
+@app.route('/register_vendor', methods=['POST'])
+def register_vendor():
+    try:
+        data=request.form.to_dict(flat=True)
+        queryResult=addVendorService(request.files,data,app,mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify({'status': 'failure', 'data': 'Something went wrong!'})
+
+@app.route('/get_vendors', methods=['GET'])
+def get_vendor():
+    try:
+        queryResult=getVendorList(request.args.get('id'),mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/get_all_vendors',methods=['GET'])
+def get_all_vendors():
+    try:
+        queryResult=getAllVendorList(mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        print(err)
+
+@app.route('/get_unregistered_vendors',methods=['GET'])
+def get_unregistered_vendors():
+    try:
+        queryResult=getAllUnregisteredVendorList(mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        print(err)
+
+@app.route('/get_vendor_details',methods=['GET'])
+def get_vendor_details():
+    try:
+        queryResult=getVendorDetails(request.args.get('id'),mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/update_vendor_status',methods=['POST'])
+def update_vendor_status():
+    try:
+        if not request.json:
+            return jsonify({'status': 'failure', 'data':'Something went wrong!'})
+        else:
+            queryResult=updateVendorStatus(request.json,mongo)
+            return queryResult
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify({'status': 'failure', 'data': 'Something went wrong!'})
+
+@app.route('/update_vendor_status_admin',methods=['POST'])
+def update_vendor_status_admin():
+    try:
+        if not request.json:
+            return jsonify({'status': 'failure', 'data':'Something went wrong!'})
+        else:
+            queryResult=updateVendorStatusAdmin(request.json,mongo)
+            return queryResult
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify({'status': 'failure', 'data': 'Something went wrong!'})
+
+@app.route('/update_rating',methods=['POST'])
+def update_rating():
+    try:
+        if not request.json:
+            return jsonify({'status': 'failure', 'data':'Something went wrong!'})
+        else:
+            queryResult=update_rating_service(request.json,mongo)
+            return queryResult
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify({'status': 'failure', 'data': 'Something went wrong!'})
+
+@app.route('/get_vendor_ratings',methods=['GET'])
+def get_vendor_ratings():
+    try:
+        queryResult=getVendorRatingsService(request.args.get('id'),mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/get_intervention', methods=['GET'])
+def get_intervention():
+    try:
+        queryResult=getInterventionMaster(mongo)
+        return jsonify({'status': 'success', 'data': queryResult})
+    except Exception as err:
+        print(err)
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify({'status': 'failure', 'data': 'Something went wrong!'})
+
+@app.route('/add_project',methods=['POST'])
+def add_project():
+    try:
+        data=request.form.to_dict(flat=True)
+        queryResult=addProjectService(request.files,data,app,mongo)
+        return queryResult
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify({'status': 'failure', 'data': 'Something went wrong!'})
+
+@app.route('/submit_project',methods=['POST'])
+def submit_project():
+    try:
+        if not request.json:
+            return jsonify({'status': 'failure', 'data':'Something went wrong!'})
+        else:
+            queryResult=submitProjectDetails(request.json,mongo)
+            return queryResult
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify({'status': 'failure', 'data': 'Something went wrong!'})
+
+@app.route('/get_projects', methods=['GET'])
+def get_projects():
+    try:
+        queryResult=getProjectList(request.args.get('id'),mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/get_all_projects', methods=['GET'])
+def get_all_projects():
+    try:
+        queryResult=getAllProjectList(mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/get_project_details',methods=['GET'])
+def get_project_details():
+    try:
+        queryResult=getProjectDetails(request.args.get('id'),mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/create_po',methods=['POST'])
+def create_po():
+    try:
+        data=request.form.to_dict(flat=True)
+        queryResult=createPOService(data,app,mongo)
+        return queryResult
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify({'status': 'failure', 'data': 'Something went wrong!'})
+
+@app.route('/create_po_pdf',methods=['GET'])
+def create_po_pdf():
+    try:
+        queryResult=createPoPdfService(request.args.get('id'),app,mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/get_po_pdf',methods=['GET'])
+def get_po_pdf():
+    try:
+        return send_from_directory(app.config['PO_PDF'], request.args.get('id')+'.pdf')
+        
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/get_po_approvals',methods=['GET'])
+def get_po_approvals():
+    try:
+        queryResult=getPOPendingLisForApprovals(request.args.get('id'),mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/get_voucher_approvals',methods=['GET'])
+def get_voucher_approvals():
+    try:
+        queryResult=getVoucherPendingLisForApprovals(request.args.get('id'),mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/approveDeclinePO',methods=['POST'])
+def approveDeclinePO():
+    try:
+        if not request.json:
+            return jsonify({'status': 'failure', 'data':'Something went wrong!'})
+        else:
+            queryResult=approveDeclinePOService(request.json,mongo,app)
+            return queryResult
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify({'status': 'failure', 'data': 'Something went wrong!'})
+
+@app.route('/get_po_status_log',methods=['GET'])
+def get_po_status_log():
+    try:
+        queryResult=getPOStatusLogs(request.args.get('id'),mongo,app)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/get_voucher_status_log',methods=['GET'])
+def get_voucher_status_log():
+    try:
+        queryResult=getVoucherStatusLogsService(request.args.get('id'),mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/vendor_acceptance',methods=['POST'])
+def vendor_acceptance():
+    queryResult={}
+    try:
+        data=request.form.to_dict(flat=True)
+        queryResult=vendorAcceptanceService(request.files,data,app,mongo)
+        return queryResult
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify({'status': 'failure', 'data': 'Something went wrong!'})
+
+@app.route('/get_vouchers', methods=['GET'])
+def get_vouchers():
+    try:
+        queryResult=getVoucherList(request.args.get('id'),mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/get_all_vouchers', methods=['GET'])
+def get_all_vouchers():
+    try:
+        queryResult=getAllVoucherListService(mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/get_all_po',methods=['GET'])
+def get_all_po():
+    try:
+        queryResult=getAllPOListService(mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/get_voucher_type',methods=['GET'])
+def get_voucher_type():
+    try:
+        queryResult=getAllVoucherTypeListService(mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/get_budget_head',methods=['GET'])
+def get_budget_head():
+    try:
+        queryResult=getAllBudgetHeadListService(mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/get_tds_rate',methods=['GET'])
+def get_tds_rate():
+    try:
+        queryResult=getTDSRateListService(mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/create_voucher',methods=['POST'])
+def create_voucher():
+    try:
+        data=request.form.to_dict(flat=True)
+        queryResult=createVoucherService(request.files,data,app,mongo)
+        return queryResult
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/update_tds_rate',methods=['POST'])
+def update_tds_rate():
+    try:
+        if not request.json:
+            return jsonify({'status': 'failure', 'data':'Something went wrong!'})
+        else:
+            queryResult=updateVoucherTDSService(request.json,mongo)
+            return queryResult
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify({'status': 'failure', 'data': 'Something went wrong!'})
+
+@app.route('/get_voucher_details',methods=['GET'])
+def get_voucher_details():
+    try:
+        queryResult=getVoucherDetails(request.args.get('id'),mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/voucher_print_count',methods=['GET'])
+def voucher_print_count():
+    try:
+        queryResult=getVoucherDetailsPrintCount(request.args.get('id'),mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/fetch_voucher_analytics',methods=['GET'])
+def fetch_voucher_analytics():
+    try:
+        queryResult=getVoucherAnalyticsDataService(request.args.get('fromDate'),request.args.get('toDate'),mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/get_senior_list',methods=['GET'])
+def get_senior_list():
+    try:
+        queryResult=getVoucherApprovalUserReportService(mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/get_senior_details',methods=['GET'])
+def get_senior_details():
+    try:
+        queryResult=getSeniorDetailsService(request.args.get('emp_key'),mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        return jsonify([])
+
+@app.route('/upload_senior_details',methods=['POST'])
+def upload_senior_details():
+    try:
+        if not request.json:
+            return jsonify({'status': 'failure', 'data':'Something went wrong!'})
+        else:
+            queryResult=uploadSeniorDetailsService(request.json,mongo)
+            return jsonify(queryResult)
+    except Exception as err:
+        return jsonify({'status': 'failure', 'data': 'Something went wrong!'})
+
+@app.route('/approve_decline_voucher',methods=['POST'])
+def approve_decline_voucher():
+    try:
+        if not request.json:
+            return jsonify({'status': 'failure', 'data':'Something went wrong!'})
+        else:
+            queryResult=approveDeclineVoucherService(request.json,mongo,app)
+            return queryResult
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify({'status': 'failure', 'data': 'Something went wrong!'})
+
+@app.route('/update_voucher_date',methods=['POST'])
+def update_voucher_date():
+    try:
+        if not request.json:
+            return jsonify({'status': 'failure', 'data':'Something went wrong!'})
+        else:
+            queryResult=updateVoucherDateService(request.json,mongo)
+            return queryResult
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify({'status': 'failure', 'data': 'Something went wrong!'})
+
+@app.route('/submitted_voucher_copy',methods=['GET'])
+def submitted_voucher_copy():
+    try:
+        queryResult=submittedVoucherCopyService(request.args.get('id'),mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        return jsonify({'status': 'failure', 'data': 'Something went wrong!'})
+
+@app.route('/delete_voucher',methods=['GET'])
+def delete_voucher():
+    try:
+        queryResult=deleteVoucherService(request.args.get('id'),mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        return jsonify({'status': 'failure', 'data': 'Something went wrong!'})
+
+@app.route('/delete_voucher_file',methods=['POST'])
+def delete_voucher_file():
+    try:
+        if not request.json:
+            return jsonify({'status': 'failure', 'message':'Something went wrong!'})
+        else:
+            queryResult=delete_voucher_file_service(request.json,mongo)
+            return queryResult
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify({'status': 'failure', 'message': 'Something went wrong!'})
+
+@app.route('/genrate_asset_id',methods=['POST'])
+def genrate_asset_id():
+    try:
+        if not request.json:
+                return jsonify([])
+        else:
+            queryResult=genrateAssetCode(request.json,mongo)
+            return jsonify([queryResult])
+    except Exception as err:
+        return jsonify([])
+
+@app.route('/get_asset_category',methods=['GET'])
+def get_asset_category():
+    try:
+        queryResult=getAssetCategoryList(mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        return jsonify([])
+
+@app.route('/getAllAssetsList',methods=['GET'])
+def getAllAssetsList():
+    try:
+        queryResult=getAllAssetsListService(mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        return jsonify([])
+
+@app.route('/get_approved_voucher_report',methods=['GET'])
+def get_approved_voucher_report():
+    try:
+        queryResult=getVoucherReportDataService(request.args.get('fromDate'),request.args.get('toDate'),mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/get_mis_report',methods=['GET'])
+def get_mis_report():
+    try:
+        queryResult=getVoucherMISReportDataService(request.args.get('fromDate'),request.args.get('toDate'),mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/get_mou_report',methods=['GET'])
+def get_mou_report():
+    try:
+        queryResult=getMouReportDataService(request.args.get('fromDate'),request.args.get('toDate'),mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/get_tds_report',methods=['GET'])
+def get_tds_report():
+    try:
+        queryResult=getTdsReportDataService(request.args.get('fromDate'),request.args.get('toDate'),mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/get_tally_report',methods=['GET'])
+def get_tally_report():
+    try:
+        queryResult=getTallyReportDataService(request.args.get('fromDate'),request.args.get('toDate'),mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/get_depriciation_report',methods=['POST'])
+def get_depriciation_report():
+    try:
+        if not request.json:
+                return jsonify([])
+        else:
+            queryResult=getDepriciationReportService(request.json,app,mongo)
+            return jsonify([queryResult])
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify([])
+
+@app.route('/update_report_asset_details',methods=['POST'])
+def update_report_asset_details():
+    try:
+        if not request.json:
+                return jsonify({'status':'failure','message':'Something went wrong!'})
+        else:
+            queryResult=updateAssetReportDetailsService(request.json,mongo)
+            return jsonify(queryResult)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'login'},mongo)
+        return jsonify({'status':'failure','message':'Something went wrong!'})
+
+@app.route('/get_all_users',methods=['GET'])
+def get_all_users():
+    try:
+        queryResult=getAllUserList(mongo)
+        return jsonify(queryResult)
+    except Exception as err:
+        print(err)
+
+@app.route('/d_l/<uid>',methods=['GET'])
+def direct_login(uid):
+    response={}
+    try:
+        user_lst=getUserDetails(uid,mongo)
+        if len(user_lst)!=0:
+            timestamp=int(datetime.now().timestamp()*1000)
+            
+            name=""
+            approval_track_vms="no"
+            onboard_id=user_lst[0]['key']
+            token=""
+
+            if 'first_name' in user_lst[0]:
+                name=user_lst[0]['first_name']
+
+            if "approval_track_vms" in user_lst[0]:
+                approval_track_vms= user_lst[0]["approval_track_vms"]
+            
+            try:
+                token_string = user_lst[0]['personal_email_id']+str(123456)+str(timestamp)
+                token_string_bytes = token_string.encode("ascii")
+                
+                base64_bytes = base64.b64encode(token_string_bytes)
+                token = base64_bytes.decode("ascii")
+            except Exception as err:
+                print('===',err)
+
+            response={"status":"Ok","user_name":name,"approval_track_vms":approval_track_vms,"onboard_id":onboard_id,"token":token}
+        else:
+            response={"status":"Error"}
+    except Exception as err:
+        response={"status":"Error"}
+        print(err)
+    
+    return jsonify(response)
+
+# Fetch Uploaded files
+@app.route('/uploads/<filename>')
+def upload(filename):
+    return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
+
+
+
+if __name__ == '__main__':
+    app.run(host="0.0.0.0", port=PORT,debug=True)
+
+# created_lst=list(mongo['expense_detail'].aggregate([
+#     {"$group" : { "_id": "$created_on", "count": { "$sum": 1 } } },
+#     {"$match": {"_id" :{ "$ne" : None } , "count" : {"$gt": 1} } }, 
+#     {"$project": {"name" : "$_id", "_id" : 0} }
+# ]))
+# i=0
+# print("started")
+# for created_on in created_lst:
+#     i+=1
+#     docs=list(mongo['expense_detail'].find({'added_from':{'$exists':True},'is_deleted':False,'created_on':created_on['name']}))
+#     doc_id=""
+#     remark=""
+#     amount=0
+#     expense_date=0
+#     for index,doc in enumerate(docs):
+        
+#         if index==0:
+#             exp_lst=list(mongo['expense_request'].find({'expenseKey':doc['expenseKey'],'status':'PENDING'}))
+#             if len(exp_lst)==0:
+#                 break
+#             doc_id=doc['expenseKey']
+#             remark=doc['remark']
+#             amount=doc['amount']
+#             expense_date=doc['expense_date']
+#         elif doc_id==doc['expenseKey'] and expense_date==doc['expense_date'] and remark==doc['remark'] and amount==doc['amount']:
+#             print(doc['expenseKey'],created_on['name'])
+#             mongo['expense_detail'].update_one({'_id':doc['_id']},{'$set':{'is_deleted':True,'created_on':(created_on['name']+index+1)}})
+# print("completed")
+

BIN
far.xlsx


BIN
po_pdf/.DS_Store


BIN
po_pdf/5faba52895bad6215a324808.pdf


BIN
po_pdf/603628383953495ac6711147.pdf


BIN
po_pdf/6036289f3953495ac67111a5.pdf


BIN
po_pdf/603f51bf3953495ac6b3aa57.pdf


BIN
po_pdf/603f528d3953495ac6b3ae16.pdf


BIN
po_pdf/60d983d13953495ac639dbcf.pdf


BIN
po_pdf/613881a880b34c1886f9afec.pdf


BIN
po_pdf/Formate-2-5.pdf


BIN
po_pdf/infra_tc.pdf


+ 154 - 0
requirements.txt

@@ -0,0 +1,154 @@
+altair==4.1.0
+ansicolors==1.1.8
+anyio==2.2.0
+appnope==0.1.2
+argon2-cffi==20.1.0
+astroid==2.4.2
+async-generator==1.10
+attrs==20.3.0
+Babel==2.9.0
+backcall==0.2.0
+bleach==3.3.0
+camelot-py==0.8.2
+certifi==2020.6.20
+cffi==1.14.5
+chardet==3.0.4
+ci-info==0.2.0
+click==7.1.2
+configobj==5.0.6
+configparser==5.0.2
+cryptography==3.4.7
+cycler==0.10.0
+decorator==4.4.2
+defusedxml==0.7.1
+distro==1.5.0
+dnspython==2.0.0
+dominate==2.5.1
+entrypoints==0.3
+et-xmlfile==1.1.0
+etelemetry==0.2.2
+eventlet==0.25.1
+filelock==3.0.12
+fitz==0.0.1.dev2
+Flask==1.1.2
+Flask-Bootstrap==3.3.7.1
+Flask-Cors==3.0.8
+Flask-SocketIO==4.2.1
+fpdf==1.7.2
+future==0.18.2
+greenlet==0.4.15
+httplib2==0.19.1
+idna==2.10
+importlib-metadata==3.7.3
+ipykernel==5.5.0
+ipython==7.21.0
+ipython-genutils==0.2.0
+ipywidgets==7.6.3
+isodate==0.6.0
+isort==4.3.21
+itsdangerous==1.1.0
+jedi==0.18.0
+Jinja2==2.11.2
+joblib==1.0.1
+json5==0.9.5
+jsonschema==3.2.0
+jupyter==1.0.0
+jupyter-client==6.1.12
+jupyter-console==6.4.0
+jupyter-core==4.7.1
+jupyter-packaging==0.7.12
+jupyter-server==1.4.1
+jupyterlab==3.0.12
+jupyterlab-pygments==0.1.2
+jupyterlab-server==2.3.0
+jupyterlab-widgets==1.0.0
+kiwisolver==1.3.1
+lazy-object-proxy==1.4.3
+lux-api==0.2.3
+lux-widget==0.1.4
+lxml==4.6.3
+MarkupSafe==1.1.1
+matplotlib==3.3.4
+mccabe==0.6.1
+mistune==0.8.4
+monotonic==1.5
+nbclassic==0.2.6
+nbclient==0.5.3
+nbconvert==6.0.7
+nbformat==5.1.2
+nest-asyncio==1.5.1
+networkx==2.6.2
+nibabel==3.2.1
+nipype==1.6.1
+notebook==6.3.0
+numpy==1.18.1
+opencv-python==4.5.2.54
+openpyxl==3.0.7
+packaging==20.9
+paho-mqtt==1.5.0
+pandas==1.2.3
+pandocfilters==1.4.3
+parso==0.8.1
+pathlib==1.0.1
+pdfminer.six==20201018
+pexpect==4.8.0
+pickleshare==0.7.5
+Pillow==8.1.2
+prometheus-client==0.9.0
+prompt-toolkit==3.0.18
+prov==2.0.0
+ptyprocess==0.7.0
+pycparser==2.20
+pydot==1.4.2
+pyfcm==1.5.1
+Pygments==2.8.1
+pylint==2.5.3
+pymongo==3.11.0
+PyMuPDF==1.18.16
+pyodbc==4.0.30
+pyparsing==2.4.7
+PyPDF2==1.26.0
+pyrsistent==0.17.3
+python-dateutil==2.8.1
+python-engineio==3.11.2
+python-etcd==0.4.5
+python-socketio==4.4.0
+pytz==2019.3
+pyxnat==1.4
+pyzmq==22.0.3
+qtconsole==5.0.3
+QtPy==1.9.0
+rdflib==6.0.0
+requests==2.24.0
+schedule==1.1.0
+scikit-learn==0.24.1
+scipy==1.6.1
+seaborn==0.11.1
+Send2Trash==1.5.0
+simplejson==3.17.3
+six==1.12.0
+sniffio==1.2.0
+sortedcontainers==2.4.0
+tabula-py==2.2.0
+tabulate==0.8.9
+terminado==0.9.3
+testpath==0.4.4
+threadpoolctl==2.1.0
+toml==0.10.1
+toolz==0.11.1
+tornado==6.1
+traitlets==5.0.5
+traits==6.2.0
+typed-ast==1.4.1
+typing-extensions==3.7.4.3
+urllib3==1.25.9
+visitor==0.1.3
+wcwidth==0.2.5
+webencodings==0.5.1
+Werkzeug==0.16.0
+widgetsnbextension==3.5.1
+wrapt==1.12.1
+XlsxWriter==1.3.7
+xlwt==1.3.0
+yapf==0.30.0
+zipp==3.4.1

BIN
service/__pycache__/asset_service.cpython-37.pyc


BIN
service/__pycache__/fetch_master_service.cpython-37.pyc


BIN
service/__pycache__/project_service.cpython-37.pyc


BIN
service/__pycache__/reports_service.cpython-37.pyc


BIN
service/__pycache__/vendor_service.cpython-37.pyc


BIN
service/__pycache__/voucher_approval_service.cpython-37.pyc


BIN
service/__pycache__/voucher_list.cpython-37.pyc


+ 77 - 0
service/asset_service.py

@@ -0,0 +1,77 @@
+from dao.asset_dao import *
+from datetime import datetime
+
+def genrateAssetCode(data,mongo):
+    asset_code=[]
+    try:
+        asset_type=str(data['asset_type'])
+        place=str(data['place'])
+        qty=int(data['qty'])
+        count={}
+        for counter in range(1,qty+1): 
+            asset_count=create_asset_id(asset_type,count,mongo) 
+            
+            asset_code.append("KEF_"+((place).upper())[:3]+"_"+((asset_type).upper())[:3]+"_"+asset_count)
+            if asset_type in count:
+                count[asset_type]=count[asset_type]+1
+            else:
+                count[asset_type]=1
+    except Exception as err:
+        pass
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        
+    return asset_code
+
+def create_asset_id(asset_type,count,mongo):
+    asset_count = ''
+    try:
+        asset_count = getInserterdAssetsCount(asset_type, mongo)
+        if asset_type in count:
+            asset_count=count[asset_type]+asset_count
+
+        asset_count = str(asset_count + 1) if asset_count + 1 > 9 else '0' + str(asset_count +1)
+    except Exception as err:
+        print(err)
+
+    return asset_count
+
+def getAllAssetsListService(mongo): # 
+    queryResult=[]
+    try:
+        queryResult=getAllAssetsListDao(mongo)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult=[]
+
+    return queryResult
+
+def getAssetCategoryList( mongo):  # Validate email id and password
+    queryResult = []
+    try:
+        queryResult = getAssetCategoryListDao(mongo)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult = []
+
+    return queryResult
+
+def updateAssetReportDetailsService(data,mongo):
+    response={'status':'failure','message':'Something went wrong!'}
+    try:
+        update_obj={}
+        if 'type' in data and data['type']=='sale':
+            update_obj['sale']=True
+            update_obj['sale_amount']=int(data['amount'])
+            update_obj['sale_at']=int(datetime.now().timestamp()*1000)
+        elif 'type' in data and data['type']=='write-off':
+            update_obj['write_off']=True
+            update_obj['write_off_amount']=int(data['amount'])
+            update_obj['write_off_at']=int(datetime.now().timestamp()*1000)
+
+        response={'status':'success','message':'Updated successfully!'}
+        updateAssetReportDetailsDao(data['asset_id'],update_obj,mongo)
+    except Exception as err:
+        print(err)
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        
+    return response

+ 30 - 0
service/fetch_master_service.py

@@ -0,0 +1,30 @@
+from dao.fetch_master_dao import *
+
+def getAllVoucherTypeListService(mongo):
+    queryResult = []
+    try:
+        queryResult = getAllVoucherTypeListDao(mongo)
+    except Exception as err:
+        queryResult = []
+
+    return queryResult
+
+def getAllBudgetHeadListService(mongo):
+    queryResult = []
+    try:
+        queryResult = getBudgetHeadListDao(mongo)
+    except Exception as err:
+        queryResult = []
+
+    return queryResult
+
+def getTDSRateListService(mongo):
+    queryResult = []
+    try:
+        queryResult = getTDSRateListDao(mongo)
+    except Exception as err:
+        queryResult = []
+
+    return queryResult
+
+

+ 952 - 0
service/project_service.py

@@ -0,0 +1,952 @@
+from dao.project_dao import *
+from dao.vendor_dao import getVendorDetailsDao
+from utils.error_log import insert_into_error_log
+from utils.UploadImage import uploadImagetoFolder
+from datetime import datetime
+from fpdf import FPDF
+import os
+import time
+from PyPDF2 import PdfFileMerger, PdfFileReader
+from utils.Email import sendEmail
+
+
+def addProjectService(files, data, app, mongo):
+    queryResult = {}
+    try:
+        insert_doc = {
+            'id': '',
+            'user_id': '',
+            'project_name': '',
+            'intervention': '',
+            'project_type': '',
+            'mou_expiry': 0,
+            'quotations': [],
+            'amount':0,
+            'maintainence_amount_limit': False,
+            'amount_limit': False,
+            'req_exception':False,
+            'status': 'SAVED'
+        }
+
+        insert_doc['project_name'] = data['p_name']  # Project Name
+        insert_doc['intervention'] = data['intervention']  # Intervention
+        insert_doc['project_type'] = data['p_type']  # Project Type
+
+        if data['id'] == '0':
+            insert_doc['po_submitted'] = False
+            insert_doc['created_on'] = int(datetime.now().timestamp() * 1000)
+        else:
+            insert_doc['updated_on'] = int(datetime.now().timestamp() * 1000)
+
+        suffix = []
+        for key in data:
+            if key.startswith('v_name'):
+                suffix.append(key[len('v_name'):])
+
+        quotations = []
+        # Upload quotations
+        for value in suffix:
+            append = False
+            quote = {'v_name': '', 'exception': '', 'note': ''}
+            if 'v_name' + str(value) in data and data['v_name' +
+                                                      str(value)] != '':
+                append = True
+                quote['v_name'] = data['v_name' + str(value)]
+
+            if 'exception' + str(value) in data:
+                quote['exception'] = True
+            else:
+                quote['exception'] = False
+
+            if 'note' + str(value) in data:
+                quote['note'] = data['note' + str(value)]
+
+            if 'quote_file' + str(value) in files:
+                quote_file = (files['quote_file' + str(value)])
+                quotImageResponse = uploadImagetoFolder(
+                    quote_file, 'quote_' + str(value), app)
+                if quotImageResponse['status'] == 'success':
+                    quote['quote_file'] = quotImageResponse['message']
+                # quoteImageResponse=uploadImagetoFolder(quote_file,'QUOT_')
+            if append == True:
+                quotations.append(quote)
+
+        insert_doc['quotations'] = quotations
+
+        if 'mou_expiry' in data and data['mou_expiry'] != '':
+            mou_expiry = data['mou_expiry']  # MOU Expiry
+            insert_doc['mou_expiry'] = (int(
+                datetime.strptime(str(mou_expiry),
+                                  "%m/%d/%Y").strftime('%s'))) * 1000
+
+        if 'id' in data:
+            insert_doc['id'] = data['id']
+        if 'user_id' in data:
+            insert_doc['user_id'] = data['user_id']
+
+        if 'maintainence_amount_limit' in data:
+            insert_doc['maintainence_amount_limit'] = True
+
+        if 'amount_limit' in data:
+            insert_doc['amount_limit'] = True
+
+        if 'req_exception' in data:
+            insert_doc['req_exception'] = True
+
+        if 'req_exception_note' in data:
+            insert_doc['req_exception_note'] = data['req_exception_note']
+        
+        file_found=False
+        # Upload MOU File
+        if 'mou' in files:    
+            mou_file = files['mou']
+            mouImageResponse = uploadImagetoFolder(mou_file, 'mou_', app)
+            if mouImageResponse['status'] == 'success':
+                file_found=True
+                insert_doc['mou_file'] = mouImageResponse['message']
+
+        # Upload Comparative Statement
+        if 'comparative_statement' in files:
+            comparative_statement_file = files['comparative_statement']
+            compImageResponse = uploadImagetoFolder(comparative_statement_file,
+                                                    'comparative_statement',
+                                                    app)
+            if compImageResponse['status'] == 'success':
+                insert_doc['comparative_statement'] = compImageResponse[
+                    'message']
+
+        # For Opex Donation
+        if data['p_type'] == 'opex_donation':
+            if 'registration_copy' in files:
+                # Upload registration_copy
+                registration_copy_file = files['registration_copy']
+                regImageResponse = uploadImagetoFolder(registration_copy_file,
+                                                       'reg_', app)
+                if regImageResponse['status'] == 'success':
+                    insert_doc['registration_copy'] = regImageResponse[
+                        'message']
+
+            if 'deed_copy' in files:
+                # Upload deed_copy
+                deed_copy_file = files['deed_copy']
+                deedImageResponse = uploadImagetoFolder(
+                    deed_copy_file, 'deed_', app)
+                if deedImageResponse['status'] == 'success':
+                    insert_doc['deed_copy'] = deedImageResponse['message']
+
+            if '80_g_copy' in files:
+                # Upload 80_g_copy
+                G80_file = files['80_g_copy']
+                g80ImageResponse = uploadImagetoFolder(G80_file, '80g_', app)
+                if g80ImageResponse['status'] == 'success':
+                    insert_doc['80g_copy'] = g80ImageResponse['message']
+
+            if '12_a_copy' in files:
+                # Upload 12_a_copy
+                a12_file = files['12_a_copy']
+                a12ImageResponse = uploadImagetoFolder(a12_file, '12a_', app)
+                if a12ImageResponse['status'] == 'success':
+                    insert_doc['12a_copy'] = a12ImageResponse['message']
+
+            if 'audit_sheet' in files:
+                # Upload audit_sheet
+                audit_sheet_file = files['audit_sheet']
+                auditImageResponse = uploadImagetoFolder(
+                    audit_sheet_file, 'audit_', app)
+                if auditImageResponse['status'] == 'success':
+                    insert_doc['audit_sheet'] = auditImageResponse['message']
+
+            if 'board_resolution' in files:
+                # Upload board_resolution
+                board_resolution_file = files['board_resolution']
+                boardImageResponse = uploadImagetoFolder(
+                    board_resolution_file, 'board_', app)
+                if boardImageResponse['status'] == 'success':
+                    insert_doc['board_resolution'] = boardImageResponse[
+                        'message']
+
+            if 'donation_letter' in files:
+                # Upload donation_letter
+                donation_letter_file = files['donation_letter']
+                donationImageResponse = uploadImagetoFolder(
+                    donation_letter_file, 'donation_', app)
+                if donationImageResponse['status'] == 'success':
+                    insert_doc['donation_letter'] = donationImageResponse[
+                        'message']
+
+        if 'amount' in data:
+            insert_doc['amount']=float(data['amount'])
+        
+        insert_into_db=True
+        
+        if insert_doc['req_exception']==False or float(insert_doc['amount'])>=25000 or float(insert_doc['amount'])>=100000:
+            # Mou file and PO is mandatory
+            if file_found==False or insert_doc['mou_expiry']==0:
+                insert_into_db=False
+
+        if insert_into_db==True:
+            insertIntoProjectMaster(insert_doc, mongo)
+
+            queryResult = {
+                'status': 'success',
+                'message': 'Requirement added successfully!'
+            }
+        else:
+            queryResult = {
+                'status': 'failure',
+                'message': 'Mou file and expiry is mandatory!'
+            }
+    except Exception as err:
+        queryResult = {'status': 'failure', 'message': 'Something went wrong!'}
+        print(err)
+
+    return queryResult
+
+def getProjectList(u_id, mongo):  # Validate email id and password
+    queryResult = []
+    try:
+        queryResult = getProjectListByUID(u_id, mongo)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult = []
+
+    return queryResult
+
+def getAllProjectList(mongo):  # Validate email id and password
+    queryResult = []
+    try:
+        queryResult = getAllProjectListDao(mongo)
+    except Exception as err:
+        queryResult = []
+
+    return queryResult
+
+def getPOPendingLisForApprovals(u_id,mongo):
+    queryResult = []
+    try:
+        queryResult = getPendingPOForApprovalDao(u_id, mongo)
+    except Exception as err:
+        queryResult = []
+
+    return queryResult
+
+def getProjectDetails(id, mongo):  # Validate email id and password
+    queryResult = []
+    try:
+        queryResult = getProjectDetailsDao(id, mongo)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult = []
+
+    return queryResult
+
+def submitProjectDetails(request_obj, mongo):  # Submit Project
+    queryResult = {}
+    try:
+        submitProjectDao(request_obj, mongo)
+        queryResult = {
+            'status': 'success',
+            'message': 'Requirement submitted successfully!'
+        }
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult = {'status': 'failure', 'message': 'Something went wrong!'}
+
+    return queryResult
+
+def approveDeclinePOService(request_obj,mongo,app):
+    queryResult={}
+    try:
+        update_obj={}
+        flag=request_obj['status']
+        po_details=getProjectDetailsDao(request_obj['po_id'],mongo)
+        remark=request_obj["reason"]
+        seniorId=request_obj['user_id']
+        timestamp=int(datetime.now().timestamp())*1000
+        approverName = ""
+        approverLevel = ""
+        approverId = ""
+        approvalTrackLevel = ""
+        
+        for po in po_details:
+            user_id=po['user_id']
+            seniorLevel1=po['approval_track']['senior_level_1']
+            seniorLevel2=po['approval_track']['senior_level_2']
+            seniorLevel3=po['approval_track']['senior_level_3']
+                    
+            # if senior id = senior level1
+            if seniorLevel1["id"]==seniorId:
+                approverName = seniorLevel1["name"]
+                approverId = seniorLevel1["id"]
+                approverLevel = seniorLevel1["level"]
+                approvalTrackLevel = "senior_level_1"
+
+                #  If expense approved
+                if flag=="APPROVED":
+                    if seniorLevel2["id"]=="NA":
+                        if seniorLevel3["id"]=="NA":
+                            update_obj["po_status"]=flag
+                            create_email(po,"APPROVED",approverName,approverLevel,mongo,app)
+                        else:
+                            update_obj["approval_track.senior_level_3.status"]= "PENDING"
+                    else:
+                        update_obj["approval_track.senior_level_2.status"]= "PENDING"
+                
+            #  if senior id = senior level2
+            if seniorLevel2["id"]==seniorId:
+                approverName = seniorLevel2["name"]
+                approverId = seniorLevel2["id"]
+                approverLevel = seniorLevel2["level"]
+                approvalTrackLevel = "senior_level_2"
+
+                #  If expense approved
+                if flag=="APPROVED":
+                    if seniorLevel3["id"]=="NA":
+                        update_obj["po_status"]=flag
+                        create_email(po,"APPROVED",approverName,approverLevel,mongo,app)
+                    else:
+                        update_obj["approval_track.senior_level_3.status"]= "PENDING"
+                    
+            # if senior id = senior level3
+            if seniorLevel3["id"]==seniorId:
+                approverName = seniorLevel3["name"]
+                approverId = seniorLevel3["id"]
+                approverLevel = seniorLevel3["level"]
+                approvalTrackLevel = "senior_level_3"
+
+                #  If expense approved
+                if flag=="APPROVED":
+                    update_obj["po_status"]=flag
+                    create_email(po,"APPROVED",approverName,approverLevel,mongo,app)
+            
+            update_obj["approval_track." + approvalTrackLevel + ".status"]=flag
+            update_obj["approval_track." + approvalTrackLevel + ".info"]={"status":flag,"remark":remark,"updated_on":timestamp}
+
+            # for disapproved
+            if flag=="DECLINED":
+                update_obj["po_status"]= "DECLINED"
+                
+            # Status Log 
+            approval_status={
+                "user_id":user_id,
+                "po_id":request_obj['po_id'],
+                "timestamp":timestamp,
+                "action":flag,
+                "approver_name":approverName,
+                "approver_level":approverLevel,
+                "approver_id":approverId,
+                "type":"approval",
+                "remark":remark
+            }
+
+            # Update Purchase Order
+            updatePurchaseOrderApprovalStatus(update_obj,request_obj['po_id'],mongo) 
+
+            # Insert into PO-status-log
+            insertPOStatusLog(approval_status,mongo)
+
+        queryResult = {
+            'status': 'success',
+            'message': 'Purchase Order '+flag+' successfully!'
+        }
+    except Exception as err:
+        queryResult = {
+            'status': 'failure',
+            'message': 'Something went wrong!'
+        }
+        print(err)
+
+    return queryResult
+
+def createPOService(data,app, mongo):
+    queryResult = {}
+    try:
+        timestamp=int(datetime.now().timestamp())*1000
+        total_amount = 0
+        user_id=""
+        insert_doc = {
+            'po_year': (str(time.strftime("%y", time.localtime())) + '-' +
+                        str(int(time.strftime("%y", time.localtime())) + 1)),
+            'po_status':'PENDING'
+        }
+
+        if 'id' in data and data['id'] != '0':
+            project_id = data['id']
+
+            order_id = ''
+            
+            suffix = []
+            for key in data:
+                if key.startswith('product_dec'):
+                    suffix.append(key[len('product_dec'):])
+
+            od = []
+            # Upload Order Details
+            for value in suffix:
+                append = False
+                quote = {
+                    'product_dec': '',
+                    'product_qty': '',
+                    'product_amount': '',
+                    'product_gst': ''
+                }
+                if 'product_dec' + str(value) in data and data[
+                        'product_dec' + str(value)] != '':
+                    append = True
+                    quote['product_dec'] = data['product_dec' + str(value)]
+
+                if 'product_qty' + str(value) in data:
+                    quote['product_qty'] = int(data['product_qty' +
+                                                    str(value)])
+
+                if 'product_amount' + str(value) in data:
+                    quote['product_amount'] = float(data['product_amount' +
+                                                       str(value)])
+                                                
+                if 'product_gst' + str(value) in data:
+                    quote['product_gst'] = float(data['product_gst' +
+                                                       str(value)])
+
+
+                if append == True:
+                    od.append(quote)
+
+            insert_doc['po_created_on'] = int(datetime.now().timestamp() *1000)
+            insert_doc['od'] = od
+            insert_doc['po_submitted'] = True
+            
+            if 'po_note' in data:
+                insert_doc['po_note']=data['po_note']
+
+            # if 'product_gst' in data:
+            #     insert_doc['po_gst'] = int(data['product_gst'])
+
+            # if 'product_gst_amt' in data:
+            #     insert_doc['po_gst_amt'] = int(data['product_gst_amt'])
+
+            if 'p_additional_charges'  in data:
+                insert_doc['po_additional_charges'] = float(data['p_additional_charges'])
+
+            if 'product_total_amount' in data:
+                insert_doc['po_total_amount'] = float(data['product_total_amount' ])
+                total_amount += float(data['product_total_amount'])
+
+            # Fetch product details
+            project_details = getProjectDetailsDao(project_id, mongo)
+            for project in project_details:
+                order_id = project['intervention']+ '/'+ create_po_id(mongo)
+                user_id = project['user_id']
+                
+                insert_doc['approval_track']=getApprovalTrack(total_amount,user_id,mongo)
+
+            if 'vendors' in data and data['vendors'] != '':
+                vendor_id = data['vendors']  # MOU Expiry
+                insert_doc['vendor_id'] = vendor_id
+
+            if 'po_reason' in data and data['po_reason'] != '':
+                po_reason = data['po_reason']  # MOU Expiry
+                insert_doc['po_reason'] = po_reason
+
+            if 'MOP' in data and data['MOP'] != '':
+                MOP = data['MOP']  # MOU Expiry
+                insert_doc['MOP'] = MOP
+
+            if 'amount_words' in data and data['amount_words'] != '':
+                amount_words = data['amount_words']  # MOU Expiry
+                insert_doc['amount_words'] = amount_words
+
+            if 'po_mou_expiry' in data and data['po_mou_expiry'] != '':
+                po_mou_expiry = data['po_mou_expiry']  # MOU Expiry
+                insert_doc['po_mou_expiry'] = (int(
+                    datetime.strptime(str(po_mou_expiry),
+                                    "%m/%d/%Y").strftime('%s'))) * 1000
+
+            insert_doc['po_order_id'] = order_id
+            updatePurchaseOrder(insert_doc, project_id, mongo)
+
+            # Insert into PO-status-log
+            insertPOStatusLog({
+                    "user_id":user_id,
+                    "po_id":project_id,
+                    "timestamp":timestamp,
+                    "action":"SUBMITTED"
+                },mongo)
+
+            createPoPdfService(project_id,app,mongo)
+
+            queryResult = {
+                'status': 'success',
+                'message': 'Purchase order created successfully!'
+            }
+        else:
+            queryResult = {
+                'status': 'failure',
+                'message': 'Something went wrong!'
+            }
+    
+    except Exception as err:
+        queryResult = {'status': 'failure', 'message': 'Something went wrong!'}
+        print(err)
+
+    return queryResult
+
+def createPoPdfService(p_id, app, mongo):
+    queryResult = {}
+    try:
+        # fetch purchase order details
+        purchase_order = getProjectDetailsDao(p_id, mongo)
+        for order in purchase_order:
+            if 'vendor_id' in order:
+                vendor_id = order['vendor_id']
+                # Get Vendor Details
+                vendor_details = getVendorDetailsDao(vendor_id, mongo)
+                for vendor_detail in vendor_details:
+                    createPDF(app, order, vendor_detail)
+    except Exception as err:
+        queryResult = {'status': 'failure', 'message': 'Something went wrong!'}
+        print(err)
+
+def create_po_id(mongo):
+    order_id = ''
+    try:
+
+        po_year = (str(time.strftime("%y", time.localtime())) + '-' +
+                   str(int(time.strftime("%y", time.localtime())) + 1))
+        # get PO Year
+        db_year = getPOYear(mongo)
+        po_count = '01'
+        for year_obj in db_year:
+            if po_year == year_obj['year']:
+                # Fetch total PO created ID
+                po_count = getInserterdPoCount(po_year, mongo)
+                po_count = str(po_count +
+                               1) if po_count + 1 > 9 else '0' + str(po_count +
+                                                                     1)
+
+            else:
+                # insert new year object
+                insertPOYear(po_year, mongo)
+
+        order_id = (po_year + '/' + po_count)
+
+    except Exception as err:
+        print(err)
+
+    return order_id
+
+def getPOStatusLogs(po_id,mongo,app):
+    queryResult = []
+    try:
+        queryResult = getPOStatusLog(po_id, mongo)
+    except Exception as err:
+        queryResult = []
+
+    return queryResult
+
+def getLastAssignedSenior(senior_obj):
+    lastSeniorKey=''
+    try:
+        strToIntObj={int(k):v for k,v in senior_obj.items()}
+        lastSeniorKey=strToIntObj[sorted(strToIntObj)[-1]]
+    except Exception as err:
+        print(err)
+    
+    return lastSeniorKey
+
+def vendorAcceptanceService(files, data, app, mongo):
+    queryResult = {}
+    timestamp=int(datetime.now().timestamp())*1000
+    try:
+        po_id=data['id']
+        if po_id!="":
+            updateDoc={'vendor_action':'DECLINED','vendor_acceptance':True}
+            if 'vendor_action' in data:
+                updateDoc['vendor_action']=data['vendor_action']
+
+            # Upload Vendir Acceptance Proof
+            if 'vendor_acceptance_proof' in files:
+                vendor_acceptance_proof = files['vendor_acceptance_proof']
+                vendorImageResponse = uploadImagetoFolder(vendor_acceptance_proof, 'po_vendor_accpt_', app)
+                if vendorImageResponse['status'] == 'success':
+                    updateDoc['mou_file'] = vendorImageResponse['message']
+ 
+            updatePurchaseOrderApprovalStatus(updateDoc,po_id, mongo)
+
+            # Insert into PO-status-log
+            insertPOStatusLog({
+                    "user_id":data['user_id'],
+                    "po_id":po_id,
+                    "timestamp":timestamp,
+                    "type":"vendor_acceptance",
+                    "action":updateDoc['vendor_action']
+                },mongo)
+
+            queryResult = {
+                'status': 'success',
+                'message': 'Status Updated Successfully!'
+            }
+        else:
+            queryResult = {'status': 'failure', 'message': 'Invalid PO ID!'}
+    except Exception as err:
+        queryResult = {'status': 'failure', 'message': 'Something went wrong!'}
+        print(err)
+
+    return queryResult
+
+def getApprovalTrack(total_amount,user_id,mongo):
+    approval_track = {"senior_level_1":{},"senior_level_2":{},"senior_level_3":{}}
+    try:
+        # Fetch user Details from user master
+        user_list=getUserDetailsFromMaster(user_id,mongo)
+        
+        for user_obj in user_list:
+            sernior_level="expense_senior_level_5000_"
+            if total_amount>10000:
+                sernior_level="expense_senior_level_25000_"
+            
+            senior_level_1_key=getLastAssignedSenior(user_obj[sernior_level+'I'])
+            senior_level_1_name=user_obj[sernior_level+'I_name']
+            
+            senior_level_2_key=getLastAssignedSenior(user_obj[sernior_level+'II'])
+            senior_level_2_name=user_obj[sernior_level+'II_name']
+
+            senior_level_3_key=getLastAssignedSenior(user_obj[sernior_level+'III'])
+            senior_level_3_name=user_obj[sernior_level+'III_name']
+
+            approval_track['senior_level_1']={
+                    "level" : "Senior Level 1",
+                    "name" : senior_level_1_name,
+                    "id" : senior_level_1_key,
+                    "status" : "PENDING"
+                }
+            approval_track['senior_level_2']={
+                    "level" : "Senior Level 2",
+                    "name" : senior_level_2_name,
+                    "id" : senior_level_2_key,
+                    "status" : "NOT VISIBLE"
+                }
+            approval_track['senior_level_3']={
+                    "level" : "Senior Level 3",
+                    "name" : senior_level_3_name,
+                    "id" : senior_level_3_key,
+                    "status" : "NOT VISIBLE"
+                }
+            
+    except Exception as err:
+        print(err)
+
+    return approval_track
+
+def getAllPOListService(mongo):
+    queryResult = []
+    try:
+        queryResult = getPOList(mongo)
+    except Exception as err:
+        queryResult = []
+
+    return queryResult
+
+class MyFPDF(FPDF):
+    pass
+
+def createPDF(app, purchase_order, vendor_detail):
+    try:
+        order_id=""
+        po_created_on=""
+        po_note=""
+        po_mou_expiry=""
+        if 'po_order_id' in purchase_order:
+            order_id=purchase_order['po_order_id']
+
+        if 'po_created_on' in purchase_order:
+            po_created_on=datetime.fromtimestamp(int(purchase_order['po_created_on'])/1000).strftime("%d %B, %Y")
+
+        if 'po_note' in purchase_order:
+            po_note=purchase_order['po_note']
+
+        if 'po_mou_expiry' in purchase_order:
+            po_mou_expiry=datetime.fromtimestamp(int(purchase_order['po_mou_expiry'])/1000).strftime("%d %B, %Y")
+
+        authorised_by=""
+        try:
+            if "po_status" in purchase_order and purchase_order["po_status"]=="APPROVED" and 'approval_track' in purchase_order:
+                if 'senior_level_1' in purchase_order['approval_track'] and purchase_order['approval_track']['senior_level_1']['status']=="APPROVED":
+                    authorised_by=purchase_order['approval_track']['senior_level_1']['name']
+                if 'senior_level_2' in purchase_order['approval_track'] and purchase_order['approval_track']['senior_level_2']['status']=="APPROVED":
+                    authorised_by=purchase_order['approval_track']['senior_level_2']['name']
+                if 'senior_level_3' in purchase_order['approval_track'] and purchase_order['approval_track']['senior_level_3']['status']=="APPROVED":
+                    authorised_by=purchase_order['approval_track']['senior_level_3']['name']
+        except Exception as err:
+            print(err)
+
+        filepath = os.path.join(app.config['STATIC_IMG'], 'kef-logo.jpg')
+        pdf = MyFPDF(orientation='P', unit='mm', format='Letter')
+        # Effective page width, or just epw
+        epw = pdf.w - 6 * pdf.l_margin
+
+        pdf.set_left_margin(30)
+        pdf.add_page()
+        pdf.image(filepath, 70, 10, 70, 30)
+        
+        pdf.ln(30.00)
+        pdf.set_font('Times', '', 11)
+        pdf.multi_cell(epw, 3.81,
+            '1st Floor, North Side, Ujagar Compound, Adjacent to Deonar Bus Depot, Off. Sion Trombay Road, Deonar, Mumbai 400 088',
+           align='C' )
+
+        # Set Header
+        pdf.ln(15)
+        pdf.set_font('Times', '', 18)
+        pdf.cell(epw, 3.81, 'PURCHASE ORDER', align='C', border=0)
+
+        pdf.ln(8.81)
+        pdf.set_font('Times', 'U', 11)
+        pdf.cell(epw, 3.81, 'PO REF:', border=0)
+        pdf.set_xy(47.0, pdf.get_y())
+        pdf.set_font('Times', '', 11)
+        pdf.cell(epw, 3.81, order_id.upper(), border=0)
+
+        pdf.ln(3.81)
+        pdf.set_font('Times', 'U', 11)
+        pdf.cell(epw, 3.81, 'DATE:', border=0)
+        pdf.set_xy(43.0, pdf.get_y())
+        pdf.set_font('Times', '', 11)
+        pdf.cell(epw, 3.81, po_created_on.upper(), border=0)
+
+        pdf.ln(3.81)
+        pdf.set_font('Times', 'U', 11)
+        pdf.cell(epw, 3.81, 'YOUR REF:', border=0)
+        pdf.set_xy(52.0, pdf.get_y())
+        pdf.set_font('Times', '', 11)
+        pdf.cell(epw, 3.81, 'YOUR QUOTATION DATED '+po_mou_expiry.upper(), border=0)
+
+        pdf.ln(3.81)
+        pdf.set_font('Times', 'U', 11)
+        pdf.multi_cell(epw, 3.81, 'BILLING ADDRESS: KOTAK EDUCATION FOUNDATION, GR FLOOR & 1 S T FLOOR UJAGAR COMPOUND, DEONAR, MUMBAI: 400088', border=0)
+        # pdf.set_xy(67.0, pdf.get_y())
+        # pdf.set_font('Times', '', 11)
+        # pdf.cell(epw, 3.81,'',border=0)
+        # pdf.ln(3.81)
+        # pdf.cell(epw, 3.81, '', border=0)
+
+        # pdf.ln(3.81)
+        pdf.set_font('Times', 'U', 11)
+        pdf.multi_cell(epw, 3.81, 'SHIP TO: KOTAK EDUCATION FOUNDATION, GR FLOOR & 1 S T FLOOR UJAGAR COMPOUND, DEONAR, MUMBAI: 400088', border=0)
+        # pdf.set_xy(47.0, pdf.get_y())
+        # pdf.set_font('Times', '', 11)
+        # pdf.cell(epw, 3.81,'',border=0)
+        # pdf.ln(3.81)
+        # pdf.cell(epw, 3.81, '', border=0)
+
+        pdf.ln(12.81)
+        pdf.set_font('Times', 'BU', 11)
+        pdf.cell(epw, 3.81, 'TO BE ISSUED TO:', border=0)
+
+        pdf.ln(8.81)
+        pdf.set_font('Times', 'U', 11)
+        pdf.cell(epw, 3.81, 'VENDOR NAME:', border=0)
+        pdf.set_xy(62.0, pdf.get_y())
+        pdf.set_font('Times', '', 11)
+        pdf.cell(epw, 3.81, vendor_detail['v_name'].upper(), border=0)
+
+        pdf.ln(3.81)
+        pdf.set_font('Times', 'U', 11)
+        pdf.multi_cell(epw, 3.81, 'VENDOR ADDRESS: ' +vendor_detail['v_address'].upper(), border=0)
+        
+        pdf.set_font('Times', 'U', 11)
+        pdf.cell(epw, 3.81, 'VENDOR CODE:', border=0)
+        pdf.set_xy(60.0, pdf.get_y())
+        pdf.set_font('Times', '', 11)
+        pdf.cell(epw, 3.81, str(vendor_detail['v_code']), border=0)
+
+        # pdf.set_xy(10.0, 120.0)
+        pdf.ln(8.81)
+        pdf.set_font('Times', '', 11)
+        pdf.multi_cell(epw, 3.81,
+            'We hereby place this Purchase order on yourselves for supply of the following materials and delivery of the following services, as per terms and conditions given in this Purchase Order.',
+            border=0)
+
+        pdf.ln(8.81)
+        # pdf.set_right_margin(30)
+        pdf.set_font('Times', 'B', 11)
+        pdf.cell(epw, 3.81, 'MATERIAL / SERVICES ORDER', align='C', border=0)
+
+        pdf.ln(5.84)
+        # Add table
+        
+
+        # Set column width to 1/4 of effective page width to distribute content
+        # evenly across table and page
+        col_width = epw / 6
+
+        # Since we do not need to draw lines anymore, there is no need to separate
+        # headers from data matrix.
+
+        data = [['Sr no.', 'Product Description', 'Qty', 'Price','Gst','Amount']]
+
+        if 'od' in purchase_order:
+            i = 1
+            for order in purchase_order['od']:
+                data.append([
+                    i, order['product_dec'], order['product_qty'],
+                    order['product_amount'],order['product_gst'],(order['product_amount']*order['product_qty'])+order['product_gst']
+                ])
+                i += 1
+
+            data.append(['', 'Additional Charges', '','', purchase_order['po_additional_charges']])
+            # data.append(['', 'GST : '+ str(purchase_order['po_gst'])+'%', '','', purchase_order['po_gst_amt']])
+            data.append(['', 'Total Amount', '','', purchase_order['po_total_amount']])
+
+        # Text height is the same as current font size
+        th = pdf.font_size
+
+        pdf.set_font('Times', '', 11.0)
+
+        i = 1
+        
+        # Here we add more padding by passing 2*th as height
+        for row in data:
+            
+            ybefore=pdf.get_y()
+            # pdf.set_xy(col_width, 2 * th)
+            j=1
+            cell_margin=0
+            for datum in row:
+                if i == 1:
+                    pdf.set_font('Times', 'B', 11.0)
+                    
+                else:
+                    pdf.set_font('Times', '', 11.0)
+                
+                if j==2:
+                    
+                    pdf.multi_cell(68,3.81, str(datum),border=0)
+                    pdf.set_xy(cell_margin+(68)+pdf.l_margin, ybefore)
+                    cell_margin+=68
+                else:
+                    
+                    pdf.multi_cell(22,3.81, str(datum),border=0)
+                    pdf.set_xy(cell_margin+(22)+pdf.l_margin, ybefore)
+                    cell_margin+=22
+
+                j+=1
+                    # pdf.multi_cell(col_width, 2 * th, str(datum), border=1)
+                # Enter data in colums
+                
+            # ybefore=pdf.get_y()
+            i += 1
+            pdf.ln(2 * 3.81)
+
+
+        if 'intervention' in purchase_order and purchase_order['intervention']=='IT':
+            pdf.ln(8.81)
+            # pdf.set_right_margin(30)
+            pdf.set_font('Times', 'B', 11)
+            pdf.cell(epw, 3.81, 'DELIVERY TIMELINES', align='C', border=0)
+
+            pdf.ln(5.84)
+            col_width = epw / 7
+            it_data = [['Particulars', 'Quantity', 'Location', 'Mode of delivery','Delivery Timelines','Remarks'],
+            ['','','','','','',''],
+            ['','','','','','',''],
+            ['','','','','','','']]
+
+            # Text height is the same as current font size
+            th = pdf.font_size
+
+            pdf.set_font('Times', '', 11.0)
+
+            k = 1
+            
+            # Here we add more padding by passing 2*th as height
+            for it_row in it_data:
+                
+                ybefore=pdf.get_y()
+                # pdf.set_xy(col_width, 2 * th)
+                j=1
+                cell_margin=0
+                for datum in it_row:
+                    if k == 1:
+                        pdf.set_font('Times', 'B', 11.0)
+                        
+                    else:
+                        pdf.set_font('Times', '', 11.0)
+                    
+                    if j==1:
+                        
+                        pdf.multi_cell(68,3.81, str(datum),border=0)
+                        pdf.set_xy(cell_margin+(68)+pdf.l_margin, ybefore)
+                        cell_margin+=68
+                    else:
+                        
+                        pdf.multi_cell(22,3.81, str(datum),border=0)
+                        pdf.set_xy(cell_margin+(22)+pdf.l_margin, ybefore)
+                        cell_margin+=22
+
+                    j+=1
+                        # pdf.multi_cell(col_width, 2 * th, str(datum), border=1)
+                    # Enter data in colums
+                    
+                # ybefore=pdf.get_y()
+                k += 1
+                pdf.ln(2 * 3.81)
+
+
+        pdf.set_font('Times', '', 11)
+        # pdf.set_xy(10.0, 236.0)
+        pdf.ln(3.81)
+        pdf.cell(epw, 3.81,
+            '*Note: '+po_note,
+            border=0)
+
+        pdf.ln(8.81)
+        pdf.cell(epw, 3.81,'Authorised Signatory',border=0)
+
+        pdf.ln(3.81)
+        pdf.cell(epw, 3.81,authorised_by,border=0)
+            
+
+        # ======== Write File ==========
+        pdf.output(os.path.join(app.config['PO_PDF'], purchase_order['id']+'.pdf'), 'F')
+
+        # Call the PdfFileMerger
+        mergedObject = PdfFileMerger()
+        
+        # I had 116 files in the folder that had to be merged into a single document
+        # Loop through all of them and append their pages
+        mergedObject.append(PdfFileReader(os.path.join(app.config['PO_PDF'], purchase_order['id']+'.pdf'), 'rb'))
+        
+        if 'intervention' in purchase_order and purchase_order['intervention']=='Nirmaan':
+            mergedObject.append(PdfFileReader(os.path.join(app.config['PO_PDF'], 'infra_tc.pdf'), 'rb'))
+        else:
+            mergedObject.append(PdfFileReader(os.path.join(app.config['PO_PDF'], 'Formate-2-5.pdf'), 'rb'))
+        
+        # Write all the files into a file which is named as shown below
+        mergedObject.write(os.path.join(app.config['PO_PDF'], purchase_order['id']+'.pdf'))
+
+    except Exception as err:
+        print(err)
+
+def create_email(po,status,approverName,approverLevel,mongo,app):
+    try:
+        # get user details
+        users=getUserDetailsFromMaster(po['user_id'],mongo)
+        vendor_name="______________"
+        vendor_details=getVendorDetailsDao(po['vendor_id'],mongo)
+        for vendor in vendor_details:
+            vendor_name=vendor['v_name']
+
+        for user in users:
+            name=user['first_name']
+            reciever_email=user['personal_email_id']
+            subject="PO approval & vendor acceptance"
+            file_name=po['id']+'.pdf'
+            pdf_attach=True
+            
+            body="Dear "+name+",<br /><br /> The PO of "+vendor_name+" vendor has been approved by your "+approverLevel +" <br />Kindly forward the attached PO for vendor acceptance, after approved by vendor, kindly take a screenshot & attached the same in vendor acceptance column for further processing." 
+
+            
+            sendEmail(file_name,reciever_email,body,pdf_attach,subject)
+    except Exception as err:
+        print(err)
+    

+ 623 - 0
service/reports_service.py

@@ -0,0 +1,623 @@
+from dao.reports_dao import *
+from dao.vendor_dao import getAllVendorListDao
+from dao.project_dao import getAllUsersFromMaster, getPOListForReport
+from datetime import datetime
+import os
+import time
+import xlsxwriter
+from utils.UploadImage import uploadImagetoFolder
+from service.voucher_approval_service import findApprovalTrackForVoucher
+
+
+def getMouReportDataService(from_date, to_date, mongo):
+    queryResult = []
+    formatted_vendors = {}
+
+    try:
+        vendors = getAllVendorListDao(mongo)
+
+        for vendor in vendors:
+            formatted_vendors[vendor['id']] = vendor
+
+        mou_list = getMOUReportsDataDao(from_date, to_date, mongo)
+        i = 1
+        for mou in mou_list:
+            try:
+                user_id = mou['user_id']
+                vendor_id = mou['vendor_id']
+
+                end_date = '-'
+                mou_file = '-'
+
+                if 'mou_expiry' in mou and mou['mou_expiry'] != 0:
+                    end_date = datetime.fromtimestamp(mou['mou_expiry'] /
+                                                      1000).strftime("%x")
+
+                if 'mou_file' in mou:
+                    mou_file = "http://142.93.210.143:9005/uploads/" + mou[
+                        'mou_file']
+
+                insert_obj = {
+                    'Sr,No':
+                    i,
+                    'Party Type':
+                    "Vendor",
+                    'Contract Type':
+                    "NA",
+                    'Department':
+                    mou['intervention'],
+                    'School / Center':
+                    "NA",
+                    'Classes coverd/Staff':
+                    "NA",
+                    'vendor_name':
+                    formatted_vendors[vendor_id]['v_name'],
+                    'vendor_pan':
+                    formatted_vendors[vendor_id]['v_pan'],
+                    'project_type':
+                    mou['project_type'],
+                    'mop':
+                    mou['MOP'],
+                    'Start Date':
+                    datetime.fromtimestamp(mou['created_on'] /
+                                           1000).strftime("%x"),
+                    'End date':
+                    end_date,
+                    'total_amount':
+                    mou['po_total_amount'],
+                    'amount_words':
+                    mou['amount_words'],
+                    'Status':
+                    "NA",
+                    'Reminder':
+                    "NA",
+                    'Email To':
+                    "NA",
+                    'Contract Value in Rs.':
+                    "NA",
+                    'Payment Terms':
+                    "NA",
+                    'Rate Details':
+                    "NA",
+                    'Deposit Amt':
+                    "NA",
+                    'Copy/Original or zerox':
+                    'NA',
+                    "Remarks":
+                    mou['po_reason'],
+                    "Remark":
+                    "NA",
+                    "Reminder":
+                    "NA",
+                    "sent":
+                    "NA",
+                    "Link 1":
+                    mou_file,
+                    "Link 2":
+                    "",
+                    "Link 3":
+                    ""
+                }
+
+                queryResult.append(insert_obj)
+
+                i += 1
+            except Exception as err:
+                print(err)
+
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult = []
+
+    return queryResult
+
+
+def getTdsReportDataService(from_date, to_date, mongo):
+    response = []
+    tds_list = []
+    formatted_vendors = {}
+
+    try:
+        tds_list = tdsNameList(mongo)
+        vendors = getAllVendorListDao(mongo)
+
+        tds_name_g = ''
+
+        # response.append({'':'','':'','':'','':'KOTAK EDUCATION','FOUNDATION, MUMBAI':'','':"",'':'','':'','':'','':'','':"",'':"",'':""})
+        # response.append({'':'','':'','':'','':'','':'','':"",'':'','':'','':'','':'','':"",'':"",'':""})
+        # response.append({'':'','':'','':'','':'DETAIL OF TDS','DEDUCTED & PAID FOR':'THE MONTH OF APR 20','':"",'':'','':'','':'','':'','':"",'':"",'':""})
+
+        for vendor in vendors:
+            formatted_vendors[vendor['id']] = vendor
+
+        j = 1
+        for tds_name in tds_list:
+            voucher_list = getTdsReportsDataDao(from_date, to_date, tds_name,
+                                                mongo)
+
+            total_gross = 0
+            total_tds = 0
+
+            if j != 1 and len(voucher_list) > 0:
+                response.append({
+                    'Sr,No': 'Sr,No',
+                    'PAN No.': 'PAN No.',
+                    tds_name_g: tds_name,
+                    'NAME AS PER PAN': 'NAME AS PER PAN',
+                    'DEDUCTEES': 'DEDUCTEES',
+                    'VN': "VN",
+                    'GROSS AMT': 'GROSS AMT',
+                    'RATE': 'RATE',
+                    'TDS AMT': 'TDS AMT',
+                    'D.O.P': 'D.O.P',
+                    'BSR code': "BSR code",
+                    'CIN No.': "CIN No.",
+                    'DOP': "DOP"
+                })
+
+            i = 1
+            j += 1
+            for voucher in voucher_list:
+                try:
+                    vendor_id = voucher['vendor_id']
+                    tds_amt = 0
+                    gross_amt = 0
+                    if 'product_gross_amount' in voucher:
+                        gross_amt = voucher['product_gross_amount']
+                        tds_amt = gross_amt - voucher['product_total_amount']
+
+                    if i == 1:
+                        tds_name_g = tds_name
+
+                    response.append({
+                        'Sr,No':
+                        i,
+                        'PAN No.':
+                        formatted_vendors[vendor_id]['v_pan'],
+                        tds_name_g:
+                        formatted_vendors[vendor_id]['v_pan_name'],
+                        'NAME AS PER PAN':
+                        formatted_vendors[vendor_id]['v_pan_name'],
+                        'DEDUCTEES':
+                        voucher['tds_type'],
+                        'VN':
+                        "",
+                        'GROSS AMT':
+                        gross_amt,
+                        'RATE':
+                        voucher['tds_rate'],
+                        'TDS AMT':
+                        tds_amt,
+                        'D.O.P':
+                        '',
+                        'BSR code':
+                        "",
+                        'CIN No.':
+                        "",
+                        'DOP':
+                        ""
+                    })
+
+                    total_gross += gross_amt
+                    total_tds += tds_amt
+
+                    i += 1
+                except Exception as err:
+                    print(err)
+
+            if total_gross != 0:
+                response.append({
+                    'Sr,No': '',
+                    'PAN No.': '',
+                    tds_name_g: '',
+                    'NAME AS PER PAN': '',
+                    'DEDUCTEES': '',
+                    'VN': "",
+                    'GROSS AMT': '',
+                    'RATE': '',
+                    'TDS AMT': '',
+                    'D.O.P': '',
+                    'BSR code': "",
+                    'CIN No.': "",
+                    'DOP': ""
+                })
+                response.append({
+                    'Sr,No': '',
+                    'PAN No.': '',
+                    tds_name_g: '',
+                    'NAME AS PER PAN': '',
+                    'DEDUCTEES': '',
+                    'VN': "",
+                    'GROSS AMT': total_gross,
+                    'RATE': '',
+                    'TDS AMT': total_tds,
+                    'D.O.P': '',
+                    'BSR code': "",
+                    'CIN No.': "",
+                    'DOP': ""
+                })
+                response.append({
+                    'Sr,No': '',
+                    'PAN No.': '',
+                    tds_name_g: '',
+                    'NAME AS PER PAN': '',
+                    'DEDUCTEES': '',
+                    'VN': "",
+                    'GROSS AMT': '',
+                    'RATE': '',
+                    'TDS AMT': '',
+                    'D.O.P': '',
+                    'BSR code': "",
+                    'CIN No.': "",
+                    'DOP': ""
+                })
+                response.append({
+                    'Sr,No': '',
+                    'PAN No.': '',
+                    tds_name_g: '',
+                    'NAME AS PER PAN': '',
+                    'DEDUCTEES': '',
+                    'VN': "",
+                    'GROSS AMT': '',
+                    'RATE': '',
+                    'TDS AMT': '',
+                    'D.O.P': '',
+                    'BSR code': "",
+                    'CIN No.': "",
+                    'DOP': ""
+                })
+
+    except Exception as err:
+        print(err)
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        response = []
+
+    return response
+
+
+def getTallyReportDataService(from_date, to_date, mongo):
+    response = []
+    formatted_vendors = {}
+
+    try:
+        vendors = getAllVendorListDao(mongo)
+        for vendor in vendors:
+            formatted_vendors[vendor['id']] = vendor
+
+        voucher_list = getTallyReportsDataDao(from_date, to_date, mongo)
+        i = 1
+
+        for voucher in voucher_list:
+            try:
+                vendor_id = voucher['vendor_id']
+                tds_amt = 0
+                gross_amt = 0
+                gst_amt = 0
+                v_name = ''
+                v_code = ''
+                v_address = ''
+
+                if vendor_id in formatted_vendors:
+                    v_name = formatted_vendors[vendor_id]['v_name']
+                    v_address = formatted_vendors[vendor_id]['v_address']
+                    v_code = formatted_vendors[vendor_id]['v_code']
+                elif 'vendor_name' in voucher:
+                    v_name = voucher['vendor_name']
+                    v_address = voucher['vendor_address']
+
+                if 'product_gross_amount' in voucher:
+                    gross_amt = voucher['product_gross_amount']
+                    tds_amt = gross_amt - voucher['product_total_amount']
+
+                if 'od' in voucher:
+                    for order_details in voucher['od']:
+                        gst_amt += order_details['product_gst']
+
+                gross_amt = voucher['product_gross_amount']
+                total_amt = voucher['product_total_amount']
+                add_charges = voucher['po_additional_charges']
+                tds_amt = gross_amt - total_amt
+                response.append({
+                    'Sr,No':
+                    i,
+                    'Bill Date.':
+                    datetime.fromtimestamp(voucher['voucher_created_on'] /
+                                           1000).strftime("%x"),
+                    'Voucher Type':
+                    'Purchase',
+                    'Expense Head':
+                    voucher['budget_head'],
+                    'Status':
+                    "Dr",
+                    'Party Name':
+                    v_name,
+                    'Party Code':
+                    v_code,
+                    'Address':
+                    v_address,
+                    'State':
+                    '',
+                    'Amount':
+                    total_amt - gst_amt - add_charges,
+                    'Total Tax':
+                    gst_amt,
+                    'Tds':
+                    tds_amt,
+                    'Additional Charges':
+                    add_charges,
+                    'Total Amount':
+                    gross_amt,
+                    'Bill No.':
+                    voucher['voucher_code'],
+                    'Bill Date':
+                    "",
+                    'Remark':
+                    ""
+                })
+
+                i += 1
+            except Exception as err:
+                print(err)
+
+    except Exception as err:
+        print(err)
+        response = []
+
+    return response
+
+
+def getDepriciationReportService(request_data, app, mongo):
+    queryResult = {'status': 'failure', 'message': 'Something went wrong!'}
+
+    try:
+        current_date = datetime.now()
+        fy_year = str(current_date.year - 1) + '-' + str(current_date.year)
+        if current_date.month < 4:
+            fy_year = str(current_date.year -
+                          2) + '-' + str(current_date.year - 1)
+
+        
+        filepath = os.path.join(app.config['UPLOAD_FOLDER'], 'far.xlsx')
+        # Get Asset depriciation percentage
+        dep_per, age = getAssetDepriciationDataDao(request_data['category'],
+                                                   mongo)
+
+        # Get Asset Master of requested category
+        assets = getAssetReportsDataDao(request_data['category'], mongo)
+
+        headers = [
+            "Sr. No.", "Date", "Invoice / Voucher Number", "Location",
+            "Intervention", "Quantity", "Decription of the Asset",
+            "Group of Asset", "Depreciation %", "Status", "Purchase Cost",
+            "Additions", "Write Off", "Sale", "Depreciation",
+            "Written Down Value (WDV)"
+        ]
+        # ========================== #
+
+        # Create a workbook and add a worksheet.
+        workbook = xlsxwriter.Workbook(filepath)
+        worksheet = workbook.add_worksheet()
+        worksheet.freeze_panes(0, 3)
+        # Start from the first cell. Rows and columns are zero indexed.
+        row = 0
+        col = 0
+
+
+        worksheet.write(row, 0, 'KOTAK')
+        worksheet.write(row, 1, 'EDUCATION FOUNDATION, MUMBAI')
+
+        row += 1
+
+        worksheet.write(row, 0, 'Format')
+        worksheet.set_column(row, 1, len('for fixed assets: '+request_data['category']))
+        worksheet.write(row, 1, 'for fixed assets: '+request_data['category'])
+
+        row += 1
+
+        merge_format = workbook.add_format({'border': 1,'bold': True,'align': 'center',})
+
+        worksheet.merge_range('L3:O3', 'For the F.Y. '+fy_year, merge_format)
+        worksheet.write(row, 15, 'As per 31st March '+fy_year.split('-')[1],merge_format)
+
+        row+=1
+
+        worksheet.set_row(row, 20,merge_format)
+        column = 0
+        for header in headers:
+            if column > 1:
+                worksheet.set_column(row, column, len(header))
+            worksheet.write(row, column, header)
+            column += 1
+
+        # ========================== #
+
+        i = 1
+        for asset in assets:
+            if 'voucher_code' in asset:
+                try:
+                    row += 1
+                    purchase_date = datetime.strptime(asset['purchase_date'],
+                                                    '%m/%d/%Y')
+
+                    year_diff = current_date.year - purchase_date.year
+                    if year_diff > age:
+                        year_diff = age
+
+                    amount = int(asset['amount'])
+                    dep_amount = 0
+                    wdv = 0
+                    sale = '-'
+                    write_off = '-'
+
+                    if 'sale' in asset and asset['sale'] == True:
+                        sale = asset['sale_amount']
+
+                    if 'write_off' in asset and asset['write_off'] == True:
+                        write_off = asset['write_off_amount']
+
+                    try:
+                        if year_diff != 0:
+                            for k in range(1, year_diff):
+                                dep_amount += (amount * dep_per) / 100
+                                amount = amount - dep_amount
+                    except Exception as err:
+                        print(err)
+
+                    wdv = int(asset['amount']) - dep_amount
+                    worksheet.set_column(row, column, len(header))
+                    worksheet.write(row, 0, i)
+                    worksheet.write(row, 1, asset['purchase_date'])
+                    worksheet.write(row, 2, asset['voucher_code'])
+                    worksheet.write(row, 3, asset['place'])
+                    worksheet.write(row, 4, asset['intervention'])
+                    worksheet.write(row, 5, 1)
+                    worksheet.write(row, 6, asset['discription'])
+                    worksheet.write(row, 7, request_data['category'])
+                    worksheet.write(row, 8, dep_per)
+                    worksheet.write(row, 9, asset['computer_type'])
+                    worksheet.write(row, 10, asset['amount'])
+                    worksheet.write(row, 11, '-')
+                    worksheet.write(row, 12, write_off)
+                    worksheet.write(row, 13, sale)
+                    worksheet.write(row, 14, dep_amount)
+                    worksheet.write(row, 15, wdv)
+
+                    i += 1
+                except Exception as err:
+                    print(err)
+        workbook.close()
+
+        # If created on is of current year and purchase date is between april to march than depri. will be calculated of full
+        # if purchase date is between oct to march than depri. will be calculated of half
+
+        # Past three depri created
+        queryResult = {
+            'status': 'success',
+            'message': 'file uploaded successfully!'
+        }
+    except Exception as err:
+        print(err)
+
+    return queryResult
+
+
+def getVoucherMISReportDataService(from_date, to_date, mongo):
+    queryResult = []
+    formatted_users = {}
+    formatted_vendors = {}
+    formatted_po = {}
+    try:
+        users = getAllUsersFromMaster(mongo)
+        vendors = getAllVendorListDao(mongo)
+        purchase_orders = getPOListForReport(mongo)
+
+        for user in users:
+            formatted_users[user['key']] = user
+
+        for vendor in vendors:
+            formatted_vendors[vendor['id']] = vendor
+
+        for po in purchase_orders:
+            formatted_po[po['id']] = po['po_order_id']
+
+        vouchers = getAllVoucherAnalyticsDataDao(from_date, to_date, mongo)
+        for voucher in vouchers:
+            try:
+                user_id = voucher['user_id']
+                vendor_code=''
+                vendor_name=''
+                vendor_pan=''
+                v_type='Registered'
+                pending_level=''
+                pending_senior_name=''
+                v_account_no=''
+                v_ifsc=''
+
+                if 'vendor_id' in voucher:
+                    vendor_id = voucher['vendor_id']
+                    vendor_code=formatted_vendors[vendor_id]['v_code']
+                    vendor_name=formatted_vendors[vendor_id]['v_name']
+                    vendor_pan=formatted_vendors[vendor_id]['v_pan']
+                    v_account_no=formatted_vendors[vendor_id]['v_account_no']
+                    v_ifsc=formatted_vendors[vendor_id]['v_ifsc']
+                elif 'vendor_name' in voucher:
+                    vendor_name=voucher['vendor_name']
+                    v_type='Un-registered'
+                    if 'v_account_no' in voucher:
+                        v_account_no=voucher['v_account_no']
+                        v_ifsc=voucher['v_ifsc']
+                
+                if 'approval_track' in voucher:
+                    for level in voucher['approval_track']:
+                        status=voucher['approval_track'][level]['status']
+                        if status=='PENDING':
+                            pending_level=voucher['approval_track'][level]['level']
+                            pending_senior_name=voucher['approval_track'][level]['name']
+                
+                invoice_url=[]
+                for invoice in voucher['invoices']:
+                    invoice_url.append('http://142.93.210.143:9005/uploads/'+invoice)
+                
+
+                insert_obj = {
+                    'voucher_code': voucher['voucher_code'],
+                    'intervention': voucher['intervention'],
+                    'emp_id': formatted_users[user_id]['emp_id'],
+                    'user_name': formatted_users[user_id]['first_name'],
+                    'vendor_type':v_type,
+                    'vendor_code':vendor_code,
+                    'vendor_name': vendor_name,
+                    'vendor_pan': vendor_pan,
+                    'vendor_account_no':v_account_no,
+                    'vendor_ifsc':v_ifsc,
+                    'project_type': voucher['project_type'],
+                    'mop': voucher['MOP'],
+                    'budget_head': voucher['budget_head'],
+                    'payment_type': voucher['payment_type'],
+                    'tds_rate': voucher['tds_rate'],
+                    'additional_charges': voucher['po_additional_charges'],
+                    'total_amount': voucher['product_total_amount'],
+                    'amount_words': voucher['amount_words'],
+                    'status':voucher['voucher_status'],
+                    'pending_at':pending_level,
+                    'pending_senior_name':pending_senior_name,
+                    'invoice':invoice_url
+                }
+
+
+                quotations=[]
+                if voucher['po_id'] in formatted_po:
+                    po_details=formatted_po[voucher['po_id']]['quotations']
+                    quotations=po_details['quotations']
+                    insert_obj['po_id']=voucher['po_id']
+                else:
+                    insert_obj['po_id']='NA'
+                    if 'quotations' in voucher:
+                        quotations=voucher['quotations']
+
+                if len(quotations)!=0:
+                    k=1
+                    for quotation in quotations:
+                        insert_obj['vendor_name'+str(k)]=quotation['v_name']
+                        insert_obj['exception'+str(k)]=quotation['exception']
+                        insert_obj['note'+str(k)]=quotation['note']
+                        insert_obj['quote_file'+str(k)]='http://142.93.210.143:9005/uploads/'+quotation['quote_file']
+                        k+=1
+                else:
+                    for k in range(1,4):
+                        insert_obj['vendor_name'+str(k)]=''
+                        insert_obj['exception'+str(k)]=''
+                        insert_obj['note'+str(k)]=''
+                        insert_obj['quote_file'+str(k)]=''
+                
+                # print(insert_obj)
+                queryResult.append(insert_obj)
+
+            except Exception as err:
+                print(err)
+
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult = []
+
+    return queryResult

+ 206 - 0
service/vendor_service.py

@@ -0,0 +1,206 @@
+from dao.vendor_dao import *
+from dao.project_dao import getUserDetailsFromMaster
+from config import V_BASE_CODE
+from utils.error_log import insert_into_error_log
+from utils.UploadImage import uploadImagetoFolder
+from datetime import datetime
+
+def validateVendorCode(v_code,mongo): # Validate email id and password
+    queryResult={}
+    try:
+        query_response=validateVendorCodeDao(v_code,mongo)
+        if len(query_response)!=0:
+            queryResult={'status':'failure','message': 'The Vendor Code is already in use!'}
+        else:
+            queryResult={'status':'success','message': 'Vendor Code is available!'}
+        
+
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult={'status':'failure','message': 'Something went wrong!'}
+
+    return queryResult
+
+def validatePANService(v_pan,mongo): # Validate email id and password
+    queryResult={}
+    try:
+        query_response=validatePANDao(v_pan,mongo)
+        if len(query_response)!=0:
+            queryResult={'status':'failure','message': 'The PAN is already in use!'}
+        else:
+            queryResult={'status':'success','message': 'The PAN is available!'}
+        
+
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult={'status':'failure','message': 'Something went wrong!'}
+
+    return queryResult
+
+def addVendorService(files,data,app,mongo):
+    queryResult={}
+    try:
+        
+        if data['id']=='0':
+            data['created_on']=int(datetime.now().timestamp()*1000)
+            data['status']='PENDING'
+            # Validate PAN number
+            pan_response=validatePANService(data['v_pan'],mongo)
+            if pan_response['status']=='success':
+                # Genrate vendor code
+                v_code=V_BASE_CODE+(getTotalUserCount(mongo)+1)
+                
+                pan_new_name=''
+                dec_new_name=''
+                cheq_new_name=''
+                v_pan_file = files['v_pan_file']
+                v_declaration_file=files['v_declaration_file']
+                v_cheque_file=files['v_cheque_file']
+                panImageResponse=uploadImagetoFolder(v_pan_file,'pan_',app)
+                decImageResponse=uploadImagetoFolder(v_declaration_file,'dec_',app)
+                cheqImageResponse=uploadImagetoFolder(v_cheque_file,'cheq_',app)
+                if panImageResponse['status']=='success':
+                    pan_new_name=panImageResponse['message']
+                if decImageResponse['status']=='success':
+                    dec_new_name=decImageResponse['message']
+                if cheqImageResponse['status']=='success':
+                    cheq_new_name=cheqImageResponse['message']
+
+                data['v_status']='active'
+                data['v_code']=v_code
+                data['v_pan_file']=pan_new_name
+                data['v_declaration_file']=dec_new_name
+                data['v_cheque_file']=cheq_new_name
+
+                # Insert into vendor master
+                insertIntoVendorMaster(data,mongo)
+
+                queryResult={'status':'success','message': 'Vendor registered successfully!','v_code':v_code}
+            else:
+                queryResult=pan_response
+        else:
+            data['updated_on']=int(datetime.now().timestamp()*1000)
+            # Insert into vendor master
+            insertIntoVendorMaster(data,mongo)
+            queryResult={'status':'success','message': 'Vendor updated successfully!'}
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult={'status':'failure','message': 'Something went wrong!'}
+
+    return queryResult
+
+def updateVendorStatus(data,mongo):
+    queryResult={}
+    try:
+        data['updated_on']=int(datetime.now().timestamp()*1000)
+        status=""
+        if data['flag']=='approve':
+            status="APPROVED"
+        elif data['flag']=='decline':
+            status="DECLINED"
+            
+        data['status']=status
+
+        if status!="":
+            # Insert into vendor master
+            updateVendorStatusDao(data,data['requestKey'],mongo)
+            queryResult={'status':'success','message': 'Vendor updated successfully!'}
+        else:
+            queryResult={'status':'failure','message': 'Something went wrong!'}
+        
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult={'status':'failure','message': 'Something went wrong!'}
+
+    return queryResult
+
+def updateVendorStatusAdmin(data,mongo):
+    queryResult={}
+    try:
+        # Insert into vendor master
+        updateVendorStatusAdminDao({'v_status':data['status']},data['vendor_id'],mongo)
+        queryResult={'status':'success','message': 'Vendor updated successfully!'}
+        
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult={'status':'failure','message': 'Something went wrong!'}
+
+    return queryResult
+
+def update_rating_service(data,mongo):
+    queryResult={}
+    try:
+        data['updated_on']=int(datetime.now().timestamp()*1000)
+        data['user_name']=''
+        user_details=getUserDetailsFromMaster(data['user_id'],mongo)
+        for user_obj in user_details:
+            data['user_name']=user_obj['first_name']
+        updateVendorRatingDao(data,mongo)
+        queryResult={'status':'success','message': 'Vendor Rating Updated Successfully!'}
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult={'status':'failure','message': 'Something went wrong!'}
+
+    return queryResult
+
+def getVendorList(u_id,mongo): # Validate email id and password
+    queryResult=[]
+    try:
+        queryResult=getVendorListByUID(u_id,mongo)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult=[]
+
+    return queryResult
+
+def getAllVendorList(mongo): # 
+    queryResult=[]
+    try:
+        queryResult=getAllVendorListDao(mongo)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult=[]
+
+    return queryResult
+
+def getAllUnregisteredVendorList(mongo): # 
+    queryResult=[]
+    try:
+        queryResult=getAllUnregisteredVendorListDao(mongo)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult=[]
+
+    return queryResult
+
+
+def getAllUserList(mongo): # 
+    queryResult=[]
+    try:
+        queryResult=getAllUserListDao(mongo)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult=[]
+
+    return queryResult
+
+def getVendorDetails(id,mongo): # Validate email id and password
+    queryResult=[]
+    try:
+        queryResult=getVendorDetailsDao(id,mongo)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult=[]
+
+    return queryResult
+
+def getVendorRatingsService(id,mongo): # Validate email id and password
+    queryResult=[]
+    try:
+        queryResult=getVendorRatingsDao(id,mongo)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult=[]
+
+    return queryResult
+

+ 786 - 0
service/voucher_approval_service.py

@@ -0,0 +1,786 @@
+from dao.project_dao import getAllUsersFromMaster,getUserDetailsFromMaster
+from dao.voucher_approval_dao import *
+from datetime import datetime
+from utils.Email import sendEmail
+from utils.fcm_notification import send_notification
+
+def getVoucherApprovalUserReportService(mongo):
+    queryResult = []    
+    try:
+        users=getAllUsersFromMaster(mongo)
+        for user in users:
+            if 'emp_id' in user and 'intervention' in user:
+                insert_obj={
+                    "Employee Code": user['emp_id'],
+                    "Employee Name": user['first_name'],
+                    "Intervention":user['intervention'],
+                    "Senior 1 10000 Emp Code": "",
+                    "Senior 1 10000 Emp Name": "",
+                    "Senior 2 10000 Emp Code": "",
+                    "Senior 2 10000 Emp Name": "",
+                    "Senior 1 50000 Emp Code": "",
+                    "Senior 1 50000 Emp Name": "",
+                    "Senior 2 50000 Emp Code": "",
+                    "Senior 2 50000 Emp Name": "",
+                    "Senior 3 50000 Emp Code": "",
+                    "Senior 3 50000 Emp Name": "",
+                    "Senior 1 5Lac Emp Code": "",
+                    "Senior 1 5Lac Emp Name": "",
+                    "Senior 2 5Lac Emp Code": "",
+                    "Senior 2 5Lac Emp Name": "",
+                    "Senior 3 5Lac Emp Code": "",
+                    "Senior 3 5Lac Emp Name": "",
+                    "Senior 1 6Lac Emp Code": "",
+                    "Senior 1 6Lac Emp Name": "",
+                    "Senior 2 6Lac Emp Code": "",
+                    "Senior 2 6Lac Emp Name": "",
+                    "Senior 3 6Lac Emp Code": "",
+                    "Senior 3 6Lac Emp Name": "",
+                    "Senior 1 10Lac Emp Code": "",
+                    "Senior 1 10Lac Emp Name": "",
+                    "Senior 1 above 10Lac Emp Code": "",
+                    "Senior 1 above 10Lac Emp Name": "",
+                    "Finance Level 1 Emp Code":"",
+                    "Finance Level 1 Emp Name":"",
+                    "Finance Level 2 Emp Code":"",
+                    "Finance Level 2 Emp Name":""
+                }
+                queryResult.append(insert_obj)
+            
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        print(err)
+        queryResult = []
+
+    return queryResult
+
+def getSeniorDetailsService(emp_key,mongo):
+    queryResult = []    
+    try:
+        queryResult=getVoucherSeniorListDao(emp_key,mongo)
+    except Exception as err:
+        print(err)
+        queryResult = []
+
+    return queryResult
+
+def uploadSeniorDetailsService(request_obj,mongo):
+    queryResult={}
+    error_response=[]
+    
+    try:
+        formatted_users={}
+        users=getAllUsersFromMaster(mongo)
+        
+        for user in users:
+            if 'emp_id' in user:
+                formatted_users[user['emp_id']]=user
+        
+        
+
+        for data in request_obj['data']:
+            try:
+                emp_code=data['Employee Code']
+                emp_name=data['Employee Name']
+                intervention=data['Intervention']
+
+                if emp_code in formatted_users:
+                    try:
+                        # Upto 10000 senior
+                        senior_1_10000_emp_code=data['Senior 1 10000 Emp Code']
+                        senior_1_10000_emp_name=data['Senior 1 10000 Emp Name']
+
+                        senior_2_10000_emp_code=data['Senior 2 10000 Emp Code']
+                        senior_2_10000_emp_name=data['Senior 2 10000 Emp Name']
+                        
+                        # 10000 to 50000 senior
+                        senior_1_50000_emp_code=data['Senior 1 50000 Emp Code']
+                        senior_1_50000_emp_name=data['Senior 1 50000 Emp Name']
+
+                        senior_2_50000_emp_code=data['Senior 2 50000 Emp Code']
+                        senior_2_50000_emp_name=data['Senior 2 50000 Emp Name']
+
+                        senior_3_50000_emp_code=data['Senior 3 50000 Emp Code']
+                        senior_3_50000_emp_name=data['Senior 3 50000 Emp Name']
+
+                        # 50000 to 5Lac senior
+                        senior_1_5lac_emp_code=data['Senior 1 5Lac Emp Code']
+                        senior_1_5lac_emp_name=data['Senior 1 5Lac Emp Name']
+
+                        senior_2_5lac_emp_code=data['Senior 2 5Lac Emp Code']
+                        senior_2_5lac_emp_name=data['Senior 2 5Lac Emp Name']
+
+                        senior_3_5lac_emp_code=data['Senior 3 5Lac Emp Code']
+                        senior_3_5lac_emp_name=data['Senior 3 5Lac Emp Name']
+
+                        # 5Lac to 6Lac senior
+                        senior_1_6lac_emp_code=data['Senior 1 6Lac Emp Code']
+                        senior_1_6lac_emp_name=data['Senior 1 6Lac Emp Name']
+
+                        senior_2_6lac_emp_code=data['Senior 2 6Lac Emp Code']
+                        senior_2_6lac_emp_name=data['Senior 2 6Lac Emp Name']
+
+                        senior_3_6lac_emp_code=data['Senior 3 6Lac Emp Code']
+                        senior_3_6lac_emp_name=data['Senior 3 6Lac Emp Name']
+
+                        # 6Lac to 10Lac senior
+                        senior_1_10lac_emp_code=data['Senior 1 10Lac Emp Code']
+                        senior_1_10lac_emp_name=data['Senior 1 10Lac Emp Name']
+
+                        # Above 10lac
+                        senior_1_above10lac_emp_code=data['Senior 1 above 10Lac Emp Code']
+                        senior_1_above10lac_emp_name=data['Senior 1 above 10Lac Emp Name']
+
+                        # Finance Level 1
+                        finance_level_1_emp_code=data["Finance Level 1 Emp Code"]
+                        finance_level_1_emp_name=data["Finance Level 1 Emp Name"]
+                        # Finance Level 2
+                        finance_level_2_emp_code=data["Finance Level 2 Emp Code"]
+                        finance_level_2_emp_name=data["Finance Level 2 Emp Name"]
+
+                        if ((senior_1_10000_emp_code!="NA" and senior_1_10000_emp_code not in formatted_users)
+                         or (senior_2_10000_emp_code!="NA" and senior_2_10000_emp_code not in formatted_users)
+                         or (senior_1_50000_emp_code!="NA" and senior_1_50000_emp_code not in formatted_users)
+                         or (senior_2_50000_emp_code!="NA" and senior_2_50000_emp_code not in formatted_users)
+                         or (senior_3_50000_emp_code!="NA" and senior_3_50000_emp_code not in formatted_users)
+                         or (senior_1_5lac_emp_code!="NA" and senior_1_5lac_emp_code not in formatted_users)
+                         or (senior_2_5lac_emp_code!="NA" and senior_2_5lac_emp_code not in formatted_users)
+                         or (senior_3_5lac_emp_code!="NA" and senior_3_5lac_emp_code not in formatted_users)
+                         or (senior_1_6lac_emp_code!="NA" and senior_1_6lac_emp_code not in formatted_users)
+                         or (senior_2_6lac_emp_code!="NA" and senior_2_6lac_emp_code not in formatted_users)
+                         or (senior_3_6lac_emp_code!="NA" and senior_3_6lac_emp_code not in formatted_users)
+                         or (senior_1_10lac_emp_code!="NA" and senior_1_10lac_emp_code not in formatted_users)
+                         or (senior_1_above10lac_emp_code!="NA" and senior_1_above10lac_emp_code not in formatted_users)
+                         or (finance_level_1_emp_code!="NA" and finance_level_1_emp_code not in formatted_users)
+                         or (finance_level_2_emp_code!="NA" and finance_level_2_emp_code not in formatted_users)):
+                            
+                            error_response.append(emp_code)
+                        else:
+                            #  Update into database
+                            try:
+                                senior_1_10000_emp_key='NA'
+                                senior_2_10000_emp_key='NA'
+                                if senior_1_10000_emp_code!='NA':
+                                    senior_1_10000_emp_key=formatted_users[senior_1_10000_emp_code]['key']
+
+                                if senior_2_10000_emp_code!='NA':
+                                    senior_2_10000_emp_key=formatted_users[senior_2_10000_emp_code]['key']
+
+                                senior_1_50000_emp_key='NA'
+                                senior_2_50000_emp_key='NA'
+                                senior_3_50000_emp_key='NA'
+                                if senior_1_50000_emp_code!='NA':
+                                    senior_1_50000_emp_key=formatted_users[senior_1_50000_emp_code]['key']
+
+                                if senior_2_50000_emp_code!='NA':
+                                    senior_2_50000_emp_key=formatted_users[senior_2_50000_emp_code]['key']
+
+                                if senior_3_50000_emp_code!='NA':
+                                    senior_3_50000_emp_key=formatted_users[senior_3_50000_emp_code]['key']
+
+                                senior_1_5lac_emp_key='NA'
+                                senior_2_5lac_emp_key='NA'
+                                senior_3_5lac_emp_key='NA'
+                                if senior_1_5lac_emp_code!='NA':
+                                    senior_1_5lac_emp_key=formatted_users[senior_1_5lac_emp_code]['key']
+
+                                if senior_2_5lac_emp_code!='NA':
+                                    senior_2_5lac_emp_key=formatted_users[senior_2_5lac_emp_code]['key']
+
+                                if senior_3_5lac_emp_code!='NA':
+                                    senior_3_5lac_emp_key=formatted_users[senior_3_5lac_emp_code]['key']
+
+                                senior_1_6lac_emp_key='NA'
+                                senior_2_6lac_emp_key='NA'
+                                senior_3_6lac_emp_key='NA'
+                                if senior_1_6lac_emp_code!='NA':
+                                    senior_1_6lac_emp_key=formatted_users[senior_1_6lac_emp_code]['key']
+
+                                if senior_2_6lac_emp_code!='NA':
+                                    senior_2_6lac_emp_key=formatted_users[senior_2_6lac_emp_code]['key']
+
+                                if senior_3_6lac_emp_code!='NA':
+                                    senior_3_6lac_emp_key=formatted_users[senior_3_6lac_emp_code]['key']
+
+                                senior_1_10lac_emp_key='NA'
+                                if senior_1_10lac_emp_code!='NA':
+                                    senior_1_10lac_emp_key=formatted_users[senior_1_10lac_emp_code]['key']
+
+                                senior_1_above10lac_emp_key='NA'
+                                if senior_1_above10lac_emp_code!='NA':
+                                    senior_1_above10lac_emp_key=formatted_users[senior_1_above10lac_emp_code]['key']
+
+                                finance_level_1_emp_key='NA'
+                                if finance_level_1_emp_code!='NA':
+                                    finance_level_1_emp_key=formatted_users[finance_level_1_emp_code]['key']
+
+                                finance_level_2_emp_key='NA'
+                                if finance_level_2_emp_code!='NA':
+                                    finance_level_2_emp_key=formatted_users[finance_level_2_emp_code]['key']
+  
+
+                                
+                                insert_obj={
+                                    'emp_key':formatted_users[emp_code]['key'],
+                                    'emp_name':emp_name,
+                                    'intervention':intervention,
+                                    'senior_1_10000_emp_key':senior_1_10000_emp_key,
+                                    'senior_1_10000_emp_name':senior_1_10000_emp_name,
+                                    'senior_2_10000_emp_key':senior_2_10000_emp_key,
+                                    'senior_2_10000_emp_name':senior_2_10000_emp_name,
+
+                                    'senior_1_50000_emp_key':senior_1_50000_emp_key,
+                                    'senior_1_50000_emp_name':senior_1_50000_emp_name,
+                                    'senior_2_50000_emp_key':senior_2_50000_emp_key,
+                                    'senior_2_50000_emp_name':senior_2_50000_emp_name,
+                                    'senior_3_50000_emp_key':senior_3_50000_emp_key,
+                                    'senior_3_50000_emp_name':senior_3_50000_emp_name,
+
+                                    'senior_1_5lac_emp_key':senior_1_5lac_emp_key,
+                                    'senior_1_5lac_emp_name':senior_1_5lac_emp_name,
+                                    'senior_2_5lac_emp_key':senior_2_5lac_emp_key,
+                                    'senior_2_5lac_emp_name':senior_2_5lac_emp_name,
+                                    'senior_3_5lac_emp_key':senior_3_5lac_emp_key,
+                                    'senior_3_5lac_emp_name':senior_3_5lac_emp_name,
+
+                                    'senior_1_6lac_emp_key':senior_1_6lac_emp_key,
+                                    'senior_1_6lac_emp_name':senior_1_6lac_emp_name,
+                                    'senior_2_6lac_emp_key':senior_2_6lac_emp_key,
+                                    'senior_2_6lac_emp_name':senior_2_6lac_emp_name,
+                                    'senior_3_6lac_emp_key':senior_3_6lac_emp_key,
+                                    'senior_3_6lac_emp_name':senior_3_6lac_emp_name,
+
+                                    'senior_1_10lac_emp_key':senior_1_10lac_emp_key,
+                                    'senior_1_10lac_emp_name':senior_1_10lac_emp_name,
+
+                                    'senior_1_above10lac_emp_key':senior_1_above10lac_emp_key,
+                                    'senior_1_above10lac_emp_name':senior_1_above10lac_emp_name,
+
+                                    'finance_level_1_emp_key': finance_level_1_emp_key,
+                                    'finance_level_1_emp_name': finance_level_1_emp_name,
+
+                                    'finance_level_2_emp_key':finance_level_2_emp_key,
+                                    'finance_level_2_emp_name':finance_level_2_emp_name
+                                }
+                            except Exception as err:
+                                print(err)
+
+                            updateSeniorDataMaster(insert_obj,mongo)
+                    
+                    except Exception as err:
+                        print(err)
+                        error_response.append(emp_code)
+                        
+                else:
+                    error_response.append(emp_code)
+                
+            except Exception as err:
+                print(err)
+    
+    except Exception as err:
+        print(err)
+
+    if len(error_response)==0:
+        queryResult={'status':'failure','message': 'Something went wrong!','error_list':error_response}
+    else:
+        queryResult={'status':'success','message': 'Data Updated Successfully!'}
+
+    return queryResult
+
+def findApprovalTrackForVoucher(request_obj,mongo):
+    senior_found=False
+    approval_track = {"senior_level_1":{},"senior_level_2":{},"senior_level_3":{},"finance_level_1":{},"finance_level_2":{}}
+    try:
+        # Fetch user Details from user master
+        user_list=getVoucherSeniorListDao(request_obj['user_id'],mongo)
+        amount=request_obj['product_total_amount']
+        
+        for user_obj in user_list:
+            senior_found=True
+            senior_level_1_key='NA'
+            senior_level_1_name='NA'
+            senior_level_2_key='NA'
+            senior_level_2_name='NA'
+            senior_level_3_key='NA'
+            senior_level_3_name='NA'
+            finance_level_1_key='NA'
+            finance_level_1_name='NA'
+            finance_level_2_key='NA'
+            finance_level_2_name='NA'
+
+            try:
+                finance_level_1_key=user_obj['finance_level_1_emp_key']
+                finance_level_1_name=user_obj['finance_level_1_emp_name']
+                finance_level_2_key==user_obj['finance_level_2_emp_key']
+                finance_level_2_name=user_obj['finance_level_2_emp_name']
+            except Exception as err:
+                print(err)
+
+     
+            # Other Condition of Opex
+            if request_obj['project_type']=='Opex - Vendor payment':
+                if amount<=10000:# 2 Level Approval (DPH)
+                    senior_level_1_key=user_obj['senior_1_10000_emp_key']
+                    senior_level_1_name=user_obj['senior_1_10000_emp_name']
+
+                    senior_level_2_key=user_obj['senior_2_10000_emp_key']
+                    senior_level_2_name=user_obj['senior_2_10000_emp_name']
+
+                elif amount>10000 and amount<=50000: # 3 Level Approval (PH)
+                    senior_level_1_key=user_obj['senior_1_50000_emp_key']
+                    senior_level_1_name=user_obj['senior_1_50000_emp_name']
+
+                    senior_level_2_key=user_obj['senior_2_50000_emp_key']
+                    senior_level_2_name=user_obj['senior_2_50000_emp_name']
+                    
+                    senior_level_3_key=user_obj['senior_3_50000_emp_key']
+                    senior_level_3_name=user_obj['senior_3_50000_emp_name']
+
+                elif amount>50000 and amount<=100000: # 3 Level Approval (PD)
+                    senior_level_1_key=user_obj['senior_1_5lac_emp_key']
+                    senior_level_1_name=user_obj['senior_1_5lac_emp_name']
+
+                    senior_level_2_key=user_obj['senior_2_5lac_emp_key']
+                    senior_level_2_name=user_obj['senior_2_5lac_emp_name']
+                    
+                    senior_level_3_key=user_obj['senior_3_5lac_emp_key']
+                    senior_level_3_name=user_obj['senior_3_5lac_emp_name']
+
+                elif amount>100000 and amount<=500000: # 3 Level Approval (CXO)
+                    senior_level_1_key=user_obj['senior_1_5lac_emp_key']
+                    senior_level_1_name=user_obj['senior_1_5lac_emp_name']
+
+                    senior_level_2_key=user_obj['senior_2_5lac_emp_key']
+                    senior_level_2_name=user_obj['senior_2_5lac_emp_name']
+                    
+                    senior_level_3_key=user_obj['senior_3_5lac_emp_key']
+                    senior_level_3_name=user_obj['senior_3_5lac_emp_name']
+
+                elif amount>500000 and amount<=600000: # 3 Level Approval (Any two CXO)
+                    senior_level_1_key=user_obj['senior_1_6lac_emp_key']
+                    senior_level_1_name=user_obj['senior_1_6lac_emp_name']
+
+                    senior_level_2_key=user_obj['senior_2_6lac_emp_key']
+                    senior_level_2_name=user_obj['senior_2_6lac_emp_name']
+                    
+                    senior_level_3_key=user_obj['senior_3_6lac_emp_key']
+                    senior_level_3_name=user_obj['senior_3_6lac_emp_name']
+
+                elif amount>600000 and amount<=1000000: # 1 Level Approval (CEO)
+                    senior_level_1_key=user_obj['senior_1_10lac_emp_key']
+                    senior_level_1_name=user_obj['senior_1_10lac_emp_name']
+
+                elif amount>1000000: # 1 Level Approval (Trusty)
+                    senior_level_1_key=user_obj['senior_1_above10lac_emp_key']
+                    senior_level_1_name=user_obj['senior_1_above10lac_emp_name']
+
+            elif request_obj['project_type']=='Capex - Centre Advances':
+                if amount<50000: # 3 Level Approval (PH)
+                    senior_level_1_key=user_obj['senior_1_50000_emp_key']
+                    senior_level_1_name=user_obj['senior_1_50000_emp_name']
+
+                    senior_level_2_key=user_obj['senior_2_50000_emp_key']
+                    senior_level_2_name=user_obj['senior_2_50000_emp_name']
+                    
+                    senior_level_3_key=user_obj['senior_3_50000_emp_key']
+                    senior_level_3_name=user_obj['senior_3_50000_emp_name']
+
+                elif amount>50000 and amount<=100000: # 3 Level Approval (PD)
+                    senior_level_1_key=user_obj['senior_1_5lac_emp_key']
+                    senior_level_1_name=user_obj['senior_1_5lac_emp_name']
+
+                    senior_level_2_key=user_obj['senior_2_5lac_emp_key']
+                    senior_level_2_name=user_obj['senior_2_5lac_emp_name']
+                    
+                    senior_level_3_key=user_obj['senior_3_5lac_emp_key']
+                    senior_level_3_name=user_obj['senior_3_5lac_emp_name']
+
+                elif amount>100000 and amount<=500000: # 3 Level Approval (CXO)
+                    senior_level_1_key=user_obj['senior_1_5lac_emp_key']
+                    senior_level_1_name=user_obj['senior_1_5lac_emp_name']
+
+                    senior_level_2_key=user_obj['senior_2_5lac_emp_key']
+                    senior_level_2_name=user_obj['senior_2_5lac_emp_name']
+                    
+                    senior_level_3_key=user_obj['senior_3_5lac_emp_key']
+                    senior_level_3_name=user_obj['senior_3_5lac_emp_name']
+
+                elif amount>500000 and amount<=750000: # 3 Level Approval (Any two CXO)
+                    senior_level_1_key=user_obj['senior_1_6lac_emp_key']
+                    senior_level_1_name=user_obj['senior_1_6lac_emp_name']
+
+                    senior_level_2_key=user_obj['senior_2_6lac_emp_key']
+                    senior_level_2_name=user_obj['senior_2_6lac_emp_name']
+                    
+                    senior_level_3_key=user_obj['senior_3_6lac_emp_key']
+                    senior_level_3_name=user_obj['senior_3_6lac_emp_name']
+
+                elif amount>750000 and amount<=1500000: # 1 Level Approval (CEO)
+                    senior_level_1_key=user_obj['senior_1_10lac_emp_key']
+                    senior_level_1_name=user_obj['senior_1_10lac_emp_name']
+
+                elif amount>1500000: # 1 Level Approval (Trusty)
+                    senior_level_1_key=user_obj['senior_1_above10lac_emp_key']
+                    senior_level_1_name=user_obj['senior_1_above10lac_emp_name']
+
+            elif request_obj['project_type']=='Capex - In Budget':
+                if amount<100000: # 3 Level Approval (PH)
+                    senior_level_1_key=user_obj['senior_1_50000_emp_key']
+                    senior_level_1_name=user_obj['senior_1_50000_emp_name']
+
+                    senior_level_2_key=user_obj['senior_2_50000_emp_key']
+                    senior_level_2_name=user_obj['senior_2_50000_emp_name']
+                    
+                    senior_level_3_key=user_obj['senior_3_50000_emp_key']
+                    senior_level_3_name=user_obj['senior_3_50000_emp_name']
+
+                elif amount>100000 and amount<=150000: # 3 Level Approval (PD)
+                    senior_level_1_key=user_obj['senior_1_5lac_emp_key']
+                    senior_level_1_name=user_obj['senior_1_5lac_emp_name']
+
+                    senior_level_2_key=user_obj['senior_2_5lac_emp_key']
+                    senior_level_2_name=user_obj['senior_2_5lac_emp_name']
+                    
+                    senior_level_3_key=user_obj['senior_3_5lac_emp_key']
+                    senior_level_3_name=user_obj['senior_3_5lac_emp_name']
+
+                elif amount>150000 and amount<=500000: # 3 Level Approval (CXO)
+                    senior_level_1_key=user_obj['senior_1_5lac_emp_key']
+                    senior_level_1_name=user_obj['senior_1_5lac_emp_name']
+
+                    senior_level_2_key=user_obj['senior_2_5lac_emp_key']
+                    senior_level_2_name=user_obj['senior_2_5lac_emp_name']
+                    
+                    senior_level_3_key=user_obj['senior_3_5lac_emp_key']
+                    senior_level_3_name=user_obj['senior_3_5lac_emp_name']
+
+                elif amount>500000 and amount<=750000: # 3 Level Approval (Any two CXO)
+                    senior_level_1_key=user_obj['senior_1_6lac_emp_key']
+                    senior_level_1_name=user_obj['senior_1_6lac_emp_name']
+
+                    senior_level_2_key=user_obj['senior_2_6lac_emp_key']
+                    senior_level_2_name=user_obj['senior_2_6lac_emp_name']
+                    
+                    senior_level_3_key=user_obj['senior_3_6lac_emp_key']
+                    senior_level_3_name=user_obj['senior_3_6lac_emp_name']
+
+                elif amount>750000 and amount<=1500000: # 1 Level Approval (CEO)
+                    senior_level_1_key=user_obj['senior_1_10lac_emp_key']
+                    senior_level_1_name=user_obj['senior_1_10lac_emp_name']
+
+                elif amount>1500000: # 1 Level Approval (Trusty)
+                    senior_level_1_key=user_obj['senior_1_above10lac_emp_key']
+                    senior_level_1_name=user_obj['senior_1_above10lac_emp_name']
+
+            else:
+                if amount<=10000:# 2 Level Approval
+                    senior_level_1_key=user_obj['senior_1_10000_emp_key']
+                    senior_level_1_name=user_obj['senior_1_10000_emp_name']
+
+                    senior_level_2_key=user_obj['senior_2_10000_emp_key']
+                    senior_level_2_name=user_obj['senior_2_10000_emp_name']
+
+                elif amount>10000 and amount<=50000: # 3 Level Approval
+                    senior_level_1_key=user_obj['senior_1_50000_emp_key']
+                    senior_level_1_name=user_obj['senior_1_50000_emp_name']
+
+                    senior_level_2_key=user_obj['senior_2_50000_emp_key']
+                    senior_level_2_name=user_obj['senior_2_50000_emp_name']
+                    
+                    senior_level_3_key=user_obj['senior_3_50000_emp_key']
+                    senior_level_3_name=user_obj['senior_3_50000_emp_name']
+
+                elif amount>50000 and amount<=500000: # 3 Level Approval
+                    senior_level_1_key=user_obj['senior_1_5lac_emp_key']
+                    senior_level_1_name=user_obj['senior_1_5lac_emp_name']
+
+                    senior_level_2_key=user_obj['senior_2_5lac_emp_key']
+                    senior_level_2_name=user_obj['senior_2_5lac_emp_name']
+                    
+                    senior_level_3_key=user_obj['senior_3_5lac_emp_key']
+                    senior_level_3_name=user_obj['senior_3_5lac_emp_name']
+
+                elif amount>500000 and amount<=600000: # 3 Level Approval
+                    senior_level_1_key=user_obj['senior_1_6lac_emp_key']
+                    senior_level_1_name=user_obj['senior_1_6lac_emp_name']
+
+                    senior_level_2_key=user_obj['senior_2_6lac_emp_key']
+                    senior_level_2_name=user_obj['senior_2_6lac_emp_name']
+                    
+                    senior_level_3_key=user_obj['senior_3_6lac_emp_key']
+                    senior_level_3_name=user_obj['senior_3_6lac_emp_name']
+
+                elif amount>600000 and amount<=1000000: # 1 Level Approval
+                    senior_level_1_key=user_obj['senior_1_10lac_emp_key']
+                    senior_level_1_name=user_obj['senior_1_10lac_emp_name']
+
+                elif amount>1000000: # 1 Level Approval
+                    senior_level_1_key=user_obj['senior_1_above10lac_emp_key']
+                    senior_level_1_name=user_obj['senior_1_above10lac_emp_name']
+
+            approval_track['senior_level_1']={
+                    "level" : "Senior Level 1",
+                    "name" : senior_level_1_name,
+                    "id" : senior_level_1_key,
+                    "status" : "PENDING"
+                }
+            approval_track['senior_level_2']={
+                    "level" : "Senior Level 2",
+                    "name" : senior_level_2_name,
+                    "id" : senior_level_2_key,
+                    "status" : "NOT VISIBLE"
+                }
+            approval_track['senior_level_3']={
+                    "level" : "Senior Level 3",
+                    "name" : senior_level_3_name,
+                    "id" : senior_level_3_key,
+                    "status" : "NOT VISIBLE"
+                }
+            approval_track['finance_level_1']={
+                    "level" : "Finance Level 1",
+                    "name" : finance_level_1_name,
+                    "id" : finance_level_1_key,
+                    "status" : "NOT VISIBLE"
+                }
+            approval_track['finance_level_2']={
+                    "level" : "Finance Level 2",
+                    "name" : finance_level_2_name,
+                    "id" : finance_level_2_key,
+                    "status" : "NOT VISIBLE"
+                }
+            
+    except Exception as err:
+        senior_found=False
+        print(err)
+
+    return senior_found,approval_track
+    
+def approveDeclineVoucherService(request_obj,mongo,app):
+    queryResult={}
+    try:
+        update_obj={}
+        flag=request_obj['status']
+        voucher_details=getVoucherDetailsDao(request_obj['voucher_id'],mongo)
+        remark=request_obj["reason"]
+        seniorId=request_obj['user_id']
+        timestamp=int(datetime.now().timestamp())*1000
+        approverName = ""
+        approverLevel = ""
+        approverId = ""
+        approvalTrackLevel = ""
+        notification_format=""
+        
+        for voucher in voucher_details:
+            user_id=voucher['user_id']
+            email_senior_id='NA'
+            seniorLevel1=voucher['approval_track']['senior_level_1']
+            seniorLevel2=voucher['approval_track']['senior_level_2']
+            seniorLevel3=voucher['approval_track']['senior_level_3']
+            financeLevel1=voucher['approval_track']['finance_level_1']
+            financeLevel2=voucher['approval_track']['finance_level_2']
+                    
+            # if senior id = senior level1
+            if seniorLevel1["id"]==seniorId and seniorLevel1["status"]=="PENDING":
+                approverName = seniorLevel1["name"]
+                approverId = seniorLevel1["id"]
+                approverLevel = seniorLevel1["level"]
+                approvalTrackLevel = "senior_level_1"
+
+                #  If expense approved
+                if flag=="APPROVED":
+                    if seniorLevel2["id"]=="NA":
+                        notification_format = "Please print the claim and submit to Finance Level 1 along with supporting documents if any"
+                        if seniorLevel3["id"]=="NA":
+                            notification_format = "Please print the claim and submit to Finance Level 1 along with supporting documents if any"
+                            if financeLevel1["id"]=="NA":
+                                if financeLevel2["id"]=="NA":
+                                    update_obj["voucher_status"]=flag
+                                    # create_email(po,"APPROVED",approverName,approverLevel,mongo,app)
+                                else:
+                                    email_senior_id=financeLevel2["id"]
+                                    update_obj["approval_track.finance_level_2.status"]= "PENDING"
+                            else:
+                                email_senior_id=financeLevel1["id"]
+                                update_obj["approval_track.finance_level_1.status"]= "PENDING"
+                        else:
+                            email_senior_id=seniorLevel3["id"]
+                            update_obj["approval_track.senior_level_3.status"]= "PENDING"
+                    else:
+                        email_senior_id=seniorLevel2["id"]
+                        update_obj["approval_track.senior_level_2.status"]= "PENDING"
+                
+            #  if senior id = senior level2
+            elif seniorLevel2["id"]==seniorId and seniorLevel2["status"]=="PENDING":
+                approverName = seniorLevel2["name"]
+                approverId = seniorLevel2["id"]
+                approverLevel = seniorLevel2["level"]
+                approvalTrackLevel = "senior_level_2"
+
+                #  If expense approved
+                if flag=="APPROVED":
+                    if seniorLevel3["id"]=="NA":
+                        notification_format = "Please print the claim and submit to Finance Level 1 along with supporting documents if any"
+                        if financeLevel1["id"]=="NA":
+                            if financeLevel2["id"]=="NA":
+                                update_obj["voucher_status"]=flag
+                                    # create_email(po,"APPROVED",approverName,approverLevel,mongo,app)
+                            else:
+                                email_senior_id=financeLevel2["id"]
+                                update_obj["approval_track.finance_level_2.status"]= "PENDING"
+                        else:
+                            email_senior_id=financeLevel1["id"]
+                            update_obj["approval_track.finance_level_1.status"]= "PENDING"
+                    else:
+                        email_senior_id=seniorLevel3["id"]
+                        update_obj["approval_track.senior_level_3.status"]= "PENDING"
+                    
+            # if senior id = senior level3
+            elif seniorLevel3["id"]==seniorId and seniorLevel3["status"]=="PENDING":
+                approverName = seniorLevel3["name"]
+                approverId = seniorLevel3["id"]
+                approverLevel = seniorLevel3["level"]
+                approvalTrackLevel = "senior_level_3"
+
+                #  If expense approved
+                if flag=="APPROVED":
+                    if financeLevel1["id"]=="NA":
+                        if financeLevel2["id"]=="NA":
+                            update_obj["voucher_status"]=flag
+                            # create_email(po,"APPROVED",approverName,approverLevel,mongo,app)
+                        else:
+                            email_senior_id=financeLevel2["id"]
+                            update_obj["approval_track.finance_level_2.status"]= "PENDING"
+                    else:
+                        email_senior_id=financeLevel1["id"]
+                        update_obj["approval_track.finance_level_1.status"]= "PENDING"
+
+            # if senior id = Finance level 1
+            elif financeLevel1["id"]==seniorId and financeLevel1["status"]=="PENDING":
+                approverName = financeLevel1["name"]
+                approverId = financeLevel1["id"]
+                approverLevel = financeLevel1["level"]
+                approvalTrackLevel = "finance_level_1"
+
+                #  If expense approved
+                if flag=="APPROVED":
+                    if financeLevel2["id"]=="NA":
+                        update_obj["voucher_status"]=flag
+                        # create_email(po,"APPROVED",approverName,approverLevel,mongo,app)
+                    else:
+                        email_senior_id=financeLevel2["id"]
+                        update_obj["approval_track.finance_level_2.status"]= "PENDING"
+                    
+            # if senior id = Finance level 2
+            elif financeLevel2["id"]==seniorId and financeLevel2["status"]=="PENDING":
+                approverName = financeLevel2["name"]
+                approverId = financeLevel2["id"]
+                approverLevel = financeLevel2["level"]
+                approvalTrackLevel = "finance_level_2"
+
+                #  If expense approved
+                if flag=="APPROVED":
+                    update_obj["voucher_status"]=flag
+                    # create_email(po,"APPROVED",approverName,approverLevel,mongo,app)
+                          
+            
+            update_obj["approval_track." + approvalTrackLevel + ".status"]=flag
+            update_obj["approval_track." + approvalTrackLevel + ".info"]={"status":flag,"remark":remark,"updated_on":timestamp}
+
+            # for disapproved
+            if flag=="DECLINED":
+                update_obj["voucher_status"]= "DECLINED"
+                
+            # Status Log 
+            approval_status={
+                "user_id":user_id,
+                "voucher_id":request_obj['voucher_id'],
+                "timestamp":timestamp,
+                "action":flag,
+                "approver_name":approverName,
+                "approver_level":approverLevel,
+                "approver_id":approverId,
+                "type":"approval",
+                "remark":remark
+            }
+
+            # Update Voucher
+            updateVoucherApprovalStatus(update_obj,request_obj['voucher_id'],mongo) 
+
+            # Insert into voucher-status-log
+            insertVoucherStatusLog(approval_status,mongo)
+
+            if email_senior_id!='NA':
+                try:
+                    senior_lst=getUserDetailsFromMaster(email_senior_id,mongo)
+                    if len(senior_lst)!=0:
+                        # send_notification(senior_lst[0], "Expense Request Status", "Your Expense request has been " + flag)
+                        
+                        # Notification to user
+                        user_lst=getUserDetailsFromMaster(user_id,mongo)
+                        if len(user_lst)!=0:
+                            send_notification(user_lst[0], "Expense Request Status", "Your Expense request has been " + flag)
+                            if notification_format!="":
+                                send_notification(user_lst[0], "Expense Request Status", notification_format)
+
+                        if len(user_lst)!=0:
+                            personal_email_id=senior_lst[0]['personal_email_id']
+                            subject="Expense Voucher Request"
+                            body="Expense Voucher Request by "+user_lst[0]['full_name']
+
+                            sendEmail("",personal_email_id,body,False,subject)
+
+                except Exception as identifier:
+                    print(identifier)
+                    
+        queryResult = {
+            'status': 'success',
+            'message': 'Voucher '+flag+' successfully!'
+        }
+    except Exception as err:
+        queryResult = {
+            'status': 'failure',
+            'message': 'Something went wrong!'
+        }
+        print(err)
+
+    return queryResult
+
+def getVoucherPendingLisForApprovals(u_id,mongo):
+    queryResult = []
+    try:
+        queryResult = getPendingVoucherForApprovalDao(u_id, mongo)
+    except Exception as err:
+        queryResult = []
+
+    return queryResult
+
+def getVoucherDetails(id, mongo):  
+    queryResult = []
+    try:
+        queryResult = getVoucherDetailsDao(id, mongo)
+    except Exception as err:
+        queryResult = []
+
+    return queryResult
+
+def getVoucherDetailsPrintCount(id, mongo):  
+    queryResult = {}
+    try:
+        vouchers = getVoucherDetailsDao(id, mongo)
+        count=1
+        for voucher in vouchers:
+            if 'print_count' in voucher:
+                count=voucher['print_count']+1
+
+        if count<=3:
+            # print
+            queryResult={'status':'OK'}
+            # Update print count
+            updateVoucherApprovalStatus({'print_count':count},id,mongo)
+        else:
+            # failure
+            queryResult={'status':'Failure','message':'You exceed your print limit!'}
+    except Exception as err:
+        queryResult={'status':'Failure','message':'Something went wrong!'}
+
+    return queryResult

+ 920 - 0
service/voucher_list.py

@@ -0,0 +1,920 @@
+from dao.voucher_dao import *
+from dao.vendor_dao import getAllVendorListDao
+from dao.project_dao import getAllUsersFromMaster,getPOListForReport,getUserDetailsFromMaster
+from datetime import datetime
+from dao.fetch_master_dao import getTDSRateListDao
+import time
+import json
+from utils.UploadImage import uploadImagetoFolder
+from service.voucher_approval_service import findApprovalTrackForVoucher
+from dao.voucher_approval_dao import insertVoucherStatusLog, getVoucherDetailsDao,updateVoucherApprovalStatus
+from dao.asset_dao import getAssetCategoryListDao
+from utils.Email import sendEmail
+
+def getVoucherList(u_id, mongo):  # Validate email id and password
+    queryResult = []
+    try:
+        queryResult = getVoucherListByUID(u_id, mongo)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult = []
+
+    return queryResult
+
+def getAllVoucherListService(mongo):  # Validate email id and password
+    queryResult = []
+    try:
+        queryResult = getAllVoucherList(mongo)
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult = []
+
+    return queryResult
+
+def updateVoucherDateService(data,mongo):
+    queryResult = {}
+    try:        
+        updateVoucherDao(data['voucher_code'],data['date'],mongo)
+        queryResult = {'status': 'success','message': 'Voucher updated successfully!'}
+    except Exception as err:
+        queryResult = {'status': 'failure', 'message': 'Something went wrong!'}
+        print(err)
+
+    return queryResult
+
+def submittedVoucherCopyService(id,mongo):
+    queryResult={}
+    try:
+        timestamp=int(datetime.now().timestamp())*1000
+        updateVoucherPhyCopyStatusDao(id,timestamp,mongo)
+        queryResult = {
+            'status': 'success',
+            'message': 'Copy submitted successfully!'
+        }
+    except Exception as err:
+        queryResult = {
+            'status': 'failure',
+            'message': 'Something went wrong!'
+        }
+        print(err)
+
+    return queryResult
+
+def deleteVoucherService(id,mongo):
+    queryResult={}
+    try:
+        timestamp=int(datetime.now().timestamp())*1000
+        updateVoucherDeleteStatusDao(id,timestamp,mongo)
+        queryResult = {
+            'status': 'success',
+            'message': 'Voucher deleted successfully!'
+        }
+    except Exception as err:
+        queryResult = {
+            'status': 'failure',
+            'message': 'Something went wrong!'
+        }
+        print(err)
+
+    return queryResult
+
+def delete_voucher_file_service(data,mongo):
+    queryResult={}
+    try:
+        query={}
+        update_obj={}
+        if data['file_type']=="invoice":
+            query={"id": data['voucher_id']}
+            update_obj={ "$pull": { "invoices": data['file_name'] }} 
+        elif data['file_type']=="single_vendor_justification":
+            query={"id": data['voucher_id']}
+            update_obj={"$pull": { "single_vendor_justification": data['file_name'] }}
+        elif data['file_type']=="quotation":
+            query={"id": data['voucher_id'],"quotations.id":data["quote_id"]}
+            update_obj={ "$set": { "quotations.$.quote_file": "" } }
+
+        voucherFileDeleteDao(query,update_obj,mongo)
+
+        queryResult={'status':'success','message': 'File deleted successfully!'}
+    except Exception as err:
+        print(err)
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult={'status':'failure','message': 'Something went wrong!'}
+
+    return queryResult
+
+def createVoucherService(files,data,app,mongo):
+    queryResult = {}
+    try:
+        approval_track=[]
+        timestamp=int(datetime.now().timestamp())*1000
+        total_amount = 0
+        user_id=""
+        submit=False
+        selectGenrate=False
+        formatted_dep={}
+
+        create_flag=validateCreateVoucher(data,mongo)
+        if create_flag==True:
+        
+            insert_doc = {
+                'voucher_status':'PENDING',
+                'approval_track':approval_track,
+                'maintainence_amount_limit':False
+            }
+
+            dep_list=getAssetCategoryListDao(mongo)
+
+            quotations={}
+            s_v_j=[]
+            invoices=[]
+            cheque=[]
+            # fetch voucher details
+            
+            if data['id']!='0':
+                try:
+                    voucher_details=getVoucherListById(data['id'],mongo)
+                    if len(voucher_details)!=0:
+                        if 'single_vendor_justification' in voucher_details[0]:
+                            s_v_j=voucher_details[0]['single_vendor_justification']
+                        
+                        if 'invoices' in voucher_details[0]:
+                            invoices=voucher_details[0]['invoices']
+
+                        if 'cheque' in voucher_details[0]:
+                            cheque=voucher_details[0]['cheque']
+
+                        for quote in voucher_details[0]['quotations']:
+                            quotations[quote['id']]=quote
+                except Exception as err:
+                    print("Inner",err)
+
+            for dep_obj in dep_list:
+                formatted_dep[dep_obj['name']]=dep_obj['dep']
+
+            if 'maintainence_amount_limit' in data:
+                submit=True
+                insert_doc['maintainence_amount_limit'] = True
+
+            if 'amount_limit' in data:
+                submit=True
+                insert_doc['amount_limit'] = True
+
+            if 'req_exception' in data:
+                i=0
+                for v_file in files.getlist('single_vendor_justification'):
+                    i+=1
+                    quotImageResponse = uploadImagetoFolder(v_file, 's_v_j'+str(i) , app)
+                    if quotImageResponse['status'] == 'success':
+                        s_v_j.append(quotImageResponse['message'])
+
+                if len(s_v_j)==0:
+                    queryResult = {'status': 'failure', 'message': 'Please upload single vendor justification form!'}
+                    submit=False
+                    return queryResult
+                else:
+                    submit=True
+
+                insert_doc['single_vendor_justification']=s_v_j   
+                insert_doc['req_exception'] = True
+
+            if 'req_exception_note' in data:
+                insert_doc['req_exception_note'] = data['req_exception_note']
+
+            quote_suffix = []
+            for key in data:
+                if key.startswith('v_name'):
+                    quote_suffix.append(key[len('v_name'):])
+            
+            upload=False
+            insert_doc['po_mou']=data['po_mou']
+            if 'po_mou' in data and data['po_mou']=='po' and data['po']=='NA':
+                # Amount Validation
+                if (insert_doc['maintainence_amount_limit']==True and float(data['product_total_amount' ])>=25000) or (float(data['product_total_amount' ])>=100000):
+                    upload=False
+                    queryResult = {'status': 'failure', 'message': 'Please upload mou!'}
+                else:
+                    upload=True  
+            elif 'po_mou' in data and data['po_mou']=='mou':
+                insert_doc['mou_file']=data['mou_file']
+                upload=True
+            
+            if (len(quote_suffix)>=3 or submit==True) or (data['po']!='NA') or upload==True:
+                
+                quotations_new = []
+                # Upload quotations
+                for value in quote_suffix:
+                    append = False
+                    quote = {'id':value,'v_name': '', 'exception': '', 'note': '','quote_file':[]}
+                    if value=="":
+                        quote["id"]="0"
+                    
+                    if value in quotations:
+                        quote=quotations[value]
+                    elif value=="" and '0' in quotations:
+                        quote=quotations['0']
+                    
+                    if 'v_name' + str(value) in data and data['v_name' +
+                                                            str(value)] != '':
+                        append = True
+                        quote['v_name'] = data['v_name' + str(value)]
+
+                    if 'exception' + str(value) in data:
+                        quote['exception'] = True
+                    else:
+                        quote['exception'] = False
+
+                    if 'note' + str(value) in data:
+                        quote['note'] = data['note' + str(value)]
+
+                    if 'quote_file' + str(value) in files:
+                        quote_file = (files['quote_file' + str(value)])
+                        quotImageResponse = uploadImagetoFolder(quote_file, 'quote_' + str(value), app)
+                        if quotImageResponse['status'] == 'success':
+                            
+                            quote['quote_file'] = quote['quote_file'].append(quotImageResponse['message'])
+                    
+                    if append == True:
+                        quotations_new.append(quote)
+
+                insert_doc['quotations'] = quotations_new
+            
+                
+                i=0
+                for v_file in files.getlist('invoice'):
+                    i+=1
+                    quotImageResponse = uploadImagetoFolder(
+                            v_file, 'invoice_'+str(i) , app)
+                    if quotImageResponse['status'] == 'success':
+                        invoices.append(quotImageResponse['message'])
+
+                insert_doc['invoices']=invoices
+                project_id = data['id']
+                order_id = ''
+                suffix = []
+                                
+                for key in data:
+                    if key.startswith('product_dec'):
+                        suffix.append(key[len('product_dec'):])
+
+                od = []
+
+                # Upload Order Details
+                for value in suffix:
+                    
+                    append = False
+                    
+                    quote = {
+                        'product_dec': '',
+                        'product_qty': '',
+                        'product_amount': '',
+                        'product_gst': '',
+                        'product_cat':'',
+                        'product_loc':'',
+                        'product_depriciation':'',
+                        'donated':''
+                    }
+
+                    if 'product_dec' + str(value) in data and data[
+                            'product_dec' + str(value)] != '':
+                        append = True
+                        quote['product_dec'] = data['product_dec' + str(value)]
+
+                    if data['project_type'] == 'Capex - Centre Advances' or data['project_type'] == 'Capex - In Budget':
+                        if 'product_cat' + str(value) in data and data['product_cat' + str(value)] != '':
+                            quote['product_cat'] = data['product_cat' + str(value)]
+                            if data['product_cat' + str(value)] in formatted_dep:
+                                quote['product_depriciation'] =formatted_dep[data['product_cat' + str(value)]]
+                                
+
+                        if 'product_loc' + str(value) in data and data['product_loc' + str(value)] != '':
+                            quote['product_loc'] = data['product_loc' + str(value)]
+
+                    # if 'product_depriciation' + str(value) in data:
+                    #     quote['product_depriciation'] = float(data['product_depriciation' + str(value)])
+
+                    if 'donated' + str(value) in data and data['donated' + str(value)] != '':
+                        quote['donated'] = data['donated' + str(value)]
+
+                    if 'product_qty' + str(value) in data:
+                        quote['product_qty'] = int(data['product_qty' +
+                                                        str(value)])
+
+                    if 'product_amount' + str(value) in data:
+                        quote['product_amount'] = float(data['product_amount' +
+                                                            str(value)])
+                                                    
+                    if 'product_gst' + str(value) in data:
+                        quote['product_gst'] = float(data['product_gst' +
+                                                            str(value)])
+
+                    if append == True:
+                        od.append(quote)
+
+                insert_doc['od'] = od
+                
+                if 'p_additional_charges'  in data:
+                    insert_doc['po_additional_charges'] = float(data['p_additional_charges'])
+
+                if 'tds_rate'  in data:
+                    insert_doc['tds_rate'] = float(data['tds_rate'])
+
+                if 'on_account_of' in data:
+                    insert_doc['on_account_of'] = data['on_account_of']
+                
+                # if 'tds_type'  in data:
+                #     insert_doc['tds_type'] = str(data['tds_type'])
+
+                # if 'tds_name'  in data:
+                #     insert_doc['tds_name'] = str(data['tds_name'])
+
+                user_name=""
+
+                if 'user_id'  in data:
+                    insert_doc['user_id'] = str(data['user_id'])
+                    try:
+                        user_lst=getUserDetailsFromMaster(str(data['user_id']),mongo)
+                        if len(user_lst)!=0:
+                            user_name=user_lst[0]['full_name']
+                    except Exception as err:
+                        print(err)
+
+                if 'id'  in data:
+                    insert_doc['id'] = str(data['id'])
+
+                if 'po'  in data:
+                    insert_doc['po_id'] = data['po']
+
+                if 'budget_head'  in data:
+                    insert_doc['budget_head'] = data['budget_head']
+
+                if 'project_type'  in data:
+                    insert_doc['project_type'] = data['project_type']
+
+                    # For Opex Donation
+                    if data['project_type'] == 'Opex Donation':
+                        if 'registration_copy' in files:
+                            # Upload registration_copy
+                            registration_copy_file = files['registration_copy']
+                            regImageResponse = uploadImagetoFolder(registration_copy_file,
+                                                                'reg_', app)
+                            if regImageResponse['status'] == 'success':
+                                insert_doc['registration_copy'] = regImageResponse[
+                                    'message']
+
+                        if 'deed_copy' in files:
+                            # Upload deed_copy
+                            deed_copy_file = files['deed_copy']
+                            deedImageResponse = uploadImagetoFolder(
+                                deed_copy_file, 'deed_', app)
+                            if deedImageResponse['status'] == 'success':
+                                insert_doc['deed_copy'] = deedImageResponse['message']
+
+                        if '80_g_copy' in files:
+                            # Upload 80_g_copy
+                            G80_file = files['80_g_copy']
+                            g80ImageResponse = uploadImagetoFolder(G80_file, '80g_', app)
+                            if g80ImageResponse['status'] == 'success':
+                                insert_doc['80g_copy'] = g80ImageResponse['message']
+
+                        if '12_a_copy' in files:
+                            # Upload 12_a_copy
+                            a12_file = files['12_a_copy']
+                            a12ImageResponse = uploadImagetoFolder(a12_file, '12a_', app)
+                            if a12ImageResponse['status'] == 'success':
+                                insert_doc['12a_copy'] = a12ImageResponse['message']
+
+                        if 'audit_sheet' in files:
+                            # Upload audit_sheet
+                            audit_sheet_file = files['audit_sheet']
+                            auditImageResponse = uploadImagetoFolder(
+                                audit_sheet_file, 'audit_', app)
+                            if auditImageResponse['status'] == 'success':
+                                insert_doc['audit_sheet'] = auditImageResponse['message']
+
+                        if 'board_resolution' in files:
+                            # Upload board_resolution
+                            board_resolution_file = files['board_resolution']
+                            boardImageResponse = uploadImagetoFolder(
+                                board_resolution_file, 'board_', app)
+                            if boardImageResponse['status'] == 'success':
+                                insert_doc['board_resolution'] = boardImageResponse[
+                                    'message']
+
+                        if 'donation_letter' in files:
+                            # Upload donation_letter
+                            donation_letter_file = files['donation_letter']
+                            donationImageResponse = uploadImagetoFolder(
+                                donation_letter_file, 'donation_', app)
+                            if donationImageResponse['status'] == 'success':
+                                insert_doc['donation_letter'] = donationImageResponse[
+                                    'message']
+
+                    elif data['project_type'] == 'Training & Development':
+                        insert_doc['trainer_name'] = data['trainer_name']
+                        insert_doc['training_topic'] = data['training_topic']
+                        insert_doc['training_duration'] = data['training_duration']
+                        insert_doc['training_category'] = data['training_category']
+                        insert_doc['training_count'] = int(data['training_count'])
+
+                    elif data['project_type'] == 'Capex - Centre Advances' or data['project_type'] == 'Capex - In Budget':
+                        selectGenrate==True
+
+                if 'product_total_amount' in data:
+                    insert_doc['product_total_amount'] = float(data['product_total_amount' ])
+                    total_amount = float(data['product_total_amount'])
+                    insert_doc['product_gross_amount'] = float(data['product_total_amount' ])
+
+                if 'vendor_type' in data and data['vendor_type']=='registered':
+                    if 'vendors' in data and data['vendors'] != '':
+                        vendor_id = data['vendors']  # MOU Expiry
+                        insert_doc['vendor_id'] = vendor_id
+                else:
+                    if 'vendorName' in data and data['vendorName']!='':
+                        insert_doc['vendor_name']=data['vendorName']
+                    if 'vendorAddress' in data and data['vendorAddress']!='':
+                        insert_doc['vendor_address']=data['vendorAddress']
+                    if 'vendorMobileNo' in data and data['vendorMobileNo']!='':
+                        insert_doc['vendor_number']=data['vendorMobileNo']
+                    if 'vendorEmail' in data and data['vendorEmail']!='':
+                        insert_doc['vendor_email']=data['vendorEmail']
+
+                if 'payment_type' in data and data['payment_type'] != '':
+                    payment_type = data['payment_type']  
+                    insert_doc['payment_type'] = payment_type
+                    if data['payment_type']=='neft':
+                        insert_doc['v_account_no']=data['v_account_no']
+                        insert_doc['v_ifsc']=data['v_ifsc']
+
+                        
+                        i=0
+                        for v_file in files.getlist('v_cheque_file'):
+                            i+=1
+                            quotImageResponse = uploadImagetoFolder(
+                                    v_file, 'cheq_'+str(i) , app)
+                            if quotImageResponse['status'] == 'success':
+                                cheque.append(quotImageResponse['message'])
+
+                        insert_doc['cheque']=cheque
+
+                if 'MOP' in data and data['MOP'] != '':
+                    MOP = data['MOP']  
+                    insert_doc['MOP'] = MOP
+
+                if 'amount_words' in data and data['amount_words'] != '':
+                    amount_words = data['amount_words']  # MOU Expiry
+                    insert_doc['amount_words'] = amount_words
+
+                if 'intervention' in data and data['intervention']!='':
+                    insert_doc['intervention']=data['intervention']
+                
+                if insert_doc['id']=='0':
+                    order_id,voucher_year=create_voucher_id(mongo)
+                    insert_doc['voucher_code']=order_id
+                    insert_doc['voucher_year']=voucher_year
+
+                    insert_doc['voucher_created_on'] = int(datetime.now().timestamp() *1000)
+                else:
+                    insert_doc['voucher_updated_on'] = int(datetime.now().timestamp() *1000)
+
+                senior_found,approval_track=findApprovalTrackForVoucher(insert_doc,mongo)
+                
+                if senior_found==True:
+                    insert_doc['approval_track']= approval_track
+                    
+                    if selectGenrate==True:
+                        createAndGenrateAssetCode(data,od,order_id,timestamp,mongo)
+
+                    _id=saveVoucherDao(insert_doc,mongo)
+
+                    insertVoucherStatusLog({
+                            "user_id":str(data['user_id']),
+                            "voucher_id":str(_id),
+                            "timestamp":timestamp,
+                            "action":"SUBMITTED"
+                        },mongo)
+
+                    senior_level_1=approval_track['senior_level_1']['id']
+                    senior_level_2=approval_track['senior_level_2']['id']
+                    senior_level_3=approval_track['senior_level_3']['id']
+
+                    finance_level_1=approval_track['finance_level_1']['id']
+                    finance_level_2=approval_track['finance_level_2']['id']
+
+                    senior_id='NA'
+                    if senior_level_1!='NA':
+                        senior_id=senior_level_1
+                    elif senior_level_2!='NA':
+                        senior_id=senior_level_2
+                    elif senior_level_3!='NA':
+                        senior_id=senior_level_3
+                    elif finance_level_1!='NA':
+                        senior_id=finance_level_1
+                    elif finance_level_2!='NA':
+                        senior_id=finance_level_2
+
+                    if senior_id!='NA':
+                        try:
+                            
+                            senior_lst=getUserDetailsFromMaster(senior_id,mongo)
+                            if len(senior_lst)!=0:
+                                personal_email_id=senior_lst[0]['personal_email_id']
+                                subject="Expense Voucher Request"
+                                body="Expense Voucher Request by "+user_name
+
+                                sendEmail("",personal_email_id,body,False,subject)
+                    
+                        except expression as identifier:
+                            print(identifier)
+
+                    queryResult = {
+                    'status': 'success',
+                    'message': 'Project added successfully!'
+                    }
+                else:
+                    queryResult = {
+                    'status': 'failure',
+                    'message': 'No Senior Assigned!'
+                }  
+            else:
+                if upload==True:
+                    queryResult = {'status': 'failure', 'message': '3 quotations required!'}
+        else:
+            queryResult = {'status': 'failure', 'message': 'Please regenrate the asset code and try again!'}
+    
+    except Exception as err:
+        queryResult = {'status': 'failure', 'message': 'Something went wrong!'}
+        print("Outer",err)
+
+    return queryResult
+
+def updateVoucherTDSService(request_obj,mongo):
+    queryResult={}
+    try:
+        update_obj={}
+        voucher_id=request_obj['voucher_id']
+        tds_id=request_obj["tds_id"]
+        voucher_details=getVoucherDetailsDao(voucher_id,mongo)
+        timestamp=int(datetime.now().timestamp())*1000
+                
+        formatted_tds={}
+        tds_list=getTDSRateListDao(mongo)
+        for tds_obj in tds_list:
+            formatted_tds[tds_obj['id']]=tds_obj
+
+        for voucher in voucher_details:
+            add_charges=voucher['po_additional_charges']
+            total_amt=0
+            total_gst=0
+            amt_words=''
+
+            if 'od' in voucher:
+                for od in voucher['od']:
+                    total_amt+=od['product_amount']*od['product_qty']
+                    total_gst+=od['product_gst']
+            
+            gross_amt=total_amt+add_charges+total_gst
+            
+            if tds_id=='0':
+                total_amt=gross_amt
+                amt_words=int_to_en(int(total_amt))
+                # Update Voucher
+                updateVoucherApprovalStatus({"tds_name" : "","tds_rate" : 0,"tds_type" : "","product_gross_amount":gross_amt,"product_total_amount":total_amt,'amount_words':amt_words},voucher_id,mongo) 
+            else:
+                if tds_id in formatted_tds:
+                    tds_name=formatted_tds[tds_id]['name']
+                    tds_type=formatted_tds[tds_id]['type']
+                    tds_rate=formatted_tds[tds_id]['rate']
+
+                    total_amt=(total_amt - (total_amt * tds_rate) / 100)+add_charges+total_gst
+                    amt_words=int_to_en(int(total_amt))
+                    
+                    # Update Voucher
+                    updateVoucherApprovalStatus({"tds_name" : tds_name,"tds_rate" : tds_rate,"tds_type" : tds_type,"product_gross_amount":gross_amt,"product_total_amount":total_amt,'amount_words':amt_words},voucher_id,mongo) 
+
+        queryResult = {
+            'status': 'success',
+            'message': 'Voucher updated successfully!'
+        }
+    except Exception as err:
+        queryResult = {
+            'status': 'failure',
+            'message': 'Something went wrong!'
+        }
+        print(err)
+
+    return queryResult
+
+def create_voucher_id(mongo):
+    order_id = ''
+    voucher_year=''
+    try:
+        if datetime.now().month>=4:
+            voucher_year = (str(time.strftime("%y", time.localtime())) + '-' +
+                   str(int(time.strftime("%y", time.localtime())) + 1))
+        else:
+            voucher_year = (str(int(time.strftime("%y", time.localtime()))-1) + '-' +
+                   str(int(time.strftime("%y", time.localtime())) ))
+
+        # get PO Year
+        db_year = getVoucherYear(mongo)
+        voucher_count = '01'
+
+        for year_obj in db_year:
+            
+            if voucher_year == year_obj['year']:
+                # Fetch total PO created ID
+                voucher_count = getInserterdVoucherCount(voucher_year, mongo)
+                voucher_count = str(voucher_count +
+                               1) if voucher_count + 1 > 9 else '0' + str(voucher_count +1)
+
+            else:
+                # insert new year object
+                insertVoucherYear(voucher_year, mongo)
+
+        order_id = (voucher_year + '/' + voucher_count)
+
+    except Exception as err:
+        print(err)
+
+    return order_id,voucher_year
+
+def getVoucherAnalyticsDataService(from_date,to_date, mongo):  # Validate email id and password
+    queryResult = {"total_voucher_amount":0,
+    "urgent_voucher":{'count':0,"total_amount":0},
+    "voucher_type":[],
+    "budget_head":[],
+    "intervention":[],
+    "payment_type":[],
+    "voucher_per_vendor":{}
+    }
+    formatted_vendors={}
+    voucher_per_vendor={}
+    try:
+        vouchers=getVoucherAnalyticsDataDao(from_date,to_date, mongo)
+        voucher_type={}
+        budget_head={}
+        intervention={}
+        payment_type={}
+        vendors=getAllVendorListDao(mongo)
+        
+        for vendor in vendors:
+            formatted_vendors[vendor['id']]=vendor
+
+        for voucher in vouchers:
+            try:
+                queryResult['total_voucher_amount']=queryResult['total_voucher_amount']+voucher['product_total_amount']
+                
+                if 'MOP' in voucher and voucher['MOP']=='urgent':
+                    queryResult['urgent_voucher']['count']=queryResult['urgent_voucher']['count']+1
+                    queryResult['urgent_voucher']['total_amount']=queryResult['urgent_voucher']['total_amount']+voucher['product_total_amount']
+
+                if voucher['project_type'] in voucher_type:
+                    voucher_type[voucher['project_type']]=voucher_type[voucher['project_type']]+voucher['product_total_amount']
+                else:
+                    voucher_type[voucher['project_type']]=voucher['product_total_amount']
+
+                if voucher['budget_head'] in budget_head:
+                    budget_head[voucher['budget_head']]=budget_head[voucher['budget_head']]+voucher['product_total_amount']
+                else:
+                    budget_head[voucher['budget_head']]=voucher['product_total_amount']
+            
+                if voucher['intervention'] in intervention:
+                    intervention[voucher['intervention']]=intervention[voucher['intervention']]+voucher['product_total_amount']
+                else:
+                    intervention[voucher['intervention']]=voucher['product_total_amount']
+            
+                if voucher['payment_type'] in payment_type:
+                    payment_type[voucher['payment_type']]=payment_type[voucher['payment_type']]+voucher['product_total_amount']
+                else:
+                    payment_type[voucher['payment_type']]=voucher['product_total_amount']
+
+                if voucher['vendor_id'] in voucher_per_vendor:
+                    voucher_per_vendor[voucher['vendor_id']]['count']=voucher_per_vendor[voucher['vendor_id']]['count']+1
+                    voucher_per_vendor[voucher['vendor_id']]['amount']=voucher_per_vendor[voucher['vendor_id']]['amount']+voucher['product_total_amount']
+                else:
+                    vendor_code=''
+                    vendor_name=''
+                    if voucher['vendor_id'] in formatted_vendors:
+                        vendor_code=formatted_vendors[voucher['vendor_id']]['v_code']
+                        vendor_name=formatted_vendors[voucher['vendor_id']]['v_name']
+
+                    voucher_per_vendor[voucher['vendor_id']]={'count':1,'amount':voucher['product_total_amount'],'vendor_code':vendor_code,'vendor_name':vendor_name}
+
+
+            except Exception as err:
+                print(err)
+
+        queryResult['voucher_type']=jsonToArray(voucher_type)
+        queryResult['budget_head']=jsonToArray(budget_head)
+        queryResult['intervention']=jsonToArray(intervention)
+        queryResult['payment_type']=jsonToArray(payment_type)
+        queryResult['voucher_per_vendor']=voucher_per_vendor
+
+    except Exception as err:
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult = []
+
+    return queryResult
+
+def getVoucherReportDataService(from_date,to_date,mongo):
+    queryResult = []
+    formatted_users={}
+    formatted_vendors={}
+    formatted_po={}
+    try:
+        users=getAllUsersFromMaster(mongo)
+        vendors=getAllVendorListDao(mongo)
+        purchase_orders=getPOListForReport(mongo)
+
+        for user in users:
+            formatted_users[user['key']]=user
+
+        for vendor in vendors:
+            formatted_vendors[vendor['id']]=vendor
+
+        for po in purchase_orders:
+            formatted_po[po['id']]=po['po_order_id']
+
+        vouchers = getVoucherAnalyticsDataDao(from_date,to_date, mongo)
+        for voucher in vouchers:
+            try:
+                user_id=voucher['user_id']
+                vendor_id=voucher['vendor_id']
+                po_order_id=''
+                
+                if voucher['po_id'] in formatted_po:
+                    po_order_id=formatted_po[voucher['po_id']]
+
+                for od in voucher['od']:
+                    insert_obj={'voucher_code':voucher['voucher_code'],
+                               'intervention':voucher['intervention'],
+                               'emp_id':formatted_users[user_id]['emp_id'],
+                               'user_name':formatted_users[user_id]['first_name'],
+                               'vendor_code':formatted_vendors[vendor_id]['v_code'],
+                               'vendor_name':formatted_vendors[vendor_id]['v_name'],
+                               'vendor_pan':formatted_vendors[vendor_id]['v_pan'],
+                               'project_type':voucher['project_type'],
+                               'mop':voucher['MOP'],
+                               'budget_head':voucher['budget_head'],
+                               'payment_type':voucher['payment_type'],
+                               'tds_rate':voucher['tds_rate'],
+                               'additional_charges':voucher['po_additional_charges'],
+                               'total_amount':voucher['product_total_amount'],
+                               'amount_words':voucher['amount_words'],
+                               'po_order_id':po_order_id,
+                               'product_dec':od['product_dec'],
+                               'product_qty':od['product_qty'],
+                               'product_amount':od['product_amount'],
+                               'product_gst':od['product_gst']
+                               }
+                    
+                    queryResult.append(insert_obj)
+
+            except Exception as err:
+                print(err)
+    
+    except Exception as err:
+        print(err)
+        # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
+        queryResult = []
+
+    return queryResult
+
+def getVoucherStatusLogsService(id,mongo):
+    queryResult = []
+    try:
+        queryResult = getVoucherStatusLogDao(id, mongo)
+    except Exception as err:
+        queryResult = []
+
+    return queryResult
+
+def jsonToArray(obj_data):
+    response_array=[]
+    try:
+        for key in obj_data:
+            response_array.append([key,obj_data[key]])
+    except Exception as err:
+        print(err)
+
+    return response_array
+
+def int_to_en(num):
+    d = { 0 : 'zero', 1 : 'one', 2 : 'two', 3 : 'three', 4 : 'four', 5 : 'five', \
+          6 : 'six', 7 : 'seven', 8 : 'eight', 9 : 'nine', 10 : 'ten', \
+          11 : 'eleven', 12 : 'twelve', 13 : 'thirteen', 14 : 'fourteen', \
+          15 : 'fifteen', 16 : 'sixteen', 17 : 'seventeen', 18 : 'eighteen', \
+          19 : 'ninteen', 20 : 'twenty', \
+          30 : 'thirty', 40 : 'fourth', 50 : 'fifty', 60 : 'sixty', \
+          70 : 'seventy', 80 : 'eighty', 90 : 'ninty' }
+    k = 1000
+    m = k * 1000
+
+    if (num < 20):
+        return d[num]
+
+    if (num < 100):
+        if num % 10 == 0:
+            return d[num]
+        else:
+            return d[num // 10 * 10] + ' ' + d[num % 10]
+
+    if (num < k):
+        if num % 100 == 0:
+            return d[num // 100] + ' hundred'
+        else:
+            return d[num // 100] + ' hundred ' + int_to_en(num % 100)
+    if (num < m):
+        if num % k == 0:
+            return int_to_en(num // k) + ' thousand'
+        else:
+            return int_to_en(num // k) + ' thousand, ' + int_to_en(num % k)
+
+def validateCreateVoucher(data,mongo):
+    create=False
+    
+    try:
+
+        if 'project_type'  in data:
+            if data['project_type'] == 'Capex - Centre Advances' or data['project_type'] == 'Capex - In Budget':
+                asset_code_obj=json.loads(data['generatedAssetCode'])
+                if not json.loads(data['generatedAssetCode']): # No Asset Code genrated
+                    create=True
+                else:
+                    for index in  asset_code_obj:
+                        if getAssetCodePresentOrNotDao(asset_code_obj[index][0],mongo)!=0:
+                            create=False
+                            break
+                        else:
+                            create=True
+            else:
+                create=True
+        create=True             
+    except Exception as err:
+        print(err)
+
+    return create
+
+def createAndGenrateAssetCode(data,od,voucher_code,timestamp,mongo):
+    create_voucher=False
+    try:
+        genrated_asset_code_obj=json.loads(data['generatedAssetCode'])
+        # genrated_asset_code_status_obj=json.loads(data['generatedAssetCodeStatus'])
+
+        selected_asset_code_obj=json.loads(data['selectAssetCode'])
+        # selected_asset_code_status_obj=json.loads(data['selectAssetCodeStatus'])
+
+        asset_master_type=getAssetCategoryListDao(mongo)
+        
+        formatted_asset_type={}
+        for asset_obj in asset_master_type:
+            formatted_asset_type[asset_obj['name']]=asset_obj['category']
+
+        
+        for index in  selected_asset_code_obj:
+            if len(selected_asset_code_obj[index])!=0:
+                updateAssetDetailsSelected(selected_asset_code_obj[index],{'voucher_code':voucher_code,'intervention':data['intervention']},mongo)
+        
+        for index in  genrated_asset_code_obj:
+            for asset_code in genrated_asset_code_obj[index][0]:
+                try:
+                    order_details=od[int(index)-1]
+                    asset_master_type_det=""
+
+                    owned_don="owned"
+                    if 'donated' in order_details and order_details['donated']!="":
+                        owned_don='donation'
+                    
+                    if order_details['product_cat'] in formatted_asset_type:
+                        asset_master_type_det=formatted_asset_type[order_details['product_cat']]
+
+                    insert_obj={
+                    'id':'',
+                    'amount':order_details['product_amount']+(order_details['product_gst']/order_details['product_qty']),
+                    'asset_master_type':asset_master_type_det,
+                    "assign" : False,
+                    "assign_to" : "NA",
+                    "created_on" :timestamp,
+                    "donated_by" : "NA",
+                    "place" : order_details['product_loc'],
+                    "product_name" : order_details['product_dec'],
+                    "status" : "working",
+                    "owned_donation" : owned_don,
+                    'asset_type':order_details['product_cat'],
+                    'asset_code':asset_code,
+                    'voucher_code':voucher_code,
+                    'intervention':data['intervention'],
+                    'created_from':'accounts'}
+
+                    # Insert into asset master
+                    saveAssetDetailsDao(insert_obj,mongo)
+                except Exception as err:
+                    print(err)
+        
+        create_voucher=True
+    except Exception as err:
+        create_voucher=False
+        print(err)
+
+    return create_voucher

BIN
static_img/.DS_Store


BIN
static_img/kef-logo 10.53.11 AM 10.53.11 AM.jpg


BIN
uploads/12a_1603095780257.jpeg


BIN
uploads/80g_1603095780257.jpeg


BIN
uploads/audit_1603095780258.jpeg


BIN
uploads/audit_1603095803605.jpeg


BIN
uploads/audit_1614835085236.pdf


BIN
uploads/cheq_11614170637865.pdf


BIN
uploads/cheq_11625127574550.xlsx


BIN
uploads/cheq_1602584176586.xlsx


BIN
uploads/dec_1602584176586.xlsx


BIN
uploads/deed_1603095780257.jpeg


BIN
uploads/deed_1614835085235.jpg


BIN
uploads/donation_1603095780258.jpeg


BIN
uploads/donation_1614835085237.jpg


BIN
uploads/far.xlsx


BIN
uploads/invoice_11606996785639.jpg


BIN
uploads/invoice_11606996887585.jpg


BIN
uploads/invoice_11607056146259.jpg


BIN
uploads/invoice_11607063695143.jpg


BIN
uploads/invoice_11607072422344.jpg


BIN
uploads/invoice_11607072550371.jpg


BIN
uploads/invoice_11607072632207.jpg


BIN
uploads/invoice_11607072708118.jpg


BIN
uploads/invoice_11608191892137.xlsx


BIN
uploads/invoice_11608191998601.xlsx


BIN
uploads/invoice_11608279220260.pdf


BIN
uploads/invoice_11608279461211.pdf


BIN
uploads/invoice_11608279778210.pdf


+ 38 - 0
uploads/invoice_11609998702652.xls

@@ -0,0 +1,38 @@
+"attendance_senior_level_I"
+"attendance_senior_level_II"
+"base_location"
+"blood_group"
+"current_address"
+"current_designation"
+"current_status"
+"date_of_birth"
+"emp_id"
+"expense_senior_level_50000_I"
+"expense_senior_level_50000_II"
+"expense_senior_level_50000_III"
+"expense_senior_level_10000_I"
+"expense_senior_level_10000_II"
+"expense_senior_level_10000_III"
+"finance_level_I"
+"finance_level_II"
+"first_name"
+"full_name"
+"gender"
+"intervention"
+"joining_date"
+"joining_designation"
+"joining_level"
+"joining_probation_period"
+"last_name"
+"permanent_address"
+"personal_email_id"
+"official_email_id"
+"personal_mobile_no"
+"prefix"
+"previous_experience"
+"college_name"
+"degree"
+"university_name"
+"reason_to_leave"
+"role"
+"shift_name"

BIN
uploads/invoice_11609998861797.pdf


BIN
uploads/invoice_11625127324850.pdf


BIN
uploads/invoice_11625127470790.pdf


BIN
uploads/invoice_11625127574530.pdf


BIN
uploads/invoice_11634118452014.pdf


BIN
uploads/invoice_21606996785642.jpg


BIN
uploads/invoice_21606996887594.jpg


BIN
uploads/invoice_21607056146263.jpg


BIN
uploads/invoice_21607063695147.jpg


BIN
uploads/invoice_21607072422348.jpg


BIN
uploads/invoice_21607072550378.jpg


BIN
uploads/invoice_21607072632211.jpg


BIN
uploads/invoice_21607072708125.jpg


BIN
uploads/invoice_21625127324854.pdf


BIN
uploads/invoice_21625127470793.pdf


BIN
uploads/invoice_21625127574533.pdf


BIN
uploads/invoice_31625127324856.pdf


BIN
uploads/invoice_31625127470794.pdf


BIN
uploads/invoice_31625127574537.pdf


BIN
uploads/invoice_41625127324857.pdf


BIN
uploads/invoice_41625127470795.pdf


BIN
uploads/invoice_41625127574540.pdf


BIN
uploads/invoice_51625127324858.pdf


BIN
uploads/invoice_51625127470796.pdf


برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است