#ifndef LOGIC_H #define LOGIC_H #include #include #include #include #include "jsonFile.h" #define PRODUCT_STOCK_UNLIMITED (-1) struct product { float cost; int numberSold; 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, cosi' come salvati su file * (quindi con "initial" e senza stock corrente). * @param fname Percorso del file JSON dei prodotti. * @return Array JSON (da liberare con json_object_put()), oppure NULL in caso di errore. */ json_object *getProducts(const char *fname); /** * @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. */ json_object *getProductsWithStock(const char *productsFile, const char *soldFile); /** * @brief Aggiunge un nuovo prodotto con prezzo e inventario illimitato. * @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 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). * @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. * @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 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 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 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 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 *productsFile, const char *soldFile, const char *name, int *stock, int *tracked); /* ------------------------------------------------------------------ */ /* Copie vendute */ /* ------------------------------------------------------------------ */ /** * @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 (ncurses) le vendite registrate per ciascun prodotto. */ void listSold(const char *fname); /** * @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. * 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 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 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); /* ------------------------------------------------------------------ */ /* Entrate */ /* ------------------------------------------------------------------ */ /** * @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); /* ------------------------------------------------------------------ */ /* Export */ /* ------------------------------------------------------------------ */ /** * @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); /* ------------------------------------------------------------------ */ /* Config */ /* ------------------------------------------------------------------ */ /** * @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 dal file specificato. * @return 0 ok, -1 errore. */ int loadAppConfig(const char *fname); /** * @brief Salva la configurazione corrente sul file specificato. * @return 0 ok, -1 errore. */ int saveAppConfig(const char *fname); #endif