mirror of
https://github.com/OCA/manufacture.git
synced 2025-01-28 16:37:15 +02:00
11.0 add mrp_warehouse_calendar
This commit is contained in:
committed by
davidborromeo
parent
7cfe224058
commit
f81064829c
1
mrp_warehouse_calendar/__init__.py
Normal file
1
mrp_warehouse_calendar/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from . import models
|
||||||
20
mrp_warehouse_calendar/__manifest__.py
Normal file
20
mrp_warehouse_calendar/__manifest__.py
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# Copyright 2018 Eficent Business and IT Consulting Services, S.L.
|
||||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "MRP Warehouse Calendar",
|
||||||
|
"summary": "Considers the warehouse calendars in manufacturing",
|
||||||
|
"version": "11.0.1.0.0",
|
||||||
|
"license": "AGPL-3",
|
||||||
|
"website": "https://github.com/stock-logistics-warehouse",
|
||||||
|
"author": "Eficent, "
|
||||||
|
"Odoo Community Association (OCA)",
|
||||||
|
"category": "Manufacturing",
|
||||||
|
"depends": [
|
||||||
|
"mrp",
|
||||||
|
"stock_warehouse_calendar",
|
||||||
|
],
|
||||||
|
"installable": True,
|
||||||
|
'development_status': 'Beta',
|
||||||
|
'maintainers': ['jbeficent'],
|
||||||
|
}
|
||||||
2
mrp_warehouse_calendar/models/__init__.py
Normal file
2
mrp_warehouse_calendar/models/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
from . import mrp_production
|
||||||
|
from . import procurement_rule
|
||||||
28
mrp_warehouse_calendar/models/mrp_production.py
Normal file
28
mrp_warehouse_calendar/models/mrp_production.py
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# Copyright 2018 Eficent Business and IT Consulting Services, S.L.
|
||||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
|
||||||
|
|
||||||
|
from odoo import api, fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class MrpProduction(models.Model):
|
||||||
|
_inherit = 'mrp.production'
|
||||||
|
|
||||||
|
@api.onchange('date_planned_start', 'product_id')
|
||||||
|
def onchange_date_planned(self):
|
||||||
|
dt_planned = fields.Datetime.from_string(self.date_planned_start)
|
||||||
|
warehouse = self.picking_type_id.warehouse_id
|
||||||
|
if warehouse.calendar_id and self.product_id.produce_delay:
|
||||||
|
date_expected_finished = warehouse.calendar_id.plan_days(
|
||||||
|
+1 * self.product_id.produce_delay + 1, dt_planned)
|
||||||
|
self.date_planned_finished = date_expected_finished
|
||||||
|
|
||||||
|
@api.multi
|
||||||
|
def copy(self, default=None):
|
||||||
|
mo = super(MrpProduction, self).copy(default=default)
|
||||||
|
dt_planned = fields.Datetime.from_string(mo.date_planned_start)
|
||||||
|
warehouse = mo.picking_type_id.warehouse_id
|
||||||
|
if warehouse.calendar_id and mo.product_id.produce_delay:
|
||||||
|
date_expected = warehouse.calendar_id.plan_days(
|
||||||
|
+1 * self.product_id.produce_delay + 1, dt_planned)
|
||||||
|
mo.date_planned_finished = date_expected
|
||||||
|
return mo
|
||||||
23
mrp_warehouse_calendar/models/procurement_rule.py
Normal file
23
mrp_warehouse_calendar/models/procurement_rule.py
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Copyright 2018 Eficent Business and IT Consulting Services, S.L.
|
||||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
|
||||||
|
|
||||||
|
from odoo import fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class ProcurementRule(models.Model):
|
||||||
|
_inherit = 'procurement.rule'
|
||||||
|
|
||||||
|
def _get_date_planned(self, product_id, values):
|
||||||
|
date_planned = super(ProcurementRule, self)._get_date_planned(
|
||||||
|
product_id, values)
|
||||||
|
picking_type = self.picking_type_id or \
|
||||||
|
values['warehouse_id'].manu_type_id
|
||||||
|
dt_planned = fields.Datetime.from_string(values['date_planned'])
|
||||||
|
warehouse = picking_type.warehouse_id
|
||||||
|
if warehouse.calendar_id and product_id.produce_delay:
|
||||||
|
lead_days = values['company_id'].manufacturing_lead + \
|
||||||
|
product_id.produce_delay
|
||||||
|
date_expected = warehouse.calendar_id.plan_days(
|
||||||
|
-1 * lead_days - 1, dt_planned)
|
||||||
|
date_planned = date_expected
|
||||||
|
return date_planned
|
||||||
9
mrp_warehouse_calendar/readme/CONFIGURE.rst
Normal file
9
mrp_warehouse_calendar/readme/CONFIGURE.rst
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
* This module depends on `stock_warehouse_calendar <https://github.com/OCA/stock-logistics-warehouse>`_
|
||||||
|
|
||||||
|
* Go to *Settings* and activate the developer mode.
|
||||||
|
|
||||||
|
* Go to *Settings > Technical > Resource > Working Time* and define your
|
||||||
|
resource calendar.
|
||||||
|
|
||||||
|
* Go to *Inventory > Configuration > Warehouse Management > Warehouses*
|
||||||
|
and assign the Resource Calendar.
|
||||||
1
mrp_warehouse_calendar/readme/CONTRIBUTORS.rst
Normal file
1
mrp_warehouse_calendar/readme/CONTRIBUTORS.rst
Normal file
@@ -0,0 +1 @@
|
|||||||
|
* Jordi Ballester (EFICENT) <jordi.ballester@eficent.com>.
|
||||||
7
mrp_warehouse_calendar/readme/DESCRIPTION.rst
Normal file
7
mrp_warehouse_calendar/readme/DESCRIPTION.rst
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
With this module the manufacturing orders created from procurements consider
|
||||||
|
the calendar assigned to the warehouse of the picking type of the
|
||||||
|
manufacturing order to determine, based on the product's manufacturing
|
||||||
|
lead time, the planned start date of the manufacturing order.
|
||||||
|
|
||||||
|
Further manual replannings of start/end date of the manufacturing order
|
||||||
|
also consider the lead time using the warehouse calendar days.
|
||||||
0
mrp_warehouse_calendar/readme/ROADMAP.rst
Normal file
0
mrp_warehouse_calendar/readme/ROADMAP.rst
Normal file
8
mrp_warehouse_calendar/readme/USAGE.rst
Normal file
8
mrp_warehouse_calendar/readme/USAGE.rst
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
When a manufacturing order is created out of a procurement evaluation
|
||||||
|
(from an orderpoint, MTO,...) the calendar is considered in the computation
|
||||||
|
of the planned start date of the manufacturing order.
|
||||||
|
|
||||||
|
For example, if it takes 1 day to manufacture a product and it is required
|
||||||
|
for Monday, the manufacturing order will be created with planned start date
|
||||||
|
on the previous Friday, if the warehouse operates under a Mo-Fri working
|
||||||
|
calendar.
|
||||||
BIN
mrp_warehouse_calendar/static/description/icon.png
Normal file
BIN
mrp_warehouse_calendar/static/description/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.2 KiB |
1
mrp_warehouse_calendar/tests/__init__.py
Normal file
1
mrp_warehouse_calendar/tests/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from . import test_mrp_warehouse_calendar
|
||||||
87
mrp_warehouse_calendar/tests/test_mrp_warehouse_calendar.py
Normal file
87
mrp_warehouse_calendar/tests/test_mrp_warehouse_calendar.py
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
# Copyright 2018 Eficent Business and IT Consulting Services, S.L.
|
||||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
|
||||||
|
from odoo import fields
|
||||||
|
from odoo.tests.common import TransactionCase
|
||||||
|
|
||||||
|
|
||||||
|
class TestMrpWarehouseCalendar(TransactionCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(TestMrpWarehouseCalendar, self).setUp()
|
||||||
|
self.move_obj = self.env['stock.move']
|
||||||
|
self.company = self.env.ref('base.main_company')
|
||||||
|
self.warehouse = self.env.ref('stock.warehouse0')
|
||||||
|
self.customer_loc = self.env.ref('stock.stock_location_customers')
|
||||||
|
self.company_partner = self.env.ref('base.main_partner')
|
||||||
|
self.calendar = self.env.ref('resource.resource_calendar_std')
|
||||||
|
self.manufacture_route = self.env.ref(
|
||||||
|
'mrp.route_warehouse0_manufacture')
|
||||||
|
|
||||||
|
self.warehouse.calendar_id = self.calendar.id
|
||||||
|
self.warehouse_2 = self.env['stock.warehouse'].create({
|
||||||
|
'code': 'WH-T',
|
||||||
|
'name': 'Warehouse Test',
|
||||||
|
'calendar_id': self.calendar.id,
|
||||||
|
})
|
||||||
|
|
||||||
|
self.product = self.env['product.product'].create({
|
||||||
|
'name': 'test product',
|
||||||
|
'default_code': 'PRD',
|
||||||
|
'type': 'product',
|
||||||
|
'produce_delay': 1,
|
||||||
|
})
|
||||||
|
self.product_2 = self.env['product.product'].create({
|
||||||
|
'name': 'test product 2',
|
||||||
|
'default_code': 'PRD 2',
|
||||||
|
'type': 'product',
|
||||||
|
})
|
||||||
|
self.bom = self.env['mrp.bom'].create({
|
||||||
|
'product_id': self.product.id,
|
||||||
|
'product_tmpl_id': self.product.product_tmpl_id.id,
|
||||||
|
'product_uom_id': self.product.uom_id.id,
|
||||||
|
'product_qty': 1.0,
|
||||||
|
'type': 'normal',
|
||||||
|
})
|
||||||
|
self.env['mrp.bom.line'].create({
|
||||||
|
'bom_id': self.bom.id,
|
||||||
|
'product_id': self.product_2.id,
|
||||||
|
'product_qty': 2,
|
||||||
|
})
|
||||||
|
|
||||||
|
self.product.route_ids = [(6, 0, self.manufacture_route.ids)]
|
||||||
|
|
||||||
|
def test_procurement_with_calendar(self):
|
||||||
|
values = {
|
||||||
|
'date_planned': '2097-01-07 09:00:00', # Monday
|
||||||
|
'warehouse_id': self.warehouse,
|
||||||
|
'company_id': self.company,
|
||||||
|
'rule_id': self.manufacture_route,
|
||||||
|
}
|
||||||
|
self.env['procurement.group'].run(
|
||||||
|
self.product, 100,
|
||||||
|
self.product.uom_id,
|
||||||
|
self.warehouse.lot_stock_id, 'Test',
|
||||||
|
'Test', values)
|
||||||
|
mo = self.env['mrp.production'].search(
|
||||||
|
[('product_id', '=', self.product.id)], limit=1)
|
||||||
|
date_plan_start = fields.Datetime.from_string(
|
||||||
|
mo.date_planned_start).date()
|
||||||
|
# Friday 4th Jan 2097
|
||||||
|
friday = fields.Datetime.from_string('2097-01-04 09:00:00').date()
|
||||||
|
|
||||||
|
self.assertEqual(date_plan_start, friday)
|
||||||
|
|
||||||
|
def test_onchange_date_planned(self):
|
||||||
|
mo = self.env['mrp.production'].new({
|
||||||
|
'product_id': self.product.id,
|
||||||
|
'bom_id': self.bom.id,
|
||||||
|
'product_qty': 1,
|
||||||
|
'picking_type_id':
|
||||||
|
self.env['mrp.production']._get_default_picking_type()
|
||||||
|
})
|
||||||
|
mo.date_planned_start = '2097-01-04 09:00:00'
|
||||||
|
mo.onchange_date_planned()
|
||||||
|
date_plan_finished = fields.Datetime.from_string(
|
||||||
|
mo.date_planned_finished).date()
|
||||||
|
monday = fields.Datetime.from_string('2097-01-07 09:00:00').date()
|
||||||
|
self.assertEqual(date_plan_finished, monday)
|
||||||
Reference in New Issue
Block a user