/**
   * Procédure permettant d'exporter des factures
   *
   * @param company Une société
   * @param pse Un Export des prélèvement
   * @param pm Un mode de paiement
   * @throws AxelorException
   */
  @Transactional(rollbackOn = {AxelorException.class, Exception.class})
  public Invoice exportInvoice(
      MoveLine moveLine,
      List<MoveLine> moveLineList,
      Company company,
      long directDebitManagementMaxId)
      throws AxelorException {

    /**
     * Important : Doit être executé avant la méthode 'createPaymentMove()' afin de récupérer le
     * montant restant à prélever *
     */
    BigDecimal amountExported = moveLine.getAmountRemaining();

    this.testBankDetails(moveLine.getPartner());

    // creation d'une ecriture de paiement
    Invoice invoice =
        this.updateInvoice(
            moveLine,
            this.createPaymentMove(
                company, moveLine, company.getAccountConfig().getDirectDebitPaymentMode()),
            moveLineList,
            amountExported,
            directDebitManagementMaxId);

    invoiceRepo.save(invoice);

    return invoice;
  }
  public List<MoveLine> getInvoiceToExport(
      Company company, LocalDate scheduleDate, Currency currency) {

    List<MoveLine> moveLineInvoiceList = new ArrayList<MoveLine>();

    PaymentMode paymentMode = company.getAccountConfig().getDirectDebitPaymentMode();

    /**
     * Selection des lignes d'écritures dont : - l'état est validé - la société est celle
     * selectionnée sur l'objet export - le compte est lettrable - le montant restant à payer est
     * supérieur à 0 et débit supérieur à 0 (équivaut à une facture et non un avoir) - le mode de
     * règlement de la facture est en prélèvement - la date d'échéance est passée - la facture est
     * remplie sur l'écriture - la facture n'est pas selectionnée sur un échéancier
     */
    List<MoveLine> moveLineList =
        moveLineRepo
            .all()
            .filter(
                "self.move.statusSelect = ?1 AND self.exportedDirectDebitOk = 'false' "
                    + "AND self.move.company = ?2 "
                    + "AND self.account.reconcileOk = ?3 AND self.amountRemaining > 0 "
                    + "AND self.debit > 0 "
                    + "AND self.dueDate <= ?5 AND self.move.invoice IS NOT NULL "
                    + "AND self.move.invoice.paymentMode = ?4 "
                    + "AND self.move.invoice.schedulePaymentOk = 'false' "
                    + "AND self.move.invoice.currency = ?5",
                MoveRepository.STATUS_VALIDATED,
                company,
                true,
                paymentMode,
                currency)
            .fetch();

    // Ajout des factures
    for (MoveLine moveLine : moveLineList) {
      if (!this.isDebitBlocking(moveLine.getMove().getInvoice())) {
        moveLineInvoiceList.add(moveLine);
      }
    }

    // Récupération des factures rejetées
    List<Invoice> invoiceRejectList =
        invoiceRepo
            .all()
            .filter(
                "self.rejectMoveLine IS NOT NULL AND self.rejectMoveLine.amountRemaining > 0 AND self.rejectMoveLine.debit > 0"
                    + " AND self.paymentMode = ?1 AND self.company = ?2 AND self.rejectMoveLine.exportedDirectDebitOk = 'false' AND self.move.statusSelect = ?3"
                    + " AND self.rejectMoveLine.account.reconcileOk = 'true' "
                    + " AND self.rejectMoveLine.invoiceReject IS NOT NULL"
                    + " AND self.currency = ?4",
                paymentMode,
                company,
                MoveRepository.STATUS_VALIDATED,
                currency)
            .fetch();

    // Ajout des factures rejetées
    for (Invoice invoice : invoiceRejectList) {

      if (!this.isDebitBlocking(invoice)) {
        moveLineInvoiceList.add(invoice.getRejectMoveLine());
      }
    }

    return moveLineInvoiceList;
  }