<commit_before><?php
class DRMCielCompare
{
	protected $xmlIn;
	protected $xmlOut;

	public function __construct($xmlIn, $xmlOut)
	{
		if(is_string($xmlIn)) {
			$this->xmlIn = simplexml_load_string($xmlIn, 'SimpleXMLElement', LIBXML_NOCDATA);
		}else {
			$this->xmlIn = $xmlIn;
		}
		if(is_string($xmlOut)) {
			$this->xmlOut = simplexml_load_string($xmlOut, 'SimpleXMLElement', LIBXML_NOCDATA);
		}else {
			$this->xmlOut = $xmlOut;
		}
	}

	public function sortAndPurgeNull($array){
		$nonnull = array();
		foreach ($array as $key => $value) {
			if(!is_null($value)){
				$nonnull[$key] = $value;
			}
		}
		ksort($nonnull);
		$produits = array();
		$res = array();
		$inaoUnique = null;
		$libelleUnique = null;
		foreach($nonnull as $key => $value) {
			if (preg_match('/\/droits-acquittes\//', $key)) {
				continue;
			}
			if (!preg_match('/produit/', $key)) {
				$res[$key] = $value;
				continue;
			}
			if (preg_match('/produit\/\{array\}\/([A-Z0-9][^\/]+)\/\{array\}\/[a-z]/', $key, $m)) {
				$idproduit = $m[1];
			}else{
				$idproduit = 'produit unique';
				if (preg_match('/produit\/{array}\/code-inao/', $key)) {
					$inaoUnique = $value;
				}
				if (preg_match('/produit\/{array}\/libelle-personnalise/', $key)) {
					$libelleUnique = $value;
				}
			}
			if(!array_key_exists($idproduit,$produits)){
				$produits[$idproduit] = array();
			}
			$produits[$idproduit][$key] = $value;
		}
		foreach ($produits as $key => $produitArr) {
			if(($key == 'produit unique') && $inaoUnique && $libelleUnique){
				$newId = $inaoUnique.'_'.KeyInflector::slugifyCaseSensitive($libelleUnique);
				$produitArrFormatted = array();
				foreach ($produitArr as $keyToChange => $valuetmp) {
					if(!preg_match('/produit\/{array}\/code-inao/', $keyToChange) && !preg_match('/produit\/{array}\/libelle-personnalise/', $keyToChange)){
						$produitArrFormatted[str_replace("/produit/{array}/","/produit/{array}/".$newId."/{array}/",$keyToChange)] = $valuetmp;
					}
				}
				$produitArr = $produitArrFormatted;
			}
			$somme_balance = 0;
			foreach ($produitArr as $key_r => $value) {
				if (preg_match('/balance-stocks/', $key_r)) {
					$somme_balance += $value * 1;
				 	}
			}
			if ($somme_balance) {
				$res = array_merge($res, $produitArr);
			}
		}
		return $res;
	}

	public function getDiff()
	{

		$arrIn = $this->sortAndPurgeNull($this->identifyKey($this->flattenArray($this->xmlToArray($this->xmlIn))));
		$arrOut = $this->sortAndPurgeNull($this->identifyKey($this->flattenArray($this->xmlToArray($this->xmlOut))));
		$diff = array();
		foreach ($arrIn as $key => $value) {
			if (!isset($arrOut[$key]) && $value) {
				$diff[$key] = array($value, null);
			}
			if (isset($arrOut[$key]) && $arrOut[$key] != $value) {
				$diff[$key] = array($value, $arrOut[$key]);
			}
		}
		foreach ($arrOut as $key => $value) {
			if (!isset($arrIn[$key]) && $value) {
				$diff[$key] = array(null, $value);
			}
		}
		return $diff;
	}

	public function hasDiff()
	{
		return (count($this->getDiff()) > 0)? true : false;
	}

	private function xmlToArray($xml)
	{
		return json_decode(json_encode((array)$xml), true);
	}

	private function flattenArray($array)
	{
		return acCouchdbToolsJson::json2FlatenArray($array, null, '_');
	}

	private function identifyKey($array)
	{
		$patternProduit = '/\/produit\/\{array\}\/([0-9]+)\/\{array\}\//i';
		$patternCrd = '/\/compte-crd\/\{array\}\/([0-9]+)\/\{array\}\//i';
		$patternCentilisation = '/\/centilisation\/\{array\}\/([0-9]+)\/\{array\}\//i';
		$newKeyProduit = '';
		$newKeyCrd = '';
		$newKeyCentilisation = '';
		$result = array();
		foreach ($array as $key => $value) {
			if (preg_match('/\/produit\//i', $key) || preg_match('/\/compte-crd\//i', $key) || preg_match('/\/centilisation\//i', $key)) {
				if (preg_match('/\/observations/i', $key)) {
					continue;
				}
				if (preg_match($patternProduit, $key) && (preg_match('/code-inao/i', $key) || preg_match('/libelle-fiscal/i', $key))) {
					$newKeyProduit = $value;
					continue;
				}
				if (preg_match($patternProduit, $key) && preg_match('/libelle-personnalise/i', $key)) {
					$newKeyProduit .= '_'.KeyInflector::slugifyCaseSensitive($value);
					continue;
				}
				if (preg_match($patternCrd, $key) && preg_match('/categorie-fiscale-capsules/i', $key)) {
					$newKeyCrd = $value;
					continue;
				}
				if (preg_match($patternCrd, $key) && preg_match('/type-capsule/i', $key)) {
					$newKeyCrd .= '_'.$value;
					continue;
				}
				if (preg_match($patternCentilisation, $key) && preg_match('/@attributes/i', $key)) {
					if(preg_match('/\/volume$/i', $key)){
						$newKeyCentilisation = $value;
					}
					if(preg_match('/\/volumePersonnalise/i', $key)){
						$newKeyCentilisation .= $value;
					}
					continue;
				}
				$value = $this->cleanValue($value);
				if (preg_match($patternProduit, $key)) {
					$tmp = preg_replace($patternProduit, '/produit/{array}/'.$newKeyProduit.'/{array}/', $key);
					$result[$tmp] = $value;
				}elseif (preg_match($patternCentilisation, $key)){
				  if($value !== 0){
						 $tmp = preg_replace($patternCrd, '/compte-crd/{array}/'.$newKeyCrd.'/{array}/', $key);
						 $tmp = preg_replace($patternCentilisation, '/centilisation/{array}/'.$newKeyCentilisation.'/{array}/', $tmp);

						 $result[$tmp] = $value;
					 }
				} elseif (preg_match($patternCrd, $key)){
						$tmp = preg_replace($patternCrd, '/compte-crd/{array}/'.$newKeyCrd.'/{array}/', $key);
						$result[$tmp] = $value;
				} else {
						$result[$key] = $value;
				}
			}
		}
		return $result;
	}

	private function cleanValue($value)
	{
		if ($value == "false") {
			return 0;
		}
		if ($value == "true") {
			return 1;
		}
		if (is_numeric($value)) {
			return $value * 1;
		}
		return $value;
	}
<commit_msg>la comparaison douaniere gère les volumes en numéric de tel sorte que les 5 ou 4 chiffres après la virgules fonctionnent<commit_after><?php
class DRMCielCompare
{
	protected $xmlIn;
	protected $xmlOut;

	public function __construct($xmlIn, $xmlOut)
	{
		if(is_string($xmlIn)) {
			$this->xmlIn = simplexml_load_string($xmlIn, 'SimpleXMLElement', LIBXML_NOCDATA);
		}else {
			$this->xmlIn = $xmlIn;
		}
		if(is_string($xmlOut)) {
			$this->xmlOut = simplexml_load_string($xmlOut, 'SimpleXMLElement', LIBXML_NOCDATA);
		}else {
			$this->xmlOut = $xmlOut;
		}
	}

	public function sortAndPurgeNull($array){
		$nonnull = array();
		foreach ($array as $key => $value) {
			if(!is_null($value)){
				$nonnull[$key] = $value;
			}
		}
		ksort($nonnull);
		$produits = array();
		$res = array();
		$inaoUnique = null;
		$libelleUnique = null;
		foreach($nonnull as $key => $value) {
			if (preg_match('/\/droits-acquittes\//', $key)) {
				continue;
			}
			if (!preg_match('/produit/', $key)) {
				$res[$key] = $value;
				continue;
			}
			if (preg_match('/produit\/\{array\}\/([A-Z0-9][^\/]+)\/\{array\}\/[a-z]/', $key, $m)) {
				$idproduit = $m[1];
			}else{
				$idproduit = 'produit unique';
				if (preg_match('/produit\/{array}\/code-inao/', $key)) {
					$inaoUnique = $value;
				}
				if (preg_match('/produit\/{array}\/libelle-personnalise/', $key)) {
					$libelleUnique = $value;
				}
			}
			if(!array_key_exists($idproduit,$produits)){
				$produits[$idproduit] = array();
			}
			$produits[$idproduit][$key] = $value;
		}
		foreach ($produits as $key => $produitArr) {
			if(($key == 'produit unique') && $inaoUnique && $libelleUnique){
				$newId = $inaoUnique.'_'.KeyInflector::slugifyCaseSensitive($libelleUnique);
				$produitArrFormatted = array();
				foreach ($produitArr as $keyToChange => $valuetmp) {
					if(!preg_match('/produit\/{array}\/code-inao/', $keyToChange) && !preg_match('/produit\/{array}\/libelle-personnalise/', $keyToChange)){
						$produitArrFormatted[str_replace("/produit/{array}/","/produit/{array}/".$newId."/{array}/",$keyToChange)] = $valuetmp;
					}
				}
				$produitArr = $produitArrFormatted;
			}
			$somme_balance = 0;
			foreach ($produitArr as $key_r => $value) {
				if (preg_match('/balance-stocks/', $key_r)) {
					$somme_balance += $value * 1;
				 	}
			}
			if ($somme_balance) {
				$res = array_merge($res, $produitArr);
			}
		}
		return $res;
	}

	public function getDiff()
	{

		$arrIn = $this->sortAndPurgeNull($this->identifyKey($this->flattenArray($this->xmlToArray($this->xmlIn))));
		$arrOut = $this->sortAndPurgeNull($this->identifyKey($this->flattenArray($this->xmlToArray($this->xmlOut))));
		$diff = array();
		foreach ($arrIn as $key => $value) {
			if (!isset($arrOut[$key]) && $value) {
				$diff[$key] = array($value, null);
			}
			if (isset($arrOut[$key]) && $arrOut[$key] != $value) {
				$diff[$key] = array($value, $arrOut[$key]);
			}
		}
		foreach ($arrOut as $key => $value) {
			if (!isset($arrIn[$key]) && $value) {
				$diff[$key] = array(null, $value);
			}
		}
		return $diff;
	}

	public function hasDiff()
	{
		return (count($this->getDiff()) > 0)? true : false;
	}

	private function xmlToArray($xml)
	{
		return json_decode(json_encode((array)$xml), true);
	}

	private function flattenArray($array)
	{
		return acCouchdbToolsJson::json2FlatenArray($array, null, '_');
	}

	private function identifyKey($array)
	{
		$patternProduit = '/\/produit\/\{array\}\/([0-9]+)\/\{array\}\//i';
		$patternCrd = '/\/compte-crd\/\{array\}\/([0-9]+)\/\{array\}\//i';
		$patternCentilisation = '/\/centilisation\/\{array\}\/([0-9]+)\/\{array\}\//i';
		$newKeyProduit = '';
		$newKeyCrd = '';
		$newKeyCentilisation = '';
		$result = array();
		foreach ($array as $key => $value) {
			if (preg_match('/\/produit\//i', $key) || preg_match('/\/compte-crd\//i', $key) || preg_match('/\/centilisation\//i', $key)) {
				if (preg_match('/\/observations/i', $key)) {
					continue;
				}
				if (preg_match($patternProduit, $key) && (preg_match('/code-inao/i', $key) || preg_match('/libelle-fiscal/i', $key))) {
					$newKeyProduit = $value;
					continue;
				}
				if (preg_match($patternProduit, $key) && preg_match('/libelle-personnalise/i', $key)) {
					$newKeyProduit .= '_'.KeyInflector::slugifyCaseSensitive($value);
					continue;
				}
				if (preg_match($patternCrd, $key) && preg_match('/categorie-fiscale-capsules/i', $key)) {
					$newKeyCrd = $value;
					continue;
				}
				if (preg_match($patternCrd, $key) && preg_match('/type-capsule/i', $key)) {
					$newKeyCrd .= '_'.$value;
					continue;
				}
				if (preg_match($patternCentilisation, $key) && preg_match('/@attributes/i', $key)) {
					if(preg_match('/\/volume$/i', $key)){
						$newKeyCentilisation = $value;
					}
					if(preg_match('/\/volumePersonnalise/i', $key)){
						$newKeyCentilisation .= $value;
					}
					continue;
				}
				$value = $this->cleanValue($value);
				if (preg_match($patternProduit, $key)) {
					$tmp = preg_replace($patternProduit, '/produit/{array}/'.$newKeyProduit.'/{array}/', $key);
					$result[$tmp] = $value;
				}elseif (preg_match($patternCentilisation, $key)){
				  if($value !== 0){
						 $tmp = preg_replace($patternCrd, '/compte-crd/{array}/'.$newKeyCrd.'/{array}/', $key);
						 $tmp = preg_replace($patternCentilisation, '/centilisation/{array}/'.$newKeyCentilisation.'/{array}/', $tmp);

						 $result[$tmp] = $value;
					 }
				} elseif (preg_match($patternCrd, $key)){
						$tmp = preg_replace($patternCrd, '/compte-crd/{array}/'.$newKeyCrd.'/{array}/', $key);
						$result[$tmp] = $value;
				} else {
						$result[$key] = $value;
				}
			}
		}
		return $result;
	}

	private function cleanValue($value)
	{
		if ($value == "false") {
			return 0;
		}
		if ($value == "true") {
			return 1;
		}
		if (is_numeric($value)) {
			return $value * 1;
		}
		if (preg_match("/^(\")?[0-9]+(\.[0-9]+)?(\")?$/",$value)) {
			return floatval($value) * 1;
		}
		return $value;
	}

{'fraction_non_alphanumeric': 0.22059698953992687, 'fraction_numerical': 0.003486691045156901, 'mean_word_length': 3.447806354009077, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 53, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 46}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4330831', 'n_tokens_mistral': 5290, 'n_tokens_neox': 4511, 'n_words': 691}