search_barcode_purchase.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. # -*- coding: utf-8 -*-
  2. from openerp import models, fields, api, _
  3. from openerp.exceptions import Warning as UserError
  4. class SearchBarcodePurchase(models.TransientModel):
  5. _name = 'search.barcode.purchase'
  6. _description = 'Buscar Producto por Codigo de Barra en Compras'
  7. line_ids = fields.One2many(
  8. 'search.barcode.purchase.line', 'wiz_id', string='Escaneos')
  9. product_code = fields.Char(
  10. string='Codigo de Barra EAN13',
  11. help="Escanee el código de barras aquí"
  12. )
  13. @api.onchange('product_code')
  14. def _onchange_product_code(self):
  15. if not self.product_code:
  16. return
  17. products = self.env['product.product'].search([
  18. ('factory_barcode', '=ilike', self.product_code)
  19. ])
  20. if len(products) == 1:
  21. prod = products[0]
  22. existing = self.line_ids.filtered(lambda l: l.product_id.id == prod.id)
  23. if existing:
  24. existing.qty += 1
  25. else:
  26. self.line_ids += self.line_ids.new({
  27. 'product_id': prod.id,
  28. 'qty': 1.0,
  29. })
  30. self.product_code = None
  31. elif len(products) > 1:
  32. desc = u"\n\nProductos con el código repetido: %s" % self.product_code
  33. for p in products:
  34. desc += u"\n%s" % p.product_tmpl_id.name
  35. self.product_code = None
  36. return {'warning': {
  37. 'title': _('Error'),
  38. 'message': _(u'Varios productos se han encontrado con el código ingresado.\n'
  39. u'Debe seleccionar el producto manualmente.') + desc}}
  40. else:
  41. self.product_code = None
  42. return {'warning': {
  43. 'title': _('Error'),
  44. 'message': _(u'Ningún producto encontrado con el código ingresado.\n'
  45. u'Debe seleccionar el producto manualmente.')}}
  46. @api.multi
  47. def add_multiple(self):
  48. self.ensure_one()
  49. purchase = self.env['purchase.order'].browse(self._context.get('active_id'))
  50. if not purchase:
  51. raise UserError(_('No se encontró la orden de compra activa.'))
  52. for line in self.line_ids:
  53. product = line.product_id
  54. existing = self.env['purchase.order.line'].search([
  55. ('order_id', '=', purchase.id),
  56. ('product_id', '=', product.id),
  57. ], limit=1)
  58. onchange_vals = self.env['purchase.order.line'].product_id_change(
  59. False, # en compras no siempre hay pricelist_id
  60. product.id,
  61. qty=line.qty,
  62. uom_id=product.uom_po_id.id,
  63. partner_id=purchase.partner_id.id,
  64. )
  65. if existing:
  66. existing.write({
  67. 'product_qty': existing.product_qty + line.qty
  68. })
  69. else:
  70. vals = {
  71. 'name': onchange_vals['value'].get('name'),
  72. 'order_id': purchase.id,
  73. 'product_id': product.id,
  74. 'product_uom': product.uom_po_id.id,
  75. 'product_qty': line.qty,
  76. 'date_planned': onchange_vals['value'].get('date_planned'),
  77. 'price_unit': onchange_vals['value'].get('price_unit'),
  78. 'taxes_id': [(6, 0, onchange_vals['value'].get('taxes_id') or [])],
  79. }
  80. self.env['purchase.order.line'].create(vals)
  81. return {'type': 'ir.actions.act_window_close'}
  82. class SearchBarcodePurchaseLine(models.TransientModel):
  83. _name = 'search.barcode.purchase.line'
  84. _description = 'Líneas del wizard de lectura de EAN'
  85. wiz_id = fields.Many2one(
  86. 'search.barcode.purchase', ondelete='cascade')
  87. product_id = fields.Many2one(
  88. 'product.product', string='Producto',
  89. domain=[('purchase_ok', '=', True)], required=True)
  90. qty = fields.Float('Cantidad', default=1.0, required=True)
  91. # from openerp import models, fields, api, _
  92. # from openerp.exceptions import Warning as UserError
  93. #
  94. # class Search_Barcode_Purchase(models.TransientModel):
  95. # _name = 'search.barcode.purchase'
  96. # _description = 'Buscar Producto por Codigo de Barra en Compras'
  97. #
  98. # quantity = fields.Float('Quantity', default='1.0')
  99. # products_ids = fields.Many2many( 'product.product',
  100. # string='Products',
  101. # domain=[('sale_ok', '=', True)], )
  102. # product_code = fields.Char( string='Codigo de Barra EAN13 ',
  103. # help="Este campo está diseñado para ser llenado con un lector de código de barras")
  104. #
  105. # @api.onchange('product_code')
  106. # def product_code_change(self):
  107. # if self.product_code:
  108. # products = self.env['product.product'].search([('factory_barcode', '=ilike', self.product_code)])
  109. #
  110. # if len(products) == 1:
  111. # self.products_ids += products[0]
  112. # self.product_code =None
  113. #
  114. # elif len(products) > 1:
  115. # descrpcion="\n\nProductos con el codigo repetido : "+str(self.product_code)
  116. # for xx in products:
  117. # descrpcion +="\n"+str(xx.product_tmpl_id.name)
  118. # self.product_code =None
  119. # return {'warning': {
  120. # 'title': _('Error'),
  121. # 'message': _(
  122. # 'Varios productos se han encontrado con el código ingresado,'
  123. # '\nDebe seleccionar el producto manualmente.'+descrpcion)}}
  124. # else:
  125. # self.product_code =None
  126. # return {'warning': {
  127. # 'title': _('Error'),
  128. # 'message': _(
  129. # 'Ningún producto encontrado con el código ingresado, Debe seleccionar el producto manualmente')}}
  130. #
  131. # @api.one
  132. # def add_multiple(self):
  133. # active_id = self._context['active_id']
  134. # purchase = self.env['purchase.order'].browse(active_id)
  135. #
  136. # # x=0
  137. # # if purchase.order_line:
  138. # # seq =purchase.order_line[len(purchase.order_line) - 1]
  139. # # x=seq.sequence
  140. #
  141. # for product_id in self.products_ids:
  142. # xxproducts = self.env['product.product'].search([('id', '=', product_id.id)])
  143. # orde_line_datos = self.env['purchase.order.line'].search([('order_id', '=', purchase.id), ('product_id', "=", xxproducts.id)])
  144. # # x += 1
  145. # product = self.env['purchase.order.line'].product_id_change(
  146. # purchase.pricelist_id.id,
  147. # product_id.id,
  148. # qty=self.quantity,
  149. # uom_id=product_id.uom_po_id.id,
  150. # partner_id=purchase.partner_id.id,
  151. # )
  152. # if orde_line_datos:
  153. # orde_line_datos.write({ 'product_qty' : (orde_line_datos.product_qty + 1)})
  154. # else:
  155. # val = {
  156. # 'name': product['value'].get('name'),
  157. # 'product_uom_qty': self.quantity,
  158. # 'order_id': active_id,
  159. # 'product_id': product_id.id or False,
  160. # 'product_uom': product_id.uom_po_id.id,
  161. # 'date_planned': product['value'].get('date_planned'),
  162. # 'price_unit': product['value'].get('price_unit'),
  163. # 'taxes_id': [(6, 0, product['value'].get('taxes_id'))],
  164. # # 'sequence': x,
  165. # }
  166. # self.env['purchase.order.line'].create(val)
  167. # if orde_line_datos:
  168. # orde_line_datos.write({
  169. # 'product_qty': orde_line_datos.product_qty + (self.quantity or 1.0)
  170. # })
  171. # else:
  172. # val = {
  173. # 'name': product['value'].get('name'),
  174. # 'product_qty': self.quantity or 1.0, # <-- antes: product_uom_qty
  175. # 'order_id': active_id,
  176. # 'product_id': product_id.id or False,
  177. # 'product_uom': product_id.uom_po_id.id,
  178. # 'date_planned': product['value'].get('date_planned'),
  179. # 'price_unit': product['value'].get('price_unit'),
  180. # 'taxes_id': [(6, 0, product['value'].get('taxes_id'))],
  181. # }
  182. # self.env['purchase.order.line'].create(val)