Pokazywanie aktualnej lokalizacji produktu w widoku "STOCK.MOVE" [Zamknięte]

To pytanie zostało zamknięte z powodu: niezwiązane z tematem lub nieaktualne

przez
Dr.One
na 22.09.2015 08:30:26

Trochę 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.

Dr.One
Dr.One
341
| 5 3 5
Data pytania 05.03.2015, 21:32
0
głos
1509 Odsłony

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?

Janusz Stefaniak
na 05.03.2015, 21:47

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.

Dariusz Żbikowski
na 26.05.2015, 08:52

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.

Dariusz Żbikowski
na 15.07.2015, 13:17

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.qty

    qty = 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','&lt;&gt;','view')]" context="{'default_product_id': product_id}"/>
              </field>
            </field>          
        </record>

 

Dariusz Żbikowski
Dariusz Żbikowski
1263
| 4 3 3
Data odpowiedzi 06.03.2015, 22:27
0
głos

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.

Dariusz Żbikowski
na 26.05.2015, 08:45

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?

Dariusz Żbikowski
na 26.05.2015, 20:47

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.

Dariusz Żbikowski
na 28.05.2015, 13:15

Nieco wyżej napisałem co trzeba wtedy ewentualnie zrobić, o ile się uda.

Dariusz Żbikowski
na 15.07.2015, 13:12

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ł...

Dariusz Żbikowski
na 15.07.2015, 13:49

...

Dr.One
Dr.One
341
| 5 3 5
Data odpowiedzi 07.03.2015, 13:53
0
głos

Dodałem linię importu. Raczej zbuduj z tego oddzielny moduł. Jśli używasz starego api to zwykle będzie w konflikcie z nowym.

Dariusz Żbikowski
na 07.03.2015, 15:21

Twoja odpowiedź

Spróbuj dać znacząca odpowiedź. Jeśli chcesz wypowiedzieć się na temat pytania lub odpowiedzi, po prostu użyj narzędzia komentowania. Proszę pamiętać, że zawsze można zrewidować swoją odpowiedź - nie ma potrzeby odpowiadać na to samo pytanie dwa razy. Także prosimy, nie zapomnij zagłosować - to naprawdę pomaga wybrać najlepsze pytania i odpowiedzi!

Zadaj Pytanie

Bądź na bieżąco

O tym forum

Forum dla profesjonalistów i entuzjastów systemu Odoo. Dyskusje, porady, opinie, komentarze.

Przeczytaj wytyczne

Narzędzia do pytań

3 obserwujący

Statystyki

Spytał/a: 05.03.2015, 21:32
Oglądano: 1509 razy
Ostatnia aktualizacja: 22.09.2015, 08:30