2009-10-20 10:52:23 +00:00
# -*- coding: utf-8 -*-
2006-12-07 13:41:40 +00:00
##############################################################################
2010-02-09 05:43:34 +00:00
#
2009-10-14 12:32:15 +00:00
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
2008-06-16 11:00:21 +00:00
#
2008-11-03 18:27:16 +00:00
# This program is free software: you can redistribute it and/or modify
2009-10-14 12:32:15 +00:00
# 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.
2006-12-07 13:41:40 +00:00
#
2008-11-03 18:27:16 +00:00
# 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
2009-10-14 12:32:15 +00:00
# GNU Affero General Public License for more details.
2006-12-07 13:41:40 +00:00
#
2009-10-14 12:32:15 +00:00
# You should have received a copy of the GNU Affero General Public License
2010-02-09 05:43:34 +00:00
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2006-12-07 13:41:40 +00:00
#
##############################################################################
2009-12-09 10:16:28 +00:00
from osv import osv
from osv import fields
2009-01-29 22:22:23 +00:00
import os
2006-12-07 13:41:40 +00:00
import tools
2009-12-09 10:16:28 +00:00
from tools . translate import _
2010-05-03 23:49:53 +00:00
from tools . safe_eval import safe_eval as eval
2011-04-12 09:29:51 +00:00
2009-12-09 10:16:28 +00:00
class multi_company_default ( osv . osv ) :
"""
Manage multi company default value
"""
_name = ' multi_company.default '
_description = ' Default multi company '
_order = ' company_id,sequence,id '
_columns = {
' sequence ' : fields . integer ( ' Sequence ' ) ,
2009-12-09 20:27:33 +00:00
' name ' : fields . char ( ' Name ' , size = 256 , required = True , help = ' Name it to easily find a record ' ) ,
2009-12-09 10:16:28 +00:00
' company_id ' : fields . many2one ( ' res.company ' , ' Main Company ' , required = True ,
help = ' Company where the user is connected ' ) ,
' company_dest_id ' : fields . many2one ( ' res.company ' , ' Default Company ' , required = True ,
help = ' Company to store the current record ' ) ,
' object_id ' : fields . many2one ( ' ir.model ' , ' Object ' , required = True ,
2010-08-23 15:13:41 +00:00
help = ' Object affected by this rule ' ) ,
2009-12-23 13:50:03 +00:00
' expression ' : fields . char ( ' Expression ' , size = 256 , required = True ,
help = ' Expression, must be True to match \n use context.get or user (browse) ' ) ,
2009-12-17 21:37:00 +00:00
' field_id ' : fields . many2one ( ' ir.model.fields ' , ' Field ' , help = ' Select field property ' ) ,
2009-12-09 10:16:28 +00:00
}
_defaults = {
' expression ' : lambda * a : ' True ' ,
' sequence ' : lambda * a : 100 ,
}
def copy ( self , cr , uid , id , default = None , context = None ) :
"""
Add ( copy ) in the name when duplicate record
"""
if not context :
context = { }
if not default :
default = { }
company = self . browse ( cr , uid , id , context = context )
default = default . copy ( )
default [ ' name ' ] = company . name + _ ( ' (copy) ' )
return super ( multi_company_default , self ) . copy ( cr , uid , id , default , context = context )
multi_company_default ( )
2006-12-07 13:41:40 +00:00
class res_company ( osv . osv ) :
2008-07-22 14:24:36 +00:00
_name = " res.company "
2009-12-09 11:30:34 +00:00
_description = ' Companies '
2010-12-10 22:42:58 +00:00
_order = ' name '
2011-05-12 13:40:15 +00:00
2011-07-04 10:21:15 +00:00
def _get_address_data ( self , cr , uid , ids , field_names , arg , context = None ) :
2011-07-06 15:40:01 +00:00
""" Read the ' address ' functional fields. """
2011-05-12 13:40:15 +00:00
result = { }
2011-07-01 13:06:30 +00:00
part_obj = self . pool . get ( ' res.partner ' )
address_obj = self . pool . get ( ' res.partner.address ' )
2011-05-12 13:40:15 +00:00
for company in self . browse ( cr , uid , ids , context = context ) :
2011-07-04 10:21:15 +00:00
result [ company . id ] = { } . fromkeys ( field_names , False )
2011-05-13 07:05:21 +00:00
if company . partner_id :
address_data = part_obj . address_get ( cr , uid , [ company . partner_id . id ] , adr_pref = [ ' default ' ] )
if address_data [ ' default ' ] :
2011-07-04 10:21:15 +00:00
address = address_obj . read ( cr , uid , address_data [ ' default ' ] , field_names , context = context )
for field in field_names :
2011-05-13 07:05:21 +00:00
result [ company . id ] [ field ] = address [ field ] or False
2011-05-12 13:40:15 +00:00
return result
def _set_address_data ( self , cr , uid , company_id , name , value , arg , context = None ) :
2011-07-06 15:40:01 +00:00
""" Write the ' address ' functional fields. """
2011-05-12 13:40:15 +00:00
company = self . browse ( cr , uid , company_id , context = context )
2011-05-13 07:05:21 +00:00
if company . partner_id :
part_obj = self . pool . get ( ' res.partner ' )
address_obj = self . pool . get ( ' res.partner.address ' )
address_data = part_obj . address_get ( cr , uid , [ company . partner_id . id ] , adr_pref = [ ' default ' ] )
address = address_data [ ' default ' ]
if address :
address_obj . write ( cr , uid , [ address ] , { name : value or False } )
else :
address_obj . create ( cr , uid , { name : value or False , ' partner_id ' : company . partner_id . id } , context = context )
2011-05-12 13:40:15 +00:00
return True
2011-08-24 23:48:29 +00:00
def _get_bank_data ( self , cr , uid , ids , field_names , arg , context = None ) :
""" Read the ' address ' functional fields. """
result = { }
for company in self . browse ( cr , uid , ids , context = context ) :
r = [ ]
for bank in company . bank_ids :
if bank . footer :
r . append ( bank . name_get ( context = context ) [ 0 ] [ 1 ] )
result [ company . id ] = ' | ' . join ( r )
return result
2011-08-15 15:28:25 +00:00
2008-07-22 14:24:36 +00:00
_columns = {
' name ' : fields . char ( ' Company Name ' , size = 64 , required = True ) ,
' parent_id ' : fields . many2one ( ' res.company ' , ' Parent Company ' , select = True ) ,
2009-01-26 17:40:29 +00:00
' child_ids ' : fields . one2many ( ' res.company ' , ' parent_id ' , ' Child Companies ' ) ,
2008-07-22 14:24:36 +00:00
' partner_id ' : fields . many2one ( ' res.partner ' , ' Partner ' , required = True ) ,
2011-08-15 15:28:25 +00:00
' rml_header1 ' : fields . char ( ' Report Header / Company Slogan ' , size = 200 ) ,
' rml_footer1 ' : fields . char ( ' General Information Footer ' , size = 200 ) ,
2011-08-15 14:16:43 +00:00
' rml_footer2 ' : fields . function ( _get_bank_data , type = " char " , string = ' Bank Accounts Footer ' , size = 250 , help = " This field is computed automatically based on bank accounts defined, having the display on footer checkbox set. " ) ,
2011-07-06 15:40:01 +00:00
' rml_header ' : fields . text ( ' RML Header ' , required = True ) ,
' rml_header2 ' : fields . text ( ' RML Internal Header ' , required = True ) ,
' rml_header3 ' : fields . text ( ' RML Internal Header ' , required = True ) ,
' logo ' : fields . binary ( ' Logo ' ) ,
2008-07-22 14:24:36 +00:00
' currency_id ' : fields . many2one ( ' res.currency ' , ' Currency ' , required = True ) ,
2009-12-09 11:18:34 +00:00
' currency_ids ' : fields . one2many ( ' res.currency ' , ' company_id ' , ' Currency ' ) ,
2010-05-13 11:50:29 +00:00
' user_ids ' : fields . many2many ( ' res.users ' , ' res_company_users_rel ' , ' cid ' , ' user_id ' , ' Accepted Users ' ) ,
' account_no ' : fields . char ( ' Account No. ' , size = 64 ) ,
2011-07-06 15:40:01 +00:00
' street ' : fields . function ( _get_address_data , fnct_inv = _set_address_data , size = 128 , type = ' char ' , string = " Street " , multi = ' address ' ) ,
' street2 ' : fields . function ( _get_address_data , fnct_inv = _set_address_data , size = 128 , type = ' char ' , string = " Street2 " , multi = ' address ' ) ,
' zip ' : fields . function ( _get_address_data , fnct_inv = _set_address_data , size = 24 , type = ' char ' , string = " Zip " , multi = ' address ' ) ,
' city ' : fields . function ( _get_address_data , fnct_inv = _set_address_data , size = 24 , type = ' char ' , string = " City " , multi = ' address ' ) ,
' state_id ' : fields . function ( _get_address_data , fnct_inv = _set_address_data , type = ' many2one ' , domain = " [( ' country_id ' , ' = ' , country_id)] " , relation = ' res.country.state ' , string = " State " , multi = ' address ' ) ,
2011-08-15 14:16:43 +00:00
' bank_ids ' : fields . one2many ( ' res.partner.bank ' , ' company_id ' , ' Bank Accounts ' , help = ' Bank accounts related to this company ' ) ,
2011-07-06 15:40:01 +00:00
' country_id ' : fields . function ( _get_address_data , fnct_inv = _set_address_data , type = ' many2one ' , relation = ' res.country ' , string = " Country " , multi = ' address ' ) ,
' email ' : fields . function ( _get_address_data , fnct_inv = _set_address_data , size = 64 , type = ' char ' , string = " Email " , multi = ' address ' ) ,
' phone ' : fields . function ( _get_address_data , fnct_inv = _set_address_data , size = 64 , type = ' char ' , string = " Phone " , multi = ' address ' ) ,
2011-08-15 15:28:25 +00:00
' fax ' : fields . function ( _get_address_data , fnct_inv = _set_address_data , size = 64 , type = ' char ' , string = " Fax " , multi = ' address ' ) ,
' website ' : fields . related ( ' partner_id ' , ' website ' , string = " Website " , type = " char " , size = 64 ) ,
' vat ' : fields . related ( ' partner_id ' , ' vat ' , string = " Tax ID " , type = " char " , size = 32 ) ,
2011-08-18 08:54:34 +00:00
' company_registry ' : fields . char ( ' Company Registry ' , size = 64 ) ,
2010-02-09 05:43:34 +00:00
}
2011-07-26 13:21:37 +00:00
_sql_constraints = [
2011-09-19 14:48:21 +00:00
( ' name_uniq ' , ' unique (name) ' , ' The company name must be unique ! ' )
2011-07-26 13:21:37 +00:00
]
2010-02-09 05:43:34 +00:00
2010-10-29 01:01:37 +00:00
def _search ( self , cr , uid , args , offset = 0 , limit = None , order = None ,
context = None , count = False , access_rights_uid = None ) :
2010-05-04 10:59:58 +00:00
2010-06-04 00:39:40 +00:00
if context is None :
context = { }
user_preference = context . get ( ' user_preference ' , False )
2010-05-04 10:59:58 +00:00
if user_preference :
2011-03-03 10:52:39 +00:00
# We browse as superuser. Otherwise, the user would be able to
# select only the currently visible companies (according to rules,
# which are probably to allow to see the child companies) even if
# she belongs to some other companies.
user = self . pool . get ( ' res.users ' ) . browse ( cr , 1 , uid , context = context )
2010-06-04 00:39:40 +00:00
cmp_ids = list ( set ( [ user . company_id . id ] + [ cmp . id for cmp in user . company_ids ] ) )
2010-05-04 10:59:58 +00:00
return cmp_ids
2010-10-29 01:01:37 +00:00
return super ( res_company , self ) . _search ( cr , uid , args , offset = offset , limit = limit , order = order ,
context = context , count = count , access_rights_uid = access_rights_uid )
2009-12-09 10:16:28 +00:00
2009-12-17 21:37:00 +00:00
def _company_default_get ( self , cr , uid , object = False , field = False , context = None ) :
2009-12-09 10:16:28 +00:00
"""
Check if the object for this company have a default value
"""
if not context :
context = { }
proxy = self . pool . get ( ' multi_company.default ' )
2009-12-17 21:37:00 +00:00
args = [
( ' object_id.model ' , ' = ' , object ) ,
2010-05-04 14:46:42 +00:00
( ' field_id ' , ' = ' , field ) ,
2009-12-17 21:37:00 +00:00
]
2010-05-04 14:46:42 +00:00
2009-12-23 17:18:19 +00:00
ids = proxy . search ( cr , uid , args , context = context )
2010-07-12 15:04:34 +00:00
user = self . pool . get ( ' res.users ' ) . browse ( cr , uid , uid , context = context )
2009-12-09 10:16:28 +00:00
for rule in proxy . browse ( cr , uid , ids , context ) :
if eval ( rule . expression , { ' context ' : context , ' user ' : user } ) :
return rule . company_dest_id . id
2010-07-12 15:04:34 +00:00
return user . company_id . id
2009-12-09 10:16:28 +00:00
2011-06-08 03:03:30 +00:00
@tools.ormcache ( )
2008-07-22 14:24:36 +00:00
def _get_company_children ( self , cr , uid = None , company = None ) :
if not company :
return [ ]
ids = self . search ( cr , uid , [ ( ' parent_id ' , ' child_of ' , [ company ] ) ] )
return ids
2011-04-19 06:53:02 +00:00
2008-07-22 14:24:36 +00:00
def _get_partner_hierarchy ( self , cr , uid , company_id , context = { } ) :
if company_id :
parent_id = self . browse ( cr , uid , company_id ) [ ' parent_id ' ]
if parent_id :
return self . _get_partner_hierarchy ( cr , uid , parent_id . id , context )
else :
return self . _get_partner_descendance ( cr , uid , company_id , [ ] , context )
return [ ]
def _get_partner_descendance ( self , cr , uid , company_id , descendance , context = { } ) :
descendance . append ( self . browse ( cr , uid , company_id ) . partner_id . id )
for child_id in self . _get_company_children ( cr , uid , company_id ) :
if child_id != company_id :
descendance = self . _get_partner_descendance ( cr , uid , child_id , descendance )
return descendance
#
# This function restart the cache on the _get_company_children method
#
2009-01-05 21:17:46 +00:00
def cache_restart ( self , cr ) :
2011-06-08 03:03:30 +00:00
self . _get_company_children . clear_cache ( self )
2008-07-22 14:24:36 +00:00
2010-08-23 15:13:41 +00:00
def create ( self , cr , uid , vals , context = None ) :
if not vals . get ( ' name ' , False ) or vals . get ( ' partner_id ' , False ) :
self . cache_restart ( cr )
return super ( res_company , self ) . create ( cr , uid , vals , context = context )
obj_partner = self . pool . get ( ' res.partner ' )
partner_id = obj_partner . create ( cr , uid , { ' name ' : vals [ ' name ' ] } , context = context )
vals . update ( { ' partner_id ' : partner_id } )
2009-01-05 21:17:46 +00:00
self . cache_restart ( cr )
2010-08-23 15:13:41 +00:00
company_id = super ( res_company , self ) . create ( cr , uid , vals , context = context )
obj_partner . write ( cr , uid , partner_id , { ' company_id ' : company_id } , context = context )
return company_id
2008-07-22 14:24:36 +00:00
2009-01-05 21:17:46 +00:00
def write ( self , cr , * args , * * argv ) :
self . cache_restart ( cr )
return super ( res_company , self ) . write ( cr , * args , * * argv )
2008-07-22 14:24:36 +00:00
2011-08-24 23:48:29 +00:00
def generate_header ( self , cr , uid , ids , context = None ) :
for c in self . browse ( cr , uid , ids , context = context ) :
val = [ ]
if c . phone : val . append ( _ ( ' Phone: ' ) + c . phone )
if c . fax : val . append ( _ ( ' Fax: ' ) + c . fax )
if c . website : val . append ( _ ( ' Website: ' ) + c . website )
if c . vat : val . append ( _ ( ' VAT: ' ) + c . vat )
if c . company_registry : val . append ( _ ( ' Reg: ' ) + c . company_registry )
self . write ( cr , uid , [ c . id ] , { ' rml_footer1 ' : ' | ' . join ( val ) } , context )
2008-07-22 14:24:36 +00:00
def _get_euro ( self , cr , uid , context = { } ) :
try :
2008-08-16 16:30:06 +00:00
return self . pool . get ( ' res.currency ' ) . search ( cr , uid , [ ] ) [ 0 ]
2008-07-22 14:24:36 +00:00
except :
2008-08-16 16:30:06 +00:00
return False
2009-12-09 10:16:28 +00:00
2010-05-13 11:50:29 +00:00
def _get_logo ( self , cr , uid , ids ) :
2010-05-19 11:36:21 +00:00
return open ( os . path . join (
2011-08-15 15:28:25 +00:00
tools . config [ ' root_path ' ] , ' .. ' , ' pixmaps ' , ' your_logo.png ' ) ,
2010-05-19 11:36:21 +00:00
' rb ' ) . read ( ) . encode ( ' base64 ' )
2010-05-13 11:50:29 +00:00
2011-06-06 09:43:38 +00:00
_header = """
2010-08-24 12:46:39 +00:00
< header >
< pageTemplate >
2011-06-06 09:43:38 +00:00
< frame id = " first " x1 = " 28.0 " y1 = " 28.0 " width = " %s " height = " %s " / >
2010-08-24 12:46:39 +00:00
< pageGraphics >
< fill color = " black " / >
< stroke color = " black " / >
< setFont name = " DejaVu Sans " size = " 8 " / >
2011-06-06 09:43:38 +00:00
< drawString x = " %s " y = " %s " > [ [ formatLang ( time . strftime ( " %% Y- %% m- %% d " ) , date = True ) ] ] [ [ time . strftime ( " %% H: %% M " ) ] ] < / drawString >
2010-08-24 12:46:39 +00:00
< setFont name = " DejaVu Sans Bold " size = " 10 " / >
2011-06-06 09:43:38 +00:00
< drawCentredString x = " %s " y = " %s " > [ [ company . partner_id . name ] ] < / drawCentredString >
2010-08-24 12:46:39 +00:00
< stroke color = " #000000 " / >
2011-06-06 09:43:38 +00:00
< lines > % s < / lines >
2010-08-24 12:46:39 +00:00
< / pageGraphics >
2011-06-06 09:43:38 +00:00
< / pageTemplate >
2008-07-01 04:05:21 +00:00
< / header > """
2011-06-06 09:43:38 +00:00
_header2 = _header % ( 539 , 772 , " 1.0cm " , " 28.3cm " , " 11.1cm " , " 28.3cm " , " 1.0cm 28.1cm 20.1cm 28.1cm " )
_header3 = _header % ( 786 , 525 , 25 , 555 , 440 , 555 , " 25 550 818 550 " )
2008-07-22 14:24:36 +00:00
def _get_header ( self , cr , uid , ids ) :
try :
2011-01-04 10:13:35 +00:00
header_file = tools . file_open ( os . path . join ( ' base ' , ' report ' , ' corporate_rml_header.rml ' ) )
try :
return header_file . read ( )
finally :
header_file . close ( )
2008-07-22 14:24:36 +00:00
except :
return """
< header >
< pageTemplate >
< frame id = " first " x1 = " 1.3cm " y1 = " 2.5cm " height = " 23.0cm " width = " 19cm " / >
< pageGraphics >
< ! - - You Logo - Change X , Y , Width and Height - - >
2010-04-06 09:33:56 +00:00
< image x = " 1.3cm " y = " 27.6cm " height = " 40.0 " > [ [ company . logo or removeParentNode ( ' image ' ) ] ] < / image >
2009-04-20 13:50:50 +00:00
< setFont name = " DejaVu Sans " size = " 8 " / >
2008-07-22 14:24:36 +00:00
< fill color = " black " / >
< stroke color = " black " / >
< lines > 1.3 cm 27.7 cm 20 cm 27.7 cm < / lines >
< drawRightString x = " 20cm " y = " 27.8cm " > [ [ company . rml_header1 ] ] < / drawRightString >
< drawString x = " 1.3cm " y = " 27.2cm " > [ [ company . partner_id . name ] ] < / drawString >
2008-12-18 06:45:17 +00:00
< drawString x = " 1.3cm " y = " 26.8cm " > [ [ company . partner_id . address and company . partner_id . address [ 0 ] . street or ' ' ] ] < / drawString >
< drawString x = " 1.3cm " y = " 26.4cm " > [ [ company . partner_id . address and company . partner_id . address [ 0 ] . zip or ' ' ] ] [ [ company . partner_id . address and company . partner_id . address [ 0 ] . city or ' ' ] ] - [ [ company . partner_id . address and company . partner_id . address [ 0 ] . country_id and company . partner_id . address [ 0 ] . country_id . name or ' ' ] ] < / drawString >
2008-07-22 14:24:36 +00:00
< drawString x = " 1.3cm " y = " 26.0cm " > Phone : < / drawString >
2008-12-18 06:45:17 +00:00
< drawRightString x = " 7cm " y = " 26.0cm " > [ [ company . partner_id . address and company . partner_id . address [ 0 ] . phone or ' ' ] ] < / drawRightString >
2008-07-22 14:24:36 +00:00
< drawString x = " 1.3cm " y = " 25.6cm " > Mail : < / drawString >
2008-12-18 06:45:17 +00:00
< drawRightString x = " 7cm " y = " 25.6cm " > [ [ company . partner_id . address and company . partner_id . address [ 0 ] . email or ' ' ] ] < / drawRightString >
2008-07-22 14:24:36 +00:00
< lines > 1.3 cm 25.5 cm 7 cm 25.5 cm < / lines >
< ! - - page bottom - - >
< lines > 1.2 cm 2.15 cm 19.9 cm 2.15 cm < / lines >
< drawCentredString x = " 10.5cm " y = " 1.7cm " > [ [ company . rml_footer1 ] ] < / drawCentredString >
< drawCentredString x = " 10.5cm " y = " 1.25cm " > [ [ company . rml_footer2 ] ] < / drawCentredString >
< drawCentredString x = " 10.5cm " y = " 0.8cm " > Contact : [ [ user . name ] ] - Page : < pageNumber / > < / drawCentredString >
< / pageGraphics >
< / pageTemplate >
2008-04-21 13:04:49 +00:00
< / header > """
2008-07-22 14:24:36 +00:00
_defaults = {
' currency_id ' : _get_euro ,
' rml_header ' : _get_header ,
2011-06-06 09:43:38 +00:00
' rml_header2 ' : _header2 ,
' rml_header3 ' : _header3 ,
2011-08-15 15:28:25 +00:00
' logo ' : _get_logo
2008-07-22 14:24:36 +00:00
}
_constraints = [
2010-12-09 10:57:33 +00:00
( osv . osv . _check_recursion , ' Error! You can not create recursive companies. ' , [ ' parent_id ' ] )
2008-07-22 14:24:36 +00:00
]
2007-02-22 07:35:38 +00:00
2011-04-12 09:29:51 +00:00
2006-12-07 13:41:40 +00:00
res_company ( )
2008-07-23 15:01:27 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: