Add odex25_sales
|
|
@ -1,2 +1,2 @@
|
|||
# odex25-standard-moduless
|
||||
# odex25-standard-modules
|
||||
This Repo contains general standard modules for all projects.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
@ -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
|
||||
|
|
@ -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'],
|
||||
}
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Part of BrowseInfo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from . import multi_product_selection
|
||||
|
|
@ -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},
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -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
|
||||
|
|
After Width: | Height: | Size: 261 KiB |
|
After Width: | Height: | Size: 138 KiB |
|
After Width: | Height: | Size: 164 KiB |
|
After Width: | Height: | Size: 262 KiB |
|
After Width: | Height: | Size: 204 KiB |
|
After Width: | Height: | Size: 148 KiB |
|
After Width: | Height: | Size: 86 KiB |
|
After Width: | Height: | Size: 250 KiB |
|
After Width: | Height: | Size: 114 KiB |
|
After Width: | Height: | Size: 177 KiB |
|
After Width: | Height: | Size: 161 KiB |
|
After Width: | Height: | Size: 260 KiB |
|
After Width: | Height: | Size: 202 KiB |
|
After Width: | Height: | Size: 126 KiB |
|
After Width: | Height: | Size: 445 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
|
@ -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 & 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>
|
||||
|
After Width: | Height: | Size: 7.5 KiB |
|
After Width: | Height: | Size: 69 KiB |
|
After Width: | Height: | Size: 348 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 99 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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>
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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>
|
||||
|
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import models
|
||||
|
|
@ -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,
|
||||
}
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import crm_lead
|
||||
|
||||
|
|
@ -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
|
||||
|
|
@ -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'), '&', ('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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import models
|
||||
|
|
@ -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,
|
||||
}
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import hr_expence
|
||||
from . import crm_lead
|
||||
|
|
@ -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
|
||||
|
|
@ -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')
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
##############################################################################
|
||||
# For copyright and license notices, see __manifest__.py file in root directory
|
||||
##############################################################################
|
||||
|
||||
from . import models
|
||||
|
||||
|
|
@ -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",
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
#############################################################################
|
||||
# For copyright and license notices, see __manifest__.py file in root directory
|
||||
##############################################################################
|
||||
|
||||
from . import crm_lead
|
||||
|
|
@ -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
|
||||
|
After Width: | Height: | Size: 9.2 KiB |
|
|
@ -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 <<a class="reference external" href="mailto:oihanecrucelaegi@avanzosc.es">oihanecrucelaegi@avanzosc.es</a>></li>
|
||||
<li>Pedro M. Baeza <<a class="reference external" href="mailto:pedro.baeza@serviciosbaeza.com">pedro.baeza@serviciosbaeza.com</a>></li>
|
||||
<li>Ana Juaristi <<a class="reference external" href="mailto:anajuarist@avanzosc.es">anajuarist@avanzosc.es</a>></li>
|
||||
<li>Nicol??s Ramos <<a class="reference external" href="mailto:contacto@difusionvisual.com">contacto@difusionvisual.com</a>></li>
|
||||
<li>Mathias Markl <<a class="reference external" href="mailto:mathias.markl@mukit.at">mathias.markl@mukit.at</a>></li>
|
||||
<li>Serpent Consulting Services Pvt. Ltd. <<a class="reference external" href="mailto:support@serpentcs.com">support@serpentcs.com</a>></li>
|
||||
<li>Tharathip Chaweewongphan <<a class="reference external" href="mailto:tharathipc@ecosoft.co.th">tharathipc@ecosoft.co.th</a>></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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -0,0 +1 @@
|
|||
"# cup_is_customer_is_vendor"
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import models
|
||||
|
|
@ -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',
|
||||
],
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import purchase
|
||||
from . import res_partner
|
||||
from . import sale
|
||||
|
|
@ -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.")
|
||||
|
||||
|
|
@ -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.")
|
||||
|
||||
|
|
@ -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)]",)
|
||||
|
||||
|
|
@ -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
|
||||
|
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
|
@ -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>
|
||||
|
|
@ -0,0 +1 @@
|
|||
from . import models
|
||||
|
|
@ -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,
|
||||
|
||||
}
|
||||
|
|
@ -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."
|
||||
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import res_partner
|
||||
from . import sale_order
|
||||
from . import res_config
|
||||
|
|
@ -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)
|
||||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
@ -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)
|
||||
|
|
@ -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>
|
||||
|
After Width: | Height: | Size: 32 KiB |