Exemplo n.º 1
0
    def index(self, **kwargs):
        method = request.httprequest.method
        if method == "GET":
            return request.render("hr_sf.attendance_index")
        elif method == "POST":
            Attendance = request.env["hr.attendance"].sudo()
            Employee = request.env["hr.employee"].sudo()
            UploadLog = request.env["hr_sf.attendance_upload_log"].sudo()

            try:
                upload_file = kwargs.get("upload_file", None)
                source = kwargs.get("source", None)
                if upload_file is None:
                    raise Exception("can not get upload file from http post data")
                upload_file_content = upload_file.stream.read()
                sniffer = csv.Sniffer()
                dialect = sniffer.sniff(upload_file_content, delimiters=',\t')
                rows = csv.reader(upload_file_content.splitlines(), dialect=dialect)

                upload_log = None
                if rows:
                    base64_file = base64.standard_b64encode(upload_file_content)
                    upload_log = UploadLog.create({"upload_file": base64_file, "file_name": upload_file.filename,
                                                   "date": Datetime.now(), "source": source})
                upload_log_id = upload_log.id

                employees = Employee.search([])
                employee_ids = dict(employees.mapped(lambda r: (r.internal_code, r.id)))

                line_number = 0
                values = []
                for row in rows:
                    code, name, year, month, day, hour, minute = row[0:7]
                    location = str(int(row[7]))

                    dt_str = "%s-%s-%s %s:%s:00" % (year, month, day, hour, minute)
                    dt = Datetime.from_string(dt_str)
                    dt = dt - datetime.timedelta(hours=8)
                    odoo_dt_str = Datetime.to_string(dt)

                    exist_count = Attendance.search_count([("code", "=", code), ("name", "=", odoo_dt_str)])
                    if exist_count <= 0:
                        emp_id = employee_ids.get(code, None)
                        if emp_id is not None:
                            # Attendance.create({"employee_id": emp_id, "name": odoo_dt_str, "location": location,
                            #                    "action": "action", "upload_log_id": upload_log_id})
                            values.append({"employee_id": emp_id, "name": odoo_dt_str, "location": location,
                                           "action": "action", "upload_log_id": upload_log_id,
                                           "forget_card": False})
                        else:
                            raise Exception("error in line:%d,employee with code:%s not found" % (line_number, code))
                    line_number += 1

                for value in values:
                    Attendance.create(value)

                return request.render("hr_sf.attendance_upload_finish", {"import_count": len(values)})
            except Exception, e:
                request.env.cr.rollback()
                return e.message or e.value
Exemplo n.º 2
0
    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 Odoo 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
        }
Exemplo n.º 3
0
    def _compute_leave_duration(self):
        for holiday in self:
            if all((holiday.date_from, holiday.date_to)):
                dt_date_from = Datetime.from_string(holiday.date_from)
                dt_date_to = Datetime.from_string(holiday.date_to)
                delta = dt_date_to - dt_date_from

                holiday.leave_duration = _("%ddays%dhours%dminutes") % (
                    delta.days, delta.seconds / 3600, (delta.seconds % 3600) / 60)
Exemplo n.º 4
0
    def _compute_leave_duration(self):
        for holiday in self:
            if all((holiday.date_from, holiday.date_to)):
                dt_date_from = Datetime.from_string(holiday.date_from)
                dt_date_to = Datetime.from_string(holiday.date_to)
                delta = dt_date_to - dt_date_from

                holiday.leave_duration = _("%ddays%dhours%dminutes") % (
                    delta.days, delta.seconds / 3600,
                    (delta.seconds % 3600) / 60)
Exemplo n.º 5
0
    def setUpClass(cls):
        super(TestRmaPurchase, cls).setUpClass()

        cls.rma_obj = cls.env['rma.order']
        cls.rma_line_obj = cls.env['rma.order.line']
        cls.rma_op_obj = cls.env['rma.operation']
        cls.rma_add_purchase_wiz = cls.env['rma_add_purchase']
        cls.po_obj = cls.env['purchase.order']
        cls.pol_obj = cls.env['purchase.order.line']
        cls.product_obj = cls.env['product.product']
        cls.partner_obj = cls.env['res.partner']

        cls.rma_route_cust = cls.env.ref('rma.route_rma_customer')

        # Create supplier
        supplier1 = cls.partner_obj.create({'name': 'Supplier 1'})

        # Create products
        cls.product_1 = cls.product_obj.create({
            'name': 'Test Product 1',
            'type': 'product',
        })
        cls.product_2 = cls.product_obj.create({
            'name': 'Test Product 2',
            'type': 'product',
        })

        # Create PO:
        cls.po = cls.po_obj.create({
            'partner_id': supplier1.id,
        })
        cls.pol_1 = cls.pol_obj.create({
            'name': cls.product_1.name,
            'order_id': cls.po.id,
            'product_id': cls.product_1.id,
            'product_qty': 20.0,
            'product_uom': cls.product_1.uom_id.id,
            'price_unit': 100.0,
            'date_planned': Datetime.now(),
        })
        cls.pol_2 = cls.pol_obj.create({
            'name': cls.product_2.name,
            'order_id': cls.po.id,
            'product_id': cls.product_2.id,
            'product_qty': 18.0,
            'product_uom': cls.product_2.uom_id.id,
            'price_unit': 150.0,
            'date_planned': Datetime.now(),
        })

        # Create RMA group:
        cls.rma_group = cls.rma_obj.create({
            'partner_id': supplier1.id,
            'type': 'supplier',
        })
Exemplo n.º 6
0
    def get_absent_on(self, date=None):
        self.ensure_one()
        if not date:
            return None

        querying_day = date
        if isinstance(date, datetime.date):
            querying_day = Date.to_string(date)

        absent_type = self.env.ref("hr_sf.absent_holidays_status")
        absent_type_id = absent_type.id

        for holiday in self.holidays_ids:
            if not holiday.date_from or not holiday.date_to:
                continue
            if holiday.holiday_status_id.id != absent_type_id:
                continue

            if not all((holiday.morning_start_work_time,
                        holiday.morning_end_work_time,
                        holiday.afternoon_start_work_time,
                        holiday.afternoon_end_work_time)):
                return None

            dt_the_day_morning_start_work_time = datetime.datetime.strptime(
                    "%s %s" % (querying_day, holiday.morning_start_work_time), DEFAULT_SERVER_DATETIME_FORMAT)
            dt_the_day_morning_end_work_time = datetime.datetime.strptime(
                    "%s %s" % (querying_day, holiday.morning_end_work_time), DEFAULT_SERVER_DATETIME_FORMAT)
            dt_the_day_afternoon_start_work_time = datetime.datetime.strptime(
                    "%s %s" % (querying_day, holiday.afternoon_start_work_time), DEFAULT_SERVER_DATETIME_FORMAT)
            dt_the_day_afternoon_end_work_time = datetime.datetime.strptime(
                    "%s %s" % (querying_day, holiday.afternoon_end_work_time), DEFAULT_SERVER_DATETIME_FORMAT)

            dt_holiday_from = Datetime.from_string(holiday.date_from) + datetime.timedelta(hours=8)
            dt_holiday_to = Datetime.from_string(holiday.date_to) + datetime.timedelta(hours=8)

            # deal with morning first
            dt_cal_start = max(dt_the_day_morning_start_work_time, dt_holiday_from)
            dt_cal_start = min(dt_cal_start, dt_the_day_morning_end_work_time)

            dt_cal_end = min(dt_the_day_morning_end_work_time, dt_holiday_to)
            dt_cal_end = max(dt_cal_end, dt_the_day_morning_start_work_time)

            if dt_cal_end > dt_cal_start:
                return absent_type.name

            # then deal with afternoon first
            dt_cal_start = max(dt_the_day_afternoon_start_work_time, dt_holiday_from)
            dt_cal_start = min(dt_cal_start, dt_the_day_afternoon_end_work_time)

            dt_cal_end = min(dt_the_day_afternoon_end_work_time, dt_holiday_to)
            dt_cal_end = max(dt_cal_end, dt_the_day_afternoon_start_work_time)

            if dt_cal_end > dt_cal_start:
                return absent_type.name
Exemplo n.º 7
0
    def get_work_duration_on(self, date=None):
        self.ensure_one()
        if not date:
            return None

        sign_in_attendance = self.get_sign_in_attendance(date)
        sign_out_attendance = self.get_sign_out_attendance(date)
        if sign_in_attendance and sign_out_attendance:
            dt_the_day_morning_start_work_time = datetime.datetime.strptime(
                "%s %s" % (date, sign_in_attendance.morning_start_work_time),
                DEFAULT_SERVER_DATETIME_FORMAT)
            dt_the_day_morning_end_work_time = datetime.datetime.strptime(
                "%s %s" % (date, sign_in_attendance.morning_end_work_time),
                DEFAULT_SERVER_DATETIME_FORMAT)
            dt_the_day_afternoon_start_work_time = datetime.datetime.strptime(
                "%s %s" %
                (date, sign_out_attendance.afternoon_start_work_time),
                DEFAULT_SERVER_DATETIME_FORMAT)
            dt_the_day_afternoon_end_work_time = datetime.datetime.strptime(
                "%s %s" % (date, sign_out_attendance.afternoon_end_work_time),
                DEFAULT_SERVER_DATETIME_FORMAT)

            dt_sign_in_time = Datetime.from_string(
                sign_in_attendance.name) + datetime.timedelta(hours=8)
            dt_sign_out_time = Datetime.from_string(
                sign_out_attendance.name) + datetime.timedelta(hours=8)

            # morning first
            dt_cal_start = max(dt_the_day_morning_start_work_time,
                               dt_sign_in_time)
            dt_cal_start = min(dt_cal_start, dt_the_day_morning_end_work_time)

            # dt_cal_end = min(dt_the_day_morning_end_work_time, dt_sign_out_time)
            # dt_cal_end = max(dt_cal_end, dt_the_day_morning_start_work_time)
            dt_cal_end = dt_the_day_morning_end_work_time
            work_duration = datetime.timedelta()
            if dt_cal_end > dt_cal_start:
                work_duration += dt_cal_end - dt_cal_start

            # then deal with afternoon
            # dt_cal_start = max(dt_the_day_afternoon_start_work_time, dt_sign_out_time)
            # dt_cal_start = min(dt_cal_start, dt_the_day_afternoon_end_work_time)
            dt_cal_start = dt_the_day_afternoon_start_work_time

            dt_cal_end = min(dt_the_day_afternoon_end_work_time,
                             dt_sign_out_time)
            dt_cal_end = max(dt_cal_end, dt_the_day_afternoon_start_work_time)

            if dt_cal_end > dt_cal_start:
                work_duration += dt_cal_end - dt_cal_start

            return work_duration.seconds / 3600.0
Exemplo n.º 8
0
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'].search([('code', '=', ctx['lang'])],
                                                 limit=1)
    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)
Exemplo n.º 9
0
 def _check_delay(self, cr, uid, action, record, record_dt, context=None):
     """ Override the check of delay to try to use a user-related calendar.
     If no calendar is found, fallback on the default behavior. """
     if action.trg_date_calendar_id and action.trg_date_range_type == 'day' and action.trg_date_resource_field_id:
         user = record[action.trg_date_resource_field_id.name]
         if user.employee_ids and user.employee_ids[0].contract_id \
                 and user.employee_ids[0].contract_id.working_hours:
             calendar = user.employee_ids[0].contract_id.working_hours
             start_dt = Datetime.from_string(record_dt)
             resource_id = user.employee_ids[0].resource_id.id
             action_dt = self.pool[
                 'resource.calendar'].schedule_days_get_date(
                     cr,
                     uid,
                     calendar.id,
                     action.trg_date_range,
                     day_date=start_dt,
                     compute_leaves=True,
                     resource_id=resource_id,
                     context=context)
             return action_dt
     return super(base_action_rule, self)._check_delay(cr,
                                                       uid,
                                                       action,
                                                       record,
                                                       record_dt,
                                                       context=context)
Exemplo n.º 10
0
    def _compute_leave_duration(self):
        for holiday in self:
            if all((holiday.morning_start_work_time, holiday.morning_end_work_time,
                    holiday.afternoon_start_work_time, holiday.afternoon_end_work_time)):
                if not all((holiday.date_from, holiday.date_to)):
                    continue
                dt_holiday_from = Datetime.from_string(holiday.date_from) + datetime.timedelta(hours=8)
                dt_holiday_to = Datetime.from_string(holiday.date_to) + datetime.timedelta(hours=8)

                leave = datetime.timedelta()

                dt_date = dt_holiday_from.date()
                while dt_date <= dt_holiday_to.date():
                    querying_day = dt_date.strftime(DEFAULT_SERVER_DATE_FORMAT)
                    dt_the_day_morning_start_work_time = datetime.datetime.strptime(
                            "%s %s" % (querying_day, holiday.morning_start_work_time), DEFAULT_SERVER_DATETIME_FORMAT)
                    dt_the_day_morning_end_work_time = datetime.datetime.strptime(
                            "%s %s" % (querying_day, holiday.morning_end_work_time), DEFAULT_SERVER_DATETIME_FORMAT)
                    dt_the_day_afternoon_start_work_time = datetime.datetime.strptime(
                            "%s %s" % (querying_day, holiday.afternoon_start_work_time), DEFAULT_SERVER_DATETIME_FORMAT)
                    dt_the_day_afternoon_end_work_time = datetime.datetime.strptime(
                            "%s %s" % (querying_day, holiday.afternoon_end_work_time), DEFAULT_SERVER_DATETIME_FORMAT)

                    # deal with morning first
                    dt_cal_start = max(dt_the_day_morning_start_work_time, dt_holiday_from)
                    dt_cal_start = min(dt_cal_start, dt_the_day_morning_end_work_time)

                    dt_cal_end = min(dt_the_day_morning_end_work_time, dt_holiday_to)
                    dt_cal_end = max(dt_cal_end, dt_the_day_morning_start_work_time)

                    if dt_cal_end > dt_cal_start:
                        leave += dt_cal_end - dt_cal_start

                    # then deal with afternoon first
                    dt_cal_start = max(dt_the_day_afternoon_start_work_time, dt_holiday_from)
                    dt_cal_start = min(dt_cal_start, dt_the_day_afternoon_end_work_time)

                    dt_cal_end = min(dt_the_day_afternoon_end_work_time, dt_holiday_to)
                    dt_cal_end = max(dt_cal_end, dt_the_day_afternoon_start_work_time)

                    if dt_cal_end > dt_cal_start:
                        leave += dt_cal_end - dt_cal_start

                    dt_date += datetime.timedelta(days=1)

                holiday.leave_duration = leave.days * 24.0 + leave.seconds / 3600.0
Exemplo n.º 11
0
 def _check_session_timing(self):
     self.ensure_one()
     date_today = datetime.utcnow()
     session_start = Datetime.from_string(self.start_at)
     if not date_today - datetime.timedelta(hours=24) <= session_start:
         raise UserError(
             _("This session has been opened another day. To comply with the French law, you should close sessions on a daily basis. Please close session %s and open a new one."
               ) % self.name)
     return True
Exemplo n.º 12
0
    def get_work_duration_on(self, date=None):
        self.ensure_one()
        if not date:
            return None

        sign_in_attendance = self.get_sign_in_attendance(date)
        sign_out_attendance = self.get_sign_out_attendance(date)
        if sign_in_attendance and sign_out_attendance:
            dt_the_day_morning_start_work_time = datetime.datetime.strptime(
                    "%s %s" % (date, sign_in_attendance.morning_start_work_time), DEFAULT_SERVER_DATETIME_FORMAT)
            dt_the_day_morning_end_work_time = datetime.datetime.strptime(
                    "%s %s" % (date, sign_in_attendance.morning_end_work_time), DEFAULT_SERVER_DATETIME_FORMAT)
            dt_the_day_afternoon_start_work_time = datetime.datetime.strptime(
                    "%s %s" % (date, sign_out_attendance.afternoon_start_work_time), DEFAULT_SERVER_DATETIME_FORMAT)
            dt_the_day_afternoon_end_work_time = datetime.datetime.strptime(
                    "%s %s" % (date, sign_out_attendance.afternoon_end_work_time), DEFAULT_SERVER_DATETIME_FORMAT)

            dt_sign_in_time = Datetime.from_string(sign_in_attendance.name) + datetime.timedelta(hours=8)
            dt_sign_out_time = Datetime.from_string(sign_out_attendance.name) + datetime.timedelta(hours=8)

            # morning first
            dt_cal_start = max(dt_the_day_morning_start_work_time, dt_sign_in_time)
            dt_cal_start = min(dt_cal_start, dt_the_day_morning_end_work_time)

            # dt_cal_end = min(dt_the_day_morning_end_work_time, dt_sign_out_time)
            # dt_cal_end = max(dt_cal_end, dt_the_day_morning_start_work_time)
            dt_cal_end = dt_the_day_morning_end_work_time
            work_duration = datetime.timedelta()
            if dt_cal_end > dt_cal_start:
                work_duration += dt_cal_end - dt_cal_start

            # then deal with afternoon
            # dt_cal_start = max(dt_the_day_afternoon_start_work_time, dt_sign_out_time)
            # dt_cal_start = min(dt_cal_start, dt_the_day_afternoon_end_work_time)
            dt_cal_start = dt_the_day_afternoon_start_work_time

            dt_cal_end = min(dt_the_day_afternoon_end_work_time, dt_sign_out_time)
            dt_cal_end = max(dt_cal_end, dt_the_day_afternoon_start_work_time)

            if dt_cal_end > dt_cal_start:
                work_duration += dt_cal_end - dt_cal_start

            return work_duration.seconds / 3600.0
Exemplo n.º 13
0
 def _check_delay(self, cr, uid, action, record, record_dt, context=None):
     """ Override the check of delay to try to use a user-related calendar.
     If no calendar is found, fallback on the default behavior. """
     if action.trg_date_calendar_id and action.trg_date_range_type == 'day' and action.trg_date_resource_field_id:
         user = record[action.trg_date_resource_field_id.name]
         if user.employee_ids and user.employee_ids[0].contract_id \
                 and user.employee_ids[0].contract_id.working_hours:
             calendar = user.employee_ids[0].contract_id.working_hours
             start_dt = Datetime.from_string(record_dt)
             resource_id = user.employee_ids[0].resource_id.id
             action_dt = self.pool['resource.calendar'].schedule_days_get_date(
                 cr, uid, calendar.id, action.trg_date_range,
                 day_date=start_dt, compute_leaves=True, resource_id=resource_id,
                 context=context
             )
             return action_dt
     return super(base_action_rule, self)._check_delay(cr, uid, action, record, record_dt, context=context)
    def reformat_server_datetime_for_frontend(cls,
                                              date_time,
                                              date_first=False,
                                              two_character_year=False,
                                              context_with_timezone=None):
        """
        Reformat a datetime in Odoo's 'default server datetime format'
        (see imports) to one more appropriate for the front end.

        Can choose whether the date or time comes first and optionally convert
        to client timezone.

        :param date_time:
        :type date_time: str
        :param date_first:
        :type date_first: bool
        :param two_character_year:
        :type two_character_year: bool
        :param context_with_timezone: A record's context with a 'tz' key
        specifying the timezone of the current client.
        :type context_with_timezone: dict
        :return:
        :rtype: str
        """
        date_time = cls.zero_seconds(date_time)
        date_time = datetime.strptime(date_time, DTF)

        time_format = cls.time_format_front_end
        date_format = cls.date_format_front_end
        if two_character_year:
            date_format = cls.date_format_front_end_two_character_year

        if date_first:
            datetime_format = cls.format_string.format(date_format,
                                                       time_format)
        else:
            datetime_format = cls.format_string.format(time_format,
                                                       date_format)

        if context_with_timezone:
            cls._context = context_with_timezone
            date_time = Datetime.context_timestamp(cls, date_time)
        date_time = date_time.strftime(datetime_format)
        return date_time
Exemplo n.º 15
0
    def get_holiday_on(self, date=None):
        self.ensure_one()
        if not date:
            return None

        querying_day = date
        if isinstance(date, datetime.date):
            querying_day = Date.to_string(date)

        leaves = defaultdict(lambda: list(
        ))  # [None, None, datetime.timedelta()] _time = datetime.timedelta()

        absent_type_id = self.env.ref("hr_sf.absent_holidays_status").id

        for holiday in self.holidays_ids:
            if not holiday.date_from or not holiday.date_to:
                continue
            if holiday.holiday_status_id.id == absent_type_id:
                continue

            if not all((holiday.morning_start_work_time,
                        holiday.morning_end_work_time,
                        holiday.afternoon_start_work_time,
                        holiday.afternoon_end_work_time)):
                return None

            dt_the_day_morning_start_work_time = datetime.datetime.strptime(
                "%s %s" % (querying_day, holiday.morning_start_work_time),
                DEFAULT_SERVER_DATETIME_FORMAT)
            dt_the_day_morning_end_work_time = datetime.datetime.strptime(
                "%s %s" % (querying_day, holiday.morning_end_work_time),
                DEFAULT_SERVER_DATETIME_FORMAT)
            dt_the_day_afternoon_start_work_time = datetime.datetime.strptime(
                "%s %s" % (querying_day, holiday.afternoon_start_work_time),
                DEFAULT_SERVER_DATETIME_FORMAT)
            dt_the_day_afternoon_end_work_time = datetime.datetime.strptime(
                "%s %s" % (querying_day, holiday.afternoon_end_work_time),
                DEFAULT_SERVER_DATETIME_FORMAT)

            dt_holiday_from = Datetime.from_string(
                holiday.date_from) + datetime.timedelta(hours=8)
            dt_holiday_to = Datetime.from_string(
                holiday.date_to) + datetime.timedelta(hours=8)
            # deal with morning first
            dt_cal_start = max(dt_the_day_morning_start_work_time,
                               dt_holiday_from)
            dt_cal_start = min(dt_cal_start, dt_the_day_morning_end_work_time)

            dt_cal_end = min(dt_the_day_morning_end_work_time, dt_holiday_to)
            dt_cal_end = max(dt_cal_end, dt_the_day_morning_start_work_time)

            if dt_cal_end > dt_cal_start:
                leaves[holiday.holiday_status_id.name].append(
                    (dt_cal_start, dt_cal_end, dt_cal_end - dt_cal_start))
                # leaves[holiday.holiday_status_id.name][0] = dt_cal_start
                # leaves[holiday.holiday_status_id.name][1] = dt_cal_end
                # leaves[holiday.holiday_status_id.name][2] += dt_cal_end - dt_cal_start

            # then deal with afternoon first
            dt_cal_start = max(dt_the_day_afternoon_start_work_time,
                               dt_holiday_from)
            dt_cal_start = min(dt_cal_start,
                               dt_the_day_afternoon_end_work_time)

            dt_cal_end = min(dt_the_day_afternoon_end_work_time, dt_holiday_to)
            dt_cal_end = max(dt_cal_end, dt_the_day_afternoon_start_work_time)

            if dt_cal_end > dt_cal_start:
                leaves[holiday.holiday_status_id.name].append(
                    (dt_cal_start, dt_cal_end, dt_cal_end - dt_cal_start))
                # leaves[holiday.holiday_status_id.name][0] = dt_cal_start
                # leaves[holiday.holiday_status_id.name][1] = dt_cal_end
                # leaves[holiday.holiday_status_id.name][2] += dt_cal_end - dt_cal_start

        return leaves
Exemplo n.º 16
0
    def attendance_per_location(self, date=None, location=None):
        if not date:
            date = Date.today()

        dt_from = datetime.datetime.strptime("%s 00:00:00" % date, DEFAULT_SERVER_DATETIME_FORMAT) - datetime.timedelta(
                hours=8)
        dt_to = datetime.datetime.strptime("%s 23:59:59" % date, DEFAULT_SERVER_DATETIME_FORMAT) - datetime.timedelta(
                hours=8)

        if not location:
            location = "1"

        Attendance = request.env["hr.attendance"].sudo()
        Employee = request.env["hr.employee"].sudo()
        values = {}

        domain = []
        if date:
            domain.append(("name", ">=", Datetime.to_string(dt_from)))
            domain.append(("name", "<=", Datetime.to_string(dt_to)))

        # if location:
        #     domain.append(("location", "=", location))

        all_employees = Employee.search([])

        emp_attendances_values = []
        for emp in all_employees:
            attendance = dict()
            attendance["name"] = emp.name
            attendance["dep"] = emp.department_id.name

            records = Attendance.search(domain + [("employee_id", "=", emp.id)],
                                        order="name")
            if records and records[-1].location:
                latest_rec = records[-1]
                attendance["state"] = "打卡"

                dt = UTC_Datetime_To_TW_TZ(latest_rec.name)
                date_part = dt.strftime(DEFAULT_SERVER_DATE_FORMAT)
                time_part = dt.strftime(DEFAULT_SERVER_TIME_FORMAT)
                attendance["date"] = date_part
                attendance["time"] = time_part
                attendance["location"] = latest_rec.location
            else:
                attendance["state"] = "未打卡"
                attendance["date"] = None
                attendance["time"] = None
                attendance["location"] = None

            leave_time = emp.get_holiday_on(date)
            attendance["leave"] = string.join(leave_time.keys(), ",") if leave_time else None

            emp_attendances_values.append(attendance)

        # attendance_grouped_by_location = itertools.groupby(emp_attendances_values, key=lambda a: a["location"])
        attendances = defaultdict(lambda: list())
        for attendance in emp_attendances_values:
            attendances[attendance["location"]].append(attendance)  # or _("not attended")

        print_time = UTC_Datetime_To_TW_TZ(Datetime.now())
        values["print_time"] = Datetime.to_string(print_time)

        values["date"] = date
        values["location"] = location
        values["emp_attendances"] = attendances
        keys = sorted(attendances.keys())
        if None in keys:
            keys.remove(None)
            keys.append(None)
        values["attendance_keys"] = keys
        values["action_count"] = len(filter(lambda a: a.get("date", None), emp_attendances_values))
        values["un_action_count"] = len(filter(lambda a: not a.get("date", None), emp_attendances_values))

        return request.render("hr_sf.attendance_per_location", values)
Exemplo n.º 17
0
    def setUp(self):
        super(TestPurchaseOpenQty, self).setUp()
        self.purchase_order_model = self.env['purchase.order']
        purchase_order_line_model = self.env['purchase.order.line']
        partner_model = self.env['res.partner']
        prod_model = self.env['product.product']
        analytic_account_model = self.env['account.analytic.account']
        self.product_uom_model = self.env['product.uom']

        # partners
        pa_dict = {
            'name': 'Partner 1',
            'supplier': True,
        }
        self.partner = partner_model.sudo().create(pa_dict)
        pa_dict2 = {
            'name': 'Partner 2',
            'supplier': True,
        }
        self.partner2 = partner_model.sudo().create(pa_dict2)

        # account
        ac_dict = {
            'name': 'analytic account 1',
        }
        self.analytic_account_1 = \
            analytic_account_model.sudo().create(ac_dict)

        # Purchase Order Num 1
        po_dict = {
            'partner_id': self.partner.id,
        }
        self.purchase_order_1 = self.purchase_order_model.create(po_dict)
        uom_id = self.product_uom_model.search([
            ('name', '=', 'Unit(s)')])[0].id
        pr_dict = {
            'name': 'Product Test',
            'uom_id': uom_id,
            'purchase_method': 'purchase',
        }
        self.product = prod_model.sudo().create(pr_dict)

        pl_dict1 = {
            'date_planned': Datetime.now(),
            'name': 'PO01',
            'order_id': self.purchase_order_1.id,
            'product_id': self.product.id,
            'product_uom': uom_id,
            'price_unit': 1.0,
            'product_qty': 5.0,
            'account_analytic_id': self.analytic_account_1.id,
        }
        self.purchase_order_line_1 = \
            purchase_order_line_model.sudo().create(pl_dict1)
        self.purchase_order_1.button_confirm()

        # Purchase Order Num 2
        po_dict2 = {
            'partner_id': self.partner2.id,
        }
        self.purchase_order_2 = self.purchase_order_model.create(po_dict2)
        pr_dict2 = {
            'name': 'Product Test 2',
            'uom_id': uom_id,
            'purchase_method': 'receive',
        }
        self.product2 = prod_model.sudo().create(pr_dict2)
        pl_dict2 = {
            'date_planned': Datetime.now(),
            'name': 'PO02',
            'order_id': self.purchase_order_2.id,
            'product_id': self.product2.id,
            'product_uom': uom_id,
            'price_unit': 1.0,
            'product_qty': 5.0,
            'account_analytic_id': self.analytic_account_1.id,
        }
        self.purchase_order_line_2 = \
            purchase_order_line_model.sudo().create(pl_dict2)
        self.purchase_order_2.button_confirm()
Exemplo n.º 18
0
def UTC_String_To_TW_TZ(timestr):
    if not timestr:
        return None

    dt_time = UTC_Datetime_To_TW_TZ(timestr)
    return Datetime.to_string(dt_time)
Exemplo n.º 19
0
    def _compute_leave_duration(self):
        for holiday in self:
            if all((holiday.morning_start_work_time,
                    holiday.morning_end_work_time,
                    holiday.afternoon_start_work_time,
                    holiday.afternoon_end_work_time)):
                if not all((holiday.date_from, holiday.date_to)):
                    continue
                dt_holiday_from = Datetime.from_string(
                    holiday.date_from) + datetime.timedelta(hours=8)
                dt_holiday_to = Datetime.from_string(
                    holiday.date_to) + datetime.timedelta(hours=8)

                leave = datetime.timedelta()

                dt_date = dt_holiday_from.date()
                while dt_date <= dt_holiday_to.date():
                    querying_day = dt_date.strftime(DEFAULT_SERVER_DATE_FORMAT)
                    dt_the_day_morning_start_work_time = datetime.datetime.strptime(
                        "%s %s" %
                        (querying_day, holiday.morning_start_work_time),
                        DEFAULT_SERVER_DATETIME_FORMAT)
                    dt_the_day_morning_end_work_time = datetime.datetime.strptime(
                        "%s %s" %
                        (querying_day, holiday.morning_end_work_time),
                        DEFAULT_SERVER_DATETIME_FORMAT)
                    dt_the_day_afternoon_start_work_time = datetime.datetime.strptime(
                        "%s %s" %
                        (querying_day, holiday.afternoon_start_work_time),
                        DEFAULT_SERVER_DATETIME_FORMAT)
                    dt_the_day_afternoon_end_work_time = datetime.datetime.strptime(
                        "%s %s" %
                        (querying_day, holiday.afternoon_end_work_time),
                        DEFAULT_SERVER_DATETIME_FORMAT)

                    # deal with morning first
                    dt_cal_start = max(dt_the_day_morning_start_work_time,
                                       dt_holiday_from)
                    dt_cal_start = min(dt_cal_start,
                                       dt_the_day_morning_end_work_time)

                    dt_cal_end = min(dt_the_day_morning_end_work_time,
                                     dt_holiday_to)
                    dt_cal_end = max(dt_cal_end,
                                     dt_the_day_morning_start_work_time)

                    if dt_cal_end > dt_cal_start:
                        leave += dt_cal_end - dt_cal_start

                    # then deal with afternoon first
                    dt_cal_start = max(dt_the_day_afternoon_start_work_time,
                                       dt_holiday_from)
                    dt_cal_start = min(dt_cal_start,
                                       dt_the_day_afternoon_end_work_time)

                    dt_cal_end = min(dt_the_day_afternoon_end_work_time,
                                     dt_holiday_to)
                    dt_cal_end = max(dt_cal_end,
                                     dt_the_day_afternoon_start_work_time)

                    if dt_cal_end > dt_cal_start:
                        leave += dt_cal_end - dt_cal_start

                    dt_date += datetime.timedelta(days=1)

                holiday.leave_duration = leave.days * 24.0 + leave.seconds / 3600.0
Exemplo n.º 20
0
def UTC_Datetime_To_TW_TZ(timestr):
    if not timestr:
        return None

    return Datetime.context_timestamp(TimeZoneHelper_TW2, Datetime.from_string(timestr))
Exemplo n.º 21
0
 def time_ago(from_):
     if from_ is None:
         from_ = Datetime.now()
     return human(Datetime.from_string(from_), 1)
Exemplo n.º 22
0
 def time_ago(from_):
     if from_ is None:
         from_ = Datetime.now()
     return human(Datetime.from_string(from_), 1)
Exemplo n.º 23
0
def UTC_Datetime_To_TW_TZ(timestr):
    if not timestr:
        return None

    return Datetime.context_timestamp(TimeZoneHelper_TW2,
                                      Datetime.from_string(timestr))
Exemplo n.º 24
0
def UTC_String_To_TW_TZ(timestr):
    if not timestr:
        return None

    dt_time = UTC_Datetime_To_TW_TZ(timestr)
    return Datetime.to_string(dt_time)
Exemplo n.º 25
0
    def get_absent_on(self, date=None):
        self.ensure_one()
        if not date:
            return None

        querying_day = date
        if isinstance(date, datetime.date):
            querying_day = Date.to_string(date)

        absent_type_id = self.env.ref("hr_sf.absent_holidays_status").id

        for holiday in self.holidays_ids:
            if not holiday.date_from or not holiday.date_to:
                continue
            if holiday.holiday_status_id.id != absent_type_id:
                continue

            if not all((holiday.morning_start_work_time,
                        holiday.morning_end_work_time,
                        holiday.afternoon_start_work_time,
                        holiday.afternoon_end_work_time)):
                return None

            dt_the_day_morning_start_work_time = datetime.datetime.strptime(
                "%s %s" % (querying_day, holiday.morning_start_work_time),
                DEFAULT_SERVER_DATETIME_FORMAT)
            dt_the_day_morning_end_work_time = datetime.datetime.strptime(
                "%s %s" % (querying_day, holiday.morning_end_work_time),
                DEFAULT_SERVER_DATETIME_FORMAT)
            dt_the_day_afternoon_start_work_time = datetime.datetime.strptime(
                "%s %s" % (querying_day, holiday.afternoon_start_work_time),
                DEFAULT_SERVER_DATETIME_FORMAT)
            dt_the_day_afternoon_end_work_time = datetime.datetime.strptime(
                "%s %s" % (querying_day, holiday.afternoon_end_work_time),
                DEFAULT_SERVER_DATETIME_FORMAT)

            dt_holiday_from = Datetime.from_string(
                holiday.date_from) + datetime.timedelta(hours=8)
            dt_holiday_to = Datetime.from_string(
                holiday.date_to) + datetime.timedelta(hours=8)

            # deal with morning first
            dt_cal_start = max(dt_the_day_morning_start_work_time,
                               dt_holiday_from)
            dt_cal_start = min(dt_cal_start, dt_the_day_morning_end_work_time)

            dt_cal_end = min(dt_the_day_morning_end_work_time, dt_holiday_to)
            dt_cal_end = max(dt_cal_end, dt_the_day_morning_start_work_time)

            if dt_cal_end > dt_cal_start:
                return 1

            # then deal with afternoon first
            dt_cal_start = max(dt_the_day_afternoon_start_work_time,
                               dt_holiday_from)
            dt_cal_start = min(dt_cal_start,
                               dt_the_day_afternoon_end_work_time)

            dt_cal_end = min(dt_the_day_afternoon_end_work_time, dt_holiday_to)
            dt_cal_end = max(dt_cal_end, dt_the_day_afternoon_start_work_time)

            if dt_cal_end > dt_cal_start:
                return 1
Exemplo n.º 26
0
    def get_holiday_on(self, date=None):
        self.ensure_one()
        if not date:
            return None

        querying_day = date
        if isinstance(date, datetime.date):
            querying_day = Date.to_string(date)

        leaves = defaultdict(lambda: list())  # [None, None, datetime.timedelta()] _time = datetime.timedelta()

        absent_type_id = self.env.ref("hr_sf.absent_holidays_status").id

        for holiday in self.holidays_ids:
            if not holiday.date_from or not holiday.date_to:
                continue
            if holiday.holiday_status_id.id == absent_type_id:
                continue

            if not all((holiday.morning_start_work_time,
                        holiday.morning_end_work_time,
                        holiday.afternoon_start_work_time,
                        holiday.afternoon_end_work_time)):
                return None

            dt_the_day_morning_start_work_time = datetime.datetime.strptime(
                    "%s %s" % (querying_day, holiday.morning_start_work_time), DEFAULT_SERVER_DATETIME_FORMAT)
            dt_the_day_morning_end_work_time = datetime.datetime.strptime(
                    "%s %s" % (querying_day, holiday.morning_end_work_time), DEFAULT_SERVER_DATETIME_FORMAT)
            dt_the_day_afternoon_start_work_time = datetime.datetime.strptime(
                    "%s %s" % (querying_day, holiday.afternoon_start_work_time), DEFAULT_SERVER_DATETIME_FORMAT)
            dt_the_day_afternoon_end_work_time = datetime.datetime.strptime(
                    "%s %s" % (querying_day, holiday.afternoon_end_work_time), DEFAULT_SERVER_DATETIME_FORMAT)

            dt_holiday_from = Datetime.from_string(holiday.date_from) + datetime.timedelta(hours=8)
            dt_holiday_to = Datetime.from_string(holiday.date_to) + datetime.timedelta(hours=8)
            # deal with morning first
            dt_cal_start = max(dt_the_day_morning_start_work_time, dt_holiday_from)
            dt_cal_start = min(dt_cal_start, dt_the_day_morning_end_work_time)

            dt_cal_end = min(dt_the_day_morning_end_work_time, dt_holiday_to)
            dt_cal_end = max(dt_cal_end, dt_the_day_morning_start_work_time)

            if dt_cal_end > dt_cal_start:
                leaves[holiday.holiday_status_id.name].append((dt_cal_start, dt_cal_end, dt_cal_end - dt_cal_start))
                # leaves[holiday.holiday_status_id.name][0] = dt_cal_start
                # leaves[holiday.holiday_status_id.name][1] = dt_cal_end
                # leaves[holiday.holiday_status_id.name][2] += dt_cal_end - dt_cal_start

            # then deal with afternoon first
            dt_cal_start = max(dt_the_day_afternoon_start_work_time, dt_holiday_from)
            dt_cal_start = min(dt_cal_start, dt_the_day_afternoon_end_work_time)

            dt_cal_end = min(dt_the_day_afternoon_end_work_time, dt_holiday_to)
            dt_cal_end = max(dt_cal_end, dt_the_day_afternoon_start_work_time)

            if dt_cal_end > dt_cal_start:
                leaves[holiday.holiday_status_id.name].append((dt_cal_start, dt_cal_end, dt_cal_end - dt_cal_start))
                # leaves[holiday.holiday_status_id.name][0] = dt_cal_start
                # leaves[holiday.holiday_status_id.name][1] = dt_cal_end
                # leaves[holiday.holiday_status_id.name][2] += dt_cal_end - dt_cal_start

        return leaves