~akretion-team/prestashoperpconnect/prestashoperpconnect-direct-if-true

« back to all changes in this revision

Viewing changes to prestashoperpconnect/unit/import_synchronizer.py

  • Committer: Arthur Vuillard
  • Date: 2013-08-24 08:55:51 UTC
  • Revision ID: arthur.vuillard@akretion.com-20130824085551-4o7xrefrew1ioa75
Make use of the payment method import rule for sale orders

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
29
29
from openerp.addons.connector.queue.job import job
30
30
from openerp.addons.connector.unit.synchronizer import ImportSynchronizer
 
31
from openerp.addons.connector.connector import ConnectorUnit
31
32
from ..backend import prestashop
32
33
from ..connector import get_environment
 
34
from .adapter import GenericAdapter
 
35
 
 
36
from openerp.addons.connector.exception import FailedJobError
33
37
 
34
38
_logger = logging.getLogger(__name__)
35
39
 
267
271
 
268
272
 
269
273
@prestashop
 
274
class SaleImportRule(ConnectorUnit):
 
275
    _model_name = ['prestashop.sale.order']
 
276
 
 
277
    def _rule_always(self, record, method):
 
278
        """ Always import the order """
 
279
        return True
 
280
 
 
281
    def _rule_never(self, record, method):
 
282
        """ Never import the order """
 
283
        return False
 
284
 
 
285
    def _rule_paid(self, record, method):
 
286
        """ Import the order only if it has received a payment """
 
287
        return self._get_paid_amount(record) == record['total_paid']
 
288
 
 
289
    def _get_paid_amount(self, record):
 
290
        payment_adapter = self.get_connector_unit_for_model(
 
291
            GenericAdapter,
 
292
            '__not_exist_prestashop.payment'
 
293
        )
 
294
        payment_ids = payment_adapter.search({
 
295
            'filter[order_reference]': record['reference']
 
296
        })
 
297
        paid_amount = 0.0
 
298
        for payment_id in payment_ids:
 
299
            payment = payment_adapter.read(payment_id['attrs']['id'])
 
300
            paid_amount += float(payment['amount'])
 
301
        return paid_amount
 
302
 
 
303
    _rules = {'always': _rule_always,
 
304
              'paid': _rule_paid,
 
305
              'authorized': _rule_paid,
 
306
              'never': _rule_never,
 
307
              }
 
308
 
 
309
    def check(self, record):
 
310
        """ Check whether the current sale order should be imported
 
311
        or not. It will actually use the payment method configuration
 
312
        and see if the chosen rule is fullfilled.
 
313
 
 
314
        :returns: True if the sale order should be imported
 
315
        :rtype: boolean
 
316
        """
 
317
        session = self.session
 
318
        payment_method = record['payment']
 
319
        method_ids = session.search('payment.method',
 
320
                                    [('name', '=', payment_method)])
 
321
        if not method_ids:
 
322
            raise FailedJobError(
 
323
                "The configuration is missing for the Payment Method '%s'.\n\n"
 
324
                "Resolution:\n"
 
325
                "- Go to 'Sales > Configuration > Sales > Customer Payment "
 
326
                "Method'\n"
 
327
                "- Create a new Payment Method with name '%s'\n"
 
328
                "-Eventually  link the Payment Method to an existing Workflow "
 
329
                "Process or create a new one." % (payment_method,
 
330
                                                  payment_method))
 
331
        method = session.browse('payment.method', method_ids[0])
 
332
 
 
333
        self._rules[method.import_rule](self, record, method)
 
334
 
 
335
 
 
336
@prestashop
270
337
class SaleOrderImport(PrestashopImportSynchronizer):
271
338
    _model_name = ['prestashop.sale.order']
272
339
 
288
355
            self._check_dependency(order['product_id'],
289
356
                                   'prestashop.product.product')
290
357
 
 
358
    def _has_to_skip(self):
 
359
        """ Return True if the import can be skipped """
 
360
        rules = self.get_connector_unit_for_model(SaleImportRule)
 
361
        return rules.check(self.prestashop_record)
 
362
 
291
363
 
292
364
@prestashop
293
365
class TranslatableRecordImport(PrestashopImportSynchronizer):