Implementacion de modulo de pedidos

This commit is contained in:
Guillermo Gutierrez
2024-03-30 08:18:49 -07:00
parent f0341c3a61
commit e0b8ecb1f2
43 changed files with 3262 additions and 57 deletions

View File

@@ -12,9 +12,9 @@ class CancelacionController extends Component
use WithPagination;
const CODIGO_CANCELACION = 3;
public $buscador = '' , $modal = false;
public $buscador = '' , $modal = false, $modalDate = false;
public $cancelacion;
public $cancelacion, $created_at;
protected $rules = [
'cancelacion.codigo' => 'min:0',
@@ -71,6 +71,26 @@ class CancelacionController extends Component
$this->closeModal();
}
public function editDate(Movimiento $movimiento)
{
$this->cancelacion = $movimiento;
$this->showModal('modalDate');
}
public function saveDate()
{
$this->validate([
'created_at' => 'required',
]);
$this->cancelacion->created_at = $this->created_at;
$this->cancelacion->save();
session()->flash('message',"La fecha ha sido cambiada correctamente.");
$this->clearInputs();
$this->closeModal('modalDate');
}
public function delete(Movimiento $venta)
{
@@ -82,14 +102,14 @@ class CancelacionController extends Component
}
public function showModal()
public function showModal($modal = "modal")
{
$this->modal = true;
$this->{$modal} = true;
}
public function closeModal()
public function closeModal($modal = "modal")
{
$this->modal = false;
$this->{$modal} = false;
}
public function clearInputs()

View File

@@ -58,7 +58,11 @@ class DashboardController extends Component
Movimiento::where([
['estado_movimiento_id','=', $tipo_movimiento],
[DB::raw('DATE(created_at)'),'=',Carbon::now()->format('Y-m-d')],
])->sum('pago_vales');
])->sum('pago_vales') +
Movimiento::where([
['estado_movimiento_id','=', $tipo_movimiento],
[DB::raw('DATE(created_at)'),'=',Carbon::now()->format('Y-m-d')],
])->sum('pago_transferencia');
}
public function validarCaja()

View File

@@ -0,0 +1,102 @@
<?php
namespace App\Http\Livewire;
use App\Models\Impresora;
use App\Models\User;
use App\Printer\PrinterHandler;
use Livewire\Component;
use Mike42\Escpos\PrintConnectors\WindowsPrintConnector;
use Mike42\Escpos\Printer;
class ImpresoraController extends Component
{
public $impresora, $impresoraUser;
public $modal = false;
protected $rules = [
'impresora.estacion' => 'required',
'impresora.nombre_impresora' => 'required',
'impresora.is_compartida' => 'required'
];
public function render()
{
$impresoraUser = auth()->user()->impresora_id;
return view('impresora.impresora',[
'impresoras' => Impresora::paginate(10),
]);
}
public function create()
{
$this->impresora = new Impresora();
$this->impresora->is_compartida = false;
$this->openModal();
}
public function saveImpresora()
{
$user = User::findOrFail(auth()->user()->id);
$user->impresora_id = $this->impresoraUser;
$user->save();
session()->flash('messageImpresora','Impresora vinculada correctamente.');
}
public function save()
{
$this->validate([
'impresora.estacion' => 'required',
]);
if($this->impresora->is_compartida)
{
$this->validate([
'impresora.nombre_impresora' => 'required'
]);
}
else if(!is_numeric($this->impresora->nombre_impresora))
{
$this->impresora->nombre_impresora = 9100;
}
$this->impresora->save();
session()->flash('message','La impresora se guardo correctamente.');
$this->closeModal();
$this->clearInputs();
}
public function imprimir(Impresora $impresora)
{
try {
$printer = new PrinterHandler($impresora, $impresora->is_compartida?PrinterHandler::PRINTER_BY_SHARED:PrinterHandler::PRINTER_BY_IP);
// 32 caracteres
$printer->testPage();
session()->flash('message','Impresion enviada a: '.'smb://'.$impresora->estacion.'/'.$impresora->nombre_impresora);
} catch (\Throwable $th) {
session()->flash('error','No se pudo establecer conexión con la impresora, verifica configuración.'.$th->getMessage());
}
}
public function delete(Impresora $impresora)
{
$impresora->delete();
session()->flash('message','La impresora se ha eliminado correctamente.');
}
public function openModal()
{
$this->modal = true;
}
public function closeModal()
{
$this->modal = false;
}
public function clearInputs()
{
$this->reset();
}
}

View File

@@ -0,0 +1,410 @@
<?php
namespace App\Http\Livewire;
use App\Models\Impresora;
use App\Models\Movimiento;
use App\Models\Pedido;
use App\Models\Producto;
use App\Models\Ruta;
use App\Printer\PrinterHandler;
use Carbon\Carbon;
use Illuminate\Support\Collection;
use Livewire\Component;
class PedidoController extends Component
{
public $buscador ="", $buscadorProducto = "" ,$modal = false, $modalPedido = false;
public $pedido, $productos = [],$totalPagar = 0, $IVA = 0, $ventaEspecial;
public $pago_efectivo, $cambio;
public $totals = [];
protected $rules =[
'productos.*.linea' => 'required',
'productos.*.codigo' => 'required',
'productos.*.descripcion' => 'required',
'productos.*.ruta_id' => 'required',
'productos.*.cantidad' => 'required',
'productos.*.precio_unitario' => 'required',
'pedido.cuenta' => 'required',
'pedido.folio_proveedor' => 'required',
'pedido.telefono' => 'required',
'pedido.year' => 'required',
'pedido.marca' => 'required',
'pedido.modelo' => 'required',
'pedido.motor' => 'required',
'pedido.user_id' => 'required',
'pedido.comentarios' => 'required',
'pedido.numero_remision' => 'required',
'totals.*' => 'required',
'ventaEspecial.codigo' => 'min:0',
'ventaEspecial.pago_efectivo' => 'numeric',
'ventaEspecial.pago_tarjeta' => 'numeric',
'ventaEspecial.pago_vales' => 'numeric',
'ventaEspecial.precio_venta' => 'numeric',
'ventaEspecial.pago_transferencia' => 'numeric',
'ventaEspecial.nota_credito' => 'numeric',
'ventaEspecial.estado_movimiento_id' => 'numeric',
];
protected $messages = [
'productos.*.linea.required' => 'Campo obligatorio.',
'productos.*.codigo.required' => 'Campo obligatorio.',
'productos.*.descripcion.required' => 'Campo obligatorio.',
'productos.*.ruta_id.required' => 'Campo obligatorio.',
'productos.*.cantidad.required' => 'Campo obligatorio.',
'productos.*.precio_unitario.required' => 'Campo obligatorio.',
'productos.*.unidades.required' => 'Campo obligatorio.',
'productos.*.linea.max' => 'Campo debe ser menor a :max.',
'productos.*.codigo.max' => 'Campo debe ser menor a :max.',
'productos.*.descripcion.max' => 'Campo debe ser menor a :max.',
'productos.*.ruta_id.max' => 'Campo debe ser menor a :max.',
'productos.*.cantidad.max' => 'Campo debe ser menor a :max.',
'productos.*.precio_unitario.max' => 'Campo debe ser menor a :max.',
];
protected $listeners = ['agregar','save','saveArrivo','cerrarVenta','entregarVenta'];
public function render()
{
if($this->buscador != "")
{
$pedidos = Pedido::where('pedido','like','%'.$this->buscador.'%')
->orderBy('is_venta_cerrada','asc')
->orderBy('is_venta_entregada','asc')
->orderBy('id','desc')
->paginate(10);
}
else
{
$pedidos = Pedido::Where('user_id',"=",auth()->user()->id)
->orderBy('is_venta_cerrada','ASC')
->orderBy('is_venta_entregada','ASC')
->orderBy('id','desc')
->paginate(10);
}
return view('pedido.pedido',[
// 'pedidos' => Pedido::where('pedido','like','%'.$this->buscador.'%')->orWhere('user_id',"=",auth()->user()->id)->orderBy('id','desc')->paginate(10),
'pedidos' => $pedidos,
'productosList' => Producto::where('descripcion','like','%'.$this->buscadorProducto.'%')
->orWhere('codigo','like','%'.$this->buscadorProducto.'%')->paginate(10),
'rutas' => Ruta::all(),
]);
}
public function create()
{
$this->reset();
$this->pago_efectivo = 0;
$this->cambio = 0;
$this->pedido = new Pedido();
$this->ventaEspecial = new Movimiento([
'codigo' => 0,
'pago_efectivo' => 0,
'pago_tarjeta' => 0,
'pago_vales' => 0,
'pago_transferencia' => 0,
'nota_credito' => 0,
'precio_venta' => 0,
'estado_movimiento_id' => VentaEspecialController::CODIGO_VENTA_ESPECIAL,
]);
$this->showModal();
}
public function agregar($id = '')
{
// if(auth()->user()->hasRole('admin'))
$this->buscadorProducto = '';
$this->productos[] = Producto::firstOrNew(['id' => $id]);
$this->totals[] = 0;
$this->emit('addProductEvent');
}
public function agregarProductoArrivo($id = '')
{
if(auth()->user()->hasRole('admin'))
{
$this->buscadorProducto = '';
$this->productos[] = Producto::firstOrNew(['id' => $id]);
$this->totals[] = 0;
$this->emit('addProductEvent');
}
}
public function total($id)
{
return ((key_exists('cantidad',$this->productos[$id]) && key_exists('precio_unitario',$this->productos[$id]) ) &&
(is_numeric($this->productos[$id]['cantidad']) && is_numeric($this->productos[$id]['precio_unitario'])))
?$this->productos[$id]['cantidad'] * $this->productos[$id]['precio_unitario']
:'0';
}
public function updatedPagoEfectivo($value)
{
if($value)
{
$this->cambio = $this->pago_efectivo - $this->ventaEspecial->pago_efectivo;
}
}
public function updatedProductos($value, $key)
{
$key = intval(explode('.',$key)[0]);
$this->totals[$key] = $this->total($key);
if($this->totals[$key] != 0)
{
$this->updateTotal($this->totals);
}
}
public function updateTotal($totals)
{
$total = array_sum(array_filter($totals,'is_numeric'));
$this->totalPagar = $total/1.08;
$this->IVA = $this->totalPagar*0.08;
$this->totalPagar += $this->IVA;
}
public function updatedModal()
{
if(!$this->modal){
$this->clearInputs();
}
}
public function updatedModalPedido()
{
if(!$this->modalPedido){
$this->clearInputs();
}
}
public function show(Pedido $pedido)
{
// dd($pedido->is_venta_cerrada,$pedido->is_venta_entregada);
$this->totalPagar = 0;
$this->IVA = 0;
$this->pedido = $pedido;
foreach ($this->pedido->productos as $producto) {
$producto->unidades = $producto->pivot->unidades;
$producto->precio_unitario = $producto->pivot->precio_unitario;
$producto->producto_id = $producto->pivot->producto_id;
$producto->is_arrivo = $producto->pivot->is_arrivo;
$this->productos[] = $producto;
$this->totalPagar+= ($producto->pivot->unidades*$producto->pivot->precio_unitario);
}
$this->totalPagar/= 1.08;
$this->IVA = $this->totalPagar*0.08;
$this->totalPagar += $this->IVA;
$this->showModal('modalPedido');
}
public function save()
{
if(!$this->productos)
{
return;
}
$this->pedido->user_id = auth()->user()->id;
$this->validate([
'pedido.cuenta' => 'required',
'pedido.telefono' => 'required',
'pedido.year' => 'required',
'pedido.marca' => 'required',
'pedido.modelo' => 'required',
'pedido.motor' => 'required',
'productos.*.linea' => 'required|max:20',
'productos.*.codigo' => 'required|max:20',
'productos.*.descripcion' => 'required|max:100',
'productos.*.ruta_id' => 'required',
'productos.*.cantidad' => 'required|max:4',
'productos.*.precio_unitario' => 'required|max:8',
'ventaEspecial.pago_efectivo' => 'numeric',
'ventaEspecial.pago_tarjeta' => 'numeric',
'ventaEspecial.pago_vales' => 'numeric',
'ventaEspecial.pago_transferencia' => 'numeric',
'ventaEspecial.nota_credito' => 'numeric',
'ventaEspecial.estado_movimiento_id' => 'numeric',
]);
$this->pedido->is_venta_cerrada = 0;
$this->pedido->is_venta_entregada = 0;
$this->pedido->save();
$this->ventaEspecial->user_id = auth()->user()->id;
$this->ventaEspecial->precio_venta = $this->totalPagar;
$this->ventaEspecial->codigo = $this->pedido->pedido;
$this->ventaEspecial->save();
// $this->ventaEspecial->save();
foreach ($this->productos as $producto) {
$productoCreated = Producto::firstOrCreate(
['linea' => $producto['linea'], 'codigo' => $producto['codigo']],
[
'linea' => $producto['linea'],
'codigo' => $producto['codigo'],
'descripcion' => $producto['descripcion'],
'ruta_id' => $producto['ruta_id'],
'precio_unitario' => $producto['precio_unitario'],
]
);
$productoCreated->precio_unitario = $producto['precio_unitario'];
$productoCreated->save();
$this->pedido->productos()->attach($productoCreated->id,['unidades' => $producto['cantidad'], 'precio_unitario' => $producto['precio_unitario'], 'is_arrivo' => false]);
}
$this->pedido->cambio = $this->cambio;
// $this->imprimirTicket($this->pedido);
// $this->imprimirTicket($this->pedido,false);
session()->flash('message','El pedido se ha generado correctamente.');
$this->closeModal();
$this->clearInputs();
}
public function entregarVenta()
{
$this->pedido->is_venta_entregada = true;
$this->pedido->venta_entregada_user_id = auth()->user()->id;
$this->pedido->venta_entregada_at = Carbon::now();
$this->pedido->save();
$this->closeModal('modalPedido');
session()->flash('message','El pedido se ha entregado correctamente.');
$this->clearInputs();
}
public function cerrarVenta()
{
if(!$this->pedido->is_venta_entregada)
{
session()->flash('error','No puedes cerrar la venta si no la has entregado.');
$this->closeModal('modalPedido');
return;
}
$this->pedido->is_venta_cerrada = true;
$this->pedido->venta_cerrada_user_id = auth()->user()->id;
$this->pedido->venta_cerrada_at = Carbon::now();
$this->pedido->save();
$this->closeModal('modalPedido');
session()->flash('message','El pedido se ha cerrado correctamente.');
$this->clearInputs();
}
public function saveArrivo()
{
if(auth()->user()->hasRole('admin'))
{
$this->validate([
'pedido.cuenta' => 'required',
'pedido.telefono' => 'required',
'pedido.year' => 'required',
'pedido.marca' => 'required',
'pedido.modelo' => 'required',
'pedido.motor' => 'required',
'productos.*.linea' => 'required|max:20',
'productos.*.codigo' => 'required|max:20',
'productos.*.descripcion' => 'required|max:100',
'productos.*.ruta_id' => 'required',
'productos.*.unidades' => 'required|max:10',
'productos.*.precio_unitario' => 'required|max:8',
]);
foreach ($this->productos as $index => $producto) {
$productoCreado = Producto::updateOrCreate(
['id' => $producto['id']??""],
[
'linea' => $producto['linea'],
'codigo' => $producto['codigo'],
'descripcion' => $producto['descripcion'],
'ruta_id' => $producto['ruta_id'],
'precio_unitario' => $producto['precio_unitario'],
]
);
$this->productos[$index]['producto_id'] = $productoCreado->id;
$this->productos[$index]['id'] = $productoCreado->id;
}
}
// if(auth()->user()->hasRole('admin'))
// {
$this->validate([
'pedido.cuenta' => 'required',
'pedido.telefono' => 'required',
'pedido.year' => 'required',
]);
$this->pedido->save();
$productosSync = [];
foreach ($this->productos as $producto) {
$productosSync[$producto['id']] = [
'unidades' => $producto['unidades'],
'precio_unitario' => $producto['precio_unitario'],
'is_arrivo' => $producto['is_arrivo'] ?? 0
];
}
$this->pedido->productos()->sync($productosSync);
session()->flash('message','El pedido se ha actualizado correctamente.');
// }
$this->closeModal('modalPedido');
$this->clearInputs();
}
public function delete(Pedido $pedido)
{
if(auth()->user()->hasRole('admin'))
{
$pedido->productos()->detach();
$pedido->delete();
session()->flash('message','El pedido se ha eliminado correctamente.');
}
}
public function eliminarProducto($id)
{
unset($this->productos[$id]);
unset($this->totals[$id]);
}
public function imprimirTicket(Pedido $pedido,$hashed = true)
{
// foreach ($pedido->productos as $producto) {
// dd('Codigo:'.$producto->codigo.' desc:'.substr($producto->descripcion,0,11).' Cant:'.$producto->pivot->unidades.' Total:'.round($producto->pivot->unidades*$producto->pivot->precio_unitario/1.16,2));
// // dd($producto->pivot);
// }
// try {
$impresora = Impresora::findOrFail(auth()->user()->impresora_id);
$printer = new PrinterHandler($impresora,$impresora->is_compartida?PrinterHandler::PRINTER_BY_SHARED:PrinterHandler::PRINTER_BY_IP);
$printer->printPedido($pedido,$hashed);
$printer->feed();
$printer->cut();
$printer->close();
// } catch (\Throwable $th) {
// throw $th;
// }
}
public function showModal($modal = 'modal')
{
$this->{$modal} = true;
}
public function closeModal($modal = 'modal')
{
$this->{$modal} = false;
}
public function clearInputs()
{
$this->reset();
}
}

View File

@@ -0,0 +1,63 @@
<?php
namespace App\Http\Livewire;
use App\Exports\PedidosExport;
use App\Models\Pedido;
use Carbon\Carbon;
use Livewire\Component;
use Maatwebsite\Excel\Facades\Excel;
class ReportePedidoController extends Component
{
public $fecha_inicio, $fecha_final;
public $fn_inicio, $fn_final;
public $is_venta_cerrada = "", $is_venta_entregada ="";
public function render()
{
$query = Pedido::query();
$query->when($this->is_venta_entregada, function ($query) {
return $query->where('is_venta_entregada',"=",$this->is_venta_entregada);
});
$query->when($this->is_venta_cerrada, function ($query) {
return $query->where('is_venta_cerrada',"=",$this->is_venta_cerrada);
});
$query->when(($this->fn_inicio && $this->fn_final), function ($query) {
return $query->whereBetween('created_at', [$this->fn_inicio, $this->fn_final]);
});
return view('pedido.reporte-pedido',[
'pedidos' => $query->get(),
]);
}
public function updatedFechaInicio()
{
$this->fn_inicio= Carbon::parse($this->fecha_inicio)->startOfDay();
}
public function updatedFechaFinal()
{
$this->fn_final= Carbon::parse($this->fecha_final)->endOfDay();
}
public function export()
{
$query = Pedido::query();
$query->when($this->is_venta_entregada, function ($query) {
return $query->where('is_venta_entregada',"=",$this->is_venta_entregada);
});
$query->when($this->is_venta_cerrada, function ($query) {
return $query->where('is_venta_cerrada',"=",$this->is_venta_cerrada);
});
$query->when(($this->fn_inicio && $this->fn_final), function ($query) {
return $query->whereBetween('created_at', [$this->fn_inicio, $this->fn_final]);
});
return Excel::download(new PedidosExport($this->fn_inicio, $this->fn_final,$this->is_venta_cerrada,$this->is_venta_entregada),'pedido-'.Carbon::now()->format('Y-m-d').'.xlsx');
}
}

View File

@@ -0,0 +1,79 @@
<?php
namespace App\Http\Livewire;
use App\Models\Ruta;
use Livewire\Component;
class RutaController extends Component
{
public $ruta, $buscador, $modal = false;
protected $rules = [
'ruta.ruta' => 'required',
'ruta.prefijo' => 'required',
];
public function render()
{
$rutas = Ruta::where('ruta','like','%'.$this->buscador.'%')->paginate(10);
return view('ruta.ruta',[
'rutas' => $rutas,
]);
}
public function create()
{
$this->clearInputs();
$this->ruta = new Ruta();
$this->showModal();
}
public function save()
{
$this->validate([
'ruta.ruta' => 'required|max:50',
'ruta.prefijo' => 'required|max:10',
]);
$id = $this->ruta->id;
$this->ruta->save();
session()->flash('message',$id?"La ruta se a modificado correctamente.":"La ruta se ha registrado correctamente!");
$this->clearInputs();
$this->closeModal();
}
public function edit(Ruta $ruta)
{
$this->ruta = $ruta;
$this->showModal();
}
public function delete(Ruta $ruta)
{
if(auth()->user()->hasRole('admin'))
{
$ruta->delete();
session()->flash('message',"La ruta se ha eliminado del sistema.");
}
}
public function showModal()
{
$this->modal = true;
}
public function closeModal()
{
$this->modal = false;
}
public function clearInputs()
{
$this->reset();
}
}

View File

@@ -58,7 +58,7 @@ class UserController extends Component
}
$this->validate([
'user.name' => 'required|min:3',
'password' => 'required|min:6'
// 'password' => 'required|min:6'
]);
$this->user->password = Hash::make($this->password);

View File

@@ -14,8 +14,8 @@ class VentaController extends Component
const CODIGO_VENTA = 1;
public $buscador = '', $modal = false;
public $venta, $cambio, $faltante;
public $buscador = '', $modal = false, $modalDate = false;
public $venta, $cambio, $faltante, $created_at;
protected $rules = [
'venta.codigo' => 'min:0',
@@ -24,6 +24,7 @@ class VentaController extends Component
'venta.pago_vales' => 'numeric',
'venta.precio_venta' => 'required|numeric|gte:1',
'venta.pago_transferencia' => 'numeric',
'venta.nota_credito' => 'numeric',
'venta.estado_movimiento_id' => 'numeric',
'venta.user_id',
];
@@ -52,6 +53,7 @@ class VentaController extends Component
'pago_tarjeta' => 0,
'pago_vales' => 0,
'pago_transferencia' => 0,
'nota_credito' => 0,
'estado_movimiento_id' => 1,
]);
$this->cambio;
@@ -74,6 +76,33 @@ class VentaController extends Component
}
}
public function calcularTotalPagar($venta)
{
return ((float)$venta->precio_venta - ((float)$venta->pago_efectivo +
(float)$venta->pago_tarjeta + (float)$venta->pago_vales +
(float)$venta->pago_transferencia + (float)$venta->nota_credito));
}
public function editDate(Movimiento $movimiento)
{
$this->venta = $movimiento;
$this->showModal('modalDate');
}
public function saveDate()
{
$this->validate([
'created_at' => 'required',
]);
$this->venta->created_at = $this->created_at;
$this->venta->save();
session()->flash('message',"La fecha ha sido cambiada correctamente.");
$this->clearInputs();
$this->closeModal('modalDate');
}
public function save()
{
$this->validate([
@@ -82,6 +111,7 @@ class VentaController extends Component
'venta.pago_tarjeta' => 'required|numeric',
'venta.pago_vales' => 'numeric',
'venta.pago_transferencia' => 'numeric',
'venta.nota_credito' => 'numeric',
'venta.estado_movimiento_id' => 'numeric',
]);
@@ -91,6 +121,12 @@ class VentaController extends Component
return;
}
if($this->calcularTotalPagar($this->venta)>0)
{
session()->flash("error","El pago debe ser igual o mayor a la venta.");
return;
}
$this->venta->ajusteCambio();
$this->venta->user_id = Auth::user()->id;
@@ -112,15 +148,14 @@ class VentaController extends Component
}
}
public function showModal()
public function showModal($modal = "modal")
{
$this->modal = true;
$this->{$modal} = true;
}
public function closeModal()
public function closeModal($modal = "modal")
{
$this->modal = false;
$this->{$modal} = false;
}
public function clearInputs()

View File

@@ -12,7 +12,7 @@ class VentaEspecialController extends Component
use WithPagination;
const CODIGO_VENTA_ESPECIAL = 2;
public $buscador = '', $modal = false, $modalLiquidar;
public $buscador = '', $modal = false, $modalDate = false, $created_at, $modalLiquidar;
public $ventaEspecial, $total_pagar, $ventaAnterior, $abonado, $cambio, $faltante;
protected $rules = [
@@ -22,6 +22,7 @@ class VentaEspecialController extends Component
'ventaEspecial.pago_vales' => 'numeric',
'ventaEspecial.precio_venta' => 'numeric',
'ventaEspecial.pago_transferencia' => 'numeric',
'ventaEspecial.nota_credito' => 'numeric',
'ventaEspecial.estado_movimiento_id' => 'numeric',
];
@@ -47,6 +48,7 @@ class VentaEspecialController extends Component
'pago_tarjeta' => 0,
'pago_vales' => 0,
'pago_transferencia' => 0,
'nota_credito' => 0,
'precio_venta' => 0,
'estado_movimiento_id' => VentaEspecialController::CODIGO_VENTA_ESPECIAL,
@@ -64,6 +66,7 @@ class VentaEspecialController extends Component
'pago_tarjeta' => 0,
'pago_vales' => 0,
'pago_transferencia' => 0,
'nota_credito' => 0,
'precio_venta' => $this->ventaAnterior->faltante(),
'estado_movimiento_id' => VentaEspecialController::CODIGO_VENTA_ESPECIAL,
]);
@@ -93,7 +96,9 @@ class VentaEspecialController extends Component
public function calcularTotalPagar($venta)
{
return ($venta->precio_venta - $venta->pago_efectivo - $venta->pago_tarjeta - $venta->pago_vales - $venta->pago_transferencia);
return ((float)$venta->precio_venta - ((float)$venta->pago_efectivo +
(float)$venta->pago_tarjeta + (float)$venta->pago_vales +
(float)$venta->pago_transferencia + (float)$venta->nota_credito));
}
@@ -104,6 +109,7 @@ class VentaEspecialController extends Component
'ventaEspecial.pago_tarjeta' => 'numeric',
'ventaEspecial.pago_vales' => 'numeric',
'ventaEspecial.pago_transferencia' => 'numeric',
'ventaEspecial.nota_credito' => 'numeric',
'ventaEspecial.precio_venta' => 'numeric|gte:2',
'ventaEspecial.estado_movimiento_id' => 'numeric',
]);
@@ -124,10 +130,12 @@ class VentaEspecialController extends Component
'ventaEspecial.pago_tarjeta' => 'numeric',
'ventaEspecial.pago_vales' => 'numeric',
'ventaEspecial.pago_transferencia' => 'numeric',
'ventaEspecial.nota_credito' => 'numeric',
'ventaEspecial.precio_venta' => 'numeric|gte:2',
'ventaEspecial.estado_movimiento_id' => 'numeric',
]);
if(($this->calcularTotalPagar($this->ventaEspecial) - $this->ventaAnterior->totalAbono()) >0){
session()->flash("message_abono","Debes liquidar la deuda para cerrarla.");
return;
@@ -137,7 +145,7 @@ class VentaEspecialController extends Component
session()->flash("error","Pago diferente al efectivo no pueden superar el total de venta.");
return;
}
$this->ventaAnterior->is_liquidado = true;
$this->ventaAnterior->save();
@@ -156,6 +164,26 @@ class VentaEspecialController extends Component
$this->closeModalLiquidar();
}
public function editDate(Movimiento $movimiento)
{
$this->ventaEspecial = $movimiento;
$this->showModal('modalDate');
}
public function saveDate()
{
$this->validate([
'created_at' => 'required',
]);
$this->ventaEspecial->created_at = $this->created_at;
$this->ventaEspecial->save();
session()->flash('message',"La fecha ha sido cambiada correctamente.");
$this->clearInputs();
$this->closeModal('modalDate');
}
public function delete(Movimiento $venta)
{
@@ -167,14 +195,14 @@ class VentaEspecialController extends Component
}
public function showModal()
public function showModal($modal = "modal")
{
$this->modal = true;
$this->{$modal} = true;
}
public function closeModal()
public function closeModal($modal = "modal")
{
$this->modal = false;
$this->{$modal} = false;
}
public function showModalLiquidar()

17
app/Models/Impresora.php Normal file
View File

@@ -0,0 +1,17 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Impresora extends Model
{
use HasFactory;
protected $fillable = [
'estacion',
'nombre_impresora',
'is_compartida',
];
}

View File

@@ -16,6 +16,7 @@ class Movimiento extends Model
'pago_vales',
'pago_transferencia',
'precio_venta',
'nota_credito',
'estado_movimiento_id',
'user_id',
'is_liquidado',
@@ -38,7 +39,8 @@ class Movimiento extends Model
return ((float)$this->pago_efectivo +
(float)$this->pago_tarjeta +
(float)$this->pago_vales +
(float)$this->pago_transferencia);
(float)$this->pago_transferencia +
(float)$this->nota_credito);
}
public function cambio()
@@ -47,6 +49,7 @@ class Movimiento extends Model
((float)$this->pago_efectivo +
(float)$this->pago_tarjeta +
(float)$this->pago_vales +
(float)$this->nota_credito +
(float)$this->pago_transferencia) -
(float)$this->precio_venta
);
@@ -59,7 +62,8 @@ class Movimiento extends Model
((float)$this->pago_efectivo +
(float)$this->pago_tarjeta +
(float)$this->pago_vales +
(float)$this->pago_transferencia)
(float)$this->pago_transferencia +
(float)$this->nota_credito)
);
}
@@ -79,6 +83,30 @@ class Movimiento extends Model
public function isTotalMayorCambio() : bool
{
return ($this->pago_tarjeta + $this->pago_vales + $this->pago_transferencia)>$this->precio_venta;
return ($this->pago_tarjeta + $this->pago_vales + $this->pago_transferencia + $this->nota_credito)>$this->precio_venta;
}
public function getAbonos()
{
$collecion = collect($this->getFillable());
$elements = [];
foreach ($collecion as $value) {
if(str_contains($value,"pago_"))
{
if($this->{$value} > 0)
{
$elements[] = [$this->{$value},str_replace("pago_","",$value)];
}
}
else if(str_contains($value,"nota_credito"))
{
if($this->{$value} > 0)
{
$elements[] = [$this->{$value},str_replace("nota_","Nota de ",$value)];
}
}
}
return $elements;
}
}

78
app/Models/Pedido.php Normal file
View File

@@ -0,0 +1,78 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Pedido extends Model
{
use HasFactory;
protected $fillable = [
'cuenta',
'pedido',
'telefono',
'year',
'marca',
'modelo',
'motor',
'folio_proveedor',
'user_id',
'comentarios',
'numero_remision',
'is_venta_cerrada',
'venta_cerrada_user_id',
'is_venta_entregada',
'venta_entregada_user_id',
'venta_cerrada_at',
'venta_entregada_at'
];
public static function boot()
{
parent::boot();
static::created(function ($model){
$model->pedido = 'PE-'.$model->id;
$model->save();
} );
}
public function user()
{
return $this->belongsTo(User::class);
}
public function productos()
{
return $this->belongsToMany(Producto::class,'producto_pedidos','pedido_id','producto_id')->withPivot(['unidades','is_arrivo','precio_unitario']);
}
public function ultimaVenta()
{
return $this->hasOne(Movimiento::class,'codigo','pedido')->latest();
}
public function primeraVenta()
{
return $this->hasOne(Movimiento::class,'codigo','pedido')->first();
}
public function ultimaVentaBy()
{
return $this->ultimaVenta()->where('is_liquidado', '=', '1')->first();
}
public function ventaEntregadaUser()
{
return $this->belongsTo(User::class,'venta_entregada_user_id','id');
}
public function ventaCerradaUser()
{
return $this->belongsTo(User::class,'venta_cerrada_user_id','id');
}
}

30
app/Models/Producto.php Normal file
View File

@@ -0,0 +1,30 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Producto extends Model
{
use HasFactory;
protected $fillable = [
'linea',
'codigo',
'descripcion',
// 'prefijo',
'ruta_id',
'cantidad',
'precio_unitario',
];
public function ruta()
{
return $this->belongsTo(Ruta::class);
}
// public function total()
// {
// return (is_int($this->cantidad) && is_int($this->precio_unitario))?$this->cantidad * $this->precio_unitario:'';
// }
}

16
app/Models/Ruta.php Normal file
View File

@@ -0,0 +1,16 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Ruta extends Model
{
use HasFactory;
protected $fillable = [
'ruta',
'prefijo',
];
}

View File

@@ -28,7 +28,7 @@ class User extends Authenticatable
* @var array<int, string>
*/
protected $fillable = [
'name', 'email', 'password',
'name', 'email', 'password','impresora_id',
];
/**
@@ -60,4 +60,9 @@ class User extends Authenticatable
protected $appends = [
'profile_photo_url',
];
public function impresora()
{
return $this->belongsTo(Impresora::class);
}
}

View File

@@ -0,0 +1,172 @@
<?php
namespace App\Printer;
use App\Models\Impresora;
use App\Models\Pedido;
use Illuminate\Support\Facades\Hash;
use Mike42\Escpos\EscposImage;
use Mike42\Escpos\PrintConnectors\NetworkPrintConnector;
use Mike42\Escpos\PrintConnectors\WindowsPrintConnector;
use Mike42\Escpos\Printer;
class PrinterHandler{
private Impresora $impresora;
private Printer $printer;
private $printerConfig;
const PRINTER_BY_IP = 1;
const PRINTER_BY_SHARED = 2;
public function __construct(Impresora $impresora,$type_printer) {
$this->impresora = $impresora;
if($type_printer == PrinterHandler::PRINTER_BY_IP)
{
$connector = new NetworkPrintConnector($impresora->estacion,$impresora->nombre_impresora);
}
else if($type_printer == PrinterHandler::PRINTER_BY_SHARED)
{
$connector = new WindowsPrintConnector("smb://".$impresora->estacion."/".$impresora->nombre_impresora."");
}
$this->printer = new Printer($connector);
}
public function text(string $message="") : void {
$this->printer->text($message."\n");
}
public function testPage()
{
$img = EscposImage::load('storage/img/proone_print.jpg',false);
$this->printer->bitImage($img);
$this->text("***** ESTRADA AUTOPARTES *****");
$this->text("Pagina de prueba de impresion");
$this->text("Estacion:".$this->impresora->estacion);
$this->text("Nombre Impresora:".$this->impresora->nombre_impresora);
$this->text("Desarrollado por Super Dev Bros");
$this->feed();
$this->cut();
$this->close();
}
public function printImage($path)
{
$img = EscposImage::load($path);
$this->printer->bitImage($img);
}
public function printPedido (Pedido $pedido, $hashed = true)
{
$IVA = 0;
$subTotal = 0;
$total = 0;
$this->printer->setJustification(Printer::JUSTIFY_CENTER);
$this->printImage('storage/img/proone_print.jpg');
$this->feed();
$this->printer -> setTextSize(2, 2);
if($hashed)
{
$this->text("CLIENTE");
}
$this->text("No. Pedido:");
$this->text($pedido->pedido);
$this->printer -> setTextSize(1, 1);
$this->printer->setJustification(Printer::JUSTIFY_CENTER);
$this->feed(1);
$this->text("MIGUEL ANGEL ROMERO ESTRADA");
$this->text("DIEGO ESQUIVEL #130 INT. 3");
$this->text("PLAYAS DE ROSARITO, BC 22706 Mexico");
$this->text("R.F.C. : ROEM691011EZ4");
$this->text("TELEFONOS: (661) 613-5549, (661) 104-4313");
$this->text(" (661) 104-4590, (661) 120-0015");
$this->text("CORREO: ventas@stradaautopartes.com");
$this->printer->setJustification(Printer::JUSTIFY_LEFT);
$this->feed(1);
$this->text("Atendido por: ".$pedido->user->name);
$this->feed(1);
$this->text("---------------- Datos Cliente ----------------");
$this->text("Cuenta: ".$pedido->cuenta);
$this->text("Telefono: ".$pedido->telefono);
$this->text("Fecha: ".now()->format('Y-m-d H:m:s'));
$this->text("Año:".$pedido->year);
$this->text("Marca:".$pedido->marca);
$this->text("Modelo:".$pedido->modelo);
$this->text("Motor:".$pedido->motor);
$this->text("---------------- Datos De Pago ----------------");
foreach ($pedido->primeraVenta()->getAbonos() as $value) {
$this->text("Metodo: ".$value[1]." | Anticipo: ".$value[0]);
}
$this->text("Adeudo: ".$pedido->primeraVenta()->faltante());
// $this->printer->setJustification(Printer::JUSTIFY_CENTER);
$this->text("-------------------- Pedido --------------------");
if($hashed)
{
$this->text('Codigo Linea Descripcion Cant Precio ');
}
else
{
// 48 digitos.
$this->text('Codigo Linea RT Descripcion Cant Precio ');
}
foreach ($pedido->productos as $producto) {
if($hashed)
{
$this->text(str_pad(substr(Hash::make($producto->codigo),0,10),11)."".str_pad($producto->linea,7)."".str_pad(substr($producto->descripcion,0,18),19)."".str_pad(intval($producto->pivot->unidades),5)."".round($producto->pivot->precio_unitario,8));
}
else
{
$this->text(str_pad(substr($producto->codigo ,0,10),11)."".str_pad($producto->linea,6)."".str_pad($producto->ruta->prefijo,5)."".str_pad(substr($producto->descripcion,0,11),12)."".str_pad(intval($producto->pivot->unidades),5)."".round($producto->pivot->precio_unitario,8));
}
// $this->text(str_pad(substr($producto->codigo,0,9),10)."".str_pad($producto->prefijo,6)."".str_pad(substr($producto->descripcion,0,14),15)."".str_pad($producto->pivot->unidades,10)."".round($producto->pivot->unidades*$producto->pivot->precio_unitario/1.16,2));
$subTotal+=$producto->pivot->unidades*$producto->pivot->precio_unitario/1.16;
}
$this->text("________________________________________________");
$IVA = $subTotal*0.16;
$total = round($subTotal+$IVA,2);
$this->feed(1);
$this->printer->setJustification(Printer::JUSTIFY_RIGHT);
$this->text("SubTotal: ".round($subTotal));
$this->text("IVA 8%: ".round($IVA));
$this->text("Total a Pagar: ".$total);
if($pedido->cambio>0)
{
$this->text("Cambio: ".$pedido->cambio);
}
$this->feed(1);
$this->printer->setJustification(Printer::JUSTIFY_CENTER);
$this->text("-------------------COMENTARIOS------------------");
$this->text($pedido->comentarios ?? "");
$this->text("________________________________________________");
$this->feed(1);
$this->text("Revise bien su mercancia, en partes electronicas");
$this->text("no hay garantia, no hay devolucion de efectivo.");
$this->text("Toda orden requiere un anticipo del 50%,");
$this->text("y toda cancelacion se cobrara el 50%");
$this->feed(1);
$this->feed(1);
$this->printer -> setTextSize(2, 2);
$this->text("¡Gracias por su compra!");
}
public function cut()
{
$this->printer->cut();
}
public function close()
{
$this->printer->close();
}
public function feed($lines=2)
{
$this->printer->feed($lines);
}
}

View File

@@ -0,0 +1,58 @@
<?php
namespace App\Exports;
use App\Invoice;
use App\Models\Movimiento;
use App\Models\Pedido;
use Illuminate\Contracts\View\View;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\FromView;
class PedidosExport implements FromView{
public $fecha_inicio, $fecha_final;
public $is_venta_cerrada, $is_venta_entregada;
public function __construct($fecha_inicio, $fecha_final, $is_venta_cerrada, $is_venta_entregada)
{
$this->fecha_inicio = $fecha_inicio;
$this->fecha_final = $fecha_final;
$this->is_venta_cerrada = $is_venta_cerrada;
$this->is_venta_entregada = $is_venta_entregada;
}
public function collection()
{
return Pedido::select(
'pedido',
'cuenta',
'telefono',
'year',
'marca',
'modelo',
'motor',
)->get();
}
public function view(): View
{
$query = Pedido::query();
$query->when($this->is_venta_entregada, function ($query) {
return $query->where('is_venta_entregada',"=",$this->is_venta_entregada);
});
$query->when($this->is_venta_cerrada, function ($query) {
return $query->where('is_venta_cerrada',"=",$this->is_venta_cerrada);
});
$query->when(($this->fecha_inicio && $this->fecha_final), function ($query) {
return $query->whereBetween('created_at', [$this->fecha_inicio, $this->fecha_final]);
});
return view('export.reportePedidoExport',[
// 'pedidos' => Pedido::whereBetween('created_at',[$this->fecha_inicio,$this->fecha_final])->get(),
'pedidos' => $query->get(),
]);
}
}