From 5171e1c29f404e5f29d693fa8e2abd13f0fa9de9 Mon Sep 17 00:00:00 2001 From: Joel Grand-Guillaume Date: Mon, 29 Jul 2013 15:41:11 +0200 Subject: [PATCH] [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) --- stock_location_ownership/__init__.py | 22 +++++++ stock_location_ownership/__openerp__.py | 58 +++++++++++++++++++ stock_location_ownership/model/__init__.py | 23 ++++++++ stock_location_ownership/model/sale.py | 52 +++++++++++++++++ stock_location_ownership/model/stock.py | 34 +++++++++++ .../test/sale_order_not_sourced.yml | 38 ++++++++++++ .../test/sale_order_source.yml | 40 +++++++++++++ stock_location_ownership/view/sale_view.xml | 16 +++++ stock_location_ownership/view/stock_view.xml | 15 +++++ 9 files changed, 298 insertions(+) create mode 100644 stock_location_ownership/__init__.py create mode 100644 stock_location_ownership/__openerp__.py create mode 100644 stock_location_ownership/model/__init__.py create mode 100644 stock_location_ownership/model/sale.py create mode 100644 stock_location_ownership/model/stock.py create mode 100644 stock_location_ownership/test/sale_order_not_sourced.yml create mode 100644 stock_location_ownership/test/sale_order_source.yml create mode 100644 stock_location_ownership/view/sale_view.xml create mode 100644 stock_location_ownership/view/stock_view.xml diff --git a/stock_location_ownership/__init__.py b/stock_location_ownership/__init__.py new file mode 100644 index 000000000..643bee7ab --- /dev/null +++ b/stock_location_ownership/__init__.py @@ -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 . +# +############################################################################## + +from . import model diff --git a/stock_location_ownership/__openerp__.py b/stock_location_ownership/__openerp__.py new file mode 100644 index 000000000..f36f889b3 --- /dev/null +++ b/stock_location_ownership/__openerp__.py @@ -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 . +# +############################################################################## + +{'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, + } diff --git a/stock_location_ownership/model/__init__.py b/stock_location_ownership/model/__init__.py new file mode 100644 index 000000000..3feab2db1 --- /dev/null +++ b/stock_location_ownership/model/__init__.py @@ -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 . +# +############################################################################## + +from . import stock +from . import sale diff --git a/stock_location_ownership/model/sale.py b/stock_location_ownership/model/sale.py new file mode 100644 index 000000000..fb1070fa3 --- /dev/null +++ b/stock_location_ownership/model/sale.py @@ -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 . +# +############################################################################## + +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. "), + } diff --git a/stock_location_ownership/model/stock.py b/stock_location_ownership/model/stock.py new file mode 100644 index 000000000..5a7e46e28 --- /dev/null +++ b/stock_location_ownership/model/stock.py @@ -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 . +# +############################################################################## + +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."), + } diff --git a/stock_location_ownership/test/sale_order_not_sourced.yml b/stock_location_ownership/test/sale_order_not_sourced.yml new file mode 100644 index 000000000..97aca450f --- /dev/null +++ b/stock_location_ownership/test/sale_order_not_sourced.yml @@ -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)) diff --git a/stock_location_ownership/test/sale_order_source.yml b/stock_location_ownership/test/sale_order_source.yml new file mode 100644 index 000000000..ac2572cd1 --- /dev/null +++ b/stock_location_ownership/test/sale_order_source.yml @@ -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)) + diff --git a/stock_location_ownership/view/sale_view.xml b/stock_location_ownership/view/sale_view.xml new file mode 100644 index 000000000..0319887ef --- /dev/null +++ b/stock_location_ownership/view/sale_view.xml @@ -0,0 +1,16 @@ + + + + + sale.order.form + sale.order + + + + + + + + + diff --git a/stock_location_ownership/view/stock_view.xml b/stock_location_ownership/view/stock_view.xml new file mode 100644 index 000000000..a6df89d22 --- /dev/null +++ b/stock_location_ownership/view/stock_view.xml @@ -0,0 +1,15 @@ + + + + + stock.location.form + stock.location + + + + + + + + +