summaryrefslogtreecommitdiff
path: root/addons/sale_management/views
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/sale_management/views
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/sale_management/views')
-rw-r--r--addons/sale_management/views/digest_views.xml17
-rw-r--r--addons/sale_management/views/res_config_settings_views.xml50
-rw-r--r--addons/sale_management/views/sale_management_views.xml66
-rw-r--r--addons/sale_management/views/sale_order_template_views.xml149
-rw-r--r--addons/sale_management/views/sale_order_views.xml109
-rw-r--r--addons/sale_management/views/sale_portal_templates.xml110
6 files changed, 501 insertions, 0 deletions
diff --git a/addons/sale_management/views/digest_views.xml b/addons/sale_management/views/digest_views.xml
new file mode 100644
index 00000000..1193758e
--- /dev/null
+++ b/addons/sale_management/views/digest_views.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <record id="digest_digest_view_form" model="ir.ui.view">
+ <field name="name">digest.digest.view.form.inherit.sale.order</field>
+ <field name="model">digest.digest</field>
+ <field name="inherit_id" ref="digest.digest_digest_view_form" />
+ <field name="arch" type="xml">
+ <xpath expr="//group[@name='kpi_sales']" position="attributes">
+ <attribute name="string">Sales</attribute>
+ <attribute name="groups">sales_team.group_sale_salesman_all_leads</attribute>
+ </xpath>
+ <xpath expr="//group[@name='kpi_sales']" position="inside">
+ <field name="kpi_all_sale_total"/>
+ </xpath>
+ </field>
+ </record>
+</odoo>
diff --git a/addons/sale_management/views/res_config_settings_views.xml b/addons/sale_management/views/res_config_settings_views.xml
new file mode 100644
index 00000000..3fbdc4d8
--- /dev/null
+++ b/addons/sale_management/views/res_config_settings_views.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+
+ <record id="res_config_settings_view_form" model="ir.ui.view">
+ <field name="name">res.config.settings.view.form.inherit.sale.management</field>
+ <field name="model">res.config.settings</field>
+ <field name="inherit_id" ref="sale.res_config_settings_view_form"/>
+ <field name="arch" type="xml">
+ <xpath expr="//div[@id='confirmation_email_setting']" position="after">
+ <div class="col-12 col-lg-6 o_setting_box" id="standardized_offers_setting">
+ <div class="o_setting_left_pane">
+ <field name="group_sale_order_template"/>
+ <field name="module_sale_quotation_builder" invisible="1"/>
+ </div>
+ <div class="o_setting_right_pane">
+ <label for="group_sale_order_template"/>
+ <a href="https://www.odoo.com/documentation/14.0/applications/sales/sales/send_quotations/quote_template.html" title="Documentation" class="o_doc_link" target="_blank"></a>
+ <div class="text-muted">
+ Create standardized offers with default products
+ </div>
+ <div class="content-group" attrs="{'invisible': [('group_sale_order_template', '=', False)]}">
+ <div class="mt16">
+ <label for="company_so_template_id" class="o_light_label"/>
+ <field name="company_so_template_id" class="oe_inline"/>
+ </div>
+ <div class="mt8">
+ <button name="%(sale_management.sale_order_template_action)d" icon="fa-arrow-right" type="action" string="Quotation Templates" class="btn-link"/>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="col-12 col-lg-6 o_setting_box"
+ id="design_quotation_template_setting"
+ attrs="{'invisible': [('group_sale_order_template','=',False)]}">
+ <div class="o_setting_left_pane">
+ <field name="module_sale_quotation_builder"/>
+ </div>
+ <div class="o_setting_right_pane">
+ <label for="module_sale_quotation_builder"/>
+ <div class="text-muted">
+ Design your quotation templates using building blocks<br/>
+ <em attrs="{'invisible': [('module_sale_quotation_builder','=',False)]}">Warning: this option will install the Website app.</em>
+ </div>
+ </div>
+ </div>
+ </xpath>
+ </field>
+ </record>
+
+</odoo>
diff --git a/addons/sale_management/views/sale_management_views.xml b/addons/sale_management/views/sale_management_views.xml
new file mode 100644
index 00000000..6b838a04
--- /dev/null
+++ b/addons/sale_management/views/sale_management_views.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <record id="sale.sale_menu_root" model="ir.ui.menu">
+ <field name="active" eval="True"/>
+ </record>
+ <record id="sale.menu_report_product_all" model="ir.ui.menu">
+ <field name="active" eval="True"/>
+ </record>
+ <record id="sale.menu_sales_config" model="ir.ui.menu">
+ <field name="active" eval="True"/>
+ </record>
+ <record id="sale.product_menu_catalog" model="ir.ui.menu">
+ <field name="active" eval="True"/>
+ </record>
+ <record id="sale.menu_product" model="ir.ui.menu">
+ <field name="active" eval="True"/>
+ </record>
+ <record id="sale.menu_product_template_action" model="ir.ui.menu">
+ <field name="active" eval="True"/>
+ </record>
+ <record id="sale.prod_config_main" model="ir.ui.menu">
+ <field name="active" eval="True"/>
+ </record>
+ <record id="sale.menu_products" model="ir.ui.menu">
+ <field name="active" eval="True"/>
+ </record>
+ <record id="sale.next_id_16" model="ir.ui.menu">
+ <field name="active" eval="True"/>
+ </record>
+ <record id="sale.menu_product_uom_form_action" model="ir.ui.menu">
+ <field name="active" eval="True"/>
+ </record>
+ <record id="sale.menu_product_uom_categ_form_action" model="ir.ui.menu">
+ <field name="active" eval="True"/>
+ </record>
+ <record id="sale.menu_product_pricelist_main" model="ir.ui.menu">
+ <field name="active" eval="True"/>
+ </record>
+ <record id="sale.menu_sale_order" model="ir.ui.menu">
+ <field name="active" eval="True"/>
+ </record>
+ <record id="sale.menu_sale_invoicing" model="ir.ui.menu">
+ <field name="active" eval="True"/>
+ </record>
+ <record id="sale.menu_sale_order_invoice" model="ir.ui.menu">
+ <field name="active" eval="True"/>
+ </record>
+ <record id="sale.menu_sale_order_upselling" model="ir.ui.menu">
+ <field name="active" eval="True"/>
+ </record>
+ <record id="sale.menu_sale_quotations" model="ir.ui.menu">
+ <field name="active" eval="True"/>
+ </record>
+
+ <record id="res_config_settings_view_form_inherit_sale_management" model="ir.ui.view">
+ <field name="name">res.config.settings.view.form.inherit.sale.management</field>
+ <field name="model">res.config.settings</field>
+ <field name="inherit_id" ref="sale.res_config_settings_view_form"/>
+ <field name="arch" type="xml">
+ <xpath expr="//div[@data-key='sale_management']" position="attributes">
+ <attribute name="class">app_settings_block</attribute>
+ </xpath>
+ </field>
+ </record>
+
+</odoo>
diff --git a/addons/sale_management/views/sale_order_template_views.xml b/addons/sale_management/views/sale_order_template_views.xml
new file mode 100644
index 00000000..cac1d4d5
--- /dev/null
+++ b/addons/sale_management/views/sale_order_template_views.xml
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <record id="sale_order_template_view_search" model="ir.ui.view">
+ <field name="name">sale.order.template.search</field>
+ <field name="model">sale.order.template</field>
+ <field name="arch" type="xml">
+ <search string="Search Quotation Template">
+ <field name="name"/>
+ <filter string="Archived" name="inactive" domain="[('active','=', False)]"/>
+ </search>
+ </field>
+ </record>
+
+ <record id="sale_order_template_view_form" model="ir.ui.view">
+ <field name="name">sale.order.template.form</field>
+ <field name="model">sale.order.template</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <form string="Quotation Template">
+ <sheet>
+ <div name="button_box" class="oe_button_box"/>
+ <widget name="web_ribbon" title="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
+ <div class="oe_title">
+ <label for="name" class="oe_edit_only"/>
+ <h1>
+ <field name="name" placeholder="Quotation Template"/>
+ </h1>
+ </div>
+ <group>
+ <group>
+ <field name="active" invisible="1"/>
+ <label for="number_of_days" string="Quotation expires after"/>
+ <div id="number_of_days">
+ <field name="number_of_days" class="oe_inline"/> days
+ </div>
+ </group>
+ <group>
+ <field name="company_id" options="{'no_create': True}" groups="base.group_multi_company"/>
+ </group>
+ </group>
+ <notebook name="main_book">
+ <page string="Lines" name="order_lines">
+ <field name="sale_order_template_line_ids" widget="section_and_note_one2many">
+ <form string="Quotation Template Lines">
+ <!--
+ We need the sequence field to be here for new lines to be added at the correct position.
+ TODO: at some point we want to fix this in the framework so that an invisible field is not required.
+ -->
+ <field name="sequence" invisible="1"/>
+ <field name="display_type" invisible="1"/>
+ <field name="product_uom_category_id" invisible="1"/>
+ <group attrs="{'invisible': [('display_type', '!=', False)]}">
+ <group>
+ <field name="product_id" attrs="{'required': [('display_type', '=', False)]}"/>
+ <label for="product_uom_qty"/>
+ <div>
+ <field name="product_uom_qty" class="oe_inline"/>
+ </div>
+ </group>
+ </group>
+ <notebook colspan="4" name="description">
+ <page string="Description" name="order_description" attrs="{'invisible': [('display_type', '!=', False)]}">
+ <field name="name" />
+ </page>
+ <page string="Section" name="order_section" attrs="{'invisible': [('display_type', '!=', 'line_section')]}">
+ <field name="name" />
+ </page>
+ <page string="Note" name="order_note" attrs="{'invisible': [('display_type', '!=', 'line_note')]}">
+ <field name="name" />
+ </page>
+ </notebook>
+ </form>
+ <tree string="Quotation Template Lines" editable="bottom">
+ <control>
+ <create name="add_product_control" string="Add a product"/>
+ <create name="add_section_control" string="Add a section" context="{'default_display_type': 'line_section'}"/>
+ <create name="add_note_control" string="Add a note" context="{'default_display_type': 'line_note'}"/>
+ </control>
+
+ <field name="display_type" invisible="1"/>
+ <field name="sequence" widget="handle"/>
+ <field name="product_id"/>
+ <field name="name" widget="section_and_note_text"/>
+ <field name="product_uom_qty"/>
+ <field name="product_uom_category_id" invisible="1"/>
+ <field
+ name="product_uom_id"
+ groups="uom.group_uom"
+ attrs="{'required': [('display_type', '=', False)]}"
+ />
+ </tree>
+ </field>
+ </page>
+ <page string="Optional Products" name="optional_products">
+ <field name="sale_order_template_option_ids">
+ <tree string="Quotation Template Lines" editable="bottom">
+ <field name="product_id"/>
+ <field name="name"/>
+ <field name="quantity"/>
+ <field name="product_uom_category_id" invisible="1"/>
+ <field name="uom_id" groups="uom.group_uom"/>
+ </tree>
+ </field>
+ </page>
+ <page string="Confirmation" name="confirmation">
+ <group>
+ <field name="require_signature"/>
+ <field name="require_payment"/>
+ <field name="mail_template_id" context="{'default_model':'sale.order'}"/>
+ </group>
+ </page>
+ </notebook>
+ <field name="note" nolabel="1"
+ placeholder="The Administrator can set default Terms &amp; Conditions in Sales Settings. Terms set here will show up instead if you select this quotation template."/>
+ </sheet>
+ </form>
+ </field>
+ </record>
+
+ <record id="sale_order_template_view_tree" model="ir.ui.view">
+ <field name="name">sale.order.template.tree</field>
+ <field name="model">sale.order.template</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <tree string="Quotation Template">
+ <field name="name"/>
+ </tree>
+ </field>
+ </record>
+
+ <record id="sale_order_template_action" model="ir.actions.act_window">
+ <field name="name">Quotation Templates</field>
+ <field name="type">ir.actions.act_window</field>
+ <field name="res_model">sale.order.template</field>
+ <field name="view_mode">tree,form</field>
+ <field name="help" type="html">
+ <p class="o_view_nocontent_smiling_face">
+ Create your quotation template
+ </p><p>
+ Use templates to create polished, professional quotes in minutes.
+ Send these quotes by email and let your customers sign online.
+ Use cross-selling and discounts to push and boost your sales.
+ </p>
+ </field>
+ </record>
+
+ <menuitem id="sale_order_template_menu" action="sale_order_template_action" parent="sale.menu_sales_config" sequence="1" name="Quotation Templates" groups="sale_management.group_sale_order_template"/>
+
+</odoo>
diff --git a/addons/sale_management/views/sale_order_views.xml b/addons/sale_management/views/sale_order_views.xml
new file mode 100644
index 00000000..ddffddf1
--- /dev/null
+++ b/addons/sale_management/views/sale_order_views.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0"?>
+<odoo>
+ <record id="sale_order_form_quote" model="ir.ui.view">
+ <field name="name">sale.order.form.payment</field>
+ <field name="model">sale.order</field>
+ <field name="inherit_id" ref="sale.view_order_form"/>
+ <field name="arch" type="xml">
+
+ <xpath expr="//page/field[@name='order_line']/.." position="after">
+ <page string="Optional Products" name="optional_products" attrs="{'invisible': [('state', 'not in', ['draft', 'sent'])]}">
+ <field name="sale_order_option_ids" mode="tree,form,kanban">
+ <form string="Optional Products">
+ <group>
+ <field name="product_id" domain="[('sale_ok', '=', True), '|', ('company_id', '=', False), ('company_id', '=', parent.company_id)]"/>
+ <field name="name"/>
+ <field name="quantity"/>
+ <field name="product_uom_category_id" invisible="1"/>
+ <field name="uom_id" groups="uom.group_uom"/>
+ <field name="price_unit"/>
+ <field name="discount" groups="product.group_discount_per_so_line"/>
+ <field name="is_present" />
+ </group>
+ </form>
+ <kanban class="o_kanban_mobile">
+ <field name="product_id"/>
+ <field name="quantity"/>
+ <field name="uom_id" groups="uom.group_uom"/>
+ <field name="price_unit"/>
+ <field name="is_present" />
+ <templates>
+ <t t-name="kanban-box">
+ <div class="oe_kanban_card oe_kanban_global_click">
+ <div class="row">
+ <div class="col-10">
+ <strong>
+ <span>
+ <t t-esc="record.product_id.value"/>
+ </span>
+ </strong>
+ </div>
+ <div class="col-2">
+ <button name="button_add_to_order" class="btn btn-link oe_link fa fa-shopping-cart" title="Add to order lines" type="object" attrs="{'invisible': [('is_present', '=', True)]}"/>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-12 text-muted">
+ <span>
+ Quantity:
+ <t t-esc="record.quantity.value"/>
+ <t t-esc="record.uom_id.value"/>
+ </span>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-12 text-muted">
+ <span>
+ Unit Price:
+ <t t-esc="record.price_unit.value"/>
+ </span>
+ </div>
+ </div>
+ </div>
+ </t>
+ </templates>
+ </kanban>
+ <tree string="Sales Quotation Template Lines" editable="bottom" decoration-success="is_present == True">
+ <control>
+ <create name="add_product_control" string="Add a product"/>
+ </control>
+ <field name="sequence" widget="handle"/>
+ <field name="product_id" domain="[('sale_ok', '=', True), '|', ('company_id', '=', False), ('company_id', '=', parent.company_id)]"/>
+ <field name="name" optional="show"/>
+ <field name="quantity"/>
+ <field name="uom_id" string="UoM" groups="uom.group_uom" optional="show"/>
+ <field name="product_uom_category_id" invisible="1"/>
+ <field name="price_unit"/>
+ <field name="discount" string="Disc.%" groups="product.group_discount_per_so_line" optional="show"/>
+ <field name="is_present" invisible="1" />
+ <button name="button_add_to_order" class="oe_link" icon="fa-shopping-cart" title="Add to order lines" type="object" attrs="{'invisible': [('is_present', '=', True)]}"/>
+ </tree>
+ </field>
+ </page>
+ </xpath>
+
+ <xpath expr="//field[@name='partner_shipping_id']" position="after">
+ <field name="sale_order_template_id" context="{'company_id': company_id}"
+ options="{'no_create': True, 'no_open': True}"
+ groups="sale_management.group_sale_order_template"
+ />
+ </xpath>
+
+ </field>
+ </record>
+
+ <record id="sale.action_quotations" model="ir.actions.act_window">
+ <field name="help" type="html">
+ <p class="o_view_nocontent_smiling_face">
+ Create a new quotation, the first step of a new sale!
+ </p>
+ <p>
+ Once the quotation is confirmed by the customer, it becomes a sales order.<br/> You will be able to create an invoice and collect the payment.
+ </p>
+ </field>
+ </record>
+
+ <menuitem id="menu_product_attribute_action"
+ action="product.attribute_action"
+ parent="sale.prod_config_main" groups="product.group_product_variant" sequence="1"/>
+</odoo>
diff --git a/addons/sale_management/views/sale_portal_templates.xml b/addons/sale_management/views/sale_portal_templates.xml
new file mode 100644
index 00000000..d5e9ea4f
--- /dev/null
+++ b/addons/sale_management/views/sale_portal_templates.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+
+ <template id="assets_frontend" inherit_id="web.assets_frontend" name="Website Quote frontend assets">
+ <xpath expr="." position="inside">
+ <script type="text/javascript" src="/sale_management/static/src/js/sale_management.js"></script>
+ </xpath>
+ </template>
+
+ <template id="sale_order_portal_content_inherit_sale_management" name="Order Options" inherit_id="sale.sale_order_portal_content">
+
+ <xpath expr="//section[@id='details']//t[@t-set='display_discount']" position="after">
+ <t t-set="display_remove" t-value="sale_order.state in ('draft', 'sent') and any(line.sale_order_option_ids for line in sale_order.order_line)"/>
+ </xpath>
+
+ <xpath expr="//section[@id='details']//table[@id='sales_order_table']/thead/tr" position="inside">
+ <!-- add blank Tr in thead for layout conciseness -->
+ <th t-if="display_remove">
+ </th>
+ </xpath>
+
+ <xpath expr="//section[@id='details']//t[@t-if='not line.display_type']" position="inside">
+ <td class="text-center" t-if="display_remove">
+ <a t-att-data-line-id="line.id" t-att-data-unlink="True" href="#" class="mb8 js_update_line_json d-print-none" t-if="sale_order.state in ('draft', 'sent') and line.sale_order_option_ids" aria-label="Remove" title="Remove">
+ <span class="fa fa-trash-o"></span>
+ </a>
+ </td>
+ </xpath>
+
+ <xpath expr="//section[@id='signature']" position="after">
+ <t t-if="any((not option.is_present) for option in sale_order.sale_order_option_ids)">
+ <section>
+ <h3>Options</h3>
+ <t t-set="display_discount" t-value="True in [option.discount > 0 for option in sale_order.sale_order_option_ids]"/>
+ <table class="table table-sm">
+ <thead>
+ <tr>
+ <th class="text-left">Product</th>
+ <th t-if="display_discount" class="text-right">Disc.%
+ </th>
+ <th class="text-right">Unit Price</th>
+ <th t-if="sale_order.state in ['draft', 'sent'] and report_type == 'html'"></th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr t-foreach="sale_order.sale_order_option_ids" t-as="option">
+ <t t-if="not option.is_present">
+ <td>
+ <div t-field="option.name"/>
+ </td>
+ <td t-if="display_discount" class="text-right">
+ <strong t-if="option.discount" class="text-info">
+ <t t-esc="((option.discount % 1) and '%s' or '%d') % option.discount"/>%
+ </strong>
+ </td>
+ <td>
+ <strong class="text-right">
+ <div t-field="option.price_unit"
+ t-options='{"widget": "monetary", "display_currency": sale_order.pricelist_id.currency_id}'
+ t-att-style="option.discount and 'text-decoration: line-through' or None"
+ t-att-class="option.discount and 'text-danger' or None"/>
+ <div t-if="option.discount">
+ <t t-esc="(1-option.discount / 100.0) * option.price_unit" t-options='{"widget": "monetary", "display_currency": sale_order.pricelist_id.currency_id}'/>
+ </div>
+ </strong>
+ </td>
+ <td class="text-center" t-if="sale_order.state in ['draft', 'sent'] and report_type == 'html'">
+ <a t-att-data-option-id="option.id" href="#" class="mb8 js_add_optional_products d-print-none" aria-label="Add to cart" title="Add to cart">
+ <span class="fa fa-shopping-cart"/>
+ </a>
+ </td>
+ </t>
+ </tr>
+ </tbody>
+ </table>
+ </section>
+ </t>
+ </xpath>
+
+ <xpath expr="//section[@id='details']//div[@id='quote_qty']" position="replace">
+ <t t-if="sale_order.state in ['draft', 'sent'] and line.sale_order_option_ids">
+ <div class="input-group js_quantity_container pull-right">
+
+ <div class="input-group-prepend d-print-none">
+ <span class="input-group-text d-none d-md-inline-block">
+ <a t-att-data-line-id="line.id" t-att-data-remove="True" href="#" class="js_update_line_json" aria-label="Remove one" title="Remove one">
+ <span class="fa fa-minus"/>
+ </a>
+ </span>
+ </div>
+ <!-- TODO add uom in this case too -->
+ <input type="text" class="js_quantity form-control" t-att-data-line-id="line.id" t-att-value="line.product_uom_qty"/>
+ <div class="input-group-append d-print-none">
+ <span class="input-group-text d-none d-md-inline-block">
+ <a t-att-data-line-id="line.id" href="#" class="js_update_line_json" aria-label="Add one" title="Add one">
+ <span class="fa fa-plus"/>
+ </a>
+ </span>
+ </div>
+ </div>
+ </t>
+ <t t-else="">
+ <span t-field="line.product_uom_qty"/>
+ <span t-field="line.product_uom"/>
+ </t>
+ </xpath>
+
+ </template>
+
+</odoo>