mirror of
https://github.com/ForgeFlow/stock-rma.git
synced 2025-01-21 12:57:49 +02:00
[ENH]qty under repair on rma
This commit is contained in:
committed by
Jordi Ballester Alomar
parent
12e3057056
commit
e380478b84
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
"name": "RMA Repair",
|
"name": "RMA Repair",
|
||||||
"version": "12.0.1.1.0",
|
"version": "12.0.1.2.0",
|
||||||
"license": "LGPL-3",
|
"license": "LGPL-3",
|
||||||
"category": "RMA",
|
"category": "RMA",
|
||||||
"summary": "Links RMA with Repairs.",
|
"summary": "Links RMA with Repairs.",
|
||||||
|
|||||||
@@ -13,3 +13,4 @@ class RepairOrder(models.Model):
|
|||||||
under_warranty = fields.Boolean(
|
under_warranty = fields.Boolean(
|
||||||
related='rma_line_id.under_warranty', readonly=False,
|
related='rma_line_id.under_warranty', readonly=False,
|
||||||
)
|
)
|
||||||
|
invoice_status = fields.Selection(related='invoice_id.state')
|
||||||
|
|||||||
@@ -15,10 +15,12 @@ class RmaOrderLine(models.Model):
|
|||||||
if line.repair_type == 'no':
|
if line.repair_type == 'no':
|
||||||
line.qty_to_repair = 0.0
|
line.qty_to_repair = 0.0
|
||||||
elif line.repair_type == 'ordered':
|
elif line.repair_type == 'ordered':
|
||||||
qty = line._get_rma_repaired_qty()
|
qty = line._get_rma_repaired_qty() + \
|
||||||
|
line._get_rma_under_repair_qty()
|
||||||
line.qty_to_repair = line.product_qty - qty
|
line.qty_to_repair = line.product_qty - qty
|
||||||
elif line.repair_type == 'received':
|
elif line.repair_type == 'received':
|
||||||
qty = line._get_rma_repaired_qty()
|
qty = line._get_rma_repaired_qty() + \
|
||||||
|
line._get_rma_under_repair_qty()
|
||||||
line.qty_to_repair = line.qty_received - qty
|
line.qty_to_repair = line.qty_received - qty
|
||||||
else:
|
else:
|
||||||
line.qty_to_repair = 0.0
|
line.qty_to_repair = 0.0
|
||||||
@@ -29,6 +31,12 @@ class RmaOrderLine(models.Model):
|
|||||||
for line in self:
|
for line in self:
|
||||||
line.qty_repaired = line._get_rma_repaired_qty()
|
line.qty_repaired = line._get_rma_repaired_qty()
|
||||||
|
|
||||||
|
@api.depends('repair_ids', 'repair_type', 'repair_ids.state',
|
||||||
|
'qty_to_receive')
|
||||||
|
def _compute_qty_under_repair(self):
|
||||||
|
for line in self:
|
||||||
|
line.qty_under_repair = line._get_rma_under_repair_qty()
|
||||||
|
|
||||||
@api.depends('repair_ids')
|
@api.depends('repair_ids')
|
||||||
def _compute_repair_count(self):
|
def _compute_repair_count(self):
|
||||||
for line in self:
|
for line in self:
|
||||||
@@ -43,6 +51,11 @@ class RmaOrderLine(models.Model):
|
|||||||
digits=dp.get_precision('Product Unit of Measure'),
|
digits=dp.get_precision('Product Unit of Measure'),
|
||||||
readonly=True, compute='_compute_qty_to_repair',
|
readonly=True, compute='_compute_qty_to_repair',
|
||||||
store=True)
|
store=True)
|
||||||
|
qty_under_repair = fields.Float(
|
||||||
|
string='Qty Under Repair', copy=False,
|
||||||
|
digits=dp.get_precision('Product Unit of Measure'),
|
||||||
|
readonly=True, compute='_compute_qty_under_repair',
|
||||||
|
store=True)
|
||||||
qty_repaired = fields.Float(
|
qty_repaired = fields.Float(
|
||||||
string='Qty Repaired', copy=False,
|
string='Qty Repaired', copy=False,
|
||||||
digits=dp.get_precision('Product Unit of Measure'),
|
digits=dp.get_precision('Product Unit of Measure'),
|
||||||
@@ -57,9 +70,24 @@ class RmaOrderLine(models.Model):
|
|||||||
|
|
||||||
delivery_policy = fields.Selection(selection_add=[
|
delivery_policy = fields.Selection(selection_add=[
|
||||||
('repair', 'Based on Repair Quantities')])
|
('repair', 'Based on Repair Quantities')])
|
||||||
|
qty_to_pay = fields.Float(
|
||||||
|
compute='_compute_qty_to_pay')
|
||||||
qty_to_deliver = fields.Float(
|
qty_to_deliver = fields.Float(
|
||||||
compute='_compute_qty_to_deliver')
|
compute='_compute_qty_to_deliver')
|
||||||
|
|
||||||
|
@api.multi
|
||||||
|
@api.depends('delivery_policy', 'product_qty', 'type', 'repair_ids',
|
||||||
|
'repair_ids.state', 'repair_ids.invoice_method',
|
||||||
|
'repair_type', 'repair_ids.invoice_status')
|
||||||
|
def _compute_qty_to_pay(self):
|
||||||
|
for rec in self.filtered(lambda l: l.delivery_policy == 'repair'):
|
||||||
|
qty_to_pay = 0.0
|
||||||
|
for repair in rec.repair_ids.filtered(
|
||||||
|
lambda r: r.invoice_method != 'none'
|
||||||
|
and r.invoice_status != 'paid'):
|
||||||
|
qty_to_pay += repair.product_qty
|
||||||
|
rec.qty_to_pay = qty_to_pay
|
||||||
|
|
||||||
@api.multi
|
@api.multi
|
||||||
def action_view_repair_order(self):
|
def action_view_repair_order(self):
|
||||||
action = self.env.ref('repair.action_repair_order_tree')
|
action = self.env.ref('repair.action_repair_order_tree')
|
||||||
@@ -78,7 +106,20 @@ class RmaOrderLine(models.Model):
|
|||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
qty = 0.0
|
qty = 0.0
|
||||||
for repair in self.repair_ids.filtered(
|
for repair in self.repair_ids.filtered(
|
||||||
lambda p: p.state != 'cancel'):
|
lambda p: p.state == 'done'):
|
||||||
|
repair_qty = self.uom_id._compute_quantity(
|
||||||
|
repair.product_qty,
|
||||||
|
repair.product_uom,
|
||||||
|
)
|
||||||
|
qty += repair_qty
|
||||||
|
return qty
|
||||||
|
|
||||||
|
@api.multi
|
||||||
|
def _get_rma_under_repair_qty(self):
|
||||||
|
self.ensure_one()
|
||||||
|
qty = 0.0
|
||||||
|
for repair in self.repair_ids.filtered(
|
||||||
|
lambda p: p.state not in ('draft', 'cancel', 'done')):
|
||||||
repair_qty = self.uom_id._compute_quantity(
|
repair_qty = self.uom_id._compute_quantity(
|
||||||
repair.product_qty,
|
repair.product_qty,
|
||||||
repair.product_uom,
|
repair.product_uom,
|
||||||
@@ -97,9 +138,10 @@ class RmaOrderLine(models.Model):
|
|||||||
@api.depends('move_ids', 'move_ids.state',
|
@api.depends('move_ids', 'move_ids.state',
|
||||||
'delivery_policy', 'product_qty', 'type', 'qty_delivered',
|
'delivery_policy', 'product_qty', 'type', 'qty_delivered',
|
||||||
'qty_received', 'repair_ids', 'repair_type',
|
'qty_received', 'repair_ids', 'repair_type',
|
||||||
'repair_ids.state')
|
'repair_ids.state', 'qty_to_pay', 'repair_ids.invoice_status')
|
||||||
def _compute_qty_to_deliver(self):
|
def _compute_qty_to_deliver(self):
|
||||||
res = super(RmaOrderLine, self)._compute_qty_to_deliver()
|
res = super(RmaOrderLine, self)._compute_qty_to_deliver()
|
||||||
for rec in self.filtered(lambda l: l.delivery_policy == 'repair'):
|
for rec in self.filtered(lambda l: l.delivery_policy == 'repair'):
|
||||||
rec.qty_to_deliver = rec.qty_repaired - rec.qty_delivered
|
rec.qty_to_deliver = rec.qty_repaired - rec.qty_delivered - \
|
||||||
|
rec.qty_to_pay
|
||||||
return res
|
return res
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ class TestRmaRepair(common.SingleTransactionCase):
|
|||||||
cls.rma_op = cls.env['rma.operation']
|
cls.rma_op = cls.env['rma.operation']
|
||||||
cls.rma_add_invoice_wiz = cls.env['rma_add_invoice']
|
cls.rma_add_invoice_wiz = cls.env['rma_add_invoice']
|
||||||
cls.rma_make_repair_wiz = cls.env['rma.order.line.make.repair']
|
cls.rma_make_repair_wiz = cls.env['rma.order.line.make.repair']
|
||||||
|
cls.repair_line_obj = cls.env['repair.line']
|
||||||
cls.acc_obj = cls.env['account.account']
|
cls.acc_obj = cls.env['account.account']
|
||||||
cls.inv_obj = cls.env['account.invoice']
|
cls.inv_obj = cls.env['account.invoice']
|
||||||
cls.invl_obj = cls.env['account.invoice.line']
|
cls.invl_obj = cls.env['account.invoice.line']
|
||||||
@@ -123,6 +124,15 @@ class TestRmaRepair(common.SingleTransactionCase):
|
|||||||
'partner_id': customer1.id,
|
'partner_id': customer1.id,
|
||||||
'type': 'customer',
|
'type': 'customer',
|
||||||
})
|
})
|
||||||
|
cls.bank_journal = cls.env['account.journal'].search(
|
||||||
|
[('type', '=', 'bank')], limit=1)
|
||||||
|
cls.material = cls.product_obj.create({
|
||||||
|
'name': 'Materials',
|
||||||
|
'type': 'product',
|
||||||
|
})
|
||||||
|
|
||||||
|
cls.material.product_tmpl_id.standard_price = 10
|
||||||
|
cls.stock_location = cls.env.ref('stock.stock_location_stock')
|
||||||
|
|
||||||
def test_01_add_from_invoice_customer(self):
|
def test_01_add_from_invoice_customer(self):
|
||||||
"""Test wizard to create RMA from a customer invoice."""
|
"""Test wizard to create RMA from a customer invoice."""
|
||||||
@@ -183,7 +193,8 @@ class TestRmaRepair(common.SingleTransactionCase):
|
|||||||
rma.repair_ids.action_repair_confirm()
|
rma.repair_ids.action_repair_confirm()
|
||||||
self.assertEqual(rma.repair_count, 1)
|
self.assertEqual(rma.repair_count, 1)
|
||||||
self.assertEqual(rma.qty_to_repair, 0.0)
|
self.assertEqual(rma.qty_to_repair, 0.0)
|
||||||
self.assertEqual(rma.qty_repaired, 15.0)
|
self.assertEqual(rma.qty_repaired, 0.0)
|
||||||
|
self.assertEqual(rma.qty_under_repair, 15.0)
|
||||||
|
|
||||||
def test_04_deliver_after_repair(self):
|
def test_04_deliver_after_repair(self):
|
||||||
"""Only deliver after repair"""
|
"""Only deliver after repair"""
|
||||||
@@ -211,5 +222,28 @@ class TestRmaRepair(common.SingleTransactionCase):
|
|||||||
'description': 'Test deliver',
|
'description': 'Test deliver',
|
||||||
})
|
})
|
||||||
make_repair.make_repair_order()
|
make_repair.make_repair_order()
|
||||||
rma.repair_ids.action_repair_confirm()
|
repair = rma.repair_ids
|
||||||
|
line = self.repair_line_obj.create({
|
||||||
|
'name': 'consume stuff to repair',
|
||||||
|
'repair_id': repair.id,
|
||||||
|
'type': 'add',
|
||||||
|
'product_id': self.material.id,
|
||||||
|
'product_uom': self.material.uom_id.id,
|
||||||
|
'product_uom_qty': 1.0,
|
||||||
|
'location_id': self.stock_location.id,
|
||||||
|
'location_dest_id': self.stock_location.id,
|
||||||
|
'price_unit': 10.0
|
||||||
|
})
|
||||||
|
line.onchange_product_id()
|
||||||
|
repair.invoice_method = 'after_repair'
|
||||||
|
repair.action_repair_confirm()
|
||||||
|
repair.action_repair_start()
|
||||||
|
repair.action_repair_end()
|
||||||
|
repair.action_repair_invoice_create()
|
||||||
|
self.assertEqual(rma.qty_repaired, 1.0)
|
||||||
|
repair.invoice_id.action_invoice_open()
|
||||||
|
self.assertEqual(rma.qty_to_deliver, 0.0)
|
||||||
|
repair.invoice_id.pay_and_reconcile(self.bank_journal, 200.0)
|
||||||
|
self.assertEqual(repair.invoice_status, 'paid')
|
||||||
|
self.assertEqual(rma.qty_to_pay, 0.0)
|
||||||
self.assertEqual(rma.qty_to_deliver, 1.0)
|
self.assertEqual(rma.qty_to_deliver, 1.0)
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
<group name="quantities" position="inside">
|
<group name="quantities" position="inside">
|
||||||
<group>
|
<group>
|
||||||
<field name="qty_to_repair"/>
|
<field name="qty_to_repair"/>
|
||||||
|
<field name="qty_under_repair"/>
|
||||||
|
<field name="qty_to_pay"/>
|
||||||
<field name="qty_repaired"/>
|
<field name="qty_repaired"/>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
|
|||||||
@@ -154,6 +154,8 @@ class RmaLineMakeRepairItem(models.TransientModel):
|
|||||||
return {
|
return {
|
||||||
'product_id': rma_line.product_id.id,
|
'product_id': rma_line.product_id.id,
|
||||||
'partner_id': rma_line.partner_id.id,
|
'partner_id': rma_line.partner_id.id,
|
||||||
|
'pricelist_id': rma_line.partner_id.property_product_pricelist.id
|
||||||
|
or False,
|
||||||
'product_qty': self.product_qty,
|
'product_qty': self.product_qty,
|
||||||
'rma_line_id': rma_line.id,
|
'rma_line_id': rma_line.id,
|
||||||
'product_uom': rma_line.product_id.uom_po_id.id,
|
'product_uom': rma_line.product_id.uom_po_id.id,
|
||||||
|
|||||||
Reference in New Issue
Block a user