[IMP] better useability

bzr revid: fp@tinyerp.com-20101012215940-yvnh0sog8voxiz85
This commit is contained in:
Fabien Pinckaers 2010-10-12 23:59:40 +02:00
parent a2bd94fb41
commit b3a6611ee0
27 changed files with 144 additions and 442 deletions

View File

@ -45,7 +45,7 @@
<field name="account_type"/>
<field name="currency_id" widget="selection" groups="base.group_extended"/>
</form>
<tree editable="bottom" string="">
<tree editable="bottom" string="Your bank and cash accounts">
<field name="acc_name"/>
<field name="account_type"/>
<field name="currency_id" widget="selection" groups="base.group_extended"/>

View File

@ -187,7 +187,7 @@ class account_analytic_account(osv.osv):
'credit': fields.function(_credit_calc, method=True, type='float', string='Credit'),
'quantity': fields.function(_quantity_calc, method=True, type='float', string='Quantity'),
'quantity_max': fields.float('Maximum Quantity', help='Sets the higher limit of quantity of hours.'),
'partner_id': fields.many2one('res.partner', 'Associated Partner'),
'partner_id': fields.many2one('res.partner', 'Partner'),
'contact_id': fields.many2one('res.partner.address', 'Contact'),
'user_id': fields.many2one('res.users', 'Account Manager'),
'date_start': fields.date('Date Start'),

View File

@ -7,7 +7,7 @@
name="Human Resources"
parent="base.dashboard"/>
<!-- This board view will be complete by other hr_* modules-->
<!-- This board view will be complete by other hr_* modules-->
<record id="board_hr_form" model="ir.ui.view">
<field name="name">board.hr.form</field>
<field name="model">board.board</field>

View File

@ -97,7 +97,7 @@ class hr_job(osv.osv):
'requirements': fields.text('Requirements'),
'department_id': fields.many2one('hr.department', 'Department'),
'company_id': fields.many2one('res.company', 'Company'),
'state': fields.selection([('open', 'Open'),('old', 'Old'),('recruit', 'In Recruitement')], 'State', readonly=True, required=True),
'state': fields.selection([('open', 'In Position'),('old', 'Old'),('recruit', 'In Recruitement')], 'State', readonly=True, required=True),
}
_defaults = {
'expected_employees': 1,

View File

@ -340,10 +340,10 @@
</page>
</notebook>
<group col="6" colspan="4">
<field name="state"/>
<button name="job_recruitement" string="In Recruitement" states="open" type="object" icon="gtk-go-forward"/>
<button name="job_open" string="Open" states="old,recruit" type="object" icon="terp-camera_test"/>
<button name="job_old" string="Old" states="open,recruit" type="object" icon="gtk-cancel"/>
<field name="state"/>
<button name="job_recruitement" string="In Recruitement" states="open" type="object" icon="gtk-go-forward"/>
<button name="job_open" string="In Position" states="old,recruit" type="object" icon="terp-camera_test"/>
<button name="job_old" string="Mark as Old" states="open,recruit" type="object" icon="gtk-cancel"/>
</group>
</form>
</field>

View File

@ -48,10 +48,6 @@ class hr_installer(osv.osv_memory):
'hr_payroll_account': fields.boolean('Payroll Accounting',
help="Generic Payroll system Integrated with Accountings."),
}
_defaults = {
'hr_holidays': True,
'hr_expense': True,
}
hr_installer()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -52,11 +52,11 @@
<search string="Hr Attendance Search">
<filter icon="terp-stock_align_left_24" string="My Attendances" domain="[('employee_id.user_id.id', '=', uid)]" />
<separator orientation="vertical"/>
<filter icon="terp-go-today" string="Today" domain="[('name::date','=',current_date)]" />
<filter icon="terp-go-today" string="Today" name="today" domain="[('name::date','=',current_date)]" />
<separator orientation="vertical"/>
<field name="employee_id" />
<field name="name" />
<field name="action" />
<field name="employee_id"/>
<field name="name"/>
<field name="action"/>
<newline/>
<group expand="0" string="Group By...">
<filter name="employee" string="Employee" icon="terp-personal" domain="[]" context="{'group_by':'employee_id'}"/>
@ -72,7 +72,7 @@
<field name="res_model">hr.attendance</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="context">{"search_default_employee":1}</field>
<field name="context">{"search_default_today":1}</field>
<field name="search_view_id" ref="view_hr_attendance_filter" />
<field name="help">Time Tracking functionality aims to manage employee's attendances on the basis of the actions (Sign in/Sign out) performed by them. You can also link this to an attendance machine using OpenERP's webservices features.</field>
</record>
@ -81,7 +81,7 @@
<menuitem id="menu_hr_attendance" name="Attendances" parent="hr.menu_hr_root" sequence="4"/>
<menuitem action="open_view_attendance" id="menu_open_view_attendance" parent="menu_hr_attendance" sequence="3"/>
<menuitem action="open_view_attendance" id="menu_open_view_attendance" parent="menu_hr_attendance" sequence="20"/>
<record id="edit_attendance_reason" model="ir.ui.view">
<field name="name">hr.action.reason.form</field>
@ -116,7 +116,9 @@
<field name="view_id" ref="view_attendance_reason"/>
</record>
<menuitem sequence="2" id="hr.menu_open_view_attendance_reason_new_config" parent="hr.menu_hr_configuration" name="Attendances" />
<menuitem
sequence="2" id="hr.menu_open_view_attendance_reason_new_config" parent="hr.menu_hr_configuration" name="Attendances"
groups="base.group_extended"/>
<menuitem action="open_view_attendance_reason" id="menu_open_view_attendance_reason" parent="hr.menu_open_view_attendance_reason_new_config"/>
<record id="hr_attendance_employee" model="ir.ui.view">

View File

@ -14,19 +14,14 @@
<record id="board_hr_evaluation_form" model="ir.ui.view">
<field name="name">board.hr.evaluation.form</field>
<field name="model">board.board</field>
<field name="inherit_id" ref="hr.board_hr_form"/>
<field name="inherit_id" ref="hr.board_hr_form"/>
<field name="type">form</field>
<field name="arch" type="xml">
<xpath expr="/form/hpaned/child1" position="inside">
<action colspan="4" height="220" name="%(act_hr_evaluation_tree)d" string="My Evaluation Remaining" width="510"/>
</xpath>
<xpath expr="/form/hpaned/child1" position="inside">
<action colspan="4" height="220" name="%(act_hr_evaluation_tree)d" string="My Evaluation Remaining" width="510"/>
</xpath>
</field>
</record>
<menuitem
action="hr.open_board_hr"
icon="terp-graph"
id="base.menu_hr_project"
parent="base.menu_hr_dasboard"
sequence="4"/>
</data>
</openerp>

View File

@ -20,12 +20,12 @@
<record id="board_hr_expense_form" model="ir.ui.view">
<field name="name">board.hr.expense.form</field>
<field name="model">board.board</field>
<field name="inherit_id" ref="hr.board_hr_form"/>
<field name="inherit_id" ref="hr.board_hr_form"/>
<field name="type">form</field>
<field name="arch" type="xml">
<xpath expr="/form/hpaned/child1" position="inside">
<action colspan="4" height="220" name="%(action_my_expense)d" string="My Expenses" />
</xpath>
<xpath expr="/form/hpaned/child1" position="inside">
<action colspan="4" height="220" name="%(action_my_expense)d" string="My Expenses" />
</xpath>
</field>
</record>

View File

@ -168,7 +168,7 @@
<field name="name">Expenses</field>
<field name="res_model">hr.expense.expense</field>
<field name="view_type">form</field>
<field name="context">{"search_default_user_id":uid,"search_default_department_id": department_id,"search_default_this":1}</field>
<field name="context">{"search_default_user_id":uid}</field>
<field name="search_view_id" ref="view_hr_expense_filter"/>
<field name="help">The OpenERP expenses management module allows you to track the full flow. Every month, the employees record their expenses. At the end of the month, their managers validates the expenses sheets which creates costs on projects/analytic accounts. The accountant validates the proposed entries and the employee can be reimbursed. You can also reinvoice the customer at the end of the flow.</field>
</record>

View File

@ -56,6 +56,7 @@
'security/ir.model.access.csv',
'hr_holidays_workflow.xml',
'hr_holidays_view.xml',
'hr_holidays_data.xml',
'hr_holidays_wizard.xml',
'hr_holidays_report.xml',
'report/hr_holidays_report_view.xml',

View File

@ -22,36 +22,36 @@
<record id="board_hr_holidays_form" model="ir.ui.view">
<field name="name">board.hr.holidays.form</field>
<field name="model">board.board</field>
<field name="inherit_id" ref="hr.board_hr_form"/>
<field name="inherit_id" ref="hr.board_hr_form"/>
<field name="type">form</field>
<field name="arch" type="xml">
<xpath expr="/form/hpaned/child1" position="inside">
<action colspan="4" height="220" name="%(action_view_holiday_status_board)d" string="My Leaves"/>
</xpath>
<xpath expr="/form/hpaned/child1" position="inside">
<action colspan="4" height="220" name="%(action_view_holiday_status_board)d" string="My Leaves"/>
</xpath>
</field>
</record>
<!-- Need to merge in above view -->
<!-- Need to merge in above view -->
<record id="action_hr_holidays_leaves_by_month" model="ir.actions.act_window">
<field name="name">Leaves by Month</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">available.holidays.report</field>
<field name="view_type">form</field>
<field name="view_mode">graph,tree</field>
<field name="domain">[('user_id','=',uid)]</field>
<record id="action_hr_holidays_leaves_by_month" model="ir.actions.act_window">
<field name="name">Leaves by Month</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">available.holidays.report</field>
<field name="view_type">form</field>
<field name="view_mode">graph,tree</field>
<field name="domain">[('user_id','=',uid)]</field>
<field name="context">{'group_by_no_leaf':1,'group_by':['month']}</field>
<field name="view_id" ref="hr_holidays.view_hr_available_holidays_report_graph"/>
</record>
<record id="board_hr_holidays_leave_by_month_form" model="ir.ui.view">
<field name="view_id" ref="hr_holidays.view_hr_available_holidays_report_graph"/>
</record>
<record id="board_hr_holidays_leave_by_month_form" model="ir.ui.view">
<field name="name">board.hr.holidays.leave.month.form</field>
<field name="model">board.board</field>
<field name="type">form</field>
<field name="inherit_id" ref="hr.board_hr_form"/>
<field name="type">form</field>
<field name="inherit_id" ref="hr.board_hr_form"/>
<field name="arch" type="xml">
<xpath expr="/form/hpaned/child2" position="inside">
<action colspan="4" height="220" name="%(action_hr_holidays_leaves_by_month)d" string="Leaves by Month" />
</xpath>
<xpath expr="/form/hpaned/child2" position="inside">
<action colspan="4" height="220" name="%(action_hr_holidays_leaves_by_month)d" string="Leaves by Month" />
</xpath>
</field>
</record>
</data>

View File

@ -110,9 +110,9 @@ class hr_holidays_status(osv.osv):
# To do: we can add remaining_leaves_category field to display remaining leaves for particular type
_columns = {
'name': fields.char('Name', size=64, required=True, translate=True),
'name': fields.char('Leave Type', size=64, required=True, translate=True),
'categ_id': fields.many2one('crm.case.categ', 'Meeting Category', domain="[('object_id.model', '=', 'crm.meeting')]", help='If you link this type of leave with a category in the CRM, it will synchronize each leave asked with a case in this category, to display it in the company shared calendar for example.'),
'color_name': fields.selection([('red', 'Red'), ('lightgreen', 'Light Green'), ('lightblue','Light Blue'), ('lightyellow', 'Light Yellow'), ('magenta', 'Magenta'),('lightcyan', 'Light Cyan'),('black', 'Black'),('lightpink', 'Light Pink'),('brown', 'Brown'),('violet', 'Violet'),('lightcoral', 'Light Coral'),('lightsalmon', 'Light Salmon'),('lavender', 'Lavender'),('wheat', 'Wheat'),('ivory', 'Ivory')],'Color in Report', required=True, help='This color will be used in the leaves summary located in Reporting\Leaves by Departement'),
'color_name': fields.selection([('red', 'Red'),('blue','Blue'), ('lightgreen', 'Light Green'), ('lightblue','Light Blue'), ('lightyellow', 'Light Yellow'), ('magenta', 'Magenta'),('lightcyan', 'Light Cyan'),('black', 'Black'),('lightpink', 'Light Pink'),('brown', 'Brown'),('violet', 'Violet'),('lightcoral', 'Light Coral'),('lightsalmon', 'Light Salmon'),('lavender', 'Lavender'),('wheat', 'Wheat'),('ivory', 'Ivory')],'Color in Report', required=True, help='This color will be used in the leaves summary located in Reporting\Leaves by Departement'),
'limit': fields.boolean('Allow to Override Limit', help='If you tick this checkbox, the system will allow, for this section, the employees to take more leaves than the available ones.'),
'active': fields.boolean('Active', help="If the active field is set to false, it will allow you to hide the leave type without removing it."),
'max_leaves': fields.function(_user_left_days, method=True, string='Maximum Leaves Allowed', help='This value is given by the sum of all holidays requests with a positive value.', multi='user_left_days'),
@ -162,7 +162,7 @@ class hr_holidays(osv.osv):
'linked_request_ids': fields.one2many('hr.holidays', 'parent_id', 'Linked Requests',),
'department_id':fields.related('employee_id', 'department_id', string='Department', type='many2one', relation='hr.department', readonly=True, store=True),
'category_id': fields.many2one('hr.employee.category', "Category", help='Category Of employee'),
'holiday_type': fields.selection([('employee','By Employee'),('category','By Employee Category')], 'Allocation Type', help='By Employee: Allocation/Request for individual Employee, By Employee Category: Allocation/Request for group of employees in category'),
'holiday_type': fields.selection([('employee','By Employee'),('category','By Employee Category')], 'Allocation Type', help='By Employee: Allocation/Request for individual Employee, By Employee Category: Allocation/Request for group of employees in category', required=True),
'manager_id2': fields.many2one('hr.employee', 'Second Approval', readonly=True, help='This area is automaticly filled by the user who validate the leave with second level (If Leave type need second validation)')
}

View File

@ -0,0 +1,26 @@
<?xml version="1.0"?>
<openerp>
<data>
<!-- Casual leave -->
<record model="hr.holidays.status" id="holiday_status_cl">
<field name="name">Casual Leave</field>
<field name="double_validation">True</field>
<field name="color_name">black</field>
</record>
<!-- Legal Holidays -->
<record model="hr.holidays.status" id="holiday_status_sl">
<field name="name">Legal Holidays</field>
<field name="color_name">blue</field>
</record>
<!-- Sick leave -->
<record model="hr.holidays.status" id="holiday_status_sl">
<field name="name">Sick Leave</field>
<field name="limit">True</field>
<field name="color_name">red</field>
</record>
</data>
</openerp>

View File

@ -2,13 +2,6 @@
<openerp>
<data noupdate="1">
<!-- Casual leave -->
<record model="hr.holidays.status" id="holiday_status_cl">
<field name="name">Casual Leave</field>
<field name="double_validation">True</field>
<field name="color_name">black</field>
</record>
<record model="hr.holidays" id="hr_holidays_employee1_allocation_cl">
<field name="name">Casual Leave for Fabien Pinckaers</field>
<field name="holiday_status_id" ref="holiday_status_cl"/>
@ -27,13 +20,6 @@
<field name="employee_id" ref="hr.employee1"/>
</record>
<!-- Sick leave -->
<record model="hr.holidays.status" id="holiday_status_sl">
<field name="name">Sick Leave</field>
<field name="limit">True</field>
<field name="color_name">red</field>
</record>
<record model="hr.holidays" id="hr_holidays_employee1_sl">
<field name="name">Doctor Appointment</field>
<field name="holiday_status_id" ref="holiday_status_sl"/>

View File

@ -15,10 +15,15 @@
<filter icon="terp-check" domain="[('state','=','draft')]" string="To Confirm"/>
<filter icon="terp-camera_test" domain="[('state','=','confirm')]" string="To Approve"/>
<separator orientation="vertical"/>
<filter string="This Month" icon="terp-go-month" name="This Month"
<filter string="This Month" icon="terp-go-month" name="This Month"
domain="[('date_from','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date_from','&gt;',(datetime.date.today()-datetime.timedelta(days=30)).strftime('%%Y-%%m-%%d'))]"/>
<separator orientation="vertical"/>
<field name="employee_id"/>
<field name="employee_id">
<filter icon="terp-personal"
name="my_leaves"
domain="[('employee_id.user_id','=', uid)]"
help="My Leaves" />
</field>
<field name="department_id" widget="selection">
<filter icon="terp-personal+" help="My Department Holidays"
domain="[('department_id.manager_id','=',uid)]" />
@ -32,14 +37,14 @@
</group>
<newline />
<group expand="0" string="Group By...">
<filter string="Employee" icon="terp-personal" domain="[]" context="{'group_by':'employee_id'}"/>
<filter name="group_employee" string="Employee" icon="terp-personal" domain="[]" context="{'group_by':'employee_id'}"/>
<filter string="Manager" icon="terp-personal" domain="[]" context="{'group_by':'manager_id'}"/>
<filter string="Department" icon="terp-personal+" domain="[]" context="{'group_by':'department_id','set_visible':True}"/>
<separator orientation="vertical"/>
<filter string="Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'holiday_status_id'}"
<separator orientation="vertical"/>
<filter name="group_type" string="Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'holiday_status_id'}"
default="context.get('report', False)"/>
<separator orientation="vertical"/>
<filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
<separator orientation="vertical"/>
<filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
</group>
</search>
</field>
@ -89,7 +94,7 @@
<field name="notes" nolabel="1" colspan="4"/>
<newline/>
<field name="state" colspan="2"/>
<group colspan="2">
<group colspan="2" col="6">
<button string="Cancel" name="cancel" states="validate,refuse" type="workflow" icon="gtk-cancel" groups="base.group_hr_manager"/>
<button string="Refuse" name="refuse" states="confirm,validate1" type="workflow" icon="gtk-no" groups="base.group_hr_manager"/>
<button string="Confirm" name="confirm" states="draft" type="workflow" icon="gtk-yes" groups="base.group_hr_user,base.group_hr_manager"/>
@ -112,7 +117,7 @@
<form string="Allocation Request">
<group col="8" colspan="4">
<field name="name" />
<field name="holiday_type" on_change="onchange_type(holiday_type)" attrs="{'readonly':[('state','!=','draft')]}" string="Allocation Type"/>
<field name="holiday_type" on_change="onchange_type(holiday_type)" attrs="{'readonly':[('state','!=','draft')]}" string="Allocation Type" groups="base.group_extended"/>
<group attrs="{'invisible':[('holiday_type','=','category')]}">
<field name="employee_id" attrs="{'required':[('holiday_type','=','employee')]}"/>
</group>
@ -269,7 +274,7 @@
<field name="res_model">hr.holidays</field>
<field name="view_type">form</field>
<field name="view_id" ref="edit_holiday_new"/>
<field name="context">{"search_default_department_id": department_id}</field>
<field name="context">{"search_default_department_id": department_id, "search_default_my_leaves": 1}</field>
<field name="domain">[('type','=','remove')]</field>
<field name="search_view_id" ref="view_hr_holidays_filter"/>
<field name="help">Leaves requests can be recorded by employees and validated by their managers. Once a leave request is validated it appears automatically in the agenda of the employee. You can define several allowance types (paid holidays, sickness, etc) and manage allowances per type.</field>
@ -303,7 +308,7 @@
<field name="name">Allocation Requests</field>
<field name="res_model">hr.holidays</field>
<field name="view_type">form</field>
<field name="context">{'search_default_user_id':uid,'type':'add',"search_default_department_id": department_id}</field>
<field name="context">{"search_default_my_leaves": 1,'type':'add',"search_default_department_id": department_id}</field>
<field name="domain">[('type','=','add')]</field>
<field name="view_id" ref="allocation_leave_new"/>
<field name="search_view_id" ref="view_hr_holidays_filter"/>
@ -331,7 +336,7 @@
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" eval="view_holiday_simple"/>
<field name="context">{'allocation_type':'company', 'report':True,"search_default_department_id": department_id}</field>
<field name="context">{'search_default_group_employee': 1, 'search_default_group_type': 1}</field>
<field name="search_view_id" ref="view_hr_holidays_filter"/>
</record>
@ -349,12 +354,15 @@
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Leave Type">
<field colspan="4" name="name" />
<field name="limit"/>
<field name="active"/>
<field name="categ_id" widget="selection"/>
<field name="color_name"/>
<field name="double_validation" />
<group colspan="4" col="6">
<field name="name" />
<field name="color_name"/>
<field name="categ_id" widget="selection" groups="base.group_extended"/>
<newline/>
<field name="limit"/>
<field name="double_validation"/>
<field name="active"/>
</group>
</form>
</field>
</record>

View File

@ -63,7 +63,8 @@ class account_analytic_account(osv.osv):
_inherit = "account.analytic.account"
_columns = {
'pricelist_id' : fields.many2one('product.pricelist', 'Sale Pricelist'),
'pricelist_id' : fields.many2one('product.pricelist', 'Sale Pricelist',
help="The product to invoice is defined on the employee form, the price will be deduced by this pricelist on the product."),
'amount_max': fields.float('Max. Invoice Price'),
'amount_invoiced': fields.function(_invoiced_calc, method=True, string='Invoiced Amount',
help="Total invoiced"),

View File

@ -35,31 +35,14 @@ class hr_timesheet_invoice_create(osv.osv_memory):
_name = 'hr.timesheet.invoice.create'
_description = 'Create invoice from timesheet'
_columns = {
'accounts': fields.many2many('account.analytic.account', 'invoice_id', 'account_id', 'Analytic Accounts', required=True),
'date': fields.boolean('Date', help='The real date of each work will be displayed on the invoice'),
'time': fields.boolean('Time spent', help='The time of each work done will be displayed on the invoice'),
'name': fields.boolean('Description', help='The detail of each work done will be displayed on the invoice'),
'price': fields.boolean('Cost', help='The cost of each work done will be displayed on the invoice. You probably don\'t want to check this'),
'product': fields.many2one('product.product', 'Product', help='Complete this field only if you want to force to use a specific product. Keep empty to use the real product that comes from the cost.'),
}
def _get_accounts(self, cr, uid, context=None):
if context is None:
context = {}
if not len(context['active_ids']):
return {}
#Checking whether the analytic line is invoiced or not
analytic_line_obj = self.pool.get('account.analytic.line').browse(cr, uid, context['active_ids'], context=context)
for obj_acc in analytic_line_obj:
if obj_acc.invoice_id and obj_acc.invoice_id.state !='cancel':
raise osv.except_osv(_('Warning'),_('The analytic entry "%s" is already invoiced!')%(obj_acc.name,))
cr.execute("SELECT distinct(account_id) from account_analytic_line where id IN %s",(tuple(context['active_ids']),))
account_ids = cr.fetchall()
return [x[0] for x in account_ids]
}
_defaults = {
'accounts': _get_accounts,
'date': lambda *args: 1,
'name': lambda *args: 1
}
@ -82,12 +65,17 @@ class hr_timesheet_invoice_create(osv.osv_memory):
result = mod_obj._get_id(cr, uid, 'account', 'view_account_invoice_filter')
res = mod_obj.read(cr, uid, result, ['res_id'], context=context)
data = self.read(cr, uid, ids, [], context=context)[0]
account_ids = data['accounts']
account_ids = {}
for line in self.pool.get('account.analytic.line').browse(cr, uid, context['active_ids'], context=context):
account_ids[line.account_id.id] = True
account_ids = account_ids.keys() #data['accounts']
for account in analytic_account_obj.browse(cr, uid, account_ids, context=context):
partner = account.partner_id
if (not partner) or not (account.pricelist_id):
raise osv.except_osv(_('Analytic Account incomplete'),
_('Please fill in the Associate Partner and Sale Pricelist fields in the Analytic Account:\n%s') % (account.name,))
_('Please fill in the Partner or Customer and Sale Pricelist fields in the Analytic Account:\n%s') % (account.name,))
if not partner.address:
raise osv.except_osv(_('Partner incomplete'),
@ -190,7 +178,7 @@ class hr_timesheet_invoice_create(osv.osv_memory):
invoice_line_obj.create(cr, uid, curr_line, context=context)
cr.execute("update account_analytic_line set invoice_id=%s WHERE account_id = %s and id IN %s" ,(last_invoice, account.id, tuple(context['active_ids'])))
invoice_obj.button_reset_taxes(cr, uid, [last_invoice], context)
invoice_obj.button_reset_taxes(cr, uid, [last_invoice], context)
mod_obj = self.pool.get('ir.model.data')
act_obj = self.pool.get('ir.actions.act_window')

View File

@ -10,21 +10,17 @@
<form string="Invoice analytic lines">
<notebook colspan="4">
<page string="Billing Data">
<group col="4" colspan="4">
<separator string="Do you want to show details of work in invoice ?" colspan="4"/>
<field name="date"/>
<field name="time"/>
<field name="name"/>
<field name="price"/>
</group>
<group col="2" colspan="4" groups="base.group_extended">
<separator string="Force to use a specific product" colspan="4" />
<field name="product"/>
</group>
</page>
<page string="Filter on Accounts" groups="base.group_extended">
<separator string="Choose accounts you want to invoice" colspan="4"/>
<field name="accounts" colspan="4" nolabel="1"/>
<group col="4" colspan="4">
<separator string="Do you want to show details of work in invoice ?" colspan="4"/>
<field name="date"/>
<field name="time"/>
<field name="name"/>
<field name="price" groups="base.group_extended"/>
</group>
<group col="2" colspan="4" groups="base.group_extended">
<separator string="Force to use a specific product" colspan="4" />
<field name="product"/>
</group>
</page>
</notebook>
<separator colspan="4"/>

View File

@ -53,7 +53,6 @@ The validation can be configured in the company:
'hr_timesheet_sheet_view.xml',
'hr_timesheet_workflow.xml',
'process/hr_timesheet_sheet_process.xml',
'report/timesheet_report_view.xml',
'board_hr_timesheet_view.xml',
'report/hr_timesheet_report_view.xml',
'wizard/hr_timesheet_current_view.xml',

View File

@ -1,7 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<menuitem id="base.menu_hr_dasboard" name="Dashboard" parent="hr.menu_hr_reporting" sequence="0" groups="base.group_system,base.group_hr_manager,base.group_hr_user"/>
<menuitem
id="base.menu_hr_dasboard" name="Dashboard" parent="hr.menu_hr_reporting"
sequence="0" groups="base.group_hr_manager"/>
<menuitem
action="hr.open_board_hr"
icon="terp-graph"
@ -9,16 +11,6 @@
parent="base.menu_hr_dasboard"
sequence="4"/>
<record id="action_timesheet_report_all" model="ir.actions.act_window">
<field name="name">Timesheets by Month</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">timesheet.report</field>
<field name="view_type">form</field>
<field name="view_mode">graph,tree</field>
<field name="domain">[('user_id','=',uid), ('month', '=' , time.strftime('%m')), ('year', '=', time.strftime('%Y'))]</field>
<field name="view_id" ref="hr_timesheet_sheet.view_timesheet_report_graph"/>
</record>
<record id="action_hr_timesheet_sheet_graph" model="ir.actions.act_window">
<field name="name">Timesheets</field>
<field name="type">ir.actions.act_window</field>
@ -28,39 +20,6 @@
<field name="view_id" ref="hr_timesheet_sheet.hr_timesheet_sheet_graph"/>
</record>
<record id="view_employee_attendance_graph" model="ir.ui.view">
<field name="name">Employee Attendance Graph</field>
<field name="model">timesheet.report</field>
<field name="type">graph</field>
<field name="arch" type="xml">
<graph string="Employee Attendances" type="bar">
<field name="user_id" />
<field name="total_attendance" operator="+"/>
<field name="total_timesheet" operator="+"/>
</graph>
</field>
</record>
<record id="action_employee_attendance_graph" model="ir.actions.act_window">
<field name="name">Employee Attendance Graph</field>
<field name="res_model">timesheet.report</field>
<field name="view_type">form</field>
<field name="view_mode">graph</field>
<field name="view_id" ref="view_employee_attendance_graph"/>
</record>
<record id="board_hr_timesheet_form" model="ir.ui.view">
<field name="name">board.hr.timesheet.form</field>
<field name="model">board.board</field>
<field name="inherit_id" ref="hr.board_hr_manager_form"/>
<field name="type">form</field>
<field name="arch" type="xml">
<xpath expr="/form/hpaned/child2" position="inside">
<action colspan="4" height="220" name="%(action_employee_attendance_graph)d" string="Employee Attendances" />
</xpath>
</field>
</record>
<record id="hr_timesheet_sheet_tree" model="ir.ui.view">
<field name="name">hr.timesheet.sheet.tree.simplified.board</field>
<field name="model">hr_timesheet_sheet.sheet</field>

View File

@ -19,7 +19,5 @@
#
##############################################################################
import timesheet_report
import hr_timesheet_report
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,123 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
# This program is free software: you can redistribute it and/or modify
# 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.
#
# 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import tools
from osv import fields,osv
class timesheet_report(osv.osv):
_name = "timesheet.report"
_description = "Timesheet"
_auto = False
_columns = {
'year': fields.char('Year',size=64,required=False, readonly=True),
'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'),
('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'),
('10','October'), ('11','November'), ('12','December')], 'Month',readonly=True),
'day': fields.char('Day', size=128, readonly=True),
'name': fields.char('Description', size=64,readonly=True),
'product_id' : fields.many2one('product.product', 'Product'),
'general_account_id' : fields.many2one('account.account', 'General Account', readonly=True),
'employee_id': fields.many2one('hr.employee', 'Employee',readonly=True),
'to_invoice': fields.many2one('hr_timesheet_invoice.factor', 'Type of Invoicing',readonly=True),
'account_id': fields.many2one('account.analytic.account', 'Analytic Account',readonly=True),
'nbr': fields.integer('#Nbr',readonly=True),
'total_diff': fields.float('#Total Diff',readonly=True),
'total_timesheet': fields.float('#Total Timesheet',readonly=True),
'total_attendance': fields.float('#Total Attendance',readonly=True),
'company_id': fields.many2one('res.company', 'Company',readonly=True),
'department_id':fields.many2one('hr.department','Department',readonly=True),
'date_from': fields.date('Date from',readonly=True,),
'date_to': fields.date('Date to',readonly=True),
'date_current': fields.date('Current date', required=True),
'state' : fields.selection([
('new', 'New'),
('draft','Draft'),
('confirm','Confirmed'),
('done','Done')], 'State', readonly=True),
'quantity': fields.float('#Quantity',readonly=True),
'cost': fields.float('#Cost',readonly=True),
}
def init(self, cr):
tools.drop_view_if_exists(cr, 'timesheet_report')
cr.execute("""
create or replace view timesheet_report as (
select
min(aal.id) as id,
htss.date_current,
htss.name,
htss.date_from,
htss.date_to,
to_char(htss.date_current,'YYYY') as year,
to_char(htss.date_current,'MM') as month,
to_char(htss.date_current, 'YYYY-MM-DD') as day,
count(*) as nbr,
aal.unit_amount as quantity,
aal.amount as cost,
aal.account_id,
aal.product_id,
(SELECT sum(day.total_difference)
FROM hr_timesheet_sheet_sheet AS sheet
LEFT JOIN hr_timesheet_sheet_sheet_day AS day
ON (sheet.id = day.sheet_id
AND day.name = sheet.date_current) where sheet.id=htss.id) as total_diff,
(SELECT sum(day.total_timesheet)
FROM hr_timesheet_sheet_sheet AS sheet
LEFT JOIN hr_timesheet_sheet_sheet_day AS day
ON (sheet.id = day.sheet_id
AND day.name = sheet.date_current) where sheet.id=htss.id) as total_timesheet,
(SELECT sum(day.total_attendance)
FROM hr_timesheet_sheet_sheet AS sheet
LEFT JOIN hr_timesheet_sheet_sheet_day AS day
ON (sheet.id = day.sheet_id
AND day.name = sheet.date_current) where sheet.id=htss.id) as total_attendance,
aal.to_invoice,
aal.general_account_id,
htss.employee_id as employee_id,
htss.company_id,
htss.department_id,
htss.state
from hr_timesheet_sheet_sheet as htss
left join hr_analytic_timesheet as hat ON (hat.create_uid=htss.create_uid)
left join account_analytic_line as aal ON (hat.line_id=aal.id)
group by
to_char(htss.date_current,'YYYY'),
to_char(htss.date_current,'MM'),
to_char(htss.date_current, 'YYYY-MM-DD'),
aal.account_id,
htss.date_from,
htss.date_to,
aal.unit_amount,
aal.amount,
htss.date_current,
aal.to_invoice,
aal.product_id,
aal.general_account_id,
htss.name,
htss.company_id,
htss.state,
htss.id,
htss.department_id,
htss.employee_id
)
""")
timesheet_report()

View File

@ -1,126 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="view_timesheet_report_graph" model="ir.ui.view">
<field name="name">timesheet.report.graph</field>
<field name="model">timesheet.report</field>
<field name="type">graph</field>
<field name="arch" type="xml">
<graph string="Timesheet" type="bar">
<field name="employee_id" />
<field name="quantity" operator = "+"/>
<field name="state" group = "True"/>
</graph>
</field>
</record>
<record id="view_timesheet_report_tree" model="ir.ui.view">
<field name="name">timesheet.report.tree</field>
<field name="model">timesheet.report</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree colors="blue:state in ('draft');black:state in ('confirm','new');gray:state in('cancel')" string="Timesheet">
<field name="date_current" invisible="1"/>
<field name="name" invisible="1"/>
<field name="employee_id" invisible="1"/>
<field name="date_from" invisible="1"/>
<field name="date_to" invisible="1"/>
<field name="state" invisible="1"/>
<field name="department_id" invisible="1"/>
<field name="company_id" invisible="1"/>
<field name="to_invoice" invisible="1"/>
<field name="product_id" invisible="1"/>
<field name="account_id" invisible="1" groups="analytic.group_analytic_accounting"/>
<field name="general_account_id" invisible="1"/>
<field name="year" invisible="1"/>
<field name="day" invisible="1"/>
<field name="month" invisible="1"/>
<field name="total_attendance" sum="#Total Attendance"/>
<field name="total_timesheet" sum="#Total Timesheet"/>
<field name="total_diff" sum="#Total Diff"/>
<field name="quantity" sum="#Quantity"/>
<field name="cost" sum="#Cost"/>
</tree>
</field>
</record>
<record id="view_timesheet_report_search" model="ir.ui.view">
<field name="name">timesheet.report.search</field>
<field name="model">timesheet.report</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Timesheet">
<group col="10" colspan="12">
<filter icon="terp-go-year" string=" Year "
domain="[('date_current','&lt;=', time.strftime('%%Y-%%m-%%d')),('date_current','&gt;',(datetime.date.today()-datetime.timedelta(days=365)).strftime('%%Y-%%m-%%d'))]"
help="Timesheet in current year"/>
<filter icon="terp-go-month" string=" Month "
name="month"
domain="[('date_current','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date_current','&gt;',(datetime.date.today()-datetime.timedelta(days=30)).strftime('%%Y-%%m-%%d'))]"
help="Timesheet in current month"/>
<filter icon="terp-go-month"
string=" Month-1 "
domain="[('date_current','&lt;=', (datetime.date (int(time.strftime('%%Y')), datetime.date.today().month, 1) - datetime.timedelta (days = 1)).strftime('%%Y-%%m-%%d')),('date_current','&gt;',(datetime.date (int(time.strftime('%%Y')), datetime.date.today().month-1, 1)).strftime('%%Y-%%m-%%d'))]"
help="Timesheet of last month"/>
<separator orientation="vertical"/>
<filter icon="terp-document-new"
string="Draft"
domain="[('state','=','draft')]"/>
<filter icon="terp-camera_test"
string="Confirmed"
domain="[('state','=','confirm')]"/>
<filter icon="terp-dialog-close"
string="Done"
domain="[('state','=','done')]"/>
<separator orientation="vertical"/>
<field name="employee_id" />
<field name="account_id" groups="analytic.group_analytic_accounting"/>
</group>
<newline/>
<group expand="0" string="Extended Filters..." groups="base.group_extended">
<field name="general_account_id"/>
<field name="to_invoice" widget="selection"/>
<separator orientation="vertical"/>
<field name="product_id"/>
<separator orientation="vertical"/>
<field name="department_id" widget="selection"/>
<separator orientation="vertical"/>
<field name="company_id" widget="selection" groups="base.group_multi_company"/>
<newline/>
<field name="date_to"/>
<field name="date_from"/>
</group>
<newline/>
<group expand="1" string="Group By...">
<filter string="Employee" name="Employee_id" icon="terp-personal" context="{'group_by':'employee_id'}"/>
<filter string="Department" icon="terp-personal+" context="{'group_by':'department_id'}"/>
<separator orientation="vertical"/>
<filter string="Product" icon="terp-accessories-archiver" context="{'group_by':'product_id'}"/>
<separator orientation="vertical"/>
<filter string="Type of Invoicing" icon="terp-stock_symbol-selection" context="{'group_by':'to_invoice'}"/>
<separator orientation="vertical"/>
<filter string="Analytic Account" icon="terp-folder-green" context="{'group_by':'account_id'}" groups="analytic.group_analytic_accounting"/>
<filter string="General Account" icon="terp-folder-orange" context="{'group_by':'general_account_id'}"/>
<separator orientation="vertical"/>
<filter string="State" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/>
<separator orientation="vertical"/>
<filter string="Company" icon="terp-go-home" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
<separator orientation="vertical"/>
<filter string="Day" icon="terp-go-today" context="{'group_by':'day'}" help="Group by day of date"/>
<filter string="Month" icon="terp-go-month" context="{'group_by':'month'}" help="Group by month of date"/>
<filter string="Year" icon="terp-go-year" context="{'group_by':'year'}" help="Group by year of date"/>
</group>
</search>
</field>
</record>
<record id="action_timesheet_report_stat_all" model="ir.actions.act_window">
<field name="name">Timesheet Sheet Analysis</field>
<field name="res_model">timesheet.report</field>
<field name="view_type">form</field>
<field name="view_mode">tree,graph</field>
<field name="context">{'search_default_month':1,'search_default_Employee_id':1,'group_by_no_leaf':1,'group_by':[]}</field>
<field name="search_view_id" ref="view_timesheet_report_search"/>
</record>
<menuitem action="action_timesheet_report_stat_all" id="menu_timesheet_report_all"
parent="hr_timesheet.menu_hr_reporting_timesheet" sequence="1" groups="base.group_hr_manager"/>
</data>
</openerp>

View File

@ -88,16 +88,10 @@
<child1>
<action colspan="4" height="100" name="%(action_view_task_tree)d" string="My Open Tasks" width="510"/>
<action colspan="4" height="100" name="%(action_view_delegate_task_tree)d" string="My Delegated Tasks" width="510"/>
</child1>
</child1>
<child2>
<vpaned>
<child1>
<action colspan="4" height="100" name="%(project.action_project_vs_planned_total_hours_graph)d" string="My Projects: Planned vs Total Hours" />
</child1>
<child2>
<action colspan="4" height="100" name="%(project.action_project_vs_remaining_hours_graph)d" string="My Remaining Hours by Project" />
</child2>
</vpaned>
<action colspan="4" height="100" name="%(project.action_project_vs_planned_total_hours_graph)d" string="My Projects: Planned vs Total Hours" />
<action colspan="4" height="100" name="%(project.action_project_vs_remaining_hours_graph)d" string="My Remaining Hours by Project" />
</child2>
</hpaned>
</form>

View File

@ -27,7 +27,7 @@
</group>
<notebook colspan="4">
<page string="Administration">
<group col="2" colspan="2">
<group col="2" colspan="2" groups="base.group_extended">
<separator colspan="2" string="Scheduling"/>
<field name="priority"/>
<field name="active"/>
@ -67,16 +67,18 @@
</tree>
</field>
</page>
<page groups="base.group_extended" string="Accounting">
<field colspan="4" name="partner_id" on_change="onchange_partner_id(partner_id)" select="1"/>
<page string="Billing" groups="account.group_account_invoice">
<field colspan="4" name="partner_id" on_change="onchange_partner_id(partner_id)" select="1" string="Customer"/>
<field domain="[('partner_id','=',partner_id)]" name="contact_id" string="Invoice Address"/>
<field name="warn_customer"/>
<newline/>
<separator colspan="2" string="Mail Header"/>
<separator colspan="2" string="Mail Footer"/>
<field name="warn_header" nolabel="1" colspan="2"/>
<field name="warn_footer" nolabel="1" colspan="2"/>
<group col="3" colspan="4">
<group colspan="4" col="4" groups="base.group_extended">
<separator colspan="2" string="Mail Header"/>
<separator colspan="2" string="Mail Footer"/>
<field name="warn_header" nolabel="1" colspan="2"/>
<field name="warn_footer" nolabel="1" colspan="2"/>
</group>
<group col="3" colspan="4" groups="base.group_extended">
<separator string="Automatic variables for headers and footer. Use exactly the same notation." colspan="4"/>
<label string="Task: %%(name)s"/>
<label string="User: %%(user_id)s"/>

View File

@ -11,9 +11,9 @@
<group colspan="4" col="4">
<separator colspan="4" string="Invoicing Data"/>
<field name="pricelist_id" domain="[('type','=','sale')]" widget="selection"/>
<field name="to_invoice" widget="selection"/>
<field name="amount_max"/>
<field name="amount_invoiced"/>
<field name="to_invoice" widget="selection" string="Invoice Task Work"/>
<field name="amount_max" groups="base.group_extended"/>
<field name="amount_invoiced" groups="base.group_extended"/>
</group>
</field>
</field>