Matriz facturacion
This commit is contained in:
@ -60,25 +60,33 @@
|
||||
return this.ufs[json.input.fecha] = json.uf
|
||||
})
|
||||
},
|
||||
ipc: (end, start) => {
|
||||
ipc: ({end, start}) => {
|
||||
const dateKey = [start.getFullYear(), (start.getMonth()+1), end.getFullYear(), (end.getMonth()+1)].join('-')
|
||||
if (typeof this.sent.ipc[dateKey] !== 'undefined') {
|
||||
return this.sent.ipc[dateKey]
|
||||
}
|
||||
let mult = 1
|
||||
if (start > end) {
|
||||
const tmp = structuredClone(end)
|
||||
end = structuredClone(start)
|
||||
start = tmp
|
||||
mult = -1
|
||||
}
|
||||
const url = '{{$urls->api}}/money/ipc'
|
||||
const data = new FormData()
|
||||
data.set('start', start.toISOString())
|
||||
data.set('end', end.toISOString())
|
||||
data.set('start', [start.getFullYear() + ((start.getMonth() > 0) ? 0 : -1), start.getMonth(), start.getDate()].join('-'))
|
||||
data.set('end', [end.getFullYear() + ((end.getMonth() > 0) ? 0 : -1), end.getMonth(), end.getDate()].join('-'))
|
||||
const options = {
|
||||
method: 'post',
|
||||
body: data
|
||||
}
|
||||
return this.sent.ipc[dateKey] = fetchAPI(url, options).then(response => {
|
||||
if (response.ok) {
|
||||
return response.json()
|
||||
if (!response) {
|
||||
return
|
||||
}
|
||||
}).then(json => {
|
||||
return this.ipcs[json.date_string] = json.ipc
|
||||
return response.json().then(json => {
|
||||
return this.ipcs[dateKey] = json.ipc * mult
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -92,8 +100,7 @@
|
||||
prorrateo
|
||||
precio
|
||||
|
||||
constructor({id, tipo, descripcion, prorrateo, precio})
|
||||
{
|
||||
constructor({id, tipo, descripcion, prorrateo, precio}) {
|
||||
this.id = id
|
||||
this.tipo = tipo
|
||||
this.descripcion = descripcion
|
||||
@ -111,44 +118,13 @@
|
||||
unidades
|
||||
principal
|
||||
|
||||
constructor({id, precio, fecha, escritura}) {
|
||||
constructor({id, precio, fecha, escritura, unidades, principal}) {
|
||||
this.id = id
|
||||
this.precio = precio
|
||||
this.fecha = fecha
|
||||
this.escritura = escritura
|
||||
this.uf = 1
|
||||
this.ipc = 1
|
||||
this.unidades = []
|
||||
}
|
||||
|
||||
get() {
|
||||
return {
|
||||
unidades: () => {
|
||||
const url = '{{$urls->api}}/venta/' + this.id + '/unidades'
|
||||
return fetchAPI(url).then(response => {
|
||||
if (response.ok) {
|
||||
return response.json()
|
||||
}
|
||||
}).then(json => {
|
||||
json.unidades.forEach(unidad => {
|
||||
const tipo = unidad.proyecto_tipo_unidad.tipo_unidad.descripcion
|
||||
const data = {
|
||||
id: unidad.id,
|
||||
tipo: tipo.charAt(0).toUpperCase() + tipo.slice(1),
|
||||
descripcion: unidad.descripcion,
|
||||
prorrateo: unidad.prorrateo,
|
||||
precio: 0
|
||||
}
|
||||
if (unidad.current_precio !== null) {
|
||||
data.precio = unidad.current_precio.valor
|
||||
}
|
||||
const u = new Unidad(data)
|
||||
this.unidades.push(u)
|
||||
})
|
||||
this.principal = this.unidades.filter(unidad => unidad.tipo === 'Departamento')[0]
|
||||
})
|
||||
}
|
||||
}
|
||||
this.fecha = new Date(fecha)
|
||||
this.escritura = new Date(escritura)
|
||||
this.unidades = unidades
|
||||
this.principal = principal
|
||||
}
|
||||
|
||||
draw({tbody, valor_terreno}) {
|
||||
@ -173,7 +149,7 @@
|
||||
const dateFormatter = new Intl.DateTimeFormat('es-CL', {year: 'numeric', month: 'numeric', day: 'numeric'})
|
||||
const pesosFormatter = new Intl.NumberFormat('es-CL', {style: 'currency', currency: 'CLP'})
|
||||
const ufFormatter = new Intl.NumberFormat('es-CL', {minimumFractionDigits: 2, maximumFractionDigits: 2})
|
||||
const venta = this.unidades[0].descripcion
|
||||
const venta = this.principal.descripcion
|
||||
const cantidad = this.unidades.length
|
||||
this.unidades.forEach(unidad => {
|
||||
const values = [
|
||||
@ -195,7 +171,8 @@
|
||||
''
|
||||
]
|
||||
if (this.escritura !== null) {
|
||||
const descuento = valor_terreno * (1 + this.ipc / 100) * unidad.prorrateo
|
||||
const ipc = (this.ipc >= 0) ? (1 + this.ipc) : 1 / (1 + this.ipc)
|
||||
const descuento = valor_terreno * ipc * unidad.prorrateo
|
||||
const precio_venta = unidad.precio * this.uf
|
||||
const precio_bruto = precio_venta - descuento
|
||||
const precio_neto = precio_bruto / 1.19
|
||||
@ -210,7 +187,7 @@
|
||||
values[i++] = (iva / precio_venta * 100).toFixed(2) + '%'
|
||||
values[i++] = dateFormatter.format(this.escritura)
|
||||
values[i++] = ufFormatter.format(this.uf)
|
||||
values[i++] = (this.ipc).toFixed(2) + '%'
|
||||
values[i++] = ufFormatter.format(this.ipc >= 0 ? this.ipc * 100 : -this.ipc * 100) + '%'
|
||||
}
|
||||
const row = $('<tr></tr>')
|
||||
values.forEach(value => {
|
||||
@ -227,6 +204,10 @@
|
||||
selected: 0,
|
||||
data: JSON.parse('{!! json_encode($proyectos) !!}'),
|
||||
sent: false,
|
||||
queues: {
|
||||
uf: {},
|
||||
ipc: {}
|
||||
},
|
||||
ufs: {},
|
||||
ipcs: {},
|
||||
table: null,
|
||||
@ -243,89 +224,99 @@
|
||||
if (!response) {
|
||||
return
|
||||
}
|
||||
return response.json()
|
||||
}).then(json => {
|
||||
const idx = this.data.findIndex(proyecto => proyecto.id === json.proyecto_id)
|
||||
const fecha_terreno = (typeof this.data[idx].terreno.date === 'undefined') ? new Date() : new Date(this.data[idx].terreno.date)
|
||||
this.data[idx]['ventas'] = []
|
||||
const ventas = []
|
||||
const unidadesQueue = []
|
||||
const ufQueue = {}
|
||||
const ipcQueue = {}
|
||||
const chunkSize = 100
|
||||
const url = '{{$urls->api}}/ventas/get'
|
||||
for (let i = 0; i < json.ventas.length; i += chunkSize) {
|
||||
const chunk = json.ventas.slice(i, i + chunkSize).map(venta => venta.id)
|
||||
const body = new FormData()
|
||||
body.set('ventas', chunk)
|
||||
const promise = fetchAPI(url, {method: 'post', body}).then(response => {
|
||||
if (!response) {
|
||||
return response
|
||||
}
|
||||
return response.json().then(json => {
|
||||
json.ventas.forEach(venta => {
|
||||
const data = {
|
||||
id: venta.id,
|
||||
precio: venta.valor,
|
||||
fecha: new Date(venta.fecha),
|
||||
escritura: new Date(venta.fecha)
|
||||
}
|
||||
if (['escriturando'].includes(venta.current_estado.tipo_estado_venta.descripcion)) {
|
||||
data.escritura = new Date(venta.current_estado.fecha)
|
||||
}
|
||||
const v = new Venta(data)
|
||||
if (v.escritura !== null) {
|
||||
const dateString = v.escritura.toString()
|
||||
if (!Object.hasOwn(ufQueue, dateString)) {
|
||||
ufQueue[dateString] = []
|
||||
}
|
||||
ufQueue[dateString].push(v.id)
|
||||
if (!Object.hasOwn(ipcQueue, dateString)) {
|
||||
ipcQueue[dateString] = []
|
||||
}
|
||||
ipcQueue[dateString].push(v.id)
|
||||
}
|
||||
unidadesQueue.push(v.id)
|
||||
this.data[idx].ventas.push(v)
|
||||
|
||||
})
|
||||
});
|
||||
})
|
||||
ventas.push(promise)
|
||||
}
|
||||
Promise.all(ventas).then(() => {
|
||||
const promises = []
|
||||
Object.entries(ufQueue).forEach(([dateString, ventas]) => {
|
||||
const date = new Date(dateString)
|
||||
promises.push(money.get().uf(date).then(uf => {
|
||||
ventas.forEach(id => {
|
||||
const vidx = this.data[idx].ventas.findIndex(venta => venta.id === id)
|
||||
this.data[idx].ventas[vidx].uf = uf
|
||||
})
|
||||
}))
|
||||
})
|
||||
Object.entries(ipcQueue).forEach(([dateString, ventas]) => {
|
||||
const date = new Date(dateString)
|
||||
promises.push(money.get().ipc(date, fecha_terreno).then(ipc => {
|
||||
ventas.forEach(id => {
|
||||
const vidx = this.data[idx].ventas.findIndex(venta => venta.id === id)
|
||||
this.data[idx].ventas[vidx].ipc = ipc
|
||||
})
|
||||
}))
|
||||
})
|
||||
for (let i = 0; i < unidadesQueue.length; i += chunkSize) {
|
||||
const chunk = unidadesQueue.slice(i, i + chunkSize)
|
||||
chunk.forEach(id => {
|
||||
const vidx = this.data[idx].ventas.findIndex(venta => venta.id === id)
|
||||
promises.push(this.data[idx].ventas[vidx].get().unidades())
|
||||
})
|
||||
return response.json().then(json => {
|
||||
const idx = this.data.findIndex(proyecto => proyecto.id === json.proyecto_id)
|
||||
this.data[idx]['ventas'] = []
|
||||
const ventas = []
|
||||
const chunkSize = 100
|
||||
for (let i = 0; i < json.ventas.length; i += chunkSize) {
|
||||
const chunk = json.ventas.slice(i, i + chunkSize).map(venta => venta.id)
|
||||
ventas.push(this.get().chunk({idx, chunk}))
|
||||
}
|
||||
Promise.all(promises).then(() => {
|
||||
this.draw().ventas(idx)
|
||||
this.sent = false
|
||||
Promise.all(ventas).then(() => {
|
||||
const promises = []
|
||||
promises.push(...this.get().ufs(idx))
|
||||
promises.push(...this.get().ipcs(idx))
|
||||
Promise.all(promises).then(() => {
|
||||
this.draw().ventas(idx)
|
||||
this.sent = false
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
},
|
||||
chunk: ({idx, chunk}) => {
|
||||
const url = '{{$urls->api}}/ventas/facturacion/get'
|
||||
const method = 'post'
|
||||
const body = new FormData()
|
||||
body.set('ventas', chunk)
|
||||
|
||||
return fetchAPI(url, {method, body}).then(response => {
|
||||
if (!response) {
|
||||
return response
|
||||
}
|
||||
return response.json().then(json => {
|
||||
json.ventas.forEach(venta => {
|
||||
this.add().venta({proyecto_idx: idx, venta})
|
||||
})
|
||||
});
|
||||
})
|
||||
},
|
||||
ufs: idx => {
|
||||
const promises = []
|
||||
Object.entries(this.queues.uf).forEach(([dateString, ventas]) => {
|
||||
const date = new Date(dateString)
|
||||
promises.push(money.get().uf(date).then(uf => {
|
||||
ventas.forEach(id => {
|
||||
const vidx = this.data[idx].ventas.findIndex(venta => venta.id === id)
|
||||
this.data[idx].ventas[vidx].uf = uf
|
||||
})
|
||||
}))
|
||||
})
|
||||
return promises
|
||||
},
|
||||
ipcs: idx => {
|
||||
const fecha_terreno = (typeof this.data[idx].terreno.date === 'undefined') ? new Date() : new Date(this.data[idx].terreno.date)
|
||||
const promises = []
|
||||
Object.entries(this.queues.ipc).forEach(([dateString, ventas]) => {
|
||||
const date = new Date(dateString)
|
||||
promises.push(money.get().ipc({end: date, start: fecha_terreno}).then(ipc => {
|
||||
ventas.forEach(id => {
|
||||
const vidx = this.data[idx].ventas.findIndex(venta => venta.id === id)
|
||||
this.data[idx].ventas[vidx].ipc = ipc
|
||||
})
|
||||
}))
|
||||
})
|
||||
return promises
|
||||
}
|
||||
}
|
||||
},
|
||||
add() {
|
||||
return {
|
||||
venta: ({proyecto_idx, venta}) => {
|
||||
const v = new Venta(venta)
|
||||
this.data[proyecto_idx].ventas.push(v)
|
||||
if (v.escritura !== null) {
|
||||
const dateString = v.escritura.toString()
|
||||
this.register().uf({dateString, venta_id: v.id})
|
||||
this.register().ipc({dateString, venta_id: v.id})
|
||||
}
|
||||
},
|
||||
}
|
||||
},
|
||||
register() {
|
||||
return {
|
||||
uf: ({dateString, venta_id}) => {
|
||||
if (!Object.hasOwn(this.queues.uf, dateString)) {
|
||||
this.queues.uf[dateString] = []
|
||||
}
|
||||
this.queues.uf[dateString].push(venta_id)
|
||||
},
|
||||
ipc: ({dateString, venta_id}) => {
|
||||
if (!Object.hasOwn(this.queues.ipc, dateString)) {
|
||||
this.queues.ipc[dateString] = []
|
||||
}
|
||||
this.queues.ipc[dateString].push(venta_id)
|
||||
}
|
||||
}
|
||||
},
|
||||
|
Reference in New Issue
Block a user