- 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>
1812 lines
81 KiB
PHP
1812 lines
81 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Invoice;
|
|
use App\Models\InvoiceRequest;
|
|
use App\Models\Conciliation;
|
|
use App\Models\User;
|
|
use App\Models\Rfc;
|
|
use App\Models\InvoiceType;
|
|
use App\Models\PaymentType;
|
|
use App\Models\PaymentMethod;
|
|
use App\Models\Usage;
|
|
use App\Models\Currency;
|
|
use App\Models\CancellationType;
|
|
use App\Models\Taxpayer;
|
|
use App\Models\TaxRegime;
|
|
use App\Models\Status;
|
|
use App\Http\Controllers\InvoicePaymentController;
|
|
use Carbon\Carbon;
|
|
use App\Imports\InvoicesImport;
|
|
use Maatwebsite\Excel\Facades\Excel;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Http;
|
|
use Illuminate\Http\Client\RequestException;
|
|
|
|
class InvoiceController extends Controller
|
|
{
|
|
|
|
protected $invoicePaymentController;
|
|
|
|
public function __construct(InvoicePaymentController $invoicePaymentController)
|
|
{
|
|
$this->invoicePaymentController = $invoicePaymentController;
|
|
}
|
|
|
|
public function ingresos(Request $request) {
|
|
try {
|
|
$postdate = Carbon::parse($request->date)->addMonth()->format('Y-m');
|
|
// Realizar una petición GET con encabezados
|
|
$response = Http::withHeaders([
|
|
'accept' => 'application/ld+json',
|
|
'X-API-Key' => 'b16ec9be960cdf3a8302e92a7aec84d2'
|
|
])->get('https://api.syntage.com/insights/'. $request->rfc .'/sales-revenue?options[from]='.$request->date.'-01T06%3A00%3A00&options[to]='.$postdate.'-01T05%3A59%3A59&options[periodicity]=monthly&options[type]=total');
|
|
|
|
// Verificar si la petición fue exitosa
|
|
if ($response->successful()) {
|
|
// Manejar la respuesta exitosa
|
|
$egresos = $this->egresos($request);
|
|
$data = $response->json();
|
|
|
|
// Filtrar los datos y eliminar claves numéricas
|
|
$filteredData = array_values(collect($data['data'])
|
|
->where('date', $request->date)
|
|
->all());
|
|
|
|
$filteredEgresos = array_values(collect($egresos['data'])
|
|
->where('date', $request->date)
|
|
->all());
|
|
|
|
return response()->json([
|
|
'ingresos' => $filteredData,
|
|
'egresos' => $filteredEgresos,
|
|
'datos' => $data
|
|
]);
|
|
} else {
|
|
// Manejar la respuesta fallida
|
|
return response()->json(['error' => 'Error al obtener los datos'], $response->status());
|
|
}
|
|
} catch (RequestException $e) {
|
|
// Manejar excepciones específicas de solicitudes HTTP
|
|
return response()->json(['error' => 'Excepción al obtener los datos: ' . $e->getMessage()], 500);
|
|
} catch (\Exception $e) {
|
|
// Manejar otras excepciones
|
|
return response()->json(['error' => 'Error inesperado: ' . $e->getMessage()], 500);
|
|
}
|
|
}
|
|
public function egresos(Request $request) {
|
|
try {
|
|
$postdate = Carbon::parse($request->date)->addMonth()->format('Y-m');
|
|
// Realizar una petición GET con encabezados
|
|
$response = Http::withHeaders([
|
|
'accept' => 'application/ld+json',
|
|
'X-API-Key' => 'b16ec9be960cdf3a8302e92a7aec84d2'
|
|
])->get('https://api.syntage.com/insights/'. $request->rfc .'/expenditures?options[from]='.$request->date.'-01T06%3A00%3A00&options[to]='.$postdate.'-01T05%3A59%3A59&options[periodicity]=monthly&options[type]=total');
|
|
|
|
// Verificar si la petición fue exitosa
|
|
if ($response->successful()) {
|
|
// Manejar la respuesta exitosa
|
|
$data = $response->json();
|
|
return $data;
|
|
} else {
|
|
// Manejar la respuesta fallida
|
|
return response()->json(['error' => 'Error al obtener los datos'], $response->status());
|
|
}
|
|
} catch (RequestException $e) {
|
|
// Manejar excepciones específicas de solicitudes HTTP
|
|
return response()->json(['error' => 'Excepción al obtener los datos: ' . $e->getMessage()], 500);
|
|
} catch (\Exception $e) {
|
|
// Manejar otras excepciones
|
|
return response()->json(['error' => 'Error inesperado: ' . $e->getMessage()], 500);
|
|
}
|
|
}
|
|
public function ivaAFavor(Request $request) {
|
|
try {
|
|
$postdate = Carbon::parse($request->date)->addMonth()->format('Y-m');
|
|
// Realizar una petición GET con encabezados
|
|
$response = Http::withHeaders([
|
|
'accept' => 'application/ld+json',
|
|
'X-API-Key' => 'b16ec9be960cdf3a8302e92a7aec84d2'
|
|
])->get('https://api.syntage.com/taxpayers/'.$request->rfc.'/invoices?options[from]='.$request->date.'-01T06%3A00%3A00&options[to]='.$postdate.'-01T05%3A59%3A59&options[periodicity]=monthly&options[type]=total');
|
|
// Verificar si la petición fue exitosa
|
|
if ($response->successful()) {
|
|
// Manejar la respuesta exitosa
|
|
$data = $response->json();
|
|
$fecha = $request->date;
|
|
$filteredData = array_values(collect($data['hydra:member'])
|
|
->where('paymentType', "PUE")
|
|
->where("cancellationProcessStatus", null)
|
|
//->where("isReceiver", true)
|
|
->filter(function ($item) use ($fecha) {
|
|
// Escape any special characters in the user-provided date
|
|
$escapedFecha = preg_quote($fecha, '/');
|
|
return preg_match("/^$escapedFecha/", $item['issuedAt']);
|
|
})
|
|
->all());
|
|
$totalIvaAFavor = 0;
|
|
$totalIvaAPagar = 0;
|
|
foreach ($filteredData as $invoice) {
|
|
// Check if the invoice is received by the user (isReceiver)
|
|
if ($invoice['isReceiver']) {
|
|
// Access the transferredTaxes object
|
|
$transferredTaxes = $invoice['transferredTaxes'];
|
|
|
|
// Check if transferredTaxes exists
|
|
if (isset($transferredTaxes) && is_array($transferredTaxes)) {
|
|
// Extract the valueAddedTax amount
|
|
$ivaValue = array_key_exists('valueAddedTax', $transferredTaxes) ? $transferredTaxes['valueAddedTax'] : 0;
|
|
|
|
// Add the IVA value to the total
|
|
$totalIvaAFavor += $ivaValue;
|
|
}
|
|
|
|
// Access the retainedTaxes object
|
|
$retainedTaxes = $invoice['retainedTaxes'];
|
|
|
|
// Check if retainedTaxes exists
|
|
if (isset($retainedTaxes) && is_array($retainedTaxes)) {
|
|
// Extract the valueAddedTax amount
|
|
$retainedIvaValue = array_key_exists('valueAddedTax', $retainedTaxes) ? $retainedTaxes['valueAddedTax'] : 0;
|
|
|
|
// Add the retained IVA value to the total
|
|
$totalIvaAFavor += $retainedIvaValue;
|
|
}
|
|
|
|
} else {
|
|
$transferredTaxes = $invoice['transferredTaxes'];
|
|
|
|
// Check if transferredTaxes exists
|
|
if (isset($transferredTaxes) && is_array($transferredTaxes)) {
|
|
// Extract the valueAddedTax amount
|
|
$ivaValue = array_key_exists('valueAddedTax', $transferredTaxes) ? $transferredTaxes['valueAddedTax'] : 0;
|
|
|
|
// Add the IVA value to the total
|
|
$totalIvaAPagar += $ivaValue;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
$filteredData = array_values(collect($filteredData)
|
|
->where("issuedAt", "~/^2024-08/")
|
|
->all());
|
|
*/
|
|
return [
|
|
'total_iva_a_favor' => $totalIvaAFavor,
|
|
'total_iva_a_pagar' => $totalIvaAPagar,
|
|
'datos_filtrados' => $filteredData // Include the filtered data if needed
|
|
];
|
|
} else {
|
|
// Manejar la respuesta fallida
|
|
return response()->json(['error' => 'Error al obtener los datos'], $response->status());
|
|
}
|
|
} catch (RequestException $e) {
|
|
// Manejar excepciones específicas de solicitudes HTTP
|
|
return response()->json(['error' => 'Excepción al obtener los datos: ' . $e->getMessage()], 500);
|
|
} catch (\Exception $e) {
|
|
// Manejar otras excepciones
|
|
return response()->json(['error' => 'Error inesperado: ' . $e->getMessage()], 500);
|
|
}
|
|
}
|
|
|
|
public function retenciones(Request $request) {
|
|
try {
|
|
// Realizar una petición GET con encabezados
|
|
$response = Http::withHeaders([
|
|
'accept' => 'application/ld+json',
|
|
'X-API-Key' => 'b16ec9be960cdf3a8302e92a7aec84d2'
|
|
])->get('https://api.syntage.com/taxpayers/'.$request->rfc.'/tax-retentions');
|
|
// Verificar si la petición fue exitosa
|
|
if ($response->successful()) {
|
|
// Manejar la respuesta exitosa
|
|
return $response->json();
|
|
|
|
} else {
|
|
// Manejar la respuesta fallida
|
|
return response()->json(['error' => 'Error al obtener los datos'], $response->status());
|
|
}
|
|
} catch (RequestException $e) {
|
|
// Manejar excepciones específicas de solicitudes HTTP
|
|
return response()->json(['error' => 'Excepción al obtener los datos: ' . $e->getMessage()], 500);
|
|
} catch (\Exception $e) {
|
|
// Manejar otras excepciones
|
|
return response()->json(['error' => 'Error inesperado: ' . $e->getMessage()], 500);
|
|
}
|
|
}
|
|
|
|
public function obtenerFacturas(Request $request) {
|
|
$start = microtime(true);
|
|
set_time_limit(1000);
|
|
|
|
$user = $request->user();
|
|
//$user = User::where('email', strip_tags($request->email))->first();
|
|
$rfc = Rfc::where('rfc', strip_tags($request->rfc))->first();
|
|
$now = Carbon::now();
|
|
$maxPast = Carbon::now()->subYears(3);
|
|
$first_time = false;
|
|
$invoice_request = InvoiceRequest::where('rfc_id', $rfc->id)->where('type', 'invoice')->first();
|
|
if ($invoice_request) {
|
|
$last_request = new Carbon($invoice_request->requested_at);
|
|
$min_days = ($last_request->diff($now)->days > 1) ? true : null;
|
|
} else {
|
|
$first_time = true;
|
|
$min_days = true;
|
|
$invoice_request = new InvoiceRequest();
|
|
}
|
|
|
|
if (in_array($rfc->id, $user->rfcs->pluck('id')->toArray()) && $first_time == true) {
|
|
$currentMontly = $maxPast;
|
|
$monthlyMaxPeriods = 36;
|
|
$startMonthly = 0;
|
|
|
|
while ($startMonthly <= $monthlyMaxPeriods) {
|
|
if ($currentMontly->lt(Carbon::parse($now)->addMonth())) {
|
|
|
|
$postMontly = Carbon::parse($currentMontly)->addMonth()->format('Y-m');
|
|
|
|
try {
|
|
// Realizar una petición GET con encabezados
|
|
$response = Http::withHeaders([
|
|
'accept' => 'application/ld+json',
|
|
'X-API-Key' => 'b16ec9be960cdf3a8302e92a7aec84d2'
|
|
])->get('https://api.syntage.com/taxpayers/'. $request->rfc .'/invoices?issuedAt[before]='. $postMontly .'-01T06%3A00%3A00&issuedAt[after]='. $currentMontly->format('Y-m') .'-01T05%3A59%3A59');
|
|
|
|
// Verificar si la petición fue exitosa
|
|
if ($response->successful()) {
|
|
// Manejar la respuesta exitosa
|
|
$data = $response->json();
|
|
$invoices = $data['hydra:member'];
|
|
|
|
foreach ($invoices as $invoice_data) {
|
|
// code...
|
|
$invoice = Invoice::where('id', $invoice_data['uuid'])->first();
|
|
$status = Status::where('description', strip_tags($invoice_data['cancellationProcessStatus']))->first();
|
|
|
|
if (!$invoice) {
|
|
$invoiceCreate = $this->setInvoice($invoice_data, $rfc);
|
|
} else if ($invoice->paid_amount != $invoice_data['paidAmount'] || $invoice->due_amount != $invoice_data['dueAmount'] || $invoice->fully_paid_at != $invoice_data['fullyPaidAt'] || $invoice->last_payment_date != $invoice_data['lastPaymentDate']) {
|
|
$invoiceCreate = $this->setInvoice($invoice_data, $rfc);
|
|
} else if ($status) {
|
|
if ($invoice->cancellation_status_id != $status->id) {
|
|
$invoiceCreate = $this->setInvoice($invoice_data, $rfc);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
// Manejar la respuesta fallida
|
|
return response()->json(['error' => 'Error al obtener los datos'], $response->status());
|
|
}
|
|
} catch (RequestException $e) {
|
|
// Manejar excepciones específicas de solicitudes HTTP
|
|
return response()->json(['error' => 'Excepción al obtener los datos: ' . $e->getMessage()], 500);
|
|
} catch (\Exception $e) {
|
|
// Manejar otras excepciones
|
|
return response()->json(['error' => 'Error inesperado: ' . $e->getMessage()], 500);
|
|
}
|
|
}
|
|
$currentMontly = Carbon::parse($currentMontly)->addMonth();
|
|
$startMonthly++;
|
|
}
|
|
|
|
$invoice_request->rfc_id = $rfc->id;
|
|
$invoice_request->type = 'invoice';
|
|
$invoice_request->requested_at = Carbon::now();
|
|
$invoice_request->save();
|
|
|
|
$time = microtime(true) - $start;
|
|
return response()->json(Invoice::where('rfc_id', $rfc->id)->get());
|
|
|
|
} else {
|
|
if (in_array($rfc->id, $user->rfcs->pluck('id')->toArray()) && $min_days == true) {
|
|
|
|
$maxPast = Carbon::now()->subYears(1);
|
|
$currentMontly = $maxPast;
|
|
$monthlyMaxPeriods = 12;
|
|
$startMonthly = 0;
|
|
|
|
while ($startMonthly <= $monthlyMaxPeriods) {
|
|
if ($currentMontly->lt(Carbon::parse($now)->addMonth())) {
|
|
|
|
$postMontly = Carbon::parse($currentMontly)->addMonth()->format('Y-m');
|
|
|
|
try {
|
|
// Realizar una petición GET con encabezados
|
|
$response = Http::withHeaders([
|
|
'accept' => 'application/ld+json',
|
|
'X-API-Key' => 'b16ec9be960cdf3a8302e92a7aec84d2'
|
|
])->get('https://api.syntage.com/taxpayers/'. $request->rfc .'/invoices?issuedAt[before]='. $postMontly .'-01T06%3A00%3A00&issuedAt[after]='. $currentMontly->format('Y-m') .'-01T05%3A59%3A59');
|
|
|
|
// Verificar si la petición fue exitosa
|
|
if ($response->successful()) {
|
|
// Manejar la respuesta exitosa
|
|
$data = $response->json();
|
|
$invoices = $data['hydra:member'];
|
|
|
|
foreach ($invoices as $invoice_data) {
|
|
// code...
|
|
$invoice = Invoice::where('id', $invoice_data['uuid'])->first();
|
|
$status = Status::where('description', strip_tags($invoice_data['cancellationProcessStatus']))->first();
|
|
|
|
if (!$invoice) {
|
|
$invoiceCreate = $this->setInvoice($invoice_data, $rfc);
|
|
} else if ($invoice->paid_amount != $invoice_data['paidAmount'] || $invoice->due_amount != $invoice_data['dueAmount'] || $invoice->fully_paid_at != $invoice_data['fullyPaidAt'] || $invoice->last_payment_date != $invoice_data['lastPaymentDate']) {
|
|
$invoiceCreate = $this->setInvoice($invoice_data, $rfc);
|
|
} else if ($status) {
|
|
if ($invoice->cancellation_status_id != $status->id) {
|
|
$invoiceCreate = $this->setInvoice($invoice_data, $rfc);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
// Manejar la respuesta fallida
|
|
return response()->json(['error' => 'Error al obtener los datos'], $response->status());
|
|
}
|
|
} catch (RequestException $e) {
|
|
// Manejar excepciones específicas de solicitudes HTTP
|
|
return response()->json(['error' => 'Excepción al obtener los datos: ' . $e->getMessage()], 500);
|
|
} catch (\Exception $e) {
|
|
// Manejar otras excepciones
|
|
return response()->json(['error' => 'Error inesperado: ' . $e->getMessage()], 500);
|
|
}
|
|
}
|
|
$currentMontly = Carbon::parse($currentMontly)->addMonth();
|
|
$startMonthly++;
|
|
}
|
|
|
|
$invoice_request->rfc_id = $rfc->id;
|
|
$invoice_request->type = 'invoice';
|
|
$invoice_request->requested_at = Carbon::now();
|
|
$invoice_request->save();
|
|
|
|
$time = microtime(true) - $start;
|
|
return response()->json(Invoice::where('rfc_id', $rfc->id)->get());
|
|
|
|
} else if (in_array($rfc->id, $user->rfcs->pluck('id')->toArray())) {
|
|
return response()->json(Invoice::where('rfc_id', $rfc->id)->get());
|
|
}
|
|
}
|
|
}
|
|
|
|
public function endpointObtenerFacturas(Request $request) {
|
|
|
|
$user = $request->user();
|
|
|
|
$invoiceType = $request->type;
|
|
|
|
$initialDateCST = Carbon::createFromFormat('Y-m-d H:i:s', $request->initialDate, 'CST');
|
|
$finalDateCST = Carbon::createFromFormat('Y-m-d H:i:s', $request->finalDate, 'CST');
|
|
|
|
$startDateUTC = $initialDateCST->copy()->firstOfMonth()->setTimezone('UTC');
|
|
$endDateUTC = $finalDateCST->copy()->endOfMonth()->setTimezone('UTC');
|
|
|
|
/**
|
|
* RFCs opcionales
|
|
*/
|
|
$issuerRfc = null;
|
|
$receiverRfc = null;
|
|
|
|
if ($request->issuerRfc) {
|
|
$issuerRfc = Rfc::where('rfc', strip_tags($request->issuerRfc))->first();
|
|
}
|
|
|
|
if ($request->receiverRfc) {
|
|
$receiverRfc = Rfc::where('rfc', strip_tags($request->receiverRfc))->first();
|
|
}
|
|
|
|
/**
|
|
* Validar que al menos uno venga en el request
|
|
*/
|
|
if (!$issuerRfc && !$receiverRfc) {
|
|
return response()->json([
|
|
'error' => 'Debe seleccionar un RFC emisor o receptor'
|
|
], 422);
|
|
}
|
|
|
|
$userRfcIds = $user->rfcs->pluck('id')->toArray();
|
|
|
|
/**
|
|
* Query base
|
|
*/
|
|
$query = Invoice::where('invoice_type_id', $invoiceType)
|
|
->whereBetween('issued_at', [$startDateUTC, $endDateUTC]);
|
|
|
|
/**
|
|
* Aplicar filtro según el RFC enviado y autorizado
|
|
*/
|
|
if ($issuerRfc && in_array($issuerRfc->id, $userRfcIds)) {
|
|
$query->where('issuer_rfc_id', $issuerRfc->id);
|
|
} elseif ($receiverRfc && in_array($receiverRfc->id, $userRfcIds)) {
|
|
$query->where('receiver_rfc_id', $receiverRfc->id);
|
|
} else {
|
|
return response()->json(['error' => 'No autorizado'], 403);
|
|
}
|
|
|
|
return response()->json($query->get());
|
|
|
|
}
|
|
|
|
public function facturasEmitidas(Request $request) {
|
|
|
|
$user = $request->user();
|
|
//$user = User::where('email', strip_tags($request->email))->first();
|
|
$rfc = Rfc::where('rfc', strip_tags($request->rfc))->first();
|
|
|
|
$initialDateCST = Carbon::createFromFormat('Y-m-d H:i:s', $request->initialDate, 'CST');
|
|
$finalDateCST = Carbon::createFromFormat('Y-m-d H:i:s', $request->finalDate, 'CST');
|
|
|
|
// Definir inicio y fin en CST (Central Standard Time)
|
|
$startDateCST = $initialDateCST->copy()->firstOfMonth();
|
|
$endDateCST = $finalDateCST->copy()->endOfMonth();
|
|
// Convertir las fechas a UTC
|
|
$startDateUTC = $startDateCST->copy()->setTimezone('UTC');
|
|
$endDateUTC = $endDateCST->copy()->setTimezone('UTC');
|
|
|
|
if (in_array($rfc->id, $user->rfcs->pluck('id')->toArray())) {
|
|
$invoices = Invoice::where('issuer_rfc_id', $rfc->id)
|
|
->whereBetween('issued_at',[$startDateUTC, $endDateUTC])
|
|
->orderBy('issued_at', 'asc')
|
|
->with(['conciliations' => function($query) use ($rfc) {
|
|
$query->where('rfc_id', $rfc->id);
|
|
}
|
|
])
|
|
->get();
|
|
return response()->json($invoices);
|
|
}
|
|
}
|
|
|
|
public function facturasRecibidas(Request $request) {
|
|
|
|
$user = $request->user();
|
|
//$user = User::where('email', strip_tags($request->email))->first();
|
|
$rfc = Rfc::where('rfc', strip_tags($request->rfc))->first();
|
|
|
|
$initialDateCST = Carbon::createFromFormat('Y-m-d H:i:s', $request->initialDate, 'CST');
|
|
$finalDateCST = Carbon::createFromFormat('Y-m-d H:i:s', $request->finalDate, 'CST');
|
|
|
|
// Definir inicio y fin en CST (Central Standard Time)
|
|
$startDateCST = $initialDateCST->copy()->firstOfMonth();
|
|
$endDateCST = $finalDateCST->copy()->endOfMonth();
|
|
// Convertir las fechas a UTC
|
|
$startDateUTC = $startDateCST->copy()->setTimezone('UTC');
|
|
$endDateUTC = $endDateCST->copy()->setTimezone('UTC');
|
|
|
|
if (in_array($rfc->id, $user->rfcs->pluck('id')->toArray())) {
|
|
$invoices = Invoice::where('receiver_rfc_id', $rfc->id)
|
|
->whereBetween('issued_at',[$startDateUTC, $endDateUTC])
|
|
->orderBy('issued_at', 'asc')
|
|
->with(['conciliations' => function($query) use ($rfc) {
|
|
$query->where('rfc_id', $rfc->id);
|
|
}])->get();
|
|
return response()->json($invoices);
|
|
}
|
|
}
|
|
|
|
public function facturasEmitidasConciliadas(Request $request) {
|
|
|
|
$user = $request->user();
|
|
//$user = User::where('email', strip_tags($request->email))->first();
|
|
$rfc = Rfc::where('rfc', strip_tags($request->rfc))->first();
|
|
|
|
$initialDateCST = Carbon::createFromFormat('Y-m-d H:i:s', $request->initialDate, 'CST');
|
|
$finalDateCST = Carbon::createFromFormat('Y-m-d H:i:s', $request->finalDate, 'CST');
|
|
|
|
// Definir inicio y fin en CST (Central Standard Time)
|
|
$startDateCST = $initialDateCST->copy()->firstOfMonth();
|
|
$endDateCST = $finalDateCST->copy()->endOfMonth();
|
|
// Convertir las fechas a UTC
|
|
$startDateUTC = $startDateCST->copy()->setTimezone('UTC');
|
|
$endDateUTC = $endDateCST->copy()->setTimezone('UTC');
|
|
|
|
if (in_array($rfc->id, $user->rfcs->pluck('id')->toArray())) {
|
|
$invoices = Invoice::where('issuer_rfc_id', $rfc->id)
|
|
->orderBy('issued_at', 'asc')
|
|
->whereHas('conciliations', function($query) use ($rfc, $startDateUTC, $endDateUTC) {
|
|
$query->where('rfc_id', $rfc->id)
|
|
->whereBetween('conciliated_at', [$startDateUTC, $endDateUTC]);
|
|
})->get();
|
|
return response()->json($invoices->sum('total_in_mxn'));
|
|
}
|
|
}
|
|
|
|
public function facturasRecibidasConciliadas(Request $request) {
|
|
|
|
$user = $request->user();
|
|
//$user = User::where('email', strip_tags($request->email))->first();
|
|
$rfc = Rfc::where('rfc', strip_tags($request->rfc))->first();
|
|
|
|
$initialDateCST = Carbon::createFromFormat('Y-m-d H:i:s', $request->initialDate, 'CST');
|
|
$finalDateCST = Carbon::createFromFormat('Y-m-d H:i:s', $request->finalDate, 'CST');
|
|
|
|
// Definir inicio y fin en CST (Central Standard Time)
|
|
$startDateCST = $initialDateCST->copy()->firstOfMonth();
|
|
$endDateCST = $finalDateCST->copy()->endOfMonth();
|
|
// Convertir las fechas a UTC
|
|
$startDateUTC = $startDateCST->copy()->setTimezone('UTC');
|
|
$endDateUTC = $endDateCST->copy()->setTimezone('UTC');
|
|
|
|
if (in_array($rfc->id, $user->rfcs->pluck('id')->toArray())) {
|
|
$invoices = Invoice::where('receiver_rfc_id', $rfc->id)
|
|
->orderBy('issued_at', 'asc')
|
|
->whereHas('conciliations', function($query) use ($rfc, $startDateUTC, $endDateUTC) {
|
|
$query->where('rfc_id', $rfc->id)
|
|
->whereBetween('conciliated_at', [$startDateUTC, $endDateUTC]);
|
|
})->get();
|
|
return response()->json($invoices->sum('total_in_mxn'));
|
|
}
|
|
}
|
|
|
|
public function conciliarFacturas(Request $request) {
|
|
|
|
$user = $request->user();
|
|
//$user = User::where('email', strip_tags($request->email))->first();
|
|
$rfc = Rfc::where('rfc', strip_tags($request->rfc))->first();
|
|
|
|
if (in_array($rfc->id, $user->rfcs->pluck('id')->toArray())) {
|
|
//Logica para conciliar facturas
|
|
$invoices = $request->items;
|
|
foreach($invoices as $invoice) {
|
|
//El array que viene del front solo tiene el ID y
|
|
//el boolean de conciliacion de cada invoice
|
|
$conciliation = Conciliation::firstOrNew(['invoice_id' => $invoice["id"]]);
|
|
$conciliation->rfc_id = $rfc->id;
|
|
if($invoice["formaPago"]) {
|
|
$conciliation->payment_description = $invoice["formaPago"];
|
|
}
|
|
if($invoice["fechaPago"]) {
|
|
$conciliation->payment_at = Carbon::createFromFormat('Y-m-d', $invoice["fechaPago"], 'UTC');
|
|
}
|
|
$conciliation->is_conciliated = $invoice["conciliado"];
|
|
if($invoice["conciliado"] == true){
|
|
if($invoice["fechaConciliacion"]){
|
|
$conciliation->conciliated_at = Carbon::createFromFormat('Y-m-d', $invoice["fechaConciliacion"], 'UTC');
|
|
} else {
|
|
$conciliation->conciliated_at = Carbon::now();
|
|
}
|
|
}
|
|
$conciliation->save();
|
|
}
|
|
}
|
|
|
|
return response()->json([
|
|
'success' => 'Datos almacenados con exito'
|
|
]);
|
|
}
|
|
|
|
public function descargarFactura(Request $request) {
|
|
|
|
$user = $request->user();
|
|
//$user = User::where('email', strip_tags($request->email))->first();
|
|
$rfc = Rfc::where('rfc', strip_tags($request->rfc))->first();
|
|
$invoice = Invoice::where('id', $request->id);
|
|
|
|
if (in_array($rfc->id, $user->rfcs->pluck('id')->toArray())) {
|
|
//Logica para conciliar facturas
|
|
if ($invoice->issuer_rfc_id = $rfc->id || $invoice->receiver_rfc_id = $rfc->id) {
|
|
|
|
|
|
if ($request->type == "pdf") {
|
|
$type = "application/pdf";
|
|
} else {
|
|
$type = "text/xml";
|
|
}
|
|
|
|
$response = Http::withHeaders([
|
|
'accept' => $type,
|
|
'X-API-Key' => 'b16ec9be960cdf3a8302e92a7aec84d2'
|
|
])->get('https://api.syntage.com/invoices/'. $request->id .'/cfdi');
|
|
|
|
if ($response->successful()) {
|
|
// Manejar la respuesta exitosa
|
|
return $response;
|
|
|
|
} else {
|
|
// Manejar la respuesta fallida
|
|
return $response;
|
|
//return response()->json(['error' => 'Error al obtener los datos'], $response->status());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public function emitirFactura(Request $request) {
|
|
|
|
$user = $request->user();
|
|
//$user = User::where('email', strip_tags($request->email))->first();
|
|
$rfc = Rfc::where('rfc', strip_tags($request->issuerRfc))->first();
|
|
|
|
if (in_array($rfc->id, $user->rfcs->pluck('id')->toArray())) {
|
|
//Logica para emitir facturas
|
|
|
|
$issuer = Taxpayer::where('rfc_id', $rfc->id)->first();
|
|
$issuerZipCode = Invoice::where('issuer_rfc_id', $rfc->id)->first();
|
|
|
|
$facturama = new Facturama\Client('pruebas', 'pruebas2011');
|
|
|
|
$params = [
|
|
//"Serie"=>"A",
|
|
//"NameId"=> "1",
|
|
//"Folio"=> "999",
|
|
"CfdiType"=> $request->cfdiType,
|
|
"Currency"=> $request->currency,
|
|
"PaymentForm"=> $request->paymentForm,
|
|
"PaymentMethod"=> $request->paymentMethod,
|
|
//"Exportation"=> "01",
|
|
"Date"=> Carbon::now(),
|
|
"ExpeditionPlace"=> $issuerZipCode->zip_code,
|
|
//"OrderNumber"=> "TEST-001",
|
|
//"PaymentAccountNumber"=> "6789",
|
|
//"PaymentConditions"=> "Condiciones",
|
|
"Issuer" =>
|
|
[
|
|
"Rfc"=> $issuer->rfc,
|
|
"Name"=> $issuer->name,
|
|
"FiscalRegime"=> $request->fiscalRegime,
|
|
"TaxZipCode"=> $issuerZipCode->zip_code
|
|
],
|
|
"Receiver" =>
|
|
[
|
|
"Rfc"=> $request->receiver->rfc,
|
|
"CfdiUse"=> $request->CfdiUse,
|
|
"Name"=> $request->receiver->name,
|
|
"FiscalRegime"=> $request->receiver->fiscalRegime,
|
|
"TaxZipCode" => $request->receiver->taxZipCode,
|
|
/*"Address"=>
|
|
[
|
|
"Street" => "Guadalcazar del receptor",
|
|
"ExteriorNumber" => "300",
|
|
"InteriorNumber" => "A",
|
|
"Neighborhood"=> "Las lomas",
|
|
"ZipCode" => "32040",
|
|
"Municipality" => "San Luis Potosi",
|
|
"State" => "San Luis Potosi",
|
|
"Country" => "México"
|
|
]*/
|
|
],
|
|
'Items' => $request->items
|
|
//"LogoUrl"=> "https://www.ejemplos.co/wp-content/uploads/2015/11/Logo-Chanel.jpg",
|
|
//"Observations"=> "Este es un ejemplo de observaciones",
|
|
//"PaymentBankName"=> "BBVA"
|
|
];
|
|
|
|
$response = $facturama->post('api-lite/3/cfdis', $params);
|
|
|
|
if ($response->successful()) {
|
|
// Manejar la respuesta exitosa
|
|
return $response;
|
|
|
|
} else {
|
|
// Manejar la respuesta fallida
|
|
return $response;
|
|
//return response()->json(['error' => 'Error al obtener los datos'], $response->status());
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Escribe los Invoices en la base de datos
|
|
*
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function setInvoice($invoice_data, $rfc) {
|
|
//
|
|
$invoice = Invoice::firstOrNew(['id' => $invoice_data['uuid']]);
|
|
|
|
$invoice->api_id = $invoice_data['id'];
|
|
$invoice->rfc_id = $rfc->id;
|
|
$invoice->version = $invoice_data['version'];
|
|
$type = InvoiceType::where('id', $invoice_data['type'])->first();
|
|
if (!$type) {
|
|
$type = new InvoiceType();
|
|
$type->id = $invoice_data['type'];
|
|
$type->save();
|
|
}
|
|
$invoice->invoice_type_id = $invoice_data['type'];
|
|
if ($invoice_data['usage']) {
|
|
$usage = Usage::where('id', strip_tags($invoice_data['usage']))->first();
|
|
if (!$usage) {
|
|
$usage = new Usage();
|
|
$usage->id = $invoice_data['usage'];
|
|
$usage->save();
|
|
}
|
|
}
|
|
$invoice->usage_id = $invoice_data['usage'];
|
|
if ($invoice_data['paymentType']) {
|
|
$payment_type = PaymentType::where('id', strip_tags($invoice_data['paymentType']))->first();
|
|
if (!$payment_type) {
|
|
$payment_type = new PaymentType();
|
|
$payment_type->id = $invoice_data['paymentType'];
|
|
$payment_type->save();
|
|
}
|
|
}
|
|
$invoice->payment_type_id = $invoice_data['paymentType'];
|
|
if ($invoice_data['paymentMethod']) {
|
|
$payment_method = PaymentMethod::where('id', strip_tags($invoice_data['paymentMethod']))->first();
|
|
if (!$payment_method) {
|
|
$payment_method = new PaymentMethod();
|
|
$payment_method->id = $invoice_data['paymentMethod'];
|
|
$payment_method->save();
|
|
}
|
|
}
|
|
$invoice->payment_method_id = $invoice_data['paymentMethod'];
|
|
$invoice->zip_code = $invoice_data['placeOfIssue'];
|
|
if (!empty($invoice_data['currency'])) {
|
|
$currency = Currency::where('id', strip_tags($invoice_data['currency']))->first();
|
|
if (!$currency) {
|
|
$currency = new Currency();
|
|
$currency->id = $invoice_data['currency'];
|
|
$currency->save();
|
|
}
|
|
$invoice->currency_id = $invoice_data['currency'];
|
|
} else {
|
|
$invoice->currency_id = null;
|
|
}
|
|
$invoice->exchange_rate = $invoice_data['exchangeRate'];
|
|
if ($invoice_data['status']) {
|
|
$status = Status::where('description', strip_tags($invoice_data['status']))->first();
|
|
if (!$status) {
|
|
$status = new Status();
|
|
$status->description = $invoice_data['status'];
|
|
$status->save();
|
|
}
|
|
}
|
|
$invoice->status_id = $status->id;
|
|
$invoice->pac = $invoice_data['pac'];
|
|
$invoice->issued_at = Carbon::createFromFormat('Y-m-d H:i:s', $invoice_data['issuedAt']);
|
|
$invoice->certified_at = Carbon::createFromFormat('Y-m-d H:i:s', $invoice_data['certifiedAt']);
|
|
$cancellationType = CancellationType::where('description', strip_tags($invoice_data['cancellationStatus']))->first();
|
|
if (!$cancellationType) {
|
|
$cancellationType = new CancellationType();
|
|
$cancellationType->description = $invoice_data['cancellationStatus'];
|
|
$cancellationType->save();
|
|
}
|
|
$invoice->cancellation_type_id = $cancellationType->id;
|
|
if ($invoice_data['cancellationProcessStatus']) {
|
|
$status = Status::where('description', strip_tags($invoice_data['cancellationProcessStatus']))->first();
|
|
if (!$status) {
|
|
$status = new Status();
|
|
$status->description = $invoice_data['cancellationProcessStatus'];
|
|
$status->save();
|
|
}
|
|
}
|
|
$invoice->cancellation_status_id = $status->id;
|
|
if ($invoice_data['canceledAt']){
|
|
$invoice->cancelled_at = Carbon::createFromFormat('Y-m-d H:i:s', $invoice_data['canceledAt']);
|
|
}
|
|
$invoice->discount = $invoice_data['discount'];
|
|
$invoice->tax = $invoice_data['tax'];
|
|
$invoice->subtotal = $invoice_data['subtotal'];
|
|
$invoice->total = $invoice_data['total'];
|
|
$invoice->paid_amount = $invoice_data['paidAmount'];
|
|
$invoice->due_amount = $invoice_data['dueAmount'];
|
|
if ($invoice_data['fullyPaidAt']){
|
|
$invoice->fully_paid_at = Carbon::createFromFormat('Y-m-d H:i:s', $invoice_data['fullyPaidAt']);
|
|
}
|
|
if ($invoice_data['lastPaymentDate']){
|
|
$invoice->last_payment_date = Carbon::createFromFormat('Y-m-d H:i:s', $invoice_data['lastPaymentDate']);
|
|
}
|
|
$rfc = Rfc::where('rfc', strip_tags($invoice_data['issuer']['rfc']))->first();
|
|
if (!$rfc) {
|
|
$rfc = new Rfc();
|
|
$rfc->rfc = $invoice_data['issuer']['rfc'];
|
|
$rfc->save();
|
|
}
|
|
$invoice->issuer_rfc_id = $rfc->id;
|
|
$invoice->issuer_name = $invoice_data['issuer']['name'];
|
|
$rfc = Rfc::where('rfc', strip_tags($invoice_data['receiver']['rfc']))->first();
|
|
if (!$rfc) {
|
|
$rfc = new Rfc();
|
|
$rfc->rfc = $invoice_data['receiver']['rfc'];
|
|
$rfc->save();
|
|
}
|
|
$invoice->receiver_rfc_id = $rfc->id;
|
|
$invoice->receiver_name = $invoice_data['receiver']['name'];
|
|
$invoice->is_issuer = $invoice_data['isIssuer'];
|
|
$invoice->is_receiver = $invoice_data['isReceiver'];
|
|
$invoice->internal_id = $invoice_data['internalIdentifier'];
|
|
$invoice->reference = $invoice_data['reference'];
|
|
if ($invoice_data['creditedAmount']){
|
|
$invoice->credited_amount = $invoice_data['creditedAmount'];
|
|
}
|
|
if ($invoice_data['subtotalCreditedAmount']){
|
|
$invoice->subtotal_credited_amount = $invoice_data['subtotalCreditedAmount'];
|
|
}
|
|
$invoice->applied_taxes = $invoice_data['appliedTaxes'];
|
|
$invoice->total_transferred_taxes = $invoice_data['transferredTaxes']['total'];
|
|
$invoice->transferred_local_taxes = $invoice_data['transferredTaxes']['localTaxes'];
|
|
$invoice->transferred_vat = $invoice_data['transferredTaxes']['valueAddedTax'];
|
|
$invoice->transferred_sin_tax = $invoice_data['transferredTaxes']['sinTax'];
|
|
$invoice->total_retained_taxes = $invoice_data['retainedTaxes']['total'];
|
|
$invoice->retained_local_taxes = $invoice_data['retainedTaxes']['localTaxes'];
|
|
$invoice->retained_vat = $invoice_data['retainedTaxes']['valueAddedTax'];
|
|
$invoice->retained_income_tax = $invoice_data['retainedTaxes']['incomeTax'];
|
|
$invoice->retained_sin_tax = $invoice_data['retainedTaxes']['sinTax'];
|
|
$invoice->save();
|
|
}
|
|
|
|
public function invoiceEndpoint(Request $request) {
|
|
//
|
|
$invoice_data = $request['data']['object'];
|
|
|
|
$invoice = Invoice::firstOrNew(['id' => $invoice_data['uuid']]);
|
|
|
|
$invoice->api_id = $invoice_data['id'];
|
|
|
|
$rfc = Rfc::firstOrCreate(
|
|
['rfc' => $request['taxpayer']['id']]
|
|
);
|
|
|
|
$invoice->rfc_id = $rfc->id;
|
|
$invoice->version = $invoice_data['version'];
|
|
$type = InvoiceType::where('id', $invoice_data['type'])->first();
|
|
if (!$type) {
|
|
$type = new InvoiceType();
|
|
$type->id = $invoice_data['type'];
|
|
$type->save();
|
|
}
|
|
$invoice->invoice_type_id = $invoice_data['type'];
|
|
if ($invoice_data['usage']) {
|
|
$usage = Usage::where('id', strip_tags($invoice_data['usage']))->first();
|
|
if (!$usage) {
|
|
$usage = new Usage();
|
|
$usage->id = $invoice_data['usage'];
|
|
$usage->save();
|
|
}
|
|
}
|
|
$invoice->usage_id = $invoice_data['usage'];
|
|
if ($invoice_data['paymentType']) {
|
|
$payment_type = PaymentType::where('id', strip_tags($invoice_data['paymentType']))->first();
|
|
if (!$payment_type) {
|
|
$payment_type = new PaymentType();
|
|
$payment_type->id = $invoice_data['paymentType'];
|
|
$payment_type->save();
|
|
}
|
|
}
|
|
$invoice->payment_type_id = $invoice_data['paymentType'];
|
|
if ($invoice_data['paymentMethod']) {
|
|
$payment_method = PaymentMethod::where('id', strip_tags($invoice_data['paymentMethod']))->first();
|
|
if (!$payment_method) {
|
|
$payment_method = new PaymentMethod();
|
|
$payment_method->id = $invoice_data['paymentMethod'];
|
|
$payment_method->save();
|
|
}
|
|
}
|
|
$invoice->payment_method_id = $invoice_data['paymentMethod'];
|
|
$invoice->zip_code = $invoice_data['placeOfIssue'];
|
|
if ($invoice_data['currency']) {
|
|
$currency = Currency::where('id', strip_tags($invoice_data['currency']))->first();
|
|
if (!$currency) {
|
|
$currency = new Currency();
|
|
$currency->id = $invoice_data['currency'];
|
|
$currency->save();
|
|
}
|
|
}
|
|
$invoice->currency_id = $invoice_data['currency'];
|
|
$invoice->exchange_rate = $invoice_data['exchangeRate'];
|
|
if ($invoice_data['status']) {
|
|
$status = Status::where('description', strip_tags($invoice_data['status']))->first();
|
|
if (!$status) {
|
|
$status = new Status();
|
|
$status->description = $invoice_data['status'];
|
|
$status->save();
|
|
}
|
|
}
|
|
$invoice->status_id = $status->id;
|
|
$invoice->pac = $invoice_data['pac'];
|
|
$invoice->issued_at = Carbon::createFromFormat('Y-m-d H:i:s', $invoice_data['issuedAt']);
|
|
$invoice->certified_at = Carbon::createFromFormat('Y-m-d H:i:s', $invoice_data['certifiedAt']);
|
|
$cancellationType = CancellationType::where('description', strip_tags($invoice_data['cancellationStatus']))->first();
|
|
if (!$cancellationType) {
|
|
$cancellationType = new CancellationType();
|
|
$cancellationType->description = $invoice_data['cancellationStatus'];
|
|
$cancellationType->save();
|
|
}
|
|
$invoice->cancellation_type_id = $cancellationType->id;
|
|
if ($invoice_data['cancellationProcessStatus']) {
|
|
$status = Status::where('description', strip_tags($invoice_data['cancellationProcessStatus']))->first();
|
|
if (!$status) {
|
|
$status = new Status();
|
|
$status->description = $invoice_data['cancellationProcessStatus'];
|
|
$status->save();
|
|
}
|
|
}
|
|
$invoice->cancellation_status_id = $status->id;
|
|
if ($invoice_data['canceledAt']){
|
|
$invoice->cancelled_at = Carbon::createFromFormat('Y-m-d H:i:s', $invoice_data['canceledAt']);
|
|
}
|
|
$invoice->discount = $invoice_data['discount'];
|
|
$invoice->tax = $invoice_data['tax'];
|
|
$invoice->subtotal = $invoice_data['subtotal'];
|
|
$invoice->total = $invoice_data['total'];
|
|
$invoice->paid_amount = $invoice_data['paidAmount'];
|
|
$invoice->due_amount = $invoice_data['dueAmount'];
|
|
if ($invoice_data['fullyPaidAt']){
|
|
$invoice->fully_paid_at = Carbon::createFromFormat('Y-m-d H:i:s', $invoice_data['fullyPaidAt']);
|
|
}
|
|
if ($invoice_data['lastPaymentDate']){
|
|
$invoice->last_payment_date = Carbon::createFromFormat('Y-m-d H:i:s', $invoice_data['lastPaymentDate']);
|
|
}
|
|
$rfc = Rfc::where('rfc', strip_tags($invoice_data['issuer']['rfc']))->first();
|
|
if (!$rfc) {
|
|
$rfc = new Rfc();
|
|
$rfc->rfc = $invoice_data['issuer']['rfc'];
|
|
$rfc->save();
|
|
}
|
|
$invoice->issuer_rfc_id = $rfc->id;
|
|
$invoice->issuer_name = $invoice_data['issuer']['name'];
|
|
$rfc = Rfc::where('rfc', strip_tags($invoice_data['receiver']['rfc']))->first();
|
|
if (!$rfc) {
|
|
$rfc = new Rfc();
|
|
$rfc->rfc = $invoice_data['receiver']['rfc'];
|
|
$rfc->save();
|
|
}
|
|
$invoice->receiver_rfc_id = $rfc->id;
|
|
$invoice->receiver_name = $invoice_data['receiver']['name'];
|
|
$invoice->is_issuer = $invoice_data['isIssuer'];
|
|
$invoice->is_receiver = $invoice_data['isReceiver'];
|
|
$invoice->internal_id = $invoice_data['internalIdentifier'];
|
|
$invoice->reference = $invoice_data['reference'];
|
|
if ($invoice_data['creditedAmount']){
|
|
$invoice->credited_amount = $invoice_data['creditedAmount'];
|
|
}
|
|
if ($invoice_data['subtotalCreditedAmount']){
|
|
$invoice->subtotal_credited_amount = $invoice_data['subtotalCreditedAmount'];
|
|
}
|
|
$invoice->applied_taxes = $invoice_data['appliedTaxes'];
|
|
$invoice->total_transferred_taxes = $invoice_data['transferredTaxes']['total'];
|
|
$invoice->transferred_local_taxes = $invoice_data['transferredTaxes']['localTaxes'];
|
|
$invoice->transferred_vat = $invoice_data['transferredTaxes']['valueAddedTax'];
|
|
$invoice->transferred_sin_tax = $invoice_data['transferredTaxes']['sinTax'];
|
|
$invoice->total_retained_taxes = $invoice_data['retainedTaxes']['total'];
|
|
$invoice->retained_local_taxes = $invoice_data['retainedTaxes']['localTaxes'];
|
|
$invoice->retained_vat = $invoice_data['retainedTaxes']['valueAddedTax'];
|
|
$invoice->retained_income_tax = $invoice_data['retainedTaxes']['incomeTax'];
|
|
$invoice->retained_sin_tax = $invoice_data['retainedTaxes']['sinTax'];
|
|
$invoice->save();
|
|
}
|
|
|
|
public function importarFacturas(Request $request) {
|
|
// Validar que se ha subido un archivo y que es un Excel
|
|
$request->validate([
|
|
'file' => 'required|mimes:xlsx,xls,csv|max:20480', // Limitar el tamaño del archivo a 10MB
|
|
'rfc' => 'required|string', // Validación para el parámetro adicional
|
|
]);
|
|
|
|
$rfc = $request->rfc;
|
|
|
|
set_time_limit(1000);
|
|
//ini_set('memory_limit', '-1');
|
|
|
|
try {
|
|
// Procesar el archivo usando la clase de importación
|
|
Excel::import(new InvoicesImport($rfc), $request->file('file'));
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'message' => 'Excel importado correctamente'
|
|
], 200);
|
|
} catch (\Exception $e) {
|
|
// Manejar errores durante la importación
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'Error al importar el archivo: ' . $e->getMessage()
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Metricas basadas en las facturas
|
|
*
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function ingresoTipoI(Request $request) {
|
|
$start = microtime(true);
|
|
set_time_limit(1000);
|
|
|
|
$user = $request->user();
|
|
//$user = User::where('email', strip_tags($request->email))->first();
|
|
$rfc = Rfc::where('rfc', strip_tags($request->rfc))->first();
|
|
$dateCST = Carbon::createFromFormat('Y-m-d H:i:s', $request->date, 'CST');
|
|
|
|
// Definir inicio y fin en CST (Central Standard Time)
|
|
$startDateCST = $dateCST->copy()->firstOfMonth();
|
|
$endDateCST = $dateCST->copy()->endOfMonth();
|
|
// Convertir las fechas a UTC
|
|
$startDateUTC = $startDateCST->copy()->setTimezone('UTC');
|
|
$endDateUTC = $endDateCST->copy()->setTimezone('UTC');
|
|
|
|
$taxpayer = Taxpayer::where('rfc_id', $rfc->id)->first();
|
|
|
|
$naturalPerson = ['612', '621', '626'];
|
|
|
|
if (in_array($rfc->id, $user->rfcs->pluck('id')->toArray())) {
|
|
if(count(array_intersect($naturalPerson, $taxpayer->taxRegimes->pluck('id')->toArray())) > 0) {
|
|
if ($request->conciliated) {
|
|
$invoices = Invoice::where('issuer_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'I')
|
|
->whereIn('cancellation_status_id', ['1', '6', '7'])
|
|
->where('payment_type_id', 'PUE')
|
|
->whereHas('conciliations', function($query) use ($rfc, $startDateUTC, $endDateUTC) {
|
|
$query->where('rfc_id', $rfc->id);
|
|
$query->where('is_conciliated', true);
|
|
$query->whereBetween('conciliated_at', [$startDateUTC, $endDateUTC]);
|
|
})
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->whereIn('product_identification', [84121603, 84121600]);
|
|
})
|
|
->get();
|
|
} else {
|
|
$invoices = Invoice::where('issuer_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'I')
|
|
->whereIn('cancellation_status_id', ['1', '6', '7'])
|
|
->where('payment_type_id', 'PUE')
|
|
->whereBetween('issued_at', [$startDateUTC, $endDateUTC])
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->whereIn('product_identification', [84121603, 84121600]);
|
|
})
|
|
->get();
|
|
}
|
|
} else if ($request->conciliated) {
|
|
$invoices = Invoice::where('issuer_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'I')
|
|
->whereIn('cancellation_status_id', ['1', '6', '7'])
|
|
->whereHas('conciliations', function($query) use ($rfc, $startDateUTC, $endDateUTC) {
|
|
$query->where('rfc_id', $rfc->id);
|
|
$query->where('is_conciliated', true);
|
|
$query->whereBetween('conciliated_at', [$startDateUTC, $endDateUTC]);
|
|
})
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->whereIn('product_identification', [84121603, 84121600]);
|
|
})
|
|
->get();
|
|
} else {
|
|
$invoices = Invoice::where('issuer_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'I')
|
|
->whereIn('cancellation_status_id', ['1', '6', '7'])
|
|
->whereBetween('issued_at', [$startDateUTC, $endDateUTC])
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->whereIn('product_identification', [84121603, 84121600]);
|
|
})
|
|
->get();
|
|
}
|
|
|
|
return response()->json([
|
|
'total' => round($invoices->sum('total_in_mxn'), 2),
|
|
'transferred_vat' => round($invoices->sum('transferred_vat_in_mxn'), 2),
|
|
'transferred_sin_tax' => round($invoices->sum('transferred_sin_tax_in_mxn'), 2),
|
|
'retained_vat' => round($invoices->sum('retained_vat_in_mxn'), 2),
|
|
'start_date' => $startDateUTC,
|
|
'end_date' => $endDateUTC,
|
|
'invoicesI' => $invoices
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function gastoTipoI(Request $request) {
|
|
$start = microtime(true);
|
|
set_time_limit(1000);
|
|
|
|
$user = $request->user();
|
|
//$user = User::where('email', strip_tags($request->email))->first();
|
|
$rfc = Rfc::where('rfc', strip_tags($request->rfc))->first();
|
|
$dateCST = Carbon::createFromFormat('Y-m-d H:i:s', $request->date, 'CST');
|
|
|
|
// Definir inicio y fin en CST (Central Standard Time)
|
|
$startDateCST = $dateCST->copy()->firstOfMonth();
|
|
$endDateCST = $dateCST->copy()->endOfMonth();
|
|
// Convertir las fechas a UTC
|
|
$startDateUTC = $startDateCST->copy()->setTimezone('UTC');
|
|
$endDateUTC = $endDateCST->copy()->setTimezone('UTC');
|
|
|
|
$taxpayer = Taxpayer::where('rfc_id', $rfc->id)->first();
|
|
|
|
$naturalPerson = ['612', '621', '626'];
|
|
|
|
if (in_array($rfc->id, $user->rfcs->pluck('id')->toArray())) {
|
|
if ($request->conciliated) {
|
|
$invoices = Invoice::where('receiver_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'I')
|
|
->whereIn('cancellation_status_id', ['1', '6', '7'])
|
|
->where('payment_type_id', 'PUE')
|
|
->whereHas('conciliations', function($query) use ($rfc, $startDateUTC, $endDateUTC) {
|
|
$query->where('rfc_id', $rfc->id);
|
|
$query->where('is_conciliated', true);
|
|
$query->whereBetween('conciliated_at', [$startDateUTC, $endDateUTC]);
|
|
})
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->whereIn('product_identification', [84121603, 84121600]);
|
|
})
|
|
->get();
|
|
} else {
|
|
$invoices = Invoice::where('receiver_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'I')
|
|
->whereIn('cancellation_status_id', ['1', '6', '7'])
|
|
->where('payment_type_id', 'PUE')
|
|
->whereBetween('issued_at', [$startDateUTC, $endDateUTC])
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->whereIn('product_identification', [84121603, 84121600]);
|
|
})
|
|
->get();
|
|
}
|
|
|
|
return response()->json([
|
|
'total' => round($invoices->sum('total_in_mxn'), 2),
|
|
'tax' => round($invoices->sum('tax_in_mxn'), 2),
|
|
'transferred_vat' => round($invoices->sum('transferred_vat_in_mxn'), 2),
|
|
'transferred_sin_tax' => round($invoices->sum('transferred_sin_tax_in_mxn'), 2),
|
|
'retained_vat' => round($invoices->sum('retained_vat_in_mxn'), 2),
|
|
'retained_income_tax' => round($invoices->sum('retained_income_tax_in_mxn'), 2),
|
|
'invoicesI' => $invoices
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function ingresoTipoE(Request $request) {
|
|
$start = microtime(true);
|
|
set_time_limit(1000);
|
|
|
|
$user = $request->user();
|
|
//$user = User::where('email', strip_tags($request->email))->first();
|
|
$rfc = Rfc::where('rfc', strip_tags($request->rfc))->first();
|
|
$dateCST = Carbon::createFromFormat('Y-m-d H:i:s', $request->date, 'CST');
|
|
|
|
// Definir inicio y fin en CST (Central Standard Time)
|
|
$startDateCST = $dateCST->copy()->firstOfMonth();
|
|
$endDateCST = $dateCST->copy()->endOfMonth();
|
|
// Convertir las fechas a UTC
|
|
$startDateUTC = $startDateCST->copy()->setTimezone('UTC');
|
|
$endDateUTC = $endDateCST->copy()->setTimezone('UTC');
|
|
|
|
$taxpayer = Taxpayer::where('rfc_id', $rfc->id)->first();
|
|
|
|
$naturalPerson = ['612', '621', '626'];
|
|
|
|
if (in_array($rfc->id, $user->rfcs->pluck('id')->toArray())) {
|
|
if(count(array_intersect($naturalPerson, $taxpayer->taxRegimes->pluck('id')->toArray())) > 0) {
|
|
if ($request->conciliated) {
|
|
$invoices = Invoice::where('issuer_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'E')
|
|
->whereIn('cancellation_status_id', ['1', '6', '7'])
|
|
->where('payment_type_id', 'PUE')
|
|
->whereHas('conciliations', function($query) use ($rfc, $startDateUTC, $endDateUTC) {
|
|
$query->where('rfc_id', $rfc->id);
|
|
$query->where('is_conciliated', true);
|
|
$query->whereBetween('conciliated_at', [$startDateUTC, $endDateUTC]);
|
|
})
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->whereIn('product_identification', [84121603, 84121600]);
|
|
})
|
|
->get();
|
|
} else {
|
|
$invoices = Invoice::where('issuer_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'E')
|
|
->whereIn('cancellation_status_id', ['1', '6', '7'])
|
|
->where('payment_type_id', 'PUE')
|
|
->whereBetween('issued_at', [$startDateUTC, $endDateUTC])
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->whereIn('product_identification', [84121603, 84121600]);
|
|
})
|
|
->get();
|
|
}
|
|
} else if ($request->conciliated) {
|
|
$invoices = Invoice::where('issuer_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'E')
|
|
->whereIn('cancellation_status_id', ['1', '6', '7'])
|
|
->whereHas('conciliations', function($query) use ($rfc, $startDateUTC, $endDateUTC) {
|
|
$query->where('rfc_id', $rfc->id);
|
|
$query->where('is_conciliated', true);
|
|
$query->whereBetween('conciliated_at', [$startDateUTC, $endDateUTC]);
|
|
})
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->whereIn('product_identification', [84121603, 84121600]);
|
|
})
|
|
->get();
|
|
} else {
|
|
$invoices = Invoice::where('issuer_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'E')
|
|
->whereIn('cancellation_status_id', ['1', '6', '7'])
|
|
->whereBetween('issued_at', [$startDateUTC, $endDateUTC])
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->whereIn('product_identification', [84121603, 84121600]);
|
|
})
|
|
->get();
|
|
}
|
|
|
|
return response()->json([
|
|
'total' => round($invoices->sum('total_in_mxn'), 2),
|
|
'transferred_vat' => round($invoices->sum('transferred_vat_in_mxn'), 2),
|
|
'transferred_sin_tax' => round($invoices->sum('transferred_sin_tax_in_mxn'), 2),
|
|
'retained_vat' => round($invoices->sum('retained_vat_in_mxn'), 2),
|
|
'invoicesE' => $invoices
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function gastoTipoE(Request $request) {
|
|
$start = microtime(true);
|
|
set_time_limit(1000);
|
|
|
|
$user = $request->user();
|
|
//$user = User::where('email', strip_tags($request->email))->first();
|
|
$rfc = Rfc::where('rfc', strip_tags($request->rfc))->first();
|
|
$dateCST = Carbon::createFromFormat('Y-m-d H:i:s', $request->date, 'CST');
|
|
|
|
// Definir inicio y fin en CST (Central Standard Time)
|
|
$startDateCST = $dateCST->copy()->firstOfMonth();
|
|
$endDateCST = $dateCST->copy()->endOfMonth();
|
|
// Convertir las fechas a UTC
|
|
$startDateUTC = $startDateCST->copy()->setTimezone('UTC');
|
|
$endDateUTC = $endDateCST->copy()->setTimezone('UTC');
|
|
|
|
$taxpayer = Taxpayer::where('rfc_id', $rfc->id)->first();
|
|
|
|
$naturalPerson = ['612', '621', '626'];
|
|
|
|
if (in_array($rfc->id, $user->rfcs->pluck('id')->toArray())) {
|
|
if ($request->conciliated) {
|
|
$invoices = Invoice::where('receiver_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'E')
|
|
->whereIn('cancellation_status_id', ['1', '6', '7'])
|
|
->where('payment_type_id', 'PUE')
|
|
->whereHas('conciliations', function($query) use ($rfc, $startDateUTC, $endDateUTC) {
|
|
$query->where('rfc_id', $rfc->id);
|
|
$query->where('is_conciliated', true);
|
|
$query->whereBetween('conciliated_at', [$startDateUTC, $endDateUTC]);
|
|
})
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->whereIn('product_identification', [84121603, 84121600]);
|
|
})
|
|
->get();
|
|
} else {
|
|
$invoices = Invoice::where('receiver_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'E')
|
|
->whereIn('cancellation_status_id', ['1', '6', '7'])
|
|
->where('payment_type_id', 'PUE')
|
|
->whereBetween('issued_at', [$startDateUTC, $endDateUTC])
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->whereIn('product_identification', [84121603, 84121600]);
|
|
})
|
|
->get();
|
|
}
|
|
|
|
return response()->json([
|
|
'total' => round($invoices->sum('total_in_mxn'), 2),
|
|
'tax' => round($invoices->sum('tax_in_mxn'), 2),
|
|
'transferred_vat' => round($invoices->sum('transferred_vat_in_mxn'), 2),
|
|
'transferred_sin_tax' => round($invoices->sum('transferred_sin_tax_in_mxn'), 2),
|
|
'retained_vat' => round($invoices->sum('retained_vat_in_mxn'), 2),
|
|
'retained_income_tax' => round($invoices->sum('retained_income_tax_in_mxn'), 2),
|
|
'invoicesE' => $invoices
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function gastoTipoN(Request $request) {
|
|
$start = microtime(true);
|
|
set_time_limit(1000);
|
|
|
|
$user = $request->user();
|
|
//$user = User::where('email', strip_tags($request->email))->first();
|
|
$rfc = Rfc::where('rfc', strip_tags($request->rfc))->first();
|
|
$dateCST = Carbon::createFromFormat('Y-m-d H:i:s', $request->date, 'CST');
|
|
|
|
// Definir inicio y fin en CST (Central Standard Time)
|
|
$startDateCST = $dateCST->copy()->firstOfMonth();
|
|
$endDateCST = $dateCST->copy()->endOfMonth();
|
|
// Convertir las fechas a UTC
|
|
$startDateUTC = $startDateCST->copy()->setTimezone('UTC');
|
|
$endDateUTC = $endDateCST->copy()->setTimezone('UTC');
|
|
|
|
$taxpayer = Taxpayer::where('rfc_id', $rfc->id)->first();
|
|
|
|
$naturalPerson = ['612', '621', '626'];
|
|
|
|
if (in_array($rfc->id, $user->rfcs->pluck('id')->toArray())) {
|
|
if ($request->conciliated) {
|
|
$invoices = Invoice::where('issuer_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'N')
|
|
->whereIn('cancellation_status_id', ['1', '6', '7'])
|
|
->where('payment_type_id', 'PUE')
|
|
->whereHas('conciliations', function($query) use ($rfc, $startDateUTC, $endDateUTC) {
|
|
$query->where('rfc_id', $rfc->id);
|
|
$query->where('is_conciliated', true);
|
|
$query->whereBetween('conciliated_at', [$startDateUTC, $endDateUTC]);
|
|
})
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->where('product_identification', 84121603);
|
|
})
|
|
->get();
|
|
} else {
|
|
$invoices = Invoice::where('issuer_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'N')
|
|
->whereIn('cancellation_status_id', ['1', '6', '7'])
|
|
->where('payment_type_id', 'PUE')
|
|
->whereBetween('issued_at', [$startDateUTC, $endDateUTC])
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->where('product_identification', 84121603);
|
|
})
|
|
->get();
|
|
}
|
|
|
|
return response()->json([
|
|
'total' => round($invoices->sum('total_in_mxn'), 2),
|
|
'transferred_vat' => round($invoices->sum('transferred_vat_in_mxn'), 2),
|
|
'retained_vat' => round($invoices->sum('retained_vat_in_mxn'), 2),
|
|
'retained_income_tax' => round($invoices->sum('retained_income_tax_in_mxn'), 2),
|
|
'invoicesN' => $invoices
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function adquisicionPue(Request $request) {
|
|
$start = microtime(true);
|
|
set_time_limit(1000);
|
|
|
|
$user = $request->user();
|
|
//$user = User::where('email', strip_tags($request->email))->first();
|
|
$rfc = Rfc::where('rfc', strip_tags($request->rfc))->first();
|
|
$dateCST = Carbon::createFromFormat('Y-m-d H:i:s', $request->date, 'CST');
|
|
|
|
// Definir inicio y fin en CST (Central Standard Time)
|
|
$startDateCST = $dateCST->copy()->firstOfMonth();
|
|
$endDateCST = $dateCST->copy()->endOfMonth();
|
|
// Convertir las fechas a UTC
|
|
$startDateUTC = $startDateCST->copy()->setTimezone('UTC');
|
|
$endDateUTC = $endDateCST->copy()->setTimezone('UTC');
|
|
|
|
$taxpayer = Taxpayer::where('rfc_id', $rfc->id)->first();
|
|
|
|
$naturalPerson = ['612', '621', '626'];
|
|
|
|
if (in_array($rfc->id, $user->rfcs->pluck('id')->toArray())) {
|
|
if ($request->conciliated) {
|
|
$invoices = Invoice::where('receiver_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'I')
|
|
->where('usage_id', 'G01')
|
|
->where('payment_type_id', 'PUE')
|
|
->whereHas('conciliations', function($query) use ($rfc, $startDateUTC, $endDateUTC) {
|
|
$query->where('rfc_id', $rfc->id);
|
|
$query->where('is_conciliated', true);
|
|
$query->whereBetween('conciliated_at', [$startDateUTC, $endDateUTC]);
|
|
})
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->where('product_identification', 84121603);
|
|
})
|
|
->get();
|
|
} else {
|
|
$invoices = Invoice::where('receiver_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'I')
|
|
->where('usage_id', 'G01')
|
|
->where('payment_type_id', 'PUE')
|
|
->whereBetween('issued_at', [$startDateUTC, $endDateUTC])
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->where('product_identification', 84121603);
|
|
})
|
|
->get();
|
|
}
|
|
|
|
return response()->json([
|
|
'total' => round($invoices->sum('total_in_mxn'), 2),
|
|
'tax' => round($invoices->sum('tax_in_mxn'), 2),
|
|
'invoicesAPue' => $invoices
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function ivaIngresoTipoI(Request $request) {
|
|
$start = microtime(true);
|
|
set_time_limit(1000);
|
|
|
|
$user = $request->user();
|
|
//$user = User::where('email', strip_tags($request->email))->first();
|
|
$rfc = Rfc::where('rfc', strip_tags($request->rfc))->first();
|
|
$dateCST = Carbon::createFromFormat('Y-m-d H:i:s', $request->date, 'CST');
|
|
|
|
// Definir inicio y fin en CST (Central Standard Time)
|
|
$startDateCST = $dateCST->copy()->firstOfMonth();
|
|
$endDateCST = $dateCST->copy()->endOfMonth();
|
|
// Convertir las fechas a UTC
|
|
$startDateUTC = $startDateCST->copy()->setTimezone('UTC');
|
|
$endDateUTC = $endDateCST->copy()->setTimezone('UTC');
|
|
|
|
$taxpayer = Taxpayer::where('rfc_id', $rfc->id)->first();
|
|
|
|
$naturalPerson = ['612', '621', '626'];
|
|
|
|
if (in_array($rfc->id, $user->rfcs->pluck('id')->toArray())) {
|
|
if ($request->conciliated) {
|
|
$invoices = Invoice::where('issuer_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'I')
|
|
->whereIn('cancellation_status_id', ['1', '6', '7'])
|
|
->where('payment_type_id', 'PUE')
|
|
->whereHas('conciliations', function($query) use ($rfc, $startDateUTC, $endDateUTC) {
|
|
$query->where('rfc_id', $rfc->id);
|
|
$query->where('is_conciliated', true);
|
|
$query->whereBetween('conciliated_at', [$startDateUTC, $endDateUTC]);
|
|
})
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->where('product_identification', 84121603);
|
|
})
|
|
->get();
|
|
} else {
|
|
$invoices = Invoice::where('issuer_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'I')
|
|
->whereIn('cancellation_status_id', ['1', '6', '7'])
|
|
->where('payment_type_id', 'PUE')
|
|
->whereBetween('issued_at', [$startDateUTC, $endDateUTC])
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->where('product_identification', 84121603);
|
|
})
|
|
->get();
|
|
}
|
|
|
|
return response()->json([
|
|
'total' => round($invoices->sum('total_in_mxn'), 2),
|
|
'transferred_vat' => round($invoices->sum('transferred_vat_in_mxn'), 2),
|
|
'retained_vat' => round($invoices->sum('retained_vat_in_mxn'), 2),
|
|
'start_date' => $startDateUTC,
|
|
'end_date' => $endDateUTC,
|
|
'invoicesIiva' => $invoices
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function ivaIngresoTipoE(Request $request) {
|
|
$start = microtime(true);
|
|
set_time_limit(1000);
|
|
|
|
$user = $request->user();
|
|
//$user = User::where('email', strip_tags($request->email))->first();
|
|
$rfc = Rfc::where('rfc', strip_tags($request->rfc))->first();
|
|
$dateCST = Carbon::createFromFormat('Y-m-d H:i:s', $request->date, 'CST');
|
|
|
|
// Definir inicio y fin en CST (Central Standard Time)
|
|
$startDateCST = $dateCST->copy()->firstOfMonth();
|
|
$endDateCST = $dateCST->copy()->endOfMonth();
|
|
// Convertir las fechas a UTC
|
|
$startDateUTC = $startDateCST->copy()->setTimezone('UTC');
|
|
$endDateUTC = $endDateCST->copy()->setTimezone('UTC');
|
|
|
|
$taxpayer = Taxpayer::where('rfc_id', $rfc->id)->first();
|
|
|
|
$naturalPerson = ['612', '621', '626'];
|
|
|
|
if (in_array($rfc->id, $user->rfcs->pluck('id')->toArray())) {
|
|
if ($request->conciliated) {
|
|
$invoices = Invoice::where('issuer_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'E')
|
|
->whereIn('cancellation_status_id', ['1', '6', '7'])
|
|
->where('payment_type_id', 'PUE')
|
|
->whereHas('conciliations', function($query) use ($rfc, $startDateUTC, $endDateUTC) {
|
|
$query->where('rfc_id', $rfc->id);
|
|
$query->where('is_conciliated', true);
|
|
$query->whereBetween('conciliated_at', [$startDateUTC, $endDateUTC]);
|
|
})
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->where('product_identification', 84121603);
|
|
})
|
|
->get();
|
|
} else {
|
|
$invoices = Invoice::where('issuer_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'E')
|
|
->whereIn('cancellation_status_id', ['1', '6', '7'])
|
|
->where('payment_type_id', 'PUE')
|
|
->whereBetween('issued_at', [$startDateUTC, $endDateUTC])
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->where('product_identification', 84121603);
|
|
})
|
|
->get();
|
|
}
|
|
|
|
return response()->json([
|
|
'total' => round($invoices->sum('total_in_mxn'), 2),
|
|
'transferred_vat' => round($invoices->sum('transferred_vat_in_mxn'), 2),
|
|
'retained_vat' => round($invoices->sum('retained_vat_in_mxn'), 2),
|
|
'invoicesEiva' => $invoices
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function ivaGastoTipoI(Request $request) {
|
|
$start = microtime(true);
|
|
set_time_limit(1000);
|
|
|
|
$user = $request->user();
|
|
//$user = User::where('email', strip_tags($request->email))->first();
|
|
$rfc = Rfc::where('rfc', strip_tags($request->rfc))->first();
|
|
$dateCST = Carbon::createFromFormat('Y-m-d H:i:s', $request->date, 'CST');
|
|
|
|
// Definir inicio y fin en CST (Central Standard Time)
|
|
$startDateCST = $dateCST->copy()->firstOfMonth();
|
|
$endDateCST = $dateCST->copy()->endOfMonth();
|
|
// Convertir las fechas a UTC
|
|
$startDateUTC = $startDateCST->copy()->setTimezone('UTC');
|
|
$endDateUTC = $endDateCST->copy()->setTimezone('UTC');
|
|
|
|
$taxpayer = Taxpayer::where('rfc_id', $rfc->id)->first();
|
|
|
|
$naturalPerson = ['612', '621', '626'];
|
|
|
|
if (in_array($rfc->id, $user->rfcs->pluck('id')->toArray())) {
|
|
if ($request->conciliated) {
|
|
$invoices = Invoice::where('receiver_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'I')
|
|
->whereIn('cancellation_status_id', ['1', '6', '7'])
|
|
->where('payment_type_id', 'PUE')
|
|
->whereHas('conciliations', function($query) use ($rfc, $startDateUTC, $endDateUTC) {
|
|
$query->where('rfc_id', $rfc->id);
|
|
$query->where('is_conciliated', true);
|
|
$query->whereBetween('conciliated_at', [$startDateUTC, $endDateUTC]);
|
|
})
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->where('product_identification', 84121603)
|
|
->orWhere('product_identification', 93161608);
|
|
})
|
|
->get();
|
|
} else {
|
|
$invoices = Invoice::where('receiver_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'I')
|
|
->whereIn('cancellation_status_id', ['1', '6', '7'])
|
|
->where('payment_type_id', 'PUE')
|
|
->whereBetween('issued_at', [$startDateUTC, $endDateUTC])
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->where('product_identification', 84121603)
|
|
->orWhere('product_identification', 93161608);
|
|
})
|
|
->get();
|
|
}
|
|
|
|
return response()->json([
|
|
'total' => round($invoices->sum('total_in_mxn'), 2),
|
|
'tax' => round($invoices->sum('tax_in_mxn'), 2),
|
|
'transferred_vat' => round($invoices->sum('transferred_vat_in_mxn'), 2),
|
|
'retained_vat' => round($invoices->sum('retained_vat_in_mxn'), 2),
|
|
'invoicesI' => $invoices
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function ivaGastoTipoE(Request $request) {
|
|
$start = microtime(true);
|
|
set_time_limit(1000);
|
|
|
|
$user = $request->user();
|
|
//$user = User::where('email', strip_tags($request->email))->first();
|
|
$rfc = Rfc::where('rfc', strip_tags($request->rfc))->first();
|
|
$dateCST = Carbon::createFromFormat('Y-m-d H:i:s', $request->date, 'CST');
|
|
|
|
// Definir inicio y fin en CST (Central Standard Time)
|
|
$startDateCST = $dateCST->copy()->firstOfMonth();
|
|
$endDateCST = $dateCST->copy()->endOfMonth();
|
|
// Convertir las fechas a UTC
|
|
$startDateUTC = $startDateCST->copy()->setTimezone('UTC');
|
|
$endDateUTC = $endDateCST->copy()->setTimezone('UTC');
|
|
|
|
$taxpayer = Taxpayer::where('rfc_id', $rfc->id)->first();
|
|
|
|
$naturalPerson = ['612', '621', '626'];
|
|
|
|
if (in_array($rfc->id, $user->rfcs->pluck('id')->toArray())) {
|
|
if ($request->conciliated) {
|
|
$invoices = Invoice::where('receiver_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'E')
|
|
->whereIn('cancellation_status_id', ['1', '6', '7'])
|
|
->where('payment_type_id', 'PUE')
|
|
->whereHas('conciliations', function($query) use ($rfc, $startDateUTC, $endDateUTC) {
|
|
$query->where('rfc_id', $rfc->id);
|
|
$query->where('is_conciliated', true);
|
|
$query->whereBetween('conciliated_at', [$startDateUTC, $endDateUTC]);
|
|
})
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->where('product_identification', 84121603)
|
|
->orWhere('product_identification', 93161608);
|
|
})
|
|
->get();
|
|
} else {
|
|
$invoices = Invoice::where('receiver_rfc_id', $rfc->id)
|
|
->where('invoice_type_id', 'E')
|
|
->whereIn('cancellation_status_id', ['1', '6', '7'])
|
|
->where('payment_type_id', 'PUE')
|
|
->whereBetween('issued_at', [$startDateUTC, $endDateUTC])
|
|
->whereDoesntHave('invoiceLines', function($query) {
|
|
$query->where('product_identification', 84121603)
|
|
->orWhere('product_identification', 93161608);
|
|
})
|
|
->get();
|
|
}
|
|
|
|
return response()->json([
|
|
'total' => round($invoices->sum('total_in_mxn'), 2),
|
|
'tax' => round($invoices->sum('tax_in_mxn'), 2),
|
|
'transferred_vat' => round($invoices->sum('transferred_vat_in_mxn'), 2),
|
|
'retained_vat' => round($invoices->sum('retained_vat_in_mxn'), 2),
|
|
'invoicesE' => $invoices
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function obtenerMetricas(Request $request) {
|
|
|
|
$user = $request->user();
|
|
//$user = User::where('email', strip_tags($request->email))->first();
|
|
$rfc = Rfc::where('rfc', strip_tags($request->rfc))->first();
|
|
|
|
if (in_array($rfc->id, $user->rfcs->pluck('id')->toArray())) {
|
|
$ingresoI = $this->ingresoTipoI($request)->getOriginalContent();
|
|
$ingresoE = $this->ingresoTipoE($request)->getOriginalContent();
|
|
$ingresoPpd = $this->invoicePaymentController->ingresoPpd($request)->getOriginalContent();
|
|
|
|
$gastoI = $this->gastoTipoI($request)->getOriginalContent();
|
|
$gastoE = $this->gastoTipoE($request)->getOriginalContent();
|
|
$gastoN = $this->gastoTipoN($request)->getOriginalContent();
|
|
$gastoPpd = $this->invoicePaymentController->gastoPpd($request)->getOriginalContent();
|
|
|
|
$ivaIngresoI = $this->ivaIngresoTipoI($request)->getOriginalContent();
|
|
$ivaIngresoE = $this->ivaIngresoTipoE($request)->getOriginalContent();
|
|
$ivaIngresoPpd = $this->invoicePaymentController->ivaIngresoPpd($request)->getOriginalContent();
|
|
|
|
$ivaGastoI = $this->ivaGastoTipoI($request)->getOriginalContent();
|
|
$ivaGastoE = $this->ivaGastoTipoE($request)->getOriginalContent();
|
|
|
|
$adquisicionPue = $this->adquisicionPue($request)->getOriginalContent();
|
|
$adquisicionPpd = $this->invoicePaymentController->adquisicionPpd($request)->getOriginalContent();
|
|
|
|
$ingresoIsr = $ingresoI['total'] - $ingresoI['transferred_vat'] + $ingresoI['retained_vat'] - $ingresoI['transferred_sin_tax'] - $ingresoE['total'] + $ingresoE['transferred_vat'] + $ingresoE['transferred_sin_tax'] + $ingresoPpd['amount'] - $ingresoPpd['transferred_vat_ppd'];
|
|
$gastoIsr = $gastoI['total'] - $gastoI['transferred_vat'] + $gastoI['retained_vat'] - $gastoI['transferred_sin_tax'] - $gastoE['total'] + $gastoE['transferred_vat'] + $gastoE['transferred_sin_tax']
|
|
+ $gastoN['total'] + $gastoPpd['amount'] - $gastoPpd['transferred_vat_ppd'];
|
|
$ingresoIva = $ivaIngresoI['total'] - $ivaIngresoI['transferred_vat'] +$ivaIngresoI['retained_vat'] - $ivaIngresoE['total'] + $ivaIngresoE['transferred_vat'] + $ivaIngresoPpd['amount'] - $ivaIngresoPpd['transferred_vat_ppd'];
|
|
$gastoIva = $ivaGastoI['total'] - $ivaGastoI['tax'] - $ivaGastoE['total'] + $ivaGastoE['tax'] + $gastoPpd['amount'] - $gastoPpd['transferred_vat_ppd'];
|
|
$ivaFavor = $gastoI['transferred_vat'] - $gastoE['transferred_vat'] + $gastoPpd['transferred_vat_ppd'];
|
|
$ivaContra = $ivaIngresoI['transferred_vat'] - $ivaIngresoE['transferred_vat'] + $ivaIngresoPpd['transferred_vat_ppd'];
|
|
$ivaRetenido = $ivaGastoI['retained_vat'] - $ivaGastoE['retained_vat'] + $ivaIngresoPpd['retained_vat_ppd'] + $gastoPpd['retained_vat_ppd'];
|
|
$isrRetenido = $gastoI['retained_income_tax'] - $gastoE['retained_income_tax'] + $gastoPpd['retained_income_tax'];
|
|
$utilidadAntesImpuestos = $ingresoIsr - $gastoIsr;
|
|
$adquisicionMercancia = ($adquisicionPue['total'] - $adquisicionPue['tax']) + ($adquisicionPpd['total'] - $adquisicionPpd['tax']);
|
|
|
|
return response()->json([
|
|
"ingresoISR" => round($ingresoIsr, 2),
|
|
"gastoISR" => round($gastoIsr, 2),
|
|
"utilidadAntesImpuestos" => round($utilidadAntesImpuestos, 2),
|
|
"ingresoIVA" => round($ingresoIva, 2),
|
|
"gastoIVA" => round($gastoIva, 2),
|
|
"ivaFavor" => round($ivaFavor, 2),
|
|
"ivaContra" => round($ivaContra, 2),
|
|
"ivaRetenido" => round($ivaRetenido, 2),
|
|
"isrRetenido" => round($isrRetenido, 2),
|
|
"adquisicionMercancia" => round($adquisicionMercancia, 2),
|
|
"ivaIngresoI" => $ivaIngresoI,
|
|
"ivaIngresoE" => $ivaIngresoE,
|
|
'ivaIngresoPpd' => $ivaIngresoPpd,
|
|
"ivaGastoI" => $ivaGastoI,
|
|
"ingresoI" => $ingresoI,
|
|
"ingresoE" => $ingresoE,
|
|
"ingresoPpd" => $ingresoPpd,
|
|
"gastoI" => $gastoI,
|
|
"gastoE" => $gastoE,
|
|
"gastoN" => $gastoN,
|
|
"gastoPpd" => $gastoPpd,
|
|
"adquisicionPue" => $adquisicionPue,
|
|
"adquisicionPpd" => $adquisicionPpd
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function obtenerMetricasMensuales(Request $request) {
|
|
|
|
$user = $request->user();
|
|
//$user = User::where('email', strip_tags($request->email))->first();
|
|
|
|
$startDate = Carbon::parse($request->startDate); // Fecha de inicio (ejemplo: 1 enero 2025)
|
|
$endDate = Carbon::parse($request->endDate); // Fecha de fin (ejemplo: 31 diciembre 2025)
|
|
|
|
// Array donde guardaremos los totales por mes
|
|
$monthlyTotals = [];
|
|
|
|
// Iteramos desde el inicio del rango hasta el final
|
|
$currentDate = $startDate->copy();
|
|
$i = 0;
|
|
|
|
while ($currentDate->lessThanOrEqualTo($endDate)) {
|
|
// Obtenemos el inicio del mes actual
|
|
$monthStart = $currentDate->startOfMonth();
|
|
|
|
$requestData = clone $request;
|
|
|
|
$requestData->merge([
|
|
'rfc' => $request->rfc, // Usamos el valor de id_tienda del Request original
|
|
'date' => Carbon::createFromFormat('Y-m-d H:i:s', $currentDate), // Usamos la fecha actual, o la que se necesite
|
|
]);
|
|
|
|
// Llamamos a la función getTotalMonto para ese mes
|
|
$totalMonto = $this->obtenerMetricas($requestData)->getOriginalContent();
|
|
$totalMonto["date"] = $monthStart->format('Y-m');
|
|
|
|
// Guardamos el resultado en el array, usando el formato 'Y-m' como índice
|
|
$monthlyTotals[$i] = $totalMonto;
|
|
|
|
// Avanzamos al siguiente mes
|
|
$currentDate->addMonth();
|
|
$i++;
|
|
}
|
|
|
|
return $monthlyTotals;
|
|
}
|
|
|
|
|
|
/**
|
|
* Display a listing of the resource.
|
|
*
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function index()
|
|
{
|
|
//
|
|
}
|
|
|
|
/**
|
|
* Show the form for creating a new resource.
|
|
*
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function create()
|
|
{
|
|
//
|
|
}
|
|
|
|
/**
|
|
* Store a newly created resource in storage.
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function store(Request $request)
|
|
{
|
|
//
|
|
}
|
|
|
|
/**
|
|
* Display the specified resource.
|
|
*
|
|
* @param \App\Models\Invoice $invoice
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function show(Invoice $invoice)
|
|
{
|
|
//
|
|
}
|
|
|
|
/**
|
|
* Show the form for editing the specified resource.
|
|
*
|
|
* @param \App\Models\Invoice $invoice
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function edit(Invoice $invoice)
|
|
{
|
|
//
|
|
}
|
|
|
|
/**
|
|
* Update the specified resource in storage.
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @param \App\Models\Invoice $invoice
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function update(Request $request, Invoice $invoice)
|
|
{
|
|
//
|
|
}
|
|
|
|
/**
|
|
* Remove the specified resource from storage.
|
|
*
|
|
* @param \App\Models\Invoice $invoice
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function destroy(Invoice $invoice)
|
|
{
|
|
//
|
|
}
|
|
}
|