-- Prestige Barbershop Database Backup
-- Created: 2026-09-02T04:19:28+07:00
SET FOREIGN_KEY_CHECKS=0;
SET NAMES utf8mb4;

DROP TABLE IF EXISTS `accounting_accounts`;
CREATE TABLE `accounting_accounts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `account_code` varchar(30) NOT NULL,
  `account_name` varchar(150) NOT NULL,
  `account_type` enum('asset','liability','equity','revenue','expense') NOT NULL,
  `normal_balance` enum('debit','credit') NOT NULL,
  `parent_id` int(11) DEFAULT NULL,
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `account_code` (`account_code`),
  KEY `parent_id` (`parent_id`),
  KEY `idx_account_type` (`account_type`,`is_active`),
  CONSTRAINT `accounting_accounts_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `accounting_accounts` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=91171 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `accounting_accounts` VALUES('1','1001','Kas','asset','debit',NULL,'1','2026-09-01 09:43:31');
INSERT INTO `accounting_accounts` VALUES('2','1002','Bank / QRIS','asset','debit',NULL,'1','2026-09-01 09:43:31');
INSERT INTO `accounting_accounts` VALUES('3','1101','Piutang Usaha','asset','debit',NULL,'1','2026-09-01 09:43:31');
INSERT INTO `accounting_accounts` VALUES('4','2001','Utang Usaha','liability','credit',NULL,'1','2026-09-01 09:43:31');
INSERT INTO `accounting_accounts` VALUES('5','2101','Utang Pajak','liability','credit',NULL,'1','2026-09-01 09:43:31');
INSERT INTO `accounting_accounts` VALUES('6','3001','Modal Pemilik','equity','credit',NULL,'1','2026-09-01 09:43:31');
INSERT INTO `accounting_accounts` VALUES('7','3101','Saldo Laba','equity','credit',NULL,'1','2026-09-01 09:43:31');
INSERT INTO `accounting_accounts` VALUES('8','4001','Pendapatan Jasa','revenue','credit',NULL,'1','2026-09-01 09:43:31');
INSERT INTO `accounting_accounts` VALUES('9','4002','Pendapatan Lain','revenue','credit',NULL,'1','2026-09-01 09:43:31');
INSERT INTO `accounting_accounts` VALUES('10','5001','Beban Operasional','expense','debit',NULL,'1','2026-09-01 09:43:31');
INSERT INTO `accounting_accounts` VALUES('11','5002','Beban Gaji dan Bonus','expense','debit',NULL,'1','2026-09-01 09:43:31');
INSERT INTO `accounting_accounts` VALUES('12','5003','Beban Pajak','expense','debit',NULL,'1','2026-09-01 09:43:31');
INSERT INTO `accounting_accounts` VALUES('13','1201','Persediaan Produk','asset','debit',NULL,'1','2026-09-01 09:43:31');
INSERT INTO `accounting_accounts` VALUES('14','4003','Pendapatan Produk','revenue','credit',NULL,'1','2026-09-01 09:43:31');
INSERT INTO `accounting_accounts` VALUES('15','5101','Harga Pokok Penjualan Produk','expense','debit',NULL,'1','2026-09-01 09:43:31');

DROP TABLE IF EXISTS `activity_logs`;
CREATE TABLE `activity_logs` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `action` varchar(80) NOT NULL,
  `detail` text DEFAULT NULL,
  `ip_address` varchar(64) DEFAULT NULL,
  `user_agent` varchar(255) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`),
  KEY `idx_log_created` (`created_at`),
  CONSTRAINT `activity_logs_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=338 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `activity_logs` VALUES('1','1','LOGIN','Login berhasil','114.122.115.32','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 09:44:00');
INSERT INTO `activity_logs` VALUES('2','1','UPDATE_SETTINGS','Branding dan seluruh konfigurasi sistem diperbarui','114.122.115.32','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 09:45:10');
INSERT INTO `activity_logs` VALUES('3','1','UPDATE_SETTINGS','Branding dan seluruh konfigurasi sistem diperbarui','114.122.115.32','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 09:45:26');
INSERT INTO `activity_logs` VALUES('4','1','UPDATE_SETTINGS','Branding dan seluruh konfigurasi sistem diperbarui','114.122.115.32','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 09:45:58');
INSERT INTO `activity_logs` VALUES('5','1','UPDATE_SETTINGS','Branding dan seluruh konfigurasi sistem diperbarui','114.122.115.32','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 09:46:17');
INSERT INTO `activity_logs` VALUES('6','1','UPDATE_MEMBER_CARD_CONTENT','front/back content','114.122.115.32','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 09:47:20');
INSERT INTO `activity_logs` VALUES('7','1','LOGIN','Login berhasil','114.122.115.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36','2026-09-01 09:54:07');
INSERT INTO `activity_logs` VALUES('8','1','LOGIN','Login berhasil','114.122.115.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 09:54:21');
INSERT INTO `activity_logs` VALUES('9','1','CREATE_TRANSACTION','TRX-20260901-0001 Rp 125.000','114.122.115.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 09:55:48');
INSERT INTO `activity_logs` VALUES('10','1','CREATE_TRANSACTION','TRX-20260901-0002 Rp 125.000','114.122.115.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 09:55:52');
INSERT INTO `activity_logs` VALUES('11','1','PRINT_THERMAL','TRX-20260901-0002 80mm custom','114.122.115.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 09:55:57');
INSERT INTO `activity_logs` VALUES('12','1','LOGOUT','Logout','114.122.115.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36','2026-09-01 09:57:33');
INSERT INTO `activity_logs` VALUES('13','1','LOGIN','Login berhasil','114.122.115.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36','2026-09-01 09:57:38');
INSERT INTO `activity_logs` VALUES('14','1','UPDATE_USER','ID 1 acepronihamdani@unpas.ac.id','114.122.115.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 09:58:45');
INSERT INTO `activity_logs` VALUES('15','1','SELECT_CARD_TEMPLATE','midnight_blue','114.122.115.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 10:03:59');
INSERT INTO `activity_logs` VALUES('16','1','SELECT_CARD_TEMPLATE','barber_classic','114.122.115.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 10:04:01');
INSERT INTO `activity_logs` VALUES('17','1','UPDATE_MEMBER_CARD_CONTENT','front/back content','114.122.115.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 10:04:19');
INSERT INTO `activity_logs` VALUES('18','1','SELECT_CARD_TEMPLATE','minimal_light','114.122.115.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 10:04:59');
INSERT INTO `activity_logs` VALUES('19','1','UPDATE_SETTINGS','Branding dan seluruh konfigurasi sistem diperbarui','114.122.115.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 10:07:26');
INSERT INTO `activity_logs` VALUES('20','1','UPDATE_RECEIPT_CONTENT','Custom receipt content','114.122.115.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 10:07:47');
INSERT INTO `activity_logs` VALUES('21','1','APPROVE_MEMBER_REGISTRATION','REG-260901-CD6A585C => MBR-260901-E9B93D - Andina okta mulyati','114.122.115.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 10:09:30');
INSERT INTO `activity_logs` VALUES('22','1','LOGIN','Login berhasil','114.122.115.32','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 10:35:31');
INSERT INTO `activity_logs` VALUES('23','1','IMPORT_USERS','template_import_user.xlsx | baru:16 update:0 skip:0 gagal:0 staf-baru:8 staf-update:0','114.122.115.32','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 10:44:18');
INSERT INTO `activity_logs` VALUES('24','1','LOGIN','Login berhasil','114.122.115.32','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36','2026-09-01 10:57:39');
INSERT INTO `activity_logs` VALUES('25','4','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 10:58:01');
INSERT INTO `activity_logs` VALUES('26','4','APPROVE_MEMBER_REGISTRATION','REG-260901-98E349F6 => MBR-260901-086E45 - Manda','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 10:59:44');
INSERT INTO `activity_logs` VALUES('27','6','LOGIN','Login berhasil','182.253.228.72','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 11:00:39');
INSERT INTO `activity_logs` VALUES('28','7','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.7.7 Mobile/15E148 Safari/604.1','2026-09-01 11:00:59');
INSERT INTO `activity_logs` VALUES('29','6','CHANGE_OWN_PASSWORD','Password profil diperbarui','182.253.228.72','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 11:02:02');
INSERT INTO `activity_logs` VALUES('30','7','CHANGE_OWN_PASSWORD','Password profil diperbarui','114.10.45.32','Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.7.7 Mobile/15E148 Safari/604.1','2026-09-01 11:03:13');
INSERT INTO `activity_logs` VALUES('31','1','DELETE_SERVICE','ID 21','114.122.108.55','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:05:37');
INSERT INTO `activity_logs` VALUES('32','1','DELETE_SERVICE','ID 20','114.122.108.55','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:05:49');
INSERT INTO `activity_logs` VALUES('33','1','DELETE_SERVICE','ID 19','114.122.108.55','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:05:57');
INSERT INTO `activity_logs` VALUES('34','14','LOGIN','Login berhasil','114.122.117.178','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/30.0 Chrome/143.0.0.0 Mobile Safari/537.36','2026-09-01 11:07:33');
INSERT INTO `activity_logs` VALUES('35','1','TOGGLE_SERVICE','ID 10','114.122.115.32','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:08:05');
INSERT INTO `activity_logs` VALUES('36','1','TOGGLE_SERVICE','ID 17','114.122.115.32','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:08:23');
INSERT INTO `activity_logs` VALUES('37','1','TOGGLE_SERVICE','ID 14','114.122.115.32','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:08:29');
INSERT INTO `activity_logs` VALUES('38','1','TOGGLE_SERVICE','ID 4','114.122.115.32','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:08:35');
INSERT INTO `activity_logs` VALUES('39','13','LOGIN','Login berhasil','182.253.228.72','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 HeyTapBrowser/45.13.9.1.2beta Chrome/115.0.5970.168','2026-09-01 11:08:52');
INSERT INTO `activity_logs` VALUES('40','1','LOGOUT','Logout','114.122.101.195','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:08:56');
INSERT INTO `activity_logs` VALUES('41','6','LOGIN','Login berhasil','114.122.101.195','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:10:15');
INSERT INTO `activity_logs` VALUES('42','15','LOGIN','Login berhasil','140.213.51.136','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 11:10:50');
INSERT INTO `activity_logs` VALUES('43','16','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 11:10:58');
INSERT INTO `activity_logs` VALUES('44','6','LOGOUT','Logout','114.122.101.195','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:11:13');
INSERT INTO `activity_logs` VALUES('45','1','LOGIN','Login berhasil','114.122.101.195','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:11:36');
INSERT INTO `activity_logs` VALUES('46','1','CREATE_SERVICE','Haircut - Softopening','114.122.101.195','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:12:33');
INSERT INTO `activity_logs` VALUES('47','1','LOGOUT','Logout','114.122.101.195','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:12:44');
INSERT INTO `activity_logs` VALUES('48','6','LOGIN','Login berhasil','114.122.101.195','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:13:21');
INSERT INTO `activity_logs` VALUES('49','6','CREATE_TRANSACTION','TRX-20260901-0003 Rp 80.000','114.122.101.195','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:14:16');
INSERT INTO `activity_logs` VALUES('50','6','PRINT_THERMAL','TRX-20260901-0003 80mm custom','114.122.101.195','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:14:28');
INSERT INTO `activity_logs` VALUES('51','6','PRINT_THERMAL','TRX-20260901-0003 80mm custom','114.122.101.195','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:15:25');
INSERT INTO `activity_logs` VALUES('52','6','LOGOUT','Logout','114.122.101.215','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:19:09');
INSERT INTO `activity_logs` VALUES('53','1','LOGIN','Login berhasil','114.122.101.215','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:19:25');
INSERT INTO `activity_logs` VALUES('54','1','DELETE_SERVICE','ID 14','114.122.101.215','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:19:42');
INSERT INTO `activity_logs` VALUES('55','1','DELETE_SERVICE','ID 4','114.122.101.215','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:19:51');
INSERT INTO `activity_logs` VALUES('56','1','DELETE_SERVICE','ID 16','114.122.101.215','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:20:01');
INSERT INTO `activity_logs` VALUES('57','1','UPDATE_USER','ID 16 rian_capster','114.122.101.215','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:20:53');
INSERT INTO `activity_logs` VALUES('58','1','UPDATE_USER','ID 15 rangga_capster','114.122.101.215','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:21:28');
INSERT INTO `activity_logs` VALUES('59','1','UPDATE_USER','ID 14 daud_capster','114.122.101.215','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:21:49');
INSERT INTO `activity_logs` VALUES('60','1','UPDATE_USER','ID 13 ian_capster','114.122.101.215','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:22:17');
INSERT INTO `activity_logs` VALUES('61','1','UPDATE_USER','ID 12 ridwan_capster','114.122.101.215','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:22:40');
INSERT INTO `activity_logs` VALUES('62','1','LOGOUT','Logout','114.122.101.215','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:22:59');
INSERT INTO `activity_logs` VALUES('63','7','LOGIN','Login berhasil','114.122.101.215','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:23:21');
INSERT INTO `activity_logs` VALUES('64','1','LOGIN','Login berhasil','114.122.115.32','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36','2026-09-01 11:29:13');
INSERT INTO `activity_logs` VALUES('65','1','DELETE_SERVICE','ID 10','114.122.115.32','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:29:29');
INSERT INTO `activity_logs` VALUES('66','5','LOGIN','Login berhasil','114.122.115.81','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36','2026-09-01 11:29:32');
INSERT INTO `activity_logs` VALUES('67','1','UPDATE_PROFILE','Profil pribadi diperbarui','114.122.116.183','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:34:35');
INSERT INTO `activity_logs` VALUES('68','1','UPDATE_SETTINGS','Branding dan seluruh konfigurasi sistem diperbarui','114.122.116.183','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:35:30');
INSERT INTO `activity_logs` VALUES('69','17','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/30.0 Chrome/143.0.0.0 Mobile Safari/537.36','2026-09-01 11:40:16');
INSERT INTO `activity_logs` VALUES('70','7','CREATE_TRANSACTION','TRX-20260901-0001 Rp 90.000','114.122.108.175','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:40:38');
INSERT INTO `activity_logs` VALUES('71','1','LOGIN_AS_START','Login As ? Tantan @tantan_capster (Petugas Barber)','114.122.115.32','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:46:13');
INSERT INTO `activity_logs` VALUES('72','17','LOGOUT','[LOGIN AS oleh Super Administrator @acepronihamdani@unpas.ac.id ID 1] Logout','114.122.115.32','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:46:26');
INSERT INTO `activity_logs` VALUES('73','1','LOGIN','Login berhasil','114.122.115.32','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:46:49');
INSERT INTO `activity_logs` VALUES('74','7','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 11:55:44');
INSERT INTO `activity_logs` VALUES('75','7','CREATE_TRANSACTION','TRX-20260901-0002 Rp 80.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 11:56:43');
INSERT INTO `activity_logs` VALUES('76','7','CREATE_TRANSACTION','TRX-20260901-0003 Rp 90.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 11:57:13');
INSERT INTO `activity_logs` VALUES('77','1','LOGIN','Login berhasil','114.122.115.32','Mozilla/5.0 (iPhone; CPU iPhone OS 26_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/152.0.7977.64 Mobile/15E148 Safari/604.1','2026-09-01 12:01:36');
INSERT INTO `activity_logs` VALUES('78','5','LOGOUT','Logout','114.122.102.144','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36','2026-09-01 12:08:55');
INSERT INTO `activity_logs` VALUES('79','5','LOGIN','Login berhasil','114.122.102.144','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36','2026-09-01 12:09:09');
INSERT INTO `activity_logs` VALUES('80','3','LOGIN','Login berhasil','114.10.146.185','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 12:10:22');
INSERT INTO `activity_logs` VALUES('81','4','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 12:12:06');
INSERT INTO `activity_logs` VALUES('82','5','LOGOUT','Logout','114.122.111.144','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36','2026-09-01 12:14:19');
INSERT INTO `activity_logs` VALUES('83','7','CREATE_TRANSACTION','TRX-20260901-0004 Rp 90.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 12:14:26');
INSERT INTO `activity_logs` VALUES('84','7','PRINT_THERMAL','TRX-20260901-0004 80mm custom','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 12:14:32');
INSERT INTO `activity_logs` VALUES('85','9','LOGIN','Login berhasil','114.122.111.144','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36','2026-09-01 12:14:43');
INSERT INTO `activity_logs` VALUES('86','7','PRINT_THERMAL','TRX-20260901-0004 58mm custom','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 12:14:56');
INSERT INTO `activity_logs` VALUES('87','7','PRINT_THERMAL','TRX-20260901-0004 80mm custom','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 12:15:13');
INSERT INTO `activity_logs` VALUES('88','7','PRINT_THERMAL','TRX-20260901-0004 80mm custom','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 12:15:47');
INSERT INTO `activity_logs` VALUES('89','7','PRINT_THERMAL','TRX-20260901-0004 58mm custom','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 12:16:04');
INSERT INTO `activity_logs` VALUES('90','7','PRINT_THERMAL','TRX-20260901-0004 80mm custom','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 12:16:54');
INSERT INTO `activity_logs` VALUES('91','7','PRINT_THERMAL','TRX-20260901-0004 80mm custom','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 12:17:27');
INSERT INTO `activity_logs` VALUES('92','7','CREATE_TRANSACTION','TRX-20260901-0005 Rp 90.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 12:19:41');
INSERT INTO `activity_logs` VALUES('93','1','LOGIN','Login berhasil','114.122.115.32','Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Mobile/15E148 Safari/604.1','2026-09-01 12:20:49');
INSERT INTO `activity_logs` VALUES('94','1','LOGIN_AS_START','Login As ? Yanyan - Ian Septian @ian_capster (Petugas Barber)','114.122.115.32','Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Mobile/15E148 Safari/604.1','2026-09-01 12:21:55');
INSERT INTO `activity_logs` VALUES('95','12','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Mobile Safari/537.36','2026-09-01 12:31:44');
INSERT INTO `activity_logs` VALUES('96','15','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 12:32:57');
INSERT INTO `activity_logs` VALUES('97','7','PRINT_THERMAL','TRX-20260901-0001 80mm custom','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 12:49:46');
INSERT INTO `activity_logs` VALUES('98','1','LOGIN','Login berhasil','114.122.115.13','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 12:55:24');
INSERT INTO `activity_logs` VALUES('99','7','CREATE_TRANSACTION','TRX-20260901-0006 Rp 80.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 12:57:43');
INSERT INTO `activity_logs` VALUES('100','7','PRINT_THERMAL','TRX-20260901-0006 80mm custom','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 12:57:49');
INSERT INTO `activity_logs` VALUES('101','1','UPDATE_MEMBER_CARD_CONTENT','front/back content','114.122.115.32','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 13:02:56');
INSERT INTO `activity_logs` VALUES('102','7','CREATE_TRANSACTION','TRX-20260901-0007 Rp 80.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 13:08:31');
INSERT INTO `activity_logs` VALUES('103','7','PRINT_THERMAL','TRX-20260901-0007 80mm custom','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 13:08:41');
INSERT INTO `activity_logs` VALUES('104','1','UPLOAD_CARD_TEMPLATE','Prestige Black Edition','114.122.104.249','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 13:10:29');
INSERT INTO `activity_logs` VALUES('105','5','LOGIN','Login berhasil','114.122.115.213','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36','2026-09-01 13:10:46');
INSERT INTO `activity_logs` VALUES('106','1','SELECT_CARD_TEMPLATE','custom_20260901131029_c7f042','114.122.104.249','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 13:10:51');
INSERT INTO `activity_logs` VALUES('107','1','SELECT_CARD_TEMPLATE','custom_20260901131029_c7f042','114.122.104.249','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 13:10:58');
INSERT INTO `activity_logs` VALUES('108','1','SELECT_CARD_TEMPLATE','midnight_blue','114.122.104.249','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 13:11:14');
INSERT INTO `activity_logs` VALUES('109','7','CREATE_TRANSACTION','TRX-20260901-0008 Rp 80.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 13:14:32');
INSERT INTO `activity_logs` VALUES('110','7','CREATE_TRANSACTION','TRX-20260901-0009 Rp 90.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 13:29:09');
INSERT INTO `activity_logs` VALUES('111','7','CREATE_TRANSACTION','TRX-20260901-0010 Rp 90.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 13:31:50');
INSERT INTO `activity_logs` VALUES('112','1','LOGIN','Login berhasil','114.122.115.32','Mozilla/5.0 (iPhone; CPU iPhone OS 26_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/152.0.7977.64 Mobile/15E148 Safari/604.1','2026-09-01 13:45:00');
INSERT INTO `activity_logs` VALUES('113','1','LOGIN','Login berhasil','114.122.115.32','Mozilla/5.0 (iPhone; CPU iPhone OS 26_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/152.0.7977.64 Mobile/15E148 Safari/604.1','2026-09-01 13:45:43');
INSERT INTO `activity_logs` VALUES('114','7','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:05:20');
INSERT INTO `activity_logs` VALUES('115','7','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:05:33');
INSERT INTO `activity_logs` VALUES('116','1','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:06:05');
INSERT INTO `activity_logs` VALUES('117','5','LOGIN','Login berhasil','114.122.115.213','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36','2026-09-01 14:06:09');
INSERT INTO `activity_logs` VALUES('118','1','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 14:08:05');
INSERT INTO `activity_logs` VALUES('119','7','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:12:19');
INSERT INTO `activity_logs` VALUES('120','7','CREATE_TRANSACTION','TRX-20260901-0011 Rp 80.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:13:42');
INSERT INTO `activity_logs` VALUES('121','3','LOGIN','Login berhasil','114.10.146.185','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 14:14:04');
INSERT INTO `activity_logs` VALUES('122','7','CREATE_TRANSACTION','TRX-20260901-0012 Rp 125.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:14:16');
INSERT INTO `activity_logs` VALUES('123','7','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:14:26');
INSERT INTO `activity_logs` VALUES('124','1','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:15:25');
INSERT INTO `activity_logs` VALUES('125','1','SELECT_HARDWARE','card_printer ID 1','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:15:55');
INSERT INTO `activity_logs` VALUES('126','1','SELECT_HARDWARE','receipt_printer ID 12','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:16:06');
INSERT INTO `activity_logs` VALUES('127','1','SELECT_MEMBER_SCANNER','Scanner ID 4 mode hid_keyboard','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:16:17');
INSERT INTO `activity_logs` VALUES('128','1','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:17:07');
INSERT INTO `activity_logs` VALUES('129','7','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:17:34');
INSERT INTO `activity_logs` VALUES('130','7','APPROVE_MEMBER_REGISTRATION','REG-260901-42BA3B17 => MBR-260901-E82DD1 - Adi','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:22:07');
INSERT INTO `activity_logs` VALUES('131','7','UPDATE_MEMBER','ID 3 - Adi','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:23:08');
INSERT INTO `activity_logs` VALUES('132','7','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:30:44');
INSERT INTO `activity_logs` VALUES('133','1','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:31:58');
INSERT INTO `activity_logs` VALUES('134','1','CREATE_TRANSACTION','TRX-20260901-0013 Rp 90.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:32:58');
INSERT INTO `activity_logs` VALUES('135','1','PRINT_THERMAL','TRX-20260901-0013 80mm custom','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:33:06');
INSERT INTO `activity_logs` VALUES('136','1','LOGIN_AS_START','Login As ? Ikbal - Rian Ikbal @rian_capster (Petugas Barber)','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:33:53');
INSERT INTO `activity_logs` VALUES('137','1','LOGIN_AS_END','Kembali dari Login As Ikbal - Rian Ikbal @rian_capster (Petugas Barber)','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:34:26');
INSERT INTO `activity_logs` VALUES('138','1','LOGIN_AS_START','Login As ? Tantan @tantan_capster (Petugas Barber)','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:35:28');
INSERT INTO `activity_logs` VALUES('139','1','LOGIN_AS_END','Kembali dari Login As Tantan @tantan_capster (Petugas Barber)','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:35:36');
INSERT INTO `activity_logs` VALUES('140','1','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:37:47');
INSERT INTO `activity_logs` VALUES('141','7','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:38:37');
INSERT INTO `activity_logs` VALUES('142','11','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 14:39:46');
INSERT INTO `activity_logs` VALUES('143','11','SELF_CHECKIN','barber CPS-1','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 14:40:36');
INSERT INTO `activity_logs` VALUES('144','7','APPROVE_MEMBER_REGISTRATION','REG-260901-CE9F19FE => MBR-260901-06ED06 - Ilham','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:48:10');
INSERT INTO `activity_logs` VALUES('145','1','LOGIN','Login berhasil','114.122.108.126','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36','2026-09-01 15:08:59');
INSERT INTO `activity_logs` VALUES('146','1','LOGIN','Login berhasil','114.122.108.126','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 15:12:12');
INSERT INTO `activity_logs` VALUES('147','1','UPDATE_SETTINGS','Branding dan seluruh konfigurasi sistem diperbarui','114.122.108.126','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 15:12:34');
INSERT INTO `activity_logs` VALUES('148','1','UPDATE_SETTINGS','Branding dan seluruh konfigurasi sistem diperbarui','114.122.108.126','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 15:13:33');
INSERT INTO `activity_logs` VALUES('149','7','CREATE_TRANSACTION','TRX-20260901-0014 Rp 80.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 15:13:42');
INSERT INTO `activity_logs` VALUES('150','17','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/30.0 Chrome/143.0.0.0 Mobile Safari/537.36','2026-09-01 15:18:46');
INSERT INTO `activity_logs` VALUES('151','4','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 15:22:45');
INSERT INTO `activity_logs` VALUES('152','17','UPDATE_PROFILE','Profil pribadi diperbarui','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/30.0 Chrome/143.0.0.0 Mobile Safari/537.36','2026-09-01 15:24:36');
INSERT INTO `activity_logs` VALUES('153','17','CHANGE_OWN_PASSWORD','Password profil diperbarui','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/30.0 Chrome/143.0.0.0 Mobile Safari/537.36','2026-09-01 15:25:40');
INSERT INTO `activity_logs` VALUES('154','7','CREATE_TRANSACTION','TRX-20260901-0015 Rp 80.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 15:47:49');
INSERT INTO `activity_logs` VALUES('155','7','CREATE_TRANSACTION','TRX-20260901-0016 Rp 80.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 15:48:22');
INSERT INTO `activity_logs` VALUES('156','17','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/30.0 Chrome/143.0.0.0 Mobile Safari/537.36','2026-09-01 16:00:23');
INSERT INTO `activity_logs` VALUES('157','7','CREATE_TRANSACTION','TRX-20260901-0017 Rp 125.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 16:02:23');
INSERT INTO `activity_logs` VALUES('158','1','LOGIN','Login berhasil','114.122.115.56','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 16:10:13');
INSERT INTO `activity_logs` VALUES('159','17','LOGIN','Login berhasil','114.122.73.86','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/30.0 Chrome/143.0.0.0 Mobile Safari/537.36','2026-09-01 16:22:13');
INSERT INTO `activity_logs` VALUES('160','7','CREATE_TRANSACTION','TRX-20260901-0018 Rp 45.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 16:40:00');
INSERT INTO `activity_logs` VALUES('161','1','LOGIN','Login berhasil','114.122.115.56','Mozilla/5.0 (iPhone; CPU iPhone OS 26_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/152.0.7977.64 Mobile/15E148 Safari/604.1','2026-09-01 17:11:13');
INSERT INTO `activity_logs` VALUES('162','7','CREATE_TRANSACTION','TRX-20260901-0019 Rp 80.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 17:12:48');
INSERT INTO `activity_logs` VALUES('163','7','CREATE_TRANSACTION','TRX-20260901-0020 Rp 80.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 17:14:17');
INSERT INTO `activity_logs` VALUES('164','17','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/30.0 Chrome/143.0.0.0 Mobile Safari/537.36','2026-09-01 17:24:41');
INSERT INTO `activity_logs` VALUES('165','17','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/30.0 Chrome/143.0.0.0 Mobile Safari/537.36','2026-09-01 17:25:38');
INSERT INTO `activity_logs` VALUES('166','15','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/30.0 Chrome/143.0.0.0 Mobile Safari/537.36','2026-09-01 17:26:08');
INSERT INTO `activity_logs` VALUES('167','16','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 17:26:25');
INSERT INTO `activity_logs` VALUES('168','4','LOGIN','Login berhasil','114.10.148.64','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 17:27:23');
INSERT INTO `activity_logs` VALUES('169','15','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/30.0 Chrome/143.0.0.0 Mobile Safari/537.36','2026-09-01 17:28:15');
INSERT INTO `activity_logs` VALUES('170','17','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/30.0 Chrome/143.0.0.0 Mobile Safari/537.36','2026-09-01 17:28:21');
INSERT INTO `activity_logs` VALUES('171','3','LOGIN','Login berhasil','114.10.146.185','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 17:31:42');
INSERT INTO `activity_logs` VALUES('172','7','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 17:32:01');
INSERT INTO `activity_logs` VALUES('173','1','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 17:33:07');
INSERT INTO `activity_logs` VALUES('174','1','UPDATE_SETTINGS','Branding dan seluruh konfigurasi sistem diperbarui','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 17:34:19');
INSERT INTO `activity_logs` VALUES('175','1','UPDATE_BARBER_STAFF','Adi','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 17:37:46');
INSERT INTO `activity_logs` VALUES('176','1','UPDATE_BARBER_STAFF','Adi - Adi Sujana','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 17:38:03');
INSERT INTO `activity_logs` VALUES('177','1','UPDATE_BARBER_STAFF','Uway - Daud Somantri','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 17:38:14');
INSERT INTO `activity_logs` VALUES('178','1','UPDATE_BARBER_STAFF','Yanyan - Ian Septian','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 17:38:27');
INSERT INTO `activity_logs` VALUES('179','1','UPDATE_BARBER_STAFF','Angga - Rangga Erlangga','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 17:38:40');
INSERT INTO `activity_logs` VALUES('180','1','UPDATE_BARBER_STAFF','Ikbal - Rian Ikbal','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 17:38:54');
INSERT INTO `activity_logs` VALUES('181','1','UPDATE_BARBER_STAFF','Ayong - Ridwan Firdaus','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 17:39:06');
INSERT INTO `activity_logs` VALUES('182','1','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 17:39:50');
INSERT INTO `activity_logs` VALUES('183','7','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 17:40:25');
INSERT INTO `activity_logs` VALUES('184','1','LOGIN','Login berhasil','114.122.110.17','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 17:43:10');
INSERT INTO `activity_logs` VALUES('185','1','DOWNLOAD_USER_IMPORT_TEMPLATE','template_import_user.xlsx','114.122.110.17','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 17:43:30');
INSERT INTO `activity_logs` VALUES('186','16','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 17:47:14');
INSERT INTO `activity_logs` VALUES('187','1','IMPORT_USERS','template_import_user_karyawan.xlsx | baru:4 update:0 skip:1 gagal:0 staf-baru:4 staf-update:0','114.122.111.249','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 17:50:34');
INSERT INTO `activity_logs` VALUES('188','1','DOWNLOAD_USER_IMPORT_TEMPLATE','template_import_user.xlsx','114.122.115.56','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 17:51:54');
INSERT INTO `activity_logs` VALUES('189','7','CREATE_TRANSACTION','TRX-20260901-0021 Rp 90.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 17:59:18');
INSERT INTO `activity_logs` VALUES('190','3','LOGIN','Login berhasil','114.10.147.185','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 18:01:07');
INSERT INTO `activity_logs` VALUES('191','7','CREATE_TRANSACTION','TRX-20260901-0022 Rp 250.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 18:02:31');
INSERT INTO `activity_logs` VALUES('192','15','LOGIN','Login berhasil','140.213.51.104','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Mobile Safari/537.36','2026-09-01 18:07:16');
INSERT INTO `activity_logs` VALUES('193','1','IMPORT_USERS','template_import_user_karyawan_kasir.xlsx | baru:2 update:0 skip:0 gagal:0 staf-baru:2 staf-update:0','114.122.115.56','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 18:15:37');
INSERT INTO `activity_logs` VALUES('194','24','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.7.7 Mobile/15E148 Safari/604.1','2026-09-01 18:19:00');
INSERT INTO `activity_logs` VALUES('195','23','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 18:19:39');
INSERT INTO `activity_logs` VALUES('196','23','SELF_CHECKIN','employee KARYAWAN 4','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 18:21:44');
INSERT INTO `activity_logs` VALUES('197','24','SELF_CHECKIN','employee KARYAWAN 6','114.10.45.32','Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.7.7 Mobile/15E148 Safari/604.1','2026-09-01 18:22:35');
INSERT INTO `activity_logs` VALUES('198','7','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 18:23:16');
INSERT INTO `activity_logs` VALUES('199','1','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 18:23:58');
INSERT INTO `activity_logs` VALUES('200','1','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 18:27:46');
INSERT INTO `activity_logs` VALUES('201','7','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:30:18');
INSERT INTO `activity_logs` VALUES('202','7','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:40:54');
INSERT INTO `activity_logs` VALUES('203','1','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:41:15');
INSERT INTO `activity_logs` VALUES('204','1','UPDATE_MEMBER_LEVEL','Regular','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:44:10');
INSERT INTO `activity_logs` VALUES('205','1','UPDATE_MEMBER_LEVEL','Silver','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:44:27');
INSERT INTO `activity_logs` VALUES('206','1','UPDATE_MEMBER_LEVEL','Gold','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:44:44');
INSERT INTO `activity_logs` VALUES('207','1','UPDATE_MEMBER_LEVEL','Platinum','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:45:00');
INSERT INTO `activity_logs` VALUES('208','1','UPDATE_MEMBER_LEVEL','Gold','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:45:32');
INSERT INTO `activity_logs` VALUES('209','1','UPDATE_MEMBER_LEVEL','Platinum','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:45:50');
INSERT INTO `activity_logs` VALUES('210','1','UPDATE_MEMBER_LEVEL','Regular','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:46:57');
INSERT INTO `activity_logs` VALUES('211','1','UPDATE_MEMBER_LEVEL','Silver','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:47:21');
INSERT INTO `activity_logs` VALUES('212','1','UPDATE_MEMBER_LEVEL','Gold','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:47:37');
INSERT INTO `activity_logs` VALUES('213','1','UPDATE_MEMBER_LEVEL','Gold','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:47:49');
INSERT INTO `activity_logs` VALUES('214','1','UPDATE_MEMBER_LEVEL','Gold','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:48:06');
INSERT INTO `activity_logs` VALUES('215','1','UPDATE_MEMBER_LEVEL','Platinum','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:48:26');
INSERT INTO `activity_logs` VALUES('216','1','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:49:40');
INSERT INTO `activity_logs` VALUES('217','7','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:50:00');
INSERT INTO `activity_logs` VALUES('218','7','UPDATE_MEMBER','ID 4 - Ilham','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:51:56');
INSERT INTO `activity_logs` VALUES('219','7','UPDATE_MEMBER','ID 4 - Ilham','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:53:16');
INSERT INTO `activity_logs` VALUES('220','1','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:54:15');
INSERT INTO `activity_logs` VALUES('221','7','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:54:29');
INSERT INTO `activity_logs` VALUES('222','1','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:54:40');
INSERT INTO `activity_logs` VALUES('223','1','UPDATE_MEMBER_LEVEL','Regular','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:55:08');
INSERT INTO `activity_logs` VALUES('224','1','UPDATE_MEMBER_LEVEL','Silver','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:55:33');
INSERT INTO `activity_logs` VALUES('225','1','UPDATE_MEMBER_LEVEL','Regular','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:55:49');
INSERT INTO `activity_logs` VALUES('226','1','UPDATE_MEMBER_LEVEL','Silver','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:56:03');
INSERT INTO `activity_logs` VALUES('227','1','UPDATE_MEMBER','ID 3 - Adi','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:57:04');
INSERT INTO `activity_logs` VALUES('228','1','UPDATE_MEMBER_LEVEL','Regular','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:58:50');
INSERT INTO `activity_logs` VALUES('229','1','UPDATE_MEMBER_LEVEL','Gold','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 18:59:42');
INSERT INTO `activity_logs` VALUES('230','1','UPDATE_MEMBER','ID 3 - Adi','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 19:00:13');
INSERT INTO `activity_logs` VALUES('231','1','CREATE_TRANSACTION','TRX-20260901-0023 Rp 125.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 19:04:03');
INSERT INTO `activity_logs` VALUES('232','1','PRINT_THERMAL','TRX-20260901-0023 80mm custom','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 19:04:08');
INSERT INTO `activity_logs` VALUES('233','1','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 19:04:41');
INSERT INTO `activity_logs` VALUES('234','1','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 19:04:48');
INSERT INTO `activity_logs` VALUES('235','7','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 19:06:26');
INSERT INTO `activity_logs` VALUES('236','7','CREATE_TRANSACTION','TRX-20260901-0024 Rp 90.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 19:07:47');
INSERT INTO `activity_logs` VALUES('237','7','PRINT_THERMAL','TRX-20260901-0024 80mm custom','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 19:07:51');
INSERT INTO `activity_logs` VALUES('238','7','PRINT_THERMAL','TRX-20260901-0024 80mm custom','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 19:08:07');
INSERT INTO `activity_logs` VALUES('239','7','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 19:09:35');
INSERT INTO `activity_logs` VALUES('240','17','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/30.0 Chrome/143.0.0.0 Mobile Safari/537.36','2026-09-01 19:10:19');
INSERT INTO `activity_logs` VALUES('241','7','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 19:11:43');
INSERT INTO `activity_logs` VALUES('242','7','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 19:14:04');
INSERT INTO `activity_logs` VALUES('243','7','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 19:14:10');
INSERT INTO `activity_logs` VALUES('244','7','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 19:15:33');
INSERT INTO `activity_logs` VALUES('245','7','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 19:20:18');
INSERT INTO `activity_logs` VALUES('246','4','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 19:30:50');
INSERT INTO `activity_logs` VALUES('247','7','CREATE_TRANSACTION','TRX-20260901-0025 Rp 60.000','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 19:31:50');
INSERT INTO `activity_logs` VALUES('248','7','APPROVE_MEMBER_REGISTRATION','REG-260901-9EC76204 => MBR-260901-67BE05 - Jeje','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 19:35:47');
INSERT INTO `activity_logs` VALUES('249','4','CREATE_PRODUCT','1 Hair tonic','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 19:36:10');
INSERT INTO `activity_logs` VALUES('250','4','CREATE_PRODUCT','2 Minyak kemiri','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 19:37:59');
INSERT INTO `activity_logs` VALUES('251','4','CREATE_PRODUCT','3 Powder','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 19:39:20');
INSERT INTO `activity_logs` VALUES('252','3','LOGIN','Login berhasil','114.10.147.185','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 19:39:27');
INSERT INTO `activity_logs` VALUES('253','4','CREATE_PRODUCT','4 Sisir','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 19:41:02');
INSERT INTO `activity_logs` VALUES('254','7','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 19:41:50');
INSERT INTO `activity_logs` VALUES('255','1','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 19:42:01');
INSERT INTO `activity_logs` VALUES('256','1','UPDATE_PRODUCT','1 Hair tonic','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 19:42:33');
INSERT INTO `activity_logs` VALUES('257','1','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 19:42:44');
INSERT INTO `activity_logs` VALUES('258','1','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 19:43:12');
INSERT INTO `activity_logs` VALUES('259','1','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 19:46:39');
INSERT INTO `activity_logs` VALUES('260','1','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36','2026-09-01 19:47:07');
INSERT INTO `activity_logs` VALUES('261','1','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 19:47:16');
INSERT INTO `activity_logs` VALUES('262','1','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 19:47:45');
INSERT INTO `activity_logs` VALUES('263','1','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 19:54:22');
INSERT INTO `activity_logs` VALUES('264','7','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 19:55:07');
INSERT INTO `activity_logs` VALUES('265','7','PRINT_THERMAL','TRX-20260901-0025 80mm custom','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 20:01:06');
INSERT INTO `activity_logs` VALUES('266','7','PRINT_THERMAL','TRX-20260901-0009 80mm custom','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 20:02:02');
INSERT INTO `activity_logs` VALUES('267','7','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 20:02:15');
INSERT INTO `activity_logs` VALUES('268','1','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 20:02:44');
INSERT INTO `activity_logs` VALUES('269','1','SELECT_HARDWARE','receipt_printer ID 12','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 20:03:27');
INSERT INTO `activity_logs` VALUES('270','1','SELECT_HARDWARE','card_printer ID 1','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 20:03:39');
INSERT INTO `activity_logs` VALUES('271','1','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 20:03:45');
INSERT INTO `activity_logs` VALUES('272','7','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 20:04:09');
INSERT INTO `activity_logs` VALUES('273','7','PRINT_THERMAL','TRX-20260901-0024 80mm custom','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 20:04:18');
INSERT INTO `activity_logs` VALUES('274','7','PRINT_THERMAL','TRX-20260901-0024 80mm custom','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 20:04:41');
INSERT INTO `activity_logs` VALUES('275','7','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 20:04:48');
INSERT INTO `activity_logs` VALUES('276','1','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 20:05:05');
INSERT INTO `activity_logs` VALUES('277','1','SELECT_HARDWARE','receipt_printer ID 12','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 20:06:25');
INSERT INTO `activity_logs` VALUES('278','1','SELECT_HARDWARE','card_printer ID 1','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 20:06:34');
INSERT INTO `activity_logs` VALUES('279','1','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 20:06:35');
INSERT INTO `activity_logs` VALUES('280','7','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 20:07:10');
INSERT INTO `activity_logs` VALUES('281','7','PRINT_THERMAL','TRX-20260901-0024 80mm custom','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 20:07:20');
INSERT INTO `activity_logs` VALUES('282','7','PRINT_THERMAL','TRX-20260901-0024 80mm custom','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 20:07:37');
INSERT INTO `activity_logs` VALUES('283','7','LOGOUT','Logout','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 20:07:56');
INSERT INTO `activity_logs` VALUES('284','1','LOGIN','Login berhasil','114.122.115.56','Mozilla/5.0 (iPhone; CPU iPhone OS 26_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/152.0.7977.64 Mobile/15E148 Safari/604.1','2026-09-01 20:09:27');
INSERT INTO `activity_logs` VALUES('285','17','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/30.0 Chrome/143.0.0.0 Mobile Safari/537.36','2026-09-01 20:25:33');
INSERT INTO `activity_logs` VALUES('286','1','LOGIN','Login berhasil','114.122.115.56','Mozilla/5.0 (iPhone; CPU iPhone OS 26_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/152.0.7977.64 Mobile/15E148 Safari/604.1','2026-09-01 20:25:59');
INSERT INTO `activity_logs` VALUES('287','4','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 20:27:46');
INSERT INTO `activity_logs` VALUES('288','13','LOGIN','Login berhasil','182.253.123.30','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36','2026-09-01 20:28:50');
INSERT INTO `activity_logs` VALUES('289','3','LOGIN','Login berhasil','114.10.146.185','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 20:30:32');
INSERT INTO `activity_logs` VALUES('290','3','EXPORT_REPORT','PDF Rekap Bonus Barber 2026-09-01 s.d. 2026-09-01','114.10.146.185','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 20:32:06');
INSERT INTO `activity_logs` VALUES('291','23','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 20:32:46');
INSERT INTO `activity_logs` VALUES('292','24','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.7.7 Mobile/15E148 Safari/604.1','2026-09-01 20:33:04');
INSERT INTO `activity_logs` VALUES('293','23','SELF_CHECKOUT','employee KARYAWAN 4','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 20:34:33');
INSERT INTO `activity_logs` VALUES('294','16','LOGIN','Login berhasil','114.10.45.32','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36','2026-09-01 20:36:45');
INSERT INTO `activity_logs` VALUES('295','9','LOGIN','Login berhasil','114.122.115.81','Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Mobile/15E148 Safari/604.1','2026-09-01 20:37:58');
INSERT INTO `activity_logs` VALUES('296','3','EXPORT_REPORT','PDF Kinerja Petugas Barber 2026-09-01 s.d. 2026-09-01','114.10.147.185','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 20:39:29');
INSERT INTO `activity_logs` VALUES('297','9','LOGOUT','Logout','114.122.115.81','Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Mobile/15E148 Safari/604.1','2026-09-01 20:40:05');
INSERT INTO `activity_logs` VALUES('298','5','LOGIN','Login berhasil','114.122.115.81','Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Mobile/15E148 Safari/604.1','2026-09-01 20:40:16');
INSERT INTO `activity_logs` VALUES('299','5','LOGOUT','Logout','114.122.115.81','Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Mobile/15E148 Safari/604.1','2026-09-01 20:41:52');
INSERT INTO `activity_logs` VALUES('300','9','LOGIN','Login berhasil','114.122.115.81','Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Mobile/15E148 Safari/604.1','2026-09-01 20:42:04');
INSERT INTO `activity_logs` VALUES('301','12','LOGIN','Login berhasil','103.99.27.117','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Mobile Safari/537.36','2026-09-01 21:20:20');
INSERT INTO `activity_logs` VALUES('302','3','PAY_BONUS','Bonus ID 27','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:27:46');
INSERT INTO `activity_logs` VALUES('303','3','PAY_BONUS','Bonus ID 26','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:27:47');
INSERT INTO `activity_logs` VALUES('304','3','PAY_BONUS','Bonus ID 25','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:27:48');
INSERT INTO `activity_logs` VALUES('305','3','PAY_BONUS','Bonus ID 24','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:27:49');
INSERT INTO `activity_logs` VALUES('306','3','PAY_BONUS','Bonus ID 23','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:27:51');
INSERT INTO `activity_logs` VALUES('307','3','PAY_BONUS','Bonus ID 22','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:27:54');
INSERT INTO `activity_logs` VALUES('308','3','PAY_BONUS','Bonus ID 21','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:27:56');
INSERT INTO `activity_logs` VALUES('309','3','PAY_BONUS','Bonus ID 20','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:27:59');
INSERT INTO `activity_logs` VALUES('310','3','PAY_BONUS','Bonus ID 19','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:28:02');
INSERT INTO `activity_logs` VALUES('311','3','PAY_BONUS','Bonus ID 18','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:28:04');
INSERT INTO `activity_logs` VALUES('312','3','PAY_BONUS','Bonus ID 17','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:28:07');
INSERT INTO `activity_logs` VALUES('313','3','PAY_BONUS','Bonus ID 16','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:28:12');
INSERT INTO `activity_logs` VALUES('314','3','PAY_BONUS','Bonus ID 15','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:28:22');
INSERT INTO `activity_logs` VALUES('315','3','PAY_BONUS','Bonus ID 14','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:28:24');
INSERT INTO `activity_logs` VALUES('316','3','PAY_BONUS','Bonus ID 13','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:28:27');
INSERT INTO `activity_logs` VALUES('317','3','PAY_BONUS','Bonus ID 12','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:28:29');
INSERT INTO `activity_logs` VALUES('318','3','PAY_BONUS','Bonus ID 11','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:28:32');
INSERT INTO `activity_logs` VALUES('319','3','PAY_BONUS','Bonus ID 10','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:28:35');
INSERT INTO `activity_logs` VALUES('320','3','PAY_BONUS','Bonus ID 9','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:28:37');
INSERT INTO `activity_logs` VALUES('321','3','PAY_BONUS','Bonus ID 8','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:28:40');
INSERT INTO `activity_logs` VALUES('322','3','PAY_BONUS','Bonus ID 7','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:28:43');
INSERT INTO `activity_logs` VALUES('323','3','PAY_BONUS','Bonus ID 6','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:28:45');
INSERT INTO `activity_logs` VALUES('324','3','PAY_BONUS','Bonus ID 5','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:28:47');
INSERT INTO `activity_logs` VALUES('325','3','PAY_BONUS','Bonus ID 4','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:28:51');
INSERT INTO `activity_logs` VALUES('326','3','PAY_BONUS','Bonus ID 3','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:28:54');
INSERT INTO `activity_logs` VALUES('327','3','PAY_BONUS','Bonus ID 2','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15','2026-09-01 21:28:58');
INSERT INTO `activity_logs` VALUES('328','9','LOGIN','Login berhasil','113.11.180.1','Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Mobile/15E148 Safari/604.1','2026-09-01 21:55:20');
INSERT INTO `activity_logs` VALUES('329','1','LOGIN','Login berhasil','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 23:05:03');
INSERT INTO `activity_logs` VALUES('330','1','LOGIN','Login berhasil','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36','2026-09-02 04:15:59');
INSERT INTO `activity_logs` VALUES('331','1','LOGIN','Login berhasil','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.2 Safari/605.1.15','2026-09-02 04:16:28');
INSERT INTO `activity_logs` VALUES('332','1','LOGOUT','Logout','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.2 Safari/605.1.15','2026-09-02 04:16:38');
INSERT INTO `activity_logs` VALUES('333','1','LOGIN','Login berhasil','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-02 04:16:46');
INSERT INTO `activity_logs` VALUES('334','1','LOGOUT','Logout','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-02 04:17:47');
INSERT INTO `activity_logs` VALUES('335','1','LOGIN','Login berhasil','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-02 04:19:05');
INSERT INTO `activity_logs` VALUES('336','1','CREATE_BACKUP','full_data full_data_20260902_041914.zip','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-02 04:19:15');
INSERT INTO `activity_logs` VALUES('337','1','DOWNLOAD_BACKUP','full_data_20260902_041914.zip','118.99.81.37','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-02 04:19:18');

DROP TABLE IF EXISTS `announcements`;
CREATE TABLE `announcements` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `title` varchar(180) NOT NULL,
  `body` text NOT NULL,
  `announcement_type` enum('info','success','warning','danger','primary') NOT NULL DEFAULT 'info',
  `show_login` tinyint(1) NOT NULL DEFAULT 1,
  `show_dashboard` tinyint(1) NOT NULL DEFAULT 1,
  `show_all_pages` tinyint(1) NOT NULL DEFAULT 0,
  `start_at` datetime DEFAULT NULL,
  `end_at` datetime DEFAULT NULL,
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `created_by` int(11) DEFAULT NULL,
  `updated_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `created_by` (`created_by`),
  KEY `updated_by` (`updated_by`),
  KEY `idx_announcement_active` (`is_active`,`start_at`,`end_at`),
  KEY `idx_announcement_location` (`show_login`,`show_dashboard`,`show_all_pages`),
  CONSTRAINT `announcements_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL,
  CONSTRAINT `announcements_ibfk_2` FOREIGN KEY (`updated_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `attendance_devices`;
CREATE TABLE `attendance_devices` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `device_name` varchar(150) NOT NULL,
  `device_code` varchar(80) NOT NULL,
  `api_token` varchar(128) NOT NULL,
  `device_type` enum('card','fingerprint','face_id','hybrid') NOT NULL DEFAULT 'hybrid',
  `location_name` varchar(150) DEFAULT NULL,
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `created_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `device_code` (`device_code`),
  UNIQUE KEY `api_token` (`api_token`),
  KEY `created_by` (`created_by`),
  KEY `idx_att_device_active` (`is_active`),
  CONSTRAINT `attendance_devices_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `attendance_records`;
CREATE TABLE `attendance_records` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `staff_type` enum('barber','employee') NOT NULL,
  `staff_id` int(11) NOT NULL,
  `attendance_date` date NOT NULL,
  `check_in` datetime DEFAULT NULL,
  `check_out` datetime DEFAULT NULL,
  `check_in_method` enum('card','fingerprint','face_id','manual') DEFAULT NULL,
  `check_in_photo` varchar(255) DEFAULT NULL,
  `check_out_method` enum('card','fingerprint','face_id','manual') DEFAULT NULL,
  `check_out_photo` varchar(255) DEFAULT NULL,
  `device_id` int(11) DEFAULT NULL,
  `notes` varchar(255) DEFAULT NULL,
  `created_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_attendance_staff_day` (`staff_type`,`staff_id`,`attendance_date`),
  KEY `device_id` (`device_id`),
  KEY `created_by` (`created_by`),
  KEY `idx_attendance_date` (`attendance_date`),
  KEY `idx_attendance_staff` (`staff_type`,`staff_id`),
  CONSTRAINT `attendance_records_ibfk_1` FOREIGN KEY (`device_id`) REFERENCES `attendance_devices` (`id`) ON DELETE SET NULL,
  CONSTRAINT `attendance_records_ibfk_2` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `attendance_records` VALUES('1','barber','1','2026-09-01','2026-09-01 14:40:36',NULL,'manual','uploads/attendance_photos/selfie_barber_1_20260901144036_71433b0a.jpg',NULL,NULL,NULL,NULL,'11','2026-09-01 14:40:36','2026-09-01 14:40:36');
INSERT INTO `attendance_records` VALUES('2','employee','6','2026-09-01','2026-09-01 18:21:44','2026-09-01 20:34:33','manual','uploads/attendance_photos/selfie_employee_6_20260901182144_00394ea0.jpg','manual','uploads/attendance_photos/selfie_employee_6_20260901203433_427bebf7.jpg',NULL,NULL,'23','2026-09-01 18:21:44','2026-09-01 20:34:33');
INSERT INTO `attendance_records` VALUES('3','employee','7','2026-09-01','2026-09-01 18:22:35',NULL,'manual','uploads/attendance_photos/selfie_employee_7_20260901182235_a5b08b05.jpg',NULL,NULL,NULL,NULL,'24','2026-09-01 18:22:35','2026-09-01 18:22:35');

DROP TABLE IF EXISTS `backup_history`;
CREATE TABLE `backup_history` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `backup_type` enum('database','full_data') NOT NULL,
  `file_name` varchar(255) NOT NULL,
  `file_size` bigint(20) NOT NULL DEFAULT 0,
  `checksum_sha256` varchar(64) DEFAULT NULL,
  `created_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `created_by` (`created_by`),
  KEY `idx_backup_created` (`created_at`),
  CONSTRAINT `backup_history_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `backup_history` VALUES('1','full_data','full_data_20260902_041914.zip','13589484','8040baf75c6979350f4c00d68e0a68df43554f492e618813d3d75fc4b3c38934','1','2026-09-02 04:19:15');

DROP TABLE IF EXISTS `barber_staff`;
CREATE TABLE `barber_staff` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `staff_code` varchar(40) NOT NULL,
  `name` varchar(150) NOT NULL,
  `phone` varchar(40) DEFAULT NULL,
  `email` varchar(150) DEFAULT NULL,
  `photo_path` varchar(255) DEFAULT NULL,
  `address` text DEFAULT NULL,
  `specialty` varchar(150) DEFAULT NULL,
  `join_date` date DEFAULT NULL,
  `employment_status` enum('permanent','contract','freelance') NOT NULL DEFAULT 'permanent',
  `bonus_type` enum('service','percentage','fixed') NOT NULL DEFAULT 'service',
  `bonus_value` decimal(15,2) NOT NULL DEFAULT 0.00,
  `notes` text DEFAULT NULL,
  `photo` varchar(255) DEFAULT NULL,
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `created_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `staff_code` (`staff_code`),
  UNIQUE KEY `user_id` (`user_id`),
  KEY `created_by` (`created_by`),
  KEY `idx_barber_staff_active` (`is_active`,`name`),
  CONSTRAINT `barber_staff_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL,
  CONSTRAINT `barber_staff_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL,
  CONSTRAINT `fk_barber_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `barber_staff` VALUES('1','11','CPS-1','Adi - Adi Sujana','089655802594','adisujana29@gmail.com',NULL,'Bandung','Capster','2026-09-01','permanent','service','0.00','',NULL,'1','1','2026-09-01 10:44:17','2026-09-01 17:38:03');
INSERT INTO `barber_staff` VALUES('2','12','CPS-2','Ayong - Ridwan Firdaus','082115005100','laisyamura@gmail.com',NULL,'Bandung','Capster','2026-09-01','permanent','service','0.00','',NULL,'1','1','2026-09-01 10:44:18','2026-09-01 17:39:06');
INSERT INTO `barber_staff` VALUES('3','13','CPS-3','Yanyan - Ian Septian','0882001340239','yanyan@gmail.com',NULL,'Bandung','Capster','2026-09-01','permanent','service','0.00','',NULL,'1','1','2026-09-01 10:44:18','2026-09-01 17:38:27');
INSERT INTO `barber_staff` VALUES('4','14','CPS-4','Uway - Daud Somantri','081218543978','somantridaud43@gmail.com',NULL,'Bandung','Capster','2026-09-01','permanent','service','0.00','',NULL,'1','1','2026-09-01 10:44:18','2026-09-01 17:38:14');
INSERT INTO `barber_staff` VALUES('5','15','CPS-5','Angga - Rangga Erlangga','083117031561','garaalex2222@gmail.com',NULL,'Bandung','Capster','2026-09-01','permanent','service','0.00','',NULL,'1','1','2026-09-01 10:44:18','2026-09-01 17:38:40');
INSERT INTO `barber_staff` VALUES('6','16','CPS-6','Ikbal - Rian Ikbal','082321830708','martet@gmail.com',NULL,'Bandung','Capster','2026-09-01','permanent','service','0.00','',NULL,'1','1','2026-09-01 10:44:18','2026-09-01 17:38:54');
INSERT INTO `barber_staff` VALUES('7','17','CPS-7','Tantan','081223779337','tantansetiawan90@gmail.com',NULL,'Bandung','Capster','2026-09-01','permanent','service','0.00',NULL,NULL,'1','1','2026-09-01 10:44:18','2026-09-01 10:44:18');

DROP TABLE IF EXISTS `bonuses`;
CREATE TABLE `bonuses` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `transaction_id` bigint(20) NOT NULL,
  `barber_id` int(11) DEFAULT NULL,
  `barber_staff_id` int(11) DEFAULT NULL,
  `amount` decimal(15,2) NOT NULL,
  `description` varchar(255) DEFAULT NULL,
  `status` enum('unpaid','paid') NOT NULL DEFAULT 'unpaid',
  `paid_at` datetime DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `transaction_id` (`transaction_id`),
  KEY `barber_id` (`barber_id`),
  KEY `idx_bonus_barber_staff` (`barber_staff_id`),
  KEY `idx_bonus_status` (`status`,`created_at`),
  CONSTRAINT `bonuses_ibfk_1` FOREIGN KEY (`transaction_id`) REFERENCES `transactions` (`id`) ON DELETE CASCADE,
  CONSTRAINT `bonuses_ibfk_2` FOREIGN KEY (`barber_id`) REFERENCES `users` (`id`) ON DELETE SET NULL,
  CONSTRAINT `bonuses_ibfk_3` FOREIGN KEY (`barber_staff_id`) REFERENCES `barber_staff` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `bonuses` VALUES('2','4',NULL,'7','25000.00','Bonus Haircut x1','paid','2026-09-01 21:28:58','2026-09-01 11:40:38');
INSERT INTO `bonuses` VALUES('3','5',NULL,'3','25000.00','Bonus Haircut - Softopening x1','paid','2026-09-01 21:28:54','2026-09-01 11:56:43');
INSERT INTO `bonuses` VALUES('4','6',NULL,'2','25000.00','Bonus Haircut x1','paid','2026-09-01 21:28:51','2026-09-01 11:57:13');
INSERT INTO `bonuses` VALUES('5','7',NULL,'7','25000.00','Bonus Haircut x1','paid','2026-09-01 21:28:47','2026-09-01 12:14:26');
INSERT INTO `bonuses` VALUES('6','8',NULL,'6','25000.00','Bonus Haircut x1','paid','2026-09-01 21:28:45','2026-09-01 12:19:41');
INSERT INTO `bonuses` VALUES('7','9',NULL,'7','25000.00','Bonus Haircut - Softopening x1','paid','2026-09-01 21:28:43','2026-09-01 12:57:43');
INSERT INTO `bonuses` VALUES('8','10',NULL,'1','25000.00','Bonus Haircut - Softopening x1','paid','2026-09-01 21:28:40','2026-09-01 13:08:31');
INSERT INTO `bonuses` VALUES('9','11',NULL,'5','25000.00','Bonus Haircut - Softopening x1','paid','2026-09-01 21:28:37','2026-09-01 13:14:32');
INSERT INTO `bonuses` VALUES('10','12',NULL,'1','25000.00','Bonus Haircut x1','paid','2026-09-01 21:28:35','2026-09-01 13:29:09');
INSERT INTO `bonuses` VALUES('11','13',NULL,'7','25000.00','Bonus Haircut x1','paid','2026-09-01 21:28:32','2026-09-01 13:31:50');
INSERT INTO `bonuses` VALUES('12','14',NULL,'2','25000.00','Bonus Haircut - Softopening x1','paid','2026-09-01 21:28:29','2026-09-01 14:13:42');
INSERT INTO `bonuses` VALUES('13','15',NULL,'3','40000.00','Bonus Hair Cut + Massage x1','paid','2026-09-01 21:28:27','2026-09-01 14:14:16');
INSERT INTO `bonuses` VALUES('14','16',NULL,'7','25000.00','Bonus Haircut x1','paid','2026-09-01 21:28:24','2026-09-01 14:32:58');
INSERT INTO `bonuses` VALUES('15','17',NULL,'2','25000.00','Bonus Haircut - Softopening x1','paid','2026-09-01 21:28:22','2026-09-01 15:13:42');
INSERT INTO `bonuses` VALUES('16','18',NULL,'5','25000.00','Bonus Haircut - Softopening x1','paid','2026-09-01 21:28:12','2026-09-01 15:47:49');
INSERT INTO `bonuses` VALUES('17','19',NULL,'2','25000.00','Bonus Haircut - Softopening x1','paid','2026-09-01 21:28:07','2026-09-01 15:48:22');
INSERT INTO `bonuses` VALUES('18','20',NULL,'6','40000.00','Bonus Hair Cut + Massage x1','paid','2026-09-01 21:28:04','2026-09-01 16:02:23');
INSERT INTO `bonuses` VALUES('19','21',NULL,'5','15000.00','Bonus Massage x1','paid','2026-09-01 21:28:02','2026-09-01 16:40:00');
INSERT INTO `bonuses` VALUES('20','22',NULL,'6','25000.00','Bonus Haircut - Softopening x1','paid','2026-09-01 21:27:59','2026-09-01 17:12:48');
INSERT INTO `bonuses` VALUES('21','23',NULL,'2','25000.00','Bonus Haircut - Softopening x1','paid','2026-09-01 21:27:56','2026-09-01 17:14:17');
INSERT INTO `bonuses` VALUES('22','24',NULL,'5','25000.00','Bonus Haircut x1','paid','2026-09-01 21:27:54','2026-09-01 17:59:18');
INSERT INTO `bonuses` VALUES('23','25',NULL,'2','40000.00','Bonus Hair Cut + Massage x1','paid','2026-09-01 21:27:51','2026-09-01 18:02:31');
INSERT INTO `bonuses` VALUES('24','25',NULL,'3','40000.00','Bonus Hair Cut + Massage x1','paid','2026-09-01 21:27:49','2026-09-01 18:02:31');
INSERT INTO `bonuses` VALUES('25','26',NULL,'2','40000.00','Bonus Hair Cut + Massage x1','paid','2026-09-01 21:27:48','2026-09-01 19:04:03');
INSERT INTO `bonuses` VALUES('26','27',NULL,'7','25000.00','Bonus Haircut x1','paid','2026-09-01 21:27:47','2026-09-01 19:07:47');
INSERT INTO `bonuses` VALUES('27','28',NULL,'1','20000.00','Bonus Hair Mask x1','paid','2026-09-01 21:27:46','2026-09-01 19:31:50');

DROP TABLE IF EXISTS `card_design_templates`;
CREATE TABLE `card_design_templates` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `template_name` varchar(120) NOT NULL,
  `template_key` varchar(80) NOT NULL,
  `template_type` enum('builtin','custom') NOT NULL DEFAULT 'builtin',
  `front_background` varchar(255) DEFAULT NULL,
  `back_background` varchar(255) DEFAULT NULL,
  `primary_color` varchar(20) DEFAULT NULL,
  `accent_color` varchar(20) DEFAULT NULL,
  `text_color` varchar(20) DEFAULT NULL,
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `created_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `template_key` (`template_key`),
  KEY `created_by` (`created_by`),
  KEY `idx_card_template_active` (`is_active`,`template_type`),
  CONSTRAINT `card_design_templates_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=4337 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `card_design_templates` VALUES('1','Prestige Dark','prestige_dark','builtin',NULL,NULL,'#172554','#d4af37','#ffffff','1',NULL,'2026-09-01 09:43:29','2026-09-01 09:43:29');
INSERT INTO `card_design_templates` VALUES('2','Royal Gold','royal_gold','builtin',NULL,NULL,'#21170b','#d6ad60','#fff8e7','1',NULL,'2026-09-01 09:43:29','2026-09-01 09:43:29');
INSERT INTO `card_design_templates` VALUES('3','Minimal Light','minimal_light','builtin',NULL,NULL,'#f8fafc','#172554','#111827','1',NULL,'2026-09-01 09:43:29','2026-09-01 09:43:29');
INSERT INTO `card_design_templates` VALUES('4','Barber Classic','barber_classic','builtin',NULL,NULL,'#7f1d1d','#f5f5f4','#ffffff','1',NULL,'2026-09-01 09:43:29','2026-09-01 09:43:29');
INSERT INTO `card_design_templates` VALUES('5','Midnight Blue','midnight_blue','builtin',NULL,NULL,'#020617','#38bdf8','#f8fafc','1',NULL,'2026-09-01 09:43:29','2026-09-01 09:43:29');
INSERT INTO `card_design_templates` VALUES('1906','Prestige Black Edition','custom_20260901131029_c7f042','custom','uploads/card_designs/card_front_20260901131029_425a4a3c.png','uploads/card_designs/card_back_20260901131029_76ecbbf1.png','#172554','#d4af37','#ffffff','1','1','2026-09-01 13:10:29','2026-09-01 13:10:29');

DROP TABLE IF EXISTS `catalog_import_batches`;
CREATE TABLE `catalog_import_batches` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `import_type` enum('services','products') NOT NULL,
  `file_name` varchar(255) NOT NULL,
  `duplicate_mode` enum('skip','update') NOT NULL DEFAULT 'skip',
  `total_rows` int(11) NOT NULL DEFAULT 0,
  `inserted_rows` int(11) NOT NULL DEFAULT 0,
  `updated_rows` int(11) NOT NULL DEFAULT 0,
  `skipped_rows` int(11) NOT NULL DEFAULT 0,
  `failed_rows` int(11) NOT NULL DEFAULT 0,
  `imported_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `idx_catalog_import_type_created` (`import_type`,`created_at`),
  KEY `idx_catalog_import_user` (`imported_by`,`created_at`),
  CONSTRAINT `catalog_import_batches_ibfk_1` FOREIGN KEY (`imported_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `catalog_import_rows`;
CREATE TABLE `catalog_import_rows` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `batch_id` bigint(20) NOT NULL,
  `row_number` int(11) NOT NULL,
  `item_key` varchar(120) DEFAULT NULL,
  `item_name` varchar(180) DEFAULT NULL,
  `action_type` enum('insert','update','skip','error') NOT NULL,
  `status` enum('success','warning','error') NOT NULL DEFAULT 'success',
  `message` varchar(1000) DEFAULT NULL,
  `reference_id` bigint(20) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `idx_catalog_import_rows_batch` (`batch_id`,`row_number`),
  KEY `idx_catalog_import_rows_status` (`batch_id`,`status`),
  CONSTRAINT `catalog_import_rows_ibfk_1` FOREIGN KEY (`batch_id`) REFERENCES `catalog_import_batches` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `customer_display_state`;
CREATE TABLE `customer_display_state` (
  `user_id` int(11) NOT NULL,
  `state_json` longtext DEFAULT NULL,
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`user_id`),
  CONSTRAINT `customer_display_state_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `customer_display_state` VALUES('1','{\"active\":true,\"status\":\"completed\",\"member_name\":\"Pelanggan Umum\",\"member_info\":\"\",\"items\":[{\"name\":\"Hair Cut + Massage\",\"qty\":1,\"barber\":\"Ayong - Ridwan Firdaus · CPS-2\",\"discount\":0,\"subtotal\":125000}],\"subtotal\":125000,\"service_discount\":0,\"member_discount\":0,\"extra_discount\":0,\"tax\":0,\"tax_rate\":0,\"total\":125000,\"method\":\"QRIS\",\"payment_status\":\"paid\",\"paid\":125000,\"change\":0,\"server_time\":\"2026-09-01T19:03:55+07:00\",\"invoice\":\"TRX-20260901-0023\"}','2026-09-01 19:04:03');
INSERT INTO `customer_display_state` VALUES('4','{\"active\":true,\"status\":\"editing\",\"member_name\":\"Pelanggan Umum\",\"member_info\":\"\",\"items\":[],\"subtotal\":0,\"service_discount\":0,\"member_discount\":0,\"extra_discount\":0,\"tax\":0,\"tax_rate\":0,\"total\":0,\"method\":\"Cash\",\"payment_status\":\"paid\",\"paid\":0,\"change\":0,\"server_time\":\"2026-09-01T11:00:41+07:00\"}','2026-09-01 11:00:41');
INSERT INTO `customer_display_state` VALUES('5','{\"active\":true,\"status\":\"editing\",\"member_name\":\"Pelanggan Umum\",\"member_info\":\"\",\"items\":[],\"subtotal\":0,\"service_discount\":0,\"member_discount\":0,\"extra_discount\":0,\"tax\":0,\"tax_rate\":0,\"total\":0,\"method\":\"Cash\",\"payment_status\":\"paid\",\"paid\":0,\"change\":0,\"server_time\":\"2026-09-01T13:20:56+07:00\"}','2026-09-01 13:20:56');
INSERT INTO `customer_display_state` VALUES('6','{\"active\":true,\"status\":\"completed\",\"member_name\":\"Pelanggan Umum\",\"member_info\":\"\",\"items\":[{\"name\":\"Haircut - Softopening\",\"qty\":1,\"barber\":\"Ridwan Firdaus · CPS-2\",\"discount\":0,\"subtotal\":80000}],\"subtotal\":80000,\"service_discount\":0,\"member_discount\":0,\"extra_discount\":0,\"tax\":0,\"tax_rate\":0,\"total\":80000,\"method\":\"QRIS\",\"payment_status\":\"paid\",\"paid\":80000,\"change\":0,\"server_time\":\"2026-09-01T11:14:07+07:00\",\"invoice\":\"TRX-20260901-0003\"}','2026-09-01 11:14:16');
INSERT INTO `customer_display_state` VALUES('7','{\"active\":true,\"status\":\"editing\",\"member_name\":\"Pelanggan Umum\",\"member_info\":\"\",\"items\":[],\"subtotal\":0,\"service_discount\":0,\"member_discount\":0,\"extra_discount\":0,\"tax\":0,\"tax_rate\":0,\"total\":0,\"method\":\"Cash\",\"payment_status\":\"paid\",\"paid\":0,\"change\":0,\"server_time\":\"2026-09-01T19:32:40+07:00\"}','2026-09-01 19:32:40');

DROP TABLE IF EXISTS `employee_earnings`;
CREATE TABLE `employee_earnings` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `employee_id` int(11) NOT NULL,
  `earning_date` date NOT NULL,
  `earning_type` enum('salary','commission','bonus','overtime','allowance','other') NOT NULL DEFAULT 'salary',
  `amount` decimal(15,2) NOT NULL DEFAULT 0.00,
  `description` varchar(255) DEFAULT NULL,
  `status` enum('unpaid','paid') NOT NULL DEFAULT 'unpaid',
  `paid_at` datetime DEFAULT NULL,
  `created_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `created_by` (`created_by`),
  KEY `idx_employee_earning_date` (`earning_date`),
  KEY `idx_employee_earning_staff` (`employee_id`,`status`),
  CONSTRAINT `employee_earnings_ibfk_1` FOREIGN KEY (`employee_id`) REFERENCES `employee_staff` (`id`) ON DELETE CASCADE,
  CONSTRAINT `employee_earnings_ibfk_2` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `employee_staff`;
CREATE TABLE `employee_staff` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `employee_code` varchar(40) NOT NULL,
  `name` varchar(150) NOT NULL,
  `phone` varchar(40) DEFAULT NULL,
  `email` varchar(150) DEFAULT NULL,
  `job_title` varchar(100) DEFAULT NULL,
  `employment_status` enum('Tetap','Kontrak','Freelance','Harian') NOT NULL DEFAULT 'Tetap',
  `join_date` date DEFAULT NULL,
  `base_salary` decimal(15,2) NOT NULL DEFAULT 0.00,
  `notes` text DEFAULT NULL,
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `employee_code` (`employee_code`),
  UNIQUE KEY `user_id` (`user_id`),
  KEY `idx_employee_name` (`name`),
  KEY `idx_employee_active` (`is_active`),
  CONSTRAINT `employee_staff_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL,
  CONSTRAINT `fk_employee_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `employee_staff` VALUES('1','18','OB-1','Suradiman','087871679787','sukmawatisukmawati1991@gmail.com','Office Boy','Tetap','2026-09-01','0.00',NULL,'1','2026-09-01 10:44:18','2026-09-01 10:44:18');
INSERT INTO `employee_staff` VALUES('2','19','KRYW-1','Niken Fitri Nabilah','085871614716','nikenfitri07@gmail.com','Karyawan 1','Tetap','2026-09-01','0.00','1','1','2026-09-01 17:50:33','2026-09-01 17:50:33');
INSERT INTO `employee_staff` VALUES('3','20','KRYW-2','Adi Sujana','089655802594','adisujana29@gmail.com','Karyawan 2','Tetap','2026-09-01','0.00','1','1','2026-09-01 17:50:33','2026-09-01 17:50:33');
INSERT INTO `employee_staff` VALUES('4','21','KRYW-3','Zharfandy Muhammad','087724005132','zharfandymuhammad@gmail.com','Karyawan 3','Tetap','2026-09-01','0.00','1','1','2026-09-01 17:50:33','2026-09-01 17:50:33');
INSERT INTO `employee_staff` VALUES('5','22','KRYW-5','Rini Rimasari','08814540911','karinirimasari@gmail.com','Karyawan 5','Tetap','2026-09-01','0.00','1','1','2026-09-01 17:50:34','2026-09-01 17:50:34');
INSERT INTO `employee_staff` VALUES('6','23','KARYAWAN 4','Manda Danaya','085960278288','mandadanaya26@gmail.com','Karyawan 4','Tetap','2026-09-01','0.00','1','1','2026-09-01 18:15:37','2026-09-01 18:15:37');
INSERT INTO `employee_staff` VALUES('7','24','KARYAWAN 6','Andina Okta Mulyati','088218308558','andinaoktamulyati1510@gmail.com','Karyawan 6','Tetap','2026-09-01','0.00','1','1','2026-09-01 18:15:37','2026-09-01 18:15:37');

DROP TABLE IF EXISTS `expenses`;
CREATE TABLE `expenses` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `expense_date` date NOT NULL,
  `category_id` int(11) DEFAULT NULL,
  `category` varchar(100) NOT NULL,
  `description` text NOT NULL,
  `amount` decimal(15,2) NOT NULL,
  `payment_method` varchar(50) NOT NULL DEFAULT 'Cash',
  `evidence_file_1` varchar(255) DEFAULT NULL,
  `evidence_file_2` varchar(255) DEFAULT NULL,
  `source_type` varchar(50) NOT NULL DEFAULT 'manual',
  `source_id` bigint(20) DEFAULT NULL,
  `source_ref` varchar(180) DEFAULT NULL,
  `created_by` int(11) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `created_by` (`created_by`),
  KEY `idx_expense_date` (`expense_date`),
  KEY `idx_expense_category` (`category_id`),
  KEY `idx_expense_source` (`source_type`,`source_id`),
  CONSTRAINT `expenses_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `finance_categories` (`id`) ON DELETE SET NULL,
  CONSTRAINT `expenses_ibfk_2` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `finance_categories`;
CREATE TABLE `finance_categories` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `type` enum('income','expense') NOT NULL,
  `code` varchar(40) DEFAULT NULL,
  `name` varchar(120) NOT NULL,
  `description` varchar(255) DEFAULT NULL,
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `sort_order` int(11) NOT NULL DEFAULT 0,
  `created_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_finance_category_type_name` (`type`,`name`),
  UNIQUE KEY `uq_finance_category_type_code` (`type`,`code`),
  KEY `created_by` (`created_by`),
  KEY `idx_finance_category` (`type`,`is_active`,`sort_order`),
  CONSTRAINT `finance_categories_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `finance_categories` VALUES('1','income','INC-OTHER','Pemasukan Lainnya','Pemasukan non-transaksi jasa','1','10',NULL,'2026-09-01 09:43:31','2026-09-01 09:43:31');
INSERT INTO `finance_categories` VALUES('2','income','INC-CAPITAL','Penambahan Modal','Setoran atau penambahan modal usaha','1','20',NULL,'2026-09-01 09:43:31','2026-09-01 09:43:31');
INSERT INTO `finance_categories` VALUES('3','income','INC-ASSET','Penjualan Aset','Hasil penjualan aset/peralatan','1','30',NULL,'2026-09-01 09:43:31','2026-09-01 09:43:31');
INSERT INTO `finance_categories` VALUES('4','expense','EXP-OPS','Operasional','Biaya operasional rutin','1','10',NULL,'2026-09-01 09:43:31','2026-09-01 09:43:31');
INSERT INTO `finance_categories` VALUES('5','expense','EXP-SUPPLY','Bahan & Persediaan','Pembelian bahan, produk, dan persediaan','1','20',NULL,'2026-09-01 09:43:31','2026-09-01 09:43:31');
INSERT INTO `finance_categories` VALUES('6','expense','EXP-SALARY','Gaji/Honor','Gaji, honor, dan upah di luar bonus otomatis','1','30',NULL,'2026-09-01 09:43:31','2026-09-01 09:43:31');
INSERT INTO `finance_categories` VALUES('7','expense','EXP-UTILITY','Utilitas','Listrik, air, internet, dan utilitas lain','1','40',NULL,'2026-09-01 09:43:31','2026-09-01 09:43:31');
INSERT INTO `finance_categories` VALUES('8','expense','EXP-MAINT','Perawatan','Perawatan peralatan dan fasilitas','1','50',NULL,'2026-09-01 09:43:31','2026-09-01 09:43:31');
INSERT INTO `finance_categories` VALUES('9','expense','EXP-OTHER','Pengeluaran Lainnya','Pengeluaran di luar kategori utama','1','90',NULL,'2026-09-01 09:43:31','2026-09-01 09:43:31');

DROP TABLE IF EXISTS `hardware_install_logs`;
CREATE TABLE `hardware_install_logs` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `hardware_id` int(11) DEFAULT NULL,
  `action_type` enum('download_driver','open_official_url','test_print','test_scan','test_attendance','other') NOT NULL DEFAULT 'other',
  `notes` varchar(255) DEFAULT NULL,
  `user_id` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `hardware_id` (`hardware_id`),
  KEY `user_id` (`user_id`),
  KEY `idx_hardware_log_created` (`created_at`),
  CONSTRAINT `hardware_install_logs_ibfk_1` FOREIGN KEY (`hardware_id`) REFERENCES `hardware_profiles` (`id`) ON DELETE SET NULL,
  CONSTRAINT `hardware_install_logs_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `hardware_profiles`;
CREATE TABLE `hardware_profiles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `hardware_type` enum('fingerprint','attendance','qr_barcode_scanner','card_printer','receipt_printer','other') NOT NULL,
  `brand` varchar(100) DEFAULT NULL,
  `model` varchar(150) NOT NULL,
  `connection_type` varchar(80) DEFAULT NULL,
  `driver_name` varchar(180) DEFAULT NULL,
  `paper_width_mm` int(11) DEFAULT NULL,
  `print_protocol` varchar(80) DEFAULT NULL,
  `bluetooth_profile` varchar(80) DEFAULT NULL,
  `driver_file` varchar(255) DEFAULT NULL,
  `official_driver_url` varchar(500) DEFAULT NULL,
  `install_notes` text DEFAULT NULL,
  `device_code` varchar(100) DEFAULT NULL,
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `created_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `created_by` (`created_by`),
  KEY `idx_hardware_type` (`hardware_type`,`is_active`),
  CONSTRAINT `hardware_profiles_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `hardware_profiles` VALUES('1','card_printer','Pointman','Nuvia N15','USB 2.0 / 10/100 Ethernet','Pointman Nuvia N15 Windows Driver',NULL,NULL,NULL,NULL,'https://www.pointman.co.kr/ENG/product/CARD-PRINTER/nuvia-N15.php','Preset resmi aplikasi. Gunakan kartu PVC CR80 85.60 x 53.98 mm. Instal driver Pointman di PC kasir, lalu pilih Pointman Nuvia N15 pada dialog Print Windows. Gunakan ukuran 100% / Actual Size, tanpa scaling.','POINTMAN-N15','1',NULL,'2026-09-01 09:43:30','2026-09-01 09:43:30');
INSERT INTO `hardware_profiles` VALUES('2','attendance','ZKTeco','SpeedFace-V5L','TCP/IP / ADMS PUSH','ZKTeco ZKBio / PUSH integration',NULL,NULL,NULL,NULL,'https://www.zkteco.com/en/SpeedFaceSeries/SpeedFace-V5L-Series','Preset resmi aplikasi. Set User ID pada mesin sama dengan staff_code/employee_code aplikasi. Untuk sinkron server, arahkan PUSH/ADMS ke endpoint zkteco_push.php sesuai konfigurasi perangkat.','ZK-V5L','1',NULL,'2026-09-01 09:43:30','2026-09-01 09:43:30');
INSERT INTO `hardware_profiles` VALUES('3','receipt_printer','Epson','TM-T82III LAN','Ethernet LAN / ESC-POS','Epson Advanced Printer Driver / TM Utility','80','escpos','lan',NULL,'https://support.epson.net/publist/bsmanual.php?lang=EN&model=TM-T82III','Preset resmi aplikasi. Sambungkan LAN, atur IP melalui Epson TM-T82III Utility/EpsonNet Config, instal driver di PC kasir, lalu gunakan Cetak Thermal 80mm. Mode browser/OS driver adalah default paling stabil untuk hosting cloud.','EPSON-TM-T82III','1',NULL,'2026-09-01 09:43:30','2026-09-01 09:44:26');
INSERT INTO `hardware_profiles` VALUES('4','qr_barcode_scanner','Newland AIDC','HR3280 / HR32 USB 2D','USB HID Keyboard / USB-COM','Newland EasySet / USB-COM Driver',NULL,NULL,NULL,NULL,'https://www.newlandaidc.com/roa/products/HandheldScanner/HR32.html','Preset resmi aplikasi. Mode yang disarankan USB HID Keyboard (KBW), suffix Enter/CR aktif. Cukup colok USB lalu buka Scan Member. USB-COM tersedia jika ingin mode serial.','NEWLAND-HR3280','1',NULL,'2026-09-01 09:43:30','2026-09-01 09:43:30');
INSERT INTO `hardware_profiles` VALUES('5','qr_barcode_scanner','Generic','USB HID 2D Scanner','USB HID Keyboard','Plug and Play / OS HID',NULL,NULL,NULL,NULL,'','Untuk scanner 1D/2D generik yang bekerja sebagai keyboard. Set suffix Enter/CR agar scan langsung diproses.','GENERIC-USB-HID-2D','1',NULL,'2026-09-01 09:43:30','2026-09-01 09:43:30');
INSERT INTO `hardware_profiles` VALUES('6','qr_barcode_scanner','Generic','Bluetooth HID 2D Scanner','Bluetooth HID Keyboard','Bluetooth HID / Plug and Play',NULL,NULL,NULL,NULL,'','Pair ke komputer/tablet sebagai keyboard Bluetooth. Set suffix Enter/CR. Cocok untuk penggunaan mobile/kasir tanpa kabel.','GENERIC-BT-HID-2D','1',NULL,'2026-09-01 09:43:30','2026-09-01 09:43:30');
INSERT INTO `hardware_profiles` VALUES('7','card_printer','Generic','CR80 ID Card Printer','USB / Ethernet','Vendor OS Driver',NULL,NULL,NULL,NULL,'','Printer kartu generik CR80. Gunakan driver vendor pada OS dan ukuran 85.60 x 53.98 mm, 100% tanpa scaling.','GENERIC-CR80','1',NULL,'2026-09-01 09:43:30','2026-09-01 09:43:30');
INSERT INTO `hardware_profiles` VALUES('8','attendance','Generic','HTTP API Attendance Device','TCP/IP / HTTP API','Vendor API / Middleware',NULL,NULL,NULL,NULL,'','Mesin absensi generik yang dapat mengirim staff code/user ID melalui HTTP API atau middleware ke attendance_device_api.php.','GENERIC-ATT-API','1',NULL,'2026-09-01 09:43:30','2026-09-01 09:43:30');
INSERT INTO `hardware_profiles` VALUES('9','receipt_printer','Generic','ESC-POS 80mm Thermal','USB / LAN / Bluetooth','ESC-POS / Vendor OS Driver','80','escpos','generic',NULL,'','Printer thermal generik ESC/POS 80 mm. Gunakan driver OS/browser print atau Local Agent untuk integrasi ESC/POS.','GENERIC-ESCPOS-80','1',NULL,'2026-09-01 09:43:30','2026-09-01 09:44:26');
INSERT INTO `hardware_profiles` VALUES('10','receipt_printer','Blueprint','BP-LITE58D LiteSeries','USB + Bluetooth + RJ11','Blueprint BP-LITE58D / BP-LITED58+58X Driver','58','escpos_compatible','classic_bluetooth_android',NULL,'https://www.blueprint-indonesia.com/Belanja/Printer-Thermal/Printer-Thermal-POS-BLUEPRINT-LITE-58D-Support-USBBLUETOOTHRJ11.html','Blueprint LiteSeries 58 mm. Windows: gunakan USB + driver vendor lalu Browser Print. Android: pair Bluetooth (umumnya PIN 0000 bila diminta), lalu gunakan mode Bluetooth Android / Share ke aplikasi printer yang kompatibel RPP02N/ESC-POS. Tanpa auto cutter.','BLUEPRINT-BP-LITE58D','1',NULL,'2026-09-01 09:44:26','2026-09-01 09:44:26');
INSERT INTO `hardware_profiles` VALUES('11','receipt_printer','Blueprint','Lite80D LiteSeries','USB + Bluetooth + RJ11','Blueprint Lite80D Vendor Driver','80','escpos_compatible','classic_bluetooth_android',NULL,'https://www.blueprint-indonesia.com/en/Belanja/Printer-Thermal.htm','Blueprint LiteSeries 80 mm. Gunakan USB + driver OS pada Windows atau Bluetooth pada Android melalui aplikasi printer/ESC-POS yang sesuai.','BLUEPRINT-LITE80D','1',NULL,'2026-09-01 09:44:26','2026-09-01 09:44:26');
INSERT INTO `hardware_profiles` VALUES('12','receipt_printer','Blueprint','Lite80D1 LiteSeries','USB + Bluetooth + RJ11','Blueprint Lite80D1 Vendor Driver','80','escpos_compatible','classic_bluetooth_android',NULL,'https://www.blueprint-indonesia.com/en/Belanja/Printer-Thermal.htm','Blueprint LiteSeries 80 mm USB + Bluetooth. Pilih 80 mm dan ESC/POS Compatible pada Hardware Center.','BLUEPRINT-LITE80D1','1',NULL,'2026-09-01 09:44:26','2026-09-01 09:44:26');

DROP TABLE IF EXISTS `impersonation_logs`;
CREATE TABLE `impersonation_logs` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `actor_user_id` int(11) DEFAULT NULL,
  `target_user_id` int(11) DEFAULT NULL,
  `actor_username` varchar(80) NOT NULL,
  `actor_name` varchar(120) NOT NULL,
  `target_username` varchar(80) NOT NULL,
  `target_name` varchar(120) NOT NULL,
  `target_role` varchar(40) NOT NULL,
  `session_token` char(64) NOT NULL,
  `status` enum('active','ended') NOT NULL DEFAULT 'active',
  `start_ip` varchar(64) DEFAULT NULL,
  `end_ip` varchar(64) DEFAULT NULL,
  `user_agent` varchar(255) DEFAULT NULL,
  `started_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `ended_at` datetime DEFAULT NULL,
  `end_reason` enum('returned','logout','forced') DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `session_token` (`session_token`),
  KEY `idx_impersonation_actor` (`actor_user_id`,`started_at`),
  KEY `idx_impersonation_target` (`target_user_id`,`started_at`),
  KEY `idx_impersonation_status` (`status`,`started_at`),
  CONSTRAINT `impersonation_logs_ibfk_1` FOREIGN KEY (`actor_user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL,
  CONSTRAINT `impersonation_logs_ibfk_2` FOREIGN KEY (`target_user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `impersonation_logs` VALUES('1','1','17','acepronihamdani@unpas.ac.id','Super Administrator','tantan_capster','Tantan','barber','3262dd73b42097fa488c8d57ba1f010f5b3bd66349ff9be3cc66ef5e9dbf8fe0','ended','114.122.115.32','114.122.115.32','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 11:46:13','2026-09-01 11:46:26','logout');
INSERT INTO `impersonation_logs` VALUES('2','1','13','acepronihamdani@unpas.ac.id','Super Administrator','ian_capster','Yanyan - Ian Septian','barber','206b4bb8af3d6d30e3bf71450e95e303258c40fa4969bc93d97a3a229fd3d5fa','ended','114.122.115.32','114.122.115.13','Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Mobile/15E148 Safari/604.1','2026-09-01 12:21:55','2026-09-01 12:55:24','forced');
INSERT INTO `impersonation_logs` VALUES('3','1','16','acepronihamdani@unpas.ac.id','Super Administrator','rian_capster','Ikbal - Rian Ikbal','barber','a1e35db420ede6341aa02e68a9376337fe6e033903cfb6371b00cdddec2c9291','ended','114.10.45.32','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:33:53','2026-09-01 14:34:26','returned');
INSERT INTO `impersonation_logs` VALUES('4','1','17','acepronihamdani@unpas.ac.id','Super Administrator','tantan_capster','Tantan','barber','6dced7499f99f5ccb9ec5f6c94436c120784f8b636a1078638aedd8b312dd656','ended','114.10.45.32','114.10.45.32','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0','2026-09-01 14:35:28','2026-09-01 14:35:36','returned');

DROP TABLE IF EXISTS `import_logs`;
CREATE TABLE `import_logs` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `file_name` varchar(255) NOT NULL,
  `total_rows` int(11) NOT NULL DEFAULT 0,
  `inserted_rows` int(11) NOT NULL DEFAULT 0,
  `updated_rows` int(11) NOT NULL DEFAULT 0,
  `skipped_rows` int(11) NOT NULL DEFAULT 0,
  `imported_by` int(11) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `imported_by` (`imported_by`),
  CONSTRAINT `import_logs_ibfk_1` FOREIGN KEY (`imported_by`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `incomes`;
CREATE TABLE `incomes` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `income_date` date NOT NULL,
  `category_id` int(11) DEFAULT NULL,
  `category` varchar(120) NOT NULL,
  `description` text NOT NULL,
  `amount` decimal(15,2) NOT NULL,
  `payment_method` varchar(50) NOT NULL DEFAULT 'Cash',
  `reference_no` varchar(100) DEFAULT NULL,
  `source_type` varchar(50) NOT NULL DEFAULT 'manual',
  `source_id` bigint(20) DEFAULT NULL,
  `source_ref` varchar(180) DEFAULT NULL,
  `created_by` int(11) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `created_by` (`created_by`),
  KEY `idx_income_date` (`income_date`),
  KEY `idx_income_category` (`category_id`),
  KEY `idx_income_source` (`source_type`,`source_id`),
  CONSTRAINT `incomes_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `finance_categories` (`id`) ON DELETE SET NULL,
  CONSTRAINT `incomes_ibfk_2` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `journal_entries`;
CREATE TABLE `journal_entries` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `journal_date` date NOT NULL,
  `reference_no` varchar(80) DEFAULT NULL,
  `description` varchar(255) NOT NULL,
  `source_type` varchar(50) DEFAULT NULL,
  `source_id` bigint(20) DEFAULT NULL,
  `status` enum('draft','posted','void') NOT NULL DEFAULT 'posted',
  `created_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `created_by` (`created_by`),
  KEY `idx_journal_date` (`journal_date`),
  KEY `idx_journal_source` (`source_type`,`source_id`),
  CONSTRAINT `journal_entries_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `journal_lines`;
CREATE TABLE `journal_lines` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `journal_entry_id` bigint(20) NOT NULL,
  `account_id` int(11) NOT NULL,
  `debit` decimal(15,2) NOT NULL DEFAULT 0.00,
  `credit` decimal(15,2) NOT NULL DEFAULT 0.00,
  `memo` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `journal_entry_id` (`journal_entry_id`),
  KEY `idx_journal_account` (`account_id`),
  CONSTRAINT `journal_lines_ibfk_1` FOREIGN KEY (`journal_entry_id`) REFERENCES `journal_entries` (`id`) ON DELETE CASCADE,
  CONSTRAINT `journal_lines_ibfk_2` FOREIGN KEY (`account_id`) REFERENCES `accounting_accounts` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `member_approval_logs`;
CREATE TABLE `member_approval_logs` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `registration_id` bigint(20) NOT NULL,
  `action` enum('approved','rejected') NOT NULL,
  `reviewer_id` int(11) DEFAULT NULL,
  `review_notes` text DEFAULT NULL,
  `member_id` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `reviewer_id` (`reviewer_id`),
  KEY `member_id` (`member_id`),
  KEY `idx_member_approval_registration` (`registration_id`,`created_at`),
  CONSTRAINT `member_approval_logs_ibfk_1` FOREIGN KEY (`registration_id`) REFERENCES `member_registrations` (`id`) ON DELETE CASCADE,
  CONSTRAINT `member_approval_logs_ibfk_2` FOREIGN KEY (`reviewer_id`) REFERENCES `users` (`id`) ON DELETE SET NULL,
  CONSTRAINT `member_approval_logs_ibfk_3` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `member_approval_logs` VALUES('1','1','approved','1',NULL,'1','2026-09-01 10:09:30');
INSERT INTO `member_approval_logs` VALUES('2','2','approved','4',NULL,'2','2026-09-01 10:59:44');
INSERT INTO `member_approval_logs` VALUES('3','3','approved','7',NULL,'3','2026-09-01 14:22:07');
INSERT INTO `member_approval_logs` VALUES('4','4','approved','7',NULL,'4','2026-09-01 14:48:10');
INSERT INTO `member_approval_logs` VALUES('5','5','approved','7',NULL,'5','2026-09-01 19:35:47');

DROP TABLE IF EXISTS `member_level_history`;
CREATE TABLE `member_level_history` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `member_id` int(11) NOT NULL,
  `from_level` varchar(80) DEFAULT NULL,
  `to_level` varchar(80) NOT NULL,
  `change_type` enum('automatic','manual') NOT NULL DEFAULT 'automatic',
  `changed_by` int(11) DEFAULT NULL,
  `notes` varchar(255) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `changed_by` (`changed_by`),
  KEY `idx_member_level_history` (`member_id`,`created_at`),
  CONSTRAINT `member_level_history_ibfk_1` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE,
  CONSTRAINT `member_level_history_ibfk_2` FOREIGN KEY (`changed_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `member_level_history` VALUES('1','4','Regular','Platinum','manual','7','Level ditetapkan manual dari Data Member','2026-09-01 18:53:16');
INSERT INTO `member_level_history` VALUES('2','3','Regular','Silver','manual','1','Level ditetapkan manual dari Data Member','2026-09-01 18:57:04');
INSERT INTO `member_level_history` VALUES('3','3','Silver','Gold','manual','1','Level ditetapkan manual dari Data Member','2026-09-01 19:00:13');

DROP TABLE IF EXISTS `member_levels`;
CREATE TABLE `member_levels` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `code` varchar(40) NOT NULL,
  `name` varchar(80) NOT NULL,
  `sort_order` int(11) NOT NULL DEFAULT 0,
  `card_color` varchar(20) NOT NULL DEFAULT '#d4af37',
  `discount_percent` decimal(5,2) NOT NULL DEFAULT 0.00,
  `membership_price` decimal(15,2) NOT NULL DEFAULT 0.00,
  `cashier_bonus_type` enum('none','fixed','percent') NOT NULL DEFAULT 'none',
  `cashier_bonus_value` decimal(15,2) NOT NULL DEFAULT 0.00,
  `criteria_mode` enum('all','any') NOT NULL DEFAULT 'all',
  `min_total_spend` decimal(15,2) NOT NULL DEFAULT 0.00,
  `min_transactions` int(11) NOT NULL DEFAULT 0,
  `min_visit_days` int(11) NOT NULL DEFAULT 0,
  `min_points` int(11) NOT NULL DEFAULT 0,
  `min_membership_days` int(11) NOT NULL DEFAULT 0,
  `auto_upgrade` tinyint(1) NOT NULL DEFAULT 0,
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `description` varchar(255) DEFAULT NULL,
  `created_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `code` (`code`),
  UNIQUE KEY `name` (`name`),
  KEY `created_by` (`created_by`),
  KEY `idx_member_level_order` (`is_active`,`sort_order`),
  CONSTRAINT `member_levels_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `member_levels` VALUES('1','REG','Regular','10','#94a3b8','5.00','125000.00','fixed','5000.00','any','0.00','0','0','0','0','1','1','Tingkatan awal member',NULL,'2026-09-01 09:43:31','2026-09-01 18:55:08');
INSERT INTO `member_levels` VALUES('2','SILVER','Silver','20','#c0c0c0','8.00','0.00','fixed','5000.00','any','500000.00','5','0','100','30','1','1','Member aktif dengan transaksi rutin',NULL,'2026-09-01 09:43:31','2026-09-01 18:55:33');
INSERT INTO `member_levels` VALUES('3','GOLD','Gold','30','#d4af37','10.00','0.00','fixed','5000.00','any','1500000.00','4','0','30','60','1','1','Member loyal dengan benefit lebih tinggi',NULL,'2026-09-01 09:43:31','2026-09-01 18:59:42');
INSERT INTO `member_levels` VALUES('4','PLATINUM','Platinum','40','#8b9dc3','12.00','0.00','fixed','5000.00','all','2000000.00','10','0','50','90','1','1','Tingkatan eksklusif; dapat menggunakan approval admin',NULL,'2026-09-01 09:43:31','2026-09-01 18:48:26');

DROP TABLE IF EXISTS `member_memories`;
CREATE TABLE `member_memories` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `member_id` int(11) NOT NULL,
  `transaction_id` bigint(20) DEFAULT NULL,
  `memory_type` enum('member_profile','visit') NOT NULL DEFAULT 'member_profile',
  `memory_date` date DEFAULT NULL,
  `title` varchar(180) NOT NULL,
  `caption` text DEFAULT NULL,
  `photo_path` varchar(255) NOT NULL,
  `is_featured` tinyint(1) NOT NULL DEFAULT 0,
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `created_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `created_by` (`created_by`),
  KEY `idx_memory_member` (`member_id`,`memory_date`),
  KEY `idx_memory_type` (`memory_type`,`transaction_id`),
  KEY `idx_memory_featured` (`is_featured`,`is_active`),
  KEY `fk_memory_transaction` (`transaction_id`),
  CONSTRAINT `fk_memory_transaction` FOREIGN KEY (`transaction_id`) REFERENCES `transactions` (`id`) ON DELETE SET NULL,
  CONSTRAINT `member_memories_ibfk_1` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE,
  CONSTRAINT `member_memories_ibfk_2` FOREIGN KEY (`transaction_id`) REFERENCES `transactions` (`id`) ON DELETE SET NULL,
  CONSTRAINT `member_memories_ibfk_3` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `member_registrations`;
CREATE TABLE `member_registrations` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `registration_code` varchar(60) NOT NULL,
  `name` varchar(150) NOT NULL,
  `phone` varchar(40) NOT NULL,
  `email` varchar(150) DEFAULT NULL,
  `photo_path` varchar(255) DEFAULT NULL,
  `address` text DEFAULT NULL,
  `instagram` varchar(180) DEFAULT NULL,
  `tiktok` varchar(180) DEFAULT NULL,
  `facebook` varchar(180) DEFAULT NULL,
  `social_media_other` varchar(255) DEFAULT NULL,
  `custom_fields_json` longtext DEFAULT NULL,
  `gender` enum('L','P','') NOT NULL DEFAULT '',
  `birth_date` date DEFAULT NULL,
  `notes` text DEFAULT NULL,
  `status` enum('pending','approved','rejected') NOT NULL DEFAULT 'pending',
  `source` varchar(50) NOT NULL DEFAULT 'public_link',
  `submitted_ip` varchar(64) DEFAULT NULL,
  `reviewed_by` int(11) DEFAULT NULL,
  `reviewed_at` datetime DEFAULT NULL,
  `review_notes` text DEFAULT NULL,
  `approved_member_id` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `registration_code` (`registration_code`),
  KEY `reviewed_by` (`reviewed_by`),
  KEY `approved_member_id` (`approved_member_id`),
  KEY `idx_member_reg_status` (`status`,`created_at`),
  KEY `idx_member_reg_phone` (`phone`),
  KEY `idx_member_reg_email` (`email`),
  CONSTRAINT `member_registrations_ibfk_1` FOREIGN KEY (`reviewed_by`) REFERENCES `users` (`id`) ON DELETE SET NULL,
  CONSTRAINT `member_registrations_ibfk_2` FOREIGN KEY (`approved_member_id`) REFERENCES `members` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `member_registrations` VALUES('1','REG-260901-CD6A585C','Andina okta mulyati','088218308558','andinaoktamulyati@gmail.con','uploads/member_photos/registration_20260901100835_19920ad1.jpeg','Jl.Ciwaruga No.08','Andinaoktaaa','-','-','-','[]','P','2004-10-15',NULL,'approved','public_link','114.10.45.32','1','2026-09-01 10:09:30',NULL,'1','2026-09-01 10:08:35','2026-09-01 10:09:30');
INSERT INTO `member_registrations` VALUES('2','REG-260901-98E349F6','Manda','085960278288','mandadanaya26@gmail.com',NULL,NULL,NULL,NULL,NULL,NULL,'[]','P','1997-12-18',NULL,'approved','public_link','182.253.228.72','4','2026-09-01 10:59:44',NULL,'2','2026-09-01 10:08:47','2026-09-01 10:59:44');
INSERT INTO `member_registrations` VALUES('3','REG-260901-42BA3B17','Adi','089655802594',NULL,NULL,NULL,NULL,NULL,NULL,NULL,'[]','L',NULL,NULL,'approved','public_link','114.10.45.32','7','2026-09-01 14:22:07',NULL,'3','2026-09-01 14:21:12','2026-09-01 14:22:07');
INSERT INTO `member_registrations` VALUES('4','REG-260901-CE9F19FE','Ilham','09877542579','andinaoktamulyati1510@gmail.com',NULL,NULL,NULL,'.','.','.','[]','L','2026-09-01',NULL,'approved','public_link','114.10.45.32','7','2026-09-01 14:48:10',NULL,'4','2026-09-01 14:47:16','2026-09-01 14:48:10');
INSERT INTO `member_registrations` VALUES('5','REG-260901-9EC76204','Jeje','0867777777',NULL,NULL,NULL,NULL,NULL,NULL,NULL,'[]','L',NULL,NULL,'approved','public_link','114.10.45.32','7','2026-09-01 19:35:47',NULL,'5','2026-09-01 19:35:01','2026-09-01 19:35:47');

DROP TABLE IF EXISTS `members`;
CREATE TABLE `members` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `member_code` varchar(60) NOT NULL,
  `name` varchar(150) NOT NULL,
  `phone` varchar(40) DEFAULT NULL,
  `email` varchar(150) DEFAULT NULL,
  `address` text DEFAULT NULL,
  `instagram` varchar(180) DEFAULT NULL,
  `tiktok` varchar(180) DEFAULT NULL,
  `facebook` varchar(180) DEFAULT NULL,
  `social_media_other` varchar(255) DEFAULT NULL,
  `custom_fields_json` longtext DEFAULT NULL,
  `photo_path` varchar(255) DEFAULT NULL,
  `gender` enum('L','P','') NOT NULL DEFAULT '',
  `birth_date` date DEFAULT NULL,
  `member_level` varchar(50) NOT NULL DEFAULT 'Regular',
  `member_level_id` int(11) DEFAULT NULL,
  `member_level_manual` tinyint(1) NOT NULL DEFAULT 0,
  `discount_percent` decimal(5,2) NOT NULL DEFAULT 0.00,
  `points` int(11) NOT NULL DEFAULT 0,
  `card_fee` decimal(15,2) NOT NULL DEFAULT 0.00,
  `card_issued_at` date DEFAULT NULL,
  `card_expires_at` date DEFAULT NULL,
  `card_payment_status` enum('unpaid','paid','waived') NOT NULL DEFAULT 'unpaid',
  `notes` text DEFAULT NULL,
  `join_date` date NOT NULL,
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `member_code` (`member_code`),
  KEY `idx_member_name` (`name`),
  KEY `idx_member_phone` (`phone`),
  KEY `idx_member_level_id` (`member_level_id`),
  CONSTRAINT `members_ibfk_1` FOREIGN KEY (`member_level_id`) REFERENCES `member_levels` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `members` VALUES('1','MBR-260901-E9B93D','Andina okta mulyati','088218308558','andinaoktamulyati@gmail.con','Jl.Ciwaruga No.08','Andinaoktaaa','-','-','-','[]','uploads/member_photos/registration_20260901100835_19920ad1.jpeg','P','2004-10-15','Regular','1','0','0.00','0','0.00','2026-09-01','2027-09-01','waived',NULL,'2026-09-01','1','2026-09-01 10:09:30','2026-09-01 10:09:30');
INSERT INTO `members` VALUES('2','MBR-260901-086E45','Manda','085960278288','mandadanaya26@gmail.com',NULL,NULL,NULL,NULL,NULL,'[]',NULL,'P','1997-12-18','Regular','1','0','0.00','0','0.00','2026-09-01','2027-09-01','waived',NULL,'2026-09-01','1','2026-09-01 10:59:44','2026-09-01 10:59:44');
INSERT INTO `members` VALUES('3','MBR-260901-E82DD1','Adi','089655802594','','',NULL,NULL,NULL,NULL,'[]','uploads/member_photos/member_20260901142308_cb9d8673.jpeg','L',NULL,'Gold','3','1','10.00','0','0.00','2026-09-01','2027-09-01','waived','','2026-09-01','1','2026-09-01 14:22:07','2026-09-01 19:00:13');
INSERT INTO `members` VALUES('4','MBR-260901-06ED06','Ilham','09877542579','andinaoktamulyati1510@gmail.com','',NULL,'.','.','.','[]','','L','2026-09-01','Platinum','4','1','12.00','0','0.00','2026-09-01','2027-09-01','paid','','2026-09-01','1','2026-09-01 14:48:10','2026-09-01 18:53:16');
INSERT INTO `members` VALUES('5','MBR-260901-67BE05','Jeje','0867777777',NULL,NULL,NULL,NULL,NULL,NULL,'[]',NULL,'L',NULL,'Regular','1','0','5.00','0','124995.00','2026-09-01','2027-09-01','unpaid',NULL,'2026-09-01','1','2026-09-01 19:35:47','2026-09-01 19:35:47');

DROP TABLE IF EXISTS `membership_sales`;
CREATE TABLE `membership_sales` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `sale_no` varchar(60) NOT NULL,
  `member_id` int(11) NOT NULL,
  `member_level_id` int(11) DEFAULT NULL,
  `sale_date` datetime NOT NULL DEFAULT current_timestamp(),
  `membership_price` decimal(15,2) NOT NULL DEFAULT 0.00,
  `discount_amount` decimal(15,2) NOT NULL DEFAULT 0.00,
  `total_amount` decimal(15,2) NOT NULL DEFAULT 0.00,
  `payment_method` varchar(50) NOT NULL DEFAULT 'Cash',
  `cashier_user_id` int(11) NOT NULL,
  `cashier_bonus_type` enum('none','fixed','percent') NOT NULL DEFAULT 'none',
  `cashier_bonus_value` decimal(15,2) NOT NULL DEFAULT 0.00,
  `cashier_bonus_amount` decimal(15,2) NOT NULL DEFAULT 0.00,
  `bonus_status` enum('unpaid','paid') NOT NULL DEFAULT 'unpaid',
  `bonus_paid_at` datetime DEFAULT NULL,
  `income_id` bigint(20) DEFAULT NULL,
  `source_type` enum('manual','public_registration','pre_member') NOT NULL DEFAULT 'manual',
  `source_id` bigint(20) DEFAULT NULL,
  `notes` text DEFAULT NULL,
  `status` enum('paid','void') NOT NULL DEFAULT 'paid',
  `created_by` int(11) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `voided_by` int(11) DEFAULT NULL,
  `voided_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `sale_no` (`sale_no`),
  KEY `member_id` (`member_id`),
  KEY `member_level_id` (`member_level_id`),
  KEY `income_id` (`income_id`),
  KEY `created_by` (`created_by`),
  KEY `voided_by` (`voided_by`),
  KEY `idx_membership_sale_date` (`sale_date`,`status`),
  KEY `idx_membership_sale_cashier` (`cashier_user_id`,`sale_date`),
  KEY `idx_membership_bonus_status` (`bonus_status`,`status`),
  CONSTRAINT `membership_sales_ibfk_1` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`),
  CONSTRAINT `membership_sales_ibfk_2` FOREIGN KEY (`member_level_id`) REFERENCES `member_levels` (`id`) ON DELETE SET NULL,
  CONSTRAINT `membership_sales_ibfk_3` FOREIGN KEY (`cashier_user_id`) REFERENCES `users` (`id`),
  CONSTRAINT `membership_sales_ibfk_4` FOREIGN KEY (`income_id`) REFERENCES `incomes` (`id`) ON DELETE SET NULL,
  CONSTRAINT `membership_sales_ibfk_5` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`),
  CONSTRAINT `membership_sales_ibfk_6` FOREIGN KEY (`voided_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `membership_sales` VALUES('1','MS-20260901-0001','3','1','2026-09-01 14:22:07','0.00','0.00','0.00','QRIS','7','none','0.00','0.00','unpaid',NULL,NULL,'public_registration','3','Dicatat saat approval','paid','7','2026-09-01 14:22:07',NULL,NULL);

DROP TABLE IF EXISTS `payment_verification_logs`;
CREATE TABLE `payment_verification_logs` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `transaction_id` bigint(20) NOT NULL,
  `action_type` enum('submitted','proof_uploaded','approved','rejected','reset') NOT NULL,
  `status_before` varchar(30) DEFAULT NULL,
  `status_after` varchar(30) DEFAULT NULL,
  `proof_path` varchar(255) DEFAULT NULL,
  `notes` varchar(500) DEFAULT NULL,
  `actor_id` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `actor_id` (`actor_id`),
  KEY `idx_payment_verification_transaction` (`transaction_id`,`created_at`),
  KEY `idx_payment_verification_action` (`action_type`,`created_at`),
  CONSTRAINT `payment_verification_logs_ibfk_1` FOREIGN KEY (`transaction_id`) REFERENCES `transactions` (`id`) ON DELETE CASCADE,
  CONSTRAINT `payment_verification_logs_ibfk_2` FOREIGN KEY (`actor_id`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `payroll_items`;
CREATE TABLE `payroll_items` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `payroll_period_id` bigint(20) NOT NULL,
  `staff_type` enum('barber','employee') NOT NULL,
  `staff_id` int(11) NOT NULL,
  `base_salary` decimal(15,2) NOT NULL DEFAULT 0.00,
  `daily_salary` decimal(15,2) NOT NULL DEFAULT 0.00,
  `attendance_days` int(11) NOT NULL DEFAULT 0,
  `service_bonus` decimal(15,2) NOT NULL DEFAULT 0.00,
  `manual_bonus` decimal(15,2) NOT NULL DEFAULT 0.00,
  `overtime` decimal(15,2) NOT NULL DEFAULT 0.00,
  `allowance` decimal(15,2) NOT NULL DEFAULT 0.00,
  `deduction` decimal(15,2) NOT NULL DEFAULT 0.00,
  `tax_deduction` decimal(15,2) NOT NULL DEFAULT 0.00,
  `gross_amount` decimal(15,2) NOT NULL DEFAULT 0.00,
  `net_amount` decimal(15,2) NOT NULL DEFAULT 0.00,
  `payment_status` enum('unpaid','paid') NOT NULL DEFAULT 'unpaid',
  `paid_at` datetime DEFAULT NULL,
  `notes` varchar(255) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_payroll_staff_period` (`payroll_period_id`,`staff_type`,`staff_id`),
  KEY `idx_payroll_item_status` (`payment_status`),
  CONSTRAINT `payroll_items_ibfk_1` FOREIGN KEY (`payroll_period_id`) REFERENCES `payroll_periods` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `payroll_periods`;
CREATE TABLE `payroll_periods` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `period_name` varchar(120) NOT NULL,
  `period_type` enum('daily','weekly','monthly','custom') NOT NULL DEFAULT 'monthly',
  `date_from` date NOT NULL,
  `date_to` date NOT NULL,
  `status` enum('draft','approved','paid','closed') NOT NULL DEFAULT 'draft',
  `notes` text DEFAULT NULL,
  `created_by` int(11) DEFAULT NULL,
  `approved_by` int(11) DEFAULT NULL,
  `approved_at` datetime DEFAULT NULL,
  `paid_at` datetime DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `created_by` (`created_by`),
  KEY `approved_by` (`approved_by`),
  KEY `idx_payroll_period` (`date_from`,`date_to`,`status`),
  CONSTRAINT `payroll_periods_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL,
  CONSTRAINT `payroll_periods_ibfk_2` FOREIGN KEY (`approved_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `pre_member_approval_logs`;
CREATE TABLE `pre_member_approval_logs` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `pre_member_id` bigint(20) NOT NULL,
  `action` enum('approved','rejected') NOT NULL,
  `reviewer_id` int(11) DEFAULT NULL,
  `review_notes` text DEFAULT NULL,
  `member_id` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `reviewer_id` (`reviewer_id`),
  KEY `member_id` (`member_id`),
  KEY `idx_pre_member_approval` (`pre_member_id`,`created_at`),
  CONSTRAINT `pre_member_approval_logs_ibfk_1` FOREIGN KEY (`pre_member_id`) REFERENCES `pre_members` (`id`) ON DELETE CASCADE,
  CONSTRAINT `pre_member_approval_logs_ibfk_2` FOREIGN KEY (`reviewer_id`) REFERENCES `users` (`id`) ON DELETE SET NULL,
  CONSTRAINT `pre_member_approval_logs_ibfk_3` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `pre_member_import_batches`;
CREATE TABLE `pre_member_import_batches` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `file_name` varchar(255) NOT NULL,
  `total_rows` int(11) NOT NULL DEFAULT 0,
  `inserted_rows` int(11) NOT NULL DEFAULT 0,
  `duplicate_rows` int(11) NOT NULL DEFAULT 0,
  `skipped_rows` int(11) NOT NULL DEFAULT 0,
  `imported_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `imported_by` (`imported_by`),
  KEY `idx_pre_member_batch_created` (`created_at`),
  CONSTRAINT `pre_member_import_batches_ibfk_1` FOREIGN KEY (`imported_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `pre_members`;
CREATE TABLE `pre_members` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `import_batch_id` bigint(20) DEFAULT NULL,
  `source_file` varchar(255) NOT NULL,
  `row_number` int(11) DEFAULT NULL,
  `external_code` varchar(100) DEFAULT NULL,
  `name` varchar(150) NOT NULL,
  `phone` varchar(40) DEFAULT NULL,
  `email` varchar(150) DEFAULT NULL,
  `address` text DEFAULT NULL,
  `instagram` varchar(180) DEFAULT NULL,
  `tiktok` varchar(180) DEFAULT NULL,
  `facebook` varchar(180) DEFAULT NULL,
  `social_media_other` varchar(255) DEFAULT NULL,
  `gender` enum('L','P','') NOT NULL DEFAULT '',
  `birth_date` date DEFAULT NULL,
  `join_date` date DEFAULT NULL,
  `notes` text DEFAULT NULL,
  `status` enum('pending','approved','rejected') NOT NULL DEFAULT 'pending',
  `reviewed_by` int(11) DEFAULT NULL,
  `reviewed_at` datetime DEFAULT NULL,
  `review_notes` text DEFAULT NULL,
  `approved_member_id` int(11) DEFAULT NULL,
  `imported_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `reviewed_by` (`reviewed_by`),
  KEY `approved_member_id` (`approved_member_id`),
  KEY `imported_by` (`imported_by`),
  KEY `idx_pre_member_status` (`status`,`created_at`),
  KEY `idx_pre_member_phone` (`phone`),
  KEY `idx_pre_member_email` (`email`),
  KEY `idx_pre_member_batch` (`import_batch_id`),
  CONSTRAINT `pre_members_ibfk_1` FOREIGN KEY (`import_batch_id`) REFERENCES `pre_member_import_batches` (`id`) ON DELETE SET NULL,
  CONSTRAINT `pre_members_ibfk_2` FOREIGN KEY (`reviewed_by`) REFERENCES `users` (`id`) ON DELETE SET NULL,
  CONSTRAINT `pre_members_ibfk_3` FOREIGN KEY (`approved_member_id`) REFERENCES `members` (`id`) ON DELETE SET NULL,
  CONSTRAINT `pre_members_ibfk_4` FOREIGN KEY (`imported_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `product_operational_usages`;
CREATE TABLE `product_operational_usages` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `usage_date` datetime NOT NULL DEFAULT current_timestamp(),
  `product_id` int(11) NOT NULL,
  `service_id` int(11) DEFAULT NULL,
  `transaction_id` bigint(20) DEFAULT NULL,
  `barber_staff_id` int(11) DEFAULT NULL,
  `qty` int(11) NOT NULL DEFAULT 1,
  `unit_cost` decimal(15,2) NOT NULL DEFAULT 0.00,
  `total_cost` decimal(15,2) NOT NULL DEFAULT 0.00,
  `usage_source` enum('manual','service_auto') NOT NULL DEFAULT 'manual',
  `notes` varchar(255) DEFAULT NULL,
  `created_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `barber_staff_id` (`barber_staff_id`),
  KEY `created_by` (`created_by`),
  KEY `idx_operational_usage_date` (`usage_date`),
  KEY `idx_operational_usage_product` (`product_id`,`usage_date`),
  KEY `idx_operational_usage_service` (`service_id`,`usage_date`),
  KEY `idx_operational_usage_transaction` (`transaction_id`),
  CONSTRAINT `product_operational_usages_ibfk_1` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`),
  CONSTRAINT `product_operational_usages_ibfk_2` FOREIGN KEY (`service_id`) REFERENCES `services` (`id`) ON DELETE SET NULL,
  CONSTRAINT `product_operational_usages_ibfk_3` FOREIGN KEY (`transaction_id`) REFERENCES `transactions` (`id`) ON DELETE SET NULL,
  CONSTRAINT `product_operational_usages_ibfk_4` FOREIGN KEY (`barber_staff_id`) REFERENCES `barber_staff` (`id`) ON DELETE SET NULL,
  CONSTRAINT `product_operational_usages_ibfk_5` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `products`;
CREATE TABLE `products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sku` varchar(60) NOT NULL,
  `barcode` varchar(120) DEFAULT NULL,
  `name` varchar(180) NOT NULL,
  `category` varchar(100) DEFAULT NULL,
  `usage_type` enum('retail','operational','both') NOT NULL DEFAULT 'retail',
  `description` text DEFAULT NULL,
  `cost_price` decimal(15,2) NOT NULL DEFAULT 0.00,
  `sell_price` decimal(15,2) NOT NULL DEFAULT 0.00,
  `stock_qty` int(11) NOT NULL DEFAULT 0,
  `min_stock` int(11) NOT NULL DEFAULT 0,
  `unit` varchar(40) NOT NULL DEFAULT 'pcs',
  `image_path` varchar(255) DEFAULT NULL,
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `created_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `sku` (`sku`),
  UNIQUE KEY `barcode` (`barcode`),
  KEY `created_by` (`created_by`),
  KEY `idx_product_name` (`name`),
  KEY `idx_product_stock` (`stock_qty`,`min_stock`),
  KEY `idx_product_barcode` (`barcode`),
  CONSTRAINT `products_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `products` VALUES('1','1',NULL,'Hair tonic','Hair tonic','retail',NULL,'20000.00','45000.00','10','5','10 pcs',NULL,'1','4','2026-09-01 19:36:10','2026-09-01 19:36:10');
INSERT INTO `products` VALUES('2','2',NULL,'Minyak kemiri','Kemiri bakar','retail',NULL,'55000.00','105000.00','10','5','pcs',NULL,'1','4','2026-09-01 19:37:59','2026-09-01 19:37:59');
INSERT INTO `products` VALUES('3','3',NULL,'Powder','Powder','retail',NULL,'55000.00','100000.00','10','5','pcs',NULL,'1','4','2026-09-01 19:39:20','2026-09-01 19:39:20');
INSERT INTO `products` VALUES('4','4',NULL,'Sisir','Sisir','retail',NULL,'25000.00','75000.00','10','5','pcs',NULL,'1','4','2026-09-01 19:41:02','2026-09-01 19:41:02');

DROP TABLE IF EXISTS `renovation_expenses`;
CREATE TABLE `renovation_expenses` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `project_id` bigint(20) NOT NULL,
  `task_id` bigint(20) DEFAULT NULL,
  `category_source` enum('phase','task','custom') NOT NULL DEFAULT 'custom',
  `global_expense_id` bigint(20) DEFAULT NULL,
  `expense_date` date NOT NULL,
  `category` varchar(120) DEFAULT NULL,
  `description` varchar(255) NOT NULL,
  `amount` decimal(15,2) NOT NULL DEFAULT 0.00,
  `payment_method` varchar(50) NOT NULL DEFAULT 'Cash',
  `evidence_file_1` varchar(255) DEFAULT NULL,
  `evidence_file_2` varchar(255) DEFAULT NULL,
  `created_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `global_expense_id` (`global_expense_id`),
  KEY `created_by` (`created_by`),
  KEY `idx_renov_expense` (`project_id`,`expense_date`),
  KEY `fk_renov_exp_task` (`task_id`),
  CONSTRAINT `fk_renov_exp_task` FOREIGN KEY (`task_id`) REFERENCES `renovation_tasks` (`id`) ON DELETE SET NULL,
  CONSTRAINT `renovation_expenses_ibfk_1` FOREIGN KEY (`project_id`) REFERENCES `renovation_projects` (`id`) ON DELETE CASCADE,
  CONSTRAINT `renovation_expenses_ibfk_2` FOREIGN KEY (`task_id`) REFERENCES `renovation_tasks` (`id`) ON DELETE SET NULL,
  CONSTRAINT `renovation_expenses_ibfk_3` FOREIGN KEY (`global_expense_id`) REFERENCES `expenses` (`id`) ON DELETE SET NULL,
  CONSTRAINT `renovation_expenses_ibfk_4` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `renovation_photos`;
CREATE TABLE `renovation_photos` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `project_id` bigint(20) NOT NULL,
  `task_id` bigint(20) DEFAULT NULL,
  `phase` enum('planning','execution','finishing') NOT NULL,
  `photo_date` date NOT NULL,
  `title` varchar(180) DEFAULT NULL,
  `caption` text DEFAULT NULL,
  `photo_path` varchar(255) NOT NULL,
  `progress_percent` decimal(5,2) DEFAULT NULL,
  `created_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `task_id` (`task_id`),
  KEY `created_by` (`created_by`),
  KEY `idx_renov_photo` (`project_id`,`phase`,`photo_date`),
  CONSTRAINT `renovation_photos_ibfk_1` FOREIGN KEY (`project_id`) REFERENCES `renovation_projects` (`id`) ON DELETE CASCADE,
  CONSTRAINT `renovation_photos_ibfk_2` FOREIGN KEY (`task_id`) REFERENCES `renovation_tasks` (`id`) ON DELETE SET NULL,
  CONSTRAINT `renovation_photos_ibfk_3` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `renovation_project_history`;
CREATE TABLE `renovation_project_history` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `project_id` bigint(20) NOT NULL,
  `change_type` varchar(50) NOT NULL DEFAULT 'update',
  `field_name` varchar(80) NOT NULL,
  `old_value` text DEFAULT NULL,
  `new_value` text DEFAULT NULL,
  `changed_by` int(11) DEFAULT NULL,
  `changed_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `changed_by` (`changed_by`),
  KEY `idx_renov_history_project` (`project_id`,`changed_at`),
  KEY `idx_renov_history_field` (`field_name`),
  CONSTRAINT `renovation_project_history_ibfk_1` FOREIGN KEY (`project_id`) REFERENCES `renovation_projects` (`id`) ON DELETE CASCADE,
  CONSTRAINT `renovation_project_history_ibfk_2` FOREIGN KEY (`changed_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `renovation_projects`;
CREATE TABLE `renovation_projects` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `project_name` varchar(180) NOT NULL,
  `location` varchar(255) DEFAULT NULL,
  `planned_start` date DEFAULT NULL,
  `planned_end` date DEFAULT NULL,
  `actual_start` date DEFAULT NULL,
  `actual_end` date DEFAULT NULL,
  `budget` decimal(15,2) NOT NULL DEFAULT 0.00,
  `status` enum('planning','execution','finishing','completed','on_hold') NOT NULL DEFAULT 'planning',
  `progress_percent` decimal(5,2) NOT NULL DEFAULT 0.00,
  `description` text DEFAULT NULL,
  `created_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `created_by` (`created_by`),
  KEY `idx_renov_status` (`status`),
  CONSTRAINT `renovation_projects_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `renovation_tasks`;
CREATE TABLE `renovation_tasks` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `project_id` bigint(20) NOT NULL,
  `phase` enum('planning','execution','finishing') NOT NULL,
  `task_name` varchar(200) NOT NULL,
  `description` text DEFAULT NULL,
  `planned_date` date DEFAULT NULL,
  `completed_date` date DEFAULT NULL,
  `progress_percent` decimal(5,2) NOT NULL DEFAULT 0.00,
  `status` enum('not_started','in_progress','done','blocked') NOT NULL DEFAULT 'not_started',
  `sort_order` int(11) NOT NULL DEFAULT 0,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `idx_renov_task` (`project_id`,`phase`,`status`),
  CONSTRAINT `renovation_tasks_ibfk_1` FOREIGN KEY (`project_id`) REFERENCES `renovation_projects` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `service_product_usage_rules`;
CREATE TABLE `service_product_usage_rules` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `service_id` int(11) NOT NULL,
  `product_id` int(11) NOT NULL,
  `qty_per_service` int(11) NOT NULL DEFAULT 1,
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `notes` varchar(255) DEFAULT NULL,
  `created_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_service_product_usage` (`service_id`,`product_id`),
  KEY `created_by` (`created_by`),
  KEY `idx_usage_rule_product` (`product_id`,`is_active`),
  CONSTRAINT `service_product_usage_rules_ibfk_1` FOREIGN KEY (`service_id`) REFERENCES `services` (`id`) ON DELETE CASCADE,
  CONSTRAINT `service_product_usage_rules_ibfk_2` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE,
  CONSTRAINT `service_product_usage_rules_ibfk_3` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `services`;
CREATE TABLE `services` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `code` varchar(40) DEFAULT NULL,
  `barcode` varchar(120) DEFAULT NULL,
  `category` varchar(80) NOT NULL DEFAULT 'Barber Service',
  `name` varchar(150) NOT NULL,
  `sort_order` int(11) NOT NULL DEFAULT 0,
  `duration_minutes` int(11) NOT NULL DEFAULT 30,
  `price` decimal(15,2) NOT NULL DEFAULT 0.00,
  `discount_type` enum('none','percent','fixed') NOT NULL DEFAULT 'none',
  `discount_value` decimal(15,2) NOT NULL DEFAULT 0.00,
  `bonus_amount` decimal(15,2) NOT NULL DEFAULT 0.00,
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `code` (`code`),
  UNIQUE KEY `barcode` (`barcode`),
  KEY `idx_services_sort_active` (`is_active`,`sort_order`,`id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `services` VALUES('1',NULL,NULL,'Barber Service','Peel of Mask','10','30','45000.00','none','0.00','14000.00','1','2026-09-01 09:43:31');
INSERT INTO `services` VALUES('2','SRV004',NULL,'Coloring Basic','Hair Coloring','20','90','150000.00','none','0.00','38000.00','1','2026-09-01 09:43:31');
INSERT INTO `services` VALUES('3','SRV003',NULL,'Coloring Highlight','Coloring Highlight','30','15','350000.00','none','0.00','105000.00','1','2026-09-01 09:43:31');
INSERT INTO `services` VALUES('5',NULL,NULL,'Down Perm','Down Perm','50','30','250000.00','none','0.00','75000.00','1','2026-09-01 09:43:31');
INSERT INTO `services` VALUES('6','SRV005',NULL,'Hair Coloring','Coloring Extend','60','20','350000.00','none','0.00','105000.00','1','2026-09-01 09:43:31');
INSERT INTO `services` VALUES('7',NULL,NULL,'Hair Mask','Hair Mask','70','30','60000.00','none','0.00','20000.00','1','2026-09-01 09:43:31');
INSERT INTO `services` VALUES('8','SRV002',NULL,'Haircut','Haircut','80','45','90000.00','none','0.00','25000.00','1','2026-09-01 09:43:31');
INSERT INTO `services` VALUES('9','SRV001',NULL,'Massage','Massage','90','30','45000.00','none','0.00','15000.00','1','2026-09-01 09:43:31');
INSERT INTO `services` VALUES('11',NULL,NULL,'Paket 2','Haircut Peel of Mask','110','30','125000.00','none','0.00','40000.00','1','2026-09-01 09:43:31');
INSERT INTO `services` VALUES('12',NULL,NULL,'Paket 3','Hair Cut + Hair Mask','120','30','140000.00','none','0.00','45000.00','1','2026-09-01 09:43:31');
INSERT INTO `services` VALUES('13',NULL,NULL,'Paket 4','Hair Cut + Massage + Hair Mask + Peel of Mask','130','30','220000.00','none','0.00','74000.00','1','2026-09-01 09:43:31');
INSERT INTO `services` VALUES('15',NULL,NULL,'Curly Perm','Curly Perm','40','30','350000.00','none','0.00','105000.00','1','2026-09-01 09:43:56');
INSERT INTO `services` VALUES('17',NULL,NULL,'Hair Mask','Hair Mask','70','30','60000.00','none','0.00','20000.00','0','2026-09-01 09:43:56');
INSERT INTO `services` VALUES('18',NULL,NULL,'Paket 1','Hair Cut + Massage','100','30','125000.00','none','0.00','40000.00','1','2026-09-01 09:43:56');
INSERT INTO `services` VALUES('27',NULL,NULL,'Haircut - Softopening','Haircut - Softopening','10','30','80000.00','none','0.00','25000.00','1','2026-09-01 11:12:33');

DROP TABLE IF EXISTS `settings`;
CREATE TABLE `settings` (
  `setting_key` varchar(100) NOT NULL,
  `setting_value` text DEFAULT NULL,
  PRIMARY KEY (`setting_key`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `settings` VALUES('attendance_auto_checkout_hours','12');
INSERT INTO `settings` VALUES('attendance_device_ip','');
INSERT INTO `settings` VALUES('attendance_device_mode','push_adms');
INSERT INTO `settings` VALUES('attendance_photo_enabled','1');
INSERT INTO `settings` VALUES('attendance_photo_required','1');
INSERT INTO `settings` VALUES('brand_accent','#d4af37');
INSERT INTO `settings` VALUES('brand_address','Jl. Aria Jipang No.1, Citarum, Kec. Bandung Wetan, Kota Bandung, Jawa Barat 40115, Indonesia');
INSERT INTO `settings` VALUES('brand_email','admin@prestige.barberclub.id');
INSERT INTO `settings` VALUES('brand_logo','uploads/logos/logo_20260901094510_d14dc7.png');
INSERT INTO `settings` VALUES('brand_name','Prestige Barber Club');
INSERT INTO `settings` VALUES('brand_phone','081111825912');
INSERT INTO `settings` VALUES('brand_primary','#172554');
INSERT INTO `settings` VALUES('brand_tagline','Professional Grooming Management System');
INSERT INTO `settings` VALUES('card_custom_back','');
INSERT INTO `settings` VALUES('card_custom_front','');
INSERT INTO `settings` VALUES('card_printer_card_height_mm','53.98');
INSERT INTO `settings` VALUES('card_printer_card_width_mm','85.60');
INSERT INTO `settings` VALUES('card_printer_color_mode','color');
INSERT INTO `settings` VALUES('card_printer_connection','usb');
INSERT INTO `settings` VALUES('card_printer_dpi','300');
INSERT INTO `settings` VALUES('card_printer_feed_mode','auto');
INSERT INTO `settings` VALUES('card_printer_ip','');
INSERT INTO `settings` VALUES('card_printer_margin_mm','0');
INSERT INTO `settings` VALUES('card_printer_mode','local_agent');
INSERT INTO `settings` VALUES('card_printer_orientation','landscape');
INSERT INTO `settings` VALUES('card_printer_scale','100');
INSERT INTO `settings` VALUES('card_printer_single_sided','1');
INSERT INTO `settings` VALUES('customer_display_enabled','1');
INSERT INTO `settings` VALUES('dashboard_monthly_target','63000000');
INSERT INTO `settings` VALUES('default_tax_enabled','0');
INSERT INTO `settings` VALUES('default_tax_inclusive','0');
INSERT INTO `settings` VALUES('default_tax_rate','0');
INSERT INTO `settings` VALUES('epson_tm_t82_ip','');
INSERT INTO `settings` VALUES('footer_text','Terima kasih telah berkunjung. Sampai jumpa kembali.');
INSERT INTO `settings` VALUES('invoice_prefix','TRX');
INSERT INTO `settings` VALUES('login_background','');
INSERT INTO `settings` VALUES('login_badge','BARBERSHOP MANAGEMENT SYSTEM');
INSERT INTO `settings` VALUES('login_footer','Bagian dari Lumivera Group');
INSERT INTO `settings` VALUES('login_layout','split');
INSERT INTO `settings` VALUES('login_show_contact','1');
INSERT INTO `settings` VALUES('login_show_features','1');
INSERT INTO `settings` VALUES('login_subtitle','Bagian dari Lumivera Group');
INSERT INTO `settings` VALUES('login_title','Selamat Datang Kembali');
INSERT INTO `settings` VALUES('member_activity_window_days','90');
INSERT INTO `settings` VALUES('member_card_back_config_json','{\"brand\":1,\"logo\":1,\"member_code\":1,\"member_name\":1,\"qr\":1,\"address\":1,\"phone\":1,\"email\":1,\"instagram\":0,\"tiktok\":0,\"facebook\":0,\"expiry\":0,\"custom_title\":\"MEMBER CARD\",\"custom_text\":\"Kartu ini merupakan identitas member.\\r\\nTunjukkan kartu\\/QR saat transaksi.\\r\\nJika ditemukan, mohon dikembalikan kepada pemilik atau barbershop.\"}');
INSERT INTO `settings` VALUES('member_card_default_fee','124995');
INSERT INTO `settings` VALUES('member_card_front_config_json','{\"brand\":1,\"logo\":1,\"member_photo\":1,\"member_name\":1,\"member_code\":1,\"level\":1,\"points\":1,\"join_date\":1,\"expiry\":1,\"qr\":0,\"tagline\":1,\"phone\":1,\"custom_text\":\"PRIVATE MEMBERSHIP\"}');
INSERT INTO `settings` VALUES('member_card_validity_months','12');
INSERT INTO `settings` VALUES('member_registration_fields_json','{\"name\":{\"label\":\"Nama Lengkap\",\"enabled\":1,\"required\":1},\"phone\":{\"label\":\"Nomor WhatsApp\",\"enabled\":1,\"required\":1},\"email\":{\"label\":\"Email\",\"enabled\":1,\"required\":0},\"photo\":{\"label\":\"Foto Member\",\"enabled\":1,\"required\":0},\"gender\":{\"label\":\"Jenis Kelamin\",\"enabled\":1,\"required\":0},\"birth_date\":{\"label\":\"Tanggal Lahir\",\"enabled\":1,\"required\":0},\"address\":{\"label\":\"Alamat\",\"enabled\":1,\"required\":0},\"instagram\":{\"label\":\"Instagram\",\"enabled\":1,\"required\":0},\"tiktok\":{\"label\":\"TikTok\",\"enabled\":1,\"required\":0},\"facebook\":{\"label\":\"Facebook\",\"enabled\":1,\"required\":0},\"social_media_other\":{\"label\":\"Sosial Media Lain\",\"enabled\":1,\"required\":0},\"notes\":{\"label\":\"Catatan\",\"enabled\":1,\"required\":0},\"custom\":[]}');
INSERT INTO `settings` VALUES('member_scanner_idle_ms','120');
INSERT INTO `settings` VALUES('member_scanner_mode','hid_keyboard');
INSERT INTO `settings` VALUES('member_scanner_suffix','enter');
INSERT INTO `settings` VALUES('noncash_ewallet_approval_enabled','0');
INSERT INTO `settings` VALUES('noncash_ewallet_proof_enabled','0');
INSERT INTO `settings` VALUES('noncash_qris_approval_enabled','0');
INSERT INTO `settings` VALUES('noncash_qris_proof_enabled','0');
INSERT INTO `settings` VALUES('noncash_transfer_approval_enabled','0');
INSERT INTO `settings` VALUES('noncash_transfer_proof_enabled','0');
INSERT INTO `settings` VALUES('point_divisor','10000');
INSERT INTO `settings` VALUES('public_member_check_enabled','1');
INSERT INTO `settings` VALUES('public_member_default_discount','0');
INSERT INTO `settings` VALUES('public_member_default_level','Regular');
INSERT INTO `settings` VALUES('public_member_registration_enabled','1');
INSERT INTO `settings` VALUES('public_member_terms','Dengan mengirim formulir ini, saya menyatakan data yang diberikan benar dan bersedia menjadi member.');
INSERT INTO `settings` VALUES('qris_image','uploads/qris/qris_20260901151333_11a46c.jpg');
INSERT INTO `settings` VALUES('qris_name','QRIS');
INSERT INTO `settings` VALUES('receipt_bluetooth_app_hint','RPP02N');
INSERT INTO `settings` VALUES('receipt_bluetooth_pair_code','0000');
INSERT INTO `settings` VALUES('receipt_content_config_json','{\"show_brand\":1,\"show_address\":1,\"show_phone\":1,\"show_invoice\":1,\"show_date\":1,\"show_cashier\":1,\"show_member\":1,\"show_items\":1,\"show_barber\":1,\"show_subtotal\":1,\"show_discount\":1,\"show_tax\":1,\"show_total\":1,\"show_paid\":1,\"show_change\":1,\"show_payment_method\":1,\"show_footer\":1,\"show_member_code\":1,\"show_member_points\":0,\"labels\":{\"invoice\":\"No. Nota\",\"date\":\"Tanggal\",\"cashier\":\"Kasir\",\"member\":\"Pelanggan\",\"member_code\":\"Kode Member\",\"points\":\"Poin\",\"subtotal\":\"Subtotal\",\"discount\":\"Diskon\",\"tax\":\"Pajak\",\"total\":\"TOTAL\",\"paid\":\"Dibayar\",\"change\":\"Kembalian\",\"payment_method\":\"Pembayaran\",\"service\":\"Jasa\",\"product\":\"Produk\",\"barber\":\"Barber\"},\"header_text\":\"\",\"footer_text_extra\":\"\",\"custom_lines\":[{\"label\":\"Instagram\",\"value\":\"@prestigebarber\",\"position\":\"footer\",\"align\":\"center\",\"enabled\":0}]}');
INSERT INTO `settings` VALUES('receipt_margin_bottom_58','3.0');
INSERT INTO `settings` VALUES('receipt_margin_bottom_80','3.0');
INSERT INTO `settings` VALUES('receipt_margin_left_58','3.0');
INSERT INTO `settings` VALUES('receipt_margin_left_80','3.0');
INSERT INTO `settings` VALUES('receipt_margin_right_58','3.0');
INSERT INTO `settings` VALUES('receipt_margin_right_80','3.0');
INSERT INTO `settings` VALUES('receipt_margin_top_58','3.0');
INSERT INTO `settings` VALUES('receipt_margin_top_80','3.0');
INSERT INTO `settings` VALUES('receipt_paper_width','80');
INSERT INTO `settings` VALUES('receipt_printer_connection','usb');
INSERT INTO `settings` VALUES('receipt_printer_ip','');
INSERT INTO `settings` VALUES('receipt_printer_mode','escpos_agent');
INSERT INTO `settings` VALUES('schema_release','4.27.0');
INSERT INTO `settings` VALUES('selected_attendance_device','ZKTeco SpeedFace-V5L');
INSERT INTO `settings` VALUES('selected_attendance_device_id','');
INSERT INTO `settings` VALUES('selected_card_printer','Pointman Nuvia N15');
INSERT INTO `settings` VALUES('selected_card_printer_id','1');
INSERT INTO `settings` VALUES('selected_card_template_key','midnight_blue');
INSERT INTO `settings` VALUES('selected_member_scanner','Newland AIDC HR3280 / HR32 USB 2D');
INSERT INTO `settings` VALUES('selected_member_scanner_id','4');
INSERT INTO `settings` VALUES('selected_receipt_printer','Epson TM-T82III LAN');
INSERT INTO `settings` VALUES('selected_receipt_printer_id','12');
INSERT INTO `settings` VALUES('thermal_paper','80');
INSERT INTO `settings` VALUES('upload_attendance_photo_extensions','jpg,jpeg,png,webp');
INSERT INTO `settings` VALUES('upload_attendance_photo_max_mb','4');
INSERT INTO `settings` VALUES('upload_branding_image_extensions','jpg,jpeg,png,webp');
INSERT INTO `settings` VALUES('upload_branding_image_max_mb','6');
INSERT INTO `settings` VALUES('upload_card_design_extensions','jpg,jpeg,png,webp');
INSERT INTO `settings` VALUES('upload_card_design_max_mb','10');
INSERT INTO `settings` VALUES('upload_driver_file_extensions','exe,msi,zip,dmg,pkg,deb,rpm');
INSERT INTO `settings` VALUES('upload_driver_file_max_mb','200');
INSERT INTO `settings` VALUES('upload_expense_evidence_extensions','jpg,jpeg,png,webp,pdf');
INSERT INTO `settings` VALUES('upload_expense_evidence_max_mb','8');
INSERT INTO `settings` VALUES('upload_login_background_extensions','jpg,jpeg,png,webp');
INSERT INTO `settings` VALUES('upload_login_background_max_mb','6');
INSERT INTO `settings` VALUES('upload_member_import_extensions','csv,xlsx');
INSERT INTO `settings` VALUES('upload_member_import_max_mb','1');
INSERT INTO `settings` VALUES('upload_member_memory_extensions','jpg,jpeg,png,webp');
INSERT INTO `settings` VALUES('upload_member_memory_max_mb','6');
INSERT INTO `settings` VALUES('upload_member_photo_extensions','jpg,jpeg,png,webp');
INSERT INTO `settings` VALUES('upload_member_photo_max_mb','8');
INSERT INTO `settings` VALUES('upload_payment_proof_extensions','jpg,jpeg,png,webp,pdf');
INSERT INTO `settings` VALUES('upload_payment_proof_max_mb','8');
INSERT INTO `settings` VALUES('upload_pre_member_import_extensions','xlsx');
INSERT INTO `settings` VALUES('upload_pre_member_import_max_mb','1');
INSERT INTO `settings` VALUES('upload_product_image_extensions','jpg,jpeg,png,webp');
INSERT INTO `settings` VALUES('upload_product_image_max_mb','4');
INSERT INTO `settings` VALUES('upload_product_import_extensions','xlsx');
INSERT INTO `settings` VALUES('upload_product_import_max_mb','1');
INSERT INTO `settings` VALUES('upload_qris_image_extensions','jpg,jpeg,png,webp');
INSERT INTO `settings` VALUES('upload_qris_image_max_mb','6');
INSERT INTO `settings` VALUES('upload_renovation_evidence_extensions','jpg,jpeg,png,webp,pdf');
INSERT INTO `settings` VALUES('upload_renovation_evidence_max_mb','8');
INSERT INTO `settings` VALUES('upload_renovation_photo_extensions','jpg,jpeg,png,webp');
INSERT INTO `settings` VALUES('upload_renovation_photo_max_mb','8');
INSERT INTO `settings` VALUES('upload_restore_file_extensions','sql,zip');
INSERT INTO `settings` VALUES('upload_restore_file_max_mb','250');
INSERT INTO `settings` VALUES('upload_service_import_extensions','xlsx');
INSERT INTO `settings` VALUES('upload_service_import_max_mb','1');
INSERT INTO `settings` VALUES('upload_user_avatar_extensions','jpg,jpeg,png,webp');
INSERT INTO `settings` VALUES('upload_user_avatar_max_mb','3');
INSERT INTO `settings` VALUES('upload_user_import_extensions','xlsx');
INSERT INTO `settings` VALUES('upload_user_import_max_mb','1');
INSERT INTO `settings` VALUES('whatsapp_country_code','62');
INSERT INTO `settings` VALUES('zkteco_push_enabled','1');

DROP TABLE IF EXISTS `stock_movements`;
CREATE TABLE `stock_movements` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `product_id` int(11) NOT NULL,
  `movement_date` datetime NOT NULL DEFAULT current_timestamp(),
  `movement_type` enum('opening','purchase','sale','operational_use','adjustment_in','adjustment_out','return_in','return_out') NOT NULL,
  `qty_change` int(11) NOT NULL,
  `stock_before` int(11) NOT NULL DEFAULT 0,
  `stock_after` int(11) NOT NULL DEFAULT 0,
  `reference_type` varchar(50) DEFAULT NULL,
  `reference_id` bigint(20) DEFAULT NULL,
  `notes` varchar(255) DEFAULT NULL,
  `created_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `created_by` (`created_by`),
  KEY `idx_stock_product_date` (`product_id`,`movement_date`),
  KEY `idx_stock_reference` (`reference_type`,`reference_id`),
  CONSTRAINT `stock_movements_ibfk_1` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE,
  CONSTRAINT `stock_movements_ibfk_2` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `stock_movements` VALUES('1','1','2026-09-01 19:36:10','opening','10','0','10','product','1','Stok awal','4','2026-09-01 19:36:10');
INSERT INTO `stock_movements` VALUES('2','2','2026-09-01 19:37:59','opening','10','0','10','product','2','Stok awal','4','2026-09-01 19:37:59');
INSERT INTO `stock_movements` VALUES('3','3','2026-09-01 19:39:20','opening','10','0','10','product','3','Stok awal','4','2026-09-01 19:39:20');
INSERT INTO `stock_movements` VALUES('4','4','2026-09-01 19:41:02','opening','10','0','10','product','4','Stok awal','4','2026-09-01 19:41:02');

DROP TABLE IF EXISTS `tax_profiles`;
CREATE TABLE `tax_profiles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `tax_name` varchar(100) NOT NULL,
  `tax_code` varchar(40) DEFAULT NULL,
  `tax_rate` decimal(8,4) NOT NULL DEFAULT 0.0000,
  `tax_type` enum('sales','withholding','other') NOT NULL DEFAULT 'sales',
  `inclusive` tinyint(1) NOT NULL DEFAULT 0,
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `transaction_items`;
CREATE TABLE `transaction_items` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `transaction_id` bigint(20) NOT NULL,
  `service_id` int(11) NOT NULL,
  `barber_id` int(11) DEFAULT NULL,
  `barber_staff_id` int(11) DEFAULT NULL,
  `qty` int(11) NOT NULL DEFAULT 1,
  `price` decimal(15,2) NOT NULL,
  `service_discount_amount` decimal(15,2) NOT NULL DEFAULT 0.00,
  `subtotal` decimal(15,2) NOT NULL,
  `bonus_amount` decimal(15,2) NOT NULL DEFAULT 0.00,
  PRIMARY KEY (`id`),
  KEY `transaction_id` (`transaction_id`),
  KEY `service_id` (`service_id`),
  KEY `barber_id` (`barber_id`),
  KEY `idx_item_barber_staff` (`barber_staff_id`),
  CONSTRAINT `transaction_items_ibfk_1` FOREIGN KEY (`transaction_id`) REFERENCES `transactions` (`id`) ON DELETE CASCADE,
  CONSTRAINT `transaction_items_ibfk_2` FOREIGN KEY (`service_id`) REFERENCES `services` (`id`),
  CONSTRAINT `transaction_items_ibfk_3` FOREIGN KEY (`barber_id`) REFERENCES `users` (`id`) ON DELETE SET NULL,
  CONSTRAINT `transaction_items_ibfk_4` FOREIGN KEY (`barber_staff_id`) REFERENCES `barber_staff` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `transaction_items` VALUES('4','4','8',NULL,'7','1','90000.00','0.00','90000.00','25000.00');
INSERT INTO `transaction_items` VALUES('5','5','27',NULL,'3','1','80000.00','0.00','80000.00','25000.00');
INSERT INTO `transaction_items` VALUES('6','6','8',NULL,'2','1','90000.00','0.00','90000.00','25000.00');
INSERT INTO `transaction_items` VALUES('7','7','8',NULL,'7','1','90000.00','0.00','90000.00','25000.00');
INSERT INTO `transaction_items` VALUES('8','8','8',NULL,'6','1','90000.00','0.00','90000.00','25000.00');
INSERT INTO `transaction_items` VALUES('9','9','27',NULL,'7','1','80000.00','0.00','80000.00','25000.00');
INSERT INTO `transaction_items` VALUES('10','10','27',NULL,'1','1','80000.00','0.00','80000.00','25000.00');
INSERT INTO `transaction_items` VALUES('11','11','27',NULL,'5','1','80000.00','0.00','80000.00','25000.00');
INSERT INTO `transaction_items` VALUES('12','12','8',NULL,'1','1','90000.00','0.00','90000.00','25000.00');
INSERT INTO `transaction_items` VALUES('13','13','8',NULL,'7','1','90000.00','0.00','90000.00','25000.00');
INSERT INTO `transaction_items` VALUES('14','14','27',NULL,'2','1','80000.00','0.00','80000.00','25000.00');
INSERT INTO `transaction_items` VALUES('15','15','18',NULL,'3','1','125000.00','0.00','125000.00','40000.00');
INSERT INTO `transaction_items` VALUES('16','16','8',NULL,'7','1','90000.00','0.00','90000.00','25000.00');
INSERT INTO `transaction_items` VALUES('17','17','27',NULL,'2','1','80000.00','0.00','80000.00','25000.00');
INSERT INTO `transaction_items` VALUES('18','18','27',NULL,'5','1','80000.00','0.00','80000.00','25000.00');
INSERT INTO `transaction_items` VALUES('19','19','27',NULL,'2','1','80000.00','0.00','80000.00','25000.00');
INSERT INTO `transaction_items` VALUES('20','20','18',NULL,'6','1','125000.00','0.00','125000.00','40000.00');
INSERT INTO `transaction_items` VALUES('21','21','9',NULL,'5','1','45000.00','0.00','45000.00','15000.00');
INSERT INTO `transaction_items` VALUES('22','22','27',NULL,'6','1','80000.00','0.00','80000.00','25000.00');
INSERT INTO `transaction_items` VALUES('23','23','27',NULL,'2','1','80000.00','0.00','80000.00','25000.00');
INSERT INTO `transaction_items` VALUES('24','24','8',NULL,'5','1','90000.00','0.00','90000.00','25000.00');
INSERT INTO `transaction_items` VALUES('25','25','18',NULL,'2','1','125000.00','0.00','125000.00','40000.00');
INSERT INTO `transaction_items` VALUES('26','25','18',NULL,'3','1','125000.00','0.00','125000.00','40000.00');
INSERT INTO `transaction_items` VALUES('27','26','18',NULL,'2','1','125000.00','0.00','125000.00','40000.00');
INSERT INTO `transaction_items` VALUES('28','27','8',NULL,'7','1','90000.00','0.00','90000.00','25000.00');
INSERT INTO `transaction_items` VALUES('29','28','7',NULL,'1','1','60000.00','0.00','60000.00','20000.00');

DROP TABLE IF EXISTS `transaction_product_items`;
CREATE TABLE `transaction_product_items` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `transaction_id` bigint(20) NOT NULL,
  `product_id` int(11) NOT NULL,
  `qty` int(11) NOT NULL DEFAULT 1,
  `price` decimal(15,2) NOT NULL,
  `cost_price` decimal(15,2) NOT NULL DEFAULT 0.00,
  `subtotal` decimal(15,2) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_tpi_product` (`product_id`),
  KEY `idx_tpi_transaction` (`transaction_id`),
  CONSTRAINT `transaction_product_items_ibfk_1` FOREIGN KEY (`transaction_id`) REFERENCES `transactions` (`id`) ON DELETE CASCADE,
  CONSTRAINT `transaction_product_items_ibfk_2` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `transactions`;
CREATE TABLE `transactions` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `invoice_no` varchar(50) NOT NULL,
  `member_id` int(11) DEFAULT NULL,
  `transaction_date` datetime NOT NULL DEFAULT current_timestamp(),
  `subtotal_amount` decimal(15,2) NOT NULL DEFAULT 0.00,
  `discount_amount` decimal(15,2) NOT NULL DEFAULT 0.00,
  `total_amount` decimal(15,2) NOT NULL DEFAULT 0.00,
  `tax_rate` decimal(8,4) NOT NULL DEFAULT 0.0000,
  `tax_amount` decimal(15,2) NOT NULL DEFAULT 0.00,
  `paid_amount` decimal(15,2) NOT NULL DEFAULT 0.00,
  `change_amount` decimal(15,2) NOT NULL DEFAULT 0.00,
  `payment_method` varchar(50) NOT NULL,
  `payment_status` enum('paid','unpaid','partial') NOT NULL DEFAULT 'paid',
  `payment_requested_status` enum('paid','unpaid','partial') DEFAULT NULL,
  `payment_submitted_amount` decimal(15,2) NOT NULL DEFAULT 0.00,
  `payment_proof_path` varchar(255) DEFAULT NULL,
  `payment_proof_required` tinyint(1) NOT NULL DEFAULT 0,
  `payment_approval_required` tinyint(1) NOT NULL DEFAULT 0,
  `payment_verification_status` enum('not_required','pending','approved','rejected') NOT NULL DEFAULT 'not_required',
  `payment_verified_by` int(11) DEFAULT NULL,
  `payment_verified_at` datetime DEFAULT NULL,
  `payment_verification_notes` varchar(500) DEFAULT NULL,
  `payment_points_applied` tinyint(1) NOT NULL DEFAULT 0,
  `notes` text DEFAULT NULL,
  `created_by` int(11) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `invoice_no` (`invoice_no`),
  KEY `fk_trx_member` (`member_id`),
  KEY `fk_trx_user` (`created_by`),
  KEY `fk_transaction_payment_verified_by` (`payment_verified_by`),
  KEY `idx_trx_date` (`transaction_date`),
  KEY `idx_trx_payment` (`payment_status`,`payment_method`),
  KEY `idx_trx_verification` (`payment_verification_status`,`payment_approval_required`),
  KEY `idx_transactions_verify_date` (`payment_verification_status`,`transaction_date`),
  CONSTRAINT `fk_transaction_payment_verified_by` FOREIGN KEY (`payment_verified_by`) REFERENCES `users` (`id`) ON DELETE SET NULL,
  CONSTRAINT `fk_trx_member` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE SET NULL,
  CONSTRAINT `fk_trx_user` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `transactions` VALUES('4','TRX-20260901-0001',NULL,'2026-09-01 11:40:38','90000.00','0.00','90000.00','0.0000','0.00','90000.00','0.00','QRIS','paid','paid','90000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 11:40:38');
INSERT INTO `transactions` VALUES('5','TRX-20260901-0002',NULL,'2026-09-01 11:56:43','80000.00','0.00','80000.00','0.0000','0.00','80000.00','0.00','QRIS','paid','paid','80000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 11:56:43');
INSERT INTO `transactions` VALUES('6','TRX-20260901-0003',NULL,'2026-09-01 11:57:13','90000.00','0.00','90000.00','0.0000','0.00','90000.00','0.00','QRIS','paid','paid','90000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 11:57:13');
INSERT INTO `transactions` VALUES('7','TRX-20260901-0004',NULL,'2026-09-01 12:14:26','90000.00','0.00','90000.00','0.0000','0.00','90000.00','0.00','Cash','paid','paid','90000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 12:14:26');
INSERT INTO `transactions` VALUES('8','TRX-20260901-0005',NULL,'2026-09-01 12:19:41','90000.00','0.00','90000.00','0.0000','0.00','90000.00','0.00','QRIS','paid','paid','90000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 12:19:41');
INSERT INTO `transactions` VALUES('9','TRX-20260901-0006',NULL,'2026-09-01 12:57:43','80000.00','0.00','80000.00','0.0000','0.00','80000.00','0.00','QRIS','paid','paid','80000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 12:57:43');
INSERT INTO `transactions` VALUES('10','TRX-20260901-0007',NULL,'2026-09-01 13:08:31','80000.00','0.00','80000.00','0.0000','0.00','80000.00','0.00','QRIS','paid','paid','80000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 13:08:31');
INSERT INTO `transactions` VALUES('11','TRX-20260901-0008',NULL,'2026-09-01 13:14:32','80000.00','0.00','80000.00','0.0000','0.00','80000.00','0.00','QRIS','paid','paid','80000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 13:14:32');
INSERT INTO `transactions` VALUES('12','TRX-20260901-0009',NULL,'2026-09-01 13:29:09','90000.00','0.00','90000.00','0.0000','0.00','90000.00','0.00','QRIS','paid','paid','90000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 13:29:09');
INSERT INTO `transactions` VALUES('13','TRX-20260901-0010',NULL,'2026-09-01 13:31:50','90000.00','0.00','90000.00','0.0000','0.00','90000.00','0.00','QRIS','paid','paid','90000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 13:31:50');
INSERT INTO `transactions` VALUES('14','TRX-20260901-0011',NULL,'2026-09-01 14:13:42','80000.00','0.00','80000.00','0.0000','0.00','80000.00','0.00','QRIS','paid','paid','80000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 14:13:42');
INSERT INTO `transactions` VALUES('15','TRX-20260901-0012',NULL,'2026-09-01 14:14:16','125000.00','0.00','125000.00','0.0000','0.00','125000.00','0.00','QRIS','paid','paid','125000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 14:14:16');
INSERT INTO `transactions` VALUES('16','TRX-20260901-0013',NULL,'2026-09-01 14:32:58','90000.00','0.00','90000.00','0.0000','0.00','90000.00','0.00','QRIS','paid','paid','90000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','1','2026-09-01 14:32:58');
INSERT INTO `transactions` VALUES('17','TRX-20260901-0014',NULL,'2026-09-01 15:13:42','80000.00','0.00','80000.00','0.0000','0.00','80001.00','1.00','Cash','paid','paid','80001.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 15:13:42');
INSERT INTO `transactions` VALUES('18','TRX-20260901-0015',NULL,'2026-09-01 15:47:49','80000.00','0.00','80000.00','0.0000','0.00','80000.00','0.00','QRIS','paid','paid','80000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 15:47:49');
INSERT INTO `transactions` VALUES('19','TRX-20260901-0016',NULL,'2026-09-01 15:48:22','80000.00','0.00','80000.00','0.0000','0.00','80000.00','0.00','QRIS','paid','paid','80000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 15:48:22');
INSERT INTO `transactions` VALUES('20','TRX-20260901-0017',NULL,'2026-09-01 16:02:23','125000.00','0.00','125000.00','0.0000','0.00','125000.00','0.00','QRIS','paid','paid','125000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 16:02:23');
INSERT INTO `transactions` VALUES('21','TRX-20260901-0018',NULL,'2026-09-01 16:40:00','45000.00','0.00','45000.00','0.0000','0.00','45000.00','0.00','QRIS','paid','paid','45000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 16:40:00');
INSERT INTO `transactions` VALUES('22','TRX-20260901-0019',NULL,'2026-09-01 17:12:48','80000.00','0.00','80000.00','0.0000','0.00','80000.00','0.00','QRIS','paid','paid','80000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 17:12:48');
INSERT INTO `transactions` VALUES('23','TRX-20260901-0020',NULL,'2026-09-01 17:14:17','80000.00','0.00','80000.00','0.0000','0.00','80000.00','0.00','QRIS','paid','paid','80000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 17:14:17');
INSERT INTO `transactions` VALUES('24','TRX-20260901-0021',NULL,'2026-09-01 17:59:18','90000.00','0.00','90000.00','0.0000','0.00','90000.00','0.00','QRIS','paid','paid','90000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 17:59:18');
INSERT INTO `transactions` VALUES('25','TRX-20260901-0022',NULL,'2026-09-01 18:02:31','250000.00','0.00','250000.00','0.0000','0.00','250000.00','0.00','QRIS','paid','paid','250000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 18:02:31');
INSERT INTO `transactions` VALUES('26','TRX-20260901-0023',NULL,'2026-09-01 19:04:03','125000.00','0.00','125000.00','0.0000','0.00','125000.00','0.00','QRIS','paid','paid','125000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','1','2026-09-01 19:04:03');
INSERT INTO `transactions` VALUES('27','TRX-20260901-0024',NULL,'2026-09-01 19:07:47','90000.00','0.00','90000.00','0.0000','0.00','90000.00','0.00','QRIS','paid','paid','90000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 19:07:47');
INSERT INTO `transactions` VALUES('28','TRX-20260901-0025',NULL,'2026-09-01 19:31:50','60000.00','0.00','60000.00','0.0000','0.00','60000.00','0.00','QRIS','paid','paid','60000.00',NULL,'0','0','not_required',NULL,NULL,NULL,'0','','7','2026-09-01 19:31:50');

DROP TABLE IF EXISTS `user_import_batches`;
CREATE TABLE `user_import_batches` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `file_name` varchar(255) NOT NULL,
  `duplicate_mode` enum('skip','update') NOT NULL DEFAULT 'skip',
  `total_rows` int(11) NOT NULL DEFAULT 0,
  `inserted_rows` int(11) NOT NULL DEFAULT 0,
  `updated_rows` int(11) NOT NULL DEFAULT 0,
  `skipped_rows` int(11) NOT NULL DEFAULT 0,
  `failed_rows` int(11) NOT NULL DEFAULT 0,
  `staff_created` int(11) NOT NULL DEFAULT 0,
  `staff_updated` int(11) NOT NULL DEFAULT 0,
  `imported_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `idx_user_import_batches_created` (`created_at`),
  KEY `idx_user_import_batches_user` (`imported_by`,`created_at`),
  CONSTRAINT `user_import_batches_ibfk_1` FOREIGN KEY (`imported_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `user_import_batches` VALUES('1','template_import_user.xlsx','skip','16','16','0','0','0','8','0','1','2026-09-01 10:44:17');
INSERT INTO `user_import_batches` VALUES('2','template_import_user_karyawan.xlsx','skip','5','4','0','1','0','4','0','1','2026-09-01 17:50:33');
INSERT INTO `user_import_batches` VALUES('3','template_import_user_karyawan_kasir.xlsx','skip','2','2','0','0','0','2','0','1','2026-09-01 18:15:36');

DROP TABLE IF EXISTS `user_import_rows`;
CREATE TABLE `user_import_rows` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `batch_id` bigint(20) NOT NULL,
  `row_number` int(11) NOT NULL,
  `username` varchar(80) DEFAULT NULL,
  `name` varchar(120) DEFAULT NULL,
  `role` varchar(40) DEFAULT NULL,
  `action_type` enum('insert','update','skip','error') NOT NULL,
  `status` enum('success','warning','error') NOT NULL DEFAULT 'success',
  `message` varchar(1000) DEFAULT NULL,
  `user_id` int(11) DEFAULT NULL,
  `staff_type` enum('barber','employee') DEFAULT NULL,
  `staff_id` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`),
  KEY `idx_user_import_rows_batch` (`batch_id`,`row_number`),
  KEY `idx_user_import_rows_status` (`batch_id`,`status`),
  CONSTRAINT `user_import_rows_ibfk_1` FOREIGN KEY (`batch_id`) REFERENCES `user_import_batches` (`id`) ON DELETE CASCADE,
  CONSTRAINT `user_import_rows_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `user_import_rows` VALUES('1','1','2','niken_manager','Niken Fitri Nabilah','manager','insert','success','User berhasil dibuat.','3',NULL,NULL,'2026-09-01 10:44:17');
INSERT INTO `user_import_rows` VALUES('2','1','3','adi_manager','Adi Sujana','manager','insert','success','User berhasil dibuat.','4',NULL,NULL,'2026-09-01 10:44:17');
INSERT INTO `user_import_rows` VALUES('3','1','4','zharfandy_manager','Zharfandy Muhammad','manager','insert','success','User berhasil dibuat.','5',NULL,NULL,'2026-09-01 10:44:17');
INSERT INTO `user_import_rows` VALUES('4','1','5','manda_kasir','Manda Danaya','cashier','insert','success','User berhasil dibuat.','6',NULL,NULL,'2026-09-01 10:44:17');
INSERT INTO `user_import_rows` VALUES('5','1','6','andina_kasir','Andina Okta Mulyati','cashier','insert','success','User berhasil dibuat.','7',NULL,NULL,'2026-09-01 10:44:17');
INSERT INTO `user_import_rows` VALUES('6','1','7','rini_kasir','Rini Rimasari','cashier','insert','success','User berhasil dibuat.','8',NULL,NULL,'2026-09-01 10:44:17');
INSERT INTO `user_import_rows` VALUES('7','1','8','zharfandy_finance','Zharfandy Muhammad','finance','insert','success','User berhasil dibuat.','9',NULL,NULL,'2026-09-01 10:44:17');
INSERT INTO `user_import_rows` VALUES('8','1','9','acep_auditor','Acep Roni','finance_auditor','insert','success','User berhasil dibuat.','10',NULL,NULL,'2026-09-01 10:44:17');
INSERT INTO `user_import_rows` VALUES('9','1','10','adi_capster','Adi Sujana','barber','insert','success','User berhasil dibuat. Profil barber terhubung.','11','barber','1','2026-09-01 10:44:17');
INSERT INTO `user_import_rows` VALUES('10','1','11','ridwan_capster','Ridwan Firdaus','barber','insert','success','User berhasil dibuat. Profil barber terhubung.','12','barber','2','2026-09-01 10:44:18');
INSERT INTO `user_import_rows` VALUES('11','1','12','ian_capster','Ian Septian','barber','insert','success','User berhasil dibuat. Profil barber terhubung.','13','barber','3','2026-09-01 10:44:18');
INSERT INTO `user_import_rows` VALUES('12','1','13','daud_capster','Daud Somantri','barber','insert','success','User berhasil dibuat. Profil barber terhubung.','14','barber','4','2026-09-01 10:44:18');
INSERT INTO `user_import_rows` VALUES('13','1','14','rangga_capster','Rangga Erlangga','barber','insert','success','User berhasil dibuat. Profil barber terhubung.','15','barber','5','2026-09-01 10:44:18');
INSERT INTO `user_import_rows` VALUES('14','1','15','rian_capster','Rian Ikbal','barber','insert','success','User berhasil dibuat. Profil barber terhubung.','16','barber','6','2026-09-01 10:44:18');
INSERT INTO `user_import_rows` VALUES('15','1','16','tantan_capster','Tantan','barber','insert','success','User berhasil dibuat. Profil barber terhubung.','17','barber','7','2026-09-01 10:44:18');
INSERT INTO `user_import_rows` VALUES('16','1','17','suradiman_ob','Suradiman','employee','insert','success','User berhasil dibuat. Profil employee terhubung.','18','employee','1','2026-09-01 10:44:18');
INSERT INTO `user_import_rows` VALUES('17','2','2','niken','Niken Fitri Nabilah','employee','insert','success','User berhasil dibuat. Profil employee terhubung.','19','employee','2','2026-09-01 17:50:33');
INSERT INTO `user_import_rows` VALUES('18','2','3','adi','Adi Sujana','employee','insert','success','User berhasil dibuat. Profil employee terhubung.','20','employee','3','2026-09-01 17:50:33');
INSERT INTO `user_import_rows` VALUES('19','2','4','zharfandy','Zharfandy Muhammad','employee','insert','success','User berhasil dibuat. Profil employee terhubung.','21','employee','4','2026-09-01 17:50:33');
INSERT INTO `user_import_rows` VALUES('20','2','5','adi','Adi Sujana','employee','skip','warning','Username sudah ada; dilewati sesuai mode import.','20',NULL,NULL,'2026-09-01 17:50:33');
INSERT INTO `user_import_rows` VALUES('21','2','6','rini','Rini Rimasari','employee','insert','success','User berhasil dibuat. Profil employee terhubung.','22','employee','5','2026-09-01 17:50:34');
INSERT INTO `user_import_rows` VALUES('22','3','2','manda','Manda Danaya','employee','insert','success','User berhasil dibuat. Profil employee terhubung.','23','employee','6','2026-09-01 18:15:37');
INSERT INTO `user_import_rows` VALUES('23','3','3','andina','Andina Okta Mulyati','employee','insert','success','User berhasil dibuat. Profil employee terhubung.','24','employee','7','2026-09-01 18:15:37');

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(120) NOT NULL,
  `username` varchar(80) NOT NULL,
  `password` varchar(255) NOT NULL,
  `role` enum('superadmin','manager','cashier','finance','finance_auditor','barber','employee') NOT NULL DEFAULT 'cashier',
  `phone` varchar(40) DEFAULT NULL,
  `email` varchar(150) DEFAULT NULL,
  `job_title` varchar(120) DEFAULT NULL,
  `avatar` varchar(255) DEFAULT NULL,
  `notes` text DEFAULT NULL,
  `require_password_change` tinyint(1) NOT NULL DEFAULT 0,
  `password_changed_at` datetime DEFAULT NULL,
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `last_login` datetime DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
INSERT INTO `users` VALUES('1','Super Administrator','acepronihamdani@unpas.ac.id','$2y$10$Mn9ieFE4cPrBYTHBf9VPC.K4.rcMqdbnbQubkImrR6PHhQhK7QQlq','superadmin','085223970654','acepronihamdani@unpas.ac.id','Direktur Utama','uploads/user_avatars/user_1_20260901113435_3e9c5a.png',NULL,'0','2026-09-01 09:58:45','1','2026-09-02 04:19:05','2026-09-01 09:43:31','2026-09-02 04:19:05');
INSERT INTO `users` VALUES('3','Niken Fitri Nabilah','niken_manager','$2y$10$uRzW0jFwbSM2Snfw75KpeuT2pkQO1aRqGpACRRZXtr8SWtfwGy01G','manager','085871614716','nikenfitri07@gmail.com','Manager 1',NULL,'1','0','2026-09-01 10:44:17','1','2026-09-01 20:30:32','2026-09-01 10:44:17','2026-09-01 20:30:32');
INSERT INTO `users` VALUES('4','Adi Sujana','adi_manager','$2y$10$2lePJEBL7i/D/oC/9.DfSemo98/4kRqIMP48xhV7QRTc9vmxfJsH2','manager','089655802594','adisujana29@gmail.com','Manager 2',NULL,'1','1','2026-09-01 10:44:17','1','2026-09-01 20:27:46','2026-09-01 10:44:17','2026-09-01 20:27:46');
INSERT INTO `users` VALUES('5','Zharfandy Muhammad','zharfandy_manager','$2y$10$NFakVhKx4q74kaGheVEoA.2ssI7wF3xSmDmksOmAZQwRgxt1GFo3.','manager','087724005132','zharfandymuhammad@gmail.com','Manager 3',NULL,'1','1','2026-09-01 10:44:17','1','2026-09-01 20:40:16','2026-09-01 10:44:17','2026-09-01 20:40:16');
INSERT INTO `users` VALUES('6','Manda Danaya','manda_kasir','$2y$10$JOYiMz9juitXe4./0dVO7OWKlUyn8AD08QpV6eqcwWewF6cewJaD6','cashier','085960278288','mandadanaya26@gmail.com','Kasir',NULL,NULL,'0','2026-09-01 11:02:02','1','2026-09-01 11:13:21','2026-09-01 10:44:17','2026-09-01 11:13:21');
INSERT INTO `users` VALUES('7','Andina Okta Mulyati','andina_kasir','$2y$10$VL4gYOETPCzR5H7X9zCLHuGpMEXNYV.Hkg.bEthfyHXo8G7iM1C8u','cashier','088218308558','andinaoktamulyati1510@gmail.com','Kasir','uploads/user_avatars/user_7_20260901110313_f480de.jpeg',NULL,'0','2026-09-01 11:03:13','1','2026-09-01 20:07:10','2026-09-01 10:44:17','2026-09-01 20:07:10');
INSERT INTO `users` VALUES('8','Rini Rimasari','rini_kasir','$2y$10$BLvrVSEGNxyo274XcPCMKuNg7kbL54uTFgqOG1ZvHN7ShMP5WrOHW','cashier','08814540911','karinirimasari@gmail.com','Kasir',NULL,'1','1','2026-09-01 10:44:17','1',NULL,'2026-09-01 10:44:17','2026-09-01 10:44:17');
INSERT INTO `users` VALUES('9','Zharfandy Muhammad','zharfandy_finance','$2y$10$msnCcHYFA0ao9v.NXpWGNuBB8119Ha4imItqcPRKjut4l/xSe34qi','finance','087724005132','zharfandymuhammad@gmail.com','Manager Keuangan',NULL,NULL,'1','2026-09-01 10:44:17','1','2026-09-01 21:55:20','2026-09-01 10:44:17','2026-09-01 21:55:20');
INSERT INTO `users` VALUES('10','Acep Roni','acep_auditor','$2y$10$VE387gVq7b7cpQlZZDBi3u1HlGX./pzz6O/V2qrrD15vTnfJCaTIG','finance_auditor','085223970654','acepronihamdani@unpas.ac.id','Auditor',NULL,NULL,'1','2026-09-01 10:44:17','1',NULL,'2026-09-01 10:44:17','2026-09-01 10:44:17');
INSERT INTO `users` VALUES('11','Adi Sujana','adi_capster','$2y$10$9TrS/nms5tDUiN9xuxeOWuD80y76qmAYZZ.oVafUovRSPdqbmC.yS','barber','089655802594','adisujana29@gmail.com','Capster 1',NULL,NULL,'0','2026-09-01 10:44:17','1','2026-09-01 14:39:46','2026-09-01 10:44:17','2026-09-01 14:39:46');
INSERT INTO `users` VALUES('12','ayong - Ridwan Firdaus','ridwan_capster','$2y$10$/h0NupE5e9VluHZ7A3BuZeFOrPxtw70Ok6zVfEiyarYaQaxyh3c7y','barber','082115005100','laisyamura@gmail.com','Capster 2',NULL,NULL,'0','2026-09-01 10:44:18','1','2026-09-01 21:20:20','2026-09-01 10:44:18','2026-09-01 21:20:20');
INSERT INTO `users` VALUES('13','Yanyan - Ian Septian','ian_capster','$2y$10$Pi05F2yuZ5H9kR4VwJUBYOkeg9bSiMKYHincDXYe9F.ndu1FfSrR.','barber','0882001340239','yanyan@gmail.com','Capster 3',NULL,NULL,'0','2026-09-01 10:44:18','1','2026-09-01 20:28:50','2026-09-01 10:44:18','2026-09-01 20:28:50');
INSERT INTO `users` VALUES('14','Uway - Daud Somantri','daud_capster','$2y$10$lZ8Xb2oBTA5UZgG1WwwE0uUb62yFfkarwFkluQzap30rDL.MCIBRS','barber','081218543978','somantridaud43@gmail.com','Capster 4',NULL,NULL,'0','2026-09-01 10:44:18','1','2026-09-01 11:07:33','2026-09-01 10:44:18','2026-09-01 11:21:49');
INSERT INTO `users` VALUES('15','Angga - Rangga Erlangga','rangga_capster','$2y$10$bRtVrmxXExMWTPTUr90OSOLWz6SA9yOo4C4ABPxZoYDYbf2dxzxLG','barber','083117031561','garaalex2222@gmail.com','Capster 5',NULL,NULL,'0','2026-09-01 10:44:18','1','2026-09-01 18:07:16','2026-09-01 10:44:18','2026-09-01 18:07:16');
INSERT INTO `users` VALUES('16','Ikbal - Rian Ikbal','rian_capster','$2y$10$SnpvBpd3xNJJ3zm/VSkHQeEtCUHbFTFf2qN/WFfGktLfusBpPKPNG','barber','082321830708','martet@gmail.com','Capster 6',NULL,NULL,'0','2026-09-01 10:44:18','1','2026-09-01 20:36:45','2026-09-01 10:44:18','2026-09-01 20:36:45');
INSERT INTO `users` VALUES('17','Tantan','tantan_capster','$2y$10$LRoYVLE9MITJG0BrIyeCbuTYvoRL2XxpwUgOTeoEfVHOLVTBJk6wq','barber','081223779337','tantansetiawan90@gmail.com','Capster 7',NULL,NULL,'0','2026-09-01 15:25:40','1','2026-09-01 20:25:33','2026-09-01 10:44:18','2026-09-01 20:25:33');
INSERT INTO `users` VALUES('18','Suradiman','suradiman_ob','$2y$10$tEv3ehqqZ4.Q6hd05smmu.v7lcHTMZhhir7DOVfEjiOg5BUqlDhw.','employee','087871679787','sukmawatisukmawati1991@gmail.com','Office Boy',NULL,NULL,'0','2026-09-01 10:44:18','1',NULL,'2026-09-01 10:44:18','2026-09-01 10:44:18');
INSERT INTO `users` VALUES('19','Niken Fitri Nabilah','niken','$2y$10$2BXg5lVB3XjZQ9yZtXF/BOJiq5VN91FwX6quOnrFOjjSG/Z/9eGXe','employee','085871614716','nikenfitri07@gmail.com','Karyawan 1',NULL,'1','1','2026-09-01 17:50:33','1',NULL,'2026-09-01 17:50:33','2026-09-01 17:50:33');
INSERT INTO `users` VALUES('20','Adi Sujana','adi','$2y$10$jmXNviHFeuGBFZpzyYKnROM3dY9x3gdhwf.97fusYr3ccguAD/mzq','employee','089655802594','adisujana29@gmail.com','Karyawan 2',NULL,'1','1','2026-09-01 17:50:33','1',NULL,'2026-09-01 17:50:33','2026-09-01 17:50:33');
INSERT INTO `users` VALUES('21','Zharfandy Muhammad','zharfandy','$2y$10$YQydBzgAWEOuSJnfr4DXcOSvo4pQ9MEbI.QvCeaRq1KLBRw3QNUCa','employee','087724005132','zharfandymuhammad@gmail.com','Karyawan 3',NULL,'1','1','2026-09-01 17:50:33','1',NULL,'2026-09-01 17:50:33','2026-09-01 17:50:33');
INSERT INTO `users` VALUES('22','Rini Rimasari','rini','$2y$10$ioTyG0fXlerxu.VIx3u.EexTyvGIwa3RH5YYkoDCLyyygQb3ZeXWe','employee','08814540911','karinirimasari@gmail.com','Karyawan 5',NULL,'1','1','2026-09-01 17:50:34','1',NULL,'2026-09-01 17:50:34','2026-09-01 17:50:34');
INSERT INTO `users` VALUES('23','Manda Danaya','manda','$2y$10$f7xiilJWalwXvSILS4OOkurnfpdi4LwmY.GgVGjFDeXZRKpxZUL5i','employee','085960278288','mandadanaya26@gmail.com','Karyawan 4',NULL,'1','1','2026-09-01 18:15:37','1','2026-09-01 20:32:46','2026-09-01 18:15:37','2026-09-01 20:32:46');
INSERT INTO `users` VALUES('24','Andina Okta Mulyati','andina','$2y$10$qtFURwqUZQ9blylTpjOLI.NYDn9aV/LM/hvsyoj9PsSXcEwjZbCum','employee','088218308558','andinaoktamulyati1510@gmail.com','Karyawan 6',NULL,'1','1','2026-09-01 18:15:37','1','2026-09-01 20:33:04','2026-09-01 18:15:37','2026-09-01 20:33:04');

DROP TABLE IF EXISTS `zk_attendance_logs`;
CREATE TABLE `zk_attendance_logs` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `device_id` int(11) DEFAULT NULL,
  `serial_number` varchar(120) DEFAULT NULL,
  `device_user_id` varchar(80) NOT NULL,
  `punch_time` datetime NOT NULL,
  `verify_code` int(11) DEFAULT NULL,
  `verify_method` enum('face_id','fingerprint','card','unknown') NOT NULL DEFAULT 'unknown',
  `attendance_action` varchar(40) DEFAULT NULL,
  `staff_type` enum('barber','employee') DEFAULT NULL,
  `staff_id` int(11) DEFAULT NULL,
  `attendance_record_id` bigint(20) DEFAULT NULL,
  `raw_line` text DEFAULT NULL,
  `process_status` enum('processed','unmapped','duplicate','error') NOT NULL DEFAULT 'processed',
  `process_message` varchar(255) DEFAULT NULL,
  `received_ip` varchar(64) DEFAULT NULL,
  `received_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `attendance_record_id` (`attendance_record_id`),
  KEY `idx_zk_attlog_user` (`device_user_id`,`punch_time`),
  KEY `idx_zk_attlog_device` (`device_id`,`received_at`),
  KEY `idx_zk_attlog_status` (`process_status`,`received_at`),
  CONSTRAINT `zk_attendance_logs_ibfk_1` FOREIGN KEY (`device_id`) REFERENCES `zk_devices` (`id`) ON DELETE SET NULL,
  CONSTRAINT `zk_attendance_logs_ibfk_2` FOREIGN KEY (`attendance_record_id`) REFERENCES `attendance_records` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `zk_connection_checks`;
CREATE TABLE `zk_connection_checks` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `device_id` int(11) DEFAULT NULL,
  `serial_number` varchar(120) DEFAULT NULL,
  `check_type` varchar(50) NOT NULL,
  `status` enum('success','warning','failed','info') NOT NULL DEFAULT 'info',
  `target` varchar(255) DEFAULT NULL,
  `latency_ms` int(11) DEFAULT NULL,
  `detail` varchar(1000) DEFAULT NULL,
  `checked_by` int(11) DEFAULT NULL,
  `checked_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `checked_by` (`checked_by`),
  KEY `idx_zk_check_device` (`device_id`,`checked_at`),
  KEY `idx_zk_check_status` (`status`,`checked_at`),
  CONSTRAINT `zk_connection_checks_ibfk_1` FOREIGN KEY (`device_id`) REFERENCES `zk_devices` (`id`) ON DELETE SET NULL,
  CONSTRAINT `zk_connection_checks_ibfk_2` FOREIGN KEY (`checked_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `zk_devices`;
CREATE TABLE `zk_devices` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `device_name` varchar(150) NOT NULL,
  `serial_number` varchar(120) NOT NULL,
  `location_name` varchar(150) DEFAULT NULL,
  `ip_address` varchar(64) DEFAULT NULL,
  `adms_port` int(11) NOT NULL DEFAULT 80,
  `push_path` varchar(180) NOT NULL DEFAULT '/iclock/cdata',
  `device_model` varchar(100) NOT NULL DEFAULT 'SpeedFace-V5L',
  `firmware_version` varchar(100) DEFAULT NULL,
  `install_status` enum('draft','configured','connected','synced','error') NOT NULL DEFAULT 'draft',
  `server_mode` enum('domain','ip') NOT NULL DEFAULT 'domain',
  `server_address` varchar(190) DEFAULT NULL,
  `server_port` int(11) NOT NULL DEFAULT 443,
  `use_https` tinyint(1) NOT NULL DEFAULT 1,
  `device_type` varchar(60) NOT NULL DEFAULT 'TA Push',
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `last_seen_at` datetime DEFAULT NULL,
  `last_options_at` datetime DEFAULT NULL,
  `last_attlog_at` datetime DEFAULT NULL,
  `last_protocol_event` varchar(80) DEFAULT NULL,
  `last_ip` varchar(64) DEFAULT NULL,
  `last_user_agent` varchar(255) DEFAULT NULL,
  `created_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `serial_number` (`serial_number`),
  KEY `created_by` (`created_by`),
  KEY `idx_zk_device_active` (`is_active`,`last_seen_at`),
  CONSTRAINT `zk_devices_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `zk_install_sessions`;
CREATE TABLE `zk_install_sessions` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `device_id` int(11) NOT NULL,
  `serial_number` varchar(120) NOT NULL,
  `expected_host` varchar(190) NOT NULL,
  `expected_port` int(11) NOT NULL DEFAULT 443,
  `expected_https` tinyint(1) NOT NULL DEFAULT 1,
  `expected_domain_mode` tinyint(1) NOT NULL DEFAULT 1,
  `local_ip` varchar(64) DEFAULT NULL,
  `subnet_mask` varchar(64) DEFAULT NULL,
  `gateway` varchar(64) DEFAULT NULL,
  `dns_server` varchar(64) DEFAULT NULL,
  `install_step` int(11) NOT NULL DEFAULT 1,
  `endpoint_test_status` enum('pending','success','failed') NOT NULL DEFAULT 'pending',
  `endpoint_test_detail` varchar(500) DEFAULT NULL,
  `first_push_at` datetime DEFAULT NULL,
  `final_sync_at` datetime DEFAULT NULL,
  `status` enum('draft','waiting_device','connected','synced','failed') NOT NULL DEFAULT 'draft',
  `created_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `created_by` (`created_by`),
  KEY `idx_zk_install_device` (`device_id`,`status`),
  KEY `idx_zk_install_sn` (`serial_number`),
  CONSTRAINT `zk_install_sessions_ibfk_1` FOREIGN KEY (`device_id`) REFERENCES `zk_devices` (`id`) ON DELETE CASCADE,
  CONSTRAINT `zk_install_sessions_ibfk_2` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `zk_step_diagnostics`;
CREATE TABLE `zk_step_diagnostics` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `device_id` int(11) NOT NULL,
  `serial_number` varchar(120) NOT NULL,
  `step_no` int(11) NOT NULL,
  `step_key` varchar(60) NOT NULL,
  `status` enum('pending','success','warning','failed','info') NOT NULL DEFAULT 'pending',
  `target` varchar(255) DEFAULT NULL,
  `detail` varchar(1000) DEFAULT NULL,
  `checked_by` int(11) DEFAULT NULL,
  `checked_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `checked_by` (`checked_by`),
  KEY `idx_zk_step_device` (`device_id`,`step_no`,`checked_at`),
  KEY `idx_zk_step_status` (`status`,`checked_at`),
  CONSTRAINT `zk_step_diagnostics_ibfk_1` FOREIGN KEY (`device_id`) REFERENCES `zk_devices` (`id`) ON DELETE CASCADE,
  CONSTRAINT `zk_step_diagnostics_ibfk_2` FOREIGN KEY (`checked_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `zk_sync_logs`;
CREATE TABLE `zk_sync_logs` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `device_id` int(11) DEFAULT NULL,
  `serial_number` varchar(120) DEFAULT NULL,
  `direction` enum('device_to_server','server_to_device') NOT NULL DEFAULT 'device_to_server',
  `event_type` varchar(80) NOT NULL,
  `status` enum('success','warning','error') NOT NULL DEFAULT 'success',
  `processed_count` int(11) NOT NULL DEFAULT 0,
  `unknown_count` int(11) NOT NULL DEFAULT 0,
  `detail` text DEFAULT NULL,
  `remote_ip` varchar(64) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `idx_zk_sync_device` (`device_id`,`created_at`),
  KEY `idx_zk_sync_status` (`status`,`created_at`),
  CONSTRAINT `zk_sync_logs_ibfk_1` FOREIGN KEY (`device_id`) REFERENCES `zk_devices` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

DROP TABLE IF EXISTS `zk_user_mappings`;
CREATE TABLE `zk_user_mappings` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `device_id` int(11) DEFAULT NULL,
  `device_user_id` varchar(80) NOT NULL,
  `staff_type` enum('barber','employee') NOT NULL,
  `staff_id` int(11) NOT NULL,
  `display_name` varchar(180) DEFAULT NULL,
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `created_by` int(11) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_zk_mapping` (`device_id`,`device_user_id`),
  KEY `created_by` (`created_by`),
  KEY `idx_zk_mapping_staff` (`staff_type`,`staff_id`),
  CONSTRAINT `zk_user_mappings_ibfk_1` FOREIGN KEY (`device_id`) REFERENCES `zk_devices` (`id`) ON DELETE CASCADE,
  CONSTRAINT `zk_user_mappings_ibfk_2` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

SET FOREIGN_KEY_CHECKS=1;
