← Back to team overview

openerp-community-reviewer team mailing list archive

lp:~savoirfairelinux-openerp/openerp-accountedge/6.1-fix-email-addresses-notifications into lp:openerp-accountedge

 

You have been requested to review the proposed merge of lp:~savoirfairelinux-openerp/openerp-accountedge/6.1-fix-email-addresses-notifications into lp:openerp-accountedge.

For more details, see:
https://code.launchpad.net/~savoirfairelinux-openerp/openerp-accountedge/6.1-fix-email-addresses-notifications/+merge/194052



-- 
https://code.launchpad.net/~savoirfairelinux-openerp/openerp-accountedge/6.1-fix-email-addresses-notifications/+merge/194052
Your team OpenERP Community Reviewer/Maintainer is requested to review the proposed merge of lp:~savoirfairelinux-openerp/openerp-accountedge/6.1-fix-email-addresses-notifications into lp:openerp-accountedge.
=== modified file 'hr_expense_accountedge/__openerp__.py'
--- hr_expense_accountedge/__openerp__.py	2013-08-08 19:16:49 +0000
+++ hr_expense_accountedge/__openerp__.py	2013-11-18 22:10:04 +0000
@@ -19,17 +19,17 @@
 #
 ##############################################################################
 {
-    "name" : "Harmonization of expenses with AccountEdge",
-    "version" : "1.0",
-    "author" : "Savoir-faire Linux",
-    "website" : "http://www.savoirfairelinux.com";,
-    "category" : "Human Resources",
+    "name": "Harmonization of expenses with AccountEdge",
+    "version": "1.0",
+    "author": "Savoir-faire Linux",
+    "website": "http://www.savoirfairelinux.com";,
+    "category": "Human Resources",
     "description": """
         This module generates the csv reports for the exportation
         of expenses in AccountEdge.
         It also modifies the workflow of the expenses.
     """,
-    "depends" : [
+    "depends": [
         'l10n_ca',
         'hr_employee_accountedge',
         'hr_expense_line_supplier',
@@ -39,14 +39,13 @@
         'account_account_halftax',
         'account_tax_accountedge'
         ],
-    "init_xml" : [],
-    "update_xml" : [
+    "init_xml": [],
+    "update_xml": [
         'hr_expense_accountedge.xml',
         'security/ir_rule.xml',
     ],
-    "demo_xml" : [],
-    "installable" : True,
-    "certificate" : ''
+    "demo_xml": [],
+    "installable": True,
+    "certificate": ''
 }
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-

=== modified file 'hr_expense_accountedge/edi/__init__.py'
--- hr_expense_accountedge/edi/__init__.py	2013-07-16 19:21:49 +0000
+++ hr_expense_accountedge/edi/__init__.py	2013-11-18 22:10:04 +0000
@@ -18,8 +18,5 @@
 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 ##############################################################################
-
 import hr_expense_expense
-
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-

=== modified file 'hr_expense_accountedge/edi/hr_expense_expense.py'
--- hr_expense_accountedge/edi/hr_expense_expense.py	2013-07-16 19:21:49 +0000
+++ hr_expense_accountedge/edi/hr_expense_expense.py	2013-11-18 22:10:04 +0000
@@ -22,28 +22,22 @@
 from osv import fields, osv, orm
 from edi import EDIMixin
 
+
 class hr_expense_expense(osv.osv, EDIMixin):
     _inherit = 'hr.expense.expense'
 
     def _edi_get_web_url_view(self, cr, uid, ids, field_name, arg, context):
-        res  = {}
-
+        res = {}
         for id in ids:
             web_root_url = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url')
             res[id] = "%s/web/webclient/home#id=%s&view_type=page&model=hr.expense.expense" % (web_root_url, id)
-
         return res
 
     _columns = {
-        'web_url_view' : fields.function(
-            _edi_get_web_url_view,
-            string='Url of the expense view',
-            type='char',
-            size=255,
-            readonly=True),
+        'web_url_view': fields.function(_edi_get_web_url_view,
+                                        string='Url of the expense view',
+                                        type='char',
+                                        size=255,
+                                        readonly=True),
     }
-
-
-
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-

=== modified file 'hr_expense_accountedge/hr_expense_accountedge.py'
--- hr_expense_accountedge/hr_expense_accountedge.py	2013-08-12 22:45:27 +0000
+++ hr_expense_accountedge/hr_expense_accountedge.py	2013-11-18 22:10:04 +0000
@@ -29,56 +29,52 @@
 class hr_expense_expense(osv.osv):
     _inherit = 'hr.expense.expense'
 
-    def _create_csv_report(self,cr,uid,ids,context={}):
+    def _create_csv_report(self, cr, uid, ids, context={}):
         res = {}
         for id in ids:
-            this    = self.browse(cr, uid, id)
-            empl_id = self.pool.get('hr.employee').search(cr, uid, [('user_id','=', this.user_id.id)])
-            empl    = self.pool.get('hr.employee').browse(cr, uid, empl_id)[0]
+            this = self.browse(cr, uid, id)
 
-            output  = this.employee_id.name
+            output = this.employee_id.name
             output += "\r\n"
             output += "Employee\tCard ID\tDate\tVendor Invoice #\tAccount Number\tAmount\tDescription\
                         \tTax Code\tCurrency Code\tExchange Rate\r\n"
-            # Comment the previous line and uncomment the next one 
+            # Comment the previous line and uncomment the next one
             # if you want to import taxes with their amount, instead of their code
             # \tTax Code\tGST Amount\tPST/QST Amount\tCurrency Code\tExchange Rate\r\n"
 
-
             for l in this.line_ids:
-                taxes = self._compute_taxes(cr,uid,l,context)
-                #output  += u"%s\t%s\t%s\t%s\t%s\t%.2f\t%s\t%s\t%.2f\t%.2f\t%s\t%.2f\r\n" % (
-                output  += u"%s\t%s\t%s\t%s\t%s\t%.2f\t%s\t%s\t%s\t%.2f\r\n" % (
-                        this.employee_id.name,
-                        this.employee_id.supplier_id_accountedge,
-                        datetime.strptime(l.date_value,"%Y-%m-%d").strftime("%d-%m-%Y"),
-                        l.expense_id.id,
-                        l.account_id.code,
-                        taxes['amount_before_tax'],
-                        l.name,
-                        (l.tax_id.tax_code_accountedge or '000'),
-                        # Comment the previous line and uncomment the next two ones 
-                        # if you want to import taxes with their amount, instead of their code
-                        # taxes['amount_gst'],
-                        # taxes['amount_pst'],
-                        (l.expense_id.currency_id.name or 'CAD'),
-                        (float(l.expense_id.currency_id.rate) or '1.0'))
+                taxes = self._compute_taxes(cr, uid, l, context)
+                # output  += u"%s\t%s\t%s\t%s\t%s\t%.2f\t%s\t%s\t%.2f\t%.2f\t%s\t%.2f\r\n" % (
+                output += u"%s\t%s\t%s\t%s\t%s\t%.2f\t%s\t%s\t%s\t%.2f\r\n" % (
+                    this.employee_id.name,
+                    this.employee_id.supplier_id_accountedge,
+                    datetime.today().strftime("%d-%m-%Y"),
+                    l.expense_id.id,
+                    l.account_id.code,
+                    taxes['amount_before_tax'],
+                    l.name,
+                    (l.tax_id.tax_code_accountedge or '000'),
+                    # Comment the previous line and uncomment the next two ones
+                    # if you want to import taxes with their amount, instead of their code
+                    # taxes['amount_gst'],
+                    # taxes['amount_pst'],
+                    (l.expense_id.currency_id.name or 'CAD'),
+                    (float(l.expense_id.currency_id.rate) or '1.0'))
 
             byte_string = output.encode('utf-8-sig')
-            res[id]     = base64.encodestring(byte_string)
+            res[id] = base64.encodestring(byte_string)
 
-            self.write(cr, uid, ids, {'csv_file':res[id]}, context=context)
-            self._add_attachment(cr,uid,id,byte_string,context)
+            self.write(cr, uid, ids, {'csv_file': res[id]}, context=context)
+            self._add_attachment(cr, uid, id, byte_string, context)
 
         return True
 
-
-    def _compute_taxes(self,cr,uid,expense_line,context={}):
+    def _compute_taxes(self, cr, uid, expense_line, context={}):
 
         res = {
-                'amount_before_tax' : expense_line.total_amount,
-                'amount_gst'        : 0.0,    # Goods and Services Tax, federal
-                'amount_pst'        : 0.0     # Provincial Sales Tax
+            'amount_before_tax': expense_line.total_amount,
+            'amount_gst': 0.0,    # Goods and Services Tax, federal
+            'amount_pst': 0.0     # Provincial Sales Tax
         }
 
         tax = expense_line.tax_id
@@ -90,96 +86,86 @@
         if expense_line.account_id.tax_halftax:
             tax_factor = 0.5
 
-        if tax.child_ids :
-            for child_tax in tax.child_ids: # TODO: the detection of the two taxes should be more reliable
+        if tax.child_ids:
+            for child_tax in tax.child_ids:  # TODO: the detection of the two taxes should be more reliable
                 if 'TPS' in child_tax.name or 'GST' in child_tax.name:
                     res['amount_gst'] = float(child_tax.amount) * tax_factor
                 else:
                     res['amount_pst'] = float(child_tax.amount) * tax_factor
         else:
             res['amount_gst'] = float(tax.amount)
-
-
-        res['amount_before_tax']    = expense_line.total_amount / (1 + res['amount_gst'] + res['amount_pst'])
-        res['amount_gst']           = res['amount_before_tax'] * res['amount_gst']
-        res['amount_pst']           = res['amount_before_tax'] * res['amount_pst']
-
+        res['amount_before_tax'] = expense_line.total_amount / (1 + res['amount_gst'] + res['amount_pst'])
+        res['amount_gst'] = res['amount_before_tax'] * res['amount_gst']
+        res['amount_pst'] = res['amount_before_tax'] * res['amount_pst']
         return res
 
-
-
-    def _add_attachment(self,cr,uid,ids,content,context={}):
-
-        file_name   = 'export_'+time.strftime('%Y%m%d_%H%M%S')+'.tsv'
-        attach_id   = self.pool.get('ir.attachment').create(cr, uid, {
-            'name'          : file_name,
-            'datas'         : base64.encodestring(content),
-            'datas_fname'   : file_name,
-            'res_model'     : self._name,
-            'res_id'        : ids,
+    def _add_attachment(self, cr, uid, ids, content, context={}):
+
+        file_name = 'export_'+time.strftime('%Y%m%d_%H%M%S')+'.tsv'
+        self.pool.get('ir.attachment').create(cr, uid, {
+            'name': file_name,
+            'datas': base64.encodestring(content),
+            'datas_fname': file_name,
+            'res_model': self._name,
+            'res_id': ids,
             },
             context=context
         )
         return True
 
-    def action_exported(self,cr,uid,ids,*args):
+    def action_exported(self, cr, uid, ids, *args):
         if not len(ids):
             return False
 
         # Employee must have a recordID matching his supplier account
         # in Accountedge to generate an expense sheet
         for id in ids:
-            this    = self.browse(cr, uid, id)
+            this = self.browse(cr, uid, id)
             if not this.employee_id.supplier_id_accountedge:
                 raise osv.except_osv('Accountedge Supplier ID missing',
-                        'Please add the Accountedge supplier ID on the employee before exporting the sheet.')
-
-            self._create_csv_report(cr,uid,ids,{})
-            self.write(cr,uid,ids,{'state': 'exported'})
-
+                                     'Please add the Accountedge supplier ID on the employee before exporting the sheet.')
+            self._create_csv_report(cr, uid, ids, {})
+            self.write(cr, uid, ids, {'state': 'exported'})
         return True
 
-
-    def action_imported(self,cr,uid,ids,*args):
+    def action_imported(self, cr, uid, ids, *args):
         if not len(ids):
             return False
         for id in ids:
-            self.write(cr,uid,ids,{'state': 'imported'})
+            self.write(cr, uid, ids, {'state': 'imported'})
         return True
 
-
     def _get_cur_account_manager(self, cr, uid, ids, field_name, arg, context):
-        res  = {}
+        res = {}
         for id in ids:
             emails = ''
-            grp_ids = self.pool.get('res.groups').search(cr, uid, [('name','=',u'Manager'),('category_id.name','=',u'Accounting & Finance')])
-            usr_ids = self.pool.get('res.users').search(cr, uid, [('groups_id','=',grp_ids[0])])
-            usrs    = self.pool.get('res.users').browse(cr, uid, usr_ids)
+            grp_ids = self.pool.get('res.groups').search(cr, uid, [('name', '=', u'Manager'), ('category_id.name', '=', u'Accounting & Finance')])
+            usr_ids = self.pool.get('res.users').search(cr, uid, [('groups_id', '=', grp_ids[0])])
+            usrs = self.pool.get('res.users').browse(cr, uid, usr_ids)
 
             for user in usrs:
                 if user.user_email:
                     emails += user.user_email
                     emails += ','
                 else:
-                    empl_id = self.pool.get('hr.employee').search(cr, uid,[('login','=',user.login)])[0]
-                    empl    = self.pool.get('hr.employee').browse(cr, uid, empl_id)
+                    empl_id = self.pool.get('hr.employee').search(cr, uid, [('login', '=', user.login)])[0]
+                    empl = self.pool.get('hr.employee').browse(cr, uid, empl_id)
                     if empl.work_email:
                         emails += empl.work_email
                         emails += ','
-
-            emails  = emails[:-1]
+            emails = emails[:-1]
             res[id] = emails
         return res
 
     _columns = {
-        'manager' : fields.function(_get_cur_account_manager,string='Manager',type='char',size=128,readonly=True),
-        'state' : fields.selection([
+        'manager': fields.function(_get_cur_account_manager, string='Manager', type='char', size=128, readonly=True),
+        'state': fields.selection([
             ('draft', 'New'),
             ('confirm', 'Waiting Approval'),
             ('accepted', 'Approved'),
             ('exported', 'Exported'),
             ('imported', 'Imported'),
-            ('cancelled', 'Refused'),],
+            ('cancelled', 'Refused'), ],
             'State', readonly=True, help='When the expense request is created the state is \'Draft\'.\
                     \n It is confirmed by the user and request is sent to admin, the state is \'Waiting Confirmation\'.\
                     \nIf the admin accepts it, the state is \'Accepted\'.\
@@ -188,24 +174,22 @@
                     \n If the expense request has been imported in AccountEdge, the state is \'Imported\'.'
         ),
     }
-
-
 hr_expense_expense()
 
+
 class hr_expense_line(osv.osv):
     _inherit = 'hr.expense.line'
 
     def _get_parent_state(self, cr, uid, ids, field_name, arg, context):
-        res  = {}
+        res = {}
         for id in ids:
             expense_line = self.pool.get('hr.expense.line').browse(cr, uid, id)
             res[id] = expense_line.expense_id.state
         return res
 
     _columns = {
-        'state': fields.function(_get_parent_state,string='Expense State',type='char',size=128,readonly=True),
+        'state': fields.function(_get_parent_state, string='Expense State', type='char', size=128, readonly=True),
     }
-
 hr_expense_line()
 
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== modified file 'hr_expense_accountedge/hr_expense_accountedge.xml'
--- hr_expense_accountedge/hr_expense_accountedge.xml	2013-08-08 19:43:14 +0000
+++ hr_expense_accountedge/hr_expense_accountedge.xml	2013-11-18 22:10:04 +0000
@@ -194,12 +194,12 @@
         -->
         <record id="email_template_edi_expense_waiting_approval" model="email.template">
             <field name="name">Automated Invoice Notification Mail</field>
-            <field name="email_from">${object.company_id.email or 'noreply@localhost'}</field>
+            <field name="email_from">${object.employee_id.user_id.user_email or 'noreply@localhost'}</field>
             <field name="subject">New expense waiting for approval</field>
-            <field name="email_to">${object.employee_id.parent_id.work_email or 'naysan.saran@xxxxxxxxx'}</field>
+            <field name="email_to">${object.employee_id.parent_id.user_id.user_email}</field>
             <field name="model_id" ref="model_hr_expense_expense"/>
             <field name="auto_delete" eval="True"/>
-            <field name="lang">${object.employee_id.partner_id.lang}</field>
+            <field name="lang">${object.employee_id.user_id.context_lang}</field>
             <field name="body_html"><![CDATA[
                 <div style="
                     font-family     : 'Lucica Grande', Ubuntu, Arial, Verdana, sans-serif;
@@ -240,12 +240,12 @@
         -->
         <record id="email_template_edi_expense_accepted" model="email.template">
             <field name="name">Automated Invoice Notification Mail</field>
-            <field name="email_from">${object.company_id.email or 'noreply@localhost'}</field>
+            <field name="email_from">${object.employee_id.user_id.user_email or 'noreply@localhost'}</field>
             <field name="subject">New expense approved and ready for export</field>
-            <field name="email_to">${object.manager_emails}</field>
+            <field name="email_to">payable@localhost</field>
             <field name="model_id" ref="model_hr_expense_expense"/>
             <field name="auto_delete" eval="True"/>
-            <field name="lang">${object.employee_id.partner_id.lang}</field>
+            <field name="lang">${object.employee_id.user_id.context_lang}</field>
             <field name="body_html"><![CDATA[
                 <div style="
                     font-family     : 'Lucica Grande', Ubuntu, Arial, Verdana, sans-serif;

=== modified file 'hr_expense_accountedge/tools/import_expenses.py'
--- hr_expense_accountedge/tools/import_expenses.py	2013-08-08 22:25:29 +0000
+++ hr_expense_accountedge/tools/import_expenses.py	2013-11-18 22:10:04 +0000
@@ -24,86 +24,63 @@
 import getpass
 from datetime import datetime
 
+
 def main():
-    username    = 'openerp_user'
-    dbname      = ''
-    server_url  = 'http://localhost:8069'
-    csv_path    = 'hr_expense_accountedge.txt'
+    username = 'openerp_user'
+    dbname = ''
+    server_url = 'http://localhost:8069'
+    csv_path = 'hr_expense_accountedge.txt'
 
     pwd = getpass.getpass(prompt="Please enter the password of %s: " % username)
-    
     # Get the uid
     sock_common = xmlrpclib.ServerProxy('%s/xmlrpc/common' % server_url)
     uid = sock_common.login(dbname, username, pwd)
-
     if not uid:
         print "Connection error. Please check the username, password and server url."
-        goodbye = raw_input("Type 'enter' to quit...")
+        raw_input("Type 'enter' to quit...")
         return 1
-
-    # Replace localhost with the address of the server 
+    # Replace localhost with the address of the server
     sock = xmlrpclib.ServerProxy('%s/xmlrpc/object' % server_url)
-
     # Search for exported expense notes
     args = [('state', '=', 'exported')]
     expense_ids = sock.execute(dbname, uid, pwd, 'hr.expense.expense', 'search', args)
-
     print "There are %d expense sheets to import" % len(expense_ids)
-
     if not expense_ids:
-        goodbye = raw_input("Type 'enter' to quit...")
+        raw_input("Type 'enter' to quit...")
         return 1
-   
     # Outpout file for AccountEdge
     final_csv = open(csv_path, 'w')
-    
     num_expense = 0
 
     # For each exported expense note, search for the tsv attachment
     for expense_id in expense_ids:
-
-        args    = [('res_model','=','hr.expense.expense'),('res_id', '=', expense_id)]
+        args = [('res_model', '=', 'hr.expense.expense'), ('res_id', '=', expense_id)]
         csv_ids = sock.execute(dbname, uid, pwd, 'ir.attachment', 'search', args)
-        
-        fields  = ['name', 'datas']
+        fields = ['name', 'datas']
         csv_obj = sock.execute(dbname, uid, pwd, 'ir.attachment', 'read', csv_ids, fields)
-        
         latest_csv = None
         latest_date = datetime(2000, 1, 1, 0, 0, 0)
-
         # Find the latest csv
         for csv in csv_obj:
-
             format = 'export_%Y%m%d_%H%M%S.tsv'
             date_created = datetime.strptime(csv["name"], format)
-            
             if date_created > latest_date:
                 latest_date = date_created
                 latest_csv = csv
-
         # Copy the lines to the new summary file
         if latest_csv:
-            content     = base64.b64decode(csv['datas'])
-            content     = content.split("\r\n")
- 
-            
+            content = base64.b64decode(csv['datas'])
+            content = content.split("\r\n")
             for num_line in range(len(content)):
                 if (num_line == 1 and num_expense == 0) or num_line > 1:
                     final_csv.write(content[num_line])
                     final_csv.write("\r\n")
-
-
             num_expense = num_expense + 1
-
-
         # Mark the expenses as imported
         values = {'state': 'exported'}
-        result = sock.execute(dbname, uid, pwd, 'hr.expense.expense', 'write', expense_ids, values)
-
+        sock.execute(dbname, uid, pwd, 'hr.expense.expense', 'write', expense_ids, values)
     final_csv.close()
-
-    goodbye = raw_input("Type 'enter' to quit...")
+    raw_input("Type 'enter' to quit...")
 
 if __name__ == "__main__":
     main()
-