Add Metatroncube corporate website theme

This commit is contained in:
metatroncubeswdev 2026-08-31 11:12:13 -04:00
parent 27778a7901
commit 29bf042efb
13 changed files with 1020 additions and 0 deletions

View File

@ -0,0 +1,2 @@
from . import controllers
from . import models

View File

@ -0,0 +1,33 @@
{
"name": "Metatroncube Corporate Website",
"version": "17.0.1.0.0",
"category": "Website/Theme",
"summary": "Corporate website pages and customer support intake for Metatroncube",
"author": "Metatroncube Software Solutions",
"license": "LGPL-3",
"depends": [
"crm",
"portal",
"project",
"website",
"website_crm",
"website_form_project",
"website_hr_recruitment",
"mcs_appointment_booking",
],
"data": [
"security/security.xml",
"security/ir.model.access.csv",
"data/sequence_data.xml",
"views/support_ticket_views.xml",
"views/website_templates.xml",
"views/website_menus.xml",
],
"assets": {
"web.assets_frontend": [
"mcs_corporate_website/static/src/scss/corporate_website.scss",
],
},
"installable": True,
"application": False,
}

View File

@ -0,0 +1 @@
from . import main

View File

@ -0,0 +1,132 @@
from odoo import fields, http
from odoo.http import request
class McsCorporateWebsite(http.Controller):
def _render(self, template, values=None):
values = values or {}
values.update(
{
"mcs_services": self._services(),
"mcs_contact": self._contact(),
}
)
return request.render(template, values)
def _contact(self):
return {
"phone": "+1-647-679-7651",
"email": "info@metatroncubesolutions.com",
"location": "Waterloo, Ontario Canada",
}
def _services(self):
return [
{
"key": "website",
"name": "Website Development",
"summary": "Fast, responsive, SEO-ready websites built around conversion and maintainability.",
"image": "https://metatroncubesolutions.com/assets/images/services/service/img-1.webp",
},
{
"key": "mobile",
"name": "Mobile Application Development",
"summary": "Reliable mobile and web applications for operational workflows and customer products.",
"image": "https://metatroncubesolutions.com/assets/images/services/service/img-2.webp",
},
{
"key": "design",
"name": "Graphic Designing",
"summary": "Brand systems, visual campaigns, and assets that make digital experiences consistent.",
"image": "https://metatroncubesolutions.com/assets/images/services/service/img-3.webp",
},
{
"key": "ux",
"name": "UI / UX Designing",
"summary": "Product flows, prototypes, and interfaces designed for clarity and repeated use.",
"image": "https://metatroncubesolutions.com/assets/images/services/service/img-4.webp",
},
{
"key": "seo",
"name": "SEO & Content Writing",
"summary": "Technical SEO, search content, and positioning that improves qualified discovery.",
"image": "https://metatroncubesolutions.com/assets/images/services/service/img-5.webp",
},
{
"key": "marketing",
"name": "Digital Marketing",
"summary": "Campaign strategy, performance tracking, and content programs for measurable growth.",
"image": "https://metatroncubesolutions.com/assets/images/services/service/img-6.webp",
},
{
"key": "erp",
"name": "ERP Development & Implementation",
"summary": "Custom ERP and Odoo implementation across finance, sales, HR, inventory, and delivery.",
"image": "https://metatroncubesolutions.com/assets/images/services/erp/card-img.webp",
},
]
@http.route(["/", "/home"], type="http", auth="public", website=True)
def home(self, **kwargs):
return self._render("mcs_corporate_website.page_home")
@http.route(["/services"], type="http", auth="public", website=True)
def services(self, **kwargs):
return self._render("mcs_corporate_website.page_services")
@http.route(["/about"], type="http", auth="public", website=True)
def about(self, **kwargs):
return self._render("mcs_corporate_website.page_about")
@http.route(["/portfolio"], type="http", auth="public", website=True)
def portfolio(self, **kwargs):
return self._render("mcs_corporate_website.page_portfolio")
@http.route(["/support"], type="http", auth="public", website=True)
def support(self, **kwargs):
return self._render("mcs_corporate_website.page_support")
@http.route(["/contact"], type="http", auth="public", website=True)
def contact(self, **kwargs):
return self._render("mcs_corporate_website.page_contact")
@http.route(["/privacy"], type="http", auth="public", website=True)
def privacy(self, **kwargs):
return self._render("mcs_corporate_website.page_privacy")
@http.route(["/support/submit"], type="http", auth="public", website=True, methods=["POST"])
def submit_support(self, **post):
ticket = request.env["mcs.support.ticket"].sudo().create(
{
"subject": (post.get("subject") or "").strip(),
"customer_name": (post.get("customer_name") or "").strip(),
"customer_email": (post.get("customer_email") or "").strip(),
"customer_phone": (post.get("customer_phone") or "").strip(),
"service_area": post.get("service_area") or "general",
"priority": post.get("priority") or "0",
"description": (post.get("description") or "").strip(),
}
)
return request.redirect("/support/thanks/%s" % ticket.access_token)
@http.route(["/support/thanks/<string:token>"], type="http", auth="public", website=True)
def support_thanks(self, token, **kwargs):
ticket = request.env["mcs.support.ticket"].sudo().search([("access_token", "=", token)], limit=1)
if not ticket:
return request.not_found()
return self._render("mcs_corporate_website.page_support_thanks", {"ticket": ticket})
@http.route(["/contact/submit"], type="http", auth="public", website=True, methods=["POST"])
def submit_contact(self, **post):
request.env["crm.lead"].sudo().create(
{
"name": (post.get("subject") or "Website enquiry").strip(),
"contact_name": (post.get("customer_name") or "").strip(),
"email_from": (post.get("customer_email") or "").strip(),
"phone": (post.get("customer_phone") or "").strip(),
"description": (post.get("message") or "").strip(),
"type": "lead",
"date_open": fields.Datetime.now(),
}
)
return self._render("mcs_corporate_website.page_contact_thanks")

View File

@ -0,0 +1,9 @@
<odoo>
<record id="seq_mcs_support_ticket" model="ir.sequence">
<field name="name">MCS Support Ticket</field>
<field name="code">mcs.support.ticket</field>
<field name="prefix">MCS-SUP-</field>
<field name="padding">5</field>
<field name="company_id" eval="False"/>
</record>
</odoo>

View File

@ -0,0 +1 @@
from . import support_ticket

View File

@ -0,0 +1,97 @@
from uuid import uuid4
from odoo import api, fields, models
class McsSupportTicket(models.Model):
_name = "mcs.support.ticket"
_description = "Metatroncube Support Ticket"
_inherit = ["mail.thread", "mail.activity.mixin"]
_order = "priority desc, create_date desc"
name = fields.Char(default="New", readonly=True, copy=False, tracking=True)
subject = fields.Char(required=True, tracking=True)
customer_name = fields.Char(required=True)
customer_email = fields.Char(required=True)
customer_phone = fields.Char()
partner_id = fields.Many2one("res.partner", string="Customer", tracking=True)
company_id = fields.Many2one(
"res.company",
default=lambda self: self.env.company,
required=True,
tracking=True,
)
service_area = fields.Selection(
[
("website", "Website Development"),
("mobile", "Mobile Application"),
("erp", "ERP / Odoo"),
("seo", "SEO / Content"),
("marketing", "Digital Marketing"),
("design", "Design / Branding"),
("general", "General Support"),
],
default="general",
required=True,
tracking=True,
)
priority = fields.Selection(
[
("0", "Normal"),
("1", "High"),
("2", "Urgent"),
],
default="0",
tracking=True,
)
state = fields.Selection(
[
("new", "New"),
("in_progress", "In Progress"),
("waiting", "Waiting on Customer"),
("resolved", "Resolved"),
("closed", "Closed"),
],
default="new",
required=True,
tracking=True,
)
description = fields.Text(required=True)
access_token = fields.Char(default=lambda self: uuid4().hex, readonly=True, copy=False)
@api.model_create_multi
def create(self, vals_list):
for vals in vals_list:
if vals.get("name", "New") == "New":
vals["name"] = self.env["ir.sequence"].next_by_code("mcs.support.ticket") or "New"
if not vals.get("partner_id") and vals.get("customer_email"):
vals["partner_id"] = self._find_or_create_partner(vals)
return super().create(vals_list)
@api.model
def _find_or_create_partner(self, vals):
email = (vals.get("customer_email") or "").strip()
partner = self.env["res.partner"].sudo().search([("email", "=", email)], limit=1)
if partner:
return partner.id
partner = self.env["res.partner"].sudo().create(
{
"name": vals.get("customer_name") or email,
"email": email,
"phone": vals.get("customer_phone"),
"company_id": vals.get("company_id") or self.env.company.id,
}
)
return partner.id
def action_start(self):
self.write({"state": "in_progress"})
def action_waiting(self):
self.write({"state": "waiting"})
def action_resolve(self):
self.write({"state": "resolved"})
def action_close(self):
self.write({"state": "closed"})

View File

@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_mcs_support_ticket_user,mcs.support.ticket.user,model_mcs_support_ticket,mcs_corporate_website.group_mcs_website_support_user,1,1,1,0
access_mcs_support_ticket_manager,mcs.support.ticket.manager,model_mcs_support_ticket,mcs_corporate_website.group_mcs_website_support_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_mcs_support_ticket_user mcs.support.ticket.user model_mcs_support_ticket mcs_corporate_website.group_mcs_website_support_user 1 1 1 0
3 access_mcs_support_ticket_manager mcs.support.ticket.manager model_mcs_support_ticket mcs_corporate_website.group_mcs_website_support_manager 1 1 1 1

View File

@ -0,0 +1,12 @@
<odoo>
<record id="group_mcs_website_support_user" model="res.groups">
<field name="name">Website Support User</field>
<field name="category_id" ref="base.module_category_website"/>
</record>
<record id="group_mcs_website_support_manager" model="res.groups">
<field name="name">Website Support Manager</field>
<field name="category_id" ref="base.module_category_website"/>
<field name="implied_ids" eval="[(4, ref('group_mcs_website_support_user'))]"/>
</record>
</odoo>

View File

@ -0,0 +1,305 @@
.mcs-site {
--mcs-ink: #101828;
--mcs-muted: #5b6474;
--mcs-line: #d8dee8;
--mcs-blue: #155eef;
--mcs-blue-dark: #0f2f6f;
--mcs-surface: #f5f8fc;
color: var(--mcs-ink);
background: #ffffff;
.container {
max-width: 1180px;
}
h1,
h2,
h3 {
letter-spacing: 0;
}
h1 {
font-size: clamp(2.4rem, 4rem, 4rem);
line-height: 1.02;
font-weight: 750;
}
h2 {
font-size: 2rem;
line-height: 1.18;
font-weight: 720;
}
h3 {
font-size: 1.15rem;
line-height: 1.3;
font-weight: 700;
}
p {
color: var(--mcs-muted);
line-height: 1.7;
}
.btn {
border-radius: 6px;
font-weight: 700;
padding: 0.75rem 1.05rem;
}
}
.mcs-hero {
position: relative;
min-height: 680px;
display: flex;
align-items: center;
overflow: hidden;
color: #ffffff;
background: #07111f;
&::before {
content: "";
position: absolute;
inset: 0;
background: linear-gradient(90deg, rgba(7, 17, 31, 0.94), rgba(7, 17, 31, 0.72), rgba(7, 17, 31, 0.18));
z-index: 1;
}
}
.mcs-hero__media {
position: absolute;
inset: 0;
img {
width: 100%;
height: 100%;
object-fit: cover;
object-position: center right;
opacity: 0.86;
}
}
.mcs-hero__content {
position: relative;
z-index: 2;
max-width: 720px;
padding: 96px 0;
.mcs-lead {
max-width: 650px;
margin: 24px 0 0;
color: rgba(255, 255, 255, 0.82);
font-size: 1.18rem;
}
}
.mcs-eyebrow {
margin: 0 0 12px;
color: var(--mcs-blue);
font-size: 0.78rem;
font-weight: 800;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.mcs-actions {
display: flex;
flex-wrap: wrap;
gap: 12px;
margin-top: 28px;
}
.mcs-band {
padding: 76px 0;
}
.mcs-band--quiet {
background: var(--mcs-surface);
}
.mcs-section-head {
display: flex;
justify-content: space-between;
align-items: end;
gap: 24px;
margin-bottom: 28px;
h2 {
max-width: 760px;
margin: 0;
}
}
.mcs-service-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 18px;
}
.mcs-service-grid--wide {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.mcs-service-card,
.mcs-portfolio-grid article,
.mcs-form,
.mcs-help-panel,
.mcs-metrics div {
border: 1px solid var(--mcs-line);
border-radius: 8px;
background: #ffffff;
}
.mcs-service-card {
overflow: hidden;
img {
width: 100%;
aspect-ratio: 16 / 9;
object-fit: cover;
background: var(--mcs-surface);
}
div {
padding: 22px;
}
p {
margin-bottom: 0;
}
a {
display: inline-flex;
margin-top: 12px;
font-weight: 700;
text-decoration: none;
}
}
.mcs-split {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(320px, 0.9fr);
gap: 42px;
align-items: center;
}
.mcs-metrics {
display: grid;
gap: 12px;
div {
padding: 20px;
}
strong {
display: block;
font-size: 1.2rem;
}
span {
display: block;
color: var(--mcs-muted);
margin-top: 4px;
}
}
.mcs-rounded-image {
width: 100%;
border-radius: 8px;
object-fit: cover;
}
.mcs-cta {
background: #101828;
color: #ffffff;
h2 {
max-width: 760px;
margin: 0;
}
}
.mcs-page-head {
padding: 96px 0 56px;
background: #101828;
color: #ffffff;
p:not(.mcs-eyebrow) {
max-width: 760px;
color: rgba(255, 255, 255, 0.78);
font-size: 1.12rem;
}
}
.mcs-portfolio-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 18px;
article {
padding: 26px;
}
}
.mcs-form-layout {
display: grid;
grid-template-columns: minmax(0, 1fr) 360px;
gap: 24px;
align-items: start;
}
.mcs-form,
.mcs-help-panel {
padding: 26px;
}
.mcs-form {
label {
font-weight: 700;
color: var(--mcs-ink);
}
.form-control,
.form-select {
border-radius: 6px;
border-color: var(--mcs-line);
min-height: 44px;
}
textarea.form-control {
min-height: 160px;
}
}
.mcs-help-panel {
position: sticky;
top: 24px;
}
@media (max-width: 991.98px) {
.mcs-site h1 {
font-size: 2.5rem;
}
.mcs-hero {
min-height: 620px;
}
.mcs-service-grid,
.mcs-service-grid--wide,
.mcs-split,
.mcs-portfolio-grid,
.mcs-form-layout {
grid-template-columns: 1fr;
}
.mcs-section-head {
align-items: start;
flex-direction: column;
}
.mcs-help-panel {
position: static;
}
}

View File

@ -0,0 +1,88 @@
<odoo>
<record id="view_mcs_support_ticket_tree" model="ir.ui.view">
<field name="name">mcs.support.ticket.tree</field>
<field name="model">mcs.support.ticket</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="subject"/>
<field name="customer_name"/>
<field name="customer_email"/>
<field name="service_area"/>
<field name="priority"/>
<field name="state"/>
<field name="create_date"/>
</tree>
</field>
</record>
<record id="view_mcs_support_ticket_form" model="ir.ui.view">
<field name="name">mcs.support.ticket.form</field>
<field name="model">mcs.support.ticket</field>
<field name="arch" type="xml">
<form>
<header>
<button name="action_start" string="Start" type="object" class="btn-primary" invisible="state != 'new'"/>
<button name="action_waiting" string="Waiting on Customer" type="object" invisible="state not in ('new', 'in_progress')"/>
<button name="action_resolve" string="Resolve" type="object" invisible="state not in ('new', 'in_progress', 'waiting')"/>
<button name="action_close" string="Close" type="object" invisible="state not in ('resolved', 'waiting')"/>
<field name="state" widget="statusbar" statusbar_visible="new,in_progress,waiting,resolved,closed"/>
</header>
<sheet>
<div class="oe_title">
<h1><field name="name"/></h1>
<h2><field name="subject" placeholder="Support subject"/></h2>
</div>
<group>
<group>
<field name="customer_name"/>
<field name="customer_email"/>
<field name="customer_phone"/>
<field name="partner_id"/>
</group>
<group>
<field name="service_area"/>
<field name="priority"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
</group>
<notebook>
<page string="Request">
<field name="description" nolabel="1"/>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<record id="view_mcs_support_ticket_search" model="ir.ui.view">
<field name="name">mcs.support.ticket.search</field>
<field name="model">mcs.support.ticket</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
<field name="subject"/>
<field name="customer_name"/>
<field name="customer_email"/>
<filter string="Open" name="open" domain="[('state', 'not in', ['resolved', 'closed'])]"/>
<filter string="Urgent" name="urgent" domain="[('priority', '=', '2')]"/>
<group expand="0" string="Group By">
<filter string="State" name="group_state" context="{'group_by': 'state'}"/>
<filter string="Service Area" name="group_service_area" context="{'group_by': 'service_area'}"/>
</group>
</search>
</field>
</record>
<record id="action_mcs_support_ticket" model="ir.actions.act_window">
<field name="name">Support Tickets</field>
<field name="res_model">mcs.support.ticket</field>
<field name="view_mode">tree,form</field>
<field name="context">{'search_default_open': 1}</field>
</record>
<menuitem id="menu_mcs_website_root" name="Website Operations" sequence="55" groups="mcs_corporate_website.group_mcs_website_support_user"/>
<menuitem id="menu_mcs_support_ticket" name="Support Tickets" parent="menu_mcs_website_root" action="action_mcs_support_ticket" sequence="10"/>
</odoo>

View File

@ -0,0 +1,44 @@
<odoo>
<record id="menu_home" model="website.menu">
<field name="name">Home</field>
<field name="url">/</field>
<field name="parent_id" ref="website.main_menu"/>
<field name="sequence" type="int">5</field>
</record>
<record id="menu_services" model="website.menu">
<field name="name">Services</field>
<field name="url">/services</field>
<field name="parent_id" ref="website.main_menu"/>
<field name="sequence" type="int">10</field>
</record>
<record id="menu_portfolio" model="website.menu">
<field name="name">Portfolio</field>
<field name="url">/portfolio</field>
<field name="parent_id" ref="website.main_menu"/>
<field name="sequence" type="int">20</field>
</record>
<record id="menu_about" model="website.menu">
<field name="name">About</field>
<field name="url">/about</field>
<field name="parent_id" ref="website.main_menu"/>
<field name="sequence" type="int">30</field>
</record>
<record id="menu_careers" model="website.menu">
<field name="name">Careers</field>
<field name="url">/jobs</field>
<field name="parent_id" ref="website.main_menu"/>
<field name="sequence" type="int">40</field>
</record>
<record id="menu_support" model="website.menu">
<field name="name">Support</field>
<field name="url">/support</field>
<field name="parent_id" ref="website.main_menu"/>
<field name="sequence" type="int">50</field>
</record>
<record id="menu_contact" model="website.menu">
<field name="name">Contact</field>
<field name="url">/contact</field>
<field name="parent_id" ref="website.main_menu"/>
<field name="sequence" type="int">60</field>
</record>
</odoo>

View File

@ -0,0 +1,293 @@
<odoo>
<template id="layout_shell" name="MCS Corporate Shell">
<t t-call="website.layout">
<div id="wrap" class="mcs-site">
<t t-out="0"/>
</div>
</t>
</template>
<template id="page_home" name="Metatroncube Home">
<t t-call="mcs_corporate_website.layout_shell">
<section class="mcs-hero">
<div class="mcs-hero__media">
<img src="https://metatroncubesolutions.com/assets/images/home/banner/web/centre.webp" alt="Metatroncube digital delivery workspace"/>
</div>
<div class="container">
<div class="mcs-hero__content">
<p class="mcs-eyebrow">Corporate technology partner</p>
<h1>Metatroncube Software Solutions</h1>
<p class="mcs-lead">We design, build, and operate websites, business applications, ERP workflows, and digital growth systems for companies that need practical execution.</p>
<div class="mcs-actions">
<a class="btn btn-primary" href="/contact">Start a Project</a>
<a class="btn btn-outline-light" href="/support">Create Support Ticket</a>
</div>
</div>
</div>
</section>
<section class="mcs-band">
<div class="container">
<div class="mcs-section-head">
<p class="mcs-eyebrow">Capabilities</p>
<h2>Digital delivery from brand to business systems</h2>
</div>
<div class="mcs-service-grid">
<t t-foreach="mcs_services" t-as="service">
<article class="mcs-service-card">
<img t-att-src="service['image']" t-att-alt="service['name']"/>
<div>
<h3 t-esc="service['name']"/>
<p t-esc="service['summary']"/>
</div>
</article>
</t>
</div>
</div>
</section>
<section class="mcs-band mcs-band--quiet">
<div class="container">
<div class="mcs-split">
<div>
<p class="mcs-eyebrow">Operating model</p>
<h2>Strategy, delivery, and support under one workflow</h2>
<p>Customers can use the workplace site to reach the team, book appointments, and raise structured support tickets. Internally, requests are captured in Odoo so ownership and follow-up stay visible.</p>
</div>
<div class="mcs-metrics">
<div><strong>Web</strong><span>Corporate and ecommerce websites</span></div>
<div><strong>ERP</strong><span>Odoo and operational systems</span></div>
<div><strong>Growth</strong><span>SEO, content, design, campaigns</span></div>
</div>
</div>
</div>
</section>
<section class="mcs-band mcs-cta">
<div class="container">
<h2>Need delivery help or active project support?</h2>
<div class="mcs-actions">
<a class="btn btn-primary" href="/appointments">Book Consultation</a>
<a class="btn btn-secondary" href="/support">Open Support Ticket</a>
</div>
</div>
</section>
</t>
</template>
<template id="page_services" name="Metatroncube Services">
<t t-call="mcs_corporate_website.layout_shell">
<section class="mcs-page-head">
<div class="container">
<p class="mcs-eyebrow">Services</p>
<h1>Corporate digital services for launch, operations, and growth</h1>
<p>Metatroncube supports the full delivery path: discovery, design, engineering, automation, deployment, and ongoing support.</p>
</div>
</section>
<section class="mcs-band">
<div class="container">
<div class="mcs-service-grid mcs-service-grid--wide">
<t t-foreach="mcs_services" t-as="service">
<article class="mcs-service-card">
<img t-att-src="service['image']" t-att-alt="service['name']"/>
<div>
<h2 t-esc="service['name']"/>
<p t-esc="service['summary']"/>
<a t-att-href="'/contact?service=%s' % service['key']">Discuss this service</a>
</div>
</article>
</t>
</div>
</div>
</section>
</t>
</template>
<template id="page_about" name="About Metatroncube">
<t t-call="mcs_corporate_website.layout_shell">
<section class="mcs-page-head">
<div class="container">
<p class="mcs-eyebrow">About</p>
<h1>Built for companies that need dependable software execution</h1>
<p>Metatroncube Software Solutions works across Canada and India, combining product design, implementation discipline, and business operations experience.</p>
</div>
</section>
<section class="mcs-band">
<div class="container">
<div class="mcs-split">
<img class="mcs-rounded-image" src="https://metatroncubesolutions.com/assets/images/about/about.webp" alt="Metatroncube team and service overview"/>
<div>
<h2>What we focus on</h2>
<p>We help clients move from scattered tools and incomplete digital presence into clear, maintainable systems. The work spans websites, ERP, CRM, design, SEO, and customer engagement.</p>
<p>Our workplace brings project communication, customer support, scheduling, invoicing, and operational review into one Odoo-backed platform.</p>
</div>
</div>
</div>
</section>
</t>
</template>
<template id="page_portfolio" name="Metatroncube Portfolio">
<t t-call="mcs_corporate_website.layout_shell">
<section class="mcs-page-head">
<div class="container">
<p class="mcs-eyebrow">Portfolio</p>
<h1>Delivery categories we support</h1>
<p>A practical portfolio structure for prospects and customers to understand how Metatroncube can support their business.</p>
</div>
</section>
<section class="mcs-band">
<div class="container">
<div class="mcs-portfolio-grid">
<article><h2>Business Websites</h2><p>Corporate, service, ecommerce, and conversion-oriented sites with maintainable content structures.</p></article>
<article><h2>ERP Implementations</h2><p>Odoo workflows for sales, invoicing, project delivery, HR, inventory, and reporting.</p></article>
<article><h2>Product Interfaces</h2><p>Dashboards, customer portals, mobile workflows, and operational tools designed for daily use.</p></article>
<article><h2>Growth Systems</h2><p>SEO, content, campaign landing pages, analytics, and lead conversion workflows.</p></article>
</div>
</div>
</section>
</t>
</template>
<template id="page_support" name="Metatroncube Support">
<t t-call="mcs_corporate_website.layout_shell">
<section class="mcs-page-head">
<div class="container">
<p class="mcs-eyebrow">Customer support</p>
<h1>Create a support ticket</h1>
<p>Use this form for active project issues, website updates, ERP requests, access problems, or delivery follow-up.</p>
</div>
</section>
<section class="mcs-band">
<div class="container">
<div class="mcs-form-layout">
<form action="/support/submit" method="post" class="mcs-form">
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
<div class="row g-3">
<div class="col-12 col-md-6">
<label class="form-label">Name</label>
<input class="form-control" name="customer_name" required="required"/>
</div>
<div class="col-12 col-md-6">
<label class="form-label">Email</label>
<input class="form-control" type="email" name="customer_email" required="required"/>
</div>
<div class="col-12 col-md-6">
<label class="form-label">Phone</label>
<input class="form-control" name="customer_phone"/>
</div>
<div class="col-12 col-md-6">
<label class="form-label">Service Area</label>
<select class="form-select" name="service_area">
<option value="general">General Support</option>
<option value="website">Website Development</option>
<option value="mobile">Mobile Application</option>
<option value="erp">ERP / Odoo</option>
<option value="seo">SEO / Content</option>
<option value="marketing">Digital Marketing</option>
<option value="design">Design / Branding</option>
</select>
</div>
<div class="col-12 col-md-8">
<label class="form-label">Subject</label>
<input class="form-control" name="subject" required="required"/>
</div>
<div class="col-12 col-md-4">
<label class="form-label">Priority</label>
<select class="form-select" name="priority">
<option value="0">Normal</option>
<option value="1">High</option>
<option value="2">Urgent</option>
</select>
</div>
<div class="col-12">
<label class="form-label">Request Details</label>
<textarea class="form-control" name="description" rows="6" required="required"/>
</div>
</div>
<button class="btn btn-primary mt-4" type="submit">Submit Ticket</button>
</form>
<aside class="mcs-help-panel">
<h2>Before submitting</h2>
<p>Share the affected website, module, page, invoice, or project name. Include screenshots or links in the details field when useful.</p>
<a class="btn btn-secondary" href="/appointments">Book a call</a>
</aside>
</div>
</div>
</section>
</t>
</template>
<template id="page_support_thanks" name="Support Ticket Created">
<t t-call="mcs_corporate_website.layout_shell">
<section class="mcs-page-head">
<div class="container">
<p class="mcs-eyebrow">Ticket received</p>
<h1>Your support ticket has been created</h1>
<p>Reference: <strong t-esc="ticket.name"/></p>
<a class="btn btn-primary" href="/support">Create Another Ticket</a>
</div>
</section>
</t>
</template>
<template id="page_contact" name="Contact Metatroncube">
<t t-call="mcs_corporate_website.layout_shell">
<section class="mcs-page-head">
<div class="container">
<p class="mcs-eyebrow">Contact</p>
<h1>Talk to Metatroncube</h1>
<p>Send a project enquiry, ask for a proposal, or request a consultation.</p>
</div>
</section>
<section class="mcs-band">
<div class="container">
<div class="mcs-form-layout">
<form action="/contact/submit" method="post" class="mcs-form">
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
<div class="row g-3">
<div class="col-12 col-md-6"><label class="form-label">Name</label><input class="form-control" name="customer_name" required="required"/></div>
<div class="col-12 col-md-6"><label class="form-label">Email</label><input class="form-control" type="email" name="customer_email" required="required"/></div>
<div class="col-12 col-md-6"><label class="form-label">Phone</label><input class="form-control" name="customer_phone"/></div>
<div class="col-12 col-md-6"><label class="form-label">Subject</label><input class="form-control" name="subject" required="required"/></div>
<div class="col-12"><label class="form-label">Message</label><textarea class="form-control" name="message" rows="6" required="required"/></div>
</div>
<button class="btn btn-primary mt-4" type="submit">Send Enquiry</button>
</form>
<aside class="mcs-help-panel">
<h2>Contact details</h2>
<p><strong>Email:</strong> <span t-esc="mcs_contact['email']"/></p>
<p><strong>Phone:</strong> <span t-esc="mcs_contact['phone']"/></p>
<p><strong>Location:</strong> <span t-esc="mcs_contact['location']"/></p>
</aside>
</div>
</div>
</section>
</t>
</template>
<template id="page_contact_thanks" name="Contact Enquiry Received">
<t t-call="mcs_corporate_website.layout_shell">
<section class="mcs-page-head">
<div class="container">
<p class="mcs-eyebrow">Enquiry received</p>
<h1>Thank you for contacting Metatroncube</h1>
<p>The team will review your enquiry and follow up through the contact details provided.</p>
<a class="btn btn-primary" href="/">Back Home</a>
</div>
</section>
</t>
</template>
<template id="page_privacy" name="Metatroncube Privacy">
<t t-call="mcs_corporate_website.layout_shell">
<section class="mcs-page-head">
<div class="container">
<p class="mcs-eyebrow">Privacy</p>
<h1>Privacy and customer information</h1>
<p>Information submitted through this website is used to respond to enquiries, manage support requests, schedule appointments, and operate customer delivery workflows in Odoo.</p>
</div>
</section>
</t>
</template>
</odoo>