diff --git a/addons_extensions/hr_recruitment_extended/models/hr_recruitment.py b/addons_extensions/hr_recruitment_extended/models/hr_recruitment.py index 9b9f38701..371baa3e7 100644 --- a/addons_extensions/hr_recruitment_extended/models/hr_recruitment.py +++ b/addons_extensions/hr_recruitment_extended/models/hr_recruitment.py @@ -234,7 +234,7 @@ class HRApplicant(models.Model): marital = fields.Selection( selection='_get_marital_status_selection', string='Marital Status', - groups="hr.group_hr_user", + groups='hr_recruitment.group_hr_recruitment_user', default='single', required=True, tracking=True) diff --git a/addons_extensions/hr_recruitment_extended/security/ir.model.access.csv b/addons_extensions/hr_recruitment_extended/security/ir.model.access.csv index 391deaad1..c58f1fc5f 100644 --- a/addons_extensions/hr_recruitment_extended/security/ir.model.access.csv +++ b/addons_extensions/hr_recruitment_extended/security/ir.model.access.csv @@ -36,5 +36,6 @@ access_applicant_stage_comment_wizard,applicant.stage.comment.wizard.user,model_ access_hr_application_public,hr.applicant.public.access,hr_recruitment.model_hr_applicant,base.group_public,1,0,0,0 access_hr_application_group_hr,hr.applicant.hr.access,hr_recruitment.model_hr_applicant,hr.group_hr_manager,1,1,0,0 access_applicant_request_forms_hr_user,access.applicant.request.forms.hr.user,model_applicant_request_forms,hr.group_hr_user,1,1,1,1 +access_applicant_request_forms_user,access.applicant.request.forms.user,model_applicant_request_forms,base.group_user,1,1,0,0 access_hr_skill,access.hr.skill.user,hr_skills.model_hr_skill,base.group_public,1,0,0,0 diff --git a/addons_extensions/hrms_emp_dashboard/controllers/hrms_emp_dashboard.py b/addons_extensions/hrms_emp_dashboard/controllers/hrms_emp_dashboard.py index 150aa9f59..9ae0b4e09 100644 --- a/addons_extensions/hrms_emp_dashboard/controllers/hrms_emp_dashboard.py +++ b/addons_extensions/hrms_emp_dashboard/controllers/hrms_emp_dashboard.py @@ -124,23 +124,33 @@ class HrmsEmployeeDashboard(http.Controller): def _leave_balances(self, employee): LeaveType = request.env["hr.leave.type"].sudo() - Allocation = request.env["hr.leave.allocation"].sudo() Leave = request.env["hr.leave"].sudo() + employee = employee.sudo() + leave_types = LeaveType.search([("active", "=", True)], order="sequence, name") + allocation_data = leave_types.get_allocation_data(employee)[employee] + allocation_data_by_type = { + leave_type_id: data + for _name, data, _requires_allocation, leave_type_id in allocation_data + } balances = [] - for leave_type in LeaveType.search([("active", "=", True)], order="sequence, name"): - allocations = Allocation.search([ - ("employee_id", "=", employee.id), - ("holiday_status_id", "=", leave_type.id), - ("state", "=", "validate"), - ]) - leaves = Leave.search([ - ("employee_id", "=", employee.id), - ("holiday_status_id", "=", leave_type.id), - ("state", "in", ["confirm", "validate1", "validate"]), - ]) - allocated = sum(allocations.mapped("number_of_days")) - taken = sum(leaves.filtered(lambda leave: leave.state == "validate").mapped("number_of_days")) - planned = sum(leaves.filtered(lambda leave: leave.state in ("confirm", "validate1")).mapped("number_of_days")) + for leave_type in leave_types: + if leave_type.requires_allocation == "yes": + data = allocation_data_by_type.get(leave_type.id, {}) + allocated = data.get("max_leaves", 0) + taken = data.get("leaves_taken", 0) + planned = data.get("leaves_requested", 0) + remaining = data.get("virtual_remaining_leaves", 0) + else: + leaves = Leave.search([ + ("employee_id", "=", employee.id), + ("holiday_status_id", "=", leave_type.id), + ("state", "in", ["confirm", "validate1", "validate"]), + ]) + allocated = 0 + taken = sum(leaves.filtered(lambda leave: leave.state == "validate").mapped("number_of_days")) + planned = sum(leaves.filtered(lambda leave: leave.state in ("confirm", "validate1")).mapped("number_of_days")) + remaining = 0 + chart_total = max(allocated, taken + planned + max(remaining, 0), 1) if allocated or taken or planned or leave_type.requires_allocation == "no": balances.append({ "id": leave_type.id, @@ -148,7 +158,10 @@ class HrmsEmployeeDashboard(http.Controller): "allocated": round(allocated, 2), "taken": round(taken, 2), "planned": round(planned, 2), - "remaining": round(allocated - taken - planned, 2) if leave_type.requires_allocation != "no" else 0, + "remaining": round(remaining, 2), + "taken_percent": round((taken / chart_total) * 100, 2), + "planned_percent": round((planned / chart_total) * 100, 2), + "remaining_percent": round((max(remaining, 0) / chart_total) * 100, 2), "requires_allocation": leave_type.requires_allocation, }) return balances @@ -173,35 +186,35 @@ class HrmsEmployeeDashboard(http.Controller): def _get_public_holidays(self, employee, month_start, month_end): start_dt = datetime.combine(month_start, time.min) end_dt = datetime.combine(month_end, time.max) + calendar = employee.resource_calendar_id or employee.company_id.resource_calendar_id holidays = request.env["resource.calendar.leaves"].sudo().search([ ("date_from", "<=", end_dt), ("date_to", ">=", start_dt), ("company_id", "in", [False, employee.company_id.id]), + ("resource_id", "=", False), # Only company/public holidays ], order="date_from asc") - return holidays.filtered(lambda holiday: ( - (not holiday.resource_id or holiday.resource_id == employee.resource_id) - and (not holiday.calendar_id or holiday.calendar_id == calendar) - )) + if calendar: + holidays = holidays.filtered( + lambda h: not h.calendar_id or h.calendar_id == calendar + ) + return holidays def _attendance_calendar(self, month_start, month_end, attendances, leaves, public_holidays, calendar_view="monthly"): if calendar_view == "yearly": return self._yearly_attendance_calendar(month_start, month_end, attendances, leaves, public_holidays) today = fields.Date.context_today(request.env.user) - attendance_by_day = defaultdict(float) - for attendance in attendances: - day = fields.Datetime.context_timestamp(request.env.user, attendance.check_in).date() - attendance_by_day[day] += attendance.worked_hours or 0.0 + attendance_by_day = self._attendance_hours_by_day(attendances) - leave_by_day = self._days_from_date_range_records(leaves, "request_date_from", "request_date_to", "holiday_status_id") + leave_by_day = self._leave_days(leaves) holiday_by_day = self._days_from_datetime_range_records(public_holidays, "date_from", "date_to") days = [] cursor = month_start if calendar_view == "monthly": - cursor = month_start - timedelta(days=(month_start.weekday() + 1) % 7) - end_cursor = month_end + timedelta(days=(5 - month_end.weekday()) % 7) + cursor = month_start - timedelta(days=month_start.weekday()) + end_cursor = month_end + timedelta(days=(6 - month_end.weekday())) else: end_cursor = month_end @@ -209,34 +222,91 @@ class HrmsEmployeeDashboard(http.Controller): outside_period = cursor < month_start or cursor > month_end status = "future" if cursor > today else "absent" label = "" - hours = round(attendance_by_day.get(cursor, 0.0), 2) + attendance_hours = attendance_by_day.get(cursor, {}) + hours = round(attendance_hours.get("worked_hours", 0.0), 2) + break_hours = round(attendance_hours.get("break_hours", 0.0), 2) + has_worked_hours = hours > 0.004 + is_holiday = cursor in holiday_by_day + is_leave = cursor in leave_by_day + is_half_day_leave = bool(leave_by_day.get(cursor, {}).get("is_half_day")) + is_weekend = cursor.weekday() in (5, 6) + expected_hours = 0.0 + if not outside_period and not is_holiday and not (is_weekend and not has_worked_hours): + expected_hours = self._expected_hours_for_day(request.env.user.employee_id.sudo(), cursor) + leave_hours = expected_hours if is_leave else 0.0 + show_metrics = ( + has_worked_hours + or ( + not is_weekend + and not is_holiday + and (not is_leave or is_half_day_leave) + ) + ) if outside_period: status = "empty" - elif hours: - status = "present" - elif cursor in holiday_by_day: + show_metrics = False + elif is_holiday: status = "holiday" label = holiday_by_day[cursor] - elif cursor in leave_by_day: + show_metrics = has_worked_hours + elif is_leave: status = "leave" - label = leave_by_day[cursor] - elif cursor.weekday() in (5, 6): + label = _("Time Off") + show_metrics = is_half_day_leave + elif has_worked_hours: + status = "present" + elif is_weekend: status = "weekend" - label = _("Weekend") + show_metrics = False days.append({ "type": "day", "date": cursor.strftime("%Y-%m-%d"), "day": cursor.day, "weekday": cursor.strftime("%a"), - "is_weekend": cursor.weekday() in (5, 6), + "is_weekend": is_weekend, "outside_period": outside_period, "status": status, "label": label, + "show_metrics": show_metrics, + "is_half_day_leave": is_half_day_leave, "hours": hours, + "worked_hours": hours, + "break_hours": break_hours, + "expected_hours": round(expected_hours, 2), + "leave_hours": round(leave_hours, 2), + "balance_hours": round(hours - expected_hours, 2), + "worked_display": self._format_hours(hours), + "break_display": self._format_hours(break_hours), + "expected_display": self._format_hours(expected_hours), + "leave_display": self._format_hours(leave_hours), + "balance_display": self._format_signed_hours(hours - expected_hours), }) cursor += timedelta(days=1) return days + def _leave_days(self, leaves): + result = {} + for leave in leaves: + start = fields.Date.to_date(leave.request_date_from) + end = fields.Date.to_date(leave.request_date_to) + is_half_day = self._is_half_day_leave(leave) + while start and end and start <= end: + result[start] = { + "label": _("Time Off"), + "is_half_day": is_half_day, + } + start += timedelta(days=1) + return result + + def _is_half_day_leave(self, leave): + if "request_unit_half" in leave._fields and leave.request_unit_half: + return True + if "request_unit_type" in leave._fields and leave.request_unit_type == "half_day": + return True + if "request_unit" in leave._fields and leave.request_unit == "half_day": + return True + return bool(leave.number_of_days and leave.number_of_days < 1) + def _yearly_attendance_calendar(self, range_start, range_end, attendances, leaves, public_holidays): days = self._attendance_calendar(range_start, range_end, attendances, leaves, public_holidays, "monthly") months = [] @@ -259,10 +329,59 @@ class HrmsEmployeeDashboard(http.Controller): "leave": counts["leave"], "holiday": counts["holiday"], "hours": round(sum(day["hours"] for day in month_days), 2), + "worked_hours": round(sum(day["worked_hours"] for day in month_days), 2), + "break_hours": round(sum(day["break_hours"] for day in month_days), 2), + "expected_hours": round(sum(day["expected_hours"] for day in month_days), 2), + "worked_display": self._format_hours(sum(day["worked_hours"] for day in month_days)), + "break_display": self._format_hours(sum(day["break_hours"] for day in month_days)), + "expected_display": self._format_hours(sum(day["expected_hours"] for day in month_days)), }) cursor += relativedelta(months=1) return months + def _attendance_hours_by_day(self, attendances): + grouped = defaultdict(list) + for attendance in attendances: + check_in = fields.Datetime.context_timestamp(request.env.user, attendance.check_in) + grouped[check_in.date()].append(attendance) + + result = {} + for day, day_attendances in grouped.items(): + sorted_attendances = sorted(day_attendances, key=lambda attendance: attendance.check_in) + worked_hours = sum(attendance.worked_hours or 0.0 for attendance in sorted_attendances) + break_hours = 0.0 + for previous, current in zip(sorted_attendances, sorted_attendances[1:]): + if previous.check_out and current.check_in: + previous_out = fields.Datetime.context_timestamp(request.env.user, previous.check_out) + current_in = fields.Datetime.context_timestamp(request.env.user, current.check_in) + if current_in > previous_out: + break_hours += (current_in - previous_out).total_seconds() / 3600 + result[day] = { + "worked_hours": worked_hours, + "break_hours": break_hours, + } + return result + + def _expected_hours_for_day(self, employee, day): + calendar = employee.resource_calendar_id or employee.company_id.resource_calendar_id + if not calendar: + return 0.0 + start_dt = datetime.combine(day, time.min) + end_dt = datetime.combine(day, time.max) + return round(calendar.get_work_hours_count(start_dt, end_dt, compute_leaves=False), 2) + + def _format_hours(self, hours): + hours = abs(hours or 0.0) + total_minutes = int(round(hours * 60)) + hour_part, minute_part = divmod(total_minutes, 60) + if minute_part: + return "%sh %02dm" % (hour_part, minute_part) + return "%sh" % hour_part + + def _format_signed_hours(self, hours): + sign = "+" if (hours or 0.0) >= 0 else "-" + return "%s%s" % (sign, self._format_hours(hours)) + def _days_from_date_range_records(self, records, start_field, end_field, label_field=False): result = {} for record in records: @@ -285,16 +404,53 @@ class HrmsEmployeeDashboard(http.Controller): return result def _attendance_summary(self, month_start, month_end, attendances, leaves, public_holidays): - days = self._attendance_calendar(month_start, month_end, attendances, leaves, public_holidays) + days = self._attendance_calendar( + month_start, + month_end, + attendances, + leaves, + public_holidays, + ) + counts = defaultdict(int) + + expected_hours = 0.0 + worked_hours = 0.0 + break_hours = 0.0 + leave_hours = 0.0 + for day in days: + if day["outside_period"]: + continue + counts[day["status"]] += 1 + + expected_hours += day["expected_hours"] + worked_hours += day["worked_hours"] + break_hours += day["break_hours"] + leave_hours += day["leave_hours"] + + remaining_hours = expected_hours - worked_hours - leave_hours + return { "present": counts["present"], "absent": counts["absent"], "leave": counts["leave"], "holiday": counts["holiday"], - "hours": round(sum(attendances.mapped("worked_hours")), 2), + + "hours": round(worked_hours, 2), + + "worked_hours": round(worked_hours, 2), + "break_hours": round(break_hours, 2), + "expected_hours": round(expected_hours, 2), + "leave_hours": round(leave_hours, 2), + "remaining_hours": round(remaining_hours, 2), + + "worked_display": self._format_hours(worked_hours), + "break_display": self._format_hours(break_hours), + "expected_display": self._format_hours(expected_hours), + "leave_display": self._format_hours(leave_hours), + "remaining_display": self._format_signed_hours(remaining_hours), } def _holiday_list(self, holidays): @@ -317,25 +473,15 @@ class HrmsEmployeeDashboard(http.Controller): totals[month.strftime("%Y-%m")] += 0.0 month += relativedelta(months=1) - HrExpense = request.env["hr.expense"].sudo() - emp_expenses = HrExpense.search([ + expenses = request.env["hr.expense"].sudo().search([ ("employee_id", "=", employee.id), ("date", ">=", date_from), ("date", "<=", date_to), ]) - for expense in emp_expenses: - totals[expense.date.strftime("%Y-%m")] += expense.total_amount or 0.0 - state_totals[expense.state or "draft"] += expense.total_amount or 0.0 - - if request.env.registry.get("hr.expense"): - hr_expenses = request.env["hr.expense"].sudo().search([ - ("employee_id", "=", employee.id), - ("date", ">=", date_from), - ("date", "<=", date_to), - ]) - for expense in hr_expenses: - totals[expense.date.strftime("%Y-%m")] += expense.total_amount_currency or expense.total_amount or 0.0 - state_totals[expense.state or "draft"] += expense.total_amount_currency or expense.total_amount or 0.0 + for expense in expenses: + amount = self._expense_amount(expense) + totals[expense.date.strftime("%Y-%m")] += amount + state_totals[expense.state or "draft"] += amount return { "labels": labels, @@ -345,6 +491,11 @@ class HrmsEmployeeDashboard(http.Controller): "currency": employee.company_id.currency_id.symbol or "", } + def _expense_amount(self, expense): + if "total_amount_currency" in expense._fields and expense.total_amount_currency: + return expense.total_amount_currency + return expense.total_amount or 0.0 + def _month_keys(self, first_month, last_month): keys = [] month = first_month diff --git a/addons_extensions/hrms_emp_dashboard/static/src/css/hrms_emp_dashboard.css b/addons_extensions/hrms_emp_dashboard/static/src/css/hrms_emp_dashboard.css index 1308ba71f..b6e9b2d32 100644 --- a/addons_extensions/hrms_emp_dashboard/static/src/css/hrms_emp_dashboard.css +++ b/addons_extensions/hrms_emp_dashboard/static/src/css/hrms_emp_dashboard.css @@ -184,8 +184,11 @@ .hrms-kpi.present strong { color: #16a34a; } .hrms-kpi.absent strong { color: #dc2626; } +.hrms-kpi.break strong { color: #2563eb; } .hrms-kpi.leave strong, .hrms-kpi.holiday strong { color: #f97316; } +.hrms-kpi.remaining.positive strong { color: #16a34a; } +.hrms-kpi.remaining.negative strong { color: #dc2626; } .hrms-grid { display: grid; @@ -230,65 +233,217 @@ .hrms-calendar { display: grid; - grid-template-columns: repeat(7, minmax(82px, 1fr)); - gap: 10px; + grid-template-columns: repeat(7, minmax(130px, 1fr)); + gap: 0; + overflow-x: auto; + border: 1px solid #dbe3ed; + border-radius: 8px; + background: #dbe3ed; } .hrms-calendar-weekdays { display: grid; - grid-template-columns: repeat(7, minmax(82px, 1fr)); - gap: 10px; - margin-bottom: 8px; + grid-template-columns: repeat(7, minmax(130px, 1fr)); + gap: 0; + overflow-x: auto; + border: 1px solid #dbe3ed; + border-bottom: 0; + border-radius: 8px 8px 0 0; + background: #f8fafc; } .hrms-calendar-weekdays span { - color: #64748b; - font-size: 11px; + padding: 10px 8px; + color: #0f172a; + font-size: 13px; font-weight: 800; text-align: center; - text-transform: uppercase; + border-right: 1px solid #dbe3ed; +} + +.hrms-calendar-weekdays span:last-child { + border-right: 0; } .hrms-calendar.yearly { grid-template-columns: repeat(4, minmax(160px, 1fr)); + gap: 10px; + border: 0; + background: transparent; } .hrms-day { - min-height: 82px; - padding: 8px; + min-height: 132px; + padding: 10px; + border: 0; + border-right: 1px solid #dbe3ed; + border-bottom: 1px solid #dbe3ed; + border-radius: 0; + background: #fff; + position: relative; + overflow: hidden; +} + +.hrms-calendar.yearly .hrms-day { + min-height: 126px; border: 1px solid #e5e7eb; border-radius: 8px; - background: #fff; } .hrms-day span, .hrms-day small { - display: block; color: #64748b; - font-size: 11px; + font-size: 12px; } -.hrms-day strong { - display: block; - width: 34px; - height: 34px; - line-height: 31px; - margin-top: 6px; +.hrms-day-top { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 6px; + min-height: 24px; +} + +.hrms-day-top strong { + color: #0f172a; + font-size: 13px; + line-height: 1.2; +} + +.hrms-day-top strong span { + display: inline; + margin-left: 4px; + font-size: 11px; + font-weight: 700; +} + +.hrms-day-badge { + max-width: 76px; + padding: 2px 6px; + border-radius: 6px; + background: #eef2ff; + color: #4338ca; + font-size: 10px; + font-weight: 800; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.hrms-day-balance { + height: 22px; + line-height: 22px; + margin: 10px 0 8px; border-radius: 999px; text-align: center; - border: 2px solid #cbd5e1; - color: #0f172a; + font-size: 12px; + font-weight: 800; } -.hrms-day.present strong { border-color: #16a34a; background: #dcfce7; } -.hrms-day.absent strong { border-color: #dc2626; color: #dc2626; background: #fff; } -.hrms-day.leave strong, -.hrms-day.holiday strong { border-color: #f97316; background: #ffedd5; color: #9a3412; } -.hrms-day.weekend strong { border-color: #94a3b8; background: #f1f5f9; color: #475569; } +.hrms-day-balance.positive { + background: #dcfce7; + color: #16a34a; +} + +.hrms-day-balance.negative { + background: #fee2e2; + color: #dc2626; +} + +.hrms-day-message { + min-height: 76px; + margin-top: 10px; + padding: 12px; + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + text-align: center; +} + +.hrms-day-message-icon { + color: inherit; + font-size: 16px; +} + +.hrms-day-message strong { + color: inherit; + font-size: 13px; + line-height: 1.25; + overflow-wrap: anywhere; +} + +.hrms-day-metrics { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 6px; +} + +.hrms-day-metrics div { + min-width: 0; +} + +.hrms-day-metrics span { + display: block; + color: #64748b; + font-size: 10px; + font-weight: 800; +} + +.hrms-day-metrics strong { + display: block; + margin-top: 3px; + color: #0f172a; + font-size: 13px; + line-height: 1.15; + word-break: keep-all; +} + +.hrms-calendar-month-stats { + display: grid; + gap: 5px; + margin-top: 10px; +} + +.hrms-calendar-month-stats small { + display: block; + font-size: 12px; +} + +.hrms-day.present { box-shadow: inset 0 3px 0 #22c55e; } +.hrms-day.absent { box-shadow: inset 0 3px 0 #ef4444; } +.hrms-day.leave { + background: #fff5f5; + box-shadow: inset 0 3px 0 #ef4444; +} +.hrms-day.leave .hrms-day-message { + background: #fee2e2; + color: #b91c1c; + border: 1px solid #fecaca; +} +.hrms-day.holiday { + background: #f8fafc; + box-shadow: inset 0 3px 0 #94a3b8; +} +.hrms-day.holiday .hrms-day-message { + background: #e5e7eb; + color: #334155; + border: 1px solid #cbd5e1; +} +.hrms-day.weekend { + background: #f8fafc; + box-shadow: none; +} +.hrms-day.weekend .hrms-day-message { + min-height: 58px; + background: transparent; + color: #94a3b8; + border: 1px dashed #e2e8f0; +} .hrms-day.future { opacity: 0.55; } .hrms-day.empty { background: #f8fafc; - border-style: dashed; opacity: 0.45; } @@ -318,6 +473,9 @@ } .hrms-leave-tile span { + display: inline-block; + min-width: 64px; + margin-right: 10px; color: #64748b; font-size: 11px; } @@ -327,6 +485,91 @@ color: #0f172a; font-size: 18px; } + +.hrms-leave-graph { + display: grid; + gap: 12px; +} + +.hrms-leave-graph-row { + display: grid; + grid-template-columns: minmax(140px, 190px) minmax(180px, 1fr); + gap: 10px 14px; + align-items: center; +} + +.hrms-leave-graph-label strong { + display: block; + color: #0f172a; + font-size: 13px; +} + +.hrms-leave-graph-label span { + color: #64748b; + font-size: 11px; +} + +.hrms-leave-bar { + display: flex; + width: 100%; + height: 18px; + overflow: hidden; + border-radius: 8px; + background: #e5e7eb; +} + +.hrms-leave-bar span { + min-width: 0; +} + +.hrms-leave-bar-remaining { + background: #16a34a; +} + +.hrms-leave-bar-taken { + background: #2563eb; +} + +.hrms-leave-bar-planned { + background: #f59e0b; +} + +.hrms-leave-legend { + grid-column: 2; + display: flex; + flex-wrap: wrap; + gap: 8px 14px; + color: #64748b; + font-size: 11px; +} + +.hrms-leave-legend span { + display: inline-flex; + align-items: center; + gap: 5px; +} + +.hrms-leave-legend i { + width: 9px; + height: 9px; + border-radius: 2px; +} + +.hrms-leave-legend i.remaining { + background: #16a34a; +} + +.hrms-leave-legend i.taken { + background: #2563eb; +} + +.hrms-leave-legend i.planned { + background: #f59e0b; +} + +.hrms-leave-legend b { + color: #0f172a; +} .hrms-two-charts { display: grid; grid-template-columns: 1.3fr 0.7fr; @@ -398,10 +641,15 @@ .hrms-employee-grid, .hrms-grid, + .hrms-leave-graph-row, .hrms-two-charts { grid-template-columns: 1fr; } + .hrms-leave-legend { + grid-column: 1; + } + .hrms-panel.wide { grid-column: span 1; } @@ -416,13 +664,17 @@ @media (max-width: 700px) { .hrms-kpi-row, .hrms-equipment-grid, - .hrms-calendar, .hrms-calendar.yearly, .hrms-leave-summary, .hrms-custom-dates { grid-template-columns: 1fr; } + .hrms-calendar, + .hrms-calendar-weekdays { + grid-template-columns: repeat(7, minmax(118px, 1fr)); + } + .hrms-panel-header, .hrms-panel-actions, .hrms-action-buttons { @@ -488,4 +740,4 @@ #hrmsExpenseChart, #hrmsExpenseStateChart{ min-height:340px; -} \ No newline at end of file +} diff --git a/addons_extensions/hrms_emp_dashboard/static/src/js/hrms_emp_dashboard.js b/addons_extensions/hrms_emp_dashboard/static/src/js/hrms_emp_dashboard.js index 05fa78f80..6cfeb97a6 100644 --- a/addons_extensions/hrms_emp_dashboard/static/src/js/hrms_emp_dashboard.js +++ b/addons_extensions/hrms_emp_dashboard/static/src/js/hrms_emp_dashboard.js @@ -14,7 +14,7 @@ class HrmsEmployeeDashboard extends Component { const monthStart = new Date(today.getFullYear(), today.getMonth(), 1); const monthEnd = new Date(today.getFullYear(), today.getMonth() + 1, 0); const weekStart = new Date(today); - weekStart.setDate(today.getDate() - today.getDay()); + weekStart.setDate(today.getDate() - ((today.getDay() + 6) % 7)); const weekEnd = new Date(weekStart); weekEnd.setDate(weekStart.getDate() + 6); @@ -68,7 +68,6 @@ class HrmsEmployeeDashboard extends Component { return; } this.state.data = response; - // setTimeout(() => this.initCharts(), 100); const expenses = response.expenses || {}; const total = (expenses.series || []).reduce( @@ -76,11 +75,7 @@ class HrmsEmployeeDashboard extends Component { 0 ); this.state.expenseCount = total; - if (this.state.expenseCount > 0) { - setTimeout(() => this.initCharts(), 100); - } else { - this.destroyCharts(); - } + setTimeout(() => this.initCharts(), 100); } catch (error) { console.error(error); this.state.error = "Unable to load employee dashboard."; @@ -107,7 +102,6 @@ class HrmsEmployeeDashboard extends Component { } this.destroyCharts(); const leaves = this.state.data.leave_balances || []; - debugger; this.renderLeaveChart(leaves); this.renderExpenseChart(); this.renderExpenseStateChart(); @@ -135,17 +129,18 @@ class HrmsEmployeeDashboard extends Component { } renderLeaveChart(leaves) { + const allocatedLeaves = leaves.filter((leave) => leave.requires_allocation === "yes"); this.chartBase("#hrmsLeaveChart", { chart: { type: "bar" }, series: [ - { name: "Remaining", data: leaves.map((leave) => leave.remaining) }, - { name: "Taken", data: leaves.map((leave) => leave.taken) }, - { name: "Planned", data: leaves.map((leave) => leave.planned) }, + { name: "Remaining", data: allocatedLeaves.map((leave) => Number(leave.remaining || 0)) }, + { name: "Taken", data: allocatedLeaves.map((leave) => Number(leave.taken || 0)) }, + { name: "Planned", data: allocatedLeaves.map((leave) => Number(leave.planned || 0)) }, ], colors: ["#16a34a", "#2563eb", "#f59e0b"], plotOptions: { bar: { borderRadius: 4, columnWidth: "50%" } }, dataLabels: { enabled: false }, - xaxis: { categories: leaves.map((leave) => leave.name), labels: { rotate: -25, trim: true } }, + xaxis: { categories: allocatedLeaves.map((leave) => leave.name), labels: { rotate: -25, trim: true } }, yaxis: { min: 0, forceNiceScale: true }, }); } @@ -155,7 +150,6 @@ class HrmsEmployeeDashboard extends Component { return; } const expenses = this.state.data.expenses; - debugger; this.chartBase("#hrmsExpenseChart", { chart: { type: "area", @@ -183,8 +177,6 @@ class HrmsEmployeeDashboard extends Component { type: "donut", events: { dataPointSelection: (event, chartContext, config) => { - debugger; - const stateIndex = chartContext.dataPointIndex; const state = expenses.state_labels[config.dataPointIndex]; this.openExpenses(state); }, @@ -242,7 +234,7 @@ class HrmsEmployeeDashboard extends Component { this.state.calendarDateTo = this.formatDate(new Date(today.getFullYear(), 11, 31)); } else if (this.state.calendarView === "weekly") { const weekStart = new Date(today); - weekStart.setDate(weekStart.getDate() - weekStart.getDay()); + weekStart.setDate(weekStart.getDate() - ((weekStart.getDay() + 6) % 7)); const weekEnd = new Date(weekStart); weekEnd.setDate(weekStart.getDate() + 6); this.state.calendarDateFrom = this.formatDate(weekStart); @@ -400,7 +392,6 @@ class HrmsEmployeeDashboard extends Component { } openExpenses(state = false) { - debugger; const domain = [["employee_id", "=", this.state.data.employee.id]]; if (state) { domain.push(["state", "=", state.toLowerCase()]); diff --git a/addons_extensions/hrms_emp_dashboard/static/src/xml/hrms_emp_dashboard.xml b/addons_extensions/hrms_emp_dashboard/static/src/xml/hrms_emp_dashboard.xml index f94819b85..5c60d1564 100644 --- a/addons_extensions/hrms_emp_dashboard/static/src/xml/hrms_emp_dashboard.xml +++ b/addons_extensions/hrms_emp_dashboard/static/src/xml/hrms_emp_dashboard.xml @@ -74,11 +74,14 @@
-
Present
-
No Check-In
-
Leaves
-
Holidays
-
Hoursh
+
Expected Hours
+
Worked Hours
+
Break Hours
+
Leave Hours
+
+ Remaining Hours + +
@@ -97,30 +100,61 @@
- Sun Mon Tue Wed Thu Fri Sat + Sun
-
+
- - - present · h - leave · holidays +
+ + +
+
+ present + worked + break + leave · holidays +
- - - h - +
+ + + + + +
+
+ + + +
+
+ +
+
+
+ Wrk. + +
+
+ Break + +
+
+ Exp. + +
+
@@ -138,11 +172,32 @@
Balance + Taken + Confirmed +
+
+ + +
+
+
+
+ + allocated +
+ +
+ Balance + Taken + Confirmed
-
diff --git a/addons_extensions/login_bg_img_knk/COPYRIGHT.txt b/addons_extensions/login_bg_img_knk/COPYRIGHT.txt new file mode 100644 index 000000000..57db8adf4 --- /dev/null +++ b/addons_extensions/login_bg_img_knk/COPYRIGHT.txt @@ -0,0 +1,15 @@ + +Most of the files are + + Copyright (c) 2012-TODAY Kanak Infosystems LLP. + +Many files also contain contributions from third +parties. In this case the original copyright of +the contributions can be traced through the +history of the source version control system. + +When that is not the case, the files contain a prominent +notice stating the original copyright and applicable +license, or come with their own dedicated COPYRIGHT +and/or LICENSE file. + diff --git a/addons_extensions/login_bg_img_knk/LICENSE.txt b/addons_extensions/login_bg_img_knk/LICENSE.txt new file mode 100644 index 000000000..eb9b66601 --- /dev/null +++ b/addons_extensions/login_bg_img_knk/LICENSE.txt @@ -0,0 +1,27 @@ +Odoo Proprietary License v1.0 + +This software and associated files (the "Software") may only be used (executed, +modified, executed after modifications) if you have purchased a valid license +from the authors, typically via Odoo Apps, or if you have received a written +agreement from the authors of the Software (see the COPYRIGHT file). + +You may develop Odoo modules that use the Software as a library (typically +by depending on it, importing it and using its resources), but without copying +any source code or material from the Software. You may distribute those +modules under the license of your choice, provided that this license is +compatible with the terms of the Odoo Proprietary License (For example: +LGPL, MIT, or proprietary licenses similar to this one). + +It is forbidden to publish, distribute, sublicense, or sell copies of the Software +or modified copies of the Software. + +The above copyright notice and this permission notice must be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/addons_extensions/login_bg_img_knk/__init__.py b/addons_extensions/login_bg_img_knk/__init__.py new file mode 100644 index 000000000..83216f5df --- /dev/null +++ b/addons_extensions/login_bg_img_knk/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# Powered by Kanak Infosystems LLP. +# © 2020 Kanak Infosystems LLP. (). + +from . import controller +from . import models diff --git a/addons_extensions/login_bg_img_knk/__manifest__.py b/addons_extensions/login_bg_img_knk/__manifest__.py new file mode 100644 index 000000000..32c1ad547 --- /dev/null +++ b/addons_extensions/login_bg_img_knk/__manifest__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Powered by Kanak Infosystems LLP. +# © 2020 Kanak Infosystems LLP. (). + +{ + 'name': "Background image in Login page", + 'version': '18.0.1.0', + 'license': 'OPL-1', + 'depends': ['base', 'portal'], + 'category': 'Tools', + 'author': 'Kanak Infosystems LLP.', + 'website': "https://www.kanakinfosystems.com", + 'summary': """Module helps to set background image in Login page. | Background Image | Image | Login | Login Page | Website""", + 'description': """Module helps to set background image in Login page.""", + 'data': [ + 'views/res_company.xml', + ], + 'images': ['static/description/banner.gif'], + 'sequence': 1 +} diff --git a/addons_extensions/login_bg_img_knk/controller/__init__.py b/addons_extensions/login_bg_img_knk/controller/__init__.py new file mode 100644 index 000000000..41c4fedda --- /dev/null +++ b/addons_extensions/login_bg_img_knk/controller/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Powered by Kanak Infosystems LLP. +# © 2020 Kanak Infosystems LLP. (). + +from . import main diff --git a/addons_extensions/login_bg_img_knk/controller/main.py b/addons_extensions/login_bg_img_knk/controller/main.py new file mode 100644 index 000000000..0e4113f0a --- /dev/null +++ b/addons_extensions/login_bg_img_knk/controller/main.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Powered by Kanak Infosystems LLP. +# © 2020 Kanak Infosystems LLP. (). + +import base64 +from odoo.http import Controller, request, route +from werkzeug.utils import redirect + +DEFAULT_IMAGE = 'login_bg_img_knk/static/src/img/bg.jpg' + + +class DasboardBackground(Controller): + + @route(['/dashboard'], type='http', auth="public") + def dashboard(self, **post): + user = request.env.user + company = user.company_id + if company.bg_image: + image = base64.b64decode(company.bg_image) + else: + return redirect(DEFAULT_IMAGE) + + return request.make_response( + image, [('Content-Type', 'image')]) diff --git a/addons_extensions/login_bg_img_knk/models/__init__.py b/addons_extensions/login_bg_img_knk/models/__init__.py new file mode 100644 index 000000000..dc14dc600 --- /dev/null +++ b/addons_extensions/login_bg_img_knk/models/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Powered by Kanak Infosystems LLP. +# © 2020 Kanak Infosystems LLP. (). + +from . import res_company diff --git a/addons_extensions/login_bg_img_knk/models/res_company.py b/addons_extensions/login_bg_img_knk/models/res_company.py new file mode 100644 index 000000000..a5f77d205 --- /dev/null +++ b/addons_extensions/login_bg_img_knk/models/res_company.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +# Powered by Kanak Infosystems LLP. +# © 2020 Kanak Infosystems LLP. (). + + +from odoo import models, fields + + +class ResCompany(models.Model): + _inherit = 'res.company' + + bg_image = fields.Binary(string="Image") diff --git a/addons_extensions/login_bg_img_knk/static/description/apps/banner_add_product_invoice_line.gif b/addons_extensions/login_bg_img_knk/static/description/apps/banner_add_product_invoice_line.gif new file mode 100644 index 000000000..1a4df6ed9 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/apps/banner_add_product_invoice_line.gif differ diff --git a/addons_extensions/login_bg_img_knk/static/description/apps/banner_instagram_feed_snippet.png b/addons_extensions/login_bg_img_knk/static/description/apps/banner_instagram_feed_snippet.png new file mode 100644 index 000000000..83acf0bbc Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/apps/banner_instagram_feed_snippet.png differ diff --git a/addons_extensions/login_bg_img_knk/static/description/apps/banner_job_portal_kanak.gif b/addons_extensions/login_bg_img_knk/static/description/apps/banner_job_portal_kanak.gif new file mode 100644 index 000000000..c46b283a2 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/apps/banner_job_portal_kanak.gif differ diff --git a/addons_extensions/login_bg_img_knk/static/description/apps/banner_odoo_inbox.gif b/addons_extensions/login_bg_img_knk/static/description/apps/banner_odoo_inbox.gif new file mode 100644 index 000000000..2967e6328 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/apps/banner_odoo_inbox.gif differ diff --git a/addons_extensions/login_bg_img_knk/static/description/apps/banner_odoo_microsoft_azure_sso.jpg b/addons_extensions/login_bg_img_knk/static/description/apps/banner_odoo_microsoft_azure_sso.jpg new file mode 100644 index 000000000..ecb0e5297 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/apps/banner_odoo_microsoft_azure_sso.jpg differ diff --git a/addons_extensions/login_bg_img_knk/static/description/apps/banner_pizza_modifiers.gif b/addons_extensions/login_bg_img_knk/static/description/apps/banner_pizza_modifiers.gif new file mode 100644 index 000000000..9f4840c83 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/apps/banner_pizza_modifiers.gif differ diff --git a/addons_extensions/login_bg_img_knk/static/description/apps/banner_portal_leave_knk.png b/addons_extensions/login_bg_img_knk/static/description/apps/banner_portal_leave_knk.png new file mode 100644 index 000000000..1fd457528 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/apps/banner_portal_leave_knk.png differ diff --git a/addons_extensions/login_bg_img_knk/static/description/apps/banner_pos_lot_selection_knk.gif b/addons_extensions/login_bg_img_knk/static/description/apps/banner_pos_lot_selection_knk.gif new file mode 100644 index 000000000..86b2cc5aa Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/apps/banner_pos_lot_selection_knk.gif differ diff --git a/addons_extensions/login_bg_img_knk/static/description/apps/banner_pos_prescription_knk.jpg b/addons_extensions/login_bg_img_knk/static/description/apps/banner_pos_prescription_knk.jpg new file mode 100644 index 000000000..2aaf11cff Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/apps/banner_pos_prescription_knk.jpg differ diff --git a/addons_extensions/login_bg_img_knk/static/description/apps/banner_product_attribute_display_name.gif b/addons_extensions/login_bg_img_knk/static/description/apps/banner_product_attribute_display_name.gif new file mode 100644 index 000000000..4b2cae8e7 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/apps/banner_product_attribute_display_name.gif differ diff --git a/addons_extensions/login_bg_img_knk/static/description/apps/banner_quote_chatter_message_knk.gif b/addons_extensions/login_bg_img_knk/static/description/apps/banner_quote_chatter_message_knk.gif new file mode 100644 index 000000000..69fb56649 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/apps/banner_quote_chatter_message_knk.gif differ diff --git a/addons_extensions/login_bg_img_knk/static/description/apps/banner_send_direct_print_knk.jpg b/addons_extensions/login_bg_img_knk/static/description/apps/banner_send_direct_print_knk.jpg new file mode 100644 index 000000000..e5c125d6a Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/apps/banner_send_direct_print_knk.jpg differ diff --git a/addons_extensions/login_bg_img_knk/static/description/apps/knk_sale_return.jpg b/addons_extensions/login_bg_img_knk/static/description/apps/knk_sale_return.jpg new file mode 100644 index 000000000..cca98c5a4 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/apps/knk_sale_return.jpg differ diff --git a/addons_extensions/login_bg_img_knk/static/description/apps/order_history.jpg b/addons_extensions/login_bg_img_knk/static/description/apps/order_history.jpg new file mode 100644 index 000000000..ebf60f2b2 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/apps/order_history.jpg differ diff --git a/addons_extensions/login_bg_img_knk/static/description/apps/sale_approval_kanak.jpg b/addons_extensions/login_bg_img_knk/static/description/apps/sale_approval_kanak.jpg new file mode 100644 index 000000000..44da796e0 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/apps/sale_approval_kanak.jpg differ diff --git a/addons_extensions/login_bg_img_knk/static/description/apps/schedule_delivery_knk.jpg b/addons_extensions/login_bg_img_knk/static/description/apps/schedule_delivery_knk.jpg new file mode 100644 index 000000000..7a096db45 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/apps/schedule_delivery_knk.jpg differ diff --git a/addons_extensions/login_bg_img_knk/static/description/banner.gif b/addons_extensions/login_bg_img_knk/static/description/banner.gif new file mode 100644 index 000000000..9164bc322 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/banner.gif differ diff --git a/addons_extensions/login_bg_img_knk/static/description/etc/1-background.jpg b/addons_extensions/login_bg_img_knk/static/description/etc/1-background.jpg new file mode 100644 index 000000000..c2343a33c Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/etc/1-background.jpg differ diff --git a/addons_extensions/login_bg_img_knk/static/description/etc/2-background.jpg b/addons_extensions/login_bg_img_knk/static/description/etc/2-background.jpg new file mode 100644 index 000000000..a3d6299d0 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/etc/2-background.jpg differ diff --git a/addons_extensions/login_bg_img_knk/static/description/etc/3-background.png b/addons_extensions/login_bg_img_knk/static/description/etc/3-background.png new file mode 100644 index 000000000..3d10fb0d9 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/etc/3-background.png differ diff --git a/addons_extensions/login_bg_img_knk/static/description/etc/kanak_logo.png b/addons_extensions/login_bg_img_knk/static/description/etc/kanak_logo.png new file mode 100644 index 000000000..064b7b530 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/etc/kanak_logo.png differ diff --git a/addons_extensions/login_bg_img_knk/static/description/etc/keyfeature.png b/addons_extensions/login_bg_img_knk/static/description/etc/keyfeature.png new file mode 100644 index 000000000..ac705c4de Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/etc/keyfeature.png differ diff --git a/addons_extensions/login_bg_img_knk/static/description/etc/support.jpg b/addons_extensions/login_bg_img_knk/static/description/etc/support.jpg new file mode 100644 index 000000000..8ca95e72c Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/etc/support.jpg differ diff --git a/addons_extensions/login_bg_img_knk/static/description/icon.png b/addons_extensions/login_bg_img_knk/static/description/icon.png new file mode 100644 index 000000000..b35f574b6 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/icon.png differ diff --git a/addons_extensions/login_bg_img_knk/static/description/index.html b/addons_extensions/login_bg_img_knk/static/description/index.html new file mode 100644 index 000000000..a9556782d --- /dev/null +++ b/addons_extensions/login_bg_img_knk/static/description/index.html @@ -0,0 +1,467 @@ +
+ +
+
+
+ Kanak Infosystems LLP. +
+
+
+ Community +
+
+
+
+ Enterprise +
+
+
+
+ Odoo.sh +
+
+
+
+
+
+ +
+
+
+

Background image in Login page

+

+ How cool Would that be, if Background image in Login page module helps to set background image in Login page. +

+
+
+ Background image in Login page +
+
+
+
+
+ +
+
+
+

Background image in Login page :-

+

Navigate to settings > Companies > Click on image field sections and set an image.

+
+
+ Background image in Login page +
+
+
+
+
+ +
+
+
+

Here we can see the backgroun image in login page.

+
+
+ Background image in Login page +
+
+
+
+
+ +
+
+
+

Here we can see the background image in website.

+
+
+ Background image in Login page +
+
+
+
+
+
+
+
+

Key Features

+
+
+
+
+
+
+ Background image in Login page +
+

+ set background image in Login page. +

+
+
+
+
+
+
+
+ Background image in Login page +
+

+ Support Multi Company. +

+
+
+
+
+
+
+
+ Background image in Login page +
+

+ No Configurations. +

+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+

Free 3 Months Support

+
+
+
+

Need help or any technical support ?

+
+ Background image in Login page +
+

Kanak Infosystem will provide free 3 months support for bug fixes, any doubts or queries, installation, configuration support or any types of issues related to this module.

+
+
+
+ Background image in Login page +
+

At our company, we take pride in providing exceptional help and technical support to our valued customers.

+
+
+
+ Background image in Login page +
+

Our team of dedicated experts is well-versed in the intricacies of the Odoo platform.

+
+
+ +
+
+ Background image in Login page +
+
+
+
+
+
+
+
+
+ + Version 17.0.1.0 + (20thNovember 2023) +
+
+
    +
  • Initial Release
  • +
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

Suggested Apps

+
+ + +
+
+
+ +
+
+

Our Services

+
+
+
+
+ +

Hire Odoo Developer

+
+
+
+
+ +

Odoo Customization

+
+
+
+
+ +

Odoo Development

+
+
+
+
+ +

Odoo Installation

+
+
+
+
+ +

Odoo Integration

+
+
+
+
+ +

Odoo Resource

+
+
+
+
+ +

Odoo Themes

+
+
+
+
+ +

Odoo Training

+
+
+
+
+
+
+ +
+
+
+

Important Notice

+

+ All applications are developed within the default, up-to-date Odoo environment, and as such, we cannot guarantee flawless compatibility with third-party apps. While we strive to ensure smooth integration, any conflicts or issues that arise due to third-party applications will require additional support services, which can be provided at an extra cost. Kindly contact our support team for more information or to arrange paid support. +

+
+
+
+
+ +
+
+
+
+
+
+ +
+
+

Kanak infosystems LLP.

+

Unit no.307, The landmark, Urjanagar 1, Kudasan, Gandhinagar, Gujarat - 382421, India

+
+
+ +
+
+
+
+
+
\ No newline at end of file diff --git a/addons_extensions/login_bg_img_knk/static/description/notice_bg.jpg b/addons_extensions/login_bg_img_knk/static/description/notice_bg.jpg new file mode 100644 index 000000000..a3d6299d0 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/notice_bg.jpg differ diff --git a/addons_extensions/login_bg_img_knk/static/description/screenshots/login_bg_img_1.png b/addons_extensions/login_bg_img_knk/static/description/screenshots/login_bg_img_1.png new file mode 100644 index 000000000..563a39eaf Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/screenshots/login_bg_img_1.png differ diff --git a/addons_extensions/login_bg_img_knk/static/description/screenshots/login_bg_img_2.png b/addons_extensions/login_bg_img_knk/static/description/screenshots/login_bg_img_2.png new file mode 100644 index 000000000..f7812d8b0 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/screenshots/login_bg_img_2.png differ diff --git a/addons_extensions/login_bg_img_knk/static/description/screenshots/login_bg_img_3.png b/addons_extensions/login_bg_img_knk/static/description/screenshots/login_bg_img_3.png new file mode 100644 index 000000000..bb4915701 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/screenshots/login_bg_img_3.png differ diff --git a/addons_extensions/login_bg_img_knk/static/description/services/Hire-Odoo-Developer.png b/addons_extensions/login_bg_img_knk/static/description/services/Hire-Odoo-Developer.png new file mode 100644 index 000000000..21498d0b8 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/services/Hire-Odoo-Developer.png differ diff --git a/addons_extensions/login_bg_img_knk/static/description/services/Odoo-Customization.png b/addons_extensions/login_bg_img_knk/static/description/services/Odoo-Customization.png new file mode 100644 index 000000000..af9813a9d Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/services/Odoo-Customization.png differ diff --git a/addons_extensions/login_bg_img_knk/static/description/services/Odoo-Development.png b/addons_extensions/login_bg_img_knk/static/description/services/Odoo-Development.png new file mode 100644 index 000000000..59aa8f3de Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/services/Odoo-Development.png differ diff --git a/addons_extensions/login_bg_img_knk/static/description/services/Odoo-Installation.png b/addons_extensions/login_bg_img_knk/static/description/services/Odoo-Installation.png new file mode 100644 index 000000000..0ab2a4e46 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/services/Odoo-Installation.png differ diff --git a/addons_extensions/login_bg_img_knk/static/description/services/Odoo-Integration.png b/addons_extensions/login_bg_img_knk/static/description/services/Odoo-Integration.png new file mode 100644 index 000000000..91b340a58 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/services/Odoo-Integration.png differ diff --git a/addons_extensions/login_bg_img_knk/static/description/services/Odoo-Resource.png b/addons_extensions/login_bg_img_knk/static/description/services/Odoo-Resource.png new file mode 100644 index 000000000..5e30c848d Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/services/Odoo-Resource.png differ diff --git a/addons_extensions/login_bg_img_knk/static/description/services/Odoo-Themes.png b/addons_extensions/login_bg_img_knk/static/description/services/Odoo-Themes.png new file mode 100644 index 000000000..96b5fc681 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/services/Odoo-Themes.png differ diff --git a/addons_extensions/login_bg_img_knk/static/description/services/Odoo-Training.png b/addons_extensions/login_bg_img_knk/static/description/services/Odoo-Training.png new file mode 100644 index 000000000..87f9f9554 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/description/services/Odoo-Training.png differ diff --git a/addons_extensions/login_bg_img_knk/static/src/img/bg.jpg b/addons_extensions/login_bg_img_knk/static/src/img/bg.jpg new file mode 100644 index 000000000..4a3192626 Binary files /dev/null and b/addons_extensions/login_bg_img_knk/static/src/img/bg.jpg differ diff --git a/addons_extensions/login_bg_img_knk/views/res_company.xml b/addons_extensions/login_bg_img_knk/views/res_company.xml new file mode 100644 index 000000000..3fefbd28c --- /dev/null +++ b/addons_extensions/login_bg_img_knk/views/res_company.xml @@ -0,0 +1,19 @@ + + + + res.company.form.inherit.account + res.company + + + + + + + + + + \ No newline at end of file diff --git a/addons_extensions/web_portal_form_custom/__manifest__.py b/addons_extensions/web_portal_form_custom/__manifest__.py index e3050c0ee..e9f3a0383 100644 --- a/addons_extensions/web_portal_form_custom/__manifest__.py +++ b/addons_extensions/web_portal_form_custom/__manifest__.py @@ -8,18 +8,22 @@ 'version': '1.1', 'summary': 'Changes of the form', 'description': "This module contains the changes in the job portal, candidates, appliant form", - 'depends': ['hr_recruitment_extended', 'website_hr_recruitment','website_hr_recruitment_extended','survey','hr_recruitment'], + 'depends': ['hr_recruitment_extended', 'website_hr_recruitment','website_hr_recruitment_extended','survey','hr_recruitment','web'], 'data': [ 'data/mail_template_data.xml', 'security/ir.model.access.csv', 'views/hr_applicant_form.xml', 'views/hr_candidate_form.xml', 'views/job_portal_changes.xml', + 'views/web_page_login.xml', ], 'assets': { 'web.assets_backend': { 'web_portal_form_custom/static/src/css/candidate_card.css' }, + 'web.assets_frontend': { + 'web_portal_form_custom/static/src/css/web_page.css' + } }, 'post_init_hook': 'post_init_remove_duplicate_skills', 'installable': True, diff --git a/addons_extensions/web_portal_form_custom/static/src/css/web_page.css b/addons_extensions/web_portal_form_custom/static/src/css/web_page.css new file mode 100644 index 000000000..9e739b758 --- /dev/null +++ b/addons_extensions/web_portal_form_custom/static/src/css/web_page.css @@ -0,0 +1,23 @@ +.oe_login_form{ + background:rgba(255,255,255,.15); + backdrop-filter:blur(18px); + -webkit-backdrop-filter:blur(18px); + + border:1px solid rgba(255,255,255,.25); + border-radius:20px; + box-shadow:0 15px 40px rgba(0,0,0,.25); +} + +.srivyn_brand_footer{ + position: fixed; + bottom: 10px; + right: 20px; + color: #fff; + font-size: 18px; + z-index: 1000; +} + +.srivyn_brand_footer strong{ + color: #ffffff; + font-weight: 600; +} \ No newline at end of file diff --git a/addons_extensions/web_portal_form_custom/views/web_page_login.xml b/addons_extensions/web_portal_form_custom/views/web_page_login.xml new file mode 100644 index 000000000..6e16112f0 --- /dev/null +++ b/addons_extensions/web_portal_form_custom/views/web_page_login.xml @@ -0,0 +1,41 @@ + + + + + + \ No newline at end of file