Witamy!
Forum dla profesjonalistów i entuzjastów systemu Odoo. Dyskusje, porady, opinie, komentarze.
Pokazywanie aktualnej lokalizacji produktu w widoku "STOCK.MOVE" [Zamknięte]
- Pytanie został zamknięty z powodu: niezwiązane z tematem lub nieaktualne
przezTrochę kombinowałem i wykombinowałem:
class stock_location(osv.osv):
_name = 'stock.move'
def onchange_new_product_id(self,cr,uid,ids,new_product_id,context=None):
res = {}
location_list = []
quant_obj = self.pool.get('stock.quant')
quant_ids = quant_obj.search(cr,uid, [('product_id','=',new_product_id)])
for quant_data in quant_obj.browse(cr, uid, quant_ids, context=context):
location_list.append(quant_data.location_id.id)
return {'domain':{'my_location_id':[('id','in',location_list)]}}
_columns = {
'new_product_id' : fields.many2one('product.product', string="My Product"),
'my_location_id' : fields.many2one('stock.location', string="My Location"),
}
Oczywiście w tej formie robi niewiele. Pokazuje jednak po wybraniu produktu wszystkie lokalizacje w których znajduje się wybrany produkt i o to w zasadzie chodziło. Na bazie tego przykładu zbudowałem nowy moduł działający ze "stock.move".
Odczytuje z bazy lokalizacje w których znajduje się wybrany produkt i umieszcza je na liście lokalizacji źródłowych wraz z aktualnym stanem w każdej z lokalizacji. Ułatwiając manualne dokonywanie przesunięć magazynierowi i zabezpiecza przed przesunięciem większej ilości produktu niż znajdująca się w wybranej lokalizacji.
W moim przypadku rozwiązanie idealne. Magazynier aby zachować porządek musi bowiem często przenosić produkty z jednego miejsca w drugie, pozostali użytkownicy muszą natomiast natychmiast wiedzieć gdzie dany produkt się znajduje gdy go potrzebują.
Dodatkowo umieszczę także informację o lokalizacji na liście produktów "product.template.view.tree" dla ułatwienia.
Problematyka wyciagania ilości produktów w dowolnym mniejscu jest raczej złożona. To zwykle sa pola funkcyjne generowane on-line i ciężko do nich robić powiązania z innych klas. Rozumiem, że się nieco uparłeś i usiłujesz zrobic coś dokładnie tak, jak ty to widzisz ale nie zawsze to chyba idzie w zgodzie z filozofią konstrukcji Odoo. Przede wszystkim nie rozumiem, dlaczego zakładasz, że przesunięcia opracowuje głównie magazynier, moim zdaniem sam system winien raczej generować je na żądanie, o ile oczywiście podefiniowane są stosowne reguły.
Można, jak najbardziej, temu służą reguły typu Pull i rguly uzupełniania zapasów. Jednak nie jest to chyba to czego oczekujesz, z takimi regulami system przygotuje przesunięcie do miejsca gdzie czegoś brakuje ale nie zacznie automatycznie pobierac z innego miejsca.
Proponuję takie rozwiązanie, powinno zadziałać:
from openerp import models, fields, api, _
class stock_location(models.Model):
_inherit = 'stock.location'
@api.one
@api.depends()
def _get_current_stock(self):
self.qty = 0.0
if 'default_product_id' in self._context:
quants = self.env['stock.quant'].search([('location_id','=',self.id),('product_id','=?',self._context['default_product_id'])])
else:
quants = self.env['stock.quant'].search([('location_id','=',self.id)])
for quant in quants:
self.qty += quant.qtyqty = fields.Float(compute='_get_current_stock', string='Qty')
@api.multi
def name_get(self):
result = []
for loc in self:
result.append((loc.id, loc.name + " - Qty: " + str(loc.qty) or ''))
return result
<record id="view_move_picking_form_qty" model="ir.ui.view">
<field name="name">stock.move.form</field>
<field name="model">stock.move</field>
<field eval="20" name="priority"/>
<field name="inherit_id" ref="stock.view_move_picking_form"/>
<field name="arch" type="xml">
<field name="location_id" position="replace">
<field name="location_id" domain="[('usage','<>','view')]" context="{'default_product_id': product_id}"/>
</field>
</field>
</record>
Definicja klasy stock.location znajduje się w module stock, plik stock.py. Zauważ tylko, że lokalizacje w zasadzie nie są prawie wcale powiązane z magazynami. Odniesienia są jednostronne, tzn. lokalizacja niezbyt wie w jakim jest magazynie.
Jako komentarz napiszę tyle - jak sobie chcesz poradzić z lokalizacjami partnerów i wirtualnymi, np. tranzytów, produkcji, odpadów, kontroli jakości etc, które zwykle nie są przypisane do żadnego magazynu?
Takie rozwiązanie moim zdaniem ma większe szanse sukcesu o ile w modelu lokalizacji dodasz powiązanie do kwantów, w widoku move wyfiltrujesz lokalizacje po tym powiązaniu i uda się odpowiednio odświeżyć lokalizacje w tym widoku po wymianie produktu.
Nieco wyżej napisałem co trzeba wtedy ewentualnie zrobić, o ile się uda.
Niestety powyższy kod się nie nadaje. Konstrukcja nowego wymaga zaś sporo pracy i nieco eksperymentów, tym samym dużo więcej czasu, którego mi obecnie mocno brakuje. Jeśli kiedyś będę się nudził...
...
Dodałem linię importu. Raczej zbuduj z tego oddzielny moduł. Jśli używasz starego api to zwykle będzie w konflikcie z nowym.
Bądź na bieżąco
O tym forum
Narzędzia do pytań
Statystyki
Spytał/a: 05.03.2015, 21:32 |
Oglądano: 2362 razy |
Ostatnia aktualizacja: 30.07.2015, 21:50 |
Odradzam, to nie ma sensu. Jaki ma związek stock.move - czyli przesunięcie towarów, które np. odbyło się kiedyś z bieżącym stanem magazynu, czy też z obecną iloścą towaru w danej lokalizacji?