Add odex25_sales

This commit is contained in:
expert 2024-06-24 14:22:34 +03:00
parent 3a3f834c54
commit 33040c7384
923 changed files with 104209 additions and 1 deletions

View File

@ -1,2 +1,2 @@
# odex25-standard-moduless # odex25-standard-modules
This Repo contains general standard modules for all projects. This Repo contains general standard modules for all projects.

View File

@ -0,0 +1,28 @@
Odoo Proprietary License v1.0
This software and associated files (the "Software") may only be used (executed,
modified, executed after modifications) if you have purchased a valid license
from the authors, typically via Odoo Apps, or if you have received a written
agreement from the authors of the Software (see the COPYRIGHT file).
You may develop Odoo modules that use the Software as a library (typically
by depending on it, importing it and using its resources), but without copying
any source code or material from the Software. You may distribute those
modules under the license of your choice, provided that this license is
compatible with the terms of the Odoo Proprietary License (For example:
LGPL, MIT, or proprietary licenses similar to this one).
It is forbidden to publish, distribute, sublicense, or sell copies of the Software
or modified copies of the Software.
The above copyright notice and this permission notice must be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

View File

@ -0,0 +1,5 @@
# -*- coding: utf-8 -*-
# Part of BrowseInfo. See LICENSE file for full copyright and licensing details.
from . import models
from . import wizard

View File

@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
# Part of BrowseInfo. See LICENSE file for full copyright and licensing details.
{
"name" : "Multi Product Selection in Sales & Purchase",
"version" : "14.0.0.0",
"category" : "Odex25-Sales/Odex25-Sales",
"summary": 'Multiple product selection sales multi products selection purchase select multiple products on delivery order line add multiple products invoice line sales order add multi products purchase order multi product selection sales and purchase multiple products',
"description": """
Multi Product Selection Odoo App helps users to select multiple product in sales order line, purchase order line, delivery order line and an invoice line. User can add multiple product in order line with single click and only in draft stage.
""",
"author": "BrowseInfo",
"website" : "https://www.browseinfo.com",
"depends" : ['base','sale_management','purchase','stock'],
"data": [
'security/ir.model.access.csv',
'views/sale_order_view.xml',
'views/purchase_order_view.xml',
'views/account_move_view.xml',
'views/stock_picking_view.xml',
'wizard/purchase_order_wizard_view.xml',
'wizard/sale_order_wizard_view.xml',
'wizard/account_move_wizard_view.xml',
'wizard/stock_picking_view.xml',
],
'license':'OPL-1',
'installable': True,
'auto_install': False,
'live_test_url':'https://youtu.be/9_ccgoFoTBs',
"images":['static/description/Multi-Product-Selection.gif'],
}

View File

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
# Part of BrowseInfo. See LICENSE file for full copyright and licensing details.
from . import multi_product_selection

View File

@ -0,0 +1,86 @@
from odoo import _, api, fields, models
class SaleOder(models.Model):
_inherit = 'sale.order'
product_ids = fields.Many2many('product.product',string="Select Product", required=True)
partner_id = fields.Many2one(string='Customer', comodel_name='res.partner', ondelete='restrict',required=True)
def sale_order_select_prodcut(self):
wizard = self.env['sale.order.wizard'].create({
'product_ids': self.product_ids.name })
return {
'name': _('Select Product'),
'type': 'ir.actions.act_window',
'res_model': 'sale.order.wizard',
'view_mode': 'form',
'res_id': wizard.id,
'target': 'new',
'context': {'default_active_id': self.id},
}
class PurhcaseOrder(models.Model):
_inherit = 'purchase.order'
product_ids = fields.Many2many('product.product',string="Select Product",required=True)
partner_id = fields.Many2one(string='Customer', comodel_name='res.partner', ondelete='restrict')
def purchase_order_select_prodcut(self):
wizard = self.env['purchase.order.wizard'].create({
'product_ids': self.product_ids.name })
return {
'name': _('Select Product'),
'type': 'ir.actions.act_window',
'res_model': 'purchase.order.wizard',
'view_mode': 'form',
'res_id': wizard.id,
'target': 'new'
}
class AccountMove(models.Model):
_inherit = 'account.move'
product_ids = fields.Many2many('product.product',string="Select Product",required=True)
partner_id = fields.Many2one(string='Customer', comodel_name='res.partner', ondelete='restrict')
def invoice_select_prodcut(self):
wizard = self.env['account.move.wizard'].create({
'product_ids': self.product_ids.name })
return {
'name': _('Select Product'),
'type': 'ir.actions.act_window',
'res_model': 'account.move.wizard',
'view_mode': 'form',
'res_id': wizard.id,
'target': 'new'
}
class StockPicking(models.Model):
_inherit = 'stock.picking'
product_ids = fields.Many2many('product.product',string="Select Product", required=True)
partner_id = fields.Many2one(string='Customer', comodel_name='res.partner', ondelete='restrict',required=True)
def stock_picking_select_prodcut(self):
wizard = self.env['stock.picking.wizard'].create({
'product_ids': self.product_ids.name })
return {
'name': _('Select Product'),
'type': 'ir.actions.act_window',
'res_model': 'stock.picking.wizard',
'view_mode': 'form',
'res_id': wizard.id,
'target': 'new',
'context': {'default_active_id': self.id},
}

View File

@ -0,0 +1,5 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_sale_order_wizard,access_sale_order_wizard,model_sale_order_wizard,base.group_user,1,1,1,1
access_purchase_order_wizard,access_purchase_order_wizard,model_purchase_order_wizard,base.group_user,1,1,1,1
access_account_move_wizard,access_account_move_wizard,model_account_move_wizard,base.group_user,1,1,1,1
access_stock_picking_wizard,access_stock_picking_wizard,model_stock_picking_wizard,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_sale_order_wizard access_sale_order_wizard model_sale_order_wizard base.group_user 1 1 1 1
3 access_purchase_order_wizard access_purchase_order_wizard model_purchase_order_wizard base.group_user 1 1 1 1
4 access_account_move_wizard access_account_move_wizard model_account_move_wizard base.group_user 1 1 1 1
5 access_stock_picking_wizard access_stock_picking_wizard model_stock_picking_wizard base.group_user 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 445 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -0,0 +1,375 @@
<section class="oe_container lead mt64">
<div>
<div class="col-md-12 mt16" style="padding:0;">
<div class="col-md-12" style="padding:0;">
<div class="panel-group mb0 mt0" role="tablist" id="priceAccordeon" style="padding:0;">
<div class="panel-heading mb0 mt0 collapsed" role="tab" data-toggle="collapse" data-parent="#priceAccordeon" data-target="#priceAccordeon_area" aria-expanded="false" style="margin-left:0;padding:0 0 2px 0;text-align:right;">
<strong>
<div style="background-color:#875A7B;color:white;padding:5px;margin-bottom:3px;text-align:center;border-radius:5px;white-space:nowrap;display: inline-block;">
<strong style="color:white;">
Supported :
</strong>
</div>
<div style="background-color:#875A7B;color:white;padding:5px;margin-bottom:3px;text-align:center;border-radius:5px;white-space:nowrap;display: inline-block;">
<strong style="color:white;" title="The tool is compatible with the Odoo Enterprise version">
<i class="fa fa-check" style="margin-left:4px;"> </i>
Enterprise
</strong>
</div>
<div style="background-color:#875A7B;padding:5px;margin-top:3px;text-align:center;border-radius:5px;white-space:nowrap;display: inline-block;">
<strong style="color:white;" title="The tool is compatible with the Odoo Community version">
<i class="fa fa-check" style="margin-left:4px;"> </i>
Community
</strong>
</div>
<div style="background-color:#875A7B;color:white;padding:5px;margin-bottom:3px;text-align:center;border-radius:5px;white-space:nowrap;display: inline-block;">
<strong style="color:white;" title="The tool might be installed to Odoo.sh if you have a linked private git repository">
<i class="fa fa-check" style="margin-left:4px;"> </i>
Odoo.sh
</strong>
</div>
</strong>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="oe_container lead bi_title_box">
<div>
<div>
<h2 class="oe_slogan bi_title" style="color:#5082c4;">
<b>Select Multiple Products in Sales and Purchase Orders</b>
</h2>
<h3 class="oe_slogan bi_title" style="color: ##201111;">
<b>Sales Order Multi Product Selection Odoo Apps</b>
</h3>
<h3 class="oe_slogan bi_title" style="color: ##201111;">
<b>Multiple Product Selection in Purchase Order Odoo Apps</b>
</h3>
<h3 class="oe_slogan bi_title" style="color: ##201111;">
<b>Sales & Purchase Multi Product Selection Odoo Apps</b>
</h3>
<p class="oe_slogan">
Multi Product Selection Odoo App allows users to work with sales orders, purchase orders, delivery orders, and invoices. This app simplifies selecting multiple products, streamlining the workflow, and saving valuable time. Users can conveniently add multiple products to order lines with a single click. Still, it's important to note that this feature is available only during the draft stage of document creation.
</p>
</div>
</div>
</section>
<section class="oe_container lead bi_features">
<div >
<div>
<h3 class="oe_slogan" style="opacity:1;background: linear-gradient(to right, #86bcf2 0%, #e2f2f8 100%);padding: 10px 0px;color: ##201111;letter-spacing: 0.2em;text-transform: uppercase;text-shadow: 0.1em .04em 0.1em #7d8c88;"><b>Features</b></h3>
</div>
<div class="row">
<div class="col" style="margin: 10px;">
<div class="row">
<div class="col-md-3 text-center">
<img class="img img-responsive" style="max-width:100%;" src="features/1_features.png"/>
</div>
<div class="col-md-9">
<h4><b>Add Multiple Products on Sale Order Line</b></h4>
<span class="oe_slogan">User can add multiple products on sale order line.</span>
</div>
</div>
</div>
<div class="col" style="margin: 10px;">
<div class="row">
<div class="col-md-3 text-center">
<img class="img img-responsive" style="max-width:100%;" src="features/2_features.png"/>
</div>
<div class="col-md-9">
<h4><b>Add Multiple Product on Purchase Order Line</b></h4>
<span class="oe_slogan">User can add multiple products on purchase order line.</span>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col" style="margin: 10px;">
<div class="row">
<div class="col-md-3 text-center">
<img class="img img-responsive" style="max-width:100%;" src="features/3_feature.png"/>
</div>
<div class="col-md-9">
<h4><b>Add Multiple Products on Delivery Order Line</b></h4>
<span class="oe_slogan">User can add multiple products on delivery order line.</span>
</div>
</div>
</div>
<div class="col" style="margin: 10px;">
<div class="row">
<div class="col-md-3 text-center">
<img class="img img-responsive" style="max-width:100%;" src="features/4_feature.png"/>
</div>
<div class="col-md-9">
<h4><b>Add Multiple Product on Invoice Line</b></h4>
<span class="oe_slogan">User can add multiple products on an invoice line.</span>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="oe_container lead mt64">
<div >
<div class="oe_slogan oe_spaced text-center">
<a class="btn mt8 mr8" title="Demo Request" style="background-color: #2875aa;color: #FFFFFF !important;font-size: 20px;font-weight: bold;border-radius: 7px;" href="mailto:sales@browseinfo.in?Subject=Demo Request for Multi Product Selection Odoo Apps" target="_top"> Demo Request </a>
<a class="btn mt8 ml8" title="Video Tutorial" style="background-color: #2875aa;color: #FFFFFF !important;font-size: 20px;font-weight: bold;border-radius: 7px;" href="https://youtu.be/9_ccgoFoTBs" target="_blank"> Video Tutorial</a>
</div>
</div>
</section>
<section class="oe_container lead">
<div>
<div>
<p class="oe_slogan" style="color: #49a3fe;font-size: 35px;font-style: italic;font-weight:bolder;">Add Multiple Products on Sale Order</p>
<p class="oe_slogan">User can add multiple products by clicking on "ADD MULTIPLE PRODUCTS" button on sale order.</p>
<img class="img-border img-responsive thumbnail mb16" style="border: 3px solid black;" src="1_multi_product.png">
</div>
</div>
</section>
<section class="oe_container lead">
<div>
<div>
<p class="oe_slogan" style="color: #49a3fe;font-size: 35px;font-style: italic;font-weight:bolder;">Add Product Line on Sale Order</p>
<p class="oe_slogan">User can click on "Add a Line" option to add multiple product on sale order line.</p>
<img class="img-border img-responsive thumbnail mb16" style="border: 3px solid black;" src="2_multi_product.png">
</div>
</div>
</section>
<section class="oe_container lead">
<div>
<div>
<p class="oe_slogan" style="color: #49a3fe;font-size: 35px;font-style: italic;font-weight:bolder;">Select Multiple Product on Sale Order</p>
<p class="oe_slogan">User can select multiple product to add in sale order line. </p>
<img class="img-border img-responsive thumbnail mb16" style="border: 3px solid black;" src="3_multi_product.png">
</div>
</div>
</section>
<section class="oe_container lead">
<div>
<div>
<p class="oe_slogan" style="color: #49a3fe;font-size: 35px;font-style: italic;font-weight:bolder;">Confirm Selected Product</p>
<img class="img-border img-responsive thumbnail mb16" style="border: 3px solid black;" src="4_multi_product.png">
</div>
</div>
</section>
<section class="oe_container lead">
<div>
<div>
<p class="oe_slogan" style="color: #49a3fe;font-size: 35px;font-style: italic;font-weight:bolder;">Added Multiple Products on Sale Order Line</p>
<p class="oe_slogan">User can see added multiple products on sale order line. </p>
<img class="img-border img-responsive thumbnail mb16" style="border: 3px solid black;" src="5_multi_product.png">
</div>
</div>
</section>
<section class="oe_container lead">
<div>
<div>
<p class="oe_slogan" style="color: #49a3fe;font-size: 35px;font-style: italic;font-weight:bolder;">Add Multiple Products on Purchase Order</p>
<p class="oe_slogan">User can add multiple products by clicking on "ADD MULTIPLE PRODUCTS" button on purchase order.</p>
<img class="img-border img-responsive thumbnail mb16" style="border: 3px solid black;" src="6_multi_product.png">
</div>
</div>
</section>
<section class="oe_container lead">
<div>
<div>
<p class="oe_slogan" style="color: #49a3fe;font-size: 35px;font-style: italic;font-weight:bolder;">Select Multiple Product on Purchase Order</p>
<p class="oe_slogan">User can select multiple product to add in purchase order line. </p>
<img class="img-border img-responsive thumbnail mb16" style="border: 3px solid black;" src="7_multi_product.png">
</div>
</div>
</section>
<section class="oe_container lead">
<div>
<div>
<p class="oe_slogan" style="color: #49a3fe;font-size: 35px;font-style: italic;font-weight:bolder;">Added Multiple Products on Purchase Order Line</p>
<p class="oe_slogan">User can see added multiple products on purchase order line. </p>
<img class="img-border img-responsive thumbnail mb16" style="border: 3px solid black;" src="8_multi_product.png">
</div>
</div>
</section>
<section class="oe_container lead">
<div>
<div>
<p class="oe_slogan" style="color: #49a3fe;font-size: 35px;font-style: italic;font-weight:bolder;">Add Multiple Products on Delivery Order</p>
<p class="oe_slogan">User can add multiple products by clicking on "ADD MULTIPLE PRODUCTS" button on delivery order.</p>
<img class="img-border img-responsive thumbnail mb16" style="border: 3px solid black;" src="9_multi_product.png">
</div>
</div>
</section>
<section class="oe_container lead">
<div>
<div>
<p class="oe_slogan" style="color: #49a3fe;font-size: 35px;font-style: italic;font-weight:bolder;">Select Multiple Product on Delivery Order</p>
<p class="oe_slogan">User can select multiple product to add in delivery order line. </p>
<img class="img-border img-responsive thumbnail mb16" style="border: 3px solid black;" src="10_multi_product.png">
</div>
</div>
</section>
<section class="oe_container lead">
<div>
<div>
<p class="oe_slogan" style="color: #49a3fe;font-size: 35px;font-style: italic;font-weight:bolder;">Added Multiple Products on Delivery Order Line</p>
<p class="oe_slogan">User can see added multiple products on delivery order line. </p>
<img class="img-border img-responsive thumbnail mb16" style="border: 3px solid black;" src="11_multi_product.png">
</div>
</div>
</section>
<section class="oe_container lead">
<div>
<div>
<p class="oe_slogan" style="color: #49a3fe;font-size: 35px;font-style: italic;font-weight:bolder;">Add Multiple Products on an Invoice</p>
<p class="oe_slogan">User can add multiple products by clicking on "ADD MULTIPLE PRODUCTS" button on an invoice.</p>
<img class="img-border img-responsive thumbnail mb16" style="border: 3px solid black;" src="12_multi_product.png">
</div>
</div>
</section>
<section class="oe_container lead">
<div>
<div>
<p class="oe_slogan" style="color: #49a3fe;font-size: 35px;font-style: italic;font-weight:bolder;">Select Multiple Product on an Invoice</p>
<p class="oe_slogan">User can select multiple product to add in invoice line. </p>
<img class="img-border img-responsive thumbnail mb16" style="border: 3px solid black;" src="13_multi_product.png">
</div>
</div>
</section>
<section class="oe_container lead">
<div>
<div>
<p class="oe_slogan" style="color: #49a3fe;font-size: 35px;font-style: italic;font-weight:bolder;">Added Multiple Products on an Invoice Line</p>
<p class="oe_slogan">User can see added multiple products on an invoice line. </p>
<img class="img-border img-responsive thumbnail mb16" style="border: 3px solid black;" src="14_multi_product.png">
</div>
</div>
</section>
<section class="oe_container oe_dark" style="min-width: 110%;margin-left: -5%;">
<div>
<div class="row">
<div class="col-sm-4" style="margin: auto;">
<p class="oe_slogan" style="font-size: 35px;color: #5082c4;font-style: italic;font-weight: bold;">Apps May You Like</p>
</div>
</div>
<div class="row col-sm-12" style="margin-left: 1%;padding: 1% 8%;">
<div class="col-sm-4" style="padding: 5px;padding-right: 10px;">
<a href="https://apps.odoo.com/apps/modules/14.0/product_bundle_pack_advance/">
<img class="img img-responsive" src="related/product_bundle_pack_advance.png" style="width: 100%;"/>
</a>
</div>
<div class="col-sm-4" style="padding: 5px;padding-right: 10px;">
<a href="https://apps.odoo.com/apps/modules/14.0/bi_sale_loyalty/">
<img class="img img-responsive" src="related/bi_sale_loyalty.png" style="width: 100%;"/>
</a>
</div>
<div class="col-sm-4" style="padding: 5px;padding-right: 10px;">
<a href="https://apps.odoo.com/apps/modules/14.0/bi_sale_tripple_approval/">
<img class="img img-responsive" src="related/bi_sale_tripple_approval.png" style="width: 100%;"/>
</a>
</div>
<div class="col-sm-4" style="padding: 5px;padding-right: 10px;">
<a href="https://apps.odoo.com/apps/modules/14.0/bi_sale_auto_complete/">
<img class="img img-responsive" src="related/bi_sale_auto_complete.png" style="width: 100%;"/>
</a>
</div>
<div class="col-sm-4" style="padding: 5px;padding-right: 10px;">
<a href="https://apps.odoo.com/apps/modules/14.0/bi_website_rma/">
<img class="img img-responsive" src="related/bi_website_rma.png" style="width: 100%;"/>
</a>
</div>
<div class="col-sm-4" style="padding: 5px;padding-right: 10px;">
<a href="https://apps.odoo.com/apps/modules/14.0/bi_automated_sale_order/">
<img class="img img-responsive" src="related/bi_automated_sale_order.png" style="width: 100%;"/>
</a>
</div>
</div>
</div>
</section>
<section class="oe_container oe_dark" style="min-width: 110%;margin-left: -5%;">
<div>
<div class="row">
<div class="col-sm-4" style="margin: auto;">
<p class="oe_slogan" style="font-size: 35px;color: #5082c4;font-style: italic;font-weight: bold;">Most Demanded Apps</p>
</div>
</div>
<div class="row col-sm-12" style="margin-left: 1%;padding: 1% 8%;">
<div class="col-sm-4" style="padding: 5px;padding-right: 10px;">
<a href="https://apps.odoo.com/apps/modules/14.0/pos_orders_all/">
<img class="img img-responsive" src="demanded/all_in_one_pos.png" style="width: 100%;"/>
</a>
</div>
<div class="col-sm-4" style="padding: 5px;padding-right: 10px;">
<a href="https://apps.odoo.com/apps/modules/14.0/bi_customer_overdue_statement/">
<img class="img img-responsive" src="demanded/customer_overdue.png" style="width: 100%;"/>
</a>
</div>
<div class="col-sm-4" style="padding: 5px;padding-right: 10px;">
<a href="https://apps.odoo.com/apps/modules/14.0/generic_excel_reports/">
<img class="img img-responsive" src="demanded/generic_excel_reports.png" style="width: 100%;"/>
</a>
</div>
<div class="col-sm-4" style="padding: 5px;padding-right: 10px;">
<a href="https://apps.odoo.com/apps/modules/14.0/sales_commission_generic/">
<img class="img img-responsive" src="demanded/sale_commision.png" style="width: 100%;"/>
</a>
</div>
<div class="col-sm-4" style="padding: 5px;padding-right: 10px;">
<a href="https://apps.odoo.com/apps/modules/14.0/bi_generic_import/">
<img class="img img-responsive" src="demanded/bi_generic_import.png" style="width: 100%;"/>
</a>
</div>
<div class="col-sm-4" style="padding: 5px;padding-right: 10px;">
<a href="https://apps.odoo.com/apps/modules/14.0/branch/">
<img class="img img-responsive" src="demanded/branch.png" style="width: 100%;"/>
</a>
</div>
</div>
</div>
</section>
<section class="oe_container">
<div >
<div >
<h2 class="oe_slogan">Free Support</h2>
<h3 class="oe_slogan" style="font-size: 21px; color: #000000 !important;">You will get 90 Days free support incase any bugs or issue (Except data recovery).</h3>
<p class="oe_slogan" style="font-size: 18px; ">
At BrowseInfo we offer end to end solution for Odoo services. Which includes analysis &amp; consultation on the workflows and integration part. Please note that You're not allowed to distribute this module after purchase! Incase of any question regarding this module feel free to email us on <a href="mailto:ticket@browseinfo.in">ticket@browseinfo.in</a> or raise a ticket on support.
</p>
</div>
</div>
</section>
<section class="oe_container lead">
<div >
<div >
<div class="img img-responsive text-center">
<a href="https://www.browseinfo.com" target="new" style="display: grid;">
<img src="bi_logo.png" style="margin: auto;max-width: 350px;">
</a>
</div>
</div>
<div class="oe_slogan oe_spaced text-center">
<a class="btn mt8" title="Query and Demo" style="background-color: #3497db;color: #FFFFFF !important;font-size: 20px;font-weight: bold;" href="mailto:sales@browseinfo.in?Subject=Demo Request for Multi Product Selection Odoo Apps" target="_blank"> Query and Demo </a>
<a class="btn mt8" title="Email on Support" style="background-color: #3497db;color: #FFFFFF !important;font-size: 20px;font-weight: bold;" href="mailto:ticket@browseinfo.in?Subject=Support Request for Multi Product Selection Odoo Apps" target="_blank"> Support Request </a>
</div>
</div>
</section>

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

View File

@ -0,0 +1,15 @@
<?xml version='1.0' encoding='utf-8'?>
<odoo>
<record id="multiple_product_invoice_inherit_view" model="ir.ui.view">
<field name="name">account.move.form.inherit</field>
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_move_form"/>
<field name="arch" type="xml">
<xpath expr="//notebook/page/field[@name='invoice_line_ids']" position="before">
<div style="height:50px">
<button string="ADD MULTIPLE PRODUCTS" name="invoice_select_prodcut" type="object" class="oe_highlight" states="draft"/>
</div>
</xpath>
</field>
</record>
</odoo>

View File

@ -0,0 +1,15 @@
<?xml version='1.0' encoding='utf-8'?>
<odoo>
<record id="multiple_product_purchase_order_inherit_view" model="ir.ui.view">
<field name="name">purchase.order.form.inherit</field>
<field name="model">purchase.order</field>
<field name="inherit_id" ref="purchase.purchase_order_form"/>
<field name="arch" type="xml">
<xpath expr="//notebook/page/field[@name='order_line']" position="before">
<div style="height:50px">
<button string="ADD MULTIPLE PRODUCTS" name="purchase_order_select_prodcut" type="object" class="oe_highlight" states="draft"/>
</div>
</xpath>
</field>
</record>
</odoo>

View File

@ -0,0 +1,15 @@
<?xml version='1.0' encoding='utf-8'?>
<odoo>
<record id="multiple_product_sale_order_inherit_view" model="ir.ui.view">
<field name="name">sale.order.form.inherit</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="//notebook/page/field[@name='order_line']" position="before">
<div style="height:50px">
<button string="ADD MULTIPLE PRODUCTS" name="sale_order_select_prodcut" type="object" class="oe_highlight" states="draft"/>
</div>
</xpath>
</field>
</record>
</odoo>

View File

@ -0,0 +1,15 @@
<?xml version='1.0' encoding='utf-8'?>
<odoo>
<record id="multiple_product_stock_picking_inherit_view" model="ir.ui.view">
<field name="name">stock.picking.form.inherit</field>
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.view_picking_form"/>
<field name="arch" type="xml">
<xpath expr="//notebook/page/field[@name='move_ids_without_package']" position="before">
<div style="height:50px">
<button string="ADD MULTIPLE PRODUCTS" name="stock_picking_select_prodcut" type="object" class="oe_highlight" states="draft"/>
</div>
</xpath>
</field>
</record>
</odoo>

View File

@ -0,0 +1,7 @@
# -*- coding: utf-8 -*-
# Part of BrowseInfo. See LICENSE file for full copyright and licensing details.
from . import sale_order_wizard
from . import purchase_order_wizard
from . import account_move_wizard
from . import stock_picking_wizard

View File

@ -0,0 +1,29 @@
from odoo import _, api, fields, models, tools
class AccountMoveWizard(models.TransientModel):
_name = 'account.move.wizard'
_description = 'Account Move Wizard'
product_ids = fields.Many2many('product.product',string="Select Products", required=True)
def confirm_invoice_product(self):
active_id = self.env.context.get('active_ids', [])
get_active_id = self.env['account.move'].browse(active_id)
get_active_ids = self.env['account.move.line'].browse(active_id)
get_active_wizard_ids = self.env['account.move.wizard'].browse(active_id)
productobj = self.env['account.move.wizard'].search([('id', '=', self._context.get('active_id'))])
order_line_vals = self.env['account.move'].search([])
line_vals = self.product_ids
line_env = self.env['account.move.line']
if get_active_id.state == 'draft':
for wizard in self:
for data in line_vals:
new_line = line_env.create({
'product_id': data.id,
'move_id': get_active_id.id,
'account_id': data.id
})
return True

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="invoice_wizard_view_form" model="ir.ui.view">
<field name="name">account.move.wizard.form</field>
<field name="model">account.move.wizard</field>
<field name="arch" type="xml">
<form string="Test">
<field name="product_ids"/>
<footer>
<button string="Cancel" class="oe_highlight" special="cancel"/>
<button string="Confirm" type="object" name="confirm_invoice_product" class="oe_highlight"/>
</footer>
</form>
</field>
</record>
<record id="invoice_wizard_action" model="ir.actions.act_window">
<field name="name">Invoice Wizard</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">account.move.wizard</field>
<field name="view_mode">form</field>
<field name="view_id" ref="invoice_wizard_view_form"/>
<field name="target">new</field>
</record>
</odoo>

View File

@ -0,0 +1,31 @@
from odoo import _, api, fields, models, tools
class PurchaseOrderWizard(models.TransientModel):
_name = 'purchase.order.wizard'
_description = 'Purcahse Order Wizard'
product_ids = fields.Many2many('product.product',string="Select Products", required=True)
def confirm_purchase_product(self):
active_id = self.env.context.get('active_ids', [])
get_active_id = self.env['purchase.order'].browse(active_id)
get_active_ids = self.env['purchase.order.line'].browse(active_id)
get_active_wizard_ids = self.env['purchase.order.wizard'].browse(active_id)
productobj = self.env['purchase.order.wizard'].search([('id', '=', self._context.get('active_id'))])
order_line_vals = self.env['purchase.order'].search([])
line_vals = self.product_ids
line_env = self.env['purchase.order.line']
if get_active_id.state == 'draft':
for wizard in self:
for data in wizard.product_ids:
new_line = line_env.create({
'product_id': data.id,
'order_id': get_active_id.id,
})
return True

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="purchase_order_wizard_view_form" model="ir.ui.view">
<field name="name">purchase.order.wizard.form</field>
<field name="model">purchase.order.wizard</field>
<field name="arch" type="xml">
<form string="Test">
<field name="product_ids"/>
<footer>
<button string="Cancel" class="oe_highlight" special="cancel"/>
<button string="Confirm" type="object" name="confirm_purchase_product" class="oe_highlight"/>
</footer>
</form>
</field>
</record>
<record id="purchase_order_wizard_action" model="ir.actions.act_window">
<field name="name">Purchase Order Wizard</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">purchase.order.wizard</field>
<field name="view_mode">form</field>
<field name="view_id" ref="purchase_order_wizard_view_form"/>
<field name="target">new</field>
</record>
</odoo>

View File

@ -0,0 +1,37 @@
from odoo import _, api, fields, models, tools
class SelectProductWizard(models.TransientModel):
_name = 'sale.order.wizard'
_description = 'Sale Order Wizard'
product_ids = fields.Many2many('product.product',string="Select Products" ,required=True)
def confirm_sale_product(self):
active_id = self.env.context.get('active_ids', [])
get_active_id = self.env['sale.order'].browse(active_id)
get_active_ids = self.env['sale.order.line'].browse(active_id)
get_active_wizard_ids = self.env['sale.order.wizard'].browse(active_id)
productobj = self.env['sale.order.wizard'].search([('id', '=', self._context.get('active_id'))])
order_line_vals = self.env['sale.order'].search([])
line_vals = self.product_ids
line_env = self.env['sale.order.line']
if get_active_id.state == 'draft':
for wizard in self:
for data in wizard.product_ids:
new_line = line_env.create({
'product_id': data.id,
'order_id': get_active_id.id,
})
return True

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="sale_order_wizard_view_form" model="ir.ui.view">
<field name="name">sale.order.wizard.form</field>
<field name="model">sale.order.wizard</field>
<field name="arch" type="xml">
<form string="Test">
<field name="product_ids"/>
<footer>
<button string="Cancel" class="oe_highlight" special="cancel"/>
<button string="Confirm" name="confirm_sale_product" type="object" class="oe_highlight" />
</footer>
</form>
</field>
</record>
<record id="sale_order_wizard_action" model="ir.actions.act_window">
<field name="name">Sale Order Wizard</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.order.wizard</field>
<field name="view_mode">form</field>
<field name="view_id" ref="sale_order_wizard_view_form"/>
<field name="target">new</field>
</record>
</odoo>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="stock_picking_wizard_view_form" model="ir.ui.view">
<field name="name">stock.picking.wizard.form</field>
<field name="model">stock.picking.wizard</field>
<field name="arch" type="xml">
<form string="Test">
<field name="product_ids"/>
<footer>
<button string="Cancel" class="oe_highlight" special="cancel"/>
<button string="Confirm" type="object" name="confirm_stock_picking_product" class="oe_highlight"/>
</footer>
</form>
</field>
</record>
<record id="stock_picking_wizard_action" model="ir.actions.act_window">
<field name="name">Transfer Wizard</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">stock.picking.wizard</field>
<field name="view_mode">form</field>
<field name="view_id" ref="stock_picking_wizard_view_form"/>
<field name="target">new</field>
</record>
</odoo>

View File

@ -0,0 +1,40 @@
from odoo import _, api, fields, models, tools
class StockPickingWizard(models.TransientModel):
_name = 'stock.picking.wizard'
_description = 'Stock Move Wizard'
product_ids = fields.Many2many('product.product',string="Select Products", required=True)
def confirm_stock_picking_product(self):
active_id = self.env.context.get('active_ids', [])
get_active_id = self.env['stock.picking'].browse(active_id)
get_active_ids = self.env['stock.move'].browse(active_id)
get_active_wizard_ids = self.env['stock.picking.wizard'].browse(active_id)
productobj = self.env['stock.picking.wizard'].search([('id', '=', self._context.get('active_id'))])
order_line_vals = self.env['stock.picking'].search([])
line_vals = self.product_ids
line_env = self.env['stock.move']
if get_active_id.state == 'draft':
for wizard in self:
for data in wizard.product_ids:
new_line = line_env.create({
'name':data.name,
'product_id': data.id,
'product_uom':data.uom_id.id,
'location_id':get_active_id.location_id.id,
'location_dest_id': get_active_id.location_dest_id.id,
'picking_id': get_active_id.id,
'picking_type_id':get_active_id.picking_type_id.id,
'product_uom_qty':get_active_id.id,
'company_id': get_active_id.company_id.id,
})
return True

View File

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import models

View File

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
{
'name': "CRM Custom",
'version': "1.0",
'category': "Odex25-Sales/Odex25-Sales",
'author': "Expert Co. Ltd.",
'website': "http://www.exp-sa.com",
'summary': "New features for CRM",
'description': """Contains new features for CRM such as new views""",
'depends': ['crm', 'project_custom'],
'data': [
'views/crm_lead_views.xml',
'views/menu_views.xml',
'views/product_service_views.xml',
'views/res_partner_views.xml',
],
'installable': True,
'application': False,
}

View File

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
from . import crm_lead

View File

@ -0,0 +1,73 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models
class Lead(models.Model):
_inherit = 'crm.lead'
inquiry_date = fields.Date('Inquiry Date')
site_visit_date = fields.Date('Site Visit Date')
submit_date = fields.Date('Submit Date', default=fields.Date.context_today)
bidbond = fields.Boolean('Bid Bond')
project_country_id = fields.Many2one('res.country', 'Country')
project_state_id = fields.Many2one('res.country.state', string='Region')
city_id = fields.Many2one('res.country.city', 'City')
industry_id = fields.Many2one('res.partner.industry', 'Industry(Classification)')
sector_id = fields.Many2one('sector', 'Sector(Role)')
department_id = fields.Many2one('hr.department',string='Business Unit')
product_id = fields.Many2one('product.product',string='Services(Contract Type)', store=True)
must_lead = fields.Boolean('Must Lead (RFI)')
project_category_id = fields.Many2one('project.category', 'Project Category')
project_duration = fields.Integer('Project Duration (Months) As per (SOW)')
project_duration_internal = fields.Integer('Project Duration (Internal)')
total_site_area = fields.Float('Total Site Area (m2) (Excluding Building Footprint)')
main_building_prototype = fields.Float('Main Building Prototype Area (m2)')
main_building_site = fields.Float('Main Building Site Adaptation Area (m2)')
main_building_total = fields.Float('Main Building Total Area (m2)')
floor_area_ratio = fields.Float('Floor Area Ratio (FAR)')
site_works_area = fields.Float('Site Works Area (m2)')
ancillary_building_prototype = fields.Float('Ancillary Building Prototype Area (m2)')
ancillary_building_site = fields.Float('Ancillary Building Site Adaptation Area (m2)')
ancillary_building_total = fields.Float('Ancillary Buildings Total Area (m2)')
def action_crm_send(self):
''' Opens a wizard to compose an email, with relevant mail template loaded by default '''
self.ensure_one()
# template_id = self._find_mail_template()
lang = self.env.context.get('lang')
# template = self.env['mail.template'].browse(template_id)
# if template.lang:
# lang = template._render_lang(self.ids)[self.id]
ctx = {
'default_model': 'crm.lead',
'default_res_id': self.ids[0],
# 'default_use_template': bool(template_id),
# 'default_template_id': template_id,
'default_composition_mode': 'comment',
'mark_so_as_sent': True,
'custom_layout': "mail.mail_notification_paynow",
"default_partner_ids": self.partner_id.ids,
'force_email': True,
'model_description': self.with_context(lang=lang).type,
}
return {
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': 'mail.compose.message',
'views': [(False, 'form')],
'view_id': False,
'target': 'new',
'context': ctx,
}
def convert_rfp(self):
self.type = 'opportunity'
self.must_lead = True

View File

@ -0,0 +1,193 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="crm_lead_view_form_inherit" model="ir.ui.view">
<field name="name">crm.lead.form</field>
<field name="model">crm.lead</field>
<field name="inherit_id" ref="crm.crm_lead_view_form" />
<field name="arch" type="xml">
<xpath expr="//widget[1]" position="attributes">
<attribute name='string'>Reject</attribute>
</xpath>
<xpath expr="//button[@name='action_set_won_rainbowman']" position="before">
<button name="action_crm_send" string="Send By Email"
type="object" class="oe_highlight"/>
</xpath>
<xpath expr="//button[@name='%(crm.crm_lead_lost_action)d']" position="attributes">
<attribute name='string'>Reject</attribute>
</xpath>
<xpath expr="//button[@name='action_set_lost']" position="replace">
<button name="%(crm.crm_lead_lost_action)d" string="Reject" type="action"
attrs="{'invisible': ['|', ('type', '=', 'opportunity'), '&amp;', ('probability', '=', 0), ('active', '=', False)]}"/>
</xpath>
<xpath expr="//button[@name='%(crm.action_crm_lead2opportunity_partner)d']" position="attributes">
<attribute name='invisible'>1</attribute>
</xpath>
<xpath expr="//button[@name='%(crm.action_crm_lead2opportunity_partner)d']" position="after">
<button name="convert_rfp" string="Convert to RFP" type="object" help="Convert to RFP" class="oe_highlight" attrs="{'invisible': ['|', ('type', '=', 'opportunity'), ('active', '=', False)]}"/>
</xpath>
<xpath expr="//label[1]" position="attributes">
<attribute name='string'>RFI</attribute>
</xpath>
<xpath expr="//label[2]" position="attributes">
<attribute name='string'>RFP</attribute>
</xpath>
<xpath expr="//group[@name='lead_info']/label[@for='contact_name']" position="before">
<field name="submit_date" />
<field name="must_lead" invisible="1"/>
</xpath>
<xpath expr="//group['lead_partner']/field[@name='partner_id']" position="attributes">
<attribute name="groups">base.group_user</attribute>
</xpath>
<xpath expr="//field[@name='date_deadline']" position="before">
<field name="submit_date" />
<field name="inquiry_date" />
<field name="site_visit_date" />
</xpath>
<xpath expr="//page[@name='internal_notes']" position="after">
<page name="project_location" string="Project Location">
<group>
<field name="project_country_id"/>
<field name="project_state_id" />
<field name="city_id"/>
</group>
</page>
<page name="project_info" string="Project Information">
<group>
<group>
<field name="project_category_id" />
<field name="project_duration" />
<field name="project_duration_internal" />
<field name="total_site_area" />
</group>
<group>
<field name="main_building_prototype" />
<field name="main_building_site" />
<field name="main_building_total" />
</group>
<group>
<field name="floor_area_ratio"/>
<field name="site_works_area"/>
<field name="ancillary_building_prototype"/>
<field name="ancillary_building_site"/>
<field name="ancillary_building_total"/>
</group>
</group>
</page>
<page name="business_info" string="Business Information">
<group>
<field name="industry_id" required="1" domain="[('parent_id', '=', False)]"/>
<field name="sector_id" required="1"/>
<field name="department_id" required="1"/>
<field name="product_id" domain="[('department_id', '=', department_id)]" required="1"/>
</group>
</page>
<page name="bid_bond" string="Bid Bond">
<group>
<field name="bidbond"/>
</group>
</page>
</xpath>
<xpath expr="//page[@name='internal_notes']" position="attributes">
<attribute name='string'>Project Description</attribute>
</xpath>
</field>
</record>
<record id="crm_case_tree_view_leads_inherit" model="ir.ui.view">
<field name="name">crm.lead.tree</field>
<field name="model">crm.lead</field>
<field name="inherit_id" ref="crm.crm_case_tree_view_leads" />
<field name="arch" type="xml">
<xpath expr="//field[@name='name']" position="attributes">
<attribute name='string'>RFI</attribute>
</xpath>
</field>
</record>
<record id="crm_case_tree_view_oppor_inherit" model="ir.ui.view">
<field name="name">crm.lead.tree</field>
<field name="model">crm.lead</field>
<field name="inherit_id" ref="crm.crm_case_tree_view_oppor" />
<field name="arch" type="xml">
<xpath expr="//field[@name='name']" position="attributes">
<attribute name='string'>RFP</attribute>
</xpath>
</field>
</record>
<record id="crm_lead_lost_view_form_inherit" model="ir.ui.view">
<field name="name">crm.lead.lost.form</field>
<field name="model">crm.lead.lost</field>
<field name="inherit_id" ref="crm.crm_lead_lost_view_form" />
<field name="arch" type="xml">
<xpath expr="//field[@name='lost_reason_id']" position="attributes">
<attribute name='required'>1</attribute>
</xpath>
</field>
</record>
<record model="ir.actions.act_window" id="crm.crm_lead_all_leads">
<field name="name">RFI</field>
<field name="domain">['|', '|', ('type','=','lead'), ('type','=',False), ('must_lead', '=', True)]</field>
</record>
<record model="ir.actions.act_window" id="crm.crm_lead_action_pipeline">
<field name="name">RFP</field>
</record>
<record model="ir.actions.act_window" id="crm.action_crm_lead2opportunity_partner">
<field name="name">Convert to RFP</field>
</record>
<record id="crm.crm_lost_reason_action" model="ir.actions.act_window">
<field name="name">Reject Reasons</field>
</record>
<record id="crm.action_your_pipeline" model="ir.actions.server">
<field name="name">RFP</field>
</record>
<record id="crm.crm_menu_leads" model="ir.ui.menu">
<field name="name">RFI</field>
</record>
<record id="crm.menu_crm_opportunities" model="ir.ui.menu">
<field name="name">RFP</field>
</record>
<record id="crm.crm_menu_sales" model="ir.ui.menu">
<field name="name">RFP</field>
</record>
<record id="crm.menu_crm_lost_reason" model="ir.ui.menu">
<field name="name">Reject Reasons</field>
</record>
</data>
</odoo>

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<menuitem id="menu_action_sector"
action="base_odex.action_sector"
parent="crm.crm_menu_config"/>
<menuitem id="menu_res_partner_industry_action"
action="base.res_partner_industry_action"
parent="crm.crm_menu_config"/>
<menuitem id="menu_localization"
name="Localization"
parent="crm.crm_menu_config"/>
<menuitem id="country_menu" name="Country"
parent="menu_localization"
action="base.action_country" />
<menuitem id="region_menu" name="Region"
parent="menu_localization"
action="base_odex.res_state_list_action" />
<menuitem id="city_menu" name="City"
parent="menu_localization"
action="base_odex.res_city_list_action" />
</odoo>

View File

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_product_product_tree" model="ir.ui.view">
<field name="name">product.product.tree</field>
<field name="model">product.product</field>
<field name="mode">primary</field>
<field name="arch" type="xml">
<tree string="Service">
<field name="name"/>
<field name="department_id"/>
</tree>
</field>
</record>
<record id="view_product_product_form" model="ir.ui.view">
<field name="name">product.product.form</field>
<field name="model">product.product</field>
<field name="mode">primary</field>
<field name="arch" type="xml">
<form string="Service">
<sheet>
<group>
<group>
<field name="name"/>
<field name="department_id" required="1"/>
<field name="categ_id" invisible="1"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_product_product_service" model="ir.actions.act_window">
<field name="name">Service</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.product</field>
<field name="view_mode">tree,form</field>
<field name="view_ids"
eval="[(5, 0, 0),
(0, 0, {'view_mode': 'tree', 'view_id': ref('view_product_product_tree')}),
(0, 0, {'view_mode': 'form', 'view_id': ref('view_product_product_form')})]"/>
<field name="context">{'default_type': 'service'}</field>
<field name="domain">[('type', '=', 'service'), ('department_id', '!=', False)]</field>
</record>
<menuitem id="menu_action_service"
action="action_product_product_service"
parent="crm.crm_menu_config"/>
</data>
</odoo>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_partners_form_crm1" model="ir.ui.view">
<field name="name">view.res.partner.form.crm.inherit</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="crm.view_partners_form_crm1"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='opportunity_count']" position="attributes">
<attribute name="string">RFP</attribute>
</xpath>
</field>
</record>
</data>
</odoo>

View File

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import models

View File

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
{
'name': "CRM Expense",
'version': "1.0",
'category': "Sales/CRM",
'author': "Expert Co. Ltd.",
'website': "http://www.exp-sa.com",
'summary': "Linked CRM with Expense",
'category':'Odex25-Sales/Odex25-Sales',
'description': """Contains news linked crm with expense""",
'depends': ['crm', 'hr_expense'],
'data': [
'views/crm_lead_views.xml',
'views/hr_expense_view.xml',
],
'installable': True,
'application': False,
}

View File

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
from . import hr_expence
from . import crm_lead

View File

@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models
class Lead(models.Model):
_inherit = 'crm.lead'
expense_count = fields.Float('Expenses', compute="_compute_expense_count")
expense_ids = fields.One2many('hr.expense', 'crm_lead_id', 'Expenses')
def _compute_expense_count(self):
self.expense_count = sum(self.expense_ids.mapped('total_amount'))
def action_view_expense(self):
action = self.env["ir.actions.actions"]._for_xml_id("hr_expense.hr_expense_actions_my_unsubmitted")
action['context'] = {
'default_crm_lead_id': self.id,
'default_partner_id': self.partner_id.id,
}
action['domain'] = [('crm_lead_id', '=', self.id)]
return action

View File

@ -0,0 +1,9 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models
class HrExpense(models.Model):
_inherit = "hr.expense"
crm_lead_id = fields.Many2one('crm.lead', 'CRM Lead')

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="crm_lead_view_form_inherit" model="ir.ui.view">
<field name="name">crm.lead.form</field>
<field name="model">crm.lead</field>
<field name="inherit_id" ref="crm.crm_lead_view_form" />
<field name="arch" type="xml">
<xpath expr="//button[@name='action_set_won_rainbowman']" position="before">
<button name="%(hr_expense.hr_expense_actions_my_unsubmitted)d" string="Expense"
type="action" class="oe_highlight" context="{'default_crm_lead_id': active_id}"/>
</xpath>
<xpath expr="//button[@name='action_schedule_meeting']" position="after">
<button class="oe_stat_button" type="object"
name="action_view_expense" icon="fa-money" context="{'default_crm_lead_id': active_id}">
<field name="expense_count" widget="statinfo" string="Expenses"/>
</button>
</xpath>
</field>
</record>
</data>
</odoo>

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="hr_expense_view_form_inherit" model="ir.ui.view">
<field name="name">hr.expense.form</field>
<field name="model">hr.expense</field>
<field name="inherit_id" ref="hr_expense.hr_expense_view_form" />
<field name="arch" type="xml">
<xpath expr="//field[@name='company_id']" position="after">
<field name="crm_lead_id" />
</xpath>
</field>
</record>
</data>
</odoo>

View File

@ -0,0 +1,6 @@
##############################################################################
# For copyright and license notices, see __manifest__.py file in root directory
##############################################################################
from . import models

View File

@ -0,0 +1,34 @@
##############################################################################
#
# Copyright (c)
# 2015 Serv. Tec. Avanzados - Pedro M. Baeza (http://www.serviciosbaeza.com)
# 2015 AvanzOsc (http://www.avanzosc.es)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# 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 for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
{
"name": "Sequential Code for Leads / Opportunities",
"version": "14.0.1.0.0",
'category':'Odex25-Sales/Odex25-Sales',
"author": "Tecnativa, AvanzOSC, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/crm",
"license": "AGPL-3",
"depends": ["crm_custom"],
"data": ["data/lead_sequence.xml", "views/crm_lead_view.xml"],
"installable": True,
"pre_init_hook": "create_code_equal_to_id",
"post_init_hook": "assign_old_sequences",
}

View File

@ -0,0 +1,21 @@
<odoo>
<data noupdate="1">
<record id="sequence_lead" model="ir.sequence">
<field name="name">Lead Code</field>
<field name="code">crm.lead.rfi</field>
<field eval="3" name="padding" />
<field name="suffix" >00</field>
<field name="prefix">RFI%(y)s-</field>
</record>
<record id="sequence_rfp" model="ir.sequence">
<field name="name">Lead Code</field>
<field name="code">crm.lead.rfp</field>
<field eval="3" name="padding" />
<field name="suffix" >00</field>
<field name="prefix">RFP%(y)s-</field>
</record>
</data>
</odoo>

View File

@ -0,0 +1,5 @@
#############################################################################
# For copyright and license notices, see __manifest__.py file in root directory
##############################################################################
from . import crm_lead

View File

@ -0,0 +1,55 @@
##############################################################################
# For copyright and license notices, see __manifest__.py file in root directory
##############################################################################
from odoo import _, api, fields, models
class CrmLead(models.Model):
_inherit = "crm.lead"
code_rfp = fields.Char(
string="Number", required=True, default="/", readonly=True, copy=False, tracking=True
)
code_rfi = fields.Char(
string="Number", required=True, default="/", readonly=True, copy=False, tracking=True
)
_sql_constraints = [
("crm_lead_unique_code_rfp", "UNIQUE (code_rfp)", _("The code must be unique!")),
("crm_lead_unique_code_rfi", "UNIQUE (code_rfi)", _("The code must be unique!")),
]
@api.model_create_multi
def create(self, vals_list):
for vals in vals_list:
if vals.get("code_rfi", "/") == "/" and vals.get('type') == 'lead':
vals['code_rfi'] = self.env['ir.sequence'].next_by_code('crm.lead.rfi') or _('/')
if vals.get("code_rfp", "/") == "/" and vals.get('type') == 'opportunity':
vals['code_rfp'] = self.env['ir.sequence'].next_by_code('crm.lead.rfp') or _('/')
return super().create(vals_list)
def convert_rfp(self):
super(CrmLead, self).convert_rfp()
self.code_rfp = self.env['ir.sequence'].next_by_code('crm.lead.rfp') or _('/')
def name_get(self):
result = []
for crm in self:
if self._context.get('default_type') == 'lead':
result.append((crm.id, crm.code_rfi))
if self._context.get('default_type') == 'opportunity':
result.append((crm.id, crm.code_rfp))
else:
result.append((crm.id, crm.code_rfp))
return result

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@ -0,0 +1,426 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<title>Sequential Code for Leads / Opportunities</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="sequential-code-for-leads-opportunities">
<h1 class="title">Sequential Code for Leads / Opportunities</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/crm/tree/14.0/crm_lead_code"><img alt="OCA/crm" src="https://img.shields.io/badge/github-OCA%2Fcrm-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/crm-14-0/crm-14-0-crm_lead_code"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/111/14.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This module adds a sequential code for leads / opportunities.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#bug-tracker" id="id1">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id2">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id3">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id4">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id5">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id1">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/crm/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/crm/issues/new?body=module:%20crm_lead_code%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id2">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id3">Authors</a></h2>
<ul class="simple">
<li>Tecnativa</li>
<li>AvanzOSC</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id4">Contributors</a></h2>
<ul class="simple">
<li>Oihane Crucelaegui &lt;<a class="reference external" href="mailto:oihanecrucelaegi&#64;avanzosc.es">oihanecrucelaegi&#64;avanzosc.es</a>&gt;</li>
<li>Pedro M. Baeza &lt;<a class="reference external" href="mailto:pedro.baeza&#64;serviciosbaeza.com">pedro.baeza&#64;serviciosbaeza.com</a>&gt;</li>
<li>Ana Juaristi &lt;<a class="reference external" href="mailto:anajuarist&#64;avanzosc.es">anajuarist&#64;avanzosc.es</a>&gt;</li>
<li>Nicol??s Ramos &lt;<a class="reference external" href="mailto:contacto&#64;difusionvisual.com">contacto&#64;difusionvisual.com</a>&gt;</li>
<li>Mathias Markl &lt;<a class="reference external" href="mailto:mathias.markl&#64;mukit.at">mathias.markl&#64;mukit.at</a>&gt;</li>
<li>Serpent Consulting Services Pvt. Ltd. &lt;<a class="reference external" href="mailto:support&#64;serpentcs.com">support&#64;serpentcs.com</a>&gt;</li>
<li>Tharathip Chaweewongphan &lt;<a class="reference external" href="mailto:tharathipc&#64;ecosoft.co.th">tharathipc&#64;ecosoft.co.th</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id5">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/crm/tree/14.0/crm_lead_code">OCA/crm</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,72 @@
<odoo>
<record id="crm_lead_view_form_inherit" model="ir.ui.view">
<field name="name">crm.lead.form</field>
<field name="model">crm.lead</field>
<field name="inherit_id" ref="crm.crm_lead_view_form" />
<field name="arch" type="xml">
<field name="name" position="before">
<field name="code_rfi" class="oe_inline" attrs="{'invisible':[('type', '=', 'opportunity')]}"/>
<label for="code_rfi" string=" " class="oe_inline" attrs="{'invisible':[('type', '=', 'opportunity')]}"/>
<field name="code_rfp" class="oe_inline" attrs="{'invisible':[('type', '=', 'lead')]}"/>
<label for="code_rfp" string=" " class="oe_inline" attrs="{'invisible':[('type', '=', 'lead')]}"/>
<br/>
</field>
</field>
</record>
<record id="crm_case_tree_view_leads_inherit" model="ir.ui.view">
<field name="name">crm.lead.tree.lead</field>
<field name="model">crm.lead</field>
<field name="inherit_id" ref="crm.crm_case_tree_view_leads" />
<field name="arch" type="xml">
<field name="name" position="before">
<field name="code_rfi" />
</field>
</field>
</record>
<record id="view_crm_case_leads_filter_inherit" model="ir.ui.view">
<field name="name">crm.lead.search.lead</field>
<field name="model">crm.lead</field>
<field name="inherit_id" ref="crm.view_crm_case_leads_filter" />
<field name="arch" type="xml">
<field name="name" position="attributes">
<attribute
name="filter_domain"
>['|', ('name', 'ilike', self), ('code_rfi', 'ilike', self)]</attribute>
</field>
</field>
</record>
<record id="crm_case_tree_view_oppor_inherit" model="ir.ui.view">
<field name="name">crm.lead.tree.opportunity</field>
<field name="model">crm.lead</field>
<field name="inherit_id" ref="crm.crm_case_tree_view_oppor" />
<field name="arch" type="xml">
<field name="name" position="before">
<field name="code_rfp" />
</field>
</field>
</record>
<record id="crm_case_kanban_view_leads_inherit" model="ir.ui.view">
<field name="name">crm.lead.kanban.lead</field>
<field name="model">crm.lead</field>
<field name="inherit_id" ref="crm.crm_case_kanban_view_leads" />
<field name="arch" type="xml">
<field name="name" position="before">
<field name="code_rfp" />
</field>
</field>
</record>
<record id="view_crm_case_opportunities_filter_inherit" model="ir.ui.view">
<field name="name">crm.lead.search.opportunity</field>
<field name="model">crm.lead</field>
<field name="inherit_id" ref="crm.view_crm_case_opportunities_filter" />
<field name="arch" type="xml">
<field name="name" position="attributes">
<attribute
name="filter_domain"
>['|', ('name', 'ilike', self), ('code_rfp', 'ilike', self)]</attribute>
</field>
</field>
</record>
</odoo>

View File

@ -0,0 +1 @@
"# cup_is_customer_is_vendor"

View File

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import models

View File

@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
{
'name': "Is a Customer and Is a Vendor",
'summary': """
Add Field Is a Customer And Is a Vendor""",
'description': """
* Add Field Is a Customer And Is a Vendor checkbox Into The Partner Form For Identification.\n
* Easy To Use.\n
* User Can Manually Set / Unset Customer and Vendor Checkbox.\n
* Add Customer Filter In Sale Order.\n
* Add Vendor Filter In Purchase Order.
""",
'license': "LGPL-3",
'images': ['static/description/cupdev2.png'],
'author': "Yusup Nur Karimah",
'website': "https://yusupnurkarimah.github.io/",
# Categories can be used to filter modules in modules listing
# Check https://github.com/odoo/odoo/blob/12.0/odoo/addons/base/data/ir_module_category_data.xml
# for the full list
'category': 'Odex25-Sales/Odex25-Sales',
'version': '0.1',
# any module necessary for this one to work correctly
'depends': ['base','account','sale_management','purchase'],
# always loaded
'data': [
# 'security/ir.model.access.csv',
'views/views.xml',
],
}

View File

@ -0,0 +1,5 @@
# -*- coding: utf-8 -*-
from . import purchase
from . import res_partner
from . import sale

View File

@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api
class PurchaseOrder(models.Model):
_inherit = 'purchase.order'
READONLY_STATES = {
'purchase': [('readonly', True)],
'done': [('readonly', True)],
'cancel': [('readonly', True)],
}
partner_id = fields.Many2one(
'res.partner', string='Vendor', required=True,
states=READONLY_STATES, change_default=True,
tracking=True, domain="['|',('supplier_rank','>', 0),('is_supplier','=',True)]", help="You can find a vendor by its Name, TIN, Email or Internal Reference.")

View File

@ -0,0 +1,12 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api
class ResPartner(models.Model):
_inherit = 'res.partner'
is_customer = fields.Boolean(string='Is a Customer',
help="Check this box if this contact is a customer. It can be selected in sales orders.")
is_supplier = fields.Boolean(string='Is a Vendor',
help="Check this box if this contact is a vendor. It can be selected in purchase orders.")

View File

@ -0,0 +1,13 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api
class SaleOrder(models.Model):
_inherit = 'sale.order'
partner_id = fields.Many2one(
'res.partner', string='Customer', readonly=True,
states={'draft': [('readonly', False)], 'sent': [('readonly', False)]},
required=True, change_default=True, index=True, tracking=1,
domain="['|',('customer_rank','>', 0),('is_customer','=',True)]",)

View File

@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_cup_is_customer_is_vendor_cup_is_customer_is_vendor,cup_is_customer_is_vendor.cup_is_customer_is_vendor,model_cup_is_customer_is_vendor_cup_is_customer_is_vendor,,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_cup_is_customer_is_vendor_cup_is_customer_is_vendor cup_is_customer_is_vendor.cup_is_customer_is_vendor model_cup_is_customer_is_vendor_cup_is_customer_is_vendor 1 0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- Inherit Is Customer and Is Vendor -->
<record id="view_partner_form_inherit" model="ir.ui.view">
<field name="name">view_partner_form_inherit</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<xpath expr="//group[@name='sale']/field[@name='user_id']" position="before">
<field name="is_customer"/>
</xpath>
<xpath expr="//group[@name='purchase']/field[@name='property_supplier_payment_term_id']" position="before">
<field name="is_supplier"/>
</xpath>
</field>
</record>
<!-- Inherit Action -->
<record id="account.res_partner_action_customer" model="ir.actions.act_window">
<field name="name">Customers</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_customer': 1,'res_partner_search_mode': 'customer', 'default_is_company': True, 'default_customer_rank': 1, 'default_is_customer': True}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new customer in your address book
</p><p>
Odoo helps you easily track all activities related to a customer.
</p>
</field>
</record>
<record id="account.res_partner_action_supplier" model="ir.actions.act_window">
<field name="name">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_supplier': 1,'res_partner_search_mode': 'supplier', 'default_is_company': True, 'default_supplier_rank': 1, 'default_is_supplier': True}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new supplier in your address book
</p><p>
Odoo helps you easily track all activities related to a supplier.
</p>
</field>
</record>
<!-- Inherit Search -->
<record id="account.res_partner_view_search" model="ir.ui.view">
<field name="name">res.partner.search.inherit</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='inactive']" position="before">
<filter string="Customer Invoices" name="customer" domain="['|',('customer_rank','>', 0),('is_customer','=',True)]"/>
<filter string="Vendor Bills" name="supplier" domain="['|',('supplier_rank','>', 0),('is_supplier','=',True)]"/>
<separator/>
</xpath>
</field>
</record>
</data>
</odoo>

View File

@ -0,0 +1 @@
from . import models

View File

@ -0,0 +1,22 @@
{
"name": "Customer Credit Limit",
"summary": """Customer Credit Limit""",
"version": '14.0',
"category":'Odex25-Sales/Odex25-Sales',
'author': 'Expert Co. Ltd.',
'website': 'http://exp-sa.com',
"depends": ['odex25_global_discount', 'sale_partner_type'],
"data": [
'security/security.xml',
'views/res_partner.xml',
'views/res_config.xml',
'views/sale_order.xml',
],
"sequence": 3,
"application": False,
"installable": True,
"auto_install": False,
}

View File

@ -0,0 +1,226 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * customer_credit_limit
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-06-25 11:36+0000\n"
"PO-Revision-Date: 2023-06-25 11:36+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: customer_credit_limit
#: code:addons/customer_credit_limit/models/sale_order.py:0
#, python-format
msgid " You Need To Pay Old Invoices "
msgstr "تحتاج الي دفع الفواتير القديمة"
#. module: customer_credit_limit
#: model:ir.model.fields,field_description:customer_credit_limit.field_res_partner__allow
#: model:ir.model.fields,field_description:customer_credit_limit.field_res_users__allow
#: model:ir.model.fields,field_description:customer_credit_limit.field_sale_order__allow
msgid "Allow Sale"
msgstr "السماح بالبيع"
#. module: customer_credit_limit
#: model:ir.model.fields,field_description:customer_credit_limit.field_res_partner__block
#: model:ir.model.fields,field_description:customer_credit_limit.field_res_users__block
msgid "Block From Sale"
msgstr "منع من البيع"
#. module: customer_credit_limit
#: model:ir.model,name:customer_credit_limit.model_res_config_settings
msgid "Config Settings"
msgstr "ضبط الاعدادات"
#. module: customer_credit_limit
#: model:ir.model,name:customer_credit_limit.model_res_partner
msgid "Contact"
msgstr "جهة الاتصال"
#. module: customer_credit_limit
#: model_terms:ir.ui.view,arch_db:customer_credit_limit.inherit_view_partner_form
msgid "Credit Limit"
msgstr "حد الإئتمان"
#. module: customer_credit_limit
#: model:ir.model.fields,field_description:customer_credit_limit.field_res_partner__credit_limit
#: model:ir.model.fields,field_description:customer_credit_limit.field_res_users__credit_limit
msgid "Customer Credit Limit"
msgstr "الحد الإئتماني للعملاء"
#. module: customer_credit_limit
#: model:ir.model.fields,field_description:customer_credit_limit.field_res_partner__due_days
#: model:ir.model.fields,field_description:customer_credit_limit.field_res_users__due_days
msgid "Days To Pay"
msgstr "عدد الأيام المسموح بها للدفع"
#. module: customer_credit_limit
#: model:ir.module.category,name:customer_credit_limit.module_category_discounts
msgid "Discount"
msgstr "الخصم"
#. module: customer_credit_limit
#: model_terms:ir.ui.view,arch_db:customer_credit_limit.inherit_config_settings_view_form
msgid "Discounts"
msgstr "الخصومات"
#. module: customer_credit_limit
#: model:ir.model.fields,field_description:customer_credit_limit.field_res_config_settings__display_name
#: model:ir.model.fields,field_description:customer_credit_limit.field_res_partner__display_name
#: model:ir.model.fields,field_description:customer_credit_limit.field_sale_order__display_name
msgid "Display Name"
msgstr "الاسم المعروض"
#. module: customer_credit_limit
#: model:res.groups,name:customer_credit_limit.discount_firt_level
msgid "First Level"
msgstr "المستوي الاول"
#. module: customer_credit_limit
#: model:ir.model.fields,field_description:customer_credit_limit.field_res_config_settings__amount_limit_a
#: model_terms:ir.ui.view,arch_db:customer_credit_limit.inherit_config_settings_view_form
msgid "First Level Amount Limit"
msgstr "حد مبلغ المستوي الاول"
#. module: customer_credit_limit
#: model_terms:ir.ui.view,arch_db:customer_credit_limit.inherit_config_settings_view_form
msgid "First Level Percent Limit"
msgstr "حد نسبة المستوي الاول"
#. module: customer_credit_limit
#: model:ir.model.fields,field_description:customer_credit_limit.field_res_config_settings__percent_limit_a
msgid "First Level Percent Limit "
msgstr "حد نسبة المستوي الاول"
#. module: customer_credit_limit
#: model:res.groups,name:customer_credit_limit.discount_fourth_level
msgid "Fourth Level"
msgstr "المستوي الرابع"
#. module: customer_credit_limit
#: model:ir.model.fields,field_description:customer_credit_limit.field_res_config_settings__amount_limit_d
#: model_terms:ir.ui.view,arch_db:customer_credit_limit.inherit_config_settings_view_form
msgid "Fourth Level Amount Limit"
msgstr "حد مبلغ المستوي الرابع"
#. module: customer_credit_limit
#: model_terms:ir.ui.view,arch_db:customer_credit_limit.inherit_config_settings_view_form
msgid "Fourth Level Percent Limit"
msgstr "حد نسبة المستوي الرابع"
#. module: customer_credit_limit
#: model:ir.model.fields,field_description:customer_credit_limit.field_res_config_settings__percent_limit_d
msgid "Fourth Level Percent Limit "
msgstr "حد نسبة المستوي الرابع"
#. module: customer_credit_limit
#: model:ir.module.category,description:customer_credit_limit.module_category_discounts
msgid "Helps you handle your discounts."
msgstr "يساعدك على التعامل مع الخصومات الخاصة بك"
#. module: customer_credit_limit
#: model:ir.model.fields,field_description:customer_credit_limit.field_res_config_settings__id
#: model:ir.model.fields,field_description:customer_credit_limit.field_res_partner__id
#: model:ir.model.fields,field_description:customer_credit_limit.field_sale_order__id
msgid "ID"
msgstr "المُعرف"
#. module: customer_credit_limit
#: model:ir.model.fields,field_description:customer_credit_limit.field_res_config_settings____last_update
#: model:ir.model.fields,field_description:customer_credit_limit.field_res_partner____last_update
#: model:ir.model.fields,field_description:customer_credit_limit.field_sale_order____last_update
msgid "Last Modified on"
msgstr "آخر تعديل في"
#. module: customer_credit_limit
#: model:ir.model,name:customer_credit_limit.model_sale_order
msgid "Sales Order"
msgstr "أمر البيع"
#. module: customer_credit_limit
#: model:res.groups,name:customer_credit_limit.discount_second_level
msgid "Second Level"
msgstr "المستوي الثاني"
#. module: customer_credit_limit
#: model:ir.model.fields,field_description:customer_credit_limit.field_res_config_settings__amount_limit_b
#: model_terms:ir.ui.view,arch_db:customer_credit_limit.inherit_config_settings_view_form
msgid "Second Level Amount Limit"
msgstr "حد مبلغ المستوي الثاني"
#. module: customer_credit_limit
#: model_terms:ir.ui.view,arch_db:customer_credit_limit.inherit_config_settings_view_form
msgid "Second Level Percent Limit"
msgstr "حد نسبة المستوي الثاني"
#. module: customer_credit_limit
#: model:ir.model.fields,field_description:customer_credit_limit.field_res_config_settings__percent_limit_b
msgid "Second Level Percent Limit "
msgstr "حد نسبة المستوي الثاني"
#. module: customer_credit_limit
#: model_terms:ir.ui.view,arch_db:customer_credit_limit.inherit_config_settings_view_form
msgid "Set discounts for levels to use in sale."
msgstr "تعيين الخصومات للمستويات لاستخدامها في البيع"
#. module: customer_credit_limit
#: model:res.groups,name:customer_credit_limit.discount_third_level
msgid "Third Level"
msgstr "المستوي الثالث"
#. module: customer_credit_limit
#: model:ir.model.fields,field_description:customer_credit_limit.field_res_config_settings__amount_limit_c
#: model_terms:ir.ui.view,arch_db:customer_credit_limit.inherit_config_settings_view_form
msgid "Third Level Amount Limit"
msgstr "حد مبلغ المستوي الثالث"
#. module: customer_credit_limit
#: model_terms:ir.ui.view,arch_db:customer_credit_limit.inherit_config_settings_view_form
msgid "Third Level Percent Limit"
msgstr "حد نسبة المستوي الثالث"
#. module: customer_credit_limit
#: model:ir.model.fields,field_description:customer_credit_limit.field_res_config_settings__percent_limit_c
msgid "Third Level Percent Limit "
msgstr "حد نسبة المستوي الثالث"
#. module: customer_credit_limit
#: code:addons/customer_credit_limit/models/sale_order.py:0
#, python-format
msgid "This Partner Has limit Credit Which Is %s ,%s"
msgstr "العميل لدية حد ائتمان وهو %s ,%s"
#. module: customer_credit_limit
#: code:addons/customer_credit_limit/models/sale_order.py:0
#, python-format
msgid ""
"This Partner Is Blocked From Doing Sale Due To Delay In Payments,To Unlock "
"It Stop Block From Sale Order Or Customer Profile"
msgstr "هذا العميل ممنوع من القيام بالبيع بسبب التأخير في المدفوعات ، لإلغاء قفله وإيقافه من أمر البيع أو الملف الشخصي للعميل"
#. module: customer_credit_limit
#: code:addons/customer_credit_limit/models/sale_order.py:0
#, python-format
msgid "You Can Create Orders With Total %d"
msgstr "يمكنك انشاء امر بيع بالاجمالي %d"
#. module: customer_credit_limit
#: code:addons/customer_credit_limit/models/sale_order.py:0
#: code:addons/customer_credit_limit/models/sale_order.py:0
#, python-format
msgid "You cannot exceed amount limit which is %s ."
msgstr "لا يمكنك تجاوز حد المبلغ الذي هو %s ."
#. module: customer_credit_limit
#: code:addons/customer_credit_limit/models/sale_order.py:0
#, python-format
msgid "You cannot exceed percent limit which is %s."
msgstr "لا يمكنك تجاوز حد النسبة المئوية وهو %s."

View File

@ -0,0 +1,5 @@
# -*- coding: utf-8 -*-
from . import res_partner
from . import sale_order
from . import res_config

View File

@ -0,0 +1,55 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
percent_limit_a = fields.Float(string='First Level Percent Limit ',)
amount_limit_a = fields.Float(string='First Level Amount Limit',)
percent_limit_b = fields.Float(string='Second Level Percent Limit ',)
amount_limit_b = fields.Float(string='Second Level Amount Limit',)
percent_limit_c = fields.Float(string='Third Level Percent Limit ',)
amount_limit_c = fields.Float(string='Third Level Amount Limit',)
percent_limit_d = fields.Float(string='Fourth Level Percent Limit ',)
amount_limit_d = fields.Float(string='Fourth Level Amount Limit',)
def get_values(self):
res = super(ResConfigSettings, self).get_values()
res.update(
percent_limit_a=float(self.env['ir.config_parameter'].
get_param('percent_limit_a')),
amount_limit_a=float(self.env['ir.config_parameter'].
get_param('amount_limit_a')),
percent_limit_b=float(self.env['ir.config_parameter'].
get_param('percent_limit_b')),
amount_limit_b=float(self.env['ir.config_parameter'].
get_param('amount_limit_b')),
percent_limit_c=float(self.env['ir.config_parameter'].
get_param('percent_limit_c')),
amount_limit_c=float(self.env['ir.config_parameter'].
get_param('amount_limit_c')),
percent_limit_d=float(self.env['ir.config_parameter'].
get_param('percent_limit_d')),
amount_limit_d=float(self.env['ir.config_parameter'].
get_param('amount_limit_d')),
)
return res
def set_values(self):
super(ResConfigSettings, self).set_values()
# self.env['ir.config_parameter'].set_param('ks_enable_discount', self.ks_enable_discount)
# if self.ks_enable_discount:
self.env['ir.config_parameter'].set_param('percent_limit_a', self.percent_limit_a)
self.env['ir.config_parameter'].set_param('amount_limit_a', self.amount_limit_a)
self.env['ir.config_parameter'].set_param('percent_limit_b', self.percent_limit_b)
self.env['ir.config_parameter'].set_param('amount_limit_b', self.amount_limit_b)
self.env['ir.config_parameter'].set_param('percent_limit_c', self.percent_limit_c)
self.env['ir.config_parameter'].set_param('amount_limit_c', self.amount_limit_c)
self.env['ir.config_parameter'].set_param('percent_limit_d', self.percent_limit_d)
self.env['ir.config_parameter'].set_param('amount_limit_d', self.amount_limit_d)

View File

@ -0,0 +1,37 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models, _
from datetime import datetime, timedelta
class ResPartner(models.Model):
_inherit = "res.partner"
credit_limit = fields.Float(string='Customer Credit Limit', tracking=True)
block = fields.Boolean(string='Block From Sale', compute='_compute_sale_block')
allow = fields.Boolean(string='Allow Sale',groups='sales_team.group_sale_manager', tracking=True)
due_days = fields.Float(string='Days To Pay', default=30.0, tracking=True)
@api.depends('due_days','invoice_ids')
def _compute_sale_block(self):
'''this functin search for partner related open inovices with due date,
to determine whether to block customer from making sale or not'''
for rec in self:
rec.block = False
if rec.due_days > 0 :
today = datetime.now().date()
date = today - timedelta(days=rec.due_days)
invoices = rec.invoice_ids.filtered(lambda r: r.invoice_date_due and r.invoice_date_due <= date and r.move_type =='out_invoice' and r.state == 'posted')
if invoices:
rec.block = True

View File

@ -0,0 +1,71 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
class SaleOrder(models.Model):
_inherit = "sale.order"
allow = fields.Boolean(string='Allow Sale')
credit_limit = fields.Float(string='Credit Limit', related='partner_id.credit_limit')
customer_balance = fields.Float(string='Customer Balance', readonly=True)
def write(self, vals):
if 'partner_id' in vals:
partner = self.env['res.partner'].browse(vals['partner_id'])
self.customer_balance = partner.credit - partner.debit
return super(SaleOrder, self).write(vals)
@api.onchange('partner_id')
def get_allow_sale(self):
self.allow = self.partner_id.allow
def _action_confirm(self):
for rec in self:
if not rec.allow:
if rec.partner_id.block and not rec.partner_id.allow and rec.partner_type == 'postpaid':
raise ValidationError(
_("This Partner Is Blocked From Doing Sale Due To Delay In Payments,To Unlock It Stop Block From Sale Order Or Customer Profile"))
if rec.partner_id.credit_limit > 0 and rec.partner_type == 'postpaid':
last_total = rec.partner_id.credit + rec.amount_total
limit = rec.partner_id.credit_limit - rec.partner_id.credit
msg = (_("You Can Create Orders With Total %d")) % limit if limit > 0 else (
_(" You Need To Pay Old Invoices "))
if rec.partner_id.credit >= rec.partner_id.credit_limit or last_total > rec.partner_id.credit_limit:
raise ValidationError(
_("This Partner Has limit Credit Which Is %s ,%s") % (rec.partner_id.credit_limit, msg))
return super(SaleOrder, self)._action_confirm()
@api.constrains('discount_amount')
def check_discount_value(self):
percent_limit = 0.0
amount_limit = 0.0
if self.amount_untaxed:
percent = (self.discount_amount / self.amount_untaxed) * 100
if self.env.user.has_group('customer_credit_limit.discount_firt_level'):
percent_limit = float(self.env['ir.config_parameter'].sudo().get_param('percent_limit_a'))
amount_limit = float(self.env['ir.config_parameter'].sudo().get_param('amount_limit_a'))
elif self.env.user.has_group('customer_credit_limit.discount_second_level'):
percent_limit = float(self.env['ir.config_parameter'].sudo().get_param('percent_limit_b'))
amount_limit = float(self.env['ir.config_parameter'].sudo().get_param('amount_limit_b'))
elif self.env.user.has_group('customer_credit_limit.discount_third_level'):
percent_limit = float(self.env['ir.config_parameter'].sudo().get_param('percent_limit_c'))
amount_limit = float(self.env['ir.config_parameter'].sudo().get_param('amount_limit_c'))
elif self.env.user.has_group('customer_credit_limit.discount_fourth_level'):
percent_limit = float(self.env['ir.config_parameter'].sudo().get_param('percent_limit_d'))
amount_limit = float(self.env['ir.config_parameter'].sudo().get_param('amount_limit_d'))
if self.discount_method == 'per' and self.discount_amount > percent_limit:
raise ValidationError(_('You cannot exceed percent limit which is %s.') % percent_limit)
if self.discount_method == 'fix':
if self.discount_amount > amount_limit:
raise ValidationError(_('You cannot exceed amount limit which is %s .') % amount_limit)
elif percent > percent_limit:
raise ValidationError(_('You cannot exceed amount limit which is %s .') % percent_limit)

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record model="ir.module.category" id="module_category_discounts">
<field name="name">Discount</field>
<field name="description">Helps you handle your discounts.</field>
</record>
<record id="discount_firt_level" model="res.groups">
<field name="name">First Level</field>
<field name="category_id" ref="module_category_discounts"/>
</record>
<record id="discount_third_level" model="res.groups">
<field name="name">Third Level</field>
<field name="category_id" ref="module_category_discounts"/>
</record>
<record id="discount_second_level" model="res.groups">
<field name="name">Second Level</field>
<field name="category_id" ref="module_category_discounts"/>
</record>
<record id="discount_fourth_level" model="res.groups">
<field name="name">Fourth Level</field>
<field name="category_id" ref="module_category_discounts"/>
</record>
</data>
</odoo>

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Some files were not shown because too many files have changed in this diff Show More