baseUrl = _env('ODOO_BASE_URL', 'https://stag.odoo.blacksoil.co.in'); $this->token = _env('ODOO_BEARER_TOKEN', '9cb239e406a7fc7635c3ae2a3aa9fa2f20cb54a0'); } /** * GL Codes mapping hardcoded from gl_codes.csv */ public static function getGlCodes() { return [ 133001 => 'Loans A/c', 100201 => 'Bank A/c', 136002 => 'NPA - Loans', 145000 => 'Accrued Interest for Loans Due', 145001 => 'Accrued Interest for Loans not Due', 148000 => 'Subvention Charges receivable', // Also used for Penal/Foreclosure 403000 => 'Interest Income', 403007 => 'Interest - Accrued but not due (P&L)', 403002 => 'Subvention Charges', // Also used for Penal/Foreclosure 263000 => 'FLDG Receivable/ Payable - Co Lending', 263001 => 'Loan Processing Fee Payable - Co Lending', 263002 => 'Foreclosure Charges Payable - Co Lending', 263003 => 'Penal Charges Payable - Co Lending', 263004 => 'Interest Payable - Co Lending', 263005 => 'Principal Payable - Co Lending', 263006 => 'Other Advances (Daily Collections) - Co Lending', 263007 => 'Other Advances (NPA Recovery) - Co Lending', ]; } /** * Core request handler using native PHP cURL */ private function makeRequest($endpoint, $payload) { $url = rtrim($this->baseUrl, '/') . '/' . ltrim($endpoint, '/'); $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => json_encode($payload), CURLOPT_HTTPHEADER => array( 'Authorization: Bearer ' . $this->token, 'Content-Type: application/json', 'Accept: application/json' ), )); $body = curl_exec($curl); $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); $curlError = curl_error($curl); curl_close($curl); if ($curlError) { Log::error("[OdooService] cURL Error to $endpoint: $curlError"); return [ 'status' => 'error', 'message' => 'cURL Error: ' . $curlError, 'error' => null, 'http_code' => 500 ]; } $responseData = json_decode($body, true); $isSuccess = ($statusCode >= 200 && $statusCode < 300); if (!$isSuccess) { Log::error("[OdooService] Request to $endpoint failed with status $statusCode", [ 'payload' => $payload, 'response' => $responseData ?? $body ]); } return [ 'status' => $isSuccess ? 'success' : 'error', 'http_code' => $statusCode, 'response' => $responseData ?? $body ]; } /** * Create Customer */ public function createCustomer(array $payload) { $endpoint = _env('ODOO_CREATE_CUSTOMER_ENDPOINT', '/api/v1/creadfair/customer/create'); return $this->makeRequest($endpoint, $payload); } /** * Create JV entry * * Payload should contain transaction_number, posting_date, company_name, type, and lines */ public function createJvEntry(array $payload) { $endpoint = _env('ODOO_CREATE_JV_ENDPOINT', '/api/v1/creadfair/journal/create'); return $this->makeRequest($endpoint, $payload); } /** * Update JV entry * * Payload should contain transaction_number, odoo_move_id, posting_date, and lines */ public function updateJvEntry(array $payload) { $endpoint = _env('ODOO_UPDATE_JV_ENDPOINT', '/api/v1/creadfair/journal/update'); return $this->makeRequest($endpoint, $payload); } /** * Cancel JV entry * * Payload should contain transaction_number and odoo_move_id */ public function cancelJvEntry(array $payload) { $endpoint = _env('ODOO_CANCEL_JV_ENDPOINT', '/api/v1/creadfair/journal/cancel'); return $this->makeRequest($endpoint, $payload); } }