Program: 59011
Project: 59011
Buggy source:
/** 
 * Méthode permettant d'employer les dûs sur l'avoir On récupère prioritairement les dûs (factures) selectionné sur l'avoir, puis les autres dûs du tiers 2 cas : - le compte des dûs est le même que celui de l'avoir : alors on lettre directement - le compte n'est pas le même : on créée une O.D. de passage sur le bon compte
 * @param invoice
 * @param company
 * @param useExcessPayment
 * @return
 * @throws AxelorException
 */
public Move createMoveUseInvoiceDue(Invoice invoice) throws AxelorException {
  Company company=invoice.getCompany();
  Account account=invoice.getPartnerAccount();
  Partner partner=invoice.getPartner();
  Move move=null;
  MoveLine invoiceCustomerMoveLine=this.getCustomerMoveLineByLoop(invoice);
  List<MoveLine> debitMoveLines=paymentService.getInvoiceDue(invoice,true);
  if (debitMoveLines != null && debitMoveLines.size() != 0) {
    if (this.isSameAccount(debitMoveLines,invoice.getPartnerAccount())) {
      List<MoveLine> creditMoveLineList=new ArrayList<MoveLine>();
      creditMoveLineList.add(invoiceCustomerMoveLine);
      paymentService.useExcessPaymentOnMoveLines(debitMoveLines,creditMoveLineList);
    }
 else {
      this.createMoveUseDebit(invoice,debitMoveLines,invoiceCustomerMoveLine);
    }
    reconcileService.balanceCredit(invoiceCustomerMoveLine,company,true);
    BigDecimal remainingPaidAmount=invoiceCustomerMoveLine.getAmountRemaining();
    if (remainingPaidAmount.compareTo(BigDecimal.ZERO) > 0) {
      this.createExcessMove(invoice,company,partner,account,remainingPaidAmount,invoiceCustomerMoveLine);
    }
    invoice.setInTaxTotalRemaining(this.getInTaxTotalRemaining(invoice));
  }
  return move;
}

Fixed version (ground truth):
/** 
 * Méthode permettant d'employer les dûs sur l'avoir On récupère prioritairement les dûs (factures) selectionné sur l'avoir, puis les autres dûs du tiers 2 cas : - le compte des dûs est le même que celui de l'avoir : alors on lettre directement - le compte n'est pas le même : on créée une O.D. de passage sur le bon compte
 * @param invoice
 * @param company
 * @param useExcessPayment
 * @return
 * @throws AxelorException
 */
public Move createMoveUseInvoiceDue(Invoice invoice) throws AxelorException {
  Company company=invoice.getCompany();
  Account account=invoice.getPartnerAccount();
  Partner partner=invoice.getPartner();
  Move move=null;
  MoveLine invoiceCustomerMoveLine=this.getCustomerMoveLineByLoop(invoice);
  List<MoveLine> debitMoveLines=(List<MoveLine>)paymentService.getInvoiceDue(invoice,true);
  if (debitMoveLines != null && debitMoveLines.size() != 0) {
    if (this.isSameAccount(debitMoveLines,invoice.getPartnerAccount())) {
      List<MoveLine> creditMoveLineList=new ArrayList<MoveLine>();
      creditMoveLineList.add(invoiceCustomerMoveLine);
      paymentService.useExcessPaymentOnMoveLines(debitMoveLines,creditMoveLineList);
    }
 else {
      this.createMoveUseDebit(invoice,debitMoveLines,invoiceCustomerMoveLine);
    }
    reconcileService.balanceCredit(invoiceCustomerMoveLine,company,true);
    BigDecimal remainingPaidAmount=invoiceCustomerMoveLine.getAmountRemaining();
    if (remainingPaidAmount.compareTo(BigDecimal.ZERO) > 0) {
      this.createExcessMove(invoice,company,partner,account,remainingPaidAmount,invoiceCustomerMoveLine);
    }
    invoice.setInTaxTotalRemaining(this.getInTaxTotalRemaining(invoice));
  }
  return move;
}