[UPD] initial commit

This commit is contained in:
Madanil
2026-10-28 13:45:42 +07:00
commit b47e392df3
52 changed files with 5116 additions and 0 deletions

View File

@@ -0,0 +1,134 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- LIST VIEW HARI LIBUR & CUTI BERSAMA -->
<record id="view_freshservice_holiday_list" model="ir.ui.view">
<field name="name">freshservice.holiday.list</field>
<field name="model">freshservice.holiday</field>
<field name="arch" type="xml">
<list string="Daftar Hari Libur &amp; Cuti Bersama" default_order="date desc">
<header>
<button name="action_open_import_wizard"
string="Impor Excel"
type="object"
class="btn-primary"
icon="fa-upload"
display="always"
groups="gmn_freshservice.group_freshservice_manager"/>
<button name="action_download_template"
string="Download Template Excel"
type="object"
class="btn-secondary"
icon="fa-download"
display="always"
groups="gmn_freshservice.group_freshservice_manager"/>
<button name="action_populate_default_holidays"
string="Muat Libur Baku (2024-2026)"
type="object"
class="btn-outline-secondary"
icon="fa-calendar-check-o"
display="always"
groups="gmn_freshservice.group_freshservice_manager"/>
</header>
<field name="date" string="Tanggal Libur"/>
<field name="name" string="Nama Hari Libur / Deskripsi"/>
<field name="holiday_type"
widget="badge"
decoration-danger="holiday_type == 'public'"
decoration-info="holiday_type == 'joint_leave'"
decoration-warning="holiday_type == 'company'"/>
<field name="year" string="Tahun" optional="show"/>
<field name="notes" string="Catatan" optional="show"/>
<field name="active" widget="boolean_toggle" string="Aktif" optional="show"/>
</list>
</field>
</record>
<!-- FORM VIEW HARI LIBUR & CUTI BERSAMA -->
<record id="view_freshservice_holiday_form" model="ir.ui.view">
<field name="name">freshservice.holiday.form</field>
<field name="model">freshservice.holiday</field>
<field name="arch" type="xml">
<form string="Hari Libur &amp; Cuti Bersama">
<header>
<button name="action_open_import_wizard"
string="Impor Excel"
type="object"
class="btn-primary"
icon="fa-upload"/>
<button name="action_download_template"
string="Download Template Excel"
type="object"
class="btn-secondary"
icon="fa-download"/>
<button name="action_populate_default_holidays"
string="Muat Libur Baku (2024-2026)"
type="object"
class="btn-outline-secondary"
icon="fa-calendar-check-o"/>
</header>
<sheet>
<div class="oe_title">
<label for="name" string="Nama Hari Libur"/>
<h1>
<field name="name" placeholder="misal: Hari Raya Idul Fitri 1447 H"/>
</h1>
</div>
<group>
<group string="Waktu &amp; Klasifikasi">
<field name="date"/>
<field name="holiday_type" widget="radio"/>
<field name="year" readonly="1"/>
<field name="active" widget="boolean_toggle"/>
</group>
<group string="Keterangan &amp; Legalitas">
<field name="notes" placeholder="misal: SKB 3 Menteri No. 1017 Tahun 2024..."/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<!-- SEARCH VIEW HARI LIBUR & CUTI BERSAMA -->
<record id="view_freshservice_holiday_search" model="ir.ui.view">
<field name="name">freshservice.holiday.search</field>
<field name="model">freshservice.holiday</field>
<field name="arch" type="xml">
<search string="Cari Hari Libur">
<field name="name" string="Nama / Deskripsi"/>
<field name="date" string="Tanggal"/>
<field name="year" string="Tahun"/>
<filter name="filter_active" string="Aktif" domain="[('active', '=', True)]"/>
<filter name="filter_public" string="Hari Libur Nasional" domain="[('holiday_type', '=', 'public')]"/>
<filter name="filter_joint" string="Cuti Bersama" domain="[('holiday_type', '=', 'joint_leave')]"/>
<filter name="filter_company" string="Libur Khusus Perusahaan" domain="[('holiday_type', '=', 'company')]"/>
<separator/>
<filter name="filter_2026" string="Tahun 2026" domain="[('year', '=', 2026)]"/>
<filter name="filter_2025" string="Tahun 2025" domain="[('year', '=', 2025)]"/>
<filter name="filter_2024" string="Tahun 2024" domain="[('year', '=', 2024)]"/>
<group>
<filter name="group_by_year" string="Tahun" context="{'group_by': 'year'}"/>
<filter name="group_by_type" string="Jenis Libur" context="{'group_by': 'holiday_type'}"/>
</group>
</search>
</field>
</record>
<!-- ACTION WINDOW HARI LIBUR -->
<record id="action_freshservice_holiday" model="ir.actions.act_window">
<field name="name">Hari Libur &amp; Cuti Bersama</field>
<field name="res_model">freshservice.holiday</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_freshservice_holiday_search"/>
<field name="context">{'search_default_filter_active': 1, 'search_default_group_by_year': 1}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Belum ada data hari libur atau cuti bersama yang terdaftar.
</p>
<p>
Klik tombol <b>Muat Libur Baku (2024-2026)</b> untuk langsung memuat data hari libur nasional Indonesia,
atau klik <b>Impor Excel</b> untuk mengunggah jadwal hari libur custom perusahaan Anda.
</p>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,119 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- LIST VIEW STAGE LOGS -->
<record id="view_freshservice_ticket_stage_log_tree" model="ir.ui.view">
<field name="name">freshservice.ticket.stage.log.tree</field>
<field name="model">freshservice.ticket.stage.log</field>
<field name="arch" type="xml">
<list string="Audit Trail &amp; Status Duration"
decoration-danger="responsibility == 'internal' and is_active"
decoration-warning="responsibility == 'customer' and is_active"
decoration-muted="not is_active or responsibility in ('on_hold','third_party','internal_discussion','scheduled_meeting','external_activity','resolved_idle')">
<field name="ticket_id"/>
<field name="stage_name" widget="badge"/>
<field name="responsibility"
widget="badge"
decoration-danger="responsibility in ('internal','on_hold','internal_discussion')"
decoration-warning="responsibility == 'customer'"
decoration-info="responsibility == 'scheduled_meeting'"
decoration-muted="responsibility in ('third_party','external_activity','resolved_idle')"/>
<field name="actor_name"/>
<field name="actor_type"/>
<field name="start_date" string="Waktu Mulai (UTC)"/>
<field name="end_date" string="Waktu Selesai (UTC)"/>
<field name="working_duration_display" string="Jam Kerja (08:30-17:30)"/>
<field name="working_days_effective" string="Hari Kerja Efektif"/>
<field name="duration_display" string="Durasi Kalender"/>
<field name="is_active" widget="boolean_toggle"/>
</list>
</field>
</record>
<!-- FORM VIEW STAGE LOGS -->
<record id="view_freshservice_ticket_stage_log_form" model="ir.ui.view">
<field name="name">freshservice.ticket.stage.log.form</field>
<field name="model">freshservice.ticket.stage.log</field>
<field name="arch" type="xml">
<form string="Detail Audit Trail">
<sheet>
<group>
<group string="Informasi Status &amp; Tanggung Jawab">
<field name="ticket_id" readonly="1"/>
<field name="stage_name" readonly="1"/>
<field name="effective_status" readonly="1"/>
<field name="responsibility" readonly="1" string="Effective Responsibility"/>
<field name="automatic_responsibility" readonly="1"/>
<field name="actor_name" readonly="1"/>
<field name="actor_type" readonly="1"/>
</group>
<group string="Durasi Kerja Operasional (08:30-17:30 WIB)">
<field name="start_date" readonly="1" string="Waktu Mulai (UTC)"/>
<field name="end_date" readonly="1" string="Waktu Selesai (UTC)"/>
<field name="working_duration_display" readonly="1" string="Jam Kerja Efektif"/>
<field name="working_days_effective" readonly="1" string="Hari Kerja Efektif"/>
<field name="duration_display" readonly="1" string="Durasi Kalender"/>
<field name="is_active" readonly="1"/>
</group>
</group>
<group string="Klasifikasi &amp; Manual Override (Aturan F)">
<group>
<field name="delay_cause"/>
<field name="needs_verification"/>
<field name="classification_basis"/>
</group>
<group groups="gmn_freshservice.group_freshservice_manager">
<field name="override_responsibility"/>
<field name="override_source"/>
<field name="override_reviewer"/>
<field name="override_at"/>
</group>
</group>
<notebook>
<page string="Deskripsi Aktivitas">
<field name="activity_content" readonly="1"/>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<!-- SEARCH VIEW STAGE LOGS -->
<record id="view_freshservice_ticket_stage_log_search" model="ir.ui.view">
<field name="name">freshservice.ticket.stage.log.search</field>
<field name="model">freshservice.ticket.stage.log</field>
<field name="arch" type="xml">
<search string="Search Activity Logs">
<field name="ticket_id"/>
<field name="stage_name"/>
<field name="actor_name"/>
<filter name="filter_internal" string="Waiting on Us (Internal)" domain="[('responsibility', '=', 'internal')]"/>
<filter name="filter_customer" string="Waiting on User (Requester)" domain="[('responsibility', '=', 'customer')]"/>
<filter name="filter_on_hold" string="On Hold (SLA Paused)" domain="[('responsibility', '=', 'on_hold')]"/>
<filter name="filter_third_party" string="Waiting on Third Party (SLA Paused)" domain="[('responsibility', '=', 'third_party')]"/>
<filter name="filter_internal_discussion" string="Internal Discussion (SLA Paused)" domain="[('responsibility', '=', 'internal_discussion')]"/>
<filter name="filter_scheduled_meeting" string="Scheduled Meeting (Waiting Together)" domain="[('responsibility', '=', 'scheduled_meeting')]"/>
<filter name="filter_external_activity" string="External Activity (SLA Paused)" domain="[('responsibility', '=', 'external_activity')]"/>
<filter name="filter_resolved_idle" string="Resolved (Ticket Closed/Idle)" domain="[('responsibility', '=', 'resolved_idle')]"/>
<filter name="filter_sla_paused" string="All SLA Paused" domain="[('responsibility', 'in', ['on_hold','third_party','internal_discussion','scheduled_meeting','external_activity'])]"/>
<filter name="filter_active" string="In Progress (Active)" domain="[('is_active', '=', True)]"/>
<separator/>
<group>
<filter name="group_by_ticket" string="Tiket" context="{'group_by': 'ticket_id'}"/>
<filter name="group_by_responsibility" string="Tanggung Jawab" context="{'group_by': 'responsibility'}"/>
<filter name="group_by_stage" string="Status / Stage" context="{'group_by': 'stage_name'}"/>
<filter name="group_by_actor" string="Pelaku (Actor)" context="{'group_by': 'actor_name'}"/>
</group>
</search>
</field>
</record>
<!-- ACTION STAGE LOGS -->
<record id="action_freshservice_ticket_stage_log" model="ir.actions.act_window">
<field name="name">Audit Trail Riwayat Status</field>
<field name="res_model">freshservice.ticket.stage.log</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_freshservice_ticket_stage_log_search"/>
<field name="context">{'search_default_group_by_ticket': 1}</field>
</record>
</odoo>

View File

@@ -0,0 +1,337 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- FORM VIEW -->
<record id="view_freshservice_ticket_form" model="ir.ui.view">
<field name="name">freshservice.ticket.form</field>
<field name="model">freshservice.ticket</field>
<field name="arch" type="xml">
<form string="Freshservice Ticket Audit Trail">
<header>
<button name="action_sync_from_freshservice"
type="object"
string="Sync Freshservice Data"
class="btn-primary"
icon="fa-refresh"
groups="gmn_freshservice.group_freshservice_manager"/>
<button name="action_open_bottleneck_wizard"
type="object"
string="Bottleneck Report (Excel)"
class="btn-outline-success"
icon="fa-file-excel-o"/>
<field name="status" widget="statusbar" statusbar_visible="open,pending,resolved,closed"/>
</header>
<sheet>
<field name="is_detail_synced" invisible="1"/>
<div class="oe_title">
<label for="name" string="Ticket Subject / Issue"/>
<h1>
<field name="name" placeholder="Contoh: SAP Client error di finance..."/>
</h1>
<div class="d-flex align-items-center gap-2 mt-2">
<span class="badge text-bg-secondary fs-6">ID Freshservice: #<field name="external_ticket_id" class="oe_inline"/></span>
<field name="current_responsibility" widget="badge"
decoration-danger="current_responsibility == 'internal'"
decoration-warning="current_responsibility == 'customer'"
decoration-info="current_responsibility == 'scheduled_meeting'"
decoration-muted="current_responsibility == 'third_party'"
decoration-success="current_responsibility == 'closed'"/>
</div>
</div>
<!-- KPI METRIC CARDS SECTION -->
<div class="row mt-4 mb-4">
<div class="col-md-2">
<div class="card text-center p-3 shadow-sm border-primary">
<small class="text-muted fw-bold text-uppercase">First Response</small>
<h4 class="mb-0 text-primary mt-1"><field name="first_response_time_display" readonly="1"/></h4>
<small class="text-secondary mt-1">Oleh: <field name="first_responder_name" readonly="1"/></small>
</div>
</div>
<div class="col-md-2">
<div class="card text-center p-3 shadow-sm border-danger">
<small class="text-muted fw-bold text-uppercase">Agent</small>
<h4 class="mb-0 text-danger mt-1"><field name="total_agent_time_display" readonly="1"/></h4>
<small class="text-secondary mt-1">Waiting on Us</small>
</div>
</div>
<div class="col-md-2">
<div class="card text-center p-3 shadow-sm border-warning">
<small class="text-muted fw-bold text-uppercase">User</small>
<h4 class="mb-0 text-warning mt-1"><field name="total_customer_time_display" readonly="1"/></h4>
<small class="text-secondary mt-1">Waiting on Customer</small>
</div>
</div>
<div class="col-md-2">
<div class="card text-center p-3 shadow-sm border-info">
<small class="text-muted fw-bold text-uppercase">Scheduled Meeting</small>
<h4 class="mb-0 text-info mt-1"><field name="shared_wait_time_display" readonly="1"/></h4>
<small class="text-secondary mt-1">Waiting Together</small>
</div>
</div>
<div class="col-md-2">
<div class="card text-center p-3 shadow-sm border-secondary">
<small class="text-muted fw-bold text-uppercase">Third Party</small>
<h4 class="mb-0 text-secondary mt-1"><field name="third_party_time_display" readonly="1"/></h4>
<small class="text-secondary mt-1">Waiting on Vendor</small>
</div>
</div>
<div class="col-md-2">
<div class="card text-center p-3 shadow-sm border-success">
<small class="text-muted fw-bold text-uppercase">Waktu Selesai</small>
<h4 class="mb-0 text-success mt-1"><field name="resolution_time_display" readonly="1"/></h4>
<small class="text-secondary mt-1">Total Resolution</small>
</div>
</div>
</div>
<group>
<group string="Informasi Pelapor &amp; Penugasan">
<field name="requester_name"/>
<field name="requester_email"/>
<field name="responder_name"/>
<field name="department_name"/>
</group>
<group string="Parameter Tiket">
<field name="priority" widget="priority"/>
<field name="ticket_created_at" readonly="1"/>
<field name="due_by" readonly="1"/>
<field name="is_mock_data" widget="boolean_toggle"/>
</group>
</group>
<notebook>
<page string="Detail Flow &amp; Durasi Status" name="audit_trail">
<div class="alert alert-info py-2" role="alert">
<strong>Log Transparansi SLA:</strong> Tabel ini menghitung secara objektif berapa lama tiket berada di tangan agen internal vs menunggu konfirmasi user di setiap pergantian status.
</div>
<field name="stage_log_ids" readonly="1">
<list decoration-danger="responsibility == 'internal' and is_active"
decoration-warning="responsibility == 'customer' and is_active"
decoration-muted="not is_active or responsibility in ('on_hold','third_party','internal_discussion','scheduled_meeting','external_activity','resolved_idle')">
<field name="stage_name" widget="badge"/>
<field name="responsibility" widget="badge"
decoration-danger="responsibility in ('internal','on_hold','internal_discussion')"
decoration-warning="responsibility == 'customer'"
decoration-info="responsibility == 'scheduled_meeting'"
decoration-muted="responsibility in ('third_party','external_activity','resolved_idle')"/>
<field name="actor_name"/>
<field name="actor_type"/>
<field name="start_date" string="Waktu Mulai (UTC)"/>
<field name="end_date" string="Waktu Selesai (UTC)"/>
<field name="working_duration_display" string="Jam Kerja (08:30-17:30)"/>
<field name="working_days_effective" string="Hari Kerja Efektif"/>
<field name="activity_content"/>
<field name="is_active" widget="boolean_toggle"/>
</list>
</field>
</page>
<page string="Percakapan &amp; Balasan" name="conversations">
<field name="conversation_ids" readonly="1">
<list>
<field name="created_at"/>
<field name="sender_type" widget="badge"
decoration-info="sender_type == 'agent'"
decoration-success="sender_type == 'customer'"/>
<field name="user_name"/>
<field name="body_text"/>
</list>
</field>
</page>
<page string="Deskripsi Masalah" name="description">
<field name="description"/>
</page>
<page string="Timestamp Teknis" name="technical_timestamps">
<group>
<group string="Waktu Kejadian">
<field name="ticket_created_at" readonly="1"/>
<field name="first_responded_at" readonly="1"/>
<field name="resolved_at" readonly="1"/>
<field name="last_detail_sync" readonly="1"/>
</group>
<group string="Metrik SLA (Hari)">
<field name="first_response_time_days" readonly="1"/>
<field name="total_agent_time_days" readonly="1"/>
<field name="total_customer_time_days" readonly="1"/>
<field name="shared_wait_time_days" readonly="1"/>
<field name="third_party_time_days" readonly="1"/>
<field name="resolution_time_days" readonly="1"/>
<field name="shared_wait_time_hours" invisible="1"/>
<field name="third_party_time_hours" invisible="1"/>
<!-- Field jam disembunyikan (hide) -->
<field name="first_response_time_hours" invisible="1"/>
<field name="total_agent_time_hours" invisible="1"/>
<field name="total_customer_time_hours" invisible="1"/>
<field name="resolution_time_hours" invisible="1"/>
</group>
</group>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<!-- LIST VIEW -->
<record id="view_freshservice_ticket_tree" model="ir.ui.view">
<field name="name">freshservice.ticket.tree</field>
<field name="model">freshservice.ticket</field>
<field name="arch" type="xml">
<list string="Freshservice Tickets"
decoration-danger="current_responsibility == 'internal'"
decoration-warning="current_responsibility == 'customer'"
decoration-muted="status in ('resolved', 'closed')">
<header>
<button name="action_sync_recent_tickets"
string="Tarik Tiket Terbaru Freshservice"
type="object"
class="btn-primary"
icon="fa-cloud-download"/>
</header>
<field name="external_ticket_id"/>
<field name="name"/>
<field name="status" widget="badge"
decoration-info="status == 'open'"
decoration-warning="status == 'pending'"
decoration-success="status == 'resolved'"
decoration-muted="status == 'closed'"/>
<field name="current_responsibility" widget="badge"
decoration-danger="current_responsibility == 'internal'"
decoration-warning="current_responsibility == 'customer'"
decoration-success="current_responsibility == 'closed'"/>
<field name="total_agent_time_display"/>
<field name="total_customer_time_display"/>
<field name="shared_wait_time_display" optional="show"/>
<field name="third_party_time_display" optional="show"/>
<field name="first_response_time_display"/>
<field name="responder_name"/>
<field name="requester_name"/>
<field name="ticket_created_at"/>
<field name="is_detail_synced" widget="boolean_toggle" optional="hide" string="Detail Di-fetch"/>
<field name="is_mock_data" widget="boolean_toggle" optional="show"/>
</list>
</field>
</record>
<!-- KANBAN VIEW -->
<record id="view_freshservice_ticket_kanban" model="ir.ui.view">
<field name="name">freshservice.ticket.kanban</field>
<field name="model">freshservice.ticket</field>
<field name="arch" type="xml">
<kanban default_group_by="status" class="o_kanban_small_column">
<field name="id"/>
<field name="name"/>
<field name="external_ticket_id"/>
<field name="priority"/>
<field name="current_responsibility"/>
<field name="total_agent_time_display"/>
<field name="total_customer_time_display"/>
<field name="responder_name"/>
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_global_click p-3 rounded">
<div class="d-flex justify-content-between">
<span class="badge text-bg-light fw-bold">#<field name="external_ticket_id"/></span>
<field name="priority" widget="priority"/>
</div>
<div class="fw-bold mt-2">
<field name="name"/>
</div>
<div class="d-flex justify-content-between align-items-center text-muted small mt-1">
<span>Agen: <field name="responder_name"/></span>
<field name="user_id" widget="many2one_avatar_user"/>
</div>
<div class="d-flex justify-content-between align-items-center mt-3 pt-2 border-top">
<span class="badge text-bg-danger">Agen: <field name="total_agent_time_display"/></span>
<span class="badge text-bg-warning">User: <field name="total_customer_time_display"/></span>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<!-- PIVOT VIEW -->
<record id="view_freshservice_ticket_pivot" model="ir.ui.view">
<field name="name">freshservice.ticket.pivot</field>
<field name="model">freshservice.ticket</field>
<field name="arch" type="xml">
<pivot string="Analisis Durasi Tiket SLA (Hari)">
<field name="responder_name" type="row"/>
<field name="current_responsibility" type="col"/>
<field name="total_agent_time_days" type="measure"/>
<field name="total_customer_time_days" type="measure"/>
<field name="first_response_time_days" type="measure"/>
<field name="resolution_time_days" type="measure"/>
</pivot>
</field>
</record>
<!-- GRAPH VIEW -->
<record id="view_freshservice_ticket_graph" model="ir.ui.view">
<field name="name">freshservice.ticket.graph</field>
<field name="model">freshservice.ticket</field>
<field name="arch" type="xml">
<graph string="Perbandingan Durasi Agen vs User (Hari)" type="bar">
<field name="responder_name"/>
<field name="total_agent_time_days" type="measure"/>
<field name="total_customer_time_days" type="measure"/>
</graph>
</field>
</record>
<!-- SEARCH VIEW -->
<record id="view_freshservice_ticket_search" model="ir.ui.view">
<field name="name">freshservice.ticket.search</field>
<field name="model">freshservice.ticket</field>
<field name="arch" type="xml">
<search string="Cari Tiket">
<field name="name" filter_domain="['|', ('name', 'ilike', self), ('external_ticket_id', 'ilike', self)]"/>
<field name="external_ticket_id"/>
<field name="user_id"/>
<field name="requester_name"/>
<field name="responder_name"/>
<filter name="filter_my_tickets" string="Tiket Saya" domain="[('user_id', '=', uid)]"/>
<filter name="filter_unassigned" string="Belum Ditugaskan" domain="[('user_id', '=', False)]"/>
<separator/>
<filter name="filter_waiting_us" string="Waiting on Us (Internal)" domain="[('current_responsibility', '=', 'internal')]"/>
<filter name="filter_waiting_user" string="Waiting on Requester (User)" domain="[('current_responsibility', '=', 'customer')]"/>
<separator/>
<filter name="filter_open_progress" string="Active Tickets (Not Completed)" domain="[('status', 'in', ['open', 'pending'])]"/>
<filter name="filter_resolved" string="Completed (Resolved/Closed)" domain="[('status', 'in', ['resolved', 'closed'])]"/>
<separator/>
<filter name="filter_mock" string="Data Mock" domain="[('is_mock_data', '=', True)]"/>
<filter name="filter_live" string="Data Live API" domain="[('is_mock_data', '=', False)]"/>
<group>
<filter name="group_by_status" string="Status" context="{'group_by': 'status'}"/>
<filter name="group_by_responsibility" string="Tanggung Jawab" context="{'group_by': 'current_responsibility'}"/>
<filter name="group_by_responder" string="Agent (IT)" context="{'group_by': 'responder_name'}"/>
<filter name="group_by_requester" string="Pemohon (User)" context="{'group_by': 'requester_name'}"/>
</group>
</search>
</field>
</record>
<!-- ACTIONS -->
<record id="action_freshservice_ticket" model="ir.actions.act_window">
<field name="name">Daftar Tiket</field>
<field name="res_model">freshservice.ticket</field>
<field name="view_mode">list,form,kanban,pivot,graph</field>
<field name="search_view_id" ref="view_freshservice_ticket_search"/>
<field name="context">{'search_default_filter_open_progress': 0}</field>
<field name="limit">200</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Belum ada tiket Freshservice yang dimuat!
</p>
<p>
Klik tombol <strong>"Tarik Tiket Terbaru Freshservice"</strong> pada header tabel untuk menarik daftar tiket dari Freshservice secara otomatis.
</p>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- TOP LEVEL ROOT MENU -->
<menuitem id="menu_freshservice_root"
name="Ticket Audit"
web_icon="fa fa-clock-o,#34495e,#ffffff"
sequence="20"/>
<!-- SERVER ACTION: Buka Menu Sekaligus Auto-Fetch Data Terbaru Freshservice -->
<record id="action_server_open_freshservice_tickets" model="ir.actions.server">
<field name="name">Buka &amp; Auto-Fetch Tiket Freshservice</field>
<field name="model_id" ref="model_freshservice_ticket"/>
<field name="state">code</field>
<field name="code">
action = model.action_open_and_fetch_tickets()
</field>
</record>
<!-- MAIN MENUS -->
<menuitem id="menu_freshservice_tickets"
name="Daftar Tiket"
parent="menu_freshservice_root"
action="action_server_open_freshservice_tickets"
sequence="10"/>
<menuitem id="menu_freshservice_stage_logs"
name="Audit Trail Riwayat Status"
parent="menu_freshservice_root"
action="action_freshservice_ticket_stage_log"
sequence="20"/>
<menuitem id="menu_freshservice_bottleneck_wizard"
name="Laporan Bottleneck (Excel)"
parent="menu_freshservice_root"
action="action_freshservice_ticket_bottleneck_wizard"
sequence="30"/>
<!-- CONFIGURATION MENU (Manager Only) -->
<menuitem id="menu_freshservice_config_parent"
name="Konfigurasi"
parent="menu_freshservice_root"
groups="gmn_freshservice.group_freshservice_manager"
sequence="90"/>
<menuitem id="menu_freshservice_config_settings"
name="Pengaturan Integrasi"
parent="menu_freshservice_config_parent"
action="action_freshservice_config_settings"
groups="gmn_freshservice.group_freshservice_manager"
sequence="10"/>
<menuitem id="menu_freshservice_holiday"
name="Hari Libur &amp; Cuti Bersama"
parent="menu_freshservice_config_parent"
action="action_freshservice_holiday"
groups="gmn_freshservice.group_freshservice_manager"
sequence="20"/>
<menuitem id="menu_freshservice_holiday_import_wizard"
name="Impor Hari Libur (Excel)"
parent="menu_freshservice_config_parent"
action="action_freshservice_holiday_import_wizard"
groups="gmn_freshservice.group_freshservice_manager"
sequence="25"/>
</odoo>

View File

@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="res_config_settings_view_form_freshservice" model="ir.ui.view">
<field name="name">res.config.settings.view.form.freshservice</field>
<field name="model">res.config.settings</field>
<field name="priority" eval="90"/>
<field name="inherit_id" ref="base.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//form" position="inside">
<app data-string="Freshservice Audit" string="Freshservice Audit" name="gmn_freshservice">
<block title="Konfigurasi Integrasi Freshservice" name="freshservice_settings_block">
<setting id="freshservice_url_setting" help="URL Portal Freshservice perusahaan Anda">
<field name="freshservice_url"/>
</setting>
<setting id="freshservice_api_key_setting" help="API Key dari profil Freshservice (wajib diisi untuk Live API)">
<field name="freshservice_api_key" password="True"/>
</setting>
<setting id="freshservice_sync_limit_setting" help="Batas jumlah tiket terbaru yang ditarik saat membuka daftar tiket (default: 200)">
<field name="freshservice_sync_limit"/>
</setting>
<setting id="freshservice_connection_setting" help="Uji koneksi ke Live Freshservice API">
<div class="mt8">
<button name="action_test_freshservice_connection"
type="object"
string="Tes Koneksi Live API"
class="btn-primary"
icon="fa-plug"/>
</div>
</setting>
</block>
</app>
</xpath>
</field>
</record>
<record id="action_freshservice_config_settings" model="ir.actions.act_window">
<field name="name">Pengaturan Freshservice</field>
<field name="res_model">res.config.settings</field>
<field name="view_mode">form</field>
<field name="target">main</field>
<field name="context">{'module': 'gmn_freshservice'}</field>
</record>
</odoo>