main.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723
  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 gzip import GzipFile
  10. from StringIO import StringIO as IO
  11. import simplejson as json
  12. import gzip
  13. import logging
  14. LOGGER = logging.getLogger(__name__)
  15. DATE_FORMAT = '%Y-%m-%d'
  16. DATETIME_FORMAT = '%Y-%m-%d %H:%m:%S'
  17. GZIP_COMPRESSION_LEVEL = 9
  18. class Purchases(http.Controller):
  19. '''
  20. Get server date to send
  21. '''
  22. def get_server_date(self):
  23. return datetime.now().strftime(DATE_FORMAT)
  24. '''
  25. Get current user information
  26. '''
  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. '''
  46. Get currencies
  47. '''
  48. def get_currencies(self):
  49. return [{
  50. 'id': currency.id,
  51. 'name': currency.name,
  52. 'displayName': currency.display_name,
  53. 'base': currency.base,
  54. 'accuracy': currency.accuracy,
  55. 'rateSilent': currency.rate_silent,
  56. 'rounding': currency.rounding,
  57. 'symbol': currency.symbol,
  58. 'position': currency.position,
  59. 'decimalSeparator': currency.decimal_separator,
  60. 'decimalPlaces': currency.decimal_places,
  61. 'thousandsSeparator': currency.thousands_separator
  62. } for currency in request.env['res.currency'].search([('active', '=', True)])]
  63. '''
  64. Get all active journals
  65. '''
  66. def get_journals(self):
  67. return [{
  68. 'id': journal.id,
  69. 'name': journal.name,
  70. 'displayName': journal.display_name,
  71. 'code': journal.code,
  72. 'cashControl': journal.cash_control,
  73. 'type': journal.type,
  74. 'currency': {
  75. 'id': journal.currency.id,
  76. 'name': journal.currency.name,
  77. 'displayName': journal.currency.display_name
  78. },
  79. 'defaultDebitAccount': {
  80. 'id': journal.default_debit_account_id.id,
  81. 'name': journal.default_debit_account_id.name,
  82. 'displayName': journal.default_debit_account_id.display_name,
  83. 'code': journal.default_debit_account_id.code,
  84. 'exchange_rate': journal.default_credit_account_id.exchange_rate,
  85. 'foreignBalance': journal.default_credit_account_id.foreign_balance,
  86. 'reconcile': journal.default_credit_account_id.reconcile,
  87. 'debit': journal.default_credit_account_id.debit,
  88. 'credit': journal.default_credit_account_id.credit,
  89. 'currencyMode': journal.default_credit_account_id.currency_mode,
  90. 'companyCurrency': {
  91. 'id': journal.default_credit_account_id.company_currency_id.id,
  92. 'name': journal.default_credit_account_id.company_currency_id.name,
  93. 'displayName': journal.default_credit_account_id.company_currency_id.display_name,
  94. },
  95. 'currency': {
  96. 'id': journal.default_credit_account_id.currency_id.id,
  97. 'name': journal.default_credit_account_id.currency_id.name,
  98. 'displayName': journal.default_credit_account_id.currency_id.display_name
  99. }
  100. }
  101. } for journal in request.env['account.journal'].search([('type', 'in', ['bank', 'cash']), ('default_debit_account_id.currency_id', '=', False), ('active', '=', True)], order='id')]
  102. '''
  103. Get all active suppliers
  104. '''
  105. def get_suppliers(self):
  106. return [{
  107. 'id': supplier.id,
  108. 'name': supplier.name,
  109. 'displayName': supplier.display_name,
  110. 'imageMedium': supplier.image_medium,
  111. 'ruc': supplier.ruc,
  112. 'phone': supplier.phone,
  113. 'mobile': supplier.mobile,
  114. 'email': supplier.email
  115. } for supplier in request.env['res.partner'].search([('supplier', '=', True), ('active', '=', True)])]
  116. '''
  117. Get all purchasable and active products
  118. '''
  119. def get_products(self, type=None):
  120. product_obj = request.env['product.template']
  121. domain = [('standard_price', '>=', 0), ('active', '=', True)]
  122. if type == 'purchase':
  123. domain.append(('purchase_ok', '=', True))
  124. else:
  125. if product_obj.fields_get('hr_expense_ok'):
  126. domain.append(('hr_expense_ok', '=', True))
  127. else:
  128. return []
  129. return [{
  130. 'id': product.id,
  131. 'name': product.name,
  132. 'displayName': product.display_name,
  133. 'ean13': product.ean13,
  134. 'imageMedium': product.image_medium,
  135. 'standardPrice': product.standard_price,
  136. 'variantCount': product.product_variant_count,
  137. 'quantity': 1,
  138. 'price': product.standard_price,
  139. 'minimumPrice': product.minimum_price,
  140. 'maximumPrice': product.maximum_price,
  141. 'variants': [{
  142. 'id': variant.id,
  143. 'name': variant.name,
  144. 'displayName': variant.display_name,
  145. 'ean13': variant.ean13,
  146. 'imageMedium': variant.image_medium,
  147. 'standardPrice': variant.standard_price,
  148. 'quantity': 1,
  149. 'price': variant.standard_price,
  150. 'minimumPrice': product.minimum_price,
  151. 'maximumPrice': product.maximum_price
  152. } for variant in product.product_variant_ids if variant.active]
  153. } for product in product_obj.search(domain)]
  154. '''
  155. Get all incoming and active picking types
  156. '''
  157. def get_picking_types(self):
  158. return [{
  159. 'id': picking_type.id,
  160. 'name': picking_type.name,
  161. 'displayName': picking_type.display_name
  162. } for picking_type in request.env['stock.picking.type'].search([('code', '=', 'incoming'), ('active', '=', True)])]
  163. '''
  164. Get all active payment terms
  165. '''
  166. def get_payment_terms(self):
  167. return [{
  168. 'id': payment_term.id,
  169. 'name': payment_term.name,
  170. 'displayName': payment_term.display_name,
  171. 'lines': [{
  172. 'id': line.id,
  173. 'days': line.days,
  174. 'days2': line.days2,
  175. 'value': line.value,
  176. 'valueAmount': line.value_amount
  177. } for line in payment_term.line_ids]
  178. } for payment_term in request.env['account.payment.term'].search([('active', '=', True)])]
  179. '''
  180. Make JSON response to send
  181. '''
  182. def make_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. '''
  200. def make_info_log(self, log):
  201. LOGGER.info('\033[1;34m[INFO] --> \033[m{}'.format(log))
  202. '''
  203. New purchase resource route
  204. '''
  205. @http.route('/eiru_purchases/init', auth='user', methods=['GET'], cors='*')
  206. def init_purchase(self, **kw):
  207. self.make_info_log('Preparing data to {}'.format(kw.get('mode')))
  208. return self.make_gzip_response({
  209. 'date': self.get_server_date(),
  210. 'user': self.get_user(),
  211. 'currencies': self.get_currencies(),
  212. 'journals': self.get_journals(),
  213. 'suppliers': self.get_suppliers(),
  214. 'products': self.get_products(kw.get('mode')),
  215. 'pickingTypes': self.get_picking_types(),
  216. 'paymentTerms': self.get_payment_terms()
  217. })
  218. '''
  219. Create supplier and return data
  220. '''
  221. @http.route('/eiru_purchases/create_supplier', type='json', auth='user', methods=['POST'], cors='*')
  222. def create_supplier(self, **kw):
  223. self.make_info_log('Creating supplier')
  224. supplier = request.env['res.partner'].create({
  225. 'name': kw.get('name'),
  226. 'ruc': kw.get('ruc'),
  227. 'phone': kw.get('phone'),
  228. 'supplier': True,
  229. 'customer': False
  230. })
  231. return {
  232. 'id': supplier.id,
  233. 'name': supplier.name,
  234. 'displayName': supplier.display_name,
  235. 'imageMedium': supplier.image_medium,
  236. 'phone': supplier.phone,
  237. 'mobile': supplier.mobile,
  238. 'email': supplier.email
  239. }
  240. '''
  241. Create product and return data
  242. '''
  243. @http.route('/eiru_purchases/create_product', type='json', auth='user', methods=['POST'], cors='*')
  244. def create_product(self, **kw):
  245. self.make_info_log('Creating product')
  246. product = request.env['product.template'].create({
  247. 'name': kw.get('name'),
  248. 'standard_price': float(kw.get('price')),
  249. 'ean13': kw.get('ean13')
  250. })
  251. return {
  252. 'id': product.id,
  253. 'name': product.name,
  254. 'displayName': product.display_name,
  255. 'ean13': product.ean13,
  256. 'imageMedium': product.image_medium,
  257. 'standardPrice': product.standard_price,
  258. 'variantCount': product.product_variant_count,
  259. 'price': product.list_price,
  260. 'minimumPrice': product.minimum_price,
  261. 'maximumPrice': product.maximum_price,
  262. 'variants': [{
  263. 'id': variant.id,
  264. 'name': variant.name,
  265. 'displayName': variant.display_name,
  266. 'ean13': variant.ean13,
  267. 'imageMedium': variant.image_medium,
  268. 'standardPrice': product.standard_price,
  269. 'price': variant.standard_price,
  270. 'minimumPrice': product.minimum_price,
  271. 'maximumPrice': product.maximum_price
  272. } for variant in product.product_variant_ids if variant.active]
  273. }
  274. '''
  275. Get currency id based on journal
  276. '''
  277. def get_currency_id(self, journal_id):
  278. journal = request.env['account.journal'].browse(journal_id)
  279. return journal.default_debit_account_id.currency_id.id or journal.default_debit_account_id.company_currency_id.id
  280. '''
  281. Check currency in pricelist and return it
  282. '''
  283. def get_pricelist_id(self, currency_id):
  284. pricelist = request.env['product.pricelist'].search([('active', '=', True), ('type', '=', 'sale')])
  285. if not True in pricelist.mapped(lambda p: p.currency_id.id == currency_id):
  286. pricelist = pricelist[0].copy()
  287. pricelist.write({
  288. 'currency_id': currency_id
  289. })
  290. else:
  291. pricelist = pricelist.filtered(lambda p: p.currency_id.id == currency_id)
  292. return pricelist.id
  293. '''
  294. Get default location
  295. '''
  296. def get_stock_location_id(self):
  297. stock_location = request.env['stock.location'].search([('usage', '=', 'internal')])
  298. return stock_location.id
  299. '''
  300. Create purchase order from cart and return id
  301. '''
  302. def create_purchase_order(self, supplier_id, cart_items, date_order, currency_id, pricelist_id, payment_term_id=None):
  303. return request.env['purchase.order'].create({
  304. 'name': '/',
  305. 'partner_id': supplier_id,
  306. 'order_line': [[0, False, {
  307. 'name': line.get('name'),
  308. 'date_planned': date_order,
  309. 'product_id': int(line.get('id')),
  310. 'product_qty': float(line.get('quantity')),
  311. 'price_unit': float(line.get('price'))
  312. }] for line in cart_items],
  313. 'date_order': datetime.now().strftime(DATETIME_FORMAT),
  314. 'currency_id': currency_id,
  315. 'pricelist_id': pricelist_id,
  316. 'payment_term_id': payment_term_id,
  317. 'location_id': self.get_stock_location_id(),
  318. 'invoice_method': 'order'
  319. })
  320. '''
  321. Confirm purchase order
  322. '''
  323. def confirm_purchase_order(self, purchase_order_id):
  324. purchase_order = request.env['purchase.order'].browse(purchase_order_id)
  325. purchase_order.action_purchase_confirm()
  326. for picking in purchase_order.picking_ids:
  327. picking.force_assign()
  328. picking.action_done()
  329. purchase_order.write({
  330. 'state': 'done'
  331. })
  332. '''
  333. Create invoice
  334. '''
  335. def create_invoice(self, supplier_id, cart_items, currency_id, payment_term_id=None):
  336. partner = request.env['res.partner'].browse(supplier_id)
  337. journal = request.env['account.journal'].search([('type', 'in', ['purchase']), ('company_id', '=', partner.company_id.id)])
  338. return request.env['account.invoice'].create({
  339. 'name': '/',
  340. 'partner_id': partner.id,
  341. 'invoice_line': [[0, False, {
  342. 'name': line.get('name'),
  343. 'product_id': int(line.get('id')),
  344. 'quantity': float(line.get('quantity')),
  345. 'price_unit': float(line.get('price'))
  346. }] for line in cart_items],
  347. 'account_id': partner.property_account_payable.id,
  348. 'journal_id': journal.id,
  349. 'currency_id': currency_id,
  350. 'payment_term': payment_term_id,
  351. 'type': 'in_invoice'
  352. })
  353. '''
  354. Validate invoice
  355. '''
  356. def prepare_invoice(self, invoice_ids, currency_id, date_today):
  357. assert len(invoice_ids) == 1
  358. invoice = request.env['account.invoice'].browse(invoice_ids)
  359. date_due = parse(date_today) + rd(days=max(invoice.payment_term.line_ids.mapped(lambda x: x.days + x.days2)))
  360. invoice.write({
  361. 'currency_id': currency_id,
  362. 'date_invoice': date_today,
  363. 'date_due': date_due.strftime(DATE_FORMAT),
  364. 'state': 'open'
  365. })
  366. '''
  367. Create move lines
  368. '''
  369. def create_invoice_move_lines(self, invoice_ids, paid_amount, date_today):
  370. assert len(invoice_ids) == 1
  371. invoice = request.env['account.invoice'].browse(invoice_ids)
  372. is_purchase = False
  373. scoped_context = dict(request.context, lang=invoice.partner_id.lang)
  374. invoice_move_lines = invoice._get_analytic_lines()
  375. decimal_precision = request.env['decimal.precision'].precision_get('Account')
  376. compute_taxes = request.env['account.invoice.tax'].compute(invoice.with_context(lang=invoice.partner_id.lang))
  377. invoice.check_tax_lines(compute_taxes)
  378. invoice._recompute_tax_amount()
  379. invoice_move_lines += request.env['account.invoice.tax'].move_line_get(invoice.id)
  380. total, total_currency, invoice_move_lines = invoice.with_context(scoped_context).compute_invoice_totals(invoice.company_id.currency_id, invoice.reference, invoice_move_lines)
  381. if total < 0:
  382. total = total * -1
  383. is_purchase = True
  384. paid_percentage = abs(paid_amount / round(total, decimal_precision))
  385. distributed_percentage = -(paid_percentage / len(invoice.payment_term.line_ids))
  386. payment_lines = []
  387. for line in invoice.payment_term.line_ids:
  388. date_due = (parse(date_today) + rd(days=line.days + line.days2)).strftime(DATE_FORMAT)
  389. if paid_percentage and paid_percentage < 1.0:
  390. payment_lines.append([date_today, paid_percentage])
  391. paid_percentage = paid_amount = 0
  392. if date_due == date_today and line.value_amount:
  393. distributed_percentage = -((payment_lines[0][1] - line.value_amount) / (len(invoice.payment_term.line_ids) - 1))
  394. continue
  395. if line.value != 'balance':
  396. payment_lines.append([date_due, line.value_amount + distributed_percentage])
  397. continue
  398. payment_lines.append([date_due, line.value_amount])
  399. for payment_line in payment_lines:
  400. current_price = round(total * payment_line[1], decimal_precision)
  401. if current_price < 0.0:
  402. continue
  403. paid_amount = paid_amount + current_price
  404. price = current_price if payment_line[1] else round(total - paid_amount, decimal_precision) or total
  405. if is_purchase:
  406. price = price * -1
  407. invoice_move_lines.append({
  408. 'type': 'dest',
  409. 'name': '/',
  410. 'price': price,
  411. 'account_id': invoice.account_id.id,
  412. 'date_maturity': payment_line[0],
  413. 'amount_currency': invoice.company_id.currency_id.compute(payment_line[1], invoice.currency_id) if invoice.currency_id != invoice.company_id.currency_id else False,
  414. 'currency_id': invoice.currency_id != invoice.company_id.currency_id and invoice.currency_id.id,
  415. 'ref': invoice.type in ('in_invoice', 'in_refund') and invoice.reference or invoice.number
  416. })
  417. payment_lines = []
  418. return invoice_move_lines
  419. '''
  420. Create account move
  421. '''
  422. def create_account_move(self, invoice_ids, invoice_move_lines):
  423. assert len(invoice_ids) == 1
  424. invoice = request.env['account.invoice'].browse(invoice_ids)
  425. accounting_partner = request.env['res.partner']._find_accounting_partner(invoice.partner_id)
  426. move_line_values = [(0, 0, invoice.line_get_convert(line, accounting_partner.id, invoice.date_invoice)) for line in invoice_move_lines]
  427. move_line_values = invoice.group_lines(invoice_move_lines, move_line_values)
  428. move_line_values = invoice.finalize_invoice_move_lines(move_line_values)
  429. ctx = dict(request.context, lang=invoice.partner_id.lang, company_id=invoice.company_id.id)
  430. period = invoice.period_id
  431. if not period:
  432. period = period.with_context(ctx).find(invoice.date_invoice)[:1]
  433. if period:
  434. for line in move_line_values:
  435. line[2]['period_id'] = period.id
  436. ctx['invoice'] = invoice
  437. ctx_nolang = ctx.copy()
  438. ctx_nolang.pop('lang', None)
  439. account_move = request.env['account.move'].with_context(ctx_nolang).create({
  440. 'ref': invoice.reference or invoice.name,
  441. 'line_id': move_line_values,
  442. 'journal_id': invoice.journal_id.with_context(request.context, lang=invoice.partner_id.lang).id,
  443. 'date': invoice.date_invoice,
  444. 'narration': invoice.comment,
  445. 'company_id': invoice.company_id.id,
  446. 'period_id': period.id
  447. })
  448. invoice.with_context(ctx).write({
  449. 'move_id': account_move.id,
  450. 'period_id': account_move.period_id.id,
  451. 'move_name': account_move.name,
  452. })
  453. account_move.post()
  454. return account_move
  455. '''
  456. Number to invoice
  457. '''
  458. def validate_invoice(self, invoice_ids, type=None):
  459. assert len(invoice_ids) == 1
  460. invoice = request.env['account.invoice'].browse(invoice_ids)
  461. invoice.action_number()
  462. invoice.invoice_validate()
  463. if type != 'purchase':
  464. name = 'GASTO' + invoice.name[invoice.name.index('/'):]
  465. invoice.write({
  466. 'number': name,
  467. 'internal_number': name
  468. })
  469. '''
  470. Create voucher
  471. '''
  472. def create_account_voucher(self, account_move_id, journal_id, currency_id, paid_amount):
  473. account_move = request.env['account.move'].browse(account_move_id)
  474. account_journal = request.env['account.journal'].browse(journal_id)
  475. account_voucher = request.env['account.voucher'].create({
  476. 'reference': account_move.name,
  477. 'type': 'payment',
  478. 'journal_id': account_journal.id,
  479. 'company_id': account_move.company_id.id,
  480. 'pre_line': True,
  481. 'amount': paid_amount,
  482. 'period_id': account_move.period_id.id,
  483. 'date': account_move.date,
  484. 'partner_id': account_move.partner_id.id,
  485. 'account_id': account_journal.default_debit_account_id.id,
  486. 'currency_id': currency_id,
  487. 'line_dr_ids': [[0, False, {
  488. 'date_due': l.date_maturity,
  489. 'account_id': l.account_id.id,
  490. 'date_original': l.invoice.date_invoice,
  491. 'move_line_id': l.id,
  492. 'amount_original': abs(l.credit or l.debit or 0.0),
  493. 'amount_unreconciled': abs(l.amount_residual),
  494. 'amount': abs(l.credit) if account_move.date == l.date_maturity else 0.0,
  495. 'reconcile': account_move.date == l.date_maturity,
  496. 'currency_id': currency_id
  497. }] for l in account_move.line_id]
  498. })
  499. account_voucher.action_move_line_create()
  500. return account_voucher
  501. '''
  502. Close a invoice
  503. '''
  504. def close_invoice(self, invoice_ids):
  505. assert len(invoice_ids) == 1
  506. invoice = request.env['account.invoice'].browse(invoice_ids)
  507. if invoice.residual == 0:
  508. invoice.write({
  509. 'state': 'paid'
  510. })
  511. '''
  512. Create account bank statement
  513. '''
  514. def create_bank_statement(self, account_voucher_id, account_bank_statement_lines, date_today):
  515. account_voucher = request.env['account.voucher'].browse(account_voucher_id)
  516. account_bank_statement = request.env['account.bank.statement'].search([('journal_id', '=', account_voucher.journal_id.id), ('date', '=', date_today)])
  517. account_bank_statement_values = {
  518. 'date': date_today,
  519. 'user_id': request.env.user.id,
  520. 'journal_id': account_voucher.journal_id.id,
  521. 'period_id': account_voucher.period_id.id,
  522. 'line_ids': account_bank_statement_lines,
  523. 'state': 'open' if account_voucher.journal_id.type == 'cash' else 'draft'
  524. }
  525. if account_bank_statement:
  526. size = len(account_bank_statement)
  527. if size == 1:
  528. account_bank_statement.write(account_bank_statement_values)
  529. else:
  530. account_bank_statement[size - 1].write(account_bank_statement_values)
  531. else:
  532. account_bank_statement.create(account_bank_statement_values)
  533. return account_bank_statement
  534. '''
  535. Create account bank statement lines
  536. '''
  537. def create_bank_statement_lines(self, account_voucher_id, reference=None):
  538. account_voucher = request.env['account.voucher'].browse(account_voucher_id)
  539. amount = account_voucher.amount
  540. if account_voucher.type == 'payment':
  541. amount = amount * -1
  542. return [[0, False, {
  543. 'name': account_voucher.reference,
  544. 'amount': amount,
  545. 'partner_id': account_voucher.partner_id.id,
  546. 'voucher_id': account_voucher.id,
  547. 'journal_id': account_voucher.journal_id.id,
  548. 'account_id': account_voucher.account_id.id,
  549. 'journal_entry_id': account_voucher.move_id.id,
  550. 'currency_id': account_voucher.currency_id.id,
  551. 'ref': 'POS/' + (reference or '')
  552. }]]
  553. '''
  554. Purchase processing resource route
  555. '''
  556. @http.route('/eiru_purchases/process', type='json', auth='user', methods=['POST'], cors='*')
  557. def process_purchase(self, **kw):
  558. mode = kw.get('mode')
  559. self.make_info_log('Processing {}'.format(mode))
  560. # Get date
  561. date_now = datetime.now().strftime(DATE_FORMAT)
  562. self.make_info_log('Getting date')
  563. # Get currency
  564. currency_id = self.get_currency_id(kw.get('journalId'))
  565. self.make_info_log('Getting currency')
  566. # Get pricelist
  567. pricelist_id = self.get_pricelist_id(currency_id)
  568. self.make_info_log('Product pricelist checked')
  569. invoice = None
  570. if mode == 'purchase':
  571. # Create purchase order
  572. purchase_order = self.create_purchase_order(kw.get('supplierId'), kw.get('items'), date_now, currency_id, pricelist_id, kw.get('paymentTermId'))
  573. self.make_info_log('Purchase order created')
  574. # Confirm purchase
  575. self.confirm_purchase_order(purchase_order.id)
  576. self.make_info_log('Purchase order confirmed')
  577. invoice = purchase_order.invoice_ids
  578. else:
  579. invoice = self.create_invoice(kw.get('supplierId'), kw.get('items'), currency_id, kw.get('paymentTermId'))
  580. self.make_info_log('Invoice created')
  581. invoice_ids = invoice.mapped(lambda x: x.id)
  582. # Validate invoice
  583. self.prepare_invoice(invoice_ids, currency_id, date_now)
  584. self.make_info_log('Invoice prepared')
  585. # Create invoice move lines
  586. invoice_move_lines = self.create_invoice_move_lines(invoice_ids, float(kw.get('payment')), date_now)
  587. self.make_info_log('Invoice move lines created')
  588. # Create account move
  589. account_move = self.create_account_move(invoice_ids, invoice_move_lines)
  590. self.make_info_log('Account move created')
  591. # Validate invoice
  592. self.validate_invoice(invoice_ids, mode)
  593. self.make_info_log('Invoice validated')
  594. # Create account voucher
  595. account_voucher = self.create_account_voucher(account_move.id, kw.get('journalId'), currency_id, float(kw.get('payment')))
  596. self.make_info_log('Account voucher created')
  597. # Close invoice
  598. self.close_invoice(invoice_ids)
  599. self.make_info_log('Attempt close invoice')
  600. # Create account bank statement lines
  601. account_bank_statement_lines = self.create_bank_statement_lines(account_voucher.id)
  602. self.make_info_log('Bank statement lines created')
  603. # Create account bank statement
  604. self.create_bank_statement(account_voucher.id, account_bank_statement_lines, date_now)
  605. self.make_info_log('Bank statement created')
  606. return {
  607. 'status': 'ok'
  608. }