class Mpi(XmlMixin): """ Class representing the mpi payments """ cavv = Field(default='', validator=MpiValidator.cavv) xid = Field(default='', validator=MpiValidator.xid) eci = Field(convert=str, default='', validator=MpiValidator.eci)
class DccInfoWithAmount(FieldsAmountMixin, DccInfo): """ Class representing the DCC information with rate type and amount (amount, currency) """ ratetype = Field(default='', validator=DccValidator.ratetype) rate = Field(default='', validator=DccValidator.rate) xml_root_tag = 'dccinfo'
class FieldsAmountMixin(object): """ This mixin add amount fields and necessary definition for parse to XML """ currency = Field(default=None, validator=RequestValidator.currency) amount = Field(default='', convert=str, validator=RequestValidator.amount) xml_grouped_fields = [('amount', 'currency')]
class DisplayCardsRequest(HppRequest): """ Class representing a display stored cards request to be sent to HPP. """ # Mandatory hpp_select_stored_card = Field( default='', validator=CardStorageValidator.hpp_select_stored_card) offer_save_card = Field(default='0', validator=RequestValidator.flag) payer_exist = Field(default='1', validator=CardStorageValidator.payer_exist) flag_fields = [ 'auto_settle_flag', 'card_storage_enable', 'offer_save_card', 'payer_exist' ] def get_hash_values(self): """ Override function to get necessary hash values for this request :return: list """ # Empty values represents pmt_ref return [ self.timestamp, self.merchant_id, self.order_id, self.amount, self.currency, self.hpp_select_stored_card, '' ]
class Recurring(XmlMixin): """ Class representing the recurring payments """ type = Field(default=None, validator=RecurringValidator.type) sequence = Field(default=None, validator=RecurringValidator.sequence) xml_root_attributes = ['type', 'sequence']
class PhoneNumbers(XmlMixin): """ Class representing the phone number of the customer """ home = Field(default='', validator=PhoneValidator.string_fifty) work = Field(default='', validator=PhoneValidator.string_twenty) fax = Field(default='', validator=PhoneValidator.string_twenty) mobile = Field(default='', validator=PhoneValidator.string_twenty)
class CardRef(XmlMixin): """ Class represents the card reference and payer reference """ # Mandatory fields ref = Field(default='', validator=FieldsValidator.ref) payerref = Field(default='', validator=FieldsValidator.ref) xml_root_tag = 'card'
class Card(XmlMixin): """ Class represents the card """ # Mandatory fields number = Field(validator=CardValidator.number) expdate = Field(validator=CardValidator.expdate) chname = Field(validator=CardValidator.chname) type = Field(validator=CardValidator.type)
class RealVaultThreeDsVerifyEnrolled(ApiRequest, FieldsAmountMixin): """ Class representing a 3D Secure verify Stored card enrolled to be sent to API. """ payerref = Field(default=None, validator=Validator.ref) paymentmethod = Field(default=None, validator=Validator.ref) request_type = 'realvault-3ds-verifyenrolled' hash_fields = ['timestamp', 'merchantid', 'orderid', 'amount', 'currency', 'payerref']
class CardDccRateRequest(ApiRequest, FieldsAmountMixin, FieldsCommentMixin): """ Class representing a card dcc rate to be sent to API. """ payerref = Field(default=None, validator=Validator.ref) paymentmethod = Field(default=None, validator=Validator.ref) dccinfo = Field(default=None, validator=attr.validators.instance_of(DccInfo)) request_type = 'realvault-dccrate' object_fields = ['dccinfo'] hash_fields = ['timestamp', 'merchantid', 'orderid', 'amount', 'currency', 'payerref']
class ReceiptInRequest(ApiRequest, FieldsMixin, FieldsAmountMixin): """ Class representing a receipt in request to be sent to API. """ payerref = Field(default=None, validator=Validator.ref) paymentmethod = Field(default=None, validator=Validator.ref) paymentdata = Field(default=None, validator=attr.validators.instance_of(PaymentData)) request_type = 'receipt-in' object_fields = ['paymentdata'] flag_fields = ['autosettle'] hash_fields = ['timestamp', 'merchantid', 'orderid', 'amount', 'currency', 'payerref']
class CardNewRequest(ApiRequest, FieldsCommentMixin): """ Class representing a new card to be sent to API. """ card = Field(default=None, validator=attr.validators.instance_of(CardWithRef)) request_type = 'card-new' object_fields = ['card'] def get_hash_values(self): """ Override function to get necessary hash values for this request :return: list """ # Empty values represents amount and currency return [ self.timestamp, self.merchantid, self.orderid, '', '', self.card.payerref, self.card.chname, self.card.number ]
class CardWithCvn(Card): """ Class represents the card with Cvn """ cvn = Field(default=None, validator=attr.validators.instance_of(Cvn)) object_fields = ['cvn'] xml_root_tag = 'card'
class AuthRequestWithRecurring(AuthRequest): """ Class representing a authorisation with 3DS request to be sent to API. """ recurring = Field(default=None, validator=attr.validators.instance_of(Recurring)) object_fields = ['card', 'recurring']
class AuthRequestWithThreeDS(AuthRequest): """ Class representing a authorisation with 3DS request to be sent to API. """ mpi = Field(default=None, validator=attr.validators.instance_of(Mpi)) object_fields = ['card', 'mpi']
class AuthRequestWithDccInfo(AuthRequest): """ Class representing a authorisation with DCC info request to be sent to API. """ dccinfo = Field(default=None, validator=attr.validators.instance_of(DccInfoWithAmount)) object_fields = ['card', 'dccinfo']
class PaymentData(XmlMixin): """ Class representing the payment data (cvn) """ cvn_number = Field(default='', validator=CvnValidator.number) def normalize_xml(self): return {self.__class__.__name__.lower(): {'cvn': {'number': self.cvn_number}}}
class RecurringPaymentRequest(HppRequest): """ Class representing a recurring payment request to be sent to HPP. """ # Mandatory card_storage_enable = Field(default='1', validator=RequestValidator.flag) offer_save_card = Field(default='0', validator=RequestValidator.flag) payer_exist = Field(default='0', validator=RequestValidator.flag) # Optional payer_ref = Field(default='', validator=Validator.payer_ref) pmt_ref = Field(default='', validator=Validator.pmt_ref) recurring_type = Field(default='', validator=CardStorageValidator.recurring_type) recurring_sequence = Field( default='', validator=CardStorageValidator.recurring_sequence) flag_fields = [ 'auto_settle_flag', 'card_storage_enable', 'offer_save_card', 'payer_exist' ] hash_fields = [ 'timestamp', 'merchant_id', 'order_id', 'amount', 'currency', 'payer_ref', 'pmt_ref' ]
class Settle(FieldsCommentMixin, ApiRequest): """ Class representing a settle request to be sent to API. """ pasref = Field(default='', validator=TransactionManagementValidator.pasref) amount = Field(default='', convert=str, validator=RequestValidator.amount) request_type = 'settle' def get_hash_values(self): """ Override function to get necessary hash values for this request :return: list """ # Empty values represents currency and card number return [ self.timestamp, self.merchantid, self.orderid, self.amount, '', '' ]
class ThreeDsVerifySig(ApiRequest, FieldsAmountMixin): """ Class representing a 3D Secure signature verification request to be sent to API. """ pares = Field(default=None, validator=ThreeDSValidator.pares) request_type = '3ds-verifysig' def get_hash_values(self): return [self.timestamp, self.merchantid, self.orderid, self.amount, self.currency, '']
class Payer(FieldsCommentMixin, XmlMixin): """ Class representing Payer information to be passed to API """ ref = Field(default='', validator=FieldsValidator.ref) type = Field(default='', validator=PayerValidator.type) title = Field(default='', validator=PayerValidator.title) firstname = Field(default='', validator=PayerValidator.firstname) surname = Field(default='', validator=PayerValidator.surname) company = Field(default='', validator=PayerValidator.surname) email = Field(default='', validator=PayerValidator.email) address = Field(default=None, validator=attr.validators.optional(attr.validators.instance_of(Address))) phonenumbers = Field(default=None, validator=attr.validators.optional(attr.validators.instance_of(PhoneNumbers))) object_fields = ['address', 'phonenumbers'] xml_root_attributes = ['ref', 'type']
class ThreeDsVerifyEnrolled(ApiRequest, FieldsAmountMixin, FieldsCommentMixin): """ Class representing a 3D Secure verifying card request to be sent to API. """ card = Field(default=None, validator=attr.validators.instance_of(Card)) object_fields = ['card'] request_type = '3ds-verifyenrolled' def get_hash_values(self): return [self.timestamp, self.merchantid, self.orderid, self.amount, self.currency, self.card.number]
class DccRate(FieldsAmountMixin, FieldsCommentMixin, ApiRequest): """ Class representing a DCC rate request to be sent to API. """ card = Field(default=None, validator=attr.validators.instance_of(Card)) dccinfo = Field(default=None, validator=attr.validators.instance_of(DccInfoWithRateType)) object_fields = ['card', 'dccinfo'] request_type = 'dccrate' def get_hash_values(self): """ Override function to get necessary hash values for this request :return: list """ return [ self.timestamp, self.merchantid, self.orderid, self.amount, self.currency, self.card.number ]
class Rebate(FieldsAmountMixin, FieldsCommentMixin, ApiRequest): """ Class representing a rebate request to be sent to API. """ pasref = Field(default='', validator=TransactionManagementValidator.pasref) authcode = Field(default='', validator=TransactionManagementValidator.authcode) refundhash = Field(default=None, validator=RequestValidator.sha1hash) request_type = 'rebate' def get_hash_values(self): """ Override function to get necessary hash values for this request :return: list """ # Empty values represents amount and currency return [ self.timestamp, self.merchantid, self.orderid, self.amount, self.currency, '' ]
class Address(XmlMixin): """ Class representing the address of the customer """ line1 = Field(default='', validator=AddressValidator.string_fifty) line2 = Field(default='', validator=AddressValidator.string_fifty) line3 = Field(default='', validator=AddressValidator.string_fifty) city = Field(default='', validator=AddressValidator.string_fifty) county = Field(default='', validator=AddressValidator.string_fifty) country = Field(default='', validator=AddressValidator.string_fifty) code = Field(default='', validator=AddressValidator.code) postcode = Field(default='', validator=AddressValidator.postcode) xml_grouped_fields = [('country', 'code')]
class ApiRequest(HashMixin, XmlMixin): """ Super class representing a request to be sent to API. This class contains all common attributes and functions for all other classes. You can consult the specific documentation of all request fields on the website https://desarrolladores.addonpayments.com Subclasses values (fields to be defined in the subclasses): request_type Type of the Addonpayments request (auth, receipt-in, payer-new, card-new, ...) Mixin HashMixin attributes: hash_fields Hash a string made up of the request values Mixin XMLMixin attributes: xml_root_tag If the object is a Request the root tag is <request attributes></ request>. xml_root_attributes Normalized request objects always have timestamp and type attributes in the root tag """ # Mandatory field merchantid = Field(validator=RequestValidator.merchant_id) type = Field(default=None) # Mandatory fields with auto-generation timestamp = Field(default=None, validator=RequestValidator.timestamp) orderid = Field(default=None, validator=RequestValidator.order_id) # Mandatory fields generated later sha1hash = Field(default=None, validator=RequestValidator.sha1hash) # Optional field account = Field(default='', validator=RequestValidator.account) # Static variables # Defined in subclasses request_type = '' # Default values for XmlMixin, all XML requests starts with <request type='' timestamp=''> xml_root_tag = 'request' xml_root_attributes = ['timestamp', 'type'] def __attrs_post_init__(self): """ This method will be called after the class is fully initialized. Uses method to set auto-generate values if they have not been initialized and request type """ self.type = self.request_type gen_utl = GenerationUtils() if not self.timestamp: self.timestamp = gen_utl.generate_timestamp() if not self.orderid: self.orderid = gen_utl.generate_order_id() def hash(self, secret): """ Set and validate sha1hash :param secret: string """ self.sha1hash = self.generate_hash(secret) # Validate hash attr.validate(self) return self.sha1hash
class CardCancelRequest(ApiRequest, FieldsCommentMixin): """ Class representing a card cancellation to be sent to API. """ card = Field(default=None, validator=attr.validators.instance_of(CardRef)) request_type = 'card-cancel-card' object_fields = ['card'] def get_hash_values(self): """ Override function to get necessary hash values for this request :return: list """ return [self.timestamp, self.merchantid, self.card.payerref, self.card.ref]
class Void(FieldsCommentMixin, ApiRequest): """ Class representing a void request to be sent to API. """ pasref = Field(default='', validator=TransactionManagementValidator.pasref) request_type = 'void' def get_hash_values(self): """ Override function to get necessary hash values for this request :return: list """ # Empty values represents amount and currency return [self.timestamp, self.merchantid, self.orderid, '', '', '']
class PayerEditRequest(ApiRequest, FieldsCommentMixin): """ Class representing a edit payer to be sent to API. """ payer = Field(default=None, validator=attr.validators.instance_of(Payer)) request_type = 'payer-edit' object_fields = ['payer'] def get_hash_values(self): """ Override function to get necessary hash values for this request :return: list """ # Empty values represents amount and currency return [self.timestamp, self.merchantid, self.orderid, '', '', self.payer.ref]
class AuthRequest(ApiRequest, FieldsMixin, FieldsAmountMixin): """ Class representing a authorisation request to be sent to API. """ card = Field(default=None, validator=attr.validators.instance_of(Card)) object_fields = ['card'] flag_fields = ['autosettle'] request_type = 'auth' def get_hash_values(self): """ Override function to get necessary hash values for this request :return: list """ return [ self.timestamp, self.merchantid, self.orderid, self.amount, self.currency, self.card.number ]