Initial commit: Sale packages

This commit is contained in:
Ernad Husremovic 2025-08-29 15:20:49 +02:00
commit 14e3d26998
6469 changed files with 2479670 additions and 0 deletions

View file

@ -0,0 +1,48 @@
# Sales
This module contains all the common features of Sales Management and eCommerce.
## Installation
```bash
pip install odoo-bringout-oca-ocb-sale
```
## Dependencies
This addon depends on:
- sales_team
- account_payment
- utm
## Manifest Information
- **Name**: Sales
- **Version**: 1.2
- **Category**: Sales/Sales
- **License**: LGPL-3
- **Installable**: True
## Source
Based on [OCA/OCB](https://github.com/OCA/OCB) branch 16.0, addon `sale`.
## License
This package maintains the original LGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

@ -0,0 +1,32 @@
# Architecture
```mermaid
flowchart TD
U[Users] -->|HTTP| V[Views and QWeb Templates]
V --> C[Controllers]
V --> W[Wizards Transient Models]
C --> M[Models and ORM]
W --> M
M --> R[Reports]
DX[Data XML] --> M
S[Security ACLs and Groups] -. enforces .-> M
subgraph Sale Module - sale
direction LR
M:::layer
W:::layer
C:::layer
V:::layer
R:::layer
S:::layer
DX:::layer
end
classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px
```
Notes
- Views include tree/form/kanban templates and report templates.
- Controllers provide website/portal routes when present.
- Wizards are UI flows implemented with `models.TransientModel`.
- Data XML loads data/demo records; Security defines groups and access.

View file

@ -0,0 +1,3 @@
# Configuration
Refer to Odoo settings for sale. Configure related models, access rights, and options as needed.

View file

@ -0,0 +1,17 @@
# Controllers
HTTP routes provided by this module.
```mermaid
sequenceDiagram
participant U as User/Client
participant C as Module Controllers
participant O as ORM/Views
U->>C: HTTP GET/POST (routes)
C->>O: ORM operations, render templates
O-->>U: HTML/JSON/PDF
```
Notes
- See files in controllers/ for route definitions.

View file

@ -0,0 +1,7 @@
# Dependencies
This addon depends on:
- [sales_team](../../odoo-bringout-oca-ocb-sales_team)
- [account_payment](../../odoo-bringout-oca-ocb-account_payment)
- [utm](../../odoo-bringout-oca-ocb-utm)

View file

@ -0,0 +1,4 @@
# FAQ
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
- Q: How to enable? A: Start server with --addon sale or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-ocb-sale"
# or
uv pip install odoo-bringout-oca-ocb-sale"
```

View file

@ -0,0 +1,103 @@
# Models
Detected core models and extensions in sale.
```mermaid
classDiagram
class account_move
class sale_order
class sale_order_line
class account_analytic_applicability
class account_analytic_line
class account_move_line
class analytic_mixin
class crm_team
class payment_provider
class payment_transaction
class product_attribute_custom_value
class product_packaging
class product_product
class product_template
class res_company
class res_config_settings
class res_partner
class utm_campaign
class res_company
sale_order --> res_company : company_id (Many2one)
class res_partner
sale_order --> res_partner : partner_id (Many2one)
class res_partner
sale_order --> res_partner : partner_invoice_id (Many2one)
class res_partner
sale_order --> res_partner : partner_shipping_id (Many2one)
class account_fiscal_position
sale_order --> account_fiscal_position : fiscal_position_id (Many2one)
class account_payment_term
sale_order --> account_payment_term : payment_term_id (Many2one)
class product_pricelist
sale_order --> product_pricelist : pricelist_id (Many2one)
class res_users
sale_order --> res_users : user_id (Many2one)
class crm_team
sale_order --> crm_team : team_id (Many2one)
class sale_order_line
sale_order --> sale_order_line : order_line (One2many)
class account_move
sale_order --> account_move : invoice_ids (Many2many)
class payment_transaction
sale_order --> payment_transaction : transaction_ids (Many2many)
class payment_transaction
sale_order --> payment_transaction : authorized_transaction_ids (Many2many)
class account_analytic_account
sale_order --> account_analytic_account : analytic_account_id (Many2one)
class crm_tag
sale_order --> crm_tag : tag_ids (Many2many)
class res_country
sale_order --> res_country : tax_country_id (Many2one)
class sale_order
sale_order_line --> sale_order : order_id (Many2one)
class product_product
sale_order_line --> product_product : product_id (Many2one)
class product_template
sale_order_line --> product_template : product_template_id (Many2one)
class product_attribute_custom_value
sale_order_line --> product_attribute_custom_value : product_custom_attribute_value_ids (One2many)
class product_template_attribute_value
sale_order_line --> product_template_attribute_value : product_no_variant_attribute_value_ids (Many2many)
class uom_uom
sale_order_line --> uom_uom : product_uom (Many2one)
class account_tax
sale_order_line --> account_tax : tax_id (Many2many)
class product_pricelist_item
sale_order_line --> product_pricelist_item : pricelist_item_id (Many2one)
class product_packaging
sale_order_line --> product_packaging : product_packaging_id (Many2one)
class account_analytic_line
sale_order_line --> account_analytic_line : analytic_line_ids (One2many)
class account_move_line
sale_order_line --> account_move_line : invoice_lines (Many2many)
class sale_order
res_partner --> sale_order : sale_order_ids (One2many)
class res_company
utm_campaign --> res_company : company_id (Many2one)
class res_currency
utm_campaign --> res_currency : currency_id (Many2one)
class sale_order
payment_transaction --> sale_order : sale_order_ids (Many2many)
class sale_order_line
product_attribute_custom_value --> sale_order_line : sale_order_line_id (Many2one)
class sale_order_line
account_move_line --> sale_order_line : sale_line_ids (Many2many)
class sale_order_line
account_analytic_line --> sale_order_line : so_line (Many2one)
class product_product
res_config_settings --> product_product : deposit_default_product_id (Many2one)
class mail_template
res_config_settings --> mail_template : invoice_mail_template_id (Many2one)
class crm_team
account_move --> crm_team : team_id (Many2one)
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

@ -0,0 +1,6 @@
# Overview
Packaged Odoo addon: sale. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon sale
- License: LGPL-3

View file

@ -0,0 +1,39 @@
# Reports
Report definitions and templates in sale.
```mermaid
classDiagram
class SaleReport
Model <|-- SaleReport
class AccountInvoiceReport
Model <|-- AccountInvoiceReport
```
## Available Reports
### PDF/Document Reports
- **Quotation / Order** (PDF/Print)
- **PRO-FORMA Invoice** (PDF/Print)
### Analytical/Dashboard Reports
- **Quotations Analysis** (Analysis/Dashboard)
- **Sales Analysis** (Analysis/Dashboard)
- **Invoices Analysis** (Analysis/Dashboard)
## Report Files
- **account_invoice_report.py** (Python logic)
- **account_invoice_report_views.xml** (XML template/definition)
- **__init__.py** (Python logic)
- **ir_actions_report_templates.xml** (XML template/definition)
- **ir_actions_report.xml** (XML template/definition)
- **sale_report.py** (Python logic)
- **sale_report_views.xml** (XML template/definition)
## Notes
- Named reports above are accessible through Odoo's reporting menu
- Python files define report logic and data processing
- XML files contain report templates, definitions, and formatting
- Reports are integrated with Odoo's printing and email systems

View file

@ -0,0 +1,46 @@
# Security
Access control and security definitions in sale.
## Access Control Lists (ACLs)
Model access permissions defined in:
- **[ir.model.access.csv](../sale/security/ir.model.access.csv)**
- 58 model access rules
## Record Rules
Row-level security rules defined in:
- **[ir_rules.xml](../sale/security/ir_rules.xml)**
## Security Groups & Configuration
Security groups and permissions defined in:
- **[ir_rules.xml](../sale/security/ir_rules.xml)**
- **[res_groups.xml](../sale/security/res_groups.xml)**
- 3 security groups defined
```mermaid
graph TB
subgraph "Security Layers"
A[Users] --> B[Groups]
B --> C[Access Control Lists]
C --> D[Models]
B --> E[Record Rules]
E --> F[Individual Records]
end
```
Security files overview:
- **[ir.model.access.csv](../sale/security/ir.model.access.csv)**
- Model access permissions (CRUD rights)
- **[ir_rules.xml](../sale/security/ir_rules.xml)**
- Security groups, categories, and XML-based rules
- **[res_groups.xml](../sale/security/res_groups.xml)**
- Security groups, categories, and XML-based rules
Notes
- Access Control Lists define which groups can access which models
- Record Rules provide row-level security (filter records by user/group)
- Security groups organize users and define permission sets
- All security is enforced at the ORM level by Odoo

View file

@ -0,0 +1,5 @@
# Troubleshooting
- Ensure Python and Odoo environment matches repo guidance.
- Check database connectivity and logs if startup fails.
- Validate that dependent addons listed in DEPENDENCIES.md are installed.

View file

@ -0,0 +1,7 @@
# Usage
Start Odoo including this addon (from repo root):
```bash
python3 scripts/odoo_web_server.py --db-name mydb --addon sale
```

View file

@ -0,0 +1,13 @@
# Wizards
Transient models exposed as UI wizards in sale.
```mermaid
classDiagram
class AccountPaymentRegister
class MailComposeMessage
class PaymentLinkWizard
class PaymentWizard
class SaleAdvancePaymentInv
class SaleOrderCancel
```

View file

@ -0,0 +1,44 @@
[project]
name = "odoo-bringout-oca-ocb-sale"
version = "16.0.0"
description = "Sales - Sales internal machinery"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-sales_team>=16.0.0",
"odoo-bringout-oca-ocb-account_payment>=16.0.0",
"odoo-bringout-oca-ocb-utm>=16.0.0",
"requests>=2.25.1"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/bringout/odoo-bringout-oca-ocb-sale"
repository = "https://github.com/bringout/odoo-bringout-oca-ocb-sale"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["sale"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]

View file

@ -0,0 +1,100 @@
Sales Management Made Easy
--------------------------
From quotes to invoices, in just a few clicks with the Odoo <a href="https://www.odoo.com/app/crm">Sales Management</a>.
Drive your sales operations from quotes to invoices with all the information
you need, easily accessible. Keep track of long term contracts, automate
invoicing and notify sales when they have things to do.
Create Professional Quotations
------------------------------
Create quotations in a matter of seconds. Send quotes by email or get a
professional PDF. Track quotations, and convert them to sales order in one
click.
Spend the extra time focusing on selling, not recording data.
Fully Integrated
----------------
The information your need, where you need it.
Don't lose time looking for customers, products or contracts related
information; they are all conveniently accessible when creating quotations.
Get access to stock availabilities in the different warehouses, to customer's
specific prices, to the history of preceeding offers for this prospect, etc.
Your Address Book
-----------------
So many features, so easy to use.
Assign tags to your prospects, manage
relationships between contacts and store all customer's preferences including
pricing, billing conditions, addresses, payment terms, etc.
Navigate through all the documents related to a customer with the powerfull
breadcrumb: quotations, invoices, emails, meetings.
Fully Integrated Invoicing
--------------------------
Whether you invoice based on time and materials, on delivery orders or fixed
price; Odoo supports all possible methods.
Get recurring invoices produced automatically, create advances in just a few
clicks, re-invoices expenses easily, etc.
Keep track of your contracts
----------------------------
Get rid of wasted paper and record all your contracts in the application.
Invoices are generated automatically based on your contract conditions. Your
account managers get alerts before contracts have to be renewed.
Communicate Efficiently With Customers
--------------------------------------
The chatter feature enables you to communicate faster and more efficiently with
your customer. This takes place directly on a quotation or sale order from
within Odoo or via email.
Get all the negotiations and discussions attached to the right document and
relevent managers notified on specific events.
Fully Extensible
----------------
By default, sales order are very simple, limited to a small number of features.
Don't be confused by features you don't need.
But you can activate options to fit your specific need: multi-warehouses, multi
unit of measures, manage customer specific prices with pricelists, control
margins on quotations, use different addresses for shipping and billing, etc.
Built-in Customer Relationship Management
-----------------------------------------
Activate the CRM application to manage your funnel of opportunities, attract
leads, log calls, schedule meetings and launch marketing campaigns.
Opportunities can be converted into quotations in just one click.
Drive Engagement with Gamification
----------------------------------
Align Sales Teams on clear targets. Define clear commission plans. Get real
time statistics on the performance of individual sales or channels. Motivate your
teams with challenges, rewards and leaderboards.
Have Clear Pricing Strategies
-----------------------------
Use pricelists to record special conditions for a specific customer or to
define prices for a segment of customers. Define promotions and have them
applied automatically for all your Sales Teams.

View file

@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import models
from . import controllers
from . import report
from . import wizard
from . import populate
from odoo.api import Environment, SUPERUSER_ID
def _synchronize_cron(cr, registry):
env = Environment(cr, SUPERUSER_ID, {'active_test': False})
send_invoice_cron = env.ref('sale.send_invoice_cron', raise_if_not_found=False)
if send_invoice_cron:
config = env['ir.config_parameter'].get_param('sale.automatic_invoice', False)
send_invoice_cron.active = bool(config)

View file

@ -0,0 +1,93 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
'name': 'Sales',
'version': '1.2',
'category': 'Sales/Sales',
'summary': 'Sales internal machinery',
'description': """
This module contains all the common features of Sales Management and eCommerce.
""",
'depends': [
'sales_team',
'account_payment', # -> account, payment, portal
'utm',
],
'data': [
'security/ir.model.access.csv',
'security/res_groups.xml',
'security/ir_rules.xml',
'report/account_invoice_report_views.xml',
'report/ir_actions_report_templates.xml',
'report/ir_actions_report.xml',
'report/sale_report_views.xml',
'data/ir_sequence_data.xml',
'data/mail_activity_type_data.xml',
'data/mail_message_subtype_data.xml',
'data/mail_template_data.xml',
'data/sale_data.xml',
'wizard/account_accrued_orders_wizard_views.xml',
'wizard/payment_link_wizard_views.xml',
'wizard/sale_make_invoice_advance_views.xml',
'wizard/sale_order_cancel_views.xml',
# Define sale order views before their references
'views/sale_order_views.xml',
'views/account_views.xml',
'views/crm_team_views.xml',
'views/mail_activity_views.xml',
'views/payment_templates.xml',
'views/payment_views.xml',
'views/product_packaging_views.xml',
'views/product_views.xml',
'views/res_config_settings_views.xml',
'views/res_partner_views.xml',
'views/variant_templates.xml',
'views/sale_onboarding_views.xml',
'views/sale_order_line_views.xml',
'views/sale_portal_templates.xml',
'views/utm_campaign_views.xml',
'views/sale_menus.xml', # Last because referencing actions defined in previous files
],
'demo': [
'data/product_demo.xml',
'data/sale_demo.xml',
],
'installable': True,
'assets': {
'web.assets_backend': [
'sale/static/src/scss/sale_onboarding.scss',
'sale/static/src/scss/product_configurator.scss',
'sale/static/src/js/sale_progressbar_field.js',
'sale/static/src/js/tours/sale.js',
'sale/static/src/js/product_discount_field.js',
'sale/static/src/js/sale_product_field.js',
'sale/static/src/xml/**/*',
],
'web.assets_frontend': [
'sale/static/src/scss/sale_portal.scss',
'sale/static/src/js/sale_portal_sidebar.js',
'sale/static/src/js/sale_portal.js',
'sale/static/src/js/payment_form.js',
],
'web.assets_tests': [
'sale/static/tests/tours/**/*',
],
'web.qunit_suite_tests': [
'sale/static/tests/**/*',
('remove', 'sale/static/tests/tours/**/*')
],
'web.report_assets_common': [
'sale/static/src/scss/sale_report.scss',
],
},
'post_init_hook': '_synchronize_cron',
'license': 'LGPL-3',
}

View file

@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import onboarding
from . import portal
from . import variant

View file

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import http
from odoo.http import request
class OnboardingController(http.Controller):
@http.route('/sales/sale_quotation_onboarding_panel', auth='user', type='json')
def sale_quotation_onboarding(self):
""" Returns the `banner` for the sale onboarding panel.
It can be empty if the user has closed it or if he doesn't have
the permission to see it. """
company = request.env.company
if not request.env.is_admin() or \
company.sale_quotation_onboarding_state == 'closed':
return {}
return {
'html': request.env['ir.qweb']._render('sale.sale_quotation_onboarding_panel', {
'company': company,
'state': company.get_and_update_sale_quotation_onboarding_state()
})
}

View file

@ -0,0 +1,395 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import binascii
from odoo import fields, http, SUPERUSER_ID, _
from odoo.exceptions import AccessError, MissingError, ValidationError
from odoo.fields import Command
from odoo.http import request
from odoo.addons.payment.controllers import portal as payment_portal
from odoo.addons.payment import utils as payment_utils
from odoo.addons.portal.controllers.mail import _message_post_helper
from odoo.addons.portal.controllers import portal
from odoo.addons.portal.controllers.portal import pager as portal_pager
class CustomerPortal(portal.CustomerPortal):
def _prepare_home_portal_values(self, counters):
values = super()._prepare_home_portal_values(counters)
partner = request.env.user.partner_id
SaleOrder = request.env['sale.order']
if 'quotation_count' in counters:
values['quotation_count'] = SaleOrder.search_count(self._prepare_quotations_domain(partner)) \
if SaleOrder.check_access_rights('read', raise_exception=False) else 0
if 'order_count' in counters:
values['order_count'] = SaleOrder.search_count(self._prepare_orders_domain(partner)) \
if SaleOrder.check_access_rights('read', raise_exception=False) else 0
return values
def _prepare_quotations_domain(self, partner):
return [
('message_partner_ids', 'child_of', [partner.commercial_partner_id.id]),
('state', 'in', ['sent', 'cancel'])
]
def _prepare_orders_domain(self, partner):
return [
('message_partner_ids', 'child_of', [partner.commercial_partner_id.id]),
('state', 'in', ['sale', 'done'])
]
def _get_sale_searchbar_sortings(self):
return {
'date': {'label': _('Order Date'), 'order': 'date_order desc'},
'name': {'label': _('Reference'), 'order': 'name'},
'stage': {'label': _('Stage'), 'order': 'state'},
}
def _prepare_sale_portal_rendering_values(
self, page=1, date_begin=None, date_end=None, sortby=None, quotation_page=False, **kwargs
):
SaleOrder = request.env['sale.order']
if not sortby:
sortby = 'date'
partner = request.env.user.partner_id
values = self._prepare_portal_layout_values()
if quotation_page:
url = "/my/quotes"
domain = self._prepare_quotations_domain(partner)
else:
url = "/my/orders"
domain = self._prepare_orders_domain(partner)
searchbar_sortings = self._get_sale_searchbar_sortings()
sort_order = searchbar_sortings[sortby]['order']
if date_begin and date_end:
domain += [('create_date', '>', date_begin), ('create_date', '<=', date_end)]
pager_values = portal_pager(
url=url,
total=SaleOrder.search_count(domain),
page=page,
step=self._items_per_page,
url_args={'date_begin': date_begin, 'date_end': date_end, 'sortby': sortby},
)
orders = SaleOrder.search(domain, order=sort_order, limit=self._items_per_page, offset=pager_values['offset'])
values.update({
'date': date_begin,
'quotations': orders.sudo() if quotation_page else SaleOrder,
'orders': orders.sudo() if not quotation_page else SaleOrder,
'page_name': 'quote' if quotation_page else 'order',
'pager': pager_values,
'default_url': url,
'searchbar_sortings': searchbar_sortings,
'sortby': sortby,
})
return values
@http.route(['/my/quotes', '/my/quotes/page/<int:page>'], type='http', auth="user", website=True)
def portal_my_quotes(self, **kwargs):
values = self._prepare_sale_portal_rendering_values(quotation_page=True, **kwargs)
request.session['my_quotations_history'] = values['quotations'].ids[:100]
return request.render("sale.portal_my_quotations", values)
@http.route(['/my/orders', '/my/orders/page/<int:page>'], type='http', auth="user", website=True)
def portal_my_orders(self, **kwargs):
values = self._prepare_sale_portal_rendering_values(quotation_page=False, **kwargs)
request.session['my_orders_history'] = values['orders'].ids[:100]
return request.render("sale.portal_my_orders", values)
@http.route(['/my/orders/<int:order_id>'], type='http', auth="public", website=True)
def portal_order_page(self, order_id, report_type=None, access_token=None, message=False, download=False, **kw):
try:
order_sudo = self._document_check_access('sale.order', order_id, access_token=access_token)
except (AccessError, MissingError):
return request.redirect('/my')
if report_type in ('html', 'pdf', 'text'):
return self._show_report(model=order_sudo, report_type=report_type, report_ref='sale.action_report_saleorder', download=download)
if request.env.user.share and access_token:
# If a public/portal user accesses the order with the access token
# Log a note on the chatter.
today = fields.Date.today().isoformat()
session_obj_date = request.session.get('view_quote_%s' % order_sudo.id)
if session_obj_date != today:
# store the date as a string in the session to allow serialization
request.session['view_quote_%s' % order_sudo.id] = today
# The "Quotation viewed by customer" log note is an information
# dedicated to the salesman and shouldn't be translated in the customer/website lgg
context = {'lang': order_sudo.user_id.partner_id.lang or order_sudo.company_id.partner_id.lang}
msg = _('Quotation viewed by customer %s', order_sudo.partner_id.name if request.env.user._is_public() else request.env.user.partner_id.name)
del context
_message_post_helper(
"sale.order",
order_sudo.id,
message=msg,
token=order_sudo.access_token,
message_type="notification",
subtype_xmlid="mail.mt_note",
partner_ids=order_sudo.user_id.sudo().partner_id.ids,
)
backend_url = f'/web#model={order_sudo._name}'\
f'&id={order_sudo.id}'\
f'&action={order_sudo._get_portal_return_action().id}'\
f'&view_type=form'
values = {
'sale_order': order_sudo,
'message': message,
'report_type': 'html',
'backend_url': backend_url,
'res_company': order_sudo.company_id, # Used to display correct company logo
}
# Payment values
if order_sudo._has_to_be_paid():
values.update(self._get_payment_values(order_sudo))
if order_sudo.state in ('draft', 'sent', 'cancel'):
history_session_key = 'my_quotations_history'
else:
history_session_key = 'my_orders_history'
values = self._get_page_view_values(
order_sudo, access_token, values, history_session_key, False)
return request.render('sale.sale_order_portal_template', values)
def _get_payment_values(self, order_sudo):
""" Return the payment-specific QWeb context values.
:param recordset order_sudo: The sales order being paid, as a `sale.order` record.
:return: The payment-specific values.
:rtype: dict
"""
logged_in = not request.env.user._is_public()
providers_sudo = request.env['payment.provider'].sudo()._get_compatible_providers(
order_sudo.company_id.id,
order_sudo.partner_id.id,
order_sudo.amount_total,
currency_id=order_sudo.currency_id.id,
sale_order_id=order_sudo.id,
) # In sudo mode to read the fields of providers and partner (if not logged in)
tokens = request.env['payment.token'].search([
('provider_id', 'in', providers_sudo.ids),
('partner_id', '=', order_sudo.partner_id.id)
]) if logged_in else request.env['payment.token']
# Make sure that the partner's company matches the order's company.
if not payment_portal.PaymentPortal._can_partner_pay_in_company(
order_sudo.partner_id, order_sudo.company_id
):
providers_sudo = request.env['payment.provider'].sudo()
tokens = request.env['payment.token']
fees_by_provider = {
provider: provider._compute_fees(
order_sudo.amount_total,
order_sudo.currency_id,
order_sudo.partner_id.country_id,
) for provider in providers_sudo.filtered('fees_active')
}
return {
'providers': providers_sudo,
'tokens': tokens,
'fees_by_provider': fees_by_provider,
'show_tokenize_input': PaymentPortal._compute_show_tokenize_input_mapping(
providers_sudo, logged_in=logged_in, sale_order_id=order_sudo.id
),
'amount': order_sudo.amount_total,
'currency': order_sudo.pricelist_id.currency_id,
'partner_id': order_sudo.partner_id.id,
'access_token': order_sudo.access_token,
'transaction_route': order_sudo.get_portal_url(suffix='/transaction'),
'landing_route': order_sudo.get_portal_url(),
}
@http.route(['/my/orders/<int:order_id>/accept'], type='json', auth="public", website=True)
def portal_quote_accept(self, order_id, access_token=None, name=None, signature=None):
# get from query string if not on json param
access_token = access_token or request.httprequest.args.get('access_token')
try:
order_sudo = self._document_check_access('sale.order', order_id, access_token=access_token)
except (AccessError, MissingError):
return {'error': _('Invalid order.')}
if not order_sudo._has_to_be_signed():
return {'error': _('The order is not in a state requiring customer signature.')}
if not signature:
return {'error': _('Signature is missing.')}
try:
order_sudo.write({
'signed_by': name,
'signed_on': fields.Datetime.now(),
'signature': signature,
})
request.env.cr.commit()
except (TypeError, binascii.Error) as e:
return {'error': _('Invalid signature data.')}
if not order_sudo._has_to_be_paid():
order_sudo.action_confirm()
order_sudo._send_order_confirmation_mail()
pdf = request.env['ir.actions.report'].sudo()._render_qweb_pdf('sale.action_report_saleorder', [order_sudo.id])[0]
_message_post_helper(
'sale.order',
order_sudo.id,
_('Order signed by %s', name),
attachments=[('%s.pdf' % order_sudo.name, pdf)],
token=access_token,
)
query_string = '&message=sign_ok'
if order_sudo._has_to_be_paid(True):
query_string += '#allow_payment=yes'
return {
'force_refresh': True,
'redirect_url': order_sudo.get_portal_url(query_string=query_string),
}
@http.route(['/my/orders/<int:order_id>/decline'], type='http', auth="public", methods=['POST'], website=True)
def portal_quote_decline(self, order_id, access_token=None, decline_message=None, **kwargs):
try:
order_sudo = self._document_check_access('sale.order', order_id, access_token=access_token)
except (AccessError, MissingError):
return request.redirect('/my')
if order_sudo._has_to_be_signed() and decline_message:
order_sudo._action_cancel()
_message_post_helper(
'sale.order',
order_sudo.id,
decline_message,
token=access_token,
)
redirect_url = order_sudo.get_portal_url()
else:
redirect_url = order_sudo.get_portal_url(query_string="&message=cant_reject")
return request.redirect(redirect_url)
class PaymentPortal(payment_portal.PaymentPortal):
@http.route('/my/orders/<int:order_id>/transaction', type='json', auth='public')
def portal_order_transaction(self, order_id, access_token, **kwargs):
""" Create a draft transaction and return its processing values.
:param int order_id: The sales order to pay, as a `sale.order` id
:param str access_token: The access token used to authenticate the request
:param dict kwargs: Locally unused data passed to `_create_transaction`
:return: The mandatory values for the processing of the transaction
:rtype: dict
:raise: ValidationError if the invoice id or the access token is invalid
"""
# Check the order id and the access token
try:
order_sudo = self._document_check_access('sale.order', order_id, access_token)
except MissingError as error:
raise error
except AccessError:
raise ValidationError(_("The access token is invalid."))
kwargs.update({
'reference_prefix': None, # Allow the reference to be computed based on the order
'partner_id': order_sudo.partner_invoice_id.id,
'sale_order_id': order_id, # Include the SO to allow Subscriptions tokenizing the tx
})
kwargs.pop('custom_create_values', None) # Don't allow passing arbitrary create values
tx_sudo = self._create_transaction(
custom_create_values={'sale_order_ids': [Command.set([order_id])]}, **kwargs,
)
return tx_sudo._get_processing_values()
# Payment overrides
@http.route()
def payment_pay(self, *args, amount=None, sale_order_id=None, access_token=None, **kwargs):
""" Override of payment to replace the missing transaction values by that of the sale order.
This is necessary for the reconciliation as all transaction values, excepted the amount,
need to match exactly that of the sale order.
:param str amount: The (possibly partial) amount to pay used to check the access token
:param str sale_order_id: The sale order for which a payment id made, as a `sale.order` id
:param str access_token: The access token used to authenticate the partner
:return: The result of the parent method
:rtype: str
:raise: ValidationError if the order id is invalid
"""
# Cast numeric parameters as int or float and void them if their str value is malformed
amount = self._cast_as_float(amount)
sale_order_id = self._cast_as_int(sale_order_id)
if sale_order_id:
order_sudo = request.env['sale.order'].sudo().browse(sale_order_id).exists()
if not order_sudo:
raise ValidationError(_("The provided parameters are invalid."))
# Check the access token against the order values. Done after fetching the order as we
# need the order fields to check the access token.
if not payment_utils.check_access_token(
access_token, order_sudo.partner_invoice_id.id, amount, order_sudo.currency_id.id
):
raise ValidationError(_("The provided parameters are invalid."))
kwargs.update({
'currency_id': order_sudo.currency_id.id,
'partner_id': order_sudo.partner_invoice_id.id,
'company_id': order_sudo.company_id.id,
'sale_order_id': sale_order_id,
})
return super().payment_pay(*args, amount=amount, access_token=access_token, **kwargs)
def _get_custom_rendering_context_values(self, sale_order_id=None, **kwargs):
""" Override of payment to add the sale order id in the custom rendering context values.
:param int sale_order_id: The sale order for which a payment id made, as a `sale.order` id
:return: The extended rendering context values
:rtype: dict
"""
rendering_context_values = super()._get_custom_rendering_context_values(
sale_order_id=sale_order_id, **kwargs
)
if sale_order_id:
rendering_context_values['sale_order_id'] = sale_order_id
# Interrupt the payment flow if the sales order has been canceled.
order_sudo = request.env['sale.order'].sudo().browse(sale_order_id)
if order_sudo.state == 'cancel':
rendering_context_values['amount'] = 0.0
return rendering_context_values
def _create_transaction(self, *args, sale_order_id=None, custom_create_values=None, **kwargs):
""" Override of payment to add the sale order id in the custom create values.
:param int sale_order_id: The sale order for which a payment id made, as a `sale.order` id
:param dict custom_create_values: Additional create values overwriting the default ones
:return: The result of the parent method
:rtype: recordset of `payment.transaction`
"""
if sale_order_id:
if custom_create_values is None:
custom_create_values = {}
# As this override is also called if the flow is initiated from sale or website_sale, we
# need not to override whatever value these modules could have already set
if 'sale_order_ids' not in custom_create_values: # We are in the payment module's flow
custom_create_values['sale_order_ids'] = [Command.set([int(sale_order_id)])]
return super()._create_transaction(
*args, sale_order_id=sale_order_id, custom_create_values=custom_create_values, **kwargs
)

View file

@ -0,0 +1,39 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import json
from odoo import http
from odoo.http import request
class VariantController(http.Controller):
@http.route(['/sale/get_combination_info'], type='json', auth="user", methods=['POST'])
def get_combination_info(self, product_template_id, product_id, combination, add_qty, pricelist_id, **kw):
combination = request.env['product.template.attribute.value'].browse(combination)
pricelist = self._get_pricelist(pricelist_id)
cids = request.httprequest.cookies.get('cids', str(request.env.user.company_id.id))
allowed_company_ids = [int(cid) for cid in cids.split(',')]
ProductTemplate = request.env['product.template'].with_context(allowed_company_ids=allowed_company_ids)
if 'context' in kw:
ProductTemplate = ProductTemplate.with_context(**kw.get('context'))
product_template = ProductTemplate.browse(int(product_template_id))
res = product_template._get_combination_info(combination, int(product_id or 0), int(add_qty or 1), pricelist)
if 'parent_combination' in kw:
parent_combination = request.env['product.template.attribute.value'].browse(kw.get('parent_combination'))
if not combination.exists() and product_id:
product = request.env['product.product'].browse(int(product_id))
if product.exists():
combination = product.product_template_attribute_value_ids
res.update({
'is_combination_possible': product_template._is_combination_possible(combination=combination, parent_combination=parent_combination),
'parent_exclusions': product_template._get_parent_attribute_exclusions(parent_combination=parent_combination)
})
return res
@http.route(['/sale/create_product_variant'], type='json', auth="user", methods=['POST'])
def create_product_variant(self, product_template_id, product_template_attribute_value_ids, **kwargs):
return request.env['product.template'].browse(int(product_template_id)).create_product_variant(json.loads(product_template_attribute_value_ids))
def _get_pricelist(self, pricelist_id, pricelist_fallback=False):
return request.env['product.pricelist'].browse(int(pricelist_id or 0))

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<record id="seq_sale_order" model="ir.sequence">
<field name="name">Sales Order</field>
<field name="code">sale.order</field>
<field name="prefix">S</field>
<field name="padding">5</field>
<field name="company_id" eval="False"/>
</record>
</odoo>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!-- Activities -->
<record id="mail_act_sale_upsell" model="mail.activity.type">
<field name="name">Order Upsell</field>
<field name="icon">fa-line-chart</field>
<field name="res_model">sale.order</field>
</record>
</data>
</odoo>

View file

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!-- Sale-related subtypes for messaging / Chatter -->
<record id="mt_order_sent" model="mail.message.subtype">
<field name="name">Quotation sent</field>
<field name="res_model">sale.order</field>
<field name="default" eval="False"/>
<field name="description">Quotation sent</field>
</record>
<record id="mt_order_confirmed" model="mail.message.subtype">
<field name="name">Sales Order Confirmed</field>
<field name="res_model">sale.order</field>
<field name="default" eval="False"/>
<field name="description">Quotation confirmed</field>
</record>
<!-- Salesteam-related subtypes for messaging / Chatter -->
<record id="mt_salesteam_order_sent" model="mail.message.subtype">
<field name="name">Quotation sent</field>
<field name="sequence">20</field>
<field name="res_model">crm.team</field>
<field name="default" eval="True"/>
<field name="parent_id" ref="sale.mt_order_sent"/>
<field name="relation_field">team_id</field>
</record>
<record id="mt_salesteam_order_confirmed" model="mail.message.subtype">
<field name="name">Sales Order Confirmed</field>
<field name="sequence">21</field>
<field name="res_model">crm.team</field>
<field name="default" eval="True"/>
<field name="parent_id" ref="sale.mt_order_confirmed"/>
<field name="relation_field">team_id</field>
</record>
<record id="mt_salesteam_invoice_created" model="mail.message.subtype">
<field name="name">Invoice Created</field>
<field name="sequence">22</field>
<field name="res_model">crm.team</field>
<field name="parent_id" ref="account.mt_invoice_created"/>
<field name="relation_field">team_id</field>
</record>
<record id="mt_salesteam_invoice_confirmed" model="mail.message.subtype">
<field name="name">Invoice Confirmed</field>
<field name="sequence">23</field>
<field name="res_model">crm.team</field>
<field name="parent_id" ref="account.mt_invoice_validated"/>
<field name="relation_field">team_id</field>
</record>
</data>
</odoo>

View file

@ -0,0 +1,274 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="email_template_edi_sale" model="mail.template">
<field name="name">Sales: Send Quotation</field>
<field name="model_id" ref="sale.model_sale_order"/>
<field name="subject">{{ object.company_id.name }} {{ object.state in ('draft', 'sent') and (ctx.get('proforma') and 'Proforma' or 'Quotation') or 'Order' }} (Ref {{ object.name or 'n/a' }})</field>
<field name="email_from">{{ (object.user_id.email_formatted or object.company_id.email_formatted or user.email_formatted) }}</field>
<field name="partner_to">{{ object.partner_id.id }}</field>
<field name="description">Used by salespeople when they send quotations or proforma to prospects</field>
<field name="body_html" type="html">
<div style="margin: 0px; padding: 0px;">
<p style="margin: 0px; padding: 0px; font-size: 13px;">
<t t-set="doc_name" t-value="'quotation' if object.state in ('draft', 'sent') else 'order'"/>
Hello,
<br/><br/>
Your
<t t-if="ctx.get('proforma')">
Pro forma invoice for <t t-out="doc_name or ''">quotation</t> <span style="font-weight: bold;" t-out="object.name or ''">S00052</span>
<t t-if="object.origin">
(with reference: <t t-out="object.origin or ''"></t> )
</t>
amounting in <span style="font-weight: bold;" t-out="format_amount(object.amount_total, object.pricelist_id.currency_id) or ''">$ 10.00</span> is available.
</t>
<t t-else="">
<t t-out="doc_name or ''">quotation</t> <span style="font-weight: bold;" t-out="object.name or ''"></span>
<t t-if="object.origin">
(with reference: <t t-out="object.origin or ''">S00052</t> )
</t>
amounting in <span style="font-weight: bold;" t-out="format_amount(object.amount_total, object.pricelist_id.currency_id) or ''">$ 10.00</span> is ready for review.
</t>
<br/><br/>
Do not hesitate to contact us if you have any questions.
<t t-if="not is_html_empty(object.user_id.signature)">
<br/><br/>
<t t-out="object.user_id.signature or ''">--<br/>Mitchell Admin</t>
</t>
<br/><br/>
</p>
</div>
</field>
<field name="report_template" ref="action_report_saleorder"/>
<field name="report_name">{{ (object.name or '').replace('/','_') }}</field>
<field name="lang">{{ object.partner_id.lang }}</field>
<field name="auto_delete" eval="True"/>
</record>
<record id="mail_template_sale_confirmation" model="mail.template">
<field name="name">Sales: Order Confirmation</field>
<field name="model_id" ref="sale.model_sale_order"/>
<field name="subject">{{ object.company_id.name }} {{ (object.get_portal_last_transaction().state == 'pending') and 'Pending Order' or 'Order' }} (Ref {{ object.name or 'n/a' }})</field>
<field name="email_from">{{ (object.user_id.email_formatted or object.company_id.email_formatted or user.email_formatted) }}</field>
<field name="partner_to">{{ object.partner_id.id }}</field>
<field name="description">Sent to customers on order confirmation</field>
<field name="body_html" type="html">
<div style="margin: 0px; padding: 0px;">
<p style="margin: 0px; padding: 0px; font-size: 12px;">
Hello,
<br/><br/>
<t t-set="transaction" t-value="object.get_portal_last_transaction()"/>
Your order <span style="font-weight:bold;" t-out="object.name or ''">S00049</span> amounting in <span style="font-weight:bold;" t-out="format_amount(object.amount_total, object.currency_id) or ''">$ 10.00</span>
<t t-if="object.state == 'sale' or (transaction and transaction.state in ('done', 'authorized'))">
has been confirmed.<br/>
Thank you for your trust!
</t>
<t t-elif="transaction and transaction.state == 'pending'">
is pending. It will be confirmed when the payment is received.
<t t-if="object.reference">
Your payment reference is <span style="font-weight:bold;" t-out="object.reference or ''"></span>.
</t>
</t>
<br/><br/>
Do not hesitate to contact us if you have any questions.
<t t-if="not is_html_empty(object.user_id.signature)">
<br/><br/>
<t t-out="object.user_id.signature or ''">--<br/>Mitchell Admin</t>
</t>
<br/><br/>
</p>
<t t-if="hasattr(object, 'website_id') and object.website_id">
<div style="margin: 0px; padding: 0px;">
<table width="100%" style="color: #454748; font-size: 12px; border-collapse: collapse;">
<tr style="border-bottom: 2px solid #dee2e6;">
<td style="width: 150px;"><span style="font-weight:bold;">Products</span></td>
<td></td>
<td width="15%" align="center"><span style="font-weight:bold;">Quantity</span></td>
<td width="20%" align="right"><span style="font-weight:bold;">
<t t-if="object.user_id.has_group('account.group_show_line_subtotals_tax_excluded')">
VAT Excl.
</t>
<t t-else="">
VAT Incl.
</t>
</span></td>
</tr>
</table>
<t t-foreach="object.order_line" t-as="line">
<t t-if="(not hasattr(line, 'is_delivery') or not line.is_delivery) and line.display_type in ['line_section', 'line_note']">
<table width="100%" style="color: #454748; font-size: 12px; border-collapse: collapse;">
<t t-set="loop_cycle_number" t-value="loop_cycle_number or 0" />
<tr t-att-style="'background-color: #f2f2f2' if loop_cycle_number % 2 == 0 else 'background-color: #ffffff'">
<t t-set="loop_cycle_number" t-value="loop_cycle_number + 1" />
<td colspan="4">
<t t-if="line.display_type == 'line_section'">
<span style="font-weight:bold;" t-out="line.name or ''">Taking care of Trees Course</span>
</t>
<t t-elif="line.display_type == 'line_note'">
<i t-out="line.name or ''">Taking care of Trees Course</i>
</t>
</td>
</tr>
</table>
</t>
<t t-elif="(not hasattr(line, 'is_delivery') or not line.is_delivery)">
<table width="100%" style="color: #454748; font-size: 12px; border-collapse: collapse;">
<t t-set="loop_cycle_number" t-value="loop_cycle_number or 0" />
<tr t-att-style="'background-color: #f2f2f2' if loop_cycle_number % 2 == 0 else 'background-color: #ffffff'">
<t t-set="loop_cycle_number" t-value="loop_cycle_number + 1" />
<td style="width: 150px;">
<img t-attf-src="/web/image/product.product/{{ line.product_id.id }}/image_128" style="width: 64px; height: 64px; object-fit: contain;" alt="Product image"></img>
</td>
<td align="left" t-out="line.product_id.name or ''"> Taking care of Trees Course</td>
<td width="15%" align="center" t-out="line.product_uom_qty or ''">1</td>
<td width="20%" align="right"><span style="font-weight:bold;">
<t t-if="object.user_id.has_group('account.group_show_line_subtotals_tax_excluded')">
<t t-out="format_amount(line.price_reduce_taxexcl, object.currency_id) or ''">$ 10.00</t>
</t>
<t t-else="">
<t t-out="format_amount(line.price_reduce_taxinc, object.currency_id) or ''">$ 10.00</t>
</t>
</span></td>
</tr>
</table>
</t>
</t>
</div>
<div style="margin: 0px; padding: 0px;" t-if="hasattr(object, 'carrier_id') and object.carrier_id">
<table width="100%" style="color: #454748; font-size: 12px; border-spacing: 0px 4px;" align="right">
<tr>
<td style="width: 60%"/>
<td style="width: 30%; border-top: 1px solid #dee2e6;" align="right"><span style="font-weight:bold;">Delivery:</span></td>
<td style="width: 10%; border-top: 1px solid #dee2e6;" align="right" t-out="format_amount(object.amount_delivery, object.currency_id) or ''">$ 0.00</td>
</tr>
<tr>
<td style="width: 60%"/>
<td style="width: 30%;" align="right"><span style="font-weight:bold;">SubTotal:</span></td>
<td style="width: 10%;" align="right" t-out="format_amount(object.amount_untaxed, object.currency_id) or ''">$ 10.00</td>
</tr>
</table>
</div>
<div style="margin: 0px; padding: 0px;" t-else="">
<table width="100%" style="color: #454748; font-size: 12px; border-spacing: 0px 4px;" align="right">
<tr>
<td style="width: 60%"/>
<td style="width: 30%; border-top: 1px solid #dee2e6;" align="right"><span style="font-weight:bold;">SubTotal:</span></td>
<td style="width: 10%; border-top: 1px solid #dee2e6;" align="right" t-out="format_amount(object.amount_untaxed, object.currency_id) or ''">$ 10.00</td>
</tr>
</table>
</div>
<div style="margin: 0px; padding: 0px;">
<table width="100%" style="color: #454748; font-size: 12px; border-spacing: 0px 4px;" align="right">
<tr>
<td style="width: 60%"/>
<td style="width: 30%;" align="right"><span style="font-weight:bold;">Taxes:</span></td>
<td style="width: 10%;" align="right" t-out="format_amount(object.amount_tax, object.currency_id) or ''">$ 0.00</td>
</tr>
<tr>
<td style="width: 60%"/>
<td style="width: 30%; border-top: 1px solid #dee2e6;" align="right"><span style="font-weight:bold;">Total:</span></td>
<td style="width: 10%; border-top: 1px solid #dee2e6;" align="right" t-out="format_amount(object.amount_total, object.currency_id) or ''">$ 10.00</td>
</tr>
</table>
</div>
<div t-if="object.partner_invoice_id" style="margin: 0px; padding: 0px;">
<table width="100%" style="color: #454748; font-size: 12px;">
<tr>
<td style="padding-top: 10px;">
<span style="font-weight:bold;">Bill to:</span>
<t t-out="object.partner_invoice_id.street or ''">1201 S Figueroa St</t>
<t t-out="object.partner_invoice_id.city or ''">Los Angeles</t>
<t t-out="object.partner_invoice_id.state_id.name or ''">California</t>
<t t-out="object.partner_invoice_id.zip or ''">90015</t>
<t t-out="object.partner_invoice_id.country_id.name or ''">United States</t>
</td>
</tr>
<tr>
<td>
<span style="font-weight:bold;">Payment Method:</span>
<t t-if="transaction.token_id">
<t t-out="transaction.token_id.display_name or ''"></t>
</t>
<t t-else="">
<t t-out="transaction.provider_id.sudo().name or ''"></t>
</t>
(<t t-out="format_amount(transaction.amount, object.currency_id) or ''">$ 10.00</t>)
</td>
</tr>
</table>
</div>
<div t-if="object.partner_shipping_id and not object.only_services" style="margin: 0px; padding: 0px;">
<table width="100%" style="color: #454748; font-size: 12px;">
<tr>
<td>
<br/>
<span style="font-weight:bold;">Ship to:</span>
<t t-out="object.partner_shipping_id.street or ''">1201 S Figueroa St</t>
<t t-out="object.partner_shipping_id.city or ''">Los Angeles</t>
<t t-out="object.partner_shipping_id.state_id.name or ''">California</t>
<t t-out="object.partner_shipping_id.zip or ''">90015</t>
<t t-out="object.partner_shipping_id.country_id.name or ''">United States</t>
</td>
</tr>
</table>
<table t-if="hasattr(object, 'carrier_id') and object.carrier_id" width="100%" style="color: #454748; font-size: 12px;">
<tr>
<td>
<span style="font-weight:bold;">Shipping Method:</span>
<t t-out="object.carrier_id.name or ''"></t>
<t t-if="object.amount_delivery == 0.0">
(Free)
</t>
<t t-else="">
(<t t-out="format_amount(object.amount_delivery, object.currency_id) or ''">$ 10.00</t>)
</t>
</td>
</tr>
<tr t-if="object.carrier_id.carrier_description">
<td>
<strong>Shipping Description:</strong>
<t t-out="object.carrier_id.carrier_description"/>
</td>
</tr>
</table>
</div>
</t>
</div></field>
<field name="report_template" ref="action_report_saleorder"/>
<field name="report_name">{{ (object.name or '').replace('/','_') }}</field>
<field name="lang">{{ object.partner_id.lang }}</field>
<field name="auto_delete" eval="True"/>
</record>
<record id="sale.mail_template_sale_cancellation" model="mail.template">
<field name="name">Sales: Order Cancellation</field>
<field name="model_id" ref="sale.model_sale_order"/>
<field name="subject">{{ object.company_id.name }} {{ object.type_name }} Cancelled (Ref {{ object.name or 'n/a' }})</field>
<field name="email_from">{{ (object.user_id.email_formatted or object.company_id.email_formatted or user.email_formatted) }}</field>
<field name="partner_to">{{ object.partner_id.id }}</field>
<field name="description">Sent automatically to customers when you cancel an order</field>
<field name="body_html" type="html">
<div style="margin: 0px; padding: 0px;">
<p style="margin: 0px; padding: 0px; font-size: 13px;">
<t t-set="doc_name" t-value="object.type_name"/>
Dear <t t-out="object.partner_id.name or ''">user</t>,
<br/><br/>
Please be advised that your
<t t-out="doc_name or ''">quotation</t> <strong t-out="object.name or ''">S00052</strong>
<t t-if="object.origin">
(with reference: <t t-out="object.origin or ''">S00052</t> )
</t>
has been cancelled. Therefore, you should not be charged further for this order.
If any refund is necessary, this will be executed at best convenience.
<br/><br/>
Do not hesitate to contact us if you have any questions.
<br/>
</p>
</div>
</field>
<field name="lang">{{ object.partner_id.lang }}</field>
<field name="auto_delete" eval="True"/>
</record>
</data>
</odoo>

View file

@ -0,0 +1,233 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<record id="product.consu_delivery_01" model="product.product">
<field name="invoice_policy">order</field>
</record>
<record id="product.consu_delivery_02" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<record id="product.consu_delivery_03" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<record id="product.product_order_01" model="product.product">
<field name="invoice_policy">order</field>
</record>
<record id="product.product_delivery_01" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<record id="product.product_delivery_02" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<record id="product.product_product_27" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<record id="product.product_product_25" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<record id="product.product_product_24" model="product.product">
<field name="invoice_policy">order</field>
</record>
<record id="product.product_product_22" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<record id="product.product_product_20" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<record id="product.product_product_16" model="product.product">
<field name="invoice_policy">order</field>
</record>
<record id="product.product_product_13" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<record id="product.product_product_12" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<record id="product.product_product_11b" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<record id="product.product_product_11" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<record id="product.product_product_10" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<record id="product.product_product_9" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<record id="product.product_product_8" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<record id="product.product_product_7" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<record id="product.product_product_6" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<record id="product.product_product_5" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<record id="product.product_product_4c" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<record id="product.product_product_4b" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<record id="product.product_product_4" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<record id="product.product_product_3" model="product.product">
<field name="invoice_policy">delivery</field>
<field name="expense_policy">cost</field>
</record>
<record id="product.product_product_2" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<record id="product.product_product_1" model="product.product">
<field name="invoice_policy">delivery</field>
</record>
<!-- Expensable products -->
<record id="product.expense_product" model="product.product">
<field name="invoice_policy">order</field>
<field name="expense_policy">sales_price</field>
</record>
<record id="product.expense_hotel" model="product.product">
<field name="invoice_policy">delivery</field>
<field name="expense_policy">cost</field>
</record>
<record id="product.product_attribute_2" model="product.attribute">
<field name="display_type">color</field>
</record>
<record id="product.product_attribute_3" model="product.attribute">
<field name="display_type">select</field>
</record>
<record id="product.product_attribute_value_3" model="product.attribute.value">
<field name="html_color">#FFFFFF</field>
</record>
<record id="product.product_attribute_value_4" model="product.attribute.value">
<field name="html_color">#000000</field>
</record>
<record id="product_attribute_value_7" model="product.attribute.value">
<field name="name">Custom</field>
<field name="attribute_id" ref="product.product_attribute_1"/>
<field name="is_custom">True</field>
<field name="sequence">3</field>
</record>
<record id="product.product_4_attribute_1_product_template_attribute_line" model="product.template.attribute.line">
<field name="value_ids" eval="[(4,ref('product_attribute_value_7'))]"/>
</record>
<!--
Handle automatically created product.template.attribute.value.
Check "product.product_4_attribute_1_value_2" for more information about this
-->
<function model="ir.model.data" name="_update_xmlids">
<value model="base" eval="[{
'xml_id': 'sale.product_4_attribute_1_value_3',
'record': obj().env.ref('product.product_4_attribute_1_product_template_attribute_line').product_template_value_ids[2],
'noupdate': True,
}]"/>
</function>
<function model="ir.model.data" name="_update_xmlids">
<value model="base" eval="[{
'xml_id': 'sale.product_product_4e',
'record': obj().env.ref('product.product_product_4_product_template')._get_variant_for_combination(obj().env.ref('sale.product_4_attribute_1_value_3') + obj().env.ref('product.product_4_attribute_2_value_1')),
'noupdate': True,
}, {
'xml_id': 'sale.product_product_4f',
'record': obj().env.ref('product.product_product_4_product_template')._get_variant_for_combination(obj().env.ref('sale.product_4_attribute_1_value_3') + obj().env.ref('product.product_4_attribute_2_value_2')),
'noupdate': True,
},]"/>
</function>
<record id="product_product_4e" model="product.product">
<field name="default_code">DESK0005</field>
<field name="weight">0.01</field>
</record>
<record id="product_product_4f" model="product.product">
<field name="default_code">DESK0006</field>
<field name="weight">0.01</field>
</record>
<record id="product_template_attribute_exclusion_1" model="product.template.attribute.exclusion">
<field name="product_tmpl_id" ref="product.product_product_4_product_template" />
<field name="value_ids" eval="[(6,0,[ref('product.product_4_attribute_2_value_2')])]"/>
</record>
<record id="product_template_attribute_exclusion_2" model="product.template.attribute.exclusion">
<field name="product_tmpl_id" ref="product.product_product_11_product_template" />
<field name="value_ids" eval="[(6,0,[ref('product.product_11_attribute_1_value_1')])]"/>
</record>
<!--
The "Customizable Desk's Aluminium" attribute value will excude:
- The "Customizable Desk's Black" attribute
- The "Office Chair's Steel" attribute
-->
<record id="product.product_4_attribute_1_value_2" model="product.template.attribute.value">
<field name="exclude_for" eval="[(6,0,[ref('sale.product_template_attribute_exclusion_1') ,ref('sale.product_template_attribute_exclusion_2')])]" />
</record>
<record id="product_template_attribute_exclusion_3" model="product.template.attribute.exclusion">
<field name="product_tmpl_id" ref="product.product_product_11_product_template" />
<field name="value_ids" eval="[(6,0,[ref('product.product_11_attribute_1_value_2')])]"/>
</record>
<!--
The "Customizable Desk's Steel" attribute value will excude:
- The "Office Chair's Aluminium" attribute
-->
<record id="product.product_4_attribute_1_value_1" model="product.template.attribute.value">
<field name="exclude_for" eval="[(6,0,[ref('sale.product_template_attribute_exclusion_3')])]" />
</record>
<record id="advance_product_0" model="product.product">
<field name="name">Deposit</field>
<field name="categ_id" ref="product.product_category_3"/>
<field name="type">service</field>
<field name="list_price">150.0</field>
<field name="invoice_policy">order</field>
<field name="standard_price">100.0</field>
<field name="uom_id" ref="uom.product_uom_unit"/>
<field name="uom_po_id" ref="uom.product_uom_unit"/>
<field name="company_id" eval="[]"/>
<field name="image_1920" type="base64" file="sale/static/img/advance_product_0-image.jpg"/>
<field name="taxes_id" eval="[]"/>
<field name="supplier_taxes_id" eval="[]"/>
</record>
</odoo>

View file

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<!-- TODO remove as it is already the fallback in _find_mail_template -->
<record id="default_confirmation_template" model="ir.config_parameter">
<field name="key">sale.default_confirmation_template</field>
<field name="value" ref="sale.mail_template_sale_confirmation"/>
</record>
<record id="default_invoice_email_template" model="ir.config_parameter">
<field name="key">sale.default_invoice_email_template</field>
<field name="value" ref="account.email_template_edi_invoice"/>
</record>
<record id="send_invoice_cron" model="ir.cron">
<field name="name">automatic invoicing: send ready invoice</field>
<field name="model_id" ref="payment.model_payment_transaction" />
<field name="state">code</field>
<field name="code">model._cron_send_invoice()</field>
<field name="user_id" ref="base.user_root" />
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
</record>
</odoo>

View file

@ -0,0 +1,743 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<!-- Enable EUR currency since it's the currency on the company, pricelist and Sale Orders
If the currency is not enabled, you cannot pay the demo SO's with a payment link bc the currency
is disabled.
-->
<function model="res.currency" name="action_unarchive">
<value model="res.currency" search="[('id', '=', obj().env.ref('product.list0').currency_id.id), ('active', '=', False)]"/>
</function>
<!-- We want to activate pay and sign by default for easier demoing. -->
<record id="base.main_company" model="res.company">
<field name="portal_confirmation_pay" eval="True"/>
</record>
<record id="base.user_demo" model="res.users">
<field eval="[(4, ref('sales_team.group_sale_salesman'))]" name="groups_id"/>
</record>
<record model="crm.team" id="sales_team.team_sales_department">
<field name="use_quotations" eval="True"/>
<field name="invoiced_target">250000</field>
</record>
<record model="crm.team" id="sales_team.crm_team_1">
<field name="use_quotations" eval="True"/>
<field name="invoiced_target">40000</field>
</record>
<record id="utm_source_sale_order_0" model="utm.source">
<field name="name">Sale Promotion 1</field>
</record>
<record id="sale_order_1" model="sale.order">
<field name="partner_id" ref="base.res_partner_2"/>
<field name="partner_invoice_id" ref="base.res_partner_2"/>
<field name="partner_shipping_id" ref="base.res_partner_2"/>
<field name="user_id" ref="base.user_demo"/>
<field name="pricelist_id" ref="product.list0"/>
<field name="team_id" ref="sales_team.team_sales_department"/>
<field name="campaign_id" ref="utm.utm_campaign_email_campaign_products"/>
<field name="medium_id" ref="utm.utm_medium_email"/>
<field name="source_id" ref="sale.utm_source_sale_order_0"/>
<field name="date_order" eval="(DateTime.today() - relativedelta(months=1)).strftime('%Y-%m-%d %H:%M')"/>
</record>
<record id="sale_order_line_1" model="sale.order.line">
<field name="order_id" ref="sale_order_1"/>
<field name="product_id" ref="product.product_product_25"/>
<field name="product_uom_qty">3</field>
<field name="price_unit">295.00</field>
</record>
<record id="sale_order_line_2" model="sale.order.line">
<field name="order_id" ref="sale_order_1"/>
<field name="product_id" ref="product.product_delivery_02"/>
<field name="product_uom_qty">5</field>
<field name="price_unit">145.00</field>
</record>
<record id="sale_order_line_3" model="sale.order.line">
<field name="order_id" ref="sale_order_1"/>
<field name="product_id" ref="product.product_delivery_01"/>
<field name="product_uom_qty">2</field>
<field name="price_unit">65.00</field>
</record>
<record id="sale_order_2" model="sale.order">
<field name="partner_id" ref="base.res_partner_4"/>
<field name="partner_invoice_id" ref="base.res_partner_address_13"/>
<field name="partner_shipping_id" ref="base.res_partner_address_13"/>
<field name="user_id" ref="base.user_admin"/>
<field name="pricelist_id" ref="product.list0"/>
<field name="team_id" ref="sales_team.team_sales_department"/>
<field name="campaign_id" ref="utm.utm_campaign_email_campaign_products"/>
<field name="medium_id" ref="utm.utm_medium_email"/>
<field name="source_id" ref="sale.utm_source_sale_order_0"/>
<field name="date_order" eval="(DateTime.today() - relativedelta(months=1)).strftime('%Y-%m-%d %H:%M')"/>
<field name="tag_ids" eval="[(4, ref('sales_team.categ_oppor7'))]"/>
</record>
<record id="sale_order_line_4" model="sale.order.line">
<field name="order_id" ref="sale_order_2"/>
<field name="product_id" ref="product.product_product_1"/>
<field name="product_uom_qty">24</field>
<field name="price_unit">75.00</field>
</record>
<record id="sale_order_line_5" model="sale.order.line">
<field name="order_id" ref="sale_order_2"/>
<field name="product_id" ref="product.product_product_2"/>
<field name="product_uom_qty">30</field>
<field name="price_unit">38.25</field>
</record>
<record id="sale_order_3" model="sale.order">
<field name="partner_id" ref="base.res_partner_4"/>
<field name="partner_invoice_id" ref="base.res_partner_4"/>
<field name="partner_shipping_id" ref="base.res_partner_4"/>
<field name="user_id" ref="base.user_admin"/>
<field name="pricelist_id" ref="product.list0"/>
<field name="team_id" ref="sales_team.team_sales_department"/>
<field name="campaign_id" ref="utm.utm_campaign_email_campaign_products"/>
<field name="medium_id" ref="utm.utm_medium_email"/>
<field name="source_id" ref="sale.utm_source_sale_order_0"/>
<field name="tag_ids" eval="[(4, ref('sales_team.categ_oppor1')), (4, ref('sales_team.categ_oppor2'))]"/>
</record>
<record id="sale_order_line_6" model="sale.order.line">
<field name="order_id" ref="sale_order_3"/>
<field name="product_id" ref="product.product_product_1"/>
<field name="product_uom_qty">10</field>
<field name="price_unit">30.75</field>
</record>
<record id="sale_order_line_7" model="sale.order.line">
<field name="order_id" ref="sale_order_3"/>
<field name="product_id" ref="product.product_delivery_01"/>
</record>
<record id="sale_order_4" model="sale.order">
<field name="partner_id" ref="base.res_partner_3"/>
<field name="partner_invoice_id" ref="base.res_partner_address_25"/>
<field name="partner_shipping_id" ref="base.res_partner_address_25"/>
<field name="user_id" ref="base.user_admin"/>
<field name="pricelist_id" ref="product.list0"/>
<field name="team_id" ref="sales_team.team_sales_department"/>
<field name="campaign_id" ref="utm.utm_campaign_email_campaign_products"/>
<field name="medium_id" ref="utm.utm_medium_email"/>
<field name="source_id" ref="sale.utm_source_sale_order_0"/>
</record>
<record id="sale_order_line_8" model="sale.order.line">
<field name="order_id" ref="sale_order_4"/>
<field name="product_id" ref="product.product_product_1"/>
<field name="product_uom_qty">16</field>
<field name="price_unit">75.00</field>
</record>
<record id="sale_order_line_9" model="sale.order.line">
<field name="order_id" ref="sale_order_4"/>
<field name="product_id" ref="product.product_delivery_02"/>
<field name="product_uom_qty">10</field>
<field name="price_unit">45.00</field>
</record>
<record id="sale_order_line_10" model="sale.order.line">
<field name="order_id" ref="sale_order_4"/>
<field name="product_id" ref="product.consu_delivery_02"/>
<field name="product_uom_qty">3</field>
<field name="price_unit">150.00</field>
</record>
<record id="sale_order_line_11" model="sale.order.line">
<field name="order_id" ref="sale_order_4"/>
<field name="product_id" ref="product.product_delivery_01"/>
<field name="product_uom_qty">2</field>
</record>
<record id="sale_order_5" model="sale.order">
<field name="partner_id" ref="base.res_partner_2"/>
<field name="partner_invoice_id" ref="base.res_partner_2"/>
<field name="partner_shipping_id" ref="base.res_partner_2"/>
<field name="user_id" ref="base.user_demo"/>
<field name="pricelist_id" ref="product.list0"/>
<field name="team_id" ref="sales_team.crm_team_1"/>
<field name="campaign_id" ref="utm.utm_campaign_email_campaign_products"/>
<field name="medium_id" ref="utm.utm_medium_email"/>
<field name="source_id" ref="sale.utm_source_sale_order_0"/>
<field name="date_order" eval="(DateTime.today() - relativedelta(months=1)).strftime('%Y-%m-%d %H:%M')"/>
</record>
<record id="sale_order_line_12" model="sale.order.line">
<field name="order_id" ref="sale_order_5"/>
<field name="product_id" ref="product.product_delivery_02"/>
<field name="price_unit">405.00</field>
</record>
<record id="sale_order_6" model="sale.order">
<field name="partner_id" ref="base.res_partner_18"/>
<field name="partner_invoice_id" ref="base.res_partner_18"/>
<field name="partner_shipping_id" ref="base.res_partner_18"/>
<field name="user_id" ref="base.user_admin"/>
<field name="pricelist_id" ref="product.list0"/>
<field name="team_id" ref="sales_team.crm_team_1"/>
<field name="campaign_id" ref="utm.utm_campaign_email_campaign_products"/>
<field name="medium_id" ref="utm.utm_medium_email"/>
<field name="source_id" ref="sale.utm_source_sale_order_0"/>
<field name="tag_ids" eval="[(4, ref('sales_team.categ_oppor6'))]"/>
</record>
<record id="sale_order_line_15" model="sale.order.line">
<field name="order_id" ref="sale_order_6"/>
<field name="product_id" ref="product.product_product_4"/>
<field name="price_unit">750.00</field>
</record>
<record id="sale_order_7" model="sale.order">
<field name="partner_id" ref="base.res_partner_3"/>
<field name="partner_invoice_id" ref="base.res_partner_address_11"/>
<field name="partner_shipping_id" ref="base.res_partner_address_11"/>
<field name="user_id" ref="base.user_admin"/>
<field name="pricelist_id" ref="product.list0"/>
<field name="team_id" ref="sales_team.team_sales_department"/>
<field name="campaign_id" ref="utm.utm_campaign_email_campaign_products"/>
<field name="medium_id" ref="utm.utm_medium_email"/>
<field name="source_id" ref="sale.utm_source_sale_order_0"/>
<field name="tag_ids" eval="[(4, ref('sales_team.categ_oppor4'))]"/>
</record>
<record id="sale_order_line_16" model="sale.order.line">
<field name="order_id" ref="sale_order_7"/>
<field name="product_id" ref="product.product_product_25"/>
<field name="product_uom_qty">5</field>
<field name="price_unit">295.00</field>
</record>
<record id="sale_order_line_17" model="sale.order.line">
<field name="order_id" ref="sale_order_7"/>
<field name="product_id" ref="product.consu_delivery_01"/>
<field name="price_unit">173.00</field>
</record>
<record id="sale_order_line_18" model="sale.order.line">
<field name="order_id" ref="sale_order_7"/>
<field name="product_id" ref="product.product_delivery_02"/>
<field name="price_unit">40.00</field>
</record>
<record id="sale_order_line_19" model="sale.order.line">
<field name="order_id" ref="sale_order_7"/>
<field name="product_id" ref="product.product_delivery_01"/>
<field name="price_unit">18.00</field>
</record>
<record id="sale_order_8" model="sale.order">
<field name="partner_id" ref="base.res_partner_3"/>
<field name="partner_invoice_id" ref="base.res_partner_address_25"/>
<field name="partner_shipping_id" ref="base.res_partner_address_25"/>
<field name="user_id" ref="base.user_demo"/>
<field name="pricelist_id" ref="product.list0"/>
<field name="team_id" ref="sales_team.crm_team_1"/>
<field name="campaign_id" ref="utm.utm_campaign_email_campaign_products"/>
<field name="medium_id" ref="utm.utm_medium_email"/>
<field name="source_id" ref="sale.utm_source_sale_order_0"/>
</record>
<record id="sale_order_line_20" model="sale.order.line">
<field name="order_id" ref="sale_order_8"/>
<field name="product_id" ref="product.product_product_27"/>
<field name="product_uom_qty">2</field>
<field name="price_unit">110.50</field>
</record>
<record id="sale_order_line_21" model="sale.order.line">
<field name="order_id" ref="sale_order_8"/>
<field name="product_id" ref="product.product_product_12"/>
<field name="product_uom_qty">2</field>
<field name="price_unit">120.50</field>
</record>
<!-- additional demo data for pretty graphs in sales dashboard -->
<record id="sale_order_9" model="sale.order">
<field name="partner_id" ref="base.res_partner_3"/>
<field name="partner_invoice_id" ref="base.res_partner_address_25"/>
<field name="partner_shipping_id" ref="base.res_partner_address_25"/>
<field name="user_id" ref="base.user_demo"/>
<field name="pricelist_id" ref="product.list0"/>
<field name="team_id" ref="sales_team.crm_team_1"/>
<field name="campaign_id" ref="utm.utm_campaign_email_campaign_products"/>
<field name="medium_id" ref="utm.utm_medium_email"/>
<field name="source_id" ref="sale.utm_source_sale_order_0"/>
<field name="date_order" eval="(datetime.now()-relativedelta(days=7)).strftime('%Y-%m-%d %H:%M:%S')"/>
</record>
<record id="sale_order_line_22" model="sale.order.line">
<field name="order_id" ref="sale_order_9"/>
<field name="product_id" ref="product.product_product_27"/>
<field name="product_uom_qty">3</field>
<field name="price_unit">97.50</field>
</record>
<record id="sale_order_line_23" model="sale.order.line">
<field name="order_id" ref="sale_order_9"/>
<field name="product_id" ref="product.product_product_12"/>
<field name="product_uom_qty">3</field>
<field name="price_unit">120.50</field>
</record>
<record id="sale_order_10" model="sale.order">
<field name="partner_id" ref="base.res_partner_3"/>
<field name="partner_invoice_id" ref="base.res_partner_address_25"/>
<field name="partner_shipping_id" ref="base.res_partner_address_25"/>
<field name="user_id" ref="base.user_demo"/>
<field name="pricelist_id" ref="product.list0"/>
<field name="team_id" ref="sales_team.crm_team_1"/>
<field name="campaign_id" ref="utm.utm_campaign_email_campaign_products"/>
<field name="medium_id" ref="utm.utm_medium_email"/>
<field name="source_id" ref="sale.utm_source_sale_order_0"/>
<field name="date_order" eval="(datetime.now()-relativedelta(days=14)).strftime('%Y-%m-%d %H:%M:%S')"/>
<field name="tag_ids" eval="[(4, ref('sales_team.categ_oppor3'))]"/>
</record>
<record id="sale_order_line_24" model="sale.order.line">
<field name="order_id" ref="sale_order_10"/>
<field name="product_id" ref="product.product_product_25"/>
<field name="product_uom_qty">2</field>
<field name="price_unit">255.00</field>
</record>
<record id="sale_order_line_25" model="sale.order.line">
<field name="order_id" ref="sale_order_10"/>
<field name="product_id" ref="product.product_product_12"/>
<field name="product_uom_qty">2</field>
<field name="price_unit">120.50</field>
</record>
<record id="sale_order_11" model="sale.order">
<field name="partner_id" ref="base.res_partner_3"/>
<field name="partner_invoice_id" ref="base.res_partner_address_25"/>
<field name="partner_shipping_id" ref="base.res_partner_address_25"/>
<field name="user_id" ref="base.user_demo"/>
<field name="pricelist_id" ref="product.list0"/>
<field name="team_id" ref="sales_team.crm_team_1"/>
<field name="campaign_id" ref="utm.utm_campaign_email_campaign_products"/>
<field name="medium_id" ref="utm.utm_medium_email"/>
<field name="source_id" ref="sale.utm_source_sale_order_0"/>
<field name="date_order" eval="(datetime.now()-relativedelta(days=21)).strftime('%Y-%m-%d %H:%M:%S')"/>
</record>
<record id="sale_order_line_26" model="sale.order.line">
<field name="order_id" ref="sale_order_11"/>
<field name="product_id" ref="product.product_product_25"/>
<field name="product_uom_qty">3</field>
<field name="price_unit">245.00</field>
</record>
<record id="sale_order_line_27" model="sale.order.line">
<field name="order_id" ref="sale_order_11"/>
<field name="product_id" ref="product.product_product_12"/>
<field name="product_uom_qty">3</field>
<field name="price_unit">120.50</field>
</record>
<record id="sale_order_12" model="sale.order">
<field name="partner_id" ref="base.res_partner_3"/>
<field name="partner_invoice_id" ref="base.res_partner_address_25"/>
<field name="partner_shipping_id" ref="base.res_partner_address_25"/>
<field name="user_id" ref="base.user_demo"/>
<field name="pricelist_id" ref="product.list0"/>
<field name="team_id" ref="sales_team.crm_team_1"/>
<field name="campaign_id" ref="utm.utm_campaign_email_campaign_products"/>
<field name="medium_id" ref="utm.utm_medium_email"/>
<field name="source_id" ref="sale.utm_source_sale_order_0"/>
<field name="date_order" eval="(datetime.now()-relativedelta(days=28)).strftime('%Y-%m-%d %H:%M:%S')"/>
<field name="tag_ids" eval="[(4, ref('sales_team.categ_oppor1'))]"/>
</record>
<record id="sale_order_line_28" model="sale.order.line">
<field name="order_id" ref="sale_order_12"/>
<field name="product_id" ref="product.product_product_25"/>
<field name="price_unit">315.00</field>
</record>
<record id="sale_order_line_29" model="sale.order.line">
<field name="order_id" ref="sale_order_12"/>
<field name="product_id" ref="product.product_product_12"/>
<field name="product_uom_qty">2</field>
<field name="price_unit">120.50</field>
</record>
<record id="sale_order_13" model="sale.order">
<field name="partner_id" ref="base.res_partner_3"/>
<field name="partner_invoice_id" ref="base.res_partner_address_25"/>
<field name="partner_shipping_id" ref="base.res_partner_address_25"/>
<field name="user_id" ref="base.user_demo"/>
<field name="pricelist_id" ref="product.list0"/>
<field name="team_id" ref="sales_team.crm_team_1"/>
<field name="campaign_id" ref="utm.utm_campaign_email_campaign_products"/>
<field name="medium_id" ref="utm.utm_medium_email"/>
<field name="source_id" ref="sale.utm_source_sale_order_0"/>
<field name="date_order" eval="(datetime.now()-relativedelta(days=35)).strftime('%Y-%m-%d %H:%M:%S')"/>
</record>
<record id="sale_order_line_30" model="sale.order.line">
<field name="order_id" ref="sale_order_13"/>
<field name="product_id" ref="product.product_product_25"/>
<field name="price_unit">295.00</field>
</record>
<record id="sale_order_line_31" model="sale.order.line">
<field name="order_id" ref="sale_order_13"/>
<field name="product_id" ref="product.product_product_12"/>
<field name="price_unit">120.50</field>
</record>
<record id="sale_order_14" model="sale.order">
<field name="partner_id" ref="base.res_partner_3"/>
<field name="partner_invoice_id" ref="base.res_partner_address_25"/>
<field name="partner_shipping_id" ref="base.res_partner_address_25"/>
<field name="user_id" ref="base.user_demo"/>
<field name="pricelist_id" ref="product.list0"/>
<field name="team_id" ref="sales_team.team_sales_department"/>
<field name="campaign_id" ref="utm.utm_campaign_email_campaign_products"/>
<field name="medium_id" ref="utm.utm_medium_email"/>
<field name="source_id" ref="sale.utm_source_sale_order_0"/>
<field name="date_order" eval="(datetime.now()-relativedelta(days=7)).strftime('%Y-%m-%d %H:%M:%S')"/>
</record>
<record id="sale_order_line_32" model="sale.order.line">
<field name="order_id" ref="sale_order_14"/>
<field name="product_id" ref="product.product_product_25"/>
<field name="product_uom_qty">4</field>
<field name="price_unit">275.00</field>
</record>
<record id="sale_order_line_33" model="sale.order.line">
<field name="order_id" ref="sale_order_14"/>
<field name="product_id" ref="product.product_product_12"/>
<field name="product_uom_qty">4</field>
<field name="price_unit">120.50</field>
</record>
<record id="sale_order_15" model="sale.order">
<field name="partner_id" ref="base.res_partner_3"/>
<field name="partner_invoice_id" ref="base.res_partner_address_25"/>
<field name="partner_shipping_id" ref="base.res_partner_address_25"/>
<field name="user_id" ref="base.user_demo"/>
<field name="pricelist_id" ref="product.list0"/>
<field name="team_id" ref="sales_team.team_sales_department"/>
<field name="campaign_id" ref="utm.utm_campaign_email_campaign_products"/>
<field name="medium_id" ref="utm.utm_medium_email"/>
<field name="source_id" ref="sale.utm_source_sale_order_0"/>
<field name="date_order" eval="(datetime.now()-relativedelta(days=14)).strftime('%Y-%m-%d %H:%M:%S')"/>
</record>
<record id="sale_order_line_34" model="sale.order.line">
<field name="order_id" ref="sale_order_15"/>
<field name="product_id" ref="product.product_product_25"/>
<field name="product_uom_qty">4</field>
<field name="price_unit">295.00</field>
</record>
<record id="sale_order_line_35" model="sale.order.line">
<field name="order_id" ref="sale_order_15"/>
<field name="product_id" ref="product.product_product_12"/>
<field name="product_uom_qty">3</field>
<field name="price_unit">120.50</field>
</record>
<record id="sale_order_16" model="sale.order">
<field name="partner_id" ref="base.res_partner_3"/>
<field name="partner_invoice_id" ref="base.res_partner_address_25"/>
<field name="partner_shipping_id" ref="base.res_partner_address_25"/>
<field name="user_id" ref="base.user_demo"/>
<field name="pricelist_id" ref="product.list0"/>
<field name="team_id" ref="sales_team.team_sales_department"/>
<field name="campaign_id" ref="utm.utm_campaign_email_campaign_products"/>
<field name="medium_id" ref="utm.utm_medium_email"/>
<field name="source_id" ref="sale.utm_source_sale_order_0"/>
<field name="date_order" eval="(datetime.now()-relativedelta(days=21)).strftime('%Y-%m-%d %H:%M:%S')"/>
</record>
<record id="sale_order_line_36" model="sale.order.line">
<field name="order_id" ref="sale_order_16"/>
<field name="product_id" ref="product.product_product_25"/>
<field name="product_uom_qty">3</field>
<field name="price_unit">275.00</field>
</record>
<record id="sale_order_line_37" model="sale.order.line">
<field name="order_id" ref="sale_order_16"/>
<field name="product_id" ref="product.product_product_12"/>
<field name="product_uom_qty">3</field>
<field name="price_unit">120.50</field>
</record>
<record id="sale_order_17" model="sale.order">
<field name="partner_id" ref="base.res_partner_3"/>
<field name="partner_invoice_id" ref="base.res_partner_address_25"/>
<field name="partner_shipping_id" ref="base.res_partner_address_25"/>
<field name="user_id" ref="base.user_demo"/>
<field name="pricelist_id" ref="product.list0"/>
<field name="team_id" ref="sales_team.team_sales_department"/>
<field name="campaign_id" ref="utm.utm_campaign_email_campaign_products"/>
<field name="medium_id" ref="utm.utm_medium_email"/>
<field name="source_id" ref="sale.utm_source_sale_order_0"/>
<field name="date_order" eval="(datetime.now()-relativedelta(days=28)).strftime('%Y-%m-%d %H:%M:%S')"/>
</record>
<record id="sale_order_line_38" model="sale.order.line">
<field name="order_id" ref="sale_order_17"/>
<field name="product_id" ref="product.product_product_25"/>
<field name="product_uom_qty">2</field>
<field name="price_unit">355.00</field>
</record>
<record id="sale_order_line_39" model="sale.order.line">
<field name="order_id" ref="sale_order_17"/>
<field name="product_id" ref="product.product_product_12"/>
<field name="product_uom_qty">2</field>
<field name="price_unit">120.50</field>
</record>
<record id="sale_order_18" model="sale.order">
<field name="partner_id" ref="base.res_partner_3"/>
<field name="partner_invoice_id" ref="base.res_partner_address_25"/>
<field name="partner_shipping_id" ref="base.res_partner_address_25"/>
<field name="user_id" ref="base.user_demo"/>
<field name="pricelist_id" ref="product.list0"/>
<field name="team_id" ref="sales_team.team_sales_department"/>
<field name="campaign_id" ref="utm.utm_campaign_email_campaign_products"/>
<field name="medium_id" ref="utm.utm_medium_email"/>
<field name="source_id" ref="sale.utm_source_sale_order_0"/>
<field name="date_order" eval="(datetime.now()-relativedelta(days=35)).strftime('%Y-%m-%d %H:%M:%S')"/>
</record>
<record id="sale_order_line_40" model="sale.order.line">
<field name="order_id" ref="sale_order_18"/>
<field name="product_id" ref="product.product_product_25"/>
<field name="product_uom_qty">2</field>
<field name="price_unit">295.00</field>
</record>
<record id="sale_order_line_41" model="sale.order.line">
<field name="order_id" ref="sale_order_18"/>
<field name="product_id" ref="product.product_product_12"/>
<field name="product_uom_qty">2</field>
<field name="price_unit">120.50</field>
</record>
<record id="portal_sale_order_1" model="sale.order">
<field name="partner_id" ref="base.partner_demo_portal"/>
<field name="partner_invoice_id" ref="base.partner_demo_portal"/>
<field name="partner_shipping_id" ref="base.partner_demo_portal"/>
<field name="user_id" ref="base.user_admin"/>
<field name="pricelist_id" ref="product.list0"/>
<field name="state">sent</field>
<field name="team_id" ref="sales_team.team_sales_department"/>
<field name="date_order" eval="(DateTime.today() - relativedelta(months=1)).strftime('%Y-%m-%d %H:%M')"/>
<field name="message_partner_ids" eval="[(4, ref('base.partner_demo_portal'))]"/>
<field name="tag_ids" eval="[(4, ref('sales_team.categ_oppor4'))]"/>
</record>
<record id="portal_sale_order_line_1" model="sale.order.line">
<field name="order_id" ref="portal_sale_order_1"/>
<field name="product_id" ref="product.product_product_25"/>
<field name="product_uom_qty">3</field>
<field name="price_unit">295.00</field>
</record>
<record id="portal_sale_order_line_2" model="sale.order.line">
<field name="order_id" ref="portal_sale_order_1"/>
<field name="product_id" ref="product.product_delivery_02"/>
<field name="product_uom_qty">5</field>
<field name="price_unit">145.00</field>
</record>
<record id="portal_sale_order_line_3" model="sale.order.line">
<field name="order_id" ref="portal_sale_order_1"/>
<field name="product_id" ref="product.product_delivery_01"/>
<field name="product_uom_qty">2</field>
<field name="price_unit">65.00</field>
</record>
<record id="portal_sale_order_2" model="sale.order">
<field name="partner_id" ref="base.partner_demo_portal"/>
<field name="partner_invoice_id" ref="base.partner_demo_portal"/>
<field name="partner_shipping_id" ref="base.partner_demo_portal"/>
<field name="user_id" ref="base.user_admin"/>
<field name="pricelist_id" ref="product.list0"/>
<field name="team_id" ref="sales_team.team_sales_department"/>
<field name="date_order" eval="(DateTime.today() - relativedelta(months=1)).strftime('%Y-%m-%d %H:%M')"/>
<field name="message_partner_ids" eval="[(4, ref('base.partner_demo_portal'))]"/>
</record>
<record id="portal_sale_order_line_4" model="sale.order.line">
<field name="order_id" ref="portal_sale_order_2"/>
<field name="product_id" ref="product.product_product_1"/>
<field name="product_uom_qty">24</field>
<field name="price_unit">75.00</field>
</record>
<record id="portal_sale_order_line_5" model="sale.order.line">
<field name="order_id" ref="portal_sale_order_2"/>
<field name="product_id" ref="product.product_product_2"/>
<field name="product_uom_qty">30</field>
<field name="price_unit">38.25</field>
</record>
<!-- Confirm some Sales Orders-->
<function model="sale.order" name="action_confirm" eval="[[
ref('sale_order_4'),
ref('sale_order_6'),
ref('sale_order_7'),
ref('sale_order_8'),
ref('sale_order_9'),
ref('sale_order_10'),
ref('sale_order_11'),
ref('sale_order_12'),
ref('sale_order_13'),
ref('sale_order_14'),
ref('sale_order_15'),
ref('sale_order_16'),
ref('sale_order_17'),
ref('sale_order_18'),
ref('portal_sale_order_2'),
]]"/>
<!-- Setting date_order in the past for beautiful spread -->
<record id="sale_order_9" model="sale.order">
<field name="date_order" eval="datetime.now() - relativedelta(days=7)"/>
</record>
<record id="sale_order_11" model="sale.order">
<field name="date_order" eval="datetime.now() - relativedelta(days=21)"/>
</record>
<record id="sale_order_15" model="sale.order">
<field name="date_order" eval="datetime.now() - relativedelta(days=14)"/>
</record>
<record id="sale_order_17" model="sale.order">
<field name="date_order" eval="datetime.now() - relativedelta(days=28)"/>
</record>
<record id="sale_order_18" model="sale.order">
<field name="date_order" eval="datetime.now() - relativedelta(days=35)"/>
</record>
<record id="portal_sale_order_2" model="sale.order">
<field name="date_order" eval="datetime.now() - relativedelta(months=1)"/>
</record>
<!-- Mail messages in SO's chatter -->
<record id="message_sale_1" model="mail.message">
<field name="model">sale.order</field>
<field name="res_id" ref="sale_order_2"/>
<field name="body">Hi,
I have a question regarding services pricing: I heard of a possible discount for quantities exceeding 25 hours.
Could you confirm, please?</field>
<field name="message_type">comment</field>
<field name="author_id" ref="base.partner_demo"/>
</record>
<record id="message_sale_2" model="mail.message">
<field name="model">sale.order</field>
<field name="res_id" ref="sale_order_2"/>
<field name="parent_id" ref="message_sale_1"/>
<field name="body">Hello,
Unfortunately that was a temporary discount that is not available anymore.
Do you still plan to confirm the order based on the quoted prices?
Thanks!</field>
<field name="message_type">comment</field>
<field name="author_id" ref="base.partner_root"/>
</record>
<record id="message_sale_3" model="mail.message">
<field name="model">sale.order</field>
<field name="res_id" ref="sale_order_2"/>
<field name="parent_id" ref="message_sale_2"/>
<field name="body">
Alright, thanks for the clarification. I will confirm the order as soon as I get my manager's approval.
</field>
<field name="message_type">comment</field>
<field name="author_id" ref="base.partner_demo"/>
</record>
<!-- Activities of sales order -->
<record id="sale_activity_2" model="mail.activity">
<field name="res_id" ref="sale.sale_order_3"/>
<field name="res_model_id" ref="sale.model_sale_order"/>
<field name="activity_type_id" ref="mail.mail_activity_data_email"/>
<field name="date_deadline" eval="DateTime.today().strftime('%Y-%m-%d %H:%M')"/>
<field name="summary">Answer questions</field>
<field name="create_uid" ref="base.user_admin"/>
<field name="user_id" ref="base.user_admin"/>
</record>
<record id="sale_activity_3" model="mail.activity">
<field name="res_id" ref="sale.sale_order_4"/>
<field name="res_model_id" ref="sale.model_sale_order"/>
<field name="activity_type_id" ref="sale.mail_act_sale_upsell"/>
<field name="date_deadline" eval="(DateTime.today() + relativedelta(days=5)).strftime('%Y-%m-%d %H:%M')"/>
<field name="create_uid" ref="base.user_admin"/>
<field name="user_id" ref="base.user_admin"/>
</record>
<record id="sale_activity_4" model="mail.activity">
<field name="res_id" ref="sale.sale_order_5"/>
<field name="res_model_id" ref="sale.model_sale_order"/>
<field name="activity_type_id" ref="mail.mail_activity_data_email"/>
<field name="date_deadline" eval="DateTime.today().strftime('%Y-%m-%d %H:%M')"/>
<field name="create_uid" ref="base.user_demo"/>
<field name="user_id" ref="base.user_demo"/>
</record>
<record id="sale_activity_6" model="mail.activity">
<field name="res_id" ref="sale.sale_order_7"/>
<field name="res_model_id" ref="sale.model_sale_order"/>
<field name="activity_type_id" ref="mail.mail_activity_data_todo"/>
<field name="date_deadline" eval="(DateTime.today() + relativedelta(days=5)).strftime('%Y-%m-%d %H:%M')"/>
<field name="summary">Check delivery requirements</field>
<field name="create_uid" ref="base.user_admin"/>
<field name="user_id" ref="base.user_admin"/>
</record>
<record id="sale_activity_7" model="mail.activity">
<field name="res_id" ref="sale.sale_order_10"/>
<field name="res_model_id" ref="sale.model_sale_order"/>
<field name="activity_type_id" ref="mail.mail_activity_data_todo"/>
<field name="date_deadline" eval="(DateTime.today() + relativedelta(days=5)).strftime('%Y-%m-%d %H:%M')"/>
<field name="summary">Confirm Delivery</field>
<field name="create_uid" ref="base.user_demo"/>
<field name="user_id" ref="base.user_demo"/>
</record>
<record id="sale_activity_8" model="mail.activity">
<field name="res_id" ref="sale.sale_order_12"/>
<field name="res_model_id" ref="sale.model_sale_order"/>
<field name="activity_type_id" ref="mail.mail_activity_data_email"/>
<field name="date_deadline" eval="(DateTime.today() + relativedelta(days=5)).strftime('%Y-%m-%d %H:%M')"/>
<field name="create_uid" ref="base.user_demo"/>
<field name="user_id" ref="base.user_demo"/>
</record>
<record id="sale_activity_9" model="mail.activity">
<field name="res_id" ref="sale.sale_order_16"/>
<field name="res_model_id" ref="sale.model_sale_order"/>
<field name="activity_type_id" ref="sale.mail_act_sale_upsell"/>
<field name="date_deadline" eval="DateTime.today().strftime('%Y-%m-%d %H:%M')"/>
<field name="create_uid" ref="base.user_demo"/>
<field name="user_id" ref="base.user_demo"/>
</record>
<record id="sale_activity_10" model="mail.activity">
<field name="res_id" ref="sale.portal_sale_order_1"/>
<field name="res_model_id" ref="sale.model_sale_order"/>
<field name="activity_type_id" ref="mail.mail_activity_data_todo"/>
<field name="date_deadline" eval="(DateTime.today() + relativedelta(days=5)).strftime('%Y-%m-%d %H:%M')"/>
<field name="summary">Get quote confirmation</field>
<field name="create_uid" ref="base.user_admin"/>
<field name="user_id" ref="base.user_admin"/>
</record>
</odoo>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,672 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale
#
# Translators:
# Daniel Santibáñez Polanco <dansanti@gmail.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 15.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-05-23 08:23+0000\n"
"PO-Revision-Date: 2016-03-13 01:19+0000\n"
"Last-Translator: Daniel Santibáñez Polanco <dansanti@gmail.com>\n"
"Language-Team: Spanish (Chile) (http://www.transifex.com/odoo/odoo-9/"
"language/es_CL/)\n"
"Language: es_CL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_report__nbr
msgid "# of Lines"
msgstr "# de líneas"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.report_saleorder_document
msgid "<strong>Fiscal Position Remark:</strong>"
msgstr "<strong>Posici&#243;n fiscal:</strong>"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.report_saleorder_document
msgid "<strong>Salesperson:</strong>"
msgstr "<strong>Vendedor:</strong>"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__message_needaction
msgid "Action Needed"
msgstr "Acción necesaria"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__analytic_account_id
#: model:ir.model.fields,field_description:sale.field_sale_report__analytic_account_id
msgid "Analytic Account"
msgstr "Cuenta analítica"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.sale_order_cancel_view_form
#: model_terms:ir.ui.view,arch_db:sale.sale_order_portal_template
#: model_terms:ir.ui.view,arch_db:sale.view_order_form
#: model_terms:ir.ui.view,arch_db:sale.view_sale_advance_payment_inv
msgid "Cancel"
msgstr "Cancelar"
#. module: sale
#: model:ir.model.fields.selection,name:sale.selection__sale_order__state__cancel
#: model:ir.model.fields.selection,name:sale.selection__sale_report__state__cancel
msgid "Cancelled"
msgstr "Cancelado"
#. module: sale
#: model:ir.model,name:sale.model_res_company
msgid "Companies"
msgstr "Compañías"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_advance_payment_inv__company_id
#: model:ir.model.fields,field_description:sale.field_sale_order__company_id
#: model:ir.model.fields,field_description:sale.field_sale_order_line__company_id
#: model:ir.model.fields,field_description:sale.field_sale_report__company_id
#: model:ir.model.fields,field_description:sale.field_utm_campaign__company_id
#: model_terms:ir.ui.view,arch_db:sale.view_order_product_search
msgid "Company"
msgstr "Compañía"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_advance_payment_inv__advance_payment_method
#: model_terms:ir.ui.view,arch_db:sale.view_order_form
#: model_terms:ir.ui.view,arch_db:sale.view_sale_advance_payment_inv
msgid "Create Invoice"
msgstr "Crear factura"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_advance_payment_inv__create_uid
#: model:ir.model.fields,field_description:sale.field_sale_order__create_uid
#: model:ir.model.fields,field_description:sale.field_sale_order_cancel__create_uid
#: model:ir.model.fields,field_description:sale.field_sale_order_line__create_uid
#: model:ir.model.fields,field_description:sale.field_sale_payment_provider_onboarding_wizard__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_advance_payment_inv__create_date
#: model:ir.model.fields,field_description:sale.field_sale_order_cancel__create_date
#: model:ir.model.fields,field_description:sale.field_sale_order_line__create_date
#: model:ir.model.fields,field_description:sale.field_sale_payment_provider_onboarding_wizard__create_date
msgid "Created on"
msgstr "Creado en"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__create_date
#: model_terms:ir.ui.view,arch_db:sale.view_quotation_tree
msgid "Creation Date"
msgstr "Fecha creación"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_advance_payment_inv__currency_id
#: model:ir.model.fields,field_description:sale.field_sale_order__currency_id
#: model:ir.model.fields,field_description:sale.field_sale_order_line__currency_id
#: model:ir.model.fields,field_description:sale.field_utm_campaign__currency_id
msgid "Currency"
msgstr "Moneda"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__partner_id
#: model:ir.model.fields,field_description:sale.field_sale_order_line__order_partner_id
#: model:ir.model.fields,field_description:sale.field_sale_report__partner_id
#: model_terms:ir.ui.view,arch_db:sale.view_order_product_search
#: model_terms:ir.ui.view,arch_db:sale.view_sales_order_filter
msgid "Customer"
msgstr "Cliente"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__client_order_ref
msgid "Customer Reference"
msgstr "Referencia cliente"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_advance_payment_inv__deposit_taxes_id
msgid "Customer Taxes"
msgstr "Impuestos de cliente"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.view_order_form
msgid "Delivered"
msgstr "Entregado"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order_line__name
#: model_terms:ir.ui.view,arch_db:sale.report_saleorder_document
#: model_terms:ir.ui.view,arch_db:sale.view_order_form
msgid "Description"
msgstr "Descripción"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order_line__discount
msgid "Discount (%)"
msgstr "Descuento (%)"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_advance_payment_inv__display_name
#: model:ir.model.fields,field_description:sale.field_sale_order__display_name
#: model:ir.model.fields,field_description:sale.field_sale_order_cancel__display_name
#: model:ir.model.fields,field_description:sale.field_sale_order_line__display_name
#: model:ir.model.fields,field_description:sale.field_sale_payment_provider_onboarding_wizard__display_name
#: model:ir.model.fields,field_description:sale.field_sale_report__display_name
msgid "Display Name"
msgstr "Nombre mostrado"
#. module: sale
#: model:ir.model.fields.selection,name:sale.selection__res_company__sale_onboarding_order_confirmation_state__done
#: model:ir.model.fields.selection,name:sale.selection__res_company__sale_onboarding_sample_quotation_state__done
#: model:ir.model.fields.selection,name:sale.selection__res_company__sale_quotation_onboarding_state__done
msgid "Done"
msgstr "Realizado"
#. module: sale
#: model:ir.model,name:sale.model_mail_compose_message
msgid "Email composition wizard"
msgstr "Asistente de redacción de correo electrónico."
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__fiscal_position_id
msgid "Fiscal Position"
msgstr "Posición fiscal"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__message_follower_ids
msgid "Followers"
msgstr "Seguidores"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__message_partner_ids
msgid "Followers (Partners)"
msgstr "Seguidores (Empresas)"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.view_order_product_search
#: model_terms:ir.ui.view,arch_db:sale.view_sales_order_filter
#: model_terms:ir.ui.view,arch_db:sale.view_sales_order_line_filter
msgid "Group By"
msgstr "Agrupar por"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_advance_payment_inv__id
#: model:ir.model.fields,field_description:sale.field_sale_order__id
#: model:ir.model.fields,field_description:sale.field_sale_order_cancel__id
#: model:ir.model.fields,field_description:sale.field_sale_order_line__id
#: model:ir.model.fields,field_description:sale.field_sale_payment_provider_onboarding_wizard__id
#: model:ir.model.fields,field_description:sale.field_sale_report__id
msgid "ID"
msgstr "ID (identificación)"
#. module: sale
#: model:ir.model.fields,help:sale.field_sale_order__message_needaction
msgid "If checked, new messages require your attention."
msgstr "Si está marcado, hay nuevos mensajes que requieren su atención."
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_advance_payment_inv__deposit_account_id
msgid "Income Account"
msgstr "Cuenta de ingresos"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__partner_invoice_id
msgid "Invoice Address"
msgstr "Dirección factura"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order_line__invoice_lines
msgid "Invoice Lines"
msgstr "Líneas de factura"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__invoice_status
#: model:ir.model.fields,field_description:sale.field_sale_order_line__invoice_status
msgid "Invoice Status"
msgstr "Estado de facturación"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.view_order_form
msgid "Invoiced"
msgstr "Facturado"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_invoice_salesteams
#: model:ir.model.fields,field_description:sale.field_sale_order__invoice_ids
#: model_terms:ir.ui.view,arch_db:sale.crm_team_view_kanban_dashboard
#: model_terms:ir.ui.view,arch_db:sale.view_order_form
msgid "Invoices"
msgstr "Facturas"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_account_invoice_report_salesteam
msgid "Invoices Analysis"
msgstr "Análisis de facturas"
#. module: sale
#: model:ir.model,name:sale.model_account_invoice_report
msgid "Invoices Statistics"
msgstr "Estadísticas de facturas"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.crm_team_view_kanban_dashboard
#: model_terms:ir.ui.view,arch_db:sale.res_config_settings_view_form
msgid "Invoicing"
msgstr "Facturando"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__message_is_follower
msgid "Is Follower"
msgstr "Es un seguidor"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_advance_payment_inv____last_update
#: model:ir.model.fields,field_description:sale.field_sale_order____last_update
#: model:ir.model.fields,field_description:sale.field_sale_order_cancel____last_update
#: model:ir.model.fields,field_description:sale.field_sale_order_line____last_update
#: model:ir.model.fields,field_description:sale.field_sale_payment_provider_onboarding_wizard____last_update
#: model:ir.model.fields,field_description:sale.field_sale_report____last_update
msgid "Last Modified on"
msgstr "Última modificación en"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_advance_payment_inv__write_uid
#: model:ir.model.fields,field_description:sale.field_sale_order__write_uid
#: model:ir.model.fields,field_description:sale.field_sale_order_cancel__write_uid
#: model:ir.model.fields,field_description:sale.field_sale_order_line__write_uid
#: model:ir.model.fields,field_description:sale.field_sale_payment_provider_onboarding_wizard__write_uid
msgid "Last Updated by"
msgstr "Última actualización de"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_advance_payment_inv__write_date
#: model:ir.model.fields,field_description:sale.field_sale_order__write_date
#: model:ir.model.fields,field_description:sale.field_sale_order_cancel__write_date
#: model:ir.model.fields,field_description:sale.field_sale_order_line__write_date
#: model:ir.model.fields,field_description:sale.field_sale_payment_provider_onboarding_wizard__write_date
msgid "Last Updated on"
msgstr "Última actualización en"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__message_ids
msgid "Messages"
msgstr "Mensajes"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.view_sales_order_line_filter
msgid "My Sales Order Lines"
msgstr "Mis lineas de pedidos de venta"
#. module: sale
#. odoo-python
#: code:addons/sale/models/sale_order.py:0
#, python-format
msgid "New"
msgstr "Nueva"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__message_needaction_counter
msgid "Number of Actions"
msgstr "Número de acciones"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.view_sales_order_filter
#: model_terms:ir.ui.view,arch_db:sale.view_sales_order_line_filter
msgid "Order"
msgstr "Pedido"
#. module: sale
#. odoo-python
#: code:addons/sale/controllers/portal.py:0
#: model:ir.model.fields,field_description:sale.field_sale_order__date_order
#: model:ir.model.fields,field_description:sale.field_sale_report__date
#: model_terms:ir.ui.view,arch_db:sale.portal_my_orders
#: model_terms:ir.ui.view,arch_db:sale.sale_order_view_search_inherit_sale
#: model_terms:ir.ui.view,arch_db:sale.view_order_form
#: model_terms:ir.ui.view,arch_db:sale.view_order_product_search
#: model_terms:ir.ui.view,arch_db:sale.view_order_tree
#: model_terms:ir.ui.view,arch_db:sale.view_sales_order_filter
#, python-format
msgid "Order Date"
msgstr "Fecha orden"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__order_line
#: model_terms:ir.ui.view,arch_db:sale.view_order_form
msgid "Order Lines"
msgstr "Líneas del pedido"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__name
#: model:ir.model.fields,field_description:sale.field_sale_order_line__order_id
#: model:ir.model.fields,field_description:sale.field_sale_report__name
msgid "Order Reference"
msgstr "Referencia de pedido"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order_line__state
msgid "Order Status"
msgstr "Estado del pedido"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__pricelist_id
#: model:ir.model.fields,field_description:sale.field_sale_report__pricelist_id
msgid "Pricelist"
msgstr "Tarifa"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.sale_order_portal_template
msgid "Print"
msgstr "Imprimir"
#. module: sale
#: model:ir.model,name:sale.model_product_template
#: model:ir.model.fields,field_description:sale.field_sale_order_line__product_id
#: model:ir.model.fields,field_description:sale.field_sale_report__product_tmpl_id
#: model_terms:ir.ui.view,arch_db:sale.view_order_form
#: model_terms:ir.ui.view,arch_db:sale.view_order_product_search
#: model_terms:ir.ui.view,arch_db:sale.view_sales_order_filter
#: model_terms:ir.ui.view,arch_db:sale.view_sales_order_line_filter
msgid "Product"
msgstr "Producto"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_report__categ_id
#: model_terms:ir.ui.view,arch_db:sale.view_order_product_search
msgid "Product Category"
msgstr "Categoría de producto"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order_line__product_template_id
msgid "Product Template"
msgstr "Plantilla producto"
#. module: sale
#: model:ir.actions.act_window,name:sale.product_template_action
#: model:ir.ui.menu,name:sale.menu_product_template_action
#: model:ir.ui.menu,name:sale.prod_config_main
#: model:ir.ui.menu,name:sale.product_menu_catalog
#: model_terms:ir.ui.view,arch_db:sale.sale_order_portal_content
msgid "Products"
msgstr "Productos"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.view_order_line_tree
msgid "Qty"
msgstr "Ctdad"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order_line__product_uom_qty
#: model_terms:ir.ui.view,arch_db:sale.report_saleorder_document
#: model_terms:ir.ui.view,arch_db:sale.sale_order_portal_content
msgid "Quantity"
msgstr "Cantidad"
#. module: sale
#. odoo-python
#: code:addons/sale/models/sale_order.py:0
#: model:ir.model.fields.selection,name:sale.selection__sale_order__state__draft
#: model_terms:ir.ui.view,arch_db:sale.crm_team_view_kanban_dashboard
#: model_terms:ir.ui.view,arch_db:sale.view_quotation_tree
#, python-format
msgid "Quotation"
msgstr "Presupuesto"
#. module: sale
#: model:ir.actions.report,name:sale.action_report_saleorder
msgid "Quotation / Order"
msgstr "Presupuesto / Pedido"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_quotations
#: model:ir.actions.act_window,name:sale.action_quotations_salesteams
#: model:ir.actions.act_window,name:sale.action_quotations_with_onboarding
#: model:ir.model.fields,field_description:sale.field_crm_team__use_quotations
#: model:ir.ui.menu,name:sale.menu_sale_quotations
#: model_terms:ir.ui.view,arch_db:sale.crm_team_view_kanban_dashboard
#: model_terms:ir.ui.view,arch_db:sale.portal_my_home_menu_sale
#: model_terms:ir.ui.view,arch_db:sale.portal_my_home_sale
#: model_terms:ir.ui.view,arch_db:sale.portal_my_quotations
#: model_terms:ir.ui.view,arch_db:sale.sale_order_view_search_inherit_quotation
#: model_terms:ir.ui.view,arch_db:sale.utm_campaign_view_form
#: model_terms:ir.ui.view,arch_db:sale.utm_campaign_view_kanban
#: model_terms:ir.ui.view,arch_db:sale.view_order_product_search
msgid "Quotations"
msgstr "Presupuestos"
#. module: sale
#: model:ir.actions.act_window,name:sale.act_res_partner_2_sale_order
msgid "Quotations and Sales"
msgstr "Presupuestos y pedidos"
#. module: sale
#: model:ir.ui.menu,name:sale.menu_sale_report
msgid "Reporting"
msgstr "Informes"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_product_packaging__sales
#: model:ir.ui.menu,name:sale.sale_menu_root
#: model_terms:ir.ui.view,arch_db:sale.crm_team_view_kanban_dashboard
#: model_terms:ir.ui.view,arch_db:sale.res_config_settings_view_form
#: model_terms:ir.ui.view,arch_db:sale.res_partner_view_buttons
#: model_terms:ir.ui.view,arch_db:sale.view_order_form
msgid "Sales"
msgstr "Ventas"
#. module: sale
#: model:ir.model,name:sale.model_sale_advance_payment_inv
msgid "Sales Advance Payment Invoice"
msgstr "Ventas. Anticipo pago factura"
#. module: sale
#. odoo-python
#: code:addons/sale/models/crm_team.py:0
#: model:ir.actions.act_window,name:sale.action_order_report_all
#: model:ir.actions.act_window,name:sale.action_order_report_so_salesteam
#: model:ir.actions.act_window,name:sale.report_all_channels_sales_action
#: model_terms:ir.ui.view,arch_db:sale.sale_report_view_tree
#: model_terms:ir.ui.view,arch_db:sale.view_order_product_graph
#: model_terms:ir.ui.view,arch_db:sale.view_order_product_pivot
#: model_terms:ir.ui.view,arch_db:sale.view_order_product_search
#, python-format
msgid "Sales Analysis"
msgstr "Análisis de ventas"
#. module: sale
#. odoo-python
#: code:addons/sale/models/sale_order.py:0
#: model:ir.model,name:sale.model_sale_order
#: model:ir.model.fields,field_description:sale.field_res_partner__sale_order_ids
#: model:ir.model.fields,field_description:sale.field_res_users__sale_order_ids
#: model:ir.model.fields.selection,name:sale.selection__sale_order__state__sale
#: model:ir.model.fields.selection,name:sale.selection__sale_report__state__sale
#: model_terms:ir.ui.view,arch_db:sale.view_order_form
#, python-format
msgid "Sales Order"
msgstr "Pedido de venta"
#. module: sale
#: model:ir.model,name:sale.model_sale_order_line
#: model:ir.model.fields,field_description:sale.field_product_attribute_custom_value__sale_order_line_id
#: model:ir.model.fields,field_description:sale.field_product_product__sale_line_warn
#: model:ir.model.fields,field_description:sale.field_product_template__sale_line_warn
msgid "Sales Order Line"
msgstr "Línea de pedido de venta"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_account_move_line__sale_line_ids
#: model_terms:ir.ui.view,arch_db:sale.view_order_form
#: model_terms:ir.ui.view,arch_db:sale.view_order_line_tree
msgid "Sales Order Lines"
msgstr "Líneas pedido de ventas"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_orders
#: model:ir.actions.act_window,name:sale.action_orders_salesteams
#: model:ir.actions.act_window,name:sale.action_orders_to_invoice_salesteams
#: model:ir.model.fields,field_description:sale.field_payment_transaction__sale_order_ids
#: model:ir.ui.menu,name:sale.menu_sales_config
#: model_terms:ir.ui.view,arch_db:sale.crm_team_view_kanban_dashboard
#: model_terms:ir.ui.view,arch_db:sale.portal_my_home_menu_sale
#: model_terms:ir.ui.view,arch_db:sale.portal_my_home_sale
#: model_terms:ir.ui.view,arch_db:sale.portal_my_orders
#: model_terms:ir.ui.view,arch_db:sale.sale_order_view_activity
#: model_terms:ir.ui.view,arch_db:sale.sale_order_view_search_inherit_quotation
#: model_terms:ir.ui.view,arch_db:sale.view_order_product_search
#: model_terms:ir.ui.view,arch_db:sale.view_order_tree
#: model_terms:ir.ui.view,arch_db:sale.view_sale_order_calendar
#: model_terms:ir.ui.view,arch_db:sale.view_sale_order_graph
#: model_terms:ir.ui.view,arch_db:sale.view_sale_order_pivot
msgid "Sales Orders"
msgstr "Pedidos de ventas"
#. module: sale
#: model:ir.model,name:sale.model_crm_team
#: model:ir.model.fields,field_description:sale.field_account_bank_statement_line__team_id
#: model:ir.model.fields,field_description:sale.field_account_invoice_report__team_id
#: model:ir.model.fields,field_description:sale.field_account_move__team_id
#: model:ir.model.fields,field_description:sale.field_account_payment__team_id
#: model:ir.model.fields,field_description:sale.field_sale_order__team_id
#: model:ir.model.fields,field_description:sale.field_sale_report__team_id
#: model_terms:ir.ui.view,arch_db:sale.account_invoice_groupby_inherit
#: model_terms:ir.ui.view,arch_db:sale.view_account_invoice_report_search_inherit
#: model_terms:ir.ui.view,arch_db:sale.view_order_product_search
#: model_terms:ir.ui.view,arch_db:sale.view_sales_order_filter
msgid "Sales Team"
msgstr "Equipo de ventas"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__user_id
#: model:ir.model.fields,field_description:sale.field_sale_order_line__salesman_id
#: model:ir.model.fields,field_description:sale.field_sale_report__user_id
#: model_terms:ir.ui.view,arch_db:sale.view_order_product_search
#: model_terms:ir.ui.view,arch_db:sale.view_sales_order_filter
#: model_terms:ir.ui.view,arch_db:sale.view_sales_order_line_filter
msgid "Salesperson"
msgstr "Vendedor"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.view_sales_order_filter
#: model_terms:ir.ui.view,arch_db:sale.view_sales_order_line_filter
msgid "Search Sales Order"
msgstr "Buscar pedido de venta"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order_line__sequence
msgid "Sequence"
msgstr "Secuencia"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__origin
msgid "Source Document"
msgstr "Documento origen"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__state
#: model:ir.model.fields,field_description:sale.field_sale_report__state
#: model_terms:ir.ui.view,arch_db:sale.view_order_product_search
msgid "Status"
msgstr "Estado"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order_line__price_subtotal
msgid "Subtotal"
msgstr "Subtotal"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__amount_tax
#: model:ir.model.fields,field_description:sale.field_sale_order_line__tax_id
#: model_terms:ir.ui.view,arch_db:sale.report_saleorder_document
msgid "Taxes"
msgstr "Impuestos"
#. module: sale
#: model_terms:ir.actions.act_window,help:sale.action_order_report_all
msgid ""
"This report performs analysis on your quotations and sales orders. Analysis "
"check your sales revenues and sort it by different group criteria (salesman, "
"partner, product, etc.) Use this report to perform analysis on sales not "
"having invoiced yet. If you want to analyse your turnover, you should use "
"the Invoice Analysis report in the Accounting application."
msgstr ""
"Este informe realiza un análisis de sus presupuestos y pedidos de venta. El "
"análisis verifica los ingresos de sus ventas y los ordena por diferentes "
"grupos de criterios (comercial, empresa, producto, etc.). Utilice este "
"informe para realizar un análisis sobre sus ventas todavía no facturadas. Si "
"desea analizar sus ingresos, debería utilizar el informe de análisis de "
"facturas en la aplicación de Contabilidad."
#. module: sale
#: model:ir.model.fields.selection,name:sale.selection__sale_order__invoice_status__to_invoice
#: model:ir.model.fields.selection,name:sale.selection__sale_order_line__invoice_status__to_invoice
#: model:ir.ui.menu,name:sale.menu_sale_invoicing
#: model_terms:ir.ui.view,arch_db:sale.sale_order_view_search_inherit_sale
#: model_terms:ir.ui.view,arch_db:sale.view_sales_order_line_filter
msgid "To Invoice"
msgstr "Para facturar"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__amount_total
#: model:ir.model.fields,field_description:sale.field_sale_order_line__price_total
#: model:ir.model.fields,field_description:sale.field_sale_report__price_total
#: model_terms:ir.ui.view,arch_db:sale.portal_my_orders
#: model_terms:ir.ui.view,arch_db:sale.portal_my_quotations
#: model_terms:ir.ui.view,arch_db:sale.view_order_line_tree
msgid "Total"
msgstr "Total"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.view_order_tree
#: model_terms:ir.ui.view,arch_db:sale.view_quotation_tree
msgid "Total Tax Included"
msgstr "Total impuestos incluidos"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order_line__price_unit
#: model_terms:ir.ui.view,arch_db:sale.report_saleorder_document
#: model_terms:ir.ui.view,arch_db:sale.sale_order_portal_content
msgid "Unit Price"
msgstr "Precio un."
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order_line__product_uom
#: model:ir.model.fields,field_description:sale.field_sale_report__product_uom
#: model_terms:ir.ui.view,arch_db:sale.view_order_line_tree
msgid "Unit of Measure"
msgstr "Unidad de medida"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__amount_untaxed
msgid "Untaxed Amount"
msgstr "Total neto"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_report__untaxed_amount_invoiced
msgid "Untaxed Amount Invoiced"
msgstr "Total neto facturado"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order_line__untaxed_amount_to_invoice
#: model:ir.model.fields,field_description:sale.field_sale_report__untaxed_amount_to_invoice
msgid "Untaxed Amount To Invoice"
msgstr "Total neto por facturar"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__website_message_ids
msgid "Website Messages"
msgstr "Mensajes del sitio web"
#. module: sale
#: model:ir.model.fields,help:sale.field_sale_order__website_message_ids
msgid "Website communication history"
msgstr "Historial de comunicaciones del sitio web"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.res_config_settings_view_form
#: model_terms:ir.ui.view,arch_db:sale.view_order_form
msgid "days"
msgstr "días"

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

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