Browse Source

[ADD] pos_order_return_traceability

changes
pull/451/head
David Alonso (Solvos) 4 years ago
parent
commit
bfe948824d
  1. 10
      pos_order_mgmt/README.rst
  2. 1
      pos_order_mgmt/readme/CONTRIBUTORS.rst
  3. 9
      pos_order_mgmt/readme/ROADMAP.rst
  4. 10
      pos_order_mgmt/static/description/index.html
  5. 32
      pos_order_mgmt/static/src/js/widgets.js
  6. 7
      pos_order_return/README.rst
  7. 3
      pos_order_return/readme/ROADMAP.rst
  8. 35
      pos_order_return/static/description/index.html
  9. 83
      pos_order_return_traceability/README.rst
  10. 2
      pos_order_return_traceability/__init__.py
  11. 23
      pos_order_return_traceability/__manifest__.py
  12. 62
      pos_order_return_traceability/i18n/pos_order_return_traceability.pot
  13. 2
      pos_order_return_traceability/models/__init__.py
  14. 31
      pos_order_return_traceability/models/pos_order.py
  15. 1
      pos_order_return_traceability/readme/CONTRIBUTORS.rst
  16. 1
      pos_order_return_traceability/readme/DESCRIPTION.rst
  17. 6
      pos_order_return_traceability/readme/ROADMAP.rst
  18. 431
      pos_order_return_traceability/static/description/index.html
  19. 31
      pos_order_return_traceability/static/src/js/models.js
  20. 106
      pos_order_return_traceability/static/src/js/widgets.js
  21. 10
      pos_order_return_traceability/static/src/xml/pos.xml
  22. 1
      pos_order_return_traceability/tests/__init__.py
  23. 83
      pos_order_return_traceability/tests/test_module.py
  24. 13
      pos_order_return_traceability/views/pos_templates.xml

10
pos_order_mgmt/README.rst

@ -82,11 +82,10 @@ ticket.
Known issues / Roadmap
======================
* It's possible to return the same order over and over. To avoid so, we should
load and control if there's a returned line id associated with the original
order. That would be a great improvement for future revisions.
This feature is implemented in the module ``pos_order_return`` in the back
office part, but not in front office part (implemented in this this module).
* This module contains a *basic return* feature that makes possible returning
the same order over and over. If you need a full return feature, you can
install ``pos_order_return`` (only back office implementation), or
``pos_order_return_traceability``, which also covers front office support.
Bug Tracker
===========
@ -115,6 +114,7 @@ Contributors
* Carlos Martínez <carlos@domatix.com>
* Pierrick Brun <pierrick.brun@akretion.com>
* Iván Todorovich <ivan.todorovich@druidoo.io>
* David Alonso <david.alonso@solvos.es>
Maintainers
~~~~~~~~~~~

1
pos_order_mgmt/readme/CONTRIBUTORS.rst

@ -3,3 +3,4 @@
* Carlos Martínez <carlos@domatix.com>
* Pierrick Brun <pierrick.brun@akretion.com>
* Iván Todorovich <ivan.todorovich@druidoo.io>
* David Alonso <david.alonso@solvos.es>

9
pos_order_mgmt/readme/ROADMAP.rst

@ -1,5 +1,4 @@
* It's possible to return the same order over and over. To avoid so, we should
load and control if there's a returned line id associated with the original
order. That would be a great improvement for future revisions.
This feature is implemented in the module ``pos_order_return`` in the back
office part, but not in front office part (implemented in this this module).
* This module contains a *basic return* feature that makes possible returning
the same order over and over. If you need a full return feature, you can
install ``pos_order_return`` (only back office implementation), or
``pos_order_return_traceability``, which also covers front office support.

10
pos_order_mgmt/static/description/index.html

@ -426,11 +426,10 @@ ticket.</p>
<div class="section" id="known-issues-roadmap">
<h1><a class="toc-backref" href="#id3">Known issues / Roadmap</a></h1>
<ul class="simple">
<li>It’s possible to return the same order over and over. To avoid so, we should
load and control if there’s a returned line id associated with the original
order. That would be a great improvement for future revisions.
This feature is implemented in the module <tt class="docutils literal">pos_order_return</tt> in the back
office part, but not in front office part (implemented in this this module).</li>
<li>This module contains a <em>basic return</em> feature that makes possible returning
the same order over and over. If you need a full return feature, you can
install <tt class="docutils literal">pos_order_return</tt> (only back office implementation), or
<tt class="docutils literal">pos_order_return_traceability</tt>, which also covers front office support.</li>
</ul>
</div>
<div class="section" id="bug-tracker">
@ -458,6 +457,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
<li>Carlos Martínez &lt;<a class="reference external" href="mailto:carlos&#64;domatix.com">carlos&#64;domatix.com</a>&gt;</li>
<li>Pierrick Brun &lt;<a class="reference external" href="mailto:pierrick.brun&#64;akretion.com">pierrick.brun&#64;akretion.com</a>&gt;</li>
<li>Iván Todorovich &lt;<a class="reference external" href="mailto:ivan.todorovich&#64;druidoo.io">ivan.todorovich&#64;druidoo.io</a>&gt;</li>
<li>David Alonso &lt;<a class="reference external" href="mailto:david.alonso&#64;solvos.es">david.alonso&#64;solvos.es</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">

32
pos_order_mgmt/static/src/js/widgets.js

@ -308,22 +308,32 @@ odoo.define('pos_order_mgmt.widgets', function (require) {
if (_.isUndefined(product)) {
self.unknown_products.push(String(line.product_id));
} else {
var qty = line.qty;
if (['return'].indexOf(action) !== -1) {
// Invert line quantities
qty *= -1;
}
// Create a new order line
order.add_product(product, {
price: line.price_unit,
quantity: qty,
discount: line.discount,
merge: false,
});
order.add_product(product,
self._prepare_product_options_from_orderline_data(
order, line, action));
}
});
},
_prepare_product_options_from_orderline_data: function (
order, line, action) {
var qty = line.qty;
if (['return'].indexOf(action) !== -1) {
// Invert line quantities
qty *= -1;
}
return {
price: line.price_unit,
quantity: qty,
discount: line.discount,
merge: false,
}
},
load_order_data: function (order_id) {
var self = this;
return this._rpc({

7
pos_order_return/README.rst

@ -81,6 +81,13 @@ invoiced, a refund invoice will be made.
.. image:: https://raw.githubusercontent.com/pos_order_return/static/description/initial_pos_order_required.png
Known issues / Roadmap
======================
When migrating the module ``pos_order_return`` in version > 12.0 please merge
both modules ``pos_order_return`` and ``pos_order_return_traceability`` into a
single module.
Bug Tracker
===========

3
pos_order_return/readme/ROADMAP.rst

@ -0,0 +1,3 @@
When migrating the module ``pos_order_return`` in version > 12.0 please merge
both modules ``pos_order_return`` and ``pos_order_return_traceability`` into a
single module.

35
pos_order_return/static/description/index.html

@ -379,13 +379,14 @@ A link is created between the returned Order Line and the initial Order Line.</p
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="id1">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="id2">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id6">Contributors</a></li>
<li><a class="reference internal" href="#other-credits" id="id7">Other credits</a></li>
<li><a class="reference internal" href="#funders" id="id8">Funders</a></li>
<li><a class="reference internal" href="#maintainers" id="id9">Maintainers</a></li>
<li><a class="reference internal" href="#known-issues-roadmap" id="id3">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id4">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id5">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id6">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id7">Contributors</a></li>
<li><a class="reference internal" href="#other-credits" id="id8">Other credits</a></li>
<li><a class="reference internal" href="#funders" id="id9">Funders</a></li>
<li><a class="reference internal" href="#maintainers" id="id10">Maintainers</a></li>
</ul>
</li>
</ul>
@ -422,8 +423,14 @@ not indicated:</li>
</ul>
<img alt="https://raw.githubusercontent.com/pos_order_return/static/description/initial_pos_order_required.png" src="https://raw.githubusercontent.com/pos_order_return/static/description/initial_pos_order_required.png" />
</div>
<div class="section" id="known-issues-roadmap">
<h1><a class="toc-backref" href="#id3">Known issues / Roadmap</a></h1>
<p>When migrating the module <tt class="docutils literal">pos_order_return</tt> in version &gt; 12.0 please merge
both modules <tt class="docutils literal">pos_order_return</tt> and <tt class="docutils literal">pos_order_return_traceability</tt> into a
single module.</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id3">Bug Tracker</a></h1>
<h1><a class="toc-backref" href="#id4">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/pos/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
@ -431,9 +438,9 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id4">Credits</a></h1>
<h1><a class="toc-backref" href="#id5">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id5">Authors</a></h2>
<h2><a class="toc-backref" href="#id6">Authors</a></h2>
<ul class="simple">
<li>La Louve</li>
<li>GRAP</li>
@ -442,7 +449,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id6">Contributors</a></h2>
<h2><a class="toc-backref" href="#id7">Contributors</a></h2>
<ul class="simple">
<li>Sylvain LE GAL &lt;<a class="reference external" href="https://twitter.com/legalsylvain">https://twitter.com/legalsylvain</a>&gt;</li>
<li>David Vidal &lt;<a class="reference external" href="mailto:david.vidal&#64;tecnativa.com">david.vidal&#64;tecnativa.com</a>&gt;</li>
@ -450,10 +457,10 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
</ul>
</div>
<div class="section" id="other-credits">
<h2><a class="toc-backref" href="#id7">Other credits</a></h2>
<h2><a class="toc-backref" href="#id8">Other credits</a></h2>
</div>
<div class="section" id="funders">
<h2><a class="toc-backref" href="#id8">Funders</a></h2>
<h2><a class="toc-backref" href="#id9">Funders</a></h2>
<p>The development of this module has been financially supported by:</p>
<ul class="simple">
<li>La Louve (www.lalouve.net)</li>
@ -461,7 +468,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id9">Maintainers</a></h2>
<h2><a class="toc-backref" href="#id10">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose

83
pos_order_return_traceability/README.rst

@ -0,0 +1,83 @@
================================
POS frontend return traceability
================================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpos-lightgray.png?logo=github
:target: https://github.com/OCA/pos/tree/12.0/pos_order_return_traceability
:alt: OCA/pos
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/pos-12-0/pos-12-0-pos_order_return_traceability
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/184/12.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
This module adds full return traceability to POS frontend
**Table of contents**
.. contents::
:local:
Known issues / Roadmap
======================
* When a partially returned order is selected, every line is loaded to be
returned, even the fully returned ones (with 0 quantity). These lines should
be skipped, since this module will forbid any return quantity for them.
* When an order is fully returned, during the same session can be still
selected from order list within because of caching issues. Anyway, the order
cannot be returned again.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/pos/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
`feedback <https://github.com/OCA/pos/issues/new?body=module:%20pos_order_return_traceability%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Solvos
Contributors
~~~~~~~~~~~~
* David Alonso <david.alonso@solvos.es>
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/pos <https://github.com/OCA/pos/tree/12.0/pos_order_return_traceability>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

2
pos_order_return_traceability/__init__.py

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

23
pos_order_return_traceability/__manifest__.py

@ -0,0 +1,23 @@
# © 2020 Solvos Consultoría Informática (<http://www.solvos.es>)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{
"name": "POS frontend return traceability",
"summary": "Adds full return traceability to POS frontend",
"version": "12.0.1.0.0",
"author": "Odoo Community Association (OCA), Solvos",
"website": "http://www.github.com/OCA/pos",
"license": "AGPL-3",
"category": "Point Of Sale",
"depends": [
'pos_order_mgmt',
'pos_order_return',
],
'data': [
"views/pos_templates.xml",
],
"qweb": [
'static/src/xml/pos.xml',
],
'installable': True,
}

62
pos_order_return_traceability/i18n/pos_order_return_traceability.pot

@ -0,0 +1,62 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * pos_order_return_traceability
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-02-07 15:37+0000\n"
"PO-Revision-Date: 2020-02-07 15:37+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: pos_order_return_traceability
#. openerp-web
#: code:addons/pos_order_return_traceability/static/src/js/widgets.js:62
#, python-format
msgid "* Invalid quantity line(s): "
msgstr ""
#. module: pos_order_return_traceability
#. openerp-web
#: code:addons/pos_order_return_traceability/static/src/js/widgets.js:67
#, python-format
msgid "* Non-returnable line(s): "
msgstr ""
#. module: pos_order_return_traceability
#: model:ir.model.fields,field_description:pos_order_return_traceability.field_pos_order__is_returnable
msgid "Is Returnable"
msgstr ""
#. module: pos_order_return_traceability
#. openerp-web
#: code:addons/pos_order_return_traceability/static/src/js/widgets.js:59
#, python-format
msgid "Please check the following line(s):"
msgstr ""
#. module: pos_order_return_traceability
#: model:ir.model,name:pos_order_return_traceability.model_pos_order
msgid "Point of Sale Orders"
msgstr ""
#. module: pos_order_return_traceability
#. openerp-web
#: code:addons/pos_order_return_traceability/static/src/js/widgets.js:72
#, python-format
msgid "Return lines error(s)"
msgstr ""
#. module: pos_order_return_traceability
#. openerp-web
#: code:addons/pos_order_return_traceability/static/src/xml/pos.xml:6
#, python-format
msgid "widget.pos.config.iface_return_done_order and order.is_returnable"
msgstr ""

2
pos_order_return_traceability/models/__init__.py

@ -0,0 +1,2 @@
from . import pos_order

31
pos_order_return_traceability/models/pos_order.py

@ -0,0 +1,31 @@
# © 2020 Solvos Consultoría Informática (<http://www.solvos.es>)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
class PosOrder(models.Model):
_inherit = 'pos.order'
is_returnable = fields.Boolean(
compute='_compute_is_returnable',
)
def _compute_is_returnable(self):
for order in self:
order.is_returnable = \
order.amount_total >= 0 and \
sum([l.max_returnable_qty(ignored_line_ids=[])
for l in order.lines]) > 0
@api.model
def _prepare_fields_for_pos_list(self):
return super()._prepare_fields_for_pos_list() + ['is_returnable']
def _prepare_done_order_line_for_pos(self, order_line):
line = super()._prepare_done_order_line_for_pos(order_line)
return {
**line,
'id': order_line.id,
'qty_returnable': order_line.max_returnable_qty(ignored_line_ids=[])
}

1
pos_order_return_traceability/readme/CONTRIBUTORS.rst

@ -0,0 +1 @@
* David Alonso <david.alonso@solvos.es>

1
pos_order_return_traceability/readme/DESCRIPTION.rst

@ -0,0 +1 @@
This module adds full return traceability to POS frontend

6
pos_order_return_traceability/readme/ROADMAP.rst

@ -0,0 +1,6 @@
* When a partially returned order is selected, every line is loaded to be
returned, even the fully returned ones (with 0 quantity). These lines should
be skipped, since this module will forbid any return quantity for them.
* When an order is fully returned, during the same session can be still
selected from order list within because of caching issues. Anyway, the order
cannot be returned again.

431
pos_order_return_traceability/static/description/index.html

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

31
pos_order_return_traceability/static/src/js/models.js

@ -0,0 +1,31 @@
/* Copyright 2020 Solvos Consultoría Informática
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
*/
odoo.define('pos_order_return_traceability.models', function (require) {
'use strict';
var models = require('point_of_sale.models');
models.load_fields("product.product", ['pos_allow_negative_qty']);
var orderline_super = models.Orderline.prototype;
models.Orderline = models.Orderline.extend({
initialize: function(){
orderline_super.initialize.apply(this, arguments);
this.returned_line_id = false;
this.quantity_returnable = this.get_quantity();
},
export_as_JSON: function () {
var res = orderline_super.export_as_JSON.apply(this, arguments);
res.returned_line_id = this.returned_line_id;
return res;
}
});
});

106
pos_order_return_traceability/static/src/js/widgets.js

@ -0,0 +1,106 @@
/* Copyright 2020 Solvos Consultoría Informática
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
*/
odoo.define('pos_order_return_traceability.widgets', function (require) {
"use strict";
var core = require('web.core');
var screens = require('point_of_sale.screens');
var order_mgmt_widgets = require('pos_order_mgmt.widgets');
var QWeb = core.qweb;
screens.ActionpadWidget.include({
renderElement: function() {
var self = this;
this._super();
var button_pay_click_handler = $._data(
this.$el.find('.pay')[0], 'events').click[0].handler;
var button_pay = this.$('.pay');
button_pay.off('click');
button_pay.click(function(){
var order = self.pos.get_order();
if (self.check_return_order(order)) {
button_pay_click_handler();
}
});
},
check_return_order: function (order) {
var self = this;
if (!order.returned_order_id) {
return true;
}
var lines = order.get_orderlines();
var qty_incorrect_lines = [], no_return_lines = [];
for (var i = 0; i < lines.length; i++) {
var qty_line = lines[i].get_quantity();
var product = lines[i].get_product();
if (!lines[i].returned_line_id && (qty_line < 0) &&
!product.pos_allow_negative_qty) {
// Prevent new lines without return associated
no_return_lines.push(product.display_name);
} else if (lines[i].returned_line_id && (
(qty_line > 0) ||
((-1)*lines[i].quantity_returnable > qty_line)
)) {
// Maximum quantity allowed exceeded
qty_incorrect_lines.push(product.display_name + ': ' +
lines[i].get_quantity_str() + ' < ' +
(-1)*lines[i].quantity_returnable);
}
}
if ((qty_incorrect_lines.length + no_return_lines.length) > 0) {
var error_message = _t('Please check the following line(s):');
if (qty_incorrect_lines.length > 0) {
error_message += "\n\n";
error_message += _t('* Invalid quantity line(s): ') +
qty_incorrect_lines.join(', ');
}
if (no_return_lines.length > 0) {
error_message += "\n\n";
error_message += _t('* Non-returnable line(s): ') +
no_return_lines.join(', ');
}
self.gui.show_popup(
'error-traceback', {
'title': _t('Return lines error(s)'),
'body': error_message,
});
return false;
}
return true;
}
});
order_mgmt_widgets.OrderListScreenWidget.include({
_prepare_product_options_from_orderline_data: function (
order, line, action) {
var self = this;
var ret = this._super(order, line, action);
if (['return'].indexOf(action) !== -1) {
ret.quantity = (-1) * line.qty_returnable;
ret.extras = {
returned_line_id: line.id,
quantity_returnable: line.qty_returnable,
}
}
return ret;
},
});
});

10
pos_order_return_traceability/static/src/xml/pos.xml

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates id="template" xml:space="preserve">
<t t-extend="OrderLine">
<t t-jquery=".button.order-list-return" t-operation="attributes">
<attribute name="t-if">widget.pos.config.iface_return_done_order and order.is_returnable</attribute>
</t>
</t>
</templates>

1
pos_order_return_traceability/tests/__init__.py

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

83
pos_order_return_traceability/tests/test_module.py

@ -0,0 +1,83 @@
# © 2020 Solvos Consultoría Informática (<http://www.solvos.es>)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import fields
from odoo.tests.common import TransactionCase
class TestModule(TransactionCase):
def setUp(self):
super(TestModule, self).setUp()
# Get Registry
self.PosOrder = self.env['pos.order']
self.AccountPayment = self.env['account.payment']
# Get Object
self.pos_product = self.env.ref('point_of_sale.whiteboard_pen')
self.pricelist = self.env.ref('product.list0')
self.partner = self.env.ref('base.res_partner_12')
# Create a new pos config and open it
self.pos_config = self.env.ref('point_of_sale.pos_config_main').copy()
self.pos_config.open_session_cb()
def test_return_traceability(self):
order = self._create_order()
order_line = order.lines[0]
self.assertTrue(order.is_returnable)
prepared_line = order._prepare_done_order_line_for_pos(order_line)
self.assertEqual(prepared_line['id'], order_line.id)
self.assertEqual(prepared_line['qty_returnable'], order_line.qty)
res_refund = order.refund()
order_refund = self.PosOrder.browse(res_refund['res_id'])
self.assertFalse(order.is_returnable)
self.assertFalse(order_refund.is_returnable)
prepared_line = order._prepare_done_order_line_for_pos(order_line)
self.assertEqual(prepared_line['qty_returnable'], 0)
self.assertTrue('is_returnable' in
self.PosOrder._prepare_fields_for_pos_list())
def _create_order(self):
order_data = {
'id': u'0006-001-0010',
'to_invoice': True,
'data': {
'pricelist_id': self.pricelist.id,
'user_id': 1,
'name': 'Order 0006-001-0010',
'partner_id': self.partner.id,
'amount_paid': 0.9,
'pos_session_id': self.pos_config.current_session_id.id,
'lines': [[0, 0, {
'product_id': self.pos_product.id,
'price_unit': 0.9,
'qty': 1,
'price_subtotal': 0.9,
'price_subtotal_incl': 0.9,
}]],
'statement_ids': [[0, 0, {
'journal_id': self.pos_config.journal_ids[0].id,
'amount': 0.9,
'name': fields.Datetime.now(),
'account_id':
self.env.user.partner_id.property_account_receivable_id.id,
'statement_id':
self.pos_config.current_session_id.statement_ids[0].id,
}]],
'creation_date': u'2018-09-27 15:51:03',
'amount_tax': 0,
'fiscal_position_id': False,
'uid': u'00001-001-0001',
'amount_return': 0,
'sequence_number': 1,
'amount_total': 0.9,
}}
result = self.PosOrder.create_from_ui([order_data])
order = self.PosOrder.browse(result[0])
return order

13
pos_order_return_traceability/views/pos_templates.xml

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="assets" inherit_id="point_of_sale.assets">
<xpath expr="." position="inside">
<script src="/pos_order_return_traceability/static/src/js/models.js"
type="text/javascript"></script>
<script src="/pos_order_return_traceability/static/src/js/widgets.js"
type="text/javascript"></script>
</xpath>
</template>
</odoo>
Loading…
Cancel
Save