Milestone - core reports working

This commit is contained in:
2025-09-27 16:46:30 -04:00
parent 2d2e57b50b
commit 7fb67ed543
20 changed files with 365 additions and 24 deletions

View File

@@ -10,10 +10,10 @@ export const prefixes = sqliteTable('prefixes', {
export const tickets = sqliteTable('tickets', {
prefix: text('prefix'),
t_id: integer('t_id'),
first_name: text('first_name'),
last_name: text('last_name'),
phone_number: text('phone_number'),
preference: text('preference')
first_name: text('first_name').default(''),
last_name: text('last_name').default(''),
phone_number: text('phone_number').default(''),
preference: text('preference').default('CALL')
}, (table) => [
primaryKey({columns: [table.prefix, table.t_id]})
]);
@@ -21,8 +21,8 @@ export const tickets = sqliteTable('tickets', {
export const baskets = sqliteTable('baskets', {
prefix: text('prefix'),
b_id: integer('b_id'),
description: text('description'),
donors: text('donors'),
description: text('description').default(''),
donors: text('donors').default(''),
winning_ticket: integer('winning_ticket').default(0)
}, (table) => [
primaryKey({columns: [table.prefix, table.b_id]})

View File

@@ -1,5 +1,5 @@
export async function load({ fetch }) {
const res = await fetch('/api/prefixes/');
const res = await fetch('/api/prefixes');
if (res.ok) {
const data = await res.json();
return { prefixes: data, status: "Prefixes fetched successfully." }

View File

@@ -47,8 +47,8 @@
</div>
<div><h2>Reports:</h2></div>
<div class="flex-row {current_prefix.color}">
<a href="/report/byname/{current_prefix.name}/" target="_blank" class="styled">By Name</a>
<a href="/report/bybasket/{current_prefix.name}/" target="_blank" class="styled">By Basket ID</a>
<a href="/reports/byname/{current_prefix.name}/" target="_blank" class="styled">By Name</a>
<a href="/reports/bybasket/{current_prefix.name}/" target="_blank" class="styled">By Basket ID</a>
</div>
{#if admin_mode}
<div><h2>Admin Mode:</h2></div>

View File

@@ -6,7 +6,7 @@ import { eq, and } from "drizzle-orm";
export async function GET({ params }) {
let n_b_from = parseInt(params.b_from), n_b_to = parseInt(params.b_to);
if (env.TAM3_REMOTE) {
const res = await fetch(`${env.TAM3_REMOTE}/api/baskets/${n_b_from}/${n_b_to}/?api_key=${env.TAM3_REMOTE_KEY}`);
const res = await fetch(`${env.TAM3_REMOTE}/api/baskets/${params.prefix}/${n_b_from}/${n_b_to}/?api_key=${env.TAM3_REMOTE_KEY}`);
if (!res.ok) {
return new Response(JSON.stringify({detail: "Unable to fetch baskets"}), {status: res.status, statusText: res.statusText});
};

View File

@@ -6,7 +6,7 @@ import { env } from "$env/dynamic/private";
export async function GET({ params }) {
let { name } = params;
if (env.TAM3_REMOTE) {
const res = await fetch(`${env.TAM3_REMOTE}/prefixes/${name}/?api_key=${env.TAM3_REMOTE_KEY}`);
const res = await fetch(`${env.TAM3_REMOTE}/api/prefixes/${name}/?api_key=${env.TAM3_REMOTE_KEY}`);
if (!res.ok) {
return new Response(JSON.stringify({status: "Issue getting prefix."}), {status: res.status, statusText: res.statusText});
}
@@ -26,7 +26,7 @@ export async function DELETE({ params }) {
let { name } = params;
await db.delete(prefixes).where(eq(prefixes.name, name))
if (env.TAM3_REMOTE) {
const res = await fetch(`${env.TAM3_REMOTE}/prefixes/?api_key=${env.TAM3_REMOTE_KEY}&prefix_name=${name}`);
const res = await fetch(`${env.TAM3_REMOTE}/api/prefixes/?api_key=${env.TAM3_REMOTE_KEY}&prefix_name=${name}`);
if (!res.ok) {
return new Response(JSON.stringify({status: "Issue deleting prefix."}), {status: res.status, statusText: res.statusText});
} else {

View File

@@ -0,0 +1,18 @@
import { env } from "process";
import { db } from "$lib/server/db";
import { report } from "$lib/server/db/schema";
import { eq } from "drizzle-orm";
export async function GET({ params }) {
if (env.TAM3_REMOTE) {
const res = await fetch(`${env.TAM3_REMOTE}/api/reports/bybasket/${params.prefix}/?api_key=${env.TAM3_REMOTE_KEY}`);
if (!res.ok) {
return new Response(JSON.stringify({detail: "Unable to fetch report."}), {status: res.status, statusText: res.statusText})
}
const data = await res.json();
return new Response(JSON.stringify(data), {status: 200, statusText: "Fetched report successfully."})
} else {
const data = await db.select().from(report).where(eq(report.prefix, params.prefix)).orderBy(report.b_id);
return new Response(JSON.stringify(data), {status: 200, statusText: "Loaded report successfully."})
}
}

View File

@@ -0,0 +1,18 @@
import { env } from "process";
import { db } from "$lib/server/db";
import { report } from "$lib/server/db/schema";
import { eq } from "drizzle-orm";
export async function GET({ params }) {
if (env.TAM3_REMOTE) {
const res = await fetch(`${env.TAM3_REMOTE}/api/reports/byname/${params.prefix}/?api_key=${env.TAM3_REMOTE_KEY}`);
if (!res.ok) {
return new Response(JSON.stringify({detail: "Unable to fetch report."}), {status: res.status, statusText: res.statusText})
}
const data = await res.json();
return new Response(JSON.stringify(data), {status: 200, statusText: "Fetched report successfully."})
} else {
const data = await db.select().from(report).where(eq(report.prefix, params.prefix));
return new Response(JSON.stringify(data), {status: 200, statusText: "Loaded report successfully."})
}
}

View File

@@ -5,7 +5,7 @@ import { eq, and } from "drizzle-orm";
export async function GET({ params }) {
if (env.TAM3_REMOTE) {
const res = await fetch(`${env.TAM3_REMOTE}/api/tickets/${params.prefix}/${params.t_id}/?api_key=${env.TAM3_REMOTE}`);
const res = await fetch(`${env.TAM3_REMOTE}/api/tickets/${params.prefix}/${params.t_id}/?api_key=${env.TAM3_REMOTE_KEY}`);
if (!res.ok) {
return new Response(JSON.stringify({detail: "Unable to fetch ticket."}), {status: res.status, statusText: res.statusText})
}

View File

@@ -44,7 +44,7 @@
duplicateDown: () => {
const next_idx = current_idx + 1;
if (current_baskets[next_idx]) {
current_baskets[next_idx] = {...current_baskets[current_idx], b_id: current_baskets[next_idx].b_id, changed: true};
current_baskets[next_idx] = {...current_baskets[current_idx], b_id: current_baskets[next_idx].b_id, winning_ticket: current_baskets[next_idx].winning_ticket, changed: true};
changeFocus(next_idx);
} else {
changeFocus(next_idx);
@@ -53,7 +53,7 @@
duplicateUp: () => {
const prev_idx = current_idx - 1;
if (prev_idx >= 0) {
current_baskets[prev_idx] = {...current_baskets[current_idx], b_id: current_baskets[prev_idx].b_id, changed: true};
current_baskets[prev_idx] = {...current_baskets[current_idx], b_id: current_baskets[prev_idx].b_id, winning_ticket: current_baskets[prev_idx].winning_ticket, changed: true};
changeFocus(prev_idx);
} else {
changeFocus(prev_idx);

View File

@@ -0,0 +1,7 @@
export async function load({ fetch, params }) {
let res = await fetch(`/api/prefixes/${params.prefix}`);
const prefix_data = await res.json();
res = await fetch(`/api/reports/bybasket/${params.prefix}`);
const report_data = await res.json()
return {prefix: prefix_data, report: report_data}
}

View File

@@ -0,0 +1,95 @@
<script>
import { env } from '$env/dynamic/public';
import { browser } from '$app/environment';
const { data } = $props();
const prefix = {...data.prefix};
const report_data = data.report;
let show_data = $state([...report_data]);
let report_subject = $state("All Preferences");
if (browser) {
document.title = `${prefix.name} Report By Name`
}
</script>
<div id="reportheader">
<div class="flex-row-space {prefix.color}">
<div class="flex-row">
<button class="styled" onclick={() => {
show_data = [...report_data];
report_subject = "All Preferences";
}}>All Preferences</button>
<button class="styled" onclick={() => {
show_data = [...report_data.filter((entry) => entry.preference === "CALL")];
report_subject = "CALL Preference"
}}>Call</button>
<button class="styled" onclick={() => {
show_data = [...report_data.filter((entry) => entry.preference === "TEXT")];
report_subject = "TEXT Preference";
}}>Text</button>
</div>
<div class="flex-row">
<button class="styled" onclick={() => window.print()}>Print</button>
</div>
</div>
</div>
<table>
<thead>
<tr>
<th colspan="90"><h1>{prefix.name} - Report - {report_subject}</h1></th>
</tr>
<tr>
<th>Basket ID</th>
<th>Description</th>
<th>Ticket #</th>
<th>Winner Name</th>
<th>Phone Number</th>
</tr>
</thead>
<tbody>
{#each show_data as report_entry}
<tr>
<td>{report_entry.b_id}</td>
<td>{report_entry.description}</td>
<td>{report_entry.winning_ticket}</td>
<td>{report_entry.winner_name}</td>
<td>{report_entry.phone_number}</td>
</tr>
{/each}
</tbody>
<tfoot>
<tr>
<td colspan="3">{env.PUBLIC_TAM3_VENUE || ""}</td>
<td colspan="2" style="text-align: right">TAM3 by Dilan Gilluly</td>
</tr>
</tfoot>
</table>
<style>
table {
width: 100%;
th {
text-align: left;
}
td {
border: solid 1px black;
padding: 0.2rem;
}
}
table tbody tr:nth-child(2n) {
background-color: #dddddd;
}
table tfoot td {
border: none;
}
@media print {
#reportheader {
display: none;
}
@page {
margin: 0.25in;
}
}
</style>

View File

@@ -0,0 +1,7 @@
export async function load({ fetch, params }) {
let res = await fetch(`/api/prefixes/${params.prefix}`);
const prefix_data = await res.json();
res = await fetch(`/api/reports/byname/${params.prefix}`);
const report_data = await res.json()
return {prefix: prefix_data, report: report_data}
}

View File

@@ -0,0 +1,95 @@
<script>
import { env } from '$env/dynamic/public';
import { browser } from '$app/environment';
const { data } = $props();
const prefix = {...data.prefix};
const report_data = data.report;
let show_data = $state([...report_data]);
let report_subject = $state("All Preferences");
if (browser) {
document.title = `${prefix.name} Report By Name`
}
</script>
<div id="reportheader">
<div class="flex-row-space {prefix.color}">
<div class="flex-row">
<button class="styled" onclick={() => {
show_data = [...report_data];
report_subject = "All Preferences";
}}>All Preferences</button>
<button class="styled" onclick={() => {
show_data = [...report_data.filter((entry) => entry.preference === "CALL")];
report_subject = "CALL Preference"
}}>Call</button>
<button class="styled" onclick={() => {
show_data = [...report_data.filter((entry) => entry.preference === "TEXT")];
report_subject = "TEXT Preference";
}}>Text</button>
</div>
<div class="flex-row">
<button class="styled" onclick={() => window.print()}>Print</button>
</div>
</div>
</div>
<table>
<thead>
<tr>
<th colspan="90"><h1>{prefix.name} - Report - {report_subject}</h1></th>
</tr>
<tr>
<th>Winner Name</th>
<th>Phone Number</th>
<th>Basket ID</th>
<th>Ticket #</th>
<th>Description</th>
</tr>
</thead>
<tbody>
{#each show_data as report_entry}
<tr>
<td>{report_entry.winner_name}</td>
<td>{report_entry.phone_number}</td>
<td>{report_entry.b_id}</td>
<td>{report_entry.winning_ticket}</td>
<td>{report_entry.description}</td>
</tr>
{/each}
</tbody>
<tfoot>
<tr>
<td colspan="3">{env.PUBLIC_TAM3_VENUE || ""}</td>
<td colspan="2" style="text-align: right">TAM3 by Dilan Gilluly</td>
</tr>
</tfoot>
</table>
<style>
table {
width: 100%;
th {
text-align: left;
}
td {
border: solid 1px black;
padding: 0.2rem;
}
}
table tbody tr:nth-child(2n) {
background-color: #dddddd;
}
table tfoot td {
border: none;
}
@media print {
#reportheader {
display: none;
}
@page {
margin: 0.25in;
}
}
</style>