Introduktion
I Odoo beskriver en modell hur information sparas i databasen. Alla affärshändelser — från offerter och fakturor till plock och leveranser — representeras av modellposter som organiserar fälten och relationerna för den aktuella processen.
Att förstå modellerna är lika viktigt för konsulter som för utvecklare. Modellerna bildar grunden i Odoos datalager: de bestämmer vilka fält som finns, hur poster hänger ihop och var affärslogiken ska köras.
Den här artikeln går igenom en av de mest centrala modellerna i lagerhanteringen: stock.move. Om du bygger egna lagerfunktioner, kopplar upp externa system eller finjusterar lagerflöden är det här en modell du kommer träffa ofta.
Vad är modellen stock.move
stock.move beskriver en enskild lagertransaktion — en bestämd förflyttning av en produkt mellan två platser. Varje gång en artikel lämnar en hylla, flyttas mellan lager eller skickas till kund skapas en sådan post.
Modellen används av lager‑modulen och skapas av flera andra processer. Sälj-, inköps-, tillverknings- och webbförsäljningsflöden genererar stock.move‑poster när de initierar lageroperationer. Bekräftelser av leveranser, mottagningar och produktionsavslut resulterar i skapande eller uppdatering av dessa poster.
stock.move definieras i stock‑modulen men andra moduler bygger på den via model inheritance. Säljmodulen länkar till sale_line_id, inköp till purchase_line_id och tillverkning till production_id — varje modul lägger bara till det som behövs utan att duplicera grundstrukturen.
Viktiga fält i modellen
Nedan följer de viktigaste fälten i stock.move och varför de spelar roll. Kännedom om dem gör dig effektivare när du konfigurerar eller utvecklar lagerlogik.
1. name
Typ: Char. Fältet håller en beskrivning eller etikett för rörelsen. Ofta byggs det upp av produktnamn och kvantitet och visas i listor och dokument för att lätt identifiera posten.
2. product_id
Typ: Many2one (product.product). Referensen till den produkt som flyttas. Obligatoriskt — utan produkt går det inte att spåra kvantiteter eller tillämpa lagersregler.
3. product_uom
Typ: Many2one (uom.uom). Mätenheten för den kvantitet som anges. Viktigt för konverteringar och validering så att alla kvantiteter hanteras konsekvent.
4. product_uom_qty
Typ: Float. Den planerade mängden att flytta i vald mätenhet. Detta är efterfrågan; när operationen genomförs uppdateras quantity_done med det verkliga värdet.
5. quantity
Typ: Float. Ett visnings- eller beräknat fält som visar kvantitet, ibland konverterat eller presenterat mer användarvänligt i vyer.
6. location_id
Typ: Many2one (stock.location). Källplatsen — varifrån artikeln flyttas. Obligatoriskt och viktigt för att stocknivåer ska uppdateras korrekt beroende på operationstyp.
7. location_dest_id
Typ: Many2one (stock.location). Mottagarplatsen — dit artikeln ska. Också obligatoriskt och bestämmer hur lagret påverkas av rörelsen.
8. picking_id
Typ: Many2one (stock.picking). Den övergripande plock-/transfer‑dokumentationen som grupperar flera moves (t.ex. en leveransorder). Ger användaren ett enkelt sätt att hantera hela överföringen.
9. picking_type_id
Typ: Many2one (stock.picking.type). Definierar typ av operation — utgående, inkommande eller intern — och styr standard‑platser och arbetsflödet för flytten.
10. state
Typ: Selection. Visar läget i flödet: draft, waiting, confirmed, assigned, done, cancelled. T.ex. betyder assigned att varan är reserverad, done att flytten är klar.
11. date
Typ: Datetime. Schemalagd tid för rörelsen. Används i planering och prioritering av lageroperationer.
12. date_deadline
Typ: Datetime. Sista datum för att leverera rörelsen. Används för att bedöma brådska, särskilt mot kundlöften.
13. origin
Typ: Char. Referens till ursprungsdokumentet (t.ex. ordernummer). Viktigt för spårbarhet mellan dokument och lagerhändelser.
14. move_dest_id
Typ: Many2one (stock.move). Länkar till en efterföljande move i en kedja. Används när en rörelse matar vidare till nästa (t.ex. produktionsutgång som blir leverans).
15. move_orig_ids
Typ: One2many (stock.move). Motsatsen till move_dest_id — listar föregående moves som leder in i denna. Viktigt för historik och spårning.
16. move_line_ids
Typ: One2many (stock.move.line). Detaljerade rader (batch, serienummer, specifik plats). När man reserverar eller plockar skapas dessa för att ange exakt vad som hanterats.
17. partner_id
Typ: Many2one (res.partner). Den affärspartner som är kopplad till rörelsen — kund vid leverans, leverantör vid mottagning — används för adress och rapporter.
18. company_id
Typ: Many2one (res.company). Anger vilket bolag i ett multi‑company‑scenario posten tillhör och påverkar synlighet och intercompany‑regler.
19. quantity_done
Typ: Float. Den faktiska mängd som har hanterats. När användaren plockat eller mottagit fylls detta i; move blir färdig när quantity_done matchar product_uom_qty.
20. reserved_availability
Typ: Float. Visar hur mycket som reserverats för denna rörelse — det som är allokerat och därmed längre inte fritt i lagret.
21. create_date
Typ: Datetime. Tidpunkt då posten skapades. Automatgenererat och nyttigt för revison och rapportering.
22. write_date
Typ: Datetime. Tidpunkt för senast ändring. Hjälper att se när data uppdaterades senast.
23. sequence
Typ: Integer. Bestämmer visningsordningen inom en picking. Lägre värde visas först för användaren.
24. priority
Typ: Selection. Prioritetsnivå för operationen — exempelvis normal eller brådskande — vilket kan påverka planering och plockordning.
25. description_picking
Typ: Char. Notering som visas på plockdokumentet för särskilda instruktioner eller hanteringsanvisningar.
26. reference
Typ: Char. Intern referens eller kod, ofta använd för integrationer eller egen spårning.
27. group_id
Typ: Many2one (procurement.group). Samlar moves som hör till samma inköps-/uppföljningsgrupp, t.ex. flera rader från samma försäljningsorder.
28. procure_method
Typ: Selection. Styr om artikeln tas från lager (make_to_stock) eller triggar inköp/tillverkning (make_to_order).
29. sale_line_id
Typ: Many2one (sale.order.line). Länk som säljmodulen lägger till för att koppla rörelsen till den försäljningsrad som initierade den.
30. purchase_line_id
Typ: Many2one (purchase.order.line). Länk som inköpsmodulen lägger till vid mottagningar för att koppla tillbaka till inköpsraden.
31. production_id
Typ: Many2one (mrp.production). Länkad av tillverkningen för att knyta moves till en produktionsorder.
32. active
Typ: Boolean. Arkiveringsflagga — når False göms posten från standardvyer istället för att tas bort fysiskt.
Hur modellen används i affärsflöden
1. Kundleverans
När en försäljningsorder bekräftas skapas en stock.move för varje produktrad. Källa är lagerplatsen och destination kunden. Moves grupperas i ett plock (leveransorder). När plocket genomförs uppdateras quantity_done och posten sätts till done.
2. Leverantörsmottagning
Vid bekräftad inköpsorder skapas inkommande moves där källplats ofta är leverantörsplatsen och destination lagret. Moves samlas i en mottagningsorder. När varorna anländer validerar man och fyller i quantity_done.
3. Interna överföringar
Flyttar mellan lager eller avdelningar skapar moves med rätt källa och mål. Dessa används för omlagring, påfyllning och hantering i miljöer med flera lagerlokationer.
4. Tillverkning
Tillverkningsorder genererar moves både för insatsmaterial (lagret → produktion) och färdiga varor (produktion → lager). production_id binder moves till produktionsordern och kedjor via move_dest_id kan koppla produktionens output till efterföljande leveranser.
5. Returer och skrot
Kundreturer blir omvända moves och skrotning flyttar artiklar till särskild skrotplats. Samma stock.move‑struktur hanterar alla varianter; picking_type_id avgör hur workflowet beter sig.
Hur utvecklare utökar modellen
Utvecklare bygger på stock.move med flera tillvägagångssätt där Odoos arvssystem är kärnan.
Model inheritance
I din modul använder du _inherit = 'stock.move' för att lägga till fält, ändra beteenden eller skapa constraints. Det håller anpassningarna separata och underlättar uppgraderingar.
Lägga till fält
Definiera nya Odoo‑fält i din ärvda modell med rätt typ (Char, Many2one, Boolean, Integer, Text, Selection). Tänk på company‑beroende fält i multi‑company. Vanliga tillägg är spårningsnummer, fraktreferenser eller egna batchattribut.
Python‑utvidgningar
Skriv över metoder som _action_done, _action_assign eller _action_cancel och använd super() för att bevara grundbeteendet. Var försiktig så att du inte stör lageruppdateringar eller kedjning av moves.
Odoo Studio
Odoo Studio låter dig lägga till fält utan kod — bra för snabba anpassningar. För komplex logik eller stora arbetsflödesförändringar är egen modul oftast mer hållbart.
Rekommenderade rutiner
- Se alltid till att location_id och location_dest_id är korrekta — felaktiga platser ger felaktiga lagersaldon.
- Gruppera relaterade moves med picking_id. Om en rörelse tillhör en transfer, skapa den som del av ett picking för att bevara reservationer och användarflöde.
- När du bygger integrationer använd XML‑RPC eller JSON‑RPC och mappa externa id:n noggrant — stock.move är fullt åtkomlig via API:et.
- För egna fält använd x_‑prefix eller modulprefix för att undvika namnkonflikter vid framtida Odoo‑uppgraderingar.
- Använd move_dest_id och move_orig_ids för spårbarhet. Vid programmatisk skapelse av kedjade moves, sätt dessa relationer korrekt.
- Tänk på skillnaden mellan quantity_done och product_uom_qty vid validering — delleveranser förekommer och måste hanteras rätt.
Vanliga misstag
- Skapa moves med felaktiga platstyper. Källa och mål måste vara kompatibla (t.ex. båda får inte vara kundplatser).
- Ändra product_uom_qty efter att move lines redan finns kan leda till inkonsekvent lager. Bättre att avbryta och återskapa moven.
- Glöm inte att sätta origin. Utan ursprungsreferens blir det svårt att spåra varför en move skapades.
- Att skriva över _action_done utan att anropa super() kan stoppa viktiga lageruppdateringar och störa andra moduler.
- Skapa inte moves rakt av utan att gå via rätt workflow (t.ex. stock.picking). Att kringgå picking bryter reservationer och assignment.
- Ignorera inte move_dest_id vid splittring eller sammanslagning — kedjade moves riskerar bli föräldralösa.
Sammanfattning
stock.move är navet i Odoos lagerhantering. Den fångar varje flytt av varor mellan platser och fungerar som bas för både konfiguration och integration.
Oavsett om du kartlägger lagerprocesser som konsult eller bygger moduler som utvecklare, sparar kunskap om stock.move tid och minskar risken för fel.
Behöver du hjälp med din Odoo‑implementering?
Dasolo hjälper företag att införa, anpassa och optimera Odoo. Vi har särskild kompetens inom API‑integrationer och djupt kunnande om Odoos datamodeller, där stock.move ofta spelar en central roll.
Behöver du hjälp med implementation, skräddarsydda moduler eller integrationer? Kontakta oss så tar vi fram en lösning. Boka en demo för att diskutera ditt projekt.