Esempio n. 1
0
def agreement_transition_to_signed_valid(agreement):
    """Returns True if it's valid for the agreement to transition to signed, otherwise raises a TransitionError.

    TransitionErrors are raised under 3 circumstances --
      - If the agreement is of type PCA and matches certain criteria (see code)
      - If the start date is empty or in the future
      - If the end date is empty
    """
    today = date.today()
    if agreement.agreement_type == agreement.PCA and \
            agreement.__class__.objects.filter(partner=agreement.partner,
                                               status=agreement.SIGNED,
                                               agreement_type=agreement.PCA,
                                               country_programme=agreement.country_programme,
                                               start__gt=date(2015, 7, 1)).exists():

        raise TransitionError(['agreement_transition_to_active_invalid_PCA'])

    if not agreement.start or agreement.start > today:
        raise TransitionError([
            'Agreement cannot transition to signed until '
            'the start date is less than or equal to today'
        ])
    if not agreement.end:
        raise TransitionError([
            'Agreement cannot transition to signed unless the end date is defined'
        ])

    return True
Esempio n. 2
0
def transition_to_signed(i):
    from etools.applications.partners.models import Agreement
    if i.in_amendment is True:
        raise TransitionError(
            [_('Cannot Transition status while adding an amendment')])
    if i.document_type in [i.PD, i.SHPD] and i.agreement.status in [
            Agreement.SUSPENDED, Agreement.TERMINATED
    ]:
        raise TransitionError([
            _('The PCA related to this record is Suspended or Terminated. '
              'This Programme Document will not change status until the related PCA '
              'is in Signed status')
        ])

    if i.in_amendment is True:
        raise TransitionError(
            [_('Cannot Transition status while adding an amendment')])

    if i.agreement.partner.blocked:
        raise TransitionError([
            _('PD cannot transition to signed if the Partner is Blocked in Vision'
              )
        ])

    return True
Esempio n. 3
0
def transition_to_terminated(i):
    if not i.termination_doc_attachment.exists():
        raise TransitionError(
            [_('Cannot Transition without termination doc attached')])
    if i.in_amendment is True:
        raise TransitionError(
            [_('Cannot Transition status while adding an amendment')])
    return True
Esempio n. 4
0
def transition_to_suspended(i):
    if i.in_amendment is True:
        raise TransitionError(
            [_('Cannot Transition status while adding an amendment')])

    if i.agreement.partner.blocked:
        raise TransitionError(
            [_('PD cannot be suspended if the Partner is Blocked in Vision')])

    return True
Esempio n. 5
0
def transition_to_active(i):
    # Only transitional validation

    # Validation id 1 -> if intervention is PD make sure the agreement is in active status
    if i.document_type in [i.PD, i.SHPD
                           ] and i.agreement.status != i.agreement.SIGNED:
        raise TransitionError([
            _('PD cannot be activated if the associated Agreement is not active'
              )
        ])

    if i.agreement.partner.blocked:
        raise TransitionError(
            [_('PD cannot be activated if the Partner is Blocked in Vision')])
    return True
Esempio n. 6
0
def transition_to_ended(i):
    if i.termination_doc_attachment.exists():
        raise TransitionError(
            [_('Cannot Transition to ended if termination_doc attached')])
    if i.in_amendment is True:
        raise TransitionError(
            [_('Cannot Transition status while adding an amendment')])

    if i.agreement.partner.blocked:
        raise TransitionError([
            _('PD cannot transition to ended if the Partner is Blocked in Vision'
              )
        ])

    return True
Esempio n. 7
0
def transition_to_active(i):
    # Only transitional validation

    # this validation needs to be here in order to attempt the next auto transitional validation
    if i.termination_doc_attachment.exists():
        raise TransitionError(
            [_('Cannot Transition to ended if termination_doc attached')])

    # Validation id 1 -> if intervention is PD make sure the agreement is in active status
    if i.document_type in [i.PD, i.SHPD
                           ] and i.agreement.status != i.agreement.SIGNED:
        raise TransitionError([
            _('PD cannot be activated if the associated Agreement is not active'
              )
        ])

    if i.agreement.partner.blocked:
        raise TransitionError(
            [_('PD cannot be activated if the Partner is Blocked in Vision')])
    return True
Esempio n. 8
0
def agreement_transition_to_ended_valid(agreement):
    today = date.today()
    if agreement.status == agreement.SIGNED and agreement.end and agreement.end < today:
        return True
    raise TransitionError(['agreement_transition_to_ended_invalid'])
Esempio n. 9
0
def transition_to_terminated(i):
    if i.in_amendment is True:
        raise TransitionError(
            [_('Cannot Transition status while adding an amendment')])

    return True
Esempio n. 10
0
def transition_to_closed(i):
    # unicef/etools-issues:820
    # TODO: this is required to go around the caching of intervention.total_frs where self.frs.all() is called
    # TODO: find a sol for invalidating the cache on related .all() -has to do with prefetch_related in the validator
    r = {
        'total_frs_amt': 0,
        'total_frs_amt_usd': 0,
        'total_outstanding_amt': 0,
        'total_outstanding_amt_usd': 0,
        'total_intervention_amt': 0,
        'total_actual_amt': 0,
        'total_actual_amt_usd': 0,
        'earliest_start_date': None,
        'latest_end_date': None
    }
    for fr in i.frs.filter():
        r['total_frs_amt'] += fr.total_amt_local
        r['total_frs_amt_usd'] += fr.total_amt
        r['total_outstanding_amt'] += fr.outstanding_amt_local
        r['total_outstanding_amt_usd'] += fr.outstanding_amt
        r['total_intervention_amt'] += fr.intervention_amt
        r['total_actual_amt'] += fr.actual_amt_local
        r['total_actual_amt_usd'] += fr.actual_amt
        if r['earliest_start_date'] is None:
            r['earliest_start_date'] = fr.start_date
        elif r['earliest_start_date'] > fr.start_date:
            r['earliest_start_date'] = fr.start_date
        if r['latest_end_date'] is None:
            r['latest_end_date'] = fr.end_date
        elif r['latest_end_date'] < fr.end_date:
            r['latest_end_date'] = fr.end_date
    # hack
    i.total_frs = r

    # Make sure that is past the end date
    today = date.today()
    if i.end > today:
        raise TransitionError([_('End date is in the future')])

    if i.total_frs['total_frs_amt'] != i.total_frs['total_actual_amt'] or \
            i.total_frs['total_outstanding_amt'] != 0:
        raise TransitionError([
            _('Total FR amount needs to equal total actual amount, and '
              'Total Outstanding DCTs need to equal to 0')
        ])

    # If total_actual_amt_usd >100,000 then attachments has to include
    # at least 1 record with type: "Final Partnership Review"
    if i.total_frs['total_actual_amt_usd'] >= 100000:
        if i.attachments.filter(
                type__name='Final Partnership Review').count() < 1:
            raise TransitionError([
                _('Total amount transferred greater than 100,000 and no Final Partnership Review '
                  'was attached')
            ])

    # TODO: figure out Action Point Validation once the spec is completed

    if i.in_amendment is True:
        raise TransitionError(
            [_('Cannot Transition status while adding an amendment')])

    if i.agreement.partner.blocked:
        raise TransitionError(
            [_('PD cannot be closed if the Partner is Blocked in Vision')])
    return True
Esempio n. 11
0
def partnership_manager_only(i, user):
    # Transition cannot happen by a user that's not a Partnership Manager
    if not user.groups.filter(name__in=['Partnership Manager']).count():
        raise TransitionError(
            ['Only Partnership Managers can execute this transition'])
    return True