| @ -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 | |||
| 
 | |||
| Odoo Vendor Portal | |||
| ================== | |||
| * This module helps to send quotations for a product to multiple vendors and vendors can | |||
| add their price in their portal and choose the best quotation for the product. | |||
| 
 | |||
| Configuration | |||
| ============= | |||
| * No additional configurations needed | |||
| 
 | |||
| License | |||
| ------- | |||
| Affero 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:(V14) Ammu Raj, 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,24 @@ | |||
| # -*- coding: utf-8 -*- | |||
| ################################################################################ | |||
| # | |||
| #    Cybrosys Technologies Pvt. Ltd. | |||
| # | |||
| #    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |||
| #    Author: Ammu Raj (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 controllers | |||
| from . import models | |||
| from . import wizard | |||
| @ -0,0 +1,54 @@ | |||
| # -*- coding: utf-8 -*- | |||
| ################################################################################ | |||
| # | |||
| #    Cybrosys Technologies Pvt. Ltd. | |||
| # | |||
| #    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |||
| #    Author: Ammu Raj (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': 'Odoo Vendor Portal', | |||
|     'version': '14.0.1.0.0', | |||
|     'category': 'Purchases', | |||
|     'summary': """Vendor Portal Management in Odoo""", | |||
|     'description': "This module helps to sent quotations for a product to" | |||
|                    "multiple vendors and vendors can add their price in their" | |||
|                    "portal, and can choose best quotation for product", | |||
|     'author': 'Cybrosys Techno Solutions', | |||
|     'website': "https://www.cybrosys.com", | |||
|     'company': 'Cybrosys Techno Solutions', | |||
|     'maintainer': 'Cybrosys Techno Solutions', | |||
|     'depends': ['website', 'purchase', 'portal', 'contacts', 'stock'], | |||
|     'data': [ | |||
|         'security/vendor_rfq_security.xml', | |||
|         'security/ir.model.access.csv', | |||
|         'data/ir_sequence_data.xml', | |||
|         'data/mail_data.xml', | |||
|         'data/ir_cron_data.xml', | |||
|         'wizard/register_vendor.xml', | |||
|         'wizard/rfq_done.xml', | |||
|         'views/res_partner_views.xml', | |||
|         'views/vendor_rfq_views.xml', | |||
|         'views/res_config_settings_views.xml', | |||
|         'views/portal_rfq_templates.xml', | |||
|         'views/portal_menus.xml' | |||
|     ], | |||
|     'images': ['static/description/banner.png'], | |||
|     'license': 'AGPL-3', | |||
|     'installable': True, | |||
|     'auto_install': False, | |||
|     'application': True, | |||
| } | |||
| @ -0,0 +1,22 @@ | |||
| # -*- coding: utf-8 -*- | |||
| ################################################################################ | |||
| # | |||
| #    Cybrosys Technologies Pvt. Ltd. | |||
| # | |||
| #    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |||
| #    Author: Ammu Raj (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 portal | |||
| @ -0,0 +1,137 @@ | |||
| # -*- coding: utf-8 -*- | |||
| ################################################################################ | |||
| # | |||
| #    Cybrosys Technologies Pvt. Ltd. | |||
| # | |||
| #    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |||
| #    Author: Ammu Raj (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 collections import OrderedDict | |||
| from odoo import http, _ | |||
| from odoo.http import request | |||
| from odoo.addons.portal.controllers.portal import pager as portal_pager, \ | |||
|     CustomerPortal | |||
| 
 | |||
| 
 | |||
| class RFQCustomerPortal(CustomerPortal): | |||
|     """The rfq portal designing""" | |||
| 
 | |||
|     def _prepare_home_portal_values(self, counters): | |||
|         """RFQs in home portal""" | |||
|         user_partner = request.env.user.partner_id | |||
|         values = super()._prepare_home_portal_values(counters) | |||
|         if 'my_rfq_count' in counters: | |||
|             values['my_rfq_count'] = request.env[ | |||
|                 'vendor.rfq'].sudo().search_count( | |||
|                 [('vendor_ids', 'in', user_partner.ids)]) | |||
|         return values | |||
| 
 | |||
|     def _rfq_get_page_view_values(self, vendor_rfq, access_token, **kwargs): | |||
|         """The values of RFQ Page""" | |||
|         values = {'page_name': 'vendor_rfq', | |||
|                   'vendor_rfq': vendor_rfq, | |||
|                   } | |||
|         return self._get_page_view_values(vendor_rfq, access_token, values, | |||
|                                           'my_rfq_history', False, **kwargs) | |||
| 
 | |||
|     @http.route(['/my/vendor_rfqs', '/my/vendor_rfqs/page/<int:page>'], | |||
|                 type='http', auth="public", website=True) | |||
|     def portal_my_vendor_rfqs(self, page=1, date_begin=None, | |||
|                               date_end=None, sortby=None, filterby=None, **kw): | |||
|         """Function for Portal vendor RFQs""" | |||
|         values = self._prepare_portal_layout_values() | |||
|         user_partner = request.env.user.partner_id | |||
|         vendor_rfq = request.env['vendor.rfq'].sudo().search([]) | |||
|         domain = [('vendor_ids', 'in', user_partner.ids), | |||
|                   ('state', 'not in', ['draft'])] | |||
|         if date_begin and date_end: | |||
|             domain += [('create_date', '>', date_begin), | |||
|                        ('create_date', '<=', date_end)] | |||
|         searchbar_sortings = { | |||
|             'date': {'label': _('Newest'), | |||
|                      'order': 'create_date desc, id desc'}, | |||
|             'name': {'label': _('Name'), 'order': 'name asc, id asc'}, | |||
|         } | |||
|         if not sortby: | |||
|             sortby = 'name' | |||
|         order = searchbar_sortings[sortby]['order'] | |||
|         searchbar_filters = { | |||
|             'all': {'label': _('All'), 'domain': [ | |||
|                 ('state', 'in', ['draft', 'in_progress', 'pending', | |||
|                                  'done', 'cancel'])]}, | |||
|             'Done': {'label': _('Done'), 'domain': [('state', '=', 'done')]}, | |||
|             'In Progress': {'label': _('In Progress'), | |||
|                             'domain': [('state', '=', 'in_progress')]}, | |||
|         } | |||
|         # default filter by value | |||
|         if not filterby: | |||
|             filterby = 'all' | |||
|         domain += searchbar_filters[filterby]['domain'] | |||
|         rfq_unit_count = vendor_rfq.search_count(domain) | |||
|         pager = portal_pager( | |||
|             url="/my/vendor_rfqs", | |||
|             url_args={'date_begin': date_begin, 'date_end': date_end, | |||
|                       'sortby': sortby, 'filterby': filterby}, | |||
|             total=rfq_unit_count, | |||
|             page=page, | |||
|             step=self._items_per_page | |||
|         ) | |||
|         orders = vendor_rfq.search( | |||
|             domain, | |||
|             order=order, | |||
|             limit=self._items_per_page, | |||
|             offset=pager['offset'] | |||
|         ) | |||
|         values.update({ | |||
|             'date': date_begin, | |||
|             'rfqs': orders, | |||
|             'page_name': 'vendor_rfq', | |||
|             'pager': pager, | |||
|             'searchbar_sortings': searchbar_sortings, | |||
|             'sortby': sortby, | |||
|             'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())), | |||
|             'filterby': filterby, | |||
|             'default_url': '/my/vendor_rfqs', | |||
|         }) | |||
|         return request.render( | |||
|             "vendor_portal_odoo.portal_my_rfq", | |||
|             values) | |||
| 
 | |||
|     @http.route(['/my/vendor_rfq/<int:rfq_id>'], type='http', auth="public", | |||
|                 website=True) | |||
|     def portal_my_vendor_rfq(self, rfq_id, access_token=None, **kw): | |||
|         """Displaying the RFQ details""" | |||
|         rfq_details = request.env['vendor.rfq'].sudo().browse(int(rfq_id)) | |||
|         vendor_quote = rfq_details.vendor_quote_history_ids.filtered( | |||
|             lambda x: x.vendor_id.id == request.env.user.partner_id.id) | |||
|         quoted_price = vendor_quote.quoted_price | |||
|         values = self._rfq_get_page_view_values(rfq_details, access_token, **kw) | |||
|         values['quoted_price'] = quoted_price | |||
|         values['vendor_quote'] = vendor_quote | |||
|         return request.render( | |||
|             "vendor_portal_odoo.portal_my_vendor_rfq", values) | |||
| 
 | |||
|     @http.route(['/quote/details'], type='http', auth="public", website=True) | |||
|     def quote_details(self, **post): | |||
|         """The details of Quote""" | |||
|         request.env['vendor.quote.history'].sudo().create({ | |||
|             'vendor_id': request.env.user.partner_id.id, | |||
|             'quoted_price': float(post.get('price')), | |||
|             'estimate_date': post.get('delivery_date'), | |||
|             'note': post.get('additional_note'), | |||
|             'quote_id': post.get('rfq_id'), | |||
|         }) | |||
|         return request.redirect('/my/vendor_rfq/%s' % (post.get('rfq_id'))) | |||
| @ -0,0 +1,14 @@ | |||
| <?xml version="1.0" encoding="UTF-8" ?> | |||
| <odoo> | |||
|     <!--    Cron job for Done the RFQ--> | |||
|     <record id="ir_cron_quote_rfq" model="ir.cron"> | |||
|         <field name="name">Set RFQs as Done</field> | |||
|         <field name="model_id" ref="model_vendor_rfq"/> | |||
|         <field name="state">code</field> | |||
|         <field name="code">model.set_rfq_done()</field> | |||
|         <field name="user_id" ref="base.user_root"/> | |||
|         <field name="interval_number">1</field> | |||
|         <field name="interval_type">days</field> | |||
|         <field name="numbercall">-1</field> | |||
|     </record> | |||
| </odoo> | |||
| @ -0,0 +1,13 @@ | |||
| <?xml version="1.0" encoding="utf-8" ?> | |||
| <odoo> | |||
|     <data noupdate="1"> | |||
|         <!--        Sequence of vendor RFQ--> | |||
|         <record id="seq_vendor_rfq" model="ir.sequence"> | |||
|             <field name="name">RFQ Sequence</field> | |||
|             <field name="code">vendor.rfq</field> | |||
|             <field name="prefix">RFQ</field> | |||
|             <field name="padding">5</field> | |||
|             <field name="company_id" eval="False"/> | |||
|         </record> | |||
|     </data> | |||
| </odoo> | |||
| @ -0,0 +1,73 @@ | |||
| <?xml version="1.0" encoding="utf-8" ?> | |||
| <odoo> | |||
|         <!--        Template for RFQ--> | |||
|         <record id="email_template_vendor_rfq_request" model="mail.template"> | |||
|             <field name="name">Purchase Order: Send RFQ</field> | |||
|             <field name="model_id" ref="vendor_portal_odoo.model_vendor_rfq"/> | |||
|             <field name="subject">RFQ Request</field> | |||
|             <field name="partner_to">${ctx.get('partner_to')}</field> | |||
|             <field name="body_html" type="html"> | |||
|                 <div style="margin: 0px; padding: 0px;"> | |||
|                     <p style="margin: 0px; padding: 0px; font-size: 13px;"> | |||
|                         Dear ${ctx.get('name')}, | |||
|                         <br/> | |||
|                         <br/> | |||
|                         We would like to request a quotation for the Product | |||
|                         ${object.product_id.name} | |||
|                         of | |||
|                         ${object.quantity} | |||
|                         Quantity from you. | |||
|                         <br/> | |||
|                         <br/> | |||
|                         If you are interested, please check and let us know the quote | |||
|                         <br/> | |||
|                         <br/> | |||
|                         Best regards, | |||
|                         <br/> | |||
|                         ${object.user_id.name} | |||
|                     </p> | |||
|                 </div> | |||
|             </field> | |||
|             <field name="lang">${ctx.get('lang')}</field> | |||
|             <field name="auto_delete" eval="True"/> | |||
|         </record> | |||
|         <!--    Template for Accepted Quote--> | |||
|         <record id="email_template_vendor_rfq_mark_done" model="mail.template"> | |||
|             <field name="name">Purchase Order: Quote Accepted</field> | |||
|             <field name="model_id" ref="vendor_portal_odoo.model_vendor_rfq"/> | |||
|             <field name="subject">Quote Accepted</field> | |||
|             <field name="partner_to">${ctx.get('partner_to')</field> | |||
|             <field name="body_html" type="html"> | |||
|                 <div style="margin: 0px; padding: 0px;"> | |||
|                     <p style="margin: 0px; padding: 0px; font-size: 13px;"> | |||
|                         Dear ${ctx.get('name')}, | |||
|                         <br/> | |||
|                         <br/> | |||
|                         We want to let you know that we accept your quoted price of | |||
|                         ${ctx.get('price')} | |||
|                         for the | |||
|                         ${object.product_id.name} | |||
|                         within your specified delivery date | |||
|                         ${ctx.get('delivery_date')} | |||
|                         from you. | |||
|                         <br/> | |||
|                         <br/> | |||
|                         We'd like to buy | |||
|                         ${object.quantity} | |||
|                         units of | |||
|                         <strong t-out="object.product_id.name or ''"/> | |||
|                         from you by the estimated date. | |||
|                         <br/> | |||
|                         We will send you a purchase order as soon as possible. | |||
|                         <br/> | |||
|                         <br/> | |||
|                         Best regards, | |||
|                         <br/> | |||
|                         ${object.user_id.name} | |||
|                     </p> | |||
|                 </div> | |||
|             </field> | |||
|             <field name="lang">${ctx.get('lang')}</field> | |||
|             <field name="auto_delete" eval="True"/> | |||
|         </record> | |||
| </odoo> | |||
| @ -0,0 +1,7 @@ | |||
| ## Module <vendor_portal_odoo> | |||
| 
 | |||
| #### 22.12.2023 | |||
| #### Version 14.0.1.0.0 | |||
| ##### ADD | |||
| 
 | |||
| - Initial commit for Odoo Vendor Portal | |||
| @ -0,0 +1,25 @@ | |||
| # -*- coding: utf-8 -*- | |||
| ################################################################################ | |||
| # | |||
| #    Cybrosys Technologies Pvt. Ltd. | |||
| # | |||
| #    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |||
| #    Author: Ammu Raj (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 res_config_settings | |||
| from . import res_partner | |||
| from . import vendor_quote_history | |||
| from . import vendor_rfq | |||
| @ -0,0 +1,53 @@ | |||
| # -*- coding: utf-8 -*- | |||
| ################################################################################ | |||
| # | |||
| #    Cybrosys Technologies Pvt. Ltd. | |||
| # | |||
| #    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |||
| #    Author: Ammu Raj (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 odoo import fields, models | |||
| 
 | |||
| 
 | |||
| class ResConfigSettings(models.TransientModel): | |||
|     """Class used to add field to res.config.settings""" | |||
|     _inherit = 'res.config.settings' | |||
| 
 | |||
|     rfq_done_based_on = fields.Selection([ | |||
|         ('based_on_price', 'Minimum Quoted Price'), | |||
|         ('based_on_delivery_time', 'Minimum Delivery time') | |||
|     ], string="Set RFQs Based on", default='based_on_price', | |||
|         help="Rfq done conditions") | |||
|     quote_submission_msg = fields.Char( | |||
|         string="Quote Submission", | |||
|         config_parameter="vendor_portal_odoo.quote_submission_msg", | |||
|         help="Status message to display if a quote was submitted") | |||
|     quote_accept_msg = fields.Char( | |||
|         string="Quote Acceptance", | |||
|         config_parameter="vendor_portal_odoo.quote_accept_msg", | |||
|         help="Status message to display if a quote was accepted") | |||
|     quote_not_accept_msg = fields.Char( | |||
|         string="Quote not Accepted", | |||
|         config_parameter="vendor_portal_odoo.quote_not_accept_msg", | |||
|         help="Status message to display if a quote was not accepted") | |||
|     quote_cancel_msg = fields.Char( | |||
|         string="Quote Cancelled", | |||
|         config_parameter="vendor_portal_odoo.quote_cancel_msg", | |||
|         help="Status message to display if a quote was cancelled") | |||
|     quote_to_po_msg = fields.Char( | |||
|         string="PO created for the RFQ", | |||
|         config_parameter="vendor_portal_odoo.quote_to_po_msg", | |||
|         help="Status message to display if a quote was converted to PO") | |||
| @ -0,0 +1,32 @@ | |||
| # -*- coding: utf-8 -*- | |||
| ################################################################################ | |||
| # | |||
| #    Cybrosys Technologies Pvt. Ltd. | |||
| # | |||
| #    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |||
| #    Author: Ammu Raj (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 odoo import fields, models | |||
| 
 | |||
| 
 | |||
| class ResPartner(models.Model): | |||
|     """Class used to add field to res partner for differentiate registered | |||
|     vendors""" | |||
|     _inherit = 'res.partner' | |||
| 
 | |||
|     is_registered = fields.Boolean(string="Is Registered Vendor", | |||
|                                    help="To denote the is the partner is " | |||
|                                         "registered as vendor") | |||
| @ -0,0 +1,46 @@ | |||
| # -*- coding: utf-8 -*- | |||
| ################################################################################ | |||
| # | |||
| #    Cybrosys Technologies Pvt. Ltd. | |||
| # | |||
| #    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |||
| #    Author: Ammu Raj (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 odoo import fields, models | |||
| 
 | |||
| 
 | |||
| class VendorQuoteHistory(models.Model): | |||
|     """Vendor Quotation History""" | |||
|     _name = 'vendor.quote.history' | |||
|     _description = "Vendor Quotation History" | |||
|     _rec_name = 'vendor_id' | |||
| 
 | |||
|     vendor_id = fields.Many2one('res.partner', | |||
|                                 domain="[('is_registered', '=', True)]", | |||
|                                 string="Vendor", help="Registered vendors") | |||
|     quoted_price = fields.Monetary(currency_field='currency_id', | |||
|                                    string="Quoted Price", | |||
|                                    help="The price quoted by vendor") | |||
|     currency_id = fields.Many2one('res.currency', string='Currency', | |||
|                                   required=True, | |||
|                                   default=lambda | |||
|                                       self: self.env.user.company_id.currency_id, | |||
|                                   help="The current company currency") | |||
|     estimate_date = fields.Date(string="Estimate date", | |||
|                                 help="Estimated date of the quotation") | |||
|     note = fields.Text(string="Note", help="Additional notes of the quote") | |||
|     quote_id = fields.Many2one('vendor.rfq', string="Quote", | |||
|                                help='The related field from vendor rfq') | |||
| @ -0,0 +1,182 @@ | |||
| # -*- coding: utf-8 -*- | |||
| ################################################################################ | |||
| # | |||
| #    Cybrosys Technologies Pvt. Ltd. | |||
| # | |||
| #    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |||
| #    Author: Ammu Raj (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 odoo import api, fields, models, _ | |||
| 
 | |||
| 
 | |||
| class VendorRFQ(models.Model): | |||
|     """Vendor RFQ model""" | |||
|     _name = 'vendor.rfq' | |||
|     _inherit = ['mail.thread', 'mail.activity.mixin'] | |||
|     _description = 'Vendor RFQ' | |||
| 
 | |||
|     name = fields.Char(string='RFQ Reference', required=True, index=True, | |||
|                        copy=False, default=lambda x: _('New'), | |||
|                        help="Name of the Vendor RFQ") | |||
|     product_id = fields.Many2one('product.product', string='Product', | |||
|                                  help="Select the required product for quote") | |||
|     quantity = fields.Float(string="Quantity", | |||
|                             help="Number of product quantity") | |||
|     uom_id = fields.Many2one('uom.uom', string='UoM', help="Unit of measure") | |||
|     estimated_quote = fields.Monetary(string="Estimated Quote", | |||
|                                       currency_field='currency_id', | |||
|                                       help="Estimated Quote Price") | |||
|     currency_id = fields.Many2one('res.currency', string='Currency', | |||
|                                   required=True, | |||
|                                   default=lambda | |||
|                                       self: self.env.user.company_id.currency_id, | |||
|                                   help="Current currency") | |||
|     notes = fields.Html(string='Notes', help="Additional notes") | |||
|     estimated_delivery_date = fields.Date(string="Delivery date", | |||
|                                           help="Vendor's delivery date") | |||
|     quote_date = fields.Datetime(default=fields.Datetime.now(), readonly=1, | |||
|                                  string='Quote Date', help="Date of the quote") | |||
|     closing_date = fields.Date(string="Closing date", | |||
|                                help="Quotation closing date") | |||
|     vendor_ids = fields.Many2many('res.partner', string="Vendors", | |||
|                                   domain="[('is_registered', '=', True)]", | |||
|                                   help="Vendors you want to send quotations") | |||
|     vendor_quote_history_ids = fields.One2many('vendor.quote.history', | |||
|                                                'quote_id', string="Vendors", | |||
|                                                help="The quote history of the" | |||
|                                                     "vendors") | |||
|     user_id = fields.Many2one('res.users', string="Responsible", | |||
|                               default=lambda self: self.env.user, | |||
|                               help="Current user") | |||
|     approved_vendor_id = fields.Many2one('res.partner', | |||
|                                          string="Approved Vendors", | |||
|                                          help="The approved vendors") | |||
|     purchase_order_id = fields.Many2one('purchase.order', | |||
|                                         string="Purchase Order", | |||
|                                         help="All purchase orders") | |||
|     state = fields.Selection([ | |||
|         ('draft', 'Draft'), | |||
|         ('pending', 'Pending'), | |||
|         ('in_progress', 'In Progress'), | |||
|         ('done', 'Done'), | |||
|         ('cancel', 'Cancelled'), ('order', 'Purchase Order'), | |||
|     ], string="Status", default='draft', help="Status of the vendor rfq") | |||
|     company_id = fields.Many2one('res.company', string='Company', | |||
|                                  default=lambda self: self.env.company, | |||
|                                  help='Current company') | |||
| 
 | |||
|     @api.model | |||
|     def create(self, vals): | |||
|         """Create function for vendor rfq""" | |||
|         if vals.get('name', 'New') == 'New': | |||
|             vals['name'] = self.env['ir.sequence'].next_by_code( | |||
|                 'vendor.rfq') or '/' | |||
|         res = super(VendorRFQ, self).create(vals) | |||
|         return res | |||
| 
 | |||
|     def action_send_by_mail(self): | |||
|         """For sending email to vendors""" | |||
|         template = self.env.ref( | |||
|             'vendor_portal_odoo.email_template_vendor_rfq_request').id | |||
|         for vendor in self.vendor_ids: | |||
|             context = { | |||
|                 'name': vendor.name, | |||
|                 'partner_to': vendor.id, | |||
|                 'lang': vendor.lang, | |||
|             } | |||
|             email_values = { | |||
|                 'email_to': vendor.email, | |||
|                 'email_from': self.env.user.partner_id.email, | |||
|                 'subject': 'RFQ Request', | |||
|             } | |||
|             self.env['mail.template'].browse(template).with_context( | |||
|                 context).send_mail(self.id, email_values=email_values, | |||
|                                    force_send=True) | |||
|         self.state = 'in_progress' | |||
| 
 | |||
|     def action_pending(self): | |||
|         """For changing state to pending""" | |||
|         self.state = 'pending' | |||
| 
 | |||
|     def action_cancel(self): | |||
|         """For changing state to cancel""" | |||
|         self.state = 'cancel' | |||
| 
 | |||
|     def action_done(self): | |||
|         """For mark as done""" | |||
|         return { | |||
|             'type': 'ir.actions.act_window', | |||
|             'view_mode': 'form', | |||
|             'res_model': 'rfq.done', | |||
|             'target': 'new', | |||
|             'views': [[False, 'form']], | |||
|         } | |||
| 
 | |||
|     def action_create_quotation(self): | |||
|         """For creating purchase RFQ from vendor quotations""" | |||
|         rfq_quote = self.env['vendor.quote.history'].search([ | |||
|             ('vendor_id', '=', self.approved_vendor_id.id), | |||
|             ('quote_id', '=', self.id)]) | |||
|         price = rfq_quote.quoted_price | |||
|         order = self.env['purchase.order'].sudo().create({ | |||
|             'partner_id': self.approved_vendor_id.id, | |||
|             'order_line': [ | |||
|                 (0, 0, { | |||
|                     'name': self.product_id.name, | |||
|                     'product_id': self.product_id.id, | |||
|                     'product_qty': self.quantity, | |||
|                     'product_uom': self.product_id.uom_po_id.id, | |||
|                     'price_unit': price, | |||
|                     'date_planned': rfq_quote.estimate_date, | |||
|                     'taxes_id': [(6, 0, self.product_id.supplier_taxes_id.ids)], | |||
|                 })], | |||
|         }) | |||
|         self.write({'state': 'order', | |||
|                     'purchase_order_id': order.id | |||
|                     }) | |||
|         return { | |||
|             'type': 'ir.actions.act_window', | |||
|             'res_model': 'purchase.order', | |||
|             'res_id': order.id, | |||
|             'target': 'current', | |||
|             'views': [(False, 'form')], | |||
|         } | |||
| 
 | |||
|     def set_rfq_done(self): | |||
|         """Set the RFQ as done""" | |||
|         quotes = self.search([('state', '=', 'in_progress'), | |||
|                               ('vendor_quote_history_ids', '!=', False), | |||
|                               ('closing_date', '=', fields.Date.today())]) | |||
|         if quotes: | |||
|             rfq_done_based_on = self.env['ir.config_parameter'].get_param( | |||
|                 'vendor_portal_odoo.rfq_done_based_on') | |||
|             for rec in quotes: | |||
|                 order = 'quoted_price asc' if rfq_done_based_on == 'based_on_price' else 'estimate_date asc' | |||
|                 vendor_quotes = rec.vendor_quote_history_ids.search([], limit=1, | |||
|                                                                     order=order) | |||
|                 rec.write({'approved_vendor_id': vendor_quotes.vendor_id.id, | |||
|                            'state': 'done' | |||
|                            }) | |||
| 
 | |||
|     def action_get_purchase_order(self): | |||
|         """Returns Purchase Order""" | |||
|         return { | |||
|             'type': 'ir.actions.act_window', | |||
|             'res_model': 'purchase.order', | |||
|             'res_id': self.purchase_order_id.id, | |||
|             'target': 'current', | |||
|             'views': [(False, 'form')], | |||
|         } | |||
| 
 | 
| @ -0,0 +1,11 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <odoo> | |||
|     <!--    Multi company Rule--> | |||
|     <record id="vendor_rfq_rule_company" model="ir.rule"> | |||
|         <field name="name">Vendor Quotation multi company rule</field> | |||
|         <field name="model_id" ref="model_vendor_rfq"/> | |||
|         <field name="domain_force">['|', ('company_id', '=', False), | |||
|             ('company_id', 'in', company_ids)] | |||
|         </field> | |||
|     </record> | |||
| </odoo> | |||
| 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.2 KiB | 
| After Width: | Height: | Size: 673 B | 
| 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: 1.5 KiB | 
| After Width: | Height: | Size: 1.1 KiB | 
| After Width: | Height: | Size: 1.9 KiB | 
| After Width: | Height: | Size: 1.1 KiB | 
| After Width: | Height: | Size: 2.1 KiB | 
| After Width: | Height: | Size: 4.4 KiB | 
| After Width: | Height: | Size: 589 B | 
| After Width: | Height: | Size: 3.4 KiB | 
| After Width: | Height: | Size: 1.7 KiB | 
| After Width: | Height: | Size: 2.3 KiB | 
| After Width: | Height: | Size: 967 B | 
| After Width: | Height: | Size: 1.6 KiB | 
| After Width: | Height: | Size: 3.8 KiB | 
| After Width: | Height: | Size: 5.0 KiB | 
| After Width: | Height: | Size: 72 KiB | 
| After Width: | Height: | Size: 61 KiB | 
| After Width: | Height: | Size: 60 KiB | 
| After Width: | Height: | Size: 46 KiB | 
| After Width: | Height: | Size: 56 KiB | 
| After Width: | Height: | Size: 48 KiB | 
| After Width: | Height: | Size: 352 KiB | 
| After Width: | Height: | Size: 120 KiB | 
| After Width: | Height: | Size: 105 KiB | 
| After Width: | Height: | Size: 69 KiB | 
| After Width: | Height: | Size: 112 KiB | 
| After Width: | Height: | Size: 112 KiB | 
| After Width: | Height: | Size: 103 KiB | 
| After Width: | Height: | Size: 95 KiB | 
| After Width: | Height: | Size: 93 KiB | 
| After Width: | Height: | Size: 105 KiB | 
| After Width: | Height: | Size: 111 KiB | 
| After Width: | Height: | Size: 102 KiB | 
| After Width: | Height: | Size: 79 KiB | 
| After Width: | Height: | Size: 45 KiB | 
| After Width: | Height: | Size: 44 KiB | 
| After Width: | Height: | Size: 8.5 KiB | 
| @ -0,0 +1,653 @@ | |||
| <div style="background-color: #714B67; height: 810px; width: 100%; padding: 15px; position: relative;"> | |||
|     <!-- TITLE BAR --> | |||
|     <div class="d-flex align-items-center justify-content-between" | |||
|          style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;"> | |||
|         <img src="assets/misc/cybrosys-logo.png" width="42" height="42" | |||
|              style="width: 42px; height: 42px;"/> | |||
|         <div> | |||
|             <div | |||
|                     style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" | |||
|                     class="mr-2"> | |||
|                 <i class="fa fa-check mr-1"></i>Community | |||
|             </div> | |||
|             <div | |||
|                     style="color:  #875A7B; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" | |||
|                     class="mr-2"> | |||
|                 <i class="fa fa-check mr-1"></i>Enterprise | |||
|             </div> | |||
|             <div | |||
|                     style="color: #017E84; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" | |||
|                     class="mr-2"> | |||
|                 <i class="fa fa-check mr-1"></i>Odoo.Sh | |||
|             </div> | |||
|         </div> | |||
|     </div> | |||
|     <!-- END OF TITLE BAR --> | |||
|     <div class="container"> | |||
|         <div class="row"> | |||
|             <div class="col-sm-12 col-md-12 col-lg-12"> | |||
|                 <!-- APP HERO --> | |||
|                 <h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;"> | |||
|                     Odoo Vendor Portal | |||
|                 </h1> | |||
|                 <p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">Simplifies the Process of Sending Product Quotations to | |||
|                     Multiple Vendors, Enabling Them to Submit Their Pricing and Allowing You to Select the Best Quotation.</p> | |||
|                 <!-- END OF APP HERO --> | |||
|                 <img src="assets/screenshots/hero.gif" class="img-responsive" | |||
|                      style="width: 100%; margin-left: auto; margin-right: auto;"/> | |||
|             </div> | |||
|         </div> | |||
|     </div> | |||
| 
 | |||
| </div> | |||
| 
 | |||
| <!-- NAVIGATION SECTION --> | |||
| <div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px; margin-top: 300px;"> | |||
|     <div class="d-flex justify-content-center align-items-center mr-2" | |||
|          style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> | |||
|         <img src="assets/misc/compass.png"/> | |||
|     </div> | |||
|     <h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Explore This | |||
|         Module</h2> | |||
| </div> | |||
| <div class="row my-4" style="font-family: 'Montserrat', sans-serif;"> | |||
|     <div class="col-sm-12 col-md-6 my-3"> | |||
|         <a href="#overview"> | |||
|             <div class="d-flex justify-content-between align-items-center" | |||
|                  style="background-color: #f5f5f5; padding: 30px; width: 100%;"> | |||
|                 <div> | |||
|                     <span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Overview</span> | |||
|                     <span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33;  display: block;">Learn | |||
|             more about this | |||
|             module</span> | |||
|                 </div> | |||
|                 <img src="assets/misc/right-arrow.png" width="36" height="36"/> | |||
|             </div> | |||
|         </a> | |||
|     </div> | |||
|     <div class="col-sm-12 col-md-6 my-3"> | |||
|         <a href="#features"> | |||
|             <div class="d-flex justify-content-between align-items-center" | |||
|                  style="background-color: #f5f5f5; padding: 30px; width: 100%;"> | |||
|                 <div> | |||
|                     <span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Features</span> | |||
|                     <span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33;  display: block;">View | |||
|             features of this | |||
|             module</span> | |||
|                 </div> | |||
|                 <img src="assets/misc/right-arrow.png" width="36" height="36"/> | |||
|             </div> | |||
|         </a> | |||
|     </div> | |||
|     <div class="col-sm-12 col-md-6 my-3"> | |||
|         <a href="#screenshots"> | |||
|             <div class="d-flex justify-content-between align-items-center" | |||
|                  style="background-color: #f5f5f5; padding: 30px; width: 100%;"> | |||
|                 <div> | |||
|                     <span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Screenshots</span> | |||
|                     <span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33;  display: block;">View | |||
|             screenshots for this | |||
|             module</span> | |||
|                 </div> | |||
|                 <img src="assets/misc/right-arrow.png" width="36" height="36"/> | |||
|             </div> | |||
|         </a> | |||
|     </div> | |||
| </div> | |||
| <!-- END OF NAVIGATION SECTION --> | |||
| 
 | |||
| <!-- OVERVIEW SECTION --> | |||
| <div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="overview"> | |||
|     <div class="d-flex justify-content-center align-items-center mr-2" | |||
|          style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> | |||
|         <img src="assets/misc/pie-chart.png"/> | |||
|     </div> | |||
|     <h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Overview | |||
|     </h2> | |||
| </div> | |||
| <div class="row" style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;"> | |||
|     <div class="col-sm-12 py-4"> | |||
|         This module helps to simplify the purchase and vendor management in Odoo. | |||
|     </div> | |||
| </div> | |||
| <!-- END OF OVERVIEW SECTION --> | |||
| 
 | |||
| <!-- FEATURES SECTION --> | |||
| <div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="features"> | |||
|     <div class="d-flex justify-content-center align-items-center mr-2" | |||
|          style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> | |||
|         <img src="assets/misc/features.png"/> | |||
|     </div> | |||
|     <h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Features | |||
|     </h2> | |||
| </div> | |||
| <div class="row" style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;"> | |||
|     <div class="col-sm-12 col-md-6"> | |||
|         <div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> | |||
|             <img src="assets/misc/check-box.png" class="mr-2"/> | |||
|             <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Simplified Odoo Vendor Management</span> | |||
|         </div> | |||
|         <div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> | |||
|             <img src="assets/misc/check-box.png" class="mr-2"/> | |||
|             <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Create individual portals for your suppliers on the Odoo website</span> | |||
|         </div> | |||
|         <div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> | |||
|             <img src="assets/misc/check-box.png" class="mr-2"/> | |||
|             <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Utilize Odoo to Manage & Track Your Vendors</span> | |||
|         </div> | |||
|     </div> | |||
|     <div class="col-sm-12 col-md-6"> | |||
|         <div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> | |||
|             <img src="assets/misc/check-box.png" class="mr-2"/> | |||
|             <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Mail notification to Vendor</span> | |||
|         </div> | |||
| 
 | |||
|         <div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> | |||
|             <img src="assets/misc/check-box.png" class="mr-2"/> | |||
|             <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Approve the RFQ automatically based on the configuration</span> | |||
|         </div> | |||
| 
 | |||
|     </div> | |||
| </div> | |||
| <!-- END OF FEATURES SECTION --> | |||
| 
 | |||
| <!-- SCREENSHOTS SECTION --> | |||
| <div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="screenshots"> | |||
|     <div class="d-flex justify-content-center align-items-center mr-2" | |||
|          style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> | |||
|         <img src="assets/misc/pictures.png"/> | |||
|     </div> | |||
|     <h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Screenshots | |||
|     </h2> | |||
| </div> | |||
| <div class="row"> | |||
|     <div class="col-sm-12"> | |||
| 
 | |||
|         <div style="display: block; margin: 30px auto;"> | |||
|             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Make a Vendor Registered | |||
|             </h3> | |||
|             <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Take the Registered Vendors and click the below smart button to give the Vendor Portal access. | |||
|             </p> | |||
|             <img src="assets/screenshots/pv.png" class="img-thumbnail"> | |||
|         </div> | |||
| 
 | |||
|         <div style="display: block; margin: 30px auto;"> | |||
|             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | |||
|                 Portal invitation link to Vendor | |||
|             </h3> | |||
|             <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">When clicking on the button will allow to send the vendor | |||
|                 portal invitation link to invite the desired vendors to the portal. | |||
|             </p> | |||
|             <img src="assets/screenshots/pv0.png" class="img-thumbnail"> | |||
|         </div> | |||
| 
 | |||
|         <div style="display: block; margin: 30px auto;"> | |||
|             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">List of Registered | |||
|                 Vendors | |||
|             </h3> | |||
|             <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">You can see all Registered Vendors from  Vendors-->Registered Vendors. | |||
|             </p> | |||
|             <img src="assets/screenshots/pv1.png" class="img-thumbnail"> | |||
|         </div> | |||
| 
 | |||
|         <div style="display: block; margin: 30px auto;"> | |||
|             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Configuration for | |||
|                 Vendor Portal | |||
|             </h3> | |||
|             <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"><b>Set RFQs as done</b> - Set the Conditions to | |||
|                 automatically set the RFQs as completed. | |||
|             </p> | |||
|             <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"><b>Vendor RFQs Status Message</b> - Set the status messages | |||
|                 that customers see in the vendor portal in every stage of quotation. | |||
|             </p> | |||
|             <img src="assets/screenshots/pv2.png" class="img-thumbnail"> | |||
|         </div> | |||
| 
 | |||
|         <div style="display: block; margin: 30px auto;"> | |||
|             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Create RFQ with | |||
|                 necessary details | |||
|             </h3> | |||
|             <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">RFQ will create for each Vendor in their portal with required Quantity of Product. | |||
|             </p> | |||
|             <img src="assets/screenshots/pv3.png" class="img-thumbnail"> | |||
|         </div> | |||
| 
 | |||
|         <div style="display: block; margin: 30px auto;"> | |||
|             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Send RFQs to the | |||
|                 Selected Vendors | |||
|             </h3> | |||
|             <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">After clicking the button SEND INVITATION MAIL, a mail and rfq will create for the vendors selected. | |||
|             </p> | |||
|             <img src="assets/screenshots/pv4.png" class="img-thumbnail"> | |||
|         </div> | |||
| 
 | |||
|         <div style="display: block; margin: 30px auto;"> | |||
|             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Portal view and Submitting the Quote | |||
|             </h3> | |||
|             <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">From the vendor portal website, vendors can submit | |||
|                 their quotes to the admin. | |||
|             </p> | |||
|             <img src="assets/screenshots/pv5.png" class="img-thumbnail"> | |||
|         </div> | |||
| 
 | |||
|         <div style="display: block; margin: 30px auto;"> | |||
|             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Vendor can check the status of the Quote from the Portal. | |||
|             </h3> | |||
|             <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">When the | |||
|                 Administrator updates the backend, the vendor can check the status of his quote | |||
|             </p> | |||
|             <img src="assets/screenshots/pv6.png" class="img-thumbnail"> | |||
|         </div> | |||
| 
 | |||
|         <div style="display: block; margin: 30px auto;"> | |||
|             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Submitted Quotes in the backend | |||
|             </h3> | |||
|             <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Admins are able to | |||
|                 see the submitted Quotes. | |||
|             </p> | |||
|             <img src="assets/screenshots/pv7.png" class="img-thumbnail"> | |||
|         </div> | |||
|         <div style="display: block; margin: 30px auto;"> | |||
|             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Admins are able to | |||
|                 mark the RFQ as Done | |||
|             </h3> | |||
|             <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">It's possible to select the desired vendor by Administrator, then he can click MARK AS DONE. | |||
|             </p> | |||
|             <img src="assets/screenshots/pv8.png" class="img-thumbnail"> | |||
|         </div> | |||
|         <div style="display: block; margin: 30px auto;"> | |||
|             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Vendor will receive | |||
|                 an email when his quote has been accepted | |||
|             </h3> | |||
|             <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">The vendor selected by the Administrator will receive an Email when his quote has been accepted. | |||
|             </p> | |||
|             <img src="assets/screenshots/pv9.png" class="img-thumbnail"> | |||
|         </div> | |||
|         <div style="display: block; margin: 30px auto;"> | |||
|             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Portal RFQ Status of | |||
|                 accepted quotes | |||
|             </h3> | |||
|             <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Accepted vendor will receive the status that quote has been accepted(The message that you set in the settings). | |||
|             </p> | |||
|             <img src="assets/screenshots/pv10.png" class="img-thumbnail"> | |||
|         </div> | |||
|         <div style="display: block; margin: 30px auto;"> | |||
|             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Portal RFQ Status of | |||
|                 rejected quotes | |||
|             </h3> | |||
|             <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Rejected vendor will receive the rejected message. | |||
|             </p> | |||
|             <img src="assets/screenshots/pv11.png" class="img-thumbnail"> | |||
|         </div> | |||
|     </div> | |||
| 
 | |||
| </div> | |||
| <!-- END OF SCREENSHOTS SECTION --> | |||
| 
 | |||
| <!-- RELATED PRODUCTS --> | |||
| <div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> | |||
|     <div class="d-flex justify-content-center align-items-center mr-2" | |||
|          style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> | |||
|         <img src="assets/misc/categories.png"/> | |||
|     </div> | |||
|     <h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Related | |||
|         Products | |||
|     </h2> | |||
| </div> | |||
| <div class="row"> | |||
|     <div class="col-sm-12"> | |||
|         <div id="demo1" class="row carousel slide" data-ride="carousel"> | |||
|             <!-- The slideshow --> | |||
|             <div class="carousel-inner" style="padding: 30px;"> | |||
|                 <div class="carousel-item" style="min-height: 198.656px;"> | |||
|                     <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | |||
|                         <a href="https://apps.odoo.com/apps/modules/14.0/product_brand_purchase/" target="_blank"> | |||
|                             <div style="border-radius:10px"> | |||
|                                 <img class="img img-responsive center-block" style="border-radius: 0px;" | |||
|                                      src="assets/modules/1.png"> | |||
|                             </div> | |||
|                         </a> | |||
|                     </div> | |||
|                     <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | |||
|                         <a href="https://apps.odoo.com/apps/modules/14.0/purchase_order_delivery_status/" target="_blank"> | |||
|                             <div style="border-radius:10px"> | |||
|                                 <img class="img img-responsive center-block" style="border-radius: 0px;" | |||
|                                      src="assets/modules/2.png"> | |||
|                             </div> | |||
|                         </a> | |||
|                     </div> | |||
|                     <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | |||
|                         <a href="https://apps.odoo.com/apps/modules/14.0/purchase_report_generator/" target="_blank"> | |||
|                             <div style="border-radius:10px"> | |||
|                                 <img class="img img-responsive center-block" style="border-radius: 0px;" | |||
|                                      src="assets/modules/3.png"> | |||
|                             </div> | |||
|                         </a> | |||
|                     </div> | |||
|                 </div> | |||
|                 <div class="carousel-item active" style="min-height: 198.656px;"> | |||
|                     <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | |||
|                         <a href="https://apps.odoo.com/apps/modules/14.0/website_multi_product_return_management/" target="_blank"> | |||
|                             <div style="border-radius:10px"> | |||
|                                 <img class="img img-responsive center-block" style="border-radius: 0px;" | |||
|                                      src="assets/modules/4.png"> | |||
|                             </div> | |||
|                         </a> | |||
|                     </div> | |||
|                     <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | |||
|                         <a href="https://apps.odoo.com/apps/modules/14.0/featured_brand_snippet/" target="_blank"> | |||
|                             <div style="border-radius:10px"> | |||
|                                 <img class="img img-responsive center-block" style="border-radius: 0px;" | |||
|                                      src="assets/modules/5.png"> | |||
|                             </div> | |||
|                         </a> | |||
|                     </div> | |||
|                     <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | |||
|                         <a href="https://apps.odoo.com/apps/modules/14.0/index_and_follow/" target="_blank"> | |||
|                             <div style="border-radius:10px"> | |||
|                                 <img class="img img-responsive center-block" style="border-radius: 0px;" | |||
|                                      src="assets/modules/6.png"> | |||
|                             </div> | |||
|                         </a> | |||
|                     </div> | |||
|                 </div> | |||
|             </div> | |||
|             <!-- Left and right controls --> | |||
|             <a class="carousel-control-prev" href="#demo1" 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="#demo1" 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> | |||
| </div> | |||
| <!-- END OF RELATED PRODUCTS --> | |||
| 
 | |||
| <!-- OUR SERVICES --> | |||
| 
 | |||
| <div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> | |||
|     <div class="d-flex justify-content-center align-items-center mr-2" | |||
|          style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> | |||
|         <img src="assets/misc/star.png"/> | |||
|     </div> | |||
|     <h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our Services | |||
|     </h2> | |||
| </div> | |||
| 
 | |||
| <div class="container my-5"> | |||
|     <div class="row"> | |||
|         <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | |||
|             <div class="d-flex justify-content-center align-items-center mx-3 my-3" | |||
|                  style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | |||
|                 <img src="assets/icons/cogs.png" class="img-responsive" height="48px" width="48px"> | |||
|             </div> | |||
|             <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | |||
|                 Odoo | |||
|                 Customization</h6> | |||
|         </div> | |||
| 
 | |||
|         <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | |||
|             <div class="d-flex justify-content-center align-items-center mx-3 my-3" | |||
|                  style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;"> | |||
|                 <img src="assets/icons/wrench.png" class="img-responsive" height="48px" width="48px"> | |||
|             </div> | |||
|             <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | |||
|                 Odoo | |||
|                 Implementation</h6> | |||
|         </div> | |||
| 
 | |||
|         <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | |||
|             <div class="d-flex justify-content-center align-items-center mx-3 my-3" | |||
|                  style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;"> | |||
|                 <img src="assets/icons/lifebuoy.png" class="img-responsive" height="48px" width="48px"> | |||
|             </div> | |||
|             <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | |||
|                 Odoo | |||
|                 Support</h6> | |||
|         </div> | |||
| 
 | |||
| 
 | |||
|         <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | |||
|             <div class="d-flex justify-content-center align-items-center mx-3 my-3" | |||
|                  style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | |||
|                 <img src="assets/icons/user.png" class="img-responsive" height="48px" width="48px"> | |||
|             </div> | |||
|             <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | |||
|                 Hire | |||
|                 Odoo | |||
|                 Developer</h6> | |||
|         </div> | |||
| 
 | |||
|         <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | |||
|             <div class="d-flex justify-content-center align-items-center mx-3 my-3" | |||
|                  style="background-color: #54a0ff  !important; border-radius: 15px !important; height: 80px; width: 80px;"> | |||
|                 <img src="assets/icons/puzzle.png" class="img-responsive" height="48px" width="48px"> | |||
|             </div> | |||
|             <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | |||
|                 Odoo | |||
|                 Integration</h6> | |||
|         </div> | |||
| 
 | |||
|         <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | |||
|             <div class="d-flex justify-content-center align-items-center mx-3 my-3" | |||
|                  style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | |||
|                 <img src="assets/icons/update.png" class="img-responsive" height="48px" width="48px"> | |||
|             </div> | |||
|             <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | |||
|                 Odoo | |||
|                 Migration</h6> | |||
|         </div> | |||
| 
 | |||
| 
 | |||
|         <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | |||
|             <div class="d-flex justify-content-center align-items-center mx-3 my-3" | |||
|                  style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | |||
|                 <img src="assets/icons/consultation.png" class="img-responsive" height="48px" width="48px"> | |||
|             </div> | |||
|             <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | |||
|                 Odoo | |||
|                 Consultancy</h6> | |||
|         </div> | |||
| 
 | |||
|         <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | |||
|             <div class="d-flex justify-content-center align-items-center mx-3 my-3" | |||
|                  style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | |||
|                 <img src="assets/icons/training.png" class="img-responsive" height="48px" width="48px"> | |||
|             </div> | |||
|             <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | |||
|                 Odoo | |||
|                 Implementation</h6> | |||
|         </div> | |||
| 
 | |||
|         <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | |||
|             <div class="d-flex justify-content-center align-items-center mx-3 my-3" | |||
|                  style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | |||
|                 <img src="assets/icons/license.png" class="img-responsive" height="48px" width="48px"> | |||
|             </div> | |||
|             <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | |||
|                 Odoo | |||
|                 Licensing Consultancy</h6> | |||
|         </div> | |||
|     </div> | |||
| 
 | |||
| </div> | |||
| 
 | |||
| <!-- END OF OUR SERVICES --> | |||
| 
 | |||
| <!-- OUR INDUSTRIES --> | |||
| 
 | |||
| <div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> | |||
|     <div class="d-flex justify-content-center align-items-center mr-2" | |||
|          style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> | |||
|         <img src="assets/misc/corporate.png"/> | |||
|     </div> | |||
|     <h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our | |||
|         Industries | |||
|     </h2> | |||
| </div> | |||
| 
 | |||
| <div class="container my-5"> | |||
|     <div class="row"> | |||
|         <div class="col-lg-3"> | |||
|             <div class="my-4 d-flex flex-column justify-content-center" | |||
|                  style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> | |||
|                 <img src="assets/icons/trading-black.png" class="img-responsive mb-3" height="48px" width="48px"> | |||
|                 <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | |||
|                     Trading | |||
|                 </h5> | |||
|                 <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | |||
|                     Easily procure | |||
|                     and | |||
|                     sell your products</p> | |||
|             </div> | |||
|         </div> | |||
| 
 | |||
|         <div class="col-lg-3"> | |||
|             <div class="my-4 d-flex flex-column justify-content-center" | |||
|                  style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> | |||
|                 <img src="assets/icons/pos-black.png" class="img-responsive mb-3" height="48px" width="48px"> | |||
|                 <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | |||
|                     POS | |||
|                 </h5> | |||
|                 <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | |||
|                     Easy | |||
|                     configuration | |||
|                     and convivial experience</p> | |||
|             </div> | |||
|         </div> | |||
| 
 | |||
|         <div class="col-lg-3"> | |||
|             <div class="my-4 d-flex flex-column justify-content-center" | |||
|                  style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> | |||
|                 <img src="assets/icons/education-black.png" class="img-responsive mb-3" height="48px" width="48px"> | |||
|                 <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | |||
|                     Education | |||
|                 </h5> | |||
|                 <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | |||
|                     A platform for | |||
|                     educational management</p> | |||
|             </div> | |||
|         </div> | |||
| 
 | |||
|         <div class="col-lg-3"> | |||
|             <div class="my-4 d-flex flex-column justify-content-center" | |||
|                  style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> | |||
|                 <img src="assets/icons/manufacturing-black.png" class="img-responsive mb-3" height="48px" width="48px"> | |||
|                 <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | |||
|                     Manufacturing | |||
|                 </h5> | |||
|                 <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | |||
|                     Plan, track and | |||
|                     schedule your operations</p> | |||
|             </div> | |||
|         </div> | |||
| 
 | |||
|         <div class="col-lg-3"> | |||
|             <div class="my-4 d-flex flex-column justify-content-center" | |||
|                  style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> | |||
|                 <img src="assets/icons/ecom-black.png" class="img-responsive mb-3" height="48px" width="48px"> | |||
|                 <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | |||
|                     E-commerce & Website | |||
|                 </h5> | |||
|                 <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | |||
|                     Mobile | |||
|                     friendly, | |||
|                     awe-inspiring product pages</p> | |||
|             </div> | |||
|         </div> | |||
| 
 | |||
|         <div class="col-lg-3"> | |||
|             <div class="my-4 d-flex flex-column justify-content-center" | |||
|                  style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> | |||
|                 <img src="assets/icons/service-black.png" class="img-responsive mb-3" height="48px" width="48px"> | |||
|                 <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | |||
|                     Service Management | |||
|                 </h5> | |||
|                 <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | |||
|                     Keep track of | |||
|                     services and invoice</p> | |||
|             </div> | |||
|         </div> | |||
| 
 | |||
|         <div class="col-lg-3"> | |||
|             <div class="my-4 d-flex flex-column justify-content-center" | |||
|                  style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> | |||
|                 <img src="assets/icons/restaurant-black.png" class="img-responsive mb-3" height="48px" width="48px"> | |||
|                 <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | |||
|                     Restaurant | |||
|                 </h5> | |||
|                 <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | |||
|                     Run your bar or | |||
|                     restaurant methodically</p> | |||
|             </div> | |||
|         </div> | |||
| 
 | |||
|         <div class="col-lg-3"> | |||
|             <div class="my-4 d-flex flex-column justify-content-center" | |||
|                  style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> | |||
|                 <img src="assets/icons/hotel-black.png" class="img-responsive mb-3" height="48px" width="48px"> | |||
|                 <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | |||
|                     Hotel Management | |||
|                 </h5> | |||
|                 <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | |||
|                     An | |||
|                     all-inclusive | |||
|                     hotel management application</p> | |||
|             </div> | |||
|         </div> | |||
|     </div> | |||
| </div> | |||
| 
 | |||
| <!-- END OF OUR INDUSTRIES --> | |||
| 
 | |||
| <!-- SUPPORT --> | |||
| <div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> | |||
|     <div class="d-flex justify-content-center align-items-center mr-2" | |||
|          style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> | |||
|         <img src="assets/misc/customer-support.png"/> | |||
|     </div> | |||
|     <h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Support | |||
|     </h2> | |||
| </div> | |||
| <div class="container mt-5"> | |||
|     <div class="row"> | |||
|         <div class="col-sm-12 col-md-6"> | |||
|             <div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;"> | |||
|                 <div class="mr-4 d-flex justify-content-center align-items-center" | |||
|                      style="background-color: #714B67; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;"> | |||
|                     <img src="assets/misc/support.png" height="48" width="48" style="width: 42px; height: 42px;"/> | |||
|                 </div> | |||
|                 <div> | |||
|                     <h4>Need Help?</h4> | |||
|                     <p style="line-height: 100%;">Got questions or need help? Get in touch.</p> | |||
|                     <a href="mailto:odoo@cybrosys.com"> | |||
|                         <p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;"> | |||
|                             odoo@cybrosys.com</p> | |||
|                     </a> | |||
|                 </div> | |||
|             </div> | |||
|         </div> | |||
|         <div class="col-sm-12 col-md-6"> | |||
|             <div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;"> | |||
|                 <div class="mr-4 d-flex justify-content-center align-items-center" | |||
|                      style="background-color: #2AC44D; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;"> | |||
|                     <img src="assets/misc/whatsapp.png" height="52" width="52" style="width: 52px; height: 52px;"/> | |||
|                 </div> | |||
|                 <div> | |||
|                     <h4>WhatsApp</h4> | |||
|                     <p style="line-height: 100%;">Say hi to us on WhatsApp!</p> | |||
|                     <a href="https://api.whatsapp.com/send?phone=918606827707"> | |||
|                         <p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">+91 8606827707</p> | |||
|                     </a> | |||
|                 </div> | |||
|             </div> | |||
|         </div> | |||
|     </div> | |||
|     <div class="row"> | |||
|         <div class="col-sm-12 my-5 d-flex justify-content-center align-items-center"> | |||
|             <img src="assets/misc/logo.png" width="144" height="31" | |||
|                  style="width:144px; height: 31px; margin-top: 40px;"/> | |||
|         </div> | |||
|     </div> | |||
| </div> | |||
| <!-- END OF SUPPORT --> | |||
| @ -0,0 +1,79 @@ | |||
| <?xml version="1.0" encoding="utf-8" ?> | |||
| <odoo> | |||
|     <!--    Vendor portal Menus--> | |||
|     <menuitem | |||
|             id="vendor_portal_menu_root" | |||
|             name="Vendor Portal" | |||
|             groups="base.group_user" | |||
|             web_icon="vendor_portal_odoo,static/description/icon.png" | |||
|             sequence="185"/> | |||
|     <menuitem | |||
|             id="vendor_quotations_menu" | |||
|             name="Vendor Quotations" | |||
|             parent="vendor_portal_menu_root" | |||
|             sequence="1"/> | |||
|     <menuitem | |||
|             id="rfq_vendor_menu" | |||
|             name="Vendor Quotations" | |||
|             parent="vendor_quotations_menu" | |||
|             action="vendor_rfq_action" | |||
|             sequence="1"/> | |||
|     <menuitem | |||
|             id="rfq_vendor_progress_menu" | |||
|             name="In Progress" | |||
|             parent="vendor_quotations_menu" | |||
|             action="vendor_rfq__action_progress" | |||
|             sequence="1"/> | |||
|     <menuitem | |||
|             id="rfq_vendor_done_menu" | |||
|             name="Done" | |||
|             parent="vendor_quotations_menu" | |||
|             action="vendor_rfq_action_done" | |||
|             sequence="1"/> | |||
|     <menuitem | |||
|             id="vendors_menu_root" | |||
|             name="Vendors" | |||
|             parent="vendor_portal_menu_root" | |||
|             sequence="3"/> | |||
|     <menuitem | |||
|             id="vendors_menu" | |||
|             name="Vendors" | |||
|             parent="vendors_menu_root" | |||
|             action="account.res_partner_action_supplier" | |||
|             sequence="1"/> | |||
|     <menuitem | |||
|             id="res_partner_registered_vendors_menu" | |||
|             name="Registered Vendors" | |||
|             parent="vendors_menu_root" | |||
|             action="res_partner_action_supplier_registered" | |||
|             sequence="1"/> | |||
|     <menuitem | |||
|             id="orders_menu_root" | |||
|             name="Orders" | |||
|             parent="vendor_portal_menu_root" | |||
|             sequence="4"/> | |||
|     <menuitem | |||
|             id="purchase_order_vendor_quotation_menu" | |||
|             name="Request for Quotation" | |||
|             parent="orders_menu_root" | |||
|             action="action_vendor_request_for_quotation" | |||
|             sequence="4"/> | |||
|     <menuitem | |||
|             id="purchase_order_vendor_menu" | |||
|             name="Purchase Orders" | |||
|             parent="orders_menu_root" | |||
|             action="action_vendor_purchase_orders" | |||
|             sequence="4"/> | |||
|     <menuitem | |||
|             id="configuration_vendor_portal_menu" | |||
|             name="Configuration" | |||
|             parent="vendor_portal_menu_root" | |||
|             sequence="5"/> | |||
|     <menuitem | |||
|             id="settings_vendor_portal_menu" | |||
|             name="Settings" | |||
|             parent="configuration_vendor_portal_menu" | |||
|             action="res_config_settings_action_vendor_portal" | |||
|             groups="base.group_system" | |||
|             sequence="1"/> | |||
| </odoo> | |||
| @ -0,0 +1,318 @@ | |||
| <?xml version="1.0" encoding="utf-8" ?> | |||
| <odoo> | |||
|     <!--    Templates for vendor portal--> | |||
|     <template id="portal_my_home_menu_vendor_rfq" | |||
|               name="Portal layout My RFQs" | |||
|               inherit_id="portal.portal_breadcrumbs" priority="25"> | |||
|         <xpath expr="//ol[hasclass('o_portal_submenu')]" position="inside"> | |||
|             <li t-if="page_name == 'vendor_rfq'" | |||
|                 t-attf-class="breadcrumb-item #{'active ' if not vendor_rfq else ''}"> | |||
|                 <a t-if="vendor_my_rfq" | |||
|                    t-attf-href="/my/vendor_rfqs?{{ keep_query() }}">RFQs | |||
|                 </a> | |||
|                 <t t-else=""> | |||
|                     <a href="/my/vendor_rfqs">RFQs</a> | |||
|                 </t> | |||
|             </li> | |||
|             <li t-if="vendor_rfq" class="breadcrumb-item active"> | |||
|                 <t t-esc="vendor_rfq.name"/> | |||
|             </li> | |||
|         </xpath> | |||
|     </template> | |||
|     <template id="portal_my_home_vendor_rfq" name="Show Vendor RFQs" | |||
|               customize_show="True" inherit_id="portal.portal_my_home" | |||
|               priority="25"> | |||
|         <xpath expr="//div[hasclass('o_portal_docs')]" position="inside"> | |||
|             <t t-call="portal.portal_docs_entry"> | |||
|                 <t t-set="title">RFQ's</t> | |||
|                 <t t-set="url" t-value="'/my/vendor_rfqs'"/> | |||
|                 <t t-set="placeholder_count" t-value="'my_rfq_count'"/> | |||
|             </t> | |||
|         </xpath> | |||
|     </template> | |||
|     <template id="portal_my_rfq" name="Portal my RFQ"> | |||
|         <t t-call="portal.portal_layout"> | |||
|             <t t-set="breadcrumbs_searchbar" t-value="True"/> | |||
|             <t t-call="portal.portal_searchbar"/> | |||
|             <t t-if="rfqs" t-call="portal.portal_table"> | |||
|                 <thead> | |||
|                     <tr class="active"> | |||
|                         <th>Reference#</th> | |||
|                         <th></th> | |||
|                         <th>Product</th> | |||
|                         <th>Quantity</th> | |||
|                         <th>Status</th> | |||
|                         <th>Quotation Date</th> | |||
|                         <th>Closing Date</th> | |||
|                     </tr> | |||
|                 </thead> | |||
|                 <tbody> | |||
|                     <t t-foreach="rfqs" t-as="rfq"> | |||
|                         <tr> | |||
|                             <td> | |||
|                                 <a t-attf-href="/my/vendor_rfq/#{rfq.id}"> | |||
|                                     <span t-field="rfq.name"/> | |||
|                                 </a> | |||
|                             </td> | |||
|                             <td/> | |||
|                             <td> | |||
|                                 <span t-field="rfq.sudo().product_id.name"/> | |||
|                             </td> | |||
|                             <td> | |||
|                                 <span t-field="rfq.quantity"/> | |||
|                             </td> | |||
|                             <td> | |||
|                                 <span t-field="rfq.state"/> | |||
|                             </td> | |||
|                             <td> | |||
|                                 <span t-field="rfq.quote_date"/> | |||
|                             </td> | |||
|                             <td> | |||
|                                 <span t-field="rfq.closing_date"/> | |||
|                             </td> | |||
|                         </tr> | |||
|                     </t> | |||
|                 </tbody> | |||
|             </t> | |||
|         </t> | |||
|     </template> | |||
|     <template id="portal_my_vendor_rfq" name="Vendor RFQ"> | |||
|         <t t-call="portal.portal_layout"> | |||
|             <t t-set="o_portal_fullwidth_alert" | |||
|                groups="purchase.group_purchase_manager"> | |||
|                 <t t-call="portal.portal_back_in_edit_mode"> | |||
|                     <t t-set="backend_url" | |||
|                        t-value="'/web#return_label=Website&model=%s&id=%s&' % (vendor_rfq._name, vendor_rfq.id)"/> | |||
|                 </t> | |||
|             </t> | |||
|             <br/> | |||
|             <div class="col-12 alert alert-info" | |||
|                  t-if="vendor_rfq.state == 'in_progress' and quoted_price != 0.0"> | |||
|                 <span> | |||
|                     <t t-esc="request.env['ir.config_parameter'].sudo().get_param('vendor_portal_odoo.quote_submission_msg')"/> | |||
|                 </span> | |||
|             </div> | |||
|             <div class="col-12 alert alert-success" | |||
|                  t-if="vendor_rfq.state == 'done' and vendor_rfq.approved_vendor_id.id == request.env.user.partner_id.id"> | |||
|                 <span> | |||
|                     <t t-esc="request.env['ir.config_parameter'].sudo().get_param('vendor_portal_odoo.quote_accept_msg')"/> | |||
|                 </span> | |||
|             </div> | |||
|             <div class="col-12 alert alert-danger" | |||
|                  t-if="vendor_rfq.state in ['done', 'order'] and vendor_rfq.approved_vendor_id.id != request.env.user.partner_id.id"> | |||
|                 <span> | |||
|                     <t t-esc="request.env['ir.config_parameter'].sudo().get_param('vendor_portal_odoo.quote_not_accept_msg')"/> | |||
|                 </span> | |||
|             </div> | |||
|             <div class="col-12 alert alert-success" | |||
|                  t-if="vendor_rfq.state == 'order' and vendor_rfq.approved_vendor_id.id == request.env.user.partner_id.id"> | |||
|                 <span> | |||
|                     <t t-esc="request.env['ir.config_parameter'].sudo().get_param('vendor_portal_odoo.quote_to_po_msg')"/> | |||
|                 </span> | |||
|             </div> | |||
|             <div class="col-12 alert alert-danger" | |||
|                  t-if="vendor_rfq.state == 'cancel'"> | |||
|                 <span> | |||
|                     <t t-esc="request.env['ir.config_parameter'].sudo().get_param('vendor_portal_odoo.quote_cancel_msg')"/> | |||
|                 </span> | |||
|             </div> | |||
|             <br/> | |||
|             <t t-call="portal.portal_record_layout"> | |||
|                 <t t-set="card_header"> | |||
|                     <div class="row no-gutters"> | |||
|                         <div class="col-12"> | |||
|                             <h5 class="d-flex mb-1 mb-md-0 row"> | |||
|                                 <div class="col-6"> | |||
|                                     <span t-field="vendor_rfq.name" | |||
|                                           class="text-truncate"/> | |||
|                                     <small class="text-muted d-none d-md-inline"/> | |||
|                                 </div> | |||
|                                 <div class="col-4"> | |||
|                                     <button t-if="vendor_rfq.state == 'in_progress' and quoted_price == 0.0" | |||
|                                             type="button" | |||
|                                             class="btn btn-primary float-right" | |||
|                                             data-toggle="modal" | |||
|                                             data-target="#addQuoteModal">Quote | |||
|                                         Your Details | |||
|                                     </button> | |||
|                                 </div> | |||
|                                 <div class="col-2 text-right"> | |||
|                                     <span t-if="vendor_rfq.state == 'in_progress'" | |||
|                                           t-field="vendor_rfq.state" | |||
|                                           class=" badge badge-pill badge-info" | |||
|                                           title="Current stage of this task"/> | |||
|                                     <span t-if="vendor_rfq.state == 'done'" | |||
|                                           t-field="vendor_rfq.state" | |||
|                                           class=" badge badge-pill badge-info" | |||
|                                           title="Current stage of this task"/> | |||
|                                     <span t-if="vendor_rfq.state == 'order'" | |||
|                                           t-field="vendor_rfq.state" | |||
|                                           class=" badge badge-pill badge-info" | |||
|                                           title="Current stage of this task"/> | |||
|                                     <span t-if="vendor_rfq.state == 'cancel'" | |||
|                                           t-field="vendor_rfq.state" | |||
|                                           class=" badge badge-pill badge-info" | |||
|                                           title="Current stage of this task"/> | |||
|                                 </div> | |||
|                             </h5> | |||
|                         </div> | |||
|                     </div> | |||
|                     <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" | |||
|                             integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" | |||
|                             crossorigin="anonymous"/> | |||
|                     <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js" | |||
|                             integrity="sha384-vFJXuSJphROIrBnz7yo7oB41mKfc8JzQZiCq4NCceLEaO4IHwicKwpJf9c9IpFgh" | |||
|                             crossorigin="anonymous"/> | |||
|                     <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" | |||
|                             integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" | |||
|                             crossorigin="anonymous"/> | |||
|                     <div class="modal se-modal" id="addQuoteModal" | |||
|                          tabindex="-1" role="dialog" | |||
|                          aria-labelledby="addTagLabel" aria-hidden="true"> | |||
|                         <div class="modal-dialog se-modal__dialog" | |||
|                              role="document"> | |||
|                             <div class="modal-content se-modal__content"> | |||
|                                 <div class="modal-header"> | |||
|                                     <h5 class="modal-title se-modal__title" | |||
|                                         id="addTagModalLabel">Quote Your Details | |||
|                                     </h5> | |||
|                                     <button type="button" class="close" | |||
|                                             data-dismiss="modal" | |||
|                                             aria-label="Close"> | |||
|                                         <span aria-hidden="false">X</span> | |||
|                                     </button> | |||
|                                 </div> | |||
|                                 <form action="/quote/details" method="post" | |||
|                                       enctype="multipart/form-data"> | |||
|                                     <input type="hidden" name="csrf_token" | |||
|                                            t-att-value="request.csrf_token()"/> | |||
|                                     <input type="hidden" name="rfq_id" | |||
|                                            t-att-value="vendor_rfq.id"/> | |||
|                                     <div class="modal-body"> | |||
|                                         <div class="row px-4"> | |||
|                                             <div class="col-12 col-sm-12 col-md-6 col-lg-6 py-3"> | |||
|                                                 <label class="se-form-label" | |||
|                                                        for="price">Price | |||
|                                                 </label> | |||
|                                                 <input type="text" | |||
|                                                        class="form-control se-form-control" | |||
|                                                        id="price" | |||
|                                                        name="price" | |||
|                                                        required="true"/> | |||
|                                             </div> | |||
|                                             <div class="col-12 col-sm-12 col-md-6 col-lg-6 py-3"> | |||
|                                                 <label class="se-form-label" | |||
|                                                        for="delivery_date"> | |||
|                                                     Delivery Date | |||
|                                                 </label> | |||
|                                                 <input type="date" | |||
|                                                        class="form-control se-form-control" | |||
|                                                        id="delivery_date" | |||
|                                                        name="delivery_date" | |||
|                                                        required="true"/> | |||
|                                             </div> | |||
|                                             <div class="col-12 col-sm-12 col-md-12 col-lg-12 py-3"> | |||
|                                                 <label class="se-form-label" | |||
|                                                        for="tag_name">Additional | |||
|                                                     Note | |||
|                                                 </label> | |||
|                                                 <textarea | |||
|                                                         class="form-control se-form-control" | |||
|                                                         id="additional_note" | |||
|                                                         name="additional_note"/> | |||
|                                             </div> | |||
|                                         </div> | |||
|                                     </div> | |||
|                                     <div class="modal-footer d-flex justify-content-between align-items-center"> | |||
|                                         <input type="submit" | |||
|                                                class="btn btn-primary px-5" | |||
|                                                value="Quote" | |||
|                                                style="border-radius: 5px !important; margin-right: 0 !important; | |||
|                                                                                                     margin-left: auto;" | |||
|                                         /> | |||
|                                     </div> | |||
|                                 </form> | |||
|                             </div> | |||
|                         </div> | |||
|                     </div> | |||
|                 </t> | |||
|                 <t t-set="card_body"> | |||
|                     <div class="row"> | |||
|                         <div class="col-lg-6"> | |||
|                             <div> | |||
|                                 <b>Product:</b> | |||
|                                 <br/> | |||
|                                 <img class="mt-1 img-rounded" | |||
|                                      t-att-src="image_data_uri(vendor_rfq.product_id.sudo().product_tmpl_id.image_128)" | |||
|                                      alt="Product" width="50px" height="50px"/> | |||
|                                 <span t-field="vendor_rfq.product_id.sudo().name"/> | |||
|                             </div> | |||
|                             <br/> | |||
|                             <div> | |||
|                                 <b>Quote Date:</b> | |||
|                                 <span t-field="vendor_rfq.quote_date" | |||
|                                       t-options="{'widget': 'date'}"/> | |||
|                             </div> | |||
|                             <br/> | |||
|                             <div> | |||
|                                 <b>Estimated Quote:</b> | |||
|                                 <span t-field="vendor_rfq.estimated_quote"/> | |||
|                                 <strong>/</strong> | |||
|                                 <span t-field="vendor_rfq.product_id.sudo().uom_id.name"/> | |||
|                             </div> | |||
|                             <br/> | |||
|                             <div> | |||
|                                 <b>Estimated Delivery Date:</b> | |||
|                                 <span t-field="vendor_rfq.estimated_delivery_date"/> | |||
|                             </div> | |||
|                             <br/> | |||
|                             <div t-if="vendor_rfq.notes"> | |||
|                                 <strong>Note :</strong> | |||
|                                 <br/> | |||
|                                 <span t-field="rfqObj.notes"/> | |||
|                             </div> | |||
|                         </div> | |||
|                         <div class="col-lg-6"> | |||
|                             <div> | |||
|                                 <b>Quantity:</b> | |||
|                                 <span t-field="vendor_rfq.quantity"/> | |||
|                             </div> | |||
| 
 | |||
|                             <br/> | |||
|                             <div> | |||
|                                 <strong>Closing Date:</strong> | |||
|                                 <span t-esc="vendor_rfq.closing_date"/> | |||
|                             </div> | |||
|                             <t t-if="quoted_price"> | |||
|                                 <br/> | |||
|                                 <div> | |||
|                                     <b>My Quoted Price :</b> | |||
|                                     <t t-esc="quoted_price" | |||
|                                        t-options="{"widget": "monetary", | |||
|                                                             "display_currency": vendor_rfq.currency_id}"/> | |||
|                                     <strong>/</strong> | |||
|                                     <span t-field="vendor_rfq.product_id.sudo().uom_id.name"/> | |||
|                                 </div> | |||
|                             </t> | |||
|                             <t t-if="vendor_quote.estimate_date"> | |||
|                                 <br/> | |||
|                                 <div> | |||
|                                     <b>My Estimate Delivery Date :</b> | |||
|                                     <t t-esc="vendor_quote.estimate_date"/> | |||
|                                 </div> | |||
|                             </t> | |||
|                             <t t-if="vendor_quote.note"> | |||
|                                 <br/> | |||
|                                 <div> | |||
|                                     <strong>My Note:</strong> | |||
|                                     <br/> | |||
|                                     <span t-field="vendor_quote.note"/> | |||
|                                 </div> | |||
|                             </t> | |||
|                         </div> | |||
|                     </div> | |||
|                 </t> | |||
|             </t> | |||
|         </t> | |||
|     </template> | |||
| </odoo> | |||
| @ -0,0 +1,116 @@ | |||
| <?xml version="1.0" encoding="utf-8" ?> | |||
| <odoo> | |||
|     <!--    Configuration settings form view inherited--> | |||
|     <record id="res_config_settings_view_form" model="ir.ui.view"> | |||
|         <field name="name"> | |||
|             res.config.settings.view.form.inherit.vendor.portal.odoo | |||
|         </field> | |||
|         <field name="model">res.config.settings</field> | |||
|         <field name="priority" eval="15"/> | |||
|         <field name="inherit_id" ref="base.res_config_settings_view_form"/> | |||
|         <field name="arch" type="xml"> | |||
|             <xpath expr="//div[hasclass('settings')]" position="inside"> | |||
|                 <div class="app_settings_block" data-string="Vendor RFQ" | |||
|                      string="Vendor RFQ" data-key="vendor_portal_odoo"> | |||
|                     <h2>Vendor RFQ</h2> | |||
|                     <div class="row mt16 o_settings_container"> | |||
|                         <div class="col-xs-12 col-md-6 o_setting_box"> | |||
|                             <div class="o_setting_left_pane"/> | |||
|                             <div class="o_setting_right_pane"> | |||
|                                 <div class="text-muted"> | |||
|                                     Set RFQs as done based on: | |||
|                                 </div> | |||
|                                 <div class="content-group"> | |||
|                                     <div class="mt16"> | |||
|                                         <field name="rfq_done_based_on" | |||
|                                                class="o_light_label" | |||
|                                                widget="radio" | |||
|                                                options="{'horizontal': true}"/> | |||
|                                     </div> | |||
|                                 </div> | |||
|                             </div> | |||
|                         </div> | |||
|                     </div> | |||
|                     <h2>Vendor RFQs Status Message</h2> | |||
|                     <p class="text-muted" | |||
|                        style="margin-left:5%; margin-top:2%;"> | |||
|                         Message to be displayed based on the status of Vendor | |||
|                         RFQ | |||
|                     </p> | |||
|                     <div class="row mt16 o_settings_container" id="vendor_msg"> | |||
|                         <div class="col-xs-12 col-md-12 o_setting_box"> | |||
|                             <div class="o_setting_left_pane"/> | |||
|                             <div class="o_setting_right_pane"> | |||
|                                 <div class="content-group"> | |||
|                                     <div class="mt16"> | |||
|                                         <field name="quote_submission_msg" | |||
|                                                class="o_light_label" | |||
|                                                placeholder="Thanks! Received your quote."/> | |||
|                                     </div> | |||
|                                 </div> | |||
|                             </div> | |||
|                         </div> | |||
|                         <div class="col-xs-12 col-md-12 o_setting_box"> | |||
|                             <div class="o_setting_left_pane"/> | |||
|                             <div class="o_setting_right_pane"> | |||
|                                 <div class="content-group"> | |||
|                                     <div class="mt16"> | |||
|                                         <field name="quote_accept_msg" | |||
|                                                class="o_light_label" | |||
|                                                placeholder="Congratulations! Your quote has been accepted."/> | |||
|                                     </div> | |||
|                                 </div> | |||
|                             </div> | |||
|                         </div> | |||
|                         <div class="col-xs-12 col-md-12 o_setting_box"> | |||
|                             <div class="o_setting_left_pane"/> | |||
|                             <div class="o_setting_right_pane"> | |||
|                                 <div class="content-group"> | |||
|                                     <div class="mt16"> | |||
|                                         <field name="quote_not_accept_msg" | |||
|                                                class="o_light_label" | |||
|                                                placeholder="We apologise that your quote was rejected."/> | |||
|                                     </div> | |||
|                                 </div> | |||
|                             </div> | |||
|                         </div> | |||
|                         <div class="col-xs-12 col-md-12 o_setting_box"> | |||
|                             <div class="o_setting_left_pane"/> | |||
|                             <div class="o_setting_right_pane"> | |||
|                                 <div class="content-group"> | |||
|                                     <div class="mt16"> | |||
|                                         <field name="quote_to_po_msg" | |||
|                                                class="o_light_label" | |||
|                                                placeholder="Congrats! For this RFQ, a Purchase Order has been made."/> | |||
|                                     </div> | |||
|                                 </div> | |||
|                             </div> | |||
|                         </div> | |||
|                         <div class="col-xs-12 col-md-12 o_setting_box"> | |||
|                             <div class="o_setting_left_pane"/> | |||
|                             <div class="o_setting_right_pane"> | |||
|                                 <div class="content-group"> | |||
|                                     <div class="mt16"> | |||
|                                         <field name="quote_cancel_msg" | |||
|                                                class="o_light_label" | |||
|                                                placeholder="Sorry! This RFQ has been cancelled."/> | |||
|                                     </div> | |||
|                                 </div> | |||
|                             </div> | |||
|                         </div> | |||
|                     </div> | |||
|                 </div> | |||
|             </xpath> | |||
|         </field> | |||
|     </record> | |||
|     <!--    Action for Settings--> | |||
|     <record id="res_config_settings_action_vendor_portal" | |||
|             model="ir.actions.act_window"> | |||
|         <field name="name">Settings</field> | |||
|         <field name="type">ir.actions.act_window</field> | |||
|         <field name="res_model">res.config.settings</field> | |||
|         <field name="view_mode">form</field> | |||
|         <field name="target">inline</field> | |||
|         <field name="context">{'module' : 'vendor_portal_odoo'}</field> | |||
|     </record> | |||
| </odoo> | |||
| @ -0,0 +1,62 @@ | |||
| <?xml version="1.0" encoding="utf-8" ?> | |||
| <odoo> | |||
|     <!--    Partner inherited search view--> | |||
|     <record id="view_res_partner_filter" model="ir.ui.view"> | |||
|         <field name="name">res.partner.view.filter.inherit.vendor.portal.odoo | |||
|         </field> | |||
|         <field name="model">res.partner</field> | |||
|         <field name="inherit_id" ref="base.view_res_partner_filter"/> | |||
|         <field name="arch" type="xml"> | |||
|             <xpath expr="//filter[@name='type_company']" position="after"> | |||
|                 <filter string="Registered Vendors" name="is_registered" | |||
|                         domain="[('is_registered','=', True)]"/> | |||
|             </xpath> | |||
|         </field> | |||
|     </record> | |||
|     <!--    Action for Create a new vendor--> | |||
|     <record id="res_partner_action_supplier_registered" | |||
|             model="ir.actions.act_window"> | |||
|         <field name="name">Registered Vendors</field> | |||
|         <field name="type">ir.actions.act_window</field> | |||
|         <field name="res_model">res.partner</field> | |||
|         <field name="view_mode">kanban,tree,form</field> | |||
|         <field name="context">{'search_default_is_registered': True}</field> | |||
|         <field name="help" type="html"> | |||
|             <p class="o_view_nocontent_smiling_face"> | |||
|                 Create a new vendor | |||
|             </p> | |||
|             <p> | |||
|                 Odoo helps you easily track all activities related to a | |||
|                 registered vendor. | |||
|             </p> | |||
|         </field> | |||
|     </record> | |||
|     <!--    Inherited res partner for adding smart buttons--> | |||
|     <record id="view_partner_form" model="ir.ui.view"> | |||
|         <field name="name">res.partner.view.form.inherit.vendor.portal.odoo | |||
|         </field> | |||
|         <field name="model">res.partner</field> | |||
|         <field name="inherit_id" ref="base.view_partner_form"/> | |||
|         <field name="priority" eval="9"/> | |||
|         <field name="arch" type="xml"> | |||
|             <div name="button_box" position="inside"> | |||
|                 <field name="is_registered" invisible="1"/> | |||
|                 <button class="oe_stat_button" | |||
|                         name="%(vendor_portal_odoo.register_vendor_action)d" | |||
|                         type="action" | |||
|                         icon="fa-user-plus" | |||
|                         attrs="{'invisible': [('supplier_rank','=',0)]}"> | |||
|                     <field name="supplier_rank" invisible="1"/> | |||
|                     <span class="o_stat_text" | |||
|                           attrs="{'invisible': [('is_registered', '=', True)]}"> | |||
|                         Make Portal User | |||
|                     </span> | |||
|                     <span class="o_stat_text" | |||
|                           attrs="{'invisible': [('is_registered', '=', False)]}"> | |||
|                         Registered | |||
|                     </span> | |||
|                 </button> | |||
|             </div> | |||
|         </field> | |||
|     </record> | |||
| </odoo> | |||
| @ -0,0 +1,176 @@ | |||
| <?xml version="1.0" encoding="utf-8" ?> | |||
| <odoo> | |||
|     <!--    Vendor RFQ form view--> | |||
|     <record id="vendor_rfq_view_form" model="ir.ui.view"> | |||
|         <field name="name">vendor.rfq.view.form</field> | |||
|         <field name="model">vendor.rfq</field> | |||
|         <field name="arch" type="xml"> | |||
|             <form string="Vendor RFQ"> | |||
|                 <header> | |||
|                     <button name="action_send_by_mail" type="object" | |||
|                             data-hotkey="shift+g" | |||
|                             string="Send Invitation Mail" class="oe_highlight" | |||
|                             attrs="{'invisible': [('state', 'in', ['in_progress', 'pending', 'done', 'cancel', 'order'])]}"/> | |||
|                     <button name="action_pending" type="object" | |||
|                             string="Set to Pending" data-hotkey="shift+v" | |||
|                             attrs="{'invisible': [('state', 'in', ['pending', 'in_progress', 'done', 'cancel', 'order'])]}"/> | |||
|                     <button name="action_done" type="object" | |||
|                             class="oe_highlight" | |||
|                             string="Mark as Done" data-hotkey="shift+j" | |||
|                             attrs="{'invisible': [('state', 'in', ['draft', 'done', 'cancel', 'order'])]}"/> | |||
|                     <button name="action_cancel" type="object" | |||
|                             string="Cancel" data-hotkey="shift+j" | |||
|                             attrs="{'invisible': [('state', 'in', ['done', 'cancel', 'order'])]}"/> | |||
|                     <button name="action_create_quotation" type="object" | |||
|                             class="oe_highlight" | |||
|                             string="Create RFQ" data-hotkey="shift+j" | |||
|                             attrs="{'invisible': [('state', 'not in', ['done'])]}"/> | |||
|                     <field name="state" widget="statusbar" | |||
|                            statusbar_visible="draft,in_progress,done"/> | |||
|                 </header> | |||
|                 <sheet> | |||
|                     <div class="oe_button_box" name="button_box"> | |||
|                         <button name="action_get_purchase_order" | |||
|                                 string="Purchase Order" | |||
|                                 type="object" | |||
|                                 class="oe_stat_button" | |||
|                                 icon="fa-credit-card" | |||
|                                 attrs="{'invisible': [('purchase_order_id','=', False)]}"> | |||
|                         </button> | |||
|                         <field name="purchase_order_id" invisible="1"/> | |||
|                     </div> | |||
|                     <div class="oe_title"> | |||
|                         <h1> | |||
|                             <field name="name" readonly="1"/> | |||
|                         </h1> | |||
|                     </div> | |||
|                     <group name="rfq_header"> | |||
|                         <group name="order_details"> | |||
|                             <field name="product_id"/> | |||
|                             <field name="quantity"/> | |||
|                             <field name="estimated_quote"/> | |||
|                             <field name="currency_id" invisible="1"/> | |||
|                             <field name="company_id" invisible="1"/> | |||
|                             <field name="vendor_ids" widget="many2many_tags"/> | |||
|                         </group> | |||
|                         <group> | |||
|                             <field name="quote_date"/> | |||
|                             <field name="closing_date"/> | |||
|                             <field name="estimated_delivery_date"/> | |||
|                             <field name="approved_vendor_id" | |||
|                                    attrs="{'invisible': [('state', 'not in', ('done', 'order'))]}" | |||
|                                    readonly="1"/> | |||
|                         </group> | |||
|                     </group> | |||
|                     <notebook> | |||
|                         <page string="Vendor Quote Details"> | |||
|                             <field name="vendor_quote_history_ids"> | |||
|                                 <tree editable="bottom"> | |||
|                                     <field name="vendor_id"/> | |||
|                                     <field name="quoted_price"/> | |||
|                                     <field name="currency_id" invisible="1"/> | |||
|                                     <field name="estimate_date"/> | |||
|                                     <field name="note"/> | |||
|                                 </tree> | |||
|                             </field> | |||
|                         </page> | |||
|                     </notebook> | |||
|                 </sheet> | |||
|                 <div class="oe_chatter"> | |||
|                     <field name="message_follower_ids"/> | |||
|                     <field name="activity_ids"/> | |||
|                     <field name="message_ids"/> | |||
|                 </div> | |||
|             </form> | |||
|         </field> | |||
|     </record> | |||
|     <!--    Tree view of vendor rfq--> | |||
|     <record id="vendor_rfq_view_tree" model="ir.ui.view"> | |||
|         <field name="name">vendor.rfq.view.tree</field> | |||
|         <field name="model">vendor.rfq</field> | |||
|         <field name="priority">4</field> | |||
|         <field name="arch" type="xml"> | |||
|             <tree string="Vendor RFQ" sample="1" | |||
|                   decoration-success="state == 'done'" | |||
|                   decoration-info="state == 'in_progress'" | |||
|                   decoration-muted="state == 'cancel'" | |||
|                   decoration-warning="state == 'pending'"> | |||
|                 <field name="name" string="RFQ Reference"/> | |||
|                 <field name="product_id"/> | |||
|                 <field name="quantity"/> | |||
|                 <field name="estimated_quote" widget="monetary" | |||
|                        options="{'currency_field': 'currency_id'}"/> | |||
|                 <field name="currency_id" invisible="1"/> | |||
|                 <field name="estimated_delivery_date"/> | |||
|                 <field name="closing_date"/> | |||
|                 <field name="vendor_ids" widget="many2many_tags"/> | |||
|                 <field name="state"/> | |||
|             </tree> | |||
|         </field> | |||
|     </record> | |||
|     <!--    Action for vendor rfq--> | |||
|     <record id="vendor_rfq_action" model="ir.actions.act_window"> | |||
|         <field name="name">Vendor Quotations</field> | |||
|         <field name="type">ir.actions.act_window</field> | |||
|         <field name="res_model">vendor.rfq</field> | |||
|         <field name="view_mode">tree,form</field> | |||
|         <field name="help" type="html"> | |||
|             <p class="o_view_nocontent_smiling_face"> | |||
|                 Create new vendor quotations | |||
|             </p> | |||
|         </field> | |||
|     </record> | |||
|     <!--    Action In Progress state--> | |||
|     <record id="vendor_rfq__action_progress" model="ir.actions.act_window"> | |||
|         <field name="name">In Progress</field> | |||
|         <field name="type">ir.actions.act_window</field> | |||
|         <field name="res_model">vendor.rfq</field> | |||
|         <field name="view_mode">tree,form</field> | |||
|         <field name="domain">[('state','=','in_progress')]</field> | |||
|         <field name="help" type="html"> | |||
|             <p class="o_view_nocontent_smiling_face"> | |||
|                 Create new vendor quotations | |||
|             </p> | |||
|         </field> | |||
|     </record> | |||
|     <!--    Action Done state--> | |||
|     <record id="vendor_rfq_action_done" model="ir.actions.act_window"> | |||
|         <field name="name">Done</field> | |||
|         <field name="type">ir.actions.act_window</field> | |||
|         <field name="res_model">vendor.rfq</field> | |||
|         <field name="view_mode">tree,form</field> | |||
|         <field name="domain">[('state','=','done')]</field> | |||
|         <field name="help" type="html"> | |||
|             <p class="o_view_nocontent_smiling_face"> | |||
|                 Create new vendor quotations | |||
|             </p> | |||
|         </field> | |||
|     </record> | |||
|     <!--    Action for Request for Quotation state--> | |||
|     <record id="action_vendor_request_for_quotation" | |||
|             model="ir.actions.act_window"> | |||
|         <field name="name">Request for Quotation</field> | |||
|         <field name="type">ir.actions.act_window</field> | |||
|         <field name="res_model">purchase.order</field> | |||
|         <field name="view_mode">tree,form</field> | |||
|         <field name="domain">[('state','in', ['draft', 'sent'])]</field> | |||
|         <field name="help" type="html"> | |||
|             <p class="o_view_nocontent_smiling_face"> | |||
|                 Create a new Request for quotation | |||
|             </p> | |||
|         </field> | |||
|     </record> | |||
|     <!--    Creating Purchase Order--> | |||
|     <record id="action_vendor_purchase_orders" model="ir.actions.act_window"> | |||
|         <field name="name">Purchase Order</field> | |||
|         <field name="type">ir.actions.act_window</field> | |||
|         <field name="res_model">purchase.order</field> | |||
|         <field name="view_mode">tree,form</field> | |||
|         <field name="domain">[('state','in', ['purchase', 'done'])]</field> | |||
|         <field name="help" type="html"> | |||
|             <p class="o_view_nocontent_smiling_face"> | |||
|                 Create a new Purchase order | |||
|             </p> | |||
|         </field> | |||
|     </record> | |||
| </odoo> | |||
| @ -0,0 +1,23 @@ | |||
| # -*- coding: utf-8 -*- | |||
| ################################################################################ | |||
| # | |||
| #    Cybrosys Technologies Pvt. Ltd. | |||
| # | |||
| #    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |||
| #    Author: Ammu Raj (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 register_vendor | |||
| from . import rfq_done | |||
| @ -0,0 +1,84 @@ | |||
| # -*- coding: utf-8 -*- | |||
| ################################################################################ | |||
| # | |||
| #    Cybrosys Technologies Pvt. Ltd. | |||
| # | |||
| #    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |||
| #    Author: Ammu Raj (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 odoo import fields, models, _ | |||
| from odoo.exceptions import ValidationError | |||
| from odoo.tools import email_normalize | |||
| 
 | |||
| 
 | |||
| class RegisterVendor(models.TransientModel): | |||
|     """For Registration of Vendors""" | |||
|     _name = 'register.vendor' | |||
|     _description = 'Register Vendors' | |||
| 
 | |||
|     def default_is_registered(self): | |||
|         """Default value for is registered""" | |||
|         if self.env.context.get('active_model') == 'res.partner': | |||
|             if self.env['res.users'].search([( | |||
|                     'partner_id', '=', self.env.context.get('active_id'))]): | |||
|                 return True | |||
|         return False | |||
| 
 | |||
|     is_registered = fields.Boolean(string='Registered', | |||
|                                    default=default_is_registered, readonly=1, | |||
|                                    help='Checking whether the partner' | |||
|                                         'registered or not') | |||
| 
 | |||
|     def action_create_user_portal(self): | |||
|         """Creating the portal user""" | |||
|         if self.env.context.get('active_model') == 'res.partner': | |||
|             partner = self.env['res.partner'].browse( | |||
|                 self.env.context.get('active_id')) | |||
|             if not partner.email: | |||
|                 raise ValidationError(_("Provide Email For Vendor")) | |||
|             user = self.env['res.users'].with_context( | |||
|                 no_reset_password=True).sudo()._create_user_from_template({ | |||
|                 'email': email_normalize(partner.email), | |||
|                 'login': email_normalize(partner.email), | |||
|                 'partner_id': partner.id, | |||
|                 'company_id': self.env.company.id, | |||
|                 'company_ids': [(6, 0, self.env.company.ids)], | |||
|                 'active': True | |||
|             }) | |||
|             self._send_email(user) | |||
|             partner.sudo().write({'is_registered': True}) | |||
| 
 | |||
|     def _send_email(self, user): | |||
|         """Send notification email to a new portal user""" | |||
|         self.ensure_one() | |||
|         return { | |||
|             'name': _('Portal Access Management'), | |||
|             'type': 'ir.actions.act_window', | |||
|             'res_model': 'portal.wizard', | |||
|             'view_type': 'form', | |||
|             'view_mode': 'form', | |||
|             'res_id': self.id, | |||
|             'target': 'new', | |||
|         } | |||
| 
 | |||
|     def action_send_password_reset_portal(self): | |||
|         """Send password reset email""" | |||
|         if self.env.context.get('active_model') == 'res.partner': | |||
|             partner = self.env['res.partner'].browse( | |||
|                 self.env.context.get('active_id')) | |||
|             user = self.env['res.users'].search([ | |||
|                 ('partner_id', '=', partner.id)]) | |||
|             user.action_reset_password() | |||
| @ -0,0 +1,42 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <odoo> | |||
|     <!--    Register vendor views --> | |||
|     <record id="register_vendor_view_form" model="ir.ui.view"> | |||
|         <field name="name">register.vendor.view.form</field> | |||
|         <field name="model">register.vendor</field> | |||
|         <field name="arch" type="xml"> | |||
|             <form string="Vendor Portal Account"> | |||
|                 <field name="is_registered" invisible="1"/> | |||
|                 <div class="text-muted" | |||
|                      attrs="{'invisible': [('is_registered', '=', False)]}"> | |||
|                     An account is already registered for this vendor, | |||
|                     vendor will receive a Password reset instruction. | |||
|                 </div> | |||
|                 <div class="text-muted" | |||
|                      attrs="{'invisible': [('is_registered', '=', True)]}"> | |||
|                     A portal user is created for this vendor, | |||
|                     vendor will receive a Signup Invitation. | |||
|                 </div> | |||
|                 <footer> | |||
|                     <button name="action_create_user_portal" type="object" | |||
|                             string="Send Vendor Login/Signup Invitation " | |||
|                             class="oe_highlight" data-hotkey="q" | |||
|                             attrs="{'invisible': [('is_registered', '=', True)]}"/> | |||
|                     <button name="action_send_password_reset_portal" type="object" | |||
|                             string="Send Reset Password Instruction" | |||
|                             class="oe_highlight" data-hotkey="w" | |||
|                             attrs="{'invisible': [('is_registered', '=', False)]}"/> | |||
|                     <button special="cancel" data-hotkey="z" string="Cancel"/> | |||
|                 </footer> | |||
|             </form> | |||
|         </field> | |||
|     </record> | |||
|     <!--    Action for register vendor--> | |||
|     <record id="register_vendor_action" model="ir.actions.act_window"> | |||
|         <field name="name">Vendor Portal Account</field> | |||
|         <field name="res_model">register.vendor</field> | |||
|         <field name="view_mode">form</field> | |||
|         <field name="target">new</field> | |||
|         <field name="view_id" ref="register_vendor_view_form"/> | |||
|     </record> | |||
| </odoo> | |||
| @ -0,0 +1,72 @@ | |||
| # -*- coding: utf-8 -*- | |||
| ################################################################################ | |||
| # | |||
| #    Cybrosys Technologies Pvt. Ltd. | |||
| # | |||
| #    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |||
| #    Author: Ammu Raj (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 odoo import fields, models | |||
| 
 | |||
| 
 | |||
| class RfqDone(models.TransientModel): | |||
|     """Done the Quotation""" | |||
|     _name = 'rfq.done' | |||
|     _description = 'Done RFQs' | |||
| 
 | |||
|     def _domain_history(self): | |||
|         """Domain for vendor_id""" | |||
|         return [('quote_id', '=', self.env.context.get('active_id'))] | |||
| 
 | |||
|     vendor_id = fields.Many2one('vendor.quote.history', string='Vendor', | |||
|                                 domain=_domain_history, help='The history of' | |||
|                                                              'vendor quote') | |||
|     quoted_price = fields.Monetary(currency_field='currency_id', | |||
|                                    related='vendor_id.quoted_price', | |||
|                                    string='Quoted Price', | |||
|                                    help='Mention the price of the quote') | |||
|     currency_id = fields.Many2one('res.currency', string='Currency', | |||
|                                   required=True, | |||
|                                   default=lambda | |||
|                                       self: self.env.user.company_id.currency_id, | |||
|                                   related='vendor_id.currency_id', | |||
|                                   help='Current users currency') | |||
|     estimate_date = fields.Date(related='vendor_id.estimate_date', | |||
|                                 string='Estimate Date', | |||
|                                 help='The estimated date of quote') | |||
| 
 | |||
|     def action_done(self): | |||
|         """Marking the RFQ as done""" | |||
|         rfq = self.env['vendor.rfq'].browse(self._context.get('active_id')) | |||
|         template_id = self.env.ref( | |||
|             'vendor_portal_odoo.email_template_vendor_rfq_mark_done').id | |||
|         context = { | |||
|             'name': self.vendor_id.vendor_id.name, | |||
|             'lang': self.vendor_id.vendor_id.lang, | |||
|             'price': self.vendor_id.quoted_price, | |||
|             'delivery_date': self.vendor_id.estimate_date, | |||
|             'currency_id': self.vendor_id.currency_id, | |||
|             'partner_to': self.vendor_id.id, | |||
|         } | |||
|         email_values = { | |||
|             'email_to': self.vendor_id.vendor_id.email, | |||
|             'email_from': self.env.user.partner_id.email, | |||
|         } | |||
|         self.env['mail.template'].browse(template_id).with_context( | |||
|             context).send_mail(self.vendor_id.quote_id.id, | |||
|                                email_values=email_values) | |||
|         rfq.write({'approved_vendor_id': self.vendor_id.vendor_id.id, | |||
|             'state': 'done'}) | |||
| @ -0,0 +1,35 @@ | |||
| <?xml version="1.0" encoding="UTF-8" ?> | |||
| <odoo> | |||
|     <!--    RFQ Done views--> | |||
|     <record id="rfq_done_view_form" model="ir.ui.view"> | |||
|         <field name="name">mark.done.view.form</field> | |||
|         <field name="model">rfq.done</field> | |||
|         <field name="arch" type="xml"> | |||
|             <form string="Mark as Done"> | |||
|                 <group> | |||
|                     <group> | |||
|                         <field name="vendor_id"/> | |||
|                     </group> | |||
|                     <group> | |||
|                         <field name="quoted_price"/> | |||
|                         <field name="estimate_date"/> | |||
|                     </group> | |||
|                 </group> | |||
|                 <footer> | |||
|                     <button name="action_done" type="object" | |||
|                             string="Mark as Done" class="oe_highlight" | |||
|                             data-hotkey="q"/> | |||
|                     <button special="cancel" data-hotkey="z" string="Cancel"/> | |||
|                 </footer> | |||
|             </form> | |||
|         </field> | |||
|     </record> | |||
|     <!--    Action for rfq done--> | |||
|     <record id="rfq_done_action" model="ir.actions.act_window"> | |||
|         <field name="name">Mark as Done</field> | |||
|         <field name="res_model">rfq.done</field> | |||
|         <field name="view_mode">form</field> | |||
|         <field name="target">new</field> | |||
|         <field name="view_id" ref="rfq_done_view_form"/> | |||
|     </record> | |||
| </odoo> | |||