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(); } }