Skip to Content
Menu
Musisz się zarejestrować, aby móc wchodzić w interakcje z tą społecznością.
To pytanie dostało ostrzeżenie

Hi, Everyone

     i have been able to create a custom in sale order line there are two field 1.totalweight and priceperunit i use a help of @api.onchange so when ever the value that it depends on it will change automatically. below is my .py code

class customSaleField(models.Model):
 _inherit = 'sale.order.line'

 TotalWeight = fields.Float(string='Total Weight',readonly=True,store=True)
 PricePerUnit = fields.Float(string='Price Per Unit',readonly=True,store=True)

@api.onchange('product_uom_qty')
 def on_change_weight(self):
  weight = self.product_uom_qty * self.product_id.weight
  value = {
   'value' : {
    'TotalWeight' : weight
   }
  }
  return value
  
 @api.onchange('price_subtotal','TotalWeight')
 def on_change_PricePerUnit(self):

  try:
   PricePerUnit = self.price_subtotal / self.TotalWeight
  except ZeroDivisionError:
   PricePerUnit = 0
   
  value = {
   'value' : {
    'PricePerUnit' : PricePerUnit
   }
  }
  return value

however,when i press "confirm sale" or "save" or perform any action the value in custom fields are disappear

Secondly, how do i actually pass these values,field to account ?? after the user press click on "create invoice"


Awatar
Odrzuć
Najlepsza odpowiedź

Hello Vootipong Limpanitivat,


Try to remove readonly attribute from field.

May be because of readonly attribute, method is not affected. I faced many time in the past.


@api.onchange('product_uom_qty')
def on_change_weight(self):
    if self.product_uom_qty:
        self.TotalWeight = self.product_uom_qty * self.product_id.weight

@api.onchange('price_subtotal','TotalWeight')
def on_change_PricePerUnit(self):
    if self.price_subtotal:
        self.PricePerUnit = self.price_subtotal / self.TotalWeight


For Passing values to account, refer this method under sale module which is def create_invoices


Hope it will helps you.

Thanks,

Awatar
Odrzuć
Autor

Sir, it works !! it really works !

So i have to inherited and override those function ?

Yes. For passing values you need to override those function called as def create_invoices. If any sale order line id passes in the invoice line then you will pass it easily. Check that method and override it.

Autor

hi , i have found the answer relate to this here is the link

https://www.odoo.com/forum/help-1/question/how-to-transfer-data-from-sale-order-to-invoice-when-clicking-on-create-invoice-85740

the answer were posted by Peter Alabaster

so i manage to change to odoo 10

the out come are like this

def _prepare_invoice(self):

res = super(customSaleField,self)._prepare_invoice(self)

if line.product_id:

if line.TotalWeight:

res['TotalWeight'] = line.TotalWeight

if line.PricePerUnit

res['PricePerUnit'] = line.PricePerUnit

return res

??

Autor

i dont know am on the right way or not please she some light please

Najlepsza odpowiedź

Hi,

I think store is used to store computed field to db.

If you need to save it from an onchange function try writing it from onchange

example

self.weight = self.product_uom_qty * self.product_id.weight


Awatar
Odrzuć
Autor

still not working

@api.onchange('product_uom_qty')

def on_change_weight(self):

self.TotalWeight = self.product_uom_qty * self.product_id.weight

weight= self.product_uom_qty * self.product_id.weight

value = {

'value' : {

'TotalWeight' : weight

}

}

return value

@api.onchange('price_subtotal','TotalWeight')

def on_change_PricePerUnit(self):

try:

self.PricePerUnit = self.price_subtotal / self.TotalWeight

PPU = self.price_subtotal / self.TotalWeight

except ZeroDivisionError:

self.PricePerUnit = 0

PPU = 0

value = {

'value' : {

'PricePerUnit' : PPU

}

}

return value

Powiązane posty Odpowiedzi Widoki Czynność
3
wrz 24
12509
2
wrz 18
5900
1
kwi 18
3368
0
sty 18
4031
0
wrz 17
3210