[MERGE] addons 16 hr attendances
bzr revid: fp@openerp.com-20121102155907-imopbpyapswzsp3u
This commit is contained in:
@@ -57,6 +57,7 @@ class report_custom(report_rml):
|
||||
if emp_ids:
|
||||
for emp in obj_emp.read(cr, uid, emp_ids, ['name']):
|
||||
stop, days_xml = False, []
|
||||
total_wh = 0.0
|
||||
user_repr = '''
|
||||
<user>
|
||||
<name>%s</name>
|
||||
@@ -92,11 +93,15 @@ class report_custom(report_rml):
|
||||
else:
|
||||
ldt = dt
|
||||
# Week xml representation
|
||||
total_wh += wh
|
||||
wh = hour2str(wh)
|
||||
today_xml = '<day num="%s"><wh>%s</wh></day>' % ((today - month).days+1, (wh))
|
||||
dy=(today - month).days+1
|
||||
days_xml.append(today_xml)
|
||||
today, tomor = tomor, tomor + one_day
|
||||
total_wh = hour2str(total_wh)
|
||||
today_xml = '<day num="Total"><wh>%s</wh></day>' % (total_wh)
|
||||
days_xml.append(today_xml)
|
||||
user_xml.append(user_repr % '\n'.join(days_xml))
|
||||
|
||||
rpt_obj = pooler.get_pool(cr.dbname).get('hr.employee')
|
||||
@@ -174,8 +179,9 @@ class report_custom(report_rml):
|
||||
cell=cell+x
|
||||
width_dict[j]=x
|
||||
day_diff1=day_diff1-x
|
||||
date_xml += ['<dayy name="Total" cell="Total"/>']
|
||||
date_xml.append('</days>')
|
||||
date_xml.append('<cols>3.5cm%s</cols>\n' % (',0.74cm' * (int(dy))))
|
||||
date_xml.append('<cols>3.5cm%s,1.2cm</cols>\n' % (',0.74cm' * (int(dy))))
|
||||
xml = '''<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<report>
|
||||
%s
|
||||
@@ -183,7 +189,7 @@ class report_custom(report_rml):
|
||||
%s
|
||||
%s
|
||||
</report>
|
||||
''' % (header_xml,_('Attendances By Month'),'\n'.join(user_xml),date_xml)
|
||||
''' % (header_xml,_('Attendances by Month'),'\n'.join(user_xml),date_xml)
|
||||
return xml
|
||||
|
||||
report_custom('report.hr.attendance.bymonth', 'hr.employee', '', 'addons/hr_attendance/report/bymonth.xsl')
|
||||
|
||||
@@ -20,12 +20,15 @@
|
||||
##############################################################################
|
||||
|
||||
|
||||
import time
|
||||
from datetime import datetime
|
||||
from dateutil.relativedelta import relativedelta
|
||||
|
||||
import pooler
|
||||
from report.interface import report_rml
|
||||
from report.interface import toxml
|
||||
from report import report_sxw
|
||||
from tools.translate import _
|
||||
import tools
|
||||
|
||||
one_week = relativedelta(days=7)
|
||||
@@ -38,7 +41,8 @@ class report_custom(report_rml):
|
||||
|
||||
def create_xml(self, cr, uid, ids, datas, context=None):
|
||||
obj_emp = pooler.get_pool(cr.dbname).get('hr.employee')
|
||||
ids = datas['active_ids']
|
||||
|
||||
emp_ids = datas['active_ids']
|
||||
start_date = datetime.strptime(datas['form']['init_date'], '%Y-%m-%d')
|
||||
end_date = datetime.strptime(datas['form']['end_date'], '%Y-%m-%d')
|
||||
first_monday = start_date - relativedelta(days=start_date.date().weekday())
|
||||
@@ -47,9 +51,16 @@ class report_custom(report_rml):
|
||||
if last_monday < first_monday:
|
||||
first_monday, last_monday = last_monday, first_monday
|
||||
|
||||
rpt_obj = pooler.get_pool(cr.dbname).get('hr.employee')
|
||||
rml_obj=report_sxw.rml_parse(cr, uid, rpt_obj._name,context)
|
||||
header_xml = '''
|
||||
<header>
|
||||
<date>%s</date>
|
||||
<company>%s</company>
|
||||
</header>
|
||||
''' % (str(rml_obj.formatLang(time.strftime("%Y-%m-%d"),date=True))+' ' + str(time.strftime("%H:%M")),pooler.get_pool(cr.dbname).get('res.users').browse(cr,uid,uid).company_id.name)
|
||||
user_xml = []
|
||||
|
||||
for employee_id in ids:
|
||||
for employee_id in emp_ids:
|
||||
emp = obj_emp.read(cr, uid, [employee_id], ['id', 'name'])[0]
|
||||
monday, n_monday = first_monday, first_monday + one_week
|
||||
stop, week_xml = False, []
|
||||
@@ -88,7 +99,7 @@ class report_custom(report_rml):
|
||||
ldt = dt
|
||||
|
||||
# Week xml representation
|
||||
week_repr = ['<week>', '<weekstart>%s</weekstart>' % monday.strftime('%Y-%m-%d'), '<weekend>%s</weekend>' % n_monday.strftime('%Y-%m-%d')]
|
||||
week_repr = ['<week>', '<weekstart>%s</weekstart>' % monday.strftime('%Y-%m-%d'), '<weekend>%s</weekend>' % (n_monday - relativedelta(days=1)).strftime('%Y-%m-%d')]
|
||||
for idx in range(7):
|
||||
week_repr.append('<%s>' % num2day[idx])
|
||||
if idx in week_wh:
|
||||
@@ -98,17 +109,17 @@ class report_custom(report_rml):
|
||||
week_repr.append('<worked>%sh%02d</worked>' % to_hour(reduce(lambda x,y:x+y, week_wh.values(), 0)))
|
||||
week_repr.append('</total>')
|
||||
week_repr.append('</week>')
|
||||
if len(week_repr) > 21: # 21 = minimal length of week_repr
|
||||
week_xml.append('\n'.join(week_repr))
|
||||
week_xml.append('\n'.join(week_repr))
|
||||
|
||||
monday, n_monday = n_monday, n_monday + one_week
|
||||
user_xml.append(user_repr % '\n'.join(week_xml))
|
||||
|
||||
xml = '''<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<report>
|
||||
%s
|
||||
<title>%s</title>
|
||||
%s
|
||||
</report>
|
||||
''' % '\n'.join(user_xml)
|
||||
''' % (header_xml,_('Attendances by Week'),'\n'.join(user_xml))
|
||||
xml = tools.ustr(xml).encode('utf8')
|
||||
return self.post_process_xml_data(cr, uid, xml, context)
|
||||
|
||||
|
||||
@@ -3,12 +3,15 @@
|
||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
xmlns:fo="http://www.w3.org/1999/XSL/Format">
|
||||
|
||||
<xsl:import href="hr_custom_default.xsl"/>
|
||||
<xsl:import href="hr_custom_rml.xsl"/>
|
||||
|
||||
<xsl:template match="/">
|
||||
<xsl:call-template name="rml" />
|
||||
</xsl:template>
|
||||
|
||||
|
||||
<xsl:template name="rml">
|
||||
<xsl:template name="stylesheet">
|
||||
<document filename="timesheet.pdf">
|
||||
<template pageSize="29.7cm,21cm" leftMargin="2.0cm" rightMargin="2.0cm" topMargin="2.0cm" bottomMargin="2.0cm" title="Timesheets" author="Generated by Open ERP, Fabien Pinckaers" allowSplitting="20">
|
||||
<pageTemplate id="first">
|
||||
@@ -20,11 +23,17 @@
|
||||
</template>
|
||||
|
||||
<stylesheet>
|
||||
<paraStyle name="title" fontName="Helvetica-Bold" fontSize="15.0" leading="17" alignment="CENTER" spaceBefore="12.0" spaceAfter="6.0"/>
|
||||
<paraStyle name="emp" fontSize="13.0"/>
|
||||
<blockTableStyle id="week">
|
||||
<blockFont name="Helvetica-BoldOblique" size="12" start="0,0" stop="-1,0"/>
|
||||
<blockBackground colorName="grey" start="0,0" stop="-1,0"/>
|
||||
<blockTextColor colorName="red" start="-1,0" stop="-1,-1"/>
|
||||
<lineStyle kind="LINEBEFORE" colorName="grey" start="-1,0" stop="-1,-1"/>
|
||||
<blockFont name="Helvetica" size="9" start="0,0" stop="-1,-1"/>
|
||||
<blockFont name="Helvetica-BoldOblique" size="12" start="0,0" stop="0,0"/>
|
||||
<blockBackground colorName="lightgrey" start="1,0" stop="-1,0"/>
|
||||
<blockFont name="Helvetica-BoldOblique" start="-1,0" stop="-1,-1"/>
|
||||
<lineStyle kind="LINEABOVE" colorName="black" start="0,0" stop="-1,0" />
|
||||
<lineStyle kind="LINEBEFORE" colorName="black" start="0,0" stop="-1,-1"/>
|
||||
<lineStyle kind="LINEAFTER" colorName="black" start="-1,0" stop="-1,-1"/>
|
||||
<lineStyle kind="LINEBELOW" colorName="black" start="0,0" stop="-1,-1"/>
|
||||
<blockValign value="TOP"/>
|
||||
</blockTableStyle>
|
||||
</stylesheet>
|
||||
@@ -36,32 +45,37 @@
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="story">
|
||||
<spacer length="1cm" />
|
||||
<xsl:apply-templates select="report/title"/>
|
||||
<xsl:apply-templates select="report/user"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="title">
|
||||
<para style="title">
|
||||
<xsl:value-of select="."/>
|
||||
</para>
|
||||
<spacer length="1cm"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="user">
|
||||
<para>
|
||||
<b>Name:</b>
|
||||
<spacer length="1cm" />
|
||||
<para style="emp">
|
||||
<b>Employee: </b>
|
||||
<i><xsl:value-of select="name" /></i>
|
||||
</para>
|
||||
<blockTable colWidths="4cm,1.5cm,1.5cm,1.5cm,1.5cm,1.5cm,1.5cm,1.5cm,1.5cm" style="week">
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>Mon</td>
|
||||
<td>Tue</td>
|
||||
<td>Wed</td>
|
||||
<td>Thu</td>
|
||||
<td>Fri</td>
|
||||
<td>Sat</td>
|
||||
<td>Sun</td>
|
||||
<td>Tot</td>
|
||||
</tr>
|
||||
<xsl:for-each select="week">
|
||||
<tr></tr>
|
||||
<spacer length="0.5cm" />
|
||||
<xsl:for-each select="week">
|
||||
<blockTable colWidths="8cm,2cm,2cm,2cm,2cm,2cm,2cm,2cm,2cm" style="week">
|
||||
<tr>
|
||||
<td>Week:</td>
|
||||
<td></td>
|
||||
<td>from <xsl:value-of select="weekstart" /> to <xsl:value-of select="weekend" /></td>
|
||||
<td>From <xsl:value-of select="weekstart" /> to <xsl:value-of select="weekend" /></td>
|
||||
<td>Mon</td>
|
||||
<td>Tue</td>
|
||||
<td>Wed</td>
|
||||
<td>Thu</td>
|
||||
<td>Fri</td>
|
||||
<td>Sat</td>
|
||||
<td>Sun</td>
|
||||
<td>Total</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Worked hours</td>
|
||||
@@ -70,7 +84,7 @@
|
||||
<xsl:when test="Monday/workhours">
|
||||
<xsl:value-of select="Monday/workhours" />
|
||||
</xsl:when>
|
||||
<xsl:otherwise>0</xsl:otherwise>
|
||||
<xsl:otherwise>0h00</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</td>
|
||||
<td>
|
||||
@@ -78,7 +92,7 @@
|
||||
<xsl:when test="Tuesday/workhours">
|
||||
<xsl:value-of select="Tuesday/workhours" />
|
||||
</xsl:when>
|
||||
<xsl:otherwise>0</xsl:otherwise>
|
||||
<xsl:otherwise>0h00</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</td>
|
||||
<td>
|
||||
@@ -86,7 +100,7 @@
|
||||
<xsl:when test="Wednesday/workhours">
|
||||
<xsl:value-of select="Wednesday/workhours" />
|
||||
</xsl:when>
|
||||
<xsl:otherwise>0</xsl:otherwise>
|
||||
<xsl:otherwise>0h00</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</td>
|
||||
<td>
|
||||
@@ -94,7 +108,7 @@
|
||||
<xsl:when test="Thursday/workhours">
|
||||
<xsl:value-of select="Thursday/workhours" />
|
||||
</xsl:when>
|
||||
<xsl:otherwise>0</xsl:otherwise>
|
||||
<xsl:otherwise>0h00</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</td>
|
||||
<td>
|
||||
@@ -102,7 +116,7 @@
|
||||
<xsl:when test="Friday/workhours">
|
||||
<xsl:value-of select="Friday/workhours" />
|
||||
</xsl:when>
|
||||
<xsl:otherwise>0</xsl:otherwise>
|
||||
<xsl:otherwise>0h00</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</td>
|
||||
<td>
|
||||
@@ -110,7 +124,7 @@
|
||||
<xsl:when test="Saturday/workhours">
|
||||
<xsl:value-of select="Saturday/workhours" />
|
||||
</xsl:when>
|
||||
<xsl:otherwise>0</xsl:otherwise>
|
||||
<xsl:otherwise>0h00</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</td>
|
||||
<td>
|
||||
@@ -118,14 +132,24 @@
|
||||
<xsl:when test="Sunday/workhours">
|
||||
<xsl:value-of select="Sunday/workhours" />
|
||||
</xsl:when>
|
||||
<xsl:otherwise>0</xsl:otherwise>
|
||||
<xsl:otherwise>0h00</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</td>
|
||||
<td>
|
||||
<xsl:value-of select="total/worked" />
|
||||
</td>
|
||||
</tr>
|
||||
</xsl:for-each>
|
||||
</blockTable>
|
||||
</blockTable>
|
||||
<xsl:if test="position() != last()">
|
||||
<blockTable colWidths="24cm" style="week">
|
||||
<tr>
|
||||
<td colspan="6"></td>
|
||||
</tr>
|
||||
</blockTable>
|
||||
</xsl:if>
|
||||
</xsl:for-each>
|
||||
<xsl:if test="position() != last()">
|
||||
<pageBreak/>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
import time
|
||||
from datetime import datetime
|
||||
from dateutil.relativedelta import relativedelta
|
||||
|
||||
from osv import osv, fields
|
||||
|
||||
@@ -30,8 +31,8 @@ class hr_attendance_byweek(osv.osv_memory):
|
||||
'end_date': fields.date('Ending Date', required=True)
|
||||
}
|
||||
_defaults = {
|
||||
'init_date': lambda *a: time.strftime('%Y-%m-%d'),
|
||||
'end_date': lambda *a: time.strftime('%Y-%m-%d'),
|
||||
'init_date': (datetime.today() - relativedelta(days=datetime.date(datetime.today()).weekday())).strftime('%Y-%m-%d'),
|
||||
'end_date': (datetime.today() + relativedelta(days=6 - datetime.date(datetime.today()).weekday())).strftime('%Y-%m-%d'),
|
||||
}
|
||||
|
||||
def print_report(self, cr, uid, ids, context=None):
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
<field name="date_from"/>
|
||||
<separator/>
|
||||
<filter icon="terp-check" domain="[('state','=','draft')]" string="To Confirm"/>
|
||||
<filter icon="terp-camera_test" domain="[('state','=','confirm')]" string="To Approve" name="approve"/>
|
||||
<filter icon="terp-camera_test" domain="[('state','in',('confirm','validate1'))]" string="To Approve" name="approve"/>
|
||||
<filter icon="terp-camera_test" domain="[('state','=','validate')]" string="Validated" name="validated"/>
|
||||
<separator/>
|
||||
<filter icon="terp-go-year" name="year" string="Year" domain="[('holiday_status_id.active','=',True)]" help="Filters only on allocations and requests that belong to an holiday type that is 'active' (active field is True)"/>
|
||||
|
||||
@@ -235,7 +235,6 @@ class hr_applicant(base_stage, osv.Model):
|
||||
'email_from': lambda s, cr, uid, c: s._get_default_email(cr, uid, c),
|
||||
'stage_id': lambda s, cr, uid, c: s._get_default_stage_id(cr, uid, c),
|
||||
'department_id': lambda s, cr, uid, c: s._get_default_department_id(cr, uid, c),
|
||||
'priority': lambda *a: '',
|
||||
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'hr.applicant', context=c),
|
||||
'color': 0,
|
||||
}
|
||||
|
||||
@@ -70,7 +70,7 @@ class hr_timesheet_sheet(osv.osv):
|
||||
if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).product_id:
|
||||
raise osv.except_osv(_('Error!'), _('In order to create a timesheet for this employee, you must link the employee to a product, like \'Consultant\'.'))
|
||||
if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).journal_id:
|
||||
raise osv.except_osv(_('Error!'), _('In order to create a timesheet for this employee, you must assign the employee to an analytic journal, like \'Timesheet\'.'))
|
||||
raise osv.except_osv(_('Configuration Error!'), _('In order to create a timesheet for this employee, you must assign an analytic journal to the employee, like \'Timesheet Journal\'.'))
|
||||
return super(hr_timesheet_sheet, self).create(cr, uid, vals, *args, **argv)
|
||||
|
||||
def write(self, cr, uid, ids, vals, *args, **argv):
|
||||
@@ -83,7 +83,7 @@ class hr_timesheet_sheet(osv.osv):
|
||||
if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).product_id:
|
||||
raise osv.except_osv(_('Error!'), _('In order to create a timesheet for this employee, you must link the employee to a product.'))
|
||||
if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).journal_id:
|
||||
raise osv.except_osv(_('Error!'), _('In order to create a timesheet for this employee, you must assign the employee to an analytic journal.'))
|
||||
raise osv.except_osv(_('Configuration Error!'), _('In order to create a timesheet for this employee, you must assign an analytic journal to the employee, like \'Timesheet Journal\'.'))
|
||||
return super(hr_timesheet_sheet, self).write(cr, uid, ids, vals, *args, **argv)
|
||||
|
||||
def button_confirm(self, cr, uid, ids, context=None):
|
||||
|
||||
Reference in New Issue
Block a user