<?php
/*
 *
 * Copyright (c) ATRAGENE SARL
 * @website: www.atragene.com
 * @email: contact@atragene.com
 * @author: olivier.lemaitre@atragene.com
 * @company: Atragene Conseil
 * @version: 1.7.4
 * @date: 03/12/2015
 *
 */

	class ModelShippingEnvoismoinscher extends Model {
            
                private $nb_dim = 5;
                private $nb_range = 3;
				
				private $version_platform = VERSION;
				private $platform = 'opencart';
				private $version_lib = '1.1.4';
        
		public function getQuote($address) {
                    
                        unset($this->session->data['shipping_method_adress']);
                        
                        $this->load->language('shipping/envoismoinscher');

                        $userData = array(
				"login" => $this->config->get('envoismoinscher_login'),
				"password" => $this->config->get('envoismoinscher_pwd'),
				"api_key" => $this->config->get('envoismoinscher_key')
			);
                        
			require_once(DIR_SYSTEM.'library/emc/WebService.php');
			require_once(DIR_SYSTEM.'library/emc/Carrier.php');
			require_once(DIR_SYSTEM.'library/emc/ContentCategory.php');
			require_once(DIR_SYSTEM.'library/emc/Country.php');
			require_once(DIR_SYSTEM.'library/emc/ListPoints.php');
			require_once(DIR_SYSTEM.'library/emc/OrderStatus.php');
			require_once(DIR_SYSTEM.'library/emc/ParcelPoint.php');
			require_once(DIR_SYSTEM.'library/emc/Quotation.php');
			require_once(DIR_SYSTEM.'library/emc/Service.php');
			require_once(DIR_SYSTEM.'library/emc/User.php');
			
                        // Précision de l'expéditeur et du destinataire
                        if ($this->customer->isLogged()) {
                            
                            $address = $this->db->query("SELECT * FROM ".DB_PREFIX."address a, ".DB_PREFIX."country c WHERE a.country_id = c.country_id AND address_id =".$this->session->data['shipping_address_id']);

                            if ($address->row['company']  && ($this->config->get('envoismoinscher_clientParticulier') == 0 )) {
                                $to_type = "entreprise";
                            }else{
                                $to_type = "particulier";
                            }
                            
                            $to = array(
                                    "pays" => str_replace("FX", "FR", $address->row['iso_code_2']), 
                                    "code_postal" => $address->row['postcode'], 
                                    "ville" => $address->row['city'], 
                                    "type" => $to_type, 
                                    "societe" => $address->row['company'], 
                                    "adresse" => $address->row['address_1']
                            );
                            
                        } elseif (isset($this->session->data['guest'])) {
                            
                            if ($_SESSION['guest']['shipping']['company']  && ($this->config->get('envoismoinscher_clientParticulier') == 0 )) {
                                $to_type = "entreprise";
                            }else{
                                $to_type = "particulier";
                            }
                            
                            $to = array(
                                    "pays" => str_replace("FX", "FR", $_SESSION['guest']['shipping']['iso_code_2']), 
                                    "code_postal" => $_SESSION['guest']['shipping']['postcode'], 
                                    "ville" => $_SESSION['guest']['shipping']['city'], 
                                    "type" => $to_type, 
                                    "societe" => $_SESSION['guest']['shipping']['company'], 
                                    "adresse" => $_SESSION['guest']['shipping']['address_1']
                            );
                        }
                        
			$from = array(
				"pays" => str_replace("FX", "FR", $this->config->get('envoismoinscher_iso')), 
				"code_postal" => $this->config->get('envoismoinscher_cp'),   
				"ville" => $this->config->get('envoismoinscher_town'), 
				"type" => "entreprise", 
				"societe" => $this->config->get('envoismoinscher_brand'), 
				"adresse" => $this->config->get('envoismoinscher_adress'));
                        
			// Informations sur la cotation (date d'enlèvement, le délai, le code de contenu)
                        
                        // Contruction du tableau de produits du panier
                        $arrayListeProduits = array();
                        $arrayListeProduitsMono = array();
                        $arrayListeProduitsMulti = array();
                        $pid = 1;
                        $code_valeur = 0;

                        // Initialisation des variables multicolis
                        $poids_total = 0;
                        $poids_total_tmp = 0;
                        $longueur_correspondance = 0; 
                        $largeur_correspondance = 0;
                        $hauteur_correspondance = 0;
                             
                        // Table de correspondance des dimensions en fonction du poids des articles
                        $arrayCorrespondancepoidsdimensions = array();
                        for ($i=1; $i<= $this->nb_dim; $i++){
                            $dim_poids = $this->config->get('envoismoinscher_dim_weight_'.$i);
                            if ( $dim_poids != ''){ 
                                array_push($arrayCorrespondancepoidsdimensions, array(
                                    'poids' => $this->config->get('envoismoinscher_dim_weight_'.$i),
                                    'longueur' => $this->config->get('envoismoinscher_dim_lenght_'.$i),
                                    'largeur' => $this->config->get('envoismoinscher_dim_width_'.$i),
                                    'hauteur' => $this->config->get('envoismoinscher_dim_height_'.$i)
                                ));
                            }
                        }

                        foreach($_SESSION['cart'] as $k => $v) {

                            $kid = explode(':', $k);
                            $kid = $kid[0];

                            for($p = 1; $p <= $v; $p++) {

                                $query = "SELECT * FROM `".DB_PREFIX."product` WHERE product_id =".$kid;
                                $product = $this->db->query($query);

                                $poids_unite = $product->row['weight_class_id'];
                                $poids_classe = $this->db->query("SELECT * FROM `".DB_PREFIX."weight_class` WHERE weight_class_id =".$poids_unite);
                                $poids_taux = $poids_classe->row['value'];
                                $poids = $product->row['weight']/$poids_taux;
                                
                                // Cas poids non-renseigné : prendre de la poids par défaut
                                if (!$poids)
                                    $poids = $this->config->get('envoismoinscher_defaultWeight');
                                
                                $dimension_unite = $product->row['length_class_id'];
                                $dimension_classe = $this->db->query("SELECT * FROM `".DB_PREFIX."length_class` WHERE length_class_id =".$dimension_unite);
                                $dimension_cm = $this->db->query("SELECT * FROM `".DB_PREFIX."length_class_description` d, `".DB_PREFIX."length_class` c WHERE d.length_class_id = c.length_class_id AND unit = 'cm'");
                                if (isset($dimension_cm->row['value'])){
                                    $dimension_cm_taux = $dimension_cm->row['value'];
                                }else{
                                    $dimension_cm_taux = 1;
                                }

                                $dimension_taux = $dimension_classe->row['value'];
                                $longueur = $product->row['length']*$dimension_cm_taux/$dimension_taux; 
                                $largeur = $product->row['width']*$dimension_cm_taux/$dimension_taux; 
                                $hauteur = $product->row['height']*$dimension_cm_taux/$dimension_taux;
                       
                                if (!($longueur) || !($largeur) || !($hauteur)) {
                                    
                                    // Cas Multi-colis : récupération des dimensions depuis la table de correspondance
                                    foreach($arrayCorrespondancepoidsdimensions as $u => $d) {

                                        if ($poids < $d['poids']) {

                                            $longueur = $d['longueur']; 
                                            $largeur = $d['largeur'];
                                            $hauteur = $d['hauteur'];
                                        }
                                    }
                                }

                                $prix = $product->row['price'];
                                $code_valeur = $code_valeur+$prix;

                                // Cas Multi-colis : construction du tableau de colis
                                $arrayListeProduitsMulti[$pid] = array(
                                    "poids" => $poids, 
                                    "longueur" => $longueur, 
                                    "largeur" => $largeur,
                                    "hauteur" => $hauteur
                                );
                                
                                $poids_total_tmp = $poids_total_tmp+$poids;
                                $pid++;
                            }
                        }
                                        
                        // Vérification si le poids total est compris dans l'intervalle de poids min/max défini pour le module EnvoiMoinsCher de la boutique
                        $poids_min = $this->config->get('envoismoinscher_minWeight');
                        $poids_max = $this->config->get('envoismoinscher_maxWeight');

                        if ($poids_total_tmp >= $poids_min && $poids_total_tmp <= $poids_max)
                        {
                            // Cas Mono-colis : récupération des dimensions depuis la table de correspondance
                            foreach($arrayCorrespondancepoidsdimensions as $k => $v) {

                                if ($poids_total_tmp < $v['poids'] && $poids_total == 0)
                                {
                                    $poids_total = $poids_total_tmp;
                                    $longueur_correspondance = $v['longueur']; 
                                    $largeur_correspondance = $v['largeur'];
                                    $hauteur_correspondance = $v['hauteur'];
                                }
                            }

                            // Cas Mono-colis : construction du tableau de colis
                            $arrayListeProduitsMono[1] = array(
                                "poids" => $poids_total, 
                                "longueur" => $longueur_correspondance, 
                                "largeur" => $largeur_correspondance,
                                "hauteur" => $hauteur_correspondance
                            );

                            if ($this->config->get('envoismoinscher_multicolis')) {
                                $arrayListeProduits = $arrayListeProduitsMulti;
                            }else{
                                $arrayListeProduits = $arrayListeProduitsMono;
                            }
                            
                            // Create quote information array for EMC request
                            $quotInfo = array("collecte" => date("Y-m-d"), "delai" => "aucun", "code_contenu" => $this->config->get('envoismoinscher_natureSend'), "colis.valeur" => $code_valeur, "type_emballage" => $this->config->get('envoismoinscher_embalSend'));

                            // Initialisation de la classe
                            $cotCl = new Env_Quotation(array("user" => $userData["login"], "pass" => $userData["password"], "key" => $userData["api_key"]));

                            // Initialisation de l'expéditeur et du destinataire
                            $cotCl->setPerson("expediteur", $from);
                            $cotCl->setPerson("destinataire", $to);
							
							//Initialisation des parametres de la plateforme
							$cotCl->setPlatformParams($this->platform, $this->version_platform, $this->version_lib);

                            // Précision de l'environnement de travail 
                            $cotCl->setEnv($this->config->get('envoismoinscher_environment'));

                            // Initialisation du type d'envoi
                            $cotCl->setType(
                                "colis", 
                                $arrayListeProduits
                            );

                            $cotCl->getQuotation($quotInfo);
                           
                            // Si pas d'erreur CURL
                            if(!$cotCl->curlError)
                            {
                                // Si pas d'erreurs de la requête, on affiche le résultat
                                if(!$cotCl->respError)
                                    $cotCl->getOffers(false);
                            }   
							
                            $method_data = array();
                            $quote_data = array();
							
							$i=0;
                            foreach($cotCl->offers as $o => $offre)
                            {
                                if ($this->config->get($offre['service']['code']) == 1)
                                {
                                    $tab_listpoint2 = $offre['delivery']['type'];
										
                                    $price = $this->config->get($offre['service']['code'].'_price');
                                    $price_base = $this->config->get($offre['service']['code'].'_frais_base');
                                    
                                    $cost = 0; //$offre['price']['tax-inclusive'];
                                    if($price)// Cas prix au forfait
                                    {
                                        $price_scale_weight = $poids_total_tmp;
                                        $price_scale_price = $code_valeur;

                                        // Table de correspondance des prix au forfait en fonction du prix ou du volume
                                        $arrayCorrespondanceforfait = array();
                                        for ($i=1; $i<= $this->nb_range; $i++)
                                        {
                                            $range_low = $this->config->get( $offre['service']['code'].'_range_low_'.$i );
                                            if ( $range_low != '')
                                            { 
                                                array_push($arrayCorrespondanceforfait, array(
                                                    'low' => $this->config->get( $offre['service']['code'].'_range_low_'.$i ),
                                                    'high' => $this->config->get( $offre['service']['code'].'_range_high_'.$i ),
                                                    'price' => $this->config->get( $offre['service']['code'].'_range_price_'.$i )
                                                ));
                                            }
                                        }
                                                                                
                                        if ($price_base == "price")
                                        {
                                            // Cas Prix
                                            $price_scale = $price_scale_price;
                                            
                                        } else {
                                            // Cas Volume
                                            $price_scale = $price_scale_weight;
                                        }
                                        
										$valide = "";
										foreach($arrayCorrespondanceforfait as $k => $v)
                                        {
                                            if ($price_scale < $v['high'] && $price_scale >= $v['low'] && $v['low'] <> "")
                                            {
                                                $cost = $v['price'];
												$valide = 1;
                                            }
                                        }
										
                                        if ( !$valide )
                                        {
                                            $cost = $offre['price']['tax-inclusive'];
                                        }
										
                                    } else {
                                        // Cas prix réel
                                        $cost = $offre['price']['tax-inclusive'];
                                    }

                                    // Récupération des frais d'envoi complémentaires
                                    $frais = $this->config->get('envoismoinscher_price');
                                    $cost_comment = "";
                                    if($frais)
                                    {
                                        $cost = $cost + $frais;
                                        $cost_comment = "Frais de manutention : ".$this->currency->format($frais);
                                    }

                                    $quote_data[$offre['service']['code'].'_'.$i] = array(
                                        'code' => 'envoismoinscher.'.$offre['service']['code'].'_'.$i,
                                        'title' => $offre['operator']['label'].' - '.$offre['service']['code'],
                                        'label' => $offre['operator']['label'].' - '.$offre['service']['label'],
                                        'delivery' => $offre['delivery']['date'],
                                        'cost' => $cost,
                                        'tax_class_id' => '',
                                        'text' => $this->currency->format($cost),
                                        'comment' => $cost_comment,
                                        'delai' => $this->config->get($offre['service']['code'].'_delai'),
                                        'operator' => $offre['operator']['code'],
										'service' => $offre['service']['code'],
                                        'relai_point' => $tab_listpoint2
                                    );	      		
                                    $i++;
                                }
                            }

                            $title = $this->language->get('text_title');

                            if ($quote_data)
                            {
                                $method_data = array(
                                    'code'       => 'envoismoinscher',
                                    'title'      => $title,
                                    'quote'      => $quote_data,
                                    'sort_order' => $this->config->get('envoismoinscher_sort_order'),
                                    'error'      => false
                                );
                            }

                            return $method_data;
						}
		}		
	}
?>