MULTI_COMPANY_ACCOUNT, ACCOUNT, KERNEL, SALE, PURCHASE: add multi-company for accounting with a lot improvement

bzr revid: ced-06b4cfd8bad40aa5781f29d0f0dfa066191bbccd
This commit is contained in:
ced 2007-04-23 13:13:47 +00:00
parent 38690b0da6
commit 408b1ee9f0
14 changed files with 298 additions and 48 deletions

View File

@ -406,17 +406,10 @@ class account_fiscalyear(osv.osv):
'date_stop': fields.date('End date', required=True),
'period_ids': fields.one2many('account.period', 'fiscalyear_id', 'Periods'),
'state': fields.selection([('draft','Draft'), ('done','Done')], 'State', redonly=True),
'company_id': fields.many2one('res.company', 'Company', required=True),
}
def _default_company(self, cr, uid, context={}):
user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
if user.company_id:
return user.company_id.id
return self.pool.get('res.company').search(cr, uid, [('parent_id', '=', False)])[0]
_defaults = {
'state': lambda *a: 'draft',
'company_id': _default_company,
}
_order = "code"
def create_period3(self,cr, uid, ids, context={}):

View File

@ -17,73 +17,73 @@
Fiscal Periods
-->
<record model="account.period">
<record model="account.period" id="period_1">
<field name="name" eval="'Jan.'+time.strftime('%Y')"/>
<field name="fiscalyear_id" ref="data_fiscalyear"/>
<field name="date_start" eval="time.strftime('%Y')+'-01-01'"/>
<field name="date_stop" eval="time.strftime('%Y')+'-01-31'"/>
</record>
<record model="account.period">
<record model="account.period" id="period_2">
<field name="name" eval="'Feb.'+time.strftime('%Y')"/>
<field name="fiscalyear_id" ref="data_fiscalyear"/>
<field name="date_start" eval="time.strftime('%Y')+'-02-01'"/>
<field name="date_stop" eval="time.strftime('%Y')+'-02-28'"/>
</record>
<record model="account.period">
<record model="account.period" id="period_3">
<field name="name" eval="'Mar.'+time.strftime('%Y')"/>
<field name="fiscalyear_id" ref="data_fiscalyear"/>
<field name="date_start" eval="time.strftime('%Y')+'-03-01'"/>
<field name="date_stop" eval="time.strftime('%Y')+'-03-31'"/>
</record>
<record model="account.period">
<record model="account.period" id="period_4">
<field name="name" eval="'Apr.'+time.strftime('%Y')"/>
<field name="fiscalyear_id" ref="data_fiscalyear"/>
<field name="date_start" eval="time.strftime('%Y')+'-04-01'"/>
<field name="date_stop" eval="time.strftime('%Y')+'-04-30'"/>
</record>
<record model="account.period">
<record model="account.period" id="period_5">
<field name="name" eval="'May.'+time.strftime('%Y')"/>
<field name="fiscalyear_id" ref="data_fiscalyear"/>
<field name="date_start" eval="time.strftime('%Y')+'-05-01'"/>
<field name="date_stop" eval="time.strftime('%Y')+'-05-31'"/>
</record>
<record model="account.period">
<record model="account.period" id="period_6">
<field name="name" eval="'Jun.'+time.strftime('%Y')"/>
<field name="fiscalyear_id" ref="data_fiscalyear"/>
<field name="date_start" eval="time.strftime('%Y')+'-06-01'"/>
<field name="date_stop" eval="time.strftime('%Y')+'-06-30'"/>
</record>
<record model="account.period">
<record model="account.period" id="period_7">
<field name="name" eval="'Jul.'+time.strftime('%Y')"/>
<field name="fiscalyear_id" ref="data_fiscalyear"/>
<field name="date_start" eval="time.strftime('%Y')+'-07-01'"/>
<field name="date_stop" eval="time.strftime('%Y')+'-07-31'"/>
</record>
<record model="account.period">
<record model="account.period" id="period_8">
<field name="name" eval="'Aug.'+time.strftime('%Y')"/>
<field name="fiscalyear_id" ref="data_fiscalyear"/>
<field name="date_start" eval="time.strftime('%Y')+'-08-01'"/>
<field name="date_stop" eval="time.strftime('%Y')+'-08-31'"/>
</record>
<record model="account.period">
<record model="account.period" id="period_9">
<field name="name" eval="'Sep.'+time.strftime('%Y')"/>
<field name="fiscalyear_id" ref="data_fiscalyear"/>
<field name="date_start" eval="time.strftime('%Y')+'-09-01'"/>
<field name="date_stop" eval="time.strftime('%Y')+'-09-30'"/>
</record>
<record model="account.period">
<record model="account.period" id="period_10">
<field name="name" eval="'Oct.'+time.strftime('%Y')"/>
<field name="fiscalyear_id" ref="data_fiscalyear"/>
<field name="date_start" eval="time.strftime('%Y')+'-10-01'"/>
<field name="date_stop" eval="time.strftime('%Y')+'-10-31'"/>
</record>
<record model="account.period">
<record model="account.period" id="period_11">
<field name="name" eval="'Nov.'+time.strftime('%Y')"/>
<field name="fiscalyear_id" ref="data_fiscalyear"/>
<field name="date_start" eval="time.strftime('%Y')+'-11-01'"/>
<field name="date_stop" eval="time.strftime('%Y')+'-11-30'"/>
</record>
<record model="account.period">
<record model="account.period" id="period_12">
<field name="name" eval="'Dec.'+time.strftime('%Y')"/>
<field name="fiscalyear_id" ref="data_fiscalyear"/>
<field name="date_start" eval="time.strftime('%Y')+'-12-01'"/>
@ -95,7 +95,7 @@
<field name="code">FSB</field>
</record>
<record model="account.bank.account">
<record model="account.bank.account" id="bank_account_fs">
<field name="name">001-123456789-73</field>
<field name="journal_id" ref="bank_journal"/>
<field name="bank_id" ref="fs"/>

View File

@ -120,7 +120,7 @@
<record model="ir.ui.view" id="invoice_supplier_form">
<field name="name">account.invoice.supplier.form</field>
<field name="model">account.invoice</field>
<field name="model">account.invoice.supplier</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Supplier invoice">
@ -285,7 +285,7 @@
<record model="ir.actions.act_window" id="action_invoice_tree2">
<field name="name">account.invoice.supplier</field>
<field name="res_model">account.invoice</field>
<field name="res_model">account.invoice.supplier</field>
<field name="view_type">form</field>
<field name="view_mode">form,tree</field>
<field name="view_id" eval="invoice_supplier_form"/>

View File

@ -19,7 +19,14 @@
<field name="date_start"/>
<field name="date_stop"/>
<separator string="Periods" colspan="4"/>
<field name="period_ids" colspan="3" widget="one2many_list"/>
<field name="period_ids" colspan="3" widget="one2many_list">
<form string="Period">
<field name="name" select="1"/>
<field name="code" select="1"/>
<field name="date_start"/>
<field name="date_stop"/>
</form>
</field>
<separator string="States" colspan="4"/>
<field name="state" select="1"/>
<group col="2" colspan="2">

View File

@ -12,6 +12,7 @@
<field name="type">receivable</field>
<field name="currency_id" ref="base.EUR"/>
<field name="parent_id" eval="[(6,0,[])]"/>
<field name="company_id" ref="base.main_company"/>
</record>
<record model="account.account" id="a_pay">
<field name="name">Main Payable</field>
@ -19,6 +20,7 @@
<field name="type">payable</field>
<field name="currency_id" ref="base.EUR"/>
<field name="parent_id" eval="[(6,0,[])]"/>
<field name="company_id" ref="base.main_company"/>
</record>
<record model="account.account" id="cash">
@ -27,22 +29,25 @@
<field name="type">cash</field>
<field name="currency_id" ref="base.EUR"/>
<field name="parent_id" eval="[(6,0,[])]"/>
<field name="company_id" ref="base.main_company"/>
</record>
<record model="account.account" id="a_expense">
<field name="name">Products Purchase</field>
<field name="code">600</field>
<field name="type">expense</field>
<field name="currency_id" ref="base.EUR"/>
<field name="parent_id" eval="[(6,0,[])]"/>
</record>
<record model="account.account" id="a_sale">
<field name="name">Products Sales</field>
<field name="code">701</field>
<field name="type">income</field>
<field name="currency_id" ref="base.EUR"/>
<field name="parent_id" eval="[(6,0,[])]"/>
</record>
<record model="account.account" id="a_expense">
<field name="name">Products Purchase</field>
<field name="code">600</field>
<field name="type">expense</field>
<field name="currency_id" ref="base.EUR"/>
<field name="parent_id" eval="[(6,0,[])]"/>
<field name="company_id" ref="base.main_company"/>
</record>
<record model="account.account" id="a_sale">
<field name="name">Products Sales</field>
<field name="code">701</field>
<field name="type">income</field>
<field name="currency_id" ref="base.EUR"/>
<field name="parent_id" eval="[(6,0,[])]"/>
<field name="company_id" ref="base.main_company"/>
</record>
<record model="ir.property" id="property_account_receivable" forcecreate="True">
<field name="name">property_account_receivable</field>

View File

@ -60,8 +60,12 @@ class account_invoice(osv.osv):
def _get_journal(self, cr, uid, context):
type_inv = context.get('type', 'out_invoice')
type2journal = {'out_invoice': 'sale', 'in_invoice': 'purchase', 'out_refund': 'sale', 'in_refund': 'purchase'}
cr.execute("select id from account_journal where type=%s limit 1", (type2journal.get(type_inv, 'sale'),))
return cr.fetchone()[0]
journal_obj = self.pool.get('account.journal')
res = journal_obj.search(cr, uid, [('type', '=', type2journal.get(type_inv, 'sale'))], limit=1)
if res:
return res[0]
else:
return False
def _get_currency(self, cr, uid, context):
user = pooler.get_pool(cr.dbname).get('res.users').browse(cr, uid, [uid])[0]
@ -131,7 +135,6 @@ class account_invoice(osv.osv):
'journal_id': fields.many2one('account.journal', 'Journal', required=True, relate=True,readonly=True, states={'draft':[('readonly',False)]}),
'company_id': fields.many2one('res.company', 'Company', required=True),
'check_total': fields.float('Total', digits=(16,2)),
}
_defaults = {
'type': lambda *a: 'out_invoice',
@ -263,8 +266,6 @@ class account_invoice(osv.osv):
for inv in self.browse(cr, uid, ids):
if inv.move_id:
continue
if inv.check_total <> inv.amount_total:
raise osv.except_osv('Bad total !', 'Please verify the price of the invoice !\nThe real total does not match the computed total.')
company_currency = inv.account_id.company_id.currency_id.id
# create the analytical lines
@ -523,6 +524,24 @@ class account_invoice(osv.osv):
return True
account_invoice()
class account_invoice_supplier(osv.osv):
_name = "account.invoice.supplier"
_description = "Supplier invoice"
_inherits = {'account.invoice': 'account_invoice_id'}
_columns = {
'account_invoice_id': fields.many2one('account.invoice', 'Account invoice', required=True),
'check_total': fields.float('Total', digits=(16,2)),
}
def action_move_create(self, cr, uid, ids, context={}):
for inv in self.browse(cr, uid, ids):
if inv.move_id:
continue
if inv.check_total <> inv.amount_total:
raise osv.except_osv('Bad total !', 'Please verify the price of the invoice !\nThe real total does not match the computed total.')
return super(account_invoice_supplier, self).action_move_create(cr, uid, ids, context=context)
account_invoice_supplier()
class account_invoice_line(osv.osv):
def _amount_line(self, cr, uid, ids, prop, unknow_none,unknow_dict):
res = {}

View File

@ -0,0 +1 @@
import multi_company_account

View File

@ -0,0 +1,12 @@
{
"name" : "Multi company for accounting module",
"version" : "0.1",
"author" : "Tiny",
"depends" : ["base", "account", "multi_company"],
"category" : "Generic Modules/Accounting",
"init_xml" : [],
"demo_xml" : ["multi_company_account_demo.xml",],
"update_xml" : ["multi_company_account_data.xml", "multi_company_account_view.xml",],
"active": False,
"installable": True
}

View File

@ -0,0 +1,85 @@
##############################################################################
#
# Copyright (c) 2007 TINY SPRL. (http://tiny.be) All Rights Reserved.
# Fabien Pinckaers <fp@tiny.Be>
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
from osv import osv, fields
class account_journal(osv.osv):
_name = "account.journal"
_inherit = "account.journal"
_columns = {
'company_id': fields.many2one('res.company', 'Company', required=True),
}
_defaults = {
'company_id': lambda self,cr,uid,c: self.pool.get('res.users').browse(cr, uid, uid, c).company_id.id,
}
account_journal()
class account_analytic_journal(osv.osv):
_name = "account.analytic.journal"
_inherit = "account.analytic.journal"
_columns = {
'company_id': fields.many2one('res.company', 'Company'),
}
_defaults = {
'company_id': lambda self,cr,uid,c: self.pool.get('res.users').browse(cr, uid, uid, c).company_id.id,
}
account_analytic_journal()
class account_budget_post(osv.osv):
_name = 'account.budget.post'
_inherit = 'account.budget.post'
_columns ={
'company_id': fields.many2one('res.company', 'Company'),
}
_defaults = {
'company_id': lambda self,cr,uid,c: self.pool.get('res.users').browse(cr, uid, uid, c).company_id.id,
}
account_budget_post()
class account_period(osv.osv):
_name = 'account.period'
_inherit = 'account.period'
_columns = {
'company_id': fields.many2one('res.company', 'Company', required=True),
}
_defaults = {
'company_id': lambda self,cr,uid,c: self.pool.get('res.users').browse(cr, uid, uid, c).company_id.id,
}
account_period()
class account_fiscalyear(osv.osv):
_name = 'account.fiscalyear'
_inherit = 'account.fiscalyear'
_columns = {
'company_id': fields.many2one('res.company', 'Company', required=True),
}
_defaults = {
'company_id': lambda self,cr,uid,c: self.pool.get('res.users').browse(cr, uid, uid, c).company_id.id,
}
account_fiscalyear()

View File

@ -0,0 +1,16 @@
<?xml version="1.0"?>
<terp>
<data>
<record model="account.journal" id="account.sales_journal">
<field name="company_id" ref="base.main_company"/>
</record>
<record model="account.journal" id="account.expenses_journal">
<field name="company_id" ref="base.main_company"/>
</record>
<record model="account.journal" id="account.bank_journal">
<field name="company_id" ref="base.main_company"/>
</record>
</data>
</terp>

View File

@ -0,0 +1,45 @@
<?xml version="1.0"?>
<terp>
<data noupdate="1">
<record model="account.fiscalyear" id="account.data_fiscalyear">
<field name="company_id" ref="base.main_company"/>
</record>
<record model="account.period" id="account.period_1">
<field name="company_id" ref="base.main_company"/>
</record>
<record model="account.period" id="account.period_2">
<field name="company_id" ref="base.main_company"/>
</record>
<record model="account.period" id="account.period_3">
<field name="company_id" ref="base.main_company"/>
</record>
<record model="account.period" id="account.period_4">
<field name="company_id" ref="base.main_company"/>
</record>
<record model="account.period" id="account.period_5">
<field name="company_id" ref="base.main_company"/>
</record>
<record model="account.period" id="account.period_6">
<field name="company_id" ref="base.main_company"/>
</record>
<record model="account.period" id="account.period_7">
<field name="company_id" ref="base.main_company"/>
</record>
<record model="account.period" id="account.period_8">
<field name="company_id" ref="base.main_company"/>
</record>
<record model="account.period" id="account.period_9">
<field name="company_id" ref="base.main_company"/>
</record>
<record model="account.period" id="account.period_10">
<field name="company_id" ref="base.main_company"/>
</record>
<record model="account.period" id="account.period_11">
<field name="company_id" ref="base.main_company"/>
</record>
<record model="account.period" id="account.period_12">
<field name="company_id" ref="base.main_company"/>
</record>
</data>
</terp>

View File

@ -0,0 +1,65 @@
<terp>
<data>
<record model="ir.ui.view" id="view_account_journal_form_multi_company">
<field name="name">account.journal.form</field>
<field name="model">account.journal</field>
<field name="type">form</field>
<field name="inherit_id" ref="account.view_account_journal_form"/>
<field name="arch" type="xml">
<field name="user_id" position="after">
<field name="company_id"/>
</field>
</field>
</record>
<record model="ir.ui.view" id="view_account_analytic_journal_form_multi_company">
<field name="name">account.analytic.journal.form</field>
<field name="model">account.analytic.journal</field>
<field name="type">form</field>
<field name="inherit_id" ref="account.view_account_analytic_journal_form"/>
<field name="arch" type="xml">
<field name="active" position="after">
<field name="company_id"/>
</field>
</field>
</record>
<record model="ir.ui.view" id="view_budget_post_form_multi_company">
<field name="name">account.budget.post.form</field>
<field name="model">account.budget.post</field>
<field name="type">form</field>
<field name="inherit_id" ref="account.view_budget_post_form"/>
<field name="arch" type="xml">
<field name="sens" position="after">
<field name="company_id"/>
</field>
</field>
</record>
<record model="ir.ui.view" id="view_account_fiscalyear_form_multi_company">
<field name="name">account.fiscalyear.form</field>
<field name="model">account.fiscalyear</field>
<field name="type">form</field>
<field name="inherit_id" ref="account.view_account_fiscalyear_form"/>
<field name="arch" type="xml">
<field name="date_stop" position="after">
<field name="company_id"/>
</field>
</field>
</record>
<record model="ir.ui.view" id="view_account_period_form_multi_company">
<field name="name">account.period.form</field>
<field name="model">account.period</field>
<field name="type">form</field>
<field name="inherit_id" ref="account.view_account_period_form"/>
<field name="arch" type="xml">
<field name="date_stop" position="after">
<field name="company_id"/>
</field>
</field>
</record>
</data>
</terp>

View File

@ -187,9 +187,10 @@ class purchase_order(osv.osv):
if ol.product_id:
a = ol.product_id.product_tmpl_id.property_account_expense
if not a:
a = ol.product_id.categ_id.property_account_expense_categ[0]
else:
a = a[0]
a = ol.product_id.categ_id.property_account_expense_categ
if not a:
raise osv.except_osv('Error !', 'There is no income account define for this product: "%s" (id:%d)' % (line.product_id.name, line.product_id.id,))
a = a[0]
else:
a = self.pool.get('ir.property').get(cr, uid, 'property_account_expense_categ', 'product.category')
il.append((0, False, {

View File

@ -574,9 +574,10 @@ class sale_order_line(osv.osv):
if line.product_id:
a = line.product_id.product_tmpl_id.property_account_income
if not a:
a = line.product_id.categ_id.property_account_income_categ[0]
else:
a = a[0]
a = line.product_id.categ_id.property_account_income_categ
if not a:
raise osv.except_osv('Error !', 'There is no income account define for this product: "%s" (id:%d)' % (line.product_id.name, line.product_id.id,))
a = a[0]
else:
a = self.pool.get('ir.property').get(cr, uid, 'property_account_income_categ', 'product.category', context=context)
uosqty = _get_line_qty(line)