Compare commits
2
Commits
fa0e377811
..
0.2.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6fb76ebed6 | ||
|
|
c670aceafb |
No files matched your search
+62
-111
@@ -15,165 +15,124 @@ struct product {
|
||||
char name;
|
||||
};
|
||||
|
||||
/*
|
||||
* Modello dati: nel file prodotti si salva solo la giacenza INIZIALE ("initial").
|
||||
* Lo stock corrente e' sempre calcolato: initial - copie vendute
|
||||
* (comprese quelle consumate tramite bundle). Le vendite scrivono solo il file vendite.
|
||||
*/
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
/* Prodotti */
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
/**
|
||||
* @brief Restituisce l'array JSON contenente tutti i prodotti.
|
||||
* @brief Restituisce l'array JSON contenente tutti i prodotti, cosi' come salvati su file
|
||||
* (quindi con "initial" e senza stock corrente).
|
||||
* @param fname Percorso del file JSON dei prodotti.
|
||||
* @return Puntatore all'oggetto JSON (array) dei prodotti (da liberare con json_object_put()), oppure NULL in caso di errore.
|
||||
* @return Array JSON (da liberare con json_object_put()), oppure NULL in caso di errore.
|
||||
*/
|
||||
json_object *getProducts(const char *fname);
|
||||
|
||||
/**
|
||||
* @brief Stampa a schermo (tramite ncurses) la lista dei prodotti con relativo prezzo, inventario e tag bundle.
|
||||
* @param fname Percorso del file JSON dei prodotti.
|
||||
* @brief Come getProducts, ma ogni prodotto ha in piu' il campo "stock" calcolato
|
||||
* (-1 = infinito; i bundle hanno sempre -1). E' una vista in memoria: non va salvata.
|
||||
* @param productsFile Percorso del file JSON dei prodotti.
|
||||
* @param soldFile Percorso del file JSON delle vendite (se manca, si assume nessuna vendita).
|
||||
* @return Array JSON (da liberare con json_object_put()), oppure NULL in caso di errore.
|
||||
*/
|
||||
void listProducts(const char *fname);
|
||||
json_object *getProductsWithStock(const char *productsFile, const char *soldFile);
|
||||
|
||||
/**
|
||||
* @brief Aggiunge un nuovo prodotto con prezzo e inventario illimitato.
|
||||
* @param fname Percorso del file JSON dei prodotti.
|
||||
* @param name Nome del prodotto.
|
||||
* @param price Prezzo del prodotto.
|
||||
* @return 0 in caso di successo, 1 se il prodotto esiste già, -1 in caso di errore.
|
||||
* @return 0 in caso di successo, 1 se il prodotto esiste gia', -1 in caso di errore.
|
||||
*/
|
||||
int addProduct(const char *fname, const char *name, double price);
|
||||
|
||||
/**
|
||||
* @brief Aggiunge un nuovo prodotto specificando prezzo e quantità iniziale in magazzino.
|
||||
* @param fname Percorso del file JSON dei prodotti.
|
||||
* @param name Nome del prodotto.
|
||||
* @param price Prezzo del prodotto.
|
||||
* @param stock Quantità iniziale in magazzino (-1 per inventario illimitato).
|
||||
* @return 0 in caso di successo, 1 se il prodotto esiste già, -1 in caso di errore.
|
||||
* @brief Aggiunge un nuovo prodotto specificando prezzo e giacenza iniziale.
|
||||
* @param stock Giacenza iniziale (negativo per inventario illimitato).
|
||||
* @return 0 in caso di successo, 1 se il prodotto esiste gia', -1 in caso di errore.
|
||||
*/
|
||||
int addProductWithInventory(const char *fname, const char *name, double price, int stock);
|
||||
|
||||
/**
|
||||
* @brief Aggiunge un prodotto composto (bundle) costituito da altri componenti.
|
||||
* @param fname Percorso del file JSON dei prodotti.
|
||||
* @param name Nome del bundle.
|
||||
* @param price Prezzo del bundle.
|
||||
* @param components Oggetto JSON (array) descrivente i componenti e le relative quantità.
|
||||
* @return 0 in caso di successo, 1 se il prodotto esiste già, -1 in caso di errore.
|
||||
* @brief Aggiunge un prodotto composto (bundle).
|
||||
* @param components Array JSON di {"name": ..., "qty": ...}; il bundle ne prende possesso in caso di successo.
|
||||
* @return 0 in caso di successo, 1 se il prodotto esiste gia', -1 in caso di errore.
|
||||
*/
|
||||
int addBundleProduct(const char *fname, const char *name, double price, json_object *components);
|
||||
|
||||
/**
|
||||
* @brief Ottiene il prezzo di un prodotto specifico.
|
||||
* @param fname Percorso del file JSON dei prodotti.
|
||||
* @param name Nome del prodotto da cercare.
|
||||
* @return Il prezzo del prodotto, oppure -1.0 se non trovato o in caso di errore.
|
||||
* @brief Ottiene il prezzo di un prodotto.
|
||||
* @return Il prezzo, oppure -1.0 se non trovato o in caso di errore.
|
||||
*/
|
||||
double getPrice(const char *fname, const char *name);
|
||||
|
||||
/**
|
||||
* @brief Aggiorna nome e prezzo di un prodotto esistente, sincronizzando anche le vendite se il nome cambia.
|
||||
* @param productsFile Percorso del file JSON dei prodotti.
|
||||
* @param soldFile Percorso del file JSON delle vendite.
|
||||
* @param oldName Nome attuale del prodotto.
|
||||
* @param newName Nuovo nome da assegnare al prodotto.
|
||||
* @param price Nuovo prezzo del prodotto.
|
||||
* @return 0 in caso di successo, codice di errore/stato altrimenti.
|
||||
* @brief Aggiorna nome e prezzo di un prodotto lasciando invariato lo stock corrente.
|
||||
* @return 0 ok, 1 non trovato, 2 nome gia' usato, -1 errore.
|
||||
*/
|
||||
int updateProduct(const char *productsFile, const char *soldFile, const char *oldName, const char *newName, double price);
|
||||
|
||||
/**
|
||||
* @brief Aggiorna nome, prezzo e inventario di un prodotto esistente.
|
||||
* @param productsFile Percorso del file JSON dei prodotti.
|
||||
* @param soldFile Percorso del file JSON delle vendite.
|
||||
* @param oldName Nome attuale del prodotto.
|
||||
* @param newName Nuovo nome da assegnare.
|
||||
* @param price Nuovo prezzo.
|
||||
* @param stock Quantità in magazzino.
|
||||
* @return 0 in caso di successo, codice di errore/stato altrimenti.
|
||||
* @brief Aggiorna nome, prezzo e stock di un prodotto.
|
||||
* Se il nome cambia aggiorna nella stessa operazione file vendite e riferimenti nei bundle.
|
||||
* @param stock Giacenza ATTUALE desiderata (negativo = infinita).
|
||||
* @return 0 ok, 1 non trovato, 2 nome gia' usato, -1 errore.
|
||||
*/
|
||||
int updateProductWithInventory(const char *productsFile, const char *soldFile, const char *oldName, const char *newName, double price, int stock);
|
||||
|
||||
/**
|
||||
* @brief Legge lo stato dell'inventario (quantità e tracciamento) di un prodotto.
|
||||
* @param fname Percorso del file JSON dei prodotti.
|
||||
* @brief Legge lo stock corrente (calcolato) di un prodotto.
|
||||
* @param productsFile Percorso del file JSON dei prodotti.
|
||||
* @param soldFile Percorso del file JSON delle vendite.
|
||||
* @param name Nome del prodotto.
|
||||
* @param stock Puntatore a intero in cui salvare la quantità di magazzino.
|
||||
* @param tracked Puntatore a intero in cui salvare se l'inventario è tracciato (1) o meno (0).
|
||||
* @return 0 in caso di successo, 1 se il prodotto non viene trovato, -1 in caso di errore.
|
||||
* @param stock Quantita' corrente (PRODUCT_STOCK_UNLIMITED se non tracciato).
|
||||
* @param tracked 1 se l'inventario e' tracciato, 0 altrimenti.
|
||||
* @return 0 ok, 1 prodotto non trovato, -1 errore.
|
||||
*/
|
||||
int getProductInventory(const char *fname, const char *name, int *stock, int *tracked);
|
||||
|
||||
/**
|
||||
* @brief Imposta la quantità e lo stato di tracciamento dell'inventario per un prodotto.
|
||||
* @param fname Percorso del file JSON dei prodotti.
|
||||
* @param name Nome del prodotto.
|
||||
* @param stock Quantità di magazzino da impostare.
|
||||
* @param tracked Flag di tracciamento (1 per tracciato, 0 altrimenti).
|
||||
* @return 0 in caso di successo, 1 se il prodotto non è trovato, -1 in caso di errore.
|
||||
*/
|
||||
int setProductInventory(const char *fname, const char *name, int stock, int tracked);
|
||||
|
||||
/**
|
||||
* @brief Consuma (scala) una determinata quantità dall'inventario di un prodotto o dei suoi componenti (se bundle).
|
||||
* @param fname Percorso del file JSON dei prodotti.
|
||||
* @param name Nome del prodotto.
|
||||
* @param qty Quantità da consumare.
|
||||
* @return 0 in caso di successo, codice di errore o disponibilità insufficiente altrimenti.
|
||||
*/
|
||||
int consumeProductInventory(const char *fname, const char *name, int qty);
|
||||
int getProductInventory(const char *productsFile, const char *soldFile, const char *name, int *stock, int *tracked);
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
/* Copie vendute */
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
/**
|
||||
* @brief Restituisce il numero di copie vendute di un determinato prodotto.
|
||||
* @param fname Percorso del file JSON delle vendite.
|
||||
* @param name Nome del prodotto.
|
||||
* @return Il numero di copie vendute (0 se non presente, -1 in caso di errore).
|
||||
* @brief Numero di copie vendute di un prodotto.
|
||||
* @return Copie vendute (0 se non presente, -1 in caso di errore).
|
||||
*/
|
||||
int getCount(const char *fname, const char *name);
|
||||
|
||||
/**
|
||||
* @brief Stampa a schermo (tramite ncurses) la lista delle vendite registrate per ciascun prodotto.
|
||||
* @param fname Percorso del file JSON delle vendite.
|
||||
* @brief Stampa a schermo (ncurses) le vendite registrate per ciascun prodotto.
|
||||
*/
|
||||
void listSold(const char *fname);
|
||||
|
||||
/**
|
||||
* @brief Aggiunge una quantità di copie vendute per un prodotto (creando la voce se non esiste).
|
||||
* @param fname Percorso del file JSON delle vendite.
|
||||
* @param name Nome del prodotto.
|
||||
* @param qty Quantità venduta da aggiungere.
|
||||
* @return 0 in caso di successo, -1 in caso di errore.
|
||||
* @brief Aggiunge copie vendute per un prodotto (crea la voce se non esiste).
|
||||
* Non controlla lo stock: per questo usare recordSale().
|
||||
* @return 0 ok, -1 errore.
|
||||
*/
|
||||
int addSold(const char *fname, const char *name, int qty);
|
||||
|
||||
/**
|
||||
* @brief Elimina la registrazione delle vendite di un prodotto e ripristina l'inventario corrispondente.
|
||||
* @param productsFile Percorso del file JSON dei prodotti.
|
||||
* @param soldFile Percorso del file JSON delle vendite.
|
||||
* @param name Nome del prodotto di cui eliminare le vendite.
|
||||
* @return 0 in caso di successo, 1 se la vendita non è presente, -1 o codice di errore in caso di fallimento.
|
||||
* @brief Elimina la registrazione delle vendite di un prodotto.
|
||||
* Lo stock si "ripristina" da solo perche' e' derivato.
|
||||
* @param productsFile Non usato, mantenuto per compatibilita'.
|
||||
* @return 0 ok, 1 vendita non presente, -1 errore.
|
||||
*/
|
||||
int deleteSold(const char *productsFile, const char *soldFile, const char *name);
|
||||
|
||||
/**
|
||||
* @brief Aggiorna la quantità di copie vendute per un prodotto, regolando di conseguenza il magazzino.
|
||||
* @param productsFile Percorso del file JSON dei prodotti.
|
||||
* @param soldFile Percorso del file JSON delle vendite.
|
||||
* @param name Nome del prodotto.
|
||||
* @param qty Nuova quantità totale venduta.
|
||||
* @return 0 in caso di successo, 1 se non presente, codice di errore altrimenti.
|
||||
* @brief Imposta le copie vendute di un prodotto; se aumentano controlla la disponibilita'.
|
||||
* @return 0 ok, 1 vendita non presente, 2 scorta insufficiente, -1 errore.
|
||||
*/
|
||||
int updateSold(const char *productsFile, const char *soldFile, const char *name, int qty);
|
||||
|
||||
/**
|
||||
* @brief Registra una vendita scalando l'inventario dei prodotti e incrementando le vendite, con supporto di rollback in caso di problemi.
|
||||
* @param productsFile Percorso del file JSON dei prodotti.
|
||||
* @param soldFile Percorso del file JSON delle vendite.
|
||||
* @param name Nome del prodotto venduto.
|
||||
* @param qty Quantità venduta.
|
||||
* @return 0 in caso di successo, codice di errore in caso di fallimento.
|
||||
* @brief Registra una vendita dopo aver verificato la disponibilita' (anche dei componenti, se bundle).
|
||||
* Scrive solo il file vendite.
|
||||
* @return 0 ok, 1 prodotto inesistente, 2 scorta insufficiente, -1 errore.
|
||||
*/
|
||||
int recordSale(const char *productsFile, const char *soldFile, const char *name, int qty);
|
||||
|
||||
@@ -182,10 +141,8 @@ int recordSale(const char *productsFile, const char *soldFile, const char *name,
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
/**
|
||||
* @brief Calcola le entrate totali sommando il prodotto tra prezzo e copie vendute per ciascun articolo.
|
||||
* @param productsFile Percorso del file JSON dei prodotti.
|
||||
* @param soldFile Percorso del file JSON delle vendite.
|
||||
* @return Il totale delle entrate, oppure -1.0 in caso di errore.
|
||||
* @brief Entrate totali: somma di prezzo * copie vendute.
|
||||
* @return Il totale, oppure -1.0 in caso di errore.
|
||||
*/
|
||||
double getTotalRevenue(const char *productsFile, const char *soldFile);
|
||||
|
||||
@@ -194,11 +151,8 @@ double getTotalRevenue(const char *productsFile, const char *soldFile);
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
/**
|
||||
* @brief Esporta i dati delle vendite e dei prodotti in un file in formato CSV.
|
||||
* @param productsFile Percorso del file JSON dei prodotti.
|
||||
* @param soldFile Percorso del file JSON delle vendite.
|
||||
* @param outFile Percorso del file CSV di output.
|
||||
* @return 0 in caso di successo, un valore negativo in caso di errore.
|
||||
* @brief Esporta prodotti e vendite in CSV (separatore ';').
|
||||
* @return 0 ok, -1 errore di lettura prodotti, -2 errore di apertura del file di destinazione.
|
||||
*/
|
||||
int exportSalesToCsv(const char *productsFile, const char *soldFile, const char *outFile);
|
||||
|
||||
@@ -207,23 +161,20 @@ int exportSalesToCsv(const char *productsFile, const char *soldFile, const char
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
/**
|
||||
* @brief Assicura che il file di configurazione dell'applicazione esista, creandolo se necessario.
|
||||
* @param fname Percorso del file di configurazione.
|
||||
* @return 0 in caso di successo, codice di errore altrimenti.
|
||||
* @brief Crea il file di configurazione se non esiste.
|
||||
* @return 0 ok, altro in caso di errore.
|
||||
*/
|
||||
int ensureAppConfig(const char *fname);
|
||||
|
||||
/**
|
||||
* @brief Carica la configurazione dell'applicazione dal file specificato.
|
||||
* @param fname Percorso del file di configurazione.
|
||||
* @return 0 in caso di successo, -1 in caso di errore.
|
||||
* @brief Carica la configurazione dal file specificato.
|
||||
* @return 0 ok, -1 errore.
|
||||
*/
|
||||
int loadAppConfig(const char *fname);
|
||||
|
||||
/**
|
||||
* @brief Salva la configurazione corrente dell'applicazione sul file specificato.
|
||||
* @param fname Percorso del file di configurazione.
|
||||
* @return 0 in caso di successo, -1 in caso di errore.
|
||||
* @brief Salva la configurazione corrente sul file specificato.
|
||||
* @return 0 ok, -1 errore.
|
||||
*/
|
||||
int saveAppConfig(const char *fname);
|
||||
|
||||
|
||||
+474
-670
File diff suppressed because it is too large.
Load diff
+1
-1
@@ -61,6 +61,6 @@ int main(){
|
||||
|
||||
|
||||
void printLogoBG(){
|
||||
wwrap_print(stdscr, LINES / 2 - 3, COLS / 2 - 5," ######### \n ################### \n ######## ##### \n ####### ### \n ###### ### \n ###### ### ## \n ############ # ### ## \n ################ ### # \n ############ ##### # \n ############## \n ######### \n ## \n ####### \n ## ## \n ## ## ###### ## ## # ## ## \n ###### ##### ######## #### ## ## ## # ## \n ## ## ## ## ## ## ## ##### ## ## ## # ## ## \n ## ## #### ## ## ## #### ####### ##### ##### ##### ");
|
||||
wwrap_print(stdscr, LINES / 2 - 3, COLS / 2 - 5, " ######### \n ################### \n ######## ##### \n ####### ### \n ###### ### \n ###### ### ## \n ############ # ### ## \n ################ ### # \n ############ ##### # \n ############## \n ######### \n ## \n ####### \n ###### # ## \n ## ## ###### ## ## # ##### \n ###### ##### ######## #### ## ## ## # ## \n ## ## ## ## ## ## ## ## ## ## ## ## # ## ## \n ## ## #### ## ## ## ##### ####### ##### ##### #####");
|
||||
mvprintw(LINES -1, COLS / 2 - 25, "Product Manager by Vincenzo Nikodem Cesqui Podiani");
|
||||
}
|
||||
@@ -764,7 +764,7 @@ static void showCreateBundleWindow(void) {
|
||||
return;
|
||||
}
|
||||
|
||||
json_object *products = getProducts(productPricesFileLocation);
|
||||
json_object *products = getProductsWithStock(productPricesFileLocation, countFileLocation);
|
||||
if (!products) {
|
||||
warningf("Impossibile leggere il file '%s'.", productPricesFileLocation);
|
||||
return;
|
||||
@@ -927,7 +927,7 @@ void runAboutWindow() {
|
||||
WINDOW *aboutWin;
|
||||
aboutWin = create_newwin(LINES / 2 - 2, COLS / 2, LINES / 2, 0);
|
||||
|
||||
wwrap_print(aboutWin, 1, 1, "Questo e' un software fatto per Roma2LUG, il codice verra' pubblicato sul gitea del lug in futuro. La parte logica e' fatta con Claude Code, non avevo voglia di scrivere quei pezzi e volevo effettivamente rendere utile il codice che avevo scritto per gestire ncurses. Oh well, spero vi possa essere comunque utile. Buon lavoro / Divertimento!");
|
||||
wwrap_print(aboutWin, 1, 1, "Questo e' un software fatto per Roma2LUG, il codice verra' pubblicato sul gitea del lug in futuro.\nLa parte logica e' fatta con Claude Code, non avevo voglia di scrivere quei pezzi e volevo effettivamente rendere utile il codice che avevo scritto per gestire ncurses.\nOh well, spero vi possa essere comunque utile.\nBuon lavoro / Divertimento!");
|
||||
statusf("Uovo di pasqua ()");
|
||||
wrefresh(aboutWin);
|
||||
getch();
|
||||
@@ -976,7 +976,7 @@ void runOptionsMenu() {
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
void runSellWindow() {
|
||||
json_object *products = getProducts(productPricesFileLocation);
|
||||
json_object *products = getProductsWithStock(productPricesFileLocation, countFileLocation);
|
||||
if (!products) {
|
||||
warningf("Impossibile leggere il file '%s'.", productPricesFileLocation);
|
||||
return;
|
||||
@@ -1031,7 +1031,7 @@ void runSellWindow() {
|
||||
if (res == 0) {
|
||||
int stock = 0;
|
||||
int tracked = 0;
|
||||
if (getProductInventory(productPricesFileLocation, name, &stock, &tracked) == 0 && tracked)
|
||||
if (getProductInventory(productPricesFileLocation, countFileLocation, name, &stock, &tracked) == 0 && tracked)
|
||||
statusf("Registrata vendita: %d x '%s' = %.2f (rimasti: %d)", qty, name, qty * price, stock);
|
||||
else
|
||||
statusf("Registrata vendita: %d x '%s' = %.2f", qty, name, qty * price);
|
||||
@@ -1103,7 +1103,7 @@ void runViewSalesWindow() {
|
||||
|
||||
void runViewProductsWindow() {
|
||||
while (1) {
|
||||
json_object *products = getProducts(productPricesFileLocation);
|
||||
json_object *products = getProductsWithStock(productPricesFileLocation, countFileLocation);
|
||||
if (!products) {
|
||||
warningf("Impossibile leggere il file '%s'.", productPricesFileLocation);
|
||||
return;
|
||||
|
||||
Reference in new issue
Block a user