Initial commit: Horux Backend API

- API REST para gestion de facturas electronicas mexicanas (CFDI)
- Laravel 9 con autenticacion OAuth 2.0 (Passport)
- Integracion con Syntage, Clerk y Facturama
- 30 modelos Eloquent, 39 controladores
- Documentacion completa en /docs

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-18 07:44:29 +00:00
commit 61320b44d8
191 changed files with 22895 additions and 0 deletions

142
routes/api.php Normal file
View File

@@ -0,0 +1,142 @@
<?php
use App\Http\Controllers\controladorPrueba;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Laravel\Socialite\Facades\Socialite;
use App\Http\Controllers;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::post('/auth', function (Request $request) {
// Realizar una petición POST con encabezados
$response = Http::withHeaders([
'Content-Type' => 'application/x-www-form-urlencoded',
'Authorization' => 'Basic RXlhZlNidnIyZWNYQTh5azpza190ZXN0X1ZpVng2T3hxQ2RkTkZOckdhaDQyTTM5dDhCTVFIY2l4RWxWRDYwNGRXTw=='
])->asForm()->post('https://exact-trout-82.clerk.accounts.dev/oauth/token', [
'grant_type' => 'authorization_code',
'code' => $request->code,
'redirect_uri' => 'https://horuxfin.com/callback'
]);
// Verificar si la petición fue exitosa
if ($response->successful()) {
// Manejar la respuesta exitosa
$requestToken = Request::create("/oauth/token", "POST", [
'grant_type' => 'social',
'client_id' => config('app.client_id'),
'client_secret' => config('app.client_secret'),
'provider' => 'clerk',
'access_token' => $response['access_token']
]);
$oauth = app()->handle($requestToken);
return $oauth;
} else {
$response = Http::withHeaders([
'Content-Type' => 'application/x-www-form-urlencoded',
'Authorization' => 'Basic T0JlRk1lRzYwVVJHenFjVTpza190ZXN0X1ZpVng2T3hxQ2RkTkZOckdhaDQyTTM5dDhCTVFIY2l4RWxWRDYwNGRXTw=='
])->asForm()->post('https://exact-trout-82.clerk.accounts.dev/oauth/token', [
'grant_type' => 'authorization_code',
'code' => $request->code,
'redirect_uri' => 'http://localhost:3000/callback'
]);
// Verificar si la petición fue exitosa
if ($response->successful()) {
// Manejar la respuesta exitosa
$requestToken = Request::create("/oauth/token", "POST", [
'grant_type' => 'social',
'client_id' => config('app.client_id'),
'client_secret' => config('app.client_secret'),
'provider' => 'clerk',
'access_token' => $response['access_token']
]);
$oauth = app()->handle($requestToken);
return $oauth;
} else {
// Manejar la respuesta fallida
return response()->json();
}
}
});
Route::get('/retenciones', [Controllers\InvoiceController::class, 'retenciones']);
Route::group([
'middleware' => 'throttle:custom-origin'
], function() {
Route::post('/invoice-endpoint', [Controllers\InvoiceController::class, 'invoiceEndpoint']);
});
Route::group([
'middleware' => 'auth:api'
], function() {
Route::post('/insertar-rfc', [Controllers\RfcController::class, 'insertarRfc']);
Route::get('/obtener-rfcs', [Controllers\RfcController::class, 'obtenerRfcs']);
Route::get('/tipos-factura', [Controllers\InvoiceTypeController::class, 'get']);
Route::get('/uso-factura', [Controllers\UsageController::class, 'get']);
Route::get('/tipos-pago', [Controllers\PaymentTypeController::class, 'get']);
Route::get('/metodos-pago', [Controllers\PaymentMethodController::class, 'get']);
Route::get('/monedas', [Controllers\CurrencyController::class, 'get']);
Route::get('/regimenes-fiscales', [Controllers\TaxRegimeController::class, 'get']);
Route::get('/codigos-prod-serv', [Controllers\ProdServCodeController::class, 'get']);
Route::get('/codigos-unidad', [Controllers\UnitCodeController::class, 'get']);
Route::get('/impuestos', [Controllers\TaxController::class, 'get']);
Route::get('/tasas-impuesto', [Controllers\TaxRateController::class, 'get']);
Route::get('/obtener-facturas', [Controllers\InvoiceController::class, 'obtenerFacturas']);
Route::get('/endpoint-facturas', [Controllers\InvoiceController::class, 'endpointObtenerFacturas']);
Route::get('/facturas-emitidas', [Controllers\InvoiceController::class, 'facturasEmitidas']);
Route::get('/facturas-emitidas-conciliadas', [Controllers\InvoiceController::class, 'facturasEmitidasConciliadas']);
Route::get('/facturas-recibidas', [Controllers\InvoiceController::class, 'facturasRecibidas']);
Route::get('/facturas-recibidas-conciliadas', [Controllers\InvoiceController::class, 'facturasRecibidasConciliadas']);
Route::post('/conciliar-facturas', [Controllers\InvoiceController::class, 'conciliarFacturas']);
Route::get('/descargar-factura', [Controllers\InvoiceController::class, 'descargarFactura']);
Route::get('/obtener-complementos-pago', [Controllers\InvoicePaymentController::class, 'obtenerComplementosPago']);
Route::get('/obtener-contribuyente', [Controllers\TaxpayerController::class, 'obtenerContribuyente']);
Route::get('/obtener-lineas-facturas', [Controllers\InvoiceLineController::class, 'obtenerLineasFacturas']);
Route::get('/obtener-facturas-conceptos', [Controllers\InvoiceLineController::class, 'obtenerFacturasConceptos']);
Route::get('/ingreso-tipo-i', [Controllers\InvoiceController::class, 'ingresoTipoI']);
Route::get('/gasto-tipo-i', [Controllers\InvoiceController::class, 'gastoTipoI']);
Route::get('/ingreso-tipo-e', [Controllers\InvoiceController::class, 'ingresoTipoE']);
Route::get('/gasto-tipo-e', [Controllers\InvoiceController::class, 'gastoTipoE']);
Route::get('/gasto-tipo-n', [Controllers\InvoiceController::class, 'gastoTipoN']);
Route::get('/ingreso-ppd', [Controllers\InvoicePaymentController::class, 'ingresoPpd']);
Route::get('/gasto-ppd', [Controllers\InvoicePaymentController::class, 'gastoPpd']);
Route::get('/adquisicion-pue', [Controllers\InvoiceController::class, 'adquisicionPue']);
Route::get('/adquisicion-ppd', [Controllers\InvoicePaymentController::class, 'adquisicionPpd']);
Route::get('/obtener-metricas', [Controllers\InvoiceController::class, 'obtenerMetricas']);
Route::get('/obtener-metricas-mensuales', [Controllers\InvoiceController::class, 'obtenerMetricasMensuales']);
Route::post('/importar-facturas', [Controllers\InvoiceController::class, 'importarFacturas']);
Route::post('/importar-lineas-facturas', [Controllers\InvoiceLineController::class, 'importarLineasFacturas']);
Route::post('/importar-codigos-prod-serv', [Controllers\ProdServCodeController::class, 'importarCodigosProdServ']);
Route::post('/importar-codigos-unidad', [Controllers\UnitCodeController::class, 'importarCodigosUnidad']);
});
Route::post('/consultarmetrica', [Controllers\MetricasController::class, 'consultarMetricas']);
Route::post('/insertmetrica', [Controllers\MetricasController::class, 'store']);
Route::post('/consultarcomparativo', [Controllers\ComparativomensualController::class, 'consultarComparativo']);
Route::post('/insertcomparativo', [Controllers\ComparativomensualController::class, 'store']);
Route::get('/obtener-ingresos', [Controllers\InvoiceController::class, 'ingresos']);
Route::post('/obtener-egresos', [Controllers\InvoiceController::class, 'egresos']);
Route::get('/ivaAFavor', [Controllers\InvoiceController::class, 'ivaAFavor']);
Route::get('/utilidadBrutaVsIndustria', [Controllers\TaxpayerController::class, 'utilidadBrutaVsIndustria']);
Route::post('/usuariosat', [Controllers\usuariossatController::class, 'store']);
Route::get('/risk', [Controllers\RiskController::class, 'consultarRisk']);

18
routes/channels.php Normal file
View File

@@ -0,0 +1,18 @@
<?php
use Illuminate\Support\Facades\Broadcast;
/*
|--------------------------------------------------------------------------
| Broadcast Channels
|--------------------------------------------------------------------------
|
| Here you may register all of the event broadcasting channels that your
| application supports. The given channel authorization callbacks are
| used to check if an authenticated user can listen to the channel.
|
*/
Broadcast::channel('App.Models.User.{id}', function ($user, $id) {
return (int) $user->id === (int) $id;
});

19
routes/console.php Normal file
View File

@@ -0,0 +1,19 @@
<?php
use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;
/*
|--------------------------------------------------------------------------
| Console Routes
|--------------------------------------------------------------------------
|
| This file is where you may define all of your Closure based console
| commands. Each Closure is bound to a command instance allowing a
| simple approach to interacting with each command's IO methods.
|
*/
Artisan::command('inspire', function () {
$this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote');

18
routes/web.php Normal file
View File

@@ -0,0 +1,18 @@
<?php
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});