2021-03-25 21:10:44 -03:00
< ? php
namespace App\Controller ;
2022-03-07 16:36:21 -03:00
use App\Service\Informe\Contabilidad\Resumen ;
2021-03-25 21:10:44 -03:00
use Carbon\Carbon ;
use GuzzleHttp\Client ;
use App\Definition\Controller ;
use App\Alias\PHPExcel ;
2022-03-07 16:36:21 -03:00
use Incoviba\Common\Factory\Model ;
2021-03-25 21:10:44 -03:00
use Incoviba\old\Proyecto\Proyecto ;
use Incoviba\old\Proyecto\Agente ;
use Incoviba\old\Proyecto\ProyectoAgente ;
use Incoviba\old\Venta\Venta ;
use Incoviba\old\Venta\Pie ;
use Incoviba\old\Venta\Credito ;
use Incoviba\old\Venta\Cuota ;
class Informes
{
use Controller ;
protected static function setDefault ()
{
self :: $default = view ( 'informes.list' );
}
public static function gantt_entregas ()
{
if ( get ( 'proyecto' )) {
$id_proyecto = get ( 'proyecto' );
$proyecto = model ( Proyecto :: class ) -> find_one ( $id_proyecto );
$ini = \Carbon\Carbon :: parse ( $proyecto -> estado () -> fecha , config ( 'app.timezone' ));
#$informe = new Informador('Carta Gantt Proyecto - ' . $proyecto->descripcion);
$name = 'Carta Gantt Proyecto - ' . $proyecto -> descripcion ;
$hoy = Carbon :: now ( config ( 'app.timezone' ));
$filename = str_replace ( 'ñ' , 'n' , $name . ' - ' . $hoy -> format ( 'Y-m-d' ) . '.xls' );
$informe = new PHPExcel ( $name , $filename );
$columnas = [ 'Departamento' , 'Propietario' , 'Entrega' , 'Estado' ];
$today = \Carbon\Carbon :: today ( config ( 'app.timezone' ));
$end = $today -> copy () -> addDays ( 30 );
$dif = $end -> diffInDays ( $ini );
for ( $i = 0 ; $i <= $dif ; $i ++ ) {
$f = $ini -> copy () -> addDays ( $i );
if ( $f -> isWeekend ()) {
continue ;
}
$columnas [] = $f -> format ( 'Y-m-d' );
}
$informe -> addColumns ( $columnas );
$data = [];
foreach ( $proyecto -> entregas () as $venta ) {
$info = [];
$info [] = $venta -> unidad () -> descripcion ;
$info [] = $venta -> propietario () -> findOne () -> nombreCompleto ();
$fe = Carbon :: parse ( $venta -> entrega () -> find_one () -> fecha , config ( 'app.timezone' ));
$info [] = $fe -> format ( 'Y-m-d' );
$info [] = '' ;
for ( $i = 0 ; $i <= $dif ; $i ++ ) {
$f = $ini -> copy () -> addDays ( $i );
if ( $f -> isWeekend ()) {
continue ;
}
if ( $f >= $fe and $f <= $fe -> copy () -> addDays ( 14 )) {
$info [] = 'X' ;
} else {
$info [] = '' ;
}
}
$data [] = $info ;
}
$informe -> addDatas ( $data );
return $informe -> informe ();
} else {
$proyectos = model ( Proyecto :: class ) -> order_by_asc ( 'descripcion' ) -> find_many ();
return view ( 'informes.gantt_entregas' , compact ( 'proyectos' ));
}
}
public static function escrituras ()
{
if ( get ( 'proyecto' )) {
set_time_limit ( 60 );
$id_proyecto = get ( 'proyecto' );
$proyecto = model ( Proyecto :: class ) -> find_one ( $id_proyecto );
#$informe = new Informador('Escrituras - ' . $proyecto->descripcion);
$name = 'Escrituras' ;
$hoy = Carbon :: now ( config ( 'app.timezone' ));
$filename = str_replace ( 'ñ' , 'n' , $name . ' - ' . $proyecto -> descripcion . ' - ' . $hoy -> format ( 'Y-m-d' ) . '.xls' );
$informe = new PHPExcel ( $name , $filename );
$columnas = [
'Departamento' ,
'Estacionamientos' ,
'Bodegas' ,
'Propietario' ,
( object ) [ 'name' => 'Promesa' , 'style' => 'number' ],
[ 'name' => 'Bono Pie' , 'style' => 'amount' ],
[ 'name' => 'Pie Pagado' , 'style' => 'amount' ],
[ 'name' => 'Reajuste' , 'style' => 'amount' ],
[ 'name' => 'Abono Contado' , 'style' => 'amount' ],
[ 'name' => 'Subsidio' , 'style' => 'amount' ],
'Estado Subsidio' ,
[ 'name' => 'Credito' , 'style' => 'amount' ],
'Banco' ,
'Estado Credito' ,
[ 'name' => 'Saldo' , 'style' => 'amount' ],
[ 'name' => 'Escritura' , 'style' => 'amount' ],
[ 'name' => 'Entrega' , 'style' => 'date' ]
];
$informe -> addColumns ( $columnas );
//$ventas = $proyecto->escrituras();
$ventas = $proyecto -> ventas ();
$data = [];
foreach ( $ventas as $venta ) {
$info = [];
$info [ 'Departamento' ] = $venta -> unidad () -> descripcion ;
$ests = [];
foreach ( $venta -> propiedad () -> estacionamientos () as $e ) {
$ests [] = $e -> descripcion ;
}
$bods = [];
foreach ( $venta -> propiedad () -> bodegas () as $b ) {
$bods [] = $b -> descripcion ;
}
$info [ 'Estacionamientos' ] = implode ( ' - ' , $ests );
$info [ 'Bodegas' ] = implode ( ' - ' , $bods );
$info [ 'Propietario' ] = $venta -> propietario () -> nombreCompleto ();
$info [ 'Promesa' ] = $venta -> valor_uf ;
$saldo = $venta -> valor_uf ;
$info [ 'Bono Pie' ] = '' ;
if ( $venta -> bono_pie != 0 ) {
$info [ 'Bono Pie' ] = $venta -> bonoPie () -> pago () -> valor ( 'ufs' );
$saldo -= $venta -> bonoPie () -> pago () -> valor ( 'ufs' );
}
$info [ 'Pie' ] = '' ;
$info [ 'Reajuste' ] = '' ;
if ( $venta -> pie != 0 ) {
$info [ 'Pie' ] = $venta -> pie () -> valorPagado ();
$saldo -= $venta -> pie () -> valorPagado ();
if ( $venta -> pie () -> reajuste != 0 ) {
$info [ 'Reajuste' ] = $venta -> pie () -> reajuste () -> valor ( 'ufs' );
$saldo -= $venta -> pie () -> reajuste () -> valor ( 'ufs' );
}
}
$info [ 'Abono Contado' ] = '' ;
if ( $venta -> escritura != 0 ) {
$info [ 'Abono Contado' ] = $venta -> escritura () -> pago () -> valor ( 'ufs' );
$saldo -= $venta -> escritura () -> pago () -> valor ( 'ufs' );
}
$info [ 'Subsidio' ] = '' ;
$info [ 'Estado Subsidio' ] = '' ;
if ( $venta -> subsidio != 0 ) {
$info [ 'Subsidio' ] = $venta -> subsidio () -> total ( 'ufs' );
$info [ 'Estado Subsidio' ] = implode ( ' - ' , [
$venta -> subsidio () -> subsidio () -> estado () -> tipo () -> descripcion ,
$venta -> subsidio () -> pago () -> estado () -> tipo () -> descripcion
]);
$saldo -= $venta -> subsidio () -> total ( 'ufs' );
}
$info [ 'Credito' ] = '' ;
$info [ 'Banco' ] = '' ;
$info [ 'Estado Credito' ] = '' ;
if ( $venta -> credito != 0 ) {
$info [ 'Credito' ] = $venta -> credito () -> pago () -> valor ( 'ufs' );
$saldo -= $venta -> credito () -> pago () -> valor ( 'ufs' );
if ( $venta -> credito () -> pago () -> banco != 0 ) {
$info [ 'Banco' ] = $venta -> credito () -> pago () -> banco () -> nombre ;
}
$info [ 'Estado Credito' ] = $venta -> credito () -> pago () -> estado () -> tipo () -> descripcion ;
}
$info [ 'Saldo' ] = - $saldo ;
$info [ 'Escritura' ] = '' ;
if ( $venta -> escriturado != 0 ) {
$info [ 'Escritura' ] = $venta -> escriturado ;
}
$info [ 'Entrega' ] = '' ;
if ( $venta -> entregado != 0 ) {
$info [ 'Entrega' ] = $venta -> entregado ;
}
$data [] = $info ;
}
$informe -> addData ( $data );
return $informe -> informe ();
} else {
$proyectos = model ( Proyecto :: class ) -> order_by_asc ( 'descripcion' ) -> find_many ();
return view ( 'informes.escrituras' , compact ( 'proyectos' ));
}
}
public static function consolidacion ()
{
$id_proyecto = get ( 'proyecto' );
$proyecto = model ( Proyecto :: class ) -> findOne ( $id_proyecto );
$ventas = $proyecto -> ventas ();
set_time_limit ( count ( $ventas ));
$f = Carbon :: today ( config ( 'app.timezone' ));
setlocale ( LC_TIME , 'es' );
$data = [
[ $proyecto -> descripcion ],
[ strftime ( '%d de %B de %Y' , $f -> timestamp )],
[ '' ],
[ '' ]
];
$columns = [
[ 'name' => 'Fecha' , 'style' => 'date' ],
'Glosa' ,
[ 'name' => 'Debe' , 'style' => 'number' ],
[ 'name' => 'Haber' , 'style' => 'number' ],
[ 'name' => 'Saldo' , 'style' => 'number' ],
'Comentario'
];
$bold_rows = [];
foreach ( $ventas as $venta ) {
$data [] = [ 'Departamento ' . $venta -> unidad () -> descripcion . ' (' . format ( 'ufs' , $venta -> valor_uf ) . ' UF)' ];
$data [] = $columns ;
$bold_rows [] = count ( $data ) - 1 ;
$ufs = 0 ;
$debe = 0 ;
$haber = 0 ;
$sum = 0 ;
if ( $venta -> pie != 0 ) {
$cuotas = $venta -> pie () -> cuotas ();
foreach ( $cuotas as $cuota ) {
$sum += $cuota -> pago () -> valor ();
$ufs += $cuota -> pago () -> valor ( 'ufs' );
$haber += $cuota -> pago () -> valor ();
$info = [
$cuota -> pago () -> estado () -> fecha ,
'Pie - Cuota ' . $cuota -> numero () . ' - ' . $venta -> pie () -> cuotas . ' (' . format ( 'ufs' , $cuota -> pago () -> valor ( 'ufs' )) . ' UF)' ,
'' ,
$cuota -> pago () -> valor (),
$sum
];
if ( $cuota -> pago () -> estado () -> estado < 2 ) {
$info [] = 'No ha sido abonada.' ;
}
$data [] = $info ;
}
if ( $venta -> pie () -> reajuste != 0 ) {
$sum += $venta -> pie () -> reajuste () -> valor ();
$ufs += $venta -> pie () -> reajuste () -> valor ( 'ufs' );
$haber += $venta -> pie () -> reajuste () -> valor ();
$info = [
$venta -> pie () -> reajuste () -> estado () -> fecha ,
'Reajuste (' . format ( 'ufs' , $venta -> pie () -> reajuste () -> valor ( 'ufs' )) . ' UF)' ,
'' ,
$venta -> pie () -> reajuste () -> valor (),
$sum
];
if ( $venta -> pie () -> reajuste () -> estado () -> estado < 2 ) {
$info [] = 'No ha sido abonado.' ;
}
$data [] = $info ;
}
}
if ( $venta -> escritura != 0 ) {
$sum += $venta -> escritura () -> pago () -> valor ();
$ufs += $venta -> escritura () -> pago () -> valor ( 'ufs' );
$haber += $venta -> escritura () -> pago () -> valor ();
$info = [
$venta -> escritura () -> pago () -> estado () -> fecha ,
'Abono Escritura (' . format ( 'ufs' , $venta -> escritura () -> pago () -> valor ( 'ufs' )) . ' UF)' ,
'' ,
$venta -> escritura () -> pago () -> valor (),
$sum
];
if ( $venta -> escritura () -> pago () -> estado () -> estado < 2 ) {
$info [] = 'No ha sido abonado.' ;
}
$data [] = $info ;
}
if ( $venta -> credito != 0 ) {
$sum += $venta -> credito () -> pago () -> valor ();
$ufs += $venta -> credito () -> pago () -> valor ( 'ufs' );
$haber += $venta -> credito () -> pago () -> valor ();
$info = [
$venta -> credito () -> pago () -> estado () -> fecha ,
'Crédito (' . format ( 'ufs' , $venta -> credito () -> pago () -> valor ( 'ufs' )) . ' UF)' ,
'' ,
$venta -> credito () -> pago () -> valor (),
$sum
];
if ( $venta -> credito () -> pago () -> estado () -> estado < 2 ) {
$info [] = 'No ha sido pagado.' ;
}
$data [] = $info ;
}
if ( $venta -> bono_pie != 0 ) {
try {
$sum -= $venta -> bonoPie () -> pago () -> valor ();
$debe += $venta -> bonoPie () -> pago () -> valor ();
$info = [
$venta -> bonoPie () -> pago () -> estado () -> fecha ,
'Bono Pie (' . format ( 'ufs' , $venta -> bonoPie () -> pago () -> valor ( 'ufs' )) . ' UF)' .
$venta -> bonoPie () -> pago () -> valor (),
'' ,
$sum
];
$data [] = $info ;
$sum += $venta -> bonoPie () -> pago () -> valor ();
$haber += $venta -> bonoPie () -> pago () -> valor ();
$info = [
$venta -> bonoPie () -> pago () -> estado () -> fecha ,
'Bono Pie (' . format ( 'ufs' , $venta -> bonoPie () -> pago () -> valor ( 'ufs' )) . ' UF)' .
'' ,
$venta -> bonoPie () -> pago () -> valor (),
$sum
];
$data [] = $info ;
} catch ( \Exception $e ) {
}
}
$info = [
'' ,
'TOTAL (' . format ( 'ufs' , $ufs ) . ' UF)' ,
$debe ,
$haber ,
$sum
];
$data [] = $info ;
$bold_rows [] = count ( $data ) - 1 ;
$data [] = [ '' ];
}
/**
* Departamento #
* Fecha | Glosa | Debe | Haber | Saldo
* < fecha > | Pie - Cuota 1 - n ( # UF) |- |$# |<sum>
* < fecha > | Reajuste ( # UF) |- |$# |<sum>
* < fecha > | Abono Escritura ( # UF) |- |$# |<sum>
* < fecha > | Crédito ( # UF) |- |$# |<sum>
* < fecha > | Bono Pie ( # UF) |$# |- |<sum>
* < fecha > | Bono Pie ( # UF) |- |$# |<sum>
* < fecha > | Devolución ( # UF) |$# |- |<sum>
* - | TOTAL ( # UF) |<sumDebe> |<sumHaber> |<sum>
*/
array_walk ( $data , function ( & $e , $i ) use ( $columns ) {
if ( count ( $e ) < count ( $columns )) {
$n = count ( $columns ) - count ( $e );
for ( $j = 0 ; $j < $n ; $j ++ ) {
$e [] = '' ;
}
}
});
#$informe = new Informador('Consolidación - ' . $proyecto->descripcion);
$name = 'Consolidación' ;
$hoy = Carbon :: now ( config ( 'app.timezone' ));
$filename = str_replace ( 'ñ' , 'n' , $name . ' - ' . $proyecto -> descripcion . ' - ' . $hoy -> format ( 'Y-m-d' ) . '.xls' );
$informe = new PHPExcel ( $name , $filename );
$informe -> addColumns ( $columns );
$informe -> addData ( $data );
return $informe -> informe ();
}
public static function creditos_pendientes ()
{
function creditos () {
$creditos = model ( Credito :: class )
-> select ( 'credito.*' )
-> join ( 'venta' , [ 'venta.credito' , '=' , 'credito.id' ])
-> join ( 'pago' , [ 'pago.id' , '=' , 'credito.pago' ])
-> rawJoin ( 'JOIN (SELECT ep.* FROM (SELECT pago, MAX(id) AS id FROM estado_pago GROUP BY pago) e0 JOIN estado_pago ep ON ep.id = e0.id)' , [ 'estado_pago.pago' , '=' , 'pago.id' ], 'estado_pago' )
-> whereLt ( 'estado_pago.estado' , 2 )
-> where ( 'venta.estado' , 1 )
-> orderByAsc ( 'estado_pago.fecha' )
-> findMany ();
foreach ( $creditos as $credito ) {
yield $credito ;
}
}
$informe = new Informador ( 'Créditos Pendientes' );
$columnas = [ 'Proyecto' , 'Departamento' , 'Valor' , 'Fecha Escritura' , 'Estado' ];
$informe -> addColumns ( $columnas );
$row = 0 ;
foreach ( creditos () as $credito ) {
$informe -> addData ( $row , $credito -> venta () -> proyecto () -> descripcion , 'Proyecto' );
$informe -> addData ( $row , $credito -> venta () -> unidad () -> descripcion , 'Departamento' );
$informe -> addData ( $row , $credito -> pago () -> valor ( 'ufs' ), 'Valor' );
$informe -> addData ( $row , (( $credito -> venta () -> escriturado ) ? $credito -> venta () -> escriturado : $credito -> pago () -> estado () -> fecha ), 'Fecha Escritura' );
$informe -> addData ( $row , ucwords ( $credito -> pago () -> estado () -> tipo () -> descripcion ), 'Estado' );
$row ++ ;
}
$date = [
'numberFormat' => [ 'short-date' ]
];
$ufs = [
'numberFormat' => [ 'thousands' ]
];
$formats = [ 'Valor' => $ufs , 'Fecha Escritura' => $date ];
$informe -> addFormats ( $formats );
return $informe -> informe ();
}
public static function ventas ()
{
if ( get ( 'proyecto' )) {
2022-03-07 12:42:34 +00:00
ini_set ( 'memory_limit' , " 1G " );
ini_set ( 'max_execution_time' , '3600' );
2021-03-25 21:10:44 -03:00
$id = get ( 'proyecto' );
$proyecto = model ( Proyecto :: class ) -> findOne ( $id );
$ventas = $proyecto -> ventas ();
/* usort ( $ventas , function ( $a , $b ) {
return $a -> fecha () -> timestamp - $b -> fecha () -> timestamp ;
}); */
$procasa = model ( Agente :: class ) -> findOne ( 1 );
$pa = model ( ProyectoAgente :: class ) -> where ( 'agente' , $procasa -> id ) -> where ( 'proyecto' , $proyecto -> id ) -> findOne ();
if ( $pa ) {
$comision = $pa -> comision / 100 ;
} else {
$comision = 0.03 ;
}
#$informe = new Informador('Ventas - ' . $proyecto->descripcion);
$name = 'Informe de Ventas' ;
$hoy = Carbon :: now ( config ( 'app.timezone' ));
$filename = str_replace ( 'ñ' , 'n' , $name . ' - ' . $proyecto -> descripcion . ' - ' . $hoy -> format ( 'Y-m-d' ) . '.xlsx' );
//$informe = new PHPExcel($name, $filename);
$columnas = [
'Propietario' ,
2022-03-07 12:42:34 +00:00
'Departamento' ,
2021-03-25 21:10:44 -03:00
[ 'name' => 'Estacionamientos' , 'style' => 'number' ],
[ 'name' => 'Bodegas' , 'style' => 'number' ],
'Fecha Venta' ,
[ 'name' => 'Mes' , 'style' => 'mes' ],
'Tipo' ,
[ 'name' => 'm² Ponderados' , 'style' => 'amount' ],
[ 'name' => 'Valor Promesa' , 'style' => 'amount' ],
[ 'name' => 'Pie' , 'style' => 'amount' ],
[ 'name' => 'Pie Pagado' , 'style' => 'amount' ],
[ 'name' => '% Pie Pagado' , 'style' => 'percent' ],
[ 'name' => 'Bono Pie' , 'style' => 'amount' ],
'Operador' ,
[ 'name' => 'Valor Operador' , 'style' => 'amount' ],
[ 'name' => 'Premios' , 'style' => 'amount' ],
[ 'name' => 'Subsidio' , 'style' => 'amount' ],
[ 'name' => 'Ahorro' , 'style' => 'amount' ],
[ 'name' => 'Credito' , 'style' => 'amount' ],
'Banco' ,
[ 'name' => 'Valor Ests & Bods' , 'style' => 'amount' ],
[ 'name' => 'Valor Neto' , 'style' => 'amount' ],
[ 'name' => 'UF/m²*' , 'style' => 'amount' ],
[ 'name' => 'Comision' , 'style' => 'amount' ],
2022-03-10 15:11:26 -03:00
[ 'name' => 'Venta s/Comision' , 'style' => 'amount' ],
2022-03-07 12:42:34 +00:00
[ 'name' => 'Precio' , 'style' => 'Amount' ]
2021-03-25 21:10:44 -03:00
];
//$informe->addColumns($columnas);
$data = [];
foreach ( $ventas as $venta ) {
$info = [];
$info [ 'Propietario' ] = mb_strtoupper ( $venta -> propietario () -> nombreCompleto ());
2022-03-07 12:42:34 +00:00
$info [ 'Departamento' ] = implode ( ' - ' , array_map ( function ( $item ) {
return $item -> descripcion ;
}, $venta -> propiedad () -> departamentos ()));
2021-03-25 21:10:44 -03:00
$es = $venta -> propiedad () -> estacionamientos ();
$info [ 'Estacionamientos' ] = implode ( ', ' , array_map ( function ( $item ) {
return $item -> descripcion ;
}, $es ));
$bs = $venta -> propiedad () -> bodegas ();
$info [ 'Bodegas' ] = implode ( ', ' , array_map ( function ( $item ) {
return $item -> descripcion ;
}, $bs ));
$info [ 'Fecha Venta' ] = $venta -> fecha () -> format ( 'Y-m-d' );
$info [ 'Mes' ] = $venta -> fecha () -> format ( 'M-y' );
$info [ 'Tipo' ] = $venta -> unidad () -> abreviacion ;
$info [ 'm² Ponderados' ] = $venta -> unidad () -> m2 ( 'vendible' );
$info [ 'Valor Promesa' ] = $venta -> valor_uf ;
2023-02-10 15:14:14 +00:00
$info [ 'Pie' ] = 0 ;
if ( $venta -> pie ()) {
$info [ 'Pie' ] = $venta -> pie () -> valor ;
}
2021-03-25 21:10:44 -03:00
$info [ 'Pie Pagado' ] = 0 ;
$info [ '% Pie Pagado' ] = 0 ;
if ( $venta -> pie ()) {
$info [ 'Pie Pagado' ] = $venta -> pie () -> valorPagado ( 'uf' );
$info [ '% Pie Pagado' ] = $venta -> pie () -> valorPagado ( 'uf' ) / $venta -> valor_uf ;
}
$info [ 'Bono Pie' ] = ( $venta -> bono_pie == 0 or $venta -> bonoPie () === false ) ? '' : $venta -> bonoPie () -> pago () -> valor ( 'ufs' );
$info [ 'Operador' ] = ( $venta -> agente and $venta -> agente () -> agente () -> tipo == 19 ) ? $venta -> agente () -> agente () -> descripcion : '' ;
$info [ 'Valor Operador' ] = $venta -> valorComision ();
//$promos = 0;
$ps = $venta -> promociones ();
$info [ 'Premios' ] = array_reduce ( $ps , function ( $sum , $item ) {
return $sum + $item -> valor ;
});
$info [ 'Subsidio' ] = 0 ;
$info [ 'Ahorro' ] = 0 ;
if ( $venta -> subsidio != 0 ) {
$info [ 'Subsidio' ] = $venta -> subsidio () -> subsidio () -> valor ( 'ufs' );
$info [ 'Ahorro' ] = $venta -> subsidio () -> pago () -> valor ( 'ufs' );
}
$info [ 'Credito' ] = 0 ;
$info [ 'Banco' ] = '' ;
2023-02-10 15:14:14 +00:00
if ( $venta -> credito != 0 and $venta -> credito () -> pago ()) {
$info [ 'Credito' ] = $venta -> credito () ? -> pago () -> valor ( 'ufs' );
if ( $venta -> credito () ? -> pago () -> banco != 0 ) {
$info [ 'Banco' ] = $venta -> credito () ? -> pago () -> banco () -> nombre ;
2021-03-25 21:10:44 -03:00
}
}
$info [ 'Valor Ests & Bods' ] = $venta -> valorEstacionamientosYBodegas ();
$info [ 'Valor Neto' ] = $venta -> valorFinal ();
$info [ 'UF/m²*' ] = $venta -> uf_m2 ();
$info [ 'Comision' ] = $venta -> valorFinal () * $comision ;
$info [ 'Venta s/Comision' ] = $venta -> valorFinal () - $info [ 'Comision' ];
2022-03-07 12:42:34 +00:00
$fecha = $venta -> fecha ();
$info [ 'Precio' ] = 0 ;
try {
$info [ 'Precio' ] = array_reduce ( $venta -> propiedad () -> departamentos (), function ( $sum , $item ) use ( $fecha ) {
2023-02-10 15:14:14 +00:00
if ( ! $item -> precio ( $fecha )) {
return $sum ;
}
2022-03-07 12:42:34 +00:00
return $sum + $item -> precio ( $fecha ) -> valor ;
});
} catch ( \Exception $e ) {
}
2021-03-25 21:10:44 -03:00
$data [] = $info ;
}
$body = [
" Proyecto " => $proyecto -> descripcion ,
" Compañía " => $proyecto -> inmobiliaria () -> abreviacion ,
" data " => $data
];
2022-03-10 15:11:26 -03:00
$client = new Client ([ 'base_uri' => " { $_ENV [ 'PYTHON_HOST' ] } " ]);
2021-03-25 21:10:44 -03:00
$response = $client -> post ( '/ventas' , [ 'json' => $body ]);
header ( " Content-Type: application/octet-stream; charset=utf-8 " );
header ( 'Content-Transfer-Encoding: binary' );
header ( 'Content-Disposition: attachment; filename="' . $filename . '"' );
header ( 'Cache-Control: max-age=0' );
return $response -> getBody ();
//file_put_contents('php://output', $output);
} else {
$proyectos = model ( Proyecto :: class ) -> order_by_asc ( 'descripcion' ) -> find_many ();
return view ( 'informes.ventas' , compact ( 'proyectos' ));
}
}
public static function resumen_contabilidad ()
{
if ( get ( 'proyecto' )) {
$id = get ( 'proyecto' );
$fecha = get ( 'fecha' );
2022-03-07 16:36:21 -03:00
$service = new Resumen ();
$service -> build ( $id , new \DateTimeImmutable ( $fecha ));
2022-03-07 23:49:26 -03:00
return '' ;
2021-03-25 21:10:44 -03:00
} else {
$proyectos = model ( Proyecto :: class ) -> order_by_asc ( 'descripcion' ) -> find_many ();
return view ( 'informes.resumen_contabilidad' , compact ( 'proyectos' ));
}
}
public static function contabilidad ()
{
if ( get ( 'proyecto' )) {
$id = get ( 'proyecto' );
$fecha = get ( 'fecha' );
$mes = null ;
if ( $fecha != null ) {
$mes = Carbon :: parse ( $fecha );
}
$proyecto = model ( Proyecto :: class ) -> findOne ( $id );
$q = " SELECT pago.*, venta.id AS vid, venta.tipo AS ctipo, venta.pie AS pie
FROM (
SELECT pago . id , banco . nombre AS banco , pago . fecha , pago . valor , pago . uf , ep . estado , ep . fecha AS efecha
FROM pago JOIN banco ON banco . id = pago . banco JOIN ((
SELECT pago , MAX ( id ) AS id FROM estado_pago GROUP BY pago ) e0 JOIN estado_pago ep ON ep . id = e0 . id ) ON ep . pago = pago . id
WHERE ep . estado > 0 " ;
if ( $mes != null ) {
$q .= " AND (pago.fecha BETWEEN ' " . $mes -> format ( 'Y-m-01' ) . " ' AND ' " . $mes -> format ( 'Y-m-t' ) . " '
OR ep . fecha BETWEEN '" . $mes->format(' Y - m - 01 ') . "' AND '" . $mes->format(' Y - m - t ') . "' ) " ;
}
$q .= " ) pago JOIN (SELECT venta.*
FROM ((
SELECT venta . id , venta . pie , venta . propiedad , credito . pago , 'credito' AS tipo
FROM venta JOIN credito ON credito . id = venta . credito )
UNION ALL (
SELECT venta . id , venta . pie , venta . propiedad , escritura . pago , 'escritura' AS tipo
FROM venta JOIN escritura ON escritura . id = venta . escritura )
UNION ALL (
SELECT venta . id , venta . pie , venta . propiedad , cuota . pago , 'cuota' AS tipo
FROM venta JOIN cuota ON cuota . pie = venta . pie )) venta
JOIN propiedad ON propiedad . id = venta . propiedad
JOIN unidad ON unidad . id = propiedad . unidad_principal
WHERE unidad . proyecto = ? ) venta
ON venta . pago = pago . id " ;
$st = \ORM :: getDB () -> prepare ( $q );
$st -> execute ([ $id ]);
if ( $st -> rowCount () > 0 ) {
$R = $st -> fetchAll ( \PDO :: FETCH_OBJ );
//$informe = new Informador('Contabilidad - ' . (($mes != null) ? $mes->format('Y-m') . ' - ' : '') . $proyecto->descripcion);
$name = 'Contabilidad' ;
$hoy = Carbon :: now ( config ( 'app.timezone' ));
$filename = str_replace ( 'ñ' , 'n' , 'Contabilidad - ' . (( $mes != null ) ? $mes -> format ( 'Y-m' ) . ' - ' : '' ) . $proyecto -> descripcion . ' - ' . $hoy -> format ( 'Y-m-d' ) . '.xls' );
$informe = new PHPExcel ( $name , $filename );
$columnas = [ 'Proyecto' , 'Fecha' , 'Banco' , 'Departamento' , 'RUT' , 'Propietario' , 'Glosa' , 'Glosa2' , ( object ) [ 'name' => 'Valor' , 'style' => 'integer' ], ( object ) [ 'name' => 'Valor UF' , 'style' => 'currency' ]];
$informe -> addColumns ( $columnas );
$data = [];
foreach ( $R as $r ) {
$info = [];
$info [ 'Proyecto' ] = $proyecto -> descripcion ;
$f1 = \Carbon\Carbon :: parse ( $r -> fecha , config ( 'app.timezone' ));
$f2 = \Carbon\Carbon :: parse ( $r -> efecha , config ( 'app.timezone' ));
$info [ 'Fecha' ] = ( $f1 -> max ( $f2 )) -> format ( 'Y-m-d' );
$info [ 'Banco' ] = $r -> banco ;
$venta = model ( Venta :: class ) -> findOne ( $r -> vid );
$info [ 'Departamento' ] = $venta -> unidad () -> descripcion ;
$info [ 'RUT' ] = $venta -> propietario () -> rut ();
$info [ 'Propietario' ] = $venta -> propietario () -> nombreCompleto ();
$info [ 'Glosa' ] = ucwords ( $r -> ctipo );
$info [ 'Glosa2' ] = '' ;
if ( $r -> ctipo == 'cuota' ) {
$cuota = model ( Cuota :: class ) -> where ( 'pago' , $r -> id ) -> findOne ();
$info [ 'Glosa' ] = 'Pie - ' . format ( 'ufs' , $cuota -> pie () -> valor ( 'ufs' ), null , true );
$info [ 'Glosa2' ] = $cuota -> numero () . ' - ' . $cuota -> pie () -> cuotas ;
}
$info [ 'Valor' ] = $r -> valor ;
$info [ 'Valor UF' ] = '0' ;
if ( $r -> uf > 0 ) {
$info [ 'Valor UF' ] = $r -> valor / $r -> uf ;
}
$data [] = $info ;
}
$informe -> addData ( $data );
return $informe -> informe ();
}
} else {
setlocale ( LC_TIME , 'es_ES' );
$proyectos = model ( Proyecto :: class ) -> order_by_asc ( 'descripcion' ) -> find_many ();
return view ( 'informes.contabilidad' , compact ( 'proyectos' ));
}
}
public static function para_comision ()
{
$proyectos = model ( Proyecto :: class ) -> orderByAsc ( 'descripcion' ) -> findMany ();
return view ( 'informes.para_comision' , compact ( 'proyectos' ));
}
public static function comisiones ()
{
$id = post ( 'proyecto' );
$proyecto = model ( Proyecto :: class ) -> findOne ( $id );
$unidades = explode ( '-' , str_replace ([ ';' , '.' , ':' , ' ' , PHP_EOL , '|' , '+' , ',' ], '-' , post ( 'unidades' )));
$ventas = model ( Venta :: class )
-> select ( 'venta.*' )
-> join ( 'propiedad' , [ 'propiedad.id' , '=' , 'venta.propiedad' ])
-> join ( 'unidad' , [ 'unidad.id' , '=' , 'propiedad.unidad_principal' ])
-> where ( 'unidad.proyecto' , $proyecto -> id )
-> where ( 'venta.estado' , 1 )
-> whereIn ( 'unidad.descripcion' , $unidades )
-> orderByExpr ( 'FIELD(unidad.descripcion, ' . implode ( ', ' , $unidades ) . ')' )
-> findMany ();
$ids = [];
$totales = ( object ) [ 'precio' => 0 , 'neto' => 0 , 'comision' => 0 ];
foreach ( $ventas as $venta ) {
$ids [] = $venta -> id ;
$totales -> precio += $venta -> valor_uf ;
$totales -> neto += $venta -> valorCorredora ();
$totales -> comision += $venta -> valorCorredora () * 1.5 / 100 ;
}
return view ( 'informes.comisiones' , compact ( 'ventas' , 'proyecto' , 'totales' , 'ids' ));
}
public static function comisiones_xlsx ()
{
$id_ventas = explode ( ',' , get ( 'ventas' ));
$ventas = model ( Venta :: class )
-> whereIn ( 'id' , $id_ventas )
-> orderByExpr ( 'FIELD(id, ' . implode ( ', ' , $id_ventas ) . ')' )
-> findMany ();
$informe = new Informador ( 'Comisiones - ' . $ventas [ 0 ] -> proyecto () -> descripcion );
$columnas = [ 'Departamento' , 'Estacionamientos' , 'Bodegas' , 'Propietario' , 'Precio' , '% Com' , 'Com UF' ];
$informe -> addColumns ( $columnas );
$data = [];
foreach ( $ventas as $venta ) {
$info = [];
$info [ 'Departamento' ] = $venta -> unidad () -> descripcion ;
$info [ 'Estacionamientos' ] = implode ( ' - ' , $venta -> propiedad () -> estacionamientos ( 'array' ));
$info [ 'Bodegas' ] = implode ( ' - ' , $venta -> propiedad () -> bodegas ( 'array' ));
$info [ 'Propietario' ] = $venta -> propietario () -> nombreCompleto ();
$info [ 'Precio' ] = " ' " . format ( 'ufs' , $venta -> valorCorredora ());
$info [ '% Com' ] = '1,5 %' ;
$info [ 'Com UF' ] = " ' " . format ( 'ufs' , $venta -> valorCorredora () * 1.5 / 100 );
$data [] = $info ;
}
$informe -> addDatas ( $data );
return $informe -> informe ();
}
public static function cuotas ()
{
$id_venta = get ( 'venta' );
$venta = model ( Venta :: class ) -> findOne ( $id_venta );
$name = 'Cuotas - ' . $venta -> unidad () -> descripcion ;
$hoy = Carbon :: now ( config ( 'app.timezone' ));
$filename = str_replace ( 'ñ' , 'n' , $name . ' - ' . $venta -> proyecto () -> descripcion . ' - ' . $hoy -> format ( 'Y-m-d' ) . '.xls' );
$informe = new PHPExcel ( $name , $filename );
$columnas = [
[ 'name' => 'Cuota' , 'style' => 'number' ],
[ 'name' => 'Fecha Cuota' , 'style' => 'date' ],
'Banco' ,
'Identificador' ,
[ 'name' => 'Valor $' , 'style' => 'number' ],
[ 'name' => 'Valor UF' , 'style' => 'currency' ],
[ 'name' => 'Fecha Pago' , 'style' => 'date' ]
];
$informe -> addColumns ( $columnas );
$data = [];
foreach ( $venta -> pie () -> cuotas () as $cuota ) {
$info = [];
$info [ 'Cuota' ] = $cuota -> numero ();
$info [ 'Fecha Cuota' ] = $cuota -> pago () -> fecha () -> format ( 'Y-m-d' );
$info [ 'Banco' ] = $cuota -> pago () -> banco () -> descripcion ;
$info [ 'Identificador' ] = $cuota -> pago () -> identificador ;
$info [ 'Valor $' ] = $cuota -> pago () -> valor ();
$info [ 'Valor UF' ] = $cuota -> pago () -> valor ( 'ufs' );
$info [ 'Fecha Pago' ] = $cuota -> pago () -> estado () -> fecha () -> format ( 'Y-m-d' );
$data [] = $info ;
}
$informe -> addData ( $data );
return $informe -> informe ();
}
public static function resciliaciones ()
{
if ( get ( 'proyecto' )) {
$id = get ( 'proyecto' );
$proyecto = model ( Proyecto :: class ) -> findOne ( $id );
$ventas = $proyecto -> resciliaciones ();
usort ( $ventas , function ( $a , $b ) {
return $a -> fecha () -> timestamp - $b -> fecha () -> timestamp ;
});
$name = 'Resciliaciones' ;
$hoy = Carbon :: now ( config ( 'app.timezone' ));
$filename = str_replace ( 'ñ' , 'n' , $name . ' - ' . $proyecto -> descripcion . ' - ' . $hoy -> format ( 'Y-m-d' ) . '.xls' );
$informe = new PHPExcel ( $name , $filename );
$columnas = [
'Propietario' ,
[ 'name' => 'Departamento' , 'style' => 'number' ],
[ 'name' => 'Estacionamientos' , 'style' => 'number' ],
[ 'name' => 'Bodegas' , 'style' => 'number' ],
'Fecha Venta' ,
'Fecha Resciliación' ,
[ 'name' => 'Mes' , 'style' => 'mes' ],
'Tipo' ,
[ 'name' => 'm² Ponderados' , 'style' => 'amount' ],
[ 'name' => 'Valor Promesa' , 'style' => 'amount' ],
];
$informe -> addColumns ( $columnas );
$data = [];
foreach ( $ventas as $venta ) {
$info = [];
$info [ 'Propietario' ] = mb_strtoupper ( $venta -> propietario () -> nombreCompleto ());
$info [ 'Departamento' ] = $venta -> unidad () -> descripcion ;
$ests = [];
if ( $venta -> propiedad () -> estacionamientos != '' ) {
$es = $venta -> propiedad () -> estacionamientos ();
foreach ( $es as $e ) {
$ests [] = $e -> descripcion ;
}
}
$info [ 'Estacionamientos' ] = implode ( ', ' , $ests );
$bods = [];
if ( $venta -> propiedad () -> bodegas != '' ) {
$bs = $venta -> propiedad () -> bodegas ();
foreach ( $bs as $b ) {
$bods [] = $b -> descripcion ;
}
}
$info [ 'Bodegas' ] = implode ( ', ' , $bods );
$info [ 'Fecha Venta' ] = $venta -> fecha () -> format ( 'd.m.Y' );
$info [ 'Fecha Resciliación' ] = $venta -> estado () -> fecha () -> format ( 'd.m.Y' );
$info [ 'Mes' ] = $venta -> estado () -> fecha () -> format ( 'M-y' );
$info [ 'Tipo' ] = $venta -> unidad () -> abreviacion ;
$info [ 'm² Ponderados' ] = $venta -> unidad () -> m2 ( 'vendible' );
$info [ 'Valor Promesa' ] = $venta -> valor_uf ;
$data [] = $info ;
}
$informe -> addData ( $data );
$totals = [
'Departamento' => 'count' ,
'Estacionamientos' => 'count' ,
'Bodegas' => 'count' ,
'm² Ponderados' => 'sum' ,
'Valor Promesa' => 'sum'
];
$informe -> addTotals ( $totals );
return $informe -> informe ();
} else {
$proyectos = model ( Proyecto :: class ) -> order_by_asc ( 'descripcion' ) -> find_many ();
return view ( 'informes.resciliaciones' , compact ( 'proyectos' ));
}
}
}