示例#1
0
    def _authorize_form_get_invalid_parameters(self, tx, data):
        invalid_parameters = []

        if self.acquirer_reference and data.get('x_trans_id') != self.acquirer_reference:
            invalid_parameters.append(('Transaction Id', data.get('x_trans_id'), self.acquirer_reference))
        # check what is buyed
        if float_compare(float(data.get('x_amount', '0.0')), tx.amount, 2) != 0:
            invalid_parameters.append(('Amount', data.get('x_amount'), '%.2f' % tx.amount))
        return invalid_parameters
示例#2
0
    def _paypal_form_get_invalid_parameters(self, cr, uid, tx, data, context=None):
        invalid_parameters = []
        if data.get('notify_version')[0] != '3.4':
            _logger.warning(
                'Received a notification from Paypal with version %s instead of 2.6. This could lead to issues when managing it.' %
                data.get('notify_version')
            )
        if data.get('test_ipn'):
            _logger.warning(
                'Received a notification from Paypal using sandbox'
            ),

        # TODO: txn_id: shoudl be false at draft, set afterwards, and verified with txn details
        if tx.acquirer_reference and data.get('txn_id') != tx.acquirer_reference:
            invalid_parameters.append(('txn_id', data.get('txn_id'), tx.acquirer_reference))
        # check what is buyed
        if float_compare(float(data.get('mc_gross', '0.0')), (tx.amount + tx.fees), 2) != 0:
            invalid_parameters.append(('mc_gross', data.get('mc_gross'), '%.2f' % tx.amount))  # mc_gross is amount + fees
        if data.get('mc_currency') != tx.currency_id.name:
            invalid_parameters.append(('mc_currency', data.get('mc_currency'), tx.currency_id.name))
        if 'handling_amount' in data and float_compare(float(data.get('handling_amount')), tx.fees, 2) != 0:
            invalid_parameters.append(('handling_amount', data.get('handling_amount'), tx.fees))
        # check buyer
        if tx.payment_method_id and data.get('payer_id') != tx.payment_method_id.acquirer_ref:
            invalid_parameters.append(('payer_id', data.get('payer_id'), tx.payment_method_id.acquirer_ref))
        # check seller
        if data.get('receiver_id') and tx.acquirer_id.paypal_seller_account and data['receiver_id'] != tx.acquirer_id.paypal_seller_account:
            invalid_parameters.append(('receiver_id', data.get('receiver_id'), tx.acquirer_id.paypal_seller_account))
        if not data.get('receiver_id') or not tx.acquirer_id.paypal_seller_account:
            # Check receiver_email only if receiver_id was not checked.
            # In Paypal, this is possible to configure as receiver_email a different email than the business email (the login email)
            # In YuanCloud, there is only one field for the Paypal email: the business email. This isn't possible to set a receiver_email
            # different than the business email. Therefore, if you want such a configuration in your Paypal, you are then obliged to fill
            # the Merchant ID in the Paypal payment acquirer in YuanCloud, so the check is performed on this variable instead of the receiver_email.
            # At least one of the two checks must be done, to avoid fraudsters.
            if data.get('receiver_email') != tx.acquirer_id.paypal_email_account:
                invalid_parameters.append(('receiver_email', data.get('receiver_email'), tx.acquirer_id.paypal_email_account))

        return invalid_parameters
示例#3
0
    def _sips_form_get_invalid_parameters(self, tx, data):
        invalid_parameters = []

        data = self._sips_data_to_object(data.get('Data'))

        # TODO: txn_id: should be false at draft, set afterwards, and verified with txn details
        if tx.acquirer_reference and data.get('transactionReference') != tx.acquirer_reference:
            invalid_parameters.append(('transactionReference', data.get('transactionReference'), tx.acquirer_reference))
        # check what is bought
        if float_compare(float(data.get('amount', '0.0')) / 100, tx.amount, 2) != 0:
            invalid_parameters.append(('amount', data.get('amount'), '%.2f' % tx.amount))
        if tx.partner_reference and data.get('customerId') != tx.partner_reference:
            invalid_parameters.append(('customerId', data.get('customerId'), tx.partner_reference))

        return invalid_parameters
示例#4
0
    def _transfer_form_get_invalid_parameters(self,
                                              cr,
                                              uid,
                                              tx,
                                              data,
                                              context=None):
        invalid_parameters = []

        if float_compare(float(data.get('amount', '0.0')), tx.amount, 2) != 0:
            invalid_parameters.append(
                ('amount', data.get('amount'), '%.2f' % tx.amount))
        if data.get('currency') != tx.currency_id.name:
            invalid_parameters.append(
                ('currency', data.get('currency'), tx.currency_id.name))

        return invalid_parameters
示例#5
0
    def _ogone_form_get_invalid_parameters(self,
                                           cr,
                                           uid,
                                           tx,
                                           data,
                                           context=None):
        invalid_parameters = []

        # TODO: txn_id: should be false at draft, set afterwards, and verified with txn details
        if tx.acquirer_reference and data.get(
                'PAYID') != tx.acquirer_reference:
            invalid_parameters.append(
                ('PAYID', data.get('PAYID'), tx.acquirer_reference))
        # check what is bought
        if float_compare(float(data.get('amount', '0.0')), tx.amount, 2) != 0:
            invalid_parameters.append(
                ('amount', data.get('amount'), '%.2f' % tx.amount))
        if data.get('currency') != tx.currency_id.name:
            invalid_parameters.append(
                ('currency', data.get('currency'), tx.currency_id.name))

        return invalid_parameters
示例#6
0
    def _buckaroo_form_get_invalid_parameters(self,
                                              cr,
                                              uid,
                                              tx,
                                              data,
                                              context=None):
        invalid_parameters = []

        if tx.acquirer_reference and data.get(
                'BRQ_TRANSACTIONS') != tx.acquirer_reference:
            invalid_parameters.append(
                ('Transaction Id', data.get('BRQ_TRANSACTIONS'),
                 tx.acquirer_reference))
        # check what is buyed
        if float_compare(float(data.get('BRQ_AMOUNT', '0.0')), tx.amount,
                         2) != 0:
            invalid_parameters.append(
                ('Amount', data.get('BRQ_AMOUNT'), '%.2f' % tx.amount))
        if data.get('BRQ_CURRENCY') != tx.currency_id.name:
            invalid_parameters.append(
                ('Currency', data.get('BRQ_CURRENCY'), tx.currency_id.name))

        return invalid_parameters
示例#7
0
    def purchase_order_change(self):
        result = []
        if not self.purchase_id:
            return {}
        if not self.partner_id:
            self.partner_id = self.purchase_id.partner_id.id

        # Keep existing lines. We want to be able to add several PO on the same invoice.
        for line in self.invoice_line_ids:
            result.append({
                'purchase_line_id':
                line.purchase_line_id.id,
                'name':
                line.name,
                'origin':
                line.origin,
                'uom_id':
                line.uom_id.id,
                'product_id':
                line.product_id.id,
                'account_id':
                line.account_id.id,
                'price_unit':
                line.price_unit,
                'quantity':
                line.quantity,
                'discount':
                line.discount,
                'account_analytic_id':
                line.account_analytic_id.id,
                'invoice_line_tax_ids':
                line.invoice_line_tax_ids.ids,
            })

        for line in self.purchase_id.order_line:
            # Load a PO line only once
            if line in self.invoice_line_ids.mapped('purchase_line_id'):
                continue
            if line.product_id.purchase_method == 'purchase':
                qty = line.product_qty - line.qty_invoiced
            else:
                qty = line.qty_received - line.qty_invoiced
            if float_compare(
                    qty, 0.0,
                    precision_rounding=line.product_uom.rounding) <= 0:
                qty = 0.0
            taxes = line.taxes_id or line.product_id.supplier_taxes_id
            invoice_line_tax_ids = self.purchase_id.fiscal_position_id.map_tax(
                taxes)
            data = {
                'purchase_line_id':
                line.id,
                'name':
                line.name,
                'origin':
                self.purchase_id.origin,
                'uom_id':
                line.product_uom.id,
                'product_id':
                line.product_id.id,
                'account_id':
                self.env['account.invoice.line'].with_context({
                    'journal_id':
                    self.journal_id.id,
                    'type':
                    'in_invoice'
                })._default_account(),
                'price_unit':
                line.order_id.currency_id.compute(line.price_unit,
                                                  self.currency_id),
                'quantity':
                qty,
                'discount':
                0.0,
                'account_analytic_id':
                line.account_analytic_id.id,
                'invoice_line_tax_ids':
                invoice_line_tax_ids.ids
            }
            account = self.env[
                'account.invoice.line'].get_invoice_line_account(
                    'in_invoice', line.product_id,
                    self.purchase_id.fiscal_position_id,
                    self.env.user.company_id)
            if account:
                data['account_id'] = account.id
            result.append(data)

        self.invoice_line_ids = False  # To avoid duplicates
        self.invoice_line_ids = result
        self.purchase_id = False
        return {}
示例#8
0
    def _schedule_hours(self, cr, uid, id, hours, day_dt=None,
                        compute_leaves=False, resource_id=None,
                        default_interval=None, context=None):
        """ Schedule hours of work, using a calendar and an optional resource to
        compute working and leave days. This method can be used backwards, i.e.
        scheduling days before a deadline.

        :param int hours: number of hours to schedule. Use a negative number to
                          compute a backwards scheduling.
        :param datetime day_dt: reference date to compute working days. If days is
                                > 0 date is the starting date. If days is < 0
                                date is the ending date.
        :param boolean compute_leaves: if set, compute the leaves based on calendar
                                       and resource. Otherwise no leaves are taken
                                       into account.
        :param int resource_id: the id of the resource to take into account when
                                computing the leaves. If not set, only general
                                leaves are computed. If set, generic and
                                specific leaves are computed.
        :param tuple default_interval: if no id, try to return a default working
                                       day using default_interval[0] as beginning
                                       hour, and default_interval[1] as ending hour.
                                       Example: default_interval = (8, 16).
                                       Otherwise, a void list of working intervals
                                       is returned when id is None.

        :return tuple (datetime, intervals): datetime is the beginning/ending date
                                             of the schedulign; intervals are the
                                             working intervals of the scheduling.

        Note: Why not using rrule.rrule ? Because rrule does not seem to allow
        getting back in time.
        """
        if day_dt is None:
            day_dt = datetime.datetime.now()
        backwards = (hours < 0)
        hours = abs(hours)
        intervals = []
        remaining_hours = hours * 1.0
        iterations = 0
        current_datetime = day_dt

        call_args = dict(compute_leaves=compute_leaves, resource_id=resource_id, default_interval=default_interval, context=context)

        while float_compare(remaining_hours, 0.0, precision_digits=2) in (1, 0) and iterations < 1000:
            if backwards:
                call_args['end_dt'] = current_datetime
            else:
                call_args['start_dt'] = current_datetime

            working_intervals = self.get_working_intervals_of_day(cr, uid, id, **call_args)

            if id is None and not working_intervals:  # no calendar -> consider working 8 hours
                remaining_hours -= 8.0
            elif working_intervals:
                if backwards:
                    working_intervals.reverse()
                new_working_intervals = self.interval_schedule_hours(working_intervals, remaining_hours, not backwards)
                if backwards:
                    new_working_intervals.reverse()

                res = datetime.timedelta()
                for interval in working_intervals:
                    res += interval[1] - interval[0]
                remaining_hours -= (seconds(res) / 3600.0)
                if backwards:
                    intervals = new_working_intervals + intervals
                else:
                    intervals = intervals + new_working_intervals
            # get next day
            if backwards:
                current_datetime = datetime.datetime.combine(self.get_previous_day(cr, uid, id, current_datetime, context), datetime.time(23, 59, 59))
            else:
                current_datetime = datetime.datetime.combine(self.get_next_day(cr, uid, id, current_datetime, context), datetime.time())
            # avoid infinite loops
            iterations += 1

        return intervals