diff --git a/addons/event_sale/event_sale.py b/addons/event_sale/event_sale.py
index 8bacd37fc15..a8f73a3055f 100644
--- a/addons/event_sale/event_sale.py
+++ b/addons/event_sale/event_sale.py
@@ -29,14 +29,17 @@ class product(osv.osv):
'event_type_id': fields.many2one('event.type', 'Type of Event', help='Select event types so when we use this product in sales order lines, it will filter events of this type only.'),
}
- def onchange_event_ok(self, cr, uid, ids, event_ok, context=None):
- return {'value': {'type': event_ok and 'service' or False}}
+ def onchange_event_ok(self, cr, uid, ids, type, event_ok, context=None):
+ return {'value': {'type': event_ok and 'service' or type != 'service' and type or False}}
class sale_order_line(osv.osv):
_inherit = 'sale.order.line'
_columns = {
- 'event_id': fields.many2one('event.event', 'Event', help="Choose an event and it will automatically create a registration for this event."),
+ 'event_id': fields.many2one('event.event', 'Event',
+ help="Choose an event and it will automatically create a registration for this event."),
+ 'event_ticket_id': fields.many2one('event.event.ticket', 'Event Ticket',
+ help="Choose an event ticket and it will automatically create a registration for this event ticket."),
#those 2 fields are used for dynamic domains and filled by onchange
'event_type_id': fields.related('product_id','event_type_id', type='many2one', relation="event.type", string="Event Type"),
'event_ok': fields.related('product_id', 'event_ok', string='event_ok', type='boolean'),
@@ -73,9 +76,8 @@ class sale_order_line(osv.osv):
if context is None:
context = {}
registration_obj = self.pool.get('event.registration')
- sale_obj = self.pool.get('sale.order')
for order_line in self.browse(cr, uid, ids, context=context):
- if order_line.event_id.id:
+ if order_line.event_id:
dic = {
'name': order_line.order_id.partner_invoice_id.name,
'partner_id': order_line.order_id.partner_id.id,
@@ -84,9 +86,131 @@ class sale_order_line(osv.osv):
'phone': order_line.order_id.partner_id.phone,
'origin': order_line.order_id.name,
'event_id': order_line.event_id.id,
+ 'event_ticket_id': order_line.event_ticket_id and order_line.event_ticket_id.id or None,
}
- message = _("The registration has been created for event %s from the Sale Order %s. ") % (order_line.event_id.name, order_line.order_id.name)
+ print dic
+
+ if order_line.event_ticket_id:
+ if order_line.event_ticket_id.register_avail != 9999 and dic['nb_register'] > order_line.event_ticket_id.register_avail:
+ raise osv.except_osv(_('Error!'), _('There are not enough tickets available (%s) for %s' % (order_line.event_ticket_id.register_avail, order_line.event_ticket_id.name)))
+ message = _("The registration has been created for event %s with the ticket %s from the Sale Order %s. ") % (order_line.event_id.name, order_line.event_ticket_id.name, order_line.order_id.name)
+ else:
+ message = _("The registration has been created for event %s from the Sale Order %s. ") % (order_line.event_id.name, order_line.order_id.name)
+
context.update({'mail_create_nolog': True})
registration_id = registration_obj.create(cr, uid, dic, context=context)
registration_obj.message_post(cr, uid, [registration_id], body=message, context=context)
return super(sale_order_line, self).button_confirm(cr, uid, ids, context=context)
+
+ def onchange_event_ticket_id(self, cr, uid, ids, event_ticket_id=False, context=None):
+ price = event_ticket_id and self.pool.get("event.event.ticket").browse(cr, uid, event_ticket_id, context=context).price or False
+ return {'value': {'price_unit': price}}
+
+
+class event_event(osv.osv):
+ _inherit = 'event.event'
+
+ def _get_register_max(self, cr, uid, ids, field_name, arg, context=None):
+ result = dict.fromkeys(ids, 0)
+ for rec in self.browse(cr, uid, ids, context=context):
+ result[rec.id] = sum([ep.register_max for ep in rec.event_ticket_ids])
+ return result
+
+ _columns = {
+ 'website_published': fields.boolean('Available in the website'),
+ 'description_website': fields.html('Description for the website'),
+ 'event_ticket_ids': fields.one2many('event.event.ticket', "event_id", "Event Ticket"),
+ 'organizer_id': fields.many2one('res.partner', "Orgonizer"),
+ 'phone': fields.related('orgonizer_id', 'phone', type='char', string='Phone'),
+ 'email': fields.related('orgonizer_id', 'email', type='char', string='Email'),
+ 'register_max': fields.function(_get_register_max,
+ string='Maximum Registrations',
+ help="The maximum registration level is equal to the sum of the maximum registration of event ticket." +
+ "If you have too much registrations you are not able to confirm your event. (0 to ignore this rule )",
+ type='integer', store=True)
+ }
+
+ def check_registration_limits(self, cr, uid, ids, context=None):
+ for event in self.browse(cr, uid, ids, context=context):
+ if event.event_ticket_ids:
+ event.event_ticket_ids.check_registration_limits_before(0)
+ return super(event_event, self).check_registration_limits(cr, uid, ids, context=context)
+
+
+class event_ticket(osv.osv):
+ _name = 'event.event.ticket'
+
+ def _get_register(self, cr, uid, ids, fields, args, context=None):
+ """Get Confirm or uncofirm register value.
+ @param ids: List of Event Ticket registration type's id
+ @param fields: List of function fields(register_current and register_prospect).
+ @param context: A standard dictionary for contextual values
+ @return: Dictionary of function fields value.
+ """
+ res = {}
+ for event in self.browse(cr, uid, ids, context=context):
+ res[event.id] = {}
+ reg_open = reg_done = reg_draft =0
+ for registration in event.registration_ids:
+ if registration.state == 'open':
+ reg_open += registration.nb_register
+ elif registration.state == 'done':
+ reg_done += registration.nb_register
+ elif registration.state == 'draft':
+ reg_draft += registration.nb_register
+ for field in fields:
+ number = 0
+ if field == 'register_current':
+ number = reg_open
+ elif field == 'register_attended':
+ number = reg_done
+ elif field == 'register_prospect':
+ number = reg_draft
+ elif field == 'register_avail':
+ #the number of ticket is unlimited if the event.register_max field is not set.
+ #In that cas we arbitrary set it to 9999, it is used in the kanban view to special case the display of the 'subscribe' button
+ number = event.register_max - reg_open if event.register_max != 0 else 9999
+ res[event.id][field] = number
+ return res
+
+ _columns = {
+ 'name': fields.char('Name', size=64, required=True),
+ 'event_id': fields.many2one('event.event', "Event", required=True),
+ 'product_id': fields.many2one('product.product', 'Product', required=True, domain=[("event_type_id", "!=", False)]),
+ 'registration_ids': fields.one2many('event.registration', 'event_ticket_id', 'Registrations'),
+ 'deadline': fields.date("Sales End"),
+ 'price': fields.float('Price'),
+ 'register_max': fields.integer('Maximum Registrations'),
+ 'register_current': fields.function(_get_register, string='Current Registrations', type='integer', multi='register_numbers'),
+ 'register_avail': fields.function(_get_register, string='Available Registrations', type='integer', multi='register_numbers'),
+ 'register_prospect': fields.function(_get_register, string='Unconfirmed Registrations', type='integer', multi='register_numbers'),
+ 'register_attended': fields.function(_get_register, string='# of Participations', type='integer', multi='register_numbers'),
+ }
+
+ def check_registration_limits_before(self, cr, uid, ids, number, context=None):
+ for ticket in self.browse(cr, uid, ids, context=context):
+ if ticket.register_max:
+ if not ticket.register_avail:
+ raise osv.except_osv(_('Warning!'),_('No Tickets Available for "%s"' % ticket.name))
+ elif number + ticket.register_current > ticket.register_max:
+ raise osv.except_osv(_('Warning!'), _('There only %d tickets available for "%s"' % (ticket.register_avail, ticket.name)))
+ return True
+
+ def onchange_product_id(self, cr, uid, ids, product_id=False, context=None):
+ return {'value': {'price': self.pool.get("product.product").browse(cr, uid, product_id).list_price or 0}}
+
+
+class event_registration(osv.osv):
+ """Event Registration"""
+ _inherit= 'event.registration'
+ _columns = {
+ 'event_ticket_id': fields.many2one('event.event.ticket', 'Event Ticket'),
+ }
+
+ def registration_open(self, cr, uid, ids, context=None):
+ """ Open Registration
+ """
+ for registration in self.browse(cr, uid, ids, context=context):
+ if registration.event_ticket_id:
+ registration.event_ticket_id.check_registration_limits_before(1)
+ return super(event_registration, self).registration_open(cr, uid, ids, context=context)
diff --git a/addons/event_sale/event_sale_view.xml b/addons/event_sale/event_sale_view.xml
index cc00365c980..43d2fcde495 100644
--- a/addons/event_sale/event_sale_view.xml
+++ b/addons/event_sale/event_sale_view.xml
@@ -7,7 +7,7 @@
+ Organize your job board, promote your job announces and keep
+ track of application submissions easily. Follow every applicant
+ and build up a database of skills and profiles with indexed
+ documents.
+
+ Connect automatically to most famous job board websites;
+ linkedIn, Monster, Kraigslist, ... Every job position has a new
+ email address automatically assigned to route applications
+ automatically to the right job position.
+
+ Whether applicants contact you by email or using an online
+ form, you get all the data indexed automatically (resumes,
+ motivation letter) and you can answer in just a click, reusing
+ templates of answers.
+
+
+
+
+
+
+
+
Customize Your Recruitment Process
+
Define your own stages and interviewers
+
+
+ Use the kanban view and customize the steps of your recruitments
+ process; pre-qualification, first interview, second interview,
+ negociaiton, ...
+
+ Get accurate statistics on your recruitment pipeline. Get reports
+ to compare the performance of your different investments on
+ external job boards.
+
+
+
+
+
+
+
+
+
+
+
+
Streamline Your Recruitment Process
+
Index resumes, track applicants, search profiles
+
+
+
+
+
+ Follow applicants in your recruitment process with the smart
+ kanban view. Save time by automating some communications with
+ email templates.
+
+ Documents like resumes and motivation letters are indexed
+ automatically, allowing you to easily find for specific skills
+ and build up a database of profiles.
+
+
+
+
+
+
+
+
+
Integrated Surveys
+
Define your own online or offline surveys
+
+
+
+
+
+
+
+ Create your own interview canvas based on our best practices.
+ Use the survey designer to adapt questions to your own process.
+ Ask the applicant to fill in the survey online, or the
+ interviewer to use it during real interviews.
+
+
+
+
+
diff --git a/addons/project/static/description/index.html b/addons/project/static/description/index.html
index 2a1574c5d68..cd8deb1d0ec 100644
--- a/addons/project/static/description/index.html
+++ b/addons/project/static/description/index.html
@@ -42,7 +42,6 @@ allowing teams to optimize their job.
-Create enterprise-grade website with our super easy builder; no backend, everything
-is editable inline. Benefit from out-of-the-box business features; shop, events, blogs,
-jobs announces, "our team" pages, etc.
+ Create enterprise grade website with our super easy builder; no
+ backend, everything is editable inline. Benefit from
+ out-of-the-box business features; ecommerce, events, blogs,
+ jobs announces, our references, "our team" page, call-to-actions, etc.
Create your free website
@@ -66,6 +67,9 @@ jobs announces, "our team" pages, etc.
Whether it's for products descriptions, blogs or static pages,
you don't need to be a professioanl designer to create modern
and clean web pages.
+
+ Get rid of traditional WYSIWYG editors that does not allow to
+ design clean and mobile friendly pages.
@@ -98,8 +102,53 @@ jobs announces, "our team" pages, etc.
-
Multi-languages Without Pain
-
Automate updates and transaltions easily
+
A Great Mobile Experience
+
Responsive content on all pages
+
+
+
+
+
+
+
+ Get a mobile friendly website thanks to our responsive design
+ based on bootstrap. The layout of every page and content adapts
+ automatically to the screen size. (mobile phones, tablets, desktop)
+ You don't have to worry about mobile contents, it works by default.
+
+ Our building blocks allows to reuse responsive components to
+ structure your website pages, which is not possible with
+ traditional WYSIWYG editors.
+
+
+
+
+
+
+
+
Optimize your online presence efficiently
+
SEO tools at your finger tips
+
+
+ SEO tools are ready to use, with no configuration required.
+ OpenERP suggests keywords according to Google most searched
+ terms, Google Analytics tracks your shopping cart events,
+ sitemap and structuered content are created automatically for
+ Google indexation, etc.
+
+
+
+
+
+
+
+
+
+
+
+
+
Multilanguage Without Pain
+
Propagate changes and automate translation updates
@@ -109,13 +158,13 @@ jobs announces, "our team" pages, etc.
Get your website translated in multiple languages with no effort.
OpenERP proposes and propagates translations automatically
- across pages.
+ across pages, following what you edit on the master page.
Our translation "on demand" features allows you to benefit from
- professional translators to translate all your changes
+ professional translators to translate all your contents
automatically. Just change any part of your website (a new blog
- post, a new pages, updated products, ...) and the translated
- versions are updated automatically in around 32 hours.
+ post, new pages, updated products, ...) and the translated
+ versions are updated automatically in around 24 hours.
@@ -144,23 +193,49 @@ jobs announces, "our team" pages, etc.
-
+
-
Optimize your online presence efficiently
-
SEO tools at your finger tips
-
-
- SEO tools are ready to use, with no configuration required.
- OpenERP suggests keywords according to Google most searched
- terms, Google Analytics tracks your shopping cart events,
- sitemap and structuered content are created automatically for
- Google indexation, etc.
-
+ Edit the content bellow this line to adapt the default "page not found" page.
+
+
+
-
-
-
404: Page not found!
-
- The page you were looking for could not be
- found; it is possible you have typed the
- address incorrectly, but it has most
- probably been removed due to the recent
- website reorganisation.
-
- Maybe you were looking for one of these
- popular pages ?
-
+ The page you were looking for could not be
+ found; it is possible you have typed the
+ address incorrectly, but it has most
+ probably been removed due to the recent
+ website reorganisation.
+
+ Maybe you were looking for one of these
+ popular pages ?
+
+ Get your leads filled up automatically with your contact form
+ integration. This application allows a better qualification of
+ the lead which is perfect to link them to marketing campaigns.
+
+ Schedule, promote, sell and organize your events online with no
+ effort. Whether you organize meetings, conferences, trainings
+ or webinars, OpenERP gives you all the features you need to
+ manage all aspects of your event.
+
+ Drag & Drop well designed 'Building Blocks' to
+ create beautifull event pages that your customer will love.
+ Use pre-defined building blocks like; speakers, schedules,
+ social icons, etc.
+
+ OpenERP's unique 'edit inline' approach makes website
+ creation surprisingly easy. "Want to introduce a speaker? to
+ change the price of a ticket? to update a banner? promote sponsors?"
+ just click and change. What you see is what you get. Really.
+
+
+
+
+
+
+
+
+
+
+
+
+
Sell Tickets Online
+
Mass Mailing & Social Media Icons
+
+
+
+
+
+ Use the multi-ticketing feature to sell registrations to your
+ event. Events can be free or for a fee. Attendees can pay online
+ with a credit card or on invoice, based on your configuration.
+
+ Boost your sales with early-bird prices, special conditions for
+ members, or extra services with multiple tickets.
+
+
+
+
+
+
+
+
Promote Events Efficiently
+
Mass Mailing & Social Media Icons
+
+
+
+
+
+ Use the segmentation, the social network integration and mass
+ mailing features to promote your events to the right audience.
+ Setup automated emails to attendees to send them last minute
+ details.
+
+
+
+
+
+
+
+
A Clean Google Analytics Integration
+
Control your sales funnel with Google Analytics
+
+
+ Get a clear visibility of your sales funnel. OpenERP's Google
+ Analytics trackers are configured by default to track all kind of
+ events related to shopping carts, call-to-actions, etc.
+
+ As OpenERP marketing tools (mass mailing, campaigns, etc) are also
+ linked with Google Analytics, you get a 360° view of your business.
+
+
+
+
+
+
+
+
+
+
+
Designer-Friendly Themes
+
Designers love working on OpenERP
+
+
+ Themes are awesome and easy to design. You don't need to develop
+ to create new pages, themes or building blocks. We use a clean
+ HTML structure, a bootstrap
+ CSS and our modularity allows to distribute your themes easily.
+
+ The building block approach allows the website to stay clean
+ after the end-users start creating new contents.
+
+
+
+
+
+
+
+
+
+
+
+
+
Make Your Event More Visible
+
SEO tools at your finger tips
+
+
+
+
+
+
+
+ SEO tools are ready to use, with no configuration required.
+ OpenERP suggests keywords according to Google most searched
+ terms, Google Analytics tracks your shopping cart events,
+ sitemap are created automatically.
+
+ We even do structured content automatically to promote your
+ events and products efficiently in Google.
+
+
+
+
+
+
+
+
Leverage Social Media
+
Optimize: from Ads to Conversions
+
+
+ Create new landing pages easily with the OpenERP inline edition
+ feature. Send visitors of your different marketing campaigns to
+ event landing pages to optimize conversions.
+
+ Organize your job board, promote your job announces and keep
+ track of application submissions easily. Follow every applicant
+ and build up a database of skills and profiles.
+
+ Get a clean and professional look for your job annouces.
+ OpenERP's unique 'edit inline' approach makes website
+ and job descriptions creation surprisingly easy.
+
+ Drag & Drop well designed 'Building Blocks' to
+ create beautifull job descriptions and announces that
+ emphasizes the quality of your company.
+
+
+
+
+
+
+
+
+
+
+
+
+
Post Your Jobs on Best Job Boards
+
LinkedIn, Monster, Kraigslist, Careerbuilder,...
+
+
+
+
+
+ Connect automatically to most famous job board websites;
+ linkedIn, Monster, Kraigslist, ... Every job position has a new
+ email address automatically assigned to route applications
+ automatically to the right job position.
+
+ Whether applicants contact you by email or using an online
+ form, you get all the data indexed automatically (resumes,
+ motivation letter) and you can answer in just a click, reusing
+ templates of answers.
+
+
+
+
+
+
+
+
Customize Your Recruitment Process
+
Define your own stages and interviewers
+
+
+ Use the kanban view and customize the steps of your recruitments
+ process; pre-qualification, first interview, second interview,
+ negociaiton, ...
+
+ Get accurate statistics on your recruitment pipeline. Get reports
+ to compare the performance of your different investments on
+ external job boards.
+
+
+
+
+
+
+
+
+
+
+
+
Streamline Your Recruitment Process
+
Index resumes, track applicants, search profiles
+
+
+
+
+
+ Follow applicants in your recruitment process with the smart
+ kanban view. Save time by automating some communications with
+ email templates.
+
+ Documents like resumes and motivation letters are indexed
+ automatically, allowing you to easily find for specific skills
+ and build up a database of profiles.
+
+
+
+
+
+
+
+
+
Integrated Surveys
+
Define your own online or offline surveys
+
+
+
+
+
+
+
+ Create your own interview canvas based on our best practices.
+ Use the survey designer to adapt questions to your own process.
+ Ask the applicant to fill in the survey online, or the
+ interviewer to use it during real interviews.
+
+ Drag & Drop well designed 'Building Blocks' to
+ create beautifull blog posts that perfectly integrates images,
+ videos, call-to-actions, quotes, banners, etc.
+
+ With our unique 'edit inline' approach, you don't need
+ to be a designer to create awsome, good-looking, content. Each blog
+ post will look like it's designed by a professional designer.
+
+
+
+
+
+
+
+
+
+
+
+
+
Automated Translation by Professionals
+
Reach multi-languages audiences without Pain
+
+
+
+
+
+
+
+ Get your blog posts translated in multiple languages with no effort.
+ Our translation "on demand" feature allows you to benefit from
+ professional translators to translate all your changes
+ automatically. ($0.05 per word) Translated versions are updated
+ automatically once translated by professionals (around 32 hours).
+
+
+
+
+
+
+
+
Engage With Your Visitors
+
Live chat with your visitors in one click
+
+
+ The integrated live chat features allows you to start chatting in
+ real time with your visitors to get feedback on your recent posts
+ or get ideas to write new posts.
+
+ Engaging with your visitors is also a great way to convert visitors
+ into customers.
+
+
+
+
+
+
+
+
+
+
+
+
+
Build Visitors Loyalty
+
Social Media Integration and Easy Following
+
+
+
+
+
+ The one click follow button will allow visitors
+ to receive your blog posts by email with no effort, without
+ having to register. Social media icons allows visitors to share
+ your best blog posts easily.
+
+
+
+
+
+
+
+
Google Analytics Integration
+
Get visibility on the impact of each blog post
+
+
+ Get a clear visibility of your sales funnel. OpenERP's Google
+ Analytics trackers are configured by default to track all kind of
+ events related to shopping carts, call-to-actions, etc.
+
+ As OpenERP marketing tools (mass mailing, campaigns, etc) are also
+ linked with Google Analytics, you get a 360° view of your business.
+
+
+
+
+
+
+
+
+
+
+
Designer-Friendly Themes
+
Designers love working on OpenERP
+
+
+ Themes are awesome and easy to design. You don't need to develop
+ to create new pages, themes or building blocks. We use a clean
+ HTML structure, a bootstrap
+ CSS and our modularity allows to distribute your themes easily.
+
+ The building block approach allows the website to remain clean
+ after the end-users start creating new contents.
+
+
+
+
+
+
+
+
+
+
+
+
+
SEO Optimized Blog Posts
+
Attract new visitors with a good referencing
+
+
+
+
+
+
+
+ SEO tools are ready to use, with no configuration required.
+ OpenERP suggests keywords for your titles according to Google
+ most searched terms, Google Analytics tracks interrests of your
+ visitors, sitemap are created automatically for Google
+ indexation, etc.
+
+ We even do structured content automatically to promote your
+ product and events efficiently in Google.
+
+
+
+
+
+
+
+
Easy Access Rights
+
Adapt your publishing process to your own need
+
+
+
+
+
+
+
+ Not everyone requires the same access to your website.
+ Designers manage the layout of the site, editors approves content and
+ authors write that content. This lets you organize your publishing
+ process according to your needs.
+
+ Others access rights related to business objects (products, people,
+ events, etc) directly follows OpenERP's standard access right allowing
+ you to not have to configure them twice.
+
+
+
+
+
+
+
+
Built-in Comments
+
Engage with your readers
+
+
+ Your blog is your home, and comments provide a space for your
+ friends and followers to engage with your content. OpenERP's
+ comment tools give you everything you need to be a forum for
+ discussion and to moderate that discussion.
+
+ OpenERP eCommerce is unlike anything you have ever seen before.
+ It's at the same time full-featured, integrated with your
+ management software, fully customizable and super easy.
+
+ OpenERP's unique 'edit inline' approach makes website
+ and product pages creation surprisingly easy. "Want to change
+ the price of a product? or put it in bold? Want to add a banner
+ for a specific product?" just click and change. What you see is
+ what you get. Really.
+
+ Drag & Drop well designed 'Building Blocks' to
+ create beautifull product pages that your customer will love.
+
+
+
+
+
+
+
+
+
+
+
+
+
Increase Your Revenue Per Order
+
Do you want fries with that?
+
+
+
+
+
+ Use the built-in cross-selling feature helps you offer extra
+ products related to what the shopper put in his cart. (e.g.
+ accessories)
+
+ OpenERP's upselling algorythm allows you to show visitors
+ similar but more expensive products than the one in view, with
+ incentives like customer ratings. (social validation)
+
+ The inline editing feature allows you to easily change a price,
+ launch a promotion or fine tune the description of a product,
+ in a just a click.
+
+
+
+
+
+
+
+
A Clean Google Analytics Integration
+
Control your sales funnel with Google Analytics
+
+
+ Get a clear visibility of your sales funnel. OpenERP's Google
+ Analytics trackers are configured by default to track all kind of
+ events related to shopping carts, call-to-actions, etc.
+
+ As OpenERP marketing tools (mass mailing, campaigns, etc) are also
+ linked with Google Analytics, you get a 360° view of your business.
+
+
+
+
+
+
+
+
+
+
+
Target New Markets
+
Multi-languages Without Pain
+
+
+
+
+
+
+
+ Get your website translated in multiple languages with no effort.
+ OpenERP proposes and propagates translations automatically
+ across pages.
+
+ Our translation "on demand" features allows you to benefit from
+ professional translators to translate all your changes
+ automatically. Just change any part of your website (a new blog
+ post, a page modification, product descriptions, ...) and the translated
+ versions are updated automatically in around 32 hours.
+
+
+
+
+
+
+
+
Designer-Friendly Themes
+
Designers love working on OpenERP
+
+
+ Themes are awesome and easy to design. You don't need to develop
+ to create new pages, themes or building blocks. We use a clean
+ HTML structure, a bootstrap
+ CSS and our modularity allows to distribute your themes easily.
+
+ The building block approach allows the website to remain clean
+ after the end-users start creating new contents.
+
+
+
+
+
+
+
+
+
+
+
+
+
Acquire New Customers
+
SEO tools at your finger tips
+
+
+
+
+
+
+
+ SEO tools are ready to use, with no configuration required.
+ OpenERP suggests keywords according to Google most searched
+ terms, Google Analytics tracks your shopping cart events,
+ sitemap are created automatically for Google indexation, etc.
+
+ We even do structured content automatically to promote your
+ product and events efficiently in Google.
+
+
+
+
+
+
+
+
Leverage Social Media
+
Optimize: from Ads to Conversions
+
+
+ Create new landing pages easily with the OpenERP inline edition
+ feature. Send visitors of your different marketing campaigns to
+ specific landing pages to optimize conversions.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Manage a Resellers Network
+
Referencing, Lead Forward, Pricelists
+
+
+
+
+
+
+
+ Manage a reseller network to target new market, have local
+ presences or broaden your distribution. Give them access to your
+ reseller portal for an efficient collaboration.
+
+ Promote your resellers online, forward leads to resellers (with
+ built-in geolocalisation feature), define specific pricelists,
+ launch a loyalty program (offer specific discounts to your best
+ customers or resellers), etc.
+
+
+
+
+
+
+
+
+
Integrated vs Interfaced
+
+
+ Benefit from the power of OpenERP, in your online store: a
+ powerfull tax engine, flexible pricing structures, a real
+ inventory management solution, a reseller interface, support
+ for products with different behaviours; physical goods, events,
+ services, variants and options, etc.
+
+ You don't need to interface with your warehouse, sales or
+ accounting software. Everything is integrated with OpenERP. No
+ pain, real time.
+
+
+
+
+
diff --git a/addons/website_sale/website_sale.py b/addons/website_sale/website_sale.py
new file mode 100644
index 00000000000..b15dc29db3e
--- /dev/null
+++ b/addons/website_sale/website_sale.py
@@ -0,0 +1,69 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C)-2010 Tiny SPRL ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+from openerp.osv import osv, fields
+
+
+class product_pricelist(osv.osv):
+ _inherit = "product.pricelist"
+ _columns = {
+ 'code': fields.char('Promotionnal Code', size=64, required=True, translate=True),
+ }
+
+class product_product(osv.osv):
+ _inherit = "product.product"
+ _columns = {
+ 'website_published': fields.boolean('Available in the website'),
+ 'description_website': fields.html('Description for the website'),
+ }
+
+ def recommended_products(self, cr, uid, ids, context=None):
+ id = ids[0]
+ product_ids = []
+ query = """
+ SELECT sol.product_id
+ FROM sale_order_line as my
+ LEFT JOIN sale_order_line as sol
+ ON sol.order_id = my.order_id
+ WHERE my.product_id in (%s)
+ AND sol.product_id not in (%s)
+ GROUP BY sol.product_id
+ ORDER BY COUNT(sol.order_id) DESC
+ LIMIT 8
+ """
+ cr.execute(query, (id, id))
+ for p in cr.fetchall():
+ product_ids.append(p[0])
+
+ # search to apply access rules
+ product_ids = self.search(cr, uid, [("id", "in", product_ids)])
+ return self.browse(cr, uid, product_ids)
+
+ def img(self, cr, uid, ids, field='image_small', context=None):
+ return "/website/image?model=%s&field=%s&id=%s" % (self._name, field, ids[0])
+
+class sale_order(osv.osv):
+ _inherit = "sale.order"
+
+ def get_total_quantity(self, cr, uid, ids, context=None):
+ order = self.browse(cr, uid, ids[0], context=context)
+
+ return sum(l.product_uom_qty for l in (order.order_line or []))