167 lines
5.5 KiB
PHP
167 lines
5.5 KiB
PHP
|
<?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();
|
||
|
}
|
||
|
}
|