base_language: en-us

entities:

  AbstractCase:

    title:
      Abstract Case

    description:
      This is a case compliant for anything

    type:
      Case

    tile:

      abstract: true

      roles_spec:

        complainant:
          status_spec:
            invite:
              permissions:
                - acceptComplainantInvite
                - declineComplainantInvite
            active:
              permissions:
                # roles
                - inviteComplainant
                - cancelComplainantInvite
                - inviteDefendant
                - inviteWitness
                # details
                - addDamageEvent
                - updateDamageEvent
                - addEvent
                - updateEvent
                - addComment
                - updateComment
                - addCompensation
                - updateCompensation
                - addEvidence
                # publishing
                - callTheJudges
                # judge research
                - acceptJudgeProposal
                - declineJudgeProposal
                # inviting defendant
                - sendDefendandInvite
                - uploadInviteConfirmation
            declined:
              permissions: null

        complainant_representative:
          status_spec:
            invite:
              permissions:
                - acceptInvite
                - declineInvite
            active:
              permissions:
                - addEvent
                - updateEvent
                - addComment
                - updateComment
                - addCompensation
                - updateCompensation
                - addEvidence

        defendant:
          status_spec:
            invite:
              permissions:
                - acceptInvite
                - declineInvite
              expiration:
                - >14d
            active:
              permissions:
                - addEvent
                - addComment
                - proposeCompensation
            expired:
              permissions:
                - answer_case

        defendant_representative:
          status_spec:
            invite:
              permissions:
                - acceptInvite
                - declineInvite
              expiration:
                - >14d
            active:
              permissions:
                - addComment
                - addEvent
                - proposeCompensation
            expired:
              permissions:
                - answer_case

        witness:
          status_spec:
            invite:
              permissions:
                - acceptInvite
                - declineInvite
            active:
              permissions:
                - addComment
                - updateComment
                - addEvent
                - updateEvent

        judge:
          status_spec:
            call:
              permissions:
                - sendJudgeProposal
                - declineJudgeCall
            proposal:
              permissions:
                - cancelProposal
            active:
              permissions:
                - scheduleMeeting
                - startMeeting
                - addComment
                - publishJudgement

      actions:

        inviteComplainant:
          assert:
            and:
              - EQUAL this.status draft
              - self.roles.humanity.human.active
              - or:
                - self.roles.this.complainant.active
                - self.roles.this.complainant_representative.active
          args:
            email: email
            self: id
          code:
              - CONDITION:
                  cond:
                    - email
                  true:
                    - INVITE_self email -> self
                    - CREATE_ROLE self this.complainant.invite
                  false:
                    - CREATE_ROLE self this.complainant.invite

        acceptComplainantInvite:
          assert:
            and:
              - EQUAL this.status draft
              - self.roles.humanity.human.active
              - or:
                - EQUAL self.type human
                - EQUAL self.type company
          code:
              - UPDATE_ROLE_STATUS self.roles.this.invite self.roles.this.active

        declineComplainantInvite:
          assert:
            and:
              - EQUAL this.status draft
              - self.roles.humanity.human.active
              - or:
                - EQUAL self.type human
                - EQUAL self.type company
            code:
              - UPDATE_ROLE_STATUS self.roles.this.invite self.roles.this.declined