Bonjour tout le monde,
je bloque un peu dans ma logique (surement due à la fatigue au passage)
Code de la fonction:
class SendMail implements EventSubscriberInterface
{
public function createKeys(OrderEvent $event)
{
$order = $event->getOrder();
$orderId = $event->getOrder()->getId();
$customerId= $event->getOrder()->getCustomerId();
$dateExpiration=$event->getOrder()->getInvoiceDate()->add(date_interval_create_from_date_string('+1 Year'));
$tokens = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$segment_chars = 5;
$num_segments = 4;
$key_string = '';
for ($i = 0; $i < $num_segments; $i++)
{
$segment = '';
for ($j = 0; $j < $segment_chars; $j++) {
$segment .= $tokens[rand(0, 35)];
}
$key_string .= $segment;
if ($i < ($num_segments - 1))
{
$key_string .= '-';
}
}
if ($order->hasVirtualProduct() && $order->isPaid(true))
{
$produitsCommandes = OrderProductQuery::create()->findByOrderId($orderId);
$licencesFind= LicenceQuery::create()->findByCustomerId($customerId);
/** @var OrderProduct $produitCommande */
foreach ($produitsCommandes as $produitCommande) {
$produit=ProductQuery::create()->findOneByRef($produitCommande->getProductRef());
$idproduit=$produit->getId();
if(is_null($licencesFind)){
$licence= new Licence;
$licence
->setOrderId($orderId)
->setProductId($idproduit)
->setCustomerId($customerId)
->setProductKey($key_string)
->setExpirationDate($dateExpiration)
->save();
}
else
{
/** @var Licence $licenceFind */
foreach ($licencesFind as $licenceFind){
$keyexist=$licenceFind->getProductKey();
$licenceorder=$licenceFind->getOrderId();
$licenceproduct=$licenceFind->getProductId();
$newdateExpiration=$licenceFind->getExpirationDate()->add(date_interval_create_from_date_string('+1 Year'));
if(($licenceorder=$orderId) && ($licenceproduct=$idproduit))
{
$licence= $licenceFind;
$licence
->save();
}
elseif(empty($keyexist)){
$licence= $licenceFind;
$licence
->setProductKey($key_string)
->save();
}
elseif(($licenceorder!=$orderId) && ($licenceproduct=$idproduit))
{
$licence= new Licence;
$licence
->setOrderId($orderId)
->setProductId($idproduit)
->setCustomerId($customerId)
->setProductKey($keyexist)
->setExpirationDate($newdateExpiration)
->save();
}
elseif(($licenceorder!=$orderId) && ($licenceproduct!=$idproduit))
{
$licence= new Licence;
$licence
->setOrderId($orderId)
->setProductId($idproduit)
->setCustomerId($customerId)
->setProductKey($key_string)
->setExpirationDate($dateExpiration)
->save();
}
elseif(is_null($licenceorder))
{
$licence= new Licence;
$licence
->setOrderId($orderId)
->setProductId($idproduit)
->setCustomerId($customerId)
->setProductKey($key_string)
->setExpirationDate($dateExpiration)
->save();
}
}
}
}
}
}
Structure de la base:
<table name="Licence" namespace="Licence\Model">
<column autoIncrement="true" name="id" primaryKey="true" required="true" type="INTEGER" />
<column name="order_id" type="INTEGER" />
<column name="customer_id" type="INTEGER" />
<column name="product_id" type="INTEGER" />
<column name="product_key" type="LONGVARCHAR" />
<column name="active_machine" type="LONGVARCHAR" />
<column name="expiration_date" type="DATE" />
<behavior name="versionable">
<parameter name="log_created_at" value="true" />
<parameter name="log_created_by" value="true" />
</behavior>
</table>
Le probleme de la requête $licencesfind
J'ai l'impression que celle ci n'est pas exécuté... et j'ai beau tourné dans tous les sens... je bloque... Si quelqu'un a une piste, souvent un oeil externe aide pas mal.
Si je ne met pas la boucle if/else et que je met ma requête pour enregistrer en base cela fonctionne.
Mais ma problématique est que si un enregistrement avec un couple $customerid/$idproduit existe, je veux garder le meme $productkey et pas en créer un autre.
En espérant avoir été clair dans ma problématique
(Je bosse en mode développement, et je vide les caches aussi à chaque fois)