Update Logo Odoo & Client, remove testimoni
tests / ci (push) Canceled after 0s

This commit is contained in:
2026-09-29 11:37:08 +07:00
parent 26675424a2
commit 04fbddba13
11 changed files with 172 additions and 156 deletions
+37 -9
View File
@@ -13,6 +13,8 @@ export type Project = {
year: number;
sector: ProjectSector;
program?: ProjectProgram;
/** Optional detail of what the project covered. */
scope?: string;
};
const government: Omit<Project, 'sector'>[] = [
@@ -60,6 +62,8 @@ const government: Omit<Project, 'sector'>[] = [
title: 'Pengembangan Aplikasi LDH',
client: 'Badan Informasi Geospasial (BIG)',
year: 2022,
program: 'erp',
scope: 'OpenERP Community: manajemen dokumen dan custom development',
},
{
title: 'Perawatan Sistem Pelaporan Harga',
@@ -183,6 +187,8 @@ const government: Omit<Project, 'sector'>[] = [
title: 'Pengembangan Sistem Aplikasi Jaringan Informasi Dokumentasi Hukum',
client: 'Badan Informasi Geospasial (BIG)',
year: 2016,
program: 'erp',
scope: 'OpenERP Community: manajemen dokumen dan custom development',
},
{
title: 'Verifikasi Pelaporan Harga Barang Pokok pada Sistem Pemantauan Pasar Kebutuhan Pokok (SP2KP)',
@@ -199,7 +205,7 @@ const government: Omit<Project, 'sector'>[] = [
{
title: 'Pembuatan Software pada Kegiatan Penguatan Regional Climate Change Center',
client: 'Badan Meteorologi Klimatologi dan Geofisika (BMKG)',
year: 2025,
year: 2015,
},
{
title: 'Kajian Tata Kelola Teknologi Informasi BKPM TA 2014',
@@ -223,6 +229,8 @@ const government: Omit<Project, 'sector'>[] = [
title: 'Pembangunan Sistem Informasi Pelayanan Dokumen Hukum',
client: 'Badan Informasi Geospasial (BIG)',
year: 2014,
program: 'erp',
scope: 'OpenERP Community: manajemen dokumen dan custom development',
},
{
title: 'Pendampingan Helpdesk Implementasi Sistem Pelayanan Informasi dan Perizinan Investasi Secara Elektronik (SPIPISE)',
@@ -245,6 +253,8 @@ const government: Omit<Project, 'sector'>[] = [
title: 'Pembangunan Aplikasi Jaringan Dokumentasi dan Informasi Hukum',
client: 'Badan Informasi Geospasial (BIG)',
year: 2012,
program: 'erp',
scope: 'OpenERP Community: manajemen dokumen dan custom development',
},
{
title: 'Pengembangan Portal National Single Window for Investment (NSWI) untuk Mendukung SPIPISE BKPM',
@@ -271,12 +281,24 @@ const privateSector: Omit<Project, 'sector'>[] = [
client: 'Marawah Beach Club',
year: 2022,
program: 'erp',
scope: 'Odoo Enterprise: POS, event, pembelian, penjualan, website, dan custom development',
},
{
title: 'Enhancement Manajemen Sistem',
client: 'PT Cipta Kridatama',
year: 2022,
},
{
title: 'Implementasi OpenERP Manufacturing System',
client: 'CV Mujur Jaya Abadi',
year: 2015,
program: 'erp',
scope: 'OpenERP Community: akunting, manufaktur, pembelian, penjualan, inventory, dan custom development',
},
{
title: 'Pengembangan Reswara Integrated Management System',
client: 'PT Reswara Minergi Hartama',
year: 2013,
},
{
title: 'Kegiatan Pengembangan dan Operasionalisasi Sistem Pemantauan Pasar Kebutuhan Pokok (SP2KP)',
@@ -325,6 +347,7 @@ const privateSector: Omit<Project, 'sector'>[] = [
title: 'Pengembangan Aplikasi Titis Sampurna Accounting Information System',
client: 'PT Titis Sampurna',
year: 2006,
program: 'erp',
},
{
title: 'Jasa Konsultasi Pengembangan Sistem Informasi Eksekutif Keuangan',
@@ -372,22 +395,27 @@ const clientName = (project: Project) =>
/** Number of distinct clients across all projects. */
export const clientCount = new Set(projects.map(clientName)).size;
/** Distinct clients in a sector, most frequent first. */
export const clientsInSector = (sector: ProjectSector) => {
/** Distinct clients, most frequent first. */
const rankClients = (items: Project[]) => {
const counts = new Map<string, number>();
projects
.filter((project) => project.sector === sector)
.forEach((project) => {
const name = clientName(project);
counts.set(name, (counts.get(name) ?? 0) + 1);
});
items.forEach((project) => {
const name = clientName(project);
counts.set(name, (counts.get(name) ?? 0) + 1);
});
return [...counts.entries()]
.sort((a, b) => b[1] - a[1])
.map(([name]) => name);
};
export const clientsInSector = (sector: ProjectSector) =>
rankClients(projects.filter((project) => project.sector === sector));
/** Clients with the most projects across every sector. */
export const topClients = (limit: number) =>
rankClients(projects).slice(0, limit);
export const projectsBySector = (sector: ProjectSector) =>
projects.filter((project) => project.sector === sector);