@ -0,0 +1,47 @@ |
|||||
|
.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg |
||||
|
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html |
||||
|
:alt: License: AGPL-3 |
||||
|
|
||||
|
Daily/Weekly Task Status Report |
||||
|
=============================== |
||||
|
This module has the feature to sent the daily and weekly report automatically |
||||
|
based on the entered timesheet. |
||||
|
|
||||
|
Company |
||||
|
------- |
||||
|
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__ |
||||
|
|
||||
|
License |
||||
|
------- |
||||
|
GNU Affero General Public License v3.0 (AGPL v3) |
||||
|
(http://www.gnu.org/licenses/agpl-3.0-standalone.html) |
||||
|
|
||||
|
Credits |
||||
|
------- |
||||
|
Developer: |
||||
|
(V15) Aswathi C, |
||||
|
(V16) Jumana Haseen, |
||||
|
(V17) Jumana Haseen, |
||||
|
Contact: odoo@cybrosys.com |
||||
|
|
||||
|
Contacts |
||||
|
-------- |
||||
|
* Mail Contact : odoo@cybrosys.com |
||||
|
* Website : https://cybrosys.com |
||||
|
|
||||
|
Bug Tracker |
||||
|
----------- |
||||
|
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. |
||||
|
|
||||
|
Maintainer |
||||
|
========== |
||||
|
.. image:: https://cybrosys.com/images/logo.png |
||||
|
:target: https://cybrosys.com |
||||
|
|
||||
|
This module is maintained by Cybrosys Technologies. |
||||
|
|
||||
|
For support and more information, please visit `Our Website <https://cybrosys.com/>`__ |
||||
|
|
||||
|
Further information |
||||
|
=================== |
||||
|
HTML Description: `<static/description/index.html>`__ |
@ -0,0 +1,23 @@ |
|||||
|
"""Daily/weekly task status report""" |
||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################ |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Jumana Haseen (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
################################################################################ |
||||
|
from . import models |
@ -0,0 +1,45 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################ |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Jumana Haseen (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
################################################################################ |
||||
|
{ |
||||
|
'name': 'Daily/Weekly Task Status Report', |
||||
|
'version': '17.0.1.0.0', |
||||
|
'category': 'Project,Accounting,Discuss', |
||||
|
'summary': 'Automatic daily and weekly report.', |
||||
|
'description': 'This module helps to sent the daily/weekly report based on' |
||||
|
'the entered timesheet.', |
||||
|
'author': 'Cybrosys Techno Solutions', |
||||
|
'company': 'Cybrosys Techno Solutions', |
||||
|
'maintainer': 'Cybrosys Techno Solutions', |
||||
|
'website': "https://www.cybrosys.com", |
||||
|
'depends': [ |
||||
|
'analytic', 'hr_timesheet', 'mail', |
||||
|
], |
||||
|
'data': [ |
||||
|
'data/account_analytic_line_templates.xml', |
||||
|
'data/account_analytic_line_data.xml', |
||||
|
], |
||||
|
'images': ['static/description/banner.png'], |
||||
|
'license': 'AGPL-3', |
||||
|
'installable': True, |
||||
|
'auto_install': False, |
||||
|
'application': False, |
||||
|
} |
@ -0,0 +1,28 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
<odoo> |
||||
|
<data noupdate="1"> |
||||
|
<!-- Scheduled action to create daily task report.--> |
||||
|
<record id="ir_cron_auto_daily_task_report" model="ir.cron"> |
||||
|
<field name="name">Daily Task Report</field> |
||||
|
<field name="user_id" ref="base.user_root"/> |
||||
|
<field name="model_id" ref="analytic.model_account_analytic_line"/> |
||||
|
<field name="state">code</field> |
||||
|
<field name="code">model.create_daily_report()</field> |
||||
|
<field name="interval_number">1</field> |
||||
|
<field name="interval_type">days</field> |
||||
|
<field name="numbercall">-1</field> |
||||
|
</record> |
||||
|
|
||||
|
<!-- Scheduled action to create weekly task report.--> |
||||
|
<record id="ir_cron_auto_weekly_task_report" model="ir.cron"> |
||||
|
<field name="name">Weekly Task Report</field> |
||||
|
<field name="model_id" ref="analytic.model_account_analytic_line"/> |
||||
|
<field name="user_id" ref="base.user_root"/> |
||||
|
<field name="state">code</field> |
||||
|
<field name="code">model.create_weekly_report()</field> |
||||
|
<field name="interval_number">1</field> |
||||
|
<field name="interval_type">weeks</field> |
||||
|
<field name="numbercall">-1</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,149 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
<odoo> |
||||
|
<data noupdate="1"> |
||||
|
<!-- Email template for daily task report.--> |
||||
|
<record id="email_template_daily_report" model="mail.template"> |
||||
|
<field name="name">Daily Task Report</field> |
||||
|
<field name="model_id" ref="analytic.model_account_analytic_line"/> |
||||
|
<field name="email_from">{{ctx["from_email"]}}</field> |
||||
|
<field name="email_to">{{ctx["to_email"]}}</field> |
||||
|
<field name="subject">Daily Work Report_{{ ctx["employee"] }}</field> |
||||
|
<field name="body_html" type="html"> |
||||
|
<div style="margin: 0px; padding: 0px;"> |
||||
|
<table border="1" width="100%" cellpadding="0" |
||||
|
bgcolor="#ededed" style="background-color: #d5f5e3;" |
||||
|
summary="o_mail_notification"> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th colspan="5" style="text-align:center;"> |
||||
|
<strong>Daily Work Report_<span |
||||
|
t-out="ctx['employee'] or ''"/> |
||||
|
</strong> |
||||
|
</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody> |
||||
|
<!-- HEADER --> |
||||
|
<tr style="background-color: #45b39d;"> |
||||
|
<td align="center" style="min-width: 100px;"> |
||||
|
SL NO |
||||
|
</td> |
||||
|
<td align="center" style="min-width: 100px;"> |
||||
|
PROJECT |
||||
|
</td> |
||||
|
<td align="center" style="min-width: 100px;"> |
||||
|
TASK |
||||
|
</td> |
||||
|
<td align="center" style="min-width: 100px;"> |
||||
|
DESCRIPTION |
||||
|
</td> |
||||
|
<td align="center" style="min-width: 100px;"> |
||||
|
HOURS SPENT |
||||
|
</td> |
||||
|
</tr> |
||||
|
<!-- CONTENT --> |
||||
|
<t t-set="i" t-value="1"/> |
||||
|
<t t-foreach="ctx['data']" t-as="datas"> |
||||
|
<tr> |
||||
|
<td align="center" |
||||
|
style="min-width: 100px;"> |
||||
|
<t t-esc="i"/> |
||||
|
<t t-set="i" t-value="i+1"/> |
||||
|
</td> |
||||
|
<td align="center" |
||||
|
style="min-width: 100px;"> |
||||
|
<t t-esc="datas['project']"/> |
||||
|
</td> |
||||
|
<td align="center" |
||||
|
style="min-width: 100px;"> |
||||
|
<t t-esc="datas['task']"/> |
||||
|
</td> |
||||
|
<td align="center" |
||||
|
style="min-width: 100px;"> |
||||
|
<t t-esc="datas['description']"/> |
||||
|
</td> |
||||
|
<td align="center" |
||||
|
style="min-width: 100px;"> |
||||
|
<t t-esc="datas['hours_spent']"/> |
||||
|
</td> |
||||
|
</tr> |
||||
|
</t> |
||||
|
</tbody> |
||||
|
</table> |
||||
|
</div> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<!-- Email template for weekly task report.--> |
||||
|
<record id="email_template_weekly_report" model="mail.template"> |
||||
|
<field name="name">Weekly Task Report</field> |
||||
|
<field name="model_id" ref="analytic.model_account_analytic_line"/> |
||||
|
<field name="email_from">{{ctx["from_email"]}}</field> |
||||
|
<field name="email_to">{{ctx["to_email"]}}</field> |
||||
|
<field name="subject">Weekly Work Report-{{ctx["employee"]}}-{{datetime.datetime.today().date()}}</field> |
||||
|
<field name="body_html" type="html"> |
||||
|
<div style="margin: 0px; padding: 0px;"> |
||||
|
<table border="1" width="100%" cellpadding="0" |
||||
|
bgcolor="#ededed" style="background-color: #d5f5e3;" |
||||
|
summary="o_mail_notification"> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th colspan="5" style="text-align:center;"> |
||||
|
<strong>Weekly Work Report_<span |
||||
|
t-out="ctx['week']"/>_<span |
||||
|
t-out="ctx['employee'] or ''"/> |
||||
|
</strong> |
||||
|
</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody> |
||||
|
<tr style="background-color: #45b39d;"> |
||||
|
<td align="center" style="min-width: 100px;"> |
||||
|
SL NO |
||||
|
</td> |
||||
|
<td align="center" style="min-width: 100px;"> |
||||
|
PROJECT |
||||
|
</td> |
||||
|
<td align="center" style="min-width: 100px;"> |
||||
|
TASK |
||||
|
</td> |
||||
|
<td align="center" style="min-width: 100px;"> |
||||
|
DESCRIPTION |
||||
|
</td> |
||||
|
<td align="center" style="min-width: 100px;"> |
||||
|
HOURS SPENT |
||||
|
</td> |
||||
|
</tr> |
||||
|
<t t-set="i" t-value="1"/> |
||||
|
<t t-foreach="ctx['data']" t-as="datas"> |
||||
|
<tr> |
||||
|
<td align="center" |
||||
|
style="min-width: 100px;"> |
||||
|
<t t-esc="i"/> |
||||
|
<t t-set="i" t-value="i+1"/> |
||||
|
</td> |
||||
|
<td align="center" |
||||
|
style="min-width: 100px;"> |
||||
|
<t t-esc="datas['project']"/> |
||||
|
</td> |
||||
|
<td align="center" |
||||
|
style="min-width: 100px;"> |
||||
|
<t t-esc="datas['task']"/> |
||||
|
</td> |
||||
|
<td align="center" |
||||
|
style="min-width: 100px;"> |
||||
|
<t t-esc="datas['description']"/> |
||||
|
</td> |
||||
|
<td align="center" |
||||
|
style="min-width: 100px;"> |
||||
|
<t t-esc="datas['hours_spent']"/> |
||||
|
</td> |
||||
|
</tr> |
||||
|
</t> |
||||
|
</tbody> |
||||
|
</table> |
||||
|
</div> |
||||
|
</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,6 @@ |
|||||
|
## Module <auto_daily_weekly_report> |
||||
|
|
||||
|
#### 05.03.2024 |
||||
|
#### Version 16.0.1.0.0 |
||||
|
#### ADD |
||||
|
- Initial commit for Daily/Weekly Task Status Report |
@ -0,0 +1,23 @@ |
|||||
|
"""Daily/weekly task status report""" |
||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################ |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Jumana Haseen (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
################################################################################ |
||||
|
from . import account_analytic_line |
@ -0,0 +1,114 @@ |
|||||
|
"""Daily/weekly task status report""" |
||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################ |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Jumana Haseen (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
################################################################################ |
||||
|
import datetime |
||||
|
from odoo import models |
||||
|
|
||||
|
|
||||
|
class AccountAnalyticLine(models.Model): |
||||
|
""" |
||||
|
Class inherits account.analytic.line to send the daily and weekly report as |
||||
|
email. |
||||
|
""" |
||||
|
_inherit = 'account.analytic.line' |
||||
|
|
||||
|
def create_daily_report(self): |
||||
|
""" |
||||
|
Method for automatically send email for daily work report. |
||||
|
""" |
||||
|
employee_ids = self.env['hr.employee'].search( |
||||
|
[('parent_id', '!=', False)]) |
||||
|
template = self.env.ref( |
||||
|
'auto_daily_weekly_report.email_template_daily_report', |
||||
|
raise_if_not_found=False) |
||||
|
for employee in employee_ids: |
||||
|
user_email = employee.work_email |
||||
|
working_days = employee.resource_calendar_id.attendance_ids.mapped( |
||||
|
'dayofweek') |
||||
|
account_analytic_line_ids = self.env[ |
||||
|
'account.analytic.line'].search( |
||||
|
[('date', '=', datetime.datetime.today().date()), |
||||
|
('employee_id', '=', employee.id)] |
||||
|
).filtered( |
||||
|
lambda x: x.date.weekday() in [int(day) for day in |
||||
|
working_days]) |
||||
|
lines = [] |
||||
|
for record in account_analytic_line_ids: |
||||
|
lines.append({ |
||||
|
'project': record.project_id.name, |
||||
|
'task': record.task_id.name, |
||||
|
'description': record.name, |
||||
|
'hours_spent': record.unit_amount |
||||
|
}) |
||||
|
ctx = { |
||||
|
'data': lines, |
||||
|
'from_email': user_email, |
||||
|
'to_email': employee.parent_id.work_email, |
||||
|
'employee': employee.name, |
||||
|
} |
||||
|
if len(lines) >= 1: |
||||
|
template.sudo().with_context(ctx).send_mail(employee.user_id.id, |
||||
|
force_send=True) |
||||
|
|
||||
|
def create_weekly_report(self): |
||||
|
""" |
||||
|
Method for automatically send email for weekly task report. |
||||
|
""" |
||||
|
today_date = datetime.datetime.today() |
||||
|
week_num = today_date.isocalendar()[1] |
||||
|
start_date = today_date - datetime.timedelta( |
||||
|
days=datetime.datetime.today().isoweekday() % 7) |
||||
|
employee_ids = self.env['hr.employee'].search( |
||||
|
[('parent_id', '!=', False)]) |
||||
|
template = self.env.ref( |
||||
|
'auto_daily_weekly_report.email_template_weekly_report', |
||||
|
raise_if_not_found=False) |
||||
|
for employee in employee_ids: |
||||
|
user_email = employee.work_email |
||||
|
working_days = employee.resource_calendar_id.attendance_ids.mapped( |
||||
|
'dayofweek') |
||||
|
account_analytic_line_ids = self.env[ |
||||
|
'account.analytic.line'].search( |
||||
|
[('date', '>=', start_date), |
||||
|
('date', '<=', datetime.datetime.today().date()), |
||||
|
('employee_id', '=', employee.id)] |
||||
|
).filtered( |
||||
|
lambda x: x.date.weekday() in [int(day) for day in |
||||
|
working_days]) |
||||
|
lines = [] |
||||
|
for record in account_analytic_line_ids: |
||||
|
lines.append({ |
||||
|
'project': record.project_id.name, |
||||
|
'task': record.task_id.name, |
||||
|
'description': record.name, |
||||
|
'hours_spent': record.unit_amount |
||||
|
}) |
||||
|
ctx = { |
||||
|
'data': lines, |
||||
|
'week': "W" + str(week_num) + "_" + str(today_date.year), |
||||
|
'from_email': user_email, |
||||
|
'to_email': employee.parent_id.work_email, |
||||
|
'employee': employee.name, |
||||
|
} |
||||
|
if len(lines) >= 1: |
||||
|
template.sudo().with_context(ctx).send_mail(employee.user_id.id, |
||||
|
force_send=True) |
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 310 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 576 B |
After Width: | Height: | Size: 733 B |
After Width: | Height: | Size: 911 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 673 B |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 878 B |
After Width: | Height: | Size: 653 B |
After Width: | Height: | Size: 905 B |
After Width: | Height: | Size: 839 B |
After Width: | Height: | Size: 427 B |
After Width: | Height: | Size: 627 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 988 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 80 KiB |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 565 B |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 53 KiB |
After Width: | Height: | Size: 51 KiB |
After Width: | Height: | Size: 56 KiB |
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 51 KiB |
After Width: | Height: | Size: 40 KiB |
After Width: | Height: | Size: 102 KiB |
After Width: | Height: | Size: 105 KiB |
After Width: | Height: | Size: 79 KiB |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 72 KiB |
After Width: | Height: | Size: 237 KiB |
After Width: | Height: | Size: 130 KiB |
After Width: | Height: | Size: 209 KiB |
After Width: | Height: | Size: 92 KiB |
After Width: | Height: | Size: 9.3 KiB |
@ -0,0 +1,787 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html lang="en"> |
||||
|
<head> |
||||
|
<meta charset="UTF-8"> |
||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
||||
|
<title>Odoo App 3 Index</title> |
||||
|
<!-- Bootstrap CSS --> |
||||
|
<link rel="stylesheet" |
||||
|
href="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/css/bootstrap.min.css" |
||||
|
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" |
||||
|
crossorigin="anonymous"> |
||||
|
<link rel="stylesheet" |
||||
|
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css"> |
||||
|
<link rel="preconnect" href="https://fonts.googleapis.com"> |
||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> |
||||
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" |
||||
|
rel="stylesheet"> |
||||
|
</head> |
||||
|
<body> |
||||
|
<section> |
||||
|
<div class="container" |
||||
|
style="font-family: 'Inter', sans-serif !important;background-color: #fff !important;"> |
||||
|
<div class="row"> |
||||
|
<div class="col-sm-12 col-md-12 col-lg-12 d-flex justify-content-between flex-wrap align-items-sm-center" |
||||
|
style="border-bottom:1px solid rgba(0, 0, 0, 0.22)"> |
||||
|
<div class="my-3"> |
||||
|
<img src="assets/misc/Cybrosys R.png" |
||||
|
style="width:auto !important; height:40px !important"> |
||||
|
</div> |
||||
|
<div class="my-3 d-flex align-items-center"> |
||||
|
<div class="text-center" |
||||
|
style="background-color:#017E84 !important;font-size: 0.8rem !important; color:#fff !important; font-weight:500 !important; padding:4px !important; margin:0 3px !important; border-radius:50px !important; min-width: 120px !important;"> |
||||
|
Community |
||||
|
</div> |
||||
|
<div class="text-center" |
||||
|
style="background-color:#875A7B !important; color:#fff !important;font-size: 0.8rem !important; font-weight:500 !important; padding:4px !important; margin:0 3px !important; border-radius:50px !important;min-width: 120px !important;"> |
||||
|
Enterprise |
||||
|
</div> |
||||
|
<div class="text-center" |
||||
|
style="background-color: #2175db !important; color:#fff !important;font-size: 0.8rem !important; font-weight:500 !important; padding:4px !important; margin:0 3px !important; border-radius:50px !important;min-width: 120px !important;"> |
||||
|
Odoo.sh |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="row"> |
||||
|
<div class="col-sm-12 col-md-12 col-lg-12 text-center d-flex align-items-center flex-column" |
||||
|
style="margin: 80px 0px !important;"> |
||||
|
<h1 style="font-size: 2.8rem;font-weight: 700; color: |
||||
|
#1A202C;"> |
||||
|
Daily/Weekly Task Status Report</h1> |
||||
|
<p class="my-3 mb-4" |
||||
|
style="max-width: 80%; font-weight: 400 !important; line-height: 32px; color: #718096;"> |
||||
|
A Module for Automatically Sending Work Report Daily and |
||||
|
Weekly |
||||
|
as Email to The Managers of Employee's. |
||||
|
</p> |
||||
|
<div style="width: 80%; margin-top: 3rem;"> |
||||
|
<img src="assets/screenshots/hero.gif" |
||||
|
class="img-responsive" width="100%" height="auto"> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="container mt-5 mb-5"> |
||||
|
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4"> |
||||
|
<p class="m-0" |
||||
|
style="font-weight: 600; font-size: 24px; color:#714b67 !important"> |
||||
|
Key Highlights |
||||
|
</p> |
||||
|
</div> |
||||
|
<div class="row py-4"> |
||||
|
<div class="col-md-6 col-sm-12 p-3"> |
||||
|
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px; |
||||
|
background: #FFF; |
||||
|
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); "> |
||||
|
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67; |
||||
|
display: flex; justify-content: center; align-items: center; |
||||
|
margin-right: 10px; flex-shrink: 0;"> |
||||
|
<i class="fa-solid fa-star " |
||||
|
style="color: #fff;font-size:14px;"></i> |
||||
|
</div> |
||||
|
<div> |
||||
|
<p style="color: #1A202C;font-weight: 600; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;"> |
||||
|
Auto daily work status report send as email to |
||||
|
the |
||||
|
employee's manager.</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-6 col-sm-12 p-3"> |
||||
|
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px; |
||||
|
background: #FFF; |
||||
|
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); "> |
||||
|
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67; |
||||
|
display: flex; justify-content: center; align-items: center; |
||||
|
margin-right: 10px; flex-shrink: 0;"> |
||||
|
<i class="fa-solid fa-star " |
||||
|
style="color: #fff;font-size:14px;"></i> |
||||
|
</div> |
||||
|
<div> |
||||
|
<p style="color: #1A202C;font-weight: 600; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;"> |
||||
|
Auto weekly work status report send as email to |
||||
|
the |
||||
|
employee's manager.</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-6 col-sm-12 p-3"> |
||||
|
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px; |
||||
|
background: #FFF; |
||||
|
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); "> |
||||
|
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67; |
||||
|
display: flex; justify-content: center; align-items: center; |
||||
|
margin-right: 10px; flex-shrink: 0;"> |
||||
|
<i class="fa-solid fa-star " |
||||
|
style="color: #fff;font-size:14px;"></i> |
||||
|
</div> |
||||
|
<div> |
||||
|
<p style="color: #1A202C;font-weight: 600; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;"> |
||||
|
Available in Odoo 17.0 |
||||
|
Community and Enterprise.</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="container rounded"> |
||||
|
<ul class="nav nav-tabs d-flex" |
||||
|
style="width: fit-content;margin: 0 auto;gap: 1rem;"> |
||||
|
<li class="col text-center py-2 text-nowrap " |
||||
|
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;"> |
||||
|
<a |
||||
|
class="active show" data-toggle="tab" href="#tab1" |
||||
|
style="color: #fff;font-weight: 500; background-color: #714B67; text-decoration: none;"> |
||||
|
<i class="fa-regular fa-image pr-2" |
||||
|
style="color: #fff;"></i> |
||||
|
Screenshots</a></li> |
||||
|
<li class="col text-center py-2 text-nowrap " |
||||
|
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;"> |
||||
|
<a |
||||
|
data-toggle="tab" href="#tab2" |
||||
|
style="color: #fff;font-weight: 500; text-decoration: none;"><i |
||||
|
class="fa-solid fa-star pr-2" |
||||
|
style="color: #fff;"></i>Features</a></li> |
||||
|
<li class="col text-center py-2 text-nowrap " |
||||
|
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;"> |
||||
|
<a |
||||
|
data-toggle="tab" href="#tab3" |
||||
|
style="color: #fff;font-weight: 500; text-decoration: none; background-color: #714B67;"><i |
||||
|
class="fa-solid fa-book-open pr-2" |
||||
|
style="color: #fff;"></i>Released Notes</a></li> |
||||
|
</ul> |
||||
|
<div class="tab-content" |
||||
|
style="background-color: rgba(121, 113, 119, 0.04);"> |
||||
|
<div id="tab1" class="tab-pane fade in active show"> |
||||
|
<div class="col-lg-12 py-2" |
||||
|
style="padding: 1rem 4rem !important;"> |
||||
|
<div |
||||
|
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="row justify-content-center p-3 w-100 m-0"> |
||||
|
<img src="assets/screenshots/1.png" |
||||
|
class="img-thumbnail" width="100%" |
||||
|
height="auto"> |
||||
|
</div> |
||||
|
<div class="px-3"> |
||||
|
<h4 class="mt-2" |
||||
|
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
||||
|
Scheduled action to create daily task |
||||
|
report. You can find this |
||||
|
scheduled action through Settings -> |
||||
|
Technical -> Automation -> |
||||
|
Scheduled Actions -> Daily Task Report.</h4> |
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> |
||||
|
You can see the next execution date on the |
||||
|
scheduled action and |
||||
|
the scheduled action will run in every 1 |
||||
|
day.</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-lg-12 py-2" |
||||
|
style="padding: 1rem 4rem !important;"> |
||||
|
<div |
||||
|
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="row justify-content-center p-3 w-100 m-0"> |
||||
|
<img src="assets/screenshots/2.png" |
||||
|
class="img-thumbnail" width="100%" |
||||
|
height="auto"> |
||||
|
</div> |
||||
|
<div class="px-3"> |
||||
|
<h4 class="mt-2" |
||||
|
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
||||
|
Scheduled action to create weekly task |
||||
|
report. You can find this |
||||
|
scheduled action through Settings -> |
||||
|
Technical -> Automation -> |
||||
|
Scheduled Actions -> Weekly Task |
||||
|
Report.</h4> |
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> |
||||
|
You need to set the Next Execution Date on |
||||
|
the scheduled action |
||||
|
for the first time.Then the scheduled action |
||||
|
will run in every 1 |
||||
|
week.</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-lg-12 py-2" |
||||
|
style="padding: 1rem 4rem !important;"> |
||||
|
<div |
||||
|
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="row justify-content-center p-3 w-100 m-0"> |
||||
|
<img src="assets/screenshots/3.png" |
||||
|
class="img-thumbnail" width="100%" |
||||
|
height="auto"> |
||||
|
</div> |
||||
|
<div class="px-3"> |
||||
|
<h4 class="mt-2" |
||||
|
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
||||
|
Set outgoing email server through Settings |
||||
|
-> Custom Email |
||||
|
Servers -> Outgoing Email Servers.</h4> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-lg-12 py-2" |
||||
|
style="padding: 1rem 4rem !important;"> |
||||
|
<div |
||||
|
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="row justify-content-center p-3 w-100 m-0"> |
||||
|
<img src="assets/screenshots/4.png" |
||||
|
class="img-thumbnail" width="100%" |
||||
|
height="auto"> |
||||
|
</div> |
||||
|
<div class="px-3"> |
||||
|
<h4 class="mt-2" |
||||
|
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
||||
|
Email template for daily work report. You |
||||
|
can find this email |
||||
|
template through Settings -> Technical -> |
||||
|
Emails -> Email |
||||
|
Templates -> Daily Task Report.</h4> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-lg-12 py-2" |
||||
|
style="padding: 1rem 4rem !important;"> |
||||
|
<div |
||||
|
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="row justify-content-center p-3 w-100 m-0"> |
||||
|
<img src="assets/screenshots/5.png" |
||||
|
class="img-thumbnail" width="100%" |
||||
|
height="auto"> |
||||
|
</div> |
||||
|
<div class="px-3"> |
||||
|
<h4 class="mt-2" |
||||
|
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
||||
|
Email template for weekly work report.You |
||||
|
can find this email |
||||
|
template through Settings -> Technical -> |
||||
|
Emails -> Email |
||||
|
Templates -> Weekly Task Report.</h4> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-lg-12 py-2" |
||||
|
style="padding: 1rem 4rem !important;"> |
||||
|
<div |
||||
|
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="row justify-content-center p-3 w-100 m-0"> |
||||
|
<img src="assets/screenshots/6.png" |
||||
|
class="img-thumbnail" width="100%" |
||||
|
height="auto"> |
||||
|
</div> |
||||
|
<div class="px-3"> |
||||
|
<h4 class="mt-2" |
||||
|
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
||||
|
The work report emails will be sent to the |
||||
|
manager set on each |
||||
|
employee's.</h4> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-lg-12 py-2" |
||||
|
style="padding: 1rem 4rem !important;"> |
||||
|
<div |
||||
|
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="row justify-content-center p-3 w-100 m-0"> |
||||
|
<img src="assets/screenshots/7.png" |
||||
|
class="img-thumbnail" width="100%" |
||||
|
height="auto"> |
||||
|
</div> |
||||
|
<div class="px-3"> |
||||
|
<h4 class="mt-2" |
||||
|
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
||||
|
The weekly report sent to the manager.</h4> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div id="tab2" class="tab-pane fade"> |
||||
|
<div class="col-mg-12" style="padding: 1rem 4rem;"> |
||||
|
<ul style="list-style: none; padding: 1rem 0;font-weight: 500;"> |
||||
|
<li class="py-3" |
||||
|
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<span style="margin-right: 12px;"><img |
||||
|
src="assets/misc/star (1) 2.svg" |
||||
|
alt="" |
||||
|
width="16px"></span> |
||||
|
Available in Odoo 17.0 |
||||
|
Community and Enterprise |
||||
|
</li> |
||||
|
<li class="py-3" |
||||
|
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<span style="margin-right: 12px;"><img |
||||
|
src="assets/misc/star (1) 2.svg" |
||||
|
alt="" |
||||
|
width="16px"></span>Daily/Weekly Task Status Report |
||||
|
<ul style="list-style: none;font-weight: 400; color:#718096"> |
||||
|
<li> The Daily/Weekly Task Status Report app |
||||
|
helps the users to send |
||||
|
automatic emails of work status report |
||||
|
in daily |
||||
|
and weekly basis to the employee's |
||||
|
manager. |
||||
|
</li> |
||||
|
</ul> |
||||
|
</li> |
||||
|
</ul> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div id="tab3" class="tab-pane fade"> |
||||
|
<div class="col-mg-12 active" style="padding: 1rem 4rem;"> |
||||
|
<div class="py-3" |
||||
|
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
||||
|
<div class="d-flex mb-3" |
||||
|
style="font-size: 0.8rem; font-weight: 500;"><span>Version |
||||
|
17.0.1.0.0</span><span |
||||
|
class="px-2">|</span><span |
||||
|
style="color: #714B67;font-weight: 600;">Released on:5th January 2024</span> |
||||
|
</div> |
||||
|
<p class="m-0" |
||||
|
style=" color:#718096!important; font-size:1rem !important;line-height: 28px;"> |
||||
|
Initial Commit for Daily/Weekly Task Status Report |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="container mt-5"> |
||||
|
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-5"> |
||||
|
<p class="m-0" |
||||
|
style="font-weight: 600; font-size: 24px; color:#000 !important"> |
||||
|
Related Products</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div id="myCarousel" class="carousel slide py-3" data-ride="carousel"> |
||||
|
<div class="carousel-inner"> |
||||
|
<div class="carousel-item active"> |
||||
|
<div class="row p-4"> |
||||
|
<div class="col"> |
||||
|
<div class="p-3"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/17.0/timesheets_by_employee/" |
||||
|
style="color: #000; text-decoration: none;"> |
||||
|
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> |
||||
|
<div style="width: 300px; "> |
||||
|
<img src="assets/modules/timesheets_by_employee.png" |
||||
|
alt="" width="100%" |
||||
|
height="auto"> |
||||
|
</div> |
||||
|
<p class="text-center pt-2 text-black font-weight-bold"> |
||||
|
Timesheet PDF Report</p> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col"> |
||||
|
<div class="p-3"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/17.0/task_deadline_reminder/" |
||||
|
style="color: #000; text-decoration: none;"> |
||||
|
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> |
||||
|
<div style="width: 300px; "> |
||||
|
<img src="assets/modules/task_deadline_reminder.png" |
||||
|
alt="" width="100%" |
||||
|
height="auto"> |
||||
|
</div> |
||||
|
<p class="text-center pt-2 text-black font-weight-bold"> |
||||
|
Task Deadline Reminder</p> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col"> |
||||
|
<div class="p-3"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/17.0/sale_report_advanced/" |
||||
|
style="color: #000; text-decoration: none;"> |
||||
|
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> |
||||
|
<div style="width: 300px; "> |
||||
|
<img src="assets/modules/sale_report_advanced.png" |
||||
|
alt="" width="100%" |
||||
|
height="auto"> |
||||
|
</div> |
||||
|
<p class="text-center pt-2 text-black font-weight-bold"> |
||||
|
Advanced Sales Reports</p> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="carousel-item"> |
||||
|
<div class="row p-4"> |
||||
|
<div class="col"> |
||||
|
<div class="p-3"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/17.0/top_selling_product_report/" |
||||
|
style="color: #000; text-decoration: none;"> |
||||
|
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> |
||||
|
<div style="width: 300px; "> |
||||
|
<img src="assets/modules/top_selling_product_report.png" |
||||
|
alt="" width="100%" |
||||
|
height="auto"> |
||||
|
</div> |
||||
|
<p class="text-center pt-2 text-black font-weight-bold"> |
||||
|
Top/Least Selling Product Report</p> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col"> |
||||
|
<div class="p-3"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/17.0/product_discount_limit/" |
||||
|
style="color: #000; text-decoration: none;"> |
||||
|
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> |
||||
|
<div style="width: 300px;"> |
||||
|
<img src="assets/modules/product_discount_limit.png" |
||||
|
alt="" width="100%" |
||||
|
height="auto"> |
||||
|
</div> |
||||
|
<p class="text-center pt-2 text-black font-weight-bold"> |
||||
|
Product Discount Limit</p> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col"> |
||||
|
<div class="p-3"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/16.0/project_report_pdf/" |
||||
|
style="color: #000; text-decoration: none;"> |
||||
|
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> |
||||
|
<div style="width: 300px;"> |
||||
|
<img src="assets/modules/project_report_pdf.png" |
||||
|
alt="" width="100%" |
||||
|
height="auto"> |
||||
|
</div> |
||||
|
<p class="text-center pt-2 text-black font-weight-bold"> |
||||
|
Project Report XLS & PDF</p> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<a class="carousel-control-prev" href="#myCarousel" |
||||
|
data-slide="prev" style="width: 35px; color: #000;"> |
||||
|
<span class="carousel-control-prev-icon"> |
||||
|
<i class="fa fa-chevron-left" |
||||
|
style="font-size: 24px;"></i> |
||||
|
</span> |
||||
|
</a> |
||||
|
<a class="carousel-control-next" href="#myCarousel" |
||||
|
data-slide="next" style="width: 35px; color: #000;"> |
||||
|
<span class="carousel-control-next-icon"> |
||||
|
<i class="fa fa-chevron-right" |
||||
|
style="font-size: 24px;"></i> |
||||
|
</span> |
||||
|
</a> |
||||
|
</div> |
||||
|
<div class="container mt-5"> |
||||
|
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4"> |
||||
|
<p class="m-0" |
||||
|
style="font-weight: 600; font-size: 24px; color:#000 !important"> |
||||
|
Our Services</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="container my-5"> |
||||
|
<div class="row py-3"> |
||||
|
<div class="col-md-4 col-sm-6 px-4 py-4"> |
||||
|
<div |
||||
|
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;"> |
||||
|
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
||||
|
<div style="background-color:#13EA36 ; border-radius: 50%; padding: 15px; width: 68px; |
||||
|
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
||||
|
<img src="assets/icons/cogs.png" |
||||
|
alt="service-icon" width="38px" |
||||
|
height="auto"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<p style="margin-top: 20px; font-weight: bold;">Odoo |
||||
|
Customization</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-4 col-sm-6 px-4 py-4"> |
||||
|
<div |
||||
|
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;"> |
||||
|
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
||||
|
<div style="background-color:#DBC711; border-radius: 50%; padding: 15px; width: 68px; |
||||
|
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
||||
|
<img src="assets/icons/wrench.png" |
||||
|
alt="service-icon" width="38px" |
||||
|
height="auto"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<p style="margin-top: 20px; font-weight: bold;">Odoo |
||||
|
Implementation</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-4 col-sm-6 px-4 py-4"> |
||||
|
<div |
||||
|
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;"> |
||||
|
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
||||
|
<div style="background-color:#FF6B6B ; border-radius: 50%; padding: 15px; width: 68px; |
||||
|
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
||||
|
<img src="assets/icons/lifebuoy.png" |
||||
|
alt="service-icon" width="38px" |
||||
|
height="auto"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<p style="margin-top: 20px; font-weight: bold;">Odoo |
||||
|
Support</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-4 col-sm-6 px-4 py-4"> |
||||
|
<div |
||||
|
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;"> |
||||
|
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
||||
|
<div style="background-color:#FFA801 ; border-radius: 50%; padding: 15px; width: 68px; |
||||
|
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
||||
|
<img src="assets/icons/user.png" |
||||
|
alt="service-icon" width="38px" |
||||
|
height="auto"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<p style="margin-top: 20px; font-weight: bold;">Hire |
||||
|
Odoo Developer</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-4 col-sm-6 px-4 py-4"> |
||||
|
<div |
||||
|
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;"> |
||||
|
|
||||
|
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
||||
|
<div style="background-color:#54A0FF; border-radius: 50%; padding: 15px; width: 68px; |
||||
|
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
||||
|
<img src="assets/icons/puzzle.png" |
||||
|
alt="service-icon" width="38px" |
||||
|
height="auto"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<p style="margin-top: 20px; font-weight: bold;">Odoo |
||||
|
Integration</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-4 col-sm-6 px-4 py-4"> |
||||
|
<div |
||||
|
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;"> |
||||
|
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
||||
|
<div style="background-color:#6D7680 ; border-radius: 50%; padding: 15px; width: 68px; |
||||
|
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
||||
|
<img src="assets/icons/update.png" |
||||
|
alt="service-icon" width="38px" |
||||
|
height="auto"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<p style="margin-top: 20px; font-weight: bold;">Odoo |
||||
|
Migration</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-4 col-sm-6 px-4 py-4"> |
||||
|
<div |
||||
|
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;"> |
||||
|
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
||||
|
<div style="background-color:#786FA6 ; border-radius: 50%; padding: 15px; width: 68px; |
||||
|
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
||||
|
<img src="assets/icons/consultation.png" |
||||
|
alt="service-icon" width="38px" |
||||
|
height="auto"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<p style="margin-top: 20px; font-weight: bold;">Odoo |
||||
|
Consultancy</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-4 col-sm-6 px-4 py-4"> |
||||
|
<div |
||||
|
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px;position: relative;border-radius: 4px;"> |
||||
|
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
||||
|
<div style="background-color:#F8A5C2 ; border-radius: 50%; padding: 15px; width: 68px; |
||||
|
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
||||
|
<img src="assets/icons/training.png" |
||||
|
alt="service-icon" width="38px" |
||||
|
height="auto"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<p style="margin-top: 20px; font-weight: bold;">Odoo |
||||
|
Implementation</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-4 col-sm-6 px-4 py-4"> |
||||
|
<div |
||||
|
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;"> |
||||
|
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
||||
|
<div style="background-color:#E6BE26; border-radius: 50%; padding: 15px; width: 68px; |
||||
|
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
||||
|
<img src="assets/icons/license.png" |
||||
|
alt="service-icon" width="38px" |
||||
|
height="auto"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<p style="margin-top: 20px; font-weight: bold;">Odoo |
||||
|
Licensing Consultancy</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="container mt-5"> |
||||
|
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4"> |
||||
|
<p class="m-0" |
||||
|
style="font-weight: 600; font-size: 24px; color:#000 !important"> |
||||
|
Our Industries</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="container"> |
||||
|
<div class="row my-5 py-4"> |
||||
|
<div class="col-md-3 col-sm-6 p-0"> |
||||
|
<div class="d-flex flex-column h-100 " |
||||
|
style="border-right: 1px solid rgb(209, 209, 209); border-bottom: 1px solid rgb(209, 209, 209); padding: 30px; box-shadow: 6px 0 10px rgba(228, 227, 227, 0.373);"> |
||||
|
<img src="assets/icons/trading-black.png" width="42px" |
||||
|
height="auto" alt=""> |
||||
|
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;">Trading</p> |
||||
|
<p>Easily procure and sell your products</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-3 col-sm-6 p-0"> |
||||
|
<div class="d-flex flex-column h-100" |
||||
|
style="border-right: 1px solid rgb(209, 209, 209);border-bottom: 1px solid rgb(209, 209, 209); padding: 30px;"> |
||||
|
<img src="assets/icons/pos-black.png" width="42px" |
||||
|
height="auto" alt=""> |
||||
|
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;">POS</p> |
||||
|
<p>Easy configuration and convivial experience</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-3 col-sm-6 p-0"> |
||||
|
<div class="d-flex flex-column h-100" |
||||
|
style="border-right: 1px solid rgb(209, 209, 209);border-bottom: 1px solid rgba(0, 0, 0, 0.2); padding: 30px; box-shadow: 0 5px 10px rgba(228, 227, 227, 0.373)"> |
||||
|
<img src="assets/icons/education-black.png" width="42px" |
||||
|
height="auto" alt=""> |
||||
|
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;"> |
||||
|
Education</p> |
||||
|
<p>A platform for educational management</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-3 col-sm-6 p-0"> |
||||
|
<div class="d-flex flex-column h-100" |
||||
|
style="border-bottom: 1px solid rgb(209, 209, 209); padding: 30px; "> |
||||
|
<img src="assets/icons/manufacturing-black.png" |
||||
|
width="42px" height="auto" alt=""> |
||||
|
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;"> |
||||
|
Manufacturing</p> |
||||
|
<p>Plan, track and schedule your operations</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-3 col-sm-6 p-0"> |
||||
|
<div class="d-flex flex-column h-100" |
||||
|
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px;"> |
||||
|
<img src="assets/icons/ecom-black.png" width="42px" |
||||
|
height="auto" alt=""> |
||||
|
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;">E-commerce & |
||||
|
Website</p> |
||||
|
<p>Mobile friendly, awe-inspiring product pages</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-3 col-sm-6 p-0"> |
||||
|
<div class="d-flex flex-column h-100" |
||||
|
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px;box-shadow: 0 -5px 10px rgba(228, 227, 227, 0.373);"> |
||||
|
<img src="assets/icons/service-black.png" width="42px" |
||||
|
height="auto" alt=""> |
||||
|
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;">Service |
||||
|
Management</p> |
||||
|
<p>Keep track of services and invoice</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-3 col-sm-6 p-0"> |
||||
|
<div class="d-flex flex-column h-100" |
||||
|
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px; "> |
||||
|
<img src="assets/icons/restaurant-black.png" |
||||
|
width="42px" height="auto" alt=""> |
||||
|
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;"> |
||||
|
Restaurant</p> |
||||
|
<p>Run your bar or restaurant methodically</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-3 col-sm-6 p-0"> |
||||
|
<div class="d-flex flex-column h-100" |
||||
|
style=" padding: 30px;box-shadow: -5px 0 10px rgba(228, 227, 227, 0.373);"> |
||||
|
<img src="assets/icons/hotel-black.png" width="42px" |
||||
|
height="auto" alt=""> |
||||
|
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
||||
|
font-size: 1.2rem; margin-bottom: 2px;">Hotel |
||||
|
Management</p> |
||||
|
<p>An all-inclusive hotel management application</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="container mt-5"> |
||||
|
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-5"> |
||||
|
<p class="m-0" |
||||
|
style="font-weight: 600; font-size: 24px; color:#000 !important"> |
||||
|
Support</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="container my-5"> |
||||
|
<div class="row" style="background-color: #FFFAFE;"> |
||||
|
<div class="col-md-6 pb-4 d-flex align-items-center justify-content-center" |
||||
|
style="border-right: 1px solid #D9D9D9;"> |
||||
|
<div style="padding: 30px;"> |
||||
|
<div class="d-flex align-items-center"> |
||||
|
<img src="assets/misc/support (1) 1.svg" alt="" |
||||
|
width="60px" style="margin-right: 12px;"> |
||||
|
<div style="padding: 0px 8px;"> |
||||
|
<span |
||||
|
style="color: #714B67;font-size: 24px;font-weight: 600;padding-bottom: 1rem;">Need |
||||
|
Help?</span> |
||||
|
<p class="m-0" style="color:#718096;">Got |
||||
|
questions or need help? Get in touch.</p> |
||||
|
<div style="font-weight: 400;"><span><img |
||||
|
src="assets/misc/support-email.svg" |
||||
|
alt="" |
||||
|
width="18px" |
||||
|
style="filter: invert(1);margin-right: 0.8rem;"></span>odoo@cybrosys.com |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-6 pb-4 d-flex align-items-center justify-content-center"> |
||||
|
<div style="padding: 30px;"> |
||||
|
<div class="d-flex align-items-center"> |
||||
|
<img src="assets/misc/whatsapp 1.svg" alt="" |
||||
|
width="60px" style="margin-right: 12px;"> |
||||
|
<div> |
||||
|
<span style="color: #714B67;font-size: 24px;font-weight: 600;">WhatsApp</span> |
||||
|
<p class="m-0" style="color:#718096;">Say hi to |
||||
|
us on WhatsApp!</p> |
||||
|
<div style="font-weight: 400; font-size: 16px;"><span><img |
||||
|
src="assets/misc/phone.svg" |
||||
|
alt="" width="14px" |
||||
|
style="filter: invert(1); margin-right: 0.8rem;"></span>+91 |
||||
|
99456767686 |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
<!-- Optional JavaScript --> |
||||
|
<!-- jQuery first, then Popper.js, then Bootstrap JS --> |
||||
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> |
||||
|
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script> |
||||
|
</body> |
||||
|
</html> |
||||
|
|
@ -0,0 +1,41 @@ |
|||||
|
.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg |
||||
|
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html |
||||
|
:alt: License: AGPL-3 |
||||
|
|
||||
|
Cancel Landed Cost |
||||
|
================== |
||||
|
This module helps to cancel Landed Costs and allows you to cancel multiple Landed Costs from the tree view. There are three ways in which you can cancel the Landed Costs. |
||||
|
|
||||
|
License |
||||
|
------- |
||||
|
General Public License, Version 3 (AGPL v3). |
||||
|
(https://www.gnu.org/licenses/agpl-3.0-standalone.html) |
||||
|
|
||||
|
Company |
||||
|
------- |
||||
|
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__ |
||||
|
|
||||
|
Credits |
||||
|
------- |
||||
|
Developer:(V17) ANFAS FAISAL K, Contact: odoo@cybrosys.com |
||||
|
|
||||
|
Contacts |
||||
|
-------- |
||||
|
* Mail Contact : odoo@cybrosys.com |
||||
|
* Website : https://cybrosys.com |
||||
|
|
||||
|
Bug Tracker |
||||
|
----------- |
||||
|
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. |
||||
|
|
||||
|
Maintainer |
||||
|
========== |
||||
|
.. image:: https://cybrosys.com/images/logo.png |
||||
|
:target: https://cybrosys.com |
||||
|
This module is maintained by Cybrosys Technologies. |
||||
|
|
||||
|
For support and more information, please visit `Our Website <https://cybrosys.com/>`__ |
||||
|
|
||||
|
Further information |
||||
|
=================== |
||||
|
HTML Description: `<static/description/index.html>`__ |
@ -0,0 +1,22 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################ |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Anfas Faisal K (odoo@cybrosys.info) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
################################################################################ |
||||
|
from . import models |
@ -0,0 +1,47 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################ |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Anfas Faisal K (odoo@cybrosys.info) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
################################################################################ |
||||
|
{ |
||||
|
'name': "Cancel Landed Cost", |
||||
|
'version': "17.0.1.0.0", |
||||
|
'category': 'Purchases,Accounting,Warehouse', |
||||
|
'summary': 'This module helps to cancel landed costs', |
||||
|
'description': 'This module helps to cancel Landed Costs and allows you ' |
||||
|
'to cancel multiple Landed Costs from the tree view. There ' |
||||
|
'are three ways in which you can cancel the Landed Costs' |
||||
|
'Cancel Only, Cancel and Reset to Draft,Cancel and Delete', |
||||
|
'author': 'Cybrosys Techno Solutions', |
||||
|
'company': 'Cybrosys Techno Solutions', |
||||
|
'maintainer': 'Cybrosys Techno Solutions', |
||||
|
'website': 'https://www.cybrosys.com', |
||||
|
'depends': ['account', 'purchase', 'stock_landed_costs'], |
||||
|
'data': [ |
||||
|
'security/cancel_landed_cost_odoo_groups.xml', |
||||
|
'data/stock_landed_cost_data.xml', |
||||
|
'views/stock_landed_cost_views.xml', |
||||
|
'views/res_config_settings_views.xml', |
||||
|
], |
||||
|
'images': ['static/description/banner.jpg'], |
||||
|
'license': 'AGPL-3', |
||||
|
'installable': True, |
||||
|
'auto_install': False, |
||||
|
'application': False, |
||||
|
} |
@ -0,0 +1,38 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
<odoo> |
||||
|
<!-- Cancel Button inside Action Menu in model Stock Landed Cost--> |
||||
|
<record id="stock_landed_cost_action_cancel" model="ir.actions.server"> |
||||
|
<field name="name">Cancel</field> |
||||
|
<field name="model_id" ref="model_stock_landed_cost"/> |
||||
|
<field name="groups_id" |
||||
|
eval="[(4, ref('cancel_landed_cost_odoo_group_cancel_user'))]"/> |
||||
|
<field name="binding_model_id" ref="model_stock_landed_cost"/> |
||||
|
<field name="binding_view_types">list,form</field> |
||||
|
<field name="state">code</field> |
||||
|
<field name="code">action = records.action_landed_cost_cancel()</field> |
||||
|
</record> |
||||
|
<!-- Cancel and Reset Button inside Action Menu in model Stock Landed Cost--> |
||||
|
<record id="stock_landed_cost_action_cancel_and_reset" model="ir.actions.server"> |
||||
|
<field name="name">Cancel and Reset Draft</field> |
||||
|
<field name="model_id" ref="model_stock_landed_cost"/> |
||||
|
<field name="groups_id" |
||||
|
eval="[(4, ref('cancel_landed_cost_odoo_group_cancel_user'))]"/> |
||||
|
<field name="binding_model_id" ref="model_stock_landed_cost"/> |
||||
|
<field name="binding_view_types">list,form</field> |
||||
|
<field name="state">code</field> |
||||
|
<field name="code">action = records.action_landed_cost_reset_and_cancel() |
||||
|
</field> |
||||
|
</record> |
||||
|
<!-- Cancel and Delete Button inside Action Menu in model Stock Landed Cost--> |
||||
|
<record id="stock_landed_cost_action_cancel_and_delete" model="ir.actions.server"> |
||||
|
<field name="name">Cancel and Delete</field> |
||||
|
<field name="model_id" ref="model_stock_landed_cost"/> |
||||
|
<field name="groups_id" |
||||
|
eval="[(4, ref('cancel_landed_cost_odoo_group_cancel_user'))]"/> |
||||
|
<field name="binding_model_id" ref="model_stock_landed_cost"/> |
||||
|
<field name="binding_view_types">list,form</field> |
||||
|
<field name="state">code</field> |
||||
|
<field name="code">action = records.action_landed_cost_cancel_and_delete() |
||||
|
</field> |
||||
|
</record> |
||||
|
</odoo> |
@ -0,0 +1,7 @@ |
|||||
|
## Module <cancel_landed_cost_odoo> |
||||
|
|
||||
|
#### 04.03.2024 |
||||
|
#### Version 17.0.1.0.0 |
||||
|
#### ADD |
||||
|
|
||||
|
- Initial commit for Cancel Landed Cost |
@ -0,0 +1,23 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################ |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Anfas Faisal K (odoo@cybrosys.info) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
################################################################################ |
||||
|
from . import res_config_settings |
||||
|
from . import stock_landed_cost |
@ -0,0 +1,37 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################ |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Anfas Faisal K (odoo@cybrosys.info) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
################################################################################ |
||||
|
from odoo import fields, models |
||||
|
|
||||
|
|
||||
|
class ResConfigSettings(models.TransientModel): |
||||
|
"""Model for managing the configuration settings for canceling landed |
||||
|
costs.""" |
||||
|
|
||||
|
_inherit = "res.config.settings" |
||||
|
|
||||
|
land_cost_cancel_modes = fields.Selection([ |
||||
|
('cancel', 'Cancel'), |
||||
|
('cancel_draft', 'Cancel and Reset to Draft'), |
||||
|
('cancel_delete', 'Cancel and Delete'), |
||||
|
], string='Operation Type', default='cancel', |
||||
|
help="Select the operation to perform when canceling a landed cost.", |
||||
|
config_parameter='cancel_landed_cost_odoo.land_cost_cancel_modes') |
@ -0,0 +1,232 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################ |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Anfas Faisal K (odoo@cybrosys.info) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
################################################################################ |
||||
|
from odoo import fields, models |
||||
|
|
||||
|
|
||||
|
class StockLandedCost(models.Model): |
||||
|
"""Inherits 'stock.landed.cost' model to add additional functionality |
||||
|
related to cancelling and resetting landed cost records. |
||||
|
|
||||
|
Methods: |
||||
|
action_landed_cost_cancel: Cancels the landed cost record by deleting |
||||
|
its associated accounting entries, stock valuation, and changes state |
||||
|
to 'cancelled. |
||||
|
|
||||
|
action_landed_cost_reset_and_cancel: Resets the landed cost record by |
||||
|
deleting its associated accounting entries and stock valuation. |
||||
|
It changes the state back to 'draft'. |
||||
|
|
||||
|
action_landed_cost_cancel_and_delete: Deletes the landed cost record by |
||||
|
deleting its associated accounting entries and stock valuation. It also |
||||
|
deletes the Landed cost record. |
||||
|
|
||||
|
action_landed_cost_cancel_form: Cancels the landed cost record and |
||||
|
deletes its associated accounting entries and stock valuation. |
||||
|
It also creates two entries to revert back to the original cost price, |
||||
|
which are also deleted in the process. |
||||
|
|
||||
|
""" |
||||
|
_inherit = 'stock.landed.cost' |
||||
|
|
||||
|
is_cancel = fields.Boolean(string='Cancel', default=False, |
||||
|
help='If the user clicks the "Cancel" button' |
||||
|
'once, it will hide the button and make' |
||||
|
'it invisible.') |
||||
|
|
||||
|
def action_landed_cost_cancel(self): |
||||
|
"""Cancels the landed cost record by deleting its associated |
||||
|
accounting entries, stock valuation, and changes state to 'cancelled'. |
||||
|
|
||||
|
Additionally, it reverts the original cost price by creating two |
||||
|
entries, which are also deleted in the process. |
||||
|
""" |
||||
|
for rec in self: |
||||
|
for line in rec.valuation_adjustment_lines.filtered( |
||||
|
lambda line: line.move_id): |
||||
|
product = line.move_id.product_id |
||||
|
if product.cost_method == 'average': |
||||
|
original_price = product.standard_price |
||||
|
new_price = product.standard_price - line.additional_landed_cost |
||||
|
product.write({'standard_price': new_price}) |
||||
|
stock_valuation_layer = self.env['stock.valuation.layer'] \ |
||||
|
.search([('product_id', '=', product.id), |
||||
|
('description', '=', f'Product value manually ' |
||||
|
f'modified (from {original_price} to {new_price})')], |
||||
|
limit=1) |
||||
|
if stock_valuation_layer: |
||||
|
stock_valuation_layer.account_move_id.button_draft() |
||||
|
stock_valuation_layer.account_move_id.sudo().unlink() |
||||
|
stock_valuation_layer.sudo().unlink() |
||||
|
if rec.account_move_id: |
||||
|
account_id = rec.account_move_id |
||||
|
account_move_ids = account_id.line_ids |
||||
|
if account_move_ids: |
||||
|
account_id.sudo().write( |
||||
|
{'state': 'draft', 'name': 'Delete Sequence Number'}) |
||||
|
account_move_ids.sudo().unlink() |
||||
|
account_id.sudo().unlink() |
||||
|
if rec.valuation_adjustment_lines: |
||||
|
rec.valuation_adjustment_lines.unlink() |
||||
|
if rec.stock_valuation_layer_ids: |
||||
|
rec.stock_valuation_layer_ids.sudo().unlink() |
||||
|
rec.write({'state': 'cancel'}) |
||||
|
|
||||
|
def action_landed_cost_reset_and_cancel(self): |
||||
|
"""Resets the landed cost record by deleting its associated accounting |
||||
|
entries and stock valuation. It changes the state back to 'draft'. |
||||
|
|
||||
|
Additionally, it reverts the original cost price by creating two entries, |
||||
|
which are also deleted in the process. |
||||
|
""" |
||||
|
for rec in self: |
||||
|
for line in rec.valuation_adjustment_lines.filtered( |
||||
|
lambda line: line.move_id): |
||||
|
product = line.move_id.product_id |
||||
|
if product.cost_method == 'average': |
||||
|
original_price = product.standard_price |
||||
|
new_price = product.standard_price - line.additional_landed_cost |
||||
|
product.write({'standard_price': new_price}) |
||||
|
stock_valuation_layer = self.env['stock.valuation.layer'] \ |
||||
|
.search([('product_id', '=', product.id), |
||||
|
('description', '=', f'Product value manually ' |
||||
|
f'modified (from {original_price} to {new_price})')], |
||||
|
limit=1) |
||||
|
if stock_valuation_layer: |
||||
|
stock_valuation_layer.account_move_id.button_draft() |
||||
|
stock_valuation_layer.account_move_id.sudo().unlink() |
||||
|
stock_valuation_layer.sudo().unlink() |
||||
|
if rec.account_move_id: |
||||
|
account_id = rec.account_move_id |
||||
|
account_move_ids = account_id.line_ids |
||||
|
if account_move_ids: |
||||
|
account_id.sudo().write( |
||||
|
{'state': 'draft', 'name': 'Delete Sequence Number'}) |
||||
|
account_move_ids.sudo().unlink() |
||||
|
account_id.sudo().unlink() |
||||
|
if rec.valuation_adjustment_lines: |
||||
|
rec.valuation_adjustment_lines.unlink() |
||||
|
if rec.stock_valuation_layer_ids: |
||||
|
rec.sudo().stock_valuation_layer_ids.unlink() |
||||
|
rec.write({'state': 'draft'}) |
||||
|
|
||||
|
def action_landed_cost_cancel_and_delete(self): |
||||
|
"""Deletes the landed cost record by deleting its associated accounting |
||||
|
entries and stock valuation. It also deletes the Landed cost record. |
||||
|
|
||||
|
Additionally, it reverts the original cost price by creating two |
||||
|
entries, which are also deleted in the process. |
||||
|
""" |
||||
|
for rec in self: |
||||
|
for line in rec.valuation_adjustment_lines.filtered( |
||||
|
lambda line: line.move_id): |
||||
|
product = line.move_id.product_id |
||||
|
if product.cost_method == 'average': |
||||
|
original_price = product.standard_price |
||||
|
new_price = product.standard_price - line.additional_landed_cost |
||||
|
product.write({'standard_price': new_price}) |
||||
|
stock_valuation_layer = self.env['stock.valuation.layer'] \ |
||||
|
.search([('product_id', '=', product.id), |
||||
|
('description', '=', f'Product value manually ' |
||||
|
f'modified (from {original_price} to {new_price})')], |
||||
|
limit=1) |
||||
|
if stock_valuation_layer: |
||||
|
stock_valuation_layer.account_move_id.button_draft() |
||||
|
stock_valuation_layer.account_move_id.sudo().unlink() |
||||
|
stock_valuation_layer.sudo().unlink() |
||||
|
if rec.account_move_id: |
||||
|
account_id = rec.account_move_id |
||||
|
account_move_ids = account_id.line_ids |
||||
|
if account_move_ids: |
||||
|
account_id.sudo().write( |
||||
|
{'state': 'draft', 'name': 'Delete Sequence Number'}) |
||||
|
account_move_ids.sudo().unlink() |
||||
|
account_id.sudo().unlink() |
||||
|
if rec.valuation_adjustment_lines: |
||||
|
rec.valuation_adjustment_lines.unlink() |
||||
|
if rec.stock_valuation_layer_ids: |
||||
|
rec.sudo().stock_valuation_layer_ids.unlink() |
||||
|
rec.write({'state': 'cancel'}) |
||||
|
rec.unlink() |
||||
|
|
||||
|
def action_landed_cost_cancel_form(self): |
||||
|
"""Cancels the landed cost record and deletes its associated |
||||
|
accounting entries and stock valuation. It also creates two entries |
||||
|
to revert back to the original cost price, which are also deleted in |
||||
|
the process. |
||||
|
|
||||
|
The specific action performed depends on the value of the |
||||
|
'cancel_landed_cost_odoo.land_cost_cancel_modes' |
||||
|
configuration parameter: |
||||
|
- 'cancel': Changes the landed cost state to 'cancel' and sets |
||||
|
the 'is_cancel' flag to True. |
||||
|
- 'cancel_draft': Changes the landed cost state to 'draft' |
||||
|
and sets the 'is_cancel' flag to False. |
||||
|
- 'cancel_delete': Deletes the landed cost record and returns an |
||||
|
action to open the Landed Cost tree view. |
||||
|
""" |
||||
|
for rec in self: |
||||
|
for line in rec.valuation_adjustment_lines.filtered( |
||||
|
lambda line: line.move_id): |
||||
|
product = line.move_id.product_id |
||||
|
if product.cost_method == 'average': |
||||
|
original_price = product.standard_price |
||||
|
new_price = product.standard_price - line.additional_landed_cost |
||||
|
product.write({'standard_price': new_price}) |
||||
|
stock_valuation_layer = self.env['stock.valuation.layer'] \ |
||||
|
.search([('product_id', '=', product.id), |
||||
|
('description', '=', f'Product value manually ' |
||||
|
f'modified (from {original_price} to {new_price})')], |
||||
|
limit=1) |
||||
|
if stock_valuation_layer: |
||||
|
stock_valuation_layer.account_move_id.button_draft() |
||||
|
stock_valuation_layer.account_move_id.sudo().unlink() |
||||
|
stock_valuation_layer.sudo().unlink() |
||||
|
if self.account_move_id: |
||||
|
account_id = self.account_move_id |
||||
|
account_move_ids = account_id.line_ids |
||||
|
if account_move_ids: |
||||
|
account_id.sudo().write( |
||||
|
{'state': 'draft', 'name': 'Delete Sequence Number'}) |
||||
|
account_move_ids.sudo().unlink() |
||||
|
account_id.sudo().unlink() |
||||
|
if self.valuation_adjustment_lines: |
||||
|
self.valuation_adjustment_lines.unlink() |
||||
|
if self.stock_valuation_layer_ids: |
||||
|
self.sudo().stock_valuation_layer_ids.unlink() |
||||
|
landed_mode = self.env['ir.config_parameter'].sudo().get_param( |
||||
|
'cancel_landed_cost_odoo.land_cost_cancel_modes') |
||||
|
if landed_mode == 'cancel': |
||||
|
self.write({'state': 'cancel'}) |
||||
|
self.is_cancel = True |
||||
|
if landed_mode == 'cancel_draft': |
||||
|
self.write({'state': 'draft'}) |
||||
|
self.is_cancel = False |
||||
|
if landed_mode == 'cancel_delete': |
||||
|
self.write({'state': 'cancel'}) |
||||
|
self.unlink() |
||||
|
return { |
||||
|
'name': 'Landed Cost', |
||||
|
'type': 'ir.actions.act_window', |
||||
|
'res_model': 'stock.landed.cost', |
||||
|
'view_mode': 'tree,form', |
||||
|
'target': 'current' |
||||
|
} |
@ -0,0 +1,8 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
<odoo> |
||||
|
<!-- Added a new group within the res.groups module, which allows you to activate the feature for canceling landed costs.--> |
||||
|
<record id="cancel_landed_cost_odoo_group_cancel_user" model="res.groups"> |
||||
|
<field name="name">Landed Cost Cancel Features</field> |
||||
|
<field name="category_id" ref="base.module_category_hidden"/> |
||||
|
</record> |
||||
|
</odoo> |
After Width: | Height: | Size: 131 KiB |
After Width: | Height: | Size: 101 KiB |
After Width: | Height: | Size: 108 KiB |
After Width: | Height: | Size: 93 KiB |
After Width: | Height: | Size: 95 KiB |
After Width: | Height: | Size: 101 KiB |
After Width: | Height: | Size: 87 KiB |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 90 KiB |
After Width: | Height: | Size: 102 KiB |
After Width: | Height: | Size: 98 KiB |
After Width: | Height: | Size: 54 KiB |
After Width: | Height: | Size: 249 KiB |
After Width: | Height: | Size: 91 KiB |
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 310 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 576 B |
After Width: | Height: | Size: 733 B |
After Width: | Height: | Size: 911 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 673 B |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 878 B |
After Width: | Height: | Size: 653 B |
After Width: | Height: | Size: 905 B |
After Width: | Height: | Size: 839 B |
After Width: | Height: | Size: 427 B |
After Width: | Height: | Size: 627 B |
After Width: | Height: | Size: 1.2 KiB |