Em 27/02/2014 11:46, Guillem Barba Domingo escreveu:
2014-02-27 14:10 GMT+01:00 Iasmini - Gmail <[email protected] <mailto:[email protected]>>:

    Em 27/02/2014 08:50, Cédric Krier escreveu:

        On 27 Feb 08:43, Iasmini - Gmail wrote:

            Hi,

            I need to do something just before saving. I did this:

            class Invoice:
                 __name__ = 'account.invoice'
            ...
                 def save(self):
                     if self.rps_number == '':
                         if not self.create_rps_number():
                             self.raise_user_error(u'xxxx!')

                     super(Invoice, self).save()

            But this function is not called. Why?

        Because save is a recent method added for syntactic sugar and
        so it is
        not always (almost never) called.
        I think what you are looking for is the validate method:

        
http://doc.tryton.org/3.0/trytond/doc/ref/models/models.html?highlight=validate#trytond.model.ModelStorage.validate

    I did on validate(). I'm setting the value of the field numero_rps
    with the created numero_rps by method gera_numero_rps() called on
    validate(). But on invoice this field is getting null after
    saving. Why? Save method is called after validate(), right?

    I tried with self and with invoice (putting @staticmethod before
    function).

    Here is the code:

    class Invoice:
    ...
        @classmethod
        def validate(cls, invoices):
            super(Invoice, cls).validate(invoices)

            # gera número do rps antes de salvar
            for invoice in invoices:
                if invoice.numero_rps == '' or invoice.numero_rps == None:
                    if not invoice.gera_numero_rps():
                        invoice.raise_user_error(u'xxx!')


this raise_user_error (and the 'if') is unnecessary because gera_numbero_rps() never returns False. Read below.

      def gera_numero_rps(self):
            go_on = True

            try:
                NumeracaoRPS = Pool().get('nfse_br.numeracao_rps')

                numeracao_rps = NumeracaoRPS.search([
                    ('tipo_rps', '=', self.tipo_rps),
                    ('serie_rps', '=', self.serie),
                    ('company', '=', self.company)])

                if numeracao_rps:
                    numeracao_rps[0].ultimo_numero_rps +=
    numeracao_rps[0].ultimo_numero_rps
                    NumeracaoRPS.write(numeracao_rps, {
                        'ultimo_numero_rps':
    numeracao_rps[0].ultimo_numero_rps})
                else:
                    go_on = False
                    self.raise_user_error(u'Deve ser criada a
    numeração do RPS de acordo com o tipo do RPS, série e'
                                          u' emitente da NFS-e antes
    de processar!')
                    return


this return isn't never called because you are raising an exception before.

              self.numero_rps = str(numeracao_rps[0].ultimo_numero_rps)
            except:
                go_on = False
                raise

            return go_on


as you are raising and exception for all invalid cases (go_on = False), the return is unnecessary: if the method doesn't raise exception is because always has done OK.


    Here

    self.numero_rps = str(numeracao_rps[0].ultimo_numero_rps)

    I'm setting invoice.numero_rps, but in database is null. I traced
    and it's > 0.


in gera_numero_rps() you are modifying the instance (changing values). I think you can't modify nothing in validate, only check and raise exception if something is wrong.

So, *you shoud call gera_numero_rps() in create() and write() functions*.

--
Guillem Barba
http://www.guillem.alcarrer.net
Ok, thank you all!

--

Iasmini Gomes
Sílex Sistemas
www.silexsistemas.com.br



---
Este email está limpo de vírus e malwares porque a proteção do avast! Antivírus 
está ativa.
http://www.avast.com

Reply via email to