/** * Axelor Business Solutions * * Copyright (C) 2016 Axelor (<http://axelor.com>). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.axelor.apps.account.service.move; import java.math.BigDecimal; import org.joda.time.LocalDate; import com.axelor.apps.account.db.Account; import com.axelor.apps.account.db.AccountConfig; import com.axelor.apps.account.db.Journal; import com.axelor.apps.account.db.Move; import com.axelor.apps.account.db.MoveLine; import com.axelor.apps.account.db.repo.MoveRepository; import com.axelor.apps.account.service.config.AccountConfigService; import com.axelor.apps.base.db.Company; import com.axelor.apps.base.db.Partner; import com.axelor.apps.base.service.administration.GeneralService; import com.axelor.exception.AxelorException; import com.google.inject.Inject; import com.google.inject.persist.Transactional; public class MoveAdjustementService { protected MoveLineService moveLineService; protected MoveCreateService moveCreateService; protected MoveValidateService moveValidateService; protected MoveRepository moveRepository; protected AccountConfigService accountConfigService; protected LocalDate today; @Inject public MoveAdjustementService(GeneralService generalService, MoveLineService moveLineService, MoveCreateService moveCreateService, MoveValidateService moveValidateService, MoveToolService moveToolService, MoveDueService moveDueService, MoveRepository moveRepository) { this.moveLineService = moveLineService; this.moveCreateService = moveCreateService; this.moveValidateService = moveValidateService; this.moveRepository = moveRepository; today = generalService.getTodayDate(); } /** * Creating move of passage in gap regulation (on debit) * @param debitMoveLine * @return * @throws AxelorException */ @Transactional(rollbackOn = {AxelorException.class, Exception.class}) public void createAdjustmentDebitMove(MoveLine debitMoveLine) throws AxelorException { Partner partner = debitMoveLine.getPartner(); Account account = debitMoveLine.getAccount(); Move debitMove = debitMoveLine.getMove(); Company company = debitMove.getCompany(); AccountConfig accountConfig = accountConfigService.getAccountConfig(company); BigDecimal debitAmountRemaining = debitMoveLine.getAmountRemaining(); Journal miscOperationJournal = accountConfigService.getMiscOperationJournal(accountConfig); Move adjustmentMove = moveCreateService.createMove(miscOperationJournal, company, null, partner, null); // Création de la ligne au crédit MoveLine creditAdjustmentMoveLine = moveLineService.createMoveLine(adjustmentMove, partner, account, debitAmountRemaining, false, today, 1, null); // Création de la ligne au debit MoveLine debitAdjustmentMoveLine = moveLineService.createMoveLine( adjustmentMove, partner, accountConfigService.getCashPositionVariationAccount(accountConfig), debitAmountRemaining, true, today, 2, null); adjustmentMove.addMoveLineListItem(creditAdjustmentMoveLine); adjustmentMove.addMoveLineListItem(debitAdjustmentMoveLine); moveValidateService.validateMove(adjustmentMove); moveRepository.save(adjustmentMove); } /** * Creating move of passage in gap regulation (on credit) * @param creditMoveLine * @return * @throws AxelorException */ public MoveLine createAdjustmentCreditMove(MoveLine creditMoveLine) throws AxelorException { Partner partner = creditMoveLine.getPartner(); Account account = creditMoveLine.getAccount(); Move creditMove = creditMoveLine.getMove(); Company company = creditMove.getCompany(); BigDecimal creditAmountRemaining = creditMoveLine.getAmountRemaining(); AccountConfig accountConfig = accountConfigService.getAccountConfig(company); Journal miscOperationJournal = accountConfigService.getMiscOperationJournal(accountConfig); Move adjustmentMove = moveCreateService.createMove(miscOperationJournal, company, null, partner, null); // Création de la ligne au crédit MoveLine creditAdjustmentMoveLine = moveLineService.createMoveLine( adjustmentMove, partner, accountConfigService.getCashPositionVariationAccount(accountConfig), creditAmountRemaining, false, today, 1, null); // Création de la ligne au débit MoveLine debitAdjustmentMoveLine = moveLineService.createMoveLine(adjustmentMove, partner, account, creditAmountRemaining, true, today, 2, null); adjustmentMove.addMoveLineListItem(creditAdjustmentMoveLine); adjustmentMove.addMoveLineListItem(debitAdjustmentMoveLine); moveValidateService.validateMove(adjustmentMove); moveRepository.save(adjustmentMove); return debitAdjustmentMoveLine; } /** * Méthode permettant de créer une écriture du passage du compte de l'écriture au debit vers le compte de l'écriture au credit. * @param debitMoveLineToReconcile * Ecriture au débit * @param creditMoveLineToReconcile * Ecriture au crédit * @param amount * Montant * @return * L'écriture de passage du compte de l'écriture au debit vers le compte de l'écriture au credit. * @throws AxelorException */ public Move createMoveToPassOnTheOtherAccount(MoveLine debitMoveLineToReconcile, MoveLine creditMoveLineToReconcile, BigDecimal amount) throws AxelorException { Partner partnerDebit = debitMoveLineToReconcile.getPartner(); Partner partnerCredit = creditMoveLineToReconcile.getPartner(); Company company = debitMoveLineToReconcile.getMove().getCompany(); AccountConfig accountConfig = accountConfigService.getAccountConfig(company); Journal journal = accountConfigService.getMiscOperationJournal(accountConfig); // Move Move move = moveCreateService.createMove(journal, company, null, partnerDebit, null); MoveLine debitMoveLine = moveLineService.createMoveLine(move, partnerCredit, creditMoveLineToReconcile.getAccount(), amount, true, today, 1, null); MoveLine creditMoveLine = moveLineService.createMoveLine(move, partnerDebit, debitMoveLineToReconcile.getAccount(), amount, false, today, 2, null); move.addMoveLineListItem(debitMoveLine); move.addMoveLineListItem(creditMoveLine); moveValidateService.validateMove(move); return move; } }