total dkk cent on receipts

This commit is contained in:
SimonFJ20 2025-03-19 11:06:55 +01:00
parent a34ed6f653
commit f0c0ad5766
7 changed files with 45 additions and 24 deletions

View File

@ -35,7 +35,8 @@ CREATE TABLE IF NOT EXISTS product_prices (
CREATE TABLE IF NOT EXISTS receipts (
id INTEGER PRIMARY KEY,
user INTEGER NOT NULL,
datetime INTEGER NOT NULL,
total_dkk_cent INTEGER NOT NULL,
timestamp INTEGER NOT NULL,
FOREIGN KEY(user) REFERENCES users(id)
);

View File

@ -73,6 +73,7 @@ void route_post_carts_purchase(HttpCtx* ctx)
.id = 0,
.user_id = session->user_id,
.timestamp = NULL,
.total_dkk_cent = total_dkk_cent,
.products = (ReceiptProductVec) { 0 },
};
receipt_product_vec_construct(&receipt.products);

View File

@ -49,6 +49,7 @@ void route_get_receipts_one(HttpCtx* ctx)
ReceiptsOneRes res = {
.receipt_id = receipt.id,
.total_dkk_cent = receipt.total_dkk_cent,
.timestamp = str_dup(receipt.timestamp),
.products = (ReceiptsOneResProductVec) { 0 },
};

View File

@ -517,7 +517,7 @@ l0_return:
DbRes db_receipt_insert(Db* db, const Receipt* receipt, int64_t* id)
{
static_assert(sizeof(Receipt) == 48, "model has changed");
static_assert(sizeof(Receipt) == 56, "model has changed");
static_assert(sizeof(ReceiptProduct) == 32, "model has changed");
sqlite3* connection;
@ -526,8 +526,8 @@ DbRes db_receipt_insert(Db* db, const Receipt* receipt, int64_t* id)
sqlite3_stmt* stmt;
int prepare_res = sqlite3_prepare_v2(connection,
"INSERT INTO receipts (user, datetime) "
"VALUES (?, unixepoch('now'))",
"INSERT INTO receipts (user, total_dkk_cent, timestamp) "
"VALUES (?, ?, unixepoch('now'))",
-1,
&stmt,
NULL);
@ -539,10 +539,11 @@ DbRes db_receipt_insert(Db* db, const Receipt* receipt, int64_t* id)
}
sqlite3_bind_int64(stmt, 1, receipt->user_id);
sqlite3_bind_int64(stmt, 2, receipt->total_dkk_cent);
int step_res = sqlite3_step(stmt);
if (step_res != SQLITE_DONE) {
fprintf(stderr, "error: %s\n", sqlite3_errmsg(connection));
REPORT_SQLITE3_ERROR();
res = DbRes_Error;
goto l0_return;
}
@ -574,7 +575,7 @@ DbRes db_receipt_insert(Db* db, const Receipt* receipt, int64_t* id)
int step_res = sqlite3_step(stmt);
if (step_res != SQLITE_DONE) {
fprintf(stderr, "error: %s\n", sqlite3_errmsg(connection));
REPORT_SQLITE3_ERROR();
res = DbRes_Error;
goto l0_return;
}
@ -591,7 +592,7 @@ l0_return:
DbRes db_receipt_with_id_and_user_id(
Db* db, Receipt* receipt, int64_t id, int64_t user_id)
{
static_assert(sizeof(Receipt) == 48, "model has changed");
static_assert(sizeof(Receipt) == 56, "model has changed");
sqlite3* connection;
CONNECT;
@ -599,7 +600,9 @@ DbRes db_receipt_with_id_and_user_id(
sqlite3_stmt* stmt = NULL;
int prepare_res = sqlite3_prepare_v2(connection,
"SELECT id, user, datetime(datetime, 'unixepoch') FROM receipts"
"SELECT id, user, total_dkk_cent, datetime(timestamp, 'unixepoch') "
"FROM "
"receipts"
" WHERE id = ? AND user = ?",
-1,
&stmt,
@ -627,7 +630,8 @@ DbRes db_receipt_with_id_and_user_id(
*receipt = (Receipt) {
.id = GET_INT(0),
.user_id = GET_INT(1),
.timestamp = GET_STR(2),
.total_dkk_cent = GET_INT(2),
.timestamp = GET_STR(3),
.products = (ReceiptProductVec) { 0 },
};
@ -674,7 +678,8 @@ l0_return:
DbRes db_receipt_all_headers_with_user_id(
Db* db, ReceiptHeaderVec* receipts, int64_t user_id)
{
static_assert(sizeof(Receipt) == 48, "model has changed");
static_assert(sizeof(Receipt) == 56, "model has changed");
static_assert(sizeof(ReceiptHeader) == 32, "model has changed");
sqlite3* connection;
CONNECT;
@ -683,7 +688,9 @@ DbRes db_receipt_all_headers_with_user_id(
sqlite3_stmt* stmt;
sqlite_res = sqlite3_prepare_v2(connection,
"SELECT id, user, datetime(datetime, 'unixepoch') FROM receipts WHERE "
"SELECT id, user, total_dkk_cent, datetime(timestamp, 'unixepoch')"
" FROM"
" receipts WHERE"
" user = ?",
-1,
&stmt,
@ -700,7 +707,8 @@ DbRes db_receipt_all_headers_with_user_id(
ReceiptHeader receipt = {
.id = GET_INT(0),
.user_id = GET_INT(1),
.timestamp = GET_STR(2),
.total_dkk_cent = GET_INT(2),
.timestamp = GET_STR(3),
};
receipt_header_vec_push(receipts, receipt);
}

View File

@ -42,7 +42,7 @@ int main(void)
server, "/product_editor/index.html", route_get_product_editor_html);
http_server_get(server,
"/product_editor/product_editor.js",
route_get_product_editor_js);
route_get_product_editor_html);
http_server_post(server, "/api/carts/purchase", route_post_carts_purchase);

View File

@ -48,7 +48,7 @@ void receipt_product_destroy(ReceiptProduct* m)
void receipt_destroy(Receipt* m)
{
static_assert(sizeof(Receipt) == 48, "model has changed");
static_assert(sizeof(Receipt) == 56, "model has changed");
free(m->timestamp);
for (size_t i = 0; i < m->products.size; ++i)
@ -58,7 +58,7 @@ void receipt_destroy(Receipt* m)
void receipt_header_destroy(ReceiptHeader* m)
{
static_assert(sizeof(ReceiptHeader) == 24, "model has changed");
static_assert(sizeof(ReceiptHeader) == 32, "model has changed");
free(m->timestamp);
}
@ -96,7 +96,7 @@ void receipts_one_res_product_destroy(ReceiptsOneResProduct* m)
void receipts_one_res_destroy(ReceiptsOneRes* m)
{
static_assert(sizeof(ReceiptsOneRes) == 40, "model has changed");
static_assert(sizeof(ReceiptsOneRes) == 48, "model has changed");
free(m->timestamp);
for (size_t i = 0; i < m->products.size; ++i)
@ -200,7 +200,7 @@ char* product_price_to_json_string(const ProductPrice* m)
char* receipt_to_json_string(const Receipt* m)
{
static_assert(sizeof(Receipt) == 48, "model has changed");
static_assert(sizeof(Receipt) == 56, "model has changed");
String string;
string_construct(&string);
@ -208,10 +208,12 @@ char* receipt_to_json_string(const Receipt* m)
"{"
"\"id\":%ld,"
"\"user_id\":%ld,"
"\"total_dkk_cent\":%ld,"
"\"timestamp\":\"%s\","
"\"products\":[",
m->id,
m->user_id,
m->total_dkk_cent,
m->timestamp);
for (size_t i = 0; i < m->products.size; ++i) {
@ -238,7 +240,7 @@ char* receipt_to_json_string(const Receipt* m)
char* receipt_header_to_json_string(const ReceiptHeader* m)
{
static_assert(sizeof(ReceiptHeader) == 24, "model has changed");
static_assert(sizeof(ReceiptHeader) == 32, "model has changed");
String string;
string_construct(&string);
@ -246,9 +248,12 @@ char* receipt_header_to_json_string(const ReceiptHeader* m)
"{"
"\"id\":%ld,"
"\"user_id\":%ld,"
"\"timestamp\":\"%s\"}",
"\"total_dkk_cent\":%ld,"
"\"timestamp\":\"%s\""
"}",
m->id,
m->user_id,
m->total_dkk_cent,
m->timestamp);
char* result = string_copy(&string);
string_destroy(&string);
@ -327,16 +332,18 @@ char* receipts_one_res_product_to_json_string(const ReceiptsOneResProduct* m)
char* receipts_one_res_to_json_string(const ReceiptsOneRes* m)
{
static_assert(sizeof(ReceiptsOneRes) == 40, "model has changed");
static_assert(sizeof(ReceiptsOneRes) == 48, "model has changed");
String string;
string_construct(&string);
string_pushf(&string,
"{"
"\"receipt_id\":%ld,"
"\"total_dkk_cent\":%ld,"
"\"timestamp\":\"%s\","
"\"products\":[",
m->receipt_id,
m->total_dkk_cent,
m->timestamp);
for (size_t i = 0; i < m->products.size; ++i) {
@ -475,13 +482,13 @@ int product_price_from_json(ProductPrice* m, const JsonValue* json)
int receipt_from_json(Receipt* m, const JsonValue* json)
{
static_assert(sizeof(Receipt) == 48, "model has changed");
static_assert(sizeof(Receipt) == 56, "model has changed");
PANIC("not implemented");
}
int receipt_header_from_json(ReceiptHeader* m, const JsonValue* json)
{
static_assert(sizeof(ReceiptHeader) == 24, "model has changed");
static_assert(sizeof(ReceiptHeader) == 32, "model has changed");
PANIC("not implemented");
}
@ -571,7 +578,7 @@ int receipts_one_res_product_from_json(
int receipts_one_res_from_json(ReceiptsOneRes* m, const JsonValue* json)
{
static_assert(sizeof(ReceiptsOneRes) == 40, "model has changed");
static_assert(sizeof(ReceiptsOneRes) == 48, "model has changed");
PANIC("not implemented");
}

View File

@ -46,6 +46,7 @@ DECLARE_VEC_TYPE(ReceiptProduct, ReceiptProductVec, receipt_product_vec, )
typedef struct {
int64_t id;
int64_t user_id;
int64_t total_dkk_cent;
char* timestamp;
ReceiptProductVec products;
} Receipt;
@ -55,6 +56,7 @@ DECLARE_VEC_TYPE(Receipt, ReceiptVec, receipt_vec, )
typedef struct {
int64_t id;
int64_t user_id;
int64_t total_dkk_cent;
char* timestamp;
} ReceiptHeader;
@ -113,6 +115,7 @@ DECLARE_VEC_TYPE(ReceiptsOneResProduct,
typedef struct {
int64_t receipt_id;
int64_t total_dkk_cent;
char* timestamp;
ReceiptsOneResProductVec products;
} ReceiptsOneRes;