main.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. # -*- coding: utf-8 -*-
  2. from openerp import http
  3. from openerp.http import request
  4. from werkzeug.wrappers import Response
  5. from werkzeug.datastructures import Headers
  6. from datetime import datetime
  7. from dateutil.relativedelta import relativedelta as rd
  8. from dateutil.parser import parse
  9. from pytz import timezone
  10. from gzip import GzipFile
  11. from StringIO import StringIO as IO
  12. import simplejson as json
  13. import gzip
  14. import logging
  15. LOGGER = logging.getLogger(__name__)
  16. DATE_FORMAT = '%Y-%m-%d'
  17. DATETIME_FORMAT = '%Y-%m-%d %H:%m:%S'
  18. GZIP_COMPRESSION_LEVEL = 9
  19. class Purchases(http.Controller):
  20. ''' Get timezone '''
  21. def get_timezone(self):
  22. return timezone(request.context['tz'])
  23. ''' Get server date to send '''
  24. def get_server_date(self):
  25. return datetime.now(self.get_timezone()).strftime(DATE_FORMAT)
  26. ''' Get current user information '''
  27. def get_user(self):
  28. user = request.env.user
  29. return {
  30. 'id': user.id,
  31. 'name': user.name,
  32. 'displayName': user.display_name,
  33. 'currency': {
  34. 'id': user.company_id.currency_id.id,
  35. 'name': user.company_id.currency_id.name,
  36. 'displayName': user.company_id.currency_id.display_name,
  37. 'symbol': user.company_id.currency_id.symbol
  38. },
  39. 'company': {
  40. 'id': user.company_id.id,
  41. 'name': user.company_id.name,
  42. 'displayName': user.company_id.display_name
  43. }
  44. }
  45. ''' Get currencies from journals '''
  46. def get_currencies_from_journal(self):
  47. domain = [
  48. ('type', 'in', ['bank', 'cash']),
  49. ('default_debit_account_id.currency_id', '=', False),
  50. ('active', '=', True)
  51. ]
  52. currencies = []
  53. for j in request.env['account.journal'].search(domain):
  54. c = j.currency or j.company_id.currency_id
  55. currencies.append({
  56. 'id': c.id,
  57. 'name': c.display_name,
  58. 'base': c.base,
  59. 'symbol': c.symbol,
  60. 'position': c.position,
  61. 'rateSilent': c.rate_silent,
  62. 'decimalSeparator': c.decimal_separator,
  63. 'decimalPlaces': c.decimal_places,
  64. 'thousandsSeparator': c.thousands_separator
  65. })
  66. return {c['id']:c for c in currencies}.values()
  67. ''' all active journals '''
  68. def get_journals(self, type=None):
  69. if (not type[0]):
  70. type= ['bank', 'cash']
  71. user = request.env.user
  72. journal = []
  73. for store in user.store_ids:
  74. for journalID in store.journal_ids:
  75. if (journalID.type in ['bank', 'cash']):
  76. journal.append(journalID.id)
  77. domain = [('type', 'in', type), ('default_debit_account_id.currency_id', '=', False), ('active', '=', True)]
  78. if (journal):
  79. domain.append(('id', 'in', journal ))
  80. return [{
  81. 'id': journal.id,
  82. 'name': journal.name,
  83. 'displayName': journal.display_name,
  84. 'code': journal.code,
  85. 'cashControl': journal.cash_control,
  86. 'type': journal.type,
  87. 'currency': {
  88. 'id': journal.currency.id,
  89. 'name': journal.currency.name,
  90. 'displayName': journal.currency.display_name
  91. },
  92. 'defaultDebitAccount': {
  93. 'id': journal.default_debit_account_id.id,
  94. 'name': journal.default_debit_account_id.name,
  95. 'displayName': journal.default_debit_account_id.display_name,
  96. 'code': journal.default_debit_account_id.code,
  97. 'exchange_rate': journal.default_credit_account_id.exchange_rate,
  98. 'foreignBalance': journal.default_credit_account_id.foreign_balance,
  99. 'reconcile': journal.default_credit_account_id.reconcile,
  100. 'debit': journal.default_credit_account_id.debit,
  101. 'credit': journal.default_credit_account_id.credit,
  102. 'currencyMode': journal.default_credit_account_id.currency_mode,
  103. 'companyCurrency': {
  104. 'id': journal.default_credit_account_id.company_currency_id.id,
  105. 'name': journal.default_credit_account_id.company_currency_id.name,
  106. 'displayName': journal.default_credit_account_id.company_currency_id.display_name,
  107. },
  108. 'currency': {
  109. 'id': journal.default_credit_account_id.currency_id.id,
  110. 'name': journal.default_credit_account_id.currency_id.name,
  111. 'displayName': journal.default_credit_account_id.currency_id.display_name
  112. }
  113. }
  114. } for journal in request.env['account.journal'].search(domain, order='id')]
  115. ''' account.bank.statement '''
  116. def get_account_bank_statement(self, journalIds=None):
  117. if (not journalIds):
  118. return False
  119. domain = [('journal_id.id', 'in', journalIds)]
  120. # domain = [('journal_id.id', 'in', journalIds), ('user_id', '=', request.env.user.id)]
  121. return [{
  122. 'id': statement.id,
  123. 'name': statement.name,
  124. 'date': statement.date,
  125. 'balanceEnd': statement.balance_end,
  126. 'user': {
  127. 'id': statement.user_id.id,
  128. 'name': statement.user_id.name,
  129. 'displayName': statement.user_id.display_name
  130. },
  131. 'journal': {
  132. 'id': statement.journal_id.id,
  133. 'name': statement.journal_id.name,
  134. 'displayName': statement.journal_id.display_name,
  135. 'code': statement.journal_id.code,
  136. 'cashControl': statement.journal_id.cash_control,
  137. 'type': statement.journal_id.type,
  138. 'currency': {
  139. 'id': statement.journal_id.currency.id,
  140. 'name': statement.journal_id.currency.name,
  141. 'displayName': statement.journal_id.currency.display_name
  142. }
  143. },
  144. 'line': [{
  145. 'id': line.id,
  146. 'date': line.date,
  147. 'name': line.name,
  148. 'ref': line.ref,
  149. 'amount': line.amount,
  150. 'patner':{
  151. 'id': line.partner_id.id,
  152. 'name': line.partner_id.name,
  153. 'displayName': line.partner_id.display_name
  154. },
  155. } for line in statement.line_ids],
  156. 'typeStatement': {
  157. 'id': statement.type_statement.id,
  158. 'name': statement.type_statement.name,
  159. 'code': statement.type_statement.code
  160. }
  161. } for statement in request.env['account.bank.statement'].search(domain)]
  162. ''' Configuracion de Caja '''
  163. def get_account_bank_statement_config(self):
  164. 'account.bank.statement.config'
  165. return [{
  166. 'transfer': {
  167. 'userIds': map(lambda x: x.id, config.transfer_user_ids),
  168. 'statementIds': map(lambda x: x.id, config.transfer_statement_ids) ,
  169. 'negativeAmount': config.transfer_negative_amount
  170. },
  171. 'inputCashBox': {
  172. 'userIds': map(lambda x: x.id, config.input_cash_box_user_id),
  173. 'statementIds': map(lambda x: x.id, config.input_cash_box_statement_ids)
  174. },
  175. 'outputCashBox': {
  176. 'userIds': map(lambda x: x.id, config.output_cash_box_user_id),
  177. 'statementIds': map(lambda x: x.id, config.output_cash_box_statement_ids),
  178. 'negativeAmount': config.output_negative_amount
  179. },
  180. 'delete': {
  181. 'outputUserIds': map(lambda x: x.id, config.delete_output_user_ids),
  182. 'inputUserIds': map(lambda x: x.id, config.delete_input_user_ids),
  183. 'transferUserIds': map(lambda x: x.id, config.delete_transfer_user_ids)
  184. },
  185. 'statementOpen': config.statement_open_config,
  186. 'statementConfirm' :{
  187. 'userIds': map(lambda x: x.id, config.statement_confirm_user),
  188. 'transferUserIds': map(lambda x: x.id , config.statement_confirm_transfer_user),
  189. 'balanceUserIds': map(lambda x: x.id, config.statement_confirm_balance),
  190. 'negativeAmountUserIds': map(lambda x: x.id, config.statement_confirm_negative_amount)
  191. },
  192. 'statementCancelUserIds': map(lambda x: x.id, config.statement_cancel_user),
  193. 'statementUnlinkUserIds': map(lambda x: x.id, config.statement_unlink_user)
  194. } for config in request.env['account.bank.statement.config'].search([('active', '=', True)],order='id')]
  195. ''' Make JSON response to send '''
  196. def make_response(self, data=None, status=200):
  197. return Response(json.dumps(data), status=status, content_type='application/json')
  198. ''' Make GZIP to JSON response '''
  199. def make_gzip_response(self, data=None, status=200):
  200. gzip_buffer = IO()
  201. with GzipFile(mode='wb', compresslevel=GZIP_COMPRESSION_LEVEL, fileobj=gzip_buffer) as gzip_file:
  202. gzip_file.write(json.dumps(data))
  203. contents = gzip_buffer.getvalue()
  204. gzip_buffer.close()
  205. headers = Headers()
  206. headers.add('Content-Encoding', 'gzip')
  207. headers.add('Vary', 'Accept-Encoding')
  208. headers.add('Content-Length', len(contents))
  209. return Response(contents, status=status, headers=headers, content_type='application/json')
  210. ''' Logger info '''
  211. def make_info_log(self, log):
  212. LOGGER.info('\033[1;34m[INFO] --> \033[m{}'.format(log))
  213. ''' Bank statement Init '''
  214. @http.route('/eiru_bank_statement/init', auth='user', methods=['GET'], cors='*')
  215. def init_bank_statement(self,**kw):
  216. self.make_info_log('Preparing data to {}'.format(kw.get('mode')))
  217. journals = self.get_journals([kw.get('mode')]),
  218. return self.make_gzip_response({
  219. 'date': self.get_server_date(),
  220. 'user': self.get_user(),
  221. 'currencies': self.get_currencies_from_journal(),
  222. 'journals': journals,
  223. 'statement': self.get_account_bank_statement(map(lambda x: x['id'], journals[0])),
  224. 'statementConfig' : self.get_account_bank_statement_config(),
  225. # 'suppliers': self.get_suppliers(),
  226. # 'products': self.get_products(kw.get('mode')),
  227. # 'pickingTypes': self.get_picking_types(),
  228. # 'paymentTerms': self.get_payment_terms(),
  229. # 'banks': self.get_banks(),
  230. # 'bankPaymentTypes': self.get_bank_payment_types(),
  231. # 'chequeTypes': self.get_cheque_types()
  232. })