Advertisement
acsstudios

Untitled

Jan 17th, 2025
411
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
TypeScript 5.23 KB | Source Code | 0 0
  1. async function computeProjects() {
  2.     const descansoThis = (x, inicio, final) =>
  3.         x.inicio >= inicio && ((final && x.final && x.final <= final) || (!x.final && !final));
  4.     const hoy = new Date();
  5.     await db.delete(computoFichadosProyectos).where(lte(computoFichadosProyectos.createdAt, hoy));
  6.     const select = await db.select().from(proyectos);
  7.     function gad(p, x) {
  8.         try {
  9.             const start0 = x.inicio as Date;
  10.             const end0 = x.final;
  11.             const len = end0.getTime() - start0.getTime();
  12.             return p + len;
  13.         } catch {
  14.             return p;
  15.         }
  16.     }
  17.     async function computeFichs(item: Record<string, unknown>, idp: number) {
  18.         const descansos = await db
  19.             .select()
  20.             .from(fichajesDescansos)
  21.             .where(
  22.                 and(eq(fichajesDescansos.fichajeId, item.id as number), isNotNull(fichajesDescansos.final))
  23.             );
  24.         const start = item.inicio as Date;
  25.         const cambio = await db
  26.             .select()
  27.             .from(fichajesCambiosProyecto)
  28.             .where(eq(fichajesCambiosProyecto.fichajeId, item.id as number))
  29.             .orderBy(desc(fichajesCambiosProyecto.id));
  30.         const end = cambio[0] ? cambio[0].inicio : item.final;
  31.  
  32.         const durcambios = cambio.reduce((p, x) => {
  33.             if (x.id_proyecto === item.id_proyecto) {
  34.                 try {
  35.                     const start = x.inicio as Date;
  36.                     const end = x.final;
  37.                     const len = end.getTime() - start.getTime();
  38.                     return p + len;
  39.                 } catch {
  40.                     return p;
  41.                 }
  42.             } else {
  43.                 return p;
  44.             }
  45.         }, 0);
  46.         const len = end ? end.getTime() - start.getTime() : 'pending';
  47.         let result;
  48.         if (item.id_proyecto === idp) {
  49.             result =
  50.                 len === 'pending'
  51.                     ? 0
  52.                     : len -
  53.                         descansos
  54.                             .filter((x) => {
  55.                                 return (
  56.                                     (item.id_proyecto === idp && descansoThis(x, start, end)) ||
  57.                                     cambio
  58.                                         .filter((y) => y.id_proyecto === idp)
  59.                                         .some((y) => descansoThis(x, y.inicio, y.final))
  60.                                 );
  61.                             })
  62.                             .reduce(gad, 0) +
  63.                         durcambios;
  64.         } else {
  65.             result = -descansos.reduce(gad, 0) + durcambios;
  66.         }
  67.  
  68.         try {
  69.             await db.insert(computoFichadosProyectos).values({
  70.                 id_proyecto: item.id_proyecto as number,
  71.                 id_capitulo: item.id_capitulo as number,
  72.                 idUsuario: item.idUsuario as string,
  73.                 idFichaje: item.id as number,
  74.                 inicio: item.inicio as Date,
  75.                 final: end as Date,
  76.                 createdAt: hoy as Date,
  77.                 computoNeto: result
  78.             });
  79.         } catch (e) {
  80.             await db.update(computoFichadosProyectos).set({
  81.                 computoNeto:
  82.                     BigInt(result) +
  83.                     (
  84.                         await db
  85.                             .select()
  86.                             .from(computoFichadosProyectos)
  87.                             .where(
  88.                                 and(
  89.                                     eq(computoFichadosProyectos.id_proyecto, item.id_proyecto as number),
  90.                                     eq(computoFichadosProyectos.id_capitulo, item.id_capitulo as number),
  91.                                     eq(computoFichadosProyectos.idUsuario, item.idUsuario as string),
  92.                                     eq(computoFichadosProyectos.idFichaje, item.id as number)
  93.                                 )
  94.                             )
  95.                     )[0].computoNeto
  96.             });
  97.         }
  98.     }
  99.     const promises = [];
  100.     for (const project of select) {
  101.         promises.push(
  102.             (async function () {
  103.                 console.log('yeah');
  104.                 const fichs = await db.select().from(fichajes).where(eq(fichajes.id_proyecto, project.id));
  105.                 const fichs2 = [];
  106.                 const cambios = await db
  107.                     .select()
  108.                     .from(fichajesCambiosProyecto)
  109.                     .where(eq(fichajesCambiosProyecto.id_proyecto, project.id));
  110.                 for (const cc of cambios) {
  111.                     if (cc.id_proyecto === project.id && !fichs.some((x) => x.id === cc.fichajeId)) {
  112.                         fichs2.push(cc);
  113.                     }
  114.                 }
  115.                 for (const item of fichs) {
  116.                     await computeFichs(item, project.id);
  117.                 }
  118.                 for (const item of fichs2) {
  119.                     const descansos = (
  120.                         await db
  121.                             .select()
  122.                             .from(fichajesDescansos)
  123.                             .where(eq(fichajesDescansos.fichajeId, item.fichajeId))
  124.                     )
  125.                         .filter((x) => {
  126.                             return descansoThis(x, item.inicio, item.final);
  127.                         })
  128.                         .reduce(gad, 0);
  129.  
  130.                     const start = item.inicio as Date;
  131.                     const end = item.final;
  132.                     const len = end ? end.getTime() - start.getTime() : 'pending';
  133.  
  134.                     const fichajeId = (
  135.                         await db.select().from(fichajes).where(eq(fichajes.id, item.fichajeId))
  136.                     )[0];
  137.                     const result = len === 'pending' ? 0 : len - descansos;
  138.                     try {
  139.                         await db.insert(computoFichadosProyectos).values({
  140.                             id_proyecto: fichajeId.id_proyecto as number,
  141.                             id_capitulo: fichajeId.id_capitulo as number,
  142.                             idUsuario: fichajeId.idUsuario as string,
  143.                             idFichaje: fichajeId.id as number,
  144.                             inicio: fichajeId.inicio as Date,
  145.                             final: end as Date,
  146.                             createdAt: hoy as Date,
  147.                             computoNeto: result
  148.                         });
  149.                     } catch (e) {
  150.                         await db.update(computoFichadosProyectos).set({
  151.                             computoNeto:
  152.                                 BigInt(result) +
  153.                                 (
  154.                                     await db
  155.                                         .select()
  156.                                         .from(computoFichadosProyectos)
  157.                                         .where(
  158.                                             and(
  159.                                                 eq(computoFichadosProyectos.id_proyecto, fichajeId.id_proyecto as number),
  160.                                                 eq(computoFichadosProyectos.id_capitulo, fichajeId.id_capitulo as number),
  161.                                                 eq(computoFichadosProyectos.idUsuario, fichajeId.idUsuario as string),
  162.                                                 eq(computoFichadosProyectos.idFichaje, fichajeId.id as number)
  163.                                             )
  164.                                         )
  165.                                 )[0].computoNeto
  166.                         });
  167.                     }
  168.                 }
  169.             })()
  170.         );
  171.     }
  172.     await Promise.all(promises);
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement