main.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  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 gzip import GzipFile
  8. from StringIO import StringIO as IO
  9. import simplejson as json
  10. import gzip
  11. import logging
  12. LOGGER = logging.getLogger(__name__)
  13. DATE_FORMAT = '%Y-%m-%d'
  14. GZIP_COMPRESSION_LEVEL = 9
  15. class PaymentsSales(http.Controller):
  16. '''
  17. Get server date
  18. '''
  19. def get_server_date(self):
  20. return datetime.now().strftime(DATE_FORMAT)
  21. '''
  22. Get partner customer
  23. '''
  24. def get_user(self):
  25. user = request.env.user
  26. return {
  27. 'id': user.id,
  28. 'name': user.name,
  29. 'displayName': user.display_name,
  30. 'company': {
  31. 'id': user.company_id.id,
  32. 'name': user.company_id.name
  33. },
  34. 'currency': {
  35. 'id': user.company_id.currency_id.id,
  36. 'name': user.company_id.currency_id.name,
  37. 'displayName': user.company_id.currency_id.display_name,
  38. 'symbol': user.company_id.currency_id.symbol,
  39. 'rateSilent': user.company_id.currency_id.rate_silent,
  40. 'thousandsSeparator': user.company_id.currency_id.thousands_separator,
  41. 'decimalSeparator': user.company_id.currency_id.decimal_separator,
  42. 'decimalPlaces': user.company_id.currency_id.decimal_places
  43. }
  44. }
  45. '''
  46. Get partner customer
  47. '''
  48. def get_customers(self):
  49. domain = [('customer', '=', True), ('active', '=', True), ('credit', '>', 0)]
  50. partners = []
  51. for customer in request.env['res.partner'].search(domain):
  52. invoices = []
  53. partner_invoice = []
  54. for invoice_ids in customer.invoice_ids:
  55. if invoice_ids.state == 'open':
  56. partner_invoice.append(invoice_ids.id)
  57. if customer.is_company == True:
  58. for child in customer.child_ids:
  59. for invoice_ids in child.invoice_ids:
  60. if invoice_ids.state == 'open':
  61. partner_invoice.append(invoice_ids.id)
  62. # for invoice in request.env['account.invoice'].browse(partner_invoice):
  63. for invoice in request.env['account.invoice'].search([('id', 'in', partner_invoice),('state', '=', 'open')]):
  64. movelines = []
  65. moves = []
  66. currency_symbol = ""
  67. for move in invoice.move_id:
  68. for moveline in move.line_id:
  69. if moveline.amount_residual > 0 and moveline.state != "draft" and moveline.credit <= 0:
  70. movelines.append({
  71. 'id': moveline.id,
  72. 'amountResidual': moveline.amount_residual,
  73. 'credit': moveline.credit,
  74. 'debit': moveline.debit,
  75. 'dateMaturity': moveline.date_maturity,
  76. 'invoice': invoice.id
  77. })
  78. invoices.append({
  79. 'id': invoice.id,
  80. 'number': invoice.number,
  81. 'dateInvoice': invoice.date_invoice,
  82. 'amountTotal': invoice.amount_total,
  83. 'residual': invoice.residual,
  84. 'moveLines': movelines,
  85. 'currency' : {
  86. 'id': invoice.currency_id.id,
  87. 'name': invoice.currency_id.name,
  88. 'displayName': invoice.currency_id.display_name,
  89. 'symbol': invoice.currency_id.symbol,
  90. 'rateSilent': invoice.currency_id.rate_silent,
  91. 'thousandsSeparator': invoice.currency_id.thousands_separator,
  92. 'decimalSeparator': invoice.currency_id.decimal_separator,
  93. 'decimalPlaces': invoice.currency_id.decimal_places
  94. }
  95. })
  96. partners.append({
  97. 'id': customer.id,
  98. 'name': customer.name,
  99. 'displayName': customer.display_name,
  100. 'ruc': customer.ruc,
  101. 'imageMedium': customer.image_medium,
  102. 'phone': customer.phone,
  103. 'mobile': customer.mobile,
  104. 'email': customer.email,
  105. 'credit': customer.credit,
  106. 'creditLimit': customer.credit_limit,
  107. 'invoices': invoices
  108. })
  109. return partners
  110. '''
  111. Get Journal
  112. '''
  113. def get_journals(self):
  114. domain =[('active', '=', True),('type', 'in',['bank', 'cash']), ('default_credit_account_id.currency_id', '=', False)]
  115. paymentsJournals = []
  116. for journal in request.env['account.journal'].search(domain, order="id"):
  117. if not (journal.store_ids >= request.env.user.store_ids):
  118. continue
  119. paymentsJournals.append({
  120. 'id': journal.id,
  121. 'name': journal.name,
  122. 'displayName': journal.display_name,
  123. 'code': journal.code,
  124. 'cashControl': journal.cash_control,
  125. 'type': journal.type,
  126. 'currency': {
  127. 'id': journal.currency.id,
  128. 'name': journal.currency.name,
  129. 'displayName': journal.currency.display_name,
  130. 'symbol': journal.currency.symbol,
  131. 'rateSilent': journal.currency.rate_silent
  132. },
  133. 'defaultCreditAccount':{
  134. 'id': journal.default_credit_account_id.id,
  135. 'name': journal.default_credit_account_id.name,
  136. 'displayName': journal.default_credit_account_id.display_name,
  137. 'code': journal.default_credit_account_id.code,
  138. 'exchangeRate': journal.default_credit_account_id.exchange_rate,
  139. 'foreignBalance': journal.default_credit_account_id.foreign_balance,
  140. 'reconcile': journal.default_credit_account_id.reconcile,
  141. 'debit': journal.default_credit_account_id.debit,
  142. 'credit': journal.default_credit_account_id.credit,
  143. 'currencyMode': journal.default_credit_account_id.currency_mode,
  144. 'companyCurrency':{
  145. 'id': journal.default_credit_account_id.company_currency_id.id,
  146. 'name': journal.default_credit_account_id.company_currency_id.name,
  147. 'displayName': journal.default_credit_account_id.company_currency_id.display_name,
  148. 'symbol': journal.default_credit_account_id.company_currency_id.symbol,
  149. 'rateSilent': journal.default_credit_account_id.company_currency_id.rate_silent
  150. },
  151. 'currency':{
  152. 'id': journal.default_credit_account_id.currency_id.id,
  153. 'name': journal.default_credit_account_id.currency_id.name,
  154. 'displayName': journal.default_credit_account_id.currency_id.display_name,
  155. 'symbol': journal.default_credit_account_id.currency_id.symbol,
  156. 'rateSilent': journal.default_credit_account_id.currency_id.rate_silent
  157. },
  158. }
  159. })
  160. return paymentsJournals
  161. '''
  162. Get Currency
  163. '''
  164. def get_currency(self):
  165. return [{
  166. 'id': currency.id,
  167. 'name': currency.name,
  168. 'displayName': currency.display_name,
  169. 'base': currency.base,
  170. 'accuracy': currency.accuracy,
  171. 'rateSilent': currency.rate_silent,
  172. 'rounding': currency.rounding,
  173. 'symbol': currency.symbol,
  174. 'position': currency.position,
  175. 'thousandsSeparator': currency.thousands_separator,
  176. 'decimalSeparator': currency.decimal_separator,
  177. 'decimalPlaces': currency.decimal_places
  178. } for currency in request.env['res.currency'].search([('active', '=', True)])]
  179. '''
  180. Make JSON response
  181. '''
  182. def make_json_response(self, data=None, status=200):
  183. return Response(json.dumps(data), status=status, content_type='application/json')
  184. '''
  185. Make GZIP to JSON response
  186. '''
  187. def make_gzip_response(self, data=None, status=200):
  188. gzip_buffer = IO()
  189. with GzipFile(mode='wb', compresslevel=GZIP_COMPRESSION_LEVEL, fileobj=gzip_buffer) as gzip_file:
  190. gzip_file.write(json.dumps(data))
  191. contents = gzip_buffer.getvalue()
  192. gzip_buffer.close()
  193. headers = Headers()
  194. headers.add('Content-Encoding', 'gzip')
  195. headers.add('Vary', 'Accept-Encoding')
  196. headers.add('Content-Length', len(contents))
  197. return Response(contents, status=status, headers=headers, content_type='application/json')
  198. '''
  199. Logger Info
  200. '''
  201. def make_info_log(self, log):
  202. LOGGER.info(log)
  203. '''
  204. New Payments resource router
  205. '''
  206. @http.route('/eiru_payments/init', auth='user', methods=['GET'], cors='*')
  207. def init_payments(self, **kw):
  208. self.make_info_log('Sending JSON response')
  209. return self.make_gzip_response({
  210. 'date': self.get_server_date(),
  211. 'user': self.get_user(),
  212. 'customers': self.get_customers(),
  213. 'journals': self.get_journals(),
  214. 'currencies': self.get_currency()
  215. })
  216. '''
  217. Get the current period
  218. '''
  219. def get_period(self, date_server):
  220. return request.env['account.period'].search([('date_start','<=', date_server), ('date_stop', '>=', datetime.now().strftime(DATE_FORMAT))])
  221. '''
  222. Get Invoice
  223. '''
  224. def get_invoice(self, invoice_id):
  225. return request.env['account.invoice'].search([('id', '=', invoice_id)])
  226. '''
  227. Create Voucher
  228. '''
  229. def create_voucher(self, period, invoice, company_id, amountPayments, date_server, journalId, move_line_Ids, customerId):
  230. # get Journal / Currency
  231. journal_id = request.env['account.journal'].browse(int(journalId))
  232. currency_id = journal_id.default_credit_account_id.currency_id.id or journal_id.default_credit_account_id.company_currency_id.id
  233. # Get Move Lines
  234. move_line = request.env['account.move.line'].browse(move_line_Ids).sorted(key=lambda r: r.id)
  235. # get customer
  236. customerId = request.env['res.partner'].browse(customerId)
  237. # Create Line Voucher
  238. line_cr_ids = []
  239. amount = float(amountPayments)
  240. for line in move_line:
  241. line_cr_ids.append([0, False, {
  242. 'date_due': line.date_maturity,
  243. 'account_id': line.account_id.id,
  244. 'date_original': line.move_id.date,
  245. 'move_line_id': line.id,
  246. 'amount_original': abs(line.credit or line.debit or 0.0),
  247. 'amount_unreconciled': abs(line.amount_residual),
  248. 'amount': min(abs(amount), line.amount_residual),
  249. 'reconcile': line.move_id.date <= line.date_maturity,
  250. 'currency_id': currency_id
  251. }])
  252. amount -= min(abs(amount), line.amount_residual)
  253. values = {
  254. 'reference': invoice.number,
  255. 'type': 'receipt',
  256. 'journal_id': journal_id.id,
  257. 'company_id': company_id,
  258. 'pre_line': True,
  259. 'amount': float(amountPayments),
  260. 'period_id': period.id,
  261. 'date': date_server,
  262. 'partner_id': customerId.id,
  263. 'account_id': journal_id.default_credit_account_id.id,
  264. 'currency_id': currency_id,
  265. 'line_cr_ids': line_cr_ids
  266. }
  267. account_voucher = request.env['account.voucher'].create(values)
  268. account_voucher.action_move_line_create()
  269. return account_voucher
  270. '''
  271. close invoice
  272. '''
  273. def close_invoice(self, invoiceid):
  274. invoice = request.env['account.invoice'].search([('id', '=', invoiceid)])
  275. if invoice.residual <= 0:
  276. invoice.write({
  277. 'state': 'paid'
  278. })
  279. return invoice
  280. '''
  281. Create bank Statement
  282. '''
  283. def create_bank_statement(self, date_server, user_id, account_voucher):
  284. # Get bank Statamente
  285. bank_statement = request.env['account.bank.statement'].search([('journal_id', '=', account_voucher.journal_id.id), ('date', '=', date_server)])
  286. # Create line bank
  287. bank_statement_line = [[0, False, {
  288. 'name': account_voucher.reference,
  289. 'partner_id': account_voucher.partner_id.id,
  290. 'amount': account_voucher.amount,
  291. 'voucher_id': account_voucher.id,
  292. 'journal_id': account_voucher.journal_id.id,
  293. 'account_id': account_voucher.account_id.id,
  294. 'journal_entry_id': account_voucher.move_id.id,
  295. 'currency_id': account_voucher.currency_id.id,
  296. 'ref': 'NP'
  297. }]]
  298. bank = {
  299. 'journal_id': account_voucher.journal_id.id,
  300. 'period_id': account_voucher.period_id.id,
  301. 'date': date_server,
  302. 'user_id': user_id,
  303. 'state': 'open' if account_voucher.journal_id.type == 'cash' else 'draft',
  304. 'line_ids': bank_statement_line
  305. }
  306. if bank_statement:
  307. if len(bank_statement) == 1:
  308. bank_statement.write(bank)
  309. else:
  310. bank_statement[len(bank_statement) -1].write(bank)
  311. else:
  312. bank_statement = bank_statement.create(bank)
  313. return bank_statement
  314. '''
  315. Payment process
  316. '''
  317. @http.route('/eiru_payments/payment_process', type='json', auth='user', methods=['POST'], cors='*')
  318. def payment_process(self, **kw):
  319. self.make_info_log('Processing payments...')
  320. # Get Date Server
  321. date_server = datetime.now().strftime(DATE_FORMAT)
  322. #Get Periodo
  323. period = self.get_period(date_server)
  324. self.make_info_log('[OK] Getting period')
  325. # Get invoice
  326. invoice = self.get_invoice(kw.get('invoiceId'))
  327. self.make_info_log('[OK] Getting invoice')
  328. # Get User - company
  329. user_id = request.env.user.id
  330. self.make_info_log('[OK] Getting user')
  331. # Get Company
  332. company_id = request.env.user.company_id.id
  333. self.make_info_log('[OK] Getting Company')
  334. # create voucher
  335. voucher = self.create_voucher(period, invoice, company_id, kw.get('amountPayments', 0), date_server, kw.get('journalId'), kw.get('moveLines'), kw.get('customerId'))
  336. self.make_info_log('[OK] creating voucher...')
  337. # close invoice
  338. close_invoice = self.close_invoice(kw.get('invoiceId'))
  339. self.make_info_log('[OK] closing invoice...')
  340. # Create bank statement
  341. bank_statement = self.create_bank_statement(date_server, user_id, voucher)
  342. self.make_info_log('[OK] creating bank statement')
  343. return {
  344. 'process': True
  345. }