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;
|
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 */
|
/* 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.
|
* @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);
|
json_object *getProducts(const char *fname);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Stampa a schermo (tramite ncurses) la lista dei prodotti con relativo prezzo, inventario e tag bundle.
|
* @brief Come getProducts, ma ogni prodotto ha in piu' il campo "stock" calcolato
|
||||||
* @param fname Percorso del file JSON dei prodotti.
|
* (-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.
|
* @brief Aggiunge un nuovo prodotto con prezzo e inventario illimitato.
|
||||||
* @param fname Percorso del file JSON dei prodotti.
|
* @return 0 in caso di successo, 1 se il prodotto esiste gia', -1 in caso di errore.
|
||||||
* @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.
|
|
||||||
*/
|
*/
|
||||||
int addProduct(const char *fname, const char *name, double price);
|
int addProduct(const char *fname, const char *name, double price);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Aggiunge un nuovo prodotto specificando prezzo e quantità iniziale in magazzino.
|
* @brief Aggiunge un nuovo prodotto specificando prezzo e giacenza iniziale.
|
||||||
* @param fname Percorso del file JSON dei prodotti.
|
* @param stock Giacenza iniziale (negativo per inventario illimitato).
|
||||||
* @param name Nome del prodotto.
|
* @return 0 in caso di successo, 1 se il prodotto esiste gia', -1 in caso di errore.
|
||||||
* @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.
|
|
||||||
*/
|
*/
|
||||||
int addProductWithInventory(const char *fname, const char *name, double price, int stock);
|
int addProductWithInventory(const char *fname, const char *name, double price, int stock);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Aggiunge un prodotto composto (bundle) costituito da altri componenti.
|
* @brief Aggiunge un prodotto composto (bundle).
|
||||||
* @param fname Percorso del file JSON dei prodotti.
|
* @param components Array JSON di {"name": ..., "qty": ...}; il bundle ne prende possesso in caso di successo.
|
||||||
* @param name Nome del bundle.
|
* @return 0 in caso di successo, 1 se il prodotto esiste gia', -1 in caso di errore.
|
||||||
* @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.
|
|
||||||
*/
|
*/
|
||||||
int addBundleProduct(const char *fname, const char *name, double price, json_object *components);
|
int addBundleProduct(const char *fname, const char *name, double price, json_object *components);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Ottiene il prezzo di un prodotto specifico.
|
* @brief Ottiene il prezzo di un prodotto.
|
||||||
* @param fname Percorso del file JSON dei prodotti.
|
* @return Il prezzo, oppure -1.0 se non trovato o in caso di errore.
|
||||||
* @param name Nome del prodotto da cercare.
|
|
||||||
* @return Il prezzo del prodotto, oppure -1.0 se non trovato o in caso di errore.
|
|
||||||
*/
|
*/
|
||||||
double getPrice(const char *fname, const char *name);
|
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.
|
* @brief Aggiorna nome e prezzo di un prodotto lasciando invariato lo stock corrente.
|
||||||
* @param productsFile Percorso del file JSON dei prodotti.
|
* @return 0 ok, 1 non trovato, 2 nome gia' usato, -1 errore.
|
||||||
* @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.
|
|
||||||
*/
|
*/
|
||||||
int updateProduct(const char *productsFile, const char *soldFile, const char *oldName, const char *newName, double price);
|
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.
|
* @brief Aggiorna nome, prezzo e stock di un prodotto.
|
||||||
* @param productsFile Percorso del file JSON dei prodotti.
|
* Se il nome cambia aggiorna nella stessa operazione file vendite e riferimenti nei bundle.
|
||||||
* @param soldFile Percorso del file JSON delle vendite.
|
* @param stock Giacenza ATTUALE desiderata (negativo = infinita).
|
||||||
* @param oldName Nome attuale del prodotto.
|
* @return 0 ok, 1 non trovato, 2 nome gia' usato, -1 errore.
|
||||||
* @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.
|
|
||||||
*/
|
*/
|
||||||
int updateProductWithInventory(const char *productsFile, const char *soldFile, const char *oldName, const char *newName, double price, int stock);
|
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.
|
* @brief Legge lo stock corrente (calcolato) di un prodotto.
|
||||||
* @param fname Percorso del file JSON dei prodotti.
|
* @param productsFile Percorso del file JSON dei prodotti.
|
||||||
|
* @param soldFile Percorso del file JSON delle vendite.
|
||||||
* @param name Nome del prodotto.
|
* @param name Nome del prodotto.
|
||||||
* @param stock Puntatore a intero in cui salvare la quantità di magazzino.
|
* @param stock Quantita' corrente (PRODUCT_STOCK_UNLIMITED se non tracciato).
|
||||||
* @param tracked Puntatore a intero in cui salvare se l'inventario è tracciato (1) o meno (0).
|
* @param tracked 1 se l'inventario e' tracciato, 0 altrimenti.
|
||||||
* @return 0 in caso di successo, 1 se il prodotto non viene trovato, -1 in caso di errore.
|
* @return 0 ok, 1 prodotto non trovato, -1 errore.
|
||||||
*/
|
*/
|
||||||
int getProductInventory(const char *fname, const char *name, int *stock, int *tracked);
|
int getProductInventory(const char *productsFile, const char *soldFile, 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);
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------ */
|
||||||
/* Copie vendute */
|
/* Copie vendute */
|
||||||
/* ------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------ */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Restituisce il numero di copie vendute di un determinato prodotto.
|
* @brief Numero di copie vendute di un prodotto.
|
||||||
* @param fname Percorso del file JSON delle vendite.
|
* @return Copie vendute (0 se non presente, -1 in caso di errore).
|
||||||
* @param name Nome del prodotto.
|
|
||||||
* @return Il numero di copie vendute (0 se non presente, -1 in caso di errore).
|
|
||||||
*/
|
*/
|
||||||
int getCount(const char *fname, const char *name);
|
int getCount(const char *fname, const char *name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Stampa a schermo (tramite ncurses) la lista delle vendite registrate per ciascun prodotto.
|
* @brief Stampa a schermo (ncurses) le vendite registrate per ciascun prodotto.
|
||||||
* @param fname Percorso del file JSON delle vendite.
|
|
||||||
*/
|
*/
|
||||||
void listSold(const char *fname);
|
void listSold(const char *fname);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Aggiunge una quantità di copie vendute per un prodotto (creando la voce se non esiste).
|
* @brief Aggiunge copie vendute per un prodotto (crea la voce se non esiste).
|
||||||
* @param fname Percorso del file JSON delle vendite.
|
* Non controlla lo stock: per questo usare recordSale().
|
||||||
* @param name Nome del prodotto.
|
* @return 0 ok, -1 errore.
|
||||||
* @param qty Quantità venduta da aggiungere.
|
|
||||||
* @return 0 in caso di successo, -1 in caso di errore.
|
|
||||||
*/
|
*/
|
||||||
int addSold(const char *fname, const char *name, int qty);
|
int addSold(const char *fname, const char *name, int qty);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Elimina la registrazione delle vendite di un prodotto e ripristina l'inventario corrispondente.
|
* @brief Elimina la registrazione delle vendite di un prodotto.
|
||||||
* @param productsFile Percorso del file JSON dei prodotti.
|
* Lo stock si "ripristina" da solo perche' e' derivato.
|
||||||
* @param soldFile Percorso del file JSON delle vendite.
|
* @param productsFile Non usato, mantenuto per compatibilita'.
|
||||||
* @param name Nome del prodotto di cui eliminare le vendite.
|
* @return 0 ok, 1 vendita non presente, -1 errore.
|
||||||
* @return 0 in caso di successo, 1 se la vendita non è presente, -1 o codice di errore in caso di fallimento.
|
|
||||||
*/
|
*/
|
||||||
int deleteSold(const char *productsFile, const char *soldFile, const char *name);
|
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.
|
* @brief Imposta le copie vendute di un prodotto; se aumentano controlla la disponibilita'.
|
||||||
* @param productsFile Percorso del file JSON dei prodotti.
|
* @return 0 ok, 1 vendita non presente, 2 scorta insufficiente, -1 errore.
|
||||||
* @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.
|
|
||||||
*/
|
*/
|
||||||
int updateSold(const char *productsFile, const char *soldFile, const char *name, int qty);
|
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.
|
* @brief Registra una vendita dopo aver verificato la disponibilita' (anche dei componenti, se bundle).
|
||||||
* @param productsFile Percorso del file JSON dei prodotti.
|
* Scrive solo il file vendite.
|
||||||
* @param soldFile Percorso del file JSON delle vendite.
|
* @return 0 ok, 1 prodotto inesistente, 2 scorta insufficiente, -1 errore.
|
||||||
* @param name Nome del prodotto venduto.
|
|
||||||
* @param qty Quantità venduta.
|
|
||||||
* @return 0 in caso di successo, codice di errore in caso di fallimento.
|
|
||||||
*/
|
*/
|
||||||
int recordSale(const char *productsFile, const char *soldFile, const char *name, int qty);
|
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.
|
* @brief Entrate totali: somma di prezzo * copie vendute.
|
||||||
* @param productsFile Percorso del file JSON dei prodotti.
|
* @return Il totale, oppure -1.0 in caso di errore.
|
||||||
* @param soldFile Percorso del file JSON delle vendite.
|
|
||||||
* @return Il totale delle entrate, oppure -1.0 in caso di errore.
|
|
||||||
*/
|
*/
|
||||||
double getTotalRevenue(const char *productsFile, const char *soldFile);
|
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.
|
* @brief Esporta prodotti e vendite in CSV (separatore ';').
|
||||||
* @param productsFile Percorso del file JSON dei prodotti.
|
* @return 0 ok, -1 errore di lettura prodotti, -2 errore di apertura del file di destinazione.
|
||||||
* @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.
|
|
||||||
*/
|
*/
|
||||||
int exportSalesToCsv(const char *productsFile, const char *soldFile, const char *outFile);
|
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.
|
* @brief Crea il file di configurazione se non esiste.
|
||||||
* @param fname Percorso del file di configurazione.
|
* @return 0 ok, altro in caso di errore.
|
||||||
* @return 0 in caso di successo, codice di errore altrimenti.
|
|
||||||
*/
|
*/
|
||||||
int ensureAppConfig(const char *fname);
|
int ensureAppConfig(const char *fname);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Carica la configurazione dell'applicazione dal file specificato.
|
* @brief Carica la configurazione dal file specificato.
|
||||||
* @param fname Percorso del file di configurazione.
|
* @return 0 ok, -1 errore.
|
||||||
* @return 0 in caso di successo, -1 in caso di errore.
|
|
||||||
*/
|
*/
|
||||||
int loadAppConfig(const char *fname);
|
int loadAppConfig(const char *fname);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Salva la configurazione corrente dell'applicazione sul file specificato.
|
* @brief Salva la configurazione corrente sul file specificato.
|
||||||
* @param fname Percorso del file di configurazione.
|
* @return 0 ok, -1 errore.
|
||||||
* @return 0 in caso di successo, -1 in caso di errore.
|
|
||||||
*/
|
*/
|
||||||
int saveAppConfig(const char *fname);
|
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(){
|
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");
|
mvprintw(LINES -1, COLS / 2 - 25, "Product Manager by Vincenzo Nikodem Cesqui Podiani");
|
||||||
}
|
}
|
||||||
@@ -764,7 +764,7 @@ static void showCreateBundleWindow(void) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
json_object *products = getProducts(productPricesFileLocation);
|
json_object *products = getProductsWithStock(productPricesFileLocation, countFileLocation);
|
||||||
if (!products) {
|
if (!products) {
|
||||||
warningf("Impossibile leggere il file '%s'.", productPricesFileLocation);
|
warningf("Impossibile leggere il file '%s'.", productPricesFileLocation);
|
||||||
return;
|
return;
|
||||||
@@ -927,7 +927,7 @@ void runAboutWindow() {
|
|||||||
WINDOW *aboutWin;
|
WINDOW *aboutWin;
|
||||||
aboutWin = create_newwin(LINES / 2 - 2, COLS / 2, LINES / 2, 0);
|
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 ()");
|
statusf("Uovo di pasqua ()");
|
||||||
wrefresh(aboutWin);
|
wrefresh(aboutWin);
|
||||||
getch();
|
getch();
|
||||||
@@ -976,7 +976,7 @@ void runOptionsMenu() {
|
|||||||
/* ------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------ */
|
||||||
|
|
||||||
void runSellWindow() {
|
void runSellWindow() {
|
||||||
json_object *products = getProducts(productPricesFileLocation);
|
json_object *products = getProductsWithStock(productPricesFileLocation, countFileLocation);
|
||||||
if (!products) {
|
if (!products) {
|
||||||
warningf("Impossibile leggere il file '%s'.", productPricesFileLocation);
|
warningf("Impossibile leggere il file '%s'.", productPricesFileLocation);
|
||||||
return;
|
return;
|
||||||
@@ -1031,7 +1031,7 @@ void runSellWindow() {
|
|||||||
if (res == 0) {
|
if (res == 0) {
|
||||||
int stock = 0;
|
int stock = 0;
|
||||||
int tracked = 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);
|
statusf("Registrata vendita: %d x '%s' = %.2f (rimasti: %d)", qty, name, qty * price, stock);
|
||||||
else
|
else
|
||||||
statusf("Registrata vendita: %d x '%s' = %.2f", qty, name, qty * price);
|
statusf("Registrata vendita: %d x '%s' = %.2f", qty, name, qty * price);
|
||||||
@@ -1103,7 +1103,7 @@ void runViewSalesWindow() {
|
|||||||
|
|
||||||
void runViewProductsWindow() {
|
void runViewProductsWindow() {
|
||||||
while (1) {
|
while (1) {
|
||||||
json_object *products = getProducts(productPricesFileLocation);
|
json_object *products = getProductsWithStock(productPricesFileLocation, countFileLocation);
|
||||||
if (!products) {
|
if (!products) {
|
||||||
warningf("Impossibile leggere il file '%s'.", productPricesFileLocation);
|
warningf("Impossibile leggere il file '%s'.", productPricesFileLocation);
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in new issue
Block a user