Port account_usability to v10

This commit is contained in:
Alexis de Lattre
2016-11-16 15:46:45 +01:00
parent a7bcc3eaf5
commit 64b340e585
8 changed files with 83 additions and 269 deletions

View File

@@ -1,3 +1,3 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
from . import account from . import account

View File

@@ -1,29 +1,11 @@
# -*- encoding: utf-8 -*- # -*- coding: utf-8 -*-
############################################################################## # © 2015-2016 Akretion (http://www.akretion.com)
#
# Account Usability module for Odoo
# Copyright (C) 2015 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com> # @author Alexis de Lattre <alexis.delattre@akretion.com>
# # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
# 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/>.
#
##############################################################################
{ {
'name': 'Account Usability', 'name': 'Account Usability',
'version': '0.3', 'version': '10.0.1.0.0',
'category': 'Accounting & Finance', 'category': 'Accounting & Finance',
'license': 'AGPL-3', 'license': 'AGPL-3',
'summary': 'Small usability enhancements in account module', 'summary': 'Small usability enhancements in account module',
@@ -48,7 +30,6 @@ This module has been written by Alexis de Lattre from Akretion <alexis.delattre@
'author': 'Akretion', 'author': 'Akretion',
'website': 'http://www.akretion.com', 'website': 'http://www.akretion.com',
'depends': ['account'], 'depends': ['account'],
'conflicts': ['account_invoice_overdue_filter'],
'data': ['account_view.xml'], 'data': ['account_view.xml'],
'installable': False, 'installable': True,
} }

View File

@@ -1,54 +1,26 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
############################################################################## # © 2015-2016 Akretion (http://www.akretion.com)
#
# Account Usability module for Odoo
# Copyright (C) 2015 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com> # @author Alexis de Lattre <alexis.delattre@akretion.com>
# # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
# 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 openerp import models, fields, api, _ from odoo import models, fields, api, _
from openerp.tools import float_compare from odoo.tools import float_compare, float_is_zero
from openerp.exceptions import Warning as UserError from odoo.exceptions import UserError
class AccountInvoice(models.Model): class AccountInvoice(models.Model):
_inherit = 'account.invoice' _inherit = 'account.invoice'
origin = fields.Char(track_visibility='onchange') origin = fields.Char(track_visibility='onchange')
supplier_invoice_number = fields.Char(track_visibility='onchange')
internal_number = fields.Char(track_visibility='onchange')
reference = fields.Char(track_visibility='onchange') reference = fields.Char(track_visibility='onchange')
sent = fields.Boolean(track_visibility='onchange') sent = fields.Boolean(track_visibility='onchange')
date_invoice = fields.Date(track_visibility='onchange') date_invoice = fields.Date(track_visibility='onchange')
date_due = fields.Date(track_visibility='onchange') date_due = fields.Date(track_visibility='onchange')
payment_term = fields.Many2one(track_visibility='onchange') payment_term_id = fields.Many2one(track_visibility='onchange')
period_id = fields.Many2one(track_visibility='onchange')
account_id = fields.Many2one(track_visibility='onchange') account_id = fields.Many2one(track_visibility='onchange')
journal_id = fields.Many2one(track_visibility='onchange') journal_id = fields.Many2one(track_visibility='onchange')
partner_bank_id = fields.Many2one(track_visibility='onchange') partner_bank_id = fields.Many2one(track_visibility='onchange')
fiscal_position = fields.Many2one(track_visibility='onchange') fiscal_position_id = fields.Many2one(track_visibility='onchange')
@api.multi
def onchange_payment_term_date_invoice(self, payment_term_id, date_invoice):
res = super(AccountInvoice, self).onchange_payment_term_date_invoice(
payment_term_id, date_invoice)
if res and isinstance(res, dict) and 'value' in res:
res['value']['period_id'] = False
return res
# I really hate to see a "/" in the 'name' field of the account.move.line # I really hate to see a "/" in the 'name' field of the account.move.line
# generated from customer invoices linked to the partners' account because: # generated from customer invoices linked to the partners' account because:
@@ -56,26 +28,32 @@ class AccountInvoice(models.Model):
# write a rubbish '/' in it ! # write a rubbish '/' in it !
# 2) the 'name' field of the account.move.line is used in the overdue letter, # 2) the 'name' field of the account.move.line is used in the overdue letter,
# and '/' is not meaningful for our customer ! # and '/' is not meaningful for our customer !
@api.multi # TODO port to v10
def action_number(self): #@api.multi
res = super(AccountInvoice, self).action_number() #def action_number(self):
for inv in self: # res = super(AccountInvoice, self).action_number()
self._cr.execute( # for inv in self:
"UPDATE account_move_line SET name= " # self._cr.execute(
"CASE WHEN name='/' THEN %s " # "UPDATE account_move_line SET name= "
"ELSE %s||' - '||name END " # "CASE WHEN name='/' THEN %s "
"WHERE move_id=%s", (inv.number, inv.number, inv.move_id.id)) # "ELSE %s||' - '||name END "
self.invalidate_cache() # "WHERE move_id=%s", (inv.number, inv.number, inv.move_id.id))
return res # self.invalidate_cache()
# return res
class AccountFiscalYear(models.Model): class AccountInvoiceLine(models.Model):
_inherit = 'account.fiscalyear' _inherit = 'account.invoice.line'
# For companies that have a fiscal year != calendar year # In the 'account' module, we have related stored field for:
# I want to be able to write '2015-2016' in the code field # company_id, partner_id, currency_id
# => size=9 instead of 6 type = fields.Selection(
code = fields.Char(size=9) related='invoice_id.type', store=True, readonly=True)
date_invoice = fields.Date(
related='invoice_id.date_invoice', store=True, readonly=True)
commercial_partner_id = fields.Many2one(
related='invoice_id.commercial_partner_id',
store=True, readonly=True)
class AccountJournal(models.Model): class AccountJournal(models.Model):
@@ -122,35 +100,33 @@ class AccountAnalyticAccount(models.Model):
return super(AccountAnalyticAccount, self).name_get() return super(AccountAnalyticAccount, self).name_get()
class AccountMove(models.Model):
_inherit = 'account.move'
@api.onchange('date')
def date_onchange(self):
if self.date:
self.period_id = self.env['account.period'].find(self.date)
class AccountMoveLine(models.Model): class AccountMoveLine(models.Model):
_inherit = 'account.move.line' _inherit = 'account.move.line'
@api.onchange('credit') @api.onchange('credit')
def _credit_onchange(self): def _credit_onchange(self):
if self.credit and self.debit: prec = self.env['decimal.precision'].precision_get('Account')
if (
not float_is_zero(self.credit, precision_digits=prec) and
not float_is_zero(self.debit, precision_digits=prec)):
self.debit = 0 self.debit = 0
@api.onchange('debit') @api.onchange('debit')
def _debit_onchange(self): def _debit_onchange(self):
if self.debit and self.credit: prec = self.env['decimal.precision'].precision_get('Account')
if (
not float_is_zero(self.debit, precision_digits=prec) and
not float_is_zero(self.credit, precision_digits=prec)):
self.credit = 0 self.credit = 0
@api.onchange('currency_id', 'amount_currency') @api.onchange('currency_id', 'amount_currency')
def _amount_currency_change(self): def _amount_currency_change(self):
prec = self.env['decimal.precision'].precision_get('Account')
if ( if (
self.currency_id and self.currency_id and
self.amount_currency and self.amount_currency and
not self.credit and float_is_zero(self.credit, precision_digits=prec) and
not self.debit): float_is_zero(self.debit, precision_digits=prec)):
date = self.date or None date = self.date or None
amount_company_currency = self.currency_id.with_context( amount_company_currency = self.currency_id.with_context(
date=date).compute( date=date).compute(
@@ -182,77 +158,35 @@ class AccountBankStatementLine(models.Model):
# figure out that the fact that the user can't find move line 'x' # figure out that the fact that the user can't find move line 'x'
# is caused by this. # is caused by this.
# Set search_reconciliation_proposition to False by default # Set search_reconciliation_proposition to False by default
def get_data_for_reconciliations( # TODO: re-write in v10
self, cr, uid, ids, excluded_ids=None, #def get_data_for_reconciliations(
search_reconciliation_proposition=False, context=None): # self, cr, uid, ids, excluded_ids=None,
# Make variable name shorted for PEP8 ! # search_reconciliation_proposition=False, context=None):
search_rec_prop = search_reconciliation_proposition # # Make variable name shorted for PEP8 !
return super(AccountBankStatementLine, self).\ # search_rec_prop = search_reconciliation_proposition
get_data_for_reconciliations( # return super(AccountBankStatementLine, self).\
cr, uid, ids, excluded_ids=excluded_ids, # get_data_for_reconciliations(
search_reconciliation_proposition=search_rec_prop, # cr, uid, ids, excluded_ids=excluded_ids,
context=context) # search_reconciliation_proposition=search_rec_prop,
# context=context)
@api.multi @api.multi
def show_account_move(self): def show_account_move(self):
self.ensure_one() self.ensure_one()
action = self.env['ir.actions.act_window'].for_xml_id( action = self.env['ir.actions.act_window'].for_xml_id(
'account', 'action_move_journal_line') 'account', 'action_move_journal_line')
if self.journal_entry_id: if self.journal_entry_ids:
action.update({ action.update({
'views': False, 'views': False,
'view_id': False, 'view_id': False,
'view_mode': 'form,tree', 'view_mode': 'form,tree',
'res_id': self.journal_entry_id.id, 'res_id': self.journal_entry_ids[0].id,
}) })
return action return action
else: else:
raise UserError(_( raise UserError(_(
'No journal entry linked to this bank statement line.')) 'No journal entry linked to this bank statement line.'))
class ResPartner(models.Model):
_inherit = 'res.partner'
@api.multi
def show_receivable_account(self):
self.ensure_one()
account_id = self.property_account_receivable.id
return self.common_show_account(self.ids[0], account_id)
@api.multi
def show_payable_account(self):
self.ensure_one()
account_id = self.property_account_payable.id
return self.common_show_account(self.ids[0], account_id)
def common_show_account(self, partner_id, account_id):
action = self.env['ir.actions.act_window'].for_xml_id(
'account', 'action_account_moves_all_tree')
action['context'] = {
'search_default_partner_id': [partner_id],
'default_partner_id': partner_id,
'search_default_account_id': account_id,
}
return action
@api.multi
def _compute_journal_item_count(self):
amlo = self.env['account.move.line']
for partner in self:
partner.journal_item_count = amlo.search_count([
('partner_id', '=', partner.id),
('account_id', '=', partner.property_account_receivable.id)])
partner.payable_journal_item_count = amlo.search_count([
('partner_id', '=', partner.id),
('account_id', '=', partner.property_account_payable.id)])
journal_item_count = fields.Integer(
compute='_compute_journal_item_count',
string="Journal Items", readonly=True)
payable_journal_item_count = fields.Integer(
compute='_compute_journal_item_count',
string="Payable Journal Items", readonly=True)
class AccountFiscalPosition(models.Model): class AccountFiscalPosition(models.Model):
_inherit = 'account.fiscal.position' _inherit = 'account.fiscal.position'

View File

@@ -1,12 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- <!--
Copyright (C) 2015 Akretion (http://www.akretion.com/) © 2015-2016 Akretion (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com> @author: Alexis de Lattre <alexis.delattre@akretion.com>
The licence is in the file __openerp__.py License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
--> -->
<openerp> <odoo>
<data>
<!-- INVOICE --> <!-- INVOICE -->
<record id="invoice_supplier_form" model="ir.ui.view"> <record id="invoice_supplier_form" model="ir.ui.view">
@@ -14,14 +13,9 @@
<field name="model">account.invoice</field> <field name="model">account.invoice</field>
<field name="inherit_id" ref="account.invoice_supplier_form"/> <field name="inherit_id" ref="account.invoice_supplier_form"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<field name="fiscal_position" position="attributes"> <field name="fiscal_position_id" position="attributes">
<attribute name="widget">selection</attribute> <attribute name="widget">selection</attribute>
</field> </field>
<!-- by default, period_id is restricted to account.group_account_user
But a member of account.group_account_invoice may need to change it -->
<field name="period_id" position="attributes">
<attribute name="groups"></attribute>
</field>
</field> </field>
</record> </record>
@@ -30,14 +24,9 @@
<field name="model">account.invoice</field> <field name="model">account.invoice</field>
<field name="inherit_id" ref="account.invoice_form"/> <field name="inherit_id" ref="account.invoice_form"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<field name="fiscal_position" position="attributes"> <field name="fiscal_position_id" position="attributes">
<attribute name="widget">selection</attribute> <attribute name="widget">selection</attribute>
</field> </field>
<!-- by default, period_id is restricted to account.group_account_user
But a member of account.group_account_invoice may need to change it -->
<field name="period_id" position="attributes">
<attribute name="groups"></attribute>
</field>
</field> </field>
</record> </record>
@@ -46,25 +35,12 @@
<field name="model">account.invoice</field> <field name="model">account.invoice</field>
<field name="inherit_id" ref="account.invoice_tree"/> <field name="inherit_id" ref="account.invoice_tree"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<field name="number" position="after"> <field name="reference" position="attributes">
<field name="supplier_invoice_number" <attribute name="invisible">not context.get('type') in ('in_invoice', 'in_refund')</attribute>
invisible="not context.get('type') in ('in_invoice', 'in_refund')"/>
</field> </field>
</field> </field>
</record> </record>
<record id="view_account_invoice_filter" model="ir.ui.view">
<field name="name">account_usability.invoice.search</field>
<field name="model">account.invoice</field>
<field name="inherit_id" ref="account.view_account_invoice_filter"/>
<field name="arch" type="xml">
<filter name="unpaid" position="after">
<filter name="overdue" string="Overdue"
domain="[('state', '=', 'open'), ('date_due', '&lt;', current_date)]"/>
</filter>
</field>
</record>
<!-- model account.move.line / Journal Items --> <!-- model account.move.line / Journal Items -->
<record id="account.action_account_moves_all_a" model="ir.actions.act_window"> <record id="account.action_account_moves_all_a" model="ir.actions.act_window">
<field name="limit">200</field> <field name="limit">200</field>
@@ -77,35 +53,29 @@
<field name="limit">200</field> <field name="limit">200</field>
</record> </record>
<!--
<record id="view_move_form" model="ir.ui.view"> <record id="view_move_form" model="ir.ui.view">
<field name="name">account_usability.account_move_form</field> <field name="name">account_usability.account_move_form</field>
<field name="model">account.move</field> <field name="model">account.move</field>
<field name="inherit_id" ref="account.view_move_form"/> <field name="inherit_id" ref="account.view_move_form"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//field[@name='line_id']/tree/field[@name='tax_code_id']" position="attributes">
<attribute name="invisible">1</attribute>
</xpath>
<xpath expr="//field[@name='line_id']/tree/field[@name='tax_amount']" position="attributes">
<attribute name="invisible">1</attribute>
</xpath>
<xpath expr="//field[@name='line_id']/tree/field[@name='state']" position="attributes">
<attribute name="invisible">1</attribute>
</xpath>
</field> </field>
</record> </record>
-->
<record id="view_account_move_line_filter" model="ir.ui.view"> <record id="view_account_move_line_filter" model="ir.ui.view">
<field name="name">account_usability.account_move_line_search</field> <field name="name">account_usability.account_move_line_search</field>
<field name="model">account.move.line</field> <field name="model">account.move.line</field>
<field name="inherit_id" ref="account.view_account_move_line_filter"/> <field name="inherit_id" ref="account.view_account_move_line_filter"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<!--
<field name="partner_id" position="after"> <field name="partner_id" position="after">
<field name="reconcile_ref" /> <field name="reconcile_ref" />
</field> </field>
<filter name="unreconciled" position="before"> <filter name="unreconciled" position="before">
<filter name="reconciled" string="Fully Reconciled" domain="[('reconcile_id', '!=', False)]"/> <filter name="reconciled" string="Fully Reconciled" domain="[('reconcile_id', '!=', False)]"/>
<filter name="partial_reconciled" string="Partially Reconciled" domain="[('reconcile_partial_id', '!=', False)]"/> <filter name="partial_reconciled" string="Partially Reconciled" domain="[('reconcile_partial_id', '!=', False)]"/>
</filter> </filter> -->
<field name="name" position="attributes"> <field name="name" position="attributes">
<attribute name="string">Name or Reference</attribute> <attribute name="string">Name or Reference</attribute>
</field> </field>
@@ -123,15 +93,12 @@
</field> </field>
</record> </record>
<!-- Display analytic account even when you don't have any journal selected --> <!--
<record id="view_move_line_tree" model="ir.ui.view"> <record id="view_move_line_tree" model="ir.ui.view">
<field name="name">account_usability.account_move_line_tree</field> <field name="name">account_usability.account_move_line_tree</field>
<field name="model">account.move.line</field> <field name="model">account.move.line</field>
<field name="inherit_id" ref="account.view_move_line_tree"/> <field name="inherit_id" ref="account.view_move_line_tree"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<field name="analytic_account_id" position="attributes">
<attribute name="invisible"></attribute>
</field>
<field name="reconcile_ref" position="attributes"> <field name="reconcile_ref" position="attributes">
<attribute name="invisible">1</attribute> <attribute name="invisible">1</attribute>
</field> </field>
@@ -141,50 +108,15 @@
</field> </field>
</field> </field>
</record> </record>
-->
<record id="view_account_list" model="ir.ui.view">
<field name="name">account_usability.account_account.tree</field>
<field name="model">account.account</field>
<field name="inherit_id" ref="account.view_account_list"/>
<field name="arch" type="xml">
<field name="user_type" position="replace"/>
<field name="type" position="after">
<field name="user_type"/>
</field>
</field>
</record>
<record id="view_account_type_tree" model="ir.ui.view"> <record id="view_account_type_tree" model="ir.ui.view">
<field name="name">account_usability.account_type_tree</field> <field name="name">account_usability.account_type_tree</field>
<field name="model">account.account.type</field> <field name="model">account.account.type</field>
<field name="inherit_id" ref="account.view_account_type_tree" /> <field name="inherit_id" ref="account.view_account_type_tree" />
<field name="arch" type="xml"> <field name="arch" type="xml">
<field name="code" position="after"> <field name="type" position="after">
<field name="close_method" /> <field name="include_initial_balance" />
</field>
</field>
</record>
<record id="partner_view_button_journal_item_count" model="ir.ui.view">
<field name="name">usability.res.partner.journal.items.button</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="account.partner_view_button_journal_item_count"/>
<field name="arch" type="xml">
<button name="%(account.action_account_moves_all_tree)d" position="after">
<button name="show_payable_account" type="object"
attrs="{'invisible': [('supplier', '=', False)]}"
icon="fa-list" class="oe_stat_button">
<field string="Payable Account" name="payable_journal_item_count"
widget="statinfo"/>
</button>
</button>
<button name="%(account.action_account_moves_all_tree)d" position="attributes">
<attribute name="type">object</attribute>
<attribute name="name">show_receivable_account</attribute>
<attribute name="attrs">{'invisible': [('customer', '=', False)]}</attribute>
</button>
<field name="journal_item_count" position="attributes">
<attribute name="string">Receivable Account</attribute>
</field> </field>
</field> </field>
</record> </record>
@@ -197,11 +129,10 @@
<xpath expr="//field[@name='line_ids']/tree/field[@name='bank_account_id']" position="after"> <xpath expr="//field[@name='line_ids']/tree/field[@name='bank_account_id']" position="after">
<!-- The cancel button is provided by the account_cancel module, but we don't want to depend on it --> <!-- The cancel button is provided by the account_cancel module, but we don't want to depend on it -->
<button name="show_account_move" type="object" <button name="show_account_move" type="object"
string="View Account Move" icon="gtk-redo" string="View Account Move" icon="fa fa-arrow-right"
attrs="{'invisible': [('journal_entry_id', '=', False)]}"/> attrs="{'invisible': [('journal_entry_ids', '=', [])]}"/>
</xpath> </xpath>
</field> </field>
</record> </record>
</data> </odoo>
</openerp>

View File

@@ -1,17 +0,0 @@
# -*- coding: utf-8 -*-
# © 2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
def migrate(cr, version):
if not version:
return
# cf the inherit of action_number() of account.invoice
# in account_usability/account.py
cr.execute(
"UPDATE account_move_line SET name= "
"CASE WHEN account_move_line.name='/' THEN account_move.name "
"ELSE account_move.name||' - '||account_move_line.name END "
"FROM account_move WHERE account_move_line.move_id = account_move.id "
"AND account_move_line.journal_id in "
"(SELECT id FROM account_journal WHERE type in ('sale', 'sale_refund'))")

View File

@@ -1,16 +0,0 @@
# -*- coding: utf-8 -*-
# © 2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
def migrate(cr, version):
if not version:
return
# cf the inherit of action_number() of account.invoice
# in account_usability/account.py
cr.execute(
"UPDATE account_move_line SET name=account_move.name "
"FROM account_move WHERE account_move_line.move_id = account_move.id "
"AND account_move_line.name='/' "
"AND account_move_line.journal_id in "
"(SELECT id FROM account_journal WHERE type in ('purchase', 'purchase_refund'))")

View File

@@ -6,7 +6,7 @@
{ {
'name': 'Stock Usability', 'name': 'Stock Usability',
'version': '0.2', 'version': '10.0.1.0.0',
'category': 'Inventory, Logistic, Storage', 'category': 'Inventory, Logistic, Storage',
'license': 'AGPL-3', 'license': 'AGPL-3',
'summary': 'Several usability enhancements in Warehouse management', 'summary': 'Several usability enhancements in Warehouse management',

View File

@@ -1,3 +1,4 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_procurement_scheduler_log_full,Full access on procurement.scheduler.log to System group,model_procurement_scheduler_log,base.group_system,1,1,1,1 access_procurement_scheduler_log_full,Full access on procurement.scheduler.log to System group,model_procurement_scheduler_log,base.group_system,1,1,1,1
access_procurement_scheduler_log_user,Read/Create procurement.scheduler.log to Stock user,model_procurement_scheduler_log,stock.group_stock_user,1,0,1,0
access_procurement_scheduler_log_read,Read access on procurement.scheduler.log to Employee,model_procurement_scheduler_log,base.group_user,1,0,0,0 access_procurement_scheduler_log_read,Read access on procurement.scheduler.log to Employee,model_procurement_scheduler_log,base.group_user,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_procurement_scheduler_log_full Full access on procurement.scheduler.log to System group model_procurement_scheduler_log base.group_system 1 1 1 1
3 access_procurement_scheduler_log_user Read/Create procurement.scheduler.log to Stock user model_procurement_scheduler_log stock.group_stock_user 1 0 1 0
4 access_procurement_scheduler_log_read Read access on procurement.scheduler.log to Employee model_procurement_scheduler_log base.group_user 1 0 0 0