Exemplo n.º 1
0
 def add_creditor_info(self, payment):
     payment_content = ""
     # creditor information
     payment_content += make_line("        <Cdtr>")
     # name of the creditor/supplier
     payment_content += make_line("          <Nm>" +
                                  cgi.escape(payment.receiver) + "</Nm>")
     # address of creditor/supplier (should contain at least country and first address line
     payment_content += make_line("          <PstlAdr>")
     # street name
     payment_content += make_line("            <StrtNm>{0}</StrtNm>".format(
         cgi.escape(get_street_name(payment.receiver_address_line1))))
     # building number
     payment_content += make_line("            <BldgNb>{0}</BldgNb>".format(
         cgi.escape(get_building_number(payment.receiver_address_line1))))
     # postal code
     payment_content += make_line("            <PstCd>{0}</PstCd>".format(
         cgi.escape(get_pincode(payment.receiver_address_line2))))
     # town name
     payment_content += make_line("            <TwnNm>{0}</TwnNm>".format(
         cgi.escape(get_city(payment.receiver_address_line2))))
     country = frappe.get_doc("Country", payment.receiver_country)
     payment_content += make_line("            <Ctry>" +
                                  country.code.upper() + "</Ctry>")
     payment_content += make_line("          </PstlAdr>")
     payment_content += make_line("        </Cdtr>")
     return payment_content
Exemplo n.º 2
0
def generate_payment_file_from_payroll(payroll_entry):
    payroll_record = frappe.get_doc("Payroll Entry", payroll_entry)
    payments = []
    # note: find by matching time range as there is a known issue that the link does not work (v10)
    salary_slips = frappe.get_all("Salary Slip",
                                  filters={
                                      'start_date': payroll_record.start_date,
                                      'end_date': payroll_record.end_date,
                                      'docstatus': 1
                                  },
                                  fields=[
                                      'name', 'posting_date', 'rounded_total',
                                      'employee_name', 'employee',
                                      'bank_account_no'
                                  ])
    company = frappe.get_doc('Company', payroll_record.company)
    country_code = frappe.get_value("Country", company.country, 'code').upper()
    for salary_slip in salary_slips:
        # collect address information
        employee = frappe.get_doc("Employee", salary_slip['employee'])
        if employee.permanent_address:
            address = employee.permanent_address
        elif employee.current_address:
            address = employee.current_address
        else:
            frappe.throw(
                _("No address for employee {0} found.").format(
                    salary_slip['employee_name']))
        lines = address.split("\n")
        street = get_street_name(lines[0])
        building = get_building_number(lines[0])
        pincode = get_pincode(lines[1])
        city = get_city(lines[1])

        payments.append({
            'payment_id':
            cgi.escape("PMTINF-{0}".format(salary_slip['name'])),
            'execution_date':
            salary_slip['posting_date'],
            'instruction_id':
            cgi.escape("INSTRID-{0}".format(salary_slip['name'])),
            'endtoend_id':
            cgi.escape("{0}".format(salary_slip['name'])),
            'transaction_type':
            "SEPA",
            'amount':
            salary_slip['rounded_total'],
            'currency':
            company.default_currency,
            'receiver_name':
            cgi.escape(salary_slip['employee_name']),
            'receiver_street':
            cgi.escape(street),
            'receiver_building':
            cgi.escape(building),
            'receiver_city':
            cgi.escape(city),
            'receiver_pincode':
            cgi.escape(pincode),
            'receiver_country':
            country_code,
            'receiver_iban':
            salary_slip['bank_account_no'].replace(" ", "")
        })
    try:
        paid_from = frappe.get_value('Account', payroll_record.payment_account,
                                     'iban').replace(" ", "")
    except:
        frappe.throw("Account IBAN not found: {0}".format(
            payroll_record.payment_account))

    pain001_data = {
        'msg_id':
        "MSG-" + payroll_record.name,
        'company':
        cgi.escape(payroll_record.company),
        'payments':
        payments,
        'paid_from_iban':
        paid_from,
        'paid_from_bic':
        frappe.get_value('Account', payroll_record.payment_account, 'bic')
    }
    return generate_pain001(pain001_data)
Exemplo n.º 3
0
def add_creditor_info(payment_record):
    payment_content = ""
    # creditor information
    payment_content += make_line("        <Cdtr>")
    # name of the creditor/supplier
    name = payment_record.party
    if payment_record.party_type == "Employee":
        name = frappe.get_value("Employee", payment_record.party,
                                "employee_name")
    payment_content += make_line("          <Nm>" + name + "</Nm>")
    # address of creditor/supplier (should contain at least country and first address line
    # get supplier address
    if payment_record.party_type == "Supplier" or payment_record.party_type == "Customer":
        supplier_address = get_billing_address(payment_record.party,
                                               payment_record.party_type)
        if supplier_address == None:
            return None
        street = get_street_name(supplier_address.address_line1)
        building = get_building_number(supplier_address.address_line1)
        plz = supplier_address.pincode
        city = supplier_address.city
        # country (has to be a two-digit code)
        try:
            country_code = frappe.get_value('Country',
                                            supplier_address.country,
                                            'code').upper()
        except:
            country_code = "CH"
    elif payment_record.party_type == "Employee":
        employee = frappe.get_doc("Employee", payment_record.party)
        if employee.permanent_address:
            address = employee.permanent_address
        elif employee.current_address:
            address = employee.current_address
        else:
            # no address found
            return None
        try:
            lines = address.split("\n")
            street = get_street_name(lines[0])
            building = get_building_number(lines[0])
            plz = get_pincode(lines[1])
            city = get_city(lines[1])
            country_code = "CH"
        except:
            # invalid address
            return None
    else:
        # unknown supplier type
        return None
    payment_content += make_line("          <PstlAdr>")
    # street name
    payment_content += make_line("            <StrtNm>" + street + "</StrtNm>")
    # building number
    payment_content += make_line("            <BldgNb>" + building +
                                 "</BldgNb>")
    # postal code
    payment_content += make_line("            <PstCd>{0}</PstCd>".format(plz))
    # town name
    payment_content += make_line("            <TwnNm>" + city + "</TwnNm>")
    payment_content += make_line("            <Ctry>" + country_code +
                                 "</Ctry>")
    payment_content += make_line("          </PstlAdr>")
    payment_content += make_line("        </Cdtr>")
    return payment_content