#include "csvreader.h" #include "utils.h" #include // #include #include #ifdef DELETE #undef DELETE #endif namespace fs = std::filesystem; std::size_t CsvReader::readSellersFromFile(const fs::path &filePath, Marketplace *market) { #if defined(_WIN64) || defined(_WIN32) // Windows: Somhow this is necessary in order to open file names with umlauts auto wide = filePath.wstring(); std::string fileName(wide.begin(), wide.end()); std::ifstream infile(fileName); #else // csv::CSVReader csvReader(filePath.string(), format); std::ifstream infile(filePath.string()); #endif for (auto &seller : market->getSellers()) { seller->setState(Seller::State::DELETE); } market->storeToDb(true); std::string line; while (getline(infile, line)) { std::vector strs; boost::split(strs, line, boost::is_any_of(";")); auto seller = std::make_unique(); try { int sellerNo = std::stoi(strs[0]); seller->setSellerNo(sellerNo); } catch (std::invalid_argument const &ex) { continue; } if (isNumber(strs[1])) seller->setNumArticlesOffered(std::stoi(strs[1])); else seller->setNumArticlesOffered(0); // If both, first name and last name, are empty, use N. N. // Else, use the real values. if (strs[2].empty() && strs[2].empty()) { seller->setFirstName("N."); seller->setLastName("N."); } else { std::string firstName = strs[2]; seller->setFirstName(trim(firstName)); std::string lastName = strs[3]; seller->setLastName(trim(lastName)); } market->getSellers().push_back(std::move(seller)); } // Add one additional seller "RESERVE RESERVE" auto seller = std::make_unique(); seller->setSellerNo(market->getNextSellerNo()); seller->setFirstName("RESERVE"); seller->setLastName("RESERVE"); market->getSellers().push_back(std::move(seller)); // If there was no special seller "Sonderkonto" in import data, then create one auto specialSeller = market->findSellerWithSellerNo(0); if (!specialSeller) { auto seller = std::make_unique(); seller->setSellerNo(0); seller->setLastName("Sonderkonto"); seller->setFirstName("Sonderkonto"); seller->setNumArticlesOffered(0); market->getSellers().push_back(std::move(seller)); } market->sortSellers(); market->storeToDb(); return market->getSellers().size() - 1; // minus 1 because we don't count the "special" seller }