From 540662d2607ec3dd152e386325413104994294f8 Mon Sep 17 00:00:00 2001 From: CristianoMafraJunior Date: Wed, 11 Dec 2024 09:53:40 -0300 Subject: [PATCH] dacte: add modal dutoviario --- brazilfiscalreport/dacte/dacte.py | 139 ++++++++++++- tests/fixtures/dacte_dutoviario_test.xml | 190 ++++++++++++++++++ .../dacte/dacte_default_dutoviario.pdf | Bin 0 -> 14069 bytes tests/test_dacte.py | 9 + 4 files changed, 336 insertions(+), 2 deletions(-) create mode 100644 tests/fixtures/dacte_dutoviario_test.xml create mode 100644 tests/generated/dacte/dacte_default_dutoviario.pdf diff --git a/brazilfiscalreport/dacte/dacte.py b/brazilfiscalreport/dacte/dacte.py index 925ec34..e3d85c4 100644 --- a/brazilfiscalreport/dacte/dacte.py +++ b/brazilfiscalreport/dacte/dacte.py @@ -280,7 +280,7 @@ def _draw_header(self): section_start_y = y_margin + 4 w_rect = (self.epw / 2) - 33 h_rect = 27 - emit_name = extract_text(self.emit, "xNome") + self.emit_name = extract_text(self.emit, "xNome") self.cep = format_cep(extract_text(self.emit, "CEP")) self.fone = format_phone(extract_text(self.emit, "fone")) self.modal = TP_MODAL[extract_text(self.ide, "modal")] @@ -322,7 +322,7 @@ def _draw_header(self): w_text = w_rect - 4 self.set_font(self.default_font, "B", 9) self.set_xy(x=x_text, y=y_text) - self.multi_cell(w=w_text, h=5, text=emit_name, border=0, align="C") + self.multi_cell(w=w_text, h=5, text=self.emit_name, border=0, align="C") self.set_font(self.default_font, "", 8) self.set_xy(x=x_text - 3, y=y_text + 10) self.multi_cell(w=w_text + 10, h=3, text=address, border=0, align="C") @@ -2060,6 +2060,139 @@ def draw_multimodal_info(self, config): style="", ) + def draw_dutoviario_info(self, config): + x_margin = self.l_margin + page_width = self.epw + + section_start_y = self.get_y() + 7 + section_start_y = self.draw_section( + section_start_y, + 13, + "DADOS ESPECÍFICOS DO MODAL DUTOVIÁRIO", + ) + self.rect( + x=x_margin, + y=section_start_y - 10, + w=page_width - 0.1 * x_margin, + h=6, + style="", + ) + + col_width = (page_width - 2 * x_margin) / 5 + for i in range(1, 5): + x_line = x_margin + i * col_width + self.line( + x1=x_line, + x2=x_line, + y1=section_start_y - 10, + y2=section_start_y - 4, + ) + + self.set_font(self.default_font, "", 6) + road_titles = [ + "VALOR UNITÁRIO", + "VALOR DO FRETE", + "OUTROS", + "BASE DE CÁLCULO", + "ALÍQUOTA", + ] + + road_values = [ + "", + "", + "", + f"{self.vbc}", + f"{self.p_icms}", + ] + + for i, (title, value) in enumerate(zip(road_titles, road_values)): + self.set_xy(x_margin + i * col_width, section_start_y - 10) + self.multi_cell(w=col_width, h=3, text=title, align="L") + self.set_font(self.default_font, "B", 7) + self.set_xy(x_margin + i * col_width, section_start_y - 7) + self.multi_cell(w=col_width, h=3, text=value, align="L") + self.set_font(self.default_font, "", 6) + + section_start_y = self.get_y() + 10 + self.rect( + x=x_margin, + y=section_start_y - 10, + w=page_width - 0.1 * x_margin, + h=6, + style="", + ) + + col_width = (page_width - 2 * x_margin) / 6 + for i in range(1, 6): + x_line = x_margin + i * col_width + self.line( + x1=x_line, + x2=x_line, + y1=section_start_y - 10, + y2=section_start_y - 4, + ) + + self.set_font(self.default_font, "", 6) + road_titles = [ + "VALOR DO IMPOSTO", + "VALOR TOTAL DO FRETE", + "OBSERVAÇÕES", + "SÉRIE", + "NÚMERO", + "EMITENTE", + ] + + road_values = [ + "", + f"R$ {self.v_tpprest}", + "", + f"{self.serie_cte}", + f"{self.nr_dacte}", + f"{self.emit_name}", + ] + + for i, (title, value) in enumerate(zip(road_titles, road_values)): + self.set_xy(x_margin + i * col_width, section_start_y - 10) + self.multi_cell(w=col_width, h=3, text=title, align="L") + if i == 5: + self.set_font(self.default_font, "B", 6) + else: + self.set_font(self.default_font, "B", 7) + self.set_xy(x_margin + i * col_width, section_start_y - 7) + self.multi_cell(w=col_width, h=3, text=value, align="L") + self.set_font(self.default_font, "", 6) + + self.set_font(self.default_font, "", 7) + section_start_y = self.get_y() + section_start_y = self.draw_section( + section_start_y, 3, "USO EXCLUSIVO DO EMISSOR DO CT-E" + ) + self.set_margins( + left=config.margins.left, + top=config.margins.top, + right=config.margins.right, + ) + margins_to_height = { + 2: 20, + 3: 19, + 4: 17, + 5: 16, + 6: 13, + 7: 11, + 8: 11, + 9: 9, + 10: 8, + } + rect_height = margins_to_height[config.margins.left] + + self.rect( + x=x_margin, + y=section_start_y, + w=page_width - 0.1 * x_margin, + h=rect_height, + style="", + ) + def _draw_specific_data(self, config): x_margin = self.l_margin page_width = self.epw @@ -2145,6 +2278,8 @@ def _draw_specific_data(self, config): self.draw_aquaviario_info(config) if self.tp_modal == ModalType.FERROVIARIO: self.draw_ferroviario_info(config) + if self.tp_modal == ModalType.DUTOVIARIO: + self.draw_dutoviario_info(config) if self.tp_modal == ModalType.MULTIMODAL: self.draw_multimodal_info(config) diff --git a/tests/fixtures/dacte_dutoviario_test.xml b/tests/fixtures/dacte_dutoviario_test.xml new file mode 100644 index 0000000..dd1f1f1 --- /dev/null +++ b/tests/fixtures/dacte_dutoviario_test.xml @@ -0,0 +1,190 @@ + + + + + 35 + 57000111 + 5352 + Venda + 57 + 1 + 577 + 2020-01-01T12:00:00+01:00 + 1 + 1 + 0 + 2 + 0 + 0 + Odoo Brasil OCA v14 + 3550308 + São Paulo + SP + 05 + 0 + 3550308 + São Paulo + SP + 1302603 + Manaus + AM + 1 + 1 + + 3 + + + + Documento emitido por: Marc Demo + + Documento emitido por: Marc Demo + + + + 81583054000129 + 078016350838 + Empresa Lucro Presumido Ltda + Empresa Lucro Presumido + + Avenida Paulista + 1 + Bela Vista + 3550308 + São Paulo + 01311000 + SP + 551199999999 + + 3 + + + 12046835000161 + 887273429152 + CTE EMITIDO EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL + Cliente 2 -SP - Simples Nacional + 1177777777 + + Avenida Doutor Chucri Zaidan + 950 + Vila Cordeiro + 3550308 + São Paulo + 04583110 + SP + 1058 + Brasil + + cliente2@cliente2.com.br + + + 12046835000161 + 887273429152 + CTE EMITIDO EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL + 1177777777 + + Avenida Doutor Chucri Zaidan + 950 + Vila Cordeiro + 3550308 + São Paulo + 04583110 + SP + 1058 + Brasil + + cliente2@cliente2.com.br + + + 84148732000113 + 095693211 + CTE EMITIDO EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL + 9221458888 + + Avenida Javari + s/n + Lote 9.45/15E + Distrito Industrial + 1302603 + Manaus + 69075110 + AM + 1058 + Brasil + + cliente4@cliente4.com.br + + + 46081676000158 + 782175040 + CTE EMITIDO EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL + 9221459999 + 101362102 + + Avenida Javari + s/n + Lote 8.45/30E + Distrito Industrial + 1302603 + Manaus + 69075110 + AM + 1058 + Brasil + + cliente3@cliente3.com.br + + + 47.00 + 47.00 + + Frete + 47.00 + + + + + + 00 + 47.00 + 18.00 + 8.46 + + + + + + 1000.00 + XYZ Product + Other Product Data + + 00 + Volume + 1000.0000 + + + 01 + Peso Bruto + 500.0000 + + + 03 + Unidade + 2.0000 + + 1000.00 + + + + 41190806117473000150550010000586251016759484 + + + + + 1500.000000 + 2024-01-01 + 2024-12-31 + + + + + diff --git a/tests/generated/dacte/dacte_default_dutoviario.pdf b/tests/generated/dacte/dacte_default_dutoviario.pdf new file mode 100644 index 0000000000000000000000000000000000000000..68f8833660e6f06f5708d710c7215804a13b5668 GIT binary patch literal 14069 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