158 lines
6.4 KiB
Python
158 lines
6.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
##############################################################################
|
|
#
|
|
# datenpol gmbh
|
|
# Copyright (C) 2013-TODAY datenpol gmbh (<http://www.datenpol.at/>)
|
|
#
|
|
# 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 odoo import fields, models, api, _
|
|
from odoo.exceptions import ValidationError
|
|
|
|
from odoo.addons.component.core import Component
|
|
|
|
|
|
class ProductXCategory(models.Model):
|
|
_name = 'product.xcategory'
|
|
_description = 'X-Kategorie'
|
|
_order = 'name'
|
|
|
|
name = fields.Char(string='Bezaichnung', required=True)
|
|
|
|
_sql_constraints = [
|
|
('name_uniq', 'unique(name)', 'Die Bezeichnung muss eindeutig sein')
|
|
]
|
|
|
|
|
|
class ProductTemplate(models.Model):
|
|
_name = 'product.template'
|
|
_inherit = ['product.template', 'dp_custom.helper']
|
|
|
|
SURFACE_OPTIONS = [
|
|
('m', 'Maserrichtung'),
|
|
('u', 'Einfärbig')
|
|
]
|
|
|
|
length = fields.Float(string='Länge in mm')
|
|
width = fields.Float(string='Breite in mm')
|
|
thickness = fields.Float(string='Dicke in mm', help='Echte Dicke in mm')
|
|
height = fields.Float(string='Höhe in mm')
|
|
surface = fields.Selection(SURFACE_OPTIONS, string='Oberfläche')
|
|
is_internal = fields.Boolean()
|
|
xcat_id = fields.Many2one(comodel_name='product.xcategory', string='X-Kategorie')
|
|
material_type_id = fields.Many2one(comodel_name='material.type', string='Materialtyp')
|
|
assembly_line_ids = fields.Many2many(comodel_name='res.line', string='Produktionslinien')
|
|
notes = fields.Text(string='Notizen')
|
|
can_be_sold_unconfigured = fields.Boolean(string='Darf unkonfiguriert verkauft werden')
|
|
manufacturing_number = fields.Char(string='Herstellnummer')
|
|
product_color = fields.Char(string='Farbe')
|
|
|
|
@api.model
|
|
def create_product(self, vals):
|
|
vals = self.remove_not_specified_fields(vals)
|
|
vals = self.correct_values(vals)
|
|
product_template = self.with_context(active_test=False).search([('default_code', '=', vals['default_code'])])
|
|
if product_template:
|
|
product_template.write(vals)
|
|
else:
|
|
self.create(vals)
|
|
return True
|
|
|
|
@api.model
|
|
def correct_values(self, vals):
|
|
if vals.get('xcat_id', False):
|
|
xcat = self.env['product.xcategory'].search([('name', '=', vals['xcat_id'])])
|
|
if xcat:
|
|
vals['xcat_id'] = xcat.id
|
|
else:
|
|
raise ValidationError(
|
|
_("X-Kategorie \'%s\' kann nicht zugeordnet werden" % vals['xcat_id']))
|
|
|
|
if vals.get('categ_id', False):
|
|
categ_id = self.env['product.category'].search([('code', '=', vals['categ_id'])])
|
|
if categ_id:
|
|
vals['categ_id'] = categ_id.id
|
|
else:
|
|
raise ValidationError(
|
|
_("Kategorie \'%s\' kann nicht zugeordnet werden" % vals['categ_id']))
|
|
|
|
if vals.get('material_type_id', False):
|
|
material_type = self.env['material.type'].search([('name', '=', vals['material_type_id'])])
|
|
if material_type:
|
|
vals['material_type_id'] = material_type.id
|
|
else:
|
|
raise ValidationError(
|
|
_("Materialtyp \'%s\' kann nicht zugeordnet werden" % vals['material_type_id']))
|
|
|
|
if vals.get('intrastat_id', False):
|
|
intrastat = self.env['report.intrastat.code'].search([('name', '=', vals['intrastat_id'])])
|
|
if intrastat:
|
|
vals['intrastat_id'] = intrastat.id
|
|
else:
|
|
raise ValidationError(
|
|
_("Intrastat-Code \'%s\' kann nicht zugeordnet werden" % vals['intrastat_id']))
|
|
|
|
if vals.get('assembly_line_ids', False):
|
|
assembly_line_ids = []
|
|
for assembly_line_code in vals['assembly_line_ids']:
|
|
assembly_line = self.env['res.line'].search([('name', '=', assembly_line_code)])
|
|
if assembly_line:
|
|
assembly_line_ids.append(assembly_line.id)
|
|
else:
|
|
raise ValidationError(
|
|
_("Produktionslinie \'%s\' kann nicht zugeordnet werden" % assembly_line_code))
|
|
vals['assembly_line_ids'] = [(6, 0, assembly_line_ids)]
|
|
|
|
return vals
|
|
|
|
@api.model
|
|
def _get_specified_fields(self):
|
|
return ['default_code', 'name', 'length', 'width', 'thickness', 'surface', 'active', 'weight', 'is_internal',
|
|
'xcat_id', 'notes', 'material_type_id', 'intrastat_id', 'sale_ok', 'assembly_line_ids', 'list_price',
|
|
'height', 'categ_id', 'can_be_sold_unconfigured', 'image']
|
|
|
|
|
|
class ProductCategory(models.Model):
|
|
_inherit = 'product.category'
|
|
|
|
code = fields.Char(string='Code')
|
|
|
|
|
|
class ProductPricelistItemEventListener(Component):
|
|
_name = 'product.pricelist.item.listener'
|
|
_inherit = 'base.event.listener'
|
|
_apply_on = ['product.pricelist.item']
|
|
|
|
@api.model
|
|
def on_record_write(self, record, fields=None):
|
|
partners = self.env['res.partner'].search([('property_product_pricelist', '=', record.id)])
|
|
for partner in partners:
|
|
if partner.portal_id and partner.active:
|
|
partner.portal_export_pending = True
|
|
|
|
@api.model
|
|
def on_record_create(self, record, fields=None):
|
|
partners = self.env['res.partner'].search([('property_product_pricelist', '=', record.id)])
|
|
for partner in partners:
|
|
if partner.portal_id:
|
|
partner.portal_export_pending = True
|
|
|
|
@api.model
|
|
def on_record_unlink(self, record):
|
|
partners = self.env['res.partner'].search([('property_product_pricelist', '=', record.id)])
|
|
for partner in partners:
|
|
if partner.portal_id:
|
|
partner.portal_export_pending = True
|