diff --git a/modules/addons/NFEioServiceInvoices/lib/Legacy/Functions.php b/modules/addons/NFEioServiceInvoices/lib/Legacy/Functions.php index ae4c30c..1b40d78 100644 --- a/modules/addons/NFEioServiceInvoices/lib/Legacy/Functions.php +++ b/modules/addons/NFEioServiceInvoices/lib/Legacy/Functions.php @@ -4,6 +4,7 @@ use WHMCS\Database\Capsule; use NFEioServiceInvoices\Addon; +use NFEioServiceInvoices\Helpers\Validations; use WHMCSExpert\Addon\Storage; class Functions @@ -29,96 +30,159 @@ function gnfe_config($set = false) } } - function gnfe_customer($user_id, $client) + public function gnfe_customer($user_id, $client): array { //Determine custom fields id - $CPF_id = $this->gnfe_config('cpf_camp'); - $CNPJ_id = $this->gnfe_config('cnpj_camp'); - $insc_municipal_id = $this->gnfe_config('insc_municipal'); + $cpfCustomFieldId = $this->gnfe_config('cpf_camp'); + $cnpjCustomFieldId = $this->gnfe_config('cnpj_camp'); + $inscMunicipalCustomFieldId = $this->gnfe_config('insc_municipal'); + +// $insc_customfield_value = 'NF'; + $inscMunicipalCustomFieldValue = false; + // inicia array de retorno + $result = []; + + /** + * Este bloco de código verifica se os IDs dos campos personalizados para CPF e CNPJ estão definidos. + * Se ambos os IDs dos campos personalizados CPF e CNPJ não estiverem definidos (ou seja, eles são 0), + * ele define uma bandeira de erro e retorna uma mensagem de erro. + * + * @return array Se ocorrer um erro, retorna um array associativo com 'error' definido como true e 'message' + * contendo a mensagem de erro. + */ + if ($cpfCustomFieldId == 0 && $cnpjCustomFieldId == 0) { + $error = true; + $message = 'Campos para CPF e CNPJ não configurados.'; + $result['error'] = $error; + $result['message'] = $message; + return $result; + } - $insc_customfield_value = 'NF'; // insc_municipal - if ($insc_municipal_id != 0) { - foreach (Capsule::table('tblcustomfieldsvalues')->where('fieldid', '=', $insc_municipal_id)->where('relid', '=', $user_id)->get(['value']) as $customfieldvalue) { - $insc_customfield_value = $customfieldvalue->value; + if ($inscMunicipalCustomFieldId != 0) { + foreach (Capsule::table('tblcustomfieldsvalues')->where('fieldid', '=', $inscMunicipalCustomFieldId)->where('relid', '=', $user_id)->get(['value']) as $customfieldvalue) { +// $insc_customfield_value = $customfieldvalue->value; + $inscMunicipalCustomFieldValue = $customfieldvalue->value; } } // cpf - if ($CPF_id != 0) { - foreach (Capsule::table('tblcustomfieldsvalues')->where('fieldid', '=', $CPF_id)->where('relid', '=', $user_id)->get(['value']) as $customfieldvalue) { - $cpf_customfield_value = preg_replace('/[^0-9]/', '', $customfieldvalue->value); + if ($cpfCustomFieldId != 0) { + foreach (Capsule::table('tblcustomfieldsvalues')->where('fieldid', '=', $cpfCustomFieldId)->where('relid', '=', $user_id)->get(['value']) as $customfieldvalue) { +// $cpf_customfield_value = preg_replace('/[^0-9]/', '', $customfieldvalue->value); + $cpfCustomFieldValue = $customfieldvalue->value; } } //cnpj - if ($CNPJ_id != 0) { - foreach (Capsule::table('tblcustomfieldsvalues')->where('fieldid', '=', $CNPJ_id)->where('relid', '=', $user_id)->get(['value']) as $customfieldvalue) { - $cnpj_customfield_value = preg_replace('/[^0-9]/', '', $customfieldvalue->value); + if ($cnpjCustomFieldId != 0) { + foreach (Capsule::table('tblcustomfieldsvalues')->where('fieldid', '=', $cnpjCustomFieldId)->where('relid', '=', $user_id)->get(['value']) as $customfieldvalue) { +// $cnpj_customfield_value = preg_replace('/[^0-9]/', '', $customfieldvalue->value); + $cnpjCustomFieldValue = $customfieldvalue->value; } } - // Cliente possui CPF e CNPJ - // CPF com 1 nº a menos, adiciona 0 antes do documento - if (strlen($cpf_customfield_value) === 10) { - $cpf = '0' . $cpf_customfield_value; - } - // CPF com 11 dígitos - elseif (strlen($cpf_customfield_value) === 11) { - $cpf = $cpf_customfield_value; - } - // CNPJ no campo de CPF com um dígito a menos - elseif (strlen($cpf_customfield_value) === 13) { - $cpf = false; - $cnpj = '0' . $cpf_customfield_value; - } - // CNPJ no campo de CPF - elseif (strlen($cpf_customfield_value) === 14) { - $cpf = false; - $cnpj = $cpf_customfield_value; - } - // cadastro não possui CPF - elseif (!$cpf_customfield_value || strlen($cpf_customfield_value) !== 10 || strlen($cpf_customfield_value) !== 11 || strlen($cpf_customfield_value) != 13 || strlen($cpf_customfield_value) !== 14) { - $cpf = false; - } - // CNPJ com 1 nº a menos, adiciona 0 antes do documento - if (strlen($cnpj_customfield_value) === 13) { - $cnpj = '0' . $cnpj_customfield_value; - } - // CNPJ com nº de dígitos correto - elseif (strlen($cnpj_customfield_value) === 14) { - $cnpj = $cnpj_customfield_value; - } - // Cliente não possui CNPJ - elseif (!$cnpj_customfield_value and strlen($cnpj_customfield_value) !== 14 and strlen($cnpj_customfield_value) !== 13 and strlen($cpf_customfield_value) !== 13 and strlen($cpf_customfield_value) !== 14) { - $cnpj = false; - } - if (($cpf and $cnpj) or (!$cpf and $cnpj)) { - $custumer['doc_type'] = 2; - $custumer['document'] = $cnpj; - if ($client->companyname) { - $custumer['name'] = $client->companyname; - } elseif (!$client->companyname) { - $custumer['name'] = $client->firstname . ' ' . $client->lastname; - } - } elseif ($cpf and !$cnpj) { - $custumer['doc_type'] = 1; - $custumer['document'] = $cpf; - $custumer['name'] = $client->firstname . ' ' . $client->lastname; - } - if ($insc_customfield_value != 'NF') { - $custumer['insc_municipal'] = $insc_customfield_value; - } - if (!$cpf and !$cnpj) { - $error = 'CPF e/ou CNPJ ausente.'; - logModuleCall('nfeio_serviceinvoices', 'nf_customer_error', $custumer, $error); + $cpfIsValid = Validations::validateCPF($cpfCustomFieldValue); + $cnpjIsValid = Validations::validateCNPJ($cnpjCustomFieldValue); + + if (!$cpfIsValid && !$cnpjIsValid) { + $error = true; + $message = 'Documento cadastrado não é um CPF ou CNPJ válido.'; + $result['error'] = $error; + $result['message'] = $message; + return $result; } - if (!$error) { - return $custumer; + + $cpf = preg_replace('/[^0-9]/', '', $cpfCustomFieldValue); + $cnpj = preg_replace('/[^0-9]/', '', $cnpjCustomFieldValue); + $inscMunicipal = $inscMunicipalCustomFieldValue ? trim($inscMunicipalCustomFieldValue) : false; + + // adiciona a inscricao municipal ao retorno apenas se existir um valor registrado e documento for CNPJ + if ($inscMunicipal && $cnpjIsValid) { + $result['insc_municipal'] = $inscMunicipalCustomFieldValue; } - if ($error) { - logModuleCall('nfeio_serviceinvoices', 'nf_customer_error', $custumer, $error); - return $custumer['error'] = $error; + if ($cpfIsValid) { + $result['success'] = true; + $result['doc_type'] = 1; + $result['document'] = $cpf; + $result['name'] = $client->firstname . ' ' . $client->lastname; + } elseif ($cnpjIsValid) { + $result['success'] = true; + $result['doc_type'] = 2; + $result['document'] = $cnpj; + $result['name'] = $client->companyname ? $client->companyname : $client->firstname . ' ' . $client->lastname; + } else { + $result['error'] = true; + $result['message'] = 'Documento cadastrado não é um CPF ou CNPJ válido.'; } + + + /** + * // Cliente possui CPF e CNPJ + * // CPF com 1 nº a menos, adiciona 0 antes do documento + * if (strlen($cpf_customfield_value) === 10) { + * $cpf = '0' . $cpf_customfield_value; + * } + * // CPF com 11 dígitos + * elseif (strlen($cpf_customfield_value) === 11) { + * $cpf = $cpf_customfield_value; + * } + * // CNPJ no campo de CPF com um dígito a menos + * elseif (strlen($cpf_customfield_value) === 13) { + * $cpf = false; + * $cnpj = '0' . $cpf_customfield_value; + * } + * // CNPJ no campo de CPF + * elseif (strlen($cpf_customfield_value) === 14) { + * $cpf = false; + * $cnpj = $cpf_customfield_value; + * } + * // cadastro não possui CPF + * elseif (!$cpf_customfield_value || strlen($cpf_customfield_value) !== 10 || strlen($cpf_customfield_value) !== 11 || strlen($cpf_customfield_value) != 13 || strlen($cpf_customfield_value) !== 14) { + * $cpf = false; + * } + * // CNPJ com 1 nº a menos, adiciona 0 antes do documento + * if (strlen($cnpj_customfield_value) === 13) { + * $cnpj = '0' . $cnpj_customfield_value; + * } + * // CNPJ com nº de dígitos correto + * elseif (strlen($cnpj_customfield_value) === 14) { + * $cnpj = $cnpj_customfield_value; + * } + * // Cliente não possui CNPJ + * elseif (!$cnpj_customfield_value and strlen($cnpj_customfield_value) !== 14 and strlen($cnpj_customfield_value) !== 13 and strlen($cpf_customfield_value) !== 13 and strlen($cpf_customfield_value) !== 14) { + * $cnpj = false; + * } + * if (($cpf and $cnpj) or (!$cpf and $cnpj)) { + * $custumer['doc_type'] = 2; + * $custumer['document'] = $cnpj; + * if ($client->companyname) { + * $custumer['name'] = $client->companyname; + * } elseif (!$client->companyname) { + * $custumer['name'] = $client->firstname . ' ' . $client->lastname; + * } + * } elseif ($cpf and !$cnpj) { + * $custumer['doc_type'] = 1; + * $custumer['document'] = $cpf; + * $custumer['name'] = $client->firstname . ' ' . $client->lastname; + * } + * if ($insc_customfield_value != 'NF') { + * $custumer['insc_municipal'] = $insc_customfield_value; + * } + * if (!$cpf and !$cnpj) { + * $error = 'CPF e/ou CNPJ ausente.'; + * logModuleCall('nfeio_serviceinvoices', 'customer_error', $custumer, $error); + * } + * if (!$error) { + * return $custumer; + * } + * if ($error) { + * logModuleCall('nfeio_serviceinvoices', 'customer_error', $custumer, $error); + * + * return $custumer['error'] = $error; + * } */ + + + return $result; } function gnfe_customfields() @@ -167,20 +231,34 @@ function gnfe_ibge($zip) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, 'https://open.nfe.io/v1/cities/' . $zip . '/postalcode'); - curl_setopt($curl, CURLOPT_TIMEOUT, 30); + curl_setopt($curl, CURLOPT_TIMEOUT, 5); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($curl); - $err = curl_error($curl); - + $error = curl_error($curl); curl_close($curl); - $city = json_decode(json_encode(json_decode($response))); - if ($city->message || $err) { - logModuleCall('nfeio_serviceinvoices', 'ibge_error', $zip, $response); - return 'ERROR'; + $data = json_decode($response); + $result = []; + + // se curl apresentar erro retorna imediatamente + if($error){ + $result['error'] = true; + $result['message'] = $error; + return $result; + } + + if ($data->city->code) { + $result['code'] = $data->city->code; + $result['success'] = true; + } else { - return $city->city->code; + $result['error'] = true; + $result['message'] = $data->message; + logModuleCall('nfeio_serviceinvoices', 'ibge_error', $zip, array('response' => $response, 'error' => $error)); + } + + return $result; } function gnfe_queue_nfe($invoice_id, $create_all = false) @@ -240,7 +318,7 @@ function gnfe_issue_nfe($postfields) $check_webhook = $this->gnfe_check_webhook($gnfe_webhook_id); if ($check_webhook == null) { - return (object) ['message' => 'Erro ao checar a existência de um webhook já cadastrado']; + return (object)['message' => 'Erro ao checar a existência de um webhook já cadastrado']; } if ($check_webhook == "ERRO 400" || $check_webhook == "ERRO 404") { @@ -248,11 +326,11 @@ function gnfe_issue_nfe($postfields) } } - if ($gnfe_webhook_id and (string) $check_webhook['hooks']['url'] !== (string) $webhook_url) { + if ($gnfe_webhook_id and (string)$check_webhook['hooks']['url'] !== (string)$webhook_url) { $delete_webhook = $this->gnfe_delete_webhook($gnfe_webhook_id); if ($delete_webhook == null) { - return (object) ['message' => 'Erro ao deletar webhook que estava com a url divergente']; + return (object)['message' => 'Erro ao deletar webhook que estava com a url divergente']; } $gnfe_webhook_id = null; @@ -262,7 +340,7 @@ function gnfe_issue_nfe($postfields) $create_webhook = $this->gnfe_create_webhook($webhook_url); if ($create_webhook == null) { - return (object) ['message' => 'Erro ao criar novo webhook']; + return (object)['message' => 'Erro ao criar novo webhook']; } if ($create_webhook['hooks']['id']) { @@ -286,7 +364,7 @@ function gnfe_issue_nfe($postfields) if ($error) { logModuleCall('nfeio_serviceinvoices', 'nf_issue_curl_error', $postfields, ['error' => $error, 'response' => $response, 'info' => $info], '', ''); - return (object) ['message' => $error, 'info' => $info]; + return (object)['message' => $error, 'info' => $info]; } else { logModuleCall('nfeio_serviceinvoices', 'nf_issue_curl_success', $postfields, $response, json_decode($response, true), ''); return json_decode(json_encode(json_decode($response))); @@ -305,14 +383,14 @@ function gnfe_get_company_info($set = false) curl_setopt_array( $curl, [ - CURLOPT_URL => 'https://api.nfe.io/v1/companies/' . $this->gnfe_config('company_id'), - CURLOPT_TIMEOUT => 30, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_HTTPHEADER => [ - 'Content-Type: application/json', - 'Accept: application/json', - 'Authorization: ' . $this->gnfe_config('api_key') - ] + CURLOPT_URL => 'https://api.nfe.io/v1/companies/' . $this->gnfe_config('company_id'), + CURLOPT_TIMEOUT => 30, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HTTPHEADER => [ + 'Content-Type: application/json', + 'Accept: application/json', + 'Authorization: ' . $this->gnfe_config('api_key') + ] ] ); @@ -470,9 +548,9 @@ function gnfe_update_nfe($nfe, $user_id, $invoice_id, $pdf, $created_at, $update /** * Returns the data of a invoice from the local WHMCS database. * - * @var $invoice_id - * @var $values * @return string + * @var $values + * @var $invoice_id */ function gnfe_get_local_nfe($invoice_id, $values) { @@ -523,7 +601,7 @@ function gnfe_create_webhook($url) curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-Type: application/json', 'Accept: aplication/json', 'Authorization: ' . $this->gnfe_config('api_key')]); curl_setopt($curl, CURLOPT_TIMEOUT, 30); curl_setopt($curl, CURLOPT_POST, 1); - curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode(['url' => $url, 'contentType' => 'application/json', 'secret' => (string)time(), 'events' => ['issue', 'cancel', 'WaitingCalculateTaxes'], 'status' => 'Active', ])); + curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode(['url' => $url, 'contentType' => 'application/json', 'secret' => (string)time(), 'events' => ['issue', 'cancel', 'WaitingCalculateTaxes'], 'status' => 'Active',])); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($curl); $info = curl_getinfo($curl); @@ -686,8 +764,8 @@ function update_status_nfe($invoice_id, $status) /** - * @var string $invoiceId vem do arquivo hooks.php. * @return string + * @var string $invoiceId vem do arquivo hooks.php. */ function gnfe_get_client_issue_invoice_cond_from_invoice_id($invoiceId) { @@ -715,8 +793,8 @@ function gnfe_get_client_issue_invoice_cond_from_invoice_id($invoiceId) * Returns a