Purnendu Singh (OpenERP) has proposed merging 
lp:~openerp-dev/openobject-addons/trunk-hr_expense into lp:openobject-addons.

Requested reviews:
  OpenERP Core Team (openerp)

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-hr_expense/+merge/115482

Hello,

Improve the hr_expense so it will now after the confirmation of the expense, 
the button "Issue Receipt" will  create an account.voucher (instead of an 
invoice) that will be  automatically confirmed, and it will must creates the 
accounting entries exactly as the current invoice does.

At the end we will get same accounting entries as if the supplier invoice were 
created and confirmed.

Thanks,
Purnendu Singh
-- 
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-hr_expense/+merge/115482
Your team OpenERP R&D Team is subscribed to branch 
lp:~openerp-dev/openobject-addons/trunk-hr_expense.
=== modified file 'account_voucher/voucher_sales_purchase_view.xml'
--- account_voucher/voucher_sales_purchase_view.xml	2012-07-16 22:17:06 +0000
+++ account_voucher/voucher_sales_purchase_view.xml	2012-07-18 07:02:10 +0000
@@ -219,7 +219,7 @@
             <field name="model">account.voucher</field>
             <field name="type">form</field>
             <field name="arch" type="xml">
-                <form version="7.0">
+                <form string="Purchase Receipt" version="7.0">
                 <header>
                     <button name="proforma_voucher" string="Validate" states="draft" class="oe_highlight"/>
                     <button name="%(act_pay_bills)d" context="{'narration':narration, 'title':'Bill Payment', 'type':'payment', 'partner_id': partner_id, 'reference':reference}" type="action" string="Pay Bill" attrs="{'invisible':['|',('pay_now','=','pay_now'),'|',('state','=','draft'), ('paid','=',True)]}" class="oe_highlight"/>

=== modified file 'hr_expense/__openerp__.py'
--- hr_expense/__openerp__.py	2012-06-06 08:44:17 +0000
+++ hr_expense/__openerp__.py	2012-07-18 07:02:10 +0000
@@ -33,8 +33,7 @@
     * Draft expense
     * Confirmation of the sheet by the employee
     * Validation by his manager
-    * Validation by the accountant and invoice creation
-    * Payment of the invoice to the employee
+    * Validation by the accountant and receipt creation
 
 This module also uses the analytic accounting and is compatible with
 the invoice on timesheet module so that you will be able to automatically
@@ -43,7 +42,7 @@
     'author': 'OpenERP SA',
     'website': 'http://www.openerp.com',
     'images': ['images/hr_expenses_analysis.jpeg', 'images/hr_expenses.jpeg'],
-    'depends': ['hr', 'account'],
+    'depends': ['hr', 'account_voucher'],
     'init_xml': [],
     'update_xml': [
         'security/ir.model.access.csv',

=== modified file 'hr_expense/hr_expense.py'
--- hr_expense/hr_expense.py	2012-07-05 09:29:21 +0000
+++ hr_expense/hr_expense.py	2012-07-18 07:02:10 +0000
@@ -40,12 +40,16 @@
         if context is None:
             context = {}
         if not default: default = {}
-        default.update({'invoice_id': False, 'date_confirm': False, 'date_valid': False, 'user_valid': False})
+        default.update({'voucher_id': False, 'date_confirm': False, 'date_valid': False, 'user_valid': False})
         return super(hr_expense_expense, self).copy(cr, uid, id, default, context=context)
 
     def _amount(self, cr, uid, ids, field_name, arg, context=None):
-        cr.execute("SELECT s.id,COALESCE(SUM(l.unit_amount*l.unit_quantity),0) AS amount FROM hr_expense_expense s LEFT OUTER JOIN hr_expense_line l ON (s.id=l.expense_id) WHERE s.id IN %s GROUP BY s.id ", (tuple(ids),))
-        res = dict(cr.fetchall())
+        res= {}
+        for expense in self.browse(cr, uid, ids, context=context):
+            total = 0.0
+            for line in expense.line_ids:
+                total += line.unit_amount * line.unit_quantity
+            res[expense.id] = total
         return res
 
     def _get_currency(self, cr, uid, context=None):
@@ -63,7 +67,7 @@
         'name': fields.char('Description', size=128, required=True),
         'id': fields.integer('Sheet ID', readonly=True),
         'date': fields.date('Date', select=True),
-        'journal_id': fields.many2one('account.journal', 'Force Journal', help = "The journal used when the expense is invoiced"),
+        'journal_id': fields.many2one('account.journal', 'Force Journal', help = "The journal used when the expense is done."),
         'employee_id': fields.many2one('hr.employee', "Employee", required=True),
         'user_id': fields.many2one('res.users', 'User', required=True),
         'date_confirm': fields.date('Confirmation Date', select=True, help = "Date of the confirmation of the sheet expense. It's filled when the button Confirm is pressed."),
@@ -73,7 +77,7 @@
         'line_ids': fields.one2many('hr.expense.line', 'expense_id', 'Expense Lines', readonly=True, states={'draft':[('readonly',False)]} ),
         'note': fields.text('Note'),
         'amount': fields.function(_amount, string='Total Amount'),
-        'invoice_id': fields.many2one('account.invoice', "Employee's Invoice"),
+        'voucher_id': fields.many2one('account.voucher', "Employee's Receipt"),
         'currency_id': fields.many2one('res.currency', 'Currency', required=True),
         'department_id':fields.many2one('hr.department','Department'),
         'company_id': fields.many2one('res.company', 'Company', required=True),
@@ -82,11 +86,10 @@
             ('cancelled', 'Refused'),
             ('confirm', 'Waiting Approval'),
             ('accepted', 'Approved'),
-            ('invoiced', 'Invoiced'),
-            ('paid', 'Reimbursed')
+            ('done', 'Done'),
             ],
             'Status', readonly=True, help='When the expense request is created the status is \'Draft\'.\n It is confirmed by the user and request is sent to admin, the status is \'Waiting Confirmation\'.\
-            \nIf the admin accepts it, the status is \'Accepted\'.\n If an invoice is made for the expense request, the status is \'Invoiced\'.\n If the expense is paid to user, the status is \'Reimbursed\'.'),
+            \nIf the admin accepts it, the status is \'Accepted\'.\n If a receipt is made for the expense request, the status is \'Done\'.'),
     }
     _defaults = {
         'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'hr.employee', context=c),
@@ -126,101 +129,86 @@
         self.write(cr, uid, ids, {'state':'cancelled'})
         return True
 
-    def expense_paid(self, cr, uid, ids, *args):
-        self.write(cr, uid, ids, {'state':'paid'})
-        return True
-
-    def invoice(self, cr, uid, ids, context=None):
-        wf_service = netsvc.LocalService("workflow")
-        mod_obj = self.pool.get('ir.model.data')
-        res = mod_obj.get_object_reference(cr, uid, 'account', 'invoice_supplier_form')
-        inv_ids = []
-        for id in ids:
-            wf_service.trg_validate(uid, 'hr.expense.expense', id, 'invoice', cr)
-            inv_ids.append(self.browse(cr, uid, id).invoice_id.id)
-        return {
-            'name': _('Supplier Invoices'),
-            'view_type': 'form',
-            'view_mode': 'form',
-            'view_id': [res and res[1] or False],
-            'res_model': 'account.invoice',
-            'context': "{'type':'out_invoice', 'journal_type': 'purchase'}",
-            'type': 'ir.actions.act_window',
-            'nodestroy': True,
-            'target': 'current',
-            'res_id': inv_ids and inv_ids[0] or False,
-        }
-
-    def action_invoice_create(self, cr, uid, ids):
-        res = False
-        invoice_obj = self.pool.get('account.invoice')
+    def action_receipt_create(self, cr, uid, ids, context=None):
         property_obj = self.pool.get('ir.property')
         sequence_obj = self.pool.get('ir.sequence')
         analytic_journal_obj = self.pool.get('account.analytic.journal')
         account_journal = self.pool.get('account.journal')
-        for exp in self.browse(cr, uid, ids):
+        voucher_obj = self.pool.get('account.voucher')
+        wkf_service = netsvc.LocalService("workflow")
+        
+        for exp in self.browse(cr, uid, ids, context=context):
             company_id = exp.company_id.id
             lines = []
-            for l in exp.line_ids:
-                tax_id = []
-                if l.product_id:
-                    acc = l.product_id.product_tmpl_id.property_account_expense
+            total = 0.0
+            for line in exp.line_ids:
+                if line.product_id:
+                    acc = line.product_id.product_tmpl_id.property_account_expense
                     if not acc:
-                        acc = l.product_id.categ_id.property_account_expense_categ
-                    tax_id = [x.id for x in l.product_id.supplier_taxes_id]
+                        acc = line.product_id.categ_id.property_account_expense_categ
                 else:
                     acc = property_obj.get(cr, uid, 'property_account_expense_categ', 'product.category', context={'force_company': company_id})
                     if not acc:
                         raise osv.except_osv(_('Error !'), _('Please configure Default Expense account for Product purchase, `property_account_expense_categ`'))
+                
                 lines.append((0, False, {
-                    'name': l.name,
+                    'name': line.name,
                     'account_id': acc.id,
-                    'price_unit': l.unit_amount,
-                    'quantity': l.unit_quantity,
-                    'uos_id': l.uom_id.id,
-                    'product_id': l.product_id and l.product_id.id or False,
-                    'invoice_line_tax_id': tax_id and [(6, 0, tax_id)] or False,
-                    'account_analytic_id': l.analytic_account.id,
+                    'account_analytic_id': line.analytic_account.id,
+                    'amount': line.total_amount,
+                    'type': 'dr'
                 }))
+                total += line.total_amount
             if not exp.employee_id.address_home_id:
                 raise osv.except_osv(_('Error !'), _('The employee must have a Home address.'))
             acc = exp.employee_id.address_home_id.property_account_payable.id
-            payment_term_id = exp.employee_id.address_home_id.property_payment_term.id
-            inv = {
+            voucher = {
                 'name': exp.name,
                 'reference': sequence_obj.get(cr, uid, 'hr.expense.invoice'),
                 'account_id': acc,
-                'type': 'in_invoice',
+                'type': 'purchase',
                 'partner_id': exp.employee_id.address_home_id.id,
                 'company_id': company_id,
-                'origin': exp.name,
-                'invoice_line': lines,
-                'currency_id': exp.currency_id.id,
-                'payment_term': payment_term_id,
-                'fiscal_position': exp.employee_id.address_home_id.property_account_position.id
+                'line_ids': lines,
+                'amount': total
             }
-            if payment_term_id:
-                to_update = invoice_obj.onchange_payment_term_date_invoice(cr, uid, [], payment_term_id, None)
-                if to_update:
-                    inv.update(to_update['value'])
             journal = False
             if exp.journal_id:
-                inv['journal_id']=exp.journal_id.id
+                voucher['journal_id'] = exp.journal_id.id
                 journal = exp.journal_id
             else:
-                journal_id = invoice_obj._get_journal(cr, uid, context={'type': 'in_invoice', 'company_id': company_id})
+                journal_id = voucher_obj._get_journal(cr, uid, context={'type': 'purchase', 'company_id': company_id})
                 if journal_id:
-                    inv['journal_id'] = journal_id
-                    journal = account_journal.browse(cr, uid, journal_id)
+                    voucher['journal_id'] = journal_id
+                    journal = account_journal.browse(cr, uid, journal_id, context=context)
             if journal and not journal.analytic_journal_id:
-                analytic_journal_ids = analytic_journal_obj.search(cr, uid, [('type','=','purchase')])
+                analytic_journal_ids = analytic_journal_obj.search(cr, uid, [('type','=','purchase')], context=context)
                 if analytic_journal_ids:
-                    account_journal.write(cr, uid, [journal.id],{'analytic_journal_id':analytic_journal_ids[0]})
-            inv_id = invoice_obj.create(cr, uid, inv, {'type': 'in_invoice'})
-            invoice_obj.button_compute(cr, uid, [inv_id], {'type': 'in_invoice'}, set_total=True)
-            self.write(cr, uid, [exp.id], {'invoice_id': inv_id, 'state': 'invoiced'})
-            res = inv_id
-        return res
+                    account_journal.write(cr, uid, [journal.id], {'analytic_journal_id': analytic_journal_ids[0]}, context=context)
+            voucher_id = voucher_obj.create(cr, uid, voucher, context=context)
+            wkf_service.trg_validate(uid, 'account.voucher', voucher_id, 'proforma_voucher', cr)
+            self.write(cr, uid, [exp.id], {'voucher_id': voucher_id, 'state': 'done'}, context=context)
+        return True
+    
+    def action_view_receipt(self, cr, uid, ids, context=None):
+        '''
+        This function returns an action that display existing receipt of given expense ids.
+        '''
+        assert len(ids) == 1, 'This option should only be used for a single id at a time'
+        voucher_id = self.browse(cr, uid, ids[0], context=context).voucher_id.id
+        res = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'account_voucher', 'view_purchase_receipt_form')
+        result = {
+            'name': _('Expense Receipt'),
+            'view_type': 'form',
+            'view_mode': 'form',
+            'view_id': res and res[1] or False,
+            'res_model': 'account.voucher',
+            'type': 'ir.actions.act_window',
+            'nodestroy': True,
+            'target': 'current',
+            'res_id': voucher_id,
+        }
+        return result
 
 hr_expense_expense()
 

=== modified file 'hr_expense/hr_expense_view.xml'
--- hr_expense/hr_expense_view.xml	2012-07-13 09:53:41 +0000
+++ hr_expense/hr_expense_view.xml	2012-07-18 07:02:10 +0000
@@ -45,7 +45,7 @@
             <field name="model">hr.expense.expense</field>
             <field name="type">tree</field>
             <field name="arch" type="xml">
-                <tree colors="blue:state == 'draft';black:state in ('confirm','accepted','invoiced','paid');gray:state == 'cancelled'"  string="Expenses" editable="top">
+                <tree colors="blue:state == 'draft';black:state in ('confirm','accepted','done');gray:state == 'cancelled'"  string="Expenses" editable="top">
                     <field name="employee_id"/>
                     <field name="date"/>
                     <field name="department_id"/>
@@ -68,9 +68,10 @@
                     <button name="confirm" states="draft" string="Submit to Manager" type="workflow" class="oe_highlight"/>
                     <button name="validate" states="confirm" string="Approve" type="workflow" groups="base.group_hr_user" class="oe_highlight"/>
                     <button name="draft" states="confirm,cancelled" string="Set to Draft" type="workflow" groups="base.group_hr_user" />
-                    <button name="invoice" states="accepted" string="Invoice" type="object" groups="base.group_hr_user" class="oe_highlight"/>
+                    <button name="done" states="accepted" string="Issue Receipt" type="workflow" groups="base.group_hr_user" class="oe_highlight"/>
+                    <button name="action_view_receipt" states="done" string="Open Receipt" type="object" class="oe_highlight"/>
                     <button name="refuse" states="confirm,accepted" string="Refuse" type="workflow" groups="base.group_hr_user" />
-                    <field name="state" widget="statusbar" statusbar_visible="draft,confirm,accepted" statusbar_colors='{"confirm":"blue","cancelled":"red"}'/>
+                    <field name="state" widget="statusbar" statusbar_visible="draft,confirm,accepted,done" statusbar_colors='{"confirm":"blue","cancelled":"red"}'/>
                 </header>
                 <sheet>
                     <group>
@@ -109,14 +110,21 @@
                                     </group>
                                 </form>
                             </field>
-                            <separator string="Notes"/>
-                            <field name="note" placeholder="Free Notes"/>
+                            <group>
+                                <div>
+                                    <separator string="Notes"/>
+                                    <field name="note" placeholder="Free Notes"/>
+                                </div>
+                                <group class="oe_subtotal_footer">
+                                    <field name="amount"/>
+                                </group>
+                            </group>
                         </page>
                         <page string="Other Info">
                             <group>
                                 <group string="Accounting Data">
-                                    <field name="journal_id"/>
-                                    <field name="invoice_id" context="{'type':'in_invoice', 'journal_type': 'purchase'}"/>
+                                    <field name="journal_id" widget="selection" domain="[('type', 'in', ('purchase','purchase_refund'))]"/>
+                                    <field name="voucher_id" context="{'form_view_ref': 'account_voucher.view_purchase_receipt_form'}"/>
                                 </group>
                             </group>
                         </page>

=== modified file 'hr_expense/hr_expense_workflow.xml'
--- hr_expense/hr_expense_workflow.xml	2011-11-18 11:44:53 +0000
+++ hr_expense/hr_expense_workflow.xml	2012-07-18 07:02:10 +0000
@@ -32,14 +32,6 @@
             <field name="action">expense_accept()</field>
         </record>
 
-        <record id="act_paid" model="workflow.activity">
-            <field name="wkf_id" ref="wkf_expenses"/>
-            <field name="name">paid</field>
-            <field name="kind">function</field>
-            <field name="action">expense_paid()</field>
-            <field name="flow_stop">True</field>
-        </record>
-
         <record id="act_refused" model="workflow.activity">
             <field name="wkf_id" ref="wkf_expenses"/>
             <field name="name">refused</field>
@@ -47,12 +39,11 @@
             <field name="action">expense_canceled()</field>
         </record>
 
-        <record id="act_invoice" model="workflow.activity">
+        <record id="act_done" model="workflow.activity">
             <field name="wkf_id" ref="wkf_expenses"/>
-            <field name="name">invoice</field>
-            <field name="kind">subflow</field>
-            <field name="subflow_id" ref="account.wkf"/>
-            <field name="action">action_invoice_create()</field>
+            <field name="name">done</field>
+            <field name="kind">function</field>
+            <field name="action">action_receipt_create()</field>
         </record>
 
         <record id="t1" model="workflow.transition">
@@ -91,15 +82,8 @@
 
         <record id="t8" model="workflow.transition">
             <field name="act_from" ref="act_accepted"/>
-            <field name="act_to" ref="act_invoice"/>
-            <field name="signal">invoice</field>
-            <field name="group_id" ref="base.group_hr_user"/>
-        </record>
-
-        <record id="t9" model="workflow.transition">
-            <field name="act_from" ref="act_invoice"/>
-            <field name="act_to" ref="act_paid"/>
-            <field name="signal">subflow.paid</field>
+            <field name="act_to" ref="act_done"/>
+            <field name="signal">done</field>
             <field name="group_id" ref="base.group_hr_user"/>
         </record>
 

=== modified file 'hr_expense/report/hr_expense_report.py'
--- hr_expense/report/hr_expense_report.py	2012-05-04 11:57:48 +0000
+++ hr_expense/report/hr_expense_report.py	2012-07-18 07:02:10 +0000
@@ -39,11 +39,10 @@
         'product_id':fields.many2one('product.product', 'Product', readonly=True),
         'journal_id': fields.many2one('account.journal', 'Force Journal', readonly=True),
         'product_qty':fields.float('Qty', readonly=True),
-        'invoiced':fields.integer('# of Invoiced Lines', readonly=True),
         'employee_id': fields.many2one('hr.employee', "Employee's Name", readonly=True),
         'date_confirm': fields.date('Confirmation Date', readonly=True),
         'date_valid': fields.date('Validation Date', readonly=True),
-        'invoice_id': fields.many2one('account.invoice', 'Invoice', readonly=True),
+        'voucher_id': fields.many2one('account.voucher', 'Receipt', readonly=True),
         'department_id':fields.many2one('hr.department','Department', readonly=True),
         'company_id':fields.many2one('res.company', 'Company', readonly=True),
         'user_id':fields.many2one('res.users', 'Validation User', readonly=True),
@@ -60,8 +59,7 @@
             ('draft', 'Draft'),
             ('confirm', 'Waiting confirmation'),
             ('accepted', 'Accepted'),
-            ('invoiced', 'Invoiced'),
-            ('paid', 'Reimbursed'),
+            ('done', 'Done'),
             ('cancelled', 'Cancelled')],
             'Status', readonly=True),
     }
@@ -78,8 +76,7 @@
                      s.currency_id,
                      to_date(to_char(s.date_confirm, 'dd-MM-YYYY'),'dd-MM-YYYY') as date_confirm,
                      to_date(to_char(s.date_valid, 'dd-MM-YYYY'),'dd-MM-YYYY') as date_valid,
-                     s.invoice_id,
-                     count(s.invoice_id) as invoiced,
+                     s.voucher_id,
                      s.user_valid as user_id,
                      s.department_id,
                      to_char(date_trunc('day',s.create_date), 'YYYY') as year,
@@ -109,7 +106,7 @@
                      to_date(to_char(s.date_valid, 'dd-MM-YYYY'),'dd-MM-YYYY'),
                      l.product_id,
                      l.analytic_account,
-                     s.invoice_id,
+                     s.voucher_id,
                      s.currency_id,
                      s.user_valid,
                      s.department_id,

=== modified file 'hr_expense/report/hr_expense_report_view.xml'
--- hr_expense/report/hr_expense_report_view.xml	2012-07-03 15:58:43 +0000
+++ hr_expense/report/hr_expense_report_view.xml	2012-07-18 07:02:10 +0000
@@ -7,13 +7,13 @@
         <field name="model">hr.expense.report</field>
         <field name="type">tree</field>
         <field name="arch" type="xml">
-            <tree colors="blue:state == 'draft';black:state in ('confirm','accepted','invoiced','paid');gray:state == 'cancelled'" string="Expenses Analysis">
+            <tree colors="blue:state == 'draft';black:state in ('confirm','accepted','done');gray:state == 'cancelled'" string="Expenses Analysis">
                 <field name="employee_id" invisible="1"/>
                 <field name="user_id" invisible="1"/>
                 <field name="year" invisible="1"/>
                 <field name="month" invisible="1"/>
                 <field name="day" invisible="1"/>
-                <field name="invoice_id" invisible="1"/>
+                <field name="voucher_id" invisible="1"/>
                 <field name="analytic_account" invisible="1" groups="analytic.group_analytic_accounting"/>
                 <field name="department_id" invisible="1"/>
                 <field name="company_id" invisible="1"/>
@@ -23,7 +23,6 @@
                 <field name="state" invisible="1"/>
                 <field name="nbr" sum="# of Lines"/>
                 <field name="no_of_products" sum="# of Products"/>
-                <field name="invoiced" sum="Total Invoiced Lines"/>
                 <field name="price_average" avg="Average Price"/>
                 <field name="price_total" sum="Total Price"/>
                 <field name="delay_confirm"/>
@@ -56,8 +55,6 @@
                       help = "Confirm Expenses"/>
                     <filter string="Approved" icon="terp-check" domain="[('state','=','accepted')]"
                       help = "Approved Expenses"/>
-                    <filter string="Invoiced" icon="terp-dolar" domain="[('state','in', ('invoiced', 'paid'))]"
-                      help = "Invoiced Expenses"/>
                     <separator orientation="vertical"/>
                     <field name="employee_id"/>
                     <field name="department_id"/>

=== modified file 'hr_expense/test/expense_process.yml'
--- hr_expense/test/expense_process.yml	2011-12-19 16:54:40 +0000
+++ hr_expense/test/expense_process.yml	2012-07-18 07:02:10 +0000
@@ -17,33 +17,21 @@
   !assert {model: hr.expense.expense, id: sep_expenses, severity: error, string: Expense should be in Approved state}:
     - state == 'accepted'
 -
-  I make Invoice for the expense.
--
-  !python {model: hr.expense.expense}: |
-    self.invoice(cr, uid, [ref('sep_expenses')])
--
-  I check invoice details.
+  I make Receipt for the expense.
+-
+  !workflow {model: hr.expense.expense, action: done, ref: sep_expenses}
+-
+  I check receipt details.
 -
   !python {model: hr.expense.expense}: |
     sep_expenses = self.browse(cr, uid, ref("sep_expenses"), context=context)
-    assert sep_expenses.state == 'invoiced', "Expense should be in 'Invoiced' state."
-    assert sep_expenses.invoice_id, "Expense should have link of Invoice."
-    assert sep_expenses.invoice_id.currency_id == sep_expenses.currency_id,"Invoice currency is not correspond with supplier invoice currency"
-    assert sep_expenses.invoice_id.origin == sep_expenses.name,"Invoice origin is not correspond with supplier invoice"
-    assert sep_expenses.invoice_id.type == 'in_invoice', "Invoice type is not supplier invoice"
-    assert sep_expenses.invoice_id.amount_total == sep_expenses.amount,"Invoice total amount is not correspond with supplier invoice total"
-    assert len(sep_expenses.invoice_id.invoice_line) == len(sep_expenses.line_ids),"Lines of Invoice and supplier invoice Line are not correspond"
-    #TODO: check invoice line details with Expenses lines
--
-  I pay the expenses.
--
-  !python {model: hr.expense.expense}: |
-    self.expense_paid(cr, uid, [ref('sep_expenses')])
--
-  I check that state of expenses is 'Paid'.
--
-  !assert {model: hr.expense.expense, id: sep_expenses, severity: error, string: Expense should be in Paid state}:
-    - state == 'paid'
+    assert sep_expenses.state == 'done', "Expense should be in 'Done' state."
+    assert sep_expenses.voucher_id, "Expense should have link of Purchase Receipt."
+    assert sep_expenses.voucher_id.name == sep_expenses.name,"Receipt name is not correspond with expense name."
+    assert sep_expenses.voucher_id.type == 'purchase', "Receipt type is not purchase receipt."
+    assert sep_expenses.voucher_id.amount == sep_expenses.amount,"Receipt total amount is not correspond with expense total."
+    assert len(sep_expenses.voucher_id.line_dr_ids) == len(sep_expenses.line_ids),"Lines of Receipt and expense line are not correspond."
+
 -
   I duplicate the expenses and cancel duplicated.
 -

_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help   : https://help.launchpad.net/ListHelp

Reply via email to