Perbaikan business category
This commit is contained in:
@@ -35,7 +35,7 @@
|
||||
|
||||
""",
|
||||
|
||||
"depends": ["mail", "sale_management", "stock", 'peternak_sapi', 'master_sapi',],
|
||||
"depends": ["mail", "sale_management", "stock", 'peternak_sapi', 'master_sapi', 'liter_sapi'],
|
||||
"data": [
|
||||
'security/hospital_groups.xml',
|
||||
'security/ir.model.access.csv',
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -49,28 +49,63 @@ class ResUsers(models.Model):
|
||||
help="Current user context category, similar to active company.",
|
||||
)
|
||||
|
||||
def _get_team_business_categories(self):
|
||||
def _build_or_domain(self, domain_parts):
|
||||
if not domain_parts:
|
||||
return []
|
||||
if len(domain_parts) == 1:
|
||||
return domain_parts
|
||||
return ["|"] * (len(domain_parts) - 1) + domain_parts
|
||||
|
||||
def _get_team_business_categories_from_model(self, model_name, domain_parts):
|
||||
self.ensure_one()
|
||||
team_model = self.env["crm.team"].sudo()
|
||||
if model_name not in self.env:
|
||||
return self.env["crm.business.category"]
|
||||
|
||||
team_model = self.env[model_name].sudo()
|
||||
user_id = self._origin.id or self.id
|
||||
if not isinstance(user_id, int):
|
||||
return self.env["crm.business.category"]
|
||||
domain_parts = []
|
||||
if "user_id" in team_model._fields:
|
||||
domain_parts.append(("user_id", "=", user_id))
|
||||
if "member_ids" in team_model._fields:
|
||||
domain_parts.append(("member_ids", "in", user_id))
|
||||
|
||||
if not domain_parts:
|
||||
valid_domain_parts = [
|
||||
domain_part
|
||||
for domain_part in domain_parts
|
||||
if isinstance(domain_part, (list, tuple))
|
||||
and len(domain_part) >= 1
|
||||
and domain_part[0] in team_model._fields
|
||||
]
|
||||
if not valid_domain_parts:
|
||||
return self.env["crm.business.category"]
|
||||
if len(domain_parts) == 1:
|
||||
domain = domain_parts
|
||||
else:
|
||||
domain = ["|"] + domain_parts
|
||||
|
||||
domain = self._build_or_domain(valid_domain_parts)
|
||||
teams = team_model.search(domain + [("company_id", "in", self.company_ids.ids)])
|
||||
return teams.mapped("business_category_id")
|
||||
|
||||
def _get_team_business_categories(self):
|
||||
self.ensure_one()
|
||||
categories = self.env["crm.business.category"]
|
||||
|
||||
categories |= self._get_team_business_categories_from_model(
|
||||
"crm.team",
|
||||
[
|
||||
("user_id", "=", self.id),
|
||||
("member_ids", "in", self.id),
|
||||
("sale_team_leader_id", "=", self.id),
|
||||
("team_members_ids", "in", self.id),
|
||||
],
|
||||
)
|
||||
categories |= self._get_team_business_categories_from_model(
|
||||
"purchase.team",
|
||||
[("user_id", "=", self.id), ("member_ids", "in", self.id)],
|
||||
)
|
||||
categories |= self._get_team_business_categories_from_model(
|
||||
"expense.team",
|
||||
[("user_id", "=", self.id), ("member_ids", "in", self.id)],
|
||||
)
|
||||
categories |= self._get_team_business_categories_from_model(
|
||||
"stock.team",
|
||||
[("user_id", "=", self.id), ("member_ids", "in", self.id)],
|
||||
)
|
||||
return categories
|
||||
|
||||
def _filter_business_categories_by_company(self, categories):
|
||||
self.ensure_one()
|
||||
return categories.filtered(lambda category: category.company_id in self.company_ids)
|
||||
|
||||
@@ -26,6 +26,7 @@ propagation for stock valuation journal entries.
|
||||
"views/stock_team_views.xml",
|
||||
"views/stock_warehouse_views.xml",
|
||||
"views/stock_picking_views.xml",
|
||||
"views/product_views.xml",
|
||||
"views/inventory_report_business_category_views.xml",
|
||||
"views/stock_menu_views.xml",
|
||||
],
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
from . import account_move
|
||||
from . import crm_business_category
|
||||
from . import product_template
|
||||
from . import stock_picking
|
||||
from . import stock_team
|
||||
from . import stock_warehouse
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,70 @@
|
||||
from odoo import _, api, fields, models
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
|
||||
class ProductTemplate(models.Model):
|
||||
_inherit = "product.template"
|
||||
|
||||
business_category_id = fields.Many2one(
|
||||
"crm.business.category",
|
||||
string="Business Category",
|
||||
default=lambda self: self.env["business.category.mixin"]._default_business_category_id(),
|
||||
required=True,
|
||||
ondelete="restrict",
|
||||
index=True,
|
||||
domain="[('company_id', '=', company_id)]",
|
||||
)
|
||||
|
||||
@api.onchange("business_category_id")
|
||||
def _onchange_business_category_id_company(self):
|
||||
for template in self:
|
||||
if template.business_category_id and template.business_category_id.company_id:
|
||||
template.company_id = template.business_category_id.company_id
|
||||
|
||||
@api.onchange("company_id")
|
||||
def _onchange_company_id_business_category(self):
|
||||
for template in self:
|
||||
if template.business_category_id and template.business_category_id.company_id != template.company_id:
|
||||
template.business_category_id = False
|
||||
|
||||
@api.model_create_multi
|
||||
def create(self, vals_list):
|
||||
vals_list = [self._prepare_business_category_vals(vals) for vals in vals_list]
|
||||
return super().create(vals_list)
|
||||
|
||||
def write(self, vals):
|
||||
vals = self._prepare_business_category_vals(vals)
|
||||
return super().write(vals)
|
||||
|
||||
def _prepare_business_category_vals(self, vals):
|
||||
vals = dict(vals)
|
||||
if vals.get("business_category_id") and not vals.get("company_id"):
|
||||
category = self.env["crm.business.category"].browse(vals["business_category_id"])
|
||||
if category.company_id:
|
||||
vals["company_id"] = category.company_id.id
|
||||
return vals
|
||||
|
||||
@api.constrains("company_id", "business_category_id")
|
||||
def _check_business_category_company(self):
|
||||
for template in self:
|
||||
if not template.company_id or not template.business_category_id:
|
||||
continue
|
||||
if template.business_category_id.company_id != template.company_id:
|
||||
raise ValidationError(
|
||||
_(
|
||||
"Product '%s' must use a Business Category from company '%s'."
|
||||
)
|
||||
% (template.display_name, template.company_id.name)
|
||||
)
|
||||
|
||||
|
||||
class ProductProduct(models.Model):
|
||||
_inherit = "product.product"
|
||||
|
||||
business_category_id = fields.Many2one(
|
||||
"crm.business.category",
|
||||
string="Business Category",
|
||||
related="product_tmpl_id.business_category_id",
|
||||
store=True,
|
||||
readonly=True,
|
||||
)
|
||||
@@ -19,3 +19,10 @@ account_move_inventory_business_category_rule_user,Journal Entry read by effecti
|
||||
account_move_inventory_business_category_rule_manager,Journal Entry access for inventory manager in effective business category,account.model_account_move,"[('company_id','in',user.company_ids.ids),('inventory_business_category_id','in',user.effective_business_category_ids.ids)]",stock.group_stock_manager,1,1,1,1
|
||||
account_move_line_inventory_business_category_rule_user,Journal Item read by effective business category for inventory user,account.model_account_move_line,"[('company_id','in',user.company_ids.ids),('move_id.inventory_business_category_id','in',user.effective_business_category_ids.ids)]",stock.group_stock_user,1,0,0,0
|
||||
account_move_line_inventory_business_category_rule_manager,Journal Item access for inventory manager in effective business category,account.model_account_move_line,"[('company_id','in',user.company_ids.ids),('move_id.inventory_business_category_id','in',user.effective_business_category_ids.ids)]",stock.group_stock_manager,1,1,1,1
|
||||
product_template_business_category_rule_user,Product Template by effective business category,product.model_product_template,"[('business_category_id.company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_user,1,1,1,1
|
||||
product_template_business_category_rule_sysadmin,Product Template full access for system admin,product.model_product_template,"[(1,'=',1)]",base.group_system,1,1,1,1
|
||||
product_product_business_category_rule_user,Product Variant by effective business category,product.model_product_product,"[('business_category_id.company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_user,1,1,1,1
|
||||
product_product_business_category_rule_sysadmin,Product Variant full access for system admin,product.model_product_product,"[(1,'=',1)]",base.group_system,1,1,1,1
|
||||
stock_quant_business_category_rule_user,Stock Quant by effective business category,stock.model_stock_quant,"[('company_id','in',user.company_ids.ids),('product_id.business_category_id','in',user.effective_business_category_ids.ids)]",stock.group_stock_user,1,0,0,0
|
||||
stock_quant_business_category_rule_manager,Stock Quant access for inventory manager in effective business category,stock.model_stock_quant,"[('company_id','in',user.company_ids.ids),('product_id.business_category_id','in',user.effective_business_category_ids.ids)]",stock.group_stock_manager,1,1,1,1
|
||||
stock_quant_business_category_rule_sysadmin,Stock Quant full access for system admin,stock.model_stock_quant,"[(1,'=',1)]",base.group_system,1,1,1,1
|
||||
|
||||
|
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="product_template_only_form_view_business_category" model="ir.ui.view">
|
||||
<field name="name">product.template.only.form.business.category</field>
|
||||
<field name="model">product.template</field>
|
||||
<field name="inherit_id" ref="product.product_template_only_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='categ_id']" position="after">
|
||||
<field name="business_category_id"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="product_template_form_view_business_category" model="ir.ui.view">
|
||||
<field name="name">product.template.form.business.category</field>
|
||||
<field name="model">product.template</field>
|
||||
<field name="inherit_id" ref="product.product_template_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='categ_id']" position="after">
|
||||
<field name="business_category_id"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="product_template_search_view_business_category" model="ir.ui.view">
|
||||
<field name="name">product.template.search.business.category</field>
|
||||
<field name="model">product.template</field>
|
||||
<field name="inherit_id" ref="product.product_template_search_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='categ_id']" position="after">
|
||||
<field name="business_category_id"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
||||
@@ -2,5 +2,6 @@
|
||||
<odoo>
|
||||
<record id="group_sale_team_leader" model="res.groups">
|
||||
<field name="name">Sales Team Leader</field>
|
||||
<field name="implied_ids" eval="[(4, ref('sales_team.group_sale_salesman'))]"/>
|
||||
</record>
|
||||
</odoo>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
'complexity': "easy",
|
||||
'author': 'AFajarR',
|
||||
'website': '',
|
||||
'depends': ['base', 'mail', 'master_sapi'],
|
||||
'depends': ['base', 'mail', 'master_sapi', 'kandang'],
|
||||
'data': [
|
||||
'security/ir.model.access.csv',
|
||||
'report/menu_report_peternak.xml',
|
||||
|
||||
Reference in New Issue
Block a user