#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
INSTRUÇÕES:
Para utilizar basta colocar no seu código a função abaixo apresentada e depois
invocar a função GenerateMbRef(ent_id, subent_id, order_id, order_value) passando
os respectivos parámetros:
ent_id - Entidade fornecida pela IfthenPay software no acto da realização de contracto
subent_id - Subentidade fornecida pela ifthen software no acto da realização de contracto
order_id - número de identificação do pagamento que pode ser o número de cliente, número de encomenda, etc
order_value - valor a pagar
'''
def GenerateMbRef( ent_id, subent_id, order_id, order_value ):
chk_val = 0;
order_id = "0000" + order_id
if len(ent_id) != 5:
print("Lamentamos mas tem de indicar uma entidade válida")
return;
if len(subent_id) == 0:
print("Lamentamos mas tem de indicar uma subentidade válida")
return;
if order_value < 1:
print("Lamentamos mas não é possível gerar uma referência MB para valores inferiores a 1 Euro")
return;
order_value = '%01.2f' % order_value
if len(subent_id) == 1:
#apenas serão considerados os 6 caracteres mais à direita do order_id
chk_str = ent_id + subent_id + order_id[-6:] + str('%08.0f' % int(round(float(order_value) * 100)))
elif len(subent_id) == 2:
#apenas serão considerados os 5 caracteres mais à direita do order_id
chk_str = ent_id + subent_id + order_id[-5:] + str('%08.0f' % int(round(float(order_value) * 100)))
else:
chk_str = ent_id + subent_id + order_id[-4:] + str('%08.0f' % int(round(float(order_value) * 100)))
chk_array = [3, 30, 9, 90, 27, 76, 81, 34, 49, 5, 50, 15, 53, 45, 62, 38, 89, 17, 73, 51];
i = len(chk_str)
for chk_item in chk_array:
chk_val += (int(chk_str[i-1]) % 10) * chk_item
i -= 1
chk_val %= 97
chk_digits = '%02.0f' % (98-chk_val)
print("Entidade: %s" % ent_id)
print("Referencia: %s %s %s" % (chk_str[5:5+3], chk_str[8:8+3], chk_str[11:11+1] + chk_digits))
print("Valor: %s" % order_value)
GenerateMbRef("93999", "99", "0404", 14.5)
IyEvdXNyL2Jpbi9weXRob24KIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCicnJwpJTlNUUlXDh8OVRVM6CgoKUGFyYSB1dGlsaXphciBiYXN0YSBjb2xvY2FyIG5vIHNldSBjw7NkaWdvIGEgZnVuw6fDo28gYWJhaXhvIGFwcmVzZW50YWRhIGUgZGVwb2lzIAppbnZvY2FyIGEgZnVuw6fDo28gR2VuZXJhdGVNYlJlZihlbnRfaWQsIHN1YmVudF9pZCwgb3JkZXJfaWQsIG9yZGVyX3ZhbHVlKSBwYXNzYW5kbwpvcyByZXNwZWN0aXZvcyBwYXLDoW1ldHJvczoKCmVudF9pZCAtIEVudGlkYWRlIGZvcm5lY2lkYSBwZWxhIElmdGhlblBheSBzb2Z0d2FyZSBubyBhY3RvIGRhIHJlYWxpemHDp8OjbyBkZSBjb250cmFjdG8Kc3ViZW50X2lkIC0gU3ViZW50aWRhZGUgZm9ybmVjaWRhIHBlbGEgaWZ0aGVuIHNvZnR3YXJlIG5vIGFjdG8gZGEgcmVhbGl6YcOnw6NvIGRlIGNvbnRyYWN0bwpvcmRlcl9pZCAtIG7Dum1lcm8gZGUgaWRlbnRpZmljYcOnw6NvIGRvIHBhZ2FtZW50byBxdWUgcG9kZSBzZXIgbyBuw7ptZXJvIGRlIGNsaWVudGUsIG7Dum1lcm8gZGUgZW5jb21lbmRhLCBldGMKb3JkZXJfdmFsdWUgLSB2YWxvciBhIHBhZ2FyCgonJycKCmRlZiBHZW5lcmF0ZU1iUmVmKCBlbnRfaWQsIHN1YmVudF9pZCwgb3JkZXJfaWQsIG9yZGVyX3ZhbHVlICk6CiAgIGNoa192YWwgPSAwOwogICAKICAgb3JkZXJfaWQgPSAiMDAwMCIgKyBvcmRlcl9pZAogICAKICAgaWYgbGVuKGVudF9pZCkgIT0gNToKICAgICAgICBwcmludCgiTGFtZW50YW1vcyBtYXMgdGVtIGRlIGluZGljYXIgdW1hIGVudGlkYWRlIHbDoWxpZGEiKQogICAgICAgIHJldHVybjsKICAgICAgICAKICAgaWYgbGVuKHN1YmVudF9pZCkgPT0gMDoKICAgICAgICBwcmludCgiTGFtZW50YW1vcyBtYXMgdGVtIGRlIGluZGljYXIgdW1hIHN1YmVudGlkYWRlIHbDoWxpZGEiKQogICAgICAgIHJldHVybjsKICAgICAgICAKICAgaWYgb3JkZXJfdmFsdWUgPCAxOgogICAgICAgIHByaW50KCJMYW1lbnRhbW9zIG1hcyBuw6NvIMOpIHBvc3PDrXZlbCBnZXJhciB1bWEgcmVmZXLDqm5jaWEgTUIgcGFyYSB2YWxvcmVzIGluZmVyaW9yZXMgYSAxIEV1cm8iKQogICAgICAgIHJldHVybjsKICAgCiAgIG9yZGVyX3ZhbHVlID0gJyUwMS4yZicgJSBvcmRlcl92YWx1ZQogICAKICAgaWYgbGVuKHN1YmVudF9pZCkgPT0gMToKICAgICAgICAjYXBlbmFzIHNlcsOjbyBjb25zaWRlcmFkb3Mgb3MgNiBjYXJhY3RlcmVzIG1haXMgw6AgZGlyZWl0YSBkbyBvcmRlcl9pZAogICAgICAgIGNoa19zdHIgPSBlbnRfaWQgKyBzdWJlbnRfaWQgKyBvcmRlcl9pZFstNjpdICsgc3RyKCclMDguMGYnICUgaW50KHJvdW5kKGZsb2F0KG9yZGVyX3ZhbHVlKSAqIDEwMCkpKQogICBlbGlmIGxlbihzdWJlbnRfaWQpID09IDI6CiAgICAgICAgI2FwZW5hcyBzZXLDo28gY29uc2lkZXJhZG9zIG9zIDUgY2FyYWN0ZXJlcyBtYWlzIMOgIGRpcmVpdGEgZG8gb3JkZXJfaWQKICAgICAgICBjaGtfc3RyID0gZW50X2lkICsgc3ViZW50X2lkICsgb3JkZXJfaWRbLTU6XSArIHN0cignJTA4LjBmJyAlIGludChyb3VuZChmbG9hdChvcmRlcl92YWx1ZSkgKiAxMDApKSkKICAgZWxzZToKICAgICAgICBjaGtfc3RyID0gZW50X2lkICsgc3ViZW50X2lkICsgb3JkZXJfaWRbLTQ6XSArIHN0cignJTA4LjBmJyAlIGludChyb3VuZChmbG9hdChvcmRlcl92YWx1ZSkgKiAxMDApKSkKICAgICAgICAKICAgY2hrX2FycmF5ID0gWzMsIDMwLCA5LCA5MCwgMjcsIDc2LCA4MSwgMzQsIDQ5LCA1LCA1MCwgMTUsIDUzLCA0NSwgNjIsIDM4LCA4OSwgMTcsIDczLCA1MV07CiAgIAogICBpID0gbGVuKGNoa19zdHIpCiAgIAogICBmb3IgY2hrX2l0ZW0gaW4gY2hrX2FycmF5OgogICAgICAgIGNoa192YWwgKz0gKGludChjaGtfc3RyW2ktMV0pICUgMTApICogY2hrX2l0ZW0KICAgICAgICBpIC09IDEKICAgCiAgIGNoa192YWwgJT0gOTcKICAgCiAgIGNoa19kaWdpdHMgPSAnJTAyLjBmJyAlICg5OC1jaGtfdmFsKQogICAKICAgcHJpbnQoIkVudGlkYWRlOiAlcyIgJSBlbnRfaWQpCiAgIHByaW50KCJSZWZlcmVuY2lhOiAlcyAlcyAlcyIgJSAoY2hrX3N0cls1OjUrM10sIGNoa19zdHJbODo4KzNdLCBjaGtfc3RyWzExOjExKzFdICsgY2hrX2RpZ2l0cykpCiAgIHByaW50KCJWYWxvcjogJXMiICUgb3JkZXJfdmFsdWUpCiAgIApHZW5lcmF0ZU1iUmVmKCI5Mzk5OSIsICI5OSIsICIwNDA0IiwgMTQuNSk=