This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository lima. See http://git.chorem.org/lima.git commit 3a5bac7a3c5118c08b10eab72da145db7507badb Author: dcosse <japbiw74> Date: Mon Feb 2 12:09:21 2015 +0100 fixes #1162: order fiscal periods by date on export to allow correct imports --- .../chorem/lima/business/ImportExportResults.java | 10 ++ .../lima/business/api/FiscalPeriodService.java | 53 +++++++- .../lima/business/ejb/ExportServiceImpl.java | 12 +- .../lima/business/ejb/FiscalPeriodServiceImpl.java | 15 ++- .../lima/business/ejb/ImportServiceImpl.java | 52 ++++++- .../lima/business/ImportExportServiceTest.java | 149 +++++++++++++++------ .../chorem/lima/entity/FiscalPeriodTopiaDao.java | 13 +- .../chorem/lima/ui/importexport/ImportExport.java | 8 +- 8 files changed, 249 insertions(+), 63 deletions(-) diff --git a/lima-business-api/src/main/java/org/chorem/lima/business/ImportExportResults.java b/lima-business-api/src/main/java/org/chorem/lima/business/ImportExportResults.java index 7ea06e3..da6b9eb 100644 --- a/lima-business-api/src/main/java/org/chorem/lima/business/ImportExportResults.java +++ b/lima-business-api/src/main/java/org/chorem/lima/business/ImportExportResults.java @@ -37,6 +37,8 @@ public class ImportExportResults implements Serializable{ List<ExportResult> exportResults; + boolean errors = false; + public List<ImportResult> getImportResults() { return importResults; } @@ -92,4 +94,12 @@ public class ImportExportResults implements Serializable{ public void pushImportResults(ImportExportResults results) { addAllImportResult(results.getImportResults()); } + + public void setErrors(boolean errors) { + this.errors = errors; + } + + public boolean isErrors() { + return errors; + } } 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 adddc5a..e32e19c 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 @@ -53,24 +53,70 @@ import java.util.List; */ public interface FiscalPeriodService { + /** + * + * @return all Fiscal periods + */ List<FiscalPeriod> getAllFiscalPeriods(); + /** + * + * @return all fiscal periods ordered by date + */ + List<FiscalPeriod> getAllFiscalPeriodsByDate(); + + /** + * + * @return all locked fiscal periods + */ List<FiscalPeriod> getAllBlockedFiscalPeriods(); + /** + * + * @return all unlocked fiscal periods + */ List<FiscalPeriod> getAllUnblockedFiscalPeriods(); + /** + * + * @return all locked fiscal periods ordered by date + */ List<FiscalPeriod> getAllUnblockedFiscalPeriodsByBeginDate(); + /** + * + * @return last fiscal period + */ FiscalPeriod getLastFiscalPeriod(); + /** + * + * @param fiscalPeriod the fiscal period to create + * @return the persisted fiscal period + * @throws BeginAfterEndFiscalPeriodException + * @throws NotBeginNextDayOfLastFiscalPeriodException + * @throws MoreOneUnlockFiscalPeriodException + */ FiscalPeriod createFiscalPeriod(FiscalPeriod fiscalPeriod) throws BeginAfterEndFiscalPeriodException, NotBeginNextDayOfLastFiscalPeriodException, MoreOneUnlockFiscalPeriodException; + /** + * Block the current fiscal period + * @param fiscalPeriod the fiscal period to block + * @return + * @throws AlreadyLockedFiscalPeriodException + * @throws LastUnlockedFiscalPeriodException + */ FiscalPeriod blockFiscalPeriod(FiscalPeriod fiscalPeriod) throws AlreadyLockedFiscalPeriodException, LastUnlockedFiscalPeriodException; + /** + * Remove the given fiscal period + * @param fiscalPeriod the fiscal period to remove + * @throws NoEmptyFiscalPeriodException + */ void deleteFiscalPeriod(FiscalPeriod fiscalPeriod) throws NoEmptyFiscalPeriodException; /** @@ -93,11 +139,16 @@ public interface FiscalPeriodService { /** * Test if we have retained earnings on a fiscal period - * @param fiscalPeriod + * @param fiscalPeriod the fiscal period to test from * @return true if retained earnings are possible * */ boolean isRetainedEarnings(FiscalPeriod fiscalPeriod); + /** + * Update the fiscal period end date + * @param fiscalPeriod the fiscal period where end date must be updated + * @return + */ FiscalPeriod updateEndDate(FiscalPeriod fiscalPeriod); } diff --git a/lima-business/src/main/java/org/chorem/lima/business/ejb/ExportServiceImpl.java b/lima-business/src/main/java/org/chorem/lima/business/ejb/ExportServiceImpl.java index 8f37742..060ec77 100644 --- a/lima-business/src/main/java/org/chorem/lima/business/ejb/ExportServiceImpl.java +++ b/lima-business/src/main/java/org/chorem/lima/business/ejb/ExportServiceImpl.java @@ -27,8 +27,10 @@ import org.chorem.lima.business.ImportExportResults; import org.chorem.lima.business.api.AccountService; import org.chorem.lima.business.api.EntryBookService; import org.chorem.lima.business.api.ExportService; +import org.chorem.lima.business.api.FinancialPeriodService; import org.chorem.lima.business.api.FinancialStatementService; import org.chorem.lima.business.api.FinancialTransactionService; +import org.chorem.lima.business.api.FiscalPeriodService; import org.chorem.lima.business.api.IdentityService; import org.chorem.lima.business.api.VatStatementService; import org.chorem.lima.business.ejb.csv.AccountModel; @@ -51,7 +53,6 @@ import org.chorem.lima.entity.FinancialStatement; import org.chorem.lima.entity.FinancialTransaction; import org.chorem.lima.entity.FinancialTransactionTopiaDao; import org.chorem.lima.entity.FiscalPeriod; -import org.chorem.lima.entity.FiscalPeriodTopiaDao; import org.chorem.lima.entity.Identity; import org.chorem.lima.entity.VatStatement; import org.nuiton.csv.Export; @@ -92,6 +93,12 @@ public class ExportServiceImpl extends AbstractLimaService implements ExportServ protected FinancialStatementService financialStatementService; @EJB + protected FinancialPeriodService financialPeriodService; + + @EJB + protected FiscalPeriodService fiscalPeriodService; + + @EJB protected VatStatementService vatStatementService; @EJB @@ -138,8 +145,7 @@ public class ExportServiceImpl extends AbstractLimaService implements ExportServ ImportExportResults results = new ImportExportResults(); ExportResult exportResult = results.createAddAndGetExportResult(FiscalPeriod.class); - FiscalPeriodTopiaDao dao = getDaoHelper().getFiscalPeriodDao(); - List<FiscalPeriod> entities = dao.findAll(); + List<FiscalPeriod> entities = fiscalPeriodService.getAllFiscalPeriodsByDate(); if (entities != null && !entities.isEmpty()) { FiscalPeriodModel model = new FiscalPeriodModel(); try { 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 7543d82..b2dcb10 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 @@ -174,6 +174,15 @@ public class FiscalPeriodServiceImpl extends AbstractLimaService implements Fisc return result; } + @Override + public List<FiscalPeriod> getAllFiscalPeriodsByDate() { + + FiscalPeriodTopiaDao fiscalPeriodTopiaDao = getDaoHelper().getFiscalPeriodDao(); + List<FiscalPeriod> result = fiscalPeriodTopiaDao.getAllByDate(); + + return result; + } + /** * return all blocked fiscal periods. */ @@ -252,7 +261,6 @@ public class FiscalPeriodServiceImpl extends AbstractLimaService implements Fisc @Override public boolean isRetainedEarnings(FiscalPeriod fiscalPeriod) { - boolean found = false; List<FinancialTransaction> financialTransactionsList = financialTransactionService.getAllFinancialTransactions( fiscalPeriod.getBeginDate(), fiscalPeriod.getEndDate()); @@ -261,12 +269,11 @@ public class FiscalPeriodServiceImpl extends AbstractLimaService implements Fisc for (Entry entry : financialTransaction.getEntry()) { if (Integer.valueOf(entry.getAccount().getAccountNumber().substring(0, 1)) < 6 && !entry.getAmount().equals(BigDecimal.ZERO)) { - found = true; - return found; + return true; } } } - return found; + return false; } @Override diff --git a/lima-business/src/main/java/org/chorem/lima/business/ejb/ImportServiceImpl.java b/lima-business/src/main/java/org/chorem/lima/business/ejb/ImportServiceImpl.java index e6eae5f..49bf6bd 100644 --- a/lima-business/src/main/java/org/chorem/lima/business/ejb/ImportServiceImpl.java +++ b/lima-business/src/main/java/org/chorem/lima/business/ejb/ImportServiceImpl.java @@ -169,10 +169,12 @@ public class ImportServiceImpl extends AbstractLimaService implements ImportServ } } catch (InvalidAccountNumberException | NotNumberAccountNumberException | NotAllowedLabelException e) { result.addException(e); + results.setErrors(true); } } } catch (ImportRuntimeException e) { result.addInitException(new ImportFileException(e.getMessage())); + results.setErrors(true); } finally { IOUtils.closeQuietly(contentStream); } @@ -203,6 +205,7 @@ public class ImportServiceImpl extends AbstractLimaService implements ImportServ } } catch (ImportRuntimeException e) { result.addInitException(new ImportFileException(e.getMessage())); + results.setErrors(true); } finally { IOUtils.closeQuietly(contentStream); } @@ -231,9 +234,11 @@ public class ImportServiceImpl extends AbstractLimaService implements ImportServ } } catch (MoreOneUnlockFiscalPeriodException | BeginAfterEndFiscalPeriodException | NotBeginNextDayOfLastFiscalPeriodException e) { result.addException(e); + results.setErrors(true); } } catch (ImportRuntimeException e) { result.addInitException(new ImportFileException(e.getMessage())); + results.setErrors(true); } finally { IOUtils.closeQuietly(contentStream); } @@ -262,11 +267,13 @@ public class ImportServiceImpl extends AbstractLimaService implements ImportServ result.increaseCreated(); } catch (LockedFinancialPeriodException | LockedEntryBookException e) { result.addException(e); + results.setErrors(true); } } } catch (ImportRuntimeException e) { result.addInitException(new ImportFileException(e.getMessage())); + results.setErrors(true); } finally { IOUtils.closeQuietly(contentStream); } @@ -293,6 +300,7 @@ public class ImportServiceImpl extends AbstractLimaService implements ImportServ } } catch (ImportRuntimeException e) { result.addInitException(new ImportFileException(e.getMessage())); + results.setErrors(true); } finally { IOUtils.closeQuietly(contentStream); } @@ -321,6 +329,7 @@ public class ImportServiceImpl extends AbstractLimaService implements ImportServ IOUtils.closeQuietly(contentStream); } catch (ImportRuntimeException e) { result.addInitException(new ImportFileException(e.getMessage())); + results.setErrors(true); } finally { IOUtils.closeQuietly(contentStream); } @@ -402,6 +411,7 @@ public class ImportServiceImpl extends AbstractLimaService implements ImportServ } catch (ImportRuntimeException e) { result.addInitException(new ImportFileException(e.getMessage())); + results.setErrors(true); } finally { IOUtils.closeQuietly(contentStream); } @@ -714,14 +724,42 @@ public class ImportServiceImpl extends AbstractLimaService implements ImportServ @Override public ImportExportResults importBackup(String entryBooks, String financialTransactions, String fiscalPeriods, String accounts, String entries, String identity) throws AlreadyExistAccountException, InvalidAccountNumberException { + ImportExportResults globalResult = importAccountAsCSV(accounts); + if (globalResult.isErrors()){ + return globalResult; + } - ImportExportResults results = importAccountAsCSV(accounts); - results.pushImportResults(importEntryBooksAsCSV(entryBooks)); - results.pushImportResults(importFiscalPeriodsAsCSV(fiscalPeriods)); - results.pushImportResults(importFinancialTransactionsAsCSV(financialTransactions)); - results.pushImportResults(importEntriesAsCSV(entries)); - results.pushImportResults(importIdentityAsCSV(identity)); - return results; + ImportExportResults subReport = importEntryBooksAsCSV(entryBooks); + if (subReport.isErrors()){ + globalResult.pushImportResults(subReport); + return globalResult; + } + + subReport = importFiscalPeriodsAsCSV(fiscalPeriods); + if (subReport.isErrors()){ + globalResult.pushImportResults(subReport); + return globalResult; + } + + subReport = importFinancialTransactionsAsCSV(financialTransactions); + if (subReport.isErrors()){ + globalResult.pushImportResults(subReport); + return globalResult; + } + + subReport = importEntriesAsCSV(entries); + if (subReport.isErrors()){ + globalResult.pushImportResults(subReport); + return globalResult; + } + + subReport = importIdentityAsCSV(identity); + if (subReport.isErrors()){ + globalResult.pushImportResults(subReport); + return globalResult; + } + + return globalResult; } //####################################### EBP ############################################## diff --git a/lima-business/src/test/java/org/chorem/lima/business/ImportExportServiceTest.java b/lima-business/src/test/java/org/chorem/lima/business/ImportExportServiceTest.java index df189db..ef4f45f 100644 --- a/lima-business/src/test/java/org/chorem/lima/business/ImportExportServiceTest.java +++ b/lima-business/src/test/java/org/chorem/lima/business/ImportExportServiceTest.java @@ -23,8 +23,9 @@ package org.chorem.lima.business; */ import com.google.common.collect.Lists; -import org.apache.commons.codec.binary.Base64; +import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; import org.chorem.lima.LimaTechnicalException; import org.chorem.lima.business.exceptions.AlreadyExistEntryBookException; import org.chorem.lima.business.exceptions.BeginAfterEndFiscalPeriodException; @@ -42,14 +43,18 @@ import org.chorem.lima.entity.FinancialStatement; import org.chorem.lima.entity.FinancialTransaction; import org.chorem.lima.entity.FiscalPeriod; import org.chorem.lima.entity.FiscalPeriodImpl; +import org.chorem.lima.entity.Identity; +import org.chorem.lima.entity.IdentityImpl; import org.junit.Assert; import org.junit.Test; -import java.io.ByteArrayInputStream; +import java.io.BufferedWriter; +import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStreamWriter; import java.nio.charset.Charset; import java.text.ParseException; import java.util.ArrayList; @@ -58,6 +63,7 @@ import java.util.List; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; +import java.util.zip.ZipOutputStream; /** * Created by davidcosse on 03/06/14. @@ -242,41 +248,98 @@ public class ImportExportServiceTest extends AbstractLimaTest { Assert.assertNull(result.getAllExceptionsByLine()); } -// @Test -// public void exportImportAllAsCSVTest() throws Exception { -// initTestWithFinancialTransaction(); -// Identity identity = new IdentityImpl(); -// identity.setName("Code Lutin"); -// identity.setAddress("12 Avenue Jules Verne"); -// identity.setZipCode("44230"); -// identity.setCity("Saint-Sébastien-sur-Loire"); -// identityService.updateIdentity(identity); -// -// String export = exportService.exportBackup("UTF-8"); -// -// String tmpDir = System.getProperty("java.io.tmpdir")+"/TMP_BACKUP.zip"; -// createZipFile(tmpDir, export); -// -// -// initAbstractTest(); -// -// List<ImportResult> importResults; -// importResults = importAllFromZipFile(tmpDir); -// -// String[] imported = {"accounts", "entryBooks", "fiscalPeriod", "financialTransactions", "entries", "identity"}; -// Assert.assertEquals(6, importResults.size()); -// for (int i = 0; i < importResults.size(); i++) { -// ImportResult importResult = importResults.get(i); -// log.info(imported[i] +": created:"+importResult.getNbCreated() + " updated:" + importResult.getNbUpdated() + " ignoded:" + importResult.getNbIgnored()); -// Assert.assertTrue(importResult.getNbCreated()>0); -// Assert.assertNull(importResult.getAllExceptionsByLine()); -// } -// } - - protected void createZipFile(String path, String zippedBase64Str) throws Exception { - byte[] bytes = Base64.decodeBase64(zippedBase64Str); - ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes); - IOUtils.copy(inputStream, new FileOutputStream(path)); + @Test + public void exportImportAllAsCSVTest() throws Exception { + initTestWithFinancialTransaction(); + Identity identity = new IdentityImpl(); + identity.setName("Code Lutin"); + identity.setAddress("12 Avenue Jules Verne"); + identity.setZipCode("44230"); + identity.setCity("Saint-Sébastien-sur-Loire"); + identityService.updateIdentity(identity); + + ImportExportResults export = exportService.exportBackup(Charset.defaultCharset().name()); + + String tmpDir = System.getProperty("java.io.tmpdir")+"/TMP_BACKUP.zip"; + createZipFile(export, tmpDir); + + + initAbstractTest(); + + List<ImportResult> importResults; + importResults = importAllFromZipFile(tmpDir); + + String[] imported = {"accounts", "entryBooks", "fiscalPeriod", "financialTransactions", "entries", "identity"}; + Assert.assertEquals(6, importResults.size()); + for (int i = 0; i < importResults.size(); i++) { + ImportResult importResult = importResults.get(i); + log.info(imported[i] +": created:"+importResult.getNbCreated() + " updated:" + importResult.getNbUpdated() + " ignoded:" + importResult.getNbIgnored()); + Assert.assertTrue(importResult.getNbCreated()>0); + Assert.assertNull(importResult.getAllExceptionsByLine()); + } + } + + public static final String JAVA_IO_TMPDIR = System.getProperty("java.io.tmpdir")+"/"; + + protected ImportExportResults createZipFile(ImportExportResults streamData, String path){ + + ZipOutputStream export = null; + FileOutputStream result = null; + try { + result = new FileOutputStream(path); + export = new ZipOutputStream(result); + for (ExportResult exportedData : streamData.getExportResults()) { + if (exportedData != null && StringUtils.isNotBlank(exportedData.getExportData())) { + String data = exportedData.getExportData(); + File file = createFile(JAVA_IO_TMPDIR + exportedData.getFromSource().getSimpleName(), Charset.defaultCharset().name(), data); + if (file != null) { + FileInputStream stream = null; + try { + ZipEntry ze = new ZipEntry(file.getName()); + export.putNextEntry(ze); + int len; + byte[] buffer = new byte[1024]; + stream = new FileInputStream(file); + while ((len = stream.read(buffer)) > 0) { + export.write(buffer, 0, len); + } + } finally { + IOUtils.closeQuietly(stream); + FileUtils.forceDelete(file); + } + } + } else { + // export failed + break; + } + } + export.flush(); + + } catch (IOException e) { + log.error(e.getMessage()); + } finally { + IOUtils.closeQuietly(export); + IOUtils.closeQuietly(result); + } + return streamData; + } + + protected File createFile(String filePath, String charset, String data) { + File file = new File(filePath); + BufferedWriter out = null; + try { + out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), charset)); + out.write(data); + out.flush(); + out.close(); + } catch (IOException eee) { + if (log.isErrorEnabled()) { + log.error("Can't write file " + filePath, eee); + } + } finally { + IOUtils.closeQuietly(out); + } + return file; } protected List<ImportResult> importAllFromZipFile(String filePath) { @@ -293,17 +356,17 @@ public class ImportExportServiceTest extends AbstractLimaTest { byte[] buffer = new byte[2048]; FileOutputStream fileoutputstream = null; - if (entry.getName().equalsIgnoreCase("accounts.csv")) { + if (entry.getName().equalsIgnoreCase("Account")) { fileoutputstream = new FileOutputStream(tmpDir + "accounts.csv"); - } else if (entry.getName().equalsIgnoreCase("entryBooks.csv")) { + } else if (entry.getName().equalsIgnoreCase("EntryBook")) { fileoutputstream = new FileOutputStream(tmpDir + "entryBooks.csv"); - } else if (entry.getName().equalsIgnoreCase("fiscalPeriod.csv")) { + } else if (entry.getName().equalsIgnoreCase("FiscalPeriod")) { fileoutputstream = new FileOutputStream(tmpDir + "fiscalPeriods.csv"); - } else if (entry.getName().equalsIgnoreCase("financialTransactions.csv")) { + } else if (entry.getName().equalsIgnoreCase("FinancialTransaction")) { fileoutputstream = new FileOutputStream(tmpDir + "financialTransactions.csv"); - } else if (entry.getName().equalsIgnoreCase("entries.csv")) { + } else if (entry.getName().equalsIgnoreCase("Entry")) { fileoutputstream = new FileOutputStream(tmpDir + "entries.csv"); - } else if (entry.getName().equalsIgnoreCase("identity.csv")) { + } else if (entry.getName().equalsIgnoreCase("Identity")) { fileoutputstream = new FileOutputStream(tmpDir + "identity.csv"); } int n; diff --git a/lima-callao/src/main/java/org/chorem/lima/entity/FiscalPeriodTopiaDao.java b/lima-callao/src/main/java/org/chorem/lima/entity/FiscalPeriodTopiaDao.java index 67417b3..f25a498 100644 --- a/lima-callao/src/main/java/org/chorem/lima/entity/FiscalPeriodTopiaDao.java +++ b/lima-callao/src/main/java/org/chorem/lima/entity/FiscalPeriodTopiaDao.java @@ -22,6 +22,8 @@ package org.chorem.lima.entity; +import java.util.List; + /** * Fiscal period entity DAO. * @@ -85,5 +87,14 @@ public class FiscalPeriodTopiaDao extends AbstractFiscalPeriodTopiaDao<FiscalPer .findFirstOrNull(); return result; - } + } + + public List<FiscalPeriod> getAllByDate() { + + List<FiscalPeriod> result = newQueryBuilder() + .setOrderByArguments(FiscalPeriod.PROPERTY_BEGIN_DATE) + .findAll(); + + return result; + } } diff --git a/lima-swing/src/main/java/org/chorem/lima/ui/importexport/ImportExport.java b/lima-swing/src/main/java/org/chorem/lima/ui/importexport/ImportExport.java index c07d034..936b601 100644 --- a/lima-swing/src/main/java/org/chorem/lima/ui/importexport/ImportExport.java +++ b/lima-swing/src/main/java/org/chorem/lima/ui/importexport/ImportExport.java @@ -256,19 +256,19 @@ public class ImportExport { // display result dialog if (verboseMode) { - ImportExportResults results = get(); - if (importMode && results == null) { + ImportExportResults globalResult = get(); + if (importMode && globalResult == null) { JOptionPane.showMessageDialog(viewComponent, t("lima.import.error"), t("lima.import.title"), JOptionPane.ERROR_MESSAGE); } else { if (importMode) { - List<ImportResult> importResults = results.getImportResults(); + List<ImportResult> importResults = globalResult.getImportResults(); if (importResults != null) { ComputeImportResultMessage(importResults); } } else { - List<ExportResult> exportResults = results.getExportResults(); + List<ExportResult> exportResults = globalResult.getExportResults(); if (exportResults != null) { ComputeExportResultMessage(exportResults); } -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.