list_item_first_bui;d test
This commit is contained in:
parent
acef6ad630
commit
fcbd309c69
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
main.exe
|
14
admin_user.h
14
admin_user.h
@ -5,4 +5,18 @@
|
|||||||
#include<stdlib.h>
|
#include<stdlib.h>
|
||||||
#include<string.h>
|
#include<string.h>
|
||||||
#include<stdbool.h>
|
#include<stdbool.h>
|
||||||
|
#include<math.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef MENU_H
|
||||||
|
#define MENU_H
|
||||||
|
#include "menu.h"
|
||||||
|
#endif //MENU_H
|
||||||
|
|
||||||
|
bool admin_menu(){
|
||||||
|
system("cls");
|
||||||
|
welcome_message();
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
#category, brand, product, price, cost, stock, barcode
|
#category, brand, product, price, stock, barcode
|
||||||
Test
|
Test
|
||||||
Testing Co Ltd
|
Testing Co Ltd
|
||||||
Testing Product
|
Testing Product
|
||||||
|
393
database.h
393
database.h
@ -5,18 +5,20 @@
|
|||||||
#include<stdlib.h>
|
#include<stdlib.h>
|
||||||
#include<string.h>
|
#include<string.h>
|
||||||
#include<stdbool.h>
|
#include<stdbool.h>
|
||||||
|
#include<math.h>
|
||||||
#endif
|
#endif
|
||||||
#ifndef DNT_H
|
#ifndef DNT_H
|
||||||
#define DNT_H
|
#define DNT_H
|
||||||
#include "dateNtime.h"
|
#include "dateNtime.h"
|
||||||
#endif // !DNT_H
|
#endif // !DNT_H
|
||||||
typedef struct basic_db{
|
typedef struct basic_db{
|
||||||
FILE *fp;
|
|
||||||
int row_count;
|
int row_count;
|
||||||
|
bool init_status;
|
||||||
//array of struct of row
|
//array of struct of row
|
||||||
};
|
};
|
||||||
|
|
||||||
//inventory
|
//inventory
|
||||||
|
#define INVENTORY_DB "data_file_inventory.txt"
|
||||||
typedef struct inventory{
|
typedef struct inventory{
|
||||||
struct basic_db db;
|
struct basic_db db;
|
||||||
struct inventory_row* row;
|
struct inventory_row* row;
|
||||||
@ -27,15 +29,16 @@ typedef struct inventory_row{
|
|||||||
char band[100];
|
char band[100];
|
||||||
char product[100];
|
char product[100];
|
||||||
double price;
|
double price;
|
||||||
double cost;
|
|
||||||
int stock;
|
int stock;
|
||||||
long barcode;
|
long barcode;
|
||||||
|
bool isdeleted;//common for all rows,default is false
|
||||||
};
|
};
|
||||||
typedef enum INVENTORY {
|
typedef enum {
|
||||||
category = 1, brand = 2, product = 3, price = 4, cost = 5, stock = 6 , barcode = 7
|
category = 1, brand = 2, product = 3, price_inv = 4, stock = 5, barcode_inv = 6
|
||||||
};
|
}INVENTORY;
|
||||||
|
#define ENDOFINVENTORY 6
|
||||||
//transaction
|
//transaction
|
||||||
|
#define TRANSACTION_DB "data_file_transaction.txt"
|
||||||
typedef struct transaction{
|
typedef struct transaction{
|
||||||
struct basic_db db;
|
struct basic_db db;
|
||||||
struct transaction_row* row;
|
struct transaction_row* row;
|
||||||
@ -48,12 +51,14 @@ typedef struct transaction_row{
|
|||||||
double price;
|
double price;
|
||||||
int quantity;
|
int quantity;
|
||||||
long barcode;
|
long barcode;
|
||||||
|
bool isdeleted;//common for all rows,default is false
|
||||||
};
|
};
|
||||||
typedef enum TRANSACTION {
|
typedef enum {
|
||||||
date = 1, time = 2, id = 3, price = 5, quantity = 4, barcode = 7
|
date = 1, time = 2, id_tran = 3, price_tran = 5, quantity = 4, barcode_tran = 7
|
||||||
};
|
}TRANSACTION;
|
||||||
|
#define ENDOFTRANSACTION 7
|
||||||
//user
|
//user
|
||||||
|
#define USER_DB "data_file_user.txt"
|
||||||
typedef struct user{
|
typedef struct user{
|
||||||
struct basic_db db;
|
struct basic_db db;
|
||||||
struct user_row* row;
|
struct user_row* row;
|
||||||
@ -63,50 +68,344 @@ typedef struct user_row{
|
|||||||
char role[100];
|
char role[100];
|
||||||
long id;
|
long id;
|
||||||
bool isAdmin;
|
bool isAdmin;
|
||||||
|
bool isdeleted;//common for all rows,default is false
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum USER {
|
typedef enum {
|
||||||
name = 1, role = 2,id = 3
|
name = 1, role = 2, id_user = 3
|
||||||
};
|
}USER;
|
||||||
|
#define ENDOFUSER 3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//TODOLwrite function for these functions
|
||||||
//list of db func
|
//list of db func
|
||||||
bool read_db_invt(FILE* fp,enum INVENTORY inventory){
|
int basic_get_row_count(int end, FILE *fp){
|
||||||
|
fseek(fp, 0, SEEK_SET);//prevent pointer on wrong position
|
||||||
|
//get row count
|
||||||
|
int row_count = 0;
|
||||||
|
int colmun_count = 0;
|
||||||
|
while(!feof(fp)&&!ferror(fp)){
|
||||||
|
char buffer[100];
|
||||||
|
fgets(buffer, sizeof(buffer),fp);
|
||||||
|
if(buffer[0] == '#'){//catch comment line and ignore
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
colmun_count++;
|
||||||
|
if(colmun_count == end){
|
||||||
|
row_count++;
|
||||||
|
colmun_count = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct inventory read_db_invt(){//please open file in read mode
|
||||||
|
FILE* fp = fopen(INVENTORY_DB, "r");
|
||||||
|
struct inventory db;
|
||||||
|
|
||||||
|
//gets the number of rows in the file
|
||||||
|
int row_count = basic_get_row_count(ENDOFINVENTORY,fp);
|
||||||
|
db.row = (struct inventory_row*)malloc(row_count * sizeof(struct inventory_row));
|
||||||
|
db.db.row_count = row_count;
|
||||||
|
|
||||||
|
fseek(fp,0,SEEK_SET);//reset fp to the beginning of the file
|
||||||
|
|
||||||
|
//read data
|
||||||
|
for(int i=0;i<row_count;i++){
|
||||||
|
db.row[i].isdeleted = false;
|
||||||
|
for(INVENTORY j=category;j<ENDOFINVENTORY;j++){
|
||||||
|
char buffer[100];
|
||||||
|
fgets(buffer, sizeof(buffer),fp);
|
||||||
|
if(buffer[0] == '#'){//catch comment line and ignore
|
||||||
|
j--;//decrement j to prevent skipping next column
|
||||||
|
}else{
|
||||||
|
switch(j){
|
||||||
|
case category:
|
||||||
|
strcpy(db.row[i].category,buffer);
|
||||||
|
break;
|
||||||
|
case brand:
|
||||||
|
strcpy(db.row[i].band,buffer);
|
||||||
|
break;
|
||||||
|
case product:
|
||||||
|
strcpy(db.row[i].product,buffer);
|
||||||
|
break;
|
||||||
|
case price_inv:
|
||||||
|
db.row[i].price = atof(buffer);
|
||||||
|
break;
|
||||||
|
case stock:
|
||||||
|
db.row[i].stock = atoi(buffer);
|
||||||
|
break;
|
||||||
|
case barcode_inv:
|
||||||
|
db.row[i].barcode = atol(buffer);
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(ferror(fp)){
|
||||||
|
printf("Error in reading file\n");
|
||||||
|
db.db.init_status = false;
|
||||||
|
return db;
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
db.db.init_status = true;
|
||||||
|
return db;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
struct transaction read_db_tran(){
|
||||||
|
FILE* fp = fopen(TRANSACTION_DB, "r");
|
||||||
|
struct transaction db;
|
||||||
|
|
||||||
|
//gets the number of rows in the file
|
||||||
|
int row_count = basic_get_row_count(ENDOFTRANSACTION,fp);
|
||||||
|
db.row = (struct transaction_row*)malloc(row_count * sizeof(struct transaction_row));
|
||||||
|
db.db.row_count = row_count;
|
||||||
|
|
||||||
|
fseek(fp,0,SEEK_SET);//reset fp to the beginning of the file
|
||||||
|
|
||||||
|
//read data
|
||||||
|
for(int i=0;i<row_count;i++){
|
||||||
|
db.row[i].isdeleted = false;
|
||||||
|
for(TRANSACTION j=date;j<ENDOFTRANSACTION;j++){
|
||||||
|
char buffer[100];
|
||||||
|
fgets(buffer, sizeof(buffer),fp);
|
||||||
|
if(buffer[0] == '#'){//catch comment line and ignore
|
||||||
|
j--;//decrement j to prevent skipping next column
|
||||||
|
}else{
|
||||||
|
switch(j){
|
||||||
|
case date:
|
||||||
|
db.row[i].date = convert_to_date(buffer);
|
||||||
|
break;
|
||||||
|
case time:
|
||||||
|
db.row[i].time = convert_to_time(buffer);
|
||||||
|
break;
|
||||||
|
case id_tran:
|
||||||
|
db.row[i].id = atol(buffer);
|
||||||
|
break;
|
||||||
|
case price_tran:
|
||||||
|
db.row[i].price = atof(buffer);
|
||||||
|
break;
|
||||||
|
case quantity:
|
||||||
|
db.row[i].quantity = atoi(buffer);
|
||||||
|
break;
|
||||||
|
case barcode_tran:
|
||||||
|
db.row[i].barcode = atol(buffer);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(ferror(fp)){
|
||||||
|
printf("Error in reading file\n");
|
||||||
|
db.db.init_status = false;
|
||||||
|
return db;
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
db.db.init_status = true;
|
||||||
|
return db;
|
||||||
|
}
|
||||||
|
struct user read_db_user(){
|
||||||
|
FILE* fp = fopen(USER_DB,"r");
|
||||||
|
struct user db;
|
||||||
|
|
||||||
|
//gets the number of rows in the file
|
||||||
|
int row_count = basic_get_row_count(ENDOFUSER,fp);
|
||||||
|
db.row = (struct user_row*)malloc(row_count * sizeof(struct user_row));
|
||||||
|
db.db.row_count = row_count;
|
||||||
|
|
||||||
|
fseek(fp,0,SEEK_SET);//reset fp to the beginning of the file
|
||||||
|
|
||||||
|
//read data
|
||||||
|
for(int i=0;i<row_count;i++){
|
||||||
|
db.row[i].isdeleted = false;
|
||||||
|
for(USER j=name;j<ENDOFUSER;j++){
|
||||||
|
char buffer[100];
|
||||||
|
fgets(buffer, sizeof(buffer),fp);
|
||||||
|
if(buffer[0] == '#'){//catch comment line and ignore
|
||||||
|
j--;//decrement j to prevent skipping next column
|
||||||
|
}else{
|
||||||
|
switch(j){
|
||||||
|
case name:
|
||||||
|
strcpy(db.row[i].name,buffer);
|
||||||
|
break;
|
||||||
|
case role:
|
||||||
|
strcpy(db.row[i].role,buffer);
|
||||||
|
break;
|
||||||
|
case id_user:
|
||||||
|
db.row[i].id = atol(buffer);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(ferror(fp)){
|
||||||
|
printf("Error in reading file\n");
|
||||||
|
db.db.init_status = false;
|
||||||
|
return db;
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
db.db.init_status = true;
|
||||||
|
return db;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool update_db_invt(struct inventory* invt){
|
||||||
|
FILE* fpR = fopen(INVENTORY_DB,"r");
|
||||||
|
char temp[30] = INVENTORY_DB;
|
||||||
|
strcat(temp,".temp");
|
||||||
|
FILE* fpW = fopen(temp,"w");
|
||||||
|
if(fpR == NULL || fpW == NULL){
|
||||||
|
printf("Error in opening file\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for(int i=0;i<invt->db.row_count;i++){
|
||||||
|
if(invt->row[i].isdeleted == true){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for(INVENTORY j=category;j<ENDOFINVENTORY;j++){
|
||||||
|
char buffer[100];
|
||||||
|
do{
|
||||||
|
if(feof(fpR)){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fgets(buffer, sizeof(buffer),fpR);
|
||||||
|
if(buffer[0] == '#'){//catch comment line and print back to new file
|
||||||
|
fputs(buffer,fpW);
|
||||||
|
}
|
||||||
|
}while(buffer[0] == '#');
|
||||||
|
switch(j){
|
||||||
|
case category:
|
||||||
|
fprintf(fpW,"%s",invt->row[i].category);
|
||||||
|
break;
|
||||||
|
case brand:
|
||||||
|
fprintf(fpW,"%s",invt->row[i].band);
|
||||||
|
break;
|
||||||
|
case product:
|
||||||
|
fprintf(fpW,"%s",invt->row[i].product);
|
||||||
|
break;
|
||||||
|
case price_inv:
|
||||||
|
fprintf(fpW,"%f",invt->row[i].price);
|
||||||
|
break;
|
||||||
|
case stock:
|
||||||
|
fprintf(fpW,"%d",invt->row[i].stock);
|
||||||
|
break;
|
||||||
|
case barcode_inv:
|
||||||
|
fprintf(fpW,"%ld",invt->row[i].barcode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fprintf(fpW,"\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//close file and replace old file with new file
|
||||||
|
fclose(fpR);
|
||||||
|
fclose(fpW);
|
||||||
|
remove(INVENTORY_DB);
|
||||||
|
rename(temp,INVENTORY_DB);
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool update_db_tran(struct transaction* tran){
|
||||||
|
FILE* fpR = fopen(TRANSACTION_DB,"r");
|
||||||
|
char temp[30] = TRANSACTION_DB;
|
||||||
|
strcat(temp,".temp");
|
||||||
|
FILE* fpW = fopen(temp,"w");
|
||||||
|
if(fpR == NULL || fpW == NULL){
|
||||||
|
printf("Error in opening file\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for(int i=0;i<tran->db.row_count;i++){
|
||||||
|
if(tran->row[i].isdeleted == true){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for(TRANSACTION j=date;j<ENDOFTRANSACTION;j++){
|
||||||
|
char buffer[100];
|
||||||
|
do{
|
||||||
|
if(feof(fpR)){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fgets(buffer, sizeof(buffer),fpR);
|
||||||
|
if(buffer[0] == '#'){//catch comment line and print back to new file
|
||||||
|
fputs(buffer,fpW);
|
||||||
|
}
|
||||||
|
}while(buffer[0] == '#');
|
||||||
|
switch(j){
|
||||||
|
case date:
|
||||||
|
fprintf(fpW,"%d-%d-%d",tran->row[i].date.day,tran->row[i].date.month,tran->row[i].date.year);
|
||||||
|
break;
|
||||||
|
case time:
|
||||||
|
fprintf(fpW,"%d:%d:%d",tran->row[i].time.hour,tran->row[i].time.minute,tran->row[i].time.second);
|
||||||
|
break;
|
||||||
|
case id_tran:
|
||||||
|
fprintf(fpW,"%ld",tran->row[i].id);
|
||||||
|
break;
|
||||||
|
case price_tran:
|
||||||
|
fprintf(fpW,"%f",tran->row[i].price);
|
||||||
|
break;
|
||||||
|
case quantity:
|
||||||
|
fprintf(fpW,"%d",tran->row[i].quantity);
|
||||||
|
break;
|
||||||
|
case barcode_tran:
|
||||||
|
fprintf(fpW,"%ld",tran->row[i].barcode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fprintf(fpW,"\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//close file and replace old file with new file
|
||||||
|
fclose(fpR);
|
||||||
|
fclose(fpW);
|
||||||
|
remove(TRANSACTION_DB);
|
||||||
|
rename(temp,TRANSACTION_DB);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool read_db_tran(FILE* fp,enum TRANSACTION transaction){
|
|
||||||
return true;
|
bool update_db_user(struct user* user){
|
||||||
}
|
FILE* fpR = fopen(USER_DB,"r");
|
||||||
bool read_db_user(FILE* fp,enum USER user){
|
char temp[30] = USER_DB;
|
||||||
return true;
|
strcat(temp,".temp");
|
||||||
}
|
FILE* fpW = fopen(temp,"w");
|
||||||
bool new_db_invt(FILE* fp,enum INVENTORY inventory){
|
if(fpR == NULL || fpW == NULL){
|
||||||
return true;
|
printf("Error in opening file\n");
|
||||||
}
|
return false;
|
||||||
bool new_db_tran(FILE* fp,enum TRANSACTION transaction){
|
}
|
||||||
return true;
|
for(int i=0;i<user->db.row_count;i++){
|
||||||
}
|
if(user->row[i].isdeleted == true){
|
||||||
bool new_db_user(FILE* fp,enum USER user){
|
continue;
|
||||||
return true;
|
}
|
||||||
}
|
for(USER j=name;j<ENDOFUSER;j++){
|
||||||
bool edit_db_invt(FILE* fp,enum INVENTORY inventory){
|
char buffer[100];
|
||||||
return true;
|
do{
|
||||||
}
|
if(feof(fpR)){
|
||||||
bool edit_db_tran(FILE* fp,enum TRANSACTION transaction){
|
break;
|
||||||
return true;
|
}
|
||||||
}
|
fgets(buffer, sizeof(buffer),fpR);
|
||||||
bool edit_db_user(FILE* fp,enum USER user){
|
if(buffer[0] == '#'){//catch comment line and print back to new file
|
||||||
return true;
|
fputs(buffer,fpW);
|
||||||
}
|
}
|
||||||
bool rm_db_invt(FILE* fp,enum INVENTORY inventory){
|
}while(buffer[0] == '#');
|
||||||
return true;
|
switch(j){
|
||||||
}
|
case name:
|
||||||
bool rm_db_tran(FILE* fp,enum TRANSACTION transaction){
|
fprintf(fpW,"%s",user->row[i].name);
|
||||||
return true;
|
break;
|
||||||
}
|
case role:
|
||||||
bool rm_db_user(FILE* fp,enum USER user){
|
fprintf(fpW,"%s",user->row[i].role);
|
||||||
|
break;
|
||||||
|
case id_user:
|
||||||
|
fprintf(fpW,"%ld",user->row[i].id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fprintf(fpW,"\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//close file and replace old file with new file
|
||||||
|
fclose(fpR);
|
||||||
|
fclose(fpW);
|
||||||
|
remove(USER_DB);
|
||||||
|
rename(temp,USER_DB);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
@ -5,6 +5,7 @@
|
|||||||
#include<stdlib.h>
|
#include<stdlib.h>
|
||||||
#include<string.h>
|
#include<string.h>
|
||||||
#include<stdbool.h>
|
#include<stdbool.h>
|
||||||
|
#include<math.h>
|
||||||
#endif
|
#endif
|
||||||
//DATE
|
//DATE
|
||||||
typedef struct date{
|
typedef struct date{
|
||||||
|
@ -5,4 +5,5 @@
|
|||||||
#include<stdlib.h>
|
#include<stdlib.h>
|
||||||
#include<string.h>
|
#include<string.h>
|
||||||
#include<stdbool.h>
|
#include<stdbool.h>
|
||||||
|
#include<math.h>
|
||||||
#endif
|
#endif
|
||||||
|
1
main.c
1
main.c
@ -5,6 +5,7 @@
|
|||||||
#include<stdlib.h>
|
#include<stdlib.h>
|
||||||
#include<string.h>
|
#include<string.h>
|
||||||
#include<stdbool.h>
|
#include<stdbool.h>
|
||||||
|
#include<math.h>
|
||||||
#endif
|
#endif
|
||||||
#ifndef CUSTOM_H
|
#ifndef CUSTOM_H
|
||||||
#define CUSTOM_H
|
#define CUSTOM_H
|
||||||
|
1
menu.h
1
menu.h
@ -5,6 +5,7 @@
|
|||||||
#include<stdlib.h>
|
#include<stdlib.h>
|
||||||
#include<string.h>
|
#include<string.h>
|
||||||
#include<stdbool.h>
|
#include<stdbool.h>
|
||||||
|
#include<math.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
194
normal_user.h
194
normal_user.h
@ -5,6 +5,7 @@
|
|||||||
#include<stdlib.h>
|
#include<stdlib.h>
|
||||||
#include<string.h>
|
#include<string.h>
|
||||||
#include<stdbool.h>
|
#include<stdbool.h>
|
||||||
|
#include<math.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef MENU_H
|
#ifndef MENU_H
|
||||||
@ -12,9 +13,196 @@
|
|||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
#endif //MENU_H
|
#endif //MENU_H
|
||||||
|
|
||||||
|
#ifndef SORT_H
|
||||||
|
#define SORT_H
|
||||||
|
#include "sorting.h"
|
||||||
|
#endif // !SORT_H
|
||||||
|
#define PAGE_SIZE 20
|
||||||
|
|
||||||
|
//for sort list
|
||||||
|
void list_items();
|
||||||
|
int normal_menu_user_choices();
|
||||||
bool normal_menu(){
|
bool normal_menu(){
|
||||||
|
system("cls");
|
||||||
|
welcome_message();
|
||||||
|
//the selection menu
|
||||||
|
int choice = normal_menu_user_choices();
|
||||||
|
|
||||||
|
switch (choice)
|
||||||
|
{
|
||||||
retrurn true
|
case 1://List items
|
||||||
|
list_items();
|
||||||
|
break;
|
||||||
|
case 2://Search item
|
||||||
|
// search_item();
|
||||||
|
break;
|
||||||
|
case 3://scan barcode
|
||||||
|
// scan_barcode();
|
||||||
|
break;
|
||||||
|
case 4://Exit
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
default://invalid input
|
||||||
|
printf("Invalid choice\n");
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int normal_menu_user_choices(){
|
||||||
|
int choice;
|
||||||
|
printf("You can buy items inside the 2 option below\n");
|
||||||
|
printf("1. List items\n");
|
||||||
|
printf("2. Search item\n");
|
||||||
|
printf("3. Scan Barcodes\n");
|
||||||
|
printf("4. Exit\n");
|
||||||
|
printf("Enter your choice: ");
|
||||||
|
scanf("%d", &choice);
|
||||||
|
return choice;
|
||||||
|
}
|
||||||
|
|
||||||
|
//list items
|
||||||
|
void show_item(struct inventory db,int index);
|
||||||
|
void print_page(struct inventory db, int cur, int end,struct Map* map);
|
||||||
|
struct Map* sortItems(struct inventory db, int sort);
|
||||||
|
void list_items(){
|
||||||
|
system("cls");
|
||||||
|
welcome_message();
|
||||||
|
//get the list of items from the database
|
||||||
|
//print the list of items
|
||||||
|
//prompt user to select an item
|
||||||
|
//if user selects an item, display the item's details
|
||||||
|
int choice = -1;
|
||||||
|
int page = 0;
|
||||||
|
int page_size = PAGE_SIZE;
|
||||||
|
struct inventory db = read_db_invt();
|
||||||
|
int total_pages = ceil(db.db.row_count / page_size);
|
||||||
|
struct Map* map = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
do{
|
||||||
|
|
||||||
|
//ooptions
|
||||||
|
system("cls");
|
||||||
|
printf("0 exit\n");
|
||||||
|
printf("1 sort name decending\n");
|
||||||
|
printf("2 sort name ascending\n");
|
||||||
|
printf("3 sort price decending\n");
|
||||||
|
printf("4 sort price ascending\n");
|
||||||
|
printf("5 sort band decending\n");
|
||||||
|
printf("6 sort band ascending\n");
|
||||||
|
printf("7 sort category decending\n");
|
||||||
|
printf("8 sort category ascending\n");
|
||||||
|
printf("List of items:\n");
|
||||||
|
|
||||||
|
//print items
|
||||||
|
if(map == NULL){
|
||||||
|
print_page(db, page * page_size, (page + 1== total_pages)?db.db.row_count:(page+1) * page_size,(struct Map*)NULL);
|
||||||
|
}else{//sorted)
|
||||||
|
print_page(db, page * page_size, (page + 1== total_pages)?db.db.row_count:(page+1) * page_size,map);
|
||||||
|
}
|
||||||
|
|
||||||
|
//page control
|
||||||
|
printf("%d next page\n", page_size+3);
|
||||||
|
printf("%d previous page\n", page_size+4);
|
||||||
|
printf("%d set page size\n", page_size+5);
|
||||||
|
printf("%D/%d/%d(page size/page number/total)\n",page_size, page+1,total_pages);
|
||||||
|
|
||||||
|
//prompt user to select an item
|
||||||
|
bool valid = true;
|
||||||
|
do{
|
||||||
|
printf("Enter your choice: ");
|
||||||
|
scanf("%d", &choice);
|
||||||
|
if(choice <=8 && choice > 0){
|
||||||
|
printf("sorting...\n");
|
||||||
|
map = sortItems(db,choice);
|
||||||
|
}else if(choice == page_size+3){
|
||||||
|
page++;
|
||||||
|
}else if(choice == page_size+4 && page > 0){
|
||||||
|
page--;
|
||||||
|
}else if(choice == page_size+5){
|
||||||
|
printf("Enter page size: ");
|
||||||
|
scanf("%d", &page_size);
|
||||||
|
total_pages = ceil(db.db.row_count / page_size);
|
||||||
|
}else if(choice >= 0 && choice < db.db.row_count){
|
||||||
|
show_item(db,choice-9 + page_size*page);
|
||||||
|
}else{
|
||||||
|
printf("Invalid choice\n");
|
||||||
|
valid = false;
|
||||||
|
}
|
||||||
|
}while(!valid);
|
||||||
|
|
||||||
|
}while(choice != 0);
|
||||||
|
}
|
||||||
|
struct Map* sortItems(struct inventory db, int sort){
|
||||||
|
struct Map *map = malloc(sizeof(struct Map) * db.db.row_count);
|
||||||
|
for (int i = 0; i < db.db.row_count; i++){
|
||||||
|
map[i].key = i;
|
||||||
|
switch(sort){
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
map[i].value = (int)db.row[i].product;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
case 4:
|
||||||
|
map[i].value = (int)db.row[i].price*100;//presume there is no price contain 0.001
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
case 6:
|
||||||
|
map[i].value = (int)db.row[i].band;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
case 8:
|
||||||
|
map[i].value = (int)db.row[i].category;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch (sort){
|
||||||
|
case 1:
|
||||||
|
case 3:
|
||||||
|
case 5:
|
||||||
|
case 7:
|
||||||
|
qsort(map, db.db.row_count, sizeof(struct Map), compare_decending);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
case 4:
|
||||||
|
case 6:
|
||||||
|
case 8:
|
||||||
|
qsort(map, db.db.row_count, sizeof(struct Map), compare_ascending);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_page(struct inventory db, int cur, int end,struct Map* map){
|
||||||
|
for (int i = cur; i < end; i++)
|
||||||
|
{
|
||||||
|
if(map != NULL){
|
||||||
|
printf("%d. %s\n", i + 1, db.row[map[i].key].product);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
printf("item%d. %s\n", i + 3, db.row[i].product);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void show_item(struct inventory db,int index){
|
||||||
|
system("cls");
|
||||||
|
printf("Product: %s\n", db.row[index].product);
|
||||||
|
printf("Catergory: %s\n", db.row[index].category);
|
||||||
|
printf("Band: %d\n", db.row[index].band);
|
||||||
|
printf("Price: $%lf\n", db.row[index].price);
|
||||||
|
printf("Stock: %d\n", db.row[index].stock);
|
||||||
|
printf("Barcode: %ld\n",db.row[index].barcode);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
11
sorting.h
Normal file
11
sorting.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
typedef struct Map{
|
||||||
|
int key;
|
||||||
|
int value;
|
||||||
|
};
|
||||||
|
|
||||||
|
int compare_decending(const void *a, const void *b){
|
||||||
|
return (*(struct Map *)b).value - (*(struct Map *)a).value;
|
||||||
|
}
|
||||||
|
int compare_ascending(const void *a, const void *b){
|
||||||
|
return (*(struct Map *)a).value - (*(struct Map *)b).value;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user