Skip to content

Commit

Permalink
Run extra input program during multi edit.
Browse files Browse the repository at this point in the history
  • Loading branch information
daliusd committed Jun 22, 2024
1 parent 5a9f046 commit 09c4f0f
Show file tree
Hide file tree
Showing 8 changed files with 115 additions and 32 deletions.
6 changes: 6 additions & 0 deletions articles/keliu-saskaitu-keitimas.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,9 @@ išsaugota į Google Drive, tai antrą kartą ji nebus saugoma.
**Pastaba**: turite būti suteikę haiku.lt sistemai teises saugoti dokumentus į
jūsų Google Drive. Jei nesate to padarę, atsijunkite nuo haiku.lt ir
prisijungimo metu suteikite šias teises.

## Pastaba apie papildomos informacijos programavimą

Automatizavus [papildomos informacijos
programavimą](/straipsniai/papildomos-informacijos-programavimas) galima
sutaupyti laiko keičiant kelias sąskaitas.
6 changes: 5 additions & 1 deletion articles/pakeitimai.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: 'Pakeitimai'
date: '2021-04-02'
modified: '2024-06-14'
modified: '2024-06-22'
---

Čia rasite kas yra pakeista sistemoje pagal datą (nuo naujausių
Expand All @@ -10,6 +10,10 @@ pakeitimų iki seniausių).
Jei turite klausimų ar pasiūlymų rašykite el. paštu
[dalius@haiku.lt](mailto:dalius@haiku.lt).

## 2024-06-22

- Patobulinimai papildomos informacijos programavime

## 2024-06-16

- Pridėtas [Papildomos informacijos
Expand Down
3 changes: 3 additions & 0 deletions articles/papildomos-informacijos-programavimas.md
Original file line number Diff line number Diff line change
Expand Up @@ -131,5 +131,8 @@ kaskart pasikeitus laukams.
// AUTO
```

Programa pažymėta `// AUTO` bus taip pat vykdoma [keičiant kelias sąskaitas
faktūras](/straipsniai/keliu-saskaitu-keitimas).

`formatDate` yra tik pagalbinė funkcija, kuri suformatuoja datą
YYYY-MM-DD formatu, pvz.: 2024-06-26
43 changes: 13 additions & 30 deletions components/InvoiceEdit/ExtraInput.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { useCallback, useEffect, useState } from 'react';
import { RecoilState, useRecoilState } from 'recoil';
import useSWR from 'swr';
import { getQuickJS, shouldInterruptAfterDeadline } from 'quickjs-emscripten';
import { notifications } from '@mantine/notifications';
import { Button, Textarea } from '@mantine/core';

Expand All @@ -22,8 +21,8 @@ import {
seriesNameState,
} from '../../src/atoms';
import { useDebounce } from 'react-use';
import { getMsSinceEpoch } from '../../utils/date';
import { usePlan } from '../../src/usePlan';
import { runExtraInputProgram } from '../utils/runExtraInputProgram';

function useDebouncedRecoilState<T>(recoilState: RecoilState<T>) {
const [value] = useRecoilState(recoilState);
Expand Down Expand Up @@ -71,35 +70,19 @@ export default function ExtraInput() {
if (isFree || !extraInputProgram || disabled) {
return;
}
const qjs = await getQuickJS();

const price = (lineItems || [])
.map((g) => g.price * g.amount)
.reduce((a, b) => a + b, 0);

const program = `
const invoiceType = ${JSON.stringify(invoiceType || 'standard')};
const seriesName = ${JSON.stringify(seriesName)};
const seriesId = ${seriesId};
const date = new Date(${getMsSinceEpoch(invoiceDate || new Date())});
const language = ${JSON.stringify(language || 'lt')};
const seller = ${JSON.stringify(seller)};
const buyer = ${JSON.stringify(buyer)};
const email = ${JSON.stringify(email)};
const issuer = ${JSON.stringify(issuer)};
const items = ${JSON.stringify(lineItems || [])};
const price = ${price};
function formatDate(date) {
return date.toISOString().slice(0, 10);
}
${extraInputProgram}
`;

const result = qjs.evalCode(program, {
shouldInterrupt: shouldInterruptAfterDeadline(Date.now() + 5000),
memoryLimitBytes: 1024 * 1024,
const result = await runExtraInputProgram({
lineItems,
invoiceType,
seriesName,
seriesId,
invoiceDate,
language,
seller,
buyer,
email,
issuer,
extraInputProgram,
});
setExtra(result as string);
} catch (e) {
Expand Down
23 changes: 23 additions & 0 deletions components/MultiEditModal/InvoicesTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {
Text,
} from '@mantine/core';
import { useSession } from 'next-auth/react';
import useSWR from 'swr';

import { IInvoice } from '../../db/db';
import { getDateString, getMsSinceEpoch } from '../../utils/date';
Expand All @@ -24,6 +25,7 @@ import { getInvoice } from '../api/getInvoice';
import { postInvoicegdrive } from '../api/postInvoicegdrive';
import { putInvoices } from '../api/putInvoices';
import Link from '../../src/Link';
import { runExtraInputProgram } from '../utils/runExtraInputProgram';

interface Props {
invoices: IInvoice[];
Expand All @@ -37,6 +39,10 @@ export function InvoicesTable({ invoices, onChange }: Props) {
const gmailSend =
session && (session as unknown as { gmailSend: boolean }).gmailSend;
const gdrive = session && (session as unknown as { gdrive: boolean }).gdrive;
const { data: extraInputProgramData } = useSWR(
'/api/settings/extrainputprogram',
);
const extraInputProgram = extraInputProgramData?.value as string;

const [selectedRows, setSelectedRows] = useState<number[]>(
invoices.map((i) => i.id),
Expand Down Expand Up @@ -89,6 +95,23 @@ export function InvoicesTable({ invoices, onChange }: Props) {
}
invoice.created = getMsSinceEpoch(new Date());

if (extraInputProgram?.startsWith('// AUTO')) {
const result = await runExtraInputProgram({
lineItems: invoice.lineItems,
invoiceType: invoice.invoiceType,
seriesName: invoice.seriesName,
seriesId: invoice.seriesId.toString(),
invoiceDate: new Date(invoice.created),
language: invoice.language,
seller: invoice.seller,
buyer: invoice.buyer,
email: invoice.email,
issuer: invoice.issuer,
extraInputProgram,
});
invoice.extra = result as string;
}

const newInvoice = await postInvoices(invoice, '');
if (!newInvoice.success) {
return 'failure';
Expand Down
4 changes: 3 additions & 1 deletion components/api/getInvoiceBySourceId.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { IInvoice } from '../../db/db';

export const getInvoiceBySourceId = async (sourceId: string | number) => {
let response: Response;

Expand All @@ -15,5 +17,5 @@ export const getInvoiceBySourceId = async (sourceId: string | number) => {
}

const responseJson = await response.json();
return { success: true, invoice: responseJson.invoice };
return { success: true, invoice: responseJson.invoice as IInvoice };
};
61 changes: 61 additions & 0 deletions components/utils/runExtraInputProgram.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import { getQuickJS, shouldInterruptAfterDeadline } from 'quickjs-emscripten';
import { getMsSinceEpoch } from '../../utils/date';
import { ILineItem } from '../../db/db';

export async function runExtraInputProgram({
lineItems,
invoiceType,
seriesName,
seriesId,
invoiceDate,
language,
seller,
buyer,
email,
issuer,
extraInputProgram,
}: {
lineItems: ILineItem[];
invoiceType: string;
seriesName: string;
seriesId: string;
invoiceDate: Date;
language: string;
seller: string;
buyer: string;
email: string;
issuer: string;
extraInputProgram: string;
}) {
const qjs = await getQuickJS();

const price = (lineItems || [])
.map((g) => g.price * g.amount)
.reduce((a, b) => a + b, 0);

const program = `
const invoiceType = ${JSON.stringify(invoiceType || 'standard')};
const seriesName = ${JSON.stringify(seriesName)};
const seriesId = ${seriesId};
const date = new Date(${getMsSinceEpoch(invoiceDate || new Date())});
const language = ${JSON.stringify(language || 'lt')};
const seller = ${JSON.stringify(seller)};
const buyer = ${JSON.stringify(buyer)};
const email = ${JSON.stringify(email)};
const issuer = ${JSON.stringify(issuer)};
const items = ${JSON.stringify(lineItems || [])};
const price = ${price};
function formatDate(date) {
return date.toISOString().slice(0, 10);
}
${extraInputProgram}
`;

const result = qjs.evalCode(program, {
shouldInterrupt: shouldInterruptAfterDeadline(Date.now() + 5000),
memoryLimitBytes: 1024 * 1024,
});
return result;
}
1 change: 1 addition & 0 deletions pages/api/initial.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => {
pdfname: '',
paid: 0,
locked: 0,
sent: 0,
seller,
issuer,
extra,
Expand Down

0 comments on commit 09c4f0f

Please sign in to comment.