[ADD,REF] mrp_repair: Added docstrings in all functions. Refactored code according to pep-8 standards. Improved coding i.e. removed self.pool.get from inside the loops.
bzr revid: uco@tinyerp.co.in-20100406065209-sklmtp3dffsp3uy2
This commit is contained in:
parent
6f6276df3d
commit
9514caf309
|
@ -33,8 +33,18 @@ class mrp_repair(osv.osv):
|
||||||
_description = 'Repairs Order'
|
_description = 'Repairs Order'
|
||||||
|
|
||||||
def _amount_untaxed(self, cr, uid, ids, field_name, arg, context):
|
def _amount_untaxed(self, cr, uid, ids, field_name, arg, context):
|
||||||
|
""" Calculates untaxed amount.
|
||||||
|
@param self: The object pointer
|
||||||
|
@param cr: The current row, from the database cursor,
|
||||||
|
@param uid: The current user ID for security checks
|
||||||
|
@param ids: List of selected IDs
|
||||||
|
@param field_name: Name of field.
|
||||||
|
@param arg: Argument
|
||||||
|
@param context: A standard dictionary for contextual values
|
||||||
|
@return: Dictionary of values.
|
||||||
|
"""
|
||||||
res = {}
|
res = {}
|
||||||
cur_obj=self.pool.get('res.currency')
|
cur_obj = self.pool.get('res.currency')
|
||||||
for repair in self.browse(cr, uid, ids):
|
for repair in self.browse(cr, uid, ids):
|
||||||
res[repair.id] = 0.0
|
res[repair.id] = 0.0
|
||||||
for line in repair.operations:
|
for line in repair.operations:
|
||||||
|
@ -46,35 +56,46 @@ class mrp_repair(osv.osv):
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def _amount_tax(self, cr, uid, ids, field_name, arg, context):
|
def _amount_tax(self, cr, uid, ids, field_name, arg, context):
|
||||||
|
""" Calculates taxed amount.
|
||||||
|
@param field_name: Name of field.
|
||||||
|
@param arg: Argument
|
||||||
|
@return: Dictionary of values.
|
||||||
|
"""
|
||||||
res = {}
|
res = {}
|
||||||
cur_obj=self.pool.get('res.currency')
|
cur_obj = self.pool.get('res.currency')
|
||||||
|
tax_obj = self.pool.get('account.tax')
|
||||||
for repair in self.browse(cr, uid, ids):
|
for repair in self.browse(cr, uid, ids):
|
||||||
val = 0.0
|
val = 0.0
|
||||||
cur=repair.pricelist_id.currency_id
|
cur = repair.pricelist_id.currency_id
|
||||||
for line in repair.operations:
|
for line in repair.operations:
|
||||||
if line.to_invoice:
|
if line.to_invoice:
|
||||||
for c in self.pool.get('account.tax').compute(cr, uid, line.tax_id, line.price_unit, line.product_uom_qty, repair.partner_invoice_id.id, line.product_id, repair.partner_id):
|
for c in tax_obj.compute(cr, uid, line.tax_id, line.price_unit, line.product_uom_qty, repair.partner_invoice_id.id, line.product_id, repair.partner_id):
|
||||||
val+= c['amount']
|
val += c['amount']
|
||||||
for line in repair.fees_lines:
|
for line in repair.fees_lines:
|
||||||
if line.to_invoice:
|
if line.to_invoice:
|
||||||
for c in self.pool.get('account.tax').compute(cr, uid, line.tax_id, line.price_unit, line.product_uom_qty, repair.partner_invoice_id.id, line.product_id, repair.partner_id):
|
for c in tax_obj.compute(cr, uid, line.tax_id, line.price_unit, line.product_uom_qty, repair.partner_invoice_id.id, line.product_id, repair.partner_id):
|
||||||
val+= c['amount']
|
val += c['amount']
|
||||||
res[repair.id]=cur_obj.round(cr, uid, cur, val)
|
res[repair.id] = cur_obj.round(cr, uid, cur, val)
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def _amount_total(self, cr, uid, ids, field_name, arg, context):
|
def _amount_total(self, cr, uid, ids, field_name, arg, context):
|
||||||
|
""" Calculates total amount.
|
||||||
|
@param field_name: Name of field.
|
||||||
|
@param arg: Argument
|
||||||
|
@return: Dictionary of values.
|
||||||
|
"""
|
||||||
res = {}
|
res = {}
|
||||||
untax = self._amount_untaxed(cr, uid, ids, field_name, arg, context)
|
untax = self._amount_untaxed(cr, uid, ids, field_name, arg, context)
|
||||||
tax = self._amount_tax(cr, uid, ids, field_name, arg, context)
|
tax = self._amount_tax(cr, uid, ids, field_name, arg, context)
|
||||||
cur_obj=self.pool.get('res.currency')
|
cur_obj = self.pool.get('res.currency')
|
||||||
for id in ids:
|
for id in ids:
|
||||||
repair=self.browse(cr, uid, [id])[0]
|
repair = self.browse(cr, uid, [id])[0]
|
||||||
cur=repair.pricelist_id.currency_id
|
cur = repair.pricelist_id.currency_id
|
||||||
res[id] = cur_obj.round(cr, uid, cur, untax.get(id, 0.0) + tax.get(id, 0.0))
|
res[id] = cur_obj.round(cr, uid, cur, untax.get(id, 0.0) + tax.get(id, 0.0))
|
||||||
return res
|
return res
|
||||||
|
|
||||||
_columns = {
|
_columns = {
|
||||||
'name' : fields.char('Repair Reference',size=24, required=True),
|
'name': fields.char('Repair Reference',size=24, required=True),
|
||||||
'product_id': fields.many2one('product.product', string='Product to Repair', required=True, readonly=True, states={'draft':[('readonly',False)]}),
|
'product_id': fields.many2one('product.product', string='Product to Repair', required=True, readonly=True, states={'draft':[('readonly',False)]}),
|
||||||
'partner_id' : fields.many2one('res.partner', 'Partner', select=True, help='This field allow you to choose the parner that will be invoiced and delivered'),
|
'partner_id' : fields.many2one('res.partner', 'Partner', select=True, help='This field allow you to choose the parner that will be invoiced and delivered'),
|
||||||
'address_id': fields.many2one('res.partner.address', 'Delivery Address', domain="[('partner_id','=',partner_id)]"),
|
'address_id': fields.many2one('res.partner.address', 'Delivery Address', domain="[('partner_id','=',partner_id)]"),
|
||||||
|
@ -110,12 +131,12 @@ class mrp_repair(osv.osv):
|
||||||
select=True, required=True, states={'draft':[('readonly',False)]}, readonly=True, help='This field allow you to change the workflow of the repair order. If value selected is different from \'No Invoice\', it also allow you to select the pricelist and invoicing address.'),
|
select=True, required=True, states={'draft':[('readonly',False)]}, readonly=True, help='This field allow you to change the workflow of the repair order. If value selected is different from \'No Invoice\', it also allow you to select the pricelist and invoicing address.'),
|
||||||
'invoice_id': fields.many2one('account.invoice', 'Invoice', readonly=True),
|
'invoice_id': fields.many2one('account.invoice', 'Invoice', readonly=True),
|
||||||
'picking_id': fields.many2one('stock.picking', 'Picking',readonly=True),
|
'picking_id': fields.many2one('stock.picking', 'Picking',readonly=True),
|
||||||
'fees_lines' : fields.one2many('mrp.repair.fee', 'repair_id', 'Fees Lines', readonly=True, states={'draft':[('readonly',False)]}),
|
'fees_lines': fields.one2many('mrp.repair.fee', 'repair_id', 'Fees Lines', readonly=True, states={'draft':[('readonly',False)]}),
|
||||||
'internal_notes' : fields.text('Internal Notes'),
|
'internal_notes': fields.text('Internal Notes'),
|
||||||
'quotation_notes' : fields.text('Quotation Notes'),
|
'quotation_notes': fields.text('Quotation Notes'),
|
||||||
'deliver_bool': fields.boolean('Deliver', help="Check this box if you want to manage the delivery once the product is repaired. If cheked, it will create a picking with selected product. Note that you can select the locations in the Info tab, if you have the extended view."),
|
'deliver_bool': fields.boolean('Deliver', help="Check this box if you want to manage the delivery once the product is repaired. If cheked, it will create a picking with selected product. Note that you can select the locations in the Info tab, if you have the extended view."),
|
||||||
'invoiced': fields.boolean('Invoiced', readonly=True),
|
'invoiced': fields.boolean('Invoiced', readonly=True),
|
||||||
'repaired' : fields.boolean('Repaired', readonly=True),
|
'repaired': fields.boolean('Repaired', readonly=True),
|
||||||
'amount_untaxed': fields.function(_amount_untaxed, method=True, string='Untaxed Amount'),
|
'amount_untaxed': fields.function(_amount_untaxed, method=True, string='Untaxed Amount'),
|
||||||
'amount_tax': fields.function(_amount_tax, method=True, string='Taxes'),
|
'amount_tax': fields.function(_amount_tax, method=True, string='Taxes'),
|
||||||
'amount_total': fields.function(_amount_total, method=True, string='Total'),
|
'amount_total': fields.function(_amount_total, method=True, string='Total'),
|
||||||
|
@ -144,6 +165,10 @@ class mrp_repair(osv.osv):
|
||||||
|
|
||||||
|
|
||||||
def onchange_product_id(self, cr, uid, ids, product_id=None):
|
def onchange_product_id(self, cr, uid, ids, product_id=None):
|
||||||
|
""" On change of product sets some values.
|
||||||
|
@param product_id: Changed product
|
||||||
|
@return: Dictionary of values.
|
||||||
|
"""
|
||||||
return {'value': {
|
return {'value': {
|
||||||
'prodlot_id': False,
|
'prodlot_id': False,
|
||||||
'move_id': False,
|
'move_id': False,
|
||||||
|
@ -154,6 +179,12 @@ class mrp_repair(osv.osv):
|
||||||
}
|
}
|
||||||
|
|
||||||
def onchange_move_id(self, cr, uid, ids, prod_id=False, move_id=False):
|
def onchange_move_id(self, cr, uid, ids, prod_id=False, move_id=False):
|
||||||
|
""" On change of move id sets values of guarantee limit, source location,
|
||||||
|
destination location, partner and partner address.
|
||||||
|
@param prod_id: Id of product in current record.
|
||||||
|
@param move_id: Changed move.
|
||||||
|
@return: Dictionary of values.
|
||||||
|
"""
|
||||||
data = {}
|
data = {}
|
||||||
data['value'] = {}
|
data['value'] = {}
|
||||||
if not prod_id:
|
if not prod_id:
|
||||||
|
@ -179,15 +210,23 @@ class mrp_repair(osv.osv):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def onchange_partner_id(self, cr, uid, ids, part, address_id):
|
def onchange_partner_id(self, cr, uid, ids, part, address_id):
|
||||||
|
""" On change of partner sets the values of partner address,
|
||||||
|
partner invoice address and pricelist.
|
||||||
|
@param part: Changed id of partner.
|
||||||
|
@param address_id: Address id from current record.
|
||||||
|
@return: Dictionary of values.
|
||||||
|
"""
|
||||||
|
part_obj = self.pool.get('res.partner')
|
||||||
|
pricelist_obj = self.pool.get('product.pricelist')
|
||||||
if not part:
|
if not part:
|
||||||
return {'value': {
|
return {'value': {
|
||||||
'address_id': False,
|
'address_id': False,
|
||||||
'partner_invoice_id': False,
|
'partner_invoice_id': False,
|
||||||
'pricelist_id': self.pool.get('product.pricelist').search(cr,uid,[('type','=','sale')])[0]
|
'pricelist_id': pricelist_obj.search(cr, uid, [('type','=','sale')])[0]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
addr = self.pool.get('res.partner').address_get(cr, uid, [part], ['delivery', 'invoice', 'default'])
|
addr = part_obj.address_get(cr, uid, [part], ['delivery', 'invoice', 'default'])
|
||||||
partner = self.pool.get('res.partner').browse(cr, uid, part)
|
partner = part_obj.browse(cr, uid, part)
|
||||||
pricelist = partner.property_product_pricelist and partner.property_product_pricelist.id or False
|
pricelist = partner.property_product_pricelist and partner.property_product_pricelist.id or False
|
||||||
return {'value': {
|
return {'value': {
|
||||||
'address_id': address_id or addr['delivery'],
|
'address_id': address_id or addr['delivery'],
|
||||||
|
@ -197,6 +236,14 @@ class mrp_repair(osv.osv):
|
||||||
}
|
}
|
||||||
|
|
||||||
def onchange_lot_id(self, cr, uid, ids, lot, product_id):
|
def onchange_lot_id(self, cr, uid, ids, lot, product_id):
|
||||||
|
""" On change of production lot sets the values of source location,
|
||||||
|
destination location, move and guarantee limit.
|
||||||
|
@param lot: Changed id of production lot.
|
||||||
|
@param product_id: Product id from current record.
|
||||||
|
@return: Dictionary of values.
|
||||||
|
"""
|
||||||
|
prodlot_obj = self.pool.get('stock.production.lot')
|
||||||
|
move_obj = self.pool.get('stock.move')
|
||||||
data = {}
|
data = {}
|
||||||
data['value'] = {
|
data['value'] = {
|
||||||
'location_id': False,
|
'location_id': False,
|
||||||
|
@ -207,8 +254,8 @@ class mrp_repair(osv.osv):
|
||||||
|
|
||||||
if not lot:
|
if not lot:
|
||||||
return data
|
return data
|
||||||
lot_info = self.pool.get('stock.production.lot').browse(cr, uid, lot)
|
lot_info = prodlot_obj.browse(cr, uid, lot)
|
||||||
move_ids = self.pool.get('stock.move').search(cr, uid, [('prodlot_id', '=', lot)])
|
move_ids = move_obj.search(cr, uid, [('prodlot_id', '=', lot)])
|
||||||
|
|
||||||
if not len(move_ids):
|
if not len(move_ids):
|
||||||
return data
|
return data
|
||||||
|
@ -219,13 +266,17 @@ class mrp_repair(osv.osv):
|
||||||
return lst_move
|
return lst_move
|
||||||
|
|
||||||
move_id = move_ids[0]
|
move_id = move_ids[0]
|
||||||
move = get_last_move(self.pool.get('stock.move').browse(cr, uid, move_id))
|
move = get_last_move(move_obj.browse(cr, uid, move_id))
|
||||||
data['value']['move_id'] = move.id
|
data['value']['move_id'] = move.id
|
||||||
d = self.onchange_move_id(cr, uid, ids, product_id, move.id)
|
d = self.onchange_move_id(cr, uid, ids, product_id, move.id)
|
||||||
data['value'].update(d['value'])
|
data['value'].update(d['value'])
|
||||||
return data
|
return data
|
||||||
|
|
||||||
def action_cancel_draft(self, cr, uid, ids, *args):
|
def action_cancel_draft(self, cr, uid, ids, *args):
|
||||||
|
""" Cancels repair order when it is in 'Draft' state.
|
||||||
|
@param *arg: Arguments
|
||||||
|
@return: True
|
||||||
|
"""
|
||||||
if not len(ids):
|
if not len(ids):
|
||||||
return False
|
return False
|
||||||
mrp_line_obj = self.pool.get('mrp.repair.line')
|
mrp_line_obj = self.pool.get('mrp.repair.line')
|
||||||
|
@ -238,6 +289,11 @@ class mrp_repair(osv.osv):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def action_confirm(self, cr, uid, ids, *args):
|
def action_confirm(self, cr, uid, ids, *args):
|
||||||
|
""" Repair order state is set to 'To be invoiced' when invoice method
|
||||||
|
is 'Before repair' else state becomes 'Confirmed'.
|
||||||
|
@param *arg: Arguments
|
||||||
|
@return: True
|
||||||
|
"""
|
||||||
mrp_line_obj = self.pool.get('mrp.repair.line')
|
mrp_line_obj = self.pool.get('mrp.repair.line')
|
||||||
for o in self.browse(cr, uid, ids):
|
for o in self.browse(cr, uid, ids):
|
||||||
if (o.invoice_method == 'b4repair'):
|
if (o.invoice_method == 'b4repair'):
|
||||||
|
@ -248,6 +304,9 @@ class mrp_repair(osv.osv):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def action_cancel(self, cr, uid, ids, context=None):
|
def action_cancel(self, cr, uid, ids, context=None):
|
||||||
|
""" Cancels repair order.
|
||||||
|
@return: True
|
||||||
|
"""
|
||||||
ok=True
|
ok=True
|
||||||
mrp_line_obj = self.pool.get('mrp.repair.line')
|
mrp_line_obj = self.pool.get('mrp.repair.line')
|
||||||
for repair in self.browse(cr, uid, ids):
|
for repair in self.browse(cr, uid, ids):
|
||||||
|
@ -259,25 +318,33 @@ class mrp_repair(osv.osv):
|
||||||
return self.action_invoice_create(cr, uid, ids)
|
return self.action_invoice_create(cr, uid, ids)
|
||||||
|
|
||||||
def action_invoice_create(self, cr, uid, ids, group=False, context=None):
|
def action_invoice_create(self, cr, uid, ids, group=False, context=None):
|
||||||
res={}
|
""" Creates invoice(s) for repair order.
|
||||||
|
@param group: It is set to true when group invoice is to be generated.
|
||||||
|
@return: Invoice Ids.
|
||||||
|
"""
|
||||||
|
res = {}
|
||||||
invoices_group = {}
|
invoices_group = {}
|
||||||
|
inv_line_obj = self.pool.get('account.invoice.line')
|
||||||
|
inv_obj = self.pool.get('account.invoice')
|
||||||
|
repair_line_obj = self.pool.get('mrp.repair.line')
|
||||||
|
repair_fee_obj = self.pool.get('mrp.repair.fee')
|
||||||
for repair in self.browse(cr, uid, ids, context=context):
|
for repair in self.browse(cr, uid, ids, context=context):
|
||||||
res[repair.id]=False
|
res[repair.id] = False
|
||||||
if repair.state in ('draft','cancel') or repair.invoice_id:
|
if repair.state in ('draft','cancel') or repair.invoice_id:
|
||||||
continue
|
continue
|
||||||
if not (repair.partner_id.id and repair.partner_invoice_id.id):
|
if not (repair.partner_id.id and repair.partner_invoice_id.id):
|
||||||
raise osv.except_osv(_('No partner !'),_('You have to select a Partner Invoice Address in the repair form !'))
|
raise osv.except_osv(_('No partner !'),_('You have to select a Partner Invoice Address in the repair form !'))
|
||||||
comment=repair.quotation_notes
|
comment = repair.quotation_notes
|
||||||
if (repair.invoice_method != 'none'):
|
if (repair.invoice_method != 'none'):
|
||||||
if group and repair.partner_invoice_id.id in invoices_group:
|
if group and repair.partner_invoice_id.id in invoices_group:
|
||||||
inv_id= invoices_group[repair.partner_invoice_id.id]
|
inv_id = invoices_group[repair.partner_invoice_id.id]
|
||||||
invoice=invoice_obj.browse(cr, uid,inv_id)
|
invoice = inv_obj.browse(cr, uid, inv_id)
|
||||||
invoice_vals = {
|
invoice_vals = {
|
||||||
'name': invoice.name +', '+repair.name,
|
'name': invoice.name +', '+repair.name,
|
||||||
'origin': invoice.origin+', '+repair.name,
|
'origin': invoice.origin+', '+repair.name,
|
||||||
'comment':(comment and (invoice.comment and invoice.comment+"\n"+comment or comment)) or (invoice.comment and invoice.comment or ''),
|
'comment':(comment and (invoice.comment and invoice.comment+"\n"+comment or comment)) or (invoice.comment and invoice.comment or ''),
|
||||||
}
|
}
|
||||||
invoice_obj.write(cr, uid, [inv_id],invoice_vals,context=context)
|
invoice_obj.write(cr, uid, [inv_id], invoice_vals, context=context)
|
||||||
else:
|
else:
|
||||||
a = repair.partner_id.property_account_receivable.id
|
a = repair.partner_id.property_account_receivable.id
|
||||||
inv = {
|
inv = {
|
||||||
|
@ -291,10 +358,9 @@ class mrp_repair(osv.osv):
|
||||||
'comment': repair.quotation_notes,
|
'comment': repair.quotation_notes,
|
||||||
'fiscal_position': repair.partner_id.property_account_position.id
|
'fiscal_position': repair.partner_id.property_account_position.id
|
||||||
}
|
}
|
||||||
inv_obj = self.pool.get('account.invoice')
|
|
||||||
inv_id = inv_obj.create(cr, uid, inv)
|
inv_id = inv_obj.create(cr, uid, inv)
|
||||||
invoices_group[repair.partner_invoice_id.id] = inv_id
|
invoices_group[repair.partner_invoice_id.id] = inv_id
|
||||||
self.write(cr, uid, repair.id , {'invoiced':True,'invoice_id' : inv_id})
|
self.write(cr, uid, repair.id, {'invoiced': True, 'invoice_id': inv_id})
|
||||||
|
|
||||||
for operation in repair.operations:
|
for operation in repair.operations:
|
||||||
if operation.to_invoice == True:
|
if operation.to_invoice == True:
|
||||||
|
@ -302,29 +368,29 @@ class mrp_repair(osv.osv):
|
||||||
name = repair.name + '-' + operation.name
|
name = repair.name + '-' + operation.name
|
||||||
else:
|
else:
|
||||||
name = operation.name
|
name = operation.name
|
||||||
invoice_line_id=self.pool.get('account.invoice.line').create(cr, uid, {
|
invoice_line_id = inv_line_obj.create(cr, uid, {
|
||||||
'invoice_id': inv_id,
|
'invoice_id': inv_id,
|
||||||
'name': name,
|
'name': name,
|
||||||
'origin':repair.name,
|
'origin': repair.name,
|
||||||
'account_id': operation.product_id and operation.product_id.property_account_income and operation.product_id.property_account_income.id,
|
'account_id': operation.product_id and operation.product_id.property_account_income and operation.product_id.property_account_income.id,
|
||||||
'quantity' : operation.product_uom_qty,
|
'quantity': operation.product_uom_qty,
|
||||||
'invoice_line_tax_id': [(6,0,[x.id for x in operation.tax_id])],
|
'invoice_line_tax_id': [(6,0,[x.id for x in operation.tax_id])],
|
||||||
'uos_id' : operation.product_uom.id,
|
'uos_id': operation.product_uom.id,
|
||||||
'price_unit' : operation.price_unit,
|
'price_unit': operation.price_unit,
|
||||||
'price_subtotal' : operation.product_uom_qty*operation.price_unit,
|
'price_subtotal': operation.product_uom_qty*operation.price_unit,
|
||||||
'product_id' : operation.product_id and operation.product_id.id or False
|
'product_id': operation.product_id and operation.product_id.id or False
|
||||||
})
|
})
|
||||||
self.pool.get('mrp.repair.line').write(cr, uid, [operation.id], {'invoiced':True,'invoice_line_id':invoice_line_id})
|
repair_line_obj.write(cr, uid, [operation.id], {'invoiced': True, 'invoice_line_id': invoice_line_id})
|
||||||
for fee in repair.fees_lines:
|
for fee in repair.fees_lines:
|
||||||
if fee.to_invoice == True:
|
if fee.to_invoice == True:
|
||||||
if group:
|
if group:
|
||||||
name = repair.name + '-' + fee.name
|
name = repair.name + '-' + fee.name
|
||||||
else:
|
else:
|
||||||
name = fee.name
|
name = fee.name
|
||||||
invoice_fee_id=self.pool.get('account.invoice.line').create(cr, uid, {
|
invoice_fee_id = inv_line_obj.create(cr, uid, {
|
||||||
'invoice_id': inv_id,
|
'invoice_id': inv_id,
|
||||||
'name': name,
|
'name': name,
|
||||||
'origin':repair.name,
|
'origin': repair.name,
|
||||||
'account_id': a,
|
'account_id': a,
|
||||||
'quantity': fee.product_uom_qty,
|
'quantity': fee.product_uom_qty,
|
||||||
'invoice_line_tax_id': [(6,0,[x.id for x in fee.tax_id])],
|
'invoice_line_tax_id': [(6,0,[x.id for x in fee.tax_id])],
|
||||||
|
@ -333,27 +399,39 @@ class mrp_repair(osv.osv):
|
||||||
'price_unit': fee.price_unit,
|
'price_unit': fee.price_unit,
|
||||||
'price_subtotal': fee.product_uom_qty*fee.price_unit
|
'price_subtotal': fee.product_uom_qty*fee.price_unit
|
||||||
})
|
})
|
||||||
self.pool.get('mrp.repair.fee').write(cr, uid, [fee.id], {'invoiced':True,'invoice_line_id':invoice_fee_id})
|
repair_fee_obj.write(cr, uid, [fee.id], {'invoiced': True, 'invoice_line_id': invoice_fee_id})
|
||||||
res[repair.id]=inv_id
|
res[repair.id] = inv_id
|
||||||
#self.action_invoice_end(cr, uid, ids)
|
#self.action_invoice_end(cr, uid, ids)
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def action_repair_ready(self, cr, uid, ids, context=None):
|
def action_repair_ready(self, cr, uid, ids, context=None):
|
||||||
self.write(cr, uid, ids, {'state':'ready'})
|
""" Writes repair order state to 'Ready'
|
||||||
|
@return: True
|
||||||
|
"""
|
||||||
|
self.write(cr, uid, ids, {'state': 'ready'})
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def action_invoice_cancel(self, cr, uid, ids, context=None):
|
def action_invoice_cancel(self, cr, uid, ids, context=None):
|
||||||
self.write(cr, uid, ids, {'state':'invoice_except'})
|
""" Writes repair order state to 'Exception in invoice'
|
||||||
|
@return: True
|
||||||
|
"""
|
||||||
|
self.write(cr, uid, ids, {'state': 'invoice_except'})
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def action_repair_start(self, cr, uid, ids, context=None):
|
def action_repair_start(self, cr, uid, ids, context=None):
|
||||||
self.write(cr, uid, ids, {'state':'under_repair'})
|
""" Writes repair order state to 'Under Repair'
|
||||||
|
@return: True
|
||||||
|
"""
|
||||||
|
self.write(cr, uid, ids, {'state': 'under_repair'})
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def action_invoice_end(self, cr, uid, ids, context=None):
|
def action_invoice_end(self, cr, uid, ids, context=None):
|
||||||
|
""" Writes repair order state to 'Ready' if invoice method is Before repair.
|
||||||
|
@return: True
|
||||||
|
"""
|
||||||
for order in self.browse(cr, uid, ids):
|
for order in self.browse(cr, uid, ids):
|
||||||
val = {}
|
val = {}
|
||||||
if (order.invoice_method=='b4repair'):
|
if (order.invoice_method == 'b4repair'):
|
||||||
val['state'] = 'ready'
|
val['state'] = 'ready'
|
||||||
else:
|
else:
|
||||||
#val['state'] = 'done'
|
#val['state'] = 'done'
|
||||||
|
@ -362,9 +440,13 @@ class mrp_repair(osv.osv):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def action_repair_end(self, cr, uid, ids, context=None):
|
def action_repair_end(self, cr, uid, ids, context=None):
|
||||||
|
""" Writes repair order state to 'To be invoiced' if invoice method is
|
||||||
|
After repair else state is set to 'Ready'.
|
||||||
|
@return: True
|
||||||
|
"""
|
||||||
for order in self.browse(cr, uid, ids):
|
for order in self.browse(cr, uid, ids):
|
||||||
val = {}
|
val = {}
|
||||||
val['repaired']=True
|
val['repaired'] = True
|
||||||
if (not order.invoiced and order.invoice_method=='after_repair'):
|
if (not order.invoiced and order.invoice_method=='after_repair'):
|
||||||
val['state'] = '2binvoiced'
|
val['state'] = '2binvoiced'
|
||||||
elif (not order.invoiced and order.invoice_method=='b4repair'):
|
elif (not order.invoiced and order.invoice_method=='b4repair'):
|
||||||
|
@ -376,15 +458,23 @@ class mrp_repair(osv.osv):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def wkf_repair_done(self, cr, uid, ids, *args):
|
def wkf_repair_done(self, cr, uid, ids, *args):
|
||||||
res=self.action_repair_done(cr,uid,ids)
|
res = self.action_repair_done(cr, uid, ids)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def action_repair_done(self, cr, uid, ids, context=None):
|
def action_repair_done(self, cr, uid, ids, context=None):
|
||||||
|
""" Creates stock move and picking for repair order.
|
||||||
|
@return: Picking ids.
|
||||||
|
"""
|
||||||
res = {}
|
res = {}
|
||||||
|
move_obj = self.pool.get('stock.move')
|
||||||
|
wf_service = netsvc.LocalService("workflow")
|
||||||
|
repair_line_obj = self.pool.get('mrp.repair.line')
|
||||||
|
seq_obj = self.pool.get('ir.sequence')
|
||||||
|
pick_obj = self.pool.get('stock.picking')
|
||||||
company = self.pool.get('res.users').browse(cr, uid, uid).company_id
|
company = self.pool.get('res.users').browse(cr, uid, uid).company_id
|
||||||
for repair in self.browse(cr, uid, ids, context=context):
|
for repair in self.browse(cr, uid, ids, context=context):
|
||||||
for move in repair.operations:
|
for move in repair.operations:
|
||||||
move_id = self.pool.get('stock.move').create(cr, uid, {
|
move_id = move_obj.create(cr, uid, {
|
||||||
'name': move.name,
|
'name': move.name,
|
||||||
'product_id': move.product_id.id,
|
'product_id': move.product_id.id,
|
||||||
'product_qty': move.product_uom_qty,
|
'product_qty': move.product_uom_qty,
|
||||||
|
@ -395,11 +485,11 @@ class mrp_repair(osv.osv):
|
||||||
'tracking_id': False,
|
'tracking_id': False,
|
||||||
'state': 'done',
|
'state': 'done',
|
||||||
})
|
})
|
||||||
self.pool.get('mrp.repair.line').write(cr, uid, [move.id], {'move_id': move_id})
|
repair_line_obj.write(cr, uid, [move.id], {'move_id': move_id})
|
||||||
|
|
||||||
if repair.deliver_bool:
|
if repair.deliver_bool:
|
||||||
pick_name = self.pool.get('ir.sequence').get(cr, uid, 'stock.picking.out')
|
pick_name = seq_obj.get(cr, uid, 'stock.picking.out')
|
||||||
picking = self.pool.get('stock.picking').create(cr, uid, {
|
picking = pick_obj.create(cr, uid, {
|
||||||
'name': pick_name,
|
'name': pick_name,
|
||||||
'origin': repair.name,
|
'origin': repair.name,
|
||||||
'state': 'draft',
|
'state': 'draft',
|
||||||
|
@ -409,10 +499,9 @@ class mrp_repair(osv.osv):
|
||||||
'invoice_state': 'none',
|
'invoice_state': 'none',
|
||||||
'type': 'out',
|
'type': 'out',
|
||||||
})
|
})
|
||||||
wf_service = netsvc.LocalService("workflow")
|
|
||||||
wf_service.trg_validate(uid, 'stock.picking', picking, 'button_confirm', cr)
|
wf_service.trg_validate(uid, 'stock.picking', picking, 'button_confirm', cr)
|
||||||
|
|
||||||
move_id = self.pool.get('stock.move').create(cr, uid, {
|
move_id = move_obj.create(cr, uid, {
|
||||||
'name': repair.name,
|
'name': repair.name,
|
||||||
'picking_id': picking,
|
'picking_id': picking,
|
||||||
'product_id': repair.product_id.id,
|
'product_id': repair.product_id.id,
|
||||||
|
@ -427,10 +516,10 @@ class mrp_repair(osv.osv):
|
||||||
'tracking_id': False,
|
'tracking_id': False,
|
||||||
'state': 'assigned', # FIXME done ?
|
'state': 'assigned', # FIXME done ?
|
||||||
})
|
})
|
||||||
self.write(cr, uid, [repair.id], {'state':'done', 'picking_id':picking})
|
self.write(cr, uid, [repair.id], {'state': 'done', 'picking_id': picking})
|
||||||
res[repair.id] = picking
|
res[repair.id] = picking
|
||||||
else:
|
else:
|
||||||
self.write(cr, uid, [repair.id], {'state':'done'})
|
self.write(cr, uid, [repair.id], {'state': 'done'})
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
@ -438,7 +527,18 @@ mrp_repair()
|
||||||
|
|
||||||
|
|
||||||
class ProductChangeMixin(object):
|
class ProductChangeMixin(object):
|
||||||
def product_id_change(self, cr, uid, ids, pricelist, product, uom=False, product_uom_qty=0, partner_id=False, guarantee_limit=False):
|
def product_id_change(self, cr, uid, ids, pricelist, product, uom=False,
|
||||||
|
product_uom_qty=0, partner_id=False, guarantee_limit=False):
|
||||||
|
""" On change of product it sets product quantity, tax account, name,
|
||||||
|
uom of product, unit price and price subtotal.
|
||||||
|
@param pricelist: Pricelist of current record.
|
||||||
|
@param product: Changed id of product.
|
||||||
|
@param uom: UoM of current record.
|
||||||
|
@param product_uom_qty: Quantity of current record.
|
||||||
|
@param partner_id: Partner of current record.
|
||||||
|
@param guarantee_limit: Guarantee limit of current record.
|
||||||
|
@return: Dictionary of values and warning message.
|
||||||
|
"""
|
||||||
result = {}
|
result = {}
|
||||||
warning = {}
|
warning = {}
|
||||||
|
|
||||||
|
@ -447,7 +547,7 @@ class ProductChangeMixin(object):
|
||||||
result['product_uom_qty'] = product_uom_qty
|
result['product_uom_qty'] = product_uom_qty
|
||||||
|
|
||||||
if product:
|
if product:
|
||||||
product_obj = self.pool.get('product.product').browse(cr, uid, product)
|
product_obj = self.pool.get('product.product').browse(cr, uid, product)
|
||||||
if partner_id:
|
if partner_id:
|
||||||
partner = self.pool.get('res.partner').browse(cr, uid, partner_id)
|
partner = self.pool.get('res.partner').browse(cr, uid, partner_id)
|
||||||
result['tax_id'] = self.pool.get('account.fiscal.position').map_tax(cr, uid, partner.property_account_position, product_obj.taxes_id)
|
result['tax_id'] = self.pool.get('account.fiscal.position').map_tax(cr, uid, partner.property_account_position, product_obj.taxes_id)
|
||||||
|
@ -455,7 +555,7 @@ class ProductChangeMixin(object):
|
||||||
result['name'] = product_obj.partner_ref
|
result['name'] = product_obj.partner_ref
|
||||||
result['product_uom'] = product_obj.uom_id and product_obj.uom_id.id or False
|
result['product_uom'] = product_obj.uom_id and product_obj.uom_id.id or False
|
||||||
if not pricelist:
|
if not pricelist:
|
||||||
warning={
|
warning = {
|
||||||
'title':'No Pricelist !',
|
'title':'No Pricelist !',
|
||||||
'message':
|
'message':
|
||||||
'You have to select a pricelist in the Repair form !\n'
|
'You have to select a pricelist in the Repair form !\n'
|
||||||
|
@ -466,14 +566,14 @@ class ProductChangeMixin(object):
|
||||||
product, product_uom_qty, partner_id, {'uom': uom,})[pricelist]
|
product, product_uom_qty, partner_id, {'uom': uom,})[pricelist]
|
||||||
|
|
||||||
if price is False:
|
if price is False:
|
||||||
warning={
|
warning = {
|
||||||
'title':'No valid pricelist line found !',
|
'title':'No valid pricelist line found !',
|
||||||
'message':
|
'message':
|
||||||
"Couldn't find a pricelist line matching this product and quantity.\n"
|
"Couldn't find a pricelist line matching this product and quantity.\n"
|
||||||
"You have to change either the product, the quantity or the pricelist."
|
"You have to change either the product, the quantity or the pricelist."
|
||||||
}
|
}
|
||||||
else:
|
else:
|
||||||
result.update({'price_unit': price, 'price_subtotal' :price*product_uom_qty})
|
result.update({'price_unit': price, 'price_subtotal': price*product_uom_qty})
|
||||||
|
|
||||||
return {'value': result, 'warning': warning}
|
return {'value': result, 'warning': warning}
|
||||||
|
|
||||||
|
@ -484,10 +584,15 @@ class mrp_repair_line(osv.osv, ProductChangeMixin):
|
||||||
|
|
||||||
def copy_data(self, cr, uid, id, default=None, context=None):
|
def copy_data(self, cr, uid, id, default=None, context=None):
|
||||||
if not default: default = {}
|
if not default: default = {}
|
||||||
default.update( {'invoice_line_id':False,'move_id':False,'invoiced':False,'state':'draft'})
|
default.update( {'invoice_line_id': False, 'move_id': False, 'invoiced': False, 'state': 'draft'})
|
||||||
return super(mrp_repair_line, self).copy_data(cr, uid, id, default, context)
|
return super(mrp_repair_line, self).copy_data(cr, uid, id, default, context)
|
||||||
|
|
||||||
def _amount_line(self, cr, uid, ids, field_name, arg, context):
|
def _amount_line(self, cr, uid, ids, field_name, arg, context):
|
||||||
|
""" Calculates amount.
|
||||||
|
@param field_name: Name of field.
|
||||||
|
@param arg: Argument
|
||||||
|
@return: Dictionary of values.
|
||||||
|
"""
|
||||||
res = {}
|
res = {}
|
||||||
cur_obj=self.pool.get('res.currency')
|
cur_obj=self.pool.get('res.currency')
|
||||||
for line in self.browse(cr, uid, ids):
|
for line in self.browse(cr, uid, ids):
|
||||||
|
@ -524,10 +629,16 @@ class mrp_repair_line(osv.osv, ProductChangeMixin):
|
||||||
}
|
}
|
||||||
_defaults = {
|
_defaults = {
|
||||||
'state': lambda *a: 'draft',
|
'state': lambda *a: 'draft',
|
||||||
'product_uom_qty':lambda *a:1,
|
'product_uom_qty': lambda *a: 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
def onchange_operation_type(self, cr, uid, ids, type, guarantee_limit):
|
def onchange_operation_type(self, cr, uid, ids, type, guarantee_limit):
|
||||||
|
""" On change of operation type it sets source location, destination location
|
||||||
|
and to invoice field.
|
||||||
|
@param product: Changed operation type.
|
||||||
|
@param guarantee_limit: Guarantee limit of current record.
|
||||||
|
@return: Dictionary of values.
|
||||||
|
"""
|
||||||
if not type:
|
if not type:
|
||||||
return {'value': {
|
return {'value': {
|
||||||
'location_id': False,
|
'location_id': False,
|
||||||
|
@ -537,19 +648,19 @@ class mrp_repair_line(osv.osv, ProductChangeMixin):
|
||||||
produc_id = self.pool.get('stock.location').search(cr, uid, [('name','=','Production')])[0]
|
produc_id = self.pool.get('stock.location').search(cr, uid, [('name','=','Production')])[0]
|
||||||
if type == 'add':
|
if type == 'add':
|
||||||
stock_id = self.pool.get('stock.location').search(cr, uid, [('name','=','Stock')])[0]
|
stock_id = self.pool.get('stock.location').search(cr, uid, [('name','=','Stock')])[0]
|
||||||
to_invoice=False
|
to_invoice = False
|
||||||
if guarantee_limit and today() > mx.DateTime.strptime(guarantee_limit, '%Y-%m-%d'):
|
if guarantee_limit and today() > mx.DateTime.strptime(guarantee_limit, '%Y-%m-%d'):
|
||||||
to_invoice=True
|
to_invoice=True
|
||||||
return {'value': {
|
return {'value': {
|
||||||
'to_invoice': to_invoice,
|
'to_invoice': to_invoice,
|
||||||
'location_id': stock_id,
|
'location_id': stock_id,
|
||||||
'location_dest_id' : produc_id
|
'location_dest_id': produc_id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return {'value': {
|
return {'value': {
|
||||||
'to_invoice': False,
|
'to_invoice': False,
|
||||||
'location_id': produc_id,
|
'location_id': produc_id,
|
||||||
'location_dest_id':False
|
'location_dest_id': False
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -558,13 +669,20 @@ mrp_repair_line()
|
||||||
class mrp_repair_fee(osv.osv, ProductChangeMixin):
|
class mrp_repair_fee(osv.osv, ProductChangeMixin):
|
||||||
_name = 'mrp.repair.fee'
|
_name = 'mrp.repair.fee'
|
||||||
_description = 'Repair Fees line'
|
_description = 'Repair Fees line'
|
||||||
|
|
||||||
def copy_data(self, cr, uid, id, default=None, context=None):
|
def copy_data(self, cr, uid, id, default=None, context=None):
|
||||||
if not default: default = {}
|
if not default: default = {}
|
||||||
default.update( {'invoice_line_id':False,'invoiced':False})
|
default.update({'invoice_line_id': False, 'invoiced': False})
|
||||||
return super(mrp_repair_fee, self).copy_data(cr, uid, id, default, context)
|
return super(mrp_repair_fee, self).copy_data(cr, uid, id, default, context)
|
||||||
|
|
||||||
def _amount_line(self, cr, uid, ids, field_name, arg, context):
|
def _amount_line(self, cr, uid, ids, field_name, arg, context):
|
||||||
|
""" Calculates amount.
|
||||||
|
@param field_name: Name of field.
|
||||||
|
@param arg: Argument
|
||||||
|
@return: Dictionary of values.
|
||||||
|
"""
|
||||||
res = {}
|
res = {}
|
||||||
cur_obj=self.pool.get('res.currency')
|
cur_obj = self.pool.get('res.currency')
|
||||||
for line in self.browse(cr, uid, ids):
|
for line in self.browse(cr, uid, ids):
|
||||||
res[line.id] = line.to_invoice and line.price_unit * line.product_uom_qty or 0
|
res[line.id] = line.to_invoice and line.price_unit * line.product_uom_qty or 0
|
||||||
cur = line.repair_id.pricelist_id.currency_id
|
cur = line.repair_id.pricelist_id.currency_id
|
||||||
|
|
|
@ -28,17 +28,13 @@ class repair_cancel(osv.osv_memory):
|
||||||
_description = 'Cancel Repair'
|
_description = 'Cancel Repair'
|
||||||
|
|
||||||
def cancel_repair(self, cr, uid, ids, context):
|
def cancel_repair(self, cr, uid, ids, context):
|
||||||
"""
|
""" Cancels the repair
|
||||||
Cancels the repair
|
@param self: The object pointer.
|
||||||
|
@param cr: A database cursor
|
||||||
@param self: The object pointer.
|
@param uid: ID of the user currently logged in
|
||||||
@param cr: A database cursor
|
@param ids: List of IDs selected
|
||||||
@param uid: ID of the user currently logged in
|
@param context: A standard dictionary
|
||||||
@param ids: List of IDs selected
|
@return:
|
||||||
@param context: A standard dictionary
|
|
||||||
|
|
||||||
@return:
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
record_id = context and context.get('active_id', False) or False
|
record_id = context and context.get('active_id', False) or False
|
||||||
assert record_id, _('Active ID is not Found')
|
assert record_id, _('Active ID is not Found')
|
||||||
|
@ -54,16 +50,12 @@ class repair_cancel(osv.osv_memory):
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
|
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
|
||||||
"""
|
""" Changes the view dynamically
|
||||||
Changes the view dynamically
|
@param self: The object pointer.
|
||||||
|
@param cr: A database cursor
|
||||||
@param self: The object pointer.
|
@param uid: ID of the user currently logged in
|
||||||
@param cr: A database cursor
|
@param context: A standard dictionary
|
||||||
@param uid: ID of the user currently logged in
|
@return: New arch of view.
|
||||||
@param context: A standard dictionary
|
|
||||||
|
|
||||||
@return: New arch of view.
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
record_id = context and context.get('active_id', False) or False
|
record_id = context and context.get('active_id', False) or False
|
||||||
res = super(repair_cancel, self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar,submenu=False)
|
res = super(repair_cancel, self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar,submenu=False)
|
||||||
|
|
|
@ -31,21 +31,18 @@ class make_invoice(osv.osv_memory):
|
||||||
}
|
}
|
||||||
|
|
||||||
def make_invoices(self, cr, uid, ids, context):
|
def make_invoices(self, cr, uid, ids, context):
|
||||||
"""
|
""" Generates invoice(s) of selected records.
|
||||||
Generates invoice(s) of selected records.
|
@param self: The object pointer.
|
||||||
|
@param cr: A database cursor
|
||||||
@param self: The object pointer.
|
@param uid: ID of the user currently logged in
|
||||||
@param cr: A database cursor
|
@param ids: List of IDs selected
|
||||||
@param uid: ID of the user currently logged in
|
@param context: A standard dictionary
|
||||||
@param ids: List of IDs selected
|
@return: Loads the view of new invoice(s).
|
||||||
@param context: A standard dictionary
|
|
||||||
|
|
||||||
@return: Loads the view of new invoice(s).
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
inv = self.browse(cr, uid, ids[0])
|
inv = self.browse(cr, uid, ids[0])
|
||||||
order_obj = self.pool.get('mrp.repair')
|
order_obj = self.pool.get('mrp.repair')
|
||||||
newinv = order_obj.action_invoice_create(cr, uid, context['active_ids'], group=inv.group,context=context)
|
newinv = order_obj.action_invoice_create(cr, uid, context['active_ids'],
|
||||||
|
group=inv.group,context=context)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'domain': [('id','in', newinv.values())],
|
'domain': [('id','in', newinv.values())],
|
||||||
|
|
Loading…
Reference in New Issue