This is an automated email from the git hooks/post-receive script. New commit to branch feature/1232 in repository lima. See http://git.chorem.org/lima.git commit 1d60b713868083fb68c4b286b7f97f457b5347ba Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Fri May 29 17:47:38 2015 +0200 fixes #1232 : ne pas clôturer un exercice avec des transactions en erreur --- .../lima/business/api/FiscalPeriodService.java | 8 ++- .../org/chorem/lima/business/AccountingRules.java | 2 +- .../accountingrules/DefaultAccountingRules.java | 39 +++++++++- .../accountingrules/FranceAccountingRules.java | 7 +- .../lima/business/ejb/FiscalPeriodServiceImpl.java | 15 +++- .../java/org/chorem/lima/entity/EntryTopiaDao.java | 23 ++++++ .../lima/entity/FinancialTransactionTopiaDao.java | 1 - .../ui/fiscalperiod/FiscalPeriodViewHandler.java | 82 ++++++++++++++++++++-- .../resources/i18n/lima-swing_en_GB.properties | 9 +++ .../resources/i18n/lima-swing_fr_FR.properties | 9 +++ 10 files changed, 179 insertions(+), 16 deletions(-) diff --git a/lima-business-api/src/main/java/org/chorem/lima/business/api/FiscalPeriodService.java b/lima-business-api/src/main/java/org/chorem/lima/business/api/FiscalPeriodService.java index e32e19c..cf35d41 100644 --- a/lima-business-api/src/main/java/org/chorem/lima/business/api/FiscalPeriodService.java +++ b/lima-business-api/src/main/java/org/chorem/lima/business/api/FiscalPeriodService.java @@ -28,7 +28,6 @@ import org.chorem.lima.business.exceptions.AlreadyLockedFiscalPeriodException; import org.chorem.lima.business.exceptions.BeginAfterEndFiscalPeriodException; import org.chorem.lima.business.exceptions.InvalidAccountNumberException; import org.chorem.lima.business.exceptions.LastUnlockedFiscalPeriodException; -import org.chorem.lima.business.exceptions.LimaException; import org.chorem.lima.business.exceptions.LockedEntryBookException; import org.chorem.lima.business.exceptions.LockedFinancialPeriodException; import org.chorem.lima.business.exceptions.MoreOneUnlockFiscalPeriodException; @@ -37,6 +36,9 @@ import org.chorem.lima.business.exceptions.NoFoundFinancialPeriodException; import org.chorem.lima.business.exceptions.NotAllowedLabelException; import org.chorem.lima.business.exceptions.NotBeginNextDayOfLastFiscalPeriodException; import org.chorem.lima.business.exceptions.NotNumberAccountNumberException; +import org.chorem.lima.business.exceptions.UnbalancedFinancialTransactionsException; +import org.chorem.lima.business.exceptions.UnfilledEntriesException; +import org.chorem.lima.business.exceptions.WithoutEntryBookFinancialTransactionsException; import org.chorem.lima.entity.EntryBook; import org.chorem.lima.entity.FiscalPeriod; @@ -110,7 +112,7 @@ public interface FiscalPeriodService { * @throws LastUnlockedFiscalPeriodException */ FiscalPeriod blockFiscalPeriod(FiscalPeriod fiscalPeriod) - throws AlreadyLockedFiscalPeriodException, LastUnlockedFiscalPeriodException; + throws AlreadyLockedFiscalPeriodException, LastUnlockedFiscalPeriodException, UnbalancedFinancialTransactionsException, WithoutEntryBookFinancialTransactionsException, UnfilledEntriesException; /** * Remove the given fiscal period @@ -135,7 +137,7 @@ public interface FiscalPeriodService { LastUnlockedFiscalPeriodException, AlreadyLockedFiscalPeriodException, AlreadyExistAccountException, - InvalidAccountNumberException, NotNumberAccountNumberException, NotAllowedLabelException, AlreadyExistEntryBookException, LimaException; + InvalidAccountNumberException, NotNumberAccountNumberException, NotAllowedLabelException, AlreadyExistEntryBookException, UnfilledEntriesException, UnbalancedFinancialTransactionsException, WithoutEntryBookFinancialTransactionsException; /** * Test if we have retained earnings on a fiscal period diff --git a/lima-business/src/main/java/org/chorem/lima/business/AccountingRules.java b/lima-business/src/main/java/org/chorem/lima/business/AccountingRules.java index ac1b443..322e194 100644 --- a/lima-business/src/main/java/org/chorem/lima/business/AccountingRules.java +++ b/lima-business/src/main/java/org/chorem/lima/business/AccountingRules.java @@ -89,7 +89,7 @@ public interface AccountingRules { NotBeginNextDayOfLastFiscalPeriodException, MoreOneUnlockFiscalPeriodException; - void blockFiscalPeriodRules(FiscalPeriod fiscalPeriod) throws LastUnlockedFiscalPeriodException; + void blockFiscalPeriodRules(FiscalPeriod fiscalPeriod) throws LastUnlockedFiscalPeriodException, UnbalancedFinancialTransactionsException, UnfilledEntriesException, WithoutEntryBookFinancialTransactionsException; void deleteFiscalPeriodRules(FiscalPeriod fiscalPeriod) throws NoEmptyFiscalPeriodException; diff --git a/lima-business/src/main/java/org/chorem/lima/business/accountingrules/DefaultAccountingRules.java b/lima-business/src/main/java/org/chorem/lima/business/accountingrules/DefaultAccountingRules.java index b6e2be7..8d75a4c 100644 --- a/lima-business/src/main/java/org/chorem/lima/business/accountingrules/DefaultAccountingRules.java +++ b/lima-business/src/main/java/org/chorem/lima/business/accountingrules/DefaultAccountingRules.java @@ -127,7 +127,44 @@ public class DefaultAccountingRules implements AccountingRules { /** Rules to check before block fiscals periods */ @Override - public void blockFiscalPeriodRules(FiscalPeriod fiscalPeriod) throws LastUnlockedFiscalPeriodException { + public void blockFiscalPeriodRules(FiscalPeriod fiscalPeriod) + throws LastUnlockedFiscalPeriodException, UnbalancedFinancialTransactionsException, + UnfilledEntriesException, WithoutEntryBookFinancialTransactionsException { + + FinancialTransactionTopiaDao financialTransactionTopiaDao = getDaoHelper().getFinancialTransactionDao(); + EntryTopiaDao entryDao = getDaoHelper().getEntryDao(); + FiscalPeriodTopiaDao fiscalPeriodTopiaDao = getDaoHelper().getFiscalPeriodDao(); + + // reload object in current transaction + fiscalPeriod = fiscalPeriodTopiaDao.forTopiaIdEquals(fiscalPeriod.getTopiaId()).findUnique(); + + // Check if all financial transactions of this fiscal period are equilibrate + List<FinancialTransaction> allUnbalancedTransaction = financialTransactionTopiaDao.getAllUnbalancedTransaction( + fiscalPeriod.getBeginDate(), + fiscalPeriod.getEndDate(), + null); + + if (!allUnbalancedTransaction.isEmpty()) { + throw new UnbalancedFinancialTransactionsException(allUnbalancedTransaction); + } + + // Check if all financial transactions of this fiscal period are well filled in + List<Entry> allUnfilledEntry = entryDao.findAllUnfilledEntry( + fiscalPeriod.getBeginDate(), + fiscalPeriod.getEndDate()); + if (!allUnfilledEntry.isEmpty()) { + throw new UnfilledEntriesException(allUnfilledEntry); + } + + // Check if all financial transactions have EntryBooks + List<FinancialTransaction> allTransactionWithoutEntryBook = financialTransactionTopiaDao.findAllTransactionWithoutEntryBook( + fiscalPeriod.getBeginDate(), + fiscalPeriod.getEndDate()); + if (!allTransactionWithoutEntryBook.isEmpty()) { + throw new WithoutEntryBookFinancialTransactionsException(allTransactionWithoutEntryBook); + } + + } diff --git a/lima-business/src/main/java/org/chorem/lima/business/accountingrules/FranceAccountingRules.java b/lima-business/src/main/java/org/chorem/lima/business/accountingrules/FranceAccountingRules.java index 2b2ae1a..d32a099 100644 --- a/lima-business/src/main/java/org/chorem/lima/business/accountingrules/FranceAccountingRules.java +++ b/lima-business/src/main/java/org/chorem/lima/business/accountingrules/FranceAccountingRules.java @@ -169,7 +169,12 @@ public class FranceAccountingRules extends DefaultAccountingRules { * On ne peut pas clore la dernière periode comptable ouverte. */ @Override - public void blockFiscalPeriodRules(FiscalPeriod fiscalPeriod) throws LastUnlockedFiscalPeriodException { + public void blockFiscalPeriodRules(FiscalPeriod fiscalPeriod) + throws LastUnlockedFiscalPeriodException, UnbalancedFinancialTransactionsException, + WithoutEntryBookFinancialTransactionsException, UnfilledEntriesException { + + super.blockFiscalPeriodRules(fiscalPeriod); + FiscalPeriodTopiaDao fiscalPeriodTopiaDao = getDaoHelper().getFiscalPeriodDao(); FiscalPeriod lastUnlockedFiscalPeriod = diff --git a/lima-business/src/main/java/org/chorem/lima/business/ejb/FiscalPeriodServiceImpl.java b/lima-business/src/main/java/org/chorem/lima/business/ejb/FiscalPeriodServiceImpl.java index 840ff7d..f8dc1da 100644 --- a/lima-business/src/main/java/org/chorem/lima/business/ejb/FiscalPeriodServiceImpl.java +++ b/lima-business/src/main/java/org/chorem/lima/business/ejb/FiscalPeriodServiceImpl.java @@ -35,11 +35,11 @@ import org.chorem.lima.business.api.FinancialTransactionService; import org.chorem.lima.business.api.FiscalPeriodService; import org.chorem.lima.business.api.ReportService; import org.chorem.lima.business.exceptions.AlreadyExistAccountException; +import org.chorem.lima.business.exceptions.AlreadyExistEntryBookException; import org.chorem.lima.business.exceptions.AlreadyLockedFiscalPeriodException; import org.chorem.lima.business.exceptions.BeginAfterEndFiscalPeriodException; import org.chorem.lima.business.exceptions.InvalidAccountNumberException; import org.chorem.lima.business.exceptions.LastUnlockedFiscalPeriodException; -import org.chorem.lima.business.exceptions.LimaException; import org.chorem.lima.business.exceptions.LockedEntryBookException; import org.chorem.lima.business.exceptions.LockedFinancialPeriodException; import org.chorem.lima.business.exceptions.MoreOneUnlockFiscalPeriodException; @@ -48,6 +48,9 @@ import org.chorem.lima.business.exceptions.NoFoundFinancialPeriodException; import org.chorem.lima.business.exceptions.NotAllowedLabelException; import org.chorem.lima.business.exceptions.NotBeginNextDayOfLastFiscalPeriodException; import org.chorem.lima.business.exceptions.NotNumberAccountNumberException; +import org.chorem.lima.business.exceptions.UnbalancedFinancialTransactionsException; +import org.chorem.lima.business.exceptions.UnfilledEntriesException; +import org.chorem.lima.business.exceptions.WithoutEntryBookFinancialTransactionsException; import org.chorem.lima.entity.Account; import org.chorem.lima.entity.AccountImpl; import org.chorem.lima.entity.ClosedPeriodicEntryBook; @@ -231,7 +234,9 @@ public class FiscalPeriodServiceImpl extends AbstractLimaService implements Fisc */ @Override public FiscalPeriod blockFiscalPeriod(FiscalPeriod fiscalPeriod) - throws AlreadyLockedFiscalPeriodException, LastUnlockedFiscalPeriodException { + throws AlreadyLockedFiscalPeriodException, LastUnlockedFiscalPeriodException, + UnbalancedFinancialTransactionsException, WithoutEntryBookFinancialTransactionsException, + UnfilledEntriesException { AccountingRules accountingRules = LimaBusinessConfig.getInstance().getAccountingRules(); @@ -296,7 +301,11 @@ public class FiscalPeriodServiceImpl extends AbstractLimaService implements Fisc @Override public FiscalPeriod retainedEarningsAndBlockFiscalPeriod(FiscalPeriod fiscalPeriod, EntryBook entryBook, boolean retainedEarnings) - throws LimaException { + throws AlreadyExistEntryBookException, AlreadyExistAccountException, NotAllowedLabelException, + InvalidAccountNumberException, NotNumberAccountNumberException, NoFoundFinancialPeriodException, + LockedFinancialPeriodException, LockedEntryBookException, UnfilledEntriesException, + UnbalancedFinancialTransactionsException, LastUnlockedFiscalPeriodException, + WithoutEntryBookFinancialTransactionsException, AlreadyLockedFiscalPeriodException { if (entryBook != null && retainedEarnings) { diff --git a/lima-business/src/main/java/org/chorem/lima/entity/EntryTopiaDao.java b/lima-business/src/main/java/org/chorem/lima/entity/EntryTopiaDao.java index 7369610..4c44ba6 100644 --- a/lima-business/src/main/java/org/chorem/lima/entity/EntryTopiaDao.java +++ b/lima-business/src/main/java/org/chorem/lima/entity/EntryTopiaDao.java @@ -308,4 +308,27 @@ public class EntryTopiaDao extends AbstractEntryTopiaDao<Entry> { return entries; } + /** + * get all entries where some field are not filled in. + * + * @param beginDate begin date + * @param endDate end date + * @return all entries where some field are not filled in + */ + public List<Entry> findAllUnfilledEntry(Date beginDate, Date endDate) { + + HqlAndParametersBuilder<Entry> builder = newHqlAndParametersBuilder(); + builder.addGreaterOrEquals(PROPERTY_TRANSACTION_DATE, beginDate); + builder.addLowerOrEquals(PROPERTY_TRANSACTION_DATE, endDate); + builder.addWhereClause(Entry.PROPERTY_ACCOUNT + " = null " + + "OR " + Entry.PROPERTY_VOUCHER + " = null " + + "OR " + Entry.PROPERTY_VOUCHER + " = ''" + + "OR " + Entry.PROPERTY_DESCRIPTION + " = null " + + "OR " + Entry.PROPERTY_DESCRIPTION + " = ''" ); + + List<Entry> entries = findAll(builder.getHql(), builder.getHqlParameters()); + + return entries; + } + } diff --git a/lima-business/src/main/java/org/chorem/lima/entity/FinancialTransactionTopiaDao.java b/lima-business/src/main/java/org/chorem/lima/entity/FinancialTransactionTopiaDao.java index b7c5bc0..d0e2902 100644 --- a/lima-business/src/main/java/org/chorem/lima/entity/FinancialTransactionTopiaDao.java +++ b/lima-business/src/main/java/org/chorem/lima/entity/FinancialTransactionTopiaDao.java @@ -249,5 +249,4 @@ public class FinancialTransactionTopiaDao extends AbstractFinancialTransactionTo return result; } - } //FinancialTransactionDAO diff --git a/lima-swing/src/main/java/org/chorem/lima/ui/fiscalperiod/FiscalPeriodViewHandler.java b/lima-swing/src/main/java/org/chorem/lima/ui/fiscalperiod/FiscalPeriodViewHandler.java index 38d031a..19f6ccd 100644 --- a/lima-swing/src/main/java/org/chorem/lima/ui/fiscalperiod/FiscalPeriodViewHandler.java +++ b/lima-swing/src/main/java/org/chorem/lima/ui/fiscalperiod/FiscalPeriodViewHandler.java @@ -36,12 +36,17 @@ import org.chorem.lima.business.exceptions.LastUnlockedFiscalPeriodException; import org.chorem.lima.business.exceptions.MoreOneUnlockFiscalPeriodException; import org.chorem.lima.business.exceptions.NoEmptyFiscalPeriodException; import org.chorem.lima.business.exceptions.NotBeginNextDayOfLastFiscalPeriodException; +import org.chorem.lima.business.exceptions.UnbalancedFinancialTransactionsException; +import org.chorem.lima.business.exceptions.UnfilledEntriesException; +import org.chorem.lima.business.exceptions.WithoutEntryBookFinancialTransactionsException; +import org.chorem.lima.entity.Entry; import org.chorem.lima.entity.EntryBook; import org.chorem.lima.entity.EntryBookImpl; import org.chorem.lima.entity.FinancialTransaction; import org.chorem.lima.entity.FiscalPeriod; import org.chorem.lima.entity.FiscalPeriodImpl; import org.chorem.lima.business.LimaServiceFactory; +import org.chorem.lima.util.BigDecimalToString; import org.chorem.lima.util.ErrorHelper; import org.nuiton.util.DateUtil; @@ -59,6 +64,7 @@ import java.awt.event.KeyEvent; import java.util.Calendar; import java.util.Date; import java.util.List; +import java.util.concurrent.ExecutionException; import static org.nuiton.i18n.I18n.t; @@ -419,6 +425,15 @@ public class FiscalPeriodViewHandler implements ServiceListener { @Override protected void done() { retainedEarningsWait.setVisible(false); + try { + get(); + } catch (InterruptedException e) { + catchExceptionDuringBlock(e); + } catch (ExecutionException e) { + catchExceptionDuringBlock(e.getCause()); + } + + } }.execute(); retainedEarningsWait.setVisible(true); @@ -448,12 +463,8 @@ public class FiscalPeriodViewHandler implements ServiceListener { view.setBlockEnabled(false); view.setDeleteEnabled(false); - } catch (LastUnlockedFiscalPeriodException e) { - errorHelper.showErrorMessage(t("lima.fiscalPeriod.block.error.lastUnlockedFiscalPeriod", - e.getFiscalPeriod().getBeginDate(), - e.getFiscalPeriod().getEndDate())); - } catch (AlreadyLockedFiscalPeriodException e) { - errorHelper.showErrorMessage(t("lima.fiscalPeriod.block.error.AlreadyLockedFiscalPeriod")); + } catch (Exception e) { + catchExceptionDuringBlock(e); } } } @@ -461,6 +472,65 @@ public class FiscalPeriodViewHandler implements ServiceListener { } } + protected void catchExceptionDuringBlock(Throwable e) { + + if (e instanceof LastUnlockedFiscalPeriodException) { + errorHelper.showErrorMessage(t("lima.fiscalPeriod.block.error.lastUnlockedFiscalPeriod", + ((LastUnlockedFiscalPeriodException) e).getFiscalPeriod().getBeginDate(), + ((LastUnlockedFiscalPeriodException) e).getFiscalPeriod().getEndDate())); + } else if (e instanceof AlreadyLockedFiscalPeriodException) { + errorHelper.showErrorMessage(t("lima.fiscalPeriod.block.error.AlreadyLockedFiscalPeriod")); + } else if (e instanceof UnbalancedFinancialTransactionsException) { + StringBuilder message = new StringBuilder(t("lima.fiscalPeriod.block.error.unbalanced.main")); + for (FinancialTransaction transaction : ((UnbalancedFinancialTransactionsException) e).getFinancialTransactions()) { + message.append("\n - "); + message.append(t("lima.fiscalPeriod.block.error.unbalanced.transaction", + transaction.getTransactionDate(), + BigDecimalToString.format(transaction.getAmountDebit()), + BigDecimalToString.format(transaction.getAmountCredit()))); + } + errorHelper.showErrorMessage(message.toString()); + } else if (e instanceof UnfilledEntriesException) { + StringBuilder message = new StringBuilder(t("lima.fiscalPeriod.block.error.unfilled.main")); + for (Entry entry : ((UnfilledEntriesException) e).getEntries()) { + message.append("\n - "); + message.append(t("lima.fiscalPeriod.block.error.unfilled.entry", + entry.getFinancialTransaction().getTransactionDate(), + BigDecimalToString.format(entry.getAmount()))); + if (entry.getAccount() == null) { + message.append("\n - "); + message.append(t("lima.fiscalPeriod.block.error.unfilled.noAccount")); + } + if (org.apache.commons.lang3.StringUtils.isBlank(entry.getVoucher())) { + message.append("\n - " ); + message.append(t("lima.fiscalPeriod.block.error.unfilled.noVoucher")); + } + if (org.apache.commons.lang3.StringUtils.isBlank(entry.getDescription())) { + message.append("\n - "); + message.append(t("lima.fiscalPeriod.block.error.unfilled.noDescription")); + } + } + errorHelper.showErrorMessage(message.toString()); + } else if (e instanceof WithoutEntryBookFinancialTransactionsException) { + StringBuilder message = new StringBuilder(t("lima.fiscalPeriod.block.error.withoutEntryBook.main")); + for (FinancialTransaction transaction : ((WithoutEntryBookFinancialTransactionsException) e).getFinancialTransactions()) { + message.append("\n - "); + message.append(t("lima.fiscalPeriod.block.error.withoutEntryBook.transaction", + transaction.getTransactionDate(), + BigDecimalToString.format(transaction.getAmountCredit()))); + } + errorHelper.showErrorMessage(message.toString()); + } else { + errorHelper.showErrorMessage(e.getMessage()); + } + + + + + + + } + @Override public void notifyMethod(String serviceName, String methodeName) { //refresh on import datas diff --git a/lima-swing/src/main/resources/i18n/lima-swing_en_GB.properties b/lima-swing/src/main/resources/i18n/lima-swing_en_GB.properties index 1f21268..81ed04d 100644 --- a/lima-swing/src/main/resources/i18n/lima-swing_en_GB.properties +++ b/lima-swing/src/main/resources/i18n/lima-swing_en_GB.properties @@ -327,6 +327,15 @@ lima.fiscalPeriod.block.cantBlockNotBalance=Faild, unbalanced fiscal period. lima.fiscalPeriod.block.confirmation=Do you really want to close this fiscal period ? This action can no be reverted \! lima.fiscalPeriod.block.error.AlreadyLockedFiscalPeriod=Fiscal period already closed lima.fiscalPeriod.block.error.lastUnlockedFiscalPeriod=Previous fiscal period must be closed +lima.fiscalPeriod.block.error.unbalanced.main= +lima.fiscalPeriod.block.error.unbalanced.transaction= +lima.fiscalPeriod.block.error.unfilled.entry= +lima.fiscalPeriod.block.error.unfilled.main= +lima.fiscalPeriod.block.error.unfilled.noAccount= +lima.fiscalPeriod.block.error.unfilled.noDescription= +lima.fiscalPeriod.block.error.unfilled.noVoucher= +lima.fiscalPeriod.block.error.withoutEntryBook.main= +lima.fiscalPeriod.block.error.withoutEntryBook.transaction= lima.fiscalPeriod.block.newYear=Do you want to create new fiscal year lima.fiscalPeriod.block.retainedEarnings=Push next lima.fiscalPeriod.block.title=Close fiscal period diff --git a/lima-swing/src/main/resources/i18n/lima-swing_fr_FR.properties b/lima-swing/src/main/resources/i18n/lima-swing_fr_FR.properties index 3655f1b..92e242d 100644 --- a/lima-swing/src/main/resources/i18n/lima-swing_fr_FR.properties +++ b/lima-swing/src/main/resources/i18n/lima-swing_fr_FR.properties @@ -337,6 +337,15 @@ lima.fiscalPeriod.block.cantBlockNotBalance=Impossible de clôturer un exercice lima.fiscalPeriod.block.confirmation=Ètes vous sûre de vouloir clôturer cette période ? Cette action est irréversible \! lima.fiscalPeriod.block.error.AlreadyLockedFiscalPeriod=L'exercice est déjà clôturés lima.fiscalPeriod.block.error.lastUnlockedFiscalPeriod=L'exercice prédent doit être clôturé +lima.fiscalPeriod.block.error.unbalanced.main=Impossible de clôturer cet exercicie car il contient des transactions non équilibrées \: +lima.fiscalPeriod.block.error.unbalanced.transaction=transaction du %1$te/%1$tm/%1$tY d'un débit de %2$s et d'un crédit de %3$s +lima.fiscalPeriod.block.error.unfilled.entry=entré du %1$te/%1$tm/%1$tY pour un montant de %2$s \: +lima.fiscalPeriod.block.error.unfilled.main=Impossible de clôturer cet exercice car il contient des entrés incomplétes \: +lima.fiscalPeriod.block.error.unfilled.noAccount=n'a pas de compte +lima.fiscalPeriod.block.error.unfilled.noDescription=n'a pas de description +lima.fiscalPeriod.block.error.unfilled.noVoucher=n'a pas de pièce comptable +lima.fiscalPeriod.block.error.withoutEntryBook.main=Impossible de clôturer cet exercice car il contient des transactions sans journal +lima.fiscalPeriod.block.error.withoutEntryBook.transaction=transaction du %1$te/%1$tm/%1$tY d'un montant de %2$s, lima.fiscalPeriod.block.newYear=Voulez vous créer un nouvel exercice? lima.fiscalPeriod.block.retainedEarnings=Report à nouveau lima.fiscalPeriod.block.title=Cloture de l'exercice -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.