From: Thadeu Lima de Souza Cascardo Date: Tue, 6 Mar 2018 20:16:23 +0000 (-0300) Subject: Suporta carnê leão X-Git-Url: http://git.cascardo.info/?p=cascardo%2Fdeclara.git;a=commitdiff_plain;h=e650e4c26047709eff0845e7a338b7b39c482f14 Suporta carnê leão --- diff --git a/lib/Makefile.am b/lib/Makefile.am index e3be5d0..ecc17d4 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -14,6 +14,7 @@ libreceita_la_SOURCES = declaracao.c declaracao.h \ help.c help.h \ contribuinte.c contribuinte.h \ rendimento.c rendimento.h \ + carne.c carne.h \ isento.c isento.h \ pagamento.c pagamento.h \ bem.c bem.h \ diff --git a/lib/base.c b/lib/base.c index 4414c36..dbf3f49 100644 --- a/lib/base.c +++ b/lib/base.c @@ -22,6 +22,7 @@ #include #include #include "rendimento.h" +#include "carne.h" #include "pagamento.h" #include "bem.h" #include "isento.h" @@ -106,6 +107,7 @@ static void salva(struct declaracao *dec, FILE *f) fprintf(f, "dvconta \"%s\"\n", dec->dvconta); contribuinte_salva(dec, f); rendimento_salva(dec, f); + carne_salva(dec, f); pagamento_salva(dec, f); bem_salva(dec, f); isento_salva(dec, f); diff --git a/lib/calcula.c b/lib/calcula.c index 8aa0cc1..960449b 100644 --- a/lib/calcula.c +++ b/lib/calcula.c @@ -117,7 +117,8 @@ static void total_pago(struct declaracao *dec) { struct rendimento *rendimento; int i; - dec->pago = dec->retido = 0; + dec->pago = dec->retido = totais_get(dec, "PAGO"); + dec->retido -= totais_get(dec, "CARNE"); for (i = 0; rendimento = list_get(dec->rendimento, i); i++) { dec->pago += rendimento->imposto; dec->retido += rendimento->imposto; diff --git a/lib/carne.c b/lib/carne.c new file mode 100644 index 0000000..09d331c --- /dev/null +++ b/lib/carne.c @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2015-2017 Thadeu Lima de Souza Cascardo + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "carne.h" +#include +#include +#include +#include +#include +#include "cmd.h" +#include "list.h" +#include "util.h" +#include "totais.h" + +void carne_free(void *pointer) +{ + struct carne *carne = pointer; + free(carne); +} + +static struct carne * carne_new(char **args, int argc) +{ + struct carne *carne; + int r = 0; + carne = malloc(sizeof(*carne)); + r += set_int(args[1], &carne->mes); + r += set_llong(args[2], &carne->rendimento); + r += set_llong(args[3], &carne->alugueis); + r += set_llong(args[4], &carne->outros); + r += set_llong(args[5], &carne->exterior); + r += set_llong(args[6], &carne->caixa); + r += set_llong(args[7], &carne->alimentos); + r += set_llong(args[8], &carne->dependentes); + r += set_llong(args[9], &carne->previdencia); + r += set_llong(args[10], &carne->base); + r += set_llong(args[11], &carne->imposto); + if (argc == 13) { + r += set_int(args[12], &carne->dependente); + } else { + carne->dependente = 0; + } + if (r < 0 || carne->mes < 0 || carne->dependente < 0 || + carne->rendimento < 0 || carne->alugueis < 0 || + carne->outros < 0 || carne->exterior < 0 || carne->caixa < 0 || + carne->alimentos < 0 || carne->dependentes < 0 || + carne->previdencia < 0 || carne->base < 0 || carne->imposto < 0) { + carne_free(carne); + return NULL; + } + return carne; +} + +static int run_carne(struct declaracao *dec, char **args, int argc) +{ + struct carne *carne; + int r = 0; + if (argc < 12 || argc > 13) + return -EINVAL; + carne = carne_new(args, argc); + if (!carne) + return -ENOMEM; + if (carne->dependente > list_size(dec->dependentes)) { + carne_free(carne); + return -EINVAL; + } + r += totais_add(dec, "RENDTRIB", carne->rendimento); + r += totais_add(dec, "RENDTRIB", carne->exterior); + r += totais_add(dec, "RENDEXT", carne->exterior); + r += totais_add(dec, "RENDPF", carne->rendimento); + r += totais_add(dec, "PAGO", carne->imposto); + r += totais_add(dec, "CARNE", carne->imposto); + r += totais_add(dec, "INSS", carne->previdencia); + if (carne->dependente) { + r += totais_add(dec, "RENDPFDEP", carne->rendimento); + r += totais_add(dec, "RENDEXTDEP", carne->exterior); + r += totais_add(dec, "CARNEDEP", carne->imposto); + } else { + r += totais_add(dec, "RENDPFTIT", carne->rendimento); + r += totais_add(dec, "RENDEXTTIT", carne->exterior); + r += totais_add(dec, "CARNETIT", carne->imposto); + } + if (r) { + carne_free(carne); + return r; + } + r = list_add(&dec->carne, carne); + if (r < 0) { + carne_free(carne); + return r; + } + return 0; +} + +void carne_salva(struct declaracao *dec, FILE *f) +{ + int i; + struct carne *j; + for (i = 0; j = list_get(dec->carne, i); i++) + fprintf(f, "carne %d %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %d\n", + j->mes, j->rendimento, j->alugueis, j->outros, + j->exterior, j->caixa, j->alimentos, j->dependentes, + j->previdencia, j->base, j->imposto, + j->dependente); +} + +static struct cmd cmd_carne = { + .name = "carne", + .run = run_carne, +}; + +int carne_cmd_init(void) +{ + cmd_add(&cmd_carne); + return 0; +} diff --git a/lib/carne.h b/lib/carne.h new file mode 100644 index 0000000..5306be5 --- /dev/null +++ b/lib/carne.h @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2015-2017 Thadeu Lima de Souza Cascardo + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef _CARNE_H +#define _CARNE_H + +#include +#include "declaracao.h" + +struct carne { + int mes; + long long rendimento; + long long alugueis; + long long outros; + long long exterior; + long long caixa; + long long alimentos; + long long dependentes; + long long previdencia; + long long base; + long long imposto; + int dependente; +}; + +void carne_salva(struct declaracao *dec, FILE *f); +void carne_free(void *pointer); + +int carne_cmd_init(void); + +#endif diff --git a/lib/declaracao.c b/lib/declaracao.c index 39bca5d..2fa6c4a 100644 --- a/lib/declaracao.c +++ b/lib/declaracao.c @@ -26,6 +26,7 @@ #include "conjuge.h" #include "sistema.h" #include "rendimento.h" +#include "carne.h" #include "isento.h" #include "pagamento.h" #include "bem.h" @@ -48,6 +49,9 @@ struct declaracao * declaracao_new(int ano) dec->rendimento = list_new(); if (!dec->rendimento) goto out_rendimento; + dec->carne = list_new(); + if (!dec->carne) + goto out_carne; dec->isentos = list_new(); if (!dec->isentos) goto out_isentos; @@ -78,6 +82,8 @@ out_bens: out_pagamentos: list_free(dec->isentos, isento_free); out_isentos: + list_free(dec->carne, carne_free); +out_carne: list_free(dec->rendimento, rendimento_free); out_rendimento: free(dec); @@ -103,6 +109,7 @@ void declaracao_free(struct declaracao *dec) if (dec->dvconta) free(dec->dvconta); list_free(dec->rendimento, rendimento_free); + list_free(dec->carne, carne_free); list_free(dec->isentos, isento_free); list_free(dec->pagamentos, pagamento_free); list_free(dec->bens, bem_free); @@ -132,6 +139,7 @@ void dec_cmd_init(void) contribuinte_cmd_init(); conjuge_cmd_init(); rendimento_cmd_init(); + carne_cmd_init(); isento_cmd_init(); pagamento_cmd_init(); bem_cmd_init(); diff --git a/lib/declaracao.h b/lib/declaracao.h index ee18949..5ba1a12 100644 --- a/lib/declaracao.h +++ b/lib/declaracao.h @@ -36,6 +36,7 @@ struct declaracao { char *cpf; char *nome; struct list *rendimento; + struct list *carne; struct list *isentos; struct list *pagamentos; struct list *bens; diff --git a/lib/gera.c b/lib/gera.c index c4bc17f..9d8aaf0 100644 --- a/lib/gera.c +++ b/lib/gera.c @@ -25,6 +25,7 @@ #include "declaracao.h" #include "cmd.h" #include "rendimento.h" +#include "carne.h" #include "isento.h" #include "pagamento.h" #include "bem.h" @@ -80,7 +81,8 @@ static void gera_header(struct declaracao *dec, FILE *f) * anterior, se não 1. */ fprintf(f, "%d", dec->retifica ? 0 : (dec->recibo ? 2 : 1)); /* Indicador imposto pago, TODO: carnê leão e Lei 11.033. */ - fprintf(f, "%02d", dec->retido ? 1 : 0); + fprintf(f, "%02d", totais_get(dec, "CARNE") > 0 ? 7 : + (dec->retido ? 1 : 0)); /* Indicador imposto antecipado, TODO: carnê leão, Lei 11.033, * outros. */ fprintf(f, "%d", dec->retido ? 1 : 0); @@ -281,12 +283,17 @@ static void gera_simples(struct declaracao *dec, FILE *f) fprintf(f, "%013lld", totais_get(dec, "EXCLUSIVOSDEP")); /* exclusivos dependentes */ fprintf(f, "%-13.13s", ""); /* FILLER */ fprintf(f, "%-13.13s", ""); /* FILLER */ - fprintf(f, "%013lld", totais_get(dec, "RENDPF")); /* rendimentos PF */ - fprintf(f, "%013lld", 0); /* TODO: rendimentos PF dependentes */ - fprintf(f, "%013lld", 0); /* TODO: rendimentos PF exterior */ - fprintf(f, "%013lld", 0); /* TODO: rendimentos PF ext. depend. */ - fprintf(f, "%013lld", totais_get(dec, "RENDPF")); /* TODO: carnê-leão PF? */ - fprintf(f, "%013lld", 0); /* TODO: carnê-leão dependentes */ + fprintf(f, "%013lld", totais_get(dec, "RENDPFTIT")); /* rendimentos PF titular */ + fprintf(f, "%013lld", totais_get(dec, "RENDPFDEP")); /* rendimentos PF dependentes */ + fprintf(f, "%013lld", totais_get(dec, "RENDEXTTIT")); /* FIXME: rendimentos PF exterior titular */ + fprintf(f, "%013lld", totais_get(dec, "RENDEXTDEP")); /* FIXME: rendimentos PF ext. depend. */ + + /* FIXME: um teste demonstra que não há valor quando existem rendimentos de PF para o titular */ + /* totais_get(dec, "RENDPF")); */ + /* TODO: carnê-leão PF? */ + fprintf(f, "%013lld", totais_get(dec, "CARNETIT")); + + fprintf(f, "%013lld", totais_get(dec, "CARNEDEP")); /* carnê-leão dependentes */ fprintf(f, "%013lld", totais_get(dec, "DEPENDENTES")); /* dedução dependentes */ fprintf(f, "%013lld", 0); /* TODO: previdência RRA */ fprintf(f, "%013lld", 0); /* TODO: previdência RRA dependentes */ @@ -309,7 +316,7 @@ static void gera_totais_simples(struct declaracao *dec, FILE *f) fprintf(f, "%013lld", dec->devido); /* imposto devido */ fprintf(f, "%013lld", dec->retido); /* imposto retido */ fprintf(f, "%013lld", 0); /* TODO: imposto complementar */ - fprintf(f, "%013lld", totais_get(dec, "RENDPF")); /* TODO: carnê-leão */ + fprintf(f, "%013lld", totais_get(dec, "CARNE")); /* TODO: imposto pago carnê-leão */ fprintf(f, "%013lld", 0); /* TODO: imposto retido Lei 11.033 */ fprintf(f, "%013lld", dec->restituicao); /* imposto a restituir */ fprintf(f, "%013lld", dec->pagar); /* imposto pagar */ @@ -327,7 +334,7 @@ static void gera_totais_simples(struct declaracao *dec, FILE *f) fprintf(f, "%013lld", 0); /* TODO: imposto ganhos de capital */ fprintf(f, "%013lld", totais_get(dec, "RENDPJTIT")); /* rendimento tributável PJ titular */ fprintf(f, "%013lld", 0); /* TODO: total rural */ - fprintf(f, "%013lld", dec->retido); /* imposto retido titular */ + fprintf(f, "%013lld", dec->retido); /* FIXME: imposto retido titular */ fprintf(f, "%013lld", totais_get(dec, "BENSANTERIOR")); /* total bens ano anterior */ fprintf(f, "%013lld", totais_get(dec, "BENS")); /* total bens ano base */ fprintf(f, "%013lld", totais_get(dec, "ISENTOSTIT")); /* rendimentos isentos titular */ @@ -342,8 +349,8 @@ static void gera_totais_simples(struct declaracao *dec, FILE *f) fprintf(f, "%013lld", 0); /* TODO: tributação exclusiva, transportado */ fprintf(f, "%013lld", 0); /* TODO: ganhos líquidos renda variável */ fprintf(f, "%013lld", 0); /* TODO: parcela isenta ganhos capital */ - fprintf(f, "%013lld", 0); /* TODO: rendimentos PF exterior titular */ - fprintf(f, "%013lld", 0); /* TODO: rendimentos PF exterior dependentes */ + fprintf(f, "%013lld", totais_get(dec, "RENDPFTIT") + totais_get(dec, "RENDEXTTIT")); /* TODO: rendimentos PF + exterior titular */ + fprintf(f, "%013lld", totais_get(dec, "RENDPFDEP") + totais_get(dec, "RENDEXTDEP")); /* TODO: rendimentos PF exterior dependentes */ fprintf(f, "%013lld", 0); /* TODO: doações campanha */ fprintf(f, "%013lld", 0); /* TODO: rendimentos PF exigibilidade suspensa titular */ fprintf(f, "%013lld", 0); /* TODO: rendimentos PF exigibilidade suspensa dependentes */ @@ -802,6 +809,32 @@ static void gera_bem(struct declaracao *dec, FILE *f) fprintf(f, "%05d", dec->linhas[27] + 1); } +static void gera_carne(struct declaracao *dec, FILE *f) +{ + struct carne *carne; + carne = list_get(dec->carne, dec->linhas[22]); + fprintf(f, "22"); + fprintf(f, "%-11.11s", dec->cpf); /* Titular */ + if (carne->dependente) { + struct dependente *d; + d = list_get(dec->dependentes, carne->dependente - 1); + fprintf(f, "S%-11.11s", d ? d->cpf : ""); /* CPF dependente. */ + } else { + fprintf(f, "N%-11.11s", ""); /* Não é dependente. */ + } + fprintf(f, "%02d", carne->mes); + fprintf(f, "%013lld", carne->rendimento); + fprintf(f, "%013lld", carne->alugueis); /* Aluguéis. */ + fprintf(f, "%013lld", carne->outros); /* Outros. */ + fprintf(f, "%013lld", carne->exterior); /* Exterior. */ + fprintf(f, "%013lld", carne->caixa); /* Livro-caixa. */ + fprintf(f, "%013lld", carne->alimentos); /* Pensão alimentícia. */ + fprintf(f, "%013lld", carne->dependentes); /* Dedução com dependentes. */ + fprintf(f, "%013lld", carne->previdencia); /* Previdência. */ + fprintf(f, "%013lld", carne->base); /* Base cálculo. */ + fprintf(f, "%013lld", carne->imposto); /* Imposto pago. */ +} + typedef void (gera_linha)(struct declaracao *dec, FILE *f); static void update_hash(struct declaracao *dec, char *buf, size_t len) @@ -867,6 +900,7 @@ static int gera(struct declaracao *dec, char *filename) int r = 0; int i; struct rendimento *rendimento; + struct carne *carne; struct isento *isento; struct pagamento *pagamento; struct bem *bem; @@ -909,6 +943,10 @@ static int gera(struct declaracao *dec, char *filename) W(gera_rendimento); } + for (i = 0; (carne = list_get(dec->carne, i)); i++) { + W(gera_carne); + } + if (totais_get(dec, "ISENTOS")) W(gera_isentos); if (totais_get(dec, "EXCLUSIVOS"))