/**
   * Procédure permettant de récupérer l'objet de gestion déjà créé lors du prélèvement d'une autre
   * facture
   *
   * @param mlList La liste des lignes d'écriture de facture à prélever
   * @param ml Une ligne d'écriture de facture ) prélever
   * @return L'objet de gestion trouvé
   */
  public DirectDebitManagement getDirectDebitManagement(
      List<MoveLine> moveLineList, MoveLine ml, long directDebitManagementMaxId) {

    Partner partner = ml.getPartner();

    log.debug("Récupération de l'objet de prélèvement du tiers {}", partner.getFullName());

    List<MoveLine> moveLineListResult =
        moveLineRepo
            .all()
            .filter("self IN (?1) and self.partner = ?2", moveLineList, partner)
            .fetch();

    for (MoveLine moveLine : moveLineListResult) {
      Invoice invoice = cfonbExportService.getInvoice(moveLine);

      DirectDebitManagement directDebitManagement = invoice.getDirectDebitManagement();
      if (directDebitManagement != null
          && directDebitManagement.getId() > directDebitManagementMaxId) {

        log.debug("Objet de prélèvement trouvé : {} pour le tiers {}", partner.getFullName());
        return invoice.getDirectDebitManagement();
      }
    }

    log.debug("Aucun objet de prélèvement trouvé pour le tiers {}", partner.getFullName());

    return null;
  }
  public void testBankDetails(Partner partner) throws AxelorException {
    BankDetails bankDetails = partnerService.getDefaultBankDetails(partner);

    if (bankDetails == null) {
      throw new AxelorException(
          String.format(
              I18n.get(IExceptionMessage.PAYMENT_SCHEDULE_2),
              GeneralServiceImpl.EXCEPTION,
              partner.getName()),
          IException.CONFIGURATION_ERROR);
    } else {
      cfonbExportService.testBankDetailsField(bankDetails);
    }
  }
  /**
   * Methode permettant de mettre à jour les informations de la facture
   *
   * @param moveLine
   * @param paymentMove
   * @param pse
   * @param mlList
   * @return
   * @throws AxelorException
   */
  public Invoice updateInvoice(
      MoveLine moveLine,
      Move paymentMove,
      List<MoveLine> mlList,
      BigDecimal amountExported,
      long directDebitManagementMaxId)
      throws AxelorException {

    Invoice invoice = cfonbExportService.getInvoice(moveLine);

    this.testBankDetails(invoice);

    Company company = invoice.getCompany();

    // Mise à jour du champ 'Ecriture de paiement' sur la facture
    log.debug(
        "generateAllExportInvoice - Mise à jour du champ 'Ecriture de paiement' sur la facture");
    invoice.setPaymentMove(paymentMove);

    // Mise à jour du montant prélever
    invoice.setDirectDebitAmount(amountExported);

    // Mise à jour du Numéro de prélèvement sur la facture
    log.debug("Mise à jour du Numéro de prélèvement sur la facture");

    if (this.hasOtherInvoice(mlList, moveLine)) {
      DirectDebitManagement directDebitManagement =
          this.getDirectDebitManagement(mlList, moveLine, directDebitManagementMaxId);
      if (directDebitManagement == null) {
        directDebitManagement =
            this.createDirectDebitManagement(this.getDirectDebitSequence(company), company);
      }
      invoice.setDirectDebitManagement(directDebitManagement);
      invoice.setDebitNumber(null);
      directDebitManagement.getInvoiceSet().add(invoice);
      directDebitManagementRepo.save(directDebitManagement);
    } else {
      invoice.setDebitNumber(this.getDirectDebitSequence(company));
      invoice.setDirectDebitManagement(null);
    }
    return invoice;
  }