Compare commits

..

1 Commits

Author SHA1 Message Date
hparfr
955cda6957 has_discount collides with account_cash_discount
rename here because it's easier
2023-04-12 12:15:00 +02:00
13 changed files with 22 additions and 132 deletions

View File

@@ -32,7 +32,7 @@ This modules adds the following functions:
* A wizard to mark several invoices as sent at once (forward from v8)
* Default date for Account Move Reversal is now D+1 instead of today
* Track more fields on invoice (see details in account.py)
* Add boolean fields `has_discount` and `has_attachment` on invoice
* Add boolean fields `has_line_discount` and `has_attachment` on invoice
* Add button "Delete line qty = 0" on supplier invoice
* Cut name_get() of invoice if too long
* A script for if Odoo screws up invoice attachment filename

View File

@@ -296,11 +296,16 @@ msgstr "Possède une pièce jointe"
#. module: account_usability
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__has_discount
#: model:ir.model.fields,field_description:account_usability.field_account_move__has_discount
#: model:ir.model.fields,field_description:account_usability.field_account_payment__has_discount
msgid "Has Discount"
msgstr "A une réduction"
#. module: account_usability
#: model:ir.model.fields,field_description:account_usability.field_account_move__has_line_discount
msgid "Has Line Discount"
msgstr "Contient une réduction"
#. module: account_usability
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement__hide_bank_statement_balance
#: model:ir.model.fields,field_description:account_usability.field_account_journal__hide_bank_statement_balance

View File

@@ -28,8 +28,8 @@ class AccountMove(models.Model):
fiscal_position_id = fields.Many2one(tracking=True)
amount_total = fields.Monetary(tracking=True)
# for invoice report
has_discount = fields.Boolean(
compute='_compute_has_discount', readonly=True)
has_line_discount = fields.Boolean(
compute='_compute_has_line_discount', readonly=True)
# has_attachment is useful for those who use attachment to archive
# supplier invoices. It allows them to find supplier invoices
# that don't have any attachment
@@ -41,15 +41,15 @@ class AccountMove(models.Model):
help="This information appear on invoice qweb report "
"(you may use it for your own report)")
def _compute_has_discount(self):
def _compute_has_line_discount(self):
prec = self.env['decimal.precision'].precision_get('Discount')
for inv in self:
has_discount = False
has_line_discount = False
for line in inv.invoice_line_ids:
if not line.display_type and not float_is_zero(line.discount, precision_digits=prec):
has_discount = True
has_line_discount = True
break
inv.has_discount = has_discount
inv.has_line_discount = has_line_discount
def _compute_has_attachment(self):
iao = self.env['ir.attachment']
@@ -112,16 +112,6 @@ class AccountMove(models.Model):
# self.invalidate_cache()
# return res
def _reverse_moves(self, default_values_list=None, cancel=False):
reverse_moves = super()._reverse_moves(
default_values_list=default_values_list, cancel=cancel)
# In the simple scenario 1 invoice -> 1 refund, we add a message in the chatter
# of the invoice and in the chatter of the refund
if len(self) == 1 and len(reverse_moves) == 1:
self.message_post(body=_("A reverse journal entry <a href=# data-oe-model=account.move data-oe-id=%d>%s</a> has been generated.") % (reverse_moves.id, reverse_moves.display_name))
reverse_moves.message_post(body=_("This journal entry has been generated as the reverse of <a href=# data-oe-model=account.move data-oe-id=%d>%s</a>.") % (self.id, self.display_name))
return reverse_moves
def delete_lines_qty_zero(self):
lines = self.env['account.move.line'].search([
('display_type', '=', False),
@@ -270,23 +260,18 @@ class AccountMoveLine(models.Model):
def update_matching_number(self):
records = self.search([("matching_number", "=", "P")])
_logger.info(f"Update partial reconcile number for {len(records)} lines")
records.compute_partial_matching_number()
records._compute_matching_number()
def compute_partial_matching_number(self):
def _compute_matching_number(self):
# TODO maybe it will be better to have the same maching_number for
# all partial so it will be easier to group by
super()._compute_matching_number()
for record in self:
if record.matching_number == "P":
matching_number = ", ".join([
record.matching_number = ", ".join([
"a%d" % pr.id
for pr in record.matched_debit_ids + record.matched_credit_ids
])
# use sql to avoid triggering python checks
self.env.cr.execute(
"""
UPDATE account_move_line SET matching_number = %s WHERE id = %s
""", (matching_number, record.id)
)
def _get_computed_name(self):
# This is useful when you want to have the product code in a dedicated

View File

@@ -26,19 +26,18 @@
<field name="model">purchase.report</field>
<field name="arch" type="xml">
<tree>
<field name="order_id" optional="show"/>
<field name="commercial_partner_id"/>
<field name="date_order" optional="show"/>
<field name="date_approve" optional="show"/>
<field name="date_order"/>
<field name="date_approve"/>
<field name="product_id"/>
<field name="qty_ordered" sum="1"/>
<field name="qty_received" sum="1"/>
<field name="qty_billed" sum="1"/>
<field name="product_uom" groups="uom.group_uom"/>
<field name="product_uom"/>
<field name="price_total" sum="1"/>
<field name="account_analytic_id" groups="analytic.group_analytic_accounting" optional="show"/>
<field name="account_analytic_id" groups="analytic.group_analytic_accounting"/>
<field name="currency_id" invisible="1"/>
<field name="user_id" optional="hide"/>
<field name="user_id"/>
<field name="state"/>
</tree>
</field>

View File

@@ -1 +0,0 @@
../../../../account_usability

View File

@@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

View File

@@ -1 +0,0 @@
../../../../base_usability

View File

@@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

View File

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

View File

@@ -1,27 +0,0 @@
# Copyright 2023 Akretion France (http://www.akretion.com/)
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
'name': 'Stock Move Line Auto-fill All',
'version': '14.0.1.0.0',
'category': 'Warehouse',
'license': 'AGPL-3',
'summary': 'Add button on picking to auto-fill done qty',
'description': """
This module is an alternative to the OCA module **stock_move_line_auto_fill** from https://github.com/OCA/stock-logistics-workflow/
The OCA module doesn't auto-fill the stock move lines with lots. This module does.
This module has been written by Alexis de Lattre from Akretion
<alexis.delattre@akretion.com>.
""",
'author': 'Akretion',
'maintainers': ['alexis-via'],
"development_status": "Mature",
'website': 'https://github.com/akretion/odoo-usability',
'depends': ['stock'],
'data': [
'views/stock_picking.xml',
],
'installable': True,
}

View File

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

View File

@@ -1,34 +0,0 @@
# Copyright 2023 Akretion France (http://www.akretion.com/)
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import fields, models, _
from odoo.tools import float_compare, float_is_zero
from odoo.exceptions import UserError
class StockPicking(models.Model):
_inherit = 'stock.picking'
autofill_done = fields.Boolean(readonly=True)
def button_stock_move_line_autofill(self):
self.ensure_one()
prec = self.env['decimal.precision'].precision_get(
'Product Unit of Measure')
for ml in self.move_line_ids_without_package:
if ml.product_id and float_compare(ml.product_uom_qty, 0, precision_digits=prec) > 0 and float_is_zero(ml.qty_done, precision_digits=prec):
if (
ml.product_id.tracking in ('lot', 'serial') and
not ml.lot_id and
not ml.lot_name):
raise UserError(_(
"Autofill is not possible: the lot is not set "
"on move line with product '%s' quantity %s %s.")
% (
ml.product_id.display_name,
ml.product_uom_qty,
ml.product_uom_id.display_name
))
ml.write({'qty_done': ml.product_uom_qty})
self.write({'autofill_done': True})

View File

@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2023 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
-->
<odoo>
<record id="view_picking_form" model="ir.ui.view">
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.view_picking_form"/>
<field name="arch" type="xml">
<button name="button_validate" type="object" class="oe_highlight" position="before">
<button name="button_stock_move_line_autofill" type="object" string="Auto-Fill" attrs="{'invisible': ['|', ('state', '!=', 'assigned'), ('autofill_done', '=', True)]}" groups="stock.group_stock_user" help="This button will copy the 'Reserved' qty on the 'Done' qty for all the operations of this picking with a null 'Done' qty."/>
</button>
<field name="origin" position="after">
<field name="autofill_done" invisible="1"/>
</field>
</field>
</record>
</odoo>