def _interval_dates(self, frequency, company): """ Method used to compute the theoretical date from which account move lines should be fetched @param {string} frequency: a valid value of the selection field on the object (daily, monthly, annually) frequencies are literal (daily means 24 hours and so on) @param {recordset} company: the company for which the closing is done @return {dict} the theoretical date from which account move lines are fetched. date_stop date to which the move lines are fetched, always now() the dates are in their COffice Database string representation """ date_stop = datetime.utcnow() interval_from = None name_interval = '' if frequency == 'daily': interval_from = date_stop - timedelta(days=1) name_interval = _('Daily Closing') elif frequency == 'monthly': month_target = date_stop.month > 1 and date_stop.month - 1 or 12 year_target = month_target < 12 and date_stop.year or date_stop.year - 1 interval_from = date_stop.replace(year=year_target, month=month_target) name_interval = _('Monthly Closing') elif frequency == 'annually': year_target = date_stop.year - 1 interval_from = date_stop.replace(year=year_target) name_interval = _('Annual Closing') return { 'interval_from': FieldDateTime.to_string(interval_from), 'date_stop': FieldDateTime.to_string(date_stop), 'name_interval': name_interval }
def ctx_tz(record, field): res_lang = None ctx = record._context tz_name = pytz.timezone(ctx.get('tz') or record.env.user.tz) timestamp = Datetime.from_string(record[field]) if ctx.get('lang'): res_lang = record.env['res.lang']._lang_get(ctx['lang']) if res_lang: timestamp = pytz.utc.localize(timestamp, is_dst=False) return datetime.strftime( timestamp.astimezone(tz_name), res_lang.date_format + ' ' + res_lang.time_format) return Datetime.context_timestamp(record, timestamp)
def poll(self, channels, last, options=None): if request.env.user.has_group('base.group_user'): ip_address = request.httprequest.remote_addr users_log = request.env['res.users.log'].search_count([ ('create_uid', '=', request.env.user.id), ('ip', '=', ip_address), ('create_date', '>=', Datetime.to_string(Datetime.now().replace(hour=0, minute=0, second=0, microsecond=0))) ]) if not users_log: with registry(request.env.cr.dbname).cursor() as cr: env = Environment(cr, request.env.user.id, {}) env['res.users.log'].create({'ip': ip_address}) return super(BusController, self).poll(channels, last, options=options)
def test_in_date_5(self): """ Receive the same lot at different times, once they're in the same location, the quants are merged and only the earliest incoming date is kept. """ lot1 = self.env['stock.production.lot'].create({ 'name': 'lot1', 'product_id': self.product_lot.id, 'company_id': self.env.company.id, }) from coffice.fields import Datetime in_date1 = Datetime.now() self.env['stock.quant']._update_available_quantity(self.product_lot, self.stock_location, 1.0, lot_id=lot1, in_date=in_date1) quant = self.env['stock.quant'].search([ ('product_id', '=', self.product_lot.id), ('location_id', '=', self.stock_location.id), ]) self.assertEqual(len(quant), 1) self.assertEqual(quant.quantity, 1) self.assertEqual(quant.lot_id.id, lot1.id) self.assertEqual(quant.in_date, in_date1) in_date2 = Datetime.now() - timedelta(days=5) self.env['stock.quant']._update_available_quantity(self.product_lot, self.stock_location, 1.0, lot_id=lot1, in_date=in_date2) quant = self.env['stock.quant'].search([ ('product_id', '=', self.product_lot.id), ('location_id', '=', self.stock_location.id), ]) self.assertEqual(len(quant), 1) self.assertEqual(quant.quantity, 2) self.assertEqual(quant.lot_id.id, lot1.id) self.assertEqual(quant.in_date, in_date2)
def test_contract_transfer_leaves(self): def create_calendar_leave(start, end, resource=None): return self.env['resource.calendar.leaves'].create({ 'name': 'leave name', 'date_from': start, 'date_to': end, 'resource_id': resource.id if resource else None, 'calendar_id': self.employee.resource_calendar_id.id, 'time_type': 'leave', }) start = Datetime.to_datetime('2015-11-17 07:00:00') end = Datetime.to_datetime('2015-11-20 18:00:00') leave1 = create_calendar_leave(start, end, resource=self.employee.resource_id) start = Datetime.to_datetime('2015-11-25 07:00:00') end = Datetime.to_datetime('2015-11-28 18:00:00') leave2 = create_calendar_leave(start, end, resource=self.employee.resource_id) # global leave start = Datetime.to_datetime('2015-11-25 07:00:00') end = Datetime.to_datetime('2015-11-28 18:00:00') leave3 = create_calendar_leave(start, end) self.calendar_richard.transfer_leaves_to( self.calendar_35h, resources=self.employee.resource_id, from_date=Date.to_date('2015-11-21')) self.assertEqual(leave1.calendar_id, self.calendar_richard, "It should stay in Richard's calendar") self.assertEqual(leave3.calendar_id, self.calendar_richard, "Global leave should stay in original calendar") self.assertEqual(leave2.calendar_id, self.calendar_35h, "It should be transfered to the other calendar") # Transfer global leaves self.calendar_richard.transfer_leaves_to( self.calendar_35h, resources=None, from_date=Date.to_date('2015-11-21')) self.assertEqual(leave3.calendar_id, self.calendar_35h, "Global leave should be transfered")
def dump_datetime(self, value, write): # override to marshall as a string for backwards compatibility value = Datetime.to_string(value) self.dump_unicode(value, write)
def _check_presence(self): company = self.env.company if not company.hr_presence_last_compute_date or \ company.hr_presence_last_compute_date.day != Datetime.now().day: self.env['hr.employee'].search([('company_id', '=', company.id) ]).write({ 'email_sent': False, 'ip_connected': False, 'manually_set_present': False }) employees = self.env['hr.employee'].search([('company_id', '=', company.id)]) all_employees = employees # Check on IP if literal_eval(self.env['ir.config_parameter'].sudo().get_param( 'hr.hr_presence_control_ip', 'False')): ip_list = company.hr_presence_control_ip_list ip_list = ip_list.split(',') if ip_list else [] ip_employees = self.env['hr.employee'] for employee in employees: employee_ips = self.env['res.users.log'].search([ ('create_uid', '=', employee.user_id.id), ('ip', '!=', False), ('create_date', '>=', Datetime.to_string(Datetime.now().replace(hour=0, minute=0, second=0, microsecond=0))) ]).mapped('ip') if any([ip in ip_list for ip in employee_ips]): ip_employees |= employee ip_employees.write({'ip_connected': True}) employees = employees - ip_employees # Check on sent emails if literal_eval(self.env['ir.config_parameter'].sudo().get_param( 'hr.hr_presence_control_email', 'False')): email_employees = self.env['hr.employee'] threshold = company.hr_presence_control_email_amount for employee in employees: sent_emails = self.env['mail.message'].search_count([ ('author_id', '=', employee.user_id.partner_id.id), ('date', '>=', Datetime.to_string(Datetime.now().replace( hour=0, minute=0, second=0, microsecond=0))), ('date', '<=', Datetime.to_string(Datetime.now())) ]) if sent_emails >= threshold: email_employees |= employee email_employees.write({'email_sent': True}) employees = employees - email_employees company.sudo().hr_presence_last_compute_date = Datetime.now() for employee in all_employees: employee.hr_presence_state_display = employee.hr_presence_state
def _compute_presence_state(self): super()._compute_presence_state() employees = self.filtered(lambda employee: employee.hr_presence_state != 'present' and not employee.is_absent) company = self.env.company for employee in employees: if not employee.is_absent and company.hr_presence_last_compute_date and company.hr_presence_last_compute_date.day == Datetime.now().day and \ (employee.email_sent or employee.ip_connected or employee.manually_set_present): employee.hr_presence_state = 'present'