$visitId = dbConn::querySingle("SELECT visitId\n                                        FROM :prefix:visit AS v\n                                        INNER JOIN :prefix:patient AS p\n                                        ON p.patientId = v.patient\n                                        INNER JOIN :prefix:user AS u\n                                        ON u.userId = v.user\n                                        WHERE userId = :0 AND patientId = :1", $_POST['userid'], $p['patientId']);
     // check if visit relation already exists
     if (dbConn::querySingle("SELECT COUNT(*) FROM :prefix:visit WHERE user = :0 AND patient = :1", $_POST['userid'], $p['patientId']) < 1) {
         // if not, insert new row into database table
         $t->addStatement("INSERT INTO :prefix:visit (user, patient, relation, description, scent) VALUES (:0, :1, :2, :3, :4)", $_POST['userid'], $p['patientId'], $p['relation'], htmlspecialchars($p['description']), $p['scent']);
     } else {
         // if exists, update row
         $t->addStatement("UPDATE :prefix:visit SET\n                                relation = :0,\n                                description = :1,\n                                scent = :2 \n                              WHERE visitId = :3", $p['relation'], htmlspecialchars($p['description']), $p['scent'], $visitId);
     }
     $t->commit();
     $t = new transaction();
     // commit those changes right now
     /*
      * Update images
      */
     $t->addStatement("DELETE FROM :prefix:visit_media WHERE visitId = :0 AND type = :1", $visitId, 'Image');
     if (isset($p['images']) && is_array($p['images'])) {
         foreach ($p['images'] as $img) {
             $t->addStatement("INSERT INTO :prefix:visit_media (visitId, path, type) VALUES (:0, :1, :2);", $visitId, basename($img), "Image");
         }
     }
     /*
      * Update audios
      */
     $t->addStatement("DELETE FROM :prefix:visit_media WHERE visitId = :0 AND type = :1", $visitId, 'Audio');
     if (isset($p['audios']) && is_array($p['audios'])) {
         foreach ($p['audios'] as $aud) {
             $t->addStatement("INSERT INTO :prefix:visit_media (visitId, path, type) VALUES (:0, :1, :2);", $visitId, basename($aud), "Audio");
         }
     }
 }
if (count($errors) > 0) {
    echo "<ul>";
    foreach ($errors as $err) {
        echo "<li>{$err}</li>";
    }
    die;
}
if (dbConn::querySingle("SELECT COUNT(*) FROM :prefix:plan WHERE \n                            name = :0\n                            public < CURRENT_TIMESTAMP OR \n                            editable < CURRENT_TIMESTAMP", $_POST['plan']) > 1) {
    die("REFRESH");
}
try {
    $t = new transaction();
    // delete removed workers from database
    if (isset($d['deleted'])) {
        foreach ($d['deleted'] as $key => $val) {
            $t->addStatement("DELETE FROM :prefix:worker WHERE production = :0 \n                                                                AND shift = :1\n                                                                AND name = :2\n                                                                AND email = :3", $d['production'], $d['shiftId'], $val['name'], $val['email']);
        }
    }
    // update existing or insert the added workers
    if (isset($d['workers'])) {
        foreach ($d['workers'] as $key => $val) {
            if ($val['action'] == "create") {
                $t->addStatement("INSERT INTO :prefix:worker (name, email, production, plan, shift) VALUES (:0, :1, :2, :3, :4);", htmlspecialchars($val['name']), htmlspecialchars($val['email']), $d['production'], $_POST['plan'], (int) $d['shiftId']);
            } else {
                if ($val['action'] == "update") {
                    $arr = explode("\n", $val['uid']);
                    $t->addStatement("UPDATE :prefix:worker SET name = :0, email = :1 \n                                                            WHERE production = :2 \n                                                                    AND shift = :3\n                                                                    AND name = :4\n                                                                    AND email = :5", htmlspecialchars($val['name']), htmlspecialchars($val['email']), $d['production'], $d['shiftId'], htmlspecialchars($arr[0]), htmlspecialchars($arr[1]));
                } else {
                    echo "unsupported action on user " . $val['name'];
                }
            }
require "../config.php";
require "../transaction.php";
$t = new transaction();
try {
    // delete removed productions
    foreach (dbConn::query("SELECT * FROM :prefix:production WHERE plan = :0", $_POST['plan']) as $r) {
        $deleted = true;
        if (isset($_POST['data'])) {
            foreach ($_POST['data'] as $key => $val) {
                if ($r['name'] == $val['uid']) {
                    $deleted = false;
                }
            }
        }
        if ($deleted) {
            $t->addStatement("DELETE FROM :prefix:production WHERE plan = :0 AND name = :1", $_POST['plan'], $r['name']);
        }
    }
    // update existing productions
    if (isset($_POST['data'])) {
        foreach ($_POST['data'] as $key => $val) {
            $t->addStatement("UPDATE :prefix:production SET name = :0, masterName = :1, masterEmail = :2\n                              WHERE name = :3 AND plan = :4", $val['name'], $val['master']['name'] == "" ? null : $val['master']['name'], $val['master']['email'] == "" ? null : $val['master']['email'], $val['uid'], $_POST['plan']);
            foreach ($val['shifts'] as $sk => $sv) {
                if ($sv['checked'] == "true") {
                    $t->addStatement("REPLACE INTO :prefix:production_shift (production, shift, plan, required) VALUES (:0, :1, :2, :3);", $val['name'], $sv['id'], $_POST['plan'], $sv['max']);
                } else {
                    $t->addStatement("DELETE FROM :prefix:production_shift WHERE production = :0 AND shift = :1", $val['name'], $sv['id']);
                }
            }
        }
    }
                            [id] => 8
                            [from] => 12:00:00
                            [to] => 17:00:00
                        )
                   [1] => Array
                        (
                            [id] => 2
                            [from] => 14:00:00
                            [to] => 18:30:00
                        )
                )
        )
)
*/
try {
    $t = new transaction();
    if (isset($_POST['data']['deleted'])) {
        foreach ($_POST['data']['deleted'] as $del) {
            $t->addStatement("DELETE FROM :prefix:shift WHERE shiftId = :0", $del);
        }
    }
    if (isset($_POST['data']['updated'])) {
        foreach ($_POST['data']['updated'] as $up) {
            $t->addStatement("UPDATE :prefix:shift SET fromDate = :0, toDate = :1 WHERE shiftId = :2", $up['from'], $up['to'], $up['id']);
        }
    }
    $t->commit();
    echo "SUCCESS";
} catch (Exception $ex) {
    echo $ex->getMessage();
}