ODOO-8:无法将FLEET_ID字段写入发票(来自MRP REPAIR)

时间:2016-06-25 15:13:27

标签: python openerp odoo-8

好的,现在更新是我不再收到任何错误(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的

代码

class 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'),
}

1 个答案:

答案 0 :(得分:0)

假设:修理订单包含fleet_id

尝试更改action_invoice_create(),如:

def action_invoice_create(self, cr, uid, ids, group=False, context=None):
    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)
    # ...