Advertisement
Guest User

Untitled

a guest
Jun 3rd, 2016
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.40 KB | None | 0 0
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import cx_Oracle
  5. import logging
  6. import os
  7. from datetime import datetime
  8. from datetime import timedelta
  9. import xlsxwriter
  10. import smtplib
  11. import base64
  12. import StringIO
  13. import os
  14.  
  15. os.environ['NLS_LANG'] = "RUSSIAN.AL32UTF8"
  16. LOG_FILENAME='report_service.log'
  17. logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)
  18. logging.info("started at: " + str(datetime.now()))
  19.  
  20. sqlquery = """
  21. WITH acc_bals AS
  22. (SELECT VC_CODE,
  23. N_ACCOUNT_ID,
  24. N_SUBJECT_ID,
  25. SI_USERS_PKG_S.GET_ACCOUNT_BALANCE_SUM(N_ACCOUNT_ID) N_BAL
  26. FROM SI_V_SUBJ_ACCOUNTS
  27. WHERE N_ACCOUNT_TYPE_ID = '2042'
  28. ),
  29. raw_tbl AS
  30. (SELECT SS.VC_SUBJ_NAME VC_SUBJ,
  31. acc_bals.VC_CODE VC_ACC,
  32. UG.VC_DOC_CODE VC_DOC,
  33. UG.VC_GOOD_NAME VC_GOOD,
  34. SC.N_SUM N_SUM,
  35. acc_bals.N_BAL N_BAL,
  36. PT.D_TIME D_PAY,
  37. TRUNC(SYSDATE) - TRUNC(PT.D_TIME) N_DAYS,
  38. FLOOR(MONTHS_BETWEEN(SYSDATE, PT.D_TIME)) N_MONTH,
  39. SI_ADDRESSES_PKG_S.GET_ADDR_LIST_STR_BY_SUBJ(SS.N_SUBJECT_ID, 13006, vch_VC_SEPARATOR => '; ') VC_TEL,
  40. SA.N_REGION_ID,
  41. U.VC_TAGS VC_TAGS
  42. FROM SI_V_USER_GOODS UG,
  43. SI_V_USERS U,
  44. si_v_subjects SS,
  45. SI_V_SUBJECT_BIND_GROUPS SG,
  46. acc_bals,
  47. SD_V_PAYMENTS_T PT,
  48. SD_V_INVOICES_C SC,
  49. SD_V_INVOICES_T ST,
  50. SI_V_OBJ_ADDRESSES SA
  51. WHERE (1 =1)
  52. AND SG.N_SUBJECT_ID = U.N_SUBJECT_ID
  53. AND SG.N_SUBJ_GROUP_ID IN ('2325492801','2325492901')
  54. AND SA.N_OBJECT_ID = UG.N_OBJECT_ID
  55. AND SA.N_ADDR_TYPE_ID = '1006'
  56. AND SA.N_OBJ_ADDR_TYPE_ID = '6016'
  57. AND SA.C_FL_ACTUAL = 'Y'
  58. AND SC.N_SUBJ_GOOD_ID = UG.N_SUBJ_GOOD_ID
  59. AND ST.N_DOC_ID = SC.N_DOC_ID
  60. AND ST.N_DOC_STATE_ID = '4003'
  61. AND acc_bals.N_BAL < 0
  62. AND acc_bals.N_SUBJECT_ID = U.N_SUBJECT_ID
  63. AND SS.N_SUBJECT_ID = U.N_BASE_SUBJECT_ID
  64. AND U.N_SUBJ_STATE_ID IN('2011','3011')
  65. AND UG.N_SUBJECT_ID = acc_bals.N_SUBJECT_ID
  66. AND UG.C_FL_CLOSED = 'N'
  67. AND UG.N_PAR_SUBJ_GOOD_ID IS NULL
  68. AND PT.N_FORWHO_SUBJECT_ID = U.N_SUBJECT_ID
  69. AND PT.D_TIME =
  70. (SELECT MAX(D_TIME)
  71. FROM SD_V_PAYMENTS_T
  72. WHERE N_FORWHO_ACCOUNT_ID = acc_bals.N_ACCOUNT_ID
  73. AND N_DOC_TYPE_ID IN (SYS_CONTEXT('CONST','DOC_TYPE_PaymentOrder'),SYS_CONTEXT('CONST','DOC_TYPE_CashWarrant'))
  74. )
  75. AND ( SS.N_SUBJ_TYPE_ID = 1001
  76. OR SS.N_SUBJ_TYPE_ID = 18001)
  77. ),
  78. regs AS
  79. (SELECT (
  80. CASE N_REGION_TYPE_ID
  81. WHEN 6027
  82. THEN VC_FULL_NAME
  83. ELSE VC_VISUAL_NAME
  84. END) VC_NAME,
  85. n_region_id,
  86. n_par_region_id,
  87. N_REGION_TYPE_ID,
  88. level AS N_LEVEL,
  89. CONNECT_BY_ISLEAF AS IsLeaf
  90. FROM sr_v_regions
  91. START WITH n_par_region_id IS NULL
  92. CONNECT BY PRIOR n_region_id = n_par_region_id
  93. ),
  94. regs_f AS
  95. (SELECT R1.VC_NAME VC_STREET,
  96. R2.VC_NAME VC_HOUSE,
  97. R2.n_region_id
  98. FROM regs R1,
  99. regs R2
  100. WHERE R1.n_region_id = R2.n_par_region_id
  101. AND R2.IsLeaf = 1
  102. AND R2.N_REGION_TYPE_ID = '6027'
  103. )
  104. SELECT VC_SUBJ ,
  105. VC_ACC ,
  106. VC_DOC ,
  107. SUM(N_SUM) N_SUM,
  108. N_BAL ,
  109. D_PAY ,
  110. N_DAYS ,
  111. N_MONTH ,
  112. VC_TEL ,
  113. VC_TAGS ,
  114. regs_f.VC_STREET ,
  115. regs_f.VC_HOUSE
  116. FROM raw_tbl,
  117. regs_f
  118. WHERE (1 =1)
  119. AND regs_f.n_region_id (+) = raw_tbl.n_region_id
  120. GROUP BY VC_SUBJ,
  121. VC_ACC,
  122. VC_DOC,
  123. N_BAL,
  124. D_PAY,
  125. N_DAYS,
  126. N_MONTH,
  127. VC_TEL,
  128. VC_TAGS,
  129. regs_f.VC_STREET,
  130. regs_f.VC_HOUSE
  131. """
  132.  
  133. try:
  134. con = cx_Oracle.Connection(user="user", password="password", dsn="db_tns_name");
  135. cursor = con.cursor()
  136. cursor.execute(sqlquery)
  137. result = cursor.fetchall()
  138. cursor.close()
  139. except ValueError:
  140. logging.debug('db connection error')
  141.  
  142. con.close()
  143.  
  144. outfile = StringIO.StringIO()
  145. filename = "report.xlsx"
  146. reciever = 'receiver@example.ru'
  147. sender = 'robot@sender.example.ru'
  148. subj = 'Отчет по задолженности'
  149.  
  150. workbook = xlsxwriter.Workbook(outfile, {'in_memory': True})
  151.  
  152. worksheet = workbook.add_worksheet()
  153. #rownum, colnum, text
  154. worksheet.write(0,0,u"Субьект")
  155. worksheet.write(0,1,u"Лицевой счет")
  156. worksheet.write(0,2,u"Договор")
  157. worksheet.write(0,3,u"Сумма по подпискам")
  158. worksheet.write(0,4,u"Баланс")
  159. worksheet.write(0,5,u"Дата последнего платежа")
  160. worksheet.write(0,6,u"Дни задолженности")
  161. worksheet.write(0,7,u"Месяцы задолженности")
  162. worksheet.write(0,8,u"Контактный телефон")
  163. worksheet.write(0,9,u"Теги")
  164. worksheet.write(0,10,u"Улица")
  165. worksheet.write(0,11,u"Дом")
  166.  
  167. rownum = 1
  168.  
  169. for row in result:
  170. #result data processing
  171. (vc_subj, vc_acc, vc_doc, n_sum, n_bal, d_pay, n_days, n_month, vc_tel, vc_tags, vc_street, vc_house) = row
  172. worksheet.write(rownum, 0, vc_subj.decode('utf-8'))
  173. worksheet.write(rownum, 1, vc_acc.decode('utf-8'))
  174. worksheet.write(rownum, 2, vc_doc.decode('utf-8'))
  175. worksheet.write(rownum, 3, n_sum)
  176. worksheet.write(rownum, 4, n_bal)
  177. worksheet.write(rownum, 5, str(d_pay))
  178. worksheet.write(rownum, 6, n_days)
  179. worksheet.write(rownum, 7, n_month)
  180. if vc_tel is not None:
  181. worksheet.write(rownum, 8, vc_tel.decode('utf-8'))
  182. if vc_tags is not None:
  183. worksheet.write(rownum, 9, vc_tags.decode('utf-8'))
  184. if vc_street is not None:
  185. worksheet.write(rownum, 10, vc_street.decode('utf-8'))
  186. if vc_house is not None:
  187. worksheet.write(rownum, 11, vc_house.decode('utf-8'))
  188.  
  189. rownum += 1
  190.  
  191. workbook.close()
  192.  
  193. encodedcontent = base64.b64encode(outfile.getvalue())
  194. outfile.close()
  195.  
  196.  
  197. marker = "AUNIQUEMARKER"
  198. body ="""
  199. Отчет сформирован %s
  200. """ % (datetime.now().strftime("%d.%m.%Y в %H:%M"))
  201. body = base64.b64encode(body)
  202. # Define the main headers.
  203. part1 = """From: database report <%s>
  204. To: <%s>
  205. Subject: %s
  206. MIME-Version: 1.0
  207. Content-Type: multipart/mixed; boundary=%s
  208.  
  209. --%s
  210. """ % (sender, reciever, subj, marker, marker)
  211.  
  212. # Define the message action
  213. part2 = """Content-Type: text/plain;
  214. Content-Transfer-Encoding: base64
  215.  
  216. %s
  217. --%s
  218. """ % (body,marker)
  219.  
  220. # Define the attachment section
  221. part3 = """Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; name=\"%s\"
  222. Content-Transfer-Encoding: base64
  223. Content-Disposition: inline; filename=%s
  224.  
  225. %s
  226. --%s--
  227. """ %(filename, filename, encodedcontent, marker)
  228. message = part1 + part2 + part3
  229.  
  230.  
  231. smtpObj = smtplib.SMTP('smtp.example.ru',25)
  232. smtpObj.set_debuglevel(True)
  233. smtpObj.ehlo()
  234. smtpObj.login(sender,'sender_smpt_password')
  235. #smtpObj.starttls()
  236. smtpObj.sendmail(sender, reciever, message)
  237. smtpObj.quit()
  238.  
  239. logging.info("ended at: " + str(datetime.now()))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement