diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/stock/models/res_company.py | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/stock/models/res_company.py')
| -rw-r--r-- | addons/stock/models/res_company.py | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/addons/stock/models/res_company.py b/addons/stock/models/res_company.py new file mode 100644 index 00000000..93a960ed --- /dev/null +++ b/addons/stock/models/res_company.py @@ -0,0 +1,188 @@ +# -*- 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 |
