Skip to content

Commit a74eaf3

Browse files
hparfrbrian10048
authored andcommitted
fieldservice_sale Fix invoicing in v13
1 parent 8839733 commit a74eaf3

File tree

3 files changed

+10
-111
lines changed

3 files changed

+10
-111
lines changed

fieldservice_sale/models/sale_order.py

-86
Original file line numberDiff line numberDiff line change
@@ -146,92 +146,6 @@ def _action_confirm(self):
146146
self.order_line._field_service_generation()
147147
return result
148148

149-
def _create_invoices(self, grouped=False, final=False):
150-
Invoices = self.env["account.move"]
151-
InvoiceLines = self.env["account.move.line"]
152-
invoice_ids = super()._create_invoices(grouped, final)
153-
result = invoice_ids or Invoices
154-
155-
for invoice in invoice_ids:
156-
# check for invoice lines with product
157-
# field_service_tracking = line
158-
lines_by_line = InvoiceLines.search(
159-
[
160-
("move_id", "=", invoice.id),
161-
("product_id.field_service_tracking", "=", "line"),
162-
("exclude_from_invoice_tab", "=", False),
163-
]
164-
)
165-
if len(lines_by_line) > 0:
166-
# Create a new invoice for each "line" product
167-
line_count = len(invoice.invoice_line_ids)
168-
for i in range(len(lines_by_line)):
169-
duplicate = True
170-
if ((i + 1) == len(lines_by_line)) and ((i + 1) == line_count):
171-
# Don't create a new invoice if there's only 1 product
172-
duplicate = False
173-
inv = invoice
174-
if duplicate:
175-
inv = invoice.copy()
176-
inv.with_context(check_move_validity=False).write(
177-
{"invoice_line_ids": [(6, 0, [])]}
178-
)
179-
lines_by_line[i].with_context(
180-
check_move_validity=False
181-
).move_id = inv.id
182-
inv.with_context(
183-
check_move_validity=False
184-
)._recompute_dynamic_lines(
185-
recompute_all_taxes=True, recompute_tax_base_amount=True
186-
)
187-
invoice.with_context(
188-
check_move_validity=False
189-
)._recompute_dynamic_lines(
190-
recompute_all_taxes=True, recompute_tax_base_amount=True
191-
)
192-
result |= inv
193-
inv.fsm_order_ids = [(4, lines_by_line[i].fsm_order_id.id)]
194-
# check for invoice lines with product
195-
# field_service_tracking = sale
196-
lines_by_sale = InvoiceLines.search(
197-
[
198-
("move_id", "=", invoice.id),
199-
("product_id.field_service_tracking", "=", "sale"),
200-
("exclude_from_invoice_tab", "=", False),
201-
]
202-
)
203-
if len(lines_by_sale) > 0:
204-
# Create a new invoice for "sale" products
205-
fsm_orders = self.env["fsm.order"].search(
206-
[("sale_id", "in", self.ids), ("sale_line_id", "=", False)]
207-
)
208-
if len(lines_by_sale) == len(invoice.invoice_line_ids):
209-
# Don't create a new invoice if all products are "sale"
210-
invoice.fsm_order_ids = [
211-
(4, fsm_order.id) for fsm_order in fsm_orders
212-
]
213-
elif len(invoice.invoice_line_ids) > len(lines_by_sale):
214-
new = invoice.copy()
215-
new.fsm_order_ids = [(4, fsm_order.id) for fsm_order in fsm_orders]
216-
new.with_context(check_move_validity=False).write(
217-
{"invoice_line_ids": [(6, 0, [])]}
218-
)
219-
lines_by_sale.with_context(check_move_validity=False).write(
220-
{"move_id": new.id}
221-
)
222-
new.with_context(
223-
check_move_validity=False
224-
)._recompute_dynamic_lines(
225-
recompute_all_taxes=True, recompute_tax_base_amount=True
226-
)
227-
invoice.with_context(
228-
check_move_validity=False
229-
)._recompute_dynamic_lines(
230-
recompute_all_taxes=True, recompute_tax_base_amount=True
231-
)
232-
result |= new
233-
return result
234-
235149
def action_view_fsm_order(self):
236150
fsm_orders = self.mapped("fsm_order_ids")
237151
action = self.env.ref("fieldservice.action_fsm_dash_order").read()[0]

fieldservice_sale/models/sale_order_line.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# Copyright (C) 2019 Brian McMaster
22
# Copyright (C) 2019 Open Source Integrators
3+
# Copyright (C) 2020 [email protected]
34
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
45
from odoo import _, api, fields, models
56

@@ -29,7 +30,10 @@ def _compute_product_updatable(self):
2930
def _compute_qty_delivered_method(self):
3031
super(SaleOrderLine, self)._compute_qty_delivered_method()
3132
for line in self:
32-
if not line.is_expense and line.product_id.field_service_tracking == "line":
33+
if not line.is_expense and line.product_id.field_service_tracking in (
34+
"sale",
35+
"line",
36+
):
3337
line.qty_delivered_method = "field_service"
3438

3539
@api.depends("fsm_order_id.stage_id")
@@ -139,7 +143,7 @@ def _field_service_generation(self):
139143
if rec.product_id.field_service_tracking == "line":
140144
rec._field_find_fsm_order()
141145

142-
def _prepare_invoice_line(self, qty):
143-
res = super()._prepare_invoice_line(qty)
146+
def _prepare_invoice_line(self):
147+
res = super()._prepare_invoice_line()
144148
res.update({"fsm_order_id": self.fsm_order_id.id})
145149
return res

fieldservice_sale/tests/test_fsm_sale_order.py

+3-22
Original file line numberDiff line numberDiff line change
@@ -319,25 +319,14 @@ def test_sale_order_3(self):
319319
invoices = self.sale_order_3._create_invoices()
320320
# 2 invoices created
321321
self.assertEqual(
322-
len(invoices.ids), 2, "FSM Sale: Sale Order 3 should create 2 invoices"
323-
)
324-
inv_fsm_orders = FSM_Order
325-
for inv in invoices:
326-
inv_fsm_orders |= inv.fsm_order_ids
327-
self.assertTrue(
328-
fsm_order_1 in inv_fsm_orders,
329-
"FSM Sale: FSM Order 1 should be linked to invoice",
330-
)
331-
self.assertTrue(
332-
fsm_order_2 in inv_fsm_orders,
333-
"FSM Sale: FSM Order 2 should be linked to invoice",
322+
len(invoices.ids), 1, "FSM Sale: Sale Order 3 should create 1 invoices"
334323
)
335324

336325
def test_sale_order_4(self):
337326
"""Test sale order 4 flow from sale to invoice.
338327
- Two FSM orders linked to the Sale Order Lines should be created.
339328
- One FSM order linked to the Sale Order should be created.
340-
- Three Invoices should be created (One for each FSM Order).
329+
- One Invoice should be created (One for all FSM Order).
341330
"""
342331
sol1 = self.sol_service_per_line_4
343332
sol2 = self.sol_service_per_line_5
@@ -406,13 +395,5 @@ def test_sale_order_4(self):
406395
invoices = self.sale_order_4._create_invoices()
407396
# 3 invoices created
408397
self.assertEqual(
409-
len(invoices.ids), 3, "FSM Sale: Sale Order 4 should create 3 invoices"
410-
)
411-
inv_fsm_orders = FSM_Order
412-
for inv in invoices:
413-
inv_fsm_orders |= inv.fsm_order_ids
414-
self.assertEqual(
415-
len(inv_fsm_orders.ids),
416-
3,
417-
"FSM Sale: There should be 3 orders for 3 invoices",
398+
len(invoices.ids), 1, "FSM Sale: Sale Order 4 should create 1 invoice"
418399
)

0 commit comments

Comments
 (0)