Perbaikan business category

This commit is contained in:
2026-03-29 04:56:43 +07:00
parent 720e2da2f5
commit d68484d7b7
12 changed files with 165 additions and 15 deletions
+1 -1
View File
@@ -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',
+48 -13
View File
@@ -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
@@ -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
1 id name model_id:id domain_force groups:id perm_read perm_write perm_create perm_unlink
19 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
20 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
21 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
22 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
23 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
24 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
25 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
26 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
27 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
28 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>
+1 -1
View File
@@ -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',