You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
prodejna/camp/campservice.cpp

412 lines
11 KiB
C++

#include "campservice.h"
#include <settingsservice.h>
#include <seasonservice.h>
#include <numberseriesservice.h>
#include "campshopitem.h"
#include "campseller.h"
#include <cmath>
CampService::CampService()
{
m_pluginId = "CAMP";
m_seller = new CampSeller(this);
}
void CampService::addPerson(const CampDataPtr& data, const AddressbookDataPtr& address)
{
AddressItemPtr addrItem(new AddressItem);
addrItem->setAdbItem(address);
addrItem->setAddress(address->toString());
addrItem->setFirstName(address->firstName());
addrItem->setLastName(address->lastName());
addrItem->setCampData(data);
if (data->people().isEmpty())
{
setOwner(data, addrItem);
}
data->addPerson(addrItem);
}
void CampService::addService(const CampDataPtr& data, const AccServicePtr& service)
{
ServiceItemPtr serviceItem(new ServiceItem);
serviceItem->setName(service->accServiceName());
serviceItem->setCode(service->accServiceCode());
serviceItem->setPrice(service->price());
serviceItem->setSalePossible(service->salePossible());
serviceItem->setType(service->serviceType());
data->addServiceItem(serviceItem);
}
void CampService::addService(CampDataPtr data, AccServicePtr service, QDecDouble price, const QString& description)
{
ServiceItemPtr item = addServiceInt(data, service);
item->setPrice(price);
item->setDescription(description);
}
void CampService::setOwner(const CampDataPtr& data, const AddressItemPtr& person)
{
foreach (AddressItemPtr p, data->people()) {
p->setOwner(false);
}
person->setOwner(true);
data->setOwnerFirstame(person->firstName());
data->setOwnerLastname(person->lastName());
data->setOwnerAddress(person->address());
}
CampDataPtr CampService::create()
{
CampDataPtr data(new CampData);
data->setStart(QDate::currentDate());
data->setEnd(QDate::currentDate());
return data;
}
void CampService::calculate(const CampDataPtr& data)
{
SettingsService srv("CAMP");
m_settings = srv.loadSettings<CampSettings>();
calcServices(data);
calcPeople(data);
calcPrice(data);
}
void CampService::saveCamp(const CampDataPtr& data)
{
if (!checkPermission(PERM_ADD))
{
return;
}
SeasonService seasonSrv;
SeasonPtr season = seasonSrv.active();
data->setSeason(season);
qx::QxSession session;
NumberSeriesService numSrv;
data->setNumSer(numSrv.nextStrForPlugin("CAMP", &session));
addDateAndUser(data, true);
save(data, &session);
}
/*void CampService::updateCamp(CampDataPtr data)
{
if (!checkPermission(PERM_EDIT))
{
return;
}
Transaction tr;
try
{
odb::database *db = Context::instance().db();
db->execute(QString("DELETE FROM ServiceItem WHERE campData = %1").arg(data->id()).toStdString());
db->execute(QString("DELETE FROM AddressItem WHERE campData = %1").arg(data->id()).toStdString());
foreach (ServiceItemPtr item, data->services()) {
item->setCampData(data.toWeakRef());
db->persist(item);
}
foreach (AddressItemPtr item, data->people()) {
item->setCampData(data.toWeakRef());
db->persist(item);
}
addDateAndUser(data, false);
db->update(data);
tr.commit();
}
catch (const odb::exception &ex)
{
emit dbError(ex.what());
emit dbErrorUpdate(ex.what());
return;
}
}*/
/*void CampService::eraseCamp(CampDataPtr data)
{
if (!checkPermission(PERM_DELETE))
{
return;
}
Transaction tr;
try
{
odb::database *db = Context::instance().db();
db->execute(QString("DELETE FROM ServiceItem WHERE campData = %1").arg(data->id()).toStdString());
db->execute(QString("DELETE FROM AddressItem WHERE campData = %1").arg(data->id()).toStdString());
db->erase(data);
tr.commit();
}
catch (const odb::exception &ex)
{
emit dbError(ex.what());
emit dbErrorDelete(ex.what());
return;
}
}*/
/*void CampService::loadItems(CampDataPtr data)
{
Service<AddressItem> srv;
data->setPeople(srv.all(QString("campData = %1").arg(data->id())));
Service<ServiceItem> srvService;
data->setServices(srvService.all(QString("campData = %1").arg(data->id())));
}*/
QList<CampDataPtr> CampService::allForSeason()
{
SeasonService seasonSrv;
SeasonPtr season = seasonSrv.active();
return all(QString("season = %1").arg(QString::number(season->id())));
}
void CampService::calcPeople(CampDataPtr data)
{
foreach (ServiceItemPtr service, data->services()) {
if (service->type() == AccService::ACCFEE)
{
data->removeServiceItem(service);
}
}
Service<PersonPrice> srvPrices;
QList<PersonPricePtr> prices = srvPrices.all("active = 1");
int days = data->start().daysTo(data->end());
QDecDouble sale = data->sale();
bool fixedSale = data->fixedSale();
foreach (AddressItemPtr item, data->people()) {
QDate first(1,1,1);
qint64 daysStart = item->adbItem()->birthDate().daysTo(data->start());
first = first.addDays(daysStart);
int startAge = first.year() - 1;
first = QDate(1,1,1);
qint64 daysEnd = item->adbItem()->birthDate().daysTo(data->end());
first = first.addDays(daysEnd);
int endAge = first.year() - 1;
auto setTotal = [&](){
if (sale != QDecDouble(0) && !fixedSale)
{
QDecDouble itemSale = (item->price() * sale) / 100;
item->setSale(itemSale);
item->setTotalPrice(item->price() - itemSale);
}
else
{
item->setSale(0);
item->setTotalPrice(item->price());
}
addAccFee(data, item, startAge, endAge, days);
};
if (!item->personPrice().isNull())
{
item->setPrice(item->personPrice()->price() * days);
setTotal();
continue;
}
else
{
item->setPrice(0);
}
foreach (PersonPricePtr price, prices) {
if (price->fromAge() <= endAge && price->toAge() >= endAge)
{
item->setPersonPrice(price);
item->setPrice(price->price() * days);
break;
}
}
setTotal();
}
}
void CampService::calcServices(const CampDataPtr& data)
{
QDecDouble sale = data->sale();
bool fixedSale = data->fixedSale();
int days = data->start().daysTo(data->end());
foreach (ServiceItemPtr item, data->services()) {
item->setFullPrice(item->price() * days);
if (sale != QDecDouble(0) && !fixedSale && item->salePossible())
{
QDecDouble itemSale = (item->fullPrice() * sale) / 100;
item->setSale(itemSale);
item->setTotalPrice(item->fullPrice() - itemSale);
}
else
{
item->setSale(0);
item->setTotalPrice(item->fullPrice());
}
}
}
void CampService::calcPrice(const CampDataPtr& data)
{
QDecDouble totalPrice(0);
QDecDouble sale(0);
foreach (ServiceItemPtr service, data->services()) {
totalPrice += service->totalPrice();
sale += service->sale();
}
foreach (AddressItemPtr addr, data->people()) {
totalPrice += addr->totalPrice();
sale += addr->sale();
}
if (data->fixedSale())
{
totalPrice -= data->sale();
sale = data->sale();
}
switch (m_settings->rounding()) {
case Enums::R_UP:
totalPrice = QDecDouble(ceil(totalPrice.toDouble() * pow(10, m_settings->decimalPlaces())) / pow(10, m_settings->decimalPlaces()));
break;
case Enums::R_DOWN:
totalPrice = QDecDouble(floor(totalPrice.toDouble() * pow(10, m_settings->decimalPlaces())) / pow(10, m_settings->decimalPlaces()));
break;
case Enums::R_MATH:
totalPrice = QDecDouble(round(totalPrice.toDouble() * pow(10, m_settings->decimalPlaces())) / pow(10, m_settings->decimalPlaces()));
break;
case Enums::R_NONE:
break;
}
data->setTotalPrice(totalPrice);
data->setTotalSale(sale);
}
void CampService::addAccFee(const CampDataPtr& data, const AddressItemPtr& item, int startAge, int endAge, int days)
{
if (item->adbItem()->ztp())
{
return;
}
auto addAccService = [this, item, data](int count){
ServiceItemPtr srvItem(new ServiceItem);
srvItem->setName(item->firstName() + " " + item->lastName());
srvItem->setDescription(m_settings->accFeeText());
srvItem->setPrice(m_settings->accFee());
srvItem->setTotalPrice(m_settings->accFee() * count);
srvItem->setFullPrice(srvItem->totalPrice());
srvItem->setType(AccService::ACCFEE);
srvItem->setSalePossible(false);
srvItem->setCampData(data);
data->addServiceItem(srvItem);
};
if (startAge == endAge || (startAge >= m_settings->accFeeStartAge() && startAge <= m_settings->accFeeEndAge()))
{
if (endAge >= m_settings->accFeeStartAge() && endAge <= m_settings->accFeeEndAge())
{
addAccService(days);
}
}
else
{
if (endAge >= m_settings->accFeeStartAge() && endAge <= m_settings->accFeeEndAge())
{
QDate tmp(data->end().year(), item->adbItem()->birthDate().month(), item->adbItem()->birthDate().day());
int count = tmp.daysTo(data->end());
addAccService(count);
}
}
}
QList<IShopItemPtr> CampService::shopItems(const QString& category)
{
if (!category.isEmpty()) {
return {};
}
CampShopItemPtr item(new CampShopItem);
QList<IShopItemPtr> items;
items.append(item);
return items;
}
IShopItemPtr CampService::shopItem(int )
{
return CampShopItemPtr(new CampShopItem);
}
void CampService::addedToVoucher(int itemId, int countAdded)
{
CampDataPtr data = loadById(itemId);
if (countAdded > 0)
{
data->setOnVoucher(true);
}
else
{
data->setOnVoucher(false);
}
this->update(data);
}
ISeller *CampService::seller()
{
return m_seller;
}
ServiceItemPtr CampService::addServiceInt(const CampDataPtr& data, const AccServicePtr& service)
{
ServiceItemPtr serviceItem(new ServiceItem);
serviceItem->setName(service->accServiceName());
serviceItem->setCode(service->accServiceCode());
serviceItem->setPrice(service->price());
serviceItem->setSalePossible(service->salePossible());
serviceItem->setType(service->serviceType());
serviceItem->setCampData(data);
data->addServiceItem(serviceItem);
return serviceItem;
}