com.axelor.apps.account.service.AccountChartService.java Source code

Java tutorial

Introduction

Here is the source code for com.axelor.apps.account.service.AccountChartService.java

Source

/**
 * 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;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Set;

import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.axelor.apps.account.db.AccountChart;
import com.axelor.apps.account.db.AccountConfig;
import com.axelor.apps.account.db.repo.AccountChartRepository;
import com.axelor.apps.account.db.repo.AccountConfigRepository;
import com.axelor.apps.base.db.Company;
import com.axelor.apps.base.db.repo.CompanyRepository;
import com.axelor.data.Listener;
import com.axelor.data.csv.CSVImporter;
import com.axelor.db.Model;
import com.axelor.exception.service.TraceBackService;
import com.google.inject.Inject;
import com.google.inject.persist.Transactional;

public class AccountChartService {

    private final Logger log = LoggerFactory.getLogger(getClass());

    protected AccountConfigRepository accountConfigRepo;
    protected CompanyRepository companyRepo;
    protected AccountChartRepository accountChartRepository;

    @Inject
    public AccountChartService(AccountConfigRepository accountConfigRepo, CompanyRepository companyRepo,
            AccountChartRepository accountChartRepository) {

        this.accountConfigRepo = accountConfigRepo;
        this.companyRepo = companyRepo;
        this.accountChartRepository = accountChartRepository;

    }

    public Boolean installAccountChart(AccountChart act, Company company, AccountConfig accountConfig) {
        try {

            File tempDir = new File(System.getProperty("java.io.tmpdir") + "/chartImport");
            if (!tempDir.exists())
                tempDir.mkdir();
            String chartPath = "/l10n/l10n_" + act.getCountryCode() + "/" + act.getCode() + "/";
            String[] files = new String[] { "chart-config.xml", "account_account.csv", "account_accountEquiv.csv",
                    "account_accountType.csv", "account_fiscalPosition.csv", "account_tax.csv",
                    "account_taxAccount.csv", "account_taxEquiv.csv", "account_taxLine.csv" };

            for (String fileName : Arrays.asList(files)) {
                File resourceFile = new File(tempDir, fileName);
                String resource = chartPath + fileName;
                if (fileName.equals("chart-config.xml"))
                    resource = "/l10n/chart-config.xml";
                log.debug("Resource file path: {}", resource);
                InputStream inputStream = this.getClass().getResourceAsStream(resource);
                if (inputStream == null)
                    continue;
                FileOutputStream outputStream;
                outputStream = new FileOutputStream(resourceFile);
                int read = 0;
                byte[] bytes = new byte[1024];
                while ((read = inputStream.read(bytes)) != -1)
                    outputStream.write(bytes, 0, read);
                outputStream.close();
            }
            HashMap<String, Object> context = new HashMap<String, Object>();
            context.put("_companyId", company.getId());
            importAccountChartData(tempDir.getAbsolutePath() + "/" + "chart-config.xml", tempDir.getAbsolutePath(),
                    context);
            updateChartCompany(act, company, accountConfig);
            FileUtils.deleteDirectory(tempDir);
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            TraceBackService.trace(e);
            return false;
        }

    }

    @Transactional
    public void updateChartCompany(AccountChart act, Company company, AccountConfig accountConfig) {
        accountConfig = accountConfigRepo.find(accountConfig.getId());
        accountConfig.setHasChartImported(true);
        accountConfigRepo.save(accountConfig);
        act = accountChartRepository.find(act.getId());
        company = companyRepo.find(company.getId());
        Set<Company> companySet = act.getCompanySet();
        companySet.add(company);
        act.setCompanySet(companySet);
        accountChartRepository.save(act);
    }

    public void importAccountChartData(String configPath, String dataDir, HashMap<String, Object> context)
            throws IOException {
        CSVImporter importer = new CSVImporter(configPath.toString(), dataDir);
        importer.addListener(new Listener() {
            @Override
            public void handle(Model bean, Exception e) {
            }

            @Override
            public void imported(Model arg0) {
            }

            @Override
            public void imported(Integer total, Integer count) {
                log.debug("Total records: {}", total);
                log.debug("Success records: {}", count);
            }

        });
        importer.setContext(context);
        importer.run();
    }

}