Exemplo n.º 1
0
 def generate_and_test_file(self, payment_order):
     self.converter = PaymentConverterSpain()
     wiz_export = self.env['banking.export.csb.wizard'].with_context({
         'active_ids': [payment_order.id],
         'active_model':
         'payment.order',
         'active_id':
         payment_order.id
     }).create({})
     wiz_export.create_csb()
     self.assertTrue(wiz_export.file)
     data = base64.decodestring(wiz_export.file)
     file_obj = NamedTemporaryFile('w+', suffix='.text', delete=False)
     file_obj.write(base64.decodestring(wiz_export.file))
     path = file_obj.name
     file_obj.close()
     with open(path, "rb") as fp:
         doc = csv.reader(fp,
                          delimiter=';',
                          quotechar='"',
                          quoting=csv.QUOTE_ALL)
         data = [ln for ln in doc]
     today = datetime.today().strftime('%d%m%y')
     line1 = data[0][0]
     self.assertEqual('03', line1[0:2])
     self.assertEqual('59', line1[2:4])
     payment_mode = payment_order.mode
     bank_id = payment_mode.bank_id
     self.assertEqual(bank_id.partner_id.vat[2:], line1[4:13])
     self.assertEqual(payment_mode.csb_suffix, line1[13:16])
     self.assertEqual(12 * ' ', line1[16:28])
     self.assertEqual('001', line1[28:31])
     self.assertEqual(today, line1[31:37])
     self.assertEqual(9 * ' ', line1[37:46])
     self.assertEqual(bank_id.acc_number.replace(' ', ''), line1[46:70])
     self.assertEqual(30 * ' ', line1[70:100])
     for i in range(6):
         line = data[i + 1][0]
         self.pop_beneficiary_test(payment_order, line, i)
     line8 = data[7][0]
     self.assertEqual('08', line8[0:2])
     self.assertEqual('59', line8[2:4])
     self.assertEqual(bank_id.partner_id.vat[2:], line8[4:13])
     self.assertEqual(payment_mode.csb_suffix, line8[13:16])
     amount = self.converter.convert(abs(self.payment_order.total), 12)
     self.assertEqual(amount, line8[31:43])
     self.assertEqual(amount, line8[31:43])
     self.assertEqual('0000000008', line8[43:53])
     self.assertEqual(47 * ' ', line8[53:100])
Exemplo n.º 2
0
 def __init__(self, env):
     self.env = env
     self.converter = PaymentConverterSpain()
Exemplo n.º 3
0
class ConfirmingPopular(object):
    def __init__(self, env):
        self.env = env
        self.converter = PaymentConverterSpain()

    def create_file(self, order, lines):
        self.order = order
        self.num_records = 0
        if self.order.mode.type.code == 'conf_popular':
            txt_file = self._pop_cabecera()
            for line in lines:
                txt_file += self._pop_beneficiarios(line)
                txt_file += self._pop_detalle(line)
            txt_file += self._pop_totales(line, self.num_records)
        return txt_file

    def _pop_cabecera(self):
        if self.order.date_prefered == 'due':
            fecha_planificada = self.order.line_ids \
                and self.order.line_ids[0].ml_maturity_date \
                or datetime.date.today().strftime('%Y-%d-%m')
            fecha_planificada = fecha_planificada.replace('-', '')
            dia = fecha_planificada[6:]
            mes = fecha_planificada[4:6]
            ano = fecha_planificada[:4]
            fecha_planificada = dia + mes + ano
        elif self.order.date_prefered == 'now':
            fecha_planificada = datetime.date.today().strftime('%d%m%Y')
        else:
            fecha_planificada = self.order.date_scheduled
            if not fecha_planificada:
                raise Log(
                    _("Error: Fecha planificada no \
                        establecida en la Orden de pago."))
            else:
                fecha_planificada = fecha_planificada.replace('-', '')
                dia = fecha_planificada[6:]
                mes = fecha_planificada[4:6]
                ano = fecha_planificada[:4]
                fecha_planificada = dia + mes + ano

        all_text = ''
        for i in range(4):
            text = ''
            # 1 y 2
            text += '13'
            # 3 -4 Codigo operacion
            if self.order.mode.conf_popular_type == '70':
                text += '70'
            else:
                text += '60'
            # 5 - 14 Codigo ordenante
            text += '0'
            vat = self.order.mode.bank_id.partner_id.vat[2:]
            text += self.converter.convert(vat, 9)
            # 15 - 17 Sufijo
            text += '001'
            # 18 -26 Libre
            text += 9 * ' '
            # 27 Numero del dato
            dato = '00' + str(i + 1)
            text += dato
            if (i + 1) == 1:
                text += datetime.date.today().strftime('%d%m%Y')
                text += fecha_planificada
                cuenta = self.order.mode.bank_id.acc_number
                cuenta = cuenta.replace(' ', '')
                tipo_cuenta = self.order.mode.bank_id.state
                if tipo_cuenta == 'iban':
                    cuenta = cuenta[4:]
                control = cuenta[8:10]
                principio = cuenta[:8]
                cuenta = principio + cuenta[10:]
                text += cuenta
                if self.order.mode.conf_popular_type == '70':
                    text += ' 01 '
                else:
                    text += '0   '
                text += control
                text += 3 * ' '
            if (i + 1) == 2:
                ordenante = self.order.mode.bank_id.partner_id.name
                if not ordenante:
                    raise Log(
                        _("Error: Propietario de la cuenta no establecido para\
                        la cuenta %s.") % self.order.mode.bank_id.acc_number)
                if len(ordenante) <= 36:
                    relleno = 36 - len(ordenante)
                    ordenante += relleno * ' '
                elif len(ordenante) > 36:
                    ordenante = ordenante[:36]
                text += ordenante
            if (i + 1) == 3:
                domicilio_pro = self.order.mode.bank_id.partner_id.street
                if not domicilio_pro:
                    raise Log(
                        _("Error: El Ordenante %s no tiene \
                        establecido el Domicilio.\
                         ") % self.order.mode.bank_id.partner_id.name)
                else:
                    if len(domicilio_pro) < 36:
                        relleno = 36 - len(domicilio_pro)
                        domicilio_pro += relleno * ' '
                    text += domicilio_pro
            if (i + 1) == 4:
                ciudad_pro = self.order.mode.bank_id.partner_id.city
                if not ciudad_pro:
                    raise Log(
                        _("Error: El Ordenante %s no tiene establecida la \
                        Ciudad.") % self.order.mode.bank_id.partner_id.name)
                else:
                    if len(ciudad_pro) < 36:
                        relleno = 36 - len(ciudad_pro)
                        ciudad_pro += relleno * ' '
                    text += ciudad_pro

            text = text.ljust(100) + '\r\n'
            all_text += text
        return all_text

    def _pop_beneficiarios(self, line):
        all_text = ''
        for i in range(4):
            text = ''
            # 1 y 2
            text += '16'
            # 3 -4 Codigo operacion
            if self.order.mode.conf_popular_type == '70':
                text += '70'
            elif self.order.mode.conf_popular_type == '60':
                text += '60'
            elif self.order.mode.conf_popular_type == '61':
                text += '61'
            # 5 - 14 Codigo ordenante
            text += '0'
            vat = self.order.mode.bank_id.partner_id.vat[2:]
            text += self.converter.convert(vat, 9)
            # 15 - 26 NIF Beneficiario
            nif = line['partner_id']['vat']
            if not nif:
                raise Log(
                    _("Error: El Proveedor %s no tiene \
                        establecido el NIF.") % line['partner_id']['name'])
            nif = nif[2:]
            if len(nif) < 12:
                relleno = 12 - len(nif)
                nif = (relleno * '0') + nif
            text += nif
            if (i + 1) == 1:
                # 27 - 29 Numero de dato
                text += '010'
                # 30 - 41 Importe
                text += self.converter.convert(abs(line['amount']), 12)
                # 42 - 59 Num banco, Num sucursal, Num cuenta
                if self.order.mode.conf_popular_type != '61':
                    cuenta = line['bank_id']['acc_number']
                    cuenta = cuenta.replace(' ', '')
                    tipo_cuenta = self.order.mode.bank_id.state
                    if tipo_cuenta == 'iban':
                        cuenta = cuenta[4:]
                    control = cuenta[8:10]
                    principio = cuenta[:8]
                    cuenta = principio + cuenta[10:]
                    text += cuenta
                else:
                    cuenta = 18 * ' '
                    text += cuenta
                # 60 - 61 - 62  Gastos, Forma de pago, Libre
                if self.order.mode.conf_popular_type in ['60', '61']:
                    if self.order.mode.gastos == 'ordenante':
                        text += '1  '
                    elif self.order.mode.gastos == 'beneficiario':
                        text += '2  '
                    else:
                        text += '   '
                elif self.order.mode.conf_popular_type == '70':
                    if self.order.mode.forma_pago == 'C':
                        text += ' C '
                    elif self.order.mode.forma_pago == 'T':
                        text += ' T '
                    else:
                        text += '   '
                # 63 - Digito control
                if self.order.mode.conf_popular_type != '61':
                    text += control
                else:
                    text += '  '
                # 65 - 72 Libre
                text += 8 * ' '
            if (i + 1) == 2:
                # 27 - 29 Numero de dato
                text += '011'
                # 30 - 65 Nombre del beneficiario
                nombre_pro = line['partner_id']['name']
                if nombre_pro:
                    if len(nombre_pro) < 36:
                        relleno = 36 - len(nombre_pro)
                        nombre_pro += relleno * ' '
                    elif len(nombre_pro) > 36:
                        nombre_pro = nombre_pro[:36]
                    text += nombre_pro
                else:
                    text += 36 * ' '
                # 66 - 72 Libre
                text += 7 * ' '
            if (i + 1) == 3:
                # 27 - 29 Numero de dato
                text += '012'
                # 30 - 65 Domicilio del beneficiario
                domicilio_pro = line['partner_id']['street']
                if not domicilio_pro:
                    raise Log(
                        _("Error: El Proveedor %s no tiene\
                         establecido el Domicilio.\
                         ") % line['partner_id']['name'])
                else:
                    if len(domicilio_pro) < 36:
                        relleno = 36 - len(domicilio_pro)
                        domicilio_pro += relleno * ' '
                    text += domicilio_pro
                # 66 - 72 Libre
                text += 7 * ' '
            if (i + 1) == 4:
                # 27 - 29 Numero de dato
                text += '014'
                # 30 - 65 CP, Ciudad
                cp_pro = line['partner_id']['zip']
                if not cp_pro:
                    raise Log(
                        _("Error: El Proveedor %s no tiene establecido\
                         el C.P.") % line['partner_id']['name'])
                else:
                    if len(cp_pro) < 5:
                        relleno = 5 - len(cp_pro)
                        cp_pro += relleno * ' '
                    text += cp_pro
                ciudad_pro = line['partner_id']['city']
                if not ciudad_pro:
                    raise Log(
                        _("Error: El Proveedor %s no tiene establecida\
                         la Ciudad.") % line['partner_id']['name'])
                else:
                    if len(ciudad_pro) < 31:
                        relleno = 31 - len(ciudad_pro)
                        ciudad_pro += relleno * ' '
                    text += ciudad_pro
                # 66 - 72 Libre
                text += 7 * ' '
            text = text.ljust(100) + '\r\n'
            all_text += text
        self.num_records += 1
        return all_text

    def _pop_detalle(self, line):
        text = ''
        # 1 y 2
        text += '17'
        # 3 -4 Codigo operacion
        if self.order.mode.conf_popular_type == '70':
            text += '70'
        elif self.order.mode.conf_popular_type == '60':
            text += '60'
        elif self.order.mode.conf_popular_type == '61':
            text += '61'
        # 5 - 14 Codigo ordenante
        text += '0'
        vat = self.order.mode.bank_id.partner_id.vat[2:]
        text += self.converter.convert(vat, 9)
        # 15 - 26 NIF Beneficiario
        nif = line['partner_id']['vat']
        if not nif:
            raise Log(
                _("Error: El Proveedor %s no tiene establecido\
                 el NIF.") % line['partner_id']['name'])
        nif = nif[2:]
        if len(nif) < 12:
            relleno = 12 - len(nif)
            nif = (relleno * '0') + nif
        text += nif
        # 27 - 29 Numero de dato
        text += '100'
        # 30 - 37 Fecha emisión Factura
        fecha_factura = 8 * ' '
        if line['ml_inv_ref'][0]['reference']:
            fecha_factura = line['ml_inv_ref'][0]['date_invoice']\
                .replace('-', '')
            dia = fecha_factura[6:]
            mes = fecha_factura[4:6]
            ano = fecha_factura[:4]
            fecha_factura = dia + mes + ano
        text += fecha_factura
        # 38 - 45 Fecha vencimiento / Referencia factura
        if self.order.mode.conf_popular_type == '70':
            fecha_vencimiento = 8 * ' '
            if line['ml_inv_ref'][0]['reference']:
                fecha_vencimiento = line['date']\
                    .replace('-', '')
                dia = fecha_vencimiento[6:]
                mes = fecha_vencimiento[4:6]
                ano = fecha_vencimiento[:4]
                fecha_vencimiento = dia + mes + ano
            text += fecha_vencimiento
        elif self.order.mode.conf_popular_type in ['60', '61']:
            referencia_factura = 8 * ' '
            if line['ml_inv_ref'][0]['reference']:
                referencia_factura = line['ml_inv_ref'][0]['reference']\
                    .replace('-', '')
                if len(referencia_factura) < 8:
                    relleno = 8 - len(referencia_factura)
                    referencia_factura += relleno * ' '
                elif len(referencia_factura) > 8:
                    referencia_factura = referencia_factura[:8]
            text += referencia_factura
        # 46 - 59 Numero de factura
        num_factura = 14 * ' '
        if line['ml_inv_ref'][0]['reference']:
            num_factura = line['ml_inv_ref'][0]['number']\
                .replace('-', '')
            if len(num_factura) < 14:
                relleno = 14 - len(num_factura)
                num_factura += relleno * ' '
            if len(num_factura) > 14:
                num_factura = num_factura[-14:]
        text += num_factura
        # 60 - 71 Importe
        text += self.converter.convert(abs(line['amount']), 12)
        if line['amount'] >= 0:
            text += ' '
        else:
            text += '-'
        text = text.ljust(100) + '\r\n'

        return text

    def _pop_totales(self, line, num_records):
        text = ''
        # 1 y 2
        text += '18'
        # 3 -4 Codigo operacion
        if self.order.mode.conf_popular_type == '70':
            text += '70'
        elif self.order.mode.conf_popular_type == '60':
            text += '60'
        elif self.order.mode.conf_popular_type == '61':
            text += '61'
        # 5 - 14 Codigo ordenante
        text += '0'
        vat = self.order.mode.bank_id.partner_id.vat[2:]
        text += self.converter.convert(vat, 9)
        # 15 - 29 Libre
        text += 15 * ' '
        # 30 - 41 Suma de importes
        text += self.converter.convert(abs(self.order.total), 12)
        # 42 - 49 Num de registros de dato 010
        num = str(num_records)
        text += num.zfill(8)

        # 50 - 59 Num total de registros
        total_reg = 4 + (num_records * 5) + 1
        total_reg = str(total_reg)
        text += total_reg.zfill(10)

        # 60 - 73 Libre
        text += 13 * ' '
        text = text.ljust(100) + '\r\n'

        return text
Exemplo n.º 4
0
class TestPaymentKutxa68(common.TransactionCase):
    def create_and_validate_invoice(self):
        self.tax_21 = self.env['account.tax'].create({
            'name': '%21%',
            'type': 'percent',
            'amount': 0.21,
            'type_tax_use': 'all',
            'applicable_type': 'true',
            'sequence': 1
        })
        self.pricelist_default_purchase = self.env['product.pricelist'].create(
            {
                'name': 'Default purchase',
                'type': 'purchase'
            })
        version_default_purchase = self.env[
            'product.pricelist.version'].create({
                'pricelist_id':
                self.pricelist_default_purchase.id,
                'name':
                'Default purchase'
            })
        self.env['product.pricelist.item'].create({
            'price_version_id':
            version_default_purchase.id,
            'name':
            'Default purchase',
            'sequence':
            10,
            'base':
            self.ref('product.list_price')
        })
        self.supplier_01 = self.env['res.partner'].create({
            'name':
            'Supplier 01',
            'is_company':
            True,
            'supplier':
            True,
            'property_product_pricelist_purchase':
            (self.pricelist_default_purchase.id),
            'email':
            '*****@*****.**',
            'street':
            'Plaza General, 2',
            'zip':
            '18500',
            'vat':
            'ESA00000000',
            'city':
            'Granada',
            'state_id':
            self.ref('l10n_es_toponyms.ES19'),
            'country_id':
            self.ref('base.es'),
            'phone':
            '666888999'
        })
        self.account = self.env['account.account'].create({
            'name':
            'Account for test module',
            'type':
            'payable',
            'user_type':
            self.ref('account.data_account_type_payable'),
            'code':
            '40000',
            'currency_mode':
            'current',
            'reconcile':
            True,
            'company_id':
            self.ref('base.main_company')
        })
        self.pt_01 = self.env['product.template'].create({
            'name':
            'Product 01',
            'type':
            'consu',
            'taxes_id': [(6, 0, [self.tax_21.id])]
        })
        self.pp_01 = self.env['product.product'].create({
            'product_tmpl_id':
            self.pt_01.id,
            'list_price':
            self.ref('product.list0')
        })
        self.account_journal = self.env['account.journal'].create({
            'code':
            'JJJI',
            'name':
            'bank journal',
            'type':
            'sale',
            'sequence_id':
            self.ref('account.sequence_refund_purchase_journal')
        })
        self.partner_bank = self.create_res_partner_bank()
        self.inv_suppl_01 = self.env['account.invoice'].create({
            'account_id':
            self.account.id,
            'type':
            'in_invoice',
            'journal_id':
            self.account_journal.id,
            'partner_id':
            self.supplier_01.id,
            'partner_bank_id':
            self.partner_bank.id,
            'date_invoice':
            fields.Date.today()
        })
        self.invoice_line_01 = self.env['account.invoice.line'].create({
            'invoice_id':
            self.inv_suppl_01.id,
            'invoice_line_tax_id': [(6, 0, [self.tax_21.id])],
            'name':
            self.pp_01.name_template,
            'price_unit':
            self.pp_01.list_price,
            'product_id':
            self.pp_01.id,
            'quantity':
            1
        })
        self.inv_suppl_01.button_reset_taxes()
        self.inv_suppl_01.signal_workflow('invoice_open')
        self.assertEqual(self.inv_suppl_01.state, 'open')

    def create_res_partner_bank(self):
        return self.env['res.partner.bank'].create({
            'state':
            'iban',
            'partner_id':
            self.supplier_01.id,
            'bank_name':
            'MyBank',
            'acc_country_id':
            self.ref('base.es'),
            'acc_number':
            'ES43 3035 0114 1811 4001 6797'
        })

    def create_bank_payment_mode(self):
        company = self.ref('base.main_company')
        self.bank_payment_mode = self.env['res.partner.bank'].create({
            'partner_id':
            company,
            'bank_name':
            'MyBank Kutxa',
            'state':
            'iban',
            'acc_number':
            'ES94 2080 5801 1012 3456 7891'
        })

    def create_payment_transfer_mode(self):
        self.transfer_payment_mode = self.env['payment.mode'].create({
            'name':
            'kutxa_payment_transfer',
            'bank_id':
            self.bank_payment_mode.id,
            'journal':
            self.account_journal.id,
            'type':
            self.env.ref('payment_order_kutxa_68.export_payment').id,
            'contract_number':
            'CT235679',
            'payment_type_68':
            '56'
        })

    def create_payment_order(self, payment_mode):
        self.payment_order = self.env['payment.order'].create({
            'mode':
            payment_mode.id,
            'reference':
            2019034
        })

    def create_payment_line(self, payment_order_id):
        move_line = self.env['account.move.line'].search(
            [('invoice', '=', self.inv_suppl_01.id), ('name', '=', '/')],
            limit=1)
        self.payment_line = self.env['payment.line'].create({
            'order_id':
            payment_order_id,
            'move_line_id':
            move_line.id,
            'amount_currency':
            156,
            'partner_id':
            self.supplier_01.id,
            'communication':
            'reference21'
        })
        self.payment_line.bank_id = self.partner_bank

    def configure_payment_order(self, payment_order):
        self.payment_order.signal_workflow('open')
        self.assertEqual(self.payment_order.state, 'open')
        self.payment_order.signal_workflow('done')
        self.assertEqual(self.payment_order.state, 'done')

    def compute_ref(self, ref, len):
        return ref.replace('/', '').zfill(len)[:len]

    def get_ref(self):
        ref = self.payment_line['ml_inv_ref'][0].number
        ref = ''.join([x for x in ref if x.isdigit()])
        ref = self.compute_ref(ref, 7)
        dc = '9000' + ref
        dc = int(dc) % 7
        ref += self.converter.convert(str(dc), 1)
        return ref

    def pop_beneficiary_test(self, payment_order, line, i):
        suppl = self.supplier_01
        self.assertEqual('06', line[0:2])
        self.assertEqual('59', line[2:4])
        payment_mode = payment_order.mode
        self.assertEqual(payment_mode.bank_id.partner_id.vat[2:], line[4:13])
        self.assertEqual(payment_mode.csb_suffix, line[13:16])
        self.assertEqual(suppl.vat, line[17:28])
        self.assertEqual('0' + (str(i + 10)), line[28:31])
        if (i + 1) == 1:
            self.assertEqual(suppl.name, line[31:(31 + len(suppl.name))])
            self.assertEqual(29 * ' ', line[71:100])
        if (i + 1) == 2:
            self.assertEqual(suppl.street, line[31:(31 + len(suppl.street))])
            self.assertEqual(24 * ' ', line[76:100])
        if (i + 1) == 3:
            self.assertEqual(suppl.zip, line[31:(31 + len(suppl.zip))])
            self.assertEqual(suppl.city, line[36:(36 + len(suppl.city))])
            self.assertEqual(24 * ' ', line[76:100])
        if (i + 1) == 4:
            self.assertEqual(suppl.zip, line[31:(31 + len(suppl.zip))])
            self.assertEqual(suppl.state_id.name,
                             line[40:(40 + len(suppl.state_id.name))])
            self.assertEqual(suppl.country_id.name,
                             line[70:(70 + len(suppl.country_id.name))])
            self.assertEqual(10 * ' ', line[90:100])
        if (i + 1) == 5:
            self.assertEqual(self.get_ref(), line[31:39])
            today = datetime.today().strftime('%d%m%Y')
            self.assertEqual(today, line[39:47])
            imp = self.converter.convert(abs(self.payment_order.total), 12)
            self.assertEqual(imp, line[47:59])
            self.assertEqual('0', line[59:60])
            self.assertEqual(40 * ' ', line[60:100])
        if (i + 1) == 6:
            self.assertEqual(self.get_ref(), line[31:39])
            ref_order = self.compute_ref(
                payment_order.line_ids[0].ml_inv_ref.number, 12)
            self.assertEqual(ref_order, line[39:51])
            dat_order = datetime.strptime(
                payment_order.line_ids[0].ml_date_created, '%Y-%m-%d')
            dat_order = self.converter.convert(dat_order.strftime('%d%m%Y'), 8)
            self.assertEqual(dat_order, line[51:59])
            amount = self.converter.convert(abs(self.payment_order.total), 12)
            self.assertEqual(amount, line[59:71])
            if 'in' in self.inv_suppl_01.type:
                self.assertEqual('H', line[71:72])
            else:
                self.assertEqual('D', line[71:72])
            self.assertEqual(
                self.compute_ref(payment_order.line_ids[0].ml_inv_ref.number,
                                 8), line[72:80])

    def generate_and_test_file(self, payment_order):
        self.converter = PaymentConverterSpain()
        wiz_export = self.env['banking.export.csb.wizard'].with_context({
            'active_ids': [payment_order.id],
            'active_model':
            'payment.order',
            'active_id':
            payment_order.id
        }).create({})
        wiz_export.create_csb()
        self.assertTrue(wiz_export.file)
        data = base64.decodestring(wiz_export.file)
        file_obj = NamedTemporaryFile('w+', suffix='.text', delete=False)
        file_obj.write(base64.decodestring(wiz_export.file))
        path = file_obj.name
        file_obj.close()
        with open(path, "rb") as fp:
            doc = csv.reader(fp,
                             delimiter=';',
                             quotechar='"',
                             quoting=csv.QUOTE_ALL)
            data = [ln for ln in doc]
        today = datetime.today().strftime('%d%m%y')
        line1 = data[0][0]
        self.assertEqual('03', line1[0:2])
        self.assertEqual('59', line1[2:4])
        payment_mode = payment_order.mode
        bank_id = payment_mode.bank_id
        self.assertEqual(bank_id.partner_id.vat[2:], line1[4:13])
        self.assertEqual(payment_mode.csb_suffix, line1[13:16])
        self.assertEqual(12 * ' ', line1[16:28])
        self.assertEqual('001', line1[28:31])
        self.assertEqual(today, line1[31:37])
        self.assertEqual(9 * ' ', line1[37:46])
        self.assertEqual(bank_id.acc_number.replace(' ', ''), line1[46:70])
        self.assertEqual(30 * ' ', line1[70:100])
        for i in range(6):
            line = data[i + 1][0]
            self.pop_beneficiary_test(payment_order, line, i)
        line8 = data[7][0]
        self.assertEqual('08', line8[0:2])
        self.assertEqual('59', line8[2:4])
        self.assertEqual(bank_id.partner_id.vat[2:], line8[4:13])
        self.assertEqual(payment_mode.csb_suffix, line8[13:16])
        amount = self.converter.convert(abs(self.payment_order.total), 12)
        self.assertEqual(amount, line8[31:43])
        self.assertEqual(amount, line8[31:43])
        self.assertEqual('0000000008', line8[43:53])
        self.assertEqual(47 * ' ', line8[53:100])

    def test_transfer_kutxa(self):
        self.create_and_validate_invoice()
        self.create_bank_payment_mode()
        self.create_payment_transfer_mode()
        self.create_payment_order(self.transfer_payment_mode)
        self.create_payment_line(self.payment_order.id)
        self.assertEqual(len(self.payment_order.line_ids), 1)
        self.configure_payment_order(self.payment_order)
        self.generate_and_test_file(self.payment_order)
Exemplo n.º 5
0
class Confirminet(object):
    def __init__(self, env):
        self.env = env
        self.converter = PaymentConverterSpain()

    def _start_registro_06(self, line):
        text = '06'
        # 3-4 - Forma de pago
        text += self.order.mode.confirminet_type
        # 5-14 - Código de ordenante
        vat = self.order.mode.bank_id.partner_id.vat[2:]
        text += self.converter.convert(vat, 10)
        # 15-26 - Referencia del proveedor
        if not line['partner_id'].vat:
            raise Log(
                _("Error: Supplier %s must have a VAT number.") %
                line['partner_id'].name)
        partner_vat = line['partner_id'].vat[2:]
        text += self.converter.convert(partner_vat[-12:], 12)
        return text

    def _registro_03(self):
        today = datetime.today().strftime('%y%m%d')
        text = '0360'
        # 5-14 - NIF
        vat = self.order.mode.bank_id.partner_id.vat[2:]
        text += self.converter.convert(vat, 10)
        # 15-26 - Referencia interna BK - En blanco
        text += 12 * ' '
        # 27-29 - Número de dato
        text += '001'
        # 30-35 - Fecha de envío
        text += today
        # 36-41 - Fecha de emisión
        if self.order.date_scheduled:
            planned = fields.Date.from_string(self.order.date_scheduled)
            text += planned.strftime('%y%m%d')
        else:
            text += today
        # 42-65 - Contrato G.I.P.
        gip = self.converter.digits_only(self.order.mode.bank_id.acc_number)
        if gip[:4] != '0128':
            raise Log(
                _("Error: Contract number (Account number) is not valid. It "
                  "should start with '0128'."))
        text += gip[:4]
        text += gip[4:8]
        text += gip[10:20]
        text += 4 * " "
        text += gip[8:10]
        # 66-72 - Libre
        text += 7 * ' '
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_010(self, line):
        text = self._start_registro_06(line)
        text += '010'
        # 30-41 - Importe de la factura
        text += self.converter.convert(abs(line['amount']), 12)
        # 42-69 - Libre
        text += 19 * " "
        # 61-61 Signo del importe de la factura
        text += " " if line['amount'] >= 0 else "-"
        # 62-72 - Libre
        text += 11 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_011(self, line):
        text = self._start_registro_06(line)
        text += '011'
        # 30-65 - Nombre del proveedor
        text += self.converter.convert(line['partner_id'].name, 36)
        # 66-72 - Libre
        text += 7 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_012(self, line):
        address = line['partner_id']
        text = self._start_registro_06(line)
        text += '012'
        # 30-65 - Dirección del proveedor
        if not address.street:
            raise Log(
                _("Error: Supplier %s has no street in its address.") %
                line['partner_id'].name)
        text += self.converter.convert(address.street, 36)
        # 66-72 - Libre
        text += 7 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_014(self, line):
        address = line['partner_id']
        if not address.zip:
            if not address.country_id or address.country_id.code == 'ES':
                raise Log(
                    _("Error: Supplier %s has no ZIP in its address.") %
                    line['partner_id'].name)
            else:
                # No exportar este registro para extranjeros sin dirección
                return ""
        text = self._start_registro_06(line)
        text += '014'
        # 30-34 - Código postal
        text += self.converter.convert(address.zip, 5)
        # 35-66 - Localidad del proveedor
        if not address.city:
            raise Log(
                _("Error: Supplier %s has no city in its address.") %
                line['partner_id'].name)
        text += self.converter.convert(address.city, 32)
        # 67-72 - Libre
        text += 6 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_170(self, line):
        if not line['partner_id'].email:
            return ""
        text = self._start_registro_06(line)
        text += '170'
        # 30-65 - Email de proveedor
        text += self.converter.convert(line['partner_id'].email, 36)
        # 66-72 - Libre
        text += 7 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_171(self, line):
        if len(line['partner_id'].email or '') <= 36:
            return ""
        text = self._start_registro_06(line)
        text += '171'
        # 30-65 - Email de proveedor (continuación)
        text += self.converter.convert(line['partner_id'].email[36:], 36)
        # 66-72 - Libre
        text += 7 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_172(self, line):
        if len(line['partner_id'].email or '') <= 72:
            return ""
        text = self._start_registro_06(line)
        text += '172'
        # 30-65 - Email de proveedor (continuación)
        text += self.converter.convert(line['partner_id'].email[72:], 36)
        # 66-72 - Libre
        text += 7 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_173(self, line):
        address = line['partner_id']
        text = self._start_registro_06(line)
        text += '173'
        # 30-63 - Cuenta del proveedor
        if self.order.mode.confirminet_type == '57':
            # Cheque - No hace falta cuenta
            text += 34 * " "
        else:
            if address.country_id.code == 'ES':
                ccc = self.converter.digits_only(line['bank_id'].acc_number)
                text += self.converter.convert('ES' + ccc, 34)
            else:
                if line['bank_id'].state != 'iban':
                    raise Log(
                        _("Bank account of supplier %s, which is of outside "
                          "of Spain, should be IBAN.") %
                        line['partner_id'].name)
                iban = self.converter.digits_only(line['bank_id'].acc_number)
                text += self.converter.convert(iban, 34)
        # 64-64 - Libre
        text += " "
        # 65-66 - Código SWIFT del país del proveedor
        if address.country_id.code == 'ES':
            text += "ES"
        else:
            text += line['bank_id'][:2]
        # 67-72 - Libre
        text += 6 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_174(self, line):
        address = line['partner_id']
        text = self._start_registro_06(line)
        text += '174'
        # 30-40 - Dirección Swift
        if self.order.mode.confirminet_type == '57':
            text += 11 * " "
        else:
            if (address.country_id.code != 'ES'
                    and not line['bank_id'].bank_bic):
                raise Log(
                    _("Partner %s doesn't have a SWIFT/BIC code in its bank "
                      "account.") % line['partner_id'].name)
            text += self.converter.convert(line['bank_id'].bank_bic, 11)
        # 41-56 Claves adicionales (ABA/BLZ/FW/SC...)
        text += 16 * " "
        # 57-72 - Libre
        text += 16 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_175(self, line):
        address = line['partner_id']
        text = self._start_registro_06(line)
        text += '175'
        # 30-30 - Idioma
        text += "I" if address.country_id.code != 'ES' else "E"
        # 31-72 - Libre
        text += 42 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_182(self, line):
        text = self._start_registro_06(line)
        text += '182'
        # 30-41 - Referencia del Proveedor
        partner_vat = line['partner_id'].vat[2:]
        text += self.converter.convert(partner_vat[-12:], 12)
        # 42-72 - Libre
        text += 31 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_018(self, line):
        text = self._start_registro_06(line)
        text += '018'
        # 30-35 - Fecha de vencimiento de la factura
        if line['date']:
            date = fields.Date.from_string(line['date'])
        elif self.order.date_scheduled:
            date = fields.Date.from_string(self.order.date_scheduled)
        else:
            date = datetime.today()
        text += date.strftime('%y%m%d')
        # 36-51 - Número de la factura
        invoice_number = (line['ml_inv_ref'] and
                          (line['ml_inv_ref'][0].supplier_invoice_number
                           or line['ml_inv_ref'][0].reference)
                          or line['communication'])
        if not invoice_number:
            raise Log(
                _("Error: Line with ID %s has no reference nor invoice "
                  "number.") % line['id'])
        text += self.converter.convert(invoice_number, 16)
        # 56-65 - Referencia interna del cliente (Libre)
        text += self.converter.convert(line['communication'], 14)
        # 66-72 - Libre
        text += 7 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_019(self, line):
        text = self._start_registro_06(line)
        text += '019'
        # 30-41 - Libre. Se deja como referencia interna del Cliente
        text += 12 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_08(self, total_amount, num_lines, num_records):
        text = '0860'
        # 5-14 - NIF
        vat = self.order.mode.bank_id.partner_id.vat[2:]
        text += self.converter.convert(vat, 10)
        # 15-29 - Libre
        text += 15 * " "
        # 30-41 - Suma de importes
        text += self.converter.convert(total_amount, 12)
        # 42-49 - Número de registros de dato 010
        text += self.converter.convert(num_lines, 8)
        # 50-59 - Número total de registros
        text += self.converter.convert(num_records, 10)
        # 60-72 - Libre
        text += 13 * " "
        return text

    def create_file(self, order, lines):
        self.order = order
        self.num_records = 0
        txt_file = self._registro_03()
        total_amount = 0
        for line in lines:
            txt_file += self._registro_06_010(line)
            txt_file += self._registro_06_011(line)
            txt_file += self._registro_06_012(line)
            txt_file += self._registro_06_014(line)
            txt_file += self._registro_06_170(line)
            txt_file += self._registro_06_171(line)
            txt_file += self._registro_06_172(line)
            txt_file += self._registro_06_173(line)
            txt_file += self._registro_06_174(line)
            txt_file += self._registro_06_175(line)
            txt_file += self._registro_06_182(line)
            txt_file += self._registro_06_018(line)
            txt_file += self._registro_06_019(line)
            total_amount += abs(line['amount'])
        txt_file += self._registro_08(total_amount, len(lines),
                                      self.num_records + 1)
        return txt_file
Exemplo n.º 6
0
class ConfirmingSabadell(object):
    def __init__(self, env):
        self.env = env
        self.converter = PaymentConverterSpain()

    def create_file(self, order, lines):
        self.order = order
        total_amount = 0
        if self.order.mode.type.code == 'conf_sabadell':
            txt_file = self._sab_registro_01()
            for line in lines:
                txt_file += self._sab_registro_02(line)
                txt_file += self._sab_registro_03(line)
                if order.mode.conf_sabadell_type == '58':
                    txt_file += self._sab_registro_04(line)
                total_amount += abs(line['amount'])
            txt_file += self._sab_registro_05(total_amount, len(lines))

        return txt_file

    def _sab_registro_01(self):
        if self.order.date_prefered == 'due':
            fecha_planificada = datetime.date.today().strftime('%Y-%m-%d')
            fecha_planificada = fecha_planificada.replace('-', '')
        elif self.order.date_prefered == 'now':
            fecha_planificada = datetime.date.today().strftime('%Y%m%d')
        else:
            fecha_planificada = self.order.date_scheduled
            if not fecha_planificada:
                raise Log(
                    _("Error: Fecha planificada no establecida en \
                        la Orden de pago."))
            else:
                fecha_planificada = fecha_planificada.replace('-', '')

        # Caracteres 1 y 2-3
        text = '1  '

        # 4 - 43 Nombre ordenante
        ordenante = self.order.mode.bank_id.partner_id.name
        if not ordenante:
            raise Log(
                _("Error: Propietario de la cuenta no \
                    establecido para la cuenta\
                    %s.") % self.order.mode.bank_id.acc_number)
        if len(ordenante) <= 40:
            relleno = 40 - len(ordenante)
            ordenante += relleno * ' '
        elif len(ordenante) > 40:
            ordenante = ordenante[:40]
        text += ordenante

        # 44 - 51 Fecha de proceso
        text += fecha_planificada

        # 52 - 60 NIF Ordenante
        vat = self.order.mode.bank_id.partner_id.vat[2:]
        text += self.converter.convert(vat, 9)

        # 61 - 62 Tipo de Lote
        text += '65'

        # 63 - 64 Forma de envío
        text += 'B'

        # 64 - 83 Cuenta de cargo
        tipo_cuenta = self.order.mode.bank_id.state
        cuenta = self.order.mode.bank_id.acc_number
        cuenta = cuenta.replace(' ', '')
        if tipo_cuenta == 'bank':
            text += cuenta
        else:
            cuenta = cuenta[4:]
            text += cuenta

        # 84 - 95 Contrato BSConfirming
        text += self.order.mode.contrato_bsconfirming

        # 96 - 99 Codigo fichero
        text += 'KF01'

        # 100 - 102 Codigo divisa
        text += 'EUR'
        text += '\r\n'

        return text

    def _sab_registro_02(self, line):
        # 1 Codigo registro
        text = '2'
        # 2 - 16 Codigo Proveedor
        codigo_pro = line['partner_id']['ref']
        if codigo_pro:
            text += codigo_pro
        else:
            text += 15 * ' '
        # 17 - 18 Tipo de documento
        tipo_doc = line['partner_id']['vat_type']
        if tipo_doc == '1':
            tipo_doc = '02'
        elif tipo_doc == '2':
            tipo_doc = '12'
        elif tipo_doc == '3':
            tipo_doc = '04'
        elif tipo_doc == '4':
            tipo_doc = '06'
        elif tipo_doc == '5':
            tipo_doc = '03'
        elif tipo_doc == '6':
            tipo_doc = '99'
        text += tipo_doc
        # 19 - 30 Documento identificativo
        nif = line['partner_id']['vat']
        if not nif:
            raise Log(
                _("Error: El Proveedor %s no tiene \
                    establecido el NIF.") % line['partner_id']['name'])
        if len(nif) < 12:
            relleno = 12 - len(nif)
            nif += relleno * ' '
        text += nif
        # 31 Forma de pago
        forma_pago = self.order.mode.conf_sabadell_type
        if forma_pago == '56':
            forma_pago = 'T'
        elif forma_pago == '57':
            forma_pago = 'C'
        elif forma_pago == '58':
            forma_pago = 'E'
        text += forma_pago
        # 32 - 51 Cuenta
        if forma_pago == 'T':
            tipo_cuenta = line['bank_id']['state']
            if tipo_cuenta == 'bank':
                cuenta = line['bank_id']['acc_number']
                cuenta = cuenta.replace(' ', '')
                text += cuenta
            else:
                text += 20 * ' '
        else:
            text += 20 * ' '
        # 52 - 66 Num Factura
        num_factura = 15 * ' '
        if line['ml_inv_ref'][0]['reference']:
            num_factura = line['ml_inv_ref'][0]['reference']
            if num_factura:
                if len(num_factura) < 15:
                    relleno = 15 - len(num_factura)
                    num_factura += relleno * ' '
        text += num_factura
        # 67 - 81 Importe de la factura
        text += self.converter.convert(abs(line['amount']), 14)
        if line['amount'] >= 0:
            text += '+'
        else:
            text += '-'

        # 82 - 89 Fecha factura
        fecha_factura = 8 * ' '
        if line['ml_inv_ref'][0]['reference']:
            fecha_factura = line['ml_inv_ref'][0]['date_invoice']\
                .replace('-', '')
        text += fecha_factura
        # 90 - 97 Fecha vencimiento
        # fecha_vencimiento = 8 * ' '
        fecha_vencimiento = line['date'].replace('-', '')
        text += fecha_vencimiento
        # 98 - 127 Referencia factura ordenante
        referencia_factura = 30 * ' '
        if line['ml_inv_ref'][0]['reference']:
            referencia_factura = line['ml_inv_ref'][0]['number']\
                .replace('-', '')
            if len(referencia_factura) < 30:
                relleno = 30 - len(referencia_factura)
                referencia_factura += relleno * ' '
        text += referencia_factura
        # 128 - Barrado cheque
        if forma_pago == 'C':
            text += 'S'
        else:
            text += ' '
        # 129 - 136 fecha emision pagaré
        text += 8 * ' '
        # 137 -144 fecha vencimiento pagaré
        text += 8 * ' '
        # 145 tipo pagare
        text += ' '
        # 146 - 175 IBAN
        if forma_pago == 'T':
            tipo_cuenta = line['bank_id']['state']
            if tipo_cuenta == 'iban':
                cuenta = line['bank_id']['acc_number']
                cuenta = cuenta.replace(' ', '')
                if len(cuenta) < 30:
                    relleno = 30 - len(cuenta)
                    cuenta += relleno * ' '
            text += cuenta
        else:
            text += 30 * ' '
        # 176 Reservado
        text += 125 * ' '
        text += '\r\n'

        return text

    def _sab_registro_03(self, line):
        # 1 Codigo registro
        text = '3'
        # 2 - 40 Nombre Proveedor
        nombre_pro = line['partner_id']['name']
        if nombre_pro:
            if len(nombre_pro) < 40:
                relleno = 40 - len(nombre_pro)
                nombre_pro += relleno * ' '
            elif len(nombre_pro) > 40:
                nombre_pro = nombre_pro[:40]
            text += nombre_pro
        else:
            text += 40 * ' '
        # 42 - 43 Idioma proveedor
        idioma_pro = line['partner_id']['lang']
        if idioma_pro:
            if idioma_pro == 'es_ES':
                text += '08'
            else:
                text += '13'
        else:
            text += 2 * ' '
        # 44 - 110 Domicilio
        domicilio_pro = line['partner_id']['street']
        if not domicilio_pro:
            raise Log(
                _("Error: El Proveedor %s no tiene establecido el \
                    Domicilio.") % line['partner_id']['name'])
        else:
            if len(domicilio_pro) < 67:
                relleno = 67 - len(domicilio_pro)
                domicilio_pro += relleno * ' '
            text += domicilio_pro

        # 111 - 150 Ciudad
        ciudad_pro = line['partner_id']['city']
        if not ciudad_pro:
            raise Log(
                _("Error: El Proveedor %s no tiene establecida la \
                    Ciudad.") % line['partner_id']['name'])
        else:
            if len(ciudad_pro) < 40:
                relleno = 40 - len(ciudad_pro)
                ciudad_pro += relleno * ' '
            text += ciudad_pro
        # 151- 155 CP
        cp_pro = line['partner_id']['zip']
        if not cp_pro:
            raise Log(
                _("Error: El Proveedor %s no tiene establecido el \
                    C.P.") % line['partner_id']['name'])
        else:
            if len(cp_pro) < 5:
                relleno = 5 - len(cp_pro)
                cp_pro += relleno * ' '
            text += cp_pro
        # 156 - 161 Reservado no se utiliza
        text += 6 * ' '
        # 162 - 176 Telefono
        telefono_pro = line['partner_id']['phone']
        if telefono_pro:
            telefono_pro = telefono_pro.replace(' ', '')
            telefono_pro = telefono_pro.replace('+', '')
            if len(telefono_pro) < 15:
                relleno = 15 - len(telefono_pro)
                telefono_pro += relleno * ' '
            text += telefono_pro
        else:
            text += 15 * ' '
        # 177 - 191 fax
        fax_pro = line['partner_id']['fax']
        if fax_pro:
            fax_pro = fax_pro.replace(' ', '')
            fax_pro = fax_pro.replace('+', '')
            if len(fax_pro) < 15:
                relleno = 15 - len(fax_pro)
                fax_pro += relleno * ' '
            text += fax_pro
        else:
            text += 15 * ' '
        # 192 - 251 Correo
        email_pro = line['partner_id']['email']
        if email_pro:
            if re.match(
                    r'^[(a-z0-9\_\-\.)]+@[(a-z0-9\_\-\.)]+\.[(a-z)]{2,15}\
                    $', email_pro.lower()):
                if len(email_pro) < 60:
                    relleno = 60 - len(email_pro)
                    email_pro += relleno * ' '
                text += email_pro
            else:
                text += 60 * ' '
        else:
            text += 60 * ' '
        # 252 Tipo envio informacion
        # Por correo 1, por fax 2, por email 3
        text += self.order.mode.tipo_envio_info
        # 253 - 254 Codigo pais
        pais_pro = line['partner_id']['country_id']['code']
        if not pais_pro:
            raise Log(
                _("Error: El Proveedor %s no tiene establecido el \
                    País.") % line['partner_id']['name'])
        else:
            text += pais_pro

        # 255 -256 Codigo pais residencia no se usa
        text += '  '
        # 257 --- Reservado
        text += 44 * ' '
        text += '\r\n'

        return text

    def _sab_registro_04(self, line):
        # 1 Codigo registro
        text = '4'
        # 2 -16 Codigo proveedor
        codigo_pro = line['partner_id']['ref']
        if codigo_pro:
            text += codigo_pro
        else:
            text += 15 * ' '
        # 17 - 18 Codigo Pais
        pais_pro = line['partner_id']['country_id']['code']
        if not pais_pro:
            raise Log(
                _("Error: El Proveedor %s no tiene establecido el \
                    País.") % line['partner_id']['name'])
        else:
            text += pais_pro
        # 19 - 29 SWIFT
        swift_pro = line['bank_id']['bank_bic']
        if not swift_pro:
            raise Log(
                _("Error: La cuenta bancaria del Proveedor %s no tiene \
                    establecido el SWIFT.") % line['partner_id']['name'])
        else:
            if len(swift_pro) < 11:
                relleno = 11 - len(swift_pro)
                swift_pro += relleno * ' '
            text += swift_pro
        # 30 - 63 IBAN
        if self.order.mode.conf_sabadell_type == '58':
            tipo_cuenta = line['bank_id']['state']
            if tipo_cuenta == 'iban':
                cuenta = line['bank_id']['acc_number']
                cuenta = cuenta.replace(' ', '')
                if len(cuenta) < 34:
                    relleno = 34 - len(cuenta)
                    cuenta += relleno * ' '
            else:
                raise Log(
                    _("Error: La Cuenta del Proveedor: %s tiene que \
                        estar en formato IBAN.") % line['partner_id']['name'])
        text += cuenta

        # 64 - 69 Codigo estadistico
        text += self.order.mode.codigo_estadistico
        # 70 Divisa
        text += 'EUR'
        text += '\r\n'

        return text

    def _sab_registro_05(self, total_amount, num_lines):
        text = '5'
        # 2 - 10 NIF
        vat = self.order.mode.bank_id.partner_id.vat[2:]
        text += self.converter.convert(vat, 9)
        # 11 - 17 Total ordenes
        text += self.converter.convert(num_lines, 7)
        # 18 - 32  - Total importes
        text += self.converter.convert(total_amount, 14)
        if total_amount >= 0:
            text += '+'
        else:
            text += '-'
        # 60-72 - Libre
        text += 268 * " "
        text += '\r\n'

        return text
Exemplo n.º 7
0
class ConfirmingKutxa(object):
    def __init__(self, env):
        self.env = env
        self.converter = PaymentConverterSpain()

    def create_file(self, order, lines):
        self.order = order
        self.num_records = 0
        self.total = 0
        if self.order.mode.type.code == 'conf_kutxa':
            txt_file = self._pop_header()
            for line in lines:
                txt_file += self._pop_beneficiary(line)
                txt_file += self._pop_detail(line)
                self.num_records += 1
                if line['ml_inv_ref'][0].type == 'in_invoice':
                    self.total += line['amount']
                else:
                    self.total -= line['amount']
            txt_file += self._pop_totals(line, self.num_records)
        return txt_file
        # return txt_file.encode("utf-8")

    def _pop_header(self):
        if self.order.date_prefered == 'due':
            planned_date = self.order.line_ids \
                and self.order.line_ids[0].ml_maturity_date \
                or datetime.date.today().strftime('%Y-%d-%m')
            planned_date = planned_date.replace('-', '')
            day = planned_date[6:]
            month = planned_date[4:6]
            year = planned_date[0:4]
            planned_date = year + month + day
        elif self.order.date_prefered == 'now':
            planned_date = datetime.date.today().strftime('%Y%m%d')
        else:
            planned_date = self.order.date_scheduled
            if not planned_date:
                raise Log(
                    ("Error: Planned date not established in pay order."))
            else:
                planned_date = planned_date.replace('-', '')
                day = planned_date[6:]
                month = planned_date[4:6]
                year = planned_date[:4]
                planned_date = day + month + year
        all_text = ''
        for i in range(2):
            text = ''
            text += str(i + 1)
            if (i + 1) == 1:
                payer = self.order.mode.bank_id.partner_id.name
                if not payer:
                    raise Log(("Error: Owner of account not established \
                        for the account %s.\
                        ") % self.order.mode.bank_id.acc_number)
                if len(payer) <= 50:
                    fill = 50 - len(payer)
                    payer += fill * ' '
                elif len(payer) > 50:
                    payer = payer[:50]
                text += payer
                vat = self.order.mode.bank_id.partner_id.vat.replace('ES', '')
                if len(vat) <= 15:
                    fill = 15 - len(vat)
                    vat += fill * ' '
                elif len(vat) > 15:
                    vat = vat[:15]
                text += vat
                text += planned_date
                text += datetime.date.today().strftime('%Y%m%d')
                contract_number = str(self.order.mode.contract_number)
                if len(contract_number) <= 20:
                    contract_number = contract_number.rjust(20)
                elif len(contract_number) > 20:
                    contract_number = contract_number[-20:]
                text += contract_number
                account = self.order.mode.bank_id.acc_number
                account = account.replace(' ', '')
                if len(account) <= 34:
                    fill = 34 - len(account)
                    account += fill * ' '
                text += account
                text += u'EUR'
                text += '1'
                ref = self.order.mode.type.code
                ref += self.order.reference
                ref = ref.replace('/', '').replace('_', '')
                if len(ref) <= 30:
                    fill = 30 - len(ref)
                    ref += fill * ' '
                elif len(ref) > 30:
                    ref = ref[-30:]
                text += ref
                text += u'FU'
            if (i + 1) == 2:
                street_payer = self.order.mode.bank_id.partner_id.street
                if not street_payer:
                    raise Log(("Error: Payer %s has not street established. \
                        ") % self.order.mode.bank_id.partner_id.name)
                else:
                    if len(street_payer) < 65:
                        fill = 65 - len(street_payer)
                        street_payer += fill * ' '
                    elif len(street_payer) > 65:
                        street_payer = street_payer[:65]
                    text += street_payer
                city_payer = self.order.mode.bank_id.partner_id.city
                if not city_payer:
                    raise Log(("Error: Payer %s has not city established. \
                        ") % self.order.mode.bank_id.partner_id.name)
                else:
                    if len(city_payer) < 40:
                        fill = 40 - len(city_payer)
                        city_payer += fill * ' '
                    elif len(city_payer) > 40:
                        city_payer = city_payer[:40]
                    text += city_payer
                postalzip = self.order.mode.bank_id.partner_id.zip
                if not postalzip:
                    raise Log(
                        ("Error: Payer %s has not postal zip established. \
                        ") % self.order.mode.bank_id.partner_id.name)
                else:
                    if len(postalzip) < 10:
                        fill = 10 - len(postalzip)
                        postalzip += fill * ' '
                    elif len(street_payer) > 10:
                        street_payer = street_payer[:10]
                    text += postalzip
            text = text.ljust(250) + '\r\n'
            all_text += text
        return all_text

    def _pop_beneficiary(self, line):
        all_text = ''
        for i in range(3):
            text = ''
            text += str(i + 3)
            if (i + 1) == 1:
                supplier_name = line['partner_id']['name']
                if not supplier_name:
                    raise Log(("Error: Supplier %s has not name established. \
                            ") % line['partner_id']['vat'])
                else:
                    if len(supplier_name) < 70:
                        fill = 70 - len(supplier_name)
                        supplier_name += fill * ' '
                    elif len(supplier_name) > 70:
                        supplier_name = supplier_name[:70]
                    text += supplier_name
                supplier_vat = line['partner_id']['vat']
                if not supplier_vat or len(supplier_vat) > 20:
                    raise Log(("Error: Supplier %s has wrong\
                            VAT.") % line['partner_id']['name'])
                else:
                    if len(supplier_vat) > 9:
                        supplier_vat = supplier_vat[2:]
                    fill = 20 - len(supplier_vat)
                    supplier_vat += fill * ' '
                    text += supplier_vat
                supplier_street = line['partner_id']['street']
                if not supplier_street:
                    raise Log(("Error: Supplier %s has not \
                            street established.\
                            ") % line['partner_id']['name'])
                else:
                    supplier_street = supplier_street.replace(u'º', '')
                    if len(supplier_street) < 65:
                        fill = 65 - len(supplier_street)
                        supplier_street += fill * ' '
                    elif len(supplier_street) > 65:
                        supplier_street = supplier_street[:65]
                    text += supplier_street
                supplier_city = line['partner_id']['city']
                if not supplier_city:
                    raise Log(("Error: Supplier %s has not \
                            city established.") % line['partner_id']['name'])
                else:
                    if len(supplier_city) < 40:
                        fill = 40 - len(supplier_city)
                        supplier_city += fill * ' '
                    elif len(supplier_city) > 40:
                        supplier_city = supplier_city[:40]
                    text += supplier_city
                supplier_zip = line['partner_id']['zip']
                if not supplier_zip:
                    raise Log(("Error: Supplier %s has not \
                            C.P established.") % line['partner_id']['name'])
                else:
                    if len(supplier_zip) < 10:
                        fill = 10 - len(supplier_zip)
                        supplier_zip += fill * ' '
                    elif len(supplier_zip) > 10:
                        supplier_zip = supplier_zip[:10]
                    text += supplier_zip
                text += u'ES'
            if (i + 1) == 2:
                supplier_mail = line['partner_id']['email']
                if not supplier_mail or len(supplier_mail) > 50:
                    raise Log(("Error: Supplier %s has wrong \
                            Email") % line['partner_id']['name'])
                else:
                    if len(supplier_mail) < 50:
                        fill = 50 - len(supplier_mail)
                        supplier_mail += fill * ' '
                    text += supplier_mail
                text += 50 * ' '
                supplier_phone = line['partner_id']['phone']
                if not supplier_phone or len(supplier_phone) > 15:
                    text += 15 * ' '
                else:
                    if len(supplier_phone) < 15:
                        fill = 15 - len(supplier_phone)
                        supplier_phone += fill * ' '
                    text += supplier_phone
                supplier_fax = line['partner_id']['fax']
                if not supplier_fax or len(supplier_fax) > 15:
                    text += 15 * ' '
                else:
                    if len(supplier_fax) < 15:
                        fill = 15 - len(supplier_fax)
                        supplier_fax += fill * ' '
                    text += supplier_fax
            if (i + 1) == 3:
                if self.order.mode.conf_kutxa_type == '56':
                    text += u'T'
                    supplier_account = line['bank_id']['acc_number']
                    if not supplier_account:
                        raise Log(
                            ("Error: Supplier %s has not account established. \
                                ") % line['partner_id']['name'])
                    supplier_account = supplier_account.replace(' ', '')
                    if len(supplier_account) < 34:
                        fill = 34 - len(supplier_account)
                        supplier_account += fill * ' '
                    text += supplier_account
                elif self.order.mode.conf_kutxa_type == '57':
                    text += u'C'
                    text += 34 * ' '
                text += 11 * ' '
                text += 34 * ' '
                text += u'ES'
            text = text.ljust(250) + '\r\n'
            all_text += text
        return all_text

    def _pop_detail(self, line):
        text = ''
        text += '6'
        invoice_number = line['ml_inv_ref'][0]['number']
        if not invoice_number:
            raise Log(("Error: Invoice %s has not \
                    valid invoice number.") % line['partner_id']['name'])
        invoice_number = invoice_number.replace('-', '')
        if len(invoice_number) < 20:
            fill = 20 - len(invoice_number)
            invoice_number += fill * ' '
        elif len(invoice_number) > 20:
            invoice_number = invoice_number[-20:]
        text += invoice_number
        if line['ml_inv_ref'][0].type == 'in_invoice':
            text += '+'
        else:
            text += '-'
        invoice_amount = self.converter.convert(abs(line['amount']), 15)
        text += invoice_amount
        invoice_date = line['ml_inv_ref'][0]['date_invoice'].replace('-', '')
        day = invoice_date[6:]
        month = invoice_date[4:6]
        year = invoice_date[:4]
        invoice_date = year + month + day
        text += invoice_date
        invoice_expiration = line['ml_inv_ref'][0]['date_due'].replace('-', '')
        day = invoice_expiration[6:]
        month = invoice_expiration[4:6]
        year = invoice_expiration[:4]
        invoice_expiration = year + month + day
        text += invoice_expiration
        text += 8 * ' '
        if line['ml_inv_ref'][0]['reference']:
            invoice_ref = line['ml_inv_ref'][0]['reference'].replace('/', '')
            if len(invoice_ref) < 16:
                fill = 16 - len(invoice_ref)
                invoice_ref += fill * ' '
            elif len(invoice_ref) > 16:
                invoice_ref = invoice_ref[:16]
            text += invoice_ref
        else:
            text += 16 * ' '
        text = text.ljust(250) + '\r\n'
        return text

    def _pop_totals(self, line, num_records):
        text = ''
        text += '7'
        num = str(num_records)
        text += num.zfill(12)
        text += self.converter.convert(abs(self.total), 15)
        text = text.ljust(250) + '\r\n'
        return text
Exemplo n.º 8
0
class PaymentCsb68(object):
    def __init__(self, env):
        self.env = env
        self.converter = PaymentConverterSpain()

    def _start_68(self):
        vat = self.order.mode.bank_id.partner_id.vat[2:]
        suffix = self.order.mode.csb_suffix
        return self.converter.convert(vat + suffix, 12)

    def calcule_totals(self, lines):
        total_amount = 0.0
        for line in lines:
            if line['ml_inv_ref'][0].type == 'in_invoice':
                total_amount += abs(line['amount'])
            else:
                total_amount -= abs(line['amount'])
        return self.converter.convert(abs(total_amount), 12)

    def _pop_header(self):
        text = '0359'
        text += self._start_68()
        text += 12 * ' '
        text += '001'
        text += datetime.today().strftime('%d%m%y')
        text += 9 * ' '
        cc = self.order.mode.bank_id.acc_number
        cc = cc.replace(' ', '')
        if len(cc) != 24:
            raise Log(
                _('Error:Bank account of %s has not set correctly \
                ') % self.order.mode.bank_id.partner_id.name)
        text += cc
        text = text.ljust(100) + '\r\n'
        return text

    def _header_beneficiary_68(self, line):
        text = '0659'
        text += self._start_68()
        text += line['partner_id'].vat.rjust(12)
        return text

    def _get_reference(self, ref, len):
        return ref.replace('/', '').zfill(len)[:len]

    def _pop_beneficiary_headers(self, line, total_payment):
        text = ''
        partner_obj = self.env['res.partner']
        address_ids = line['partner_id'].address_get(['default', 'invoice'])
        if address_ids.get('invoice'):
            address = partner_obj.browse(address_ids.get('invoice'))
        elif address_ids.get('default'):
            address = partner_obj.browse(address_ids.get('default'))
        else:
            raise Log(
                _('User error:\n\nPartner %s has no invoicing or \
                        default address.') % line['partner_id'].name)
        text1 = self._header_beneficiary_68(line)
        text1 += '010'
        text1 += self.converter.convert(line['partner_id'].name, 40)
        text1 = text1.ljust(100) + '\r\n'
        text += text1
        text2 = self._header_beneficiary_68(line)
        text2 += '011'
        txt_address = ''
        if address.street:
            txt_address += address.street
        if address.street2:
            txt_address += ' ' + address.street2
        text2 += self.converter.convert(txt_address, 45)
        text2 = text2.ljust(100) + '\r\n'
        text += text2
        text3 = self._header_beneficiary_68(line)
        text3 += '012'
        text3 += self.converter.convert(address.zip, 5)
        text3 += self.converter.convert(address.city, 40)
        text3 = text3.ljust(100) + '\r\n'
        text += text3
        text4 = self._header_beneficiary_68(line)
        text4 += '013'
        text4 += self.converter.convert(address.zip, 9)
        text4 += self.converter.convert(address.state_id.name or '', 30)
        text4 += self.converter.convert(address.country_id.name or '', 20)
        text4 = text4.ljust(100) + '\r\n'
        text += text4
        text5 = self._header_beneficiary_68(line)
        text5 += '014'
        ref = line['ml_inv_ref'][0].number
        ref = ''.join([x for x in ref if x.isdigit()])
        self.ref = self._get_reference(ref, 7)
        text5 += self.ref
        self.dc = '9000' + self.ref
        self.dc = int(self.dc) % 7
        self.dc = self.converter.convert(str(self.dc), 1)
        text5 += self.dc
        if line.get('ml_maturity_date'):
            date_pay = datetime.strptime(line['ml_maturity_date'], '%Y-%m-%d')
        elif line.get('date'):
            date_pay = datetime.strptime(line['date'], '%Y-%m-%d')
        else:
            date_pay = datetime.today()
        text5 += self.converter.convert(date_pay.strftime('%d%m%Y'), 8)
        text5 += self.converter.convert(abs(total_payment), 12)
        text5 += '0'
        country_code = address.country_id and address.country_id.code or ''
        if country_code != 'ES':
            text5 += self.converter.convert(country_code, 2)
        else:
            text5 += 2 * ' '
        text5 += 6 * ' '
        text5 = text5.ljust(100) + '\r\n'
        text += text5
        self.num_records += 5
        return text

    def _pop_beneficiary_payment(self, line, num_payment):
        text = ''
        text6 = self._header_beneficiary_68(line)
        text6 += self.converter.convert(abs(num_payment + 15), 3)
        text6 += self.ref
        text6 += self.dc
        text6 += self._get_reference(line['ml_inv_ref'][0].number, 12)
        date_create = datetime.strptime(line['ml_date_created'], '%Y-%m-%d')
        text6 += self.converter.convert(date_create.strftime('%d%m%Y'), 8)
        text6 += self.converter.convert(abs(line['amount']), 12)
        if 'in_invoice' in line['ml_inv_ref'][0].type:
            text6 += 'H'
        else:
            text6 += 'D'
        text6 += self._get_reference(line['ml_inv_ref'][0].number, 9)
        text6 += 2 * ' '
        text6 = text6.ljust(100) + '\r\n'
        text += text6
        self.num_records += 1
        return text

    def _pop_totals(self, lines):
        text = '0859'
        text += self._start_68()
        text += 12 * ' '
        text += 3 * ' '
        text += self.calcule_totals(lines)
        text += self.converter.convert(abs(self.num_records + 2), 10)
        text += 42 * ' '
        text += 5 * ' '
        text = text.ljust(100) + '\r\n'
        return text

    def create_file(self, order, lines):
        self.order = order
        file = ''
        self.num_records = 0
        if self.order.mode.type.code != 'payment_csb_68':
            raise Log(
                _('Error: Payment mode is not set correctly \
                %s') % self.order.mode.type.code)
        file += self._pop_header()
        partners = {}
        for line in lines:
            dic = partners.setdefault(line['partner_id'], {
                'lines': [],
                'total_payment': False
            })
            dic['lines'].append(line)
            if line['ml_inv_ref'][0].type == 'in_invoice':
                dic['total_payment'] += abs(line['amount'])
            else:
                dic['total_payment'] -= abs(line['amount'])
        for partner in partners:
            beneficiary = partners[partner]['lines'][0]
            total_payment = partners[partner]['total_payment']
            file += self._pop_beneficiary_headers(beneficiary, total_payment)
            num_payment = 0
            for line in partners[partner]['lines']:
                file += self._pop_beneficiary_payment(line, num_payment)
                num_payment += 1
        file += self._pop_totals(lines)
        return file
Exemplo n.º 9
0
 def __init__(self, env):
     self.env = env
     self.converter = PaymentConverterSpain()
Exemplo n.º 10
0
class PaymentKutxa(object):
    def __init__(self, env):
        self.env = env
        self.converter = PaymentConverterSpain()

    def create_file(self, order, lines):
        self.order = order
        self.num_records = 0
        self.number = 0
        if self.order.mode.type.code == 'payment_kutxa':
            txt_file = self._pop_header()
            for line in lines:
                txt_file += self._pop_beneficiary(line)
                txt_file += self._pop_detail(line)
                self.num_records += 1
            txt_file += self._pop_totals(line)
        return txt_file

    def _pop_header(self):
        all_text = ''
        for i in range(3):
            text = '510'
            text += str(i + 1)
            vat = self.order.mode.bank_id.partner_id.vat
            if not vat:
                raise Log(('Error: VAT of account not established \
                    for the account %s.\
                    ') % self.order.mode.bank_id.acc_number)
            vat = vat.replace("ES", "")
            if len(vat) < 10:
                fill = 10 - len(vat)
                vat = (fill * ' ') + vat
            elif len(vat) > 10:
                vat = vat[:10]
            text += vat
            if (i + 1) == 1:
                text += datetime.date.today().strftime('%d%m%y')
                ref = self.order.reference
                ref = ref.replace('/', '_')
                if len(ref) <= 8:
                    fill = 8 - len(ref)
                    ref += fill * ' '
                elif len(ref) > 8:
                    ref = ref[:8]
                text += ref
                payer = self.order.mode.bank_id.partner_id.name
                if len(payer) <= 40:
                    fill = 40 - len(payer)
                    payer += fill * ' '
                elif len(payer) > 40:
                    payer = payer[:40]
                text += payer
                account = self.order.mode.bank_id.acc_number
                account = account.replace(' ', '')
                type_account = self.order.mode.bank_id.state
                if type_account == 'iban':
                    account = account[4:]
                init = account[:8]
                account = init + account[10:]
                text += account
            if (i + 1) == 2:
                street_payer = self.order.mode.bank_id.partner_id.street
                if not street_payer:
                    raise Log(('Error: Payer %s has not street established. \
                        ') % self.order.mode.bank_id.partner_id.name)
                else:
                    if len(street_payer) < 72:
                        fill = 72 - len(street_payer)
                        street_payer += fill * ' '
                    elif len(street_payer) > 72:
                        street_payer = street_payer[:72]
                    text += street_payer
                street_payer2 = self.order.mode.bank_id.partner_id.street2
                if street_payer2:
                    if len(street_payer2) < 72:
                        fill = 72 - len(street_payer2)
                        street_payer2 += fill * ' '
                    elif len(street_payer2) > 72:
                        street_payer2 = street_payer2[:72]
                    text += street_payer2
            if (i + 1) == 3:
                postalzip = self.order.mode.bank_id.partner_id.zip
                if not postalzip:
                    raise Log(
                        ('Error: Payer %s has not postal zip established. \
                        ') % self.order.mode.bank_id.partner_id.name)
                else:
                    if len(postalzip) < 5:
                        fill = 5 - len(postalzip)
                        postalzip += fill * ' '
                    elif len(postalzip) > 5:
                        postalzip = postalzip[:5]
                    text += postalzip
                city_payer = self.order.mode.bank_id.partner_id.city
                if not city_payer:
                    raise Log(('Error: Payer %s has not city established. \
                        ') % self.order.mode.bank_id.partner_id.name)
                else:
                    if len(city_payer) < 36:
                        fill = 36 - len(city_payer)
                        city_payer += fill * ' '
                    elif len(city_payer) > 36:
                        city_payer = city_payer[:36]
                    text += city_payer
                state_id = self.order.mode.bank_id.partner_id.state_id.name
                if not state_id:
                    raise Log(('Error: Payer %s has not state established. \
                        ') % self.order.mode.bank_id.partner_id.name)
                else:
                    if len(state_id) < 25:
                        fill = 25 - len(state_id)
                        state_id += fill * ' '
                    elif len(state_id) > 25:
                        state_id = state_id[:25]
                    text += state_id
            text = text.ljust(90) + '\r\n'
            all_text += text
        return all_text

    def _pop_beneficiary(self, line):
        all_text = ''
        for i in range(3):
            text = '530'
            text += str(i + 1)
            supplier_vat = line['partner_id']['vat']
            supplier_vat = supplier_vat.replace("ES", "")
            if not supplier_vat or len(supplier_vat) > 10:
                raise Log(('Error: Supplier %s has wrong\
                        VAT.') % line['partner_id']['name'])
            else:
                if len(supplier_vat) < 10:
                    fill = 10 - len(supplier_vat)
                    supplier_vat = (fill * ' ') + supplier_vat
                text += supplier_vat
            if (i + 1) == 1:
                text += 5 * '0'
                ref = self.order.reference
                ref = ref[2:].replace("/", "")
                text += ref.zfill(7)
                supplier_name = line['partner_id']['name']
                if not supplier_name:
                    raise Log(('Error: Supplier %s has not name established. \
                            ') % line['partner_id']['vat'])
                else:
                    if len(supplier_name) < 40:
                        fill = 40 - len(supplier_name)
                        supplier_name += fill * ' '
                    elif len(supplier_name) > 40:
                        supplier_name = supplier_name[:40]
                    text += supplier_name
                text += self.converter.convert(abs(self.order.total), 10)
                text += datetime.date.today().strftime('%d%m%y')
                if self.order.date_prefered == 'due':
                    planned_date = self.order.line_ids \
                        and self.order.line_ids[0].ml_maturity_date \
                        or datetime.date.today().strftime('%d-%m-%y')
                    planned_date = planned_date.replace('-', '')
                    day = planned_date[6:]
                    month = planned_date[4:6]
                    year = planned_date[2:4]
                    planned_date = day + month + year
                elif self.order.date_prefered == 'now':
                    planned_date = datetime.date.today().strftime('%d%m%y')
                else:
                    planned_date = self.order.date_scheduled
                    if not planned_date:
                        raise Log(
                            ('Error:Planned date not established in order.'))
                    else:
                        planned_date = planned_date.replace('-', '')
                        day = planned_date[6:]
                        month = planned_date[4:6]
                        year = planned_date[:4]
                        planned_date = day + month + year
                text += planned_date
                if self.order.mode.payment_kutxa_type == '56':
                    text += '1'
                else:
                    text += '2'
            if (i + 1) == 2:
                supplier_street = line['partner_id']['street']
                if not supplier_street:
                    raise Log(('Error: Supplier %s has not \
                            street established.\
                            ') % line['partner_id']['name'])
                else:
                    if len(supplier_street) < 36:
                        fill = 36 - len(supplier_street)
                        supplier_street += fill * ' '
                    elif len(supplier_street) > 36:
                        supplier_street = supplier_street[:36]
                    text += supplier_street
                supplier_street2 = line['partner_id']['street2']
                if supplier_street2:
                    if len(supplier_street2) < 36:
                        fill = 36 - len(supplier_street2)
                        supplier_street2 += fill * ' '
                    elif len(supplier_street2) > 36:
                        supplier_street2 = supplier_street2[:36]
                    text += supplier_street2
            if (i + 1) == 3:
                supplier_zip = line['partner_id']['zip']
                if not supplier_zip:
                    raise Log(('Error: Supplier %s has not \
                            C.P established.') % line['partner_id']['name'])
                else:
                    if len(supplier_zip) < 5:
                        fill = 5 - len(supplier_zip)
                        supplier_zip += fill * ' '
                    elif len(supplier_zip) > 5:
                        supplier_zip = supplier_zip[:5]
                    text += supplier_zip
                supplier_city = line['partner_id']['city']
                if not supplier_city:
                    raise Log(('Error: Supplier %s has not \
                            city established.') % line['partner_id']['name'])
                else:
                    if len(supplier_city) < 36:
                        fill = 36 - len(supplier_city)
                        supplier_city += fill * ' '
                    elif len(supplier_city) > 36:
                        supplier_city = supplier_city[:36]
                    text += supplier_city
                supplier_state = line['partner_id']['state_id']['name']
                if not supplier_state:
                    raise Log(('Error: Supplier %s has not \
                            state established.') % line['partner_id']['name'])
                else:
                    if len(supplier_state) < 15:
                        fill = 15 - len(supplier_state)
                        supplier_state += fill * ' '
                    elif len(supplier_state) > 15:
                        supplier_state = supplier_state[:15]
                    text += supplier_state
                if self.order.mode.payment_kutxa_type == '56':
                    supplier_account = line['bank_id']['acc_number']
                    if not supplier_account:
                        raise Log(
                            ('Error: Supplier %s has not account established. \
                                ') % line['partner_id']['name'])
                    supplier_account = supplier_account.replace(' ', '')
                    type_account = line['bank_id']['state']
                    if type_account == 'iban':
                        supplier_account = supplier_account[4:]
                    init = supplier_account[:8]
                    dc = supplier_account[8:10]
                    supplier_account = init + dc + supplier_account[10:]
                    text += supplier_account
            text = text.ljust(90) + '\r\n'
            all_text += text
        return all_text

    def _pop_detail(self, line):
        text = '560'
        self.number += 1
        text += str(self.number)
        supplier_vat = line['partner_id']['vat']
        supplier_vat = supplier_vat.replace("ES", "")
        if not supplier_vat or len(supplier_vat) > 10:
            raise Log(('Error: Supplier %s has wrong\
                    VAT.') % line['partner_id']['name'])
        else:
            if len(supplier_vat) < 10:
                fill = 10 - len(supplier_vat)
                supplier_vat = (fill * ' ') + supplier_vat
            text += supplier_vat
        under_one = line['communication']
        if under_one:
            if len(under_one) < 36:
                fill = 36 - len(under_one)
                under_one += fill * ' '
            elif len(under_one) > 36:
                under_one = under_one[:36]
            text += under_one
        else:
            text += 36 * ' '
        under_two = line['communication2']
        if under_two:
            if len(under_two) < 36:
                fill = 36 - len(under_two)
                under_two += fill * ' '
            elif len(under_two) > 36:
                under_two = under_two[:36]
            text += under_two
        text = text.ljust(90) + '\r\n'
        return text

    def _pop_totals(self, line):
        text = '5901'
        vat = self.order.mode.bank_id.partner_id.vat
        if not vat:
            raise Log(('Error: VAT of account not established \
                for the account %s.\
                ') % self.order.mode.bank_id.acc_number)
        vat = vat.replace("ES", "")
        if len(vat) < 10:
            fill = 10 - len(vat)
            vat = (fill * ' ') + vat
        elif len(vat) > 10:
            vat = vat[:10]
        text += vat
        text += self.converter.convert(abs(self.order.total), 12)
        num = str(self.num_records)
        text += num.zfill(12)
        total = str((self.num_records * 2) + 6)
        text += total.zfill(12)
        text = text.ljust(90) + '\r\n'
        return text
Exemplo n.º 11
0
class Confirminet(object):
    def __init__(self, env):
        self.env = env
        self.converter = PaymentConverterSpain()

    def _start_registro_06(self, line):
        text = '06'
        # 3-4 - Forma de pago
        text += self.order.mode.confirminet_type
        # 5-14 - Código de ordenante
        vat = self.order.mode.bank_id.partner_id.vat[2:]
        text += self.converter.convert(vat, 10)
        # 15-26 - Referencia del proveedor
        if not line['partner_id'].vat:
            raise Log(_("Error: Supplier %s must have a VAT number.") %
                      line['partner_id'].name)
        partner_vat = line['partner_id'].vat[2:]
        text += self.converter.convert(partner_vat[-12:], 12)
        return text

    def _registro_03(self):
        today = datetime.today().strftime('%y%m%d')
        text = '0360'
        # 5-14 - NIF
        vat = self.order.mode.bank_id.partner_id.vat[2:]
        text += self.converter.convert(vat, 10)
        # 15-26 - Referencia interna BK - En blanco
        text += 12 * ' '
        # 27-29 - Número de dato
        text += '001'
        # 30-35 - Fecha de envío
        text += today
        # 36-41 - Fecha de emisión
        if self.order.date_scheduled:
            planned = fields.Date.from_string(self.order.date_scheduled)
            text += planned.strftime('%y%m%d')
        else:
            text += today
        # 42-65 - Contrato G.I.P.
        gip = self.converter.digits_only(self.order.mode.bank_id.acc_number)
        if gip[:4] != '0128':
            raise Log(
                _("Error: Contract number (Account number) is not valid. It "
                  "should start with '0128'."))
        text += gip[:4]
        text += gip[4:8]
        text += gip[10:20]
        text += 4 * " "
        text += gip[8:10]
        # 66-72 - Libre
        text += 7 * ' '
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_010(self, line):
        text = self._start_registro_06(line)
        text += '010'
        # 30-41 - Importe de la factura
        text += self.converter.convert(abs(line['amount']), 12)
        # 42-69 - Libre
        text += 19 * " "
        # 61-61 Signo del importe de la factura
        text += " " if line['amount'] >= 0 else "-"
        # 62-72 - Libre
        text += 11 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_011(self, line):
        text = self._start_registro_06(line)
        text += '011'
        # 30-65 - Nombre del proveedor
        text += self.converter.convert(line['partner_id'].name, 36)
        # 66-72 - Libre
        text += 7 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_012(self, line):
        address = line['partner_id']
        text = self._start_registro_06(line)
        text += '012'
        # 30-65 - Dirección del proveedor
        if not address.street:
            raise Log(
                _("Error: Supplier %s has no street in its address.") %
                line['partner_id'].name)
        text += self.converter.convert(address.street, 36)
        # 66-72 - Libre
        text += 7 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_014(self, line):
        address = line['partner_id']
        if not address.zip:
            if not address.country_id or address.country_id.code == 'ES':
                raise Log(
                    _("Error: Supplier %s has no ZIP in its address.") %
                    line['partner_id'].name)
            else:
                # No exportar este registro para extranjeros sin dirección
                return ""
        text = self._start_registro_06(line)
        text += '014'
        # 30-34 - Código postal
        text += self.converter.convert(address.zip, 5)
        # 35-66 - Localidad del proveedor
        if not address.city:
            raise Log(
                _("Error: Supplier %s has no city in its address.") %
                line['partner_id'].name)
        text += self.converter.convert(address.city, 32)
        # 67-72 - Libre
        text += 6 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_170(self, line):
        if not line['partner_id'].email:
            return ""
        text = self._start_registro_06(line)
        text += '170'
        # 30-65 - Email de proveedor
        text += self.converter.convert(line['partner_id'].email, 36)
        # 66-72 - Libre
        text += 7 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_171(self, line):
        if len(line['partner_id'].email or '') <= 36:
            return ""
        text = self._start_registro_06(line)
        text += '171'
        # 30-65 - Email de proveedor (continuación)
        text += self.converter.convert(line['partner_id'].email[36:], 36)
        # 66-72 - Libre
        text += 7 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_172(self, line):
        if len(line['partner_id'].email or '') <= 72:
            return ""
        text = self._start_registro_06(line)
        text += '172'
        # 30-65 - Email de proveedor (continuación)
        text += self.converter.convert(line['partner_id'].email[72:], 36)
        # 66-72 - Libre
        text += 7 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_173(self, line):
        address = line['partner_id']
        text = self._start_registro_06(line)
        text += '173'
        # 30-63 - Cuenta del proveedor
        if self.order.mode.confirminet_type == '57':
            # Cheque - No hace falta cuenta
            text += 34 * " "
        else:
            if address.country_id.code == 'ES':
                ccc = self.converter.digits_only(line['bank_id'].acc_number)
                text += self.converter.convert('ES' + ccc, 34)
            else:
                if line['bank_id'].state != 'iban':
                    raise Log(
                        _("Bank account of supplier %s, which is of outside "
                          "of Spain, should be IBAN.") %
                        line['partner_id'].name)
                iban = self.converter.digits_only(line['bank_id'].acc_number)
                text += self.converter.convert(iban, 34)
        # 64-64 - Libre
        text += " "
        # 65-66 - Código SWIFT del país del proveedor
        if address.country_id.code == 'ES':
            text += "ES"
        else:
            text += line['bank_id'][:2]
        # 67-72 - Libre
        text += 6 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_174(self, line):
        address = line['partner_id']
        text = self._start_registro_06(line)
        text += '174'
        # 30-40 - Dirección Swift
        if self.order.mode.confirminet_type == '57':
            text += 11 * " "
        else:
            if (address.country_id.code != 'ES' and not
                    line['bank_id'].bank_bic):
                raise Log(
                    _("Partner %s doesn't have a SWIFT/BIC code in its bank "
                      "account.") % line['partner_id'].name)
            text += self.converter.convert(line['bank_id'].bank_bic, 11)
        # 41-56 Claves adicionales (ABA/BLZ/FW/SC...)
        text += 16 * " "
        # 57-72 - Libre
        text += 16 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_175(self, line):
        address = line['partner_id']
        text = self._start_registro_06(line)
        text += '175'
        # 30-30 - Idioma
        text += "I" if address.country_id.code != 'ES' else "E"
        # 31-72 - Libre
        text += 42 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_182(self, line):
        text = self._start_registro_06(line)
        text += '182'
        # 30-41 - Referencia del Proveedor
        partner_vat = line['partner_id'].vat[2:]
        text += self.converter.convert(partner_vat[-12:], 12)
        # 42-72 - Libre
        text += 31 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_018(self, line):
        text = self._start_registro_06(line)
        text += '018'
        # 30-35 - Fecha de vencimiento de la factura
        if line['date']:
            date = fields.Date.from_string(line['date'])
        elif self.order.date_scheduled:
            date = fields.Date.from_string(self.order.date_scheduled)
        else:
            date = datetime.today()
        text += date.strftime('%y%m%d')
        # 36-51 - Número de la factura
        invoice_number = (
            line['ml_inv_ref'] and
            (line['ml_inv_ref'][0].supplier_invoice_number or
             line['ml_inv_ref'][0].reference) or line['communication'])
        if not invoice_number:
            raise Log(
                _("Error: Line with ID %s has no reference nor invoice "
                  "number.") % line['id'])
        text += self.converter.convert(invoice_number, 16)
        # 56-65 - Referencia interna del cliente (Libre)
        text += self.converter.convert(line['communication'], 14)
        # 66-72 - Libre
        text += 7 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_06_019(self, line):
        text = self._start_registro_06(line)
        text += '019'
        # 30-41 - Libre. Se deja como referencia interna del Cliente
        text += 12 * " "
        text += '\r\n'
        self.num_records += 1
        return text

    def _registro_08(self, total_amount, num_lines, num_records):
        text = '0860'
        # 5-14 - NIF
        vat = self.order.mode.bank_id.partner_id.vat[2:]
        text += self.converter.convert(vat, 10)
        # 15-29 - Libre
        text += 15 * " "
        # 30-41 - Suma de importes
        text += self.converter.convert(total_amount, 12)
        # 42-49 - Número de registros de dato 010
        text += self.converter.convert(num_lines, 8)
        # 50-59 - Número total de registros
        text += self.converter.convert(num_records, 10)
        # 60-72 - Libre
        text += 13 * " "
        return text

    def create_file(self, order, lines):
        self.order = order
        self.num_records = 0
        txt_file = self._registro_03()
        total_amount = 0
        for line in lines:
            txt_file += self._registro_06_010(line)
            txt_file += self._registro_06_011(line)
            txt_file += self._registro_06_012(line)
            txt_file += self._registro_06_014(line)
            txt_file += self._registro_06_170(line)
            txt_file += self._registro_06_171(line)
            txt_file += self._registro_06_172(line)
            txt_file += self._registro_06_173(line)
            txt_file += self._registro_06_174(line)
            txt_file += self._registro_06_175(line)
            txt_file += self._registro_06_182(line)
            txt_file += self._registro_06_018(line)
            txt_file += self._registro_06_019(line)
            total_amount += abs(line['amount'])
        txt_file += self._registro_08(
            total_amount, len(lines), self.num_records + 1)
        return txt_file
class ConfirmingSabadell(object):
    def __init__(self, env):
        self.env = env
        self.converter = PaymentConverterSpain()


    def create_file(self, order, lines):
        self.order = order
        self.num_records = 0
        total_amount = 0
        if self.order.mode.type.code == 'conf_sabadell':
            txt_file = self._sab_registro_01()
            for line in lines:
                txt_file += self._sab_registro_02(line)
                txt_file += self._sab_registro_03(line)
                if order.mode.conf_sabadell_type == '58':
                    txt_file += self._sab_registro_04(line)
                total_amount += abs(line['amount'])
            txt_file += self._sab_registro_05(total_amount, len(lines), self.num_records + 1)
               
        return txt_file

    def _sab_registro_01(self):
        if self.order.date_prefered == 'now' or self.order.date_prefered == 'due':
            fecha_planificada = datetime.today().strftime('%Y%m%d')
        else:
            fecha_planificada = self.order.date_scheduled
            if not fecha_planificada:
                raise Log(
                    _("Error: Fecha planificada no establecida en la Orden de pago."))
            else:
                fecha_planificada = fecha_planificada.replace('-','')
				
        # Caracteres 1 y 2-3
        text = '1  '
		
        # 4 - 43 Nombre ordenante
        ordenante = self.order.mode.bank_id.partner_id.name
        if not ordenante:
            raise Log(
                    _("Error: Propietario de la cuenta no establecido para la cuenta %s.") % self.order.mode.bank_id.acc_number)
        if len(ordenante) <= 40:
            relleno = 40 - len(ordenante)
            ordenante += relleno * ' '
        elif len(ordenante) > 40:
            ordenante = ordenante[:40]
        text += ordenante
		
        # 44 - 51 Fecha de proceso
        text += fecha_planificada
		
        # 52 - 60 NIF Ordenante
        vat = self.order.mode.bank_id.partner_id.vat[2:]
        text += self.converter.convert(vat, 9)
		
        # 61 - 62 Tipo de Lote
        text += '65'
		
        # 63 - 64 Forma de envío
        text += 'B'
		
        # 64 - 83 Cuenta de cargo
        cuenta = self.order.mode.bank_id.acc_number
        cuenta = cuenta.replace(' ','')
        if len(cuenta) > 20:
            cuenta = cuenta[4:]
        text += cuenta
		
        # 84 - 95 Contrato BSConfirming
        text += self.order.mode.contrato_bsconfirming 
		
        # 96 - 99 Codigo fichero
        text += 'KF01'
		
        # 100 - 102 Codigo divisa
        text += 'EUR'

        text += '\r\n'
        self.num_records += 1
        return text

    def _sab_registro_02(self, line):
        # 1 Codigo registro
        text = '2'
        # 2 - 16 Codigo Proveedor
        codigo_pro = line['partner_id']['ref']
        if codigo_pro:
            text += codigo_pro
        else:
            text += 15 * ' '
        # 17 - 18 Tipo de documento
        tipo_doc = line['partner_id']['vat_type']
        if tipo_doc == '1':
            tipo_doc = '02'
        elif tipo_doc == '2':
            tipo_doc = '12'
        elif tipo_doc == '3':
            tipo_doc = '04'
        elif tipo_doc == '4':
            tipo_doc = '06'
        elif tipo_doc == '5':
            tipo_doc = '03'
        elif tipo_doc == '6':
            tipo_doc = '99'
        text += tipo_doc
        # 19 - 30 Documento identificativo
        nif = line['partner_id']['vat']
        if not nif:
            raise Log(
                    _("Error: El Proveedor %s no tiene establecido el NIF.") % line['partner_id']['name'])
        if len(nif) < 12:
                relleno = 12 - len(nif)
                nif += relleno * ' '
        text += nif
        # 31 Forma de pago
        forma_pago = self.order.mode.conf_sabadell_type
        if forma_pago == '56':
            forma_pago = 'T'
        elif forma_pago == '57':
            forma_pago = 'C'
        elif forma_pago == '58':
            forma_pago = 'E'
        text += forma_pago
        # 32 - 51 Cuenta
        if forma_pago == 'T' or forma_pago == 'E':
            cuenta = line['bank_id']['acc_number']
            cuenta = cuenta.replace(' ','')
            if len(cuenta) > 20:
                cuenta = cuenta[4:]
                text += cuenta
        else:
            text += 20 * ' '
        # 52 - 66 Num Factura
        num_factura = 15 * ' '
        if line['ml_inv_ref'] > 0:
            num_factura = line['ml_inv_ref'][0]['reference']
            if num_factura:
                if len(num_factura) < 15:
                    relleno = 15 - len(num_factura)
                    num_factura += relleno * ' '
            else:
                num_factura
        text += num_factura
        # 67 - 81 Importe de la factura
        text += self.converter.convert(abs(line['amount']), 14)
        if line['amount'] >= 0:
            text += '+'
        else:
            text += '-'

        # 82 - 89 Fecha factura
        fecha_factura = 8 * ' '
        if line['ml_inv_ref'] > 0:
            fecha_factura = line['ml_inv_ref'][0]['date_invoice'].replace('-','')
        text += fecha_factura
        # 90 - 97 Fecha vencimiento
        fecha_vencimiento = 8 * ' '
        if line['ml_inv_ref'] > 0:
            fecha_vencimiento = line['ml_inv_ref'][0]['date_due'].replace('-','')
        text += fecha_vencimiento
        # 98 - 127 Referencia factura ordenante
        referencia_factura = 30 * ' '
        if line['ml_inv_ref'] > 0:
            referencia_factura = line['ml_inv_ref'][0]['number'].replace('-','')
            if len(referencia_factura) < 30:
                relleno = 30 - len(referencia_factura)
                referencia_factura += relleno * ' '
        text += referencia_factura
        # 128 - Barrado cheque
        if forma_pago == 'C':
            text += 'S'
        else:
            text += ' '
        # 129 - 136 fecha emision pagaré
        text += 8 * ' '
        # 137 -144 fecha vencimiento pagaré
        text += 8 * ' '
        # 145 tipo pagare
        text += ' '
        # 146 - 175 IBAN
        if forma_pago == 'T' or forma_pago == 'E':
            cuenta = line['bank_id']['acc_number']
            cuenta = cuenta.replace(' ','')
            if len(cuenta) > 20:
                if len(cuenta) < 30:
                    relleno = 30 - len(cuenta)
                    cuenta += relleno * ' '
            elif len(cuenta) < 25:
                raise Log(
                    _("Error: La Cuenta del Proveedor: %s tiene que estar en formato IBAN.") % line['partner_id']['name'])
            text += cuenta
        else:
            text += 30 * ' '
        # 176 Reservado
        text += 125 * ' '

        text += '\r\n'
        self.num_records += 1
        return text

    def _sab_registro_03(self, line):
        # 1 Codigo registro
        text = '3'
        # 2 - 40 Nombre Proveedor
        nombre_pro = line['partner_id']['name']
        if nombre_pro:
            if len(nombre_pro) < 40:
                relleno = 40 - len(nombre_pro)
                nombre_pro += relleno * ' '
            elif len(nombre_pro) > 40:
                nombre_pro = nombre_pro[:40]
            text += nombre_pro
        else:
            text += 40 * ' '
        # 42 - 43 Idioma proveedor
        idioma_pro = line['partner_id']['lang']
        if idioma_pro:
            if idioma_pro == 'es_ES':
                text += '08'
            else:
                text += '13'
        else:
            text += 2 * ' '
        # 44 - 110 Domicilio
        domicilio_pro = line['partner_id']['street']
        if not domicilio_pro:
            raise Log(
                    _("Error: El Proveedor %s no tiene establecido el Domicilio.") % line['partner_id']['name'])
        else:
            if len(domicilio_pro) < 67:
                relleno = 67 - len(domicilio_pro)
                domicilio_pro += relleno * ' '
            text += domicilio_pro

        # 111 - 150 Ciudad
        ciudad_pro = line['partner_id']['city']
        if not ciudad_pro:
            raise Log(
                    _("Error: El Proveedor %s no tiene establecida la Ciudad.") % line['partner_id']['name'])
        else:
            if len(ciudad_pro) < 40:
                relleno = 40 - len(ciudad_pro)
                ciudad_pro += relleno * ' '
            text += ciudad_pro
        # 151- 155 CP
        cp_pro = line['partner_id']['zip']
        if not cp_pro:
            raise Log(
                    _("Error: El Proveedor %s no tiene establecido el C.P.") % line['partner_id']['name'])
        else:
            if len(cp_pro) < 5:
                relleno = 5 - len(cp_pro)
                cp_pro += relleno * ' '
            text += cp_pro
        # 156 - 161 Reservado no se utiliza
        text += 6 * ' '
        # 162 - 176 Telefono
        telefono_pro = line['partner_id']['phone']
        if telefono_pro:
            telefono_pro = telefono_pro.replace(' ','')
            telefono_pro = telefono_pro.replace('+','')
            if len(telefono_pro) < 15:
                relleno = 15 - len(telefono_pro)
                telefono_pro += relleno * ' '
            text += telefono_pro
        else:
            text += 15 * ' '
        # 177 - 191 fax
        fax_pro = line['partner_id']['fax']
        if fax_pro:
            fax_pro = fax_pro.replace(' ','')
            fax_pro = fax_pro.replace('+','')
            if len(fax_pro) < 15:
                relleno = 15 - len(fax_pro)
                fax_pro += relleno * ' '
            text += fax_pro
        else:
            text += 15 * ' '
        # 192 - 251 Correo
        email_pro = line['partner_id']['email']
        if email_pro:
            if re.match('^[(a-z0-9\_\-\.)]+@[(a-z0-9\_\-\.)]+\.[(a-z)]{2,15}$',email_pro.lower()):
                if len(email_pro) < 60:
                    relleno = 60 - len(email_pro)
                    email_pro += relleno * ' '
                text += email_pro
            else:
                text += 60 * ' '
        else:
            text += 60 * ' '
        # 252 Tipo envio informacion
        text += self.order.mode.tipo_envio_info # Por correo 1, por fax 2, por email 3
        # 253 - 254 Codigo pais
        pais_pro = line['partner_id']['country_id']['code']
        if not pais_pro:
            raise Log(
                    _("Error: El Proveedor %s no tiene establecido el País.") % line['partner_id']['name'])
        else:
            text += pais_pro

        # 255 -256 Codigo pais residencia no se usa
        text += '  '
        # 257 --- Reservado
        text += 44 * ' '


        text += '\r\n'
        self.num_records += 1
        return text

    def _sab_registro_04(self, line):
        # 1 Codigo registro
        text = '4'
        # 2 -16 Codigo proveedor
        codigo_pro = line['partner_id']['ref']
        if codigo_pro:
            text += codigo_pro
        else:
            text += 15 * ' '
        # 17 - 18 Codigo Pais
        pais_pro = line['partner_id']['country_id']['code']
        if not pais_pro:
            raise Log(
                    _("Error: El Proveedor %s no tiene establecido el País.") % line['partner_id']['name'])
        else:
            text += pais_pro
        # 19 - 29 SWIFT
        swift_pro = line['bank_id']['bank_bic']
        if not swift_pro:
            raise Log(
                    _("Error: La cuenta bancaria del Proveedor %s no tiene establecido el SWIFT.") % line['partner_id']['name'])
        else:
            if len(swift_pro) < 11:
                relleno = 11 - len(swift_pro)
                swift_pro += relleno * ' '
            text += swift_pro
        # 30 - 63 IBAN
        cuenta = line['bank_id']['acc_number']
        cuenta = cuenta.replace(' ','')
        if len(cuenta) < 34:
            if len(cuenta) < 25:
                raise Log(
                    _("Error: La Cuenta del Proveedor: %s tiene que estar en formato IBAN.") % line['partner_id']['name'])
            else:
                relleno = 34 - len(cuenta)
                cuenta += relleno * ' '
        text += cuenta

        # 64 - 69 Codigo estadistico
        text += self.order.mode.codigo_estadistico
        # 70 Divisa
        text += 'EUR' # o modificar por otra


        text += '\r\n'
        self.num_records += 1
        return text

    def _sab_registro_05(self, total_amount, num_lines, num_records):
        text = '5'
        # 2 - 10 NIF
        vat = self.order.mode.bank_id.partner_id.vat[2:]
        text += self.converter.convert(vat, 9)
        # 11 - 17 Total ordenes
        text += self.converter.convert(num_lines, 7)
        # 18 - 32  - Total importes
        text += self.converter.convert(total_amount, 14)
        if total_amount >= 0:
            text += '+'
        else:
            text += '-'
        # 60-72 - Libre
        text += 268 * " "
        return text
Exemplo n.º 13
0
 def generate_and_test_file(self, payment_order):
     self.converter = PaymentConverterSpain()
     wiz_export = self.env['banking.export.csb.wizard'].with_context({
         'active_ids': [payment_order.id],
         'active_model': 'payment.order',
         'active_id': payment_order.id}).create({})
     wiz_export.create_csb()
     self.assertTrue(wiz_export.file)
     data = base64.decodestring(wiz_export.file)
     file_obj = NamedTemporaryFile(
         'w+', suffix='.text', delete=False)
     file_obj.write(base64.decodestring(wiz_export.file))
     path = file_obj.name
     file_obj.close()
     with open(path, "rb") as fp:
         doc = csv.reader(
             fp, delimiter=';', quotechar='"', quoting=csv.QUOTE_ALL)
         data = [ln for ln in doc]
     today = datetime.date.today().strftime('%d%m%y')
     line1 = data[0][0]
     self.assertEqual('5101', line1[0:4])
     self.assertEqual('A31109267', line1[5:14])
     self.assertEqual(today, line1[14:20])
     ref = payment_order.reference.replace('/', '_')
     self.assertEqual(ref, line1[20:28])
     company = self.bank_payment_mode.partner_id
     company_name_csv = line1[28:(28 + len(company.name))].decode('utf-8')
     self.assertEqual(company.name, company_name_csv)
     self.assertEqual('208058011234567891', line1[68:86])
     line5 = data[1][0]
     self.assertEqual('5102', line5[0:4])
     self.assertEqual(company.vat[2:], line5[5:14])
     company_str_csv = line5[14:(15 + len(company.street))].decode('utf-8')
     self.assertEqual(company.street, company_str_csv)
     line3 = data[2][0]
     self.assertEqual('5103', line3[0:4])
     self.assertEqual(company.vat[2:], line3[5:14])
     self.assertEqual(company.zip, line3[14:(14 + len(company.zip))])
     company_city_csv = line3[19:(19 + len(company.city))].decode('utf-8')
     self.assertEqual(company.city, company_city_csv)
     state_name = company.state_id.name
     company_state_csv = line3[55:(55 + len(state_name))].decode('utf-8')
     self.assertEqual(state_name, company_state_csv)
     line4 = data[3][0]
     self.assertEqual('5301', line4[0:4])
     suppl = self.supplier_01
     self.assertEqual(suppl.vat[2:], line4[5:14])
     self.assertEqual(5 * '0', line4[14:19])
     ref = self.payment_order.reference
     ref = ref[2:].replace("/", "")
     ref = ref.zfill(7)
     self.assertEqual(ref, line4[19:(19 + len(ref))])
     self.assertEqual(suppl.name, line4[26:(26 + len(suppl.name))])
     quantity = self.converter.convert(abs(self.payment_order.total), 10)
     self.assertEqual(quantity, line4[66:76])
     self.assertEqual(today, line4[76:82])
     due_date = self.inv_suppl_01.date_due.replace('-', '')
     due_day = due_date[6:8]
     due_month = due_date[4:6]
     due_year = due_date[2:4]
     due_date = due_day + due_month + due_year
     self.assertEqual(due_date, line4[82:88])
     if self.payment_order.mode.payment_kutxa_type == '56':
         self.assertEqual('1', line4[88])
     else:
         self.assertEqual('2', line4[88])
     line5 = data[4][0]
     self.assertEqual('5302', line5[0:4])
     self.assertEqual(suppl.vat[2:], line5[5:14])
     self.assertEqual(suppl.street, line5[14:(14 + len(suppl.street))])
     line6 = data[5][0]
     self.assertEqual('5303', line6[0:4])
     self.assertEqual(suppl.vat[2:], line6[5:14])
     self.assertEqual(suppl.zip, line6[14:(14 + len(suppl.zip))])
     self.assertEqual(suppl.city, line6[19:(19 + len(suppl.city))])
     state_name = suppl.state_id.name
     state_file_csv = line6[55:(55 + len(state_name))].decode('utf-8')
     self.assertEqual(state_name, state_file_csv)
     if self.payment_order.mode.payment_kutxa_type == '56':
         acc_partner = self.partner_bank.acc_number.replace(' ', '')
         if self.partner_bank.state == 'iban':
             acc_partner = acc_partner[4:]
         self.assertEqual(acc_partner, line6[70:91])
     line7 = data[6][0]
     self.assertEqual('5601', line7[0:4])
     self.assertEqual(suppl.vat[2:], line7[5:14])
     communication = self.payment_line.communication
     self.assertEqual(communication, line7[20:(20 + len(communication))])
     line8 = data[7][0]
     self.assertEqual('5901', line8[0:4])
     self.assertEqual(company.vat[2:], line8[5:14])
     self.assertEqual(quantity, line8[16:26])
     self.assertEqual('000000000001', line8[26:38])
     self.assertEqual('000000000008', line8[38:50])
     self.assertEqual(len(wiz_export.file), 997)
Exemplo n.º 14
0
class TestPaymentKutxa(common.TransactionCase):
    def create_and_validate_invoice(self):
        self.tax_21 = self.env['account.tax'].create({
            'name': '%21%',
            'type': 'percent',
            'amount': 0.21,
            'type_tax_use': 'all',
            'applicable_type': 'true',
            'sequence': 1})
        self.pricelist_default_purchase = self.env[
            'product.pricelist'].create({
                'name': 'Default purchase',
                'type': 'purchase'})
        version_default_purchase = self.env[
            'product.pricelist.version'].create({
                'pricelist_id': self.pricelist_default_purchase.id,
                'name': 'Default purchase'})
        self.env['product.pricelist.item'].create({
            'price_version_id': version_default_purchase.id,
            'name': 'Default purchase',
            'sequence': 10,
            'base': self.ref('product.list_price')})
        self.supplier_01 = self.env['res.partner'].create({
            'name': 'Supplier 01',
            'is_company': True,
            'supplier': True,
            'property_product_pricelist_purchase': (
                self.pricelist_default_purchase.id),
            'email': '*****@*****.**',
            'street': 'Plaza General, 2',
            'zip': '18500',
            'vat': 'ESA00000000',
            'city': 'Granada',
            'state_id': self.ref('l10n_es_toponyms.ES19'),
            'phone': '666888999'})
        self.account = self.env['account.account'].create({
            'name': 'Account for test module',
            'type': 'payable',
            'user_type': self.ref('account.data_account_type_payable'),
            'code': '40000',
            'currency_mode': 'current',
            'reconcile': True,
            'company_id': self.ref('base.main_company')})
        self.pt_01 = self.env['product.template'].create({
            'name': 'Product 01',
            'type': 'consu',
            'taxes_id': [(6, 0, [self.tax_21.id])]})
        self.pp_01 = self.env['product.product'].create({
            'product_tmpl_id': self.pt_01.id,
            'list_price': self.ref('product.list0')})
        self.account_journal = self.env['account.journal'].create({
            'code': 'JJJI',
            'name': 'bank journal',
            'type': 'sale',
            'sequence_id': self.ref(
                'account.sequence_refund_purchase_journal')})
        self.partner_bank = self.create_res_partner_bank()
        self.inv_suppl_01 = self.env['account.invoice'].create({
            'account_id': self.account.id,
            'type': 'in_invoice',
            'journal_id': self.account_journal.id,
            'partner_id': self.supplier_01.id,
            'partner_bank_id': self.partner_bank.id,
            'date_invoice': fields.Date.today()})
        self.invoice_line_01 = self.env['account.invoice.line'].create({
            'invoice_id': self.inv_suppl_01.id,
            'invoice_line_tax_id': [(6, 0, [self.tax_21.id])],
            'name': self.pp_01.name_template,
            'price_unit': self.pp_01.list_price,
            'product_id': self.pp_01.id,
            'quantity': 1})
        self.inv_suppl_01.button_reset_taxes()
        self.inv_suppl_01.signal_workflow('invoice_open')
        self.assertEqual(self.inv_suppl_01.state, 'open')

    def create_res_partner_bank(self):
        return self.env['res.partner.bank'].create({
            'state': 'iban',
            'partner_id': self.supplier_01.id,
            'bank_name': 'MyBank',
            'acc_country_id': self.ref('base.es'),
            'acc_number': 'ES43 3035 0114 1811 4001 6797'})

    def create_bank_payment_mode(self):
        company = self.ref('base.main_company')
        self.bank_payment_mode = self.env['res.partner.bank'].create({
            'partner_id': company,
            'bank_name': 'MyBank Kutxa',
            'state': 'iban',
            'acc_number': 'ES94 2080 5801 1012 3456 7891'})

    def create_payment_transfer_mode(self):
        self.transfer_payment_mode = self.env['payment.mode'].create({
            'name': 'kutxa_payment_transfer',
            'bank_id': self.bank_payment_mode.id,
            'journal': self.account_journal.id,
            'type': self.env.ref(
                'payment_order_kutxa.export_kutxa').id,
            'contract_number': 'CT235679',
            'payment_kutxa_type': '56'})

    def create_payment_check_mode(self):
        self.check_payment_mode = self.env['payment.mode'].create({
            'name': 'kutxa_payment_check',
            'bank_id': self.bank_payment_mode.id,
            'journal': self.account_journal.id,
            'type': self.env.ref(
                'payment_order_kutxa.export_kutxa').id,
            'contract_number': 'CT235679',
            'payment_kutxa_type': '57'})

    def create_payment_order(self, payment_mode):
        self.payment_order = self.env['payment.order'].create({
            'mode': payment_mode.id})

    def create_payment_line(self, payment_order_id):
        move_line = self.env['account.move.line'].search([
            ('invoice', '=', self.inv_suppl_01.id),
            ('name', '=', '/')], limit=1)
        self.payment_line = self.env['payment.line'].create({
            'order_id': payment_order_id,
            'move_line_id': move_line.id,
            'amount_currency': 156,
            'partner_id': self.supplier_01.id,
            'communication': 'reference21'})
        self.payment_line.bank_id = self.partner_bank

    def configure_payment_order(self, payment_order):
        self.payment_order.signal_workflow('open')
        self.assertEqual(self.payment_order.state, 'open')
        self.payment_order.signal_workflow('done')
        self.assertEqual(self.payment_order.state, 'done')

    def generate_and_test_file(self, payment_order):
        self.converter = PaymentConverterSpain()
        wiz_export = self.env['banking.export.csb.wizard'].with_context({
            'active_ids': [payment_order.id],
            'active_model': 'payment.order',
            'active_id': payment_order.id}).create({})
        wiz_export.create_csb()
        self.assertTrue(wiz_export.file)
        data = base64.decodestring(wiz_export.file)
        file_obj = NamedTemporaryFile(
            'w+', suffix='.text', delete=False)
        file_obj.write(base64.decodestring(wiz_export.file))
        path = file_obj.name
        file_obj.close()
        with open(path, "rb") as fp:
            doc = csv.reader(
                fp, delimiter=';', quotechar='"', quoting=csv.QUOTE_ALL)
            data = [ln for ln in doc]
        today = datetime.date.today().strftime('%d%m%y')
        line1 = data[0][0]
        self.assertEqual('5101', line1[0:4])
        self.assertEqual('A31109267', line1[5:14])
        self.assertEqual(today, line1[14:20])
        ref = payment_order.reference.replace('/', '_')
        self.assertEqual(ref, line1[20:28])
        company = self.bank_payment_mode.partner_id
        company_name_csv = line1[28:(28 + len(company.name))].decode('utf-8')
        self.assertEqual(company.name, company_name_csv)
        self.assertEqual('208058011234567891', line1[68:86])
        line5 = data[1][0]
        self.assertEqual('5102', line5[0:4])
        self.assertEqual(company.vat[2:], line5[5:14])
        company_str_csv = line5[14:(15 + len(company.street))].decode('utf-8')
        self.assertEqual(company.street, company_str_csv)
        line3 = data[2][0]
        self.assertEqual('5103', line3[0:4])
        self.assertEqual(company.vat[2:], line3[5:14])
        self.assertEqual(company.zip, line3[14:(14 + len(company.zip))])
        company_city_csv = line3[19:(19 + len(company.city))].decode('utf-8')
        self.assertEqual(company.city, company_city_csv)
        state_name = company.state_id.name
        company_state_csv = line3[55:(55 + len(state_name))].decode('utf-8')
        self.assertEqual(state_name, company_state_csv)
        line4 = data[3][0]
        self.assertEqual('5301', line4[0:4])
        suppl = self.supplier_01
        self.assertEqual(suppl.vat[2:], line4[5:14])
        self.assertEqual(5 * '0', line4[14:19])
        ref = self.payment_order.reference
        ref = ref[2:].replace("/", "")
        ref = ref.zfill(7)
        self.assertEqual(ref, line4[19:(19 + len(ref))])
        self.assertEqual(suppl.name, line4[26:(26 + len(suppl.name))])
        quantity = self.converter.convert(abs(self.payment_order.total), 10)
        self.assertEqual(quantity, line4[66:76])
        self.assertEqual(today, line4[76:82])
        due_date = self.inv_suppl_01.date_due.replace('-', '')
        due_day = due_date[6:8]
        due_month = due_date[4:6]
        due_year = due_date[2:4]
        due_date = due_day + due_month + due_year
        self.assertEqual(due_date, line4[82:88])
        if self.payment_order.mode.payment_kutxa_type == '56':
            self.assertEqual('1', line4[88])
        else:
            self.assertEqual('2', line4[88])
        line5 = data[4][0]
        self.assertEqual('5302', line5[0:4])
        self.assertEqual(suppl.vat[2:], line5[5:14])
        self.assertEqual(suppl.street, line5[14:(14 + len(suppl.street))])
        line6 = data[5][0]
        self.assertEqual('5303', line6[0:4])
        self.assertEqual(suppl.vat[2:], line6[5:14])
        self.assertEqual(suppl.zip, line6[14:(14 + len(suppl.zip))])
        self.assertEqual(suppl.city, line6[19:(19 + len(suppl.city))])
        state_name = suppl.state_id.name
        state_file_csv = line6[55:(55 + len(state_name))].decode('utf-8')
        self.assertEqual(state_name, state_file_csv)
        if self.payment_order.mode.payment_kutxa_type == '56':
            acc_partner = self.partner_bank.acc_number.replace(' ', '')
            if self.partner_bank.state == 'iban':
                acc_partner = acc_partner[4:]
            self.assertEqual(acc_partner, line6[70:91])
        line7 = data[6][0]
        self.assertEqual('5601', line7[0:4])
        self.assertEqual(suppl.vat[2:], line7[5:14])
        communication = self.payment_line.communication
        self.assertEqual(communication, line7[20:(20 + len(communication))])
        line8 = data[7][0]
        self.assertEqual('5901', line8[0:4])
        self.assertEqual(company.vat[2:], line8[5:14])
        self.assertEqual(quantity, line8[16:26])
        self.assertEqual('000000000001', line8[26:38])
        self.assertEqual('000000000008', line8[38:50])
        self.assertEqual(len(wiz_export.file), 997)

    def common_functions(self):
        self.create_payment_line(self.payment_order.id)
        self.assertEqual(len(self.payment_order.line_ids), 1)
        self.configure_payment_order(self.payment_order)
        self.generate_and_test_file(self.payment_order)

    def test_transfer_kutxa(self):
        self.create_and_validate_invoice()
        self.create_bank_payment_mode()
        self.create_payment_transfer_mode()
        self.create_payment_order(self.transfer_payment_mode)
        self.common_functions()

    def test_check_kutxa(self):
        self.create_and_validate_invoice()
        self.create_bank_payment_mode()
        self.create_payment_check_mode()
        self.create_payment_order(self.check_payment_mode)
        self.common_functions()
Exemplo n.º 15
0
class ConfirmingBankia(object):
    def __init__(self, env):
        self.env = env
        self.converter = PaymentConverterSpain()

    def create_file(self, order, lines):
        self.order = order
        txt_file = ''
        if self.order.mode.type.code == 'conf_bankia':
            txt_file = self._ban_cabecera()
            for line in lines:
                txt_file += self._ban_beneficiarios(line)
            txt_file += self._ban_cola(len(lines))

        return txt_file

    def _ban_cabecera(self):
        if self.order.date_prefered == 'due':
            fecha_tratamiento = self.order.line_ids \
                and self.order.line_ids[0].ml_maturity_date \
                or datetime.date.today().strftime('%Y-%d-%m')
            fecha_tratamiento = fecha_tratamiento.replace('-', '')
            dia = fecha_tratamiento[6:]
            mes = fecha_tratamiento[4:6]
            ano = fecha_tratamiento[:4]
            fecha_tratamiento = dia + mes + ano
        elif self.order.date_prefered == 'now':
            fecha_tratamiento = datetime.date.today().strftime('%d%m%Y')
        else:
            fecha_tratamiento = self.order.date_scheduled
            if not fecha_tratamiento:
                raise Log(
                    _("Error: Fecha planificada no \
                        establecida en la Orden de pago."))
            else:
                fecha_tratamiento = fecha_tratamiento.replace('-', '')
                dia = fecha_tratamiento[6:]
                mes = fecha_tratamiento[4:6]
                ano = fecha_tratamiento[:4]
                fecha_tratamiento = dia + mes + ano
        # 0 -3 Tipo de registro
        text = '021'
        # 4 - 11 Fecha de soporte
        text += datetime.date.today().strftime('%d%m%Y')
        # 12 - 19 Fecha tratamiento, Sin uso
        text += fecha_tratamiento
        # 20 - 28 NIF Ordenante
        ordenante = self.order.mode.bank_id.partner_id
        if not ordenante:
            raise Log(
                _("Error: Propietario de la cuenta no \
                    establecido para la cuenta %s.") % ordenante.acc_number)
        else:
            vat = ordenante.vat[2:]
            text += self.converter.convert(vat, 9)
            # 29 - 58 Nombre Ordenante
            ordenante = self.order.mode.bank_id.partner_id.name
            if len(ordenante) < 30:
                relleno = 30 - len(ordenante)
                ordenante += relleno * ' '
            elif len(ordenante) > 30:
                ordenante = ordenante[:30]
            text += ordenante
        # 59 - 77 Entidad, Oficina y Numero de cuenta del contrato
        cuenta = self.order.mode.bank_id.acc_number
        cuenta = cuenta.replace(' ', '')
        tipo_cuenta = self.order.mode.bank_id.state
        if tipo_cuenta == 'iban':
            cuenta = cuenta[4:]
        principio = cuenta[:8]
        cuenta = principio + cuenta[10:]
        text += cuenta

        text = text.ljust(325) + '\r\n'
        return text

    def _ban_beneficiarios(self, line):
        # 0 - 3 Tipo de registro
        text = '022'
        # 4 - 13 NIF Proveedor
        nif = line['partner_id']['vat']
        if not nif:
            raise Log(
                _("Error: El Proveedor %s no tiene \
                    establecido el NIF.") % line['partner_id']['name'])
        nif = nif[2:]
        text += nif
        # 14 - 15 Codigo centro Proveedor
        text += '000'
        # 16 - 55 Nombre Proveedor
        nombre_pro = line['partner_id']['name']
        if nombre_pro:
            if len(nombre_pro) < 40:
                relleno = 40 - len(nombre_pro)
                nombre_pro += relleno * ' '
            elif len(nombre_pro) > 40:
                nombre_pro = nombre_pro[:40]
            text += nombre_pro
        else:
            text += 40 * ' '
        # 56 - 105 Apellido1 y Apellido2 Proveedor
        text += 50 * ' '
        # 106 - 135 Domicilio Proveedor
        domicilio_pro = line['partner_id']['street']
        if not domicilio_pro:
            raise Log(
                _("Error: El Proveedor %s no tiene \
                    establecido el Domicilio.") % line['partner_id']['name'])
        else:
            if len(domicilio_pro) < 30:
                relleno = 30 - len(domicilio_pro)
                domicilio_pro += relleno * ' '
            text += domicilio_pro
        # 136 - 140 C.P. Proveedor
        cp_pro = line['partner_id']['zip']
        if not cp_pro:
            raise Log(
                _("Error: El Proveedor %s no tiene \
                    establecido el C.P.") % line['partner_id']['name'])
        else:
            if len(cp_pro) < 5:
                relleno = 5 - len(cp_pro)
                cp_pro += relleno * ' '
            text += cp_pro
        # 141 - 170 Ciudad Proveedor
        ciudad_pro = line['partner_id']['city']
        if not ciudad_pro:
            raise Log(
                _("Error: El Proveedor %s no tiene \
                    establecida la Ciudad.") % line['partner_id']['name'])
        else:
            if len(ciudad_pro) < 30:
                relleno = 30 - len(ciudad_pro)
                ciudad_pro += relleno * ' '
            text += ciudad_pro
        # 171 - 210 Email Proveedor, no obligatorio
        text += 40 * ' '
        # 211 - 219 Telefono, no obligatorio
        text += '000000000'
        # 220 - 228 Fax, no obligatorio
        text += '000000000'
        # 229 - 248 Cuenta Proveedor
        cuenta = line['bank_id']['acc_number']
        cuenta = cuenta.replace(' ', '')
        tipo_cuenta = self.order.mode.bank_id.state
        if tipo_cuenta == 'iban':
            cuenta = cuenta[4:]
        text += cuenta
        # 249 - 258 Numero Factura
        num_factura = 10 * ' '
        if line['ml_inv_ref'][0]['reference']:
            num_factura = line['ml_inv_ref'][0]['reference']
            if num_factura:
                if len(num_factura) < 10:
                    relleno = 10 - len(num_factura)
                    num_factura += relleno * ' '
        text += num_factura
        # 259 - 266 Fecha Factura
        fecha_factura = '00000000'
        if line['ml_inv_ref'][0]['reference']:
            fecha_factura = line['ml_inv_ref'][0]['date_invoice']\
                .replace('-', '')
            dia = fecha_factura[6:]
            mes = fecha_factura[4:6]
            ano = fecha_factura[:4]
            fecha_factura = dia + mes + ano
        text += fecha_factura
        # 267 - 281 Importe Factura
        text += self.converter.convert(abs(line['amount']), 15)
        # 282 Signo
        if line['amount'] >= 0:
            text += '+'
        else:
            text += '-'
        # 283 - 290 Fecha vencimiento
        fecha_vencimiento = '00000000'
        if line['ml_inv_ref'][0]['reference']:
            fecha_vencimiento = line['date'].replace('-', '')
            dia = fecha_vencimiento[6:]
            mes = fecha_vencimiento[4:6]
            ano = fecha_vencimiento[:4]
            fecha_vencimiento = dia + mes + ano
        text += fecha_vencimiento
        # 291 Medio de pago
        text += self.order.mode.conf_bankia_type
        # 292 - Fecha emision pago domicilado
        fecha_vencimiento = '00000000'
        if self.order.mode.conf_bankia_type == 'P':
            if line['ml_inv_ref'][0]['reference']:
                fecha_vencimiento = line['ml_inv_ref'][0]['date_due']\
                    .replace('-', '')
                dia = fecha_vencimiento[6:]
                mes = fecha_vencimiento[4:6]
                ano = fecha_vencimiento[:4]
                fecha_vencimiento = dia + mes + ano
        text += fecha_vencimiento
        text = text.ljust(325) + '\r\n'

        return text

    def _ban_cola(self, lines):
        # 0 - 3 Tipo de registro
        text = '023'
        # 4 - 8 Num total de facturas de la remesa
        numero_facturas = str(lines)
        text += numero_facturas.zfill(5)
        # 9 - 24
        text += self.converter.convert(self.order.total, 15)

        text = text.ljust(325) + '\r\n'

        return text