UNPKG

@accounter/server

Version:
182 lines 7.75 kB
import { GreenInvoiceClientProvider } from '../../app-providers/green-invoice-client.js'; import { validateClientIntegrations } from '../../financial-entities/helpers/clients.helper.js'; import { BusinessesProvider } from '../../financial-entities/providers/businesses.provider.js'; import { ClientsProvider } from '../../financial-entities/providers/clients.provider.js'; import { countryCodeToGreenInvoiceCountry } from './green-invoice.helper.js'; function convertLocalClientToGreenInvoiceCreateClientInput(localClient, localBusiness) { return { /** Phone number */ phone: localBusiness.phone_number, /** Mobile number */ // mobile: localBusiness.mobile_number, /** Email addresses */ emails: localClient.emails, /** Fax number */ // fax: localBusiness.fax_number, /** Contact person name */ // contactPerson: localBusiness.contact_person, /** Street address */ address: localBusiness.address, /** City name */ city: localBusiness.city, /** Zip/postal code */ zip: localBusiness.zip_code, country: countryCodeToGreenInvoiceCountry(localBusiness.country), /** Bank name */ // bankName: localBusiness.bank_name, /** Bank branch number */ // bankBranch: localBusiness.bank_branch_number, /** Bank account number */ // bankAccount: localBusiness.bank_account_number, /** The client name */ name: localBusiness.name, /** Is the client currently active or not */ active: localBusiness.is_active, /** The client tax ID */ taxId: localBusiness.vat_number, // paymentTerms: localClient.payment_terms, // labels: localClient.labels, /** Whether to send emails to the user automatically when assigning him to an invoice or not */ // send: localClient.send, /** The client department */ // department: localClient.department, /** The client accounting key */ accountingKey: localBusiness.sort_code?.toString(), /** The category this client is related to */ // category: localClient.category, /** The sub category this client is related to */ // subCategory: localClient.sub_category, /** Client remarks for self use */ // remarks: localClient.remarks, }; } export async function addGreenInvoiceClient(clientId, injector) { try { // validate local client const localBusinessPromise = injector .get(BusinessesProvider) .getBusinessByIdLoader.load(clientId); const localClientPromise = injector.get(ClientsProvider).getClientByIdLoader.load(clientId); const [localBusiness, localClient] = await Promise.all([ localBusinessPromise, localClientPromise, ]); if (!localBusiness) { throw new Error('Business not found'); } if (!localClient) { throw new Error('Client not found'); } // validate details const greenInvoiceCreatClientInput = convertLocalClientToGreenInvoiceCreateClientInput(localClient, localBusiness); // add to green invoice const greenInvoiceClient = await injector .get(GreenInvoiceClientProvider) .createClient(greenInvoiceCreatClientInput); if (!greenInvoiceClient?.id) { throw new Error('Failed to create Green Invoice client'); } const integrations = validateClientIntegrations(localClient.integrations); // add green invoice id to local client await injector.get(ClientsProvider).updateClient({ businessId: clientId, integrations: { ...integrations, greenInvoiceId: greenInvoiceClient.id, }, }); } catch (error) { const message = 'Error adding Green Invoice client'; console.error(`${message}: ${error}`); throw new Error(message, { cause: error }); } } function pickGreenInvoiceClientFields(businessFields, clientFields) { const fieldsToUpdate = { /** Phone number */ phone: businessFields.phoneNumber, /** Mobile number */ // mobile: businessFields.mobile_number, /** Email addresses */ emails: clientFields.emails ? [...clientFields.emails] : undefined, /** Fax number */ // fax: businessFields.fax_number, /** Contact person name */ // contactPerson: businessFields.contact_person, /** Street address */ address: businessFields.address ?? undefined, /** City name */ city: businessFields.city, /** Zip/postal code */ zip: businessFields.zipCode, country: businessFields.country ? countryCodeToGreenInvoiceCountry(businessFields.country) : undefined, /** Bank name */ // bankName: businessFields.bank_name, /** Bank branch number */ // bankBranch: businessFields.bank_branch_number, /** Bank account number */ // bankAccount: businessFields.bank_account_number, /** The client name */ name: businessFields.name ?? undefined, /** Is the client currently active or not */ active: businessFields.isActive, /** The client tax ID */ taxId: businessFields.governmentId, // paymentTerms: clientFields.payment_terms, // labels: clientFields.labels, /** Whether to send emails to the user automatically when assigning him to an invoice or not */ // send: clientFields.send, /** The client department */ // department: clientFields.department, /** The client accounting key */ accountingKey: businessFields.sortCode?.toString(), /** The category this client is related to */ // category: clientFields.category, /** The sub category this client is related to */ // subCategory: clientFields.sub_category, /** Client remarks for self use */ // remarks: clientFields.remarks, }; return fieldsToUpdate; } export async function updateGreenInvoiceClient(clientId, injector, businessFields = {}, clientFields = {}) { // validate local client const localBusinessPromise = injector .get(BusinessesProvider) .getBusinessByIdLoader.load(clientId); const localClientPromise = injector.get(ClientsProvider).getClientByIdLoader.load(clientId); const [localBusiness, localClient] = await Promise.all([ localBusinessPromise, localClientPromise, ]); let greenInvoiceId; try { greenInvoiceId = validateClientIntegrations(localClient?.integrations ?? {}).greenInvoiceId ?? undefined; } catch { // swallow errors return; } if (!localBusiness?.name || !greenInvoiceId) { // We cannot update a client in Green Invoice without its ID. console.warn(`Cannot update Green Invoice client: missing local business name or client ID for business${clientId}`); return; } const fieldsToUpdate = pickGreenInvoiceClientFields({ ...businessFields, name: localBusiness.name }, clientFields); if (Object.keys(fieldsToUpdate).length === 0) { return; } const greenInvoiceClient = await injector.get(GreenInvoiceClientProvider).updateClient({ id: greenInvoiceId, input: fieldsToUpdate, }); if (!greenInvoiceClient?.id) { throw new Error('Failed to create Green Invoice client'); } return; } //# sourceMappingURL=green-invoice-clients.helper.js.map