<commit_before><?php

class VracValidation extends DocumentValidation {

    protected $teledeclaration = false;

    public function __construct($document, $isTeledeclarationMode = false, $options = null) {
        $this->teledeclaration = $isTeledeclarationMode;
        parent::__construct($document, $options);
    }

    public function configure() {
        if ($this->teledeclaration) {
            $this->addControle('vigilance', 'soussigne_vendeur_nonactif', "Le compte du vendeur n'est pas actif");
            $this->addControle('vigilance', 'soussigne_acheteur_nonactif', "Le compte de l'acheteur n'est pas actif");
            $this->addControle('vigilance', 'soussigne_courtier_nonactif', "Le compte du courtier n'est pas actif");
            $this->addControle('erreur', 'date_enlevement_inf_minimale', "La date d'enlèvement est inférieure à la date minimale d'enlèvement du produit");

            $this->addControle('erreur', 'soussigne_vendeur_absence_mail', "Aucun email renseigné pour");
            $this->addControle('erreur', 'soussigne_acheteur_absence_mail', "Aucun email renseigné pour");
            $this->addControle('erreur', 'soussigne_courtier_absence_mail', "Aucun email renseigné pour");

            $this->addControle('erreur', 'date_enlevement_sup_maximale', "La date d'enlèvement est supérieure à la date maximale d'enlèvement du produit");
        } else {
            $this->addControle('vigilance', 'stock_commercialisable_negatif', 'Le stock commercialisable est inférieur au stock proposé');
            $this->addControle('vigilance', 'contrats_similaires', null);
            $this->addControle('vigilance', 'prix_definitif_expected', "Le prix définitif de contrat n'a pas été saisi");
        }
        $this->addControle('vigilance', 'dates_retiraison_visa', 'La date de retiraison ne peut pas être inférieure à la date du contrat');

        $this->addControle('erreur', 'volume_expected', 'Le volume du contrat est manquant');
        $this->addControle('erreur', 'prix_initial_expected', 'Le prix du contrat est manquant');
        $this->addControle('erreur', 'dates_retiraison', 'La date limite de retiraison ne peut pas être inférieure à la date de début de retiraison');
        $this->addControle('erreur', 'viti_raisins_mouts_type_vins', "Le viticulteur ne peut pas faire de contrats de vins (il possède une exclusivité de raisins/moûts)");
        $this->addControle('erreur', 'quantite_raisin_surface_expected', "La quantité et/ou la surface sont requises");
        $this->addControle('erreur', 'quantite_raisin_surface_expected', "La quantité et/ou la surface sont requises");
        $this->addControle('erreur', 'cepage_autorise', "Cépage non autorisé pour le produit");
    }

    public function controle() {

        if ($this->teledeclaration) {
            $this->checkSoussigneAbsenceMail();
            $this->checkSoussigneCompteNonActive();
            $this->checkDateEnlevement();
        } else {
            $contrats_similaires = VracClient::getInstance()->retrieveSimilaryContracts($this->document);
            if ($nbsimilaires = count(array_keys($contrats_similaires))) {
                $contrat_similaires_str = $nbsimilaires . ' contrat(s) similaire(s) possèdant les même soussignés, produit et volume (ou quantité) ';
                foreach ($contrats_similaires as $contrat_similaire) {
                    $vrac_sim = VracClient::getInstance()->find($contrat_similaire->id);
                    $contrat_similaires_str.= "&nbsp;&nbsp;&nbsp;  <a href='" . $this->generateUrl('vrac_visualisation', $vrac_sim) . "'>" . substr($vrac_sim->getNumeroContrat(), 0, 4) . ' ' . substr($vrac_sim->getNumeroContrat(), 4) . "</a>";
                }
                $this->addPoint('vigilance', 'contrats_similaires', $contrat_similaires_str);
            }

            if ($this->document->hasPrixVariable() && !$this->document->hasPrixDefinitif()) {
                $this->addPoint('vigilance', 'prix_definitif_expected', 'Saisir le prix définitif', $this->generateUrl('vrac_marche', $this->document));
            }
        }

        if (!$this->document->volume_propose && $this->document->type_transaction != VracClient::TYPE_TRANSACTION_RAISINS) {
            $this->addPoint('erreur', 'volume_expected', 'Saisir un volume', $this->generateUrl('vrac_marche', $this->document));
        } elseif ($this->document->type_transaction == VracClient::TYPE_TRANSACTION_RAISINS && !$this->document->surface && !$this->document->raisin_quantite) {
            $this->addPoint('erreur', 'quantite_raisin_surface_expected', "Saisir au moins l'une de ces informations", $this->generateUrl('vrac_marche', $this->document));
        } elseif (!$this->document->volume_propose && $this->document->type_transaction == VracClient::TYPE_TRANSACTION_RAISINS) {
            $this->addPoint('vigilance', 'quantite_raisin_expected', 'Saisir la quantité', $this->generateUrl('vrac_marche', $this->document));
        }

        if ($this->document->isVitiRaisinsMoutsTypeVins()) {
            $this->addPoint('erreur', 'viti_raisins_mouts_type_vins', 'Sodifier vendeur', $this->generateUrl('etablissement_visualisation', EtablissementClient::getInstance()->find($this->document->vendeur_identifiant)));
        }
        if (is_null($this->document->prix_initial_unitaire)) {
            $this->addPoint('erreur', 'prix_initial_expected', 'Saisir un prix', $this->generateUrl('vrac_marche', $this->document));
        }
        if ($this->document->date_debut_retiraison && $this->document->date_limite_retiraison) {
            if ($this->document->date_limite_retiraison < $this->document->date_debut_retiraison) {
                $this->addPoint('erreur', 'dates_retiraison', 'Modifier la date', $this->generateUrl('vrac_condition', $this->document));
            }
        }

        if ($this->document->exist('versement_fa') && ($this->document->versement_fa == VracClient::VERSEMENT_FA_NOUVEAU) && $this->document->date_debut_retiraison && $this->document->date_debut_retiraison < $this->document->date_campagne) {
            $this->addPoint('vigilance', 'dates_retiraison_visa', 'Modifier la date', $this->generateUrl('vrac_condition', $this->document));
        }

        if (!$this->document->isCepageAutorise()) {
            $this->addPoint('erreur', 'cepage_autorise', 'Modifier le cépage', $this->generateUrl('vrac_marche', $this->document));
        }
    }

    private function checkSoussigneAbsenceMail() {
        $vendeurEtb = EtablissementClient::getInstance()->findByIdentifiant($this->document->vendeur_identifiant);

        if (!$vendeurEtb->getEmailTeledeclaration()) {
            $this->addPoint('erreur', 'soussigne_vendeur_absence_mail', $vendeurEtb->nom);<commit_msg>Ajout d'un point de vigilance sur le label (UNIQUE)<commit_after><?php

class VracValidation extends DocumentValidation {

    protected $teledeclaration = false;

    public function __construct($document, $isTeledeclarationMode = false, $options = null) {
        $this->teledeclaration = $isTeledeclarationMode;
        parent::__construct($document, $options);
    }

    public function configure() {
        if ($this->teledeclaration) {
            $this->addControle('vigilance', 'soussigne_vendeur_nonactif', "Le compte du vendeur n'est pas actif");
            $this->addControle('vigilance', 'soussigne_acheteur_nonactif', "Le compte de l'acheteur n'est pas actif");
            $this->addControle('vigilance', 'soussigne_courtier_nonactif', "Le compte du courtier n'est pas actif");
            $this->addControle('erreur', 'date_enlevement_inf_minimale', "La date d'enlèvement est inférieure à la date minimale d'enlèvement du produit");

            $this->addControle('erreur', 'soussigne_vendeur_absence_mail', "Aucun email renseigné pour");
            $this->addControle('erreur', 'soussigne_acheteur_absence_mail', "Aucun email renseigné pour");
            $this->addControle('erreur', 'soussigne_courtier_absence_mail', "Aucun email renseigné pour");

            $this->addControle('erreur', 'date_enlevement_sup_maximale', "La date d'enlèvement est supérieure à la date maximale d'enlèvement du produit");
        } else {
            $this->addControle('vigilance', 'stock_commercialisable_negatif', 'Le stock commercialisable est inférieur au stock proposé');
            $this->addControle('vigilance', 'contrats_similaires', null);
            $this->addControle('vigilance', 'prix_definitif_expected', "Le prix définitif de contrat n'a pas été saisi");
        }
        $this->addControle('vigilance', 'dates_retiraison_visa', 'La date de retiraison ne peut pas être inférieure à la date du contrat');

        $this->addControle('erreur', 'volume_expected', 'Le volume du contrat est manquant');
        $this->addControle('erreur', 'prix_initial_expected', 'Le prix du contrat est manquant');
        $this->addControle('erreur', 'dates_retiraison', 'La date limite de retiraison ne peut pas être inférieure à la date de début de retiraison');
        $this->addControle('erreur', 'viti_raisins_mouts_type_vins', "Le viticulteur ne peut pas faire de contrats de vins (il possède une exclusivité de raisins/moûts)");
        $this->addControle('erreur', 'quantite_raisin_surface_expected', "La quantité et/ou la surface sont requises");
        $this->addControle('erreur', 'quantite_raisin_surface_expected', "La quantité et/ou la surface sont requises");
        $this->addControle('erreur', 'cepage_autorise', "Cépage non autorisé pour le produit");
        $this->addControle('erreur', 'label_unique', '');

    }

    public function controle() {

        if ($this->teledeclaration) {
            $this->checkSoussigneAbsenceMail();
            $this->checkSoussigneCompteNonActive();
            $this->checkDateEnlevement();
        } else {
            $contrats_similaires = VracClient::getInstance()->retrieveSimilaryContracts($this->document);
            if ($nbsimilaires = count(array_keys($contrats_similaires))) {
                $contrat_similaires_str = $nbsimilaires . ' contrat(s) similaire(s) possèdant les même soussignés, produit et volume (ou quantité) ';
                foreach ($contrats_similaires as $contrat_similaire) {
                    $vrac_sim = VracClient::getInstance()->find($contrat_similaire->id);
                    $contrat_similaires_str.= "&nbsp;&nbsp;&nbsp;  <a href='" . $this->generateUrl('vrac_visualisation', $vrac_sim) . "'>" . substr($vrac_sim->getNumeroContrat(), 0, 4) . ' ' . substr($vrac_sim->getNumeroContrat(), 4) . "</a>";
                }
                $this->addPoint('vigilance', 'contrats_similaires', $contrat_similaires_str);
            }

            if ($this->document->hasPrixVariable() && !$this->document->hasPrixDefinitif()) {
                $this->addPoint('vigilance', 'prix_definitif_expected', 'Saisir le prix définitif', $this->generateUrl('vrac_marche', $this->document));
            }
        }

        if (!$this->document->volume_propose && $this->document->type_transaction != VracClient::TYPE_TRANSACTION_RAISINS) {
            $this->addPoint('erreur', 'volume_expected', 'Saisir un volume', $this->generateUrl('vrac_marche', $this->document));
        } elseif ($this->document->type_transaction == VracClient::TYPE_TRANSACTION_RAISINS && !$this->document->surface && !$this->document->raisin_quantite) {
            $this->addPoint('erreur', 'quantite_raisin_surface_expected', "Saisir au moins l'une de ces informations", $this->generateUrl('vrac_marche', $this->document));
        } elseif (!$this->document->volume_propose && $this->document->type_transaction == VracClient::TYPE_TRANSACTION_RAISINS) {
            $this->addPoint('vigilance', 'quantite_raisin_expected', 'Saisir la quantité', $this->generateUrl('vrac_marche', $this->document));
        }

        if ($this->document->isVitiRaisinsMoutsTypeVins()) {
            $this->addPoint('erreur', 'viti_raisins_mouts_type_vins', 'Sodifier vendeur', $this->generateUrl('etablissement_visualisation', EtablissementClient::getInstance()->find($this->document->vendeur_identifiant)));
        }
        if (is_null($this->document->prix_initial_unitaire)) {
            $this->addPoint('erreur', 'prix_initial_expected', 'Saisir un prix', $this->generateUrl('vrac_marche', $this->document));
        }
        if ($this->document->date_debut_retiraison && $this->document->date_limite_retiraison) {
            if ($this->document->date_limite_retiraison < $this->document->date_debut_retiraison) {
                $this->addPoint('erreur', 'dates_retiraison', 'Modifier la date', $this->generateUrl('vrac_condition', $this->document));
            }
        }

        if ($this->document->exist('versement_fa') && ($this->document->versement_fa == VracClient::VERSEMENT_FA_NOUVEAU) && $this->document->date_debut_retiraison && $this->document->date_debut_retiraison < $this->document->date_campagne) {
            $this->addPoint('vigilance', 'dates_retiraison_visa', 'Modifier la date', $this->generateUrl('vrac_condition', $this->document));
        }

        if (!$this->document->isCepageAutorise()) {
            $this->addPoint('erreur', 'cepage_autorise', 'Modifier le cépage', $this->generateUrl('vrac_marche', $this->document));
        }
        $nbLabels =count($this->document->label->toArray());
        if ( $nbLabels > 1 ) {
            $this->addPoint('erreur', 'label_unique', 'Le label doit être unique : Veuillez selectionner un label.');
        }
    }

    private function checkSoussigneAbsenceMail() {
        $vendeurEtb = EtablissementClient::getInstance()->findByIdentifiant($this->document->vendeur_identifiant);

        if (!$vendeurEtb->getEmailTeledeclaration()) {
            $this->addPoint('erreur', 'soussigne_vendeur_absence_mail', $vendeurEtb->nom);
{'fraction_non_alphanumeric': 0.14506685941452838, 'fraction_numerical': 0.0005059631369714493, 'mean_word_length': 3.9185922502666193, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 233, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, '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': '7251248', 'n_tokens_mistral': 4447, 'n_tokens_neox': 4415, 'n_words': 779}