diff --git a/langs/en/labels.json b/langs/en/labels.json index facae01..6a42754 100644 --- a/langs/en/labels.json +++ b/langs/en/labels.json @@ -7,8 +7,12 @@ "Adult": "Adult", "Adults": "Adults", "Youth": "Youth", + "Days": "Days", + "Position": "Position", + "Parent Phone": "Parent Phone", "Total Income": "Total Income", "Card Payments": "Card Payments", + "Camp Coupon/Scout Bucks": "Camp Coupon/Scout Bucks", "First": "First", "Last": "Last", "Last Name": "Last Name", diff --git a/lib/mkmemberdirectory.php b/lib/mkmemberdirectory.php deleted file mode 100644 index 91d3766..0000000 --- a/lib/mkmemberdirectory.php +++ /dev/null @@ -1,224 +0,0 @@ -hasPermission("HACHEPORTAL_VIEW")) { - header("Location: ../app.php?msg=no_permission"); - die(); -} - -use Dompdf\Dompdf; - -// Load all families -$familylist = $database->select("families", "familyid", ["ORDER" => ["familyname"]]); -$families = []; -foreach ($familylist as $f) { - $fam = (new Family())->load($f); - if ($fam->getPrivate()) { - continue; - } - $families[] = $fam; -} - -$format = "html"; -if (!empty($_GET["format"])) { - $format = $_GET["format"]; -} - -$date = date("F j Y"); - -if ($format == "html") { - - $icons = ".grad { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMjMwNCIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMjMwNCAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNzc0IDgzNmwxOCAzMTZxNCA2OS04MiAxMjh0LTIzNSA5My41LTMyMyAzNC41LTMyMy0zNC41LTIzNS05My41LTgyLTEyOGwxOC0zMTYgNTc0IDE4MXEyMiA3IDQ4IDd0NDgtN3ptNTMwLTMyNHEwIDIzLTIyIDMxbC0xMTIwIDM1MnEtNCAxLTEwIDF0LTEwLTFsLTY1Mi0yMDZxLTQzIDM0LTcxIDExMS41dC0zNCAxNzguNXE2MyAzNiA2MyAxMDkgMCA2OS01OCAxMDdsNTggNDMzcTIgMTQtOCAyNS05IDExLTI0IDExaC0xOTJxLTE1IDAtMjQtMTEtMTAtMTEtOC0yNWw1OC00MzNxLTU4LTM4LTU4LTEwNyAwLTczIDY1LTExMSAxMS0yMDcgOTgtMzMwbC0zMzMtMTA0cS0yMi04LTIyLTMxdDIyLTMxbDExMjAtMzUycTQtMSAxMC0xdDEwIDFsMTEyMCAzNTJxMjIgOCAyMiAzMXoiLz48L3N2Zz4='); - } - .phone { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNjAwIDEyNDBxMCAyNy0xMCA3MC41dC0yMSA2OC41cS0yMSA1MC0xMjIgMTA2LTk0IDUxLTE4NiA1MS0yNyAwLTUzLTMuNXQtNTcuNS0xMi41LTQ3LTE0LjUtNTUuNS0yMC41LTQ5LTE4cS05OC0zNS0xNzUtODMtMTI3LTc5LTI2NC0yMTZ0LTIxNi0yNjRxLTQ4LTc3LTgzLTE3NS0zLTktMTgtNDl0LTIwLjUtNTUuNS0xNC41LTQ3LTEyLjUtNTcuNS0zLjUtNTNxMC05MiA1MS0xODYgNTYtMTAxIDEwNi0xMjIgMjUtMTEgNjguNS0yMXQ3MC41LTEwcTE0IDAgMjEgMyAxOCA2IDUzIDc2IDExIDE5IDMwIDU0dDM1IDYzLjUgMzEgNTMuNXEzIDQgMTcuNSAyNXQyMS41IDM1LjUgNyAyOC41cTAgMjAtMjguNSA1MHQtNjIgNTUtNjIgNTMtMjguNSA0NnEwIDkgNSAyMi41dDguNSAyMC41IDE0IDI0IDExLjUgMTlxNzYgMTM3IDE3NCAyMzV0MjM1IDE3NHEyIDEgMTkgMTEuNXQyNCAxNCAyMC41IDguNSAyMi41IDVxMTggMCA0Ni0yOC41dDUzLTYyIDU1LTYyIDUwLTI4LjVxMTQgMCAyOC41IDd0MzUuNSAyMS41IDI1IDE3LjVxMjUgMTUgNTMuNSAzMXQ2My41IDM1IDU0IDMwcTcwIDM1IDc2IDUzIDMgNyAzIDIxeiIvPjwvc3ZnPg=='); - } - .email { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNjY0IDE1MDR2LTc2OHEtMzIgMzYtNjkgNjYtMjY4IDIwNi00MjYgMzM4LTUxIDQzLTgzIDY3dC04Ni41IDQ4LjUtMTAyLjUgMjQuNWgtMnEtNDggMC0xMDIuNS0yNC41dC04Ni41LTQ4LjUtODMtNjdxLTE1OC0xMzItNDI2LTMzOC0zNy0zMC02OS02NnY3NjhxMCAxMyA5LjUgMjIuNXQyMi41IDkuNWgxNDcycTEzIDAgMjIuNS05LjV0OS41LTIyLjV6bTAtMTA1MXYtMjQuNWwtLjUtMTMtMy0xMi41LTUuNS05LTktNy41LTE0LTIuNWgtMTQ3MnEtMTMgMC0yMi41IDkuNXQtOS41IDIyLjVxMCAxNjggMTQ3IDI4NCAxOTMgMTUyIDQwMSAzMTcgNiA1IDM1IDI5LjV0NDYgMzcuNSA0NC41IDMxLjUgNTAuNSAyNy41IDQzIDloMnEyMCAwIDQzLTl0NTAuNS0yNy41IDQ0LjUtMzEuNSA0Ni0zNy41IDM1LTI5LjVxMjA4LTE2NSA0MDEtMzE3IDU0LTQzIDEwMC41LTExNS41dDQ2LjUtMTMxLjV6bTEyOC0zN3YxMDg4cTAgNjYtNDcgMTEzdC0xMTMgNDdoLTE0NzJxLTY2IDAtMTEzLTQ3dC00Ny0xMTN2LTEwODhxMC02NiA0Ny0xMTN0MTEzLTQ3aDE0NzJxNjYgMCAxMTMgNDd0NDcgMTEzeiIvPjwvc3ZnPg=='); - } - .mapmarker { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xMTUyIDY0MHEwLTEwNi03NS0xODF0LTE4MS03NS0xODEgNzUtNzUgMTgxIDc1IDE4MSAxODEgNzUgMTgxLTc1IDc1LTE4MXptMjU2IDBxMCAxMDktMzMgMTc5bC0zNjQgNzc0cS0xNiAzMy00Ny41IDUydC02Ny41IDE5LTY3LjUtMTktNDYuNS01MmwtMzY1LTc3NHEtMzMtNzAtMzMtMTc5IDAtMjEyIDE1MC0zNjJ0MzYyLTE1MCAzNjIgMTUwIDE1MCAzNjJ6Ii8+PC9zdmc+'); - } - .nocamera { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9IjEwOTYuNTEwNyIKICAgaGVpZ2h0PSIxMDk2LjUxMDYiCiAgIHZpZXdCb3g9IjAgMCAxMDk2LjUxMDcgMTA5Ni41MTA2IgogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmc5MDUiCiAgIHNvZGlwb2RpOmRvY25hbWU9Im5vLWNhbWVyYS5zdmciCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTIuMyAoMjQwNTU0NiwgMjAxOC0wMy0xMSkiCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL2hvbWUvc2t5bGFyL0RvY3VtZW50cy9Bc3NldHMvR3JhcGhpY3Mvbm8tY2FtZXJhLnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjEuNDAwODA3MyIKICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjEuNDAwODA3MyI+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhOTExIj4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzOTA5IiAvPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDExIgogICAgIGlkPSJuYW1lZHZpZXc5MDciCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjAuMjA5ODIxNDMiCiAgICAgaW5rc2NhcGU6Y3g9Ii0yNjIuODIyNTUiCiAgICAgaW5rc2NhcGU6Y3k9IjQ4OC43NDczNSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzkwNSIKICAgICBmaXQtbWFyZ2luLXRvcD0iMCIKICAgICBmaXQtbWFyZ2luLWxlZnQ9IjAiCiAgICAgZml0LW1hcmdpbi1yaWdodD0iMCIKICAgICBmaXQtbWFyZ2luLWJvdHRvbT0iMCIgLz4KICA8cGF0aAogICAgIHN0eWxlPSJzdHJva2Utd2lkdGg6Mi4yMTA3MDY5NSIKICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgIGQ9Ik0gNTQ4LjI1NTI4LDAgQyAyNDUuNDYzNiwwIDAsMjQ1LjQ2MTQzIDAsNTQ4LjI1NTMzIGMgMCwzMDIuNzkzODggMjQ1LjQ2MzYsNTQ4LjI1NTI3IDU0OC4yNTUyOCw1NDguMjU1MjcgMzAyLjc5MTgsMCA1NDguMjU1NTIsLTI0NS40NjM1OSA1NDguMjU1NTIsLTU0OC4yNTUyNyBDIDEwOTYuNTEwOCwyNDUuNDYzNjQgODUxLjA0OTI4LDAgNTQ4LjI1NTI4LDAgWiBtIDI4Ny42MzA4LDI2MC42MjQ2NyBjIDE0NC42ODYzLDE0NC42ODYzNyAxNTQuNzQ5NSwzNjUuODMwMDcgNDUuNzEwOCw1MjAuOTI0MzQgTCAzMTQuOTU5NDEsMjE0LjkxNjA5IGMgMTU1LjIwMDQsLTEwOS4xMTE2NSAzNzYuMzE5ODcsLTk4Ljg5NTk4IDUyMC45MjY2Nyw0NS43MDg1OCB6IE0gMjYwLjYyNDYsODM1Ljg4NTkxIEMgMTE1LjkzODMsNjkxLjE5OTYxIDEwNS44NzUyLDQ3MC4wNTYwMyAyMTQuOTEzOCwzMTQuOTYxNjQgbCA1NjYuNjM3NDgsNTY2LjYzMjk3IGMgLTE1NS4xOTgzLDEwOS4xMTE2IC0zNzYuMzE5ODcsOTguODk4MSAtNTIwLjkyNjY4LC00NS43MDg3IHoiCiAgICAgaWQ9InBhdGgxMDQxIiAvPgogIDxwYXRoCiAgICAgZD0ibSA1NDguMjU1MzgsNDg5LjkyOTA2IHEgNDMuMzgwMSwwIDc0LjE4MzcsMzAuODAzNTUgMzAuODAzNSwzMC44MDM1NCAzMC44MDM1LDc0LjE4MzY5IDAsNDMuMzgwMTUgLTMwLjgwMzUsNzQuMTgzNzEgLTMwLjgwMzYsMzAuODAzNSAtNzQuMTgzNywzMC44MDM1IC00My4zODAxNywwIC03NC4xODM2NywtMzAuODAzNSAtMzAuODAzNTUsLTMwLjgwMzU2IC0zMC44MDM1NSwtNzQuMTgzNzEgMCwtNDMuMzgwMTUgMzAuODAzNTUsLTc0LjE4MzY5IDMwLjgwMzUsLTMwLjgwMzU1IDc0LjE4MzY3LC0zMC44MDM1NSB6IG0gMjU2LjYzNTUsLTE1MS42NDgyMyBxIDM4LjY0MTEsMCA2NS45ODE1LDI3LjM0MDQyIDI3LjM0MDQsMjcuMzQwNDMgMjcuMzQwNCw2NS45ODE1NyB2IDMyNi42MjY5OSBxIDAsMzguNjQxMSAtMjcuMzQwNCw2NS45ODE2IC0yNy4zNDA0LDI3LjM0MDQgLTY1Ljk4MTUsMjcuMzQwNCBIIDI5MS42MTk5MyBxIC0zOC42NDExOCwwIC02NS45ODE1OCwtMjcuMzQwNCAtMjcuMzQwNCwtMjcuMzQwNSAtMjcuMzQwNCwtNjUuOTgxNiBWIDQzMS42MDI4MiBxIDAsLTM4LjY0MTEzIDI3LjM0MDQsLTY1Ljk4MTU3IDI3LjM0MDQsLTI3LjM0MDQyIDY1Ljk4MTU4LC0yNy4zNDA0MiBoIDgxLjY1Njc0IGwgMTguNTkxNDksLTQ5LjU3NzMxIHEgNi45MjYyNCwtMTcuODYyNDEgMjUuMzM1NDYsLTMwLjgwMzU0IDE4LjQwOTIyLC0xMi45NDExNCAzNy43Mjk3OSwtMTIuOTQxMTQgaCAxODYuNjQzOTcgcSAxOS4zMjA1LDAgMzcuNzI5OCwxMi45NDExNCAxOC40MDkyLDEyLjk0MTEzIDI1LjMzNTQsMzAuODAzNTQgbCAxOC41OTE1LDQ5LjU3NzMxIHogbSAtMjU2LjYzNTUsNDE5Ljk0ODk4IHEgNjcuNDM5NywwIDExNS4zNzY2LC00Ny45MzY5IDQ3LjkzNjksLTQ3LjkzNjkgNDcuOTM2OSwtMTE1LjM3NjYgMCwtNjcuNDM5NzIgLTQ3LjkzNjksLTExNS4zNzY2IC00Ny45MzY5LC00Ny45MzY4OCAtMTE1LjM3NjYsLTQ3LjkzNjg4IC02Ny40Mzk3LDAgLTExNS4zNzY1OCw0Ny45MzY4OCAtNDcuOTM2ODgsNDcuOTM2ODggLTQ3LjkzNjg4LDExNS4zNzY2IDAsNjcuNDM5NyA0Ny45MzY4OCwxMTUuMzc2NiA0Ny45MzY4OCw0Ny45MzY5IDExNS4zNzY1OCw0Ny45MzY5IHoiCiAgICAgaWQ9InBhdGg5MDMiCiAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICBzdHlsZT0ic3Ryb2tlLXdpZHRoOjAuMzY0NTM5MDMiIC8+CiAgPHBhdGgKICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlLXdpZHRoOjIuMjEwNzA2OTUiCiAgICAgZD0ibSAzOTEuMDE3MDgsMjY3Ljk2NjI2IC0xNy43NDAyLDQ3LjMwNjYgaCAtODEuNjU2MyBjIC0xNS43ODY4LDAgLTMwLjE1NzcsMy40MjgyIC00My4xMTUyLDEwLjI3MzQgbCAxNjAuNTQzLDE2MC41NDExIGMgNi41OTM2LC0xMC40MDExIDE0LjUzMDEsLTIwLjI1NDcgMjMuODMwMSwtMjkuNTU0NyAyOC4xMjA4LC0yOC4xMjA5IDYxLjI3ODgsLTQzLjg2MzkgOTkuNDY2NywtNDcuMjQwMyB6IG0gMTU3LjIzODMsMTk4Ljk1NSBjIC0yOC45MjAxLDAgLTUzLjY0NzksMTAuMjY3MSAtNzQuMTgzNiwzMC44MDI4IC05LjU1NTgsOS41NTU4IC0xNi44ODQ5LDIwLjAyMTMgLTIxLjk5NDEsMzEuMzkyNiBsIDEzOC45NzA3LDEzOC45Njg3NSBjIDExLjM3MDQsLTUuMTA5MyAyMS44MzU0LC0xMi40MzkxIDMxLjM5MDYsLTIxLjk5NDE1IDIwLjUzNTcsLTIwLjUzNTcgMzAuODAyNywtNDUuMjYzNSAzMC44MDI3LC03NC4xODM2IDAsLTIzLjI3NTYgLTYuNjU1MiwtNDMuODMzMSAtMTkuOTU3LC02MS42Nzc4IGwgLTIzLjM0NzcsLTIzLjM0NTcgYyAtMTcuODQ1NywtMTMuMzA0MSAtMzguNDA0MSwtMTkuOTYyOSAtNjEuNjgxNiwtMTkuOTYyOSB6IG0gMTYyLjYxNzIsMTIwLjg5NjUgYyAtMy4zNzYsMzguMTg4OSAtMTkuMTE4OSw3MS4zNDU0NSAtNDcuMjQwMiw5OS40NjY4NSAtOS4yOTk2LDkuMjk5NSAtMTkuMTU0MiwxNy4yMzY3IC0yOS41NTQ3LDIzLjgzMDEgbCAxMTcuNDMxNiwxMTcuNDI5NiBoIDUzLjM4MDkgYyAyNS43NjA3LDAgNDcuNzU1NSwtOS4xMTI5IDY1Ljk4MjQsLTI3LjMzOTggMTguMjI2OSwtMTguMjI3MSAyNy4zMzk4LC00MC4yMjE4IDI3LjMzOTgsLTY1Ljk4MjUgdiAtMi40MDA0IGMgLTUuMTk1OSw4Ljc0NzcgLTEwLjcyMDcsMTcuMzM0NiAtMTYuNjE1MiwyNS43MTg5IHogbSAtNTEyLjU3NDIsMTQ1LjExMzM1IHYgMi4yOTEgYyAwLDI1Ljc2MDcgOS4xMTI5LDQ3Ljc1NTQgMjcuMzM5OCw2NS45ODI0IDE0LjM4MTMsMTQuMzgxMyAzMS4xMTAyLDIzLjA4MyA1MC4xODE3LDI2LjExNzIgLTUuMTUwNywtNC42NTc3IC0xMC4yMjAxLC05LjQ2OCAtMTUuMTk1MywtMTQuNDQzMyAtMjQuNjYyNCwtMjQuNjYyNCAtNDUuNDA5OCwtNTEuNTQ3OCAtNjIuMzI2MiwtNzkuOTQ3MyB6IgogICAgIGlkPSJwYXRoMTA0MS0zIiAvPgo8L3N2Zz4K'); - }"; - - - $htmltop = << -HACHE Member Directory - -

HACHE Member Directory

-

- Updated: $date -
- Icon key: - : Graduated student | : Photo permission denied -
- You agree to use the information in this directory for homeschool use ONLY. All other purposes, such as soliciting, is strictly prohibited. -

- -
-END; - - $htmlmiddle = ""; - - $currentletter = " "; - - foreach ($families as $f) { - // Add headings for letters - if (strtoupper($f->getName()[0]) > $currentletter) { - $currentletter = strtoupper($f->getName()[0]); - $htmlmiddle .= "\n

$currentletter

\n"; - } - $famhtml = "\n
\n" - . "\t" . $f->getName() . ", " . $f->getFather() . " and " . $f->getMother() . "\n"; - if (!$f->getPhotoPermission()) { - $famhtml .= "\t\n"; - } - $famhtml .= "\t
" . $f->getAddress() . ", " . $f->getCity() . ", " . $f->getState() . " " . $f->getZip() . "\n" - . "\t
getPhone() . "\">" . $f->getPhone() . "    getEmail() . "\">" . $f->getEmail() . "\n"; - foreach ($f->getChildren() as $child) { - $famhtml .= "\t
\n"; - if ($child->isGraduated()) { - $famhtml .= "\t\t\n"; - } else { - $famhtml .= "\t\t\n"; - } - $famhtml .= "\t\t" . $child->getName() . ", " . date("M y", $child->getBirthday()) . "\n"; - $famhtml .= "\t
\n"; - } - $famhtml .= "
\n"; - $htmlmiddle .= $famhtml; - } - - $htmlbottom = << -END; - - $html = $htmltop . $htmlmiddle . $htmlbottom; - - header("Content-Type: text/html; charset=UTF-8"); - echo $html; -} else { - \PhpOffice\PhpWord\Settings::setOutputEscapingEnabled(true); - $phpWord = new \PhpOffice\PhpWord\PhpWord(); - - $properties = $phpWord->getDocInfo(); - $properties->setCreator('HACHE Membership Portal'); - $properties->setCompany('HACHE'); - $properties->setTitle('HACHE Member Directory'); - - $phpWord->addTitleStyle(1, ['bold' => true, 'size' => 24, 'alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]); - $phpWord->addTitleStyle(2, ['bold' => true, 'size' => 16]); - - $header = $phpWord->addSection(["paperSize" => "Letter", 'marginLeft' => 600, 'marginRight' => 600, 'marginTop' => 600, 'marginBottom' => 600]); - $header->addTitle("HACHE Member Directory\n", 1); - $updated = $header->addTextRun(); - $updated->addText("Updated: ", ['bold' => true]); - $updated->addText("$date"); - $iconkey = $header->addTextRun(); - $iconkey->addText("Icon key: ", ['bold' => true]); - $iconkey->addText("●: Graduated student | ►: Photo permission denied"); - $header->addText($Strings->get("You agree to use the information in this directory for homeschool use ONLY. All other purposes, such as soliciting, is strictly prohibited.", false)); - - $header->addTextBreak(2); - - $body = $phpWord->addSection(['breakType' => 'continuous', 'colsNum' => 2, "paperSize" => "Letter", 'marginLeft' => 600, 'marginRight' => 600, 'marginTop' => 600, 'marginBottom' => 600]); - - $currentletter = " "; - - foreach ($families as $f) { - // Add headings for letters - if (strtoupper($f->getName()[0]) > $currentletter) { - $currentletter = strtoupper($f->getName()[0]); - $body->addTitle("$currentletter", 2); - } - $famtext = $body->addTextRun(); - if (!$f->getPhotoPermission()) { - $famtext->addText("►"); - } - $famtext->addText($f->getName(), ['bold' => true]); - $famtext->addText(", " . $f->getFather() . " and " . $f->getMother()); - $body->addText($f->getAddress() . ", " . $f->getCity() . ", " . $f->getState() . " " . $f->getZip()); - $links = $body->addTextRun(); - $links->addLink("tel:" . $f->getPhone(), $f->getPhone()); - $links->addText(" "); - $links->addLink("mailto:" . $f->getEmail(), $f->getEmail()); - - foreach ($f->getChildren() as $child) { - $chtext = $body->addTextRun(["indent" => 1440]); - if ($child->isGraduated()) { - $chtext->addText(" ● "); - } else { - $chtext->addText(" "); - } - $chtext->addText($child->getName() . ", " . date("M y", $child->getBirthday())); - } - $body->addTextBreak(1); - } - - header("Content-Description: File Transfer"); - header('Content-Transfer-Encoding: binary'); - header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); - header('Expires: 0'); - - switch ($format) { - case "docx": - $phpWord->getCompatibility()->setOoxmlVersion(15); - $objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007'); - header("Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document"); - header("Content-disposition: attachment; filename=\"HACHE_Directory_" . date("Y-m-d") . ".docx\""); - break; - case "odt": - default: - // Paper size is stuck at A4 and margins don't work. - // See https://github.com/PHPOffice/PHPWord/issues/1531 - // Hopefully they'll get this fixed. - $objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'ODText'); - header("Content-Type: application/vnd.oasis.opendocument.text"); - header("Content-disposition: attachment; filename=\"HACHE_Directory_" . date("Y-m-d") . ".odt\""); - break; - } - $objWriter->save('php://output'); -} -?> \ No newline at end of file diff --git a/lib/reports.php b/lib/reports.php index 69a5604..c77d126 100644 --- a/lib/reports.php +++ b/lib/reports.php @@ -32,85 +32,183 @@ if (LOADED) { * @param array $filter Medoo WHERE clause. * @return string */ -function getMemberReport($filter = []): Report { +function getPeopleReport($filter = ""): Report { global $database, $Strings; if (empty($filter)) { - $report = new Report($Strings->get("Families", false)); + $report = new Report($Strings->get("People", false)); $filter = ["ORDER" => ["familyname" => "ASC"]]; } else { - $report = new Report($Strings->get("Expiring Memberships", false)); + $report = new Report($Strings->get("$filter", false)); } - $familyids = $database->select( - "families", "familyid", $filter - ); - - $report->setHeader([ - $Strings->get("Name", false), - $Strings->get("Father", false), - $Strings->get("Mother", false), - $Strings->get("Phone", false), - $Strings->get("Email", false), - $Strings->get("Address", false), - $Strings->get("City", false), - $Strings->get("State", false), - $Strings->get("ZIP", false), - $Strings->get("Photo Permission", false), - $Strings->get("Newsletter", false), - $Strings->get("Expires", false), - $Strings->get("Private", false), - $Strings->get("Children", false), - ]); - $families = []; - foreach ($familyids as $id) { - $f = (new Family())->load($id); - $families[] = $f; + $join = []; + $where = []; + $header = []; + switch ($filter) { + case "Campers": + $join = ["[>]campers" => ["camperid" => "camperid"]]; + $where = ["people.camperid[!]" => null]; + $header = [ + $Strings->get("First", false), + $Strings->get("Last", false), + $Strings->get("Parent", false), + $Strings->get("Unit", false), + $Strings->get("Rank", false), + $Strings->get("Phone", false), + $Strings->get("Email", false), + $Strings->get("Address", false), + $Strings->get("ZIP", false), + $Strings->get("Shirt", false), + $Strings->get("Sex", false) + ]; + break; + case "Adults": + $join = ["[>]adults" => ["adultid" => "adultid"]]; + $where = ["people.adultid[!]" => null]; + $header = [ + $Strings->get("First", false), + $Strings->get("Last", false), + $Strings->get("Phone", false), + $Strings->get("Email", false), + $Strings->get("Address", false), + $Strings->get("ZIP", false), + $Strings->get("Days", false), + $Strings->get("Position", false), + $Strings->get("Shirt", false), + $Strings->get("Sex", false) + ]; + break; + case "Youth": + $join = ["[>]youth" => ["youthid" => "youthid"]]; + $where = ["people.youthid[!]" => null]; + $header = [ + $Strings->get("First", false), + $Strings->get("Last", false), + $Strings->get("Parent", false), + $Strings->get("Phone", false), + $Strings->get("Parent Phone", false), + $Strings->get("Email", false), + $Strings->get("Address", false), + $Strings->get("ZIP", false), + $Strings->get("Days", false), + $Strings->get("Position", false), + $Strings->get("Shirt", false), + $Strings->get("Sex", false) + ]; + break; + default: + $header = [ + $Strings->get("First", false), + $Strings->get("Last", false), + $Strings->get("Type", false), + $Strings->get("Phone", false), + $Strings->get("Email", false), + $Strings->get("Address", false), + $Strings->get("ZIP", false), + $Strings->get("Shirt", false), + $Strings->get("Sex", false) + ]; } - foreach ($families as $f) { - $newsletter = ""; - switch ($f->getNewsletter()) { - case 1: - $newsletter = $Strings->get("Email", false); + + if (empty($join)) { + $people = $database->select("people", '*', $where); + } else { + $people = $database->select("people", $join, '*', $where); + } + + $report->setHeader($header); + + foreach ($people as $p) { + $row = []; + + $type = "Unknown"; + if (!empty($p['camperid'])) { + $type = $Strings->get("Camper", false); + } else if (!empty($p['adultid'])) { + $type = $Strings->get("Adult", false); + } else if (!empty($p['youthid'])) { + $type = $Strings->get("Youth", false); + } + + switch ($filter) { + case "Campers": + $row = [ + $p['firstname'], + $p['lastname'], + $p['parentname'], + $p['unit'], + $p['rank'], + $p['phone1'], + $p['email'], + $p['address'], + $p['zip'], + $p['shirt'], + $p['sex'] + ]; break; - case 2: - $newsletter = $Strings->get("Print", false); + case "Adults": + $row = [ + $p['firstname'], + $p['lastname'], + $p['phone1'], + $p['email'], + $p['address'], + $p['zip'], + $p['days'], + $p['position'], + $p['shirt'], + $p['sex'] + ]; break; - case 3: - $newsletter = $Strings->get("Email+Print", false); + case "Youth": + $row = [ + $p['firstname'], + $p['lastname'], + $p['parentname'], + $p['phone1'], + $p['phone2'], + $p['email'], + $p['address'], + $p['zip'], + $p['days'], + $p['position'], + $p['shirt'], + $p['sex'] + ]; break; + default: + $row = [ + $p['firstname'], + $p['lastname'], + $type, + $p['phone1'] . (empty($p['phone2']) ? "" : " " . $p['phone2']), + $p['email'], + $p['address'], + $p['zip'], + $p['shirt'], + $p['sex'] + ]; } - $children = []; - foreach ($f->getChildren() as $c) { - $children[] = $c->getName() . " (" . date("n/d", $c->getBirthday()) . ")"; - } - $report->addDataRow([ - $f->getName(), - $f->getFather(), - $f->getMother(), - $f->getPhone() . "", - $f->getEmail(), - $f->getAddress(), - $f->getCity(), - $f->getState(), - $f->getZip() . "", - $f->getPhotoPermission() ? $Strings->get("Yes", false) : $Strings->get("No", false), - $newsletter, - date("Y-m-d", $f->getExpires()), - $f->getPrivate() ? $Strings->get("Yes", false) : $Strings->get("No", false), - implode(", ", $children) - ]); + + $report->addDataRow($row); } return $report; } function getReport($type): Report { switch ($type) { - case "members": - return getMemberReport(); + case "campers": + return getPeopleReport("Campers"); + break; + case "adults": + return getPeopleReport("Adults"); + break; + case "youth": + return getPeopleReport("Youth"); break; - case "expiring": - return getMemberReport(["expires[<]" => date("Y-m-d", strtotime("+1 month")), "ORDER" => ["expires" => "ASC"]]); + case "people": + return getPeopleReport(""); break; default: return new Report("error", ["ERROR"], ["Invalid report type."]); diff --git a/pages/reports.php b/pages/reports.php index 4858530..cef04d4 100644 --- a/pages/reports.php +++ b/pages/reports.php @@ -20,47 +20,58 @@ if (!$user->hasPermission("HACHEPORTAL_VIEW")) {
-
-

get("Member Directory"); ?>

-

get("A formatted and up-to-date HACHE member directory."); ?>

- - get("Office (ODT)"); ?> + + + -
-

get("Family List"); ?>

-

get("All the data from the member directory in a spreadsheet."); ?>

- + -
-

get("Expiring Memberships"); ?>

-

get("All members expired or expiring within a month."); ?>

- +