use of com.axelor.apps.account.db.PaymentScheduleLine in project axelor-open-suite by axelor.
the class PaymentScheduleLineServiceImpl method createPaymentMove.
@Override
@Transactional(rollbackOn = { Exception.class })
public Move createPaymentMove(PaymentScheduleLine paymentScheduleLine, BankDetails companyBankDetails, PaymentMode paymentMode) throws AxelorException {
Preconditions.checkNotNull(paymentScheduleLine);
Preconditions.checkNotNull(companyBankDetails);
PaymentSchedule paymentSchedule = paymentScheduleLine.getPaymentSchedule();
Company company = paymentSchedule.getCompany();
Partner partner = paymentSchedule.getPartner();
Journal journal = paymentModeService.getPaymentModeJournal(paymentMode, company, companyBankDetails);
BigDecimal amount = paymentScheduleLine.getInTaxAmount();
String name = paymentScheduleLine.getName();
LocalDate todayDate = appBaseService.getTodayDate(company);
Account account = accountingSituationService.getCustomerAccount(partner, company);
Move move = moveService.getMoveCreateService().createMove(journal, company, null, partner, paymentMode, MoveRepository.TECHNICAL_ORIGIN_AUTOMATIC, MoveRepository.FUNCTIONAL_ORIGIN_PAYMENT);
MoveLine creditMoveLine = moveService.getMoveLineService().createMoveLine(move, partner, account, amount, false, todayDate, 1, name, null);
move.addMoveLineListItem(creditMoveLine);
creditMoveLine = moveLineRepo.save(creditMoveLine);
Account paymentModeAccount = paymentModeService.getPaymentModeAccount(paymentMode, company, companyBankDetails);
MoveLine debitMoveLine = moveService.getMoveLineService().createMoveLine(move, partner, paymentModeAccount, amount, true, todayDate, 2, name, null);
move.addMoveLineListItem(debitMoveLine);
debitMoveLine = moveLineRepo.save(debitMoveLine);
moveService.getMoveValidateService().validate(move);
// Reconcile
if (paymentSchedule.getTypeSelect() == PaymentScheduleRepository.TYPE_TERMS && paymentSchedule.getInvoiceSet() != null) {
List<MoveLine> debitMoveLineList = paymentSchedule.getInvoiceSet().stream().sorted(Comparator.comparing(Invoice::getDueDate)).map(invoice -> moveService.getMoveLineService().getDebitCustomerMoveLine(invoice)).collect(Collectors.toList());
if (moveToolService.isSameAccount(debitMoveLineList, account)) {
List<MoveLine> creditMoveLineList = Lists.newArrayList(creditMoveLine);
paymentService.useExcessPaymentOnMoveLines(debitMoveLineList, creditMoveLineList);
}
}
paymentScheduleLine.setDirectDebitAmount(amount);
paymentScheduleLine.setInTaxAmountPaid(amount);
paymentScheduleLine.setAdvanceOrPaymentMove(move);
paymentScheduleLine.setAdvanceMoveLine(creditMoveLine);
paymentScheduleLine.setStatusSelect(PaymentScheduleLineRepository.STATUS_VALIDATED);
paymentScheduleService.closePaymentScheduleIfAllPaid(paymentSchedule);
return move;
}
use of com.axelor.apps.account.db.PaymentScheduleLine in project axelor-open-suite by axelor.
the class PaymentScheduleServiceImpl method createPaymentSchedule.
/**
* Création d'un échéancier avec ces lignes.
*
* @param company La société.
* @param date Date de création.
* @param firstTermDate Date de première échéance.
* @param initialInTaxAmount Montant d'une échéance.
* @param nbrTerm Nombre d'échéances.
* @param bankDetails RIB.
* @param paymentMode Mode de paiement.
* @return L'échéancier créé.
* @throws AxelorException
*/
@Override
public PaymentSchedule createPaymentSchedule(Partner partner, Company company, LocalDate date, LocalDate firstTermDate, BigDecimal initialInTaxAmount, int nbrTerm, BankDetails bankDetails, PaymentMode paymentMode) throws AxelorException {
Invoice invoice = null;
PaymentSchedule paymentSchedule = this.createPaymentSchedule(partner, invoice, company, date, firstTermDate, nbrTerm, bankDetails, paymentMode);
paymentSchedule.setPaymentScheduleLineList(new ArrayList<PaymentScheduleLine>());
for (int term = 1; term < nbrTerm + 1; term++) {
paymentSchedule.getPaymentScheduleLineList().add(paymentScheduleLineService.createPaymentScheduleLine(paymentSchedule, initialInTaxAmount, term, firstTermDate.plusMonths(term - 1)));
}
return paymentSchedule;
}
use of com.axelor.apps.account.db.PaymentScheduleLine in project axelor-open-suite by axelor.
the class PaymentScheduleServiceImpl method cancelPaymentSchedule.
/**
* Methode qui annule un échéancier
*
* @param paymentSchedule
*/
@Override
public void cancelPaymentSchedule(PaymentSchedule paymentSchedule) {
// L'échéancier est passé à annulé
paymentSchedule.setStatusSelect(PaymentScheduleRepository.STATUS_CANCELED);
for (PaymentScheduleLine paymentScheduleLine : paymentSchedule.getPaymentScheduleLineList()) {
// Si l'échéance n'est pas complètement payée
if (paymentScheduleLine.getInTaxAmountPaid().compareTo(paymentScheduleLine.getInTaxAmount()) != 0) {
// L'échéance est passée à cloturé
paymentScheduleLine.setStatusSelect(PaymentScheduleLineRepository.STATUS_CLOSED);
}
}
for (Invoice invoice : paymentSchedule.getInvoiceSet()) {
// L'échéancier n'est plus selectionné sur la facture
invoice.setPaymentSchedule(null);
// L'échéancier est assigné dans un nouveau champs afin de garder un lien invisble pour
// l'utilisateur, mais utilisé pour le passage en irrécouvrable
invoice.setCanceledPaymentSchedule(paymentSchedule);
invoice.setSchedulePaymentOk(false);
}
}
use of com.axelor.apps.account.db.PaymentScheduleLine in project axelor-open-suite by axelor.
the class PaymentScheduleServiceImpl method updatePaymentSchedule.
/**
* Mise à jour d'un échéancier avec un nouveau montant d'échéance.
*
* @param paymentSchedule L'échéancier cible.
* @param inTaxTotal Nouveau montant d'une échéance.
*/
@Override
@Transactional
public void updatePaymentSchedule(PaymentSchedule paymentSchedule, BigDecimal inTaxTotal) {
log.debug("Mise à jour de l'échéancier {} : {}", new Object[] { paymentSchedule.getPaymentScheduleSeq(), inTaxTotal });
for (PaymentScheduleLine paymentScheduleLine : paymentSchedule.getPaymentScheduleLineList()) {
if (paymentScheduleLine.getStatusSelect() == PaymentScheduleLineRepository.STATUS_IN_PROGRESS && !paymentScheduleLine.getRejectedOk()) {
log.debug("Mise à jour de la ligne {} ", paymentScheduleLine.getName());
paymentScheduleLine.setInTaxAmount(inTaxTotal);
}
}
paymentScheduleRepo.save(paymentSchedule);
}
use of com.axelor.apps.account.db.PaymentScheduleLine in project axelor-open-suite by axelor.
the class IrrecoverableService method passInIrrecoverable.
/**
* Procédure permettant de passer un échéancier de lissage de paiement en irrécouvrable La
* procédure passera aussi les lignes d'écriture de rejet d'échéance en irrécouvrable, ainsi que
* les factures pas complètement payée selectionnées sur l'échéancier
*
* @param paymentSchedule Un échéancier de paiement
* @throws AxelorException
*/
@Transactional(rollbackOn = { Exception.class })
public void passInIrrecoverable(PaymentSchedule paymentSchedule) throws AxelorException {
Company company = paymentSchedule.getCompany();
paymentSchedule.setIrrecoverableStatusSelect(PaymentScheduleRepository.IRRECOVERABLE_STATUS_TO_PASS_IN_IRRECOUVRABLE);
ManagementObject managementObject = this.createManagementObject("IRR", accountConfigService.getIrrecoverableReasonPassage(accountConfigService.getAccountConfig(company)));
paymentSchedule.setManagementObject(managementObject);
List<MoveLine> paymentScheduleLineRejectMoveLineList = new ArrayList<MoveLine>();
for (PaymentScheduleLine paymentScheduleLine : paymentSchedule.getPaymentScheduleLineList()) {
if (paymentScheduleLine.getRejectMoveLine() != null && paymentScheduleLine.getRejectMoveLine().getAmountRemaining().compareTo(BigDecimal.ZERO) > 0) {
paymentScheduleLineRejectMoveLineList.add(paymentScheduleLine.getRejectMoveLine());
}
}
for (MoveLine moveLine : paymentScheduleLineRejectMoveLineList) {
this.passInIrrecoverable(moveLine, managementObject, true);
}
for (Invoice invoice : paymentSchedule.getInvoiceSet()) {
if (invoice.getCompanyInTaxTotalRemaining().compareTo(BigDecimal.ZERO) > 0) {
this.passInIrrecoverable(invoice, managementObject);
}
}
paymentScheduleService.cancelPaymentSchedule(paymentSchedule);
paymentScheduleRepo.save(paymentSchedule);
}
Aggregations