You may have inactive warehouses for some companies and then, when recreating missing warehouses, you try to create same warehouses for those companies, but you can't because there is an unique constraint. closes odoo/odoo#62620 X-original-commit: 9b91f9d1bb41d05f445d745a9b8e5fa63edaf2a9 Signed-off-by: Nicolas Martinelli (nim) <nim@odoo.com>
189 lines
8.1 KiB
Python
189 lines
8.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import _, api, fields, models
|
|
|
|
|
|
class Company(models.Model):
|
|
_inherit = "res.company"
|
|
_check_company_auto = True
|
|
|
|
def _default_confirmation_mail_template(self):
|
|
try:
|
|
return self.env.ref('stock.mail_template_data_delivery_confirmation').id
|
|
except ValueError:
|
|
return False
|
|
|
|
internal_transit_location_id = fields.Many2one(
|
|
'stock.location', 'Internal Transit Location', ondelete="restrict", check_company=True,
|
|
help="Technical field used for resupply routes between warehouses that belong to this company")
|
|
stock_move_email_validation = fields.Boolean("Email Confirmation picking", default=False)
|
|
stock_mail_confirmation_template_id = fields.Many2one('mail.template', string="Email Template confirmation picking",
|
|
domain="[('model', '=', 'stock.picking')]",
|
|
default=_default_confirmation_mail_template,
|
|
help="Email sent to the customer once the order is done.")
|
|
|
|
def _create_transit_location(self):
|
|
'''Create a transit location with company_id being the given company_id. This is needed
|
|
in case of resuply routes between warehouses belonging to the same company, because
|
|
we don't want to create accounting entries at that time.
|
|
'''
|
|
parent_location = self.env.ref('stock.stock_location_locations', raise_if_not_found=False)
|
|
for company in self:
|
|
location = self.env['stock.location'].create({
|
|
'name': _('Inter-warehouse transit'),
|
|
'usage': 'transit',
|
|
'location_id': parent_location and parent_location.id or False,
|
|
'company_id': company.id,
|
|
'active': False
|
|
})
|
|
|
|
company.write({'internal_transit_location_id': location.id})
|
|
|
|
company.partner_id.with_company(company).write({
|
|
'property_stock_customer': location.id,
|
|
'property_stock_supplier': location.id,
|
|
})
|
|
|
|
def _create_inventory_loss_location(self):
|
|
parent_location = self.env.ref('stock.stock_location_locations_virtual', raise_if_not_found=False)
|
|
for company in self:
|
|
inventory_loss_location = self.env['stock.location'].create({
|
|
'name': 'Inventory adjustment',
|
|
'usage': 'inventory',
|
|
'location_id': parent_location.id,
|
|
'company_id': company.id,
|
|
})
|
|
self.env['ir.property']._set_default(
|
|
"property_stock_inventory",
|
|
"product.template",
|
|
inventory_loss_location,
|
|
company.id,
|
|
)
|
|
|
|
def _create_production_location(self):
|
|
parent_location = self.env.ref('stock.stock_location_locations_virtual', raise_if_not_found=False)
|
|
for company in self:
|
|
production_location = self.env['stock.location'].create({
|
|
'name': 'Production',
|
|
'usage': 'production',
|
|
'location_id': parent_location.id,
|
|
'company_id': company.id,
|
|
})
|
|
self.env['ir.property']._set_default(
|
|
"property_stock_production",
|
|
"product.template",
|
|
production_location,
|
|
company.id,
|
|
)
|
|
|
|
|
|
def _create_scrap_location(self):
|
|
parent_location = self.env.ref('stock.stock_location_locations_virtual', raise_if_not_found=False)
|
|
for company in self:
|
|
scrap_location = self.env['stock.location'].create({
|
|
'name': 'Scrap',
|
|
'usage': 'inventory',
|
|
'location_id': parent_location.id,
|
|
'company_id': company.id,
|
|
'scrap_location': True,
|
|
})
|
|
|
|
def _create_scrap_sequence(self):
|
|
scrap_vals = []
|
|
for company in self:
|
|
scrap_vals.append({
|
|
'name': '%s Sequence scrap' % company.name,
|
|
'code': 'stock.scrap',
|
|
'company_id': company.id,
|
|
'prefix': 'SP/',
|
|
'padding': 5,
|
|
'number_next': 1,
|
|
'number_increment': 1
|
|
})
|
|
if scrap_vals:
|
|
self.env['ir.sequence'].create(scrap_vals)
|
|
|
|
@api.model
|
|
def create_missing_warehouse(self):
|
|
""" This hook is used to add a warehouse on existing companies
|
|
when module stock is installed.
|
|
"""
|
|
company_ids = self.env['res.company'].search([])
|
|
company_with_warehouse = self.env['stock.warehouse'].with_context(active_test=False).search([]).mapped('company_id')
|
|
company_without_warehouse = company_ids - company_with_warehouse
|
|
for company in company_without_warehouse:
|
|
self.env['stock.warehouse'].create({
|
|
'name': company.name,
|
|
'code': company.name[:5],
|
|
'company_id': company.id,
|
|
'partner_id': company.partner_id.id,
|
|
})
|
|
|
|
@api.model
|
|
def create_missing_transit_location(self):
|
|
company_without_transit = self.env['res.company'].search([('internal_transit_location_id', '=', False)])
|
|
company_without_transit._create_transit_location()
|
|
|
|
@api.model
|
|
def create_missing_inventory_loss_location(self):
|
|
company_ids = self.env['res.company'].search([])
|
|
inventory_loss_product_template_field = self.env['ir.model.fields']._get('product.template', 'property_stock_inventory')
|
|
companies_having_property = self.env['ir.property'].sudo().search([('fields_id', '=', inventory_loss_product_template_field.id)]).mapped('company_id')
|
|
company_without_property = company_ids - companies_having_property
|
|
company_without_property._create_inventory_loss_location()
|
|
|
|
@api.model
|
|
def create_missing_production_location(self):
|
|
company_ids = self.env['res.company'].search([])
|
|
production_product_template_field = self.env['ir.model.fields']._get('product.template', 'property_stock_production')
|
|
companies_having_property = self.env['ir.property'].sudo().search([('fields_id', '=', production_product_template_field.id)]).mapped('company_id')
|
|
company_without_property = company_ids - companies_having_property
|
|
company_without_property._create_production_location()
|
|
|
|
@api.model
|
|
def create_missing_scrap_location(self):
|
|
company_ids = self.env['res.company'].search([])
|
|
companies_having_scrap_loc = self.env['stock.location'].search([('scrap_location', '=', True)]).mapped('company_id')
|
|
company_without_property = company_ids - companies_having_scrap_loc
|
|
company_without_property._create_scrap_location()
|
|
|
|
@api.model
|
|
def create_missing_scrap_sequence(self):
|
|
company_ids = self.env['res.company'].search([])
|
|
company_has_scrap_seq = self.env['ir.sequence'].search([('code', '=', 'stock.scrap')]).mapped('company_id')
|
|
company_todo_sequence = company_ids - company_has_scrap_seq
|
|
company_todo_sequence._create_scrap_sequence()
|
|
|
|
def _create_per_company_locations(self):
|
|
self.ensure_one()
|
|
self._create_transit_location()
|
|
self._create_inventory_loss_location()
|
|
self._create_production_location()
|
|
self._create_scrap_location()
|
|
|
|
def _create_per_company_sequences(self):
|
|
self.ensure_one()
|
|
self._create_scrap_sequence()
|
|
|
|
def _create_per_company_picking_types(self):
|
|
self.ensure_one()
|
|
|
|
def _create_per_company_rules(self):
|
|
self.ensure_one()
|
|
|
|
@api.model
|
|
def create(self, vals):
|
|
company = super(Company, self).create(vals)
|
|
company.sudo()._create_per_company_locations()
|
|
company.sudo()._create_per_company_sequences()
|
|
company.sudo()._create_per_company_picking_types()
|
|
company.sudo()._create_per_company_rules()
|
|
self.env['stock.warehouse'].sudo().create({
|
|
'name': company.name,
|
|
'code': self.env.context.get('default_code') or company.name[:5],
|
|
'company_id': company.id,
|
|
'partner_id': company.partner_id.id
|
|
})
|
|
return company
|