Conjunto de mudanças 5574 no repositório publico


Ignorar:
Timestamp:
16/11/2011 10:45:12 (8 anos atrás)
Autor:
fabianosantos
Mensagem:

Nesse commit reside 90% da inteligencia desse sistema. Adicionado algoritmos de tramitacao inicial, de envio, de recebimento e recuperacao de protocolos enviados e nao recebidos. Adicionadas tabelas que representam o inbox e outbox das áreas. Adiciona coluna na tabela de tramitacao para armazenar a área anterior de um tramite, util para implementar a recuperacao e atualizacao de inbox e outbox no momento do recebimento. Todos os metodos recebem listas de identificadores de protocolos, para permitir a tramitacao em lote, desobrigando o usuario a tramitar protocolo por protocolo, dando agilidade ao sistema.

Localização:
il.spdo/trunk/il/spdo
Arquivos:
3 editados

Legenda:

Não Modificado
Adicionado
Removido
  • il.spdo/trunk/il/spdo/api.py

    r5573 r5574  
    138138        return tuple(result_ids)
    139139
     140    def _add_box(self, box, protocolo_id, area_id):
     141        assert(box in (db.TramiteInbox, db.TramiteOutbox))
     142        session = Session()
     143        t = session.query(box).get((protocolo_id, area_id))
     144        if t is None:
     145            t = box()
     146            t.protocolo_id=protocolo_id
     147            t.area_id=area_id
     148            tbl = box is db.TramiteInbox and 'tramite_inbox' or 'tramite_outbox'
     149            t.version = db.nextVersion(tbl, protocolo_id=protocolo_id, area_id=area_id)
     150            session.add(t)
     151   
     152    def _del_box(self, box, protocolo_id, area_id):
     153        assert(box in (db.TramiteInbox, db.TramiteOutbox))
     154        session = Session()
     155        t = session.query(box).get((protocolo_id, area_id))
     156        if t is not None:
     157            session.delete(t)
     158
    140159    def TramiteInicial(self, protocolo_id):
    141160        """Tramite inicial.
    142161        """
    143162        session = Session()
     163        area_id_auth = self.getAuthPessoa().area_id
    144164        tramite = db.Tramite(
    145165                  protocolo_id=protocolo_id,
    146                   area_id=self.getAuthPessoa().area_id,
     166                  area_id=area_id_auth,
    147167                  data_disponibilizacao=None,
    148168                  data_recebimento=datetime.datetime.now(),
     
    151171                  )
    152172        session.add(tramite)
    153         session.flush()
    154         tramite_inbox = db.TramiteInbox(
    155                         tramite_id=tramite.id,
    156                         area_id=tramite.area_id,
    157                         )
    158         session.add(tramite_inbox)
    159         session.flush()
    160         return tramite.id
    161        
    162     def TramiteEnvio(self, protocolo_id, areas, acao):
     173        self._add_box(db.TramiteInbox, protocolo_id, area_id_auth)
     174        session.flush()
     175
     176    def TramiteEnvio(self, protocolos, areas, acao):
    163177        """Tramite de envio.
    164178        """
    165         session = Session()
    166         area_id_auth = self.getAuthPessoa().area_id
     179        protocolos = list(set(protocolos))
     180        areas = list(set(areas))
     181        session = Session()
     182        area_id_auth = self.getAuthPessoa().area_id
     183        # evita o envio para a própria área
     184        if areas.count(area_id_auth):
     185            areas.pop(areas.index(area_id_auth))
    167186        copia = len(areas) > 1
    168         result_ids = []
    169         for area_id in areas:
    170             # evita o envio para a própria área
    171             if area_id == area_id_auth:
    172                 continue
    173             tramite = db.Tramite(protocolo_id=protocolo_id,
    174                                  area_id=area_id,
    175                                  data_disponibilizacao=datetime.datetime.now(),
    176                                  data_recebimento=None,
    177                                  acao=acao,
    178                                  copia=copia,
    179                                  usuario=self.getAuthId(),
    180                                  )
    181             session.add(tramite)
    182             session.flush()
    183             tramite_outbox = db.TramiteOutbox(
    184                              tramite_id=tramite.id,
    185                              area_id=area_id_auth,
    186                              )
    187             session.add(tramite_inbox)
    188             session.flush()
    189             result_ids.append(tramite.id)
    190         return tuple(result_ids)
     187        for protocolo_id in protocolos:
     188            for area_id in areas:
     189                tramite = db.Tramite(
     190                          protocolo_id=protocolo_id,
     191                          area_id=area_id,
     192                          data_disponibilizacao=datetime.datetime.now(),
     193                          data_recebimento=None,
     194                          acao=acao,
     195                          usuario=self.getAuthId(),
     196                          copia=copia,
     197                          area_id_anterior=area_id_auth,
     198                          )
     199                session.add(tramite)
     200                self._add_box(db.TramiteOutbox, protocolo_id, area_id_auth)
     201                self._del_box(db.TramiteInbox, protocolo_id, area_id_auth)
     202                session.flush()
    191203
    192204    def TramiteRecebimento(self, protocolos):
    193205        """Tramite de recebimento.
    194206        """
     207        protocolos = list(set(protocolos))
    195208        session = Session()
    196209        area_id_auth = self.getAuthPessoa().area_id
     
    199212            tramite = session.query(db.Tramite).\
    200213                      filter_by(protocolo_id=protocolo_id).\
    201                       filter_by(area_id=area_id_actual).\
    202                       filter(db.Tramite.data_recebimento is None).first()
     214                      filter_by(area_id=area_id_auth).\
     215                      filter_by(data_recebimento=None).first()
    203216            tramite.data_recebimento=datetime.datetime.now()
     217            self._add_box(db.TramiteInbox, protocolo_id, area_id_auth)
     218            self._del_box(db.TramiteOutbox, protocolo_id, tramite.area_id_anterior)
     219           
     220    def TramiteRecuperacao(self, protocolos):
     221        """Tramite de recuperação (recupera um protocolo enviado que não foi recebido).
     222        """
     223        protocolos = list(set(protocolos))
     224        session = Session()
     225        area_id_auth = self.getAuthPessoa().area_id
     226        for protocolo_id in protocolos:
     227            protocolo = self.getProtocolo(protocolo_id)
     228            tramite = session.query(db.Tramite).\
     229                      filter_by(protocolo_id=protocolo_id).\
     230                      filter_by(area_id_anterior=area_id_auth).\
     231                      filter_by(data_recebimento=None).first()
     232            session.delete(tramite)
     233            self._add_box(db.TramiteInbox, protocolo_id, area_id_auth)
     234            self._del_box(db.TramiteOutbox, protocolo_id, area_id_auth)
  • il.spdo/trunk/il/spdo/browser/forms/tramite.py

    r5572 r5574  
    2929        api = getUtility(ISPDOAPI)
    3030        protocolo_id = api.getProtocoloId()
    31         api.TramiteEnvio(protocolo_id, data['areas'], data['acao'])
     31        api.TramiteEnvio([protocolo_id], data['areas'], data['acao'])
    3232
    3333    def nextURL(self):
  • il.spdo/trunk/il/spdo/db.py

    r5571 r5574  
    176176
    177177"""
    178 As próximas 3 tabelas merecem alguns comentários, pois seu
    179 funcionamento não é trivial. A tabela "Tramite" armazena o histórico
    180 da tramitação de um protocolo. As tabelas TramiteInbox e
    181 TramiteOutbox podem ser encaradas como estruturas auxiliares. A
    182 tabela "TramiteInbox" simula a caixa de entrada de uma determinada
    183 área, armazenando referências para todos os protocolos recebidos. Por
    184 sua vez, a tabela "TramiteOutbox" simula a caixa de saída, armazenando
    185 referências para todos os protocolos enviados enviados e ainda não
    186 recebidos.
     178Há 3 tabelas que merecem alguns comentários, pois seu funcionamento
     179não é trivial. A tabela "Tramite" armazena o histórico da tramitação
     180de um protocolo. As tabelas TramiteInbox e TramiteOutbox podem ser
     181encaradas como estruturas auxiliares. A tabela "TramiteInbox" simula a
     182caixa de entrada de uma determinada área, armazenando referências para
     183todos os protocolos recebidos. Por sua vez, a tabela "TramiteOutbox"
     184simula a caixa de saída, armazenando referências para todos os
     185protocolos enviados enviados e ainda não recebidos.
    187186"""
    188    
     187
    189188class Tramite(Base):
    190189    implements(interfaces.IAddTramite)
     
    194193    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
    195194    area_id = Column(Integer, ForeignKey('area.id'))
    196     area = relationship("Area", backref="tramite")
     195    area = relationship("Area", primaryjoin=(area_id==Area.id), backref="tramite")
    197196    data_disponibilizacao = Column(DateTime())
    198197    data_recebimento = Column(DateTime())
    199198    acao = Column(Text())
    200199    copia = Column(Boolean(), default=False)
     200    area_id_anterior = Column(Integer, ForeignKey('area.id'))
     201    area_anterior = relationship("Area", primaryjoin=(area_id_anterior==Area.id), backref="tramite_anterior")
    201202    responsavel_id = Column(Integer, ForeignKey('responsavel.id'))
    202203    responsavel = relationship("Responsavel", backref="tramite")
    203204    usuario = Column(String(50), nullable=False)
    204205
    205     def __init__(self, protocolo_id, area_id, data_disponibilizacao, data_recebimento, acao, usuario, copia=False):
     206    def __init__(self, protocolo_id, area_id, data_disponibilizacao, data_recebimento, acao, usuario, copia=False, area_id_anterior=None):
    206207        self.protocolo_id = protocolo_id
    207208        self.area_id = area_id
     
    210211        self.acao = acao
    211212        self.copia = copia
     213        self.area_id_anterior = area_id_anterior
    212214        # o responsável pelo tramite é o responsável atual da área de destino
    213215        session = Session()
     
    215217        self.responsavel_id = query.order_by(Responsavel.data_responsavel).all()[-1][0]
    216218        self.usuario = usuario
    217 
    218 class TramiteInbox(Base):
    219     __tablename__ = 'tramite_inbox'
    220     __table_args__ = TABLE_ARGS
    221     id = Column(Integer, primary_key=True)
    222     tramite_id = Column(Integer, ForeignKey('tramite.id'))
    223     tramite = relationship("Tramite", backref="tramite_inbox")
    224     area_id = Column(Integer, ForeignKey('area.id'))
    225     area = relationship("Area", backref="tramite_inbox")
    226 
    227 class TramiteOutbox(Base):
    228     __tablename__ = 'tramite_outbox'
    229     __table_args__ = TABLE_ARGS
    230     id = Column(Integer, primary_key=True)
    231     tramite_id = Column(Integer, ForeignKey('tramite.id'))
    232     tramite = relationship("Tramite", backref="tramite_outbox")
    233     area_id = Column(Integer, ForeignKey('area.id'))
    234     area = relationship("Area", backref="tramite_outbox")
    235219
    236220def calculaDigitoVerificador(seq, ano):
     
    276260        session = Session()
    277261
    278         # TODO: isso não pode ser feito dessa maneira, pois desconsidera o session e requer um commit ao invez de um flush
     262        # TODO: isso não poderia ser feito dessa maneira, pois desconsidera o session e requer um commit ao invez de um flush
    279263        self.ano = datetime.datetime.now().year
    280264        max_seq = session.bind.execute('SELECT max(p.seq) from protocolo p where p.ano = %d' % self.ano).fetchone()[0]
     
    285269    def __repr__(self):
    286270        return "<Protocolo:%s>" % self.numero
     271
     272class TramiteInbox(Base):
     273    __tablename__ = 'tramite_inbox'
     274    __table_args__ = TABLE_ARGS
     275    protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
     276    protocolo = relationship("Protocolo", backref="tramite_inbox")
     277    area_id = Column(Integer, ForeignKey('area.id'), primary_key=True)
     278    area = relationship("Area", backref="tramite_inbox")
     279
     280class TramiteOutbox(Base):
     281    __tablename__ = 'tramite_outbox'
     282    __table_args__ = TABLE_ARGS
     283    protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
     284    protocolo = relationship("Protocolo", backref="tramite_outbox")
     285    area_id = Column(Integer, ForeignKey('area.id'), primary_key=True)
     286    area = relationship("Area", backref="tramite_outbox")
    287287
    288288class Referencia(Base):
Note: Veja TracChangeset para ajuda no uso do visualizador de conjunto de mudanças.
 

The contents and data of this website are published under license:
Creative Commons 4.0 Brasil - Atribuir Fonte - Compartilhar Igual.