231 lines
9.7 KiB
C
231 lines
9.7 KiB
C
#ifndef LOGIC_H
|
|
#define LOGIC_H
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <ncurses.h>
|
|
#include "jsonFile.h"
|
|
|
|
#define PRODUCT_STOCK_UNLIMITED (-1)
|
|
|
|
struct product {
|
|
float cost;
|
|
int numberSold;
|
|
char name;
|
|
};
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
/* Prodotti */
|
|
/* ------------------------------------------------------------------ */
|
|
|
|
/**
|
|
* @brief Restituisce l'array JSON contenente tutti i 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.
|
|
*/
|
|
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.
|
|
*/
|
|
void listProducts(const char *fname);
|
|
|
|
/**
|
|
* @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.
|
|
*/
|
|
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.
|
|
*/
|
|
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.
|
|
*/
|
|
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.
|
|
*/
|
|
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.
|
|
*/
|
|
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.
|
|
*/
|
|
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.
|
|
* @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.
|
|
*/
|
|
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);
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
/* 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).
|
|
*/
|
|
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.
|
|
*/
|
|
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.
|
|
*/
|
|
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.
|
|
*/
|
|
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.
|
|
*/
|
|
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.
|
|
*/
|
|
int recordSale(const char *productsFile, const char *soldFile, const char *name, int qty);
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
/* Entrate */
|
|
/* ------------------------------------------------------------------ */
|
|
|
|
/**
|
|
* @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.
|
|
*/
|
|
double getTotalRevenue(const char *productsFile, const char *soldFile);
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
/* Export */
|
|
/* ------------------------------------------------------------------ */
|
|
|
|
/**
|
|
* @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.
|
|
*/
|
|
int exportSalesToCsv(const char *productsFile, const char *soldFile, const char *outFile);
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
/* Config */
|
|
/* ------------------------------------------------------------------ */
|
|
|
|
/**
|
|
* @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.
|
|
*/
|
|
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.
|
|
*/
|
|
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.
|
|
*/
|
|
int saveAppConfig(const char *fname);
|
|
|
|
#endif
|