main.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. # -*- coding: utf-8 -*-
  2. from openerp import http
  3. from openerp.http import request
  4. from http_response import make_gzip_response
  5. import logging
  6. LOGGER = logging.getLogger(__name__)
  7. class PosSales(http.Controller):
  8. #################
  9. # ╦ ╔═╗╔═╗ #
  10. # ║ ║ ║║ ╦ #
  11. # ╩═╝╚═╝╚═╝ #
  12. #################
  13. def make_info_log(self, log):
  14. LOGGER.info('\033[1;34m[INFO] --> \033[m{}'.format(log))
  15. #####################################
  16. # ╦╔╗╔╦╔╦╗ ╔═╗╦═╗╔═╗╔═╗╔═╗╔═╗╔═╗ #
  17. # ║║║║║ ║ ╠═╝╠╦╝║ ║║ ║╣ ╚═╗╚═╗ #
  18. # ╩╝╚╝╩ ╩ ╩ ╩╚═╚═╝╚═╝╚═╝╚═╝╚═╝ #
  19. #####################################
  20. @http.route('/eiru_sales/init', auth='user', methods=['GET'], cors='*')
  21. def _init_sale(self, **kw):
  22. self.make_info_log('Sending JSON response')
  23. # Imports
  24. from server_datetime import get_datetime
  25. from res_currency import check_base_currency
  26. from res_config import get_pos_config
  27. from res_users import get_current_user
  28. from account_journal import get_journals, get_currencies_from_journals
  29. from res_partner import get_customers
  30. from product_template import get_products
  31. from account_payment_term import get_payment_terms
  32. from res_bank import get_banks
  33. from res_bank_payment_type import get_bank_payment_types
  34. from res_bank_cheque_type import get_cheque_types
  35. from res_store import get_stores
  36. from sale_order import get_sale_orders
  37. from stock_picking import get_pickings
  38. from stock_warehouse import get_warehouses
  39. # Logic
  40. check_base_currency()
  41. config = get_pos_config()
  42. image_type = config.get('imageType')
  43. mode = kw.get('mode', 'unknown')
  44. data = {}
  45. # Take all data
  46. if mode == 'sale':
  47. data = {
  48. 'settings': config,
  49. 'date': get_datetime(),
  50. 'user': get_current_user(),
  51. 'currencies': get_currencies_from_journals(),
  52. 'journals': get_journals(),
  53. 'customers': get_customers(image_type=image_type),
  54. 'products': get_products(image_type=image_type),
  55. 'paymentTerms': get_payment_terms(),
  56. 'banks': get_banks(),
  57. 'bankPaymentTypes': get_bank_payment_types(),
  58. 'chequeTypes': get_cheque_types(),
  59. 'warehouses': get_warehouses()
  60. }
  61. # Take data for picking
  62. if mode == 'product_picking':
  63. data = {
  64. 'settings': config,
  65. 'date': get_datetime(),
  66. 'user': get_current_user(),
  67. 'currencies': get_currencies_from_journals(),
  68. 'customers': get_customers(image_type=image_type),
  69. 'products': get_products(image_type=image_type)
  70. }
  71. # Take data for payment
  72. if mode == 'payment':
  73. data = {
  74. 'saleOrders': get_sale_orders(),
  75. 'currencies': get_currencies_from_journals(),
  76. 'customers': get_customers(image_type=image_type),
  77. 'journals': get_journals(),
  78. 'paymentTerms': get_payment_terms(),
  79. 'banks': get_banks(),
  80. 'bankPaymentTypes': get_bank_payment_types(),
  81. 'chequeTypes': get_cheque_types(),
  82. 'stores': get_stores()
  83. }
  84. # Take data for delivery
  85. if mode == 'product_delivery':
  86. data = {
  87. 'stockPickings': get_pickings()
  88. }
  89. return make_gzip_response(data)
  90. #####################################################################
  91. # ╔═╗╔═╗╔╦╗ ╔═╗╦═╗╔═╗╔╦╗╦ ╦╔═╗╔╦╗╔═╗ ╔╦╗╔═╗╔╦╗╔═╗ ╔═╗╔╗╔╦ ╦ ╦ #
  92. # ║ ╦║╣ ║ ╠═╝╠╦╝║ ║ ║║║ ║║ ║ ╚═╗ ║║╠═╣ ║ ╠═╣ ║ ║║║║║ ╚╦╝ #
  93. # ╚═╝╚═╝ ╩ ╩ ╩╚═╚═╝═╩╝╚═╝╚═╝ ╩ ╚═╝ ═╩╝╩ ╩ ╩ ╩ ╩ ╚═╝╝╚╝╩═╝╩ #
  94. #####################################################################
  95. @http.route('/eiru_sales/get_images', auth='user', methods=['GET'], cors='*')
  96. def _get_images_only(self, **kw):
  97. image_type = str(get_pos_config().get('imageType'))
  98. # Imports
  99. from res_partner import get_customers
  100. from product_template import get_products
  101. return make_gzip_response({
  102. 'customers': get_customers(image_type=image_type),
  103. 'products': get_products(image_type=image_type)
  104. })
  105. #################################################################################################
  106. # ╔═╗╦═╗╔═╗╔═╗╔╦╗╔═╗ ╔═╗╦ ╦╔═╗╔╦╗╔═╗╔╦╗╔═╗╦═╗ ╔═╗╔╗╔╔╦╗ ╦═╗╔═╗╔╦╗╦ ╦╦═╗╔╗╔ ╔╦╗╔═╗╔╦╗╔═╗ #
  107. # ║ ╠╦╝║╣ ╠═╣ ║ ║╣ ║ ║ ║╚═╗ ║ ║ ║║║║║╣ ╠╦╝ ╠═╣║║║ ║║ ╠╦╝║╣ ║ ║ ║╠╦╝║║║ ║║╠═╣ ║ ╠═╣ #
  108. # ╚═╝╩╚═╚═╝╩ ╩ ╩ ╚═╝ ╚═╝╚═╝╚═╝ ╩ ╚═╝╩ ╩╚═╝╩╚═ ╩ ╩╝╚╝═╩╝ ╩╚═╚═╝ ╩ ╚═╝╩╚═╝╚╝ ═╩╝╩ ╩ ╩ ╩ ╩ #
  109. #################################################################################################
  110. @http.route('/eiru_sales/create_customer', type='json', auth='user', methods=['POST'], cors='*')
  111. def _create_customer(self, **kw):
  112. from res_partner import create_customer
  113. self.make_info_log('Creating customer')
  114. return create_customer(kw)
  115. #############################################
  116. # ╔═╗╔═╗╦ ╦╔═╗ ╔═╗╔═╗╔╦╗╔╦╗╦╔╗╔╔═╗╔═╗ #
  117. # ╚═╗╠═╣╚╗╔╝║╣ ╚═╗║╣ ║ ║ ║║║║║ ╦╚═╗ #
  118. # ╚═╝╩ ╩ ╚╝ ╚═╝ ╚═╝╚═╝ ╩ ╩ ╩╝╚╝╚═╝╚═╝ #
  119. #############################################
  120. @http.route('/eiru_sales/save_settings', type='json', auth='user', methods=['POST'], cors='*')
  121. def _save_config(self, **kw):
  122. from res_config import save_pos_config
  123. self.make_info_log('save settings')
  124. return save_pos_config(kw)
  125. #############################################################################################
  126. # ╔═╗╦═╗╔═╗╔═╗╔╦╗╔═╗ ╔═╗╦═╗╔═╗╔╦╗╦ ╦╔═╗╔╦╗ ╔═╗╔╗╔╔╦╗ ╦═╗╔═╗╔╦╗╦ ╦╦═╗╔╗╔ ╔╦╗╔═╗╔╦╗╔═╗ #
  127. # ║ ╠╦╝║╣ ╠═╣ ║ ║╣ ╠═╝╠╦╝║ ║ ║║║ ║║ ║ ╠═╣║║║ ║║ ╠╦╝║╣ ║ ║ ║╠╦╝║║║ ║║╠═╣ ║ ╠═╣ #
  128. # ╚═╝╩╚═╚═╝╩ ╩ ╩ ╚═╝ ╩ ╩╚═╚═╝═╩╝╚═╝╚═╝ ╩ ╩ ╩╝╚╝═╩╝ ╩╚═╚═╝ ╩ ╚═╝╩╚═╝╚╝ ═╩╝╩ ╩ ╩ ╩ ╩ #
  129. #############################################################################################
  130. @http.route('/eiru_sales/create_product', type='json', auth='user', methods=['POST'], cors='*')
  131. def _create_product(self, **kw):
  132. from product_template import create_product
  133. return create_product(kw)
  134. #############################################
  135. # ╔═╗╦╔╗╔╦╔═╗╦ ╦ ╔═╗╦═╗╔═╗╔═╗╔═╗╔═╗╔═╗ #
  136. # ╠╣ ║║║║║╚═╗╠═╣ ╠═╝╠╦╝║ ║║ ║╣ ╚═╗╚═╗ #
  137. # ╚ ╩╝╚╝╩╚═╝╩ ╩ ╩ ╩╚═╚═╝╚═╝╚═╝╚═╝╚═╝ #
  138. #############################################
  139. @http.route('/eiru_sales/finish', type='json', auth='user', methods=['POST'], cors='*')
  140. def _finish(self, **kw):
  141. self.make_info_log('Finishing...')
  142. # Imports
  143. from server_datetime import get_date, get_datetime
  144. from account_journal import get_currency
  145. '''
  146. ╔═╗╦╔╗╔╦╔═╗╦ ╦ ╔╗ ╦ ╦╔╦╗╔═╗╔═╗╔╦╗ ╔═╗╔═╗╔═╗ ╔═╗╦═╗╔═╗╔═╗╔═╗╔╦╗╦ ╦╦═╗╔═╗
  147. ╠╣ ║║║║║╚═╗╠═╣ ╠╩╗║ ║ ║║║ ╦║╣ ║ ╠═╝║ ║╚═╗ ╠═╝╠╦╝║ ║║ ║╣ ║║║ ║╠╦╝║╣
  148. ╚ ╩╝╚╝╩╚═╝╩ ╩ ╚═╝╚═╝═╩╝╚═╝╚═╝ ╩ ╩ ╚═╝╚═╝ ╩ ╩╚═╚═╝╚═╝╚═╝═╩╝╚═╝╩╚═╚═╝
  149. '''
  150. def finish_budget_pos(journal_id, customer_id, cart_items, date_now, payment_term_id):
  151. # Imports
  152. from account_journal import get_currency
  153. from sale_order import create_sale_from_cart
  154. # Get currency
  155. currency_id = get_currency(journal_id)
  156. if not currency_id:
  157. currency_id = request.env.user.company_id.currency_id.id
  158. self.make_info_log('[OK] Getting journal')
  159. # Create sale order
  160. sale_order = create_sale_from_cart(customer_id, cart_items, date_now, currency_id, payment_term_id)
  161. self.make_info_log('[OK] Creating sale order')
  162. return (sale_order.id, currency_id)
  163. '''
  164. ╔═╗╦╔╗╔╦╔═╗╦ ╦ ╔═╗╔═╗╦ ╔═╗ ╔═╗╔═╗╔═╗ ╔═╗╦═╗╔═╗╔═╗╔═╗╔╦╗╦ ╦╦═╗╔═╗
  165. ╠╣ ║║║║║╚═╗╠═╣ ╚═╗╠═╣║ ║╣ ╠═╝║ ║╚═╗ ╠═╝╠╦╝║ ║║ ║╣ ║║║ ║╠╦╝║╣
  166. ╚ ╩╝╚╝╩╚═╝╩ ╩ ╚═╝╩ ╩╩═╝╚═╝ ╩ ╚═╝╚═╝ ╩ ╩╚═╚═╝╚═╝╚═╝═╩╝╚═╝╩╚═╚═╝
  167. '''
  168. def finish_sale_pos(journal_id, customer_id, cart_items, date_now, payment_term_id, payment, payment_method, bank_payment_data):
  169. # Create budget
  170. sale_order_id, currency_id = finish_budget_pos(journal_id, customer_id, cart_items, date_now, payment_term_id)
  171. # Imports
  172. from sale_order import confirm_sale_order
  173. from account_invoice import (
  174. create_invoice,
  175. create_invoice_move_lines,
  176. number_invoice,
  177. close_invoice
  178. )
  179. from account_move import create_account_move
  180. from account_voucher import create_account_voucher
  181. from account_bank_statement import create_bank_statement
  182. from res_bank_payment import create_bank_payment_statement
  183. # Confirm sale
  184. confirm_sale_order(sale_order_id)
  185. self.make_info_log('[OK] Confirm sale order')
  186. # Create invoice
  187. invoice = create_invoice(sale_order_id, currency_id, date_now)
  188. self.make_info_log('[OK] Creating invoice')
  189. # Create invoice move lines
  190. invoice_move_lines = create_invoice_move_lines(invoice.id, payment, date_now)
  191. self.make_info_log('[OK] Creating invoice move lines')
  192. # Create account move
  193. account_move = create_account_move(invoice.id, invoice_move_lines)
  194. self.make_info_log('[OK] Creating account move')
  195. # Number invoice
  196. number_invoice(invoice.id)
  197. self.make_info_log('[OK] Number invoice')
  198. # Create account voucher
  199. account_voucher = create_account_voucher(account_move.id, journal_id, currency_id, payment)
  200. self.make_info_log('[OK] Creating account voucher')
  201. # Close invoice
  202. close_invoice(invoice.id)
  203. self.make_info_log('[OK] Closing invoice')
  204. # Create bank statement
  205. create_bank_statement(account_voucher.id, date_now)
  206. self.make_info_log('[OK] Creating account bank statement')
  207. # Create bank payment statement
  208. if payment_method == 'Banco':
  209. create_bank_payment_statement(bank_payment_data, invoice.id, account_voucher.id)
  210. self.make_info_log('[OK] Creating bank payment statement')
  211. '''
  212. ╔═╗╦╔╗╔╦╔═╗╦ ╦ ╔═╗╦═╗╔═╗╔╦╗╦ ╦╔═╗╔╦╗ ╔═╗╦╔═╗╦╔═╦╔╗╔╔═╗
  213. ╠╣ ║║║║║╚═╗╠═╣ ╠═╝╠╦╝║ ║ ║║║ ║║ ║ ╠═╝║║ ╠╩╗║║║║║ ╦
  214. ╚ ╩╝╚╝╩╚═╝╩ ╩ ╩ ╩╚═╚═╝═╩╝╚═╝╚═╝ ╩ ╩ ╩╚═╝╩ ╩╩╝╚╝╚═╝
  215. '''
  216. def finish_process_picking(journal_id, customer_id, cart_items, date_now, payment_term_id):
  217. sale_order_id, _ = finish_budget_pos(journal_id, customer_id, cart_items, date_now, payment_term_id)
  218. # Imports
  219. from sale_order import confirm_sale_order, force_assign_picking
  220. # Confirm sale
  221. confirm_sale_order(sale_order_id)
  222. self.make_info_log('[OK] Confirm sale order')
  223. # Force assign picking
  224. force_assign_picking(sale_order_id)
  225. self.make_info_log('[OK] Pick assign')
  226. '''
  227. ╔═╗╦╔╗╔╦╔═╗╦ ╦ ╔═╗╔═╗╦ ╦╔╦╗╔═╗╔╗╔╔╦╗
  228. ╠╣ ║║║║║╚═╗╠═╣ ╠═╝╠═╣╚╦╝║║║║╣ ║║║ ║
  229. ╚ ╩╝╚╝╩╚═╝╩ ╩ ╩ ╩ ╩ ╩ ╩ ╩╚═╝╝╚╝ ╩
  230. '''
  231. def finish_payment(sale_order_id, currency_id, date_now, payment_term_id, payment, payment_method, bank_payment_data):
  232. # Imports
  233. from account_invoice import (
  234. create_invoice,
  235. create_invoice_move_lines,
  236. number_invoice,
  237. close_invoice
  238. )
  239. from account_move import create_account_move
  240. from account_voucher import create_account_voucher
  241. from account_bank_statement import create_bank_statement
  242. from res_bank_payment import create_bank_payment_statement
  243. # Payment term
  244. sale_order = request.env['sale.order'].browse(sale_order_id)
  245. sale_order.write({
  246. 'payment_term': payment_term_id
  247. })
  248. # Create invoice
  249. invoice = create_invoice(sale_order_id, currency_id, date_now, False)
  250. self.make_info_log('[OK] Creating invoice')
  251. # Create invoice move lines
  252. invoice_move_lines = create_invoice_move_lines(invoice.id, payment, date_now)
  253. self.make_info_log('[OK] Creating invoice move lines')
  254. # Create account move
  255. account_move = create_account_move(invoice.id, invoice_move_lines)
  256. self.make_info_log('[OK] Creating account move')
  257. # Number invoice
  258. number_invoice(invoice.id)
  259. self.make_info_log('[OK] Number invoice')
  260. # Create account voucher
  261. account_voucher = create_account_voucher(account_move.id, journal_id, currency_id, payment)
  262. self.make_info_log('[OK] Creating account voucher')
  263. # Close invoice
  264. close_invoice(invoice.id)
  265. self.make_info_log('[OK] Closing invoice')
  266. # Create bank statement
  267. create_bank_statement(account_voucher.id, date_now)
  268. self.make_info_log('[OK] Creating account bank statement')
  269. # Create bank payment statement
  270. if payment_method == 'Banco':
  271. create_bank_payment_statement(bank_payment_data, invoice.id, account_voucher.id)
  272. self.make_info_log('[OK] Creating bank payment statement')
  273. '''
  274. ╔═╗╦╔╗╔╦╔═╗╦ ╦ ╔═╗╦═╗╔═╗╔╦╗╦ ╦╔═╗╔╦╗ ╔╦╗╔═╗╦ ╦╦ ╦╔═╗╦═╗╦ ╦
  275. ╠╣ ║║║║║╚═╗╠═╣ ╠═╝╠╦╝║ ║ ║║║ ║║ ║ ║║║╣ ║ ║╚╗╔╝║╣ ╠╦╝╚╦╝
  276. ╚ ╩╝╚╝╩╚═╝╩ ╩ ╩ ╩╚═╚═╝═╩╝╚═╝╚═╝ ╩ ═╩╝╚═╝╩═╝╩ ╚╝ ╚═╝╩╚═ ╩
  277. '''
  278. def finish_product_delivery(stock_picking_id):
  279. from stock_picking import confirm_picking
  280. confirm_picking(stock_picking_id)
  281. '''
  282. ╔═╗╦═╗╔═╗╔═╗╔═╗╔═╗╔═╗ ╔═╗╦╔╗╔╦╔═╗╦ ╦ ╔╦╗╔═╗╔═╗╦╔═╗╦╔═╗╔╗╔
  283. ╠═╝╠╦╝║ ║║ ║╣ ╚═╗╚═╗ ╠╣ ║║║║║╚═╗╠═╣ ║║║╣ ║ ║╚═╗║║ ║║║║
  284. ╩ ╩╚═╚═╝╚═╝╚═╝╚═╝╚═╝ ╚ ╩╝╚╝╩╚═╝╩ ╩ ═╩╝╚═╝╚═╝╩╚═╝╩╚═╝╝╚╝
  285. '''
  286. data = kw.get('data', [])
  287. date_now = get_date()
  288. for row in data:
  289. mode = row.get('mode', 'sale')
  290. journal_id = row.get('journalId', None)
  291. customer_id = row.get('customerId', None)
  292. cart_items = row.get('items', [])
  293. payment_term_id = row.get('paymentTermId', None)
  294. payment = float(row.get('payment', 0.0))
  295. payment_method = row.get('paymentMethod', 'Efectivo')
  296. bank_payment_data = row.get('bankPaymentData', {})
  297. if mode == 'budget':
  298. finish_budget_pos(journal_id, customer_id, cart_items, date_now, payment_term_id)
  299. if mode == 'sale':
  300. finish_sale_pos(journal_id, customer_id, cart_items, date_now, payment_term_id, payment, payment_method, bank_payment_data)
  301. if mode == 'product_picking':
  302. finish_process_picking(journal_id, customer_id, cart_items, date_now, payment_term_id)
  303. if mode == 'payment':
  304. sale_order_id = row.get('saleOrderId', None)
  305. currency_id = row.get('currencyId', None)
  306. finish_payment(sale_order_id, currency_id, date_now, payment_term_id, payment, payment_method, bank_payment_data)
  307. if mode == 'product_delivery':
  308. stock_picking_id = row.get('stockPickingId', None)
  309. finish_product_delivery(stock_picking_id)
  310. return {
  311. 'process': True,
  312. 'date': get_datetime()
  313. }