voucher_list.py 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026
  1. from dao.voucher_dao import *
  2. from dao.vendor_dao import getAllVendorListDao,getVendorDetailsDao
  3. from dao.project_dao import getAllUsersFromMaster,getPOListForReport,getUserDetailsFromMaster
  4. from datetime import datetime
  5. from dao.fetch_master_dao import getTDSRateListDao
  6. import time
  7. import json
  8. from utils.UploadImage import uploadImagetoFolder
  9. from service.voucher_approval_service import findApprovalTrackForVoucher
  10. from dao.voucher_approval_dao import insertVoucherStatusLog, getVoucherDetailsDao,updateVoucherApprovalStatus
  11. from dao.asset_dao import getAssetCategoryListDao
  12. from utils.Email import sendEmail
  13. def getVoucherList(u_id, mongo): # Validate email id and password
  14. queryResult = []
  15. try:
  16. queryResult = getVoucherListByUID(u_id, mongo)
  17. except Exception as err:
  18. # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
  19. queryResult = []
  20. return queryResult
  21. def getAllVoucherListService(mongo): # Validate email id and password
  22. queryResult = []
  23. try:
  24. queryResult = getAllVoucherList(mongo)
  25. except Exception as err:
  26. # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
  27. queryResult = []
  28. return queryResult
  29. def updateVoucherDateService(data,mongo):
  30. queryResult = {}
  31. try:
  32. updateVoucherDao(data['voucher_code'],data['date'],mongo)
  33. queryResult = {'status': 'success','message': 'Voucher updated successfully!'}
  34. except Exception as err:
  35. queryResult = {'status': 'failure', 'message': 'Something went wrong!'}
  36. print(err)
  37. return queryResult
  38. def submittedVoucherCopyService(id,mongo):
  39. queryResult={}
  40. try:
  41. timestamp=int(datetime.now().timestamp())*1000
  42. updateVoucherPhyCopyStatusDao(id,timestamp,mongo)
  43. queryResult = {
  44. 'status': 'success',
  45. 'message': 'Copy submitted successfully!'
  46. }
  47. except Exception as err:
  48. queryResult = {
  49. 'status': 'failure',
  50. 'message': 'Something went wrong!'
  51. }
  52. print(err)
  53. return queryResult
  54. def deleteVoucherService(id,mongo):
  55. queryResult={}
  56. try:
  57. timestamp=int(datetime.now().timestamp())*1000
  58. updateVoucherDeleteStatusDao(id,timestamp,mongo)
  59. queryResult = {
  60. 'status': 'success',
  61. 'message': 'Voucher deleted successfully!'
  62. }
  63. except Exception as err:
  64. queryResult = {
  65. 'status': 'failure',
  66. 'message': 'Something went wrong!'
  67. }
  68. print(err)
  69. return queryResult
  70. def delete_voucher_file_service(data,mongo):
  71. queryResult={}
  72. try:
  73. query={}
  74. update_obj={}
  75. if data['file_type']=="invoice":
  76. query={"id": data['voucher_id']}
  77. update_obj={ "$pull": { "invoices": data['file_name'] }}
  78. elif data['file_type']=="single_vendor_justification":
  79. query={"id": data['voucher_id']}
  80. update_obj={"$pull": { "single_vendor_justification": data['file_name'] }}
  81. elif data['file_type']=="quotation":
  82. query={"id": data['voucher_id'],"quotations.id":data["quote_id"]}
  83. update_obj={ "$set": { "quotations.$.quote_file": "" } }
  84. elif data['file_type']=="tds_e_c":
  85. query={"id": data['voucher_id']}
  86. update_obj={ "$pull": { "tds_e_c_attachment": data['file_name'] }}
  87. voucherFileDeleteDao(query,update_obj,mongo)
  88. queryResult={'status':'success','message': 'File deleted successfully!'}
  89. except Exception as err:
  90. print(err)
  91. # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
  92. queryResult={'status':'failure','message': 'Something went wrong!'}
  93. return queryResult
  94. def createVoucherService(files,data,app,mongo):
  95. queryResult = {}
  96. try:
  97. approval_track=[]
  98. timestamp=int(datetime.now().timestamp())*1000
  99. total_amount = 0
  100. user_id=""
  101. submit=False
  102. selectGenrate=False
  103. formatted_dep={}
  104. vendor_name=""
  105. create_flag=validateCreateVoucher(data,mongo)
  106. if create_flag==True:
  107. insert_doc = {
  108. 'voucher_status':'PENDING',
  109. 'approval_track':approval_track,
  110. 'maintainence_amount_limit':False,
  111. 'tds_exemption':False,
  112. }
  113. dep_list=getAssetCategoryListDao(mongo)
  114. quotations={}
  115. s_v_j=[]
  116. invoices=[]
  117. cheque=[]
  118. tds_e_c=[]
  119. # fetch voucher details
  120. if data['id']!='0':
  121. try:
  122. voucher_details=getVoucherListById(data['id'],mongo)
  123. if len(voucher_details)!=0:
  124. if 'single_vendor_justification' in voucher_details[0]:
  125. s_v_j=voucher_details[0]['single_vendor_justification']
  126. if 'invoices' in voucher_details[0]:
  127. invoices=voucher_details[0]['invoices']
  128. if 'cheque' in voucher_details[0]:
  129. cheque=voucher_details[0]['cheque']
  130. for quote in voucher_details[0]['quotations']:
  131. quotations[quote['id']]=quote
  132. except Exception as err:
  133. print("Inner",err)
  134. for dep_obj in dep_list:
  135. formatted_dep[dep_obj['name']]=dep_obj['dep']
  136. if 'maintainence_amount_limit' in data:
  137. submit=True
  138. insert_doc['maintainence_amount_limit'] = True
  139. if 'amount_limit' in data:
  140. submit=True
  141. insert_doc['amount_limit'] = True
  142. if 'req_exception' in data:
  143. i=0
  144. for v_file in files.getlist('single_vendor_justification'):
  145. i+=1
  146. quotImageResponse = uploadImagetoFolder(v_file, 's_v_j'+str(i) , app)
  147. if quotImageResponse['status'] == 'success':
  148. s_v_j.append(quotImageResponse['message'])
  149. if len(s_v_j)==0:
  150. queryResult = {'status': 'failure', 'message': 'Please upload single vendor justification form!'}
  151. submit=False
  152. return queryResult
  153. else:
  154. submit=True
  155. insert_doc['single_vendor_justification']=s_v_j
  156. insert_doc['req_exception'] = True
  157. if 'req_exception_note' in data:
  158. insert_doc['req_exception_note'] = data['req_exception_note']
  159. # New Condition Start
  160. if 'electricity' in data:
  161. insert_doc['electricity'] = True
  162. submit=True
  163. if 'scholarship' in data:
  164. insert_doc['scholarship'] = True
  165. submit=True
  166. if 'salary_f_f' in data:
  167. insert_doc['salary_f_f'] = True
  168. submit=True
  169. if 'tds_req' in data:
  170. insert_doc['tds_req'] = True
  171. submit=True
  172. # New Condition End
  173. if 'tds_exemption' in data:
  174. i=0
  175. for tds_file in files.getlist('tds_e_c'):
  176. i+=1
  177. quotImageResponse = uploadImagetoFolder(tds_file, 'tds_e_c'+str(i) , app)
  178. if quotImageResponse['status'] == 'success':
  179. tds_e_c.append(quotImageResponse['message'])
  180. insert_doc['tds_e_c_attachment']=tds_e_c
  181. insert_doc['tds_exemption'] = True
  182. quote_suffix = []
  183. for key in data:
  184. if key.startswith('v_name'):
  185. quote_suffix.append(key[len('v_name'):])
  186. upload=False
  187. insert_doc['po_mou']=data['po_mou']
  188. if 'po_mou' in data and data['po_mou']=='po' and data['po']=='NA':
  189. # Amount Validation
  190. if (insert_doc['maintainence_amount_limit']==True and float(data['product_total_amount' ])>=25000) or (float(data['product_total_amount' ])>=100000):
  191. upload=False
  192. queryResult = {'status': 'failure', 'message': 'Please upload mou!'}
  193. else:
  194. upload=True
  195. elif 'po_mou' in data and data['po_mou']=='mou':
  196. insert_doc['mou_file']=data['mou_file']
  197. upload=True
  198. if (len(quote_suffix)>=3 or submit==True) or (data['po']!='NA') or upload==True:
  199. quotations_new = []
  200. # Upload quotations
  201. for value in quote_suffix:
  202. append = False
  203. quote = {'id':value,'v_name': '', 'exception': '', 'note': '','quote_file':[]}
  204. if value=="":
  205. quote["id"]="0"
  206. if value in quotations:
  207. quote=quotations[value]
  208. elif value=="" and '0' in quotations:
  209. quote=quotations['0']
  210. if 'v_name' + str(value) in data and data['v_name' +
  211. str(value)] != '':
  212. append = True
  213. quote['v_name'] = data['v_name' + str(value)]
  214. if 'exception' + str(value) in data:
  215. quote['exception'] = True
  216. else:
  217. quote['exception'] = False
  218. if 'note' + str(value) in data:
  219. quote['note'] = data['note' + str(value)]
  220. if 'quote_file' + str(value) in files:
  221. quote_file = (files['quote_file' + str(value)])
  222. quotImageResponse = uploadImagetoFolder(quote_file, 'quote_' + str(value), app)
  223. if quotImageResponse['status'] == 'success':
  224. quote_file_list=quote['quote_file']
  225. quote_file_list.append(quotImageResponse['message'])
  226. quote['quote_file'] = quote_file_list
  227. if append == True:
  228. quotations_new.append(quote)
  229. insert_doc['quotations'] = quotations_new
  230. i=0
  231. for v_file in files.getlist('invoice'):
  232. i+=1
  233. quotImageResponse = uploadImagetoFolder(
  234. v_file, 'invoice_'+str(i) , app)
  235. if quotImageResponse['status'] == 'success':
  236. invoices.append(quotImageResponse['message'])
  237. insert_doc['invoices']=invoices
  238. project_id = data['id']
  239. order_id = ''
  240. suffix = []
  241. for key in data:
  242. if key.startswith('product_dec'):
  243. suffix.append(key[len('product_dec'):])
  244. od = []
  245. total_amount = 0
  246. # Upload Order Details
  247. for value in suffix:
  248. append = False
  249. quote = {
  250. 'product_dec': '',
  251. 'product_qty': '',
  252. 'product_amount': '',
  253. 'product_gst': '',
  254. 'product_cat':'',
  255. 'product_loc':'',
  256. 'product_depriciation':'',
  257. 'donated':''
  258. }
  259. if 'product_dec' + str(value) in data and data[
  260. 'product_dec' + str(value)] != '':
  261. append = True
  262. quote['product_dec'] = data['product_dec' + str(value)]
  263. if data['project_type'] == 'Capex - Centre Advances' or data['project_type'] == 'Capex - In Budget':
  264. if 'product_cat' + str(value) in data and data['product_cat' + str(value)] != '':
  265. quote['product_cat'] = data['product_cat' + str(value)]
  266. if data['product_cat' + str(value)] in formatted_dep:
  267. quote['product_depriciation'] =formatted_dep[data['product_cat' + str(value)]]
  268. if 'product_loc' + str(value) in data and data['product_loc' + str(value)] != '':
  269. quote['product_loc'] = data['product_loc' + str(value)]
  270. # if 'product_depriciation' + str(value) in data:
  271. # quote['product_depriciation'] = float(data['product_depriciation' + str(value)])
  272. if 'donated' + str(value) in data and data['donated' + str(value)] != '':
  273. quote['donated'] = data['donated' + str(value)]
  274. if 'product_qty' + str(value) in data:
  275. quote['product_qty'] = int(data['product_qty' +
  276. str(value)])
  277. if 'product_amount' + str(value) in data:
  278. quote['product_amount'] = int(data['product_amount' +
  279. str(value)])
  280. if 'product_gst' + str(value) in data:
  281. quote['product_gst'] = float(data['product_gst' +
  282. str(value)])
  283. if append == True:
  284. total_amount += (quote['product_amount'] * quote['product_qty']) + quote['product_gst']
  285. od.append(quote)
  286. insert_doc['od'] = od
  287. if 'p_additional_charges' in data:
  288. insert_doc['po_additional_charges'] = float(data['p_additional_charges'])
  289. total_amount+=insert_doc['po_additional_charges']
  290. if 'tds_rate' in data:
  291. insert_doc['tds_rate'] = float(data['tds_rate'])
  292. if 'on_account_of' in data:
  293. insert_doc['on_account_of'] = data['on_account_of']
  294. # if 'tds_type' in data:
  295. # insert_doc['tds_type'] = str(data['tds_type'])
  296. # if 'tds_name' in data:
  297. # insert_doc['tds_name'] = str(data['tds_name'])
  298. user_name=""
  299. if 'user_id' in data:
  300. insert_doc['user_id'] = str(data['user_id'])
  301. try:
  302. user_lst=getUserDetailsFromMaster(str(data['user_id']),mongo)
  303. if len(user_lst)!=0:
  304. user_name=user_lst[0]['full_name']
  305. except Exception as err:
  306. print(err)
  307. if 'id' in data:
  308. insert_doc['id'] = str(data['id'])
  309. if 'po' in data:
  310. insert_doc['po_id'] = data['po']
  311. if 'budget_head' in data:
  312. insert_doc['budget_head'] = data['budget_head']
  313. if 'project_type' in data:
  314. insert_doc['project_type'] = data['project_type']
  315. # For Opex Donation
  316. if data['project_type'] == 'Opex Donation':
  317. if 'registration_copy' in files:
  318. # Upload registration_copy
  319. registration_copy_file = files['registration_copy']
  320. regImageResponse = uploadImagetoFolder(registration_copy_file,
  321. 'reg_', app)
  322. if regImageResponse['status'] == 'success':
  323. insert_doc['registration_copy'] = regImageResponse[
  324. 'message']
  325. if 'deed_copy' in files:
  326. # Upload deed_copy
  327. deed_copy_file = files['deed_copy']
  328. deedImageResponse = uploadImagetoFolder(
  329. deed_copy_file, 'deed_', app)
  330. if deedImageResponse['status'] == 'success':
  331. insert_doc['deed_copy'] = deedImageResponse['message']
  332. if '80_g_copy' in files:
  333. # Upload 80_g_copy
  334. G80_file = files['80_g_copy']
  335. g80ImageResponse = uploadImagetoFolder(G80_file, '80g_', app)
  336. if g80ImageResponse['status'] == 'success':
  337. insert_doc['80g_copy'] = g80ImageResponse['message']
  338. if '12_a_copy' in files:
  339. # Upload 12_a_copy
  340. a12_file = files['12_a_copy']
  341. a12ImageResponse = uploadImagetoFolder(a12_file, '12a_', app)
  342. if a12ImageResponse['status'] == 'success':
  343. insert_doc['12a_copy'] = a12ImageResponse['message']
  344. if 'audit_sheet' in files:
  345. # Upload audit_sheet
  346. audit_sheet_file = files['audit_sheet']
  347. auditImageResponse = uploadImagetoFolder(
  348. audit_sheet_file, 'audit_', app)
  349. if auditImageResponse['status'] == 'success':
  350. insert_doc['audit_sheet'] = auditImageResponse['message']
  351. if 'board_resolution' in files:
  352. # Upload board_resolution
  353. board_resolution_file = files['board_resolution']
  354. boardImageResponse = uploadImagetoFolder(
  355. board_resolution_file, 'board_', app)
  356. if boardImageResponse['status'] == 'success':
  357. insert_doc['board_resolution'] = boardImageResponse[
  358. 'message']
  359. if 'donation_letter' in files:
  360. # Upload donation_letter
  361. donation_letter_file = files['donation_letter']
  362. donationImageResponse = uploadImagetoFolder(
  363. donation_letter_file, 'donation_', app)
  364. if donationImageResponse['status'] == 'success':
  365. insert_doc['donation_letter'] = donationImageResponse[
  366. 'message']
  367. elif data['project_type'] == 'Training & Development':
  368. insert_doc['trainer_name'] = data['trainer_name']
  369. insert_doc['training_topic'] = data['training_topic']
  370. insert_doc['training_duration'] = data['training_duration']
  371. insert_doc['training_category'] = data['training_category']
  372. insert_doc['training_count'] = int(data['training_count'])
  373. elif data['project_type'] == 'Capex - Centre Advances' or data['project_type'] == 'Capex - In Budget':
  374. selectGenrate==True
  375. if 'product_total_amount' in data:
  376. insert_doc['product_total_amount'] = total_amount
  377. insert_doc['product_gross_amount'] = total_amount
  378. if 'vendor_type' in data and data['vendor_type']=='registered':
  379. if 'vendors' in data and data['vendors'] != '':
  380. vendor_id = data['vendors'] # MOU Expiry
  381. insert_doc['vendor_id'] = vendor_id
  382. vendor_lst=getVendorDetailsDao(vendor_id,mongo)
  383. if len(vendor_lst)!=0:
  384. vendor_name=vendor_lst[0]['v_name']
  385. else:
  386. if 'vendorName' in data and data['vendorName']!='':
  387. insert_doc['vendor_name']=data['vendorName']
  388. vendor_name=data['vendorName']
  389. if 'vendorAddress' in data and data['vendorAddress']!='':
  390. insert_doc['vendor_address']=data['vendorAddress']
  391. if 'vendorMobileNo' in data and data['vendorMobileNo']!='':
  392. insert_doc['vendor_number']=data['vendorMobileNo']
  393. if 'vendorEmail' in data and data['vendorEmail']!='':
  394. insert_doc['vendor_email']=data['vendorEmail']
  395. if 'payment_type' in data and data['payment_type'] != '':
  396. payment_type = data['payment_type']
  397. insert_doc['payment_type'] = payment_type
  398. if data['payment_type']=='neft':
  399. insert_doc['v_account_no']=data['v_account_no']
  400. insert_doc['v_ifsc']=data['v_ifsc']
  401. i=0
  402. for v_file in files.getlist('v_cheque_file'):
  403. i+=1
  404. quotImageResponse = uploadImagetoFolder(
  405. v_file, 'cheq_'+str(i) , app)
  406. if quotImageResponse['status'] == 'success':
  407. cheque.append(quotImageResponse['message'])
  408. insert_doc['cheque']=cheque
  409. if 'MOP' in data and data['MOP'] != '':
  410. MOP = data['MOP']
  411. insert_doc['MOP'] = MOP
  412. if 'amount_words' in data and data['amount_words'] != '':
  413. amount_words = number_to_word(total_amount)
  414. insert_doc['amount_words'] = amount_words.lower()
  415. if 'intervention' in data and data['intervention']!='':
  416. insert_doc['intervention']=data['intervention']
  417. if 'project_name' in data and data['project_name']!='':
  418. insert_doc['project_name']=data['project_name']
  419. if insert_doc['id']=='0':
  420. order_id,voucher_year=create_voucher_id(mongo)
  421. insert_doc['voucher_code']=order_id
  422. insert_doc['voucher_year']=voucher_year
  423. insert_doc['voucher_created_on'] = int(datetime.now().timestamp() *1000)
  424. else:
  425. insert_doc['voucher_updated_on'] = int(datetime.now().timestamp() *1000)
  426. senior_found,approval_track=findApprovalTrackForVoucher(insert_doc,mongo)
  427. if senior_found==True:
  428. insert_doc['approval_track']= approval_track
  429. if selectGenrate==True:
  430. createAndGenrateAssetCode(data,od,order_id,timestamp,mongo)
  431. _id=saveVoucherDao(insert_doc,mongo)
  432. insertVoucherStatusLog({
  433. "user_id":str(data['user_id']),
  434. "voucher_id":str(_id),
  435. "timestamp":timestamp,
  436. "action":"SUBMITTED"
  437. },mongo)
  438. senior_level_1=approval_track['senior_level_1']['id']
  439. senior_level_2=approval_track['senior_level_2']['id']
  440. senior_level_3=approval_track['senior_level_3']['id']
  441. finance_level_1=approval_track['finance_level_1']['id']
  442. finance_level_2=approval_track['finance_level_2']['id']
  443. senior_id='NA'
  444. if senior_level_1!='NA':
  445. senior_id=senior_level_1
  446. elif senior_level_2!='NA':
  447. senior_id=senior_level_2
  448. elif senior_level_3!='NA':
  449. senior_id=senior_level_3
  450. elif finance_level_1!='NA':
  451. senior_id=finance_level_1
  452. elif finance_level_2!='NA':
  453. senior_id=finance_level_2
  454. if senior_id!='NA':
  455. try:
  456. senior_lst=getUserDetailsFromMaster(senior_id,mongo)
  457. if len(senior_lst)!=0:
  458. name=""
  459. if 'first_name' in senior_lst[0]:
  460. name+=senior_lst[0]['first_name']
  461. if 'last_name' in senior_lst[0]:
  462. name+=" "+senior_lst[0]['last_name']
  463. subject="Expense Voucher Request"
  464. body="Dear "+name+",<br /><br /> Expense Voucher raised by "+user_name+" of '"+vendor_name+"' of rs "+str(round(total_amount,2))+", please approve the same."
  465. if 'official_email_id' in senior_lst[0] and senior_lst[0]['official_email_id']!="" and senior_lst[0]['official_email_id']!="NA":
  466. reciever_email=senior_lst[0]['official_email_id']
  467. sendEmail("",reciever_email,body,False,subject)
  468. except Exception as identifier:
  469. print(identifier)
  470. queryResult = {
  471. 'status': 'success',
  472. 'message': 'Voucher added successfully!'
  473. }
  474. else:
  475. queryResult = {
  476. 'status': 'failure',
  477. 'message': 'No Senior Assigned!'
  478. }
  479. else:
  480. if upload==True:
  481. queryResult = {'status': 'failure', 'message': '3 quotations required!'}
  482. else:
  483. queryResult = {'status': 'failure', 'message': 'Please regenrate the asset code and try again!'}
  484. except Exception as err:
  485. queryResult = {'status': 'failure', 'message': 'Something went wrong!'}
  486. print("Outer",err)
  487. return queryResult
  488. def updateVoucherTDSService(request_obj,mongo):
  489. queryResult={}
  490. try:
  491. update_obj={}
  492. voucher_id=request_obj['voucher_id']
  493. tds_id=request_obj["tds_id"]
  494. voucher_details=getVoucherDetailsDao(voucher_id,mongo)
  495. timestamp=int(datetime.now().timestamp())*1000
  496. formatted_tds={}
  497. tds_list=getTDSRateListDao(mongo)
  498. for tds_obj in tds_list:
  499. formatted_tds[tds_obj['id']]=tds_obj
  500. for voucher in voucher_details:
  501. add_charges=voucher['po_additional_charges']
  502. total_amt=0
  503. total_gst=0
  504. amt_words=''
  505. if 'od' in voucher:
  506. for od in voucher['od']:
  507. total_amt+=od['product_amount']*od['product_qty']
  508. total_gst+=od['product_gst']
  509. gross_amt=total_amt+add_charges+total_gst
  510. if tds_id=='0':
  511. total_amt=gross_amt
  512. amt_words=int_to_en(int(total_amt))
  513. # Update Voucher
  514. 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)
  515. else:
  516. if tds_id in formatted_tds:
  517. tds_name=formatted_tds[tds_id]['name']
  518. tds_type=formatted_tds[tds_id]['type']
  519. tds_rate=formatted_tds[tds_id]['rate']
  520. total_amt=(total_amt - (total_amt * tds_rate) / 100)+add_charges+total_gst
  521. amt_words=int_to_en(int(total_amt))
  522. # Update Voucher
  523. 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)
  524. queryResult = {
  525. 'status': 'success',
  526. 'message': 'Voucher updated successfully!'
  527. }
  528. except Exception as err:
  529. queryResult = {
  530. 'status': 'failure',
  531. 'message': 'Something went wrong!'
  532. }
  533. print(err)
  534. return queryResult
  535. def create_voucher_id(mongo):
  536. order_id = ''
  537. voucher_year=''
  538. try:
  539. if datetime.now().month>=4:
  540. voucher_year = (str(time.strftime("%y", time.localtime())) + '-' +
  541. str(int(time.strftime("%y", time.localtime())) + 1))
  542. else:
  543. voucher_year = (str(int(time.strftime("%y", time.localtime()))-1) + '-' +
  544. str(int(time.strftime("%y", time.localtime())) ))
  545. # get PO Year
  546. db_year = getVoucherYear(mongo)
  547. voucher_count = '01'
  548. for year_obj in db_year:
  549. print(year_obj,voucher_year)
  550. if voucher_year == year_obj['year']:
  551. # Fetch total PO created ID
  552. voucher_count = getInserterdVoucherCount(voucher_year, mongo)
  553. voucher_count = str(voucher_count +
  554. 1) if voucher_count + 1 > 9 else '0' + str(voucher_count +1)
  555. else:
  556. # insert new year object
  557. insertVoucherYear(voucher_year, mongo)
  558. order_id = (voucher_year + '/' + voucher_count)
  559. except Exception as err:
  560. print(err)
  561. return order_id,voucher_year
  562. def getVoucherAnalyticsDataService(from_date,to_date, mongo): # Validate email id and password
  563. queryResult = {"total_voucher_amount":0,
  564. "urgent_voucher":{'count':0,"total_amount":0},
  565. "voucher_type":[],
  566. "budget_head":[],
  567. "intervention":[],
  568. "payment_type":[],
  569. "voucher_per_vendor":{}
  570. }
  571. formatted_vendors={}
  572. voucher_per_vendor={}
  573. try:
  574. vouchers=getVoucherAnalyticsDataDao(from_date,to_date, mongo)
  575. voucher_type={}
  576. budget_head={}
  577. intervention={}
  578. payment_type={}
  579. vendors=getAllVendorListDao(mongo)
  580. for vendor in vendors:
  581. formatted_vendors[vendor['id']]=vendor
  582. for voucher in vouchers:
  583. try:
  584. queryResult['total_voucher_amount']=queryResult['total_voucher_amount']+voucher['product_total_amount']
  585. if 'MOP' in voucher and voucher['MOP']=='urgent':
  586. queryResult['urgent_voucher']['count']=queryResult['urgent_voucher']['count']+1
  587. queryResult['urgent_voucher']['total_amount']=queryResult['urgent_voucher']['total_amount']+voucher['product_total_amount']
  588. if voucher['project_type'] in voucher_type:
  589. voucher_type[voucher['project_type']]=voucher_type[voucher['project_type']]+voucher['product_total_amount']
  590. else:
  591. voucher_type[voucher['project_type']]=voucher['product_total_amount']
  592. if voucher['budget_head'] in budget_head:
  593. budget_head[voucher['budget_head']]=budget_head[voucher['budget_head']]+voucher['product_total_amount']
  594. else:
  595. budget_head[voucher['budget_head']]=voucher['product_total_amount']
  596. if voucher['intervention'] in intervention:
  597. intervention[voucher['intervention']]=intervention[voucher['intervention']]+voucher['product_total_amount']
  598. else:
  599. intervention[voucher['intervention']]=voucher['product_total_amount']
  600. if voucher['payment_type'] in payment_type:
  601. payment_type[voucher['payment_type']]=payment_type[voucher['payment_type']]+voucher['product_total_amount']
  602. else:
  603. payment_type[voucher['payment_type']]=voucher['product_total_amount']
  604. if voucher['vendor_id'] in voucher_per_vendor:
  605. voucher_per_vendor[voucher['vendor_id']]['count']=voucher_per_vendor[voucher['vendor_id']]['count']+1
  606. voucher_per_vendor[voucher['vendor_id']]['amount']=voucher_per_vendor[voucher['vendor_id']]['amount']+voucher['product_total_amount']
  607. else:
  608. vendor_code=''
  609. vendor_name=''
  610. if voucher['vendor_id'] in formatted_vendors:
  611. vendor_code=formatted_vendors[voucher['vendor_id']]['v_code']
  612. vendor_name=formatted_vendors[voucher['vendor_id']]['v_name']
  613. voucher_per_vendor[voucher['vendor_id']]={'count':1,'amount':voucher['product_total_amount'],'vendor_code':vendor_code,'vendor_name':vendor_name}
  614. except Exception as err:
  615. print(err)
  616. queryResult['voucher_type']=jsonToArray(voucher_type)
  617. queryResult['budget_head']=jsonToArray(budget_head)
  618. queryResult['intervention']=jsonToArray(intervention)
  619. queryResult['payment_type']=jsonToArray(payment_type)
  620. queryResult['voucher_per_vendor']=voucher_per_vendor
  621. except Exception as err:
  622. # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
  623. queryResult = []
  624. return queryResult
  625. def getVoucherReportDataService(from_date,to_date,mongo):
  626. queryResult = []
  627. formatted_users={}
  628. formatted_vendors={}
  629. formatted_po={}
  630. try:
  631. users=getAllUsersFromMaster(mongo)
  632. vendors=getAllVendorListDao(mongo)
  633. purchase_orders=getPOListForReport(mongo)
  634. for user in users:
  635. formatted_users[user['key']]=user
  636. for vendor in vendors:
  637. formatted_vendors[vendor['id']]=vendor
  638. for po in purchase_orders:
  639. formatted_po[po['id']]=po['po_order_id']
  640. vouchers = getVoucherAnalyticsDataDao(from_date,to_date, mongo)
  641. for voucher in vouchers:
  642. try:
  643. user_id=voucher['user_id']
  644. vendor_id=voucher['vendor_id']
  645. v_code =""
  646. v_name =""
  647. v_pan=""
  648. if vendor_id in formatted_vendors:
  649. v_code = formatted_vendors[vendor_id]['v_code']
  650. v_name = formatted_vendors[vendor_id]['v_name']
  651. v_pan = formatted_vendors[vendor_id]['v_pan']
  652. elif 'vendor_name' in voucher:
  653. v_name = voucher['vendor_name']
  654. po_order_id=''
  655. created_on = datetime.fromtimestamp((voucher['voucher_created_on']/1000))
  656. if voucher['po_id'] in formatted_po:
  657. po_order_id=formatted_po[voucher['po_id']]
  658. for od in voucher['od']:
  659. insert_obj={'voucher_code':voucher['voucher_code'],
  660. 'intervention':voucher['intervention'],
  661. 'emp_id':formatted_users[user_id]['emp_id'],
  662. 'user_name':formatted_users[user_id]['first_name'],
  663. 'vendor_code':v_code,
  664. 'vendor_name':v_name,
  665. 'vendor_pan':v_pan,
  666. 'project_type':voucher['project_type'],
  667. 'mop':voucher['MOP'],
  668. 'budget_head':voucher['budget_head'],
  669. 'payment_type':voucher['payment_type'],
  670. 'tds_rate':voucher['tds_rate'],
  671. 'additional_charges':voucher['po_additional_charges'],
  672. 'total_amount':voucher['product_total_amount'],
  673. 'amount_words':voucher['amount_words'],
  674. 'po_order_id':po_order_id,
  675. 'product_dec':od['product_dec'],
  676. 'product_qty':od['product_qty'],
  677. 'product_amount':od['product_amount'],
  678. 'product_gst':od['product_gst'],
  679. 'on_account_of':'',
  680. 'voucher_created_on':created_on.strftime("%d/%m/%Y %H:%M%p")
  681. }
  682. if 'on_account_of' in voucher:
  683. insert_obj['on_account_of']=voucher['on_account_of']
  684. queryResult.append(insert_obj)
  685. except Exception as err:
  686. print(err)
  687. except Exception as err:
  688. print(err)
  689. # insert_into_error_log({'timestamp':int(datetime.now().timestamp()*1000),'type':'api','err':str(err),'function':'validateLogin'},mongo)
  690. queryResult = []
  691. return queryResult
  692. def getVoucherStatusLogsService(id,mongo):
  693. queryResult = []
  694. try:
  695. queryResult = getVoucherStatusLogDao(id, mongo)
  696. except Exception as err:
  697. queryResult = []
  698. return queryResult
  699. def jsonToArray(obj_data):
  700. response_array=[]
  701. try:
  702. for key in obj_data:
  703. response_array.append([key,obj_data[key]])
  704. except Exception as err:
  705. print(err)
  706. return response_array
  707. def int_to_en(num):
  708. d = { 0 : 'zero', 1 : 'one', 2 : 'two', 3 : 'three', 4 : 'four', 5 : 'five', \
  709. 6 : 'six', 7 : 'seven', 8 : 'eight', 9 : 'nine', 10 : 'ten', \
  710. 11 : 'eleven', 12 : 'twelve', 13 : 'thirteen', 14 : 'fourteen', \
  711. 15 : 'fifteen', 16 : 'sixteen', 17 : 'seventeen', 18 : 'eighteen', \
  712. 19 : 'ninteen', 20 : 'twenty', \
  713. 30 : 'thirty', 40 : 'fourth', 50 : 'fifty', 60 : 'sixty', \
  714. 70 : 'seventy', 80 : 'eighty', 90 : 'ninty' }
  715. k = 1000
  716. m = k * 1000
  717. if (num < 20):
  718. return d[num]
  719. if (num < 100):
  720. if num % 10 == 0:
  721. return d[num]
  722. else:
  723. return d[num // 10 * 10] + ' ' + d[num % 10]
  724. if (num < k):
  725. if num % 100 == 0:
  726. return d[num // 100] + ' hundred'
  727. else:
  728. return d[num // 100] + ' hundred ' + int_to_en(num % 100)
  729. if (num < m):
  730. if num % k == 0:
  731. return int_to_en(num // k) + ' thousand'
  732. else:
  733. return int_to_en(num // k) + ' thousand, ' + int_to_en(num % k)
  734. def validateCreateVoucher(data,mongo):
  735. create=False
  736. try:
  737. if 'project_type' in data:
  738. if data['project_type'] == 'Capex - Centre Advances' or data['project_type'] == 'Capex - In Budget':
  739. asset_code_obj=json.loads(data['generatedAssetCode'])
  740. if not json.loads(data['generatedAssetCode']): # No Asset Code genrated
  741. create=True
  742. else:
  743. for index in asset_code_obj:
  744. if getAssetCodePresentOrNotDao(asset_code_obj[index][0],mongo)!=0:
  745. create=False
  746. break
  747. else:
  748. create=True
  749. else:
  750. create=True
  751. create=True
  752. except Exception as err:
  753. print(err)
  754. return create
  755. def createAndGenrateAssetCode(data,od,voucher_code,timestamp,mongo):
  756. create_voucher=False
  757. try:
  758. genrated_asset_code_obj=json.loads(data['generatedAssetCode'])
  759. # genrated_asset_code_status_obj=json.loads(data['generatedAssetCodeStatus'])
  760. selected_asset_code_obj=json.loads(data['selectAssetCode'])
  761. # selected_asset_code_status_obj=json.loads(data['selectAssetCodeStatus'])
  762. asset_master_type=getAssetCategoryListDao(mongo)
  763. formatted_asset_type={}
  764. for asset_obj in asset_master_type:
  765. formatted_asset_type[asset_obj['name']]=asset_obj['category']
  766. for index in selected_asset_code_obj:
  767. if len(selected_asset_code_obj[index])!=0:
  768. updateAssetDetailsSelected(selected_asset_code_obj[index],{'voucher_code':voucher_code,'intervention':data['intervention']},mongo)
  769. for index in genrated_asset_code_obj:
  770. for asset_code in genrated_asset_code_obj[index][0]:
  771. try:
  772. order_details=od[int(index)-1]
  773. asset_master_type_det=""
  774. owned_don="owned"
  775. if 'donated' in order_details and order_details['donated']!="":
  776. owned_don='donation'
  777. if order_details['product_cat'] in formatted_asset_type:
  778. asset_master_type_det=formatted_asset_type[order_details['product_cat']]
  779. insert_obj={
  780. 'id':'',
  781. 'amount':order_details['product_amount']+(order_details['product_gst']/order_details['product_qty']),
  782. 'asset_master_type':asset_master_type_det,
  783. "assign" : False,
  784. "assign_to" : "NA",
  785. "created_on" :timestamp,
  786. "donated_by" : "NA",
  787. "place" : order_details['product_loc'],
  788. "product_name" : order_details['product_dec'],
  789. "status" : "working",
  790. "owned_donation" : owned_don,
  791. 'asset_type':order_details['product_cat'],
  792. 'asset_code':asset_code,
  793. 'voucher_code':voucher_code,
  794. 'intervention':data['intervention'],
  795. 'created_from':'accounts'}
  796. # Insert into asset master
  797. saveAssetDetailsDao(insert_obj,mongo)
  798. except Exception as err:
  799. print(err)
  800. create_voucher=True
  801. except Exception as err:
  802. create_voucher=False
  803. print(err)
  804. return create_voucher
  805. def number_to_word(number):
  806. def get_word(n):
  807. words={ 0:"", 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:"Nineteen", 20:"Twenty", 30:"Thirty", 40:"Forty", 50:"Fifty", 60:"Sixty", 70:"Seventy", 80:"Eighty", 90:"Ninty" }
  808. if n<=20:
  809. return words[n]
  810. else:
  811. ones=n%10
  812. tens=n-ones
  813. return words[tens]+" "+words[ones]
  814. def get_all_word(n):
  815. d=[100,10,100,100]
  816. v=["","Hundred And","Thousand","lakh"]
  817. w=[]
  818. for i,x in zip(d,v):
  819. t=get_word(n%i)
  820. if t!="":
  821. t+=" "+x
  822. w.append(t.rstrip(" "))
  823. n=n//i
  824. w.reverse()
  825. w=' '.join(w).strip()
  826. if w.endswith("And"):
  827. w=w[:-3]
  828. return w
  829. arr=str(number).split(".")
  830. number=int(arr[0])
  831. crore=number//10000000
  832. number=number%10000000
  833. word=""
  834. if crore>0:
  835. word+=get_all_word(crore)
  836. word+=" crore "
  837. word+=get_all_word(number).strip()+" Rupees"
  838. if len(arr)>1:
  839. if len(arr[1])==1:
  840. arr[1]+="0"
  841. word+=" and "+get_all_word(int(arr[1]))+" paisa"
  842. return word