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()
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, })
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
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())
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