182 lines
7.0 KiB
C
182 lines
7.0 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;
|
|
};
|
|
|
|
/*
|
|
* 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
|