2023-11-22 19:08:19 -03:00
@ extends ( 'layout.base' )
@ section ( 'page_content' )
< div class = " ui container " >
2023-11-29 20:09:08 -03:00
< h2 class = " ui header " >
Facturación -
< a href = " { { $urls -> base } }/proyecto/ { { $venta -> proyecto () -> id } } " >
{{ $venta -> proyecto () -> descripcion }} < span class = " ui tiny text " >< sub >< i
class = " search icon " ></ i ></ sub ></ span >
</ a >
-
< a href = " { { $urls -> base } }/venta/ { { $venta -> id } } " >
{{ $venta -> propiedad () -> summary ()}}
</ a >
</ h2 >
2024-04-18 20:30:26 -04:00
< div class = " ui grid " >
< div class = " three wide column " >
< div class = " ui very segment " >
Valor Venta : {{ $format -> ufs ( $venta -> valor )}}
2023-11-29 20:09:08 -03:00
</ div >
</ div >
2024-04-18 20:30:26 -04:00
</ div >
< form id = " venta_form " class = " ui form " >
2023-11-29 20:09:08 -03:00
< div class = " fields " >
@ foreach ( $venta -> propiedad () -> unidades as $unidad )
< div class = " three wide field " >
2024-04-18 20:30:26 -04:00
< label for = " precio { { $unidad -> pu_id } } " > Precio < br /> {{ ucwords ( $unidad -> proyectoTipoUnidad -> tipoUnidad -> descripcion )}} {{ $unidad -> descripcion }} </ label >
2023-11-30 18:40:15 -03:00
< div class = " ui right labeled input " id = " input { { $unidad -> pu_id } } " >
2023-11-29 20:09:08 -03:00
< input class = " price " type = " text " name = " precio { { $unidad -> pu_id } } " id = " precio { { $unidad -> pu_id } } " data - id = " { { $unidad -> pu_id } } " value = " { { ( $unidad->valor > 0) ? $unidad->valor : $unidad->precio ( $venta->currentEstado ()->fecha)->valor}} " />
< div class = " ui basic label " > UF </ div >
</ div >
</ div >
@ endforeach
2023-11-22 19:08:19 -03:00
</ div >
2023-11-30 18:40:15 -03:00
< div class = " fields " >
@ foreach ( $venta -> propiedad () -> unidades as $unidad )
< div class = " three wide field " >
@ if ( $unidad -> prorrateo === 0.0 )
2024-04-18 20:30:26 -04:00
< label for = " prorrateo { { $unidad -> id } } " > Prorrateo < br /> {{ ucwords ( $unidad -> proyectoTipoUnidad -> tipoUnidad -> descripcion )}} {{ $unidad -> descripcion }} </ label >
2023-11-30 18:40:15 -03:00
< div class = " ui right labeled input " id = " prorrateo { { $unidad -> id } } " >
< input class = " prorrateo " type = " text " data - id = " { { $unidad -> id } } " value = " { { $unidad -> prorrateo } } " />
< div class = " ui basic label " >%</ div >
</ div >
@ endif
</ div >
@ endforeach
</ div >
< div class = " ui very basic segment " id = " total_unidades " ></ div >
2024-04-18 20:30:26 -04:00
@ php $lastDic = new DateTimeImmutable (( new DateTimeImmutable ()) -> sub ( new DateInterval ( 'P1Y' )) -> format ( 'Y-12-31' )); @ endphp
@ if ( ! isset ( $terreno -> fecha ) or $terreno -> fecha -> getTimestamp () < 0 or $terreno -> fecha < $lastDic )
2023-11-30 18:40:15 -03:00
< div class = " four wide field " >
< label for = " terreno " > Valor Terreno al {{ $lastDic -> format ( 'd-m-Y' )}} </ label >
< div class = " ui left labeled input " >
< div class = " ui basic label " > $ </ div >
< input type = " number " id = " terreno " />
</ div >
</ div >
@ endif
2024-04-18 20:30:26 -04:00
< div class = " two wide field " >
< label for = " propietarios " > Propietarios </ label >
< input type = " number " name = " cantidad_propietarios " id = " cantidad_propietarios " min = " 1 " value = " 1 " />
</ div >
< div id = " propietarios " >
< div class = " fields " data - index = " 1 " >
< div class = " two wide field " >
< label for = " proporcion1 " > Proporción Factura </ label >
< div class = " ui right labeled input " >
< input type = " number " name = " proporcion1 " id = " proporcion1 " value = " 100 " max = " 100 " min = " 0 " />
< div class = " ui basic icon label " >
< i class = " percent icon " ></ i >
</ div >
</ div >
</ div >
< div class = " three wide field " >
< label for = " rut1 " > RUT </ label >
< div class = " ui input " >
< input type = " text " name = " rut1 " id = " rut1 " value = " { { $venta -> propietario () -> rut () } } " />
</ div >
</ div >
< div class = " five wide field " >
< label for = " propietario1 " > Propietario </ label >
< div class = " ui input " >
< input type = " text " name = " propietario1 " id = " propietario1 " value = " { { $venta -> propietario () -> nombreCompleto () } } " />
</ div >
</ div >
< div class = " six wide field " >
< label for = " direccion_propietario1 " > Dirección </ label >
< div class = " ui input " >
< input type = " text " name = " direccion_propietario1 " id = " direccion_propietario1 " value = " { { $venta -> propietario () -> datos -> direccion -> simple () } } " />
</ div >
</ div >
< div class = " two wide field " >
< label for = " comuna_propietario1 " > Comuna </ label >
< input type = " text " name = " comuna_propietario1 " id = " comuna_propietario1 " value = " { { $venta -> propietario () -> datos -> direccion -> comuna -> descripcion } } " />
</ div >
</ div >
</ div >
< div id = " propietarios " class = " fields " ></ div >
2023-11-22 19:08:19 -03:00
</ form >
2024-01-18 13:15:26 -03:00
@ if ( $venta -> currentEstado () -> fecha -> sub ( new DateInterval ( 'P1M' )) > $venta -> proyecto () -> terreno -> fecha
and $IPC -> get ( $venta -> proyecto () -> terreno -> fecha , $venta -> currentEstado () -> fecha -> sub ( new DateInterval ( 'P1M' ))) === 0.0 )
2023-12-04 19:51:44 -03:00
< div class = " ui compact icon error message " >
< i class = " exclamation triangle icon " ></ i >
< div class = " content " >
IPC no disponible para este mes .
</ div >
</ div >
@ endif
2024-04-18 20:30:26 -04:00
< div id = " facturas " ></ div >
{{ --< div id = " factura " >
2023-11-29 20:09:08 -03:00
< div class = " ui compact grid " >
< div class = " two columns row " >
< div class = " twelve wide column " >
< strong >
{{ mb_strtoupper ( $venta -> proyecto () -> inmobiliaria () -> nombreCompleto ())}}
</ strong >< br />
GIRO : < br />
2023-11-30 18:40:15 -03:00
Dirección : {{ $venta -> proyecto () -> direccion () -> simple ()}}
2023-11-29 20:09:08 -03:00
</ div >
< div class = " four wide column " >
< div class = " ui center aligned red segment " >
< strong >
RUT : {{ $venta -> proyecto () -> inmobiliaria () -> rut ()}} < br />
FACTURA ELECTRÓNICA < br />
N° #
</ strong >
</ div >
</ div >
</ div >
< div class = " row " >
< table class = " ui table " >
< tr >
< td class = " grey " >< strong > Señor ( es ) </ strong ></ td >
< td > {{ $venta -> propietario () -> nombreCompleto ()}} </ td >
< td class = " grey " >< strong > RUT </ strong ></ td >
< td > {{ $venta -> propietario () -> rut ()}} </ td >
</ tr >
< tr >
< td class = " grey " >< strong > Giro </ strong ></ td >
< td > Otras Actividades Profesionales </ td >
< td class = " grey " >< strong > Fecha Emisión </ strong ></ td >
< td > {{( new IntlDateFormatter ( 'es-CL' , IntlDateFormatter :: LONG , IntlDateFormatter :: NONE )) -> format ( $venta -> currentEstado () -> fecha )}} </ td >
</ tr >
< tr >
< td class = " grey " >< strong > Dirección </ strong ></ td >
< td > {{ $venta -> propietario () -> datos -> direccion -> simple ()}} </ td >
< td class = " grey " >< strong > Comuna </ strong ></ td >
< td > {{ mb_strtoupper ( $venta -> propietario () -> datos -> direccion -> comuna -> descripcion )}} </ td >
</ tr >
</ table >
</ div >
< div class = " row " >
< table class = " ui celled table " >
< thead >
< tr class = " grey " >
< th class = " center aligned " colspan = " 6 " > DETALLES </ th >
</ tr >
< tr class = " grey " >
< th > N° </ th >
< th class = " center aligned " > Descripción </ th >
< th class = " center aligned " > Cant / Unidad </ th >
< th class = " center aligned " > Prec . Unit .</ th >
< th class = " center aligned " > Ind </ th >
< th class = " center aligned " > Total </ th >
</ tr >
</ thead >
< tbody id = " unidades " ></ tbody >
< tfoot >
< tr >
< td colspan = " 6 " >
< br />
< br />
< br />
< br />
</ td >
</ tr >
</ tfoot >
</ table >
</ div >
< div class = " row " >
< div class = " ten wide column " ></ div >
< div class = " six wide column " >
< table class = " ui celled very compact table " >
< thead >
< tr >
< th class = " center aligned grey " colspan = " 2 " > TOTALES </ th >
</ tr >
</ thead >
< tbody >
< tr >
< td class = " grey " > Monto Neto </ td >
< td class = " right aligned " id = " neto " ></ td >
</ tr >
< tr >
< td class = " grey " > Monto Exento </ td >
< td class = " right aligned " id = " exento " ></ td >
</ tr >
< tr >
< td class = " grey " > 19 % IVA </ td >
< td class = " right aligned " id = " iva " ></ td >
</ tr >
< tr >
< td class = " grey " > Monto Total </ td >
< td class = " right aligned " >< strong id = " total " ></ strong ></ td >
</ tr >
</ tbody >
</ table >
</ div >
</ div >
</ div >
</ div >
2024-04-18 20:30:26 -04:00
</ div >-- }}
2023-11-22 19:08:19 -03:00
@ endsection
2023-11-29 20:09:08 -03:00
@ push ( 'page_scripts' )
< script >
2024-04-18 20:30:26 -04:00
class Factura
{
props
constructor ( props ) {
this . props = props
}
draw ({ parentDiv , inmobiliaria , proyecto , propietario , unidades , venta , estadoVenta , uf , formatters = { date , pesos , ufs , percent }}) {
const output = [
'<div class="ui divider"></div>' +
'<div class="factura">' +
'<div class="ui compact grid">' +
'<div class="two columns row">' +
'<div class="twelve wide column">' +
'<strong>' + inmobiliaria . nombre + '</strong><br/>' +
'GIRO: <br/>' +
'Dirección:' + proyecto . direccion +
'</div>' +
'<div class="four wide column">' +
'<div class="ui center aligned red segment">' +
'<strong>' +
'RUT:' + inmobiliaria . rut + '<br/>' +
'FACTURA ELECTRÓNICA<br/>' +
'N° #' +
'</strong>' +
'</div>' +
'</div>' +
'</div>' +
'<div class="row">' +
'<table class="ui table">' +
'<tr>' +
'<td class="grey"><strong>Señor(es)</strong></td>' +
'<td>' + propietario . nombre + '</td>' +
'<td class="grey"><strong>RUT</strong></td>' +
'<td>' + propietario . rut + '</td>' +
'</tr>' +
'<tr>' +
'<td class="grey"><strong>Giro</strong></td>' +
'<td>Otras Actividades Profesionales</td>' +
'<td class="grey"><strong>Fecha Emisión</strong></td>' +
'<td>' + formatters . date . format ( estadoVenta . fecha ) + '</td>' +
'</tr>' +
'<tr>' +
'<td class="grey"><strong>Dirección</strong></td>' +
'<td>' + propietario . direccion + '</td>' +
'<td class="grey"><strong>Comuna</strong></td>' +
'<td>' + propietario . comuna . toUpperCase () + '</td>' +
'</tr>' +
'</table>' +
'</div>' +
'<div class="row">' +
'<table class="ui celled table">' +
'<thead>' +
'<tr class="grey">' +
'<th class="center aligned" colspan="6">DETALLES</th>' +
'</tr>' +
'<tr class="grey">' +
'<th>N°</th>' +
'<th class="center aligned">Descripción</th>' +
'<th class="center aligned">Cant/Unidad</th>' +
'<th class="center aligned">Prec. Unit.</th>' +
'<th class="center aligned">Ind</th>' +
'<th class="center aligned">Total</th>' +
'</tr>' +
'</thead>'
]
const unidadesData = []
2023-11-29 20:09:08 -03:00
let c = 1
const classes = [
'' ,
'' ,
'center aligned' ,
'right aligned' ,
'center aligned' ,
'right aligned'
]
2024-04-18 20:30:26 -04:00
unidades . forEach ( unidad => {
const descuento = parseFloat ( proyecto . terreno ) * parseFloat ( unidad . prorrateo )
const bruto = parseFloat ( unidad . base ) - descuento
2023-11-29 20:09:08 -03:00
const neto = bruto / 1.19
const data = [
c ++ ,
2024-04-18 20:30:26 -04:00
unidad . descripcion + ' (UF ' + formatters . ufs . format ( unidad . precio * this . props . proporcion ) + ')' ,
2023-11-29 20:09:08 -03:00
'1 UNID' ,
2024-04-18 20:30:26 -04:00
formatters . pesos . format ( neto * this . props . proporcion ),
2023-11-29 20:09:08 -03:00
'AF' ,
2024-04-18 20:30:26 -04:00
formatters . pesos . format ( neto * this . props . proporcion )
2023-11-29 20:09:08 -03:00
]
2024-04-18 20:30:26 -04:00
const row = [ '<tr>' ]
2023-11-29 20:09:08 -03:00
data . forEach (( value , i ) => {
2024-04-18 20:30:26 -04:00
const cell = [ '<td' ]
2023-11-29 20:09:08 -03:00
if ( classes [ i ] !== '' ) {
2024-04-18 20:30:26 -04:00
cell . push ( ' class="' + classes [ i ] + '"' )
2023-11-29 20:09:08 -03:00
}
2024-04-18 20:30:26 -04:00
cell . push ( '>' + value + '</td>' )
row . push ( cell . join ( '' ))
2023-11-29 20:09:08 -03:00
})
2024-04-18 20:30:26 -04:00
row . push ( '</tr>' )
unidadesData . push ( row . join ( '' ))
2023-11-29 20:09:08 -03:00
})
2023-11-30 18:40:15 -03:00
const emptyTerreno = '<div class="ui tiny red horizontal circular label">0</div>'
2023-11-29 20:09:08 -03:00
const data = [
c ,
2024-04-18 20:30:26 -04:00
'Valor con Terreno ' + formatters . pesos . format (( venta . base + venta . terreno ) * this . props . proporcion ) + ' - Menos valor terreno ' + (( venta . terreno > 0 ) ? formatters . pesos . format ( - venta . terreno * this . props . proporcion ) : emptyTerreno ) + '<br />' +
'Base imponible ' + formatters . pesos . format ( venta . base * this . props . proporcion ) + '<br />' +
'IVA ' + formatters . pesos . format ( venta . iva * this . props . proporcion ) + '<br />' +
'SUBTOTAL ' + formatters . pesos . format ( venta . subtotal * this . props . proporcion ) + '<br />' +
'Mas valor terreno ' + (( venta . terreno > 0 ) ? formatters . pesos . format ( venta . terreno * this . props . proporcion ) : emptyTerreno ) + '<br />' +
'TOTAL ' + formatters . pesos . format ( venta . total * this . props . proporcion ) + ';' + formatters . ufs . format ( venta . totalUF * this . props . proporcion ) + ' UF<br /><br />' +
'Descuento Terreno: ' + (( venta . terreno > 0 ) ? formatters . percent . format ( venta . prorrateo * 100 ) : emptyTerreno ) + '%<br /><br />' +
'UF: ' + formatters . ufs . format ( uf ),
2023-11-29 20:09:08 -03:00
'1 UNID' ,
2024-04-18 20:30:26 -04:00
formatters . pesos . format ( venta . terreno * this . props . proporcion ),
2023-11-29 20:09:08 -03:00
'EX' ,
2024-04-18 20:30:26 -04:00
formatters . pesos . format ( venta . terreno * this . props . proporcion )
2023-11-29 20:09:08 -03:00
]
2024-04-18 20:30:26 -04:00
const row = [ '<tr class="top aligned">' ]
2023-11-29 20:09:08 -03:00
data . forEach (( value , i ) => {
2024-04-18 20:30:26 -04:00
const cell = [ '<td' ]
2023-11-29 20:09:08 -03:00
if ( classes [ i ] !== '' ) {
2024-04-18 20:30:26 -04:00
cell . push ( ' class="' + classes [ i ] + '"' )
2023-11-29 20:09:08 -03:00
}
2024-04-18 20:30:26 -04:00
cell . push ( '>' + value + '</td>' )
row . push ( cell . join ( '' ))
2023-11-29 20:09:08 -03:00
})
2024-04-18 20:30:26 -04:00
unidadesData . push ( row . join ( '' ))
2023-11-29 20:09:08 -03:00
2024-04-18 20:30:26 -04:00
output . push ( '<tbody id="unidades">' + unidadesData . join ( '' ) + '</tbody>' )
output . push (
'<tfoot>' +
'<tr>' +
'<td colspan="6">' +
'<br />' +
'<br />' +
'<br />' +
'<br />' +
'</td>' +
'</tr>' +
'</tfoot>' +
'</table>' +
'</div>' +
'<div class="row">' +
'<div class="ten wide column"></div>' +
'<div class="six wide column">' +
'<table class="ui celled very compact table">' +
'<thead>' +
'<tr>' +
'<th class="center aligned grey" colspan="2">TOTALES</th>' +
'</tr>' +
'</thead>' +
'<tbody>' +
'<tr>' +
'<td class="grey">Monto Neto</td>' +
'<td class="right aligned" id="neto">' + formatters . pesos . format ( venta . base * this . props . proporcion ) + '</td>' +
'</tr>' +
'<tr>' +
'<td class="grey">Monto Exento</td>' +
'<td class="right aligned" id="exento">' + formatters . pesos . format ( venta . terreno * this . props . proporcion ) + '</td>' +
'</tr>' +
'<tr>' +
'<td class="grey">19% IVA</td>' +
'<td class="right aligned" id="iva">' + formatters . pesos . format ( venta . iva * this . props . proporcion ) + '</td>' +
'</tr>' +
'<tr>' +
'<td class="grey">Monto Total</td>' +
'<td class="right aligned"><strong id="total">' + formatters . pesos . format ( venta . total * this . props . proporcion ) + '</strong></td>' +
'</tr>' +
'</tbody>' +
'</table>' +
'</div>' +
'</div>' +
'</div>' +
'</div>'
)
parentDiv . append ( output . join ( '' ))
}
}
const facturasForm = {
props : {
ids : {
facturas : '' ,
propietarios : ''
}
},
inmobiliaria : {
rut : '{{$venta->proyecto()->inmobiliaria()->rut()}}' ,
nombre : '{{mb_strtoupper($venta->proyecto()->inmobiliaria()->nombreCompleto())}}'
},
proyecto : {
direccion : '{{$venta->proyecto()->direccion()->simple()}}' ,
terreno : {{( isset ( $terreno -> fecha ) and $terreno -> fecha >= $lastDic ) ?
$IPC -> readjust ( $terreno -> valor , $terreno -> fecha , $venta -> currentEstado () -> fecha ) : 0 }},
},
estadoVenta : {
fecha : new Date ( '{{$venta->currentEstado()->fecha->format(' Y - m - d ')}}' )
},
precio : {{ $UF -> transform ( $venta -> currentEstado () -> fecha , $venta -> valor )}},
uf : {{ $UF -> get ( $venta -> currentEstado () -> fecha )}},
unidades : JSON . parse ( ' { !! json_encode ( array_map ( function ( Incoviba\Model\Venta\PropiedadUnidad $unidad ) use ( $venta , $UF , $format ) {
$precio = ( $unidad -> valor > 0 ) ? $unidad -> valor : ( $unidad -> precio ( $venta -> currentEstado () -> fecha ) ? $unidad -> precio ( $venta -> currentEstado () -> fecha ) -> valor : 0 );
return [
'id' => $unidad -> id ,
'pid' => $unidad -> pu_id ,
'descripcion' => ucwords ( $unidad -> proyectoTipoUnidad -> tipoUnidad -> descripcion ) . ' ' . $unidad -> descripcion ,
'precio' => $precio ,
'base' => $UF -> transform ( $venta -> currentEstado () -> fecha , $precio ),
'prorrateo' => $unidad -> prorrateo ,
];
}, $venta -> propiedad () -> unidades )) !! } ' ),
venta : {
base : 0 ,
precio : 0 ,
descuento : 0 ,
prorrateo : 0 ,
bruto : 0 ,
iva : 0 ,
neto : 0 ,
subtotal : 0 ,
total : 0 ,
totalUF : 0
},
propietarios : [
{
rut : '{{$venta->propietario()->rut()}}' ,
nombre : '{{$venta->propietario()->nombreCompleto()}}' ,
direccion : '{{$venta->propietario()->datos->direccion->simple()}}' ,
comuna : '{{$venta->propietario()->datos->direccion->comuna->descripcion}}'
}
],
facturas : [],
draw () {
return {
propietarios : () => {
const proporcion = ( 100 / this . propietarios . length ) . toFixed ()
const parent = $ ( this . props . ids . propietarios )
parent . html ( '' )
this . propietarios . forEach (( propietario , idx ) => {
parent . append (
'<div class="fields" data-index="' + ( idx + 1 ) + '">' +
'<div class="two wide field">' +
'<label for="proporcion' + ( idx + 1 ) + '">Proporción Factura</label>' +
'<div class="ui right labeled input">' +
'<input type="number" class="proporcion" name="proporcion' + ( idx + 1 ) + '" id="proporcion' + ( idx + 1 ) + '" value="' + proporcion + '" max="100" min="0"/>' +
'<div class="ui basic icon label">' +
'<i class="percent icon"></i>' +
'</div>' +
'</div>' +
'</div>' +
'<div class="three wide field">' +
'<label for="rut' + ( idx + 1 ) + '">RUT</label>' +
'<div class="ui input">' +
'<input type="text" name="rut' + ( idx + 1 ) + '" id="rut' + ( idx + 1 ) + '" value="' + propietario . rut + '" />' +
'</div>' +
'</div>' +
'<div class="five wide field">' +
'<label for="propietario' + ( idx + 1 ) + '">Propietario</label>' +
'<div class="ui input">' +
'<input type="text" name="propietario' + ( idx + 1 ) + '" id="propietario' + ( idx + 1 ) + '" value="' + propietario . nombre + '" />' +
'</div>' +
'</div>' +
'<div class="six wide field">' +
'<label for="direccion_propietario' + ( idx + 1 ) + '">Dirección</label>' +
'<div class="ui input">' +
'<input type="text" name="direccion_propietario' + ( idx + 1 ) + '" id="direccion_propietario' + ( idx + 1 ) + '" value="' + propietario . direccion + '" />' +
'</div>' +
'</div>' +
'<div class="two wide field">' +
'<label for="comuna_propietario' + ( idx + 1 ) + '">Comuna</label>' +
'<input type="text" name="comuna_propietario' + ( idx + 1 ) + '" id="comuna_propietario' + ( idx + 1 ) + '" value="' + propietario . comuna + '" />' +
'</div>' +
'</div>' )
const inputs = {
proporcion : 'proporciones' ,
rut : 'rut' ,
propietario : 'propietario' ,
direccion_propietario : 'direccion' ,
comuna_propietario : 'comuna'
}
Object . entries ( inputs ) . forEach (([ name , method ]) => {
$ ( " [name=' " + name + ( idx + 1 ) + " '] " ) . change ( event => {
this . update ()[ method ]( idx )
this . update () . facturas ()
})
})
})
}
}
2023-11-29 20:09:08 -03:00
},
update : function () {
return {
price : ( id , value ) => {
2023-11-30 18:40:15 -03:00
this . unhighlight ()
const idx = this . unidades . findIndex ( unidad => unidad . pid === id )
2023-11-29 20:44:13 -03:00
if ( idx === - 1 ) {
return
}
2024-04-18 20:30:26 -04:00
const old_value = parseFloat ( this . unidades [ idx ] . precio )
2023-11-29 20:09:08 -03:00
if ( old_value === parseFloat ( value )) {
return
}
const url = '{{$urls->api}}/ventas/propiedades/unidad/' + id + '/edit'
const data = new FormData ()
data . set ( 'valor' , value )
return fetchAPI ( url , { method : 'post' , body : data }) . then ( response => {
if ( response . ok ) {
return response . json ()
}
}) . then ( json => {
if ( ! json . edited ) {
return
}
2023-11-30 18:40:15 -03:00
const idx = this . unidades . findIndex ( unidad => unidad . pid === json . propiedad_unidad_id )
2024-01-18 13:15:26 -03:00
this . unidades [ idx ] . precio = parseFloat ( json . input . valor )
2024-04-18 20:30:26 -04:00
this . unidades [ idx ] . base = parseFloat ( json . input . valor ) * parseFloat ( this . unidades [ idx ] . base ) / old_value
2023-11-29 20:09:08 -03:00
})
2023-11-30 18:40:15 -03:00
},
terreno : value => {
const url = '{{$urls->api}}/proyecto/{{$venta->proyecto()->id}}/terreno/edit'
const data = new FormData ()
data . set ( 'valor' , value )
data . set ( 'fecha' , '{{$lastDic->format(' Y - m - d ')}}' )
return fetchAPI ( url , { method : 'post' , body : data }) . then ( response => {
if ( response . ok ) {
return response . json ()
}
}) . then ( json => {
if ( ! json . edited ) {
return
}
this . terreno = parseInt ( json . input . valor )
const data = new FormData ()
data . set ( 'start' , '{{$lastDic->format(' Y - m - d ')}}' )
data . set ( 'end' , '{{$venta->currentEstado()->fecha->sub(new DateInterval(' P1M '))->format(' Y - m - d ')}}' )
const url = '{{$urls->api}}/money/ipc'
return fetchAPI ( url , { method : 'post' , body : data }) . then ( response => {
if ( response . ok ) {
return response . json ()
}
}) . then ( json => {
this . terreno *= ( 1 + parseFloat ( json . ipc ))
2024-04-18 20:30:26 -04:00
this . update () . unidades ()
2023-11-30 18:40:15 -03:00
})
})
},
prorrateo : ( id , value ) => {
if ( parseFloat ( value ) === 0 ) {
return
}
const url = '{{$urls->api}}/ventas/unidad/' + id + '/prorrateo'
const data = new FormData ()
data . set ( 'prorrateo' , value )
return fetchAPI ( url , { method : 'post' , body : data }) . then ( response => {
if ( response . ok ) {
return response . json ()
}
}) . then ( json => {
if ( ! json . edited ) {
return
}
const idx = this . unidades . findIndex ( unidad => unidad . id === json . unidad_id )
this . unidades [ idx ] . prorrateo = parseFloat ( json . input . prorrateo )
2024-04-18 20:30:26 -04:00
})
},
propietarios : value => {
if ( value < this . propietarios . length ) {
for ( let i = value ; i < this . propietarios . length ; i ++ ) {
this . propietarios . splice ( i , 1 )
if ( i in this . facturas . keys ()) {
this . facturas [ i ] . splice ( i , 1 )
}
}
return
}
for ( let i = this . propietarios . length ; i < value ; i ++ ) {
const propietario = {
rut : '' ,
nombre : '' ,
direccion : '' ,
comuna : ''
}
this . propietarios . push ( propietario )
if ( ! ( i in this . facturas . keys ())) {
this . facturas . push ( new Factura ({ propietario , proporcion : 0 }))
}
}
},
proporciones : idx => {
const proporcion = $ ( " [name='proporcion " + ( idx + 1 ) + " '] " )
const proporciones = $ ( '.proporcion' )
const total = proporciones . toArray () . reduce (( sum , input ) => sum + parseInt ( $ ( input ) . val ()), 0 )
if ( total <= 100 ) {
this . facturas [ idx ] . props . proporcion = parseInt ( proporcion . val ()) / 100
return
}
const otros = proporciones . toArray () . filter ( input => input . name !== 'proporcion' + ( idx + 1 )) . reduce (( sum , input ) => sum + parseInt ( $ ( input ) . val ()), 0 )
proporcion . val ( 100 - otros )
this . facturas [ idx ] . props . proporcion = parseInt ( proporcion . val ()) / 100
},
rut : idx => {
this . propietarios [ idx ] . rut = $ ( " [name='rut " + ( idx + 1 ) + " '] " ) . val ()
},
propietario : idx => {
this . propietarios [ idx ] . nombre = $ ( " [name='propietario " + ( idx + 1 ) + " '] " ) . val ()
},
direccion : idx => {
this . propietarios [ idx ] . direccion = $ ( " [name='direccion " + ( idx + 1 ) + " '] " ) . val ()
},
comuna : idx => {
this . propietarios [ idx ] . comuna = $ ( " [name='comuna " + ( idx + 1 ) + " '] " ) . val ()
},
unidades : () => {
const ufFormatter = new Intl . NumberFormat ( 'es-CL' , { maximumFractionDigits : 2 , minimumFractionDigits : 2 })
let totalUnidades = 0
let precioUnidades = 0
let terreno = 0
let prorrateo = 0
this . unidades . forEach ( unidad => {
totalUnidades += parseFloat ( unidad . base )
precioUnidades += parseFloat ( unidad . precio )
terreno += parseFloat ( this . proyecto . terreno ) * parseFloat ( unidad . prorrateo )
prorrateo += parseFloat ( unidad . prorrateo )
})
$ ( '#total_unidades' )
. attr ( 'class' , 'ui compact segment ' + (( totalUnidades . toFixed ( 2 ) !== this . precio . toFixed ( 2 )) ? 'inverted red' : 'inverted green' ))
. html ( 'Total Unidades: ' + ufFormatter . format ( precioUnidades ) + ' UF' +
(( totalUnidades . toFixed ( 2 ) !== this . precio . toFixed ( 2 )) ? '; Diferencia: ' + ufFormatter . format ({{ $venta -> valor }} - precioUnidades ) + ' UF' : '' ))
if ( totalUnidades . toFixed ( 2 ) !== this . precio . toFixed ( 2 )) {
this . highlight ()
}
this . venta . base = totalUnidades
this . venta . precio = precioUnidades
this . venta . terreno = terreno
this . venta . prorrateo = prorrateo
this . venta . bruto = this . venta . base - this . venta . terreno
this . venta . neto = this . venta . bruto / 1.19
this . venta . iva = this . venta . neto * 0.19
this . venta . subtotal = this . venta . base + this . venta . iva
this . venta . total = this . venta . subtotal + this . venta . terreno
this . venta . totalUF = this . venta . total / this . uf
},
facturas : () => {
const facturas = $ ( this . props . ids . facturas )
facturas . html ( '' )
this . facturas . forEach (( factura , idx ) => {
factura . draw ({
parentDiv : facturas ,
inmobiliaria : this . inmobiliaria ,
proyecto : this . proyecto ,
propietario : this . propietarios [ idx ],
unidades : this . unidades ,
venta : this . venta ,
estadoVenta : this . estadoVenta ,
uf : this . uf ,
formatters : {
date : new Intl . DateTimeFormat ( 'es-CL' , { day : '2-digit' , month : '2-digit' , year : 'numeric' }),
pesos : new Intl . NumberFormat ( 'es-CL' , { maximumFractionDigits : 0 , minimumFractionDigits : 0 }),
ufs : new Intl . NumberFormat ( 'es-CL' , { maximumFractionDigits : 2 , minimumFractionDigits : 2 }),
percent : new Intl . NumberFormat ( 'es-CL' , { maximumFractionDigits : 5 , minimumFractionDigits : 5 })
}
})
2023-11-30 18:40:15 -03:00
})
2023-11-29 20:09:08 -03:00
}
}
},
watch : function () {
return {
2023-11-30 18:40:15 -03:00
prices : class_name => {
2023-11-29 20:09:08 -03:00
$ ( class_name ) . change ( event => {
const val = $ ( event . currentTarget ) . val ()
const id = $ ( event . currentTarget ) . data ( 'id' )
2024-04-18 20:30:26 -04:00
this . update () . price ( id , val ) . then (() => {
this . update () . unidades ()
})
2023-11-29 20:09:08 -03:00
})
2023-11-30 18:40:15 -03:00
},
prorrateo : class_name => {
$ ( class_name ) . change ( event => {
const val = $ ( event . currentTarget ) . val ()
const id = $ ( event . currentTarget ) . data ( 'id' )
2024-04-18 20:30:26 -04:00
this . update () . prorrateo ( id , val ) . then (() => {
this . update () . unidades ()
})
2023-11-30 18:40:15 -03:00
})
},
terreno : id => {
$ ( id ) . change ( event => {
const val = $ ( event . currentTarget ) . val ()
this . update () . terreno ( val ) . then (() => {
$ ( id ) . parent () . parent () . hide ()
2024-04-18 20:30:26 -04:00
this . update () . unidades ()
2023-11-30 18:40:15 -03:00
})
})
2024-04-18 20:30:26 -04:00
},
propietarios : id => {
$ ( id ) . change ( event => {
let val = $ ( event . currentTarget ) . val ()
if ( val < 1 ) {
$ ( event . currentTarget ) . val ( 1 )
val = 1
}
this . update () . propietarios ( val )
this . draw () . propietarios ()
})
2023-11-29 20:09:08 -03:00
}
}
},
2023-11-30 18:40:15 -03:00
highlight : function () {
const pid = this . unidades [ 0 ] . pid
const input = $ ( '#input' + pid )
input . addClass ( 'error' )
input . find ( '.label' ) . addClass ( 'red' )
input . attr ( 'data-content' , 'Valor total no es igual a valor de venta' )
input . popup ()
},
unhighlight : function () {
const pid = this . unidades [ 0 ] . pid
const input = $ ( '#input' + pid )
input . removeClass ( 'error' )
input . find ( '.label' ) . removeClass ( 'red' )
input . removeAttr ( 'data-content' )
},
2024-04-18 20:30:26 -04:00
setup : function ({ form_id , prices_class , prorrateo_class , terreno_id , propietarios_id , count_propietarios_id , facturas_id }) {
this . props . ids . facturas = facturas_id
this . props . ids . propietarios = propietarios_id
2023-11-29 20:09:08 -03:00
$ ( form_id ) . submit ( event => {
event . preventDefault ()
return false
})
this . watch () . prices ( prices_class )
2023-11-30 18:40:15 -03:00
this . watch () . prorrateo ( prorrateo_class )
2024-04-18 20:30:26 -04:00
this . watch () . propietarios ( count_propietarios_id )
@ if ( ! isset ( $terreno -> fecha ) or $terreno -> fecha -> getTimestamp () < 0 or $terreno -> fecha <= $lastDic )
2023-11-30 18:40:15 -03:00
this . watch () . terreno ( terreno_id )
@ endif
2024-04-18 20:30:26 -04:00
this . facturas . push ( new Factura ({ propietario : this . propietarios [ 0 ], proporcion : 1 }))
this . update () . unidades ()
this . update () . propietarios ( $ ( count_propietarios_id ) . val ())
this . draw () . propietarios ()
this . unidades . forEach (( unidad , idx ) => {
this . update () . proporciones ( idx )
})
this . update () . facturas ()
2023-11-29 20:09:08 -03:00
}
}
$ ( document ) . ready (() => {
2024-04-18 20:30:26 -04:00
facturasForm . setup ({ form_id : '#venta_form' , prices_class : '.price' , prorrateo_class : '.prorrateo' , terreno_id : '#terreno' , propietarios_id : '#propietarios' , count_propietarios_id : '#cantidad_propietarios' , facturas_id : '#facturas' })
2023-11-29 20:09:08 -03:00
})
</ script >
@ endpush