* Confirmation of the sheet by the employee
* Validation by his manager
* Validation by the accountant and receipt creation
- * Payment of the receipt to the employee
This module also uses the analytic accounting and is compatible with
the invoice on timesheet module so that you will be able to automatically
'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 receipted."),
+ '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."),
('cancelled', 'Refused'),
('confirm', 'Waiting Approval'),
('accepted', 'Approved'),
- ('receipted', 'Waiting Reimbursement'),
- ('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 a receipt is made for the expense request, the status is \'Waiting Reimbursement\'.\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),
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 action_receipt_create(self, cr, uid, ids, context=None):
property_obj = self.pool.get('ir.property')
sequence_obj = self.pool.get('ir.sequence')
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': 'receipted'}, context=context)
+ 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):
<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','receipted','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"/>
<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="receipt" states="accepted" string="Issue Receipt" type="workflow" groups="base.group_hr_user" class="oe_highlight"/>
- <button name="action_view_receipt" states="receipted" string="Open Receipt" type="object" 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>
<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>
<field name="action">expense_canceled()</field>
</record>
- <record id="act_receipt" model="workflow.activity">
+ <record id="act_done" model="workflow.activity">
<field name="wkf_id" ref="wkf_expenses"/>
- <field name="name">receipt</field>
+ <field name="name">done</field>
<field name="kind">function</field>
<field name="action">action_receipt_create()</field>
</record>
<record id="t8" model="workflow.transition">
<field name="act_from" ref="act_accepted"/>
- <field name="act_to" ref="act_receipt"/>
- <field name="signal">receipt</field>
- <field name="group_id" ref="base.group_hr_user"/>
- </record>
-
- <record id="t9" model="workflow.transition">
- <field name="act_from" ref="act_receipt"/>
- <field name="act_to" ref="act_paid"/>
- <field name="signal">paid</field>
+ <field name="act_to" ref="act_done"/>
+ <field name="signal">done</field>
<field name="group_id" ref="base.group_hr_user"/>
</record>
'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),
- 'receipted':fields.integer('# of Receipted 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),
('draft', 'Draft'),
('confirm', 'Waiting confirmation'),
('accepted', 'Accepted'),
- ('receipted', 'Receipted'),
- ('paid', 'Reimbursed'),
+ ('done', 'Done'),
('cancelled', 'Cancelled')],
'Status', readonly=True),
}
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.voucher_id,
- count(s.voucher_id) as receipted,
s.user_valid as user_id,
s.department_id,
to_char(date_trunc('day',s.create_date), 'YYYY') as year,
<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','receipted','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="state" invisible="1"/>
<field name="nbr" sum="# of Lines"/>
<field name="no_of_products" sum="# of Products"/>
- <field name="receipted" sum="Total Receipted Lines"/>
<field name="price_average" avg="Average Price"/>
<field name="price_total" sum="Total Price"/>
<field name="delay_confirm"/>
help = "Confirm Expenses"/>
<filter string="Approved" icon="terp-check" domain="[('state','=','accepted')]"
help = "Approved Expenses"/>
- <filter string="Receipted" icon="terp-dolar" domain="[('state','in', ('receipted', 'paid'))]"
- help = "Receipted Expenses"/>
<separator orientation="vertical"/>
<field name="employee_id"/>
<field name="department_id"/>
-
!python {model: hr.expense.expense}: |
sep_expenses = self.browse(cr, uid, ref("sep_expenses"), context=context)
- assert sep_expenses.state == 'receipted', "Expense should be in 'Waiting Reimbursement' state."
+ assert sep_expenses.state == 'done', "Expense should be in 'Done' state."
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 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'
--
I duplicate the expenses and cancel duplicated.
-
!python {model: hr.expense.expense}: |