Files
kupshop/bundles/External/PompoBundle/DRS/Synchronizer/UserCouponSynchronizer.php
2025-08-02 16:30:27 +02:00

121 lines
4.3 KiB
PHP

<?php
declare(strict_types=1);
namespace External\PompoBundle\DRS\Synchronizer;
use Query\Operator;
class UserCouponSynchronizer extends AbstractSynchronizer
{
protected static $type = 'user_coupon';
public function process(): void
{
$this->processNewCouponsToDRS();
$this->processUpdatedCouponsToDRS();
}
/**
* Aktualizace stavu kuponu v DRSu.
*
* Statusy:
* 1 - Aktivní, použitelný kupón
* 2 - Použit
* 3 - Blokován - když není platný datum
*/
protected function processUpdatedCouponsToDRS(): void
{
$qb = sqlQueryBuilder()
->select('duc.id_drs, IF(dc.used="N" AND (NOW() BETWEEN dc.date_from AND dc.date_to), 1, IF(dc.used="Y", 2, 3)) as status')
->from('discounts_coupons', 'dc')
->join('dc', 'drs_user_coupons', 'duc', 'duc.id_coupon = dc.id')
->where('JSON_VALUE(duc.data, \'$.drsStatus\') IS NOT NULL AND JSON_VALUE(duc.data, \'$.drsStatus\') != IF(dc.used="N" AND (NOW() BETWEEN dc.date_from AND dc.date_to), 1, IF(dc.used="Y", 2, 3))');
foreach ($qb->execute() as $item) {
$this->drsApi->updateDB(
'SSD_FictionalVouchers',
[
'Status' => $item['status'],
],
[
'RecID' => $item['id_drs'],
]
);
sqlQueryBuilder()
->update('drs_user_coupons')
->set('data', 'JSON_SET(data, "$.drsStatus", :drsStatus)')
->where(Operator::equals(['id_drs' => $item['id_drs']]))
->setParameter('drsStatus', $item['status'])
->execute();
}
$this->deleteInactiveCouponsFromDRS();
}
/**
* Zapisuje nove vygenerovane poukazy do DRSu. Je to kvuli pokladnam, aby pokladni videli, ze uzivatele
* maji dostupny nejaky poukaz k uplatneni a mohli jim to nabidnout.
*/
protected function processNewCouponsToDRS(): void
{
$qb = sqlQueryBuilder()
->select('dc.id, bpe.points, COALESCE(bpe.name, d.descr) as name, dc.code, dc.date_from, dc.date_to, dc.id_user,
du.id_drs as drs_customer_id, dc.used, (NOW() BETWEEN dc.date_from AND dc.date_to) as date_valid')
->from('discounts_coupons', 'dc')
->join('dc', 'discounts', 'd', 'd.id = dc.id_discount')
->join('dc', 'drs_users', 'du', 'dc.id_user = du.id_user')
->leftJoin('dc', 'bonus_points_exchange', 'bpe', 'bpe.id_discount = dc.id_discount')
->leftJoin('dc', 'drs_user_coupons', 'duc', 'duc.id_coupon = dc.id')
->andWhere('dc.id_user IS NOT NULL AND dc.used = "N"')
->andWhere('duc.id_drs IS NULL')
->andWhere('dc.date_to >= NOW()')
->groupBy('dc.id');
foreach ($qb->execute() as $item) {
$status = $item['used'] === 'Y' ? 2 : 1;
if ($item['date_valid'] != 1) {
$status = 3;
}
$drsId = $this->drsApi->insertDB('SSD_FictionalVouchers', [
'ContactNumber' => $item['drs_customer_id'],
'VoucherName' => $item['name'],
'ValidFrom' => $item['date_from'],
'ValidTill' => $item['date_to'],
'VoucherNumber' => $item['code'],
'BonusPoints' => $item['points'] ?: 0,
'Status' => $status,
], 'RecID');
sqlQueryBuilder()
->insert('drs_user_coupons')
->directValues(
[
'id_drs' => $drsId,
'id_coupon' => $item['id'],
'data' => json_encode(['drsStatus' => $status]),
]
)->execute();
}
}
protected function processItem(array $item): void
{
}
/**
* Smaže neaktivní kupóny z DRSu.
*/
private function deleteInactiveCouponsFromDRS(): void
{
// Aktivni poukazka je pouze ve stavu 1, zaroven musi byt platna platnost
// pokud jedno z toho neplati, tak ten poukaz z DRSu smazeme, protoze stejnak nejde pouzit
$this->drsApi->getQueryBuilder()
->delete('SSD_FictionalVouchers')
->andWhere('Status != 1 OR ValidTill < getdate()')
->execute();
}
}