Skip to content

Commit

Permalink
[MIG] stock_picking_invoicing: Migration to 16.0
Browse files Browse the repository at this point in the history
  • Loading branch information
jguenat committed Apr 26, 2023
1 parent 2b2984d commit 9a61452
Show file tree
Hide file tree
Showing 8 changed files with 153 additions and 229 deletions.
4 changes: 2 additions & 2 deletions stock_picking_invoicing/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{
"name": "Stock Picking Invoicing",
"version": "14.0.1.0.2",
"version": "16.0.1.0.0",
"category": "Warehouse Management",
"author": "Agile Business Group,Odoo Community Association (OCA)",
"website": "https://github.com/OCA/account-invoicing",
"license": "AGPL-3",
"depends": ["stock", "account", "stock_picking_invoice_link"],
"depends": ["stock", "account", "stock_picking_invoice_link", "base_view_inheritance_extension"],
"data": [
"security/ir.model.access.csv",
"wizards/stock_invoice_onshipping_view.xml",
Expand Down
39 changes: 20 additions & 19 deletions stock_picking_invoicing/models/stock_move.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,22 @@ class StockMove(models.Model):
"stock.invoice.state.mixin",
]

def _get_taxes(self, fiscal_position, inv_type):
"""
Map product taxes based on given fiscal position
:param fiscal_position: account.fiscal.position recordset
:param inv_type: string
:return: account.tax recordset
"""
product = self.mapped("product_id")
product.ensure_one()
if inv_type in ("out_invoice", "out_refund"):
taxes = product.taxes_id
else:
taxes = product.supplier_taxes_id
company_id = self.env.context.get("force_company", self.env.company.id)
my_taxes = taxes.filtered(lambda r: r.company_id.id == company_id)
return fiscal_position.map_tax(my_taxes)
# def _get_taxes(self, fiscal_position, inv_type):
# """
# Map product taxes based on given fiscal position
# :param fiscal_position: account.fiscal.position recordset
# :param inv_type: string
# :return: account.tax recordset
# """
# product = self.mapped("product_id")
# product.ensure_one()
# if inv_type in ("out_invoice", "out_refund"):
# taxes = product.taxes_id
# else:
# taxes = product.supplier_taxes_id
# company_id = self.env.context.get("force_company", self.env.company.id)
# my_taxes = taxes.filtered(lambda r: r.company_id.id == company_id)
# return fiscal_position.map_tax(my_taxes)

@api.model
def _get_account(self, fiscal_position, account):
Expand All @@ -49,17 +49,18 @@ def _get_price_unit_invoice(self, inv_type, partner, qty=1):
product = self.mapped("product_id")
product.ensure_one()
if inv_type in ("in_invoice", "in_refund"):
result = product.price
# TODO get supplier price
result = product.standard_price
else:
# If partner given, search price in its sale pricelist
# TODO refactor If partner given, search price in its sale pricelist
if partner and partner.property_product_pricelist:
product = product.with_context(
partner=partner.id,
quantity=qty,
pricelist=partner.property_product_pricelist.id,
uom=fields.first(self).product_uom.id,
)
result = product.price
result = product.lst_price
else:
result = product.lst_price
return result
Expand Down
6 changes: 3 additions & 3 deletions stock_picking_invoicing/models/stock_picking.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@ def _set_as_2binvoiced(self):
Inherit to also update related moves.
:return: bool
"""
self.mapped("move_lines")._set_as_2binvoiced()
self.mapped("move_ids")._set_as_2binvoiced()
return super()._set_as_2binvoiced()

def _set_as_invoiced(self):
"""
Inherit to also update related moves.
:return: bool
"""
self.mapped("move_lines")._set_as_invoiced()
self.mapped("move_ids")._set_as_invoiced()
return super()._set_as_invoiced()

def _get_partner_to_invoice(self):
Expand All @@ -42,6 +42,6 @@ def _get_partner_to_invoice(self):

def action_assign(self):
"""If any stock move is to be invoiced, picking status is updated"""
if any(m.invoice_state == "2binvoiced" for m in self.mapped("move_lines")):
if any(m.invoice_state == "2binvoiced" for m in self.mapped("move_ids")):
self.write({"invoice_state": "2binvoiced"})
return super().action_assign()
110 changes: 15 additions & 95 deletions stock_picking_invoicing/tests/test_picking_invoicing.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from odoo import exceptions
from odoo.tests import Form, SavepointCase, tagged
from odoo.tests import Form, TransactionCase, tagged


@tagged("post_install", "-at_install")
class TestPickingInvoicing(SavepointCase):
class TestPickingInvoicing(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
Expand Down Expand Up @@ -38,22 +38,11 @@ def setUpClass(cls):
cls.fiscal_position_model = cls.env["account.fiscal.position"]
cls.fiscal_position_tax_model = cls.env["account.fiscal.position.tax"]
cls.fiscal_position_account_model = cls.env["account.fiscal.position.account"]
cls.account_user_type = cls.env.ref("account.data_account_type_revenue")
cls.account_model = cls.env["account.account"]
cls.tax_model = cls.env["account.tax"]
cls.product_tmpl_model = cls.env["product.template"]
cls.account_receivable = cls.env["account.account"].search(
[
(
"user_type_id",
"=",
cls.env.ref("account.data_account_type_receivable").id,
)
],
limit=1,
)
cls.account_revenue = cls.env["account.account"].search(
[("user_type_id", "=", cls.account_user_type.id)], limit=1
[("account_type", "=", "income")], limit=1
)

cls.tax_sale_1 = cls.tax_model.create(
Expand Down Expand Up @@ -116,7 +105,6 @@ def test_0_picking_out_invoicing(self):
"product_uom": self.product_test_1.uom_id.id,
}
new_move = self.move_model.create(move_vals)
new_move.onchange_product_id()
picking.set_to_be_invoiced()
picking.action_confirm()
# Check product availability
Expand Down Expand Up @@ -174,8 +162,7 @@ def test_1_picking_out_invoicing(self):
"product_uom_qty": 2,
"product_uom": self.product_test_1.uom_id.id,
}
new_move = self.move_model.create(move_vals)
new_move.onchange_product_id()
self.move_model.create(move_vals)
picking.action_confirm()
# Check product availability
picking.action_assign()
Expand Down Expand Up @@ -221,7 +208,6 @@ def test_2_picking_out_invoicing(self):
"product_uom": self.product_test_1.uom_id.id,
}
new_move = self.move_model.create(move_vals)
new_move.onchange_product_id()
picking.set_to_be_invoiced()
picking.action_confirm()
# Check product availability
Expand Down Expand Up @@ -285,7 +271,6 @@ def test_3_picking_out_invoicing(self):
"product_uom": self.product_test_1.uom_id.id,
}
new_move = self.move_model.create(move_vals)
new_move.onchange_product_id()
picking.set_to_be_invoiced()
picking.action_confirm()
# Check product availability
Expand Down Expand Up @@ -351,7 +336,6 @@ def test_4_picking_out_invoicing_backorder(self):
"product_uom": self.product_test_1.uom_id.id,
}
new_move = self.move_model.create(move_vals)
new_move.onchange_product_id()
picking.set_to_be_invoiced()
picking.action_confirm()
# Check product availability
Expand Down Expand Up @@ -426,8 +410,7 @@ def test_picking_cancel(self):
"product_uom_qty": 2,
"product_uom": self.product_test_1.uom_id.id,
}
new_move = self.move_model.create(move_vals)
new_move.onchange_product_id()
self.move_model.create(move_vals)
picking.set_to_be_invoiced()
picking.action_confirm()
# Check product availability
Expand Down Expand Up @@ -461,65 +444,6 @@ def test_picking_cancel(self):
nb_invoice_after = self.invoice_model.search_count([])
self.assertEqual(nb_invoice_before, nb_invoice_after - len(invoice))

def test_picking_invoice_refund(self):
"""
Ensure that a refund keep the link to the picking
:return:
"""
nb_invoice_before = self.invoice_model.search_count([])
self.partner.write({"type": "invoice"})
picking = self.picking_model.create(
{
"partner_id": self.partner2.id,
"picking_type_id": self.pick_type_out.id,
"location_id": self.stock_location.id,
"location_dest_id": self.customers_location.id,
}
)
move_vals = {
"product_id": self.product_test_1.id,
"picking_id": picking.id,
"location_dest_id": self.customers_location.id,
"location_id": self.stock_location.id,
"name": self.product_test_1.name,
"product_uom_qty": 2,
"product_uom": self.product_test_1.uom_id.id,
}
new_move = self.move_model.create(move_vals)
new_move.onchange_product_id()
picking.set_to_be_invoiced()
picking.action_confirm()
# Check product availability
picking.action_assign()
# Force product availability
for move in picking.move_ids_without_package:
move.quantity_done = move.product_uom_qty
picking.button_validate()
self.assertEqual(picking.state, "done")
wizard_obj = self.invoice_wizard.with_context(
active_ids=picking.ids,
active_model=picking._name,
active_id=picking.id,
)
fields_list = wizard_obj.fields_get().keys()
wizard_values = wizard_obj.default_get(fields_list)
wizard_values.update({"group": "partner"})
wizard = wizard_obj.create(wizard_values)
wizard.onchange_group()
wizard.action_generate()
domain = [("picking_ids", "=", picking.id)]
invoice = self.invoice_model.search(domain)
self.assertEqual(picking.invoice_state, "invoiced")
self.assertEqual(invoice.partner_id, self.partner)
self.assertIn(invoice, picking.invoice_ids)
self.assertIn(picking, invoice.picking_ids)
invoice.action_post()
refund = invoice._reverse_moves(cancel=True)
self.assertEqual(picking.invoice_state, "invoiced")
self.assertIn(picking, refund.picking_ids)
nb_invoice_after = self.invoice_model.search_count([])
self.assertEqual(nb_invoice_before, nb_invoice_after - len(invoice | refund))

def test_picking_invoicing_by_product1(self):
"""
Test the invoice generation grouped by partner/product with 1
Expand All @@ -545,7 +469,7 @@ def test_picking_invoicing_by_product1(self):
"product_uom_qty": 1,
"product_uom": self.product_test_1.uom_id.id,
}
new_move = self.move_model.create(move_vals)
self.move_model.create(move_vals)
move_vals2 = {
"product_id": self.product_test_2.id,
"picking_id": picking.id,
Expand All @@ -555,9 +479,7 @@ def test_picking_invoicing_by_product1(self):
"product_uom_qty": 1,
"product_uom": self.product_test_2.uom_id.id,
}
new_move2 = self.move_model.create(move_vals2)
new_move.onchange_product_id()
new_move2.onchange_product_id()
self.move_model.create(move_vals2)
picking.set_to_be_invoiced()
picking.action_confirm()
# Check product availability
Expand Down Expand Up @@ -619,7 +541,7 @@ def test_picking_invoicing_by_product2(self):
"product_uom_qty": 1,
"product_uom": self.product_test_1.uom_id.id,
}
new_move = self.move_model.create(move_vals)
self.move_model.create(move_vals)
picking2 = picking.copy()
move_vals2 = {
"product_id": self.product_test_1.id,
Expand All @@ -630,9 +552,7 @@ def test_picking_invoicing_by_product2(self):
"product_uom_qty": 1,
"product_uom": self.product_test_1.uom_id.id,
}
new_move2 = self.move_model.create(move_vals2)
new_move.onchange_product_id()
new_move2.onchange_product_id()
self.move_model.create(move_vals2)
picking.set_to_be_invoiced()
picking.action_confirm()
# Check product availability
Expand Down Expand Up @@ -714,7 +634,7 @@ def test_picking_invoicing_by_product3(self):
"product_uom_qty": 1,
"product_uom": self.product_test_1.uom_id.id,
}
new_move = self.move_model.create(move_vals)
self.move_model.create(move_vals)
picking2 = picking.copy({"partner_id": self.partner3.id})
move_vals2 = {
"product_id": self.product_test_2.id,
Expand All @@ -725,9 +645,7 @@ def test_picking_invoicing_by_product3(self):
"product_uom_qty": 1,
"product_uom": self.product_test_2.uom_id.id,
}
new_move2 = self.move_model.create(move_vals2)
new_move.onchange_product_id()
new_move2.onchange_product_id()
self.move_model.create(move_vals2)
picking.set_to_be_invoiced()
picking.action_confirm()
# Check product availability
Expand Down Expand Up @@ -834,7 +752,7 @@ def test_return_customer_picking(self):
)

self.assertEqual(picking_devolution.invoice_state, "2binvoiced")
for line in picking_devolution.move_lines:
for line in picking_devolution.move_ids:
self.assertEqual(line.invoice_state, "2binvoiced")

picking_devolution.action_confirm()
Expand Down Expand Up @@ -872,6 +790,8 @@ def test_return_supplier_picking(self):
"""
Test Return Supplier Picking and Invoice created.
"""
grp_multi_loc = self.env.ref('stock.group_stock_multi_locations')
self.env.user.write({'groups_id': [(4, grp_multi_loc.id, 0)]})
picking = self.env.ref("stock_picking_invoicing.stock_picking_invoicing_7")
# Force product availability
for move in picking.move_ids_without_package:
Expand Down Expand Up @@ -912,7 +832,7 @@ def test_return_supplier_picking(self):
)

self.assertEqual(picking_devolution.invoice_state, "2binvoiced")
for line in picking_devolution.move_lines:
for line in picking_devolution.move_ids:
self.assertEqual(line.invoice_state, "2binvoiced")

picking_devolution.action_confirm()
Expand Down
2 changes: 2 additions & 0 deletions stock_picking_invoicing/views/stock_move.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
<field name="arch" type="xml">
<field name="date_deadline" position="after">
<field name="invoice_state" groups="account.group_account_invoice" />
<field name="invoice_state" invisible="1" />
</field>
<group name="linked_group" position="after">
<group
Expand All @@ -28,6 +29,7 @@
<field name="arch" type="xml">
<field name="date" position="after">
<field name="invoice_state" groups="account.group_account_invoice" />
<field name="invoice_state" invisible="1" />
</field>
<field name="invoice_line_ids" position="attributes">
<attribute
Expand Down
Loading

0 comments on commit 9a61452

Please sign in to comment.