From 52c0c0dd28e77d132cdfe36259a2311923d4815a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Larra=C3=ADn?= Date: Fri, 10 Apr 2020 17:23:14 -0400 Subject: [PATCH] rcv.parse_csv: move code from 'fd-cl-data' in here Function `get_rcv_csv_file_parser` and its related type `RcvCsvFileParserType`. Source: https://github.com/fyntex/fd-cl-data/blob/ab4469402c8e4d50656f443eb93c900127f27bdd/fd_cl_data/apps/sii_rcv/models.py#L899-L952 --- cl_sii/rcv/parse_csv.py | 57 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/cl_sii/rcv/parse_csv.py b/cl_sii/rcv/parse_csv.py index 5f6c9894..e4f811f7 100644 --- a/cl_sii/rcv/parse_csv.py +++ b/cl_sii/rcv/parse_csv.py @@ -7,7 +7,7 @@ import csv import logging from datetime import date, datetime -from typing import Dict, Iterable, Optional, Sequence, Tuple +from typing import Callable, Dict, Iterable, Optional, Sequence, Tuple import marshmallow import marshmallow.fields @@ -22,6 +22,7 @@ from cl_sii.libs import tz_utils from cl_sii.rut import Rut +from .constants import RcEstadoContable, RcvKind from .data_models import ( RcvDetalleEntry, RcNoIncluirDetalleEntry, RcPendienteDetalleEntry, RcReclamadoDetalleEntry, @@ -32,6 +33,60 @@ logger = logging.getLogger(__name__) +RcvCsvFileParserType = Callable[ + [Rut, str, str, int, Optional[int]], + Iterable[ + Tuple[ + Optional[RcvDetalleEntry], + int, + Dict[str, object], + Dict[str, object], + ], + ], +] + + +def get_rcv_csv_file_parser( + rcv_kind: RcvKind, + estado_contable: Optional[RcEstadoContable], +) -> RcvCsvFileParserType: + """ + Return a function that parses a CSV file of the given :class:`RcvKind` and + :class:`RcEstadoContable`. + + :raises ValueError: + :raises Exception: on unrecoverable errors + """ + parse_func: RcvCsvFileParserType + + if rcv_kind == RcvKind.COMPRAS: + if estado_contable is None: + raise ValueError( + "'estado_contable' must not be None when 'rcv_kind' is 'COMPRAS'.", + ) + elif estado_contable == RcEstadoContable.REGISTRO: + parse_func = parse_rcv_compra_registro_csv_file + elif estado_contable == RcEstadoContable.NO_INCLUIR: + parse_func = parse_rcv_compra_no_incluir_csv_file + elif estado_contable == RcEstadoContable.RECLAMADO: + parse_func = parse_rcv_compra_reclamado_csv_file + elif estado_contable == RcEstadoContable.PENDIENTE: + parse_func = parse_rcv_compra_pendiente_csv_file + else: + raise Exception( + "Programming error. No handler for given 'estado_contable'.", + estado_contable, + ) + elif rcv_kind == RcvKind.VENTAS: + if estado_contable is not None: + raise ValueError("'estado_contable' must be None when 'rcv_kind' is 'VENTAS'.") + parse_func = parse_rcv_venta_csv_file + else: + raise Exception("Programming error. No handler for given 'rcv_kind'.", rcv_kind) + + return parse_func + + def parse_rcv_venta_csv_file( rut: Rut, razon_social: str,