Files
intranet/app/Controller/Precios.php

167 lines
5.5 KiB
PHP
Raw Normal View History

2020-12-01 17:23:13 -03:00
<?php
namespace App\Controller;
use Carbon\Carbon;
use Stringy\Stringy;
use App\Definition\Controller;
use App\Service\Factory;
use Incoviba\old\Proyecto\Proyecto;
use Incoviba\old\Proyecto\ProyectoTipoUnidad;
use Incoviba\old\Venta\Precio;
use Incoviba\old\Venta\EstadoPrecio;
use Incoviba\old\Venta\Unidad;
use Incoviba\old\Venta\TipoUnidad;
use Incoviba\old\Venta\TipoEstadoPrecio;
class Precios
{
use Controller;
public static function listProyectos()
{
$proyectos = \model(Proyecto::class)->orderByAsc('descripcion')->findMany();
return view('ventas.precios.proyectos', compact('proyectos'));
}
public static function list()
{
$proyecto = \model(Proyecto::class)->findOne(get('proyecto'));
return view('ventas.precios.list', compact('proyecto'));
}
public static function import()
{
$proyectos = \model(Proyecto::class)->orderByAsc('descripcion')->findMany();
return view('ventas.precios.import', compact('proyectos'));
}
public static function importar()
{
$proyecto = \model(Proyecto::class)->findOne(post('proyecto'));
$fecha = Carbon::createFromDate(post('year'), post('month'), post('day'), config('app.timezone'));
$file = explode(PHP_EOL, trim(file_get_contents($_FILES['archivo']['tmp_name'])));
$columnas = explode(';', array_shift($file));
$tr = model(TipoEstadoPrecio::class)->where('descripcion', 'reemplazado')->findOne()->id;
$tv = model(TipoEstadoPrecio::class)->where('descripcion', 'vigente')->findOne()->id;
foreach ($file as $line) {
if (trim($line) == '') {
continue;
}
$info = explode(';', $line);
$tipo = \model(TipoUnidad::class)->where('descripcion', $info[0])->findOne();
$unidad = \model(Unidad::class)->where('tipo', $tipo->id)->where('descripcion', $info[1])->where('proyecto', $proyecto->id)->findOne();
self::reemplazar($unidad->id, $info[2], $fecha, $tr, $tv);
}
header('Location: ' . nUrl('precios', 'list', ['proyecto' => $proyecto->id]));
}
public static function add()
{
$proyecto = \model(Proyecto::class)->findOne(get('proyecto'));
return view('ventas.precios.add', compact('proyecto'));
}
public static function agregar()
{
$proyecto = get('proyecto');
$fecha = Carbon::createFromDate(post('year'), post('month'), post('day'), config('app.timezone'));
$precios = [];
foreach (post() as $name => $valor) {
if ($valor == '' or strpos($name, 'precio') === false) {
continue;
}
list($tipo, $id) = explode(':', $name);
$tipo = trim(str_replace('precio', '', $tipo), '_');
$id = explode('-', $id);
switch (count($id)) {
case 1:
$precios []= ['tipo' => 'pt', 'id' => $id[0], 'valor' => $valor];
break;
case 2:
$exists = false;
foreach ($precios as $precio) {
if ($precio['tipo'] == 'pt' and $precio['id'] == $id[0]) {
$exists = true;
break;
}
}
if (!$exists) {
$precios []= ['tipo' => 'subtipo', 'id' => $id[1], 'pt' => $id[0], 'valor' => $valor];
}
break;
case 3:
$exists = false;
foreach ($precios as $precio) {
if ($precio['tipo'] == 'pt' and $precio['id'] == $id[0]) {
$exists = true;
break;
}
if ($precio['tipo'] == 'subtipo' and 'id' == $id[1] and 'pt' == $id[0]) {
$exists = true;
break;
}
}
if (!$exists) {
$precios []= ['tipo' => 'unidad', 'id' => $id[2], 'valor' => $valor];
}
break;
}
}
foreach ($precios as $precio) {
$precio = (object) $precio;
switch ($precio->tipo) {
case 'pt':
$pt = model(ProyectoTipoUnidad::class)->findOne($precio->id);
$pt->setPrecios($fecha, $precio->valor);
break;
case 'subtipo':
$pt = model(ProyectoTipoUnidad::class)->findOne($precio->pt);
$pt->setPreciosSubtipo($precios->id, $fecha, $precio->valor);
break;
case 'unidad':
$unidad = model(Unidad::class)->findOne($precio->id);
$unidad->setPrecio($fecha, $precio->valor);
break;
}
}
header('Location: ' . nUrl('precios', 'list', ['proyecto' => $proyecto]));
}
protected static function reemplazar(int $unidad_id, float $valor, \DateTime $fecha, int $tr = 0, int $tv = 0)
{
if ($tr == 0) {
$tr = model(TipoEstadoPrecio::class)->where('descripcion', 'reemplazado')->findOne()->id;
}
if ($tv == 0) {
$tv = model(TipoEstadoPrecio::class)->where('descripcion', 'vigente')->findOne()->id;
}
$olds = \model(Precio::class)->where('unidad', $unidad_id)->findMany();
if ($olds !== false) {
foreach ($olds as $old) {
if (!$old->vigente()) {
continue;
}
$data = [
'precio' => $old->id,
'fecha' => $fecha->format('Y-m-d'),
'estado' => $tr
];
$estado = \model(EstadoPrecio::class)->create($data);
$estado->save();
}
}
$data = [
'unidad' => $unidad_id,
'valor' => $valor
];
$precio = (new Factory(Precio::class))->where($data)->find();
if (!$precio) {
$precio = \model(Precio::class)->create($data);
$precio->save();
}
$data = [
'precio' => $precio->id,
'fecha' => $fecha->format('Y-m-d'),
'estado' => $tv
];
$estado = \model(EstadoPrecio::class)->create($data);
$estado->save();
}
}