@ -0,0 +1,47 @@ |
|||||
|
.. image:: https://img.shields.io/badge/license-LGPL--3-green.svg |
||||
|
:target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html |
||||
|
:alt: License: LGPL-3 |
||||
|
|
||||
|
Base Machine Repair Management |
||||
|
============================== |
||||
|
* Machine Repair Management system is an application which is used to maintain the repairs of machine. It is also allow users to take machine requests through website and these requests are created in the backend .Also we can manage the job order,machine diagnosis and maintained the team. |
||||
|
|
||||
|
Configuration |
||||
|
============= |
||||
|
* No additional configurations needed |
||||
|
|
||||
|
License |
||||
|
------- |
||||
|
General Public License, Version 3 (LGPL v3). |
||||
|
(https://www.gnu.org/licenses/lgpl-3.0-standalone.html) |
||||
|
|
||||
|
Company |
||||
|
------- |
||||
|
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__ |
||||
|
|
||||
|
Credits |
||||
|
------- |
||||
|
* Developers: (V17) Dhanya B ,Contacts: 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,26 @@ |
|||||
|
"""base_machine_repair_management""" |
||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Dhanya B (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from . import controllers |
||||
|
from . import models |
||||
|
from . import report |
||||
|
from . import wizard |
@ -0,0 +1,66 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Dhanya B (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
{ |
||||
|
'name': 'Machine Repair Management', |
||||
|
'version': '17.0.1.0.0', |
||||
|
'category': 'Sales,Website ,Human Resources ,Project', |
||||
|
'summary': """Machine repair management is used manage the repair |
||||
|
requests ,machine diagnosis work orders and reports for repairing etc""", |
||||
|
'description': """Machine Repair Management system is an application which is |
||||
|
used to maintain the repairs of machine. It is also allow users to take |
||||
|
machine requests through website and these requests are created in the |
||||
|
backend .Also we can manage the job order,machine diagnosis and maintained |
||||
|
the team.""", |
||||
|
'author': 'Cybrosys Techno Solutions', |
||||
|
'company': 'Cybrosys Techno Solutions', |
||||
|
'maintainer': 'Cybrosys Techno Solutions', |
||||
|
'website': 'https://www.cybrosys.com', |
||||
|
'depends': ['website', 'hr', 'project', 'sale', 'contacts'], |
||||
|
'data': [ |
||||
|
'security/base_machine_repair_management_groups.xml', |
||||
|
'security/ir.model.access.csv', |
||||
|
'data/ir_sequence_data.xml', |
||||
|
'data/ir_actions_server.xml', |
||||
|
'data/mail_data.xml', |
||||
|
'report/repair_report_templates.xml', |
||||
|
'report/machine_repair_report.xml', |
||||
|
'views/customer_portal_templates.xml', |
||||
|
'views/customer_review_templates.xml', |
||||
|
'views/machine_diagnosis_views.xml', |
||||
|
'views/machine_repair_views.xml', |
||||
|
'views/machine_service_type_views.xml', |
||||
|
'views/machine_service_views.xml', |
||||
|
'views/machine_workorder_views.xml', |
||||
|
'views/product_views.xml', |
||||
|
'views/repair_team_views.xml', |
||||
|
'views/res_partner_views.xml', |
||||
|
'views/sale_order_views.xml', |
||||
|
'views/website_repair_templates.xml', |
||||
|
'wizard/repair_report_views.xml', |
||||
|
'views/base_machine_repair_management_menus.xml', |
||||
|
], |
||||
|
'images': ['static/description/banner.jpg'], |
||||
|
'license': 'LGPL-3', |
||||
|
'installable': True, |
||||
|
'auto_install': False, |
||||
|
'application': False, |
||||
|
} |
@ -0,0 +1,24 @@ |
|||||
|
"""Base machine repair management""" |
||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Dhanya B (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from . import base_machine_repair_management |
||||
|
from . import portal |
@ -0,0 +1,95 @@ |
|||||
|
"""Machine Repair management""" |
||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Dhanya B (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from odoo import http |
||||
|
from odoo.http import request |
||||
|
|
||||
|
|
||||
|
class RepairRequest(http.Controller): |
||||
|
"""This is used for manage the repair requests""" |
||||
|
|
||||
|
@http.route(['/repair'], type='http', auth="public", website=True) |
||||
|
def get_request(self): |
||||
|
"""function to get the repair request form""" |
||||
|
vals = ({ |
||||
|
'machine': request.env['product.product'].sudo().search( |
||||
|
[('is_machine', '=', True)]), |
||||
|
'service_id': request.env['machine.service'].sudo().search([]), |
||||
|
'customer_id': request.env['res.partner'].search( |
||||
|
[]), |
||||
|
}) |
||||
|
return request.render( |
||||
|
"base_machine_repair_management.repair_request_form", vals) |
||||
|
|
||||
|
@http.route('/create/repair_request', type='http', methods=['POST'], auth="public", website=True, csrf=False) |
||||
|
def submit_form_request(self, **POST): |
||||
|
"""function to redirect the submitted response page""" |
||||
|
if POST.get('customer_id') not in request.env['res.partner'].sudo().search([]).ids: |
||||
|
customer = request.env['res.partner'].sudo().create({ |
||||
|
'name': POST.get('customer_id'), |
||||
|
'email': POST.get('email'), |
||||
|
'phone': POST.get('phone') |
||||
|
}) |
||||
|
POST.update({'customer_id': customer.id, 'name': 'Repair from Website'}) |
||||
|
if POST: |
||||
|
request.env['machine.repair'].sudo().create(POST) |
||||
|
return request.redirect('/contactus-thank-you') |
||||
|
|
||||
|
@http.route(['/review'], type='http', auth="public", website=True) |
||||
|
def get_customer_review(self): |
||||
|
"""function to redirect the review form""" |
||||
|
comments = ({ |
||||
|
'customer_rating': request.env['machine.repair'].sudo().search( |
||||
|
[('customer_id', '!=', False), ('customer_rating', '!=', False), |
||||
|
('customer_comments', '!=', False)]) |
||||
|
}) |
||||
|
return request.render( |
||||
|
"base_machine_repair_management.repair_review_form", comments) |
||||
|
|
||||
|
@http.route('/create/repair_reviews', methods=['POST'], type='http', |
||||
|
auth="public", website=True, csrf=False) |
||||
|
def submit_form(self, **POST): |
||||
|
"""This is used to submit the user reviews""" |
||||
|
if POST: |
||||
|
vals = request.env['machine.repair'].sudo().search( |
||||
|
[('customer_id', '=', request.env.user.name)]) |
||||
|
if POST.get('good') == 'on': |
||||
|
vals.write({ |
||||
|
'customer_rating': 'Good', |
||||
|
'customer_comments': POST['repair_review_comment'] |
||||
|
}) |
||||
|
elif POST.get('poor') == 'on': |
||||
|
vals.write({ |
||||
|
'customer_rating': 'Poor', |
||||
|
'customer_comments': POST['repair_review_comment'] |
||||
|
}) |
||||
|
elif POST.get('average') == 'on': |
||||
|
vals.write({ |
||||
|
'customer_rating': 'Average', |
||||
|
'customer_comments': POST['repair_review_comment'] |
||||
|
}) |
||||
|
elif POST.get('excellent') == 'on': |
||||
|
vals.sudo().write({ |
||||
|
'customer_rating': 'Excellent', |
||||
|
'customer_comments': POST['repair_review_comment'] |
||||
|
}) |
||||
|
return request.redirect('/contactus-thank-you') |
@ -0,0 +1,110 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Dhanya B (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from odoo import http, _ |
||||
|
from odoo.exceptions import AccessError, MissingError |
||||
|
from odoo.http import request |
||||
|
from odoo.addons.portal.controllers.portal import CustomerPortal |
||||
|
from odoo.addons.portal.controllers.portal import pager as portal_pager |
||||
|
|
||||
|
|
||||
|
class PortalRepair(CustomerPortal): |
||||
|
"""Portal for customers""" |
||||
|
|
||||
|
def _prepare_home_portal_values(self, counters): |
||||
|
"""This is used to prepare the portal values""" |
||||
|
values = super()._prepare_home_portal_values(counters) |
||||
|
if 'repair_count' in counters: |
||||
|
repair_count = request.env['machine.repair'].search_count( |
||||
|
self._get_repair_domain()) \ |
||||
|
if request.env['machine.repair'].check_access_rights('read', |
||||
|
raise_exception=False) else 0 |
||||
|
values['repair_count'] = repair_count |
||||
|
return values |
||||
|
|
||||
|
def _repair_get_page_view_values(self, repair, access_token, **kwargs): |
||||
|
"""This is used to view the repair page""" |
||||
|
values = { |
||||
|
'page_name': 'repair', |
||||
|
'repair': repair, |
||||
|
} |
||||
|
return self._get_page_view_values(repair, access_token, values, |
||||
|
'my_repair_history', False, **kwargs) |
||||
|
|
||||
|
def _get_repair_domain(self): |
||||
|
"""This used add the domain for the page view""" |
||||
|
return [('state', 'in', ['new', 'closed']), |
||||
|
('customer_id', '=', request.env.user.name)] |
||||
|
|
||||
|
@http.route(['/my/repair', '/my/repair/page/<int:page>'], type='http', |
||||
|
auth="user", website=True) |
||||
|
def portal_my_repair(self, page=1, date_begin=None, date_end=None, |
||||
|
sort=None): |
||||
|
"""This is used to view the all repairs""" |
||||
|
values = self._prepare_portal_layout_values() |
||||
|
machine_repair = request.env['machine.repair'].search([]) |
||||
|
domain = self._get_repair_domain() |
||||
|
searchbar_sorting = { |
||||
|
'state': {'label': _('Status'), 'repair': 'state'}, |
||||
|
} |
||||
|
if not sort: |
||||
|
sort = 'state' |
||||
|
repair_count = machine_repair.search_count(domain) |
||||
|
pager = portal_pager( |
||||
|
url="/my/repair", |
||||
|
url_args={'date_begin': date_begin, 'date_end': date_end, |
||||
|
'sort': sort}, |
||||
|
total=repair_count, |
||||
|
page=page, |
||||
|
step=self._items_per_page |
||||
|
) |
||||
|
repair = machine_repair.search(domain, |
||||
|
limit=self._items_per_page, |
||||
|
offset=pager['offset']) |
||||
|
request.session['my_repair_history'] = repair.ids[:100] |
||||
|
values.update({ |
||||
|
'date': date_begin, |
||||
|
'machine_repair': repair_count, |
||||
|
'repair': machine_repair, |
||||
|
'page_name': 'repair', |
||||
|
'pager': pager, |
||||
|
'default_url': '/my/repair', |
||||
|
'searchbar_sorting': searchbar_sorting, |
||||
|
'sort': sort, |
||||
|
|
||||
|
}) |
||||
|
return request.render( |
||||
|
"base_machine_repair_management.portal_my_repair_request", values) |
||||
|
|
||||
|
@http.route(['/my/repair/<int:repair_id>'], type='http', auth="public", |
||||
|
website=True) |
||||
|
def portal_my_repair_detail(self, repair_id, access_token=None, |
||||
|
**kw): |
||||
|
"""This is used to view a specified view of a repair""" |
||||
|
try: |
||||
|
repair_sudo = self._document_check_access('machine.repair', |
||||
|
repair_id, access_token) |
||||
|
except (AccessError, MissingError): |
||||
|
return request.redirect('/my') |
||||
|
values = self._repair_get_page_view_values(repair_sudo, access_token, |
||||
|
**kw) |
||||
|
return request.render( |
||||
|
"base_machine_repair_management.portal_repair_page", values) |
@ -0,0 +1,16 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<!-- Scheduled action for repair request report--> |
||||
|
<record id="action_machine_repair_report" model="ir.actions.server"> |
||||
|
<field name="name">Repair Request Report</field> |
||||
|
<field name="model_id" |
||||
|
ref="base_machine_repair_management.model_machine_repair"/> |
||||
|
<field name="binding_model_id" |
||||
|
ref="base_machine_repair_management.model_machine_repair"/> |
||||
|
<field name="binding_view_types">form</field> |
||||
|
<field name="state">code</field> |
||||
|
<field name="code"> |
||||
|
action = records.action_print_repair_request_report() |
||||
|
</field> |
||||
|
</record> |
||||
|
</odoo> |
@ -0,0 +1,23 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<data noupdate="1"> |
||||
|
<!-- This is for the sequence of machine diagnosis records--> |
||||
|
<record id="diagnosis_seq" model="ir.sequence"> |
||||
|
<field name="name">Repair Sequence</field> |
||||
|
<field name="code">machine.diagnosis</field> |
||||
|
<field name="prefix">DGS/</field> |
||||
|
<field name="padding">3</field> |
||||
|
<field name="number_next">1</field> |
||||
|
<field name="number_increment">1</field> |
||||
|
</record> |
||||
|
<!-- This is used for the sequence for machine repair--> |
||||
|
<record id="repair_seq" model="ir.sequence"> |
||||
|
<field name="name">Repair Sequence</field> |
||||
|
<field name="code">machine.repair</field> |
||||
|
<field name="prefix">MRP/</field> |
||||
|
<field name="padding">3</field> |
||||
|
<field name="number_next">1</field> |
||||
|
<field name="number_increment">1</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,31 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<data noupdate="1"> |
||||
|
<!--Email template --> |
||||
|
<record id="repair_request_close_email_template" model="mail.template"> |
||||
|
<field name="name">Repair Request Closed: Send by email</field> |
||||
|
<field name="model_id" ref="base_machine_repair_management.model_machine_repair"/> |
||||
|
<field name="email_from">{{object.customer_id.email}}</field> |
||||
|
<field name="email_to">{{ object.email}}</field> |
||||
|
<field name="subject">Machine Repair Request Closing (Ref{{object.repair_seq}})</field> |
||||
|
<field name="body_html" type="html"> |
||||
|
<div style="margin: 0px; padding: 0px;"> |
||||
|
<p style="margin: 0px; padding: 0px; font-size: 13px;"> |
||||
|
<t t-out="object.customer_id.name"/> |
||||
|
<br/> |
||||
|
<br/> |
||||
|
Here is your repair request with reference |
||||
|
<t t-out="object.repair_seq"/> |
||||
|
is closed on |
||||
|
<t t-out="object.closing_date"/> |
||||
|
<br/> |
||||
|
<br/> |
||||
|
<br/> |
||||
|
<br/> |
||||
|
Do not hesitate to contact us if you have any questions. |
||||
|
</p> |
||||
|
</div> |
||||
|
</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,6 @@ |
|||||
|
## Module <base_machine_repair_management> |
||||
|
|
||||
|
#### 24.04.2024 |
||||
|
#### Version 17.0.1.0.0 |
||||
|
#### ADD |
||||
|
- Initial commit for Base Machine Repair Management |
@ -0,0 +1,34 @@ |
|||||
|
"""Machine Repair management""" |
||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Dhanya B (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from . import machine_consume |
||||
|
from . import machine_diagnosis |
||||
|
from . import machine_repair |
||||
|
from . import machine_service_type |
||||
|
from . import machine_services |
||||
|
from . import machine_workorder |
||||
|
from . import product_product |
||||
|
from . import repair_team |
||||
|
from . import repair_timesheet |
||||
|
from . import res_partner |
||||
|
from . import sale_order |
||||
|
from . import team_member |
@ -0,0 +1,41 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Dhanya B (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from odoo import fields, models |
||||
|
|
||||
|
|
||||
|
class MachineConsume(models.Model): |
||||
|
"""This is the class for machine consume""" |
||||
|
_name = 'machine.consume' |
||||
|
_description = "Machine Consume" |
||||
|
_rec_name = "consume_id" |
||||
|
|
||||
|
consume_id = fields.Many2one('machine.repair', string="Consumer", |
||||
|
help="Consumer of the repair") |
||||
|
machine_id = fields.Many2one('product.product', string='Machine', |
||||
|
help="Machine for consume", |
||||
|
domain=[('is_machine', '=', True)]) |
||||
|
qty = fields.Float(string='Quantity', help="Quantity of the machine") |
||||
|
uom = fields.Many2one('uom.uom', string="Uom", help="Machine uom") |
||||
|
dia_estimate_id = fields.Many2one('machine.diagnosis', |
||||
|
string="Machine Diagnosis", |
||||
|
help="Diagnosis of machine") |
||||
|
hour = fields.Float(string='Duration', help="Duration for the machine") |
@ -0,0 +1,92 @@ |
|||||
|
"""Machine Diagnosis""" |
||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Dhanya B (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from odoo import api, fields, models |
||||
|
|
||||
|
|
||||
|
class MachineDiagnosis(models.Model): |
||||
|
"""The class is used for the machine diagnosis""" |
||||
|
|
||||
|
_name = 'machine.diagnosis' |
||||
|
_description = "Machine Diagnosis" |
||||
|
_rec_name = 'diagnosis_seq' |
||||
|
|
||||
|
project_id = fields.Many2one('project.project', string='Project', |
||||
|
help="The project name") |
||||
|
customer_id = fields.Many2one('res.partner', string="Customer", |
||||
|
help="the customer for the project", |
||||
|
required=True) |
||||
|
deadline = fields.Date(string='DeadLine', help="Deadline for the project", |
||||
|
required=True ) |
||||
|
diagnosis_seq = fields.Char(string='Diagnosis Sequence', required=True, |
||||
|
copy=False, |
||||
|
help="Sequence number for diagnosis", |
||||
|
readonly=True, index=True, |
||||
|
default=lambda self: 'New') |
||||
|
note = fields.Html(string="Note", help="Extra note for the project") |
||||
|
notes = fields.Html(string="Notes", help="Notes for thr project") |
||||
|
part_ids = fields.One2many('machine.consume', |
||||
|
'dia_estimate_id', |
||||
|
help="machine consumption", string="Parts") |
||||
|
timesheet_ids = fields.One2many('repair.timesheet', |
||||
|
'diagnosis_id', |
||||
|
string="TimeSheet", |
||||
|
help='Timesheet for the machine repair') |
||||
|
seq = fields.Char(string='Sequence', help="Sequence") |
||||
|
assigning_date = fields.Date(string="Date", help="Assigning Date") |
||||
|
machine_repair_ref_id = fields.Many2one('machine.repair', |
||||
|
string="Reference", |
||||
|
help="Machine repair reference") |
||||
|
|
||||
|
@api.model |
||||
|
def create(self, vals): |
||||
|
"""Sequence generator""" |
||||
|
if vals.get('diagnosis_seq', 'New') == 'New': |
||||
|
vals['diagnosis_seq'] = self.env['ir.sequence'].next_by_code( |
||||
|
'machine.diagnosis') or 'New' |
||||
|
result = super().create(vals) |
||||
|
return result |
||||
|
|
||||
|
def action_create_quotation(self): |
||||
|
"""Function to create quotation from machine diagnosis""" |
||||
|
quotation = self.env['sale.order'].create({ |
||||
|
'partner_id': self.customer_id.id, |
||||
|
'date_order': self.deadline, |
||||
|
'machine_diag_ref': self.diagnosis_seq, |
||||
|
}) |
||||
|
quotation.order_line = [(5, 0, 0)] |
||||
|
val = self.part_ids.mapped('machine_id') |
||||
|
for rec in val: |
||||
|
vals = { |
||||
|
'product_id': rec.id, |
||||
|
'name': rec.default_code, |
||||
|
'price_unit': rec.list_price, |
||||
|
} |
||||
|
quotation.order_line = [(0, 0, vals)] |
||||
|
return { |
||||
|
'res_model': 'sale.order', |
||||
|
'type': 'ir.actions.act_window', |
||||
|
'res_id': quotation.id, |
||||
|
'view_mode': 'form', |
||||
|
'target': 'current', |
||||
|
'context': "{'create': False ,}" |
||||
|
} |
@ -0,0 +1,235 @@ |
|||||
|
"""Machine Repair""" |
||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Dhanya B (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from odoo import api, fields, models |
||||
|
from odoo.exceptions import ValidationError |
||||
|
|
||||
|
|
||||
|
class MachineRepair(models.Model): |
||||
|
"""This is used for the machine repair management""" |
||||
|
_name = 'machine.repair' |
||||
|
_description = "Machine Repair" |
||||
|
_rec_name = "repair_seq" |
||||
|
|
||||
|
name = fields.Char(string='Name', help="Name of the repair") |
||||
|
repair_seq = fields.Char(string='Repair Sequence', required=True, |
||||
|
copy=False, help="Repair sequence", |
||||
|
readonly=True, index=True, |
||||
|
default=lambda self: 'New') |
||||
|
customer_id = fields.Many2one('res.partner', string="Customer", |
||||
|
help="Name of the customer", required=True) |
||||
|
customer_email = fields.Char(string='Customer E-mail', |
||||
|
related="customer_id.email", |
||||
|
help="Email of the customer") |
||||
|
phone = fields.Char(string='Phone', help="Customer phone number", |
||||
|
related="customer_id.phone") |
||||
|
repairing_reason = fields.Char(string='Repairing Reason', |
||||
|
help="Reason for the repairing") |
||||
|
machine_brand = fields.Char(string='Machine brand', |
||||
|
help="Brand of the machine") |
||||
|
machine_model = fields.Char(string="Model", help="Model of the Machine") |
||||
|
manufacturing_year = fields.Date(string='Manufacturing Year', |
||||
|
help="Manufacturing date of the machine") |
||||
|
priority = fields.Selection( |
||||
|
[('low', 'Low'), ('high', 'High'), ('middle', 'Middle')], |
||||
|
string="Priority", help="Priority for repairing", required=True) |
||||
|
repair_detail = fields.Text(string='Repair Reason In Detail', |
||||
|
help="Repairing Details", required=True) |
||||
|
technician_id = fields.Many2one('hr.employee', string="Technician", |
||||
|
help="The technician for the repair") |
||||
|
technician_member_ids = fields.Many2many('hr.employee', |
||||
|
string="Technical member") |
||||
|
email = fields.Char('Email', related='technician_id.work_email', |
||||
|
help="Technician Email") |
||||
|
company_id = fields.Many2one('res.company', string="Company", |
||||
|
help="Company Of technician") |
||||
|
project_id = fields.Many2one('project.project', string="Project", |
||||
|
help="Project of that repairing") |
||||
|
department_id = fields.Many2one('hr.department', string="Department", |
||||
|
help="Department of the technician") |
||||
|
repir_req_date = fields.Date(string='Repair Date', |
||||
|
help="Repair requesting date") |
||||
|
closing_date = fields.Date(string='Closing Date', |
||||
|
help="The repair closing date") |
||||
|
repairing_duration = fields.Float(string="Repairing Duration", |
||||
|
help="The duration of the repairing") |
||||
|
is_repaired = fields.Boolean(string='Is Repaired', |
||||
|
help="Which is used to identify the order is " |
||||
|
"repaired or not") |
||||
|
machine_id = fields.Many2one('product.product', string="Machine", |
||||
|
help="Machine name", |
||||
|
domain=[('is_machine', '=', True)]) |
||||
|
machine_categ_id = fields.Many2one('product.category', |
||||
|
string='Machine Category', |
||||
|
help="the category of the machine") |
||||
|
color = fields.Char(string='Color', help="Color of the machine") |
||||
|
damage = fields.Char(string='Damage', help="Damage of machine") |
||||
|
warranty = fields.Boolean(string='Warranty', help="Warranty of the machine") |
||||
|
Warranty_exp_date = fields.Date(string="Warranty Expiration Date", |
||||
|
help="The Machine Warranty Expiration date") |
||||
|
authority_name = fields.Char(string='Authority Name', |
||||
|
help="The Authority of the technician") |
||||
|
service_id = fields.Many2one('machine.service', string="Service", |
||||
|
help="The service for the machine") |
||||
|
customer_rating = fields.Char(string='Customer Rating', |
||||
|
help="Customer Review") |
||||
|
customer_comments = fields.Char(string='Customer Comments', |
||||
|
help="Comments of the customer") |
||||
|
extra_info = fields.Html(string="Information", help="Extra Information") |
||||
|
repair_team_id = fields.Many2one('repair.team', string="Repair team", |
||||
|
help="The team of repairing") |
||||
|
nature_of_service_id = fields.Many2one('machine.service', |
||||
|
string="Nature of Service", |
||||
|
help="The nature of the machine service") |
||||
|
repair_type_id = fields.Many2many('machine.service.type', |
||||
|
string="Repair Types", |
||||
|
help="The type of the repairs") |
||||
|
problem = fields.Char(string='Problem', help="Problem of the machine") |
||||
|
note = fields.Html(string='Note', help="Note for the repairing") |
||||
|
state = fields.Selection(string='Status', required=True, readonly=True, |
||||
|
copy=False, selection=[('new', 'New'), |
||||
|
('assigned', 'Assigned'), |
||||
|
('closed', 'Closed'), |
||||
|
('send', 'Mail Send'), |
||||
|
('reopen', 'Re Opened'), |
||||
|
], default='new', |
||||
|
help="stages of machine repair request") |
||||
|
image1 = fields.Binary(string='Image 1', help="Machine images") |
||||
|
image2 = fields.Binary(string='Image 2', help="Machine images") |
||||
|
image3 = fields.Binary(string='Image 3', help="Machine images") |
||||
|
image4 = fields.Binary(string='Image 4', help="Machine images") |
||||
|
image5 = fields.Binary(string='Image 5', help="Machine images") |
||||
|
timesheet_ids = fields.One2many('repair.timesheet', 'inverse_id', |
||||
|
string="Timesheet", |
||||
|
help="Timesheet for the machine repairing") |
||||
|
consume_part_ids = fields.One2many('machine.consume', 'consume_id', |
||||
|
string="Consumer Parts", |
||||
|
help="Machine consumption") |
||||
|
is_team_assigned = fields.Boolean(string='Is team assigned', |
||||
|
help='To check whether the repair team is assigned or not') |
||||
|
|
||||
|
@api.model |
||||
|
def create(self, vals): |
||||
|
"""Sequence generator""" |
||||
|
if vals.get('repair_seq', 'New') == 'New' or vals.get('repair_seq', |
||||
|
'') == '': |
||||
|
vals['repair_seq'] = self.env['ir.sequence'].next_by_code( |
||||
|
'machine.repair') or 'New' |
||||
|
result = super().create(vals) |
||||
|
return result |
||||
|
|
||||
|
@api.onchange('repair_team_id') |
||||
|
def onchange_repair_team(self): |
||||
|
val = self.env['repair.team'].search( |
||||
|
[('id', '=', self.repair_team_id.id)]).mapped('member_ids').mapped( |
||||
|
'member_id').ids |
||||
|
self.technician_member_ids = val |
||||
|
|
||||
|
def action_create_diagnosis(self): |
||||
|
"""This is used to create the diagnosis""" |
||||
|
self.env['machine.diagnosis'].create({ |
||||
|
'project_id': self.project_id.id, |
||||
|
'customer_id': self.customer_id.id, |
||||
|
'deadline': self.closing_date, |
||||
|
}) |
||||
|
return { |
||||
|
'res_model': 'machine.diagnosis', |
||||
|
'type': 'ir.actions.act_window', |
||||
|
'res_id': self.id, |
||||
|
'view_mode': 'form', |
||||
|
'target': 'current', |
||||
|
'context': "{'create': False}" |
||||
|
} |
||||
|
|
||||
|
def action_create_work_order(self): |
||||
|
"""Creating job order from repair request""" |
||||
|
self.env['machine.workorder'].create({ |
||||
|
'customer_id': self.customer_id.id, |
||||
|
'date': self.repir_req_date, |
||||
|
'priority': self.priority, |
||||
|
}) |
||||
|
return { |
||||
|
'res_model': 'machine.workorder', |
||||
|
'type': 'ir.actions.act_window', |
||||
|
'res_id': self.id, |
||||
|
'view_mode': 'form', |
||||
|
'target': 'current', |
||||
|
'context': "{'create': False ,}" |
||||
|
} |
||||
|
|
||||
|
def action_reopen(self): |
||||
|
"""Reopen the repair""" |
||||
|
self.state = 'reopen' |
||||
|
|
||||
|
def action_close_repairing(self): |
||||
|
"""Repair closed""" |
||||
|
self.state = 'closed' |
||||
|
|
||||
|
def action_assign_teams(self): |
||||
|
"""Assigning repair to teams""" |
||||
|
if self.repair_team_id: |
||||
|
val = self.env['repair.team'].search( |
||||
|
[('id', '=', self.repair_team_id.id)]) |
||||
|
val.write({ |
||||
|
'repair_work_ids': [(4, self.id)], |
||||
|
}) |
||||
|
self.is_team_assigned = True |
||||
|
self.state = 'assigned' |
||||
|
else: |
||||
|
self.state = 'new' |
||||
|
raise ValidationError("There Is No Repair Team Is Specified") |
||||
|
|
||||
|
def action_send_email(self): |
||||
|
"""Sending mails to customers by informing closing the repair request""" |
||||
|
template_id = self.env.ref( |
||||
|
'base_machine_repair_management.repair_request_close_email_template').id |
||||
|
self.env['mail.template'].browse(template_id).send_mail(self.id, |
||||
|
force_send=True) |
||||
|
self.state = "send" |
||||
|
|
||||
|
def action_print_repair_request_report(self): |
||||
|
"""Which returns the report action""" |
||||
|
return self.env.ref( |
||||
|
"base_machine_repair_management.action_repair_report").report_action( |
||||
|
self) |
||||
|
|
||||
|
|
||||
|
class RepairTimesheet(models.Model): |
||||
|
"""This is used for thr timesheet of repair management""" |
||||
|
_name = 'repair.timesheet' |
||||
|
_description = "Timesheet Of The Repair" |
||||
|
_rec_name = 'user_id' |
||||
|
|
||||
|
inverse_id = fields.Many2one('machine.repair', string="Machine Repair", |
||||
|
help="Inverse field of the models " |
||||
|
"'machine.repair'") |
||||
|
date = fields.Date(string='Date', help="Time sheet creation date") |
||||
|
user_id = fields.Many2one('res.users', string="User", |
||||
|
help="Time sheet for the user") |
||||
|
project_id = fields.Many2one('project.project', string="Project", |
||||
|
help="Project for the user") |
||||
|
description = fields.Char(string='Description', |
||||
|
help="Description for the user's timesheet") |
||||
|
hours = fields.Float(string='Duration', help="Duration of the Work") |
||||
|
diagnosis_id = fields.Many2one('machine.diagnosis', |
||||
|
string="Diagnosis", |
||||
|
help="Machine diagnosis") |
@ -0,0 +1,34 @@ |
|||||
|
"""Machine Service Type""" |
||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Dhanya B (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from odoo import fields, models |
||||
|
|
||||
|
|
||||
|
class MachineServiceType(models.Model): |
||||
|
"""This class is used for the service type for the machine""" |
||||
|
_name = 'machine.service.type' |
||||
|
_description = "Machine Service Type" |
||||
|
_rec_name = "service_type_name" |
||||
|
|
||||
|
service_type_name = fields.Char(string='Name', |
||||
|
help="Name of the service type") |
||||
|
code = fields.Char(string='Code', help="Code for the service type") |
@ -0,0 +1,33 @@ |
|||||
|
"""Machine service""" |
||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Dhanya B (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from odoo import fields, models |
||||
|
|
||||
|
|
||||
|
class MachineService(models.Model): |
||||
|
"""This is used to add the machine service""" |
||||
|
_name = 'machine.service' |
||||
|
_description = 'Machine Service' |
||||
|
|
||||
|
name = fields.Char(string='Name', help="Machine Service") |
||||
|
service_type = fields.Many2one('machine.service.type', |
||||
|
string="Machine Service Type") |
@ -0,0 +1,49 @@ |
|||||
|
"""Machine Work order""" |
||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Dhanya B (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
################################################################################ |
||||
|
from odoo import fields, models |
||||
|
|
||||
|
|
||||
|
class MachineWorkOrder(models.Model): |
||||
|
"""This is used for the machine work order""" |
||||
|
_name = 'machine.workorder' |
||||
|
_description = "Machine Work Order" |
||||
|
_rec_name = "work_order_id" |
||||
|
|
||||
|
work_order_id = fields.Many2one('machine.service', string="Work Order", |
||||
|
help="Work order name for machine") |
||||
|
customer_id = fields.Many2one('res.partner', string="Customer", |
||||
|
help="Customer for the work order") |
||||
|
date = fields.Date(string="Date", help="Work order date") |
||||
|
priority = fields.Selection( |
||||
|
[('low', 'Low'), ('high', 'High'), ('middle', 'Middle')], |
||||
|
string="Priority", help="Work Order Priority") |
||||
|
scheduled_date = fields.Date(string='Scheduled Date', |
||||
|
help="scheduled date of work order") |
||||
|
planned_end_date = fields.Date(string='Planned End date', |
||||
|
help="Work order end date") |
||||
|
duration = fields.Float(string='Duration', help="Wok order duration") |
||||
|
start_date = fields.Date(string='Start Date', |
||||
|
help="Start date of work order") |
||||
|
end_date = fields.Date(string='End Date', help="End date of the work order") |
||||
|
hours_worked = fields.Float(string="Hours Spent", |
||||
|
help="Total hours spent for work order") |
@ -0,0 +1,33 @@ |
|||||
|
"""Products as machines and machine parts""" |
||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Dhanya B (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from odoo import fields, models |
||||
|
|
||||
|
|
||||
|
class Product(models.Model): |
||||
|
_inherit = 'product.product' |
||||
|
|
||||
|
is_machine = fields.Boolean(string="Is Machine", default=False, |
||||
|
help="which is used to identify the machines.") |
||||
|
is_machine_parts = fields.Boolean(string="Is Machine Part", default=False, |
||||
|
help="which is used to identify the " |
||||
|
"machine parts.") |
@ -0,0 +1,42 @@ |
|||||
|
"""Repair Team""" |
||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Dhanya B (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from odoo import fields, models |
||||
|
|
||||
|
|
||||
|
class RepairTeam(models.Model): |
||||
|
"""This is used to set the repair team""" |
||||
|
_name = 'repair.team' |
||||
|
_description = 'Repair Team' |
||||
|
_rec_name = "team_name" |
||||
|
|
||||
|
team_name = fields.Char(string='Name', help="Name of the Team", required=True) |
||||
|
team_lead_id = fields.Many2one('hr.employee', |
||||
|
string="Team Lead", |
||||
|
help="Team lead of the team", required=True) |
||||
|
|
||||
|
repair_work_ids = fields.Many2many('machine.repair', |
||||
|
string='Repair Reference', readonly=True, |
||||
|
help='Reference of the machine repair') |
||||
|
member_ids = fields.One2many('team.member', |
||||
|
'inverse_id', string="Members", |
||||
|
help="Team members pof the repair team") |
@ -0,0 +1,44 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Dhanya B (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from odoo import fields, models |
||||
|
|
||||
|
|
||||
|
class RepairTimesheet(models.Model): |
||||
|
"""This is used for thr timesheet of repair management""" |
||||
|
_name = 'repair.timesheet' |
||||
|
_description = "Timesheet Of The Repair" |
||||
|
_rec_name = 'user_id' |
||||
|
|
||||
|
inverse_id = fields.Many2one('machine.repair', string="Machine Repair", |
||||
|
help="Inverse field of the models " |
||||
|
"'machine.repair'") |
||||
|
date = fields.Date(string='Date', help="Time sheet creation date") |
||||
|
user_id = fields.Many2one('res.users', string="User", |
||||
|
help="Time sheet for the user") |
||||
|
project_id = fields.Many2one('project.project', string="Project", |
||||
|
help="Project for the user") |
||||
|
description = fields.Char(string='Description', |
||||
|
help="Description for the user's timesheet") |
||||
|
hours = fields.Float(string='Duration', help="Duration of the Work") |
||||
|
diagnosis_id = fields.Many2one('machine.diagnosis', |
||||
|
string="Diagnosis", |
||||
|
help="Machine diagnosis") |
@ -0,0 +1,39 @@ |
|||||
|
"""Partners""" |
||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Dhanya B (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from odoo import models |
||||
|
|
||||
|
|
||||
|
class ResPartner(models.Model): |
||||
|
"""This is used to return the partner's repair requests""" |
||||
|
_inherit = 'res.partner' |
||||
|
|
||||
|
def action_repair_requests(self): |
||||
|
"""It returns the repair requests for the customers""" |
||||
|
return { |
||||
|
'type': 'ir.actions.act_window', |
||||
|
'name': 'Machine Repair Requests', |
||||
|
'view_mode': 'tree', |
||||
|
'res_model': 'machine.repair', |
||||
|
'domain': [('customer_id', '=', self.id)], |
||||
|
'context': "{'create': False}" |
||||
|
} |
@ -0,0 +1,31 @@ |
|||||
|
"""Sale Order""" |
||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Dhanya B (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from odoo import fields, models |
||||
|
|
||||
|
|
||||
|
class SaleOrder(models.Model): |
||||
|
"""Inheriting Sale order to add a new field""" |
||||
|
_inherit = 'sale.order' |
||||
|
|
||||
|
machine_diag_ref = fields.Char(string='Diagnosis Reference', |
||||
|
help="Reference for diagnosis") |
@ -0,0 +1,37 @@ |
|||||
|
"""Repair Team""" |
||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Dhanya B (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from odoo import fields, models |
||||
|
|
||||
|
|
||||
|
class TeamMember(models.Model): |
||||
|
"""This is used for the team members of repair team""" |
||||
|
_name = 'team.member' |
||||
|
_description = 'Team Member' |
||||
|
_rec_name = 'member_id' |
||||
|
|
||||
|
inverse_id = fields.Many2one('repair.team', string="Repair Team", |
||||
|
help="Repair team for machine") |
||||
|
member_id = fields.Many2one('hr.employee', string="Member", |
||||
|
help="member of the repair team") |
||||
|
login = fields.Char(related='member_id.work_email', string="Login", |
||||
|
help="Login details for member") |
@ -0,0 +1,23 @@ |
|||||
|
"""Machine repair management""" |
||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Dhanya B (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from . import machine_repair_report |
@ -0,0 +1,46 @@ |
|||||
|
"""Machine repair management""" |
||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Dhanya B (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from odoo import fields, models |
||||
|
|
||||
|
|
||||
|
class MachineRepairReport(models.AbstractModel): |
||||
|
"""This is used to return the report data""" |
||||
|
_name = 'report.base_machine_repair_management.machine_repair_report' |
||||
|
_description = 'Report for machine repair management' |
||||
|
|
||||
|
def _get_report_values(self, docids, data=None): |
||||
|
"""This function is used to get the report data""" |
||||
|
if data['from_date'] and data['to_date']: |
||||
|
vals = self.env['machine.repair'].search( |
||||
|
[('repir_req_date', '>=', data['from_date']), |
||||
|
('repir_req_date', '<=', data['to_date'])]) |
||||
|
else: |
||||
|
vals = self.env['machine.repair'].search([]) |
||||
|
return { |
||||
|
'date': fields.Date.today(), |
||||
|
'doc_ids': docids, |
||||
|
'doc_model': 'machine.repair', |
||||
|
'repair_requests': vals, |
||||
|
'company': self.env.company, |
||||
|
'data': data, |
||||
|
} |
@ -0,0 +1,15 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
<odoo> |
||||
|
<!-- Which is used to create the machine repair report action--> |
||||
|
<record id="action_repair_report" model="ir.actions.report"> |
||||
|
<field name="name">Machine Repair Report</field> |
||||
|
<field name="model">machine.repair</field> |
||||
|
<field name="report_type">qweb-pdf</field> |
||||
|
<field name="report_name">base_machine_repair_management.machine_repair_report</field> |
||||
|
<field name="report_file">base_machine_repair_management.machine_repair_report</field> |
||||
|
<field name="print_report_name">'Machine Repair Report - %s' % (object.name) |
||||
|
</field> |
||||
|
<field name="binding_type">report</field> |
||||
|
<field name="attachment_use">True</field> |
||||
|
</record> |
||||
|
</odoo> |
@ -0,0 +1,137 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
<odoo> |
||||
|
<!-- This is the machine report template--> |
||||
|
<template id="machine_repair_report"> |
||||
|
<t t-call="web.external_layout"> |
||||
|
<t t-call="web.html_container"> |
||||
|
<div class="page"> |
||||
|
<div class="oe_structure"/> |
||||
|
<div class="text-center"> |
||||
|
<h2>Machine Repair Report</h2> |
||||
|
</div> |
||||
|
<t t-if="repair_requests"> |
||||
|
<t t-foreach="repair_requests" t-as="repair"> |
||||
|
<div> |
||||
|
<div> |
||||
|
<span>Customer Name:</span> |
||||
|
<t t-esc="repair.customer_id.name"/> |
||||
|
<br/> |
||||
|
<span>Customer Email:</span> |
||||
|
<t t-esc="repair.customer_email"/> |
||||
|
<br/> |
||||
|
<span>Phone:</span> |
||||
|
<t t-esc="repair.phone"/> |
||||
|
<br/> |
||||
|
</div> |
||||
|
<br/> |
||||
|
</div> |
||||
|
<h3> |
||||
|
<u>Machine Details</u> |
||||
|
</h3> |
||||
|
<table class="table table-sm o_main_table mt-4"> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th name="th_description"> |
||||
|
Machine Name |
||||
|
</th> |
||||
|
<t t-if="repair.machine_categ_id"> |
||||
|
<th name="th_quantity" |
||||
|
class="text-end"> |
||||
|
Machine Category |
||||
|
</th> |
||||
|
</t> |
||||
|
<th name="th_description"> |
||||
|
Color |
||||
|
</th> |
||||
|
<th name="th_description"> |
||||
|
Brand |
||||
|
</th> |
||||
|
<th name="th_description"> |
||||
|
Model |
||||
|
</th> |
||||
|
<th name="th_description"> |
||||
|
Manufacturing Year |
||||
|
</th> |
||||
|
<th name="th_description"> |
||||
|
Priority |
||||
|
</th> <th name="th_description"> |
||||
|
Warranty |
||||
|
</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody> |
||||
|
<tr> |
||||
|
<td> |
||||
|
<span t-field="repair.machine_id.name"/> |
||||
|
</td> |
||||
|
<td> |
||||
|
<t t-esc="repair.machine_categ_id.name"/> |
||||
|
</td> |
||||
|
<td> |
||||
|
<t t-esc="repair.color"/> |
||||
|
</td> |
||||
|
<td> |
||||
|
<t t-esc="repair.machine_brand"/> |
||||
|
</td> |
||||
|
<td> |
||||
|
<t t-esc="repair.machine_model"/> |
||||
|
</td> |
||||
|
<td> |
||||
|
<t t-esc="repair.manufacturing_year"/> |
||||
|
</td> |
||||
|
<td> |
||||
|
<t t-esc="repair.priority"/> |
||||
|
</td> |
||||
|
<td> |
||||
|
<t t-esc="repair.warranty"/> |
||||
|
</td> |
||||
|
</tr> |
||||
|
</tbody> |
||||
|
</table> |
||||
|
<h3> |
||||
|
<u>Other Information</u> |
||||
|
</h3> |
||||
|
<div> |
||||
|
<span>Request Date:</span> |
||||
|
<t t-esc="repair.repir_req_date"/> |
||||
|
<br/> |
||||
|
<span>Repair Date:</span> |
||||
|
<t t-esc="repair.closing_date"/> |
||||
|
<br/> |
||||
|
<span>Is Repaired:</span> |
||||
|
<t t-esc="repair.is_repaired"/> |
||||
|
<br/> |
||||
|
<span>Repairing Duration:</span> |
||||
|
<t t-esc="repair.repairing_duration"/> |
||||
|
<br/> |
||||
|
</div> |
||||
|
<br/><br/> |
||||
|
<h3> |
||||
|
<u>Time Sheets</u> |
||||
|
</h3> |
||||
|
<div> |
||||
|
<span>Request Date:</span> |
||||
|
<t t-esc="repair.repir_req_date"/> |
||||
|
<br/> |
||||
|
<span>Repair Date:</span> |
||||
|
<t t-esc="repair.closing_date"/> |
||||
|
<br/> |
||||
|
<span>Is Repaired:</span> |
||||
|
<t t-esc="repair.is_repaired"/> |
||||
|
<br/> |
||||
|
<span>Repairing Duration:</span> |
||||
|
<t t-esc="repair.repairing_duration"/> |
||||
|
<br/> |
||||
|
</div> |
||||
|
</t> |
||||
|
</t> |
||||
|
<t t-else=""> |
||||
|
<h3> |
||||
|
There is no repair request... |
||||
|
</h3> |
||||
|
</t> |
||||
|
</div> |
||||
|
</t> |
||||
|
</t> |
||||
|
</template> |
||||
|
</odoo> |
@ -0,0 +1,21 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<!-- This is used for creating user groups--> |
||||
|
<record model="ir.module.category" id="base_machine_repair_module_management"> |
||||
|
<field name="name">Machine</field> |
||||
|
<field name="description">Machine Repair</field> |
||||
|
<field name="sequence">10</field> |
||||
|
</record> |
||||
|
<record id="repair_user_access" model="res.groups"> |
||||
|
<field name="name">Repair User/Technician</field> |
||||
|
<field name="category_id" ref="base_machine_repair_module_management"/> |
||||
|
</record> |
||||
|
<record id="repair_manager_access" model="res.groups"> |
||||
|
<field name="name">Repair Manager</field> |
||||
|
<field name="category_id" ref="base_machine_repair_module_management"/> |
||||
|
</record> |
||||
|
<record id="repair_sales_users_access" model="res.groups"> |
||||
|
<field name="name">Sales Persons</field> |
||||
|
<field name="category_id" ref="base_machine_repair_module_management"/> |
||||
|
</record> |
||||
|
</odoo> |
|
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: 93 KiB |
After Width: | Height: | Size: 95 KiB |
After Width: | Height: | Size: 90 KiB |
After Width: | Height: | Size: 78 KiB |
After Width: | Height: | Size: 86 KiB |
After Width: | Height: | Size: 90 KiB |
After Width: | Height: | Size: 82 KiB |
After Width: | Height: | Size: 27 KiB |
After Width: | Height: | Size: 46 KiB |
After Width: | Height: | Size: 29 KiB |
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 83 KiB |
After Width: | Height: | Size: 100 KiB |
After Width: | Height: | Size: 98 KiB |
After Width: | Height: | Size: 101 KiB |
After Width: | Height: | Size: 95 KiB |
After Width: | Height: | Size: 31 KiB |
After Width: | Height: | Size: 71 KiB |
After Width: | Height: | Size: 99 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 102 KiB |
After Width: | Height: | Size: 96 KiB |
After Width: | Height: | Size: 82 KiB |
After Width: | Height: | Size: 80 KiB |
After Width: | Height: | Size: 80 KiB |
After Width: | Height: | Size: 467 KiB |
After Width: | Height: | Size: 116 KiB |
After Width: | Height: | Size: 106 KiB |
After Width: | Height: | Size: 61 KiB |
After Width: | Height: | Size: 88 KiB |
After Width: | Height: | Size: 107 KiB |
After Width: | Height: | Size: 217 KiB |
After Width: | Height: | Size: 45 KiB |
After Width: | Height: | Size: 104 KiB |
After Width: | Height: | Size: 125 KiB |
After Width: | Height: | Size: 105 KiB |
After Width: | Height: | Size: 114 KiB |
After Width: | Height: | Size: 49 KiB |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 86 KiB |