| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980 |
- 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
- if data['id']!='0':
- projects = getProjectDetailsDao(data['id'], mongo)
- if len(projects)!=0 and 'mou_file' in projects[0]:
- file_found=True
-
- # 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 getPOArchiveLisForApprovals(u_id,mongo):
- queryResult = []
- try:
- queryResult = getArchivePOForApprovalDao(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_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']:
- order['product_dec']=order['product_dec'].splitlines()
- order['product_dec']=' '.join(order['product_dec'])
- order['product_dec']+=5*'\n'
-
- print(order['product_dec'])
- 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
- d_count=0
- for datum in row:
- if type(datum)==str:
- d_count = datum.count('\n') if datum.count('\n') > d_count else d_count
- 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
-
- pdf.set_y(pdf.get_y()+d_count*4.81)
- 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_xy(cell_margin+(22)+pdf.l_margin, ybefore)
- po_note=po_note.splitlines()
- po_note=' '.join(po_note)
- pdf.set_font('Times', '', 11)
- pdf.ln(8.81)
- pdf.multi_cell(epw, 3.81,
- '*Note: '+po_note,
- border=0)
-
- pdf.ln(8.81)
- pdf.cell(1.0, 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']
- 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."
- if 'official_email_id' in user and user['official_email_id']!="" and user['official_email_id']!="NA":
- reciever_email=user['official_email_id']
- sendEmail(file_name,reciever_email,body,pdf_attach,subject)
- except Exception as err:
- print(err)
-
|