121 lines
4.3 KiB
PHP
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();
|
|
}
|
|
}
|