package Controllers.VenteRapideClt;

import Controllers.Dialog.MessageControle;
import Controllers.Traitement.Adaptateur;
import Controllers.Traitement.ParametreSystem;
import Controllers.Traitement.contro;
import Models.BonLivraisonClt.BonLivraisonClt;
import Models.CommandeClt.CommandeClt;
import Models.TraiteClt.DatePickerCell;
import Models.ChequeClt.DatePickerCellCheque;
import Models.FactureClt.FactureClt;
import Models.ChequeClt.ChequeList;
import Models.TraiteClt.TraiteList;
import Models.User.User;
import Models.Caisse.CaisseClt;
import Models.Caisse.CarteBancaireClt;
import Models.ChequeClt.ChequeClt;
import Models.TraiteClt.TraiteClt;
import java.io.IOException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.control.DatePicker;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.util.Callback;

/**
 * FXML Controller class
 * @author maher Ben Tili
 */
public class Step3FactureCltController implements Initializable {

    @FXML private AnchorPane PaneStep3FactureClt;
    
    @FXML public AnchorPane PaneTypeReglementComptant;
    @FXML public AnchorPane PaneTypeReglementFacilite;
    
    @FXML public AnchorPane PaneCheque;
    @FXML public AnchorPane PaneCarte;
    
    @FXML public TextField  FactureCltChequeNomBanque;
    @FXML public TextField  FactureCltChequeNumero;      
    @FXML public TextField  FactureCltChequeNomComple;      
    @FXML public DatePicker FactureCltChequeDatePaiement; 
    
    @FXML public Text MsgCltChequeNomBanque;
    @FXML public Text MsgCltChequeNumero;      
    @FXML public Text MsgCltChequeNomComple;       
    @FXML public Text MsgCltChequeDatePaiement; 
    
    
    @FXML public TextField  TextFieldCarteNumeroTransation;
    @FXML public TextField  TextFieldCarteNomBanque;
    @FXML public TextField  TextFieldCarteNumero;
    @FXML public TextField  TextFieldCarteNomComplet;
    
    @FXML public Text MsgCltCarteNumeroTransation;
    @FXML public Text MsgCltCarteNumeroCarte;
    
    @FXML public Text TextTypeRegement;
    @FXML public Text TextNetaPayer;
    
    public Integer TypeSelect = 0;      // 0:espace      1:Cheque        2:Carte bancaire
    
    
    //Paiement Facilité
    @FXML public AnchorPane PaneTableViewTraite ;
    @FXML public AnchorPane PaneTableViewCheque;
    @FXML public Text TextMontant_Traite;
    @FXML public Text TextMontant_Interet;
    
    @FXML public RadioButton RadioCheque;
    @FXML public RadioButton RadioTraite; 
    
    @FXML public Text TextMontantTraite;
    @FXML public Text TextMontantInteret;
    
    @FXML public TextField TextFieldAvance;
    @FXML public TextField TextFieldNbrTraite;
    @FXML public TextField TextFieldTauxIntere;
    @FXML public Text TextAvance;
    @FXML public Text TextNbrTraite;
    @FXML public Text TextTauxIntere;
    
    @FXML public TableView<TraiteList> TableViewListeTraite ;
    @FXML public TableColumn TabColDateTraite;
    @FXML public TableColumn<TraiteList ,String> TabColMontantTraite;
    
    @FXML public TableView<ChequeList> TableViewListeCheque ;
    @FXML public TableColumn TabColDateCheque;
    @FXML public TableColumn<ChequeList ,String> TabColNumeroCheque;
    @FXML public TableColumn<ChequeList ,String> TabColBanqueCheque;
    @FXML public TableColumn<ChequeList ,String> TabColMontantCheque;
    
    float NetaPayer, TotalMontantTraite, MontantInteret, Avance, NbrTraite, TauxIntere;
    
    public ObservableList<TraiteList> dataListTraite = FXCollections.observableArrayList();
    public ObservableList<ChequeList> dataListCheque = FXCollections.observableArrayList();
    
    public boolean FaciliteType =  true; // True Traite | False Cheque
    
    BonLivraisonClt BonLivraison = new BonLivraisonClt();
    CommandeClt Commande = new CommandeClt();
    FactureClt Facture = new FactureClt();
    
    contro clt = new contro(); 
    
    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        TableViewListeTraite.setEditable(true);
        
        TabColMontantTraite.setStyle( "-fx-alignment: CENTER;");
        TabColMontantTraite.getStyleClass().add("Center");
        TabColMontantTraite.setCellValueFactory(new PropertyValueFactory<TraiteList, String>("MontantTraite"));
        TabColMontantTraite.setCellFactory(TextFieldTableCell.<TraiteList>forTableColumn());  //Ajouter l'option textfield
        //Valier l'opertion
        TabColMontantTraite.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<TraiteList, String>>() {
            @Override
            public void handle(TableColumn.CellEditEvent<TraiteList, String> t) {
                String NewQuantite = t.getNewValue();
               ((TraiteList) t.getTableView().getItems().get(t.getTablePosition().getRow())).setMontantTraite(NewQuantite);
            }
        });
        
        TabColDateTraite.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColDateTraite.getStyleClass().add("Center");
        TabColDateTraite.setCellValueFactory(new PropertyValueFactory<TraiteList, Date>("date"));
        TabColDateTraite.setEditable(true);
        
        TabColDateTraite.setCellFactory(new Callback<TableColumn, TableCell>() {
            @Override
            public TableCell call(TableColumn p) {
                DatePickerCell datePick = new DatePickerCell(dataListTraite);
                return datePick;
            }
        });
        TableViewListeTraite.setItems(dataListTraite);
        
        
        //Cheque
        TabColNumeroCheque.setStyle( "-fx-alignment: CENTER;");
        TabColNumeroCheque.getStyleClass().add("Center");
        TabColNumeroCheque.setCellValueFactory(new PropertyValueFactory<ChequeList, String>("NumeroCheque"));
        TabColNumeroCheque.setCellFactory(TextFieldTableCell.<ChequeList>forTableColumn());  //Ajouter l'option textfield
        //Valier l'opertion
        TabColNumeroCheque.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<ChequeList, String>>() {
            @Override
            public void handle(TableColumn.CellEditEvent<ChequeList, String> t) {
                String NewNumeroCheque = t.getNewValue();
                contro clt = new contro();
                if(!clt.isNumeric(NewNumeroCheque)){
                    if(t.getTablePosition().getRow() == 0){
                        Integer NumeroCheque = Integer.valueOf(NewNumeroCheque);
                        int indise = 0; 
                        while(indise<dataListCheque.size()){
                            ((ChequeList) t.getTableView().getItems().get(indise)).setNumeroCheque(NumeroCheque.toString());
                            indise++;NumeroCheque++;
                        }
                    }else{
                        ((ChequeList) t.getTableView().getItems().get(t.getTablePosition().getRow())).setNumeroCheque(NewNumeroCheque);
                    }
                }else{
                    ((ChequeList) t.getTableView().getItems().get(t.getTablePosition().getRow())).setNumeroCheque(null);
                }
            }
        });
        
        TabColBanqueCheque.setStyle( "-fx-alignment: CENTER;");
        TabColBanqueCheque.getStyleClass().add("Center");
        TabColBanqueCheque.setCellValueFactory(new PropertyValueFactory<ChequeList, String>("BanqueCheque"));
        TabColBanqueCheque.setCellFactory(TextFieldTableCell.<ChequeList>forTableColumn());  //Ajouter l'option textfield
        //Valier l'opertion
        TabColBanqueCheque.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<ChequeList, String>>() {
            @Override
            public void handle(TableColumn.CellEditEvent<ChequeList, String> t) {
                String NewBanque = t.getNewValue();
                if(t.getTablePosition().getRow() == 0){
                    int indise = 0; 
                    while(indise<dataListCheque.size()){
                        ((ChequeList) t.getTableView().getItems().get(indise)).setBanqueCheque(NewBanque);
                        indise++;
                    }
                }else{
                    ((ChequeList) t.getTableView().getItems().get(t.getTablePosition().getRow())).setBanqueCheque(NewBanque);
                }
            }
        });
        
        TabColMontantCheque.setStyle( "-fx-alignment: CENTER;");
        TabColMontantCheque.getStyleClass().add("Center");
        TabColMontantCheque.setCellValueFactory(new PropertyValueFactory<ChequeList, String>("MontantCheque"));
        TabColMontantCheque.setCellFactory(TextFieldTableCell.<ChequeList>forTableColumn());  //Ajouter l'option textfield
        //Valier l'opertion
        TabColMontantCheque.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<ChequeList, String>>() {
            @Override
            public void handle(TableColumn.CellEditEvent<ChequeList, String> t) {
                String NewQuantite = t.getNewValue();
               ((ChequeList) t.getTableView().getItems().get(t.getTablePosition().getRow())).setMontantCheque(NewQuantite);
            }
        });
        
        TabColDateCheque.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColDateCheque.getStyleClass().add("Center");
        TabColDateCheque.setCellValueFactory(new PropertyValueFactory<ChequeList, Date>("date"));
        TabColDateCheque.setEditable(true);
        TabColDateCheque.setCellFactory(new Callback<TableColumn, TableCell>() {
            @Override
            public TableCell call(TableColumn p) {
                DatePickerCellCheque datePick = new DatePickerCellCheque(dataListCheque);
                return datePick;
            }
        });
        
        TableViewListeCheque.setItems(dataListCheque);  
    }    
    
    public void SetDataStep2ToStep3(BonLivraisonClt bon_livraison, CommandeClt commande){
        this.BonLivraison= bon_livraison;
        this.Commande = commande;
        
        TextNetaPayer.setText(Adaptateur.StringToStringEspaceCurrency(BonLivraison.getNetAPayer()));
        
        String TypeRegement = Commande.getTypeRegement();
        TextTypeRegement.setText(Commande.getTypeRegementString());
        if(TypeRegement.equals("0")){
            PaneTypeReglementComptant.setVisible(true);
            PaneTypeReglementFacilite.setVisible(false);
        }else if(TypeRegement.equals("1")){
            PaneTypeReglementComptant.setVisible(false);
            PaneTypeReglementFacilite.setVisible(true);
        }
    }
    
    @FXML
    private void NextFactureCltButtonAction(ActionEvent event) throws IOException {
        
        boolean ResultControle = true;
        
        if(Commande.getTypeRegement().equals("0")){
            if(TypeSelect == 1){
                if(this.ControlePaimentComptant()){
                    ResultControle = false;
                }
            }else if(TypeSelect == 2){
                ResultControle = clt.ContrNull(TextFieldCarteNumeroTransation, MsgCltCarteNumeroTransation) && clt.ContrNumerique(TextFieldCarteNumero, MsgCltCarteNumeroCarte);
            }
        }else if(Commande.getTypeRegement().equals("1")){
            if(this.Controle()){
                if(FaciliteType){
                    if(!PaneTableViewTraite.isVisible()){
                        ResultControle = false;
                    }
                   if(!this.ControleListTraite()){
                        ResultControle = false;
                   }
                }else{
                   if(!this.ControleListCheque()){
                       ResultControle = false;
                   }
                }
            }else{
                 ResultControle = false;
            }
        }
        
        if(ResultControle){
            this.SetFacture();
            
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Views/VenteRapideClt/Step4SaveVenteClt.fxml"));
            Parent NodeStep4SaveVenteClt = (Parent)fxmlLoader.load();
            
            Step4SaveVenteCltController Step4SaveVenteClt = fxmlLoader.getController();
            Step4SaveVenteClt.SetDataStep3ToStep4(Commande, BonLivraison, Facture);
            
            Step4SaveVenteClt.LanchSaveCommande();
            
            PaneStep3FactureClt.getChildren().clear();
            PaneStep3FactureClt.getChildren().add(NodeStep4SaveVenteClt);
        }
       
        
    }
    
    @FXML
    private void LastFactureCltButtonAction(ActionEvent event) throws IOException {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Views/VenteRapideClt/Step2BonLivraisonClt.fxml"));
        Parent NodeStep2BonLivraison = (Parent)fxmlLoader.load();
        
        Step2BonLivraisonCltController Step2BonLivraison = fxmlLoader.getController();
        Step2BonLivraison.BonLivraison = BonLivraison;
        Step2BonLivraison.Commande = Commande;
        Step2BonLivraison.SetDefaultTextFieldData();
        
        PaneStep3FactureClt.getChildren().clear();
        PaneStep3FactureClt.getChildren().add(NodeStep2BonLivraison);
        
    }
    
    
    public boolean ControlePaimentComptant(){
        contro clt = new contro();  
        boolean resulta = true;
        if( clt.ContrNull(FactureCltChequeNomBanque, MsgCltChequeNomBanque) && 
            clt.ContrNumeriqueNotnull(FactureCltChequeNumero, MsgCltChequeNumero) &&
            clt.ContrNullDatePicker(FactureCltChequeDatePaiement, MsgCltChequeDatePaiement)){
            resulta = false;
        }  
        return resulta;
    }
        
        
        
    public void SetFacture()
    {
        Facture.setListeproduit(BonLivraison.getListeproduit());
        
        //0 Personne  1 Entreprise 2 Passager
        Integer TypeClient = BonLivraison.getTypeClient();
        Facture.setTypeClient(TypeClient);
        if(TypeClient == 0){
            Facture.setCltPersonne(BonLivraison.getCltPersonne());
        }else if(TypeClient == 1){
            Facture.setCltEntreprise(BonLivraison.getCltEntreprise());
        }else if(TypeClient == 2){
            Facture.setCltPassager(BonLivraison.getCltPassager());
        }
        
        Facture.setDateFacture(Adaptateur.getDefaultCurrentDate("yyyy-MM-dd"));
        Facture.setNetAPayer(BonLivraison.getNetAPayer());
        Facture.setTotalTVA(BonLivraison.getTotalTVA());
        Facture.setTotalHorsTaxNet(BonLivraison.getTotalHorsTaxNet());
        Facture.setRemise(BonLivraison.getRemise());
        
        Facture.setListeproduit(BonLivraison.getListeproduit());
        
        Facture.setTimbre(ParametreSystem.Timbre);
        Facture.setCodeUser(User.idprofile);
        
        //0 Comptent      1 Facilite
        Facture.setTypeRegement(Commande.getTypeRegement());
        
        if(Facture.getTypeRegementInteger() == 0){
            Facture.setTypeRegement("0");
            //0 :espace   1:cheque    2 :carte bancaire  
            if(TypeSelect == 0){
                CaisseClt caisse= new CaisseClt();
                caisse.setTypeMouvement("0");
                Facture.setModePaiement("0");
            }else if(TypeSelect == 1){
                ChequeClt Cheque = new ChequeClt();
                Cheque.setBanqueChequeClt(FactureCltChequeNomBanque.getText());
                Cheque.setNumeroChequeClt(FactureCltChequeNumero.getText());
                Cheque.setNomCompletChequeClt(FactureCltChequeNomComple.getText());
                Cheque.setDatePaiement(FactureCltChequeDatePaiement.getValue().toString());
                Cheque.setMontantChequeClt(Facture.getNetAPayer());
                Facture.setCheque(Cheque);
                Facture.setModePaiement("1");
            }else if(TypeSelect == 2){
                CarteBancaireClt CarteBancaire =  new CarteBancaireClt();
                CarteBancaire.setNumeroTransation(TextFieldCarteNumeroTransation.getText());
                CarteBancaire.setNomBanque(TextFieldCarteNomBanque.getText());
                CarteBancaire.setNumeroCarte(TextFieldCarteNumero.getText());
                CarteBancaire.setNomComplet(TextFieldCarteNomComplet.getText());
                CarteBancaire.setMontant(Facture.getNetAPayer());
                CarteBancaire.setLocalNom(ParametreSystem.NomLocalPC);
                CarteBancaire.setIdProfile(User.idprofile);
                Facture.setCarteBancaire(CarteBancaire);
                Facture.setModePaiement("2");
            }
        }else if(Facture.getTypeRegementInteger() == 1){
            Facture.setAvanceNumber(Avance);
            Facture.setTotalMontantTraiteNumber(TotalMontantTraite);
            Facture.setNbrTraite(TextFieldNbrTraite.getText());
            Facture.setMontantInteretNumber(MontantInteret);
            Facture.setTauxInteretNumber(TauxIntere);
            
            // True Traite | False Cheque
            if(FaciliteType){
                Facture.setTypeFacilite("0");
                ArrayList<TraiteClt> ListTraites = new ArrayList();
                for(int i=0; i<dataListTraite.size(); i++){
                    TraiteClt Traite = new TraiteClt();
                    Traite.setDateCreationTraiteClt(new Date().toString());
                    String DateTraite = new SimpleDateFormat("dd/MM/yyyy").format(dataListTraite.get(i).getDate());
                    Traite.setDateTraiteClt(DateTraite);
                    Traite.setMontantTraiteClt(dataListTraite.get(i).getMontantTraite().replace(',','.'));
                    ListTraites.add(Traite);
                }
                Facture.setListeTraites(ListTraites);
            }else{
                Facture.setTypeFacilite("1");
                ArrayList<ChequeClt> ListCheque = new ArrayList();
                for(int i=0; i<dataListCheque.size(); i++){
                    ChequeClt Cheque = new ChequeClt();
                    Cheque.setNumeroChequeClt(dataListCheque.get(i).getNumeroCheque());
                    Cheque.setBanqueChequeClt(dataListCheque.get(i).getBanqueCheque());
                    Cheque.setMontantChequeClt(dataListCheque.get(i).getMontantCheque());
                    String DateChequePaiement = new SimpleDateFormat("yyyy-MM-dd").format(dataListCheque.get(i).getDate());
                    Cheque.setDatePaiement(DateChequePaiement);
                    Cheque.setDateCreation(new Date().toString());
                    ListCheque.add(Cheque);
                }
                Facture.setListeCheques(ListCheque);
            }
           
        }
        
    }
        
    //**************************Vente en  Comptant****************************/
    @FXML
    public void RadioEspaceAction(ActionEvent event) throws IOException {
        PaneCheque.setVisible(false);
        PaneCarte.setVisible(false);
        TypeSelect = 0;
    }
    
    @FXML
    public void RadioChequeAction(ActionEvent event) throws IOException {
        PaneCarte.setVisible(false);
        PaneCheque.setVisible(true);
        TypeSelect = 1;
        
    }
    
    @FXML
    public void RadioCarteAction(ActionEvent event) throws IOException {
        PaneCheque.setVisible(false);
        PaneCarte.setVisible(true);
        TypeSelect = 2;
    }
    
    
    
    /********************************* Vente par facilité *****************************************/
    //Radio Cheque 
    @FXML
    private void FactureCltAjouterChequeButtonAction(ActionEvent event) throws IOException {
        FaciliteType = false;
        TextMontant_Traite.setVisible(false);TextMontant_Interet.setVisible(false);
        PaneTableViewTraite.setVisible(false);PaneTableViewCheque.setVisible(false);
        TextMontantInteret.setVisible(false);TextMontantTraite.setVisible(false);
        if(this.Controle()){
            this.CalculeCheque();
        }
        
    }
    
    //Radio Traite
    @FXML
    private void FactureCltAjouterTraiteButtonAction(ActionEvent event) throws IOException {
        FaciliteType = true;
        TextMontant_Traite.setVisible(false);TextMontant_Interet.setVisible(false);
        PaneTableViewTraite.setVisible(false);PaneTableViewCheque.setVisible(false);
        TextMontantInteret.setVisible(false);TextMontantTraite.setVisible(false);
        if(this.Controle()){
            this.CalculeTraite();
        }
    }
    
    private Boolean ControleListTraite(){
        boolean Resulta = true;
        boolean MontantTraite = true;
        int indise = 0;
        float Somme = 0;
        while(indise<dataListTraite.size()){
            if(dataListTraite.get(indise).getMontantTraite().equals("0")){
                MontantTraite = false;
            }
            Somme = Somme + Adaptateur.ArrondStringToFloat(dataListTraite.get(indise).getMontantTraite());
            indise++;
        }
        if(!MontantTraite){
            final MessageControle messagecontrol = new MessageControle();
            Text text3 = new Text();
            text3.setText("Le montant des traites doit être différent de zéro (0)");
            text3.setFont(Font.font("Arial", FontWeight.BOLD, 13));
            text3.setFill(Color.web("#363a38"));
            messagecontrol.DetailMSG.getChildren().add(text3);
            messagecontrol.bouttonOK.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    messagecontrol.stackpane.setVisible(false);
                }
            });
            messagecontrol.ShowNotification();
            Resulta = false;
        }
        else if(Adaptateur.ArrondFloatToFloat(Somme) != Adaptateur.ArrondFloatToFloat(TotalMontantTraite)){
            final MessageControle messagecontrol = new MessageControle();

            Text text3 = new Text();
            text3.setText("La sommes des traites est différent à la montant de TotalMontantTraite");
            text3.setFont(Font.font("Arial", FontWeight.BOLD, 13));
            text3.setFill(Color.web("#363a38"));
            messagecontrol.DetailMSG.getChildren().add(text3);

            messagecontrol.bouttonOK.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    messagecontrol.stackpane.setVisible(false);
                }
            });

            messagecontrol.ShowNotification();
            
            Resulta = false;
        }
        
        return Resulta;
    }
    
    private Boolean ControleListCheque(){
        boolean Resulta = true;
        boolean NumeroCheque = true;
        boolean MontantCheque = true;
        boolean Banque = true;
        int indise = 0;
        float Somme = 0;
        contro clt = new contro();
        
        while(indise<dataListCheque.size()){
            
            if(!clt.isNumericNotnull(dataListCheque.get(indise).getNumeroCheque())){
                NumeroCheque = false;
            }
            if(dataListCheque.get(indise).getBanqueCheque().isEmpty()){
                Banque = false;
            }
            if(dataListCheque.get(indise).getMontantCheque().equals("0") || dataListCheque.get(indise).getNumeroCheque().isEmpty()){
                MontantCheque = false;
            }
            Somme = Somme + Adaptateur.ArrondStringToFloat(dataListCheque.get(indise).getMontantCheque());
            indise++;
        }
        

        if(NumeroCheque){
            final MessageControle messagecontrol = new MessageControle();
            Text text3 = new Text();
            text3.setText("Incorrect Numéro Chéque");
            text3.setFont(Font.font("Arial", FontWeight.BOLD, 13));
            text3.setFill(Color.web("#363a38"));
            messagecontrol.DetailMSG.getChildren().add(text3);

            messagecontrol.bouttonOK.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    messagecontrol.stackpane.setVisible(false);
                }
            });
            messagecontrol.ShowNotification();
            Resulta = false;
        }
        else if(!Banque){
            final MessageControle messagecontrol = new MessageControle();
            Text text3 = new Text();
            text3.setText("Le nom de la banque est vide");
            text3.setFont(Font.font("Arial", FontWeight.BOLD, 13));
            text3.setFill(Color.web("#363a38"));
            messagecontrol.DetailMSG.getChildren().add(text3);
            messagecontrol.bouttonOK.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    messagecontrol.stackpane.setVisible(false);
                }
            });
            messagecontrol.ShowNotification();
            Resulta = false;
        }
        else if(!MontantCheque){
            final MessageControle messagecontrol = new MessageControle();
            Text text3 = new Text();
            text3.setText("Incorrect montant chéque");
            text3.setFont(Font.font("Arial", FontWeight.BOLD, 13));
            text3.setFill(Color.web("#363a38"));
            messagecontrol.DetailMSG.getChildren().add(text3);
            messagecontrol.bouttonOK.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    messagecontrol.stackpane.setVisible(false);
                }
            });
            messagecontrol.ShowNotification();
            Resulta = false;
        }
        else if(Adaptateur.ArrondFloatToFloat(Somme) != Adaptateur.ArrondFloatToFloat(TotalMontantTraite)){
            final MessageControle messagecontrol = new MessageControle();
            Text text3 = new Text();
            text3.setText("La sommes des chéques est différent à la montant de TotalMontantTraite");
            text3.setFont(Font.font("Arial", FontWeight.BOLD, 13));
            text3.setFill(Color.web("#363a38"));
            messagecontrol.DetailMSG.getChildren().add(text3);
            messagecontrol.bouttonOK.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    messagecontrol.stackpane.setVisible(false);
                }
            });
            messagecontrol.ShowNotification();
            Resulta = false;
        }
        
        return Resulta;
    }
    
    private Boolean Controle(){
        contro clt = new contro();
        
        if(clt.ContrNumeriqueNotnull(TextFieldAvance, TextAvance) && 
           clt.ContrNumeriqueNotnull(TextFieldNbrTraite, TextNbrTraite) &&
           clt.ContrNumeriqueNotnull(TextFieldTauxIntere, TextTauxIntere)){
            
            NetaPayer =  Adaptateur.StringToFloat(Commande.getNetAPayer());
            Avance = Adaptateur.StringToFloat(TextFieldAvance.getText());
            if(NetaPayer< Avance){
                TextFieldAvance.setStyle("-fx-border-color:#f20606;");
                TextAvance.setText("doit être inférieur a Net A payer");
                return false ;
            }else if(Adaptateur.StringToFloat(TextFieldNbrTraite.getText())<= 0){
                TextFieldNbrTraite.setStyle("-fx-border-color:#f20606;");
                TextNbrTraite.setText("doit être supérieur a 0");
                return false ;
            }else{
                TextAvance.setText("");
                TextFieldAvance.setStyle("-fx-border-color: transparent;");
                return true;
            }
        }
        else{
            return false;
        }
    }
    
    //Boutton Traitement
    @FXML
    private void FactureCltAjouterTraitementButtonAction(ActionEvent event) throws IOException {
        if(this.Controle()){
            if(FaciliteType == true){
                this.CalculeTraite();
            }else{
                this.CalculeCheque();
            }
        }
    }
    
    private void CalculeTraite(){
        dataListTraite.clear();
        PaneTableViewCheque.setVisible(false);
        PaneTableViewTraite.setVisible(true);
        
        NbrTraite = Adaptateur.StringToFloat(TextFieldNbrTraite.getText());
        TauxIntere = Adaptateur.StringToFloat(TextFieldTauxIntere.getText());
        
        MontantInteret = ((NetaPayer - Avance) * TauxIntere) / 100 ;
        TotalMontantTraite = (NetaPayer - Avance) + MontantInteret ; 
        
        TextMontantInteret.setText(Adaptateur.ArrondFloatToString(MontantInteret)+" "+ParametreSystem.CurrencySign);
        TextMontantTraite.setText(Adaptateur.ArrondFloatToString(TotalMontantTraite)+" "+ParametreSystem.CurrencySign);
            
        Integer divTotal = Adaptateur.Diviseur(TotalMontantTraite);
        float modeTotal = Adaptateur.Modulo(TotalMontantTraite);
        
        float Value = (float) TotalMontantTraite / NbrTraite;
        Integer div = Adaptateur.Diviseur(Value);
        
       
        Date date= new Date();
        Calendar cal = Calendar.getInstance();
        
        Integer  Somme = 0;
        
        for(int i=0; i<NbrTraite; i++){
            cal.setTime(date);
            cal.add(Calendar.MONTH, i+1);
            if(i != NbrTraite-1){
                Somme = Somme + div ;
                dataListTraite.add(new TraiteList(Adaptateur.floatDeleZero(div),  cal.getTime()));
            }else{
                dataListTraite.add(new TraiteList(Adaptateur.floatDeleZero((divTotal - Somme) + modeTotal) ,  cal.getTime()));
            }
        }
        TextMontantInteret.setVisible(true);
        TextMontantTraite.setVisible(true);
        TextMontant_Traite.setVisible(true);
        TextMontant_Interet.setVisible(true);
            
    }
    
    private void CalculeCheque(){
        dataListCheque.clear();
        PaneTableViewTraite.setVisible(false);
        PaneTableViewCheque.setVisible(true);
        
        NbrTraite = Adaptateur.StringToFloat(TextFieldNbrTraite.getText());
        TauxIntere = Adaptateur.StringToFloat(TextFieldTauxIntere.getText());
        
        MontantInteret = ((NetaPayer - Avance) * TauxIntere) / 100 ;
        TotalMontantTraite = (NetaPayer - Avance) + MontantInteret ; 
        
        TextMontantInteret.setText(Adaptateur.ArrondFloatToString(MontantInteret)+" "+ParametreSystem.CurrencySign);
        TextMontantTraite.setText(Adaptateur.ArrondFloatToString(TotalMontantTraite)+" "+ParametreSystem.CurrencySign);
            
        Integer divTotal = Adaptateur.Diviseur(TotalMontantTraite);
        float modeTotal = Adaptateur.Modulo(TotalMontantTraite);
        
        float Value = (float) TotalMontantTraite / NbrTraite;
        Integer div = Adaptateur.Diviseur(Value);
        
       
        Date date= new Date();
        Calendar cal = Calendar.getInstance();
        
        Integer  Somme = 0;
        
        for(int i=0; i<NbrTraite; i++){
            cal.setTime(date);
            cal.add(Calendar.MONTH, i+1);
            if(i != NbrTraite-1){
                Somme = Somme + div ;
                dataListCheque.add(new ChequeList(cal.getTime(),"","",Adaptateur.floatDeleZero(div)));
            }else{
                dataListCheque.add(new ChequeList(cal.getTime(),"","",Adaptateur.floatDeleZero((divTotal - Somme) + modeTotal)));
            }
        }
        TextMontantInteret.setVisible(true);
        TextMontantTraite.setVisible(true);
        TextMontant_Traite.setVisible(true);
        TextMontant_Interet.setVisible(true);
    }
}
