【发布时间】:2025-11-27 16:50:02
【问题描述】:
好的,现在的更新是我不再收到任何错误(500 错误和空值)
但是当点击按钮时,发票没有更新为来自 MRP 维修的车辆[fleet_id]
到目前为止我添加的代码 - MRP_REPAIR.PY
def action_invoice_create(self, cr, uid, ids, group=False, context=None):
print "action_invoice_create---------------",ids, group, context
context = dict(context or {})
repair = self.browse(cr, uid, ids[0], context)
context['default_fleet_id'] = repair.fleet_id and repair.fleet_id.id or False
res = super(mrp_repair, self).action_invoice_create(cr, uid, ids,
group=group,
context=context)
inv_line_obj = self.pool.get('account.invoice.line')
inv_obj = self.pool.get('account.invoice')
for repair_id, invoice_id in res.iteritems():
if not invoice_id:
continue
invoice = inv_obj.browse(cr, uid, invoice_id) #deactivated by MSKE-30/06/2016
inv_obj.write(cr, uid, [invoice_id],{'fleet_id': fleet_id}) # added by MSKE-25/06/2016
for rsol in repair.order_line_ids:
name = rsol.name or ''
if rsol.product_id.property_account_income:
account_id = rsol.product_id.property_account_income.id
elif rsol.product_id.categ_id.property_account_income_categ:
account_id = rsol.product_id.categ_id.property_account_income_categ.id
else:
raise osv.except_osv(_('Error!'), _('No account defined for product "%s".') % rsol.product_id.name)
invoice_line_vals = {
'invoice_id': invoice_id,
'name': rsol.product_id.name,
'origin': rsol.repair_sale_order_line_id.name,
'account_id': account_id,
'quantity': rsol.product_uom_qty, #enabled MSKE-30/06/2016
'invoice_line_tax_id': [(6, 0, [x.id for x in rsol.tax_id])],
'uos_id': rsol.product_id.uom_id.id,
'price_unit': rsol.price_unit,
'price_subtotal': rsol.product_uom_qty * rsol.price_unit,
'product_id': rsol.product_id and rsol.product_id.id or False
}
print "invoice_line_vals----------",invoice_line_vals
invoice_line_id = inv_line_obj.create(cr, uid, invoice_line_vals)
print "after line create----------------------------",invoice_line_id
self.pool.get('account.invoice').\
button_reset_taxes(cr, uid, invoice_id, context=context)
return res
_columns = {
'sale_id': fields.many2one('sale.order', 'Quotation', readonly=True),
# Devis
'livraison_id': fields.many2one('garage.livraison', 'Delivery Report',
readonly=True),
# Procès de livraison
'fleet_id': fields.many2one('fleet.vehicle', 'Vehicle', required=True,
readonly=True), # Vehicle
'product_id': fields.many2one('product.product',
string='Product to Repair',
readonly=True,
states={'draft': [
('readonly', False)]}),
def action_repair_done(self, cr, uid, ids, context=None):
print "action_repair_done-------------------",ids, context
res = {}
move_obj = self.pool.get('stock.move')
repair_line_obj = self.pool.get('mrp.repair.line')
reception_obj = self.pool.get('garage.reception')
for repair in self.browse(cr, uid, ids, context=context):
move_ids = []
for move in repair.operations:
repair_line_obj.write(cr, uid,
[move.id], {'state': 'done'},
context=context)
self.write(cr, uid, [repair.id], {'state': 'done'},
context=context)
if repair.reception_id:
print "repair.reception_id-----------",repair.reception_id
reception_obj.write(cr, uid, [repair.reception_id.id],
{'state': 'termine'}, context=context)
if repair:
this = repair
reception_id = this.reception_id or None
vals = {
'name': None,
'partner_id': this.partner_id and this.partner_id.id or
None,
'reception_id': reception_id.id,
'partner_recived_from': reception_id and
reception_id.partner_recived_from
and
reception_id.
partner_recived_from.id
or None,
'responsable_id': reception_id and
reception_id.responsable_id and
reception_id.responsable_id.id or None,
'fleet_id': this.fleet_id and this.fleet_id.id or None,
'kilometrage': reception_id.kilometrage,
'state': 'en_cours',
'datetime_livraison': time.strftime('%Y-%m-%d %H:%M:%S'),
'repair_id':this.id,
}
if this.service_requested_ids:
vals.update({'service_done_ids' : [(6, 0, [service_id.id for service_id in this.service_requested_ids])] })
livraison_id = self.pool.get('garage.livraison').\
create(cr, uid, vals, context=context)
self.write(cr, uid, [this.id],
{'livraison_id': livraison_id}, context=context)
# ********************************
return True
INVOICE.PY 中的代码
类 account_invoice(models.Model): _inherit = "account.invoice"
def _get_subtotal_word(self, cr, uid, ids, name, arg, context=None):
res = {}
for sale in self.browse(cr, uid, ids, context=context):
res[sale.id] = self.convert_int_ot_word(sale.amount_total).\
upper()
return res
_columns = {
'subtotal_word': fields.function(_get_subtotal_word, type='char',
string='subtotal_word'),
'reception_id': fields.many2one('garage.reception',
'Reception Report', readonly=True),
# Procèss de reception
# 'fleet_id': fields.related('reception_id', 'fleet_id',
# relation='fleet.vehicle',
# string='Vehicles',
# type='many2one', readonly=True),
'fleet_id':fields.many2one('fleet.vehicle','Vehicles' ,readonly=True),
# Véhicules
'responsable_id': fields.many2one('res.users', 'Supervisor', readonly=True),
# Responsable
}
_defaults = {
'responsable_id' : lambda self, cr, uid, ctx=None: uid
}
def create(self, cr, uid, vals, context=None):
sale_order = self.pool.get('sale.order')
sale_order_data = sale_order.\
search(cr, uid, [('name', '=', vals['origin'])], context=context)
sale_order_id = sale_order.\
browse(cr, uid, sale_order_data, context=context)
vals['fleet_id'] = sale_order_id.fleet_id.id
res = super(account_invoice, self).create(cr, uid, vals, context)
return res
def action_move_create(self, cr, uid, ids, context=None):
for inv in self.browse(cr, uid, ids, context):
if not inv.journal_id.sequence_id:
raise except_orm(_('Error!'), _('Please define sequence'
'on the journal related to'
'this invoice.'))
if not inv.invoice_line:
raise except_orm(_('No Invoice Lines!'), _('Please create'
'some invoice'
'lines.'))
if inv.move_id:
continue
res = super(account_invoice, self).action_move_create(cr, uid, ids,
context)
group_id = \
self.pool.get('ir.model.data').\
get_object_reference(cr, SUPERUSER_ID, 'garage',
'group_garage_manager')[1]
group_brw = self.pool.get('res.groups').\
browse(cr, SUPERUSER_ID, group_id, context=context)
user_is_manager = False
for user in group_brw.users:
if user.id == uid:
user_is_manager = True
if not user_is_manager:
raise osv.except_osv(_('User Error!'),
_('Please contact your Manager to'
'confirm this invoice'))
return res
@api.multi
def invoice_print(self):
""" Print the invoice and mark it as sent, so that we can see more
easily the next step of the workflow
"""
assert len(self) == 1, 'This option should only be used for' \
'a single id at a time.'
self.sent = True
return self.env['report'].get_action(self,
'garage.report_garage_invoice')
uclass account_invoice_line(osv.osv):
_inherit = 'account.invoice.line'
def create(self, cr, uid, vals, context=None):
print "IL CREATE vals-------------",vals
return super(account_invoice_line,self).create(cr, uid, vals, context)
def convert_amount_language(self, cr, uid, ids,amount,currency='Euro', context=None):
lang=self.pool.get('res.users').browse(cr,uid,uid).lang
if lang=='en_US':
new_amount=amount_to_text(amount, currency)
print"-------------------new_amount-------",new_amount
new_amount = new_amount.replace('euro', 'DHs')
new_amount = new_amount.replace('Cent', 'CTs')
new_amount = new_amount.replace('Cents', 'CT')
print"-------------------new_amount-------",new_amount
return new_amount
if lang=='fr_FR':
french_amount=amount_to_text_fr(amount, currency)
french_amount = french_amount.replace('Euro', 'DHs')
french_amount = french_amount.replace('Cents', 'CTs')
french_length=len(french_amount)
french_length_start=french_length-4
french_amount = french_amount[0:french_length_start]+french_amount[french_length_start-1:].replace('Cent', 'CTs')
return french_amount
def _get_product_amount_h_t(self, cr, uid, ids, name, arg, context=None):
res = {}
for line in self.browse(cr, uid, ids, context=context):
res[line.id] = (line.price_unit - (line.price_unit *
line.discount / 100))
return res
def _get_amount_h_t(self, cr, uid, ids, name, arg, context=None):
res = {}
for line in self.browse(cr, uid, ids, context=context):
res[line.id] = (line.price_unit - (line.price_unit *
line.discount / 100)) # * line.product_uom_qty
return res
def _get_profit(self, cr, uid, ids, name, arg, context=None):
res = {}
for line in self.browse(cr, uid, ids, context=context):
res[line.id] = (line.price_unit -(line.price_unit * line.discount/100)) - line.product_id.standard_price
return res
def onchange_price_unit(self, cr, uid, ids, product_id, discount,
price_unit, context=None):
res = {}
if product_id:
product_brw = self.pool.get('product.product').\
browse(cr, uid, product_id, context=context)
return {'value': {'profit': (price_unit -
(price_unit * discount / 100)) -
product_brw.standard_price}}
return {}
_columns = {
'product_amount_h_t': fields.function(_get_product_amount_h_t,
type='float',
string='Price excl. TAX'),
# Price h.t
'amount_h_t': fields.function(_get_amount_h_t, type='float',
string='Amount exl. tax'),
# Amount h.t
'type_product_id': fields.related('product_id', 'product_tmpl_id', 'type_product_id', type='many2one', relation='product.type',
string='Type Of Part', readonly=False ),
'profit': fields.function(_get_profit, type='float' , string='Profit'),
}
【问题讨论】:
-
fleet_id 的值在哪里设置?我在任何地方都没有看到它。
-
检查编辑,谢谢
-
在您的
action_invoice_create中,您使用的是fleet_id,但从未设置此局部变量。您的编辑在该问题上没有任何改变。action_invoice_create上的超级电话实际上是在创建一张或多张发票吗?如果是这样,我正在辩论的代码永远不会到达。在那个超级上,已经需要fleet_id,因为它是必需的,因为您已经定义了该字段。设置它的另一个选项是使用上下文。在使用 super 之前,无论fleet_id来自何处,都使用{default_fleet_id':fleet_id}更新上下文。 -
是的,action_invoice_create 确实创建了无错误的发票,但未显示fleet_id。对不起,但我没有得到你的最后一句话:设置它的另一个选项是使用上下文。在使用 super 之前,使用 {default_fleet_id':fleet_id} 更新 context而fleet_id 位于另外两个文档中,mrp_repair 文件和接收报告。
-
如何创建无错误的发票?查看您的堆栈跟踪:创建失败,因为未在创建时设置
fleet_id!您已根据需要在account.invoice上定义了fleet_id。所以你必须在创建时设置这个字段。你没有那样做。你的 write() 永远不会到达。如果达到,您将收到“分配前引用的局部变量”错误,因为您在 action_invoice_create() 中的局部变量fleet_id从未被分配任何东西。