[IMP] analytic: Replaced account_type field by active field

Currently there is a selection field 'account_type' on the
account.analytic.account model with 2 values : Active or Archived

Let's use an active field instead and add a Archive stat button on the
form. That way, we can remove all the domain ('account_type','=','normal')
which are implicit with the generic active field behavior
This commit is contained in:
Kinjal Mehta
2016-03-23 16:35:34 +01:00
committed by Yannick Tivisse
parent 93da11a59c
commit a57592abe4
20 changed files with 37 additions and 52 deletions
+2 -2
View File
@@ -714,7 +714,7 @@ class AccountOperationTemplate(models.Model):
], required=True, default='percentage')
amount = fields.Float(digits=0, required=True, default=100.0, help="Fixed amount will count as a debit if it is negative, as a credit if it is positive.")
tax_id = fields.Many2one('account.tax', string='Tax', ondelete='restrict', domain=[('type_tax_use', '=', 'purchase')])
analytic_account_id = fields.Many2one('account.analytic.account', string='Analytic Account', ondelete='set null', domain=[('account_type', '=', 'normal')])
analytic_account_id = fields.Many2one('account.analytic.account', string='Analytic Account', ondelete='set null')
second_account_id = fields.Many2one('account.account', string='Account', ondelete='cascade', domain=[('deprecated', '=', False)])
second_journal_id = fields.Many2one('account.journal', string='Journal', ondelete='cascade', help="This field is ignored in a bank statement reconciliation.")
@@ -725,7 +725,7 @@ class AccountOperationTemplate(models.Model):
], string='Amount type', required=True, default='percentage')
second_amount = fields.Float(string='Amount', digits=0, required=True, default=100.0, help="Fixed amount will count as a debit if it is negative, as a credit if it is positive.")
second_tax_id = fields.Many2one('account.tax', string='Tax', ondelete='restrict', domain=[('type_tax_use', '=', 'purchase')])
second_analytic_account_id = fields.Many2one('account.analytic.account', string='Analytic Account', ondelete='set null', domain=[('account_type', '=', 'normal')])
second_analytic_account_id = fields.Many2one('account.analytic.account', string='Analytic Account', ondelete='set null')
@api.onchange('name')
def onchange_name(self):
@@ -157,7 +157,6 @@ var abstractReconciliation = Widget.extend(ControlPanelMixin, {
relation: "account.analytic.account",
string: _t("Analytic Acc."),
type: "many2one",
domain: [['account_type', '=', 'normal']],
},
},
};
@@ -68,7 +68,7 @@
name="Analytic Accounts"
parent="menu_finance_entries"
action="analytic.action_analytic_account_form"
id="view_account_analytic_account_list"
id="menu_action_analytic_account_tree2"
sequence="30"
groups="analytic.group_analytic_accounting"/>
<menuitem
@@ -74,7 +74,7 @@
<group>
<field domain="[('company_id', '=', parent.company_id)]" name="account_id" groups="account.group_account_user"/>
<field name="invoice_line_tax_ids" context="{'type':parent.get('type')}" domain="[('type_tax_use','!=','none'),('company_id', '=', parent.company_id)]" widget="many2many_tags" options="{'no_create': True}"/>
<field domain="[('company_id', '=', parent.company_id), ('account_type', '=', 'normal')]" name="account_analytic_id" groups="analytic.group_analytic_accounting"/>
<field domain="[('company_id', '=', parent.company_id)]" name="account_analytic_id" groups="analytic.group_analytic_accounting"/>
<field name="company_id" groups="base.group_multi_company" readonly="1"/>
</group>
</group>
@@ -108,7 +108,7 @@
<field name="name"/>
<field name="sequence"/>
<field name="account_id" groups="account.group_account_user"/>
<field name="account_analytic_id" domain="[('company_id', '=', parent.company_id), ('account_type', '=', 'normal')]" groups="analytic.group_analytic_accounting"/>
<field name="account_analytic_id" domain="[('company_id', '=', parent.company_id)]" groups="analytic.group_analytic_accounting"/>
<field name="manual"/>
<field name="amount"/>
<field name="currency_id" invisible="1"/>
@@ -265,7 +265,7 @@
<field name="account_id" groups="account.group_account_user"
domain="[('company_id', '=', parent.company_id), ('internal_type', '=', 'other')]"/>
<field name="account_analytic_id" groups="analytic.group_analytic_accounting"
domain="[('company_id', '=', parent.company_id), ('account_type', '=', 'normal')]"/>
domain="[('company_id', '=', parent.company_id)]"/>
<field name="quantity"/>
<field name="uom_id" groups="product.group_uom"/>
<field name="price_unit"/>
@@ -288,7 +288,7 @@
<field name="sequence" invisible="1"/>
<field name="manual" invisible="1"/>
<field name="account_id" groups="account.group_account_invoice"/>
<field name="account_analytic_id" domain="[('company_id', '=', parent.company_id), ('account_type', '=', 'normal')]" groups="analytic.group_analytic_accounting"/>
<field name="account_analytic_id" domain="[('company_id', '=', parent.company_id)]" groups="analytic.group_analytic_accounting"/>
<field name="amount"/>
<field name="currency_id" invisible="1"/>
</tree>
@@ -403,7 +403,7 @@
<field name="account_id" groups="account.group_account_user"
domain="[('company_id', '=', parent.company_id), ('internal_type', '=', 'other')]"/>
<field name="account_analytic_id" groups="analytic.group_analytic_accounting"
domain="[('company_id', '=', parent.company_id), ('account_type', '=', 'normal')]"/>
domain="[('company_id', '=', parent.company_id)]"/>
<field name="quantity"/>
<field name="uom_id" groups="product.group_uom"/>
<field name="price_unit"/>
+4 -4
View File
@@ -727,7 +727,7 @@
<field name="account_id" domain="[('company_id', '=', company_id)]"/>
<field name="amount_type"/>
<field name="tax_id" domain="[('company_id', '=', company_id)]" widget="selection" />
<field name="analytic_account_id" groups="analytic.group_analytic_accounting" domain="[('account_type', '=', 'normal'), ('company_id', '=', company_id)]"/>
<field name="analytic_account_id" groups="analytic.group_analytic_accounting" domain="[('company_id', '=', company_id)]"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
<group>
@@ -749,7 +749,7 @@
<field name="second_account_id" domain="[('company_id', '=', company_id)]"/>
<field name="second_amount_type"/>
<field name="second_tax_id" domain="[('company_id', '=', company_id)]" widget="selection"/>
<field name="second_analytic_account_id" groups="analytic.group_analytic_accounting" domain="[('account_type', '=', 'normal'), ('company_id', '=', company_id)]"/>
<field name="second_analytic_account_id" groups="analytic.group_analytic_accounting" domain="[('company_id', '=', company_id)]"/>
</group>
<group>
<field name="second_label"/>
@@ -1036,7 +1036,7 @@
<field name="blocked"/>
</group>
<group groups="analytic.group_analytic_accounting" string="Analytic">
<field name="analytic_account_id" domain="[('account_type','=','normal)]"/>
<field name="analytic_account_id"/>
</group>
</group>
<field name="narration" colspan="4" nolabel="1" placeholder="Add an internal note..."/>
@@ -1282,7 +1282,7 @@
domain="['|', ('parent_id', '=', False), ('is_company', '=', True)]"/>
<field name="account_id" domain="[('company_id', '=', parent.company_id), ('deprecated', '=', False)]"/>
<field name="name"/>
<field name="analytic_account_id" groups="analytic.group_analytic_accounting" domain="[('account_type', '=', 'normal')]"/>
<field name="analytic_account_id" groups="analytic.group_analytic_accounting"/>
<field name="amount_currency" groups="base.group_multi_currency"/>
<field name="company_currency_id" invisible="1"/>
<field name="currency_id" options="{'no_create': True}" groups="base.group_multi_currency"/>
+1 -1
View File
@@ -70,7 +70,7 @@ class AccountMoveLineReconcileWriteoff(models.TransientModel):
writeoff_acc_id = fields.Many2one('account.account', string='Write-Off account', required=True, domain=[('deprecated', '=', False)])
date_p = fields.Date(string='Date', default=fields.Date.context_today)
comment = fields.Char(required=True, default='Write-off')
analytic_id = fields.Many2one('account.analytic.account', string='Analytic Account', domain=[('account_type', '=', 'normal')])
analytic_id = fields.Many2one('account.analytic.account', string='Analytic Account')
@api.multi
def trans_rec_addendum(self):
@@ -11,7 +11,7 @@ class AccountAnalyticDefault(models.Model):
_order = "sequence"
sequence = fields.Integer(string='Sequence', help="Gives the sequence order when displaying a list of analytic distribution")
analytic_id = fields.Many2one('account.analytic.account', string='Analytic Account', domain=[('account_type', '=', 'normal')])
analytic_id = fields.Many2one('account.analytic.account', string='Analytic Account')
product_id = fields.Many2one('product.product', string='Product', ondelete='cascade', help="Select a product which will use analytic account specified in analytic default (e.g. create new customer invoice or Sales order if we select this product, it will automatically take this as an analytic account)")
partner_id = fields.Many2one('res.partner', string='Partner', ondelete='cascade', help="Select a partner which will use analytic account specified in analytic default (e.g. create new customer invoice or Sales order if we select this partner, it will automatically take this as an analytic account)")
user_id = fields.Many2one('res.users', string='User', ondelete='cascade', help="Select a user which will use analytic account specified in analytic default.")
+1 -1
View File
@@ -14,7 +14,7 @@ class AccountAssetCategory(models.Model):
active = fields.Boolean(default=True)
name = fields.Char(required=True, index=True, string="Asset Type")
account_analytic_id = fields.Many2one('account.analytic.account', string='Analytic Account', domain=[('account_type', '=', 'normal')])
account_analytic_id = fields.Many2one('account.analytic.account', string='Analytic Account')
account_asset_id = fields.Many2one('account.account', string='Expense Account', required=True, domain=[('internal_type','=','other'), ('deprecated', '=', False)])
account_income_recognition_id = fields.Many2one('account.account', string='Recognition Income Account', domain=[('internal_type','=','other'), ('deprecated', '=', False)], oldname='account_expense_depreciation_id')
account_depreciation_id = fields.Many2one('account.account', string='Depreciation Account', required=True, domain=[('internal_type','=','other'), ('deprecated', '=', False)])
+1 -1
View File
@@ -168,7 +168,7 @@ class crossovered_budget_lines(osv.osv):
_description = "Budget Line"
_columns = {
'crossovered_budget_id': fields.many2one('crossovered.budget', 'Budget', ondelete='cascade', select=True, required=True),
'analytic_account_id': fields.many2one('account.analytic.account', 'Analytic Account', domain=[('account_type', '=', 'normal')]),
'analytic_account_id': fields.many2one('account.analytic.account', 'Analytic Account'),
'general_budget_id': fields.many2one('account.budget.post', 'Budgetary Position',required=True),
'date_from': fields.date('Start Date', required=True),
'date_to': fields.date('End Date', required=True),
@@ -86,7 +86,7 @@
<group>
<field name="account_id"/>
<field name="tax_ids" widget="many2many_tags"/>
<field name="account_analytic_id" domain="[('account_type','=','normal'), ('company_id', '=', company_id)]" groups="analytic.group_analytic_accounting"/>
<field name="account_analytic_id" domain="[('company_id', '=', company_id)]" groups="analytic.group_analytic_accounting"/>
<field name="company_id" groups="base.group_multi_company" readonly="1"/>
</group>
</group>
@@ -105,7 +105,7 @@
on_change="product_id_change(product_id, parent.partner_id, price_unit, company_id, parent.currency_id, parent.voucher_type)" />
<field name="name"/>
<field name="account_id"/>
<field name="account_analytic_id" domain="[('account_type','=','normal'), ('company_id', '=', company_id)]" groups="analytic.group_analytic_accounting"/>
<field name="account_analytic_id" domain="[('company_id', '=', company_id)]" groups="analytic.group_analytic_accounting"/>
<field name="quantity"/>
<field name="price_unit"/>
<field name="tax_ids" widget="many2many_tags"/>
@@ -85,7 +85,7 @@
on_change="product_id_change(product_id, parent.partner_id, price_unit, company_id, parent.currency_id, parent.voucher_type)" />
<field name="name"/>
<field name="account_id"/>
<field name="account_analytic_id" domain="[('account_type','=','normal'), ('company_id', '=', parent.company_id)]" groups="analytic.group_analytic_accounting"/>
<field name="account_analytic_id" domain="[('company_id', '=', parent.company_id)]" groups="analytic.group_analytic_accounting"/>
<field name="quantity"/>
<field name="price_unit"/>
<field name="tax_ids" widget="many2many_tags" domain="[('type_tax_use','=','sale')]"/>
@@ -201,7 +201,7 @@
on_change="product_id_change(product_id, parent.partner_id, price_unit, company_id, parent.currency_id, parent.voucher_type)" />
<field name="name"/>
<field name="account_id"/>
<field name="account_analytic_id" domain="[('account_type','=','normal'), ('company_id', '=', parent.company_id)]" groups="analytic.group_analytic_accounting"/>
<field name="account_analytic_id" domain="[('company_id', '=', parent.company_id)]" groups="analytic.group_analytic_accounting"/>
<field name="quantity"/>
<field name="price_unit"/>
<field name="tax_ids" widget="many2many_tags" domain="[('type_tax_use','=','purchase')]"/>
@@ -14,74 +14,60 @@
</record>
<record id="analytic_seagate_p2" model="account.analytic.account">
<field name="name">Seagate P2</field>
<field name="account_type">normal</field>
<field name="partner_id" ref="base.res_partner_2"/>
<field name="tag_ids" eval="[(6,0, (ref('analytic.tag_contract'),))]"/>
</record>
<record id="analytic_millennium_industries" model="account.analytic.account">
<field name="name">Millennium Industries</field>
<field name="account_type">normal</field>
<field name="partner_id" ref="base.res_partner_3"/>
<field name="tag_ids" eval="[(6,0, (ref('analytic.tag_contract'),))]"/>
</record>
<record id="analytic_integration_c2c" model="account.analytic.account">
<field name="name">CampToCamp</field>
<field name="account_type">normal</field>
<field name="partner_id" ref="base.res_partner_12"/>
<field name="tag_ids" eval="[(6,0, (ref('analytic.tag_contract'),))]"/>
</record>
<record id="analytic_agrolait" model="account.analytic.account">
<field name="name">Agrolait</field>
<field name="account_type">normal</field>
<field name="partner_id" ref="base.res_partner_2"/>
</record>
<record id="analytic_asustek" model="account.analytic.account">
<field name="name">Asustek</field>
<field name="account_type">normal</field>
<field name="partner_id" ref="base.res_partner_1"/>
</record>
<record id="analytic_deltapc" model="account.analytic.account">
<field name="name">Delta PC</field>
<field name="account_type">normal</field>
<field name="partner_id" ref="base.res_partner_4"/>
</record>
<record id="analytic_spark" model="account.analytic.account">
<field name="name">Spark Systems</field>
<field name="account_type">normal</field>
<field name="partner_id" ref="base.res_partner_1"/>
</record>
<record id="analytic_nebula" model="account.analytic.account">
<field name="name">Nebula</field>
<field name="account_type">normal</field>
<field name="partner_id" ref="base.res_partner_12"/>
</record>
<record id="analytic_luminous_technologies" model="account.analytic.account">
<field name="name">Luminous Technologies</field>
<field name="account_type">normal</field>
<field name="partner_id" ref="base.res_partner_3"/>
</record>
<record id="analytic_desertic_hispafuentes" model="account.analytic.account">
<field name="name">Desertic - Hispafuentes</field>
<field name="account_type">normal</field>
<field name="partner_id" ref="base.res_partner_12"/>
</record>
<record id="analytic_think_big_systems" model="account.analytic.account">
<field name="name">Think Big Systems</field>
<field name="account_type">normal</field>
<field name="partner_id" ref="base.res_partner_18"/>
</record>
<record id="analytic_partners_camp_to_camp" model="account.analytic.account">
<field name="name">Camp to Camp</field>
<field name="account_type">normal</field>
<field name="partner_id" ref="base.res_partner_12"/>
</record>
<record id="analytic_administratif" model="account.analytic.account">
<field name="name">Administrative</field>
<field name="account_type">normal</field>
</record>
<record id="analytic_commercial_marketing" model="account.analytic.account">
<field name="name">Commercial &amp; Marketing</field>
<field name="account_type">normal</field>
</record>
</data>
</openerp>
+1 -4
View File
@@ -44,10 +44,7 @@ class account_analytic_account(models.Model):
name = fields.Char(string='Analytic Account', index=True, required=True, track_visibility='onchange')
code = fields.Char(string='Reference', index=True, track_visibility='onchange')
# FIXME: we reused account_type to implement the closed accounts (feature removed by mistake on release of v9) without modifying the schemas on already released v9, but it would be more clean to rename it
account_type = fields.Selection([
('normal', 'Active'),
('closed', 'Archived')
], string='State', required=True, default='normal')
active = fields.Boolean('Active', help="If the active field is set to False, it will allow you to hide the account without removing it.", default=True)
tag_ids = fields.Many2many('account.analytic.tag', 'account_analytic_account_tag_rel', 'account_id', 'tag_id', string='Tags', copy=True)
line_ids = fields.One2many('account.analytic.line', 'account_id', string="Analytic Lines")
+7 -4
View File
@@ -76,6 +76,10 @@
<form string="Analytic Account">
<sheet string="Analytic Account">
<div class="oe_button_box" name="button_box">
<button class="oe_stat_button" type="object" name="toggle_active" icon="fa-archive">
<field name="active" widget="boolean_button"
options='{"terminology": "archive"}'/>
</button>
<button class="oe_stat_button" type="action" name="%(account_analytic_line_action)d"
icon="fa-usd" string="Cost/Revenue" widget="statinfo"/>
</div>
@@ -93,7 +97,6 @@
</group>
<group>
<field name="tag_ids" widget="many2many_tags"/>
<field name="account_type"/>
<field name="company_id" options="{'no_create': True}" groups="base.group_multi_company"/>
<field name="currency_id" options="{'no_create': True}" groups="base.group_multi_currency"/>
</group>
@@ -118,7 +121,7 @@
<field name="display_name"/>
<field name="code"/>
<field name="partner_id"/>
<field name="account_type" invisible="1"/>
<field name="active" invisible="1"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="debit"/>
<field name="credit"/>
@@ -135,7 +138,7 @@
<field name="name" filter_domain="['|', ('name','ilike',self), ('code','ilike',self)]" string="Analytic Account"/>
<field name="tag_ids"/>
<field name="partner_id"/>
<filter string="Active" domain="[('account_type','=','normal')]" name="active"/>
<filter string="Archived" domain="[('active', '=', False)]" name="inactive"/>
<group expand="0" string="Group By...">
<filter string="Associated Partner" domain="[]" context="{'group_by':'partner_id'}"/>
</group>
@@ -179,7 +182,7 @@
<group>
<group>
<field name="name"/>
<field name="account_id" domain="[('account_type', '=', 'normal')]"/>
<field name="account_id"/>
<field name="date"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
+1 -1
View File
@@ -26,7 +26,7 @@ class HrExpense(models.Model):
total_amount = fields.Float(string='Total', store=True, compute='_compute_amount', digits=dp.get_precision('Account'))
company_id = fields.Many2one('res.company', string='Company', readonly=True, states={'draft': [('readonly', False)]}, default=lambda self: self.env.user.company_id)
currency_id = fields.Many2one('res.currency', string='Currency', readonly=True, states={'draft': [('readonly', False)]}, default=lambda self: self.env.user.company_id.currency_id)
analytic_account_id = fields.Many2one('account.analytic.account', string='Analytic Account', states={'post': [('readonly', True)], 'done': [('readonly', True)]}, oldname='analytic_account', domain=[('account_type', '=', 'normal')])
analytic_account_id = fields.Many2one('account.analytic.account', string='Analytic Account', states={'post': [('readonly', True)], 'done': [('readonly', True)]}, oldname='analytic_account')
account_id = fields.Many2one('account.account', string='Account', states={'post': [('readonly', True)], 'done': [('readonly', True)]}, default=lambda self: self.env['ir.property'].get('property_account_expense_categ_id', 'product.category'))
department_id = fields.Many2one('hr.department', string='Department', states={'post': [('readonly', True)], 'done': [('readonly', True)]})
description = fields.Text()
@@ -180,7 +180,7 @@ class hr_payslip(osv.osv):
class hr_salary_rule(osv.osv):
_inherit = 'hr.salary.rule'
_columns = {
'analytic_account_id':fields.many2one('account.analytic.account', 'Analytic Account', domain=[('account_type', '=', 'normal')]),
'analytic_account_id':fields.many2one('account.analytic.account', 'Analytic Account'),
'account_tax_id':fields.many2one('account.tax', 'Tax'),
'account_debit': fields.many2one('account.account', 'Debit Account', domain=[('deprecated', '=', False)]),
'account_credit': fields.many2one('account.account', 'Credit Account', domain=[('deprecated', '=', False)]),
@@ -191,7 +191,7 @@ class hr_contract(osv.osv):
_inherit = 'hr.contract'
_description = 'Employee Contract'
_columns = {
'analytic_account_id':fields.many2one('account.analytic.account', 'Analytic Account', domain=[('account_type', '=', 'normal')]),
'analytic_account_id':fields.many2one('account.analytic.account', 'Analytic Account'),
'journal_id': fields.many2one('account.journal', 'Salary Journal'),
}
+2 -2
View File
@@ -59,10 +59,10 @@ class mrp_workcenter(osv.osv):
'time_stop': fields.float('Time after prod.', help="Time in hours for the cleaning."),
'costs_hour': fields.float('Cost per hour', help="Specify Cost of Work Center per hour."),
'costs_hour_account_id': fields.many2one('account.analytic.account', 'Hour Account',
help="Fill this only if you want automatic analytic accounting entries on production orders.", domain=[('account_type', '=', 'normal')]),
help="Fill this only if you want automatic analytic accounting entries on production orders."),
'costs_cycle': fields.float('Cost per cycle', help="Specify Cost of Work Center per cycle."),
'costs_cycle_account_id': fields.many2one('account.analytic.account', 'Cycle Account',
help="Fill this only if you want automatic analytic accounting entries on production orders.", domain=[('account_type', '=', 'normal')]),
help="Fill this only if you want automatic analytic accounting entries on production orders."),
'costs_general_account_id': fields.many2one('account.account', 'General Account', domain=[('deprecated', '=', False)]),
'resource_id': fields.many2one('resource.resource','Resource', ondelete='cascade', required=True),
'product_id': fields.many2one('product.product','Work Center Product', help="Fill this product to easily track your production costs in the analytic accounting."),
+1 -1
View File
@@ -511,7 +511,7 @@ class PurchaseOrderLine(models.Model):
price_tax = fields.Monetary(compute='_compute_amount', string='Tax', store=True)
order_id = fields.Many2one('purchase.order', string='Order Reference', select=True, required=True, ondelete='cascade')
account_analytic_id = fields.Many2one('account.analytic.account', string='Analytic Account', domain=[('account_type', '=', 'normal')])
account_analytic_id = fields.Many2one('account.analytic.account', string='Analytic Account')
company_id = fields.Many2one('res.company', related='order_id.company_id', string='Company', store=True, readonly=True)
state = fields.Selection(related='order_id.state', stored=True)
@@ -41,7 +41,7 @@ class purchase_requisition(osv.osv):
'Status', track_visibility='onchange', required=True,
copy=False),
'multiple_rfq_per_supplier': fields.boolean('Multiple RFQ per vendor'),
'account_analytic_id': fields.many2one('account.analytic.account', 'Analytic Account', domain=[('account_type', '=', 'normal')]),
'account_analytic_id': fields.many2one('account.analytic.account', 'Analytic Account'),
'picking_type_id': fields.many2one('stock.picking.type', 'Picking Type', required=True),
}
@@ -314,7 +314,7 @@ class purchase_requisition_line(osv.osv):
'product_qty': fields.float('Quantity', digits_compute=dp.get_precision('Product Unit of Measure')),
'requisition_id': fields.many2one('purchase.requisition', 'Call for Tenders', ondelete='cascade'),
'company_id': fields.related('requisition_id', 'company_id', type='many2one', relation='res.company', string='Company', store=True, readonly=True),
'account_analytic_id': fields.many2one('account.analytic.account', 'Analytic Account', domain=[('account_type', '=', 'normal')]),
'account_analytic_id': fields.many2one('account.analytic.account', 'Analytic Account'),
'schedule_date': fields.date('Scheduled Date'),
}
+1 -1
View File
@@ -115,7 +115,7 @@ class SaleOrder(models.Model):
pricelist_id = fields.Many2one('product.pricelist', string='Pricelist', required=True, readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Pricelist for current sales order.")
currency_id = fields.Many2one("res.currency", related='pricelist_id.currency_id', string="Currency", readonly=True, required=True)
project_id = fields.Many2one('account.analytic.account', 'Analytic Account', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="The analytic account related to a sales order.", copy=False, domain=[('account_type', '=', 'normal')])
project_id = fields.Many2one('account.analytic.account', 'Analytic Account', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="The analytic account related to a sales order.", copy=False)
order_line = fields.One2many('sale.order.line', 'order_id', string='Order Lines', states={'cancel': [('readonly', True)], 'done': [('readonly', True)]}, copy=True)