예제 #1
0
    def compare_write_reports2(self, printer, sap):
        """
        :type printer: list of PrinterRecord
        :type sap: list of SapRecord
        :return:
        """

        tax_diff_by_tax = {}
        f = open(self.args["out"], 'wt')
        output = csv.writer(f)
        output.writerow(('id', 'status', 'message', 'comment', 'tax code diff', 'tax diff', 'taxes by tax', 'tax sum'))

        both, only_printer, only_sap = self.get_common_elements(printer, sap)
        # printer_keys = set(printer.keys())

        for refNum in only_printer:
            for tax in printer[refNum].tax_sum_by_tax:
                output.writerow((refNum, Record.STATUS_BAD, Record.MESSAGE_ONLY_PRINTER, None,
                                 tax, printer[refNum].tax_sum_by_tax[tax], printer[refNum].tax_sum_by_tax, printer[refNum].total_tax_sum))
        for refNum in only_sap:
            for tax in sap[refNum].tax_sum_by_tax:

                if tax == SapRecord.TAX_TECHNICAL_CODE and abs(sap[refNum].tax_sum_by_tax[tax]) < eps:
                    # skip when contains technical code and tax
                    continue
                output.writerow((refNum, Record.STATUS_BAD, Record.MESSAGE_ONLY_SAP, None,
                                 tax, abs(sap[refNum].tax_sum_by_tax[tax]), sap[refNum].tax_sum_by_tax, sap[refNum].total_tax_sum))

        for refNum in both:
            messages = Record.equal_records(printer[refNum], sap[refNum])
            if len(messages):
                for message in messages:
                    tax_symbol = message["tax_symbol_err"]

                    # liczenie sumy roznic podatkow
                    tax_diff = None
                    if tax_symbol:
                        # tax_diff = Record.round(abs(abs(printer[refNum].tax_sum_by_tax.get(tax_symbol, 0)) - abs(sap[refNum].tax_sum_by_tax.get(tax_symbol, 0))))
                        tax_diff = Record.round(printer[refNum].tax_sum_by_tax.get(tax_symbol, 0) - abs(sap[refNum].tax_sum_by_tax.get(tax_symbol, 0)))
                        tax_sum = tax_diff_by_tax.get(tax_symbol, 0) + tax_diff
                        tax_diff_by_tax[tax_symbol] = tax_sum

                    output.writerow((refNum, message["status"], message["message"], message["comment"], tax_symbol, tax_diff,
                                     (printer[refNum].tax_sum_by_tax, sap[refNum].tax_sum_by_tax),
                                     (printer[refNum].total_tax_sum, sap[refNum].total_tax_sum)))

            else:
                b = 'blad?'

        for tax in tax_diff_by_tax:
            output.writerow((tax, Record.round(tax_diff_by_tax[tax])))

        print '\nliczba wspolnych - ' + str(len(both))
        print 'liczba na drukarce - ' + str(len(only_printer))
        print 'liczba w sap - ' + str(len(only_sap))
예제 #2
0
    def read_sap_report2(self, files):

        with open(files, 'r') as f:
            rejestr = csv.reader(f, delimiter="\t")

            # skip first lines
            [(next(rejestr)) for i in range(0, SapRecord.FIRST_REPORT_LINE)]

            sap = defaultdict(list)
            for line in rejestr:
                try:

                    type_found = line[SapRecord.POS_TYPE].strip()
                    if type_found in SapRecord.TYPE_EXPECTED:
                        if line[SapRecord.POS_TYPE_SUM].strip() == SapRecord.TYPE_SUM_MARK:

                            # linia z suma wszystkich wpisow dla danego typu
                            continue

                        # check if document date if equal to passed
                        doc_date = str(line[SapRecord.POS_DOC_DATE].strip())
                        converted_date = time.strptime(doc_date, SapRecord.DATE_FORMAT)
                        if self.args["date"] and time.strftime("%m.%Y", converted_date) != self.args["date"]:
                            continue

                        refNum = str(line[SapRecord.POS_REF_NO].strip())
                        if refNum in sap:
                            record = sap[refNum]
                            """
                            @:type SapRecord
                            """
                            a = 'b'
                        else:
                            record = SapRecord()
                            b = 'fg'

                        # gross = record.gross = abs(record.to_float(lineValues[SapRecord.POS_GROSS].strip()))
                        # gross - wartosc brutto za dany przedmiot
                        gross = SapRecord.to_float(line[SapRecord.POS_GROSS].strip())

                        # stawka podatku, liczbowo
                        # taxRate = SapRecord.to_float(line[SapRecord.POS_TAX_RATE].strip())

                        # net - wartosc netto za dany przedmiot
                        net = SapRecord.to_float(line[SapRecord.POS_NET].strip())

                        # taxVal - wartosc podatku za dany przedmiot
                        taxVal = SapRecord.to_float(line[SapRecord.POS_TAX_VAL].strip())

                        record.type = line[SapRecord.POS_TYPE].strip()

                        total_tax_sum = 0

                        tax_symbol = line[SapRecord.POS_TAX_SYMBOL].strip()
                        if tax_symbol in SapRecord.tax_map:
                            tax_symbol = SapRecord.tax_map[tax_symbol]
                        tax_symbol = SapRecord.tax_map.get(tax_symbol, tax_symbol)

                        record.sale_sum_by_tax[tax_symbol] = Record.round(record.sale_sum_by_tax.get(tax_symbol, 0) + gross)
                        record.tax_sum_by_tax[tax_symbol] = Record.round(record.tax_sum_by_tax.get(tax_symbol, 0) + taxVal)
                        record.total_tax_sum = Record.round(record.total_tax_sum + taxVal)
                        record.gross_prices.append(gross)
                        record.gross_sum += gross
                        record.net += net

                        # print(refNum)
                        sap[refNum] = record

                        # pprint (vars(record))
                except ValueError as detail:
                    print detail
                    print line
                except IndexError as detail:
                    print detail
                    print line
        return sap
예제 #3
0
    def read_printer_report(self, files):
        rejestr = ""

        for filename in files:
            f = open(filename)
            rejestr += f.read()
        # rejestr.decode('iso-8859-1').encode('utf8')

        # split rejestr to blocks by receipt delimiter
        blocks_read = re.split(PrinterRecord.RECEIPT_DELIMITER, rejestr)

        print "\n\nblocks_read " + str(len(blocks_read)) + "\n\n"

        blocks = []
        printer = defaultdict(list)

        # exclude receipt if contains any string of RECEIPTS_EXCLUDED
        for block in blocks_read:
            if not len(block):
                continue

            # check if block contains one of strings, which excludes that receipt
            invalid_block = [text for index, text in enumerate(PrinterRecord.RECEIPTS_EXCLUDED) if str(text) in block]
            if not any(invalid_block):
                blocks.append(block)

        # 'blocks' contain valid receipts
        for receipt in blocks:

            refNum = None
            prices = []
            sale_sum_by_tax = {}
            tax_sum_by_tax = {}
            total_tax_sum = 0
            valid_date = False

            try:
                # split receipts to products part and summary
                products, summary = receipt.split(PrinterRecord.PRODUCTS_SUMMARY_DELIMITER)
            except ValueError as detail:
                print detail
                print receipt
                print "sprawdz kodowanie pliku (czy utf8) jesli duzo"
                continue

            # parse products part line by line
            for line in products.splitlines():
                # print line

                # data dokumentu, na start valid_date jest false,
                doc_date = re.search(PrinterRecord.RECEIPT_DOCUMENT_DATE, line, re.I)

                if not valid_date and doc_date:
                    converted_date = time.strptime(doc_date.group(1), PrinterRecord.DATE_FORMAT)
                    if self.args["date"] and time.strftime("%m.%Y", converted_date) == self.args["date"]:
                        valid_date = True

                # sprawdzenie czy na koncu linii jest cena np. 11,54A
                search = re.search(r"(\d+,\d+)([A-Z]{1})$", line, re.I)
                if search:

                    price = float(search.group(1).strip().replace(' ', '').replace(',', '.'))
                    prices.append(price)

            # collect data from summary lines, taxes and sums
            for line in summary.splitlines():

                # suma sprzedazy po typie podatku
                sum_tax_type = re.search(PrinterRecord.RECEIPT_SALE_SUM_BY_TAX_REGEX, line, re.I)
                if sum_tax_type:
                    sale_sum_by_tax[sum_tax_type.group(1)] = Record.round(sum_tax_type.group(2).strip().replace(' ', '').replace(',', '.'))

                # suma podatku po typie podatku
                tax_type_by_tax = re.search(PrinterRecord.RECEIPT_TAX_SUM_BY_TAX_REGEX, line, re.I)
                if tax_type_by_tax:
                    tax_sum_by_tax[tax_type_by_tax.group(1)] = Record.round(tax_type_by_tax.group(2).strip().replace(' ', '').replace(',', '.'))

                # calkowita suma podatku
                tax_total = re.search(PrinterRecord.RECEIPT_TOTAL_TAX_SUM_REGEX, line, re.I)
                if tax_total:
                    total_tax_sum = Record.round(tax_total.group(1).strip().replace(' ', '').replace(',', '.'))

                # suma rachunku z wiersza z suma
                if PrinterRecord.RECEIPT_SUM_ROW in line:
                    gross_sum = Record.round(line.replace(PrinterRecord.RECEIPT_SUM_ROW, '').strip().replace(' ', '').replace(',', '.'))

                # numer rachunku powiazany z numerem z sap
                if PrinterRecord.RECEIPT_REF_NUM_ROW in line:
                    refNum = str(line.replace(PrinterRecord.RECEIPT_REF_NUM_ROW, '')
                                 .replace(PrinterRecord.RECEIPT_REF_NUM_PREFIX, '').strip().replace(' ', ''))
            if not refNum:
                # np. testowe wydruki na drukarce
                print 'brak refNum na paragonie'
                # print receipt
                continue
            if self.args["date"] and not valid_date:
                print 'data spoza zakresu ' + refNum
                continue

            record = PrinterRecord()
            record.refNum = refNum
            record.sale_sum_by_tax = sale_sum_by_tax
            record.tax_sum_by_tax = tax_sum_by_tax
            record.gross_prices = prices
            record.gross_sum = gross_sum
            record.total_tax_sum = total_tax_sum
            printer[refNum] = record

        return printer
예제 #4
0
 def test_round(self):
     rounds = self.rounds
     for elem in rounds:
         num = Record.round(elem["input"])
         self.assertEqual(num, elem["expected"])