infoalloggi-monorepo/apps/infoalloggi/src/server/controllers/fic.controller.ts

255 lines
7.2 KiB
TypeScript
Raw Normal View History

import type { Client } from "@fattureincloud/fattureincloud-ts-sdk";
import { TRPCError } from "@trpc/server";
import type { UsersId } from "~/schemas/public/Users";
import { db } from "~/server/db";
2025-08-04 17:45:44 +02:00
import { clientsApi, companyId } from "~/server/FattureInCloud";
// export const getClientList = async () => {
// const clients = await clientsApi.listClients(
// companyId,
// undefined,
// "detailed",
// undefined,
// undefined,
// 100,
// );
// return clients.data;
// };
2025-08-04 17:45:44 +02:00
// export const searchClient = async (cognome: string) => {
// const clients = await clientsApi.listClients(
// companyId,
// undefined,
// "detailed",
// undefined,
// undefined,
// 100,
// `name contains '${cognome}'`,
// );
// return clients.data;
// };
2025-08-04 17:45:44 +02:00
export const getClientFromCF = async (cf: string) => {
2025-08-28 18:27:07 +02:00
if (cf.length < 11) {
return null;
}
const clients = await clientsApi.listClients(
companyId,
undefined,
"detailed",
undefined,
undefined,
100,
`tax_code = '${cf}'`,
);
return clients.data;
2025-08-04 17:45:44 +02:00
};
export const exportUserToFIC = async (userId: UsersId) => {
try {
const user = await db
.selectFrom("users")
.innerJoin("users_anagrafica", "users_anagrafica.userid", "users.id")
.select([
"users.email",
"users.nome",
"users.cognome",
"users.telefono",
"users_anagrafica.codice_fiscale",
"users_anagrafica.provincia_residenza",
"users_anagrafica.comune_residenza",
"users_anagrafica.cap_residenza",
"users_anagrafica.via_residenza",
"users_anagrafica.civico_residenza",
])
.leftJoin(
"nazioni",
"nazioni.catasto",
"users_anagrafica.nazione_residenza",
)
.select("nazioni.iso as nazione_iso")
.leftJoin("comuni", "comuni.catasto", "users_anagrafica.comune_residenza")
.select("comuni.nome as comune_nome")
.where("users.id", "=", userId)
.executeTakeFirstOrThrow();
if (!user.nazione_iso) {
throw new Error("Nazione non compatibile con esportazione FIC");
}
if (
!user.cap_residenza ||
!user.comune_residenza ||
!user.provincia_residenza ||
!user.via_residenza ||
!user.nazione_iso
) {
throw new Error("Utente mancante dati necessari per esportazione FIC");
}
const comune =
user.nazione_iso === "IT"
? user.comune_nome || user.comune_residenza
: user.comune_residenza;
const clientData: Client = {
name: `${user.cognome.toUpperCase()} ${user.nome.toUpperCase()}`.trim(),
type: "person",
first_name: user.nome.toUpperCase(),
last_name: user.cognome.toUpperCase(),
tax_code: user.codice_fiscale,
address_street: `${user.via_residenza.toUpperCase().replace(".", "")}${user.civico_residenza ? ` ${user.civico_residenza}` : ""}`,
address_postal_code: user.cap_residenza,
address_city: comune.toUpperCase(),
address_province: user.provincia_residenza.toUpperCase(),
country_iso: user.nazione_iso,
email: user.email,
phone: user.telefono || undefined,
ei_code: "0000000",
};
const req = await clientsApi.createClient(companyId, { data: clientData });
if (req.status !== 200) {
throw new Error(`Failed to create client in FIC: ${req.statusText}`);
}
return req.data;
} catch (error) {
if (error instanceof Error && "response" in error) {
// Log the actual FIC validation response
// biome-ignore lint/suspicious/noExplicitAny: <ok>
console.error("FIC API response data:", (error as any).response?.data);
}
console.error("Error exporting user to FIC:", error);
throw new TRPCError({
code: "INTERNAL_SERVER_ERROR",
message: "Failed to export user to Fatture In Cloud",
});
}
};
// function normalizeString(str: string): string {
// return str
// .toUpperCase()
// .replace("E'", "E")
// .replace("A'", "A")
// .replace("U'", "U")
// .replace("I'", "I")
// .replace("O'", "O")
// .replace("È", "E")
// .replace("É", "E")
// .replace("À", "A")
// .replace("Ù", "U")
// .replace("Ì", "I")
// .replace("Ò", "O");
// }
// type FICNation = {
// name: string;
// settings_name: string;
// iso: string;
// fiscal_iso: string;
// uic: string;
// banned: boolean;
// };
// const KnownConflicts: Record<string, string> = {
// BAHRAIN: "Z204",
// "BOSNIA ED ERZEGOVINA": "Z153",
// CINA: "Z210",
// KAZAKISTAN: "Z255",
// KENIA: "Z322",
// MACEDONIA: "Z148",
// MOLDAVIA: "Z140",
// "PORTO RICO": "Z518",
// RUSSIA: "Z154",
// "STATI UNITI": "Z404",
// };
// export const nazioniSync = async () => {
// const raw = readFileSync("fic_nations.json", "utf-8");
// const data: FICNation[] = (JSON.parse(raw) as { data: FICNation[] }).data;
// console.log(`Parsed ${data.length} FIC nations`);
// // console.log(data);
// const dbData = await db.selectFrom("nazioni").selectAll().execute();
// const dbNazioniMap = new Map(
// dbData.map((nazione) => [normalizeString(nazione.nome), nazione]),
// );
// const toUpdate: { catasto: string; iso: string }[] = [];
// for (const nation of data) {
// const normalizedName = normalizeString(nation.name);
// const existing = dbNazioniMap.get(normalizedName);
// if (existing) {
// if (existing.iso !== nation.iso) {
// // await db
// // .updateTable("nazioni")
// // .set({ iso: nation.iso })
// // .where("id", "=", existing.id)
// // .execute();
// toUpdate.push({ catasto: existing.catasto, iso: nation.iso });
// }
// } else {
// const k = KnownConflicts[normalizedName];
// if (k) {
// toUpdate.push({ catasto: k, iso: nation.iso });
// continue;
// }
// console.warn(
// `Nation ${nation.name.toUpperCase()} not found in DB, consider adding it with ISO ${nation.iso}`,
// );
// }
// }
// console.log("Nazioni to update:", toUpdate);
// //write a txt file with the update statements
// const updateStatements = toUpdate
// .map((u) => `('${u.catasto}', '${u.iso}')`)
// .join(",\n");
// const sql = `UPDATE nazioni SET iso = data.iso FROM (VALUES\n${updateStatements}\n) AS data(catasto, iso) WHERE nazioni.catasto = data.catasto;`;
// writeFileSync("nazioni_update.sql", sql);
//};
// export const ficCapSync = async () => {
// try {
// const comuni = await infosApi.listCities();
// const nazioni = await infosApi.listDetailedCountries();
// if (comuni.status === 200) {
// const data = comuni.data.data;
// if (data) {
// await db.transaction().execute(async (trx) => {
// for (const comune of data) {
// if (comune.city && comune.postal_code && comune.province) {
// await trx
// .updateTable("comuni")
// .set({
// cap: comune.postal_code,
// })
// .where("nome", "=", comune.city.toUpperCase())
// .execute();
// }
// }
// });
// }
// }
// if (nazioni.status === 200) {
// const data = nazioni.data.data;
// if (data) {
// await db.transaction().execute(async (trx) => {
// for (const nazione of data) {
// if (nazione.name && nazione.iso) {
// await trx
// .updateTable("nazioni")
// .set({
// iso: nazione.iso,
// })
// .where("nazioni.nome", "=", nazione.name.toUpperCase())
// .execute();
// }
// }
// });
// }
// }
// } catch (error) {
// console.error("Error syncing FIC catasto:", error);
// }
// };