Skip to content

Commit

Permalink
Incluir relatórios consolidado e individual
Browse files Browse the repository at this point in the history
  • Loading branch information
dude333 committed Sep 7, 2023
1 parent c60d2b8 commit 6de5842
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 73 deletions.
145 changes: 86 additions & 59 deletions cmd/relatorio.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,61 +43,108 @@ func init() {
func criarRelatório(cmd *cobra.Command, args []string) {
dfp, err := contabil.NovaDemonstraçãoFinanceira(db(), flags.tempDir)
if err != nil {
progress.Error(err)
os.Exit(1)
progress.Fatal(err)
}

empresas, err := dfp.Empresas()
if err != nil {
log.Fatal(err)
progress.Fatal(err)
}
empresa, ok := escolherEmpresa(empresas)
if !ok {
progress.Warning("Nenhuma empresa foi escolhida")
os.Exit(1)
progress.FatalMsg("Nenhuma empresa foi escolhida")
}

itr, err := dfp.RelatórioTrimestal(empresa.CNPJ)
filename, err := prepareFilename(flags.relatorio.outputDir, empresa.Nome)
if err != nil {
progress.Error(err)
os.Exit(1)
progress.Fatal(err)
}

fn, err := prepareFilename(flags.relatorio.outputDir, empresa.Nome)
if err != nil {
progress.Error(err)
os.Exit(1)
x := &Excel{
file: excelize.NewFile(),
sheetName: "Informe Trimestral",
sheetIndex: 0,
}

excel(fn, rapina.UnificarContasSimilares(itr), !flags.relatorio.crescente)
}

func excel(filename string, itr []rapina.InformeTrimestral, decrescente bool) {
f := excelize.NewFile()
defer func() {
if err := f.Close(); err != nil {
if err := x.file.Close(); err != nil {
progress.Error(err)
}
}()

// Create a new sheet.
sheet := "Informe Trimestral"
err := f.SetSheetName(f.GetSheetList()[0], sheet)
// DADOS CONSOLIDADOS
itr, err := dfp.RelatórioTrimestal(empresa.CNPJ, true)
if err != nil {
log.Fatal(err)
progress.Fatal(err)
}
if len(itr) > 0 {
progress.Debug("Dados consolidados: %d registros", len(itr))
if err = x.NewSheet("consolidado"); err != nil {
progress.Fatal(err)
}
excelReport(x, rapina.UnificarContasSimilares(itr), !flags.relatorio.crescente)
}

// DADOS INDIVIDUAIS
itr, err = dfp.RelatórioTrimestal(empresa.CNPJ, false)
if err != nil {
progress.Fatal(err)
}
if len(itr) > 0 {
progress.Debug("Dados individuais: %d registros", len(itr))
if err = x.NewSheet("individual"); err != nil {
progress.Fatal(err)
}
excelReport(x, rapina.UnificarContasSimilares(itr), !flags.relatorio.crescente)
}

// Salva planilha
if err := x.file.SaveAs(filename); err != nil {
progress.Fatal(err)
os.Exit(1)
}
progress.Status("Relatório salvo como: %s", filename)
}

type Excel struct {
file *excelize.File
sheetName string
sheetIndex int
}

x := Excel{
f: f,
sheetName: sheet,
func (x *Excel) NewSheet(sheetName string) error {
n := len(x.file.GetSheetList())
if n == 1 && x.sheetIndex == 0 {
err := x.file.SetSheetName(x.file.GetSheetList()[x.sheetIndex], sheetName)
if err != nil {
return err
}
} else {
_, err := x.file.NewSheet(sheetName)
if err != nil {
return err
}
}
x.sheetIndex++
x.sheetName = sheetName
return nil
}

func (x *Excel) printCell(row, col int, style int, value interface{}) {
_ = x.file.SetCellValue(x.sheetName, cell(row, col), value)
_ = x.file.SetCellStyle(x.sheetName, cell(row, col), cell(row, col), style)
}

func cell(row, col int) string {
return fmt.Sprintf("%s%d", num2name(col), row)
}

func excelReport(x *Excel, itr []rapina.InformeTrimestral, decrescente bool) {
ZoomScale := 90.0
if err := f.SetSheetView(sheet, 0, &excelize.ViewOptions{ZoomScale: &ZoomScale}); err != nil {
if err := x.file.SetSheetView(x.sheetName, 0, &excelize.ViewOptions{ZoomScale: &ZoomScale}); err != nil {
log.Fatal(err)
}

fontStyle, err := f.NewStyle(&excelize.Style{
fontStyle, err := x.file.NewStyle(&excelize.Style{
Font: &excelize.Font{
Size: 10.0,
},
Expand All @@ -106,7 +153,7 @@ func excel(filename string, itr []rapina.InformeTrimestral, decrescente bool) {
log.Fatal(err)
}

titleStyle, err := f.NewStyle(&excelize.Style{
titleStyle, err := x.file.NewStyle(&excelize.Style{
Font: &excelize.Font{
Bold: true,
},
Expand All @@ -116,7 +163,7 @@ func excel(filename string, itr []rapina.InformeTrimestral, decrescente bool) {
}

customerNumFmt := `_(* #,##0_);[RED]_(* (#,##0);_(* "-"_);_(@_)`
numberStyle, err := f.NewStyle(&excelize.Style{
numberStyle, err := x.file.NewStyle(&excelize.Style{
CustomNumFmt: &customerNumFmt,
Font: &excelize.Font{
Size: 10.0,
Expand All @@ -126,7 +173,7 @@ func excel(filename string, itr []rapina.InformeTrimestral, decrescente bool) {
log.Fatal(err)
}

boldNumberStyle, err := f.NewStyle(&excelize.Style{
boldNumberStyle, err := x.file.NewStyle(&excelize.Style{
CustomNumFmt: &customerNumFmt,
Font: &excelize.Font{
Bold: true,
Expand Down Expand Up @@ -169,7 +216,7 @@ func excel(filename string, itr []rapina.InformeTrimestral, decrescente bool) {
x.printCell(row, 1, fontStyle, spc+informe.Codigo)
x.printCell(row, 2, fontStyle, spc+informe.Descr)
if strings.Count(informe.Codigo, ".") <= 1 {
_ = f.SetCellStyle(sheet, cell(row, 1), cell(row, 2), titleStyle)
_ = x.file.SetCellStyle(x.sheetName, cell(row, 1), cell(row, 2), titleStyle)
}
col = initCol
for _, ano := range anos {
Expand All @@ -187,7 +234,7 @@ func excel(filename string, itr []rapina.InformeTrimestral, decrescente bool) {
}

if strings.Count(informe.Codigo, ".") <= 1 {
_ = f.SetCellStyle(sheet, cell(row, col), cell(row, col+3), boldNumberStyle)
_ = x.file.SetCellStyle(x.sheetName, cell(row, col), cell(row, col+3), boldNumberStyle)
}
}
col += 4
Expand All @@ -197,12 +244,12 @@ func excel(filename string, itr []rapina.InformeTrimestral, decrescente bool) {

// Auto-resize columns
codWidth, descrWidth := colWidths(itr)
_ = f.SetColWidth(sheet, "A", "A", codWidth)
_ = f.SetColWidth(sheet, "B", "B", descrWidth)
_ = f.SetColWidth(sheet, num2name(3), num2name(col+3), 12)
_ = x.file.SetColWidth(x.sheetName, "A", "A", codWidth)
_ = x.file.SetColWidth(x.sheetName, "B", "B", descrWidth)
_ = x.file.SetColWidth(x.sheetName, num2name(3), num2name(col+3), 12)

// Freeze panes
_ = f.SetPanes(sheet, &excelize.Panes{
_ = x.file.SetPanes(x.sheetName, &excelize.Panes{
Freeze: true,
Split: false,
XSplit: 2,
Expand All @@ -221,30 +268,10 @@ func excel(filename string, itr []rapina.InformeTrimestral, decrescente bool) {
}
for i := len(hasData) - 1; i >= 0; i-- {
if !hasData[i] {
_ = f.RemoveCol(sheet, num2name(initCol+i))
_ = x.file.RemoveCol(x.sheetName, num2name(initCol+i))
}
}

// Save spreadsheet
if err := f.SaveAs(filename); err != nil {
log.Fatal(err)
}
progress.Status("Relatório salvo como: %s", filename)
}

type Excel struct {
f *excelize.File
sheetName string
}

func (x *Excel) printCell(row, col int, style int, value interface{}) {
_ = x.f.SetCellValue(x.sheetName, cell(row, col), value)
_ = x.f.SetCellStyle(x.sheetName, cell(row, col), cell(row, col), style)
}

func cell(row, col int) string {
return fmt.Sprintf("%s%d", num2name(col), row)
}
} // excelReport =====

func num2name(col int) string {
n, _ := excelize.ColumnNumberToName(col)
Expand Down
4 changes: 2 additions & 2 deletions pkg/contabil/contabil.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,11 +105,11 @@ func (df *DemonstraçãoFinanceira) Relatório(cnpj string, ano int) (*dominio.D
return dfp, err
}

func (df *DemonstraçãoFinanceira) RelatórioTrimestal(cnpj string) ([]rapina.InformeTrimestral, error) {
func (df *DemonstraçãoFinanceira) RelatórioTrimestal(cnpj string, consolidado bool) ([]rapina.InformeTrimestral, error) {
if df.bd == nil {
return nil, ErrRepositórioInválido
}
return df.bd.Trimestral(context.Background(), cnpj)
return df.bd.Trimestral(context.Background(), cnpj, consolidado)
}

func (df *DemonstraçãoFinanceira) Empresas() ([]rapina.Empresa, error) {
Expand Down
12 changes: 2 additions & 10 deletions pkg/contabil/repositorio/repositorio_sqlite.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ func (s *Sqlite) Ler(ctx context.Context, cnpj string, ano int) (*dominio.Demons
return &dfp, err
}

func (s *Sqlite) Trimestral(ctx context.Context, cnpj string) ([]rapina.InformeTrimestral, error) {
func (s *Sqlite) Trimestral(ctx context.Context, cnpj string, consolidado bool) ([]rapina.InformeTrimestral, error) {
var ids []int
err := s.db.SelectContext(ctx, &ids, `SELECT id FROM empresas WHERE cnpj=? ORDER BY ano`, &cnpj)
if err == sql.ErrNoRows {
Expand All @@ -129,18 +129,10 @@ func (s *Sqlite) Trimestral(ctx context.Context, cnpj string) ([]rapina.InformeT
progress.Trace("[]sqliteEmpresa => %+v", ids)

var resultados []resultadoTrimestral
err = s.db.SelectContext(ctx, &resultados, sqlTrimestral(ids, true))
err = s.db.SelectContext(ctx, &resultados, sqlTrimestral(ids, consolidado))
if err != nil {
return nil, err
}
if len(resultados) == 0 {
// Buscar por dados individuais caso a empresa não tenha dados consolidados
progress.Trace("Dados consolidados não encontrados; procurando por dados individuais...")
err = s.db.SelectContext(ctx, &resultados, sqlTrimestral(ids, false))
if err != nil {
return nil, err
}
}

return converterResultadosTrimestrais(resultados)
}
Expand Down
12 changes: 10 additions & 2 deletions pkg/progress/progress.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,16 @@ func Status(format string, a ...interface{}) {
}
}

func Fatal(err error) {
Error(err)
os.Exit(1)
}

func FatalMsg(format string, a ...interface{}) {
ErrorMsg(format, a...)
os.Exit(1)
}

func Error(err error) {
if len(p.running) > 0 {
clearLine()
Expand Down Expand Up @@ -135,7 +145,6 @@ func ErrorMsg(format string, a ...interface{}) {
if len(p.running) > 0 {
output(p.running)
}

}

func Warning(format string, a ...interface{}) {
Expand All @@ -150,7 +159,6 @@ func Warning(format string, a ...interface{}) {
if len(p.running) > 0 {
output(p.running)
}

}

func Debug(format string, a ...interface{}) {
Expand Down

0 comments on commit 6de5842

Please sign in to comment.