Example #1
0
def _generate_payslips(cr, registry):
    env = api.Environment(cr, SUPERUSER_ID, {})

    # Do this only when demo data is activated
    if env.ref('l10n_be_hr_payroll.res_company_be', raise_if_not_found=False):
        if not env['hr.payslip'].sudo().search_count([('employee_id.name', '=', 'Marian Weaver')]):

            employees = env['hr.employee'].search([('company_id', '=', env.ref('l10n_be_hr_payroll.res_company_be').id)])
            wizard_vals = {
                'employee_ids': [(4, employee.id) for employee in employees],
                'structure_id': env.ref('l10n_be_hr_payroll.hr_payroll_structure_cp200_employee_salary').id
            }
            cids = env.ref('l10n_be_hr_payroll.res_company_be').ids

            for i in range(2, 20):
                date_start = Datetime.today() - relativedelta(months=i, day=1)
                date_end = Datetime.today() - relativedelta(months=i, day=31)
                payslip_run = env['hr.payslip.run'].create({
                    'name': date_start.strftime('%B %Y'),
                    'date_start': date_start,
                    'date_end': date_end,
                    'company_id': env.ref('l10n_be_hr_payroll.res_company_be').id,
                })
                wizard = env['hr.payslip.employees'].create(wizard_vals)
                wizard.with_context(active_id=payslip_run.id, allowed_company_ids=cids).compute_sheet()
                payslip_run.with_context(allowed_company_ids=cids).action_validate()
Example #2
0
 def create_leave(cls, date_from=None, date_to=None):
     date_from = date_from or Datetime.today()
     date_to = date_to or Datetime.today() + relativedelta(days=1)
     return cls.env['hr.leave'].create({
         'name': 'Holiday !!!',
         'employee_id': cls.richard_emp.id,
         'holiday_status_id': cls.leave_type.id,
         'date_to': date_to,
         'date_from': date_from,
         'number_of_days': 1,
     })
Example #3
0
    def setUp(self):
        super().setUp()
        self.event_2 = self.env['event.event'].create({
            'name': 'Conference for Architects TEST',
            'user_id': self.env.ref('base.user_admin').id,
            'date_begin': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 07:00:00'),
            'date_end': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 16:30:00'),
            'website_published': True,
        })

        self.env['event.event.ticket'].create([{
            'name': 'Standard',
            'event_id': self.event_2.id,
            'product_id': self.env.ref('event_sale.product_product_event').id,
            'start_sale_datetime': (Datetime.today() - timedelta(days=5)).strftime('%Y-%m-%d 07:00:00'),
            'end_sale_datetime': (Datetime.today() + timedelta(90)).strftime('%Y-%m-%d'),
            'price': 1000.0,
        }, {
            'name': 'VIP',
            'event_id': self.event_2.id,
            'product_id': self.env.ref('event_sale.product_product_event').id,
            'end_sale_datetime': (Datetime.today() + timedelta(90)).strftime('%Y-%m-%d'),
            'price': 1500.0,
        }])

        # flush event to ensure having tickets available in the tests
        self.event_2.flush()

        (self.env.ref('base.partner_admin') + self.partner_demo).write({
            'street': '215 Vine St',
            'city': 'Scranton',
            'zip': '18503',
            'country_id': self.env.ref('base.us').id,
            'state_id': self.env.ref('base.state_us_39').id,
            'phone': '+1 555-555-5555',
            'email': '*****@*****.**',
        })

        cash_journal = self.env['account.journal'].create({'name': 'Cash - Test', 'type': 'cash', 'code': 'CASH - Test'})
        self.env.ref('payment.payment_acquirer_transfer').journal_id = cash_journal
Example #4
0
    def _test_work_entries(self):
        work_entry_type = self.create_work_entry_type(
            user=self.hr_payroll_manager,
            name='bla',
            code='TYPE100',
        )
        work_entry_type_leave = self.create_work_entry_type(
            user=self.hr_payroll_manager,
            name='bla bla',
            code='TYPE200',
            is_leave=True,
        )
        self.link_leave_work_entry_type(
            user=self.hr_payroll_manager,
            work_entry_type=work_entry_type_leave,
            leave_type=self.leave_type_1,
        )

        # Request a leave but don't approve it
        non_approved_leave = self.create_leave(
            user=self.user,
            leave_type=self.leave_type_1,
            start=Datetime.now() + relativedelta(days=12),
            end=Datetime.now() + relativedelta(days=13)
        )

        self.user.employee_id.with_user(self.hr_payroll_user).generate_work_entries(Datetime.today().replace(day=1), Datetime.today() + relativedelta(months=1, day=1, days=-1, hour=23, minute=59))
        work_entries = self.env['hr.work.entry'].with_user(self.hr_payroll_user).search([('employee_id', '=', self.user.employee_id.id)])
        # should not be able to validate
        self.assertFalse(work_entries.with_user(self.hr_payroll_user).action_validate())
        work_entries_with_error = work_entries.filtered(lambda b: b.state == 'conflict')

        self.env['hr.leave'].search([('employee_id', "=", self.user.employee_id.id)])
        # Check work_entries without a type
        undefined_type = work_entries_with_error.filtered(lambda b: not b.work_entry_type_id)
        self.assertTrue(undefined_type)  # some leave types we created earlier are not linked to any work entry type
        undefined_type.write({'work_entry_type_id': work_entry_type_leave.id})

        # Check work_entries conflicting with a leave, approve them as payroll manager
        conflicting_leave = work_entries_with_error.filtered(lambda b: b.leave_id and b.leave_id.state != 'validate')
        conflicting_leave.mapped('leave_id').with_user(self.hr_payroll_user).action_approve()

        # Reload work_entries (some might have been deleted/created when approving leaves)
        work_entries = self.env['hr.work.entry'].with_user(self.hr_payroll_user).search([('employee_id', '=', self.user.employee_id.id)])

        # Some work entries are still conflicting (if not completely included in a leave)
        self.assertFalse(work_entries.with_user(self.hr_payroll_user).action_validate())
        work_entries.filtered(lambda w: w.state == 'conflict').write({'state': 'cancelled'})
        self.assertTrue(work_entries.with_user(self.hr_payroll_user).action_validate())
Example #5
0
from dateutil.relativedelta import relativedelta
from odoo.tools import date_utils
from odoo.fields import Datetime

today = Datetime.today()
# today = datetime.strptime('2019-03-29 01:53:48', misc.DEFAULT_SERVER_DATETIME_FORMAT)
# Представим, что сейчас 2019-03-29 01:53:48

date_utils.get_month(today)
# (datetime.datetime(2019, 3, 1, 0, 0), datetime.datetime(2019, 3, 31, 0, 0))
date_utils.get_quarter(today)
# (datetime.datetime(2019, 1, 1, 0, 0), datetime.datetime(2019, 3, 31, 0, 0))
date_utils.get_quarter_number(today)
# 1
date_utils.get_fiscal_year(today)
# (datetime.datetime(2019, 1, 1, 0, 0), datetime.datetime(2019, 12, 31, 0, 0))

date_utils.start_of(today, 'hour')
# 2019-03-29 01:00:00
date_utils.start_of(today, 'day')
# 2019-03-29 00:00:00
date_utils.start_of(today, 'week')
# 2019-03-25 00:00:00
date_utils.start_of(today, 'month')
# 2019-03-01 00:00:00
date_utils.start_of(today, 'quarter')
# 2019-01-01 00:00:00
date_utils.start_of(today, 'year')
# 2019-01-01 00:00:00

date_utils.end_of(today, 'hour')
    def test_read_grid_method_datetime(self):
        project_id = self.grid_obj_1.project_id
        row_field = []
        col_field = "start_datetime"
        cell_field = "resource_hours"
        domain = [('project_id', '=', project_id.id)]

        lang = self.env['res.lang'].search([('code', '=', self.env.user.lang)])
        lang.write({'week_start': '1'})

        timezone = 'Asia/Kolkata'
        # For checking for day range ('span': 'month', 'step': 'day')
        result_read_grid = self.grid_obj_1.with_context(
            tz=timezone, grid_anchor="2019-06-14 00:00:00").read_grid(
                row_field, col_field, cell_field, domain, self.range_day)

        # For checking today, previous and next grid_anchor
        self.assertEqual(
            result_read_grid.get('prev').get('grid_anchor'),
            "2019-05-14 00:00:00")
        self.assertEqual(
            result_read_grid.get('next').get('grid_anchor'),
            "2019-07-14 00:00:00")

        today_utc = pytz.utc.localize(Datetime.today(self.env.user))
        today_user_tz = today_utc.astimezone(pytz.timezone('Asia/Kolkata'))
        self.assertEqual(
            result_read_grid.get('initial').get('grid_anchor'),
            Datetime.to_string(today_user_tz))

        # Should have 30 cols for 30 days of June and 1 row for grid_obj_1
        self.assertEqual(len(result_read_grid.get('cols')), 30)
        self.assertEqual(len(result_read_grid.get('rows')), 1)

        day_of_work = self.grid_obj_1.start_datetime.day - 1
        self.assertEqual(
            result_read_grid.get('grid')[0][day_of_work].get('value'),
            self.grid_obj_1.resource_hours)

        # For checking readonly of freeze cell
        result_read_grid_readonly = self.grid_obj_1_validated.with_context(
            grid_anchor="2019-06-14 00:00:00").read_grid(
                row_field,
                col_field,
                cell_field,
                domain,
                self.range_day,
                readonly_field='validated')
        day_of_work = self.grid_obj_1_validated.start_datetime.day - 1
        self.assertEqual(
            result_read_grid_readonly.get('grid')[0][day_of_work].get(
                'readonly'), True)

        # For checking week range ('span': 'month', 'step': 'week')
        result_read_grid = self.grid_obj_1.with_context(
            grid_anchor="2019-06-14 00:00:00").read_grid(
                row_field, col_field, cell_field, domain, self.range_week_2)

        # Should have 5 weeks in cols
        self.assertEqual(len(result_read_grid.get('cols')), 5)
        col0 = result_read_grid.get('cols')[0]
        week1_start_date0 = col0.get('values').get('start_datetime')
        self.assertEqual(week1_start_date0[0],
                         "2019-05-27 00:00:00/2019-06-03 00:00:00")
        col4 = result_read_grid.get('cols')[4]
        week1_start_date4 = col4.get('values').get('start_datetime')
        self.assertEqual(week1_start_date4[0],
                         "2019-06-24 00:00:00/2019-07-01 00:00:00")

        # Since the start datetime for obj_1 is 2019-06-14 11:30:00, so it is the third week according to its domain
        self.assertEqual(
            result_read_grid.get('grid')[0][2].get('value'), self.grid_obj_1.
            resource_hours)  # resource_hours for grid_obj_1 is 3.0