db = $db; $this->entity = $entity; } /** * Create a new period * * @param string $period_name Period name (e.g., Q1-2024) * @param string $start_date Start date (YYYY-MM-DD) * @param string $end_date End date (YYYY-MM-DD) * @return int Period ID or -1 if error */ public function createPeriod($period_name, $start_date, $end_date) { $this->db->begin(); // Check if period already exists if ($this->periodExists($period_name)) { $this->error = "Period already exists"; $this->db->rollback(); return -1; } // Create period $sql = "INSERT INTO " . MAIN_DB_PREFIX . "declarationtva_periods (entity, period_name, start_date, end_date, status, created_date) VALUES (" . $this->entity . ", '" . $this->db->escape($period_name) . "', '" . $this->db->escape($start_date) . "', '" . $this->db->escape($end_date) . "', 'draft', NOW())"; $result = $this->db->query($sql); if (!$result) { $this->error = "Error creating period: " . $this->db->lasterror(); $this->db->rollback(); return -1; } $period_id = $this->db->last_insert_id(MAIN_DB_PREFIX . "declarationtva_periods"); $this->db->commit(); return $period_id; } /** * Check if period exists * * @param string $period_name Period name * @return bool Exists */ public function periodExists($period_name) { $sql = "SELECT COUNT(*) as count FROM " . MAIN_DB_PREFIX . "declarationtva_periods WHERE entity = " . $this->entity . " AND period_name = '" . $this->db->escape($period_name) . "'"; $result = $this->db->query($sql); if ($result && $this->db->num_rows($result) > 0) { $obj = $this->db->fetch_object($result); return $obj->count > 0; } return false; } /** * Get period information * * @param int $period_id Period ID * @return array|false Period information or false if not found */ public function getPeriod($period_id) { $sql = "SELECT * FROM " . MAIN_DB_PREFIX . "declarationtva_periods WHERE rowid = " . $period_id . " AND entity = " . $this->entity; $result = $this->db->query($sql); if ($result && $this->db->num_rows($result) > 0) { return $this->db->fetch_array($result); } return false; } /** * Get all periods * * @return array Periods */ public function getAllPeriods() { $sql = "SELECT * FROM " . MAIN_DB_PREFIX . "declarationtva_periods WHERE entity = " . $this->entity . " ORDER BY start_date DESC"; $result = $this->db->query($sql); $periods = array(); if ($result) { while ($obj = $this->db->fetch_object($result)) { $periods[] = array( 'rowid' => $obj->rowid, 'period_name' => $obj->period_name, 'start_date' => $obj->start_date, 'end_date' => $obj->end_date, 'status' => $obj->status, 'created_date' => $obj->created_date ); } } return $periods; } /** * Update period status * * @param int $period_id Period ID * @param string $status New status * @return bool Success */ public function updatePeriodStatus($period_id, $status) { $sql = "UPDATE " . MAIN_DB_PREFIX . "declarationtva_periods SET status = '" . $this->db->escape($status) . "' WHERE rowid = " . $period_id . " AND entity = " . $this->entity; $result = $this->db->query($sql); return $result !== false; } /** * Generate quarterly periods for a year * * @param int $year Year * @return array Period IDs */ public function generateYearlyPeriods($year) { $periods = array(); $quarters = array( 'Q1' => array('start' => $year . '-01-01', 'end' => $year . '-03-31'), 'Q2' => array('start' => $year . '-04-01', 'end' => $year . '-06-30'), 'Q3' => array('start' => $year . '-07-01', 'end' => $year . '-09-30'), 'Q4' => array('start' => $year . '-10-01', 'end' => $year . '-12-31') ); foreach ($quarters as $quarter => $dates) { $period_name = $quarter . '-' . $year; if (!$this->periodExists($period_name)) { $period_id = $this->createPeriod($period_name, $dates['start'], $dates['end']); if ($period_id > 0) { $periods[] = $period_id; } } } return $periods; } /** * Get current period (based on today's date) * * @return array|false Current period or false if not found */ public function getCurrentPeriod() { $today = date('Y-m-d'); $sql = "SELECT * FROM " . MAIN_DB_PREFIX . "declarationtva_periods WHERE entity = " . $this->entity . " AND start_date <= '" . $today . "' AND end_date >= '" . $today . "' ORDER BY start_date DESC LIMIT 1"; $result = $this->db->query($sql); if ($result && $this->db->num_rows($result) > 0) { return $this->db->fetch_array($result); } return false; } /** * Get period by name * * @param string $period_name Period name * @return array|false Period information or false if not found */ public function getPeriodByName($period_name) { $sql = "SELECT * FROM " . MAIN_DB_PREFIX . "declarationtva_periods WHERE entity = " . $this->entity . " AND period_name = '" . $this->db->escape($period_name) . "'"; $result = $this->db->query($sql); if ($result && $this->db->num_rows($result) > 0) { return $this->db->fetch_array($result); } return false; } /** * Delete period (only if no declarations exist) * * @param int $period_id Period ID * @return bool Success */ public function deletePeriod($period_id) { // Check if declarations exist for this period $sql = "SELECT COUNT(*) as count FROM " . MAIN_DB_PREFIX . "declarationtva_declarations WHERE period_id = " . $period_id . " AND entity = " . $this->entity; $result = $this->db->query($sql); if ($result && $this->db->num_rows($result) > 0) { $obj = $this->db->fetch_object($result); if ($obj->count > 0) { $this->error = "Cannot delete period with existing declarations"; return false; } } $sql = "DELETE FROM " . MAIN_DB_PREFIX . "declarationtva_periods WHERE rowid = " . $period_id . " AND entity = " . $this->entity; $result = $this->db->query($sql); return $result !== false; } /** * Get period statistics * * @param int $period_id Period ID * @return array Statistics */ public function getPeriodStatistics($period_id) { $sql = "SELECT COUNT(*) as declaration_count, SUM(total_vat_collected) as total_vat_collected, SUM(total_vat_deductible) as total_vat_deductible, SUM(net_vat_due) as net_vat_due, SUM(vat_credit) as vat_credit FROM " . MAIN_DB_PREFIX . "declarationtva_declarations WHERE period_id = " . $period_id . " AND entity = " . $this->entity; $result = $this->db->query($sql); if ($result && $this->db->num_rows($result) > 0) { return $this->db->fetch_array($result); } return array( 'declaration_count' => 0, 'total_vat_collected' => 0, 'total_vat_deductible' => 0, 'net_vat_due' => 0, 'vat_credit' => 0 ); } }