def test_shipping_gross_money(self):
        adapter = IShoppingSite(self.portal)
        adapter.shipping_method = mock.Mock(return_value=None)
        self.assertIsNone(adapter.shipping_gross_money())

        adapter.get_shipping_gross_money = mock.Mock()
        adapter.shipping_method = mock.Mock(return_value={'uuid': 'UUID'})
        adapter.shipping_gross_money()
        adapter.get_shipping_gross_money.assert_called_with('UUID')
    def shipping_methods(self):
        """Returns list of dictionary of shipping methods

        :rtype: list
        """
        shopping_site = IShoppingSite(self.context)
        default_charset = getattr(getattr(getToolByName(
            self.context, 'portal_properties'), 'site_properties'), 'default_charset', 'utf-8')
        res = []
        for brain in shopping_site.shipping_methods():
            uuid = brain.UID
            orig_uuid = shopping_site.shipping_method()['uuid']

            if uuid == orig_uuid:
                shipping_gross_money = shopping_site.shipping_gross_money()
            else:
                shipping_gross_money = shopping_site.get_shipping_gross_money(uuid)

            if shipping_gross_money.amount == 0.0:
                title = brain.Title
            else:
                title = '{}  {}'.format(brain.Title, shopping_site.format_money(shipping_gross_money).encode(default_charset))

            res.append({
                'description': brain.Description,
                'checked': uuid == orig_uuid,
                'title': title,
                'uuid': uuid,
            })

        return res
    def test_total(self):
        adapter = IShoppingSite(self.portal)
        adapter.articles_total = mock.Mock(return_value=self.money('2.00'))
        self.assertEqual(adapter.total(), self.money('2.00'))

        adapter.shipping_gross_money = mock.Mock(return_value=self.money('10.00'))
        self.assertEqual(adapter.total(), self.money('12.00'))
    def test_shipping_net_money(self):
        adapter = IShoppingSite(self.portal)
        self.assertIsNone(adapter.shipping_net_money())

        adapter.shipping_gross_money = mock.Mock(return_value=self.money('10.00'))
        adapter.shipping_vat_money = mock.Mock(return_value=self.money('2.40'))
        self.assertEqual(adapter.shipping_net_money(), self.money('7.60'))
    def test_shipping_vat_money(self):
        adapter = IShoppingSite(self.portal)
        self.assertIsNone(adapter.shipping_vat_money())

        adapter.shipping_gross_money = mock.Mock(return_value=self.money('10.00'))
        adapter.shipping_method = mock.Mock(return_value={'vat_rate': 24.0})
        self.assertEqual(adapter.shipping_vat_money(), self.money('2.40'))
 def test_locale_shipping_gross(self):
     adapter = IShoppingSite(self.portal)
     adapter.shipping_gross_money = mock.Mock(return_value=self.money('10.00'))
     self.assertEqual(adapter.locale_shipping_gross(), u'10.00 €')
def notify_ordered(context, event):
    if event.action == 'ordered':
        shopping_site = IShoppingSite(context)
        adapter = IOrderAdapter(context)
        portal = shopping_site.portal()
        email_from_address = getUtility(IRegistry)['collective.cart.shopping.notification_cc_email'] or portal.getProperty('email_from_address')

        billing = shopping_site.get_address('billing')
        default_charset = getattr(getattr(getToolByName(context, 'portal_properties'), 'site_properties'), 'default_charset', 'utf-8')
        email_charset = getUtility(ISiteRoot).getProperty('email_charset', 'utf-8')
        subject = context.translate(_(u'order-number', u'Order Number: ${number}', mapping={'number': context.id}))
        utility = getUtility(IUnicodeUtility)
        mfrom = u'"{}" <{}>'.format(utility.safe_unicode(shopping_site.shop().title), email_from_address)
        host = getToolByName(context, 'MailHost')

        underline = '=' * 28
        billing_address = utility.address(billing)
        if shopping_site.billing_same_as_shipping():
            shipping_address = billing_address
        else:
            shipping = shopping_site.get_address('shipping')
            shipping_address = utility.address(shipping)
        articles = shopping_site.cart_article_listing()
        for article in articles:
            subtotal = article['gross'] * article['quantity']
            article.update({'subtotal': shopping_site.format_money(subtotal)})
        shipping_method_title = hasattr(
            adapter.shipping_method(), 'Title') and adapter.shipping_method().Title.decode(default_charset) or u''

        items = shopping_site.cart().copy()
        for key in ['articles', 'billing_same_as_shipping', 'shipping_method', 'billing', 'shipping']:
            if key in items:
                del items[key]

        items.update({
            'number': context.id,
            'underline': underline,
            'billing_address': billing_address,
            'shipping_address': shipping_address,
            'articles': articles,
            'shipping_method_title': shipping_method_title,
            'is_shipping_free': shopping_site.shipping_gross_money().amount == 0.0,
            'shipping_gross': shopping_site.locale_shipping_gross(),
            'total': shopping_site.locale_total(),
        })

        message_to_customer = context.unrestrictedTraverse('@@to-customer-order-mail-template')(**items)
        mto_customer = u'"{}" <{}>'.format(utility.fullname(billing), billing['email'])
        subject_to_customer = subject

        message_to_shop = context.unrestrictedTraverse('@@to-shop-order-mail-template')(**items)
        mto_shop = mfrom
        subject_to_shop = subject

        try:
            host.send(message_to_customer, mto_customer, mfrom, subject=subject_to_customer, charset=email_charset)
            host.send(message_to_shop, mto_shop, mfrom, subject=subject_to_shop, charset=email_charset)

        except:
            message = _(u'order-processed-but',
                default=u'The order was processed but we could not send e-mail to you successfully. Please consult the shop owner.')
            IStatusMessage(context.REQUEST).addStatusMessage(message, type='warn')