Skip to content

Commit

Permalink
[8.0.1.1.0][hr_attendance_import_from_machine]
Browse files Browse the repository at this point in the history
  • Loading branch information
mikevhe18 committed Sep 20, 2018
1 parent 93dbe5e commit 6cf3c46
Show file tree
Hide file tree
Showing 5 changed files with 219 additions and 69 deletions.
2 changes: 1 addition & 1 deletion hr_attendance_import_from_machine/__openerp__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# pylint: disable=locally-disabled, manifest-required-author
{
"name": "Import Attendance Data From Machine",
"version": "8.0.1.0.0",
"version": "8.0.1.1.0",
"website": "https://opensynergy-indonesia.com",
"author": "OpenSynergy Indonesia",
"license": "AGPL-3",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,11 @@ class HrAttendanceMachine(models.Model):
)
sign_in_code = fields.Char(
string="Sign In Code",
required=True,
required=False,
)
sign_out_code = fields.Char(
string="Sign Out Code",
required=True,
required=False,
)
delimiter = fields.Char(
string="Delimiter",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,23 @@ class HrAttendanceMachineCsvDetail(models.Model):
domain="[('model', '=', 'hr.attendance')]",
required=True,
)
field_type = fields.Char(
string="Field Type"
)
date_format = fields.Selection(
string="Format Date",
selection=[
("datetime", "Datetime"),
("date", "Date"),
("time", "Time")
],
)

@api.onchange("field_id")
def onchange_field_type(self):
if self.field_id:
self.field_type = self.field_id.ttype
self.date_format = False

@api.constrains("attendance_machine_id", "csv_column")
def _check_duplicate_column(self):
Expand All @@ -46,6 +63,7 @@ def _check_duplicate_field(self):
("id", "!=", self.id),
("field_id.id", "=", self.field_id.id),
("attendance_machine_id", "=", self.attendance_machine_id.id),
("field_id.ttype", "<>", "datetime")
]
result = obj_machine.search_count(criteria)
if result > 0:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@
<tree editable="bottom">
<field name="csv_column"/>
<field name="field_id"/>
<field name="field_type" invisible="0"/>
<field name="date_format" attrs="{'readonly':[('field_type','&lt;&gt;','datetime')],'required':[('field_type','=','datetime')]}" />
</tree>
</field>
</page>
Expand Down
262 changes: 196 additions & 66 deletions hr_attendance_import_from_machine/wizards/hr_attendance_import.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class HrAttendanceImport(models.TransientModel):
@api.multi
def get_csv_detail(self):
dict_field = {}
dict_date = {}
obj_csv_detail =\
self.env["hr.attendance_machine_csv_detail"]

Expand All @@ -45,21 +46,22 @@ def get_csv_detail(self):
for csv_detail in csv_detail_ids:
field_name =\
csv_detail.field_id.name
field_type =\
csv_detail.field_id.ttype
format_date =\
csv_detail.date_format
csv_column =\
csv_detail.csv_column

if field_name in dict_field:
raise UserError(
_("Duplicate Entry "
"for Field %s") % (field_name,))
elif csv_column in dict_field:
raise UserError(
_("Duplicate Entry "
"for Column %s") % (csv_column,))
else:
if field_type != "datetime":
dict_field[field_name] = {
"csv_column": csv_column
}
else:
dict_date[format_date] = {
"csv_column": csv_column
}
dict_field[field_name] = dict_date
return dict_field
else:
raise UserError(_("No CSV Details"))
Expand Down Expand Up @@ -94,6 +96,68 @@ def check_employee_id(self, employee_code):
raise UserError(
_("No Employee Defined for code %s") % (employee_code,))

@api.multi
def get_employee_data(self, row, employee_code_column):
test_error, employee_code =\
self.check_employee_code(
row, employee_code_column)

if test_error:
raise UserError(
_("%s") % (employee_code,))

employee_id =\
self.check_employee_id(employee_code)
return employee_id.id

@api.multi
def check_date(
self, row, date_format, column, line_num
):
try:
str_date = row[column]
except:
return True, "Invalid date column"

try:
date_format = date_format
except:
return True, "Not date format found"

try:
dt_date =\
datetime.strptime(
str_date, date_format).strftime(date_format)
except:
return True, "Invalid Date Format on Line %s %s" % (
str_date, date_format)

return False, dt_date

@api.multi
def check_time(
self, row, time_format, column, line_num
):
try:
str_time = row[column]
except:
return True, "Invalid time column"

try:
time_format = time_format
except:
return True, "Not time format found"

try:
dt_time =\
datetime.strptime(
str_time, time_format).strftime(time_format)
except:
return True, "Invalid Time Format on Line %s" % (str(line_num))

return False, dt_time

@api.multi
def check_datetime(
self, row, date_format,
time_format, column, line_num
Expand Down Expand Up @@ -132,6 +196,29 @@ def _convert_datetime_utc(self, dt):

return format_utc

@api.multi
def get_name_data(self, detail_format, row, date_format,
time_format, column, line_num):
if detail_format == "datetime":
test_error, dt_date =\
self.check_datetime(row, date_format, time_format,
column, line_num)
if detail_format == "date":
test_error, dt_date =\
self.check_date(row, date_format, column,
line_num)

if detail_format == "time":
test_error, dt_date =\
self.check_time(row, time_format, column,
line_num)

if test_error:
raise UserError(
_("%s") % (dt_date,))

return dt_date

@api.multi
def check_sign_in_out(
self, row, column, line_num,
Expand Down Expand Up @@ -165,69 +252,86 @@ def prepare_data(self, row, line_num):
machine_id.sign_in_code
sign_out_code =\
machine_id.sign_out_code
detail_date = False
detail_time = False
detail_datetime = False

csv_detail =\
self.get_csv_detail()

if "employee_id" in csv_detail:
employee_code_column =\
csv_detail["employee_id"]["csv_column"]
else:
raise UserError(
_("No Field Define for Employee"))

if "name" in csv_detail:
date_column =\
csv_detail["name"]["csv_column"]
else:
raise UserError(
_("No Field Define for Date"))

if "action" in csv_detail:
action_column =\
csv_detail["action"]["csv_column"]
else:
raise UserError(
_("No Field Define for Action"))

test_error, employee_code =\
self.check_employee_code(
row, employee_code_column)

if test_error:
raise UserError(
_("%s") % (employee_code,))

employee_id =\
self.check_employee_id(employee_code)

test_error, dt_date =\
self.check_datetime(row, date_format, time_format,
date_column, line_num)

if test_error:
raise UserError(
_("%s") % (dt_date,))

dt_utc = self._convert_datetime_utc(dt_date)

test_error, sign_in_out =\
self.check_sign_in_out(row, action_column, line_num,
sign_in_code, sign_out_code)
if test_error:
raise UserError(
_("%s") % (sign_in_out,))
else:
if sign_in_out == 1:
action = "sign_in"
for detail in csv_detail:
if detail == "employee_id":
employee_code_column =\
csv_detail[detail]["csv_column"]

data[detail] =\
self.get_employee_data(
row,
employee_code_column)
elif "date" in csv_detail[detail]\
or "time" in csv_detail[detail]\
or "datetime" in csv_detail[detail]:
for detail_format in csv_detail[detail]:
column =\
csv_detail[detail][detail_format]["csv_column"]
if detail_format == "date":
detail_date =\
self.get_name_data(
detail_format,
row,
date_format,
time_format,
column,
line_num)
elif detail_format == "time":
detail_time =\
self.get_name_data(
detail_format,
row,
date_format,
time_format,
column,
line_num)
else:
detail_datetime =\
self.get_name_data(
detail_format,
row,
date_format,
time_format,
column,
line_num)
if detail_date and detail_time:
datetime_format = date_format + " " + time_format
data_name = detail_date + " " + detail_time
dt_datetime =\
datetime.strptime(
data_name, datetime_format)
else:
dt_datetime = detail_datetime
data[detail] =\
self._convert_datetime_utc(dt_datetime)
elif detail == "action":
action_column =\
csv_detail[detail]["csv_column"]
test_error, sign_in_out =\
self.check_sign_in_out(row, action_column, line_num,
sign_in_code, sign_out_code)
if test_error:
raise UserError(
_("%s") % (sign_in_out,))
else:
if sign_in_out == 1:
action = "sign_in"
else:
action = "sign_out"
data[detail] = action
else:
action = "sign_out"
data_column =\
csv_detail[detail]["csv_column"]
data[detail] =\
row[data_column]

data = {
"employee_id": employee_id.id,
"name": dt_utc,
"action": action
}
return data

@api.multi
Expand All @@ -243,6 +347,27 @@ def check_attendance(self, employee_id, name):
obj_hr_attendance.search_count(criteria)
return count_attd

@api.multi
def check_attendance_action(self, employee_id, name):
obj_hr_attendance = self.env["hr.attendance"]

criteria = [
("employee_id", "=", employee_id),
("name", "<", name)
]

attd =\
obj_hr_attendance.search(
criteria, order="name desc",
limit=1)
if attd:
if attd.action == "sign_in":
return "sign_out"
else:
return "sign_in"
else:
return "sign_in"

@api.multi
def button_import(self):
self.ensure_one()
Expand Down Expand Up @@ -281,6 +406,11 @@ def button_import(self):
data["employee_id"], data["name"])

if count_attd == 0:
if "action" not in data:
action =\
self.check_attendance_action(
data["employee_id"], data["name"])
data["action"] = action
obj_hr_attendance.create(data)
line_num += 1

Expand Down

0 comments on commit 6cf3c46

Please sign in to comment.