===================
Attendance Scenario
===================

Imports::

    >>> import datetime as dt

    >>> from dateutil.relativedelta import relativedelta

    >>> from proteus import Model
    >>> from trytond.modules.company.tests.tools import create_company, get_company
    >>> from trytond.tests.tools import activate_modules, assertEqual, assertTrue

    >>> now = dt.datetime.now()
    >>> tomorrow = now + relativedelta(days=1)
    >>> next_week = now + relativedelta(days=7)

Activate attendance.line module::

    >>> config = activate_modules('attendance')

Create a company::

    >>> _ = create_company()
    >>> company = get_company()

Create an employee::

    >>> Party = Model.get('party.party')
    >>> Employee = Model.get('company.employee')
    >>> employee = Employee()
    >>> party = Party(name='Employee')
    >>> party.save()
    >>> employee.party = party
    >>> employee.company = company
    >>> employee.save()

Create an attendance record for the employee::

    >>> Attendance = Model.get('attendance.line')
    >>> attendance = Attendance()
    >>> attendance.type
    'in'
    >>> attendance.employee = employee
    >>> attendance.at = now
    >>> attendance.save()

    >>> assertEqual(attendance.date, now.date())
    >>> assertTrue(attendance.rec_name)

When creating a new attendance the type is automatically set::

    >>> attendance = Attendance()
    >>> attendance.employee = employee
    >>> attendance.at = now + relativedelta(hours=2)
    >>> attendance.type
    'out'
    >>> attendance.save()

Close the period::

    >>> Period = Model.get('attendance.period')
    >>> period = Period()
    >>> period.ends_at = now + relativedelta(hours=4)
    >>> period.click('close')
    >>> period.state
    'closed'

    >>> bool(period.rec_name)
    True

You can't create attendances in closed periods::

    >>> attendance = Attendance()
    >>> attendance.employee = employee
    >>> attendance.at = now
    >>> attendance.type = 'in'
    >>> attendance.save()
    Traceback (most recent call last):
        ...
    PeriodClosedError: ...

But it is possible in open periods::

    >>> attendance.at = tomorrow
    >>> attendance.save()

Update attendance date time, update its date::

    >>> attendance.at = next_week
    >>> attendance.save()

    >>> assertEqual(attendance.date, next_week.date())
