mirror of
https://github.com/OCA/stock-logistics-warehouse.git
synced 2025-01-21 14:27:28 +02:00
[ADD] stock_location_ownership: first steps of the module
(/tmp/trunk-generic/ rev 15.2.3) (/tmp/7.0-add-sale_sourced_and_stock_ownership rev 21)
This commit is contained in:
22
stock_location_ownership/__init__.py
Normal file
22
stock_location_ownership/__init__.py
Normal file
@@ -0,0 +1,22 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Author: Guewen Baconnier
|
||||
# Copyright 2013 Camptocamp SA
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from . import model
|
||||
58
stock_location_ownership/__openerp__.py
Normal file
58
stock_location_ownership/__openerp__.py
Normal file
@@ -0,0 +1,58 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Author: Guewen Baconnier
|
||||
# Copyright 2013 Camptocamp SA
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
{'name': 'Stock Location Ownership',
|
||||
'version': '0.1',
|
||||
'author': 'Camptocamp',
|
||||
'category': 'Warehouse',
|
||||
'license': 'AGPL-3',
|
||||
'complexity': 'normal',
|
||||
'images': [],
|
||||
'website': "http://www.camptocamp.com",
|
||||
'description': """
|
||||
Stock Location Ownership
|
||||
=========================
|
||||
|
||||
* Adds an ownership on a location
|
||||
|
||||
* (To move/create in module: sale_sourced_by_line) Adds the possibility to source a line of sale order from a specific location instead of
|
||||
using the location of the warehouse of the selected shop
|
||||
|
||||
* Further on (to move/create in module: sale_ownership) will trigger under certain circonstances the creation of a PO:
|
||||
a) if customer != stock.location owner (Dispatch VCI, Dispatch PNS)
|
||||
then generate also PO and link it with picking (delivery order)
|
||||
b) if customer == stock.location owner (Dispatch PNS to NS)
|
||||
then SO should be with prices at 0 + add manually line for handling fee"
|
||||
|
||||
""",
|
||||
'depends': ['sale_dropshipping',
|
||||
'sale_stock',
|
||||
],
|
||||
'demo': [],
|
||||
'data': ['view/stock_view.xml',
|
||||
'view/sale_view.xml',
|
||||
],
|
||||
'auto_install': False,
|
||||
'test': ['test/sale_order_source.yml',
|
||||
'test/sale_order_not_sourced.yml',
|
||||
],
|
||||
'installable': True,
|
||||
}
|
||||
23
stock_location_ownership/model/__init__.py
Normal file
23
stock_location_ownership/model/__init__.py
Normal file
@@ -0,0 +1,23 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Author: Guewen Baconnier
|
||||
# Copyright 2013 Camptocamp SA
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from . import stock
|
||||
from . import sale
|
||||
52
stock_location_ownership/model/sale.py
Normal file
52
stock_location_ownership/model/sale.py
Normal file
@@ -0,0 +1,52 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Author: Guewen Baconnier
|
||||
# Copyright 2013 Camptocamp SA
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from openerp.osv import orm, fields
|
||||
|
||||
|
||||
class sale_order(orm.Model):
|
||||
_inherit = 'sale.order'
|
||||
|
||||
def _prepare_order_line_move(self, cr, uid, order, line, picking_id,
|
||||
date_planned, context=None):
|
||||
values = super(sale_order, self)._prepare_order_line_move(
|
||||
cr, uid, order, line, picking_id, date_planned, context=context)
|
||||
if line.location_id:
|
||||
values['location_id'] = line.location_id.id
|
||||
return values
|
||||
|
||||
def _prepare_order_line_procurement(self, cr, uid, order, line, move_id, date_planned, context=None):
|
||||
values = super(sale_order, self)._prepare_order_line_procurement(
|
||||
cr, uid, order, line, move_id, date_planned, context=context)
|
||||
if line.location_id:
|
||||
values['location_id'] = line.location_id.id
|
||||
return values
|
||||
|
||||
class sale_order_line(orm.Model):
|
||||
_inherit = 'sale.order.line'
|
||||
|
||||
_columns = {
|
||||
'location_id': fields.many2one(
|
||||
'stock.location',
|
||||
'Source Location',
|
||||
help="If a source location is selected, "
|
||||
"it will be used as source of the stock moves. "),
|
||||
}
|
||||
34
stock_location_ownership/model/stock.py
Normal file
34
stock_location_ownership/model/stock.py
Normal file
@@ -0,0 +1,34 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Author: Guewen Baconnier
|
||||
# Copyright 2013 Camptocamp SA
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from openerp.osv import orm, fields
|
||||
|
||||
|
||||
class stock_location(orm.Model):
|
||||
_inherit = 'stock.location'
|
||||
|
||||
_columns = {
|
||||
'owner_id': fields.many2one(
|
||||
'res.partner',
|
||||
'Owner',
|
||||
help="Owner of the location if different from the company "
|
||||
"or address."),
|
||||
}
|
||||
38
stock_location_ownership/test/sale_order_not_sourced.yml
Normal file
38
stock_location_ownership/test/sale_order_not_sourced.yml
Normal file
@@ -0,0 +1,38 @@
|
||||
-
|
||||
In order to check if the source location of a sale order line
|
||||
still use the location of the shop if not specified on the
|
||||
sale order line.
|
||||
-
|
||||
!record {model: sale.order, id: sale_notsourced_01}:
|
||||
partner_id: base.res_partner_2
|
||||
note: Invoice after delivery
|
||||
order_line:
|
||||
- product_id: product.product_product_7
|
||||
product_uom_qty: 8
|
||||
-
|
||||
When I confirm the sale order
|
||||
-
|
||||
!workflow {model: sale.order, action: order_confirm, ref: sale_notsourced_01}
|
||||
-
|
||||
Then a delivery order should have been generated
|
||||
-
|
||||
!python {model: sale.order}: |
|
||||
sale_order = self.browse(cr, uid, ref("sale_notsourced_01"))
|
||||
assert len(sale_order.picking_ids) == 1, (
|
||||
"1 delivery order expected, got %d" % len(sale_order.picking_ids))
|
||||
-
|
||||
And the source location of the stock move should be the one of
|
||||
the sales order's shop
|
||||
-
|
||||
!python {model: sale.order}: |
|
||||
sale_order = self.browse(cr, uid, ref("sale_notsourced_01"))
|
||||
picking = sale_order.picking_ids[0]
|
||||
location_id = sale_order.shop_id.warehouse_id.lot_stock_id
|
||||
for move in picking.move_lines:
|
||||
assert move.location_id == location_id, (
|
||||
"Wrong location_id, expected %s, got %s" %
|
||||
(location_id, move.location_id))
|
||||
for procurement in move.procurements:
|
||||
assert procurement.location_id == location_id, (
|
||||
"Wrong location_id in procurement.order, expected %s, got %s" %
|
||||
(location_id, procurement.location_id))
|
||||
40
stock_location_ownership/test/sale_order_source.yml
Normal file
40
stock_location_ownership/test/sale_order_source.yml
Normal file
@@ -0,0 +1,40 @@
|
||||
-
|
||||
In order to check if the source location of a sale order line
|
||||
becomes the source location of the delivery stock move.
|
||||
I create a sale order.
|
||||
-
|
||||
!record {model: sale.order, id: sale_source_01}:
|
||||
partner_id: base.res_partner_2
|
||||
note: Invoice after delivery
|
||||
order_line:
|
||||
- product_id: product.product_product_7
|
||||
product_uom_qty: 8
|
||||
location_id: stock.stock_location_shop1
|
||||
-
|
||||
When I confirm the sale order
|
||||
-
|
||||
!workflow {model: sale.order, action: order_confirm, ref: sale_source_01}
|
||||
-
|
||||
Then a delivery order should have been generated
|
||||
-
|
||||
!python {model: sale.order}: |
|
||||
sale_order = self.browse(cr, uid, ref("sale_source_01"))
|
||||
assert len(sale_order.picking_ids) == 1, (
|
||||
"1 delivery order expected, got %d" % len(sale_order.picking_ids))
|
||||
-
|
||||
And the source location of the stock move should be the one of
|
||||
the sale order line
|
||||
-
|
||||
!python {model: sale.order}: |
|
||||
sale_order = self.browse(cr, uid, ref("sale_source_01"))
|
||||
picking = sale_order.picking_ids[0]
|
||||
for move in picking.move_lines:
|
||||
expected_location_id = move.sale_line_id.location_id
|
||||
assert move.location_id == expected_location_id, (
|
||||
"Wrong location_id in stock.move, expected %s, got %s" %
|
||||
(expected_location_id, move.location_id))
|
||||
for procurement in move.procurements:
|
||||
assert procurement.location_id == expected_location_id, (
|
||||
"Wrong location_id in procurement.order, expected %s, got %s" %
|
||||
(expected_location_id, procurement.location_id))
|
||||
|
||||
16
stock_location_ownership/view/sale_view.xml
Normal file
16
stock_location_ownership/view/sale_view.xml
Normal file
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data noupdate="0">
|
||||
<record id="view_order_form" model="ir.ui.view">
|
||||
<field name="name">sale.order.form</field>
|
||||
<field name="model">sale.order</field>
|
||||
<field name="inherit_id" ref="sale.view_order_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='order_line']/tree/field[@name='price_subtotal']"
|
||||
position="after">
|
||||
<field name="location_id"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
||||
15
stock_location_ownership/view/stock_view.xml
Normal file
15
stock_location_ownership/view/stock_view.xml
Normal file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data noupdate="0">
|
||||
<record id="view_stock_location_form" model="ir.ui.view">
|
||||
<field name="name">stock.location.form</field>
|
||||
<field name="model">stock.location</field>
|
||||
<field name="inherit_id" ref="stock.view_location_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="partner_id" position="after">
|
||||
<field name="owner_id"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
||||
Reference in New Issue
Block a user