main.py 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698
  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. 'phone': supplier.phone,
  112. 'mobile': supplier.mobile,
  113. 'email': supplier.email
  114. } for supplier in request.env['res.partner'].search([('supplier', '=', True), ('active', '=', True)])]
  115. '''
  116. Get all purchasable and active products
  117. '''
  118. def get_products(self):
  119. return [{
  120. 'id': product.id,
  121. 'name': product.name,
  122. 'displayName': product.display_name,
  123. 'ean13': product.ean13,
  124. 'imageMedium': product.image_medium,
  125. 'standardPrice': product.standard_price,
  126. 'variantCount': product.product_variant_count,
  127. 'quantity': 1,
  128. 'price': product.standard_price,
  129. 'variants': [{
  130. 'id': variant.id,
  131. 'name': variant.name,
  132. 'displayName': variant.display_name,
  133. 'ean13': variant.ean13,
  134. 'imageMedium': variant.image_medium,
  135. 'standardPrice': variant.standard_price,
  136. 'quantity': 1,
  137. 'price': variant.standard_price
  138. } for variant in product.product_variant_ids if variant.active]
  139. } for product in request.env['product.template'].search([('purchase_ok', '=', True), ('standard_price', '>=', 0), ('active', '=', True)])]
  140. '''
  141. Get all incoming and active picking types
  142. '''
  143. def get_picking_types(self):
  144. return [{
  145. 'id': picking_type.id,
  146. 'name': picking_type.name,
  147. 'displayName': picking_type.display_name
  148. } for picking_type in request.env['stock.picking.type'].search([('code', '=', 'incoming'), ('active', '=', True)])]
  149. '''
  150. Get all active payment terms
  151. '''
  152. def get_payment_terms(self):
  153. return [{
  154. 'id': payment_term.id,
  155. 'name': payment_term.name,
  156. 'displayName': payment_term.display_name,
  157. 'lines': [{
  158. 'id': line.id,
  159. 'days': line.days,
  160. 'days2': line.days2,
  161. 'value': line.value,
  162. 'valueAmount': line.value_amount
  163. } for line in payment_term.line_ids]
  164. } for payment_term in request.env['account.payment.term'].search([('active', '=', True)])]
  165. '''
  166. Make JSON response to send
  167. '''
  168. def make_response(self, data=None, status=200):
  169. return Response(json.dumps(data), status=status, content_type='application/json')
  170. '''
  171. Make GZIP to JSON response
  172. '''
  173. def make_gzip_response(self, data=None, status=200):
  174. gzip_buffer = IO()
  175. with GzipFile(mode='wb', compresslevel=GZIP_COMPRESSION_LEVEL, fileobj=gzip_buffer) as gzip_file:
  176. gzip_file.write(json.dumps(data))
  177. contents = gzip_buffer.getvalue()
  178. gzip_buffer.close()
  179. headers = Headers()
  180. headers.add('Content-Encoding', 'gzip')
  181. headers.add('Vary', 'Accept-Encoding')
  182. headers.add('Content-Length', len(contents))
  183. return Response(contents, status=status, headers=headers, content_type='application/json')
  184. '''
  185. '''
  186. def make_info_log(self, log):
  187. LOGGER.info('\033[1;34m[INFO] --> \033[m{}'.format(log))
  188. '''
  189. New purchase resource route
  190. '''
  191. @http.route('/eiru_purchases/init', auth='user', methods=['GET'], cors='*')
  192. def init_purchase(self, **kw):
  193. self.make_info_log('Sending JSON response')
  194. return self.make_gzip_response({
  195. 'date': self.get_server_date(),
  196. 'user': self.get_user(),
  197. 'currencies': self.get_currencies(),
  198. 'journals': self.get_journals(),
  199. 'suppliers': self.get_suppliers(),
  200. 'products': self.get_products(),
  201. 'pickingTypes': self.get_picking_types(),
  202. 'paymentTerms': self.get_payment_terms()
  203. })
  204. '''
  205. Create supplier and return data
  206. '''
  207. @http.route('/eiru_purchases/create_supplier', type='json', auth='user', methods=['POST'], cors='*')
  208. def create_supplier(self, **kw):
  209. self.make_info_log('Creating supplier')
  210. supplier = request.env['res.partner'].create({
  211. 'name': kw.get('name'),
  212. 'ruc': kw.get('ruc'),
  213. 'phone': kw.get('phone'),
  214. 'supplier': True,
  215. 'customer': False
  216. })
  217. return {
  218. 'id': supplier.id,
  219. 'name': supplier.name,
  220. 'displayName': supplier.display_name,
  221. 'imageMedium': supplier.image_medium,
  222. 'phone': supplier.phone,
  223. 'mobile': supplier.mobile,
  224. 'email': supplier.email
  225. }
  226. '''
  227. Create product and return data
  228. '''
  229. @http.route('/eiru_purchases/create_product', type='json', auth='user', methods=['POST'], cors='*')
  230. def create_product(self, **kw):
  231. self.make_info_log('Creating product')
  232. product = request.env['product.template'].create({
  233. 'name': kw.get('name'),
  234. 'standard_price': float(kw.get('price')),
  235. 'ean13': kw.get('ean13')
  236. })
  237. return {
  238. 'id': product.id,
  239. 'name': product.name,
  240. 'displayName': product.display_name,
  241. 'ean13': product.ean13,
  242. 'imageMedium': product.image_medium,
  243. 'listPrice': product.list_price,
  244. 'variantCount': product.product_variant_count,
  245. 'variants': [{
  246. 'id': variant.id,
  247. 'name': variant.name,
  248. 'displayName': variant.display_name,
  249. 'ean13': variant.ean13,
  250. 'imageMedium': variant.image_medium,
  251. 'standardPrice': variant.standard_price
  252. } for variant in product.product_variant_ids if variant.active]
  253. }
  254. '''
  255. Get currency id based on journal
  256. '''
  257. def get_currency_id(self, journal_id):
  258. journal = request.env['account.journal'].browse(journal_id)
  259. return journal.default_debit_account_id.currency_id.id or journal.default_debit_account_id.company_currency_id.id
  260. '''
  261. Check currency in pricelist and return it
  262. '''
  263. def get_pricelist_id(self, currency_id):
  264. pricelist = request.env['product.pricelist'].search([('active', '=', True), ('type', '=', 'sale')])
  265. if not True in pricelist.mapped(lambda p: p.currency_id.id == currency_id):
  266. pricelist = pricelist[0].copy()
  267. pricelist.write({
  268. 'currency_id': currency_id
  269. })
  270. else:
  271. pricelist = pricelist.filtered(lambda p: p.currency_id.id == currency_id)
  272. return pricelist.id
  273. '''
  274. Get default location
  275. '''
  276. def get_stock_location_id(self):
  277. stock_location = request.env['stock.location'].search([('usage', '=', 'internal')])
  278. return stock_location.id
  279. '''
  280. Create purchase order from cart and return id
  281. '''
  282. def create_purchase_order(self, supplier_id, cart_items, date_order, currency_id, pricelist_id, payment_term_id=None):
  283. return request.env['purchase.order'].create({
  284. 'name': '/',
  285. 'partner_id': supplier_id,
  286. 'order_line': [[0, False, {
  287. 'name': line.get('name'),
  288. 'date_planned': date_order,
  289. 'product_id': int(line.get('id')),
  290. 'product_qty': float(line.get('quantity')),
  291. 'price_unit': float(line.get('price'))
  292. }] for line in cart_items],
  293. 'date_order': datetime.now().strftime(DATETIME_FORMAT),
  294. 'currency_id': currency_id,
  295. 'pricelist_id': pricelist_id,
  296. 'payment_term_id': payment_term_id,
  297. 'location_id': self.get_stock_location_id(),
  298. 'invoice_method': 'order',
  299. 'state': 'draft'
  300. })
  301. '''
  302. Confirm purchase order
  303. '''
  304. def confirm_purchase_order(self, purchase_order_id):
  305. purchase_order = request.env['purchase.order'].browse(purchase_order_id)
  306. purchase_order.action_purchase_confirm()
  307. for picking in purchase_order.picking_ids:
  308. picking.force_assign()
  309. picking.action_done()
  310. '''
  311. Purchase order
  312. '''
  313. def create_invoice_lines(self, purchase_order_id):
  314. purchase_order_obj = request.env['purchase.order']
  315. account_invoice_line_obj = request.env['account.invoice.line']
  316. purchase_order = purchase_order_obj.browse(purchase_order_id)
  317. invoice_lines = {}
  318. for line in purchase_order.order_line:
  319. if (not line.invoiced) and (line.state not in ('draft', 'cancel')):
  320. if not line.partner_id.id in invoice_lines:
  321. invoice_lines[line.partner_id.id] = []
  322. account_id = purchase_order_obj._choose_account_from_po_line(line)
  323. account_invoice_line_values = purchase_order_obj._prepare_inv_line(account_id, line)
  324. account_invoice_line_values.update({
  325. 'origin': line.order_id.name
  326. })
  327. account_invoice_line_id = account_invoice_line_obj.create(account_invoice_line_values)
  328. line.write({
  329. 'invoiced': True,
  330. 'invoice_lines': [(4, account_invoice_line_id.id)]
  331. })
  332. invoice_lines[line.partner_id.id].append((line, account_invoice_line_id.id))
  333. return invoice_lines
  334. '''
  335. Prepare invoice
  336. '''
  337. def prepare_invoice(self, purchase_order_id, invoice_lines):
  338. purchase_order = request.env['purchase.order'].browse(purchase_order_id)
  339. assert len(purchase_order.invoice_ids) == 1
  340. journal = request.env['account.journal'].search([('type', '=', 'purchase')])
  341. date_due = parse(purchase_order.date_approve) + rd(days=max(purchase_order.payment_term_id.line_ids.mapped(lambda x: x.days + x.days2)))
  342. for value in invoice_lines.values():
  343. lines = map(lambda x : x[1], value)
  344. orders = list(set(map(lambda x : x[0].order_id, value)))
  345. purchase_order.invoice_ids.write({
  346. 'name': orders[0].name or '',
  347. 'origin': orders[0].name or '',
  348. 'type': 'in_invoice',
  349. 'journal_id': journal.id or False,
  350. 'reference': purchase_order.partner_id.ref,
  351. 'account_id': purchase_order.partner_id.property_account_payable.id,
  352. 'invoice_line': [(6, 0, lines)],
  353. 'currency_id': purchase_order.currency_id.id,
  354. 'payment_term': purchase_order.payment_term_id.id,
  355. 'fiscal_position': purchase_order.partner_id.property_account_position.id,
  356. 'date_invoice': purchase_order.date_approve,
  357. 'date_due': date_due,
  358. 'state': 'open'
  359. })
  360. '''
  361. Create move lines
  362. '''
  363. def create_invoice_move_lines(self, invoice_ids, paid_amount, date_today):
  364. assert len(invoice_ids) == 1
  365. invoice = request.env['account.invoice'].browse(invoice_ids)
  366. invoice_move_lines = invoice._get_analytic_lines()
  367. decimal_precision = request.env['decimal.precision'].precision_get('Account')
  368. compute_taxes = request.env['account.invoice.tax'].compute(invoice)
  369. invoice.check_tax_lines(compute_taxes)
  370. invoice._recompute_tax_amount()
  371. invoice_move_lines += request.env['account.invoice.tax'].move_line_get(invoice.id)
  372. total, total_currency, invoice_move_lines = invoice.compute_invoice_totals(invoice.company_id.currency_id, invoice.reference, invoice_move_lines)
  373. paid_percentage = paid_amount / round(total, decimal_precision)
  374. distributed_percentage = -(paid_percentage / len(invoice.payment_term.line_ids))
  375. payment_lines = []
  376. for line in invoice.payment_term.line_ids:
  377. date_due = (parse(date_today) + rd(days=line.days + line.days2)).strftime(DATE_FORMAT)
  378. if paid_percentage and paid_percentage < 1.0:
  379. payment_lines.append([date_today, paid_percentage])
  380. paid_percentage = paid_amount = 0
  381. if date_due == date_today and line.value_amount:
  382. distributed_percentage = -((payment_lines[0][1] - line.value_amount) / (len(invoice.payment_term.line_ids) - 1))
  383. continue
  384. if line.value != 'balance':
  385. payment_lines.append([date_due, line.value_amount + distributed_percentage])
  386. continue
  387. payment_lines.append([date_due, line.value_amount])
  388. for payment_line in payment_lines:
  389. current_price = round(total * payment_line[1], decimal_precision)
  390. if current_price < 0.0:
  391. continue
  392. paid_amount += current_price
  393. invoice_move_lines.append({
  394. 'type': 'dest',
  395. 'name': '/',
  396. 'price': current_price if payment_line[1] else round(total - paid_amount, decimal_precision) or total,
  397. 'account_id': invoice.account_id.id,
  398. 'date_maturity': payment_line[0],
  399. '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,
  400. 'currency_id': invoice.currency_id != invoice.company_id.currency_id and invoice.currency_id.id,
  401. 'ref': invoice.reference
  402. })
  403. payment_lines = []
  404. return invoice_move_lines
  405. '''
  406. Create account move
  407. '''
  408. def create_account_move(self, invoice_ids, invoice_move_lines):
  409. assert len(invoice_ids) == 1
  410. invoice = request.env['account.invoice'].browse(invoice_ids)
  411. accounting_partner = request.env['res.partner']._find_accounting_partner(invoice.partner_id)
  412. move_line_values = [(0, 0, invoice.line_get_convert(line, accounting_partner.id, invoice.date_invoice)) for line in invoice_move_lines]
  413. move_line_values = invoice.group_lines(invoice_move_lines, move_line_values)
  414. move_line_values = invoice.finalize_invoice_move_lines(move_line_values)
  415. ctx = dict(request.context, lang=invoice.partner_id.lang, company_id=invoice.company_id.id)
  416. period = invoice.period_id
  417. if not period:
  418. period = period.with_context(ctx).find(invoice.date_invoice)[:1]
  419. if period:
  420. for line in move_line_values:
  421. line[2]['period_id'] = period.id
  422. ctx['invoice'] = invoice
  423. ctx_nolang = ctx.copy()
  424. ctx_nolang.pop('lang', None)
  425. account_move = request.env['account.move'].with_context(ctx_nolang).create({
  426. 'ref': invoice.reference or invoice.name,
  427. 'line_id': move_line_values,
  428. 'journal_id': invoice.journal_id.id,
  429. 'date': invoice.date_invoice,
  430. 'narration': invoice.comment,
  431. 'company_id': invoice.company_id.id,
  432. 'period_id': period.id
  433. })
  434. invoice.with_context(ctx).write({
  435. 'move_id': account_move.id,
  436. 'period_id': account_move.period_id.id,
  437. 'move_name': account_move.name,
  438. })
  439. account_move.post()
  440. return account_move
  441. '''
  442. Number to invoice
  443. '''
  444. def number_invoice(self, invoice_ids):
  445. assert len(invoice_ids) == 1
  446. request.env['account.invoice'].browse(invoice_ids).action_number()
  447. '''
  448. Create voucher
  449. '''
  450. def create_account_voucher(self, account_move_id, journal_id, currency_id, paid_amount):
  451. account_move = request.env['account.move'].browse(account_move_id)
  452. account_journal = request.env['account.journal'].browse(journal_id)
  453. account_voucher = request.env['account.voucher'].create({
  454. 'reference': account_move.name,
  455. 'type': 'receipt',
  456. 'journal_id': account_journal.id,
  457. 'company_id': account_move.company_id.id,
  458. 'pre_line': True,
  459. 'amount': paid_amount,
  460. 'period_id': account_move.period_id.id,
  461. 'date': account_move.date,
  462. 'partner_id': account_move.partner_id.id,
  463. 'account_id': account_journal.default_credit_account_id.id,
  464. 'currency_id': currency_id,
  465. 'line_cr_ids': [[0, False, {
  466. 'date_due': l.date_maturity,
  467. 'account_id': l.account_id.id,
  468. 'date_original': l.invoice.date_invoice,
  469. 'move_line_id': l.id,
  470. 'amount_original': abs(l.credit or l.debit or 0.0),
  471. 'amount_unreconciled': abs(l.amount_residual),
  472. 'amount': abs(l.debit) if account_move.date == l.date_maturity else 0.0,
  473. 'reconcile': account_move.date == l.date_maturity,
  474. 'currency_id': currency_id
  475. }] for l in account_move.line_id]
  476. })
  477. account_voucher.action_move_line_create()
  478. return account_voucher
  479. '''
  480. Close a invoice
  481. '''
  482. def close_invoice(self, invoice_ids):
  483. assert len(invoice_ids) == 1
  484. invoice = request.env['account.invoice'].browse(invoice_ids)
  485. if invoice.residual == 0:
  486. invoice.write({
  487. 'state': 'paid'
  488. })
  489. '''
  490. Create account bank statement
  491. '''
  492. def create_bank_statement(self, account_voucher_id, account_bank_statement_lines, date_today):
  493. account_voucher = request.env['account.voucher'].browse(account_voucher_id)
  494. account_bank_statement = request.env['account.bank.statement'].search([('journal_id', '=', account_voucher.journal_id.id), ('date', '=', date_today)])
  495. account_bank_statement_values = {
  496. 'date': date_today,
  497. 'user_id': request.env.user.id,
  498. 'journal_id': account_voucher.journal_id.id,
  499. 'period_id': account_voucher.period_id.id,
  500. 'line_ids': account_bank_statement_lines,
  501. 'state': 'open' if account_voucher.journal_id.type == 'cash' else 'draft'
  502. }
  503. if account_bank_statement:
  504. size = len(account_bank_statement)
  505. if size == 1:
  506. account_bank_statement.write(account_bank_statement_values)
  507. else:
  508. account_bank_statement[size - 1].write(account_bank_statement_values)
  509. else:
  510. account_bank_statement.create(account_bank_statement_values)
  511. return account_bank_statement
  512. '''
  513. Create account bank statement lines
  514. '''
  515. def create_bank_statement_lines(self, account_voucher_id, reference=None):
  516. account_voucher = request.env['account.voucher'].browse(account_voucher_id)
  517. return [[0, False, {
  518. 'name': account_voucher.reference,
  519. 'amount': account_voucher.amount,
  520. 'partner_id': account_voucher.partner_id.id,
  521. 'voucher_id': account_voucher.id,
  522. 'journal_id': account_voucher.journal_id.id,
  523. 'account_id': account_voucher.account_id.id,
  524. 'journal_entry_id': account_voucher.move_id.id,
  525. 'currency_id': account_voucher.currency_id.id,
  526. 'ref': 'POS/' + (reference or '')
  527. }]]
  528. '''
  529. Purchase processing resource route
  530. '''
  531. @http.route('/eiru_purchases/process', type='json', auth='user', methods=['POST'], cors='*')
  532. def process_purchase(self, **kw):
  533. self.make_info_log('Processing purchase...')
  534. # Get date
  535. date_now = datetime.now().strftime(DATE_FORMAT)
  536. self.make_info_log('Getting date')
  537. # Get currency
  538. currency_id = self.get_currency_id(kw.get('journalId'))
  539. self.make_info_log('Getting currency')
  540. # Get pricelist
  541. pricelist_id = self.get_pricelist_id(currency_id)
  542. self.make_info_log('Product pricelist checked')
  543. # Create purchase order
  544. purchase_order = self.create_purchase_order(kw.get('supplierId'), kw.get('items'), date_now, currency_id, pricelist_id, kw.get('paymentTermId'))
  545. self.make_info_log('Purchase order created')
  546. # Confirm purchase
  547. self.confirm_purchase_order(purchase_order.id)
  548. self.make_info_log('Purchase order confirmed')
  549. # Create invoice lines
  550. invoice_lines = self.create_invoice_lines(purchase_order.id)
  551. self.make_info_log('Invoice lines created')
  552. # Invoice preparation
  553. self.prepare_invoice(purchase_order.id, invoice_lines)
  554. self.make_info_log('Invoice prepared')
  555. # # Create invoice
  556. # invoice_ids = self.create_invoice(purchase_order.id)
  557. # print(invoice_ids)
  558. # self.make_info_log('Invoice created')
  559. # # Prepare invoice
  560. # self.prepare_invoice(invoice_ids, currency_id, date_now)
  561. # self.make_info_log('Invoice prepared')
  562. # # Create invoice move line
  563. # invoice_move_lines = self.create_invoice_move_lines(invoice_ids, float(kw.get('payment')), date_now)
  564. # self.make_info_log('Invoice move lines created')
  565. # # Create account move
  566. # account_move = self.create_account_move(invoice_ids, invoice_move_lines)
  567. # self.make_info_log('Account move created')
  568. # # Number invoice
  569. # self.number_invoice(invoice_ids)
  570. # self.make_info_log('Number invoice ok')
  571. # # Create account voucher
  572. # account_voucher = self.create_account_voucher(account_move.id, kw.get('journalId'), currency_id, float(kw.get('payment')))
  573. # self.make_info_log('Account voucher created')
  574. # # Close invoice
  575. # self.close_invoice(invoice_ids)
  576. # self.make_info_log('Attempt close invoice')
  577. # # Create account bank statement lines
  578. # account_bank_statement_lines = self.create_bank_statement_lines(account_voucher.id)
  579. # self.make_info_log('Bank statement lines created')
  580. # # Create account bank statement
  581. # self.create_bank_statement(account_voucher.id, account_bank_statement_lines, date_now)
  582. # self.make_info_log('Bank statement created')
  583. return {
  584. 'status': 'ok'
  585. }