main.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  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. # Logic
  37. check_base_currency()
  38. config = get_pos_config()
  39. mode = kw.get('mode', 'unknown')
  40. data = {}
  41. # Take all data
  42. if mode == 'sale':
  43. data = {
  44. 'settings': config,
  45. 'date': get_datetime(),
  46. 'user': get_current_user(),
  47. 'currencies': get_currencies_from_journals(),
  48. 'journals': get_journals(),
  49. 'customers': get_customers(image_type=config.get('imageType')),
  50. 'products': get_products(image_type=config.get('imageType')),
  51. 'paymentTerms': get_payment_terms(),
  52. 'banks': get_banks(),
  53. 'bankPaymentTypes': get_bank_payment_types(),
  54. 'chequeTypes': get_cheque_types(),
  55. 'stores': get_stores()
  56. }
  57. # Take data for picking
  58. if mode == 'product_picking':
  59. data = {
  60. 'settings': config,
  61. 'date': get_datetime(),
  62. 'user': get_current_user(),
  63. 'customers': get_customers(image_type=config.get('imageType')),
  64. 'products': get_products(image_type=config.get('imageType')),
  65. }
  66. # Take data for payment
  67. if mode == 'payment':
  68. data = {}
  69. # Take data for delivery
  70. if mode == 'product_delivery':
  71. data = {}
  72. return make_gzip_response(data)
  73. #####################################################################
  74. # ╔═╗╔═╗╔╦╗ ╔═╗╦═╗╔═╗╔╦╗╦ ╦╔═╗╔╦╗╔═╗ ╔╦╗╔═╗╔╦╗╔═╗ ╔═╗╔╗╔╦ ╦ ╦ #
  75. # ║ ╦║╣ ║ ╠═╝╠╦╝║ ║ ║║║ ║║ ║ ╚═╗ ║║╠═╣ ║ ╠═╣ ║ ║║║║║ ╚╦╝ #
  76. # ╚═╝╚═╝ ╩ ╩ ╩╚═╚═╝═╩╝╚═╝╚═╝ ╩ ╚═╝ ═╩╝╩ ╩ ╩ ╩ ╩ ╚═╝╝╚╝╩═╝╩ #
  77. #####################################################################
  78. @http.route('/eiru_sales/get_images', auth='user', methods=['GET'], cors='*')
  79. def _get_images_only(self, **kw):
  80. image_type = str(get_pos_config().get('imageType'))
  81. # Imports
  82. from res_partner import get_customers
  83. from product_template import get_products
  84. return make_gzip_response({
  85. 'customers': get_customers(image_type=image_type),
  86. 'products': get_products(image_type=image_type)
  87. })
  88. #################################################################################################
  89. # ╔═╗╦═╗╔═╗╔═╗╔╦╗╔═╗ ╔═╗╦ ╦╔═╗╔╦╗╔═╗╔╦╗╔═╗╦═╗ ╔═╗╔╗╔╔╦╗ ╦═╗╔═╗╔╦╗╦ ╦╦═╗╔╗╔ ╔╦╗╔═╗╔╦╗╔═╗ #
  90. # ║ ╠╦╝║╣ ╠═╣ ║ ║╣ ║ ║ ║╚═╗ ║ ║ ║║║║║╣ ╠╦╝ ╠═╣║║║ ║║ ╠╦╝║╣ ║ ║ ║╠╦╝║║║ ║║╠═╣ ║ ╠═╣ #
  91. # ╚═╝╩╚═╚═╝╩ ╩ ╩ ╚═╝ ╚═╝╚═╝╚═╝ ╩ ╚═╝╩ ╩╚═╝╩╚═ ╩ ╩╝╚╝═╩╝ ╩╚═╚═╝ ╩ ╚═╝╩╚═╝╚╝ ═╩╝╩ ╩ ╩ ╩ ╩ #
  92. #################################################################################################
  93. @http.route('/eiru_sales/create_customer', type='json', auth='user', methods=['POST'], cors='*')
  94. def _create_customer(self, **kw):
  95. from res_partner import create_customer
  96. self.make_info_log('Creating customer')
  97. return create_customer(kw)
  98. #############################################
  99. # ╔═╗╔═╗╦ ╦╔═╗ ╔═╗╔═╗╔╦╗╔╦╗╦╔╗╔╔═╗╔═╗ #
  100. # ╚═╗╠═╣╚╗╔╝║╣ ╚═╗║╣ ║ ║ ║║║║║ ╦╚═╗ #
  101. # ╚═╝╩ ╩ ╚╝ ╚═╝ ╚═╝╚═╝ ╩ ╩ ╩╝╚╝╚═╝╚═╝ #
  102. #############################################
  103. @http.route('/eiru_sales/save_settings', type='json', auth='user', methods=['POST'], cors='*')
  104. def _save_config(self, **kw):
  105. from res_config import save_pos_config
  106. self.make_info_log('save settings')
  107. return save_pos_config(kw)
  108. #############################################################################################
  109. # ╔═╗╦═╗╔═╗╔═╗╔╦╗╔═╗ ╔═╗╦═╗╔═╗╔╦╗╦ ╦╔═╗╔╦╗ ╔═╗╔╗╔╔╦╗ ╦═╗╔═╗╔╦╗╦ ╦╦═╗╔╗╔ ╔╦╗╔═╗╔╦╗╔═╗ #
  110. # ║ ╠╦╝║╣ ╠═╣ ║ ║╣ ╠═╝╠╦╝║ ║ ║║║ ║║ ║ ╠═╣║║║ ║║ ╠╦╝║╣ ║ ║ ║╠╦╝║║║ ║║╠═╣ ║ ╠═╣ #
  111. # ╚═╝╩╚═╚═╝╩ ╩ ╩ ╚═╝ ╩ ╩╚═╚═╝═╩╝╚═╝╚═╝ ╩ ╩ ╩╝╚╝═╩╝ ╩╚═╚═╝ ╩ ╚═╝╩╚═╝╚╝ ═╩╝╩ ╩ ╩ ╩ ╩ #
  112. #############################################################################################
  113. @http.route('/eiru_sales/create_product', type='json', auth='user', methods=['POST'], cors='*')
  114. def _create_product(self, **kw):
  115. from product_template import create_product
  116. return create_product(kw)
  117. #############################################
  118. # ╔═╗╦╔╗╔╦╔═╗╦ ╦ ╔═╗╦═╗╔═╗╔═╗╔═╗╔═╗╔═╗ #
  119. # ╠╣ ║║║║║╚═╗╠═╣ ╠═╝╠╦╝║ ║║ ║╣ ╚═╗╚═╗ #
  120. # ╚ ╩╝╚╝╩╚═╝╩ ╩ ╩ ╩╚═╚═╝╚═╝╚═╝╚═╝╚═╝ #
  121. #############################################
  122. @http.route('/eiru_sales/finish', type='json', auth='user', methods=['POST'], cors='*')
  123. def _finish(self, **kw):
  124. self.make_info_log('Finishing...')
  125. # Imports
  126. from server_datetime import get_date, get_datetime
  127. # Parameters
  128. date_now = get_date()
  129. mode = kw.get('mode', 'sale')
  130. journal_id = kw.get('journalId', None)
  131. customer_id = kw.get('customerId', None)
  132. cart_items = kw.get('items', [])
  133. payment_term_id = kw.get('paymentTermId', None)
  134. payment = float(kw.get('payment'))
  135. payment_method = kw.get('paymentMethod', 'Efectivo')
  136. bank_payment_data = kw.get('bankPaymentData', {})
  137. '''
  138. ╔═╗╦╔╗╔╦╔═╗╦ ╦ ╔╗ ╦ ╦╔╦╗╔═╗╔═╗╔╦╗ ╔═╗╔═╗╔═╗ ╔═╗╦═╗╔═╗╔═╗╔═╗╔╦╗╦ ╦╦═╗╔═╗
  139. ╠╣ ║║║║║╚═╗╠═╣ ╠╩╗║ ║ ║║║ ╦║╣ ║ ╠═╝║ ║╚═╗ ╠═╝╠╦╝║ ║║ ║╣ ║║║ ║╠╦╝║╣
  140. ╚ ╩╝╚╝╩╚═╝╩ ╩ ╚═╝╚═╝═╩╝╚═╝╚═╝ ╩ ╩ ╚═╝╚═╝ ╩ ╩╚═╚═╝╚═╝╚═╝═╩╝╚═╝╩╚═╚═╝
  141. '''
  142. def finish_budget_pos(journal_id, customer_id, cart_items, date_now, payment_term_id):
  143. # Imports
  144. from account_journal import get_currency
  145. from sale_order import create_sale_from_cart
  146. # Get currency
  147. currency_id = get_currency(journal_id)
  148. self.make_info_log('[OK] Getting journal')
  149. # Create sale order
  150. sale_order = create_sale_from_cart(customer_id, cart_items, date_now, currency_id, payment_term_id)
  151. self.make_info_log('[OK] Creating sale order')
  152. return (sale_order.id, currency_id)
  153. '''
  154. ╔═╗╦╔╗╔╦╔═╗╦ ╦ ╔═╗╔═╗╦ ╔═╗ ╔═╗╔═╗╔═╗ ╔═╗╦═╗╔═╗╔═╗╔═╗╔╦╗╦ ╦╦═╗╔═╗
  155. ╠╣ ║║║║║╚═╗╠═╣ ╚═╗╠═╣║ ║╣ ╠═╝║ ║╚═╗ ╠═╝╠╦╝║ ║║ ║╣ ║║║ ║╠╦╝║╣
  156. ╚ ╩╝╚╝╩╚═╝╩ ╩ ╚═╝╩ ╩╩═╝╚═╝ ╩ ╚═╝╚═╝ ╩ ╩╚═╚═╝╚═╝╚═╝═╩╝╚═╝╩╚═╚═╝
  157. '''
  158. def finish_sale_pos(journal_id, customer_id, cart_items, date_now, payment_term_id, payment, payment_method, bank_payment_data):
  159. # Create budget
  160. sale_order_id, currency_id = finish_budget_pos(journal_id, customer_id, cart_items, date_now, payment_term_id)
  161. # Imports
  162. from sale_order import confirm_sale_order
  163. from account_invoice import (
  164. create_invoice,
  165. create_invoice_move_lines,
  166. number_invoice,
  167. close_invoice
  168. )
  169. from account_move import create_account_move
  170. from account_voucher import create_account_voucher
  171. from account_bank_statement import create_bank_statement
  172. from res_bank_payment import create_bank_payment_statement
  173. # Confirm sale
  174. confirm_sale_order(sale_order_id)
  175. self.make_info_log('[OK] Confirm sale order')
  176. # Create invoice
  177. invoice = create_invoice(sale_order_id, currency_id, date_now)
  178. self.make_info_log('[OK] Creating invoice')
  179. # Create invoice move lines
  180. invoice_move_lines = create_invoice_move_lines(invoice.id, payment, date_now)
  181. self.make_info_log('[OK] Creating invoice move lines')
  182. # Create account move
  183. account_move = create_account_move(invoice.id, invoice_move_lines)
  184. self.make_info_log('[OK] Creating account move')
  185. # Number invoice
  186. number_invoice(invoice.id)
  187. self.make_info_log('[OK] Number invoice')
  188. # Create account voucher
  189. account_voucher = create_account_voucher(account_move.id, journal_id, currency_id, payment)
  190. self.make_info_log('[OK] Creating account voucher')
  191. # Close invoice
  192. close_invoice(invoice.id)
  193. self.make_info_log('[OK] Closing invoice')
  194. # Create bank statement
  195. create_bank_statement(account_voucher.id, date_now)
  196. self.make_info_log('[OK] Creating account bank statement')
  197. # Create bank payment statement
  198. if payment_method == 'Banco':
  199. create_bank_payment_statement(bank_payment_data, invoice.id, account_voucher.id)
  200. self.make_info_log('[OK] Creating bank payment statement')
  201. '''
  202. ╔═╗╦╔╗╔╦╔═╗╦ ╦ ╔═╗╦═╗╔═╗╔╦╗╦ ╦╔═╗╔╦╗ ╔═╗╦╔═╗╦╔═╦╔╗╔╔═╗
  203. ╠╣ ║║║║║╚═╗╠═╣ ╠═╝╠╦╝║ ║ ║║║ ║║ ║ ╠═╝║║ ╠╩╗║║║║║ ╦
  204. ╚ ╩╝╚╝╩╚═╝╩ ╩ ╩ ╩╚═╚═╝═╩╝╚═╝╚═╝ ╩ ╩ ╩╚═╝╩ ╩╩╝╚╝╚═╝
  205. '''
  206. def finish_process_picking(journal_id, customer_id, cart_items, date_now, payment_term_id):
  207. sale_order_id, _ = finish_budget_pos(journal_id, customer_id, cart_items, date_now, payment_term_id)
  208. # Imports
  209. from sale_order import confirm_sale_order, force_assign_picking
  210. # Confirm sale
  211. confirm_sale_order(sale_order_id)
  212. self.make_info_log('[OK] Confirm sale order')
  213. # Force assign picking
  214. force_assign_picking(sale_order_id)
  215. self.make_info_log('[OK] Pick assign')
  216. '''
  217. ╔═╗╦╔╗╔╦╔═╗╦ ╦ ╔═╗╔═╗╦ ╦╔╦╗╔═╗╔╗╔╔╦╗
  218. ╠╣ ║║║║║╚═╗╠═╣ ╠═╝╠═╣╚╦╝║║║║╣ ║║║ ║
  219. ╚ ╩╝╚╝╩╚═╝╩ ╩ ╩ ╩ ╩ ╩ ╩ ╩╚═╝╝╚╝ ╩
  220. '''
  221. def finish_payment():
  222. pass
  223. '''
  224. ╔═╗╦╔╗╔╦╔═╗╦ ╦ ╔═╗╦═╗╔═╗╔╦╗╦ ╦╔═╗╔╦╗ ╔╦╗╔═╗╦ ╦╦ ╦╔═╗╦═╗╦ ╦
  225. ╠╣ ║║║║║╚═╗╠═╣ ╠═╝╠╦╝║ ║ ║║║ ║║ ║ ║║║╣ ║ ║╚╗╔╝║╣ ╠╦╝╚╦╝
  226. ╚ ╩╝╚╝╩╚═╝╩ ╩ ╩ ╩╚═╚═╝═╩╝╚═╝╚═╝ ╩ ═╩╝╚═╝╩═╝╩ ╚╝ ╚═╝╩╚═ ╩
  227. '''
  228. def finish_product_delivery():
  229. pass
  230. '''
  231. ╔═╗╦═╗╔═╗╔═╗╔═╗╔═╗╔═╗ ╔═╗╦╔╗╔╦╔═╗╦ ╦ ╔╦╗╔═╗╔═╗╦╔═╗╦╔═╗╔╗╔
  232. ╠═╝╠╦╝║ ║║ ║╣ ╚═╗╚═╗ ╠╣ ║║║║║╚═╗╠═╣ ║║║╣ ║ ║╚═╗║║ ║║║║
  233. ╩ ╩╚═╚═╝╚═╝╚═╝╚═╝╚═╝ ╚ ╩╝╚╝╩╚═╝╩ ╩ ═╩╝╚═╝╚═╝╩╚═╝╩╚═╝╝╚╝
  234. '''
  235. if mode == 'budget':
  236. finish_budget_pos(journal_id, customer_id, cart_items, date_now, currency_id, payment_term_id)
  237. if mode == 'sale':
  238. finish_sale_pos(journal_id, customer_id, cart_items, date_now, payment_term_id, payment, payment_method, bank_payment_data)
  239. if mode == 'product_picking':
  240. finish_process_picking(journal_id, customer_id, cart_items, date_now, payment_term_id)
  241. if mode == 'payment':
  242. finish_payment()
  243. if mode == 'product_delivery':
  244. finish_product_delivery()
  245. return {
  246. 'process': True,
  247. 'date': get_datetime()
  248. }