Files
yourpart3/src/director_worker.h
Torsten Schulz 1451225978 stabilized app
2026-01-14 14:37:21 +01:00

156 lines
6.0 KiB
C++

#ifndef DIRECTOR_WORKER_H
#define DIRECTOR_WORKER_H
#include "worker.h"
class DirectorWorker : public Worker {
public:
explicit DirectorWorker(ConnectionPool &pool, MessageBroker &broker);
~DirectorWorker() override;
protected:
void run() override;
private:
void performTask();
void startProductions(std::unordered_map<std::string, std::string> director);
void startTransports(std::unordered_map<std::string, std::string>);
void startSellings(std::unordered_map<std::string, std::string>);
void paySalary();
void calculateSatisfaction();
static constexpr const char *QUERY_GET_DIRECTORS = R"(
select d.may_produce, d.may_sell, d.may_start_transport, b.id branch_id, fu.id falukantUserId, d.id
from falukant_data.director d
join falukant_data.falukant_user fu
on fu.id = d.employer_user_id
join falukant_data."character" c
on c.id = d.director_character_id
join falukant_data.branch b
on b.region_id = c.region_id
and b.falukant_user_id = fu.id
where current_time between '08:00:00' and '17:00:00'
)";
static constexpr const char *QUERY_GET_BEST_PRODUCTION = R"(
select fdu."id" falukant_user_id, fdu."money", fdu."certificate", ftp."id" product_id, ftp.label_tr,(select sum("quantity")
from "falukant_data"."stock" fds
where fds."branch_id" = fdb."id") stock_size, coalesce((select sum(coalesce(fdi."quantity", 0))
from "falukant_data"."stock" fds
join "falukant_data"."inventory" fdi
on fdi."stock_id" = fds."id"
where fds."branch_id" = fdb."id"), 0) used_in_stock,
(ftp."sell_cost" * (fdtpw."worth_percent" + (fdk_character."knowledge" * 2 + fdk_director."knowledge") / 3) / 100 - 6 * ftp.category) / (300.0 * ftp. production_time) worth,
fdb."id" branch_id,
(select count("id") from "falukant_data"."production" where "branch_id" = fdb."id") running_productions,
coalesce((select sum(coalesce(fdp.quantity, 0)) quantity from
falukant_data.production fdp where fdp.branch_id = fdb.id), 0) running_productions
from "falukant_data"."director" fdd
join "falukant_data".character fdc
on fdc.id = fdd.director_character_id
join "falukant_data"."falukant_user" fdu
on fdd."employer_user_id" = fdu."id"
join "falukant_data"."character" user_character
on user_character."user_id" = fdu."id"
join "falukant_data"."branch" fdb
on fdb."falukant_user_id" = fdu."id"
and fdb."region_id" = fdc."region_id"
join "falukant_data"."town_product_worth" fdtpw
on fdtpw."region_id" = fdb."region_id"
join "falukant_data"."knowledge" fdk_character
on
fdk_character."product_id" = fdtpw."product_id"
and fdk_character."character_id" = user_character."id"
and fdk_character."product_id" = fdtpw."product_id"
join "falukant_data"."knowledge" fdk_director
on
fdk_director."product_id" = fdtpw."product_id"
and fdk_director."character_id" = fdd."director_character_id"
and fdk_director."product_id" = fdtpw."product_id"
join "falukant_type"."product" ftp
on
ftp."id" = fdtpw."product_id"
and ftp.category <= fdu.certificate
where fdd."id" = $1
order by worth desc
limit 1;
)";
static constexpr const char *QUERY_INSERT_PRODUCTION = R"(
insert into "falukant_data"."production" ("branch_id", "product_id", "quantity")
values ($1, $2, $3)
)";
static constexpr const char *QUERY_GET_INVENTORY = R"(
select i.id, i.product_id, i.quantity, i.quality, p.sell_cost, fu.id user_id, b.region_id, b.id branch_id
from falukant_data.inventory i
join falukant_data.stock s
on s.id = i.stock_id
join falukant_data.branch b
on b.id = s.branch_id
join falukant_data.falukant_user fu
on fu.id = b.falukant_user_id
join falukant_data.director d
on d.employer_user_id = fu.id
join falukant_type.product p
on p.id = i.product_id
where d.id = $1
)";
static constexpr const char *QUERY_REMOVE_INVENTORY = R"(
delete from falukant_data.inventory
where id = $1
)";
static constexpr const char *QUERY_ADD_SELL_LOG = R"(
INSERT INTO falukant_log.sell ("region_id", "product_id", "quantity", "seller_id")
values ($1, $2, $3, $4)
ON CONFLICT ("region_id", "product_id", "seller_id")
DO UPDATE
SET "quantity" = falukant_log.sell."quantity" + EXCLUDED.quantity
)";
static constexpr const char *QUERY_GET_SALARY_TO_PAY = R"(
select d.id, d.employer_user_id, d.income
from falukant_data.director d
where date(d.last_salary_payout) < date(now())
)";
static constexpr const char *QUERY_SET_SALARY_PAYED = R"(
update falukant_data.director
set last_salary_payout = NOW()
where id = $1
)";
static constexpr const char *QUERY_UPDATE_SATISFACTION = R"(
WITH new_sats AS (
SELECT
d.id,
ROUND(
d.income::numeric
/
(
c.title_of_nobility
* POWER(1.231, AVG(k.knowledge) / 1.5)
)
* 100
) AS new_satisfaction
FROM falukant_data.director d
JOIN falukant_data.knowledge k
ON d.director_character_id = k.character_id
JOIN falukant_data.character c
ON c.id = d.director_character_id
GROUP BY d.id, c.title_of_nobility, d.income
)
UPDATE falukant_data.director dir
SET satisfaction = ns.new_satisfaction
FROM new_sats ns
WHERE dir.id = ns.id
-- Nur updaten, wenn sich der Wert tatsächlich ändert:
AND dir.satisfaction IS DISTINCT FROM ns.new_satisfaction
RETURNING dir.employer_user_id;
)";
};
#endif // DIRECTOR_WORKER_H