{
  "meta": {
    "$_POST": [
      {
        "type": "number",
        "name": "id"
      }
    ]
  },
  "exec": {
    "steps": [
      {
        "name": "",
        "module": "auth",
        "action": "restrict",
        "options": {
          "provider": "security",
          "permissions": [
            "Active"
          ]
        }
      },
      {
        "name": "q_todo",
        "module": "dbconnector",
        "action": "single",
        "options": {
          "connection": "db",
          "sql": {
            "type": "SELECT",
            "columns": [
              {
                "table": "t",
                "column": "title"
              },
              {
                "table": "t",
                "column": "description"
              },
              {
                "table": "t",
                "column": "category"
              },
              {
                "table": "t",
                "column": "priority"
              },
              {
                "table": "t",
                "column": "is_financial"
              },
              {
                "table": "t",
                "column": "is_recurring"
              },
              {
                "table": "tr",
                "column": "repeat_type"
              },
              {
                "table": "tr",
                "column": "custom_every"
              },
              {
                "table": "tr",
                "column": "custom_unit"
              },
              {
                "table": "tr",
                "column": "end_date"
              },
              {
                "table": "tr",
                "column": "never_ends"
              },
              {
                "table": "tr",
                "column": "next_due_date"
              }
            ],
            "params": [
              {
                "operator": "equal",
                "type": "expression",
                "name": ":P1",
                "value": "{{$_POST.id}}"
              }
            ],
            "table": {
              "name": "todos",
              "alias": "t"
            },
            "primary": "id",
            "joins": [
              {
                "table": "todo_recurrence",
                "alias": "tr",
                "type": "LEFT",
                "clauses": {
                  "condition": "AND",
                  "rules": [
                    {
                      "table": "tr",
                      "column": "todo_id",
                      "operator": "equal",
                      "value": {
                        "table": "t",
                        "column": "id"
                      }
                    }
                  ]
                }
              }
            ],
            "wheres": {
              "condition": "AND",
              "rules": [
                {
                  "id": "t.id",
                  "field": "t.id",
                  "type": "number",
                  "operator": "equal",
                  "value": "{{$_POST.id}}",
                  "operation": "="
                }
              ],
              "conditional": null,
              "valid": true
            },
            "query": "select `t`.`title`, `t`.`description`, `t`.`category`, `t`.`priority`, `t`.`is_financial`, `t`.`is_recurring`, `tr`.`repeat_type`, `tr`.`custom_every`, `tr`.`custom_unit`, `tr`.`end_date`, `tr`.`never_ends`, `tr`.`next_due_date` from `todos` as `t` left join `todo_recurrence` as `tr` on `tr`.`todo_id` = `t`.`id` where `t`.`id` = ?"
          }
        },
        "output": false,
        "meta": [
          {
            "type": "text",
            "name": "title"
          },
          {
            "type": "text",
            "name": "description"
          },
          {
            "type": "text",
            "name": "category"
          },
          {
            "type": "text",
            "name": "priority"
          },
          {
            "type": "number",
            "name": "is_financial"
          },
          {
            "type": "number",
            "name": "is_recurring"
          },
          {
            "type": "text",
            "name": "repeat_type"
          },
          {
            "type": "number",
            "name": "custom_every"
          },
          {
            "type": "text",
            "name": "custom_unit"
          },
          {
            "type": "date",
            "name": "end_date"
          },
          {
            "type": "number",
            "name": "never_ends"
          },
          {
            "type": "date",
            "name": "next_due_date"
          }
        ],
        "outputType": "object"
      },
      {
        "name": "",
        "module": "core",
        "action": "condition",
        "options": {
          "if": "{{q_todo.is_recurring == 1 && q_todo.repeat_type}}",
          "then": {
            "steps": [
              {
                "name": "calc_next_date",
                "module": "core",
                "action": "setvalue",
                "options": {
                  "key": "calc_next_date",
                  "value": "{{q_todo.repeat_type == 'Daily' ? q_todo.next_due_date.dateAdd('days', 1) : q_todo.repeat_type == 'Weekly' ? q_todo.next_due_date.dateAdd('weeks', 1) : q_todo.repeat_type == 'Monthly' ? q_todo.next_due_date.dateAdd('months', 1) : q_todo.repeat_type == 'Custom' && q_todo.custom_unit == 'Day' ? q_todo.next_due_date.dateAdd('days', q_todo.custom_every) : q_todo.repeat_type == 'Custom' && q_todo.custom_unit == 'Week' ? q_todo.next_due_date.dateAdd('weeks', q_todo.custom_every) : q_todo.repeat_type == 'Custom' && q_todo.custom_unit == 'Month' ? q_todo.next_due_date.dateAdd('months', q_todo.custom_every) : q_todo.next_due_date}}"
                },
                "meta": [],
                "outputType": "text"
              },
              {
                "name": "",
                "module": "core",
                "action": "condition",
                "options": {
                  "if": "{{q_todo.never_ends == 1 || calc_next_date <= q_todo.end_date}}",
                  "then": {
                    "steps": [
                      {
                        "name": "insert_recurring_todo",
                        "module": "dbupdater",
                        "action": "insert",
                        "options": {
                          "connection": "db",
                          "sql": {
                            "type": "insert",
                            "values": [
                              {
                                "table": "todos",
                                "column": "title",
                                "type": "text",
                                "value": "{{q_todo.title}}"
                              },
                              {
                                "table": "todos",
                                "column": "description",
                                "type": "text",
                                "value": "{{q_todo.description}}"
                              },
                              {
                                "table": "todos",
                                "column": "category",
                                "type": "text",
                                "value": "{{q_todo.category}}"
                              },
                              {
                                "table": "todos",
                                "column": "priority",
                                "type": "text",
                                "value": "{{q_todo.priority}}"
                              },
                              {
                                "table": "todos",
                                "column": "due_date",
                                "type": "date",
                                "value": "{{calc_next_date}}"
                              },
                              {
                                "table": "todos",
                                "column": "section",
                                "type": "text",
                                "value": "active"
                              },
                              {
                                "table": "todos",
                                "column": "is_financial",
                                "type": "number",
                                "value": "{{q_todo.is_financial}}"
                              },
                              {
                                "table": "todos",
                                "column": "is_recurring",
                                "type": "number",
                                "value": "1"
                              }
                            ],
                            "table": "todos",
                            "returning": "id",
                            "query": "insert into `todos` (`title`, `description`, `category`, `priority`, `due_date`, `section`, `is_financial`, `is_recurring`) values (?, ?, ?, ?, ?, 'active', ?, 1)",
                            "params": [
                              {
                                "name": ":P1",
                                "type": "expression",
                                "value": "{{q_todo.title}}"
                              },
                              {
                                "name": ":P2",
                                "type": "expression",
                                "value": "{{q_todo.description}}"
                              },
                              {
                                "name": ":P3",
                                "type": "expression",
                                "value": "{{q_todo.category}}"
                              },
                              {
                                "name": ":P4",
                                "type": "expression",
                                "value": "{{q_todo.priority}}"
                              },
                              {
                                "name": ":P5",
                                "type": "expression",
                                "value": "{{calc_next_date}}"
                              },
                              {
                                "name": ":P6",
                                "type": "expression",
                                "value": "{{q_todo.is_financial}}"
                              }
                            ]
                          }
                        },
                        "meta": [
                          {
                            "name": "identity",
                            "type": "text"
                          },
                          {
                            "name": "affected",
                            "type": "number"
                          }
                        ]
                      },
                      {
                        "name": "insert_recurring_rules",
                        "module": "dbupdater",
                        "action": "insert",
                        "options": {
                          "connection": "db",
                          "sql": {
                            "type": "insert",
                            "values": [
                              {
                                "table": "todo_recurrence",
                                "column": "todo_id",
                                "type": "number",
                                "value": "{{insert_recurring_todo.identity}}"
                              },
                              {
                                "table": "todo_recurrence",
                                "column": "repeat_type",
                                "type": "text",
                                "value": "{{q_todo.repeat_type}}"
                              },
                              {
                                "table": "todo_recurrence",
                                "column": "custom_every",
                                "type": "number",
                                "value": "{{q_todo.custom_every}}"
                              },
                              {
                                "table": "todo_recurrence",
                                "column": "custom_unit",
                                "type": "text",
                                "value": "{{q_todo.custom_unit}}"
                              },
                              {
                                "table": "todo_recurrence",
                                "column": "end_date",
                                "type": "date",
                                "value": "{{q_todo.end_date}}"
                              },
                              {
                                "table": "todo_recurrence",
                                "column": "never_ends",
                                "type": "number",
                                "value": "{{q_todo.never_ends}}"
                              },
                              {
                                "table": "todo_recurrence",
                                "column": "next_due_date",
                                "type": "date",
                                "value": "{{calc_next_date}}"
                              }
                            ],
                            "table": "todo_recurrence",
                            "returning": "id",
                            "query": "insert into `todo_recurrence` (`todo_id`, `repeat_type`, `custom_every`, `custom_unit`, `end_date`, `never_ends`, `next_due_date`) values (?, ?, ?, ?, ?, ?, ?)",
                            "params": [
                              {
                                "name": ":P1",
                                "type": "expression",
                                "value": "{{insert_recurring_todo.identity}}"
                              },
                              {
                                "name": ":P2",
                                "type": "expression",
                                "value": "{{q_todo.repeat_type}}"
                              },
                              {
                                "name": ":P3",
                                "type": "expression",
                                "value": "{{q_todo.custom_every}}"
                              },
                              {
                                "name": ":P4",
                                "type": "expression",
                                "value": "{{q_todo.custom_unit}}"
                              },
                              {
                                "name": ":P5",
                                "type": "expression",
                                "value": "{{q_todo.end_date}}"
                              },
                              {
                                "name": ":P6",
                                "type": "expression",
                                "value": "{{q_todo.never_ends}}"
                              },
                              {
                                "name": ":P7",
                                "type": "expression",
                                "value": "{{calc_next_date}}"
                              }
                            ]
                          }
                        }
                      }
                    ]
                  }
                }
              }
            ]
          }
        }
      },
      {
        "name": "mark_completed",
        "module": "dbupdater",
        "action": "update",
        "options": {
          "connection": "db",
          "sql": {
            "type": "update",
            "values": [
              {
                "table": "todos",
                "column": "section",
                "type": "text",
                "value": "completed"
              },
              {
                "table": "todos",
                "column": "completed_at",
                "type": "datetime",
                "value": "NOW"
              }
            ],
            "table": "todos",
            "wheres": {
              "condition": "AND",
              "rules": [
                {
                  "id": "id",
                  "field": "id",
                  "type": "number",
                  "operator": "equal",
                  "value": "{{$_POST.id}}",
                  "operation": "="
                }
              ],
              "conditional": null,
              "valid": true
            },
            "query": "update `todos` set `section` = 'completed', `completed_at` = NOW() where `id` = ?",
            "params": [
              {
                "name": ":P1",
                "type": "expression",
                "value": "{{$_POST.id}}"
              }
            ]
          }
        },
        "meta": [
          {
            "name": "affected",
            "type": "number"
          }
        ]
      }
    ]
  }
}