THELIA Forum

Welcome to the THELIA support and discusssion forum

Offline

#1 Logique dans une fonction

(06-01-2020 14:00:32)


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 smile

(Je bosse en mode développement, et je vide les caches aussi à chaque fois)

Offline


$licencesFind ne sera jamais null. Vide, peut être mais pas null.

un "if(empty($licencesFind)){" serait mieux que "if(is_null($licencesFind)){"

Et ça, ça pue :

if(($licenceorder=$orderId) && ($licenceproduct=$idproduit))
...
elseif(($licenceorder!=$orderId) && ($licenceproduct=$idproduit))

L'opérateur de comparaison d'égalité, c'est == (ou ===), pas =. Là, tu fais des affectations.


OpenStudio Toulouse

Offline


Un grand merci à toi et à ce forum.

Grace à vous, j'ai pu faire le module que je souhaitais.
Je m'en faisais une montagne au debut, mais finalement c'est assez simple et le forum et la doc sont d'une grande utilité.

https://github.com/thibs05/Licence

Offline


Top ! Félicitations !


OpenStudio Toulouse