Il faut dorénavant invoquer getProperty pour accéder aux données d'un membre.
[photoprint.git] / order.py
index 7b87275..815171b 100755 (executable)
--- a/order.py
+++ b/order.py
@@ -41,8 +41,6 @@ from Products.Plinn.utils import getPreferredLanguages
 from interfaces import IPrintOrderTemplate, IPrintOrder
 from permissions import ManagePrintOrderTemplate, ManagePrintOrders
 from price import Price
 from interfaces import IPrintOrderTemplate, IPrintOrder
 from permissions import ManagePrintOrderTemplate, ManagePrintOrders
 from price import Price
-from utils import Message as _
-from utils import translate
 from xml.dom.minidom import Document
 from tool import COPIES_COUNTERS
 from App.config import getConfiguration
 from xml.dom.minidom import Document
 from tool import COPIES_COUNTERS
 from App.config import getConfiguration
@@ -337,16 +335,19 @@ class PrintOrder(PortalContent, DefaultDublinCoreImpl) :
                    'PAYMENTREQUEST_0_SHIPTOPHONENUM' : self.billing['phone'],
                    }
         
                    'PAYMENTREQUEST_0_SHIPTOPHONENUM' : self.billing['phone'],
                    }
         
-        quantitySum = reduce(lambda a, b : a['quantity'] + b['quantity'], self.items)
-        priceSum = reduce(lambda a, b : a['unit_price'] * a['quantity'] + b['unit_price'] * b['quantity'], self.items)
-        priceValues = priceSum.getValues()
-        total = round(priceValues['taxed'], 2)
-        basePrice = round(priceValues['value'], 2)
-        tax = round(total - basePrice, 2)
+        if len(self.items) > 1 :
+            quantitySum = reduce(lambda a, b : a['quantity'] + b['quantity'], self.items)
+        else :
+            quantitySum = self.items[0]['quantity']
+        total = round(self.amountWithFees.getValues()['taxed'], 2)
         
         options['L_PAYMENTREQUEST_0_NAME0'] = 'Commande realis photo ref. %s' % self.getId()
         
         options['L_PAYMENTREQUEST_0_NAME0'] = 'Commande realis photo ref. %s' % self.getId()
-        options['L_PAYMENTREQUEST_0_DESC0'] = 'Commande de %d tirages photo' % quantitySum 
+        if quantitySum == 1 :
+            options['L_PAYMENTREQUEST_0_DESC0'] = "Commande d'un tirage photographique"
+        else :
+            options['L_PAYMENTREQUEST_0_DESC0'] = 'Commande de %d tirages photographiques' % quantitySum
         options['L_PAYMENTREQUEST_0_AMT0'] =  total
         options['L_PAYMENTREQUEST_0_AMT0'] =  total
+        options['PAYMENTINFO_0_SHIPPINGAMT'] = round(self.shippingFees.getValues()['taxed'], 2)
         # options['L_PAYMENTREQUEST_0_TAXAMT0'] =  tax
         # options['L_PAYMENTREQUEST_0_QTY%d' % n] = 1
         options['PAYMENTREQUEST_0_AMT'] = total
         # options['L_PAYMENTREQUEST_0_TAXAMT0'] =  tax
         # options['L_PAYMENTREQUEST_0_QTY%d' % n] = 1
         options['PAYMENTREQUEST_0_AMT'] = total
@@ -364,8 +365,8 @@ class PrintOrder(PortalContent, DefaultDublinCoreImpl) :
     def ppGetExpressCheckoutDetails(self, token) :
         ppi = self._initPayPalInterface()
         response = ppi.get_express_checkout_details(TOKEN=token)
     def ppGetExpressCheckoutDetails(self, token) :
         ppi = self._initPayPalInterface()
         response = ppi.get_express_checkout_details(TOKEN=token)
-        response = Registration.recordifyPPResp(response)
-        self._paypalLog.append(response)
+        response = PrintOrder.recordifyPPResp(response)
+        self._paypalLog.append(response)
         return response
     
     security.declarePrivate('ppDoExpressCheckoutPayment')
         return response
     
     security.declarePrivate('ppDoExpressCheckoutPayment')
@@ -376,15 +377,20 @@ class PrintOrder(PortalContent, DefaultDublinCoreImpl) :
                                                    PAYMENTREQUEST_0_CURRENCYCODE='EUR',
                                                    TOKEN=token,
                                                    PAYERID=payerid)
                                                    PAYMENTREQUEST_0_CURRENCYCODE='EUR',
                                                    TOKEN=token,
                                                    PAYERID=payerid)
-        response = Registration.recordifyPPResp(response)
-        self._paypalLog.append(response)
+        response = PrintOrder.recordifyPPResp(response)
+        self._paypalLog.append(response)
         return response
     
     security.declareProtected(ModifyPortalContent, 'ppPay')
     def ppPay(self, token, payerid):
         # assure le paiement paypal en une passe :
         # récupération des détails et validation de la transaction.
         return response
     
     security.declareProtected(ModifyPortalContent, 'ppPay')
     def ppPay(self, token, payerid):
         # assure le paiement paypal en une passe :
         # récupération des détails et validation de la transaction.
-        if not self.paid :
+        
+        wtool = getUtilityByInterfaceName('Products.CMFCore.interfaces.IWorkflowTool')
+        wfstate = wtool.getInfoFor(self, 'review_state', 'order_workflow')
+        paid = wfstate == 'paid'
+        
+        if not paid :
             details = self.ppGetExpressCheckoutDetails(token)
 
             if payerid != details['PAYERID'] :
             details = self.ppGetExpressCheckoutDetails(token)
 
             if payerid != details['PAYERID'] :
@@ -401,7 +407,7 @@ class PrintOrder(PortalContent, DefaultDublinCoreImpl) :
                     wtool = getUtilityByInterfaceName('Products.CMFCore.interfaces.IWorkflowTool')
                     wtool.doActionFor( self
                                      , 'paypal_pay'
                     wtool = getUtilityByInterfaceName('Products.CMFCore.interfaces.IWorkflowTool')
                     wtool.doActionFor( self
                                      , 'paypal_pay'
-                                     , wf_id='jma_registration_workflow'
+                                     , wf_id='order_workflow'
                                      , comments='Paiement par PayPal')
                     return True
             return False
                                      , comments='Paiement par PayPal')
                     return True
             return False
@@ -415,153 +421,7 @@ class PrintOrder(PortalContent, DefaultDublinCoreImpl) :
     security.declareProtected(ManagePortal, 'getPPLog')
     def getPPLog(self) :
         return self._paypalLog
     security.declareProtected(ManagePortal, 'getPPLog')
     def getPPLog(self) :
         return self._paypalLog
-
-
-    
-    # security.declareProtected(View, 'getPaymentRequest')
-    # def getPaymentRequest(self) :
-    #   config = _getCyberplusConfig()
-    #   requester = CyberplusRequester(config)
-    #   hereurl = self.absolute_url()
-    #   amount = self.price + self.shippingFees
-    #   amount = amount.getValues()['taxed']
-    #   amount = amount * 100
-    #   amount = str(int(round(amount, 0)))
-    #   pptool = getToolByName(self, 'portal_photo_print')
-    #   transaction_id = pptool.getNextTransactionId()
-    #   
-    #   userLanguages = getPreferredLanguages(self)
-    #   for pref in userLanguages :
-    #       lang = pref.split('-')[0]
-    #       if lang in CYBERPLUS_LANGUAGES :
-    #           break
-    #   else :
-    #       lang = 'en'
-    #   
-    #   options = {  'amount': amount
-    #               ,'cancel_return_url'        : '%s/paymentCancelHandler' % hereurl
-    #               ,'normal_return_url'        : '%s/paymentManualResponseHandler' % hereurl
-    #               ,'automatic_response_url'   :'%s/paymentAutoResponseHandler' % hereurl
-    #               ,'transaction_id'           : transaction_id
-    #               ,'order_id'                 : self.getId()
-    #               ,'language'                 : lang
-    #              }
-    #   req = requester.generateRequest(options)
-    #   return req
-    # 
-    # def _decodeCyberplusResponse(self, form) :
-    #   config = _getCyberplusConfig()
-    #   responder = CyberplusResponder(config)
-    #   response = responder.getResponse(form)
-    #   return response
-    # 
-    # def _compareWithAutoResponse(self, manu) :
-    #   keys = manu.keys()
-    #   auto = self._paymentResponse
-    #   autoKeys = auto.keys()
-    #   if len(keys) != len(autoKeys) :
-    #       console.warn('Manual has not the same keys.\nauto: %r\nmanual: %r' % \
-    #           (sorted(autoKeys), sorted(keys)))
-    #   else :
-    #       for k, v in manu.items() :
-    #           if not auto.has_key(k) :
-    #               console.warn('%r field only found in manual response.' % k)
-    #           else :
-    #               if v != auto[k] :
-    #                   console.warn('data mismatch for %r\nauto: %r\nmanual: %r' % (k, auto[k], v))
-    # 
-    # def _checkOrderId(self, response) :
-    #   expected = self.getId()
-    #   assert expected == response['order_id'], \
-    #       "Cyberplus response transaction_id doesn't match the order object:\n" \
-    #       "expected: %s\n" \
-    #       "found: %s" % (expected, response['transaction_id'])
-    
-    # def _executeOrderWfTransition(self, response) :
-    #   if CyberplusResponder.transactionAccepted(response) :
-    #       wfaction = 'auto_accept_payment'
-    #   elif CyberplusResponder.transactionRefused(response) :
-    #       self.resetCopiesCounters()
-    #       wfaction = 'auto_refuse_payment'
-    #   elif CyberplusResponder.transactionCanceled(response) :
-    #       wfaction = 'auto_cancel_order'
-    #   else :
-    #       # transaction failed
-    #       wfaction = 'auto_transaction_failed'
-    # 
-    #   wtool = getToolByName(self, 'portal_workflow')
-    #   wf = wtool.getWorkflowById('order_workflow')
-    #   tdef = wf.transitions.get(wfaction)
-    #   wf._changeStateOf(self, tdef)
-    #   wtool._reindexWorkflowVariables(self)
-    
-    # security.declarePublic('paymentAutoResponseHandler')
-    # @postonly
-    # def paymentAutoResponseHandler(self, REQUEST) :
-    #   """\
-    #   Handle cyberplus payment auto response.
-    #   """
-    #   response = self._decodeCyberplusResponse(REQUEST.form)
-    #   self._checkOrderId(response)
-    #   self._paymentResponse.update(response)
-    #   self._executeOrderWfTransition(response)
-    # 
-    # @postonly
-    # def paymentManualResponseHandler(self, REQUEST) :
-    #   """\
-    #   Handle cyberplus payment manual response.
-    #   """
-    #   response = self._decodeCyberplusResponse(REQUEST.form)
-    #   self._checkOrderId(response)
-    #   
-    #   autoResponse = self._paymentResponse
-    #   if not autoResponse :
-    #       console.warn('Manual response handled before auto response at %s' % '/'.join(self.getPhysicalPath()))
-    #       self._paymentResponse.update(response)
-    #       self._executeOrderWfTransition(response)
-    #   else :
-    #       self._compareWithAutoResponse(response)
-    #       
-    #   url = '%s?%s' % (self.absolute_url(),
-    #                   make_query(portal_status_message=translate('Your payment is complete.', self).encode('utf-8'))
-    #                   )
-    #   return REQUEST.RESPONSE.redirect(url)
-    # 
-    # @postonly
-    # def paymentCancelHandler(self, REQUEST) :
-    #   """\
-    #   Handle cyberplus cancel response.
-    #   This handler can be invoqued in two cases:
-    #   - the user cancel the payment form
-    #   - the payment transaction has been refused
-    #   """
-    #   response = self._decodeCyberplusResponse(REQUEST.form)
-    #   self._checkOrderId(response)
-    #   
-    #   if self._paymentResponse :
-    #       # normaly, it happens when the transaction is refused by cyberplus.
-    #       self._compareWithAutoResponse(response)
-    # 
-    #   
-    #   if CyberplusResponder.transactionRefused(response) :
-    #       if not self._paymentResponse :
-    #           console.warn('Manual response handled before auto response at %s' % '/'.join(self.getPhysicalPath()))
-    #           self._paymentResponse.update(response)
-    #           self._executeOrderWfTransition(response)
-    #       
-    #       msg = 'Your payment has been refused.'
-    # 
-    #   else :
-    #       self._executeOrderWfTransition(response)
-    #       msg = 'Your payment has been canceled. You will be able to pay later.'
-    # 
-    #   url = '%s?%s' % (self.absolute_url(),
-    #                   make_query(portal_status_message= \
-    #                   translate(msg, self).encode('utf-8'))
-    #                   )
-    #   return REQUEST.RESPONSE.redirect(url)
         
         
-    
     def getCustomerSummary(self) :
         ' '
         return {'quantity':self.quantity,
     def getCustomerSummary(self) :
         ' '
         return {'quantity':self.quantity,