How to implement multiple approvals with emails? I am currently using the Webform module, but I can't find a way to make a workflow that works for what I am trying to do.

Please let me know if I am approaching this incorrectly, or if I should be using a different module.

This is basically how I want the steps to work:


User fills out a Webform and submits it. (one of the fields in the form is his/her supervisor's email). The form then enters a state called "Pending"
The form is sent to the entered Supervisor's email.
If the Supervisor wants to approve it, he/she will change the state to "Approved". If he/she feels that more approval from someone higher up is required, then he/she can change the state to "More Approval" needed and then enter the email of their supervisor.
If the Supervisor's Supervisor likes it, then he/she can change the state to "Approved"
When the state is at approved, HR is notified.




Is doing something like this possible? If so, how can it be done?
Instead of using the Webform module for this, I would use a custom content type for this, with the fields similar to what your webform is using. And instead of submitting a webform, a node of this custom content type is to be created.

This content type should have these fields:


A field to reflect the "state" (Pending or Approved, maybe also a state like "Escalated"?), say you name this field like field_approval_status.
An "entity reference" field to select the Supervisor.


With the above setup, you could use the Rules module to notify the Supervisor, using a rule that is similar to the rule included in my answer to "How to send an email via a Rules action using a field key?", and which looks like so:

{ "rules_notify_reviewer_about_outstanding_approval" : {
    "LABEL" : "Notify reviewer about outstanding approval",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "ON" : { "node_insert--blog" : { "bundle" : "blog" } },
    "IF" : [
      { "entity_has_field" : { "entity" : [ "node" ], "field" : "field_blog_reviewer" } }
    ],
    "DO" : [
      { "mail" : {
          "to" : "[node:field-blog-reviewer]",
          "subject" : "Blog Post waiting your approval",
          "message" : "[node:author] has submitted a new Blog post waiting your approval.\r\n\r\nYou can review it at: [node:edit-url].",
          "language" : [ "" ]
        }
      }
    ]
  }
}


If the supervisor then wants to forward it to another supervisor, all that's needed is to edit the node and change the selected supervisor to another one.

You may want to add some extra logic and/or permissions related to such field_approval_status field, i.e. to ensure that when such node is created, the author cannot set it to "Approved" right away (only to "Pending"?). That's something you could do using the Rules module (to validate/enforce that), or you might want to use the Field Permissions module for that.

Note:

To avoid that creating nodes is too intimidating for most users, you want to look at the Simplify module also, which helps to de-clutter forms. Here is a quote from its project page:


  Simplify allows particular fields to be hidden from the user interface. This helps to de-clutter forms and present a more user-friendly experience to content editors.